@loom-framework/core 0.1.0-alpha.8 → 0.1.0-alpha.81

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/adapter-base.d.ts +29 -0
  2. package/dist/adapter-base.d.ts.map +1 -0
  3. package/dist/adapter-base.js +62 -0
  4. package/dist/adapter-base.js.map +1 -0
  5. package/dist/adapter-factory.d.ts +8 -0
  6. package/dist/adapter-factory.d.ts.map +1 -0
  7. package/dist/adapter-factory.js +25 -0
  8. package/dist/adapter-factory.js.map +1 -0
  9. package/dist/adapter-filesystem.d.ts +6 -11
  10. package/dist/adapter-filesystem.d.ts.map +1 -1
  11. package/dist/adapter-filesystem.js +56 -41
  12. package/dist/adapter-filesystem.js.map +1 -1
  13. package/dist/adapter-sqlite.d.ts +6 -23
  14. package/dist/adapter-sqlite.d.ts.map +1 -1
  15. package/dist/adapter-sqlite.js +65 -50
  16. package/dist/adapter-sqlite.js.map +1 -1
  17. package/dist/backend/ai/button-resolver.d.ts +18 -0
  18. package/dist/backend/ai/button-resolver.d.ts.map +1 -0
  19. package/dist/backend/ai/button-resolver.js +58 -0
  20. package/dist/backend/ai/button-resolver.js.map +1 -0
  21. package/dist/backend/ai/engine.d.ts +52 -0
  22. package/dist/backend/ai/engine.d.ts.map +1 -0
  23. package/dist/backend/ai/engine.js +186 -0
  24. package/dist/backend/ai/engine.js.map +1 -0
  25. package/dist/backend/ai/index.d.ts +11 -0
  26. package/dist/backend/ai/index.d.ts.map +1 -0
  27. package/dist/backend/ai/index.js +8 -0
  28. package/dist/backend/ai/index.js.map +1 -0
  29. package/dist/backend/ai/output-parser.d.ts +29 -0
  30. package/dist/backend/ai/output-parser.d.ts.map +1 -0
  31. package/dist/backend/ai/output-parser.js +247 -0
  32. package/dist/backend/ai/output-parser.js.map +1 -0
  33. package/dist/backend/ai/session-manager.d.ts +103 -0
  34. package/dist/backend/ai/session-manager.d.ts.map +1 -0
  35. package/dist/backend/ai/session-manager.js +298 -0
  36. package/dist/backend/ai/session-manager.js.map +1 -0
  37. package/dist/backend/index.d.ts +61 -0
  38. package/dist/backend/index.d.ts.map +1 -0
  39. package/dist/backend/index.js +161 -0
  40. package/dist/backend/index.js.map +1 -0
  41. package/dist/backend/observe/index.d.ts +6 -0
  42. package/dist/backend/observe/index.d.ts.map +1 -0
  43. package/dist/backend/observe/index.js +5 -0
  44. package/dist/backend/observe/index.js.map +1 -0
  45. package/dist/backend/observe/logger.d.ts +28 -0
  46. package/dist/backend/observe/logger.d.ts.map +1 -0
  47. package/dist/backend/observe/logger.js +80 -0
  48. package/dist/backend/observe/logger.js.map +1 -0
  49. package/dist/backend/observe/types.d.ts +26 -0
  50. package/dist/backend/observe/types.d.ts.map +1 -0
  51. package/dist/backend/observe/types.js +7 -0
  52. package/dist/backend/observe/types.js.map +1 -0
  53. package/dist/backend/routes/chat.d.ts +31 -0
  54. package/dist/backend/routes/chat.d.ts.map +1 -0
  55. package/dist/backend/routes/chat.js +426 -0
  56. package/dist/backend/routes/chat.js.map +1 -0
  57. package/dist/backend/routes/data.d.ts +13 -0
  58. package/dist/backend/routes/data.d.ts.map +1 -0
  59. package/dist/backend/routes/data.js +134 -0
  60. package/dist/backend/routes/data.js.map +1 -0
  61. package/dist/backend/routes/health.d.ts +7 -0
  62. package/dist/backend/routes/health.d.ts.map +1 -0
  63. package/dist/backend/routes/health.js +15 -0
  64. package/dist/backend/routes/health.js.map +1 -0
  65. package/dist/backend/routes/index.d.ts +11 -0
  66. package/dist/backend/routes/index.d.ts.map +1 -0
  67. package/dist/backend/routes/index.js +9 -0
  68. package/dist/backend/routes/index.js.map +1 -0
  69. package/dist/backend/routes/skills.d.ts +16 -0
  70. package/dist/backend/routes/skills.d.ts.map +1 -0
  71. package/dist/backend/routes/skills.js +590 -0
  72. package/dist/backend/routes/skills.js.map +1 -0
  73. package/dist/backend/routes/upload.d.ts +24 -0
  74. package/dist/backend/routes/upload.d.ts.map +1 -0
  75. package/dist/backend/routes/upload.js +67 -0
  76. package/dist/backend/routes/upload.js.map +1 -0
  77. package/dist/bin.d.ts +8 -0
  78. package/dist/bin.d.ts.map +1 -0
  79. package/dist/bin.js +12 -0
  80. package/dist/bin.js.map +1 -0
  81. package/dist/capability-generator.d.ts +21 -6
  82. package/dist/capability-generator.d.ts.map +1 -1
  83. package/dist/capability-generator.js +88 -261
  84. package/dist/capability-generator.js.map +1 -1
  85. package/dist/cli/commands/build.d.ts +11 -0
  86. package/dist/cli/commands/build.d.ts.map +1 -0
  87. package/dist/cli/commands/build.js +170 -0
  88. package/dist/cli/commands/build.js.map +1 -0
  89. package/dist/cli/commands/data.d.ts +12 -0
  90. package/dist/cli/commands/data.d.ts.map +1 -0
  91. package/dist/cli/commands/data.js +158 -0
  92. package/dist/cli/commands/data.js.map +1 -0
  93. package/dist/cli/commands/dev.d.ts +9 -0
  94. package/dist/cli/commands/dev.d.ts.map +1 -0
  95. package/dist/cli/commands/dev.js +114 -0
  96. package/dist/cli/commands/dev.js.map +1 -0
  97. package/dist/cli/commands/generate-capabilities.d.ts +8 -0
  98. package/dist/cli/commands/generate-capabilities.d.ts.map +1 -0
  99. package/dist/cli/commands/generate-capabilities.js +40 -0
  100. package/dist/cli/commands/generate-capabilities.js.map +1 -0
  101. package/dist/cli/commands/generate-cli-command.d.ts +8 -0
  102. package/dist/cli/commands/generate-cli-command.d.ts.map +1 -0
  103. package/dist/cli/commands/generate-cli-command.js +64 -0
  104. package/dist/cli/commands/generate-cli-command.js.map +1 -0
  105. package/dist/cli/commands/generate-dashboard.d.ts +9 -0
  106. package/dist/cli/commands/generate-dashboard.d.ts.map +1 -0
  107. package/dist/cli/commands/generate-dashboard.js +452 -0
  108. package/dist/cli/commands/generate-dashboard.js.map +1 -0
  109. package/dist/cli/commands/generate-page.d.ts +9 -0
  110. package/dist/cli/commands/generate-page.d.ts.map +1 -0
  111. package/dist/cli/commands/generate-page.js +518 -0
  112. package/dist/cli/commands/generate-page.js.map +1 -0
  113. package/dist/cli/commands/generate-skill.d.ts +8 -0
  114. package/dist/cli/commands/generate-skill.d.ts.map +1 -0
  115. package/dist/cli/commands/generate-skill.js +75 -0
  116. package/dist/cli/commands/generate-skill.js.map +1 -0
  117. package/dist/cli/commands/generate.d.ts +6 -0
  118. package/dist/cli/commands/generate.d.ts.map +1 -0
  119. package/dist/cli/commands/generate.js +19 -0
  120. package/dist/cli/commands/generate.js.map +1 -0
  121. package/dist/cli/commands/init.d.ts +8 -0
  122. package/dist/cli/commands/init.d.ts.map +1 -0
  123. package/dist/cli/commands/init.js +539 -0
  124. package/dist/cli/commands/init.js.map +1 -0
  125. package/dist/cli/commands/observe.d.ts +9 -0
  126. package/dist/cli/commands/observe.d.ts.map +1 -0
  127. package/dist/cli/commands/observe.js +142 -0
  128. package/dist/cli/commands/observe.js.map +1 -0
  129. package/dist/cli/commands/skill.d.ts +9 -0
  130. package/dist/cli/commands/skill.d.ts.map +1 -0
  131. package/dist/cli/commands/skill.js +186 -0
  132. package/dist/cli/commands/skill.js.map +1 -0
  133. package/dist/cli/helpers/app-tsx-wiring.d.ts +17 -0
  134. package/dist/cli/helpers/app-tsx-wiring.d.ts.map +1 -0
  135. package/dist/cli/helpers/app-tsx-wiring.js +132 -0
  136. package/dist/cli/helpers/app-tsx-wiring.js.map +1 -0
  137. package/dist/cli/helpers/duration.d.ts +5 -0
  138. package/dist/cli/helpers/duration.d.ts.map +1 -0
  139. package/dist/cli/helpers/duration.js +19 -0
  140. package/dist/cli/helpers/duration.js.map +1 -0
  141. package/dist/cli/helpers/field-template.d.ts +10 -0
  142. package/dist/cli/helpers/field-template.d.ts.map +1 -0
  143. package/dist/cli/helpers/field-template.js +100 -0
  144. package/dist/cli/helpers/field-template.js.map +1 -0
  145. package/dist/cli/helpers/naming.d.ts +12 -0
  146. package/dist/cli/helpers/naming.d.ts.map +1 -0
  147. package/dist/cli/helpers/naming.js +25 -0
  148. package/dist/cli/helpers/naming.js.map +1 -0
  149. package/dist/cli/index.d.ts +9 -0
  150. package/dist/cli/index.d.ts.map +1 -0
  151. package/dist/cli/index.js +33 -0
  152. package/dist/cli/index.js.map +1 -0
  153. package/dist/cli/utils.d.ts +10 -0
  154. package/dist/cli/utils.d.ts.map +1 -0
  155. package/dist/cli/utils.js +31 -0
  156. package/dist/cli/utils.js.map +1 -0
  157. package/dist/config.d.ts +118 -42
  158. package/dist/config.d.ts.map +1 -1
  159. package/dist/config.js +59 -10
  160. package/dist/config.js.map +1 -1
  161. package/dist/index.d.ts +7 -2
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +7 -1
  164. package/dist/index.js.map +1 -1
  165. package/dist/server-bin.d.ts +12 -0
  166. package/dist/server-bin.d.ts.map +1 -0
  167. package/dist/server-bin.js +75 -0
  168. package/dist/server-bin.js.map +1 -0
  169. package/dist/types.d.ts +71 -20
  170. package/dist/types.d.ts.map +1 -1
  171. package/package.json +25 -10
  172. package/templates/app-skill/SKILL.md +27 -0
  173. package/templates/app-skill/references/data-semantics.md +44 -0
  174. package/templates/app-skill/references/models.md +31 -0
  175. package/templates/loom-skill/SKILL.md +153 -0
  176. package/templates/loom-skill/references/README.md +128 -0
  177. package/templates/loom-skill/references/dashboard.md +161 -0
  178. package/templates/loom-skill/references/data-model.md +78 -0
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: Loom
3
+ description: |
4
+ Use this skill when the user asks to "create a new loom project", "用loom开发一个系统",
5
+ "开发一个AI平台应用", "为系统添加页面", "为项目配置 AI 按钮功能", or any Loom framework task.
6
+ Loom is an AI-Native full-stack framework.
7
+ version: 0.1.0
8
+ ---
9
+
10
+ # Loom - AI 原生全栈框架技能
11
+
12
+ ## 框架工作方式
13
+
14
+ Loom 是**配置驱动、自动生成**的框架。工作流程为:
15
+
16
+ 1. **写配置** — 编辑 `loom.config.ts`,定义数据模型和 AI 按钮
17
+ 2. **跑命令** — CLI 读取配置,自动生成页面、API 和路由接线
18
+
19
+ `loom generate page` 会自动生成:CRUD 页面(含 AI 按钮)、App.tsx 路由接线、后端 API + 应用 Skill。
20
+ 生成的页面自带 AI 助手浮动按钮,支持流式对话、多会话和数据自动刷新。
21
+
22
+ 技术架构细节见 `references/README.md`。
23
+
24
+ ## 开发流程
25
+
26
+ **重要:** 始终在项目目录下运行命令(不是 loom monorepo 根目录)。
27
+
28
+ ### 1. 创建项目
29
+
30
+ ```bash
31
+ npx -p @loom-framework/core loom init <name> --description <desc> --adapter <filesystem|sqlite>
32
+ ```
33
+
34
+ ### 2. 编辑配置
35
+
36
+ 编辑 `loom.config.ts`,定义数据模型(`data.models`)和 AI 按钮(`aiButtons`),Schema 见下方。高级选项见 `references/data-model.md`。
37
+
38
+ ### 3. 生成页面 + 应用 Skill
39
+
40
+ ```bash
41
+ loom generate page <Name> --model <model-name>
42
+ ```
43
+
44
+ 此命令自动生成:CRUD 页面(含 AI 按钮)、App.tsx 路由接线、后端 API、应用 Skill。模型立即可通过 `loom data` CLI 和 AI 对话使用。
45
+
46
+ ### 4. 补充应用 Skill 描述(必须)
47
+
48
+ 首次生成后,必须补充 `.claude/skills/<项目名>/SKILL.md` 中以下三处 TODO,AI 对话才能正确理解项目业务语义:
49
+
50
+ 1. **frontmatter `description`**:写入用户在 AI 对话中会说的触发短语。格式参考:
51
+ ```
52
+ This skill should be used when the user asks to "创建XXX", "查看XXX", "删除XXX",
53
+ or any request about managing XXX in the <项目名> project.
54
+ ```
55
+ 2. **Overview 部分**:用 2-3 句话描述项目做什么、有哪些数据、用户如何与数据交互
56
+ 3. **Usage Scenarios 部分**:列出 5-10 个典型用户请求,格式为 `- "用户说的话" → 对应的 CLI 命令`
57
+
58
+ ### 5. 启动开发
59
+
60
+ ```bash
61
+ loom dev
62
+ ```
63
+
64
+ - 前端:http://localhost:5173
65
+ - 后端:http://localhost:3000
66
+
67
+ ### 迭代:修改配置 → 重新生成
68
+
69
+ 编辑 `loom.config.ts`(添加/修改模型或 AI 按钮)→ 重新执行步骤 3。
70
+
71
+ ### 可选:添加更多 Skill
72
+
73
+ `.claude/skills/` 下的所有 Skill 都会被 AI 自动发现。除了自动生成的应用 Skill,还可以添加新的:
74
+
75
+ - `loom generate skill <name>` — 创建脚手架,然后编辑 `.claude/skills/<name>/SKILL.md`
76
+ - 或直接复制一个已有的 Skill 目录到 `.claude/skills/` 下
77
+
78
+ ### CLI 命令速查
79
+
80
+ | 命令 | 说明 |
81
+ |------|------|
82
+ | `loom dev` | 启动开发环境(`--skip-generate` `--backend-only` `--frontend-only`) |
83
+ | `loom build` | 生产构建 |
84
+ | `loom generate page <name> --model <model>` | 生成 CRUD 页面 + 应用 Skill(含 aiButtons 则自动集成) |
85
+ | `loom generate dashboard <name>` | 从 dashboard.config.json 生成 Dashboard 数据概览页面 |
86
+ | `loom generate capabilities` | 仅重新生成应用 Skill 的 `references/models.md` |
87
+ | `loom generate skill <name>` | 生成自定义 Skill 脚手架 |
88
+
89
+ ## loom.config.ts Schema(核心)
90
+
91
+ ```typescript
92
+ import { defineConfig } from '@loom-framework/core';
93
+
94
+ export default defineConfig({
95
+ project: {
96
+ name: 'my-app', // 必填
97
+ description: '...',', // 可选
98
+ },
99
+ data: {
100
+ defaultAdapter: 'filesystem', // 'filesystem' | 'sqlite'
101
+ models: [{
102
+ name: 'items', // 将作为 React 组件名生成页面,字母开头,字母/数字/下划线
103
+ description: '...',', // 可选:显示在生成页面中
104
+ fields: [{
105
+ name: 'status', // 字母/下划线开头,字母数字下划线
106
+ type: 'string', // 'string' | 'number' | 'boolean' | 'date' | 'string[]' | 'number[]' | 'json'
107
+ required: true, // 可选,默认 false
108
+ description: '...,', // 可选:显示在表单中
109
+ default: 'active', // 可选:写入时自动填充
110
+ enum: ['active', 'inactive'], // 可选:限制可选值
111
+ }],
112
+ }],
113
+ },
114
+ aiButtons: [{ // 可选
115
+ id: 'summarize', // 必填:唯一标识
116
+ label: '总结', // 必填:按钮文本
117
+ prompt: '请总结以下内容', // 必填:支持 {{var}} 引用当前行字段值
118
+ },
119
+ {
120
+ id: 'analyze', // 带变量的示例
121
+ label: '分析',
122
+ prompt: '分析{{questionContent}},错误答案:{{wrongAnswer}}',
123
+ placement: 'wrong_questions', // 可选:限制按钮只出现在指定模型页面,逗号分隔多个模型名;省略则出现在所有页面
124
+ }],
125
+ });
126
+ ```
127
+
128
+ 高级配置(`ai.claudeCode`、`server`、按模型 `adapters`、`indexes`)见 `references/data-model.md`。
129
+
130
+ ### 可选:生成 Dashboard(数据概览页面)
131
+
132
+ Dashboard 采用**两阶段**工作流:AI 生成 `dashboard.config.json` → 用户审查后执行 `loom generate dashboard <name>` 生成页面。
133
+
134
+ ```bash
135
+ # 阶段 1:AI 生成配置(详见 references/dashboard.md)
136
+ # 阶段 2:
137
+ loom generate dashboard <name>
138
+ ```
139
+
140
+ 详细的配置 Schema、图表类型说明和示例见 **references/dashboard.md**。
141
+
142
+ ## API 路由格式
143
+
144
+ 后端 REST API 路径为 `/api/v1/data/<model-name>`,支持:`GET`(列表)、`GET /:id`(单条)、`POST`(创建)、`PUT /:id`(更新)、`DELETE /:id`(删除)。
145
+ AI 相关:`POST /api/v1/chat`(SSE 流式对话)、`GET /api/v1/sessions`(会话列表)。
146
+ 前端通过 `useData('<model-name>')` 自动访问,无需手动拼接。
147
+
148
+ **注意:** `sqlite` 适配器在 Node.js ≥ 25 时可能因 `better-sqlite3` 原生模块未编译而报错,改用 `filesystem` 即可。
149
+
150
+ ## 常见问题
151
+
152
+ - **better-sqlite3 加载失败**:Node.js 版本缺少预编译包。修复:(1) `cd node_modules/better-sqlite3 && npx node-gyp rebuild`,或 (2) 将 `defaultAdapter` 改为 `'filesystem'`
153
+ - **`loom` 命令报错 "No loom.config.ts found"**:在项目目录下运行命令
@@ -0,0 +1,128 @@
1
+ # Loom - AI-Native Full-Stack Framework
2
+
3
+ 编织 AI 能力为应用织物
4
+
5
+ ## 快速上手
6
+
7
+ ### 1. 安装 npm 包
8
+
9
+ Loom 包含两个包:
10
+
11
+ - `@loom-framework/core` — CLI + 后端(全局安装以使用 `loom` 命令)
12
+ - `@loom-framework/frontend-antd` — 前端组件库(项目运行时依赖,`loom init` 自动添加)
13
+
14
+ ```bash
15
+ npm install -g @loom-framework/core
16
+ ```
17
+
18
+ ### 2. 配置 Skill 到 Claude Code
19
+
20
+ Loom Skill 随 npm 包发布,位于 `templates/loom-skill/` 目录。复制到 Claude Code 的 skill 目录:
21
+
22
+ ```bash
23
+ # 从全局安装复制
24
+ cp -r $(npm root -g)/@loom-framework/core/templates/loom-skill ~/.claude/skills/loom
25
+
26
+ # 或从项目内复制
27
+ cp -r node_modules/@loom-framework/core/templates/loom-skill ~/.claude/skills/loom
28
+ ```
29
+
30
+ ### 3. 打开 Claude Code
31
+
32
+ 启动 Claude Code,Skill 会被自动加载。
33
+
34
+ ### 4. 开始使用
35
+
36
+ 在 Claude Code 中输入以下内容触发 Loom Skill:
37
+
38
+ ### 开始开发
39
+
40
+ 在 Claude Code 中输入以下内容即可触发 Loom Skill:
41
+
42
+ - "用 loom 开发一个 AI 平台"
43
+ - "创建一个 loom 项目"
44
+ - "为系统添加页面"
45
+ - "配置 AI 按钮"
46
+
47
+ 示例对话:
48
+
49
+ ```
50
+ 用户: 用 loom 开发一个笔记管理系统,用 sqlite 存储,
51
+ 需要 AI 总结和翻译功能
52
+ Claude: [读取 SKILL.md] → 运行 loom init → 编辑 config →
53
+ loom generate page → loom dev
54
+ ```
55
+
56
+ ### 开发流程
57
+
58
+ 1. **创建项目**:`npx -p @loom-framework/core loom init <name> --description <desc> --adapter <adapter>`
59
+ 2. **编辑配置**:在 `loom.config.ts` 中定义数据模型和 AI 按钮
60
+ 3. **生成页面**:`loom generate page <Name> --model <model>`
61
+ 4. **启动开发**:`loom dev` → http://localhost:5173
62
+
63
+ ## 核心理念
64
+
65
+ - **Prompt as Code**: 业务逻辑写在 Skill 的 Markdown 中,而非后端代码
66
+ - **Schema-driven**: 一个数据实体定义 → Skill + CLI 命令 + REST API(自动同步)
67
+ - **Zero Backend Logic**: 后端是透明代理,所有智能在 Skill 中
68
+
69
+ ## 三种交互类型
70
+
71
+ | 类型 | 说明 | 用户入口 | 自动化程度 |
72
+ |------|------|---------|-----------|
73
+ | AI Chat | 自然语言对话 | AppShell 右下角浮动按钮 | 开箱即用,无需配置 |
74
+ | AI Buttons | 一键 AI 动作 | CRUD 页面操作列的 AI 下拉菜单 | 配置 aiButtons + generate page,自动集成 |
75
+ | CRUD | 结构化数据管理 | 导航菜单页面 | 配置 model + generate page,自动生成 |
76
+
77
+ ## 组件架构
78
+
79
+ ```
80
+ AppShell
81
+ ├── Layout (Sider + Content)
82
+ └── AIBubble → ChatDrawer → ChatPanel
83
+ ├── LoomChatProvider + useXChat
84
+ ├── MessageContent (thinking / content / tool_call)
85
+ └── Sender (输入框 + 文件上传)
86
+
87
+ AIActionButton → AIContext.triggerAI() → ChatDrawer 自动提交
88
+ useData → 监听 loom:data-changed 事件自动刷新
89
+ ```
90
+
91
+ ### AI 按钮工作流
92
+
93
+ 1. 点击 AI 按钮 → `AIContext.triggerAI({ query, buttonId, context })`
94
+ 2. ChatDrawer 打开并自动提交 prompt
95
+ 3. AI 可能通过工具调用进行 CRUD 操作
96
+ 4. done 事件触发 `loom:data-changed` → useData 自动 refresh
97
+
98
+ ### 前端组件导出
99
+
100
+ | 组件/Hook | 说明 |
101
+ |-----------|------|
102
+ | `AppShell` | 应用布局框架,内含 AIBubble |
103
+ | `ChatDrawer` | AI 对话抽屉(多会话、流式、thinking/tool_call) |
104
+ | `AIBubble` | AI 浮动按钮(imperativeHandle: openWithQuery) |
105
+ | `AIActionButton` | AI 动作按钮(通过 AIContext 触发 ChatDrawer) |
106
+ | `AIContext` | AI 上下文(AppShell 提供 triggerAI) |
107
+ | `useData` | 数据 CRUD hook(自动响应 loom:data-changed 事件) |
108
+
109
+ ## 项目结构
110
+
111
+ ```
112
+ my-loom-app/
113
+ ├── loom.config.ts # 配置源
114
+ ├── frontend/src/components/pages/ # 业务页面
115
+ ├── backend/src/ # Fastify + AI 通信
116
+ ├── .claude/skills/ # Skills
117
+ ├── cli/src/commands/ # CLI 命令扩展
118
+ ├── data/ # 数据存储
119
+ └── .loom/ # 自动生成(gitignore)
120
+ └── sessions/ # AI 会话持久化
121
+ ```
122
+
123
+ ## 两个包
124
+
125
+ | 包 | 说明 |
126
+ |---|---|
127
+ | `@loom-framework/core` | DataAdapter、LoomServer、CLI(loom / loom-server) |
128
+ | `@loom-framework/frontend-antd` | 前端组件库:AppShell、ChatDrawer、AIActionButton、useData、AIContext |
@@ -0,0 +1,161 @@
1
+ # 生成 Dashboard(数据概览页面)
2
+
3
+ Dashboard 采用**两阶段**工作流:AI 设计配置 → 代码生成页面。
4
+
5
+ ## 阶段 1:生成 dashboard.config.json
6
+
7
+ 根据项目的 `loom.config.ts` 中的数据模型,站在用户角度设计 Dashboard,生成 `dashboard.config.json` 到项目根目录。
8
+
9
+ **设计原则:**
10
+ - 统计卡片放第一行(一眼看到关键数字)
11
+ - 分布图表按业务重要性排列
12
+ - 趋势图放最后一行(需要更多空间)
13
+ - 每行不超过 4 个元素
14
+ - 标题用业务语言,不用字段名
15
+
16
+ ### 配置 Schema
17
+
18
+ ```jsonc
19
+ {
20
+ "name": "overview", // 必填:Dashboard 标识(同模型命名规则)
21
+ "description": "数据概览", // 可选:侧边栏展示名
22
+ "models": ["model_a", "model_b"], // 必填:关联的数据模型名列表
23
+ "layout": [ // 必填:布局定义,数组每项代表一行
24
+ {
25
+ "row": [ // 每行包含一组 widget
26
+ {
27
+ "type": "stat", // 图表类型,见下方图表类型表
28
+ "title": "总数", // 业务语言标题
29
+ "model": "model_a", // 数据模型名
30
+ "span": 6, // 可选:Col 宽度(1-24),省略则自动均分
31
+ "aggregate": "count", // 可选:count|sum|avg|min|max(默认 count)
32
+ "field": "score", // aggregate 非 count 时必填:数值字段名
33
+ "filter": { "status": "active" }, // 可选:聚合前筛选条件
34
+ "groupBy": "category", // 可选:分组字段
35
+ "interval": "month" // 可选:date 字段分组粒度 day|week|month(默认 month)
36
+ }
37
+ ]
38
+ }
39
+ ]
40
+ }
41
+ ```
42
+
43
+ ### 图表类型与数据需求
44
+
45
+ #### 数值类
46
+
47
+ | type | 需要 groupBy | 需要 field | 需要 interval | 生成效果 |
48
+ |------|-------------|-----------|--------------|---------|
49
+ | `stat` | 否 | aggregate=avg/sum 时需要 | 否 | Ant Design Statistic 数值卡片 |
50
+ | `gauge` | 否 | 是(0-1 之间的进度值) | 否 | G2 仪表盘(进度/达标率) |
51
+ | `liquid` | 否 | 是(0-1 之间的进度值) | 否 | G2 水波图(百分比/进度) |
52
+
53
+ #### 占比类
54
+
55
+ | type | 需要 groupBy | 需要 field | 需要 interval | 生成效果 |
56
+ |------|-------------|-----------|--------------|---------|
57
+ | `pie` | 是(enum/string 字段) | 否 | 否 | G2 饼图(分布占比) |
58
+ | `ring` | 是(boolean/enum 字段) | 否 | 否 | G2 环形图(占比对比) |
59
+ | `treemap` | 是(多层级字段) | 否 | 否 | G2 矩形树图(层级占比) |
60
+
61
+ #### 对比类
62
+
63
+ | type | 需要 groupBy | 需要 field | 需要 interval | 生成效果 |
64
+ |------|-------------|-----------|--------------|---------|
65
+ | `bar` | 是 | 否 | 否 | G2 条形图(横向分类对比) |
66
+ | `stacked_bar` | 是 | 否 | 否 | G2 堆叠条形图(组成+对比) |
67
+ | `grouped_bar` | 是 | 否 | 否 | G2 分组条形图(并列对比) |
68
+ | `radar` | 是 | 否 | 否 | G2 雷达图(多维度对比) |
69
+ | `funnel` | 是 | 否 | 否 | G2 漏斗图(阶段转化) |
70
+
71
+ #### 趋势类
72
+
73
+ | type | 需要 groupBy | 需要 field | 需要 interval | 生成效果 |
74
+ |------|-------------|-----------|--------------|---------|
75
+ | `line` | 是(推荐 date 字段) | 否 | 是 | G2 折线图(时间趋势) |
76
+ | `area` | 是(推荐 date 字段) | 否 | 是 | G2 面积图(累计趋势) |
77
+
78
+ #### 分布类
79
+
80
+ | type | 需要 groupBy | 需要 field | 需要 interval | 生成效果 |
81
+ |------|-------------|-----------|--------------|---------|
82
+ | `scatter` | 是 | 否 | 否 | G2 散点图(相关性/分布) |
83
+ | `heatmap` | 是 | 是(数值) | 否 | G2 热力图(密度/交叉分析) |
84
+
85
+ ## 阶段 2:执行 generate dashboard
86
+
87
+ 用户审查 `dashboard.config.json` 后,运行命令生成页面:
88
+
89
+ ```bash
90
+ loom generate dashboard <name>
91
+ ```
92
+
93
+ 此命令会:
94
+ 1. 读取并校验 `dashboard.config.json`
95
+ 2. 验证引用的模型是否存在于 `loom.config.ts`
96
+ 3. 生成 Dashboard TSX 页面(含 `useData` + `useChartData` + `DashboardChart`)
97
+ 4. 自动接线 App.tsx(添加 import、navItem、switch case)
98
+ 5. 检测 `@antv/g2` 是否已安装,未安装则提示
99
+
100
+ **前置依赖:** Dashboard 使用 @antv/g2 渲染图表,需在 frontend 目录安装:
101
+
102
+ ```bash
103
+ cd frontend && pnpm add @antv/g2
104
+ ```
105
+
106
+ ## 完整配置示例
107
+
108
+ 以小学生错题管理平台为例:
109
+
110
+ ```json
111
+ {
112
+ "name": "overview",
113
+ "description": "错题数据概览",
114
+ "models": ["wrong_questions", "review_plans"],
115
+ "layout": [
116
+ {
117
+ "row": [
118
+ { "type": "stat", "title": "错题总数", "model": "wrong_questions", "aggregate": "count" },
119
+ { "type": "stat", "title": "已掌握", "model": "wrong_questions", "aggregate": "count", "filter": { "isMastered": true } },
120
+ { "type": "stat", "title": "待攻克", "model": "wrong_questions", "aggregate": "count", "filter": { "isMastered": false } },
121
+ { "type": "gauge", "title": "掌握率", "model": "wrong_questions", "aggregate": "count", "field": "reviewCount" }
122
+ ]
123
+ },
124
+ {
125
+ "row": [
126
+ { "type": "pie", "title": "科目分布", "model": "wrong_questions", "groupBy": "subject", "span": 8 },
127
+ { "type": "bar", "title": "错误类型分布", "model": "wrong_questions", "groupBy": "errorType", "span": 8 },
128
+ { "type": "ring", "title": "难度分布", "model": "wrong_questions", "groupBy": "difficulty", "span": 8 }
129
+ ]
130
+ },
131
+ {
132
+ "row": [
133
+ { "type": "radar", "title": "各科目掌握概览", "model": "wrong_questions", "groupBy": "subject", "span": 8 },
134
+ { "type": "line", "title": "错题录入趋势", "model": "wrong_questions", "groupBy": "createdAt", "interval": "month", "span": 16 }
135
+ ]
136
+ }
137
+ ]
138
+ }
139
+ ```
140
+
141
+ ## 追加自定义图表
142
+
143
+ 生成后的 Dashboard 页面是普通 TSX,可直接编辑追加图表:
144
+
145
+ 1. 使用 `useChartData` 准备数据(或自定义聚合逻辑)
146
+ 2. 使用 `/antv-g2-chart` skill 生成 G2 v5 Spec 代码
147
+ 3. 添加 `<DashboardChart spec={...} />` 组件
148
+
149
+ 示例——追加一个科目×年级的堆叠柱状图:
150
+
151
+ ```tsx
152
+ // 在已有的 Dashboard 页面中追加
153
+ const subjectGradeData = useChartData(wrongQuestionsList, { groupBy: 'subject' });
154
+
155
+ <DashboardChart spec={{
156
+ type: 'interval',
157
+ data: subjectGradeData,
158
+ encode: { x: 'name', y: 'value', color: 'name' },
159
+ transform: [{ type: 'stackY' }],
160
+ }} />
161
+ ```
@@ -0,0 +1,78 @@
1
+ # Data Model Reference
2
+
3
+ Advanced configuration for `loom.config.ts`. Full type definitions from `packages/core/src/types.ts`.
4
+
5
+ ## FieldDefinition
6
+
7
+ ```typescript
8
+ {
9
+ name: 'status', // ^[a-zA-Z_][a-zA-Z0-9_]*$
10
+ type: 'string', // 'string' | 'number' | 'boolean' | 'date' | 'string[]' | 'number[]' | 'json'
11
+ required: true, // optional, default false
12
+ description: '...', // optional: shown in generated forms
13
+ default: 'active', // optional: auto-filled on write if not provided
14
+ enum: ['active', 'inactive', 'archived'], // optional: restrict string field to allowed values
15
+ }
16
+ ```
17
+
18
+ ## ModelSchema
19
+
20
+ ```typescript
21
+ {
22
+ name: 'orders', // ^[a-zA-Z][a-zA-Z0-9_]*$, will be used as React component name
23
+ description: 'Order records', // optional: shown in generated page heading
24
+ fields: [...],
25
+ indexes?: [{ fields: ['userId', 'status'], unique: false }],
26
+ adapters?: { // optional: per-model adapter override
27
+ filesystem: { dir: 'orders', format: 'json' | 'yaml', datePattern: 'YYYY-MM' },
28
+ sqlite: { table: 'orders' },
29
+ },
30
+ }
31
+ ```
32
+
33
+ ## AIButtonConfig
34
+
35
+ ```typescript
36
+ aiButtons: [{
37
+ id: 'summarize', // required: unique identifier
38
+ label: '总结', // required: button text
39
+ icon: 'FileTextOutlined', // optional: Ant Design icon component name
40
+ prompt: '请总结以下内容', // required: supports {{var}} placeholders, replaced with current row field values
41
+ placement: 'wrong_questions', // optional: limit to specific model pages, comma-separated; omit for all pages
42
+ }]
43
+ ```
44
+
45
+ ## AIConfig
46
+
47
+ ```typescript
48
+ ai: {
49
+ engine: 'claude-code', // default 'claude-code'
50
+ claudeCode: {
51
+ path: '/usr/local/bin/claude', // optional: custom claude binary path
52
+ pluginRoot: '.claude', // optional: plugin root directory
53
+ timeout: 120000, // optional: command timeout in ms
54
+ skipPermissions: false, // optional: skip permission prompts
55
+ },
56
+ }
57
+ ```
58
+
59
+ ## ServerConfig
60
+
61
+ ```typescript
62
+ server: {
63
+ port: 3000, // default 3000
64
+ host: '0.0.0.0',
65
+ cors: true, // default true
66
+ staticDir: './dist/frontend',
67
+ }
68
+ ```
69
+
70
+ ## DataConfig
71
+
72
+ ```typescript
73
+ data: {
74
+ defaultAdapter: 'filesystem' | 'sqlite',
75
+ models: [...],
76
+ sqlite: { filename: 'data.db' }, // optional, default 'loom.db'
77
+ }
78
+ ```