draftgo-cli 1.0.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 +119 -0
- package/bin/draftgo.js +3 -0
- package/package.json +45 -0
- package/resources/skill/CLAUDE.md +239 -0
- package/resources/skill/SKILL.md +75 -0
- package/resources/skill/bug/SKILL.md +72 -0
- package/resources/skill/init/SKILL.md +63 -0
- package/resources/skill/rules/debugging-syntax.md +279 -0
- package/resources/skill/rules/frontend.md +462 -0
- package/resources/skill/scripts/draftgo_init.py +192 -0
- package/resources/skill/scripts/draftgo_sync.py +150 -0
- package/resources/skill/sync/SKILL.md +72 -0
- package/src/cli.js +43 -0
- package/src/commands/doctor.js +39 -0
- package/src/commands/help.js +42 -0
- package/src/commands/init.js +71 -0
- package/src/commands/listTargets.js +13 -0
- package/src/commands/status.js +23 -0
- package/src/commands/uninstall.js +52 -0
- package/src/commands/update.js +54 -0
- package/src/detect.js +29 -0
- package/src/fsx.js +62 -0
- package/src/index.js +53 -0
- package/src/installers/_entryContent.js +45 -0
- package/src/installers/antigravity.js +28 -0
- package/src/installers/base.js +54 -0
- package/src/installers/claudecode.js +29 -0
- package/src/installers/codex.js +31 -0
- package/src/installers/copilot.js +28 -0
- package/src/installers/cursor.js +28 -0
- package/src/installers/gemini.js +31 -0
- package/src/installers/index.js +33 -0
- package/src/installers/kiro.js +33 -0
- package/src/installers/windsurf.js +28 -0
- package/src/logger.js +30 -0
- package/src/paths.js +35 -0
- package/src/python.js +27 -0
- package/src/skill.js +83 -0
package/README.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# draftgo-cli
|
|
2
|
+
|
|
3
|
+
跨 AI 编码工具一键安装 / 更新 / 卸载 DraftGo 开发助手 skill 的命令行工具。
|
|
4
|
+
|
|
5
|
+
支持的 AI 工具:Claude Code、Codex CLI、Cursor、Windsurf、Antigravity、GitHub Copilot、Gemini CLI、Kiro。
|
|
6
|
+
|
|
7
|
+
## 前置条件
|
|
8
|
+
|
|
9
|
+
- Node.js 14+(运行 CLI)
|
|
10
|
+
- Python 3.9+(运行 DraftGo init/sync 脚本;CLI 本身不需要)
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g draftgo-cli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 快速开始
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
cd /path/to/your/project
|
|
22
|
+
draftgo init # 自动识别当前项目在用的 AI 工具并安装
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
也可以手动指定要安装到哪些 AI 工具:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
draftgo init claudecode # 只装 Claude Code
|
|
29
|
+
draftgo init claudecode kiro cursor # 多选
|
|
30
|
+
draftgo init all # 所有支持的工具
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 命令清单
|
|
34
|
+
|
|
35
|
+
| 命令 | 说明 |
|
|
36
|
+
|---|---|
|
|
37
|
+
| `draftgo init [target]...` | 安装 skill。不传 target 时自动识别;`all` 表示全部。 |
|
|
38
|
+
| `draftgo update [target]...` | 覆盖 skill 内容到 CLI 内置版本,同时刷新已安装的入口;保留本地 `config / iteration / bugs / pages` 等运行时数据。 |
|
|
39
|
+
| `draftgo uninstall [target]...` | 移除指定 AI 工具的入口文件;全量卸载时同时删除 `.draftgo/skill/`。加 `--purge` 会连 `.draftgo/` 整个删掉。 |
|
|
40
|
+
| `draftgo status` | 查看当前项目装了哪些 AI 工具入口、skill 版本。 |
|
|
41
|
+
| `draftgo doctor` | 诊断:Python 是否可用、检测到哪些 AI 工具、各入口状态。 |
|
|
42
|
+
| `draftgo list-targets` | 列出支持的 AI 工具名。 |
|
|
43
|
+
| `draftgo --version` | 打印 CLI 版本。 |
|
|
44
|
+
| `draftgo --help` | 查看帮助。 |
|
|
45
|
+
|
|
46
|
+
### 全局选项
|
|
47
|
+
|
|
48
|
+
- `--project <dir>`:对指定目录操作(默认当前工作目录)。
|
|
49
|
+
- `--force`:`init/update` 时覆盖已存在的 `.draftgo/skill/`。
|
|
50
|
+
- `--purge`:`uninstall` 时连 `.draftgo/`(含 config / 日志 / 本地缓存)一起删。
|
|
51
|
+
|
|
52
|
+
## 自动识别的依据
|
|
53
|
+
|
|
54
|
+
| AI 工具 | 探测信号(任一命中即视为在用) |
|
|
55
|
+
|---|---|
|
|
56
|
+
| Claude Code | `.claude/` 或 `CLAUDE.md` |
|
|
57
|
+
| Kiro | `.kiro/` |
|
|
58
|
+
| Cursor | `.cursor/` |
|
|
59
|
+
| Windsurf | `.windsurf/` |
|
|
60
|
+
| Antigravity | `.agent/` |
|
|
61
|
+
| GitHub Copilot | `.github/prompts/` 或 `.github/copilot-instructions.md` |
|
|
62
|
+
| Codex CLI | `.codex/` 或 `AGENTS.md` |
|
|
63
|
+
| Gemini CLI | `.gemini/` 或 `GEMINI.md` |
|
|
64
|
+
|
|
65
|
+
若未命中任何信号,请用 `draftgo init all` 或 `draftgo init <target>` 手动指定。
|
|
66
|
+
|
|
67
|
+
## 产物结构
|
|
68
|
+
|
|
69
|
+
所有 AI 工具共用一份 skill 本体,位于 `.draftgo/skill/`。每个 AI 工具只放一个薄壳入口文件指向它。
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
<project>/
|
|
73
|
+
├── .draftgo/
|
|
74
|
+
│ ├── skill/ # CLI 管理,不要手动改
|
|
75
|
+
│ │ ├── SKILL.md
|
|
76
|
+
│ │ ├── CLAUDE.md
|
|
77
|
+
│ │ ├── init/SKILL.md
|
|
78
|
+
│ │ ├── sync/SKILL.md
|
|
79
|
+
│ │ ├── bug/SKILL.md
|
|
80
|
+
│ │ ├── rules/
|
|
81
|
+
│ │ ├── scripts/
|
|
82
|
+
│ │ └── .version
|
|
83
|
+
│ ├── config.json # init 后生成(已加入 .gitignore)
|
|
84
|
+
│ ├── iteration/ # 迭代日志
|
|
85
|
+
│ ├── bugs/ # 框架级 bug 记录
|
|
86
|
+
│ ├── pages/ navigations/ ... # init 拉取的本地缓存
|
|
87
|
+
│ └── ...
|
|
88
|
+
└── (AI 工具入口,按需写入)
|
|
89
|
+
.claude/skills/draftgo/SKILL.md
|
|
90
|
+
.cursor/commands/draftgo.md
|
|
91
|
+
.windsurf/workflows/draftgo.md
|
|
92
|
+
.agent/workflows/draftgo.md
|
|
93
|
+
.github/prompts/draftgo.prompt.md
|
|
94
|
+
.kiro/steering/draftgo.md
|
|
95
|
+
AGENTS.md # Codex:写入带标记的块
|
|
96
|
+
GEMINI.md # Gemini:写入带标记的块
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
对于 `AGENTS.md` / `GEMINI.md` 这种会被其它工具共享的 markdown 文件,CLI 只写入 `<!-- DRAFTGO:START ... -->` 和 `<!-- DRAFTGO:END -->` 之间的块,更新和卸载都只动自己的块,不破坏你的其他内容。
|
|
100
|
+
|
|
101
|
+
## init / sync 的正确运行方式
|
|
102
|
+
|
|
103
|
+
skill 内置两个 Python 脚本。**不要用 curl / npx 代替**,脚本会处理 token、字段结构、错误日志。
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# 初始化(拉取服务器数据 → 生成本地上下文)
|
|
107
|
+
python .draftgo/skill/scripts/draftgo_init.py --server <url> --token <sat>
|
|
108
|
+
|
|
109
|
+
# 同步
|
|
110
|
+
python .draftgo/skill/scripts/draftgo_sync.py pages [page_id]
|
|
111
|
+
python .draftgo/skill/scripts/draftgo_sync.py nav [nav_id]
|
|
112
|
+
python .draftgo/skill/scripts/draftgo_sync.py db_meta [meta_id]
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
更推荐的用法:在 AI 工具里说「初始化 draftgo 项目」或「同步页面 123」,skill 会自动触发对应脚本。
|
|
116
|
+
|
|
117
|
+
## 许可证
|
|
118
|
+
|
|
119
|
+
MIT
|
package/bin/draftgo.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "draftgo-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Install and manage the DraftGo skill across AI coding agents (Claude Code, Codex, Cursor, Windsurf, Antigravity, Copilot, Gemini, Kiro).",
|
|
5
|
+
"bin": {
|
|
6
|
+
"draftgo": "bin/draftgo.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "src/index.js",
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=14"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin/",
|
|
14
|
+
"src/",
|
|
15
|
+
"resources/",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"keywords": [
|
|
19
|
+
"draftgo",
|
|
20
|
+
"skill",
|
|
21
|
+
"cli",
|
|
22
|
+
"claude-code",
|
|
23
|
+
"codex",
|
|
24
|
+
"cursor",
|
|
25
|
+
"windsurf",
|
|
26
|
+
"antigravity",
|
|
27
|
+
"copilot",
|
|
28
|
+
"gemini",
|
|
29
|
+
"kiro"
|
|
30
|
+
],
|
|
31
|
+
"author": {
|
|
32
|
+
"name": "draftgo",
|
|
33
|
+
"email": "cabinai@163.com",
|
|
34
|
+
"url": "https://github.com/draftgo"
|
|
35
|
+
},
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"homepage": "https://github.com/draftgo/draftgo-cli#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/draftgo/draftgo-cli/issues"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/draftgo/draftgo-cli.git"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# DraftGo 项目上下文
|
|
2
|
+
|
|
3
|
+
> 由 draftgo-init 自动生成。重新初始化:`/draftgo init`
|
|
4
|
+
|
|
5
|
+
## 架构认知(必读)
|
|
6
|
+
|
|
7
|
+
**DraftGo 不是传统 SPA,是"数据库驱动的页面资产运行时":**
|
|
8
|
+
- 壳层(Vue 3 + Vite)只负责 runtime 编排,源码在 `frontend/src/core/`
|
|
9
|
+
- 业务页面 HTML 存在数据库 `page.value.html`,运行在 `iframe.srcdoc`
|
|
10
|
+
- 导航栏 HTML 存在数据库 `navigation.html`,由壳层按需加载
|
|
11
|
+
- 页面与壳层通过 `window.parent.App` API 通信
|
|
12
|
+
|
|
13
|
+
**技术栈:**
|
|
14
|
+
- 后端:FastAPI 0.115.0 + SQLAlchemy 2.0.36 + Pydantic 2.10.0 + MySQL + Redis
|
|
15
|
+
- 前端:Vue 3 + Vite + Tailwind CSS(本地 `/assets/tailwindcss.js`)
|
|
16
|
+
|
|
17
|
+
## 连接信息
|
|
18
|
+
- 服务器:https://dev.draftgo.cn
|
|
19
|
+
- Token:存储于 `.draftgo/config.json`(已加入 .gitignore)
|
|
20
|
+
|
|
21
|
+
## 开发规范
|
|
22
|
+
→ 前端页面开发:读取 `.draftgo/rules/frontend.md`
|
|
23
|
+
→ 页面排错指南:读取 `.draftgo/rules/debugging-syntax.md`(页面功能不执行时必读!)
|
|
24
|
+
- 任何开发,必读!
|
|
25
|
+
|
|
26
|
+
## 开发禁区(违反必报错)
|
|
27
|
+
|
|
28
|
+
- ❌ 禁止境外 CDN(googleapis/jsdelivr/cdnjs/unpkg)→ ✅ 允许国内镜像(npmmirror.com/staticfile.net)
|
|
29
|
+
- ❌ 禁止 `App()` 写法(App 是对象不是函数)→ ✅ 正确:`const App = window.parent?.App`
|
|
30
|
+
- ❌ 禁止 `const App = () => window.parent?.App` → ✅ 去掉箭头函数
|
|
31
|
+
- ❌ 禁止 `window.location.search` 读参数 → ✅ 用 `window.__DG_ROUTE_CONTEXT__.query`
|
|
32
|
+
- ❌ 禁止 `App?.user?.role` 判断管理员 → `App.user` 不存在!✅ 用 `App.isAdmin` 或 `App.currentUser?.role_code`
|
|
33
|
+
- ❌ 禁止 `navigate('/login')` 退出 → ✅ 用 `window.location.href = '/login'`
|
|
34
|
+
- ❌ 禁止 `window.alert/confirm/prompt` → ✅ 用 `App.toast()` / `App.confirm()` / `App.showModal()`
|
|
35
|
+
- `App.showSuccess(msg)` 成功提示(绿色 3s)— 推荐用于操作成功反馈
|
|
36
|
+
- `App.showError(msg)` 错误提示(红色 4s)— 推荐用于失败反馈
|
|
37
|
+
- `App.showWarning(msg)` 警告提示(黄色 3s)— 推荐用于提醒
|
|
38
|
+
- `App.showInfo(msg)` 信息提示(蓝色 3s)— 推荐用于中性信息
|
|
39
|
+
- `App.toast(msg, type)` 通用方法 — type: success/error/warning/info
|
|
40
|
+
- `App.confirm(msg, title?)` 确认弹窗 — 玻璃蒙层 + 弹跳动画 + ⚠ 图标,双按钮,返回 Promise\<boolean\>
|
|
41
|
+
- `App.showModal(msg, title?)` 信息模态框 — 玻璃蒙层 + 弹跳动画 + i 图标,单按钮,替代 alert()
|
|
42
|
+
- `App.showLoading()` / `App.hideLoading()` — 全局 loading 玻璃蒙层,手动开关
|
|
43
|
+
- 详见 `.draftgo/rules/frontend.md` App API 章节
|
|
44
|
+
- ⚠️ 尽量避免硬编码颜色 → 优先用 `var(--dg-accent)` 等 token 以适配主题切换
|
|
45
|
+
|
|
46
|
+
## 主题切换适配
|
|
47
|
+
|
|
48
|
+
DraftGo 支持多套配色方案 + 亮暗模式,通过 CSS 变量实现。
|
|
49
|
+
|
|
50
|
+
**概念分层:**
|
|
51
|
+
| 概念 | 存储键 | 取值 |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| 显示模式 | `dg_theme` | `'light'` \| `'dark'` \| `'system'` |
|
|
54
|
+
| 配色方案 | `dg_color_scheme` | `'dark-gray-white'` \| `'deep-blue-white'` \| `'orange-white'` \| `'custom'` |
|
|
55
|
+
|
|
56
|
+
**内置配色方案:**
|
|
57
|
+
- `dark-gray-white` 深灰白(默认)— 冷调深灰,干净利落
|
|
58
|
+
- `deep-blue-white` 深蓝白 — 专业稳重,企业风
|
|
59
|
+
- `orange-white` 橙白 — 温暖醒目,创意风
|
|
60
|
+
|
|
61
|
+
**颜色 Token(优先使用):**
|
|
62
|
+
- `--dg-bg-base` / `--dg-bg-page` / `--dg-bg-surface` — 背景层级
|
|
63
|
+
- `--dg-text-primary` / `--dg-text-secondary` / `--dg-text-muted` — 文字层级
|
|
64
|
+
- `--dg-accent` / `--dg-accent-hover` / `--dg-accent-subtle` — 主题色
|
|
65
|
+
- `--dg-border` / `--dg-success` / `--dg-error` / `--dg-warning` — 功能色
|
|
66
|
+
|
|
67
|
+
**App API 切换配色:**
|
|
68
|
+
```javascript
|
|
69
|
+
App.setColorScheme('deep-blue-white'); // 切换为预设方案
|
|
70
|
+
App.setColorScheme('custom', customVarsObject); // 应用自定义配色
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**硬编码颜色的场景(允许但需注意):**
|
|
74
|
+
- 品牌色(如 Logo 固定色)
|
|
75
|
+
- 数据可视化图表(需保证对比度)
|
|
76
|
+
- 第三方组件库强制要求
|
|
77
|
+
|
|
78
|
+
**硬编码时的要求:**
|
|
79
|
+
- 同时提供亮色/暗色两套值,通过 `[data-theme="dark"]` 选择器切换
|
|
80
|
+
- 确保对比度符合 WCAG AA 标准(文字至少 4.5:1)
|
|
81
|
+
|
|
82
|
+
## 本地开发流程
|
|
83
|
+
|
|
84
|
+
**原则:有功能修改就读本地数据,自主决策是否调用 API 完成高质量修改。**
|
|
85
|
+
|
|
86
|
+
1. **开发时**:读写 `.draftgo/` 本地文件
|
|
87
|
+
- 查元数据:读 `index.json`
|
|
88
|
+
- 查/改 HTML:按 `html_file` 字段路径读对应 `.html` 文件
|
|
89
|
+
2. **修改后**:运行同步脚本推送到服务器(见下方"同步命令")
|
|
90
|
+
3. **同步成功**:本地与服务器数据一致
|
|
91
|
+
|
|
92
|
+
**本地数据目录:**
|
|
93
|
+
|
|
94
|
+
| 目录 | 内容 |
|
|
95
|
+
|---|---|
|
|
96
|
+
| pages/ | index.json(无 html)+ 若干 .html |
|
|
97
|
+
| navigations/ | index.json(无 html)+ 若干 .html |
|
|
98
|
+
| roles/ | index.json |
|
|
99
|
+
| users/ | index.json |
|
|
100
|
+
| db_meta/ | index.json |
|
|
101
|
+
| aihub/ | index.json |
|
|
102
|
+
| system_config/ | index.json |
|
|
103
|
+
| iteration/ | YYYY-MM-DD.txt(迭代日志) |
|
|
104
|
+
| error/ | YYYY-MM-DD.txt(错误日志) |
|
|
105
|
+
|
|
106
|
+
## 数据库 Schema(关键字段)
|
|
107
|
+
|
|
108
|
+
| 表 | 关键字段 | 说明 |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `page` | `id`, `title`, `route`, `permission`, `value` (JSON: `{html: "..."}`) | value.html 存页面完整 HTML |
|
|
111
|
+
| `navigation` | `id`, `code`, `name`, `html`, `order`, `status` | html 字段存导航栏完整 HTML |
|
|
112
|
+
| `user` | `id`, `username`, `email`, `role_id`, `status` | role_id 关联 role 表 |
|
|
113
|
+
| `role` | `id`, `code`, `name`, `permissions` (JSON) | admin 角色拥有所有权限 |
|
|
114
|
+
| `db_meta` | `id`, `type`, `fields` (JSON: `[{name, type, required}]`) | 动态表结构定义 |
|
|
115
|
+
| `db` | `id`, `type`, `data` (JSON), `userid`, `status`, `created_at`, `updated_at` | 动态数据存储(含自动时间戳) |
|
|
116
|
+
| `aihub` | `id`, `name`, `type`, `config` (JSON), `status` | AI 服务配置 |
|
|
117
|
+
| `sys_config` | `config_key`, `config_value`, `value_type`, `category`, `is_sensitive` | 系统配置 KV |
|
|
118
|
+
|
|
119
|
+
## API 速查与示例
|
|
120
|
+
|
|
121
|
+
| 模块 | 端点 |
|
|
122
|
+
|---|---|
|
|
123
|
+
| 认证 | POST /api/auth/login, /register, /logout, /refresh, /forgot-password, /reset-password |
|
|
124
|
+
| 微信认证 | POST /api/auth/wechat/mp/oauth, /wechat/mini/login, /wechat/mp/qr/create · GET /wechat/mp/qr/poll |
|
|
125
|
+
| 用户 | GET/PUT /api/users/me · GET/POST /api/users · GET/PUT/DELETE /users/{id} · POST /users/{id}/ban, /unban |
|
|
126
|
+
| 角色 | GET/POST /api/roles · GET/PUT/DELETE /roles/{id} · POST /roles/{id}/assign/{uid} · DELETE /roles/{id}/revoke/{uid} |
|
|
127
|
+
| 页面 | GET/POST /api/pages/ · GET/PUT/DELETE /pages/{id} · POST /pages/{id}/reset-system · GET /pages/by-route · GET /pages/public/{route} |
|
|
128
|
+
| 导航栏 | GET/POST /api/navigations · GET /navigations/{code} · PUT/DELETE /navigations/{id} · POST /navigations/{id}/reset-system |
|
|
129
|
+
| 系统配置 | GET /api/system/config · GET /system/category/{category} · GET/PUT/DELETE /system/{key} · POST /system/ · POST /system/config/ensure |
|
|
130
|
+
| 备份恢复 | GET/POST /api/system/backup · POST /system/restore · POST /system/reset · POST /system/backup/selective · POST /system/restore/selective · GET /system/backup/logs |
|
|
131
|
+
| 通知公告 | GET/POST /api/notices · GET/PUT/DELETE /notices/{id} |
|
|
132
|
+
| 反馈 | GET/POST /api/feedback · GET /feedback/updates · GET/PUT/DELETE /feedback/{id} · DELETE /feedback/batch |
|
|
133
|
+
| 日志 | GET /api/logs · GET /logs/{id} |
|
|
134
|
+
| 智能体 | GET /api/agents · GET /agents/logs · POST /agents/{id}/chat · POST /agents/{id}/preview-chat |
|
|
135
|
+
| 动态DB | GET/POST /api/db/{type} · GET/PUT/DELETE /db/{type}/{id} |
|
|
136
|
+
| DB Meta | GET/POST /api/db-meta · GET /db-meta/{type} · PUT/DELETE /db-meta/{id} |
|
|
137
|
+
| ⚠️ DB Meta 查询 | GET /db-meta/{type} 用 **type**(如 `patient_profile`),不是 id。用 id 查会返回 "元数据不存在"。PUT/DELETE 才用 id。 |
|
|
138
|
+
| AIHub | GET/POST /api/aihub · GET/PUT/DELETE /aihub/{id} · PATCH /aihub/{id}/basic · POST /aihub/{id}/sync · POST /aihub/discover · GET /aihub/types |
|
|
139
|
+
| AI推理 | GET /api/v1/models · POST /v1/chat/completions |
|
|
140
|
+
| 文件上传 | POST /api/upload |
|
|
141
|
+
| 通知测试 | POST /api/system/notifications/test-email, /test-sms · GET /system/notifications/logs |
|
|
142
|
+
|
|
143
|
+
### 高频 API 示例
|
|
144
|
+
|
|
145
|
+
**创建页面(需 admin):**
|
|
146
|
+
```
|
|
147
|
+
POST /api/pages/
|
|
148
|
+
Body: { "title": "新页面", "route": "/new", "permission": "public", "value": {"html": "<html>...</html>"} }
|
|
149
|
+
Response: { "id": 123, "title": "新页面", "route": "/new", ... }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**更新页面 HTML(需 admin):**
|
|
153
|
+
```
|
|
154
|
+
PUT /api/pages/123
|
|
155
|
+
Body: { "value": {"html": "<html>更新后...</html>"} }
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**重置系统页面(需 admin):**
|
|
159
|
+
```
|
|
160
|
+
POST /api/pages/123/reset-system
|
|
161
|
+
Body: 空
|
|
162
|
+
说明:从 backend/init/pages/ 重新加载该页面
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**创建动态数据(普通用户自动绑定 userid):**
|
|
166
|
+
```
|
|
167
|
+
POST /api/db/patient
|
|
168
|
+
Body: { "data": {"name": "张三", "age": 30} }
|
|
169
|
+
Response: { "id": 456, "type": "patient", "data": {...}, "userid": 当前用户id, "status": 1, "created_at": "2026-01-01T12:00:00", "updated_at": "2026-01-01T12:00:00" }
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**查询动态数据(带分页):**
|
|
173
|
+
```
|
|
174
|
+
GET /api/db/patient?page=1&page_size=20
|
|
175
|
+
Response: { "items": [{ "id": 456, "type": "patient", "data": {...}, "userid": 1, "status": 1, "created_at": "...", "updated_at": "..." }], "total": 100, "page": 1, "page_size": 20 }
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## URL 参数读取
|
|
179
|
+
|
|
180
|
+
页面运行在 `iframe.srcdoc` 中,`window.location.search` 不可靠。框架通过 `<script data-dg-route-bridge>` 注入路由上下文。
|
|
181
|
+
|
|
182
|
+
```javascript
|
|
183
|
+
// 标准三阶回落(推荐)
|
|
184
|
+
const routeContext =
|
|
185
|
+
window.__DG_ROUTE_CONTEXT__
|
|
186
|
+
|| window.__DG_GET_ROUTE_CONTEXT__?.()
|
|
187
|
+
|| window.parent?.App?.getCurrentRouteContext?.()
|
|
188
|
+
|| { query: {} };
|
|
189
|
+
const query = routeContext.query || {};
|
|
190
|
+
|
|
191
|
+
// 使用示例
|
|
192
|
+
// 路由 /doctor/prescription-estimate?patientId=42&visitId=7
|
|
193
|
+
const patientId = query.patientId; // "42"
|
|
194
|
+
const visitId = query.visitId; // "7"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
禁止:`new URLSearchParams(window.location.search)` — iframe 中取不到壳层 URL。
|
|
198
|
+
|
|
199
|
+
## 常见问题排查
|
|
200
|
+
|
|
201
|
+
| 问题 | 排查步骤 |
|
|
202
|
+
|---|---|
|
|
203
|
+
| 同步失败 | 1. 检查 `.draftgo/config.json` token 是否有效<br>2. 检查服务器连接(ping/curl)<br>3. 查看 `.draftgo/error/YYYY-MM-DD.txt` 错误日志 |
|
|
204
|
+
| 页面加载空白 | 1. 检查 `permission` 字段与当前用户角色是否匹配<br>2. 检查路由是否正确(`/api/pages/by-route?route=/xxx`)<br>3. 浏览器控制台查看 JS 错误 |
|
|
205
|
+
| API 返回 401 | Token 过期,前端会自动用 refresh token 刷新,无需手动处理 |
|
|
206
|
+
| API 返回 403 | 权限不足,检查当前用户角色是否有对应权限 |
|
|
207
|
+
| DB Meta GET 返回"元数据不存在" | 你用了 id,应该用 **type**(如 `/api/db-meta/patient_profile`)。PUT/DELETE 才用 id。 |
|
|
208
|
+
| 颜色不生效 | 检查是否用了 `var(--dg-*)` 而非硬编码 hex/rgb |
|
|
209
|
+
| URL 参数读取失败 | 检查是否用了 `window.__DG_ROUTE_CONTEXT__.query` 而非 `window.location.search` |
|
|
210
|
+
| 退出登录后导航栏未更新 | 检查是否用了 `window.location.href = '/login'` 而非 `navigate('/login')` |
|
|
211
|
+
|
|
212
|
+
## 错误日志规范
|
|
213
|
+
|
|
214
|
+
**遇到任何开发/运行时错误,必须自动追加到 `.draftgo/error/YYYY-MM-DD.txt`:**
|
|
215
|
+
|
|
216
|
+
格式:`[HH:MM:SS] [错误类型] 描述`
|
|
217
|
+
|
|
218
|
+
示例:
|
|
219
|
+
```
|
|
220
|
+
[14:23:45] [同步失败] pages/123 同步到服务器失败:401 Unauthorized
|
|
221
|
+
[14:30:12] [API错误] GET /api/db/patient 返回 500:数据库连接超时
|
|
222
|
+
[15:10:33] [页面错误] admin-users.html 第 42 行:App is not a function
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
操作流程:
|
|
226
|
+
1. 捕获错误后,获取当前日期和时间
|
|
227
|
+
2. 检查 `.draftgo/error/YYYY-MM-DD.txt` 是否存在
|
|
228
|
+
3. 存在则 Read 后追加新行;不存在则直接 Write
|
|
229
|
+
4. 无需告知用户(静默执行)
|
|
230
|
+
|
|
231
|
+
## 同步命令
|
|
232
|
+
|
|
233
|
+
> **禁止用 npx/npm/curl 同步。必须用 Python 脚本:**
|
|
234
|
+
> `python .draftgo/skill/scripts/draftgo_sync.py pages <page_id>`
|
|
235
|
+
> `python .draftgo/skill/scripts/draftgo_sync.py nav <nav_id>`
|
|
236
|
+
|
|
237
|
+
- `/draftgo sync pages` — 触发 sync skill(不是 CLI 命令)
|
|
238
|
+
- `/draftgo sync nav` — 触发 sync skill(不是 CLI 命令)
|
|
239
|
+
- `/draftgo init` — 触发 init skill(不是 CLI 命令)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: draftgo
|
|
3
|
+
description: Use this skill when the user is developing, maintaining, or debugging a DraftGo-based application. Activates for tasks involving DraftGo pages, navigation, API calls, roles, DB meta, or any DraftGo-specific development work. ALSO activates when user says "同步", "sync", "同步到云端", "push to server", "上传页面", "上传导航" — route to /draftgo sync skill immediately, do NOT attempt manual API calls.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# DraftGo 开发助手
|
|
8
|
+
|
|
9
|
+
> **每次完成任何开发/修复/修改/完善/删除/重构操作后,必须立即写迭代记录到 `.draftgo/iteration/YYYY-MM-DD.txt`,格式:`[操作类型] 描述`。这是强制步骤,不得跳过。**
|
|
10
|
+
|
|
11
|
+
## 命令路由
|
|
12
|
+
|
|
13
|
+
**不要在此 Skill 中直接执行任何操作。** 根据用户意图路由到对应子命令:
|
|
14
|
+
|
|
15
|
+
| 用户意图 | 执行 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| 初始化项目 / 连接服务器 / `/draftgo init` | 调用 `/draftgo init` Skill |
|
|
18
|
+
| 同步页面或导航 / `/draftgo sync` | 调用 `/draftgo sync` Skill |
|
|
19
|
+
| 开发页面 / 修改页面 / 新建导航 | 读取 `CLAUDE.md` + `.draftgo/rules/frontend.md` + `.draftgo/rules/debugging-syntax.md` 后开始开发,**完成后必须:1) 写迭代记录 2) 自动同步到服务器**(见下方规范) |
|
|
20
|
+
|
|
21
|
+
## 开发前置检查
|
|
22
|
+
|
|
23
|
+
进行任何开发任务前,先确认:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
!test -f CLAUDE.md && echo "OK" || echo "请先运行 /draftgo init"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`CLAUDE.md` 存在后,读取它获取页面列表、导航列表、服务器地址等上下文。
|
|
30
|
+
|
|
31
|
+
开发规范读取:`.draftgo/rules/frontend.md`
|
|
32
|
+
|
|
33
|
+
## 迭代记录规范
|
|
34
|
+
|
|
35
|
+
每次对系统进行开发/修复/修改/完善/删除/重构等操作后,**必须**在 `.draftgo/iteration/` 目录下按日期写入迭代记录。
|
|
36
|
+
|
|
37
|
+
### 规则
|
|
38
|
+
|
|
39
|
+
- 文件名:`YYYY-MM-DD.txt`,当天所有操作追加到同一文件
|
|
40
|
+
- 每行一条,格式:`[HH:MM:SS] [操作类型] 描述`
|
|
41
|
+
- 操作类型:`新增` / `修复` / `修改` / `完善` / `删除` / `重构`
|
|
42
|
+
- 描述精简,一句话,不超过 30 字
|
|
43
|
+
- 文件不存在时直接 Write 创建;已存在时 Read 后追加新行再 Write
|
|
44
|
+
|
|
45
|
+
### 示例(2026-05-06.txt)
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
[14:23:15] [新增] 用户登录页面表单验证逻辑
|
|
49
|
+
[15:10:42] [修复] 脉象输入组件在 Safari 下无法聚焦
|
|
50
|
+
[16:05:33] [修改] 问诊表单字段顺序,主诉移至首位
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 操作流程
|
|
54
|
+
|
|
55
|
+
1. 完成任何系统操作后,获取当前日期和时间
|
|
56
|
+
2. 检查 `.draftgo/iteration/YYYY-MM-DD.txt` 是否存在
|
|
57
|
+
3. 存在则 Read 后追加新行;不存在则直接 Write
|
|
58
|
+
4. 无需告知用户(静默执行)
|
|
59
|
+
|
|
60
|
+
## 自动同步规范
|
|
61
|
+
|
|
62
|
+
> **每次修改页面或导航栏 HTML 后,必须立即自动同步到服务器。这是强制步骤,不得跳过,不得等用户提醒。**
|
|
63
|
+
|
|
64
|
+
### 同步规则
|
|
65
|
+
|
|
66
|
+
- 修改了哪个页面的 HTML → 同步该页面:`python .draftgo/skill/scripts/draftgo_sync.py pages <page_id>`
|
|
67
|
+
- 修改了哪个导航栏的 HTML → 同步该导航:`python .draftgo/skill/scripts/draftgo_sync.py nav <nav_id>`
|
|
68
|
+
- 同时修改多个 → 逐个同步
|
|
69
|
+
- 同步失败时告知用户,不得静默忽略
|
|
70
|
+
|
|
71
|
+
### 完整操作顺序(每次开发任务结束时)
|
|
72
|
+
|
|
73
|
+
1. 写迭代记录(静默)
|
|
74
|
+
2. 运行同步脚本(必须执行)
|
|
75
|
+
3. 告知用户同步结果
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: draftgo-bug
|
|
3
|
+
description: Use this skill when encountering a DraftGo framework-level runtime bug. Automatically records the bug as a separate markdown file in the project's bugs/ directory.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
allowed-tools: Read, Write, Glob
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# DraftGo Bug 记录规范
|
|
9
|
+
|
|
10
|
+
## 触发条件
|
|
11
|
+
|
|
12
|
+
遇到以下情况时**自动触发**,无需用户提示:
|
|
13
|
+
- DraftGo 框架本身的运行时错误(非业务逻辑错误)
|
|
14
|
+
- 页面加载/渲染异常
|
|
15
|
+
- 导航栏挂载失败
|
|
16
|
+
- API 鉴权/Token 异常
|
|
17
|
+
- 初始化流程中断
|
|
18
|
+
- 前端 runtime 与后端不一致导致的系统级问题
|
|
19
|
+
|
|
20
|
+
## 存储规则
|
|
21
|
+
|
|
22
|
+
- **每个 bug 一个独立 md 文件**,存放于 `.draftgo/bugs/` 文件夹(与 `pages/`、`navigations/` 同级的 `.draftgo` 目录内)
|
|
23
|
+
- 文件名格式:`YYYY-MM-DD_{slug}.md`(slug 为 bug 标题的简短英文描述,用下划线连接)
|
|
24
|
+
- `.draftgo/bugs/` 目录不存在时自动创建(直接 Write 文件即可,路径中的目录会自动创建)
|
|
25
|
+
|
|
26
|
+
## 文件模板
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
---
|
|
30
|
+
date: YYYY-MM-DD
|
|
31
|
+
status: open
|
|
32
|
+
env: local | docker | production
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# {简短标题}
|
|
36
|
+
|
|
37
|
+
## 复现步骤
|
|
38
|
+
1. ...
|
|
39
|
+
|
|
40
|
+
## 预期行为
|
|
41
|
+
...
|
|
42
|
+
|
|
43
|
+
## 实际行为
|
|
44
|
+
...
|
|
45
|
+
|
|
46
|
+
## 错误日志
|
|
47
|
+
\`\`\`
|
|
48
|
+
{相关日志}
|
|
49
|
+
\`\`\`
|
|
50
|
+
|
|
51
|
+
## 解决方案
|
|
52
|
+
> 未解决时留空
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 状态值
|
|
56
|
+
|
|
57
|
+
| status | 含义 |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `open` | 未解决 |
|
|
60
|
+
| `in_progress` | 排查中 |
|
|
61
|
+
| `resolved` | 已解决(补充解决方案后更新) |
|
|
62
|
+
|
|
63
|
+
## 操作流程
|
|
64
|
+
|
|
65
|
+
1. 确认是框架级 bug(非业务代码问题)
|
|
66
|
+
2. 生成文件名:`.draftgo/bugs/YYYY-MM-DD_{slug}.md`
|
|
67
|
+
3. 用 Write 工具写入文件
|
|
68
|
+
4. 告知用户已记录,文件路径为 `.draftgo/bugs/{filename}`
|
|
69
|
+
|
|
70
|
+
## 初始化时
|
|
71
|
+
|
|
72
|
+
`/draftgo init` 执行时,脚本会创建 `.draftgo/bugs/` 文件夹。
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: draftgo-init
|
|
3
|
+
description: Use this skill when the user runs "/draftgo init", wants to initialize a DraftGo development project, connect to a DraftGo server, or set up DraftGo development context for the first time.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
allowed-tools: Bash(python:*), Bash(find:*), Read
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# DraftGo 项目初始化
|
|
9
|
+
|
|
10
|
+
## 第一步:收集连接信息
|
|
11
|
+
|
|
12
|
+
检查是否已有配置:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
!test -f .draftgo/config.json && cat .draftgo/config.json || echo "NOT_FOUND"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- **已存在**:询问用户是否覆盖,确认后继续
|
|
19
|
+
- **不存在**:向用户询问:
|
|
20
|
+
1. DraftGo 服务器地址(如 `https://your-server.com`)
|
|
21
|
+
2. 系统访问令牌(SAT,管理后台 → 系统设置 → API Token)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 第二步:执行初始化脚本
|
|
26
|
+
|
|
27
|
+
脚本固定位于 `.draftgo/skill/scripts/draftgo_init.py`,直接运行(**不要读取脚本内容**):
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# 默认:项目根由脚本自动推导(向上查找含 .draftgo/ 的目录)
|
|
31
|
+
!python .draftgo/skill/scripts/draftgo_init.py --server "<server>" --token "<token>"
|
|
32
|
+
|
|
33
|
+
# 用户明确指定了项目路径时,作为位置参数传入
|
|
34
|
+
!python .draftgo/skill/scripts/draftgo_init.py --server "<server>" --token "<token>" "<project_path>"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
脚本会自动完成所有工作并输出摘要,**不要读取任何中间 JSON 文件**。
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 第三步:读取结果
|
|
42
|
+
|
|
43
|
+
脚本执行完毕后,只读取 `CLAUDE.md` 确认生成成功:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
!test -f CLAUDE.md && echo "OK" || echo "FAIL"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 初始化目录
|
|
52
|
+
|
|
53
|
+
脚本执行完毕后,确保以下目录存在(不存在则创建):
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
!mkdir -p .draftgo/bugs .draftgo/iteration
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 完成提示
|
|
60
|
+
|
|
61
|
+
将脚本的输出摘要(页面数、导航数、服务器地址)告知用户,并提示:
|
|
62
|
+
- 下一步:描述要开发的功能,或运行 `/draftgo sync` 同步修改
|
|
63
|
+
- 如需刷新数据:重新运行 `/draftgo init`
|