draftgo-cli 1.0.5 → 1.0.6

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 CHANGED
@@ -15,7 +15,7 @@ UI 稿用于必要的视觉讨论;已有页面先准确定位元素,再修
15
15
  ## 核心规则
16
16
 
17
17
  - 根 Skill 自动加载;Agent 只读取当前任务需要的 Reference。
18
- - pages、navigationsdocs/articles 的完整正文使用 `checkout`、worktree、`diff`、`commit`;结构化资源使用 MCP/API。
18
+ - pages、navigationsdocs/articles Go 源码使用 `checkout`、worktree、`diff`、`commit`;结构化资源使用 MCP/API。
19
19
  - MCP schema 是服务端实时契约。已知 operation 优先使用项目私有缓存;首次使用或 `registry_revision` 变化时 describe。schema 不写入 Skill 或聊天上下文。
20
20
  - 独立资源按 owner 并行,CLI 请求使用有界并发;同一资源的依赖步骤保持串行。
21
21
  - 每个任务开始记录到 `.draftgo/worklog.md`,验证和交付成功后再标记完成。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "draftgo-cli",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Install and manage the DraftGo skill across AI coding agents (Claude Code, Codex, Cursor, Windsurf, Antigravity, Copilot, Gemini, Kiro, Pi, ZCode).",
5
5
  "bin": {
6
6
  "draftgo": "bin/draftgo.js"
@@ -8,9 +8,9 @@ description: Use this skill to inspect, develop, debug, or deliver a DraftGo app
8
8
  ## 开始前
9
9
 
10
10
  - 任务开始即运行 `draftgo work start "<事项>"`;记录 CLI 返回的工作项引用。独立事项用 `draftgo work add`,仅在验证和交付成功后运行 `draftgo work complete <ref> --note "<证据>"`。
11
- - 根 Skill 会在触发时自动加载;先读取下表中最少必要的 Reference,再用 MCP 查询当前项目。不要预先读取所有 Reference,也不要把动态 operation schema 写入 Skill 或聊天上下文。
12
- - pages、navigationsdocs/articles 的完整正文只能通过 `draftgo checkout`、worktree、`draftgo diff`、`draftgo verify` 和 `draftgo commit` 处理;MCP 只用于定位、元数据和结构化资源。不要把完整正文或响应快照写入聊天上下文或手工归档。
13
- - 已知页面 route 或标题时,用 `draftgo map --type pages --route <path>` 或 `--title <title>` 精确定位;两个筛选条件取交集。只需范围或状态时加 `--summary`;需要浏览时使用 `--limit`(默认 20)和后续 `--cursor`,绝不默认全量枚举。
11
+ - 根 Skill 会在触发时自动加载;先读取下表中最少必要的 Reference,再用 MCP 查询当前项目。不要预先读取所有 Reference,也不要把动态 operation schema 写入 Skill 或聊天上下文。实时契约以 `draftgo api describe` 和 `.draftgo/api-contract-cache.json` 为准,不要把 OpenAPI 固化进 Skill。
12
+ - pages、navigationsdocs/articles Go 服务源码只能通过 `draftgo checkout`、worktree、`draftgo diff`、`draftgo verify` 和 `draftgo commit` 处理;MCP 只用于定位、元数据和结构化资源。不要把完整正文或响应快照写入聊天上下文或手工归档。
13
+ - 已知页面 route 或标题时,用 `draftgo map --type pages --route <path>` 或 `--title <title>` 精确定位,或在唯一命中时用 `draftgo checkout pages --route <path>` / `--title <title>`;两个筛选条件取交集。只需范围或状态时加 `--summary`;需要浏览时使用 `--limit`(默认 20)和后续 `--cursor`,绝不默认全量枚举。
14
14
  - `--output json` 的 stdout 是单一 UTF-8 JSON;诊断和进度走 stderr。不要依赖终端截断来控制上下文。
15
15
  - 正常交付只运行 `draftgo verify`。默认跳过 UI;用户要求视觉修改或视觉验收时才使用截图,要求交互或 DOM 验证时才使用 `--ui always`。
16
16
 
@@ -26,6 +26,7 @@ description: Use this skill to inspect, develop, debug, or deliver a DraftGo app
26
26
 
27
27
  | 任务 | 先读 |
28
28
  |---|---|
29
+ | 已知页面的小范围 UI 修改 | 先定位并 checkout;需要组件、运行时或新建页面时再读 `references/frontend.md` |
29
30
  | 页面、导航、交互或 UI | `references/frontend.md`;涉及 iframe、路由、认证或全局层加读 `runtime.md` / `app-api.md` |
30
31
  | pages/nav/docs 正文、版本或冲突 | `references/checkout.md` |
31
32
  | 自定义 Go 服务、源码、SDK、草稿或策略 | `references/services.md` |
@@ -2,7 +2,7 @@
2
2
  "schema_version": "1.0",
3
3
  "id": "draftgo",
4
4
  "name": "DraftGo 开发助手",
5
- "version": "1.0.5",
5
+ "version": "1.0.6",
6
6
  "entry": "SKILL.md",
7
7
  "description": "以 Skill/reference 任务路由、MCP 实时发现、长正文 checkout/commit、统一验证和完成日志为边界的 DraftGo 工作流。",
8
8
  "license": "MIT",
@@ -34,7 +34,7 @@ draftgo api call <operation_id> --input request.json --output json
34
34
  - 模型是否支持 Chat、Responses、Embedding、Rerank、TTS、ASR、图片或视频,必须由当前模型声明、Provider readiness 和有效路由共同证明。
35
35
  - 知识库和长期记忆用途不同,不能互相替代;索引完成不等于检索质量达标。
36
36
  - 智能体调用失败时分层检查模型路由、提示词版本、插件可用性、知识检索、记忆配置和运行日志,不在客户端自动重放非幂等调用。
37
- - DraftGo Page 的 AI 对话使用组件目录中的 `draftgo/chat`;完整 Chat 实现由组件 `Definition.JS` 随同一 revision 发布并按需解析,不存在第二套静态 SDK。其他模型能力(包括图片、Embedding、Rerank、TTS、ASR 和 Video)通过服务端 AI Registry 调用。浏览器端不得持有 Provider 密钥,也不要复制一套客户端 Provider SDK。
37
+ - DraftGo Page 的 AI 对话使用组件 `draftgo/chat`,见 `chat-sdk.md`。其他模型能力通过服务端 AI Registry 调用。浏览器端不得持有 Provider 密钥。
38
38
 
39
39
  ## 完成条件
40
40
 
@@ -12,17 +12,17 @@ const App = window.parent?.App;
12
12
 
13
13
  | 方法 | 签名 | 说明 |
14
14
  |---|---|---|
15
- | `App.get` | `(path, params?, headers?)` | GET,params 为 query 参数 |
16
- | `App.post` | `(path, body?, headers?)` | POST |
17
- | `App.put` | `(path, body?, headers?)` | PUT |
18
- | `App.patch` | `(path, body?, headers?)` | PATCH |
19
- | `App.delete` | `(path, params?, headers?)` | DELETE |
15
+ | `App.get` | `(path, params?, headers?)` | GET,params 为 query 参数 |
16
+ | `App.post` | `(path, body?, headers?)` | POST |
17
+ | `App.put` | `(path, body?, headers?)` | PUT |
18
+ | `App.patch` | `(path, body?, headers?)` | PATCH |
19
+ | `App.delete` | `(path, params?, headers?)` | DELETE |
20
20
  | `App.uploadFile` | `(file, onProgress?)` | 文件上传,返回标准信封 |
21
21
 
22
22
  **响应格式**:`{ code: 200, data: <载荷>, message: "success" }`
23
23
  **消费范式**:
24
24
  ```javascript
25
- const res = await App.get('pages', { page: 1, page_size: 20 }); // 按返回的分页信息继续读取
25
+ const res = await App.get('pages', { page: 1, page_size: 20 }); // 按返回的分页信息继续读取
26
26
  if (res.code !== 200) { App.showError(res.message); return; }
27
27
  const items = res.data.items;
28
28
 
@@ -33,10 +33,10 @@ const paged = await App.get('pages', { page: 1, page_size: 20 }); // 显式分
33
33
 
34
34
  | 方法 | 签名 | 说明 |
35
35
  |---|---|---|
36
- | `App.showSuccess` | `(msg)` | 成功 Toast |
37
- | `App.showError` | `(msg)` | 错误 Toast |
38
- | `App.showWarning` | `(msg)` | 警告 Toast |
39
- | `App.showInfo` | `(msg)` | 信息 Toast |
36
+ | `App.showSuccess` | `(msg)` | 成功 Toast |
37
+ | `App.showError` | `(msg)` | 错误 Toast |
38
+ | `App.showWarning` | `(msg)` | 警告 Toast |
39
+ | `App.showInfo` | `(msg)` | 信息 Toast |
40
40
  | `App.toast` | `(msg, type?)` | 通用 Toast,type: success/error/warning/info |
41
41
  | `App.confirm` | `(msg, title?)` | 确认弹窗,返回 `Promise<boolean>` |
42
42
  | `App.showModal` | `(msg, title?)` | 信息模态框(替代 alert) |
@@ -66,32 +66,34 @@ const { patientId, visitId } = routeContext.query;
66
66
  | 属性 | 类型 | 说明 |
67
67
  |---|---|---|
68
68
  | `App.currentUser` | object \| null | 当前用户,未登录为 null |
69
- | `App.isAdmin` | boolean | 是否管理员 |
70
- | `App.permissions` | string[] | 当前用户有效权限的展示投影;仅用于页面显隐,不替代服务端授权 |
71
- | `App.isAuthenticated` | boolean | 是否已认证 |
69
+ | `App.isAdmin` | boolean | 是否管理员 |
70
+ | `App.permissions` | string[] | 当前用户有效权限的展示投影;仅用于页面显隐,不替代服务端授权 |
71
+ | `App.isAuthenticated` | boolean | 是否已认证 |
72
72
  | `App.hasToken` | boolean | 是否有 token(含未验证) |
73
73
  | `App.config` | object | 系统配置 KV |
74
74
  | `App.theme` | `'light'` \| `'dark'` | 当前显示模式 |
75
- | `App.colorScheme` | string | 当前配色方案 |
75
+ | `App.colorScheme` | string | 当前配色方案 |
76
76
 
77
77
  ## 主题
78
78
 
79
79
  ```javascript
80
- App.applyTheme('dark'); // 切换显示模式
81
- App.setColorScheme('deep-blue-white'); // 切换预设配色
82
- App.setColorScheme('custom', customVarsObject); // 自定义配色
83
- App.getColorScheme(); // 获取方案详情
80
+ App.applyTheme('dark');
81
+ App.toggleTheme();
82
+ App.getColorScheme();
84
83
  ```
85
84
 
85
+ 页面不调用 `setColorScheme`。配色由壳层主题变量提供。
86
+
86
87
  ## 其他
87
88
 
88
89
  ```javascript
89
- await App.logout(); // 服务端登出、清理状态并跳转配置的登录页
90
- App.setAuthTokens({ access_token, refresh_token }); // 登录后写入 token
91
- App.reloadGlobalLayer(); // 重载全局层
92
- App.openGlobalWidget(name); // 触发全局挂件打开
93
- App.t(key, fallback?, values?); // 页面级国际化文本,values 保留 ICU 占位符
94
- App.formatDateTime(value, options?); // 按 system_timezone 格式化 API 返回的 UTC 时间
95
- ```
96
-
97
- Token、刷新、路由上下文和认证事件见 `references/runtime.md`。AI 对话组件契约见 `references/chat-sdk.md`,其他 AI 能力见 `references/ai.md`。Chat 与其他 DraftGo 组件使用同一组件库交付,不存在独立 SDK 静态文件。
90
+ await App.logout();
91
+ App.setAuthTokens({ access_token, refresh_token });
92
+ App.reloadGlobalLayer();
93
+ App.t(key, fallback?, values?);
94
+ App.formatDateTime(value, options?);
95
+ ```
96
+
97
+ 没有 `openGlobalWidget`。全局层用 `App.reloadGlobalLayer()`。
98
+
99
+ Token、刷新、路由上下文和认证事件见 `references/runtime.md`。AI 对话组件契约见 `references/chat-sdk.md`,其他 AI 能力见 `references/ai.md`。Chat 与其他 DraftGo 组件使用同一组件库交付,不存在独立 SDK 静态文件。
@@ -1,31 +1,15 @@
1
1
  ---
2
- read_when: DraftGo Page 需要 AI 对话组件时 · 开发或扩展 draftgo/chat 时
2
+ read_when: DraftGo Page 需要 AI 对话组件时
3
3
  ---
4
4
 
5
- # DraftGo Chat 组件
5
+ # draftgo/chat
6
6
 
7
- DraftGo Page 统一使用组件目录中的 `draftgo/chat`。完整实现保存在组件 `Definition.JS`,负责原生 `<dg-chat>`、消息状态机、流解析、停止、重试和历史逻辑,并与 HTML、CSS、Props 和事件使用同一草稿与发布版本。Page 不复制实现,也不手写流式请求。
8
-
9
- ## 目录
10
-
11
- - [最小接入](#最小接入)
12
- - [协议](#协议)
13
- - [配置与布局](#配置与布局)
14
- - [JavaScript API 与事件](#javascript-api-与事件)
15
- - [历史与会话](#历史与会话)
16
- - [扩展](#扩展)
17
- - [鉴权与安全](#鉴权与安全)
18
-
19
- ## DraftGo Page 最小接入
20
-
21
- 先从当前实例读取组件契约,不按本文猜测 Props:
7
+ Page 对话 UI 是组件库组件 `draftgo/chat`,不是独立 SDK。先读实时契约:
22
8
 
23
9
  ```text
24
10
  draftgo components show draftgo/chat --output json
25
11
  ```
26
12
 
27
- 在 Page 中保存组件活引用;运行时仅在实际引用时返回完整组件,同页相同 revision 与 hash 只编译一次:
28
-
29
13
  ```html
30
14
  <dg-chat
31
15
  data-dg-use="draftgo/chat"
@@ -37,169 +21,11 @@ draftgo components show draftgo/chat --output json
37
21
  </dg-chat>
38
22
  ```
39
23
 
40
- `draftgo-agent` 默认请求 `/api/agents/{id}/chat`,并复用同源 DraftGo App 的 Bearer token 与刷新机制。
41
-
42
- `draftgo/chat` 公开 Agent、视图、surface、主题、语言、附件、历史、流式开关、打开状态和超时等稳定 Props,并透传已声明的 `dg-chat:*` 事件。函数、DOM Node、自定义 transport、rendererplugin 不进入 `data-dg-prop-*`。
43
-
44
- DraftGo 不维护独立 Chat SDK 静态文件或外部应用直连交付路径。无 UI 的文本、图片或其他模型能力调用统一使用服务端 AI Registry operation;这样可保持 Provider 密钥、路由和用量控制在服务端。
45
-
46
- ## 协议
47
-
48
- | `protocol` | 必需配置 | 说明 |
49
- |---|---|---|
50
- | `draftgo-agent` | `agentId` | DraftGo Agent;默认端点 `/api/agents/{id}/chat` |
51
- | `openai-chat`(alias `openai`) | `endpoint` | OpenAI Chat Completions 兼容协议 |
52
- | `openai-responses` | `endpoint` | OpenAI Responses 协议 |
53
- | `anthropic-messages`(alias `anthropic`) | `endpoint` | Anthropic Messages 协议 |
54
- | `custom` 或注册名 | 已注册 transport | 页面提供 async generator transport |
55
-
56
- 外部协议必须指向服务端代理:
57
-
58
- ```html
59
- <dg-chat protocol="openai-chat" endpoint="/api/ai-proxy/openai" model="MODEL"></dg-chat>
60
- <dg-chat protocol="openai-responses" endpoint="/api/ai-proxy/responses" model="MODEL"></dg-chat>
61
- <dg-chat protocol="anthropic-messages" endpoint="/api/ai-proxy/anthropic" model="MODEL"></dg-chat>
62
- ```
63
-
64
- 这些 `/api/ai-proxy/*` 是接入方实现的占位路由,不是 DraftGo 自动提供的默认代理。不要将供应商密钥或长期 token 写入页面。
65
-
66
- 内置 transport 支持 SSE、NDJSON 和普通 JSON,并把上游响应归一化为 `text.delta`、`reasoning.delta`、`tool.start`、`tool.delta`、`tool.finish`、`step.finish`、`artifact.complete`、`source`、`usage`、`message.finish`、`error` 等事件。DraftGo Page 只使用实时 `draftgo/chat` 组件契约,不要猜测字段或把函数、DOM、renderer、plugin、transport 写入 Props。
67
-
68
- ## 组件配置与布局
69
-
70
- 以下直接属性与 JSON 配置用于组件库高级扩展;普通 DraftGo Page 以实时 `draftgo/chat` Props 为准。
71
-
72
- ```html
73
- <dg-chat
74
- id="page-assistant"
75
- protocol="draftgo-agent"
76
- agent-id="AGENT_ID"
77
- surface="drawer"
78
- view="threads"
79
- position="right"
80
- title="AI Assistant"
81
- placeholder="输入内容"
82
- persist="true"
83
- stream="true"
84
- enable-attachments
85
- show-reasoning
86
- ></dg-chat>
87
- ```
88
-
89
- | 配置 | 可选值 |
90
- |---|---|
91
- | `surface` | `inline`、`floating`、`drawer`、`fullscreen` |
92
- | `view` | `conversation`、`threads`、`compact`、`canvas` |
93
- | `position` | `left`、`right` |
94
- | `theme` | `light`、`dark`;省略时跟随系统 |
95
-
96
- 复杂的纯数据配置使用 `config-ref`:
97
-
98
- ```html
99
- <script type="application/json" id="page-chat-config">
100
- {
101
- "protocol": "draftgo-agent",
102
- "agentId": "AGENT_ID",
103
- "surface": "inline",
104
- "view": "canvas",
105
- "storageKey": "dg-chat:PAGE_KEY:INSTANCE_KEY",
106
- "features": {
107
- "reasoning": true,
108
- "attachments": true,
109
- "history": true,
110
- "feedback": false,
111
- "artifacts": true
112
- },
113
- "suggestions": ["总结当前页面", "生成结构化结果"],
114
- "context": { "page": "PAGE_KEY" }
115
- }
116
- </script>
117
- <dg-chat config-ref="page-chat-config"></dg-chat>
118
- ```
119
-
120
- 函数、DOM Node、renderer、plugin、upload 和 custom transport 只能通过 JavaScript 配置,不能写进 JSON。主题优先使用 `--dg-chat-*` CSS variables、公开 `::part()` 和 slots,不选择 Shadow DOM 内部 class。
121
-
122
- ## JavaScript API 与事件
123
-
124
- ```javascript
125
- const chat = document.querySelector('#page-assistant');
126
-
127
- chat.configure({ model: 'MODEL', context: { page: 'PAGE_KEY' } });
128
- await chat.send('处理当前输入');
129
- chat.stop();
130
- chat.regenerate();
131
- chat.newThread();
132
- chat.selectThread('THREAD_ID');
133
- chat.deleteThread('THREAD_ID');
134
- chat.renameThread('THREAD_ID', '新的会话名称');
135
- chat.clearThreads();
136
- chat.setMessages([]);
137
- chat.clear();
138
- chat.open();
139
- chat.close();
140
- chat.toggle();
141
- ```
142
-
143
- 组件内部运行时保留 `DraftGoChat.create()`、`registerTransport()`、`registerRenderer()`、`registerComponent()`、`definePreset()`、`use()` 等扩展接口,但它们不是独立静态 SDK 契约。
144
-
145
- 常用事件:`dg-chat:ready`、`dg-chat:before-send`、`dg-chat:message`、`dg-chat:run-start`、`dg-chat:stream-event`、`dg-chat:run-finish`、`dg-chat:run-abort`、`dg-chat:error`、`dg-chat:message-action`、`dg-chat:session-change`、`dg-chat:model-change`、`dg-chat:open`、`dg-chat:close`。
146
-
147
- ```javascript
148
- chat.addEventListener('dg-chat:run-finish', event => {
149
- console.log(event.detail);
150
- });
151
- ```
152
-
153
- 页面销毁或离开路由时调用 `stop()`,取消上传、plugin 和在途 transport。
154
-
155
- `requestTimeoutMs` 和 `streamTimeoutMs` 分别控制客户端非流式/流式总时限,默认 120000/610000 毫秒,`0` 表示禁用。两者只处理客户端半开连接,不替代 Agent 的服务端超时。
156
-
157
- ## 历史与会话
158
-
159
- - `persist` 默认开启,将 UI thread 历史写入 `localStorage`;敏感或临时页面设为 `false`。
160
- - 同一路由存在多个实例时,每个实例设置唯一 `storageKey`。
161
- - 每个 UI thread 自动维护独立 `sessionId`;`draftgo-agent` 将其作为 `session_id` 发送。
162
- - 切换会话只改变当前视图,不会停止其它 thread 的在途请求。会话列表标题左侧显示运行中状态;后台完成或失败后显示未读状态,进入该会话即视为已读并清除。
163
- - 每个请求使用独立 `run_id`。用户停止或 SDK 超时会调用 Agent 取消接口;普通会话切换不会发送取消。
164
- - 推理片段和工具调用按服务端事件的输出位置保留在消息内,不固定贴在消息底部;思考在正文、工具或结束事件到达后进入完成态,不再闪烁或滚动预览。
165
- - `newThread()` 创建新的后端会话边界;不要让不同用户共享固定 `storageKey` 或 `sessionId`。
166
- - `clear()` 和 `setMessages([])` 会重置当前 session,避免视觉清空后恢复旧 checkpoint。
167
-
168
- ## 扩展
169
-
170
- 自定义协议通过 async generator 产生统一事件:
171
-
172
- ```javascript
173
- DraftGoChat.registerTransport('page-protocol', async function* (request, context) {
174
- const response = await fetch('/api/x/page/chat', {
175
- method: 'POST',
176
- signal: context.signal,
177
- headers: { 'Content-Type': 'application/json' },
178
- body: JSON.stringify({ messages: request.messages })
179
- });
180
- const data = await response.json();
181
- yield { type: 'text.delta', delta: String(data.text || '') };
182
- yield { type: 'message.finish' };
183
- });
184
-
185
- chat.configure({ protocol: 'page-protocol' });
186
- ```
187
-
188
- 局部定制优先级:属性/JSON → CSS variables、parts、slots → 实例 `components`/`renderers` → plugin/custom transport。全局注册会影响同一 window 的所有实例;页面特有行为优先放在实例配置中。
189
-
190
- ## 鉴权与安全
191
-
192
- - 同源请求优先使用 iframe 可见的 `window.App.fetchAbsolute`,复用 DraftGo token 和刷新机制。
193
- - 供应商凭证不得自动或手工发送到外部 origin;OpenAI/Anthropic 使用服务端代理。
194
- - 页面 HTML、JSON config、`headers`、`context` 和 `localStorage` 中不得保存长期供应商密钥。
195
- - 不把模型输出直接赋给 `innerHTML`;使用 SDK 内置 Markdown/URL 安全渲染或显式净化。
196
- - 后端始终负责 Agent 调用权限、模型白名单、附件能力和大小限制,前端开关不能越权。
197
- - Agent 协议响应不应包含 Agent 内部模型名。模型选择器只能读取 Agent 明确授权的 `/selectable-models` 目录。
198
-
199
- 交付前确认:DraftGo Page 使用 `draftgo/chat` 且不手工加载第二套脚本;同页多实例隔离 `storageKey`;外部协议走服务端代理;页面离开时停止在途请求。
200
-
201
- ## 移动端契约
24
+ - 只写 `data-dg-use`、`data-dg-instance`、`data-dg-prop-*`、`data-dg-slot`
25
+ - 默认 `protocol=draftgo-agent`,请求 `/api/agents/{id}/chat`,复用 App Bearer
26
+ - 函数、DOMtransport、rendererplugin 不进 props
27
+ - 不要手写流式、不要加载第二套脚本、不要把供应商密钥写入页面
28
+ - 同页多实例用不同 `data-dg-instance`;敏感页设 `persist=false`
29
+ - 无 UI 的模型调用走服务端 AI Registry,见 `ai.md`
202
30
 
203
- - `inline`、`floating`、`drawer`、`fullscreen` 四种 surface 均由 SDK 自适应窄屏;`threads`、`canvas` Artifact 会按容器宽度自动收敛为单栏,不要复制 Shadow DOM 内部布局规则。
204
- - SDK 使用 `VisualViewport` 和 `safe-area-inset-*` 跟随软键盘、浏览器工具栏与横竖屏变化。触摸设备打开面板时不会主动弹出软键盘。
205
- - 触摸端按钮和行操作具有移动端点击尺寸,输入字号防止 iOS 自动缩放;所有内部滚动区隐藏滚动条,但仍保留触摸、滚轮和键盘滚动能力。
31
+ Props 与事件以 `components show` 为准,不复制到页面或 Skill。
@@ -1,140 +1,65 @@
1
1
  ---
2
- read_when: 编辑 pages、navigation 或 docs 正文时 · 查看 checkout manifest 时 · 处理 409/412 冲突时
2
+ read_when: 编辑 pages、navigation、docsGo 源码时 · 处理 409/412 冲突时
3
3
  ---
4
4
 
5
- # Checkout / Commit
6
-
7
- ## 页面与内容最短流程
8
-
9
- ```bash
10
- draftgo map --type pages --route /admin/channel-ops --output json
11
- draftgo checkout pages 42
12
- draftgo diff pages 42 --stat
13
- draftgo verify pages 42
14
- draftgo commit pages 42
15
- ```
16
-
17
- 导航和文档分别替换为 `nav`、`docs`。route/title 为精确匹配,两个条件取交集;只需确认范围或 checkout 状态时使用 `map --summary`,必须浏览时使用 `--limit <1-100>`(默认 20),并仅在单一 `--type` 下用 `--cursor <opaque>` 翻页。新资源先用 `draftgo api search "create page"` 或对应内容类型定位创建 operation,describe/call 取得 ID 后再 checkout;不要用 checkout 创建资源。`verify` 通过不等于已交付,commit 返回新版本与哈希才算正文写入成功。发生 409/412 时保留冲突材料并停止提交。
18
-
19
- ## Workflow 2.0 coverage
20
-
21
- The checkout set includes `pages`, `navigations`, and `docs/articles`. DB Meta and all other structured resources remain live MCP/API resources and are never checked out.
22
-
23
- `draftgo refresh <type> <id...>` is a safe checkout shortcut. It updates only a clean local worktree; local changes stop it. A successful commit keeps current local files and one base only. Cloud version storage is the sole history source.
24
-
25
- > 根 `SKILL.md` 在 Skill 触发时会自动加载。使用本文件前,先完成根 Skill 的“强制预读:Reference 优先于 MCP”任务路由。本文件只说明长正文的传输、版本和冲突规则,不能替代页面、前端、运行时或安全资料。
26
-
27
- ## 适用范围
28
-
29
- 只有长正文使用 worktree:
30
-
31
- | 输入类型 | 规范类型 | 本地目录 | 文件前缀 |
32
- |---|---|---|---|
33
- | `page` / `pages` | `pages` | `.draftgo/worktree/pages/` | `page_` |
34
- | `nav` / `navigation` / `navigations` | `navigations` | `.draftgo/worktree/navigations/` | `nav_` |
35
- | `doc` / `docs` / `article(s)` / `docs/articles` | `docs` | `.draftgo/worktree/docs/` | `article_` |
36
-
37
- db_meta、AI 配置、system_config、roles、users、doc_categories 和普通配置使用 MCP 实时 API,不 checkout。
38
-
39
- Checkout 只为已存在且已确认 ID 的资源建立本地正文与 base,不创建页面、导航或文档。新增资源先按 MCP 实时 API 契约创建并取得 ID;需要编辑完整正文时再 checkout。只需元数据或正文片段即可完成判断时,不必 checkout。
40
-
41
- ## 命令
5
+ # Checkout / Commit
42
6
 
43
7
  ```bash
44
- draftgo checkout <pages|nav|docs> <id...>
45
- draftgo commit <pages|nav|docs> <id...>
46
- draftgo reconcile <pages|nav|docs> <id...>
47
- draftgo diff <pages|nav|docs> <id> [--stat|--summary]
48
- draftgo conflicts
49
- draftgo conflict show <pages|nav|docs> <id>
50
- draftgo conflict resolve <pages|nav|docs> <id>
8
+ draftgo map --type pages --route /admin/channel-ops --output json
9
+ draftgo checkout pages 42
10
+ draftgo diff pages 42 --stat
11
+ draftgo verify pages 42
12
+ draftgo commit pages 42
51
13
  ```
52
14
 
53
- `checkout --force` 只用于用户明确允许丢弃未提交本地修改的情况。默认 checkout 检测到 worktree 文件相对
54
- base 已变化时必须拒绝覆盖。
55
-
56
- `diff --stat` 只显示文件与增删行数;`diff --summary` 显示资源、基线版本和变化概要。两者均不输出正文 diff,先用它们确认范围,再按需展开完整 `diff`。`--output json` 时 stdout 只包含 UTF-8 JSON,诊断走 stderr。
57
-
58
- ## Checkout 流程
59
-
60
- 1. CLI 通过 MCP `draftgo_resource_get_metadata` 取得规范类型、content_type、SHA-256、大小、版本/revision、
61
- ETag 和受信任的下载/提交 URL。
62
- 2. CLI 使用 `.draftgo/config.json` 中的用户 API Key 通过专用 HTTP 下载完整正文;API Key 不进入 MCP 参数或日志。
63
- 3. 响应体直接流式写入同目录临时文件,校验 content_type、字节数和 SHA-256。
64
- 4. 校验成功后原子重命名到 worktree 文件,并保存相同字节的 `.base` 文件。
65
- 5. 最后原子更新 `.draftgo/worktree/manifest.json`。失败时不得留下半截正式文件或推进 manifest。
66
-
67
- 正文不做 HTML/Markdown 转换,也不改变编码。扩展名规则:
68
-
69
- - `text/html`、`application/xhtml+xml` -> `.html`
70
- - `text/markdown`、`text/x-markdown` -> `.md`
71
- - `text/plain` -> `.txt`
72
- - 其他类型只接受底座返回的安全扩展名;缺失或不安全时拒绝 checkout
73
-
74
- ## Manifest
75
-
76
- 路径固定为 `.draftgo/worktree/manifest.json`,schema version 当前为 `1`。条目键使用规范类型和 id:
77
-
78
- ```json
79
- {
80
- "schema_version": 1,
81
- "updated_at": "2026-07-30T12:00:00.000Z",
82
- "entries": {
83
- "pages:42": {
84
- "server": "https://draftgo.example",
85
- "resource_type": "pages",
86
- "resource_id": "42",
87
- "title": "Example",
88
- "route": "/example",
89
- "code": null,
90
- "slug": null,
91
- "local_path": ".draftgo/worktree/pages/page_42.html",
92
- "content_type": "text/html",
93
- "file_extension": ".html",
94
- "content_size": 123,
95
- "base_path": ".draftgo/worktree/.base/pages/page_42.html",
96
- "base_version": "7",
97
- "base_revision": null,
98
- "base_etag": null,
99
- "base_hash": "<sha256>",
100
- "checked_out_at": "2026-07-30T12:00:00.000Z"
101
- }
102
- }
103
- }
15
+ `nav`、`docs` 同理。route/title 精确匹配,两条件取交集。已知唯一 route title 时可直接:
16
+
17
+ ```bash
18
+ draftgo checkout pages --route /admin/channel-ops
19
+ draftgo checkout pages --title "渠道管理"
104
20
  ```
105
21
 
106
- `server` 必须和当前连接一致。`local_path`、`base_path` 必须是项目内相对路径。manifest、worktree `.base`
107
- 和冲突目录必须 gitignore;不要手工伪造版本或哈希。
22
+ 必须指定资源类型,且不得再带 id。0 条匹配或超过 1 条都失败,不要猜测目标。`services` 不支持 `--route` / `--title`。
23
+
24
+ 范围确认用 `map --summary`;浏览用 `--limit`(默认 20)和单一类型的 `--cursor`。新资源先 `draftgo api search "create page"`(或对应类型)describe/call 取得 ID,再 checkout。checkout 不创建资源。
25
+
26
+ `verify` 通过不等于已交付;commit 返回新版本与哈希才算正文写入成功。干净 worktree 可用 `draftgo refresh <type> <id>` 更新;有本地改动则停止。
27
+
28
+ ## 范围
108
29
 
109
- ## Commit 流程
30
+ | 输入 | 类型 | 本地目录 |
31
+ |---|---|---|
32
+ | page / pages | pages | `.draftgo/worktree/pages/` |
33
+ | nav / navigation | navigations | `.draftgo/worktree/navigations/` |
34
+ | doc / docs / article | docs | `.draftgo/worktree/docs/` |
35
+ | service / services | services | `.draftgo/worktree/services/` |
110
36
 
111
- 1. 读取 manifest 指向的 worktree 文件,计算当前字节数和 SHA-256;未变化时返回 `unchanged`。
112
- 2. 按 content_type 执行本地结构和内联脚本检查。
113
- 3. 通过专用 HTTP 流式上传原始文件,携带 `If-Match`、base version/revision、content_type、长度和 SHA-256。
114
- 4. 完整正文不得作为 MCP tool 参数发送。
115
- 5. 底座确认 hash 和新版本后,CLI 原子更新 `.base` 与 manifest。返回 hash 不一致时不得推进基线。
37
+ Checkout 只为已存在且已确认 ID 的资源建立本地正文与 base,不创建页面、导航或文档。db_meta、AI、配置、角色等结构化资源走 MCP,不 checkout。Go 服务源码走 checkout/commit;创建、validate、试运行和 publish 仍用实时 API。
116
38
 
117
- 本地正文已经等于远端、但 base/manifest 落后时,先用 `draftgo check --remote` 确认 `committed_unrecorded`,再运行 `draftgo reconcile`;不要手改 manifest。
118
-
119
- 单个 commit 成功不自动完成 worklog 项。只有整个事项统一验证且全部 commit/MCP 交付成功后,主 Agent 才执行 `draftgo work complete <编号> --note "<完成结果>"`。任何检查失败、409/412 或交付失败都不得标记为完成。
39
+ ```bash
40
+ draftgo checkout <pages|nav|docs|services> <id...>
41
+ draftgo commit <pages|nav|docs|services> <id...>
42
+ draftgo reconcile <pages|nav|docs|services> <id...>
43
+ draftgo diff <pages|nav|docs|services> <id> [--stat|--summary]
44
+ draftgo conflicts
45
+ draftgo conflict show <pages|nav|docs|services> <id>
46
+ draftgo conflict resolve <pages|nav|docs|services> <id>
47
+ ```
120
48
 
121
- ## 409 / 412 冲突
49
+ `--force` 仅在用户明确允许丢弃未提交本地修改时使用。`diff --stat` / `--summary` 不含正文;先确认范围再展开完整 diff。
122
50
 
123
- 版本冲突时 CLI 返回非零,不自动重试、不 force、不覆盖 worktree local,并写入:
51
+ 本地已等于远端但 base/manifest 落后时:`draftgo check --remote` 确认 `committed_unrecorded`,再 `draftgo reconcile`。不要手改 manifest。
52
+
53
+ ## 409 / 412
54
+
55
+ 停止提交,不 force、不覆盖、不自动合并。材料在:
124
56
 
125
57
  ```text
126
- .draftgo/conflicts/<pages|navigations|docs>/<id>/
58
+ .draftgo/conflicts/<pages|navigations|docs|services>/<id>/
127
59
  ├── conflict.json
128
60
  ├── base.<ext>
129
61
  ├── local.<ext>
130
62
  └── remote.<ext>
131
63
  ```
132
64
 
133
- - `base` checkout 时的内容;`local` 是发生冲突时的本地快照;`remote` 是重新下载并校验的当前远端内容。
134
- - `conflict.json` 记录三份路径、版本、ETag 和哈希,不嵌入完整正文。
135
- - Agent 或用户在 worktree local 文件中完成合并;不要手写 HTML 自动合并器,也不要改动保存的三份证据。
136
- - 合并完成后运行 `draftgo verify`,再执行 `draftgo conflict resolve <type> <id>`。
137
- - resolve 校验 worktree 与 remote,采用 remote 版本作为新的 base,但保留合并后的 worktree;随后运行
138
- `draftgo diff` 并 `draftgo commit`。
139
-
140
- 存在 unresolved conflict 时 commit、deploy 或 auto-commit 必须停止。
65
+ worktree local 合并 → `draftgo verify` `draftgo conflict resolve <type> <id>` → `draftgo diff` → `draftgo commit`。有未解决冲突时不得 commit。任何检查失败、409/412 或交付失败都不得标记为完成。
@@ -36,6 +36,3 @@
36
36
 
37
37
  CLI 命令锁不能覆盖 Agent 整轮编辑;不同目录的锁也不隔离同一远端资源。owner 约定贯穿任务全过程,同资源串行,冲突按正文工作树规则处理。真正独立实验使用独立开发实例。CLI 请求使用有界并发,不能把多个 Agent 等同于无限连接。
38
38
 
39
- ## 旧 Story 迁移
40
-
41
- 仅旧项目需要:检查 .draftgo/story.yaml,将仍有效的产品定位、模块目标和决策原因迁入 Design;与现有 Design 或最新用户要求冲突的内容先核实,不覆盖有效文档。历史进度留给 worklog,不转成设计流水账。迁移核对前保留原文件,核对后在 worklog 记录迁移结果并停止读取 Story;用户未要求时不删除原产品档案。新项目不创建 Story,不并行维护两套设计来源。