@loom-framework/core 0.1.0-alpha.5 → 0.1.0-alpha.51
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/dist/adapter-base.d.ts +29 -0
- package/dist/adapter-base.d.ts.map +1 -0
- package/dist/adapter-base.js +62 -0
- package/dist/adapter-base.js.map +1 -0
- package/dist/adapter-factory.d.ts +8 -0
- package/dist/adapter-factory.d.ts.map +1 -0
- package/dist/adapter-factory.js +25 -0
- package/dist/adapter-factory.js.map +1 -0
- package/dist/adapter-filesystem.d.ts +6 -11
- package/dist/adapter-filesystem.d.ts.map +1 -1
- package/dist/adapter-filesystem.js +17 -38
- package/dist/adapter-filesystem.js.map +1 -1
- package/dist/adapter-sqlite.d.ts +6 -23
- package/dist/adapter-sqlite.d.ts.map +1 -1
- package/dist/adapter-sqlite.js +45 -50
- package/dist/adapter-sqlite.js.map +1 -1
- package/dist/backend/ai/button-resolver.d.ts +18 -0
- package/dist/backend/ai/button-resolver.d.ts.map +1 -0
- package/dist/backend/ai/button-resolver.js +58 -0
- package/dist/backend/ai/button-resolver.js.map +1 -0
- package/dist/backend/ai/engine.d.ts +51 -0
- package/dist/backend/ai/engine.d.ts.map +1 -0
- package/dist/backend/ai/engine.js +188 -0
- package/dist/backend/ai/engine.js.map +1 -0
- package/dist/backend/ai/index.d.ts +11 -0
- package/dist/backend/ai/index.d.ts.map +1 -0
- package/dist/backend/ai/index.js +8 -0
- package/dist/backend/ai/index.js.map +1 -0
- package/dist/backend/ai/output-parser.d.ts +29 -0
- package/dist/backend/ai/output-parser.d.ts.map +1 -0
- package/dist/backend/ai/output-parser.js +247 -0
- package/dist/backend/ai/output-parser.js.map +1 -0
- package/dist/backend/ai/session-manager.d.ts +103 -0
- package/dist/backend/ai/session-manager.d.ts.map +1 -0
- package/dist/backend/ai/session-manager.js +298 -0
- package/dist/backend/ai/session-manager.js.map +1 -0
- package/dist/backend/index.d.ts +61 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +160 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/observe/index.d.ts +6 -0
- package/dist/backend/observe/index.d.ts.map +1 -0
- package/dist/backend/observe/index.js +5 -0
- package/dist/backend/observe/index.js.map +1 -0
- package/dist/backend/observe/logger.d.ts +28 -0
- package/dist/backend/observe/logger.d.ts.map +1 -0
- package/dist/backend/observe/logger.js +80 -0
- package/dist/backend/observe/logger.js.map +1 -0
- package/dist/backend/observe/types.d.ts +26 -0
- package/dist/backend/observe/types.d.ts.map +1 -0
- package/dist/backend/observe/types.js +7 -0
- package/dist/backend/observe/types.js.map +1 -0
- package/dist/backend/routes/chat.d.ts +31 -0
- package/dist/backend/routes/chat.d.ts.map +1 -0
- package/dist/backend/routes/chat.js +426 -0
- package/dist/backend/routes/chat.js.map +1 -0
- package/dist/backend/routes/data.d.ts +13 -0
- package/dist/backend/routes/data.d.ts.map +1 -0
- package/dist/backend/routes/data.js +129 -0
- package/dist/backend/routes/data.js.map +1 -0
- package/dist/backend/routes/health.d.ts +7 -0
- package/dist/backend/routes/health.d.ts.map +1 -0
- package/dist/backend/routes/health.js +15 -0
- package/dist/backend/routes/health.js.map +1 -0
- package/dist/backend/routes/index.d.ts +9 -0
- package/dist/backend/routes/index.d.ts.map +1 -0
- package/dist/backend/routes/index.js +8 -0
- package/dist/backend/routes/index.js.map +1 -0
- package/dist/backend/routes/upload.d.ts +24 -0
- package/dist/backend/routes/upload.d.ts.map +1 -0
- package/dist/backend/routes/upload.js +67 -0
- package/dist/backend/routes/upload.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +12 -0
- package/dist/bin.js.map +1 -0
- package/dist/capability-generator.d.ts.map +1 -1
- package/dist/capability-generator.js +4 -8
- package/dist/capability-generator.js.map +1 -1
- package/dist/cli/commands/build.d.ts +11 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +170 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/data.d.ts +11 -0
- package/dist/cli/commands/data.d.ts.map +1 -0
- package/dist/cli/commands/data.js +137 -0
- package/dist/cli/commands/data.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +9 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +114 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate-capabilities.d.ts +8 -0
- package/dist/cli/commands/generate-capabilities.d.ts.map +1 -0
- package/dist/cli/commands/generate-capabilities.js +40 -0
- package/dist/cli/commands/generate-capabilities.js.map +1 -0
- package/dist/cli/commands/generate-cli-command.d.ts +8 -0
- package/dist/cli/commands/generate-cli-command.d.ts.map +1 -0
- package/dist/cli/commands/generate-cli-command.js +64 -0
- package/dist/cli/commands/generate-cli-command.js.map +1 -0
- package/dist/cli/commands/generate-page.d.ts +9 -0
- package/dist/cli/commands/generate-page.d.ts.map +1 -0
- package/dist/cli/commands/generate-page.js +419 -0
- package/dist/cli/commands/generate-page.js.map +1 -0
- package/dist/cli/commands/generate-skill.d.ts +8 -0
- package/dist/cli/commands/generate-skill.d.ts.map +1 -0
- package/dist/cli/commands/generate-skill.js +75 -0
- package/dist/cli/commands/generate-skill.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +6 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +17 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +539 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/observe.d.ts +9 -0
- package/dist/cli/commands/observe.d.ts.map +1 -0
- package/dist/cli/commands/observe.js +142 -0
- package/dist/cli/commands/observe.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +9 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +186 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/helpers/duration.d.ts +5 -0
- package/dist/cli/helpers/duration.d.ts.map +1 -0
- package/dist/cli/helpers/duration.js +19 -0
- package/dist/cli/helpers/duration.js.map +1 -0
- package/dist/cli/helpers/field-template.d.ts +9 -0
- package/dist/cli/helpers/field-template.d.ts.map +1 -0
- package/dist/cli/helpers/field-template.js +92 -0
- package/dist/cli/helpers/field-template.js.map +1 -0
- package/dist/cli/helpers/naming.d.ts +12 -0
- package/dist/cli/helpers/naming.d.ts.map +1 -0
- package/dist/cli/helpers/naming.js +25 -0
- package/dist/cli/helpers/naming.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils.d.ts +10 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +31 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/config.d.ts +8 -33
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -7
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/server-bin.d.ts +12 -0
- package/dist/server-bin.d.ts.map +1 -0
- package/dist/server-bin.js +75 -0
- package/dist/server-bin.js.map +1 -0
- package/dist/types.d.ts +28 -18
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -4
- package/templates/skill/SKILL.md +119 -0
- package/templates/skill/references/README.md +129 -0
- package/templates/skill/references/data-model.md +101 -0
- package/templates/skill/references/skill-development.md +46 -0
- package/templates/skill/references/troubleshooting.md +42 -0
|
@@ -0,0 +1,129 @@
|
|
|
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/skill/` 目录。复制到 Claude Code 的 skill 目录:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# 从全局安装复制
|
|
24
|
+
cp -r $(npm root -g)/@loom-framework/core/templates/skill ~/.claude/skills/loom
|
|
25
|
+
|
|
26
|
+
# 或从项目内复制
|
|
27
|
+
cp -r node_modules/@loom-framework/core/templates/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**: 一个模型定义 → MCP Tool + 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
|
+
├── mcp-server/ # MCP Server
|
|
121
|
+
└── mcp.json # MCP 配置
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 两个包
|
|
125
|
+
|
|
126
|
+
| 包 | 说明 |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `@loom-framework/core` | DataAdapter、LoomServer、CLI(loom / loom-server) |
|
|
129
|
+
| `@loom-framework/frontend-antd` | 前端组件库:AppShell、ChatDrawer、AIActionButton、useData、AIContext |
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Data Model Reference
|
|
2
|
+
|
|
3
|
+
Advanced configuration for `loom.config.ts` data models. Load this when defining complex models.
|
|
4
|
+
|
|
5
|
+
## Full Field Options
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
{
|
|
9
|
+
name: 'status', // must match ^[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 to allowed values
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Model-Level Options
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
{
|
|
22
|
+
name: 'orders',
|
|
23
|
+
description: 'Order records', // shown in generated page heading
|
|
24
|
+
fields: [...],
|
|
25
|
+
indexes: [ // optional: database indexes
|
|
26
|
+
{ fields: ['userId', 'status'], unique: false },
|
|
27
|
+
],
|
|
28
|
+
adapters: { // optional: per-model adapter override
|
|
29
|
+
filesystem: { dir: 'orders', format: 'json' | 'yaml', datePattern: 'yyyy-MM-dd' },
|
|
30
|
+
sqlite: { table: 'orders' },
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## AI Configuration
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
ai: {
|
|
39
|
+
engine: 'claude-code', // default 'claude-code'
|
|
40
|
+
claudeCode: {
|
|
41
|
+
path: '/usr/local/bin/claude', // custom claude binary path
|
|
42
|
+
pluginRoot: '.claude', // plugin root directory
|
|
43
|
+
timeout: 120000, // command timeout in ms
|
|
44
|
+
skipPermissions: false, // skip permission prompts
|
|
45
|
+
defaultModel: 'claude-sonnet-4-6',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Server Configuration
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
server: {
|
|
54
|
+
port: 3000, // default 3000
|
|
55
|
+
host: '0.0.0.0',
|
|
56
|
+
cors: true, // default true
|
|
57
|
+
staticDir: './dist/frontend',
|
|
58
|
+
},
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## SQLite Configuration
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
data: {
|
|
65
|
+
defaultAdapter: 'sqlite',
|
|
66
|
+
sqlite: { filename: 'data.db' }, // default 'loom.db'
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## AI Buttons (Full Options)
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
aiButtons: [{
|
|
74
|
+
id: 'summarize', // required: unique identifier
|
|
75
|
+
label: '总结', // required: button text
|
|
76
|
+
icon: 'FileTextOutlined', // optional: Ant Design icon name
|
|
77
|
+
prompt: '请总结以下内容', // required: prompt text, supports {{var}} placeholders
|
|
78
|
+
// {{var}} is replaced with the current row's field value at runtime
|
|
79
|
+
placement: 'page-header', // optional: UI placement hint
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'analyze', // example with template variables
|
|
83
|
+
label: '分析',
|
|
84
|
+
prompt: '分析{{questionContent}},错误答案:{{wrongAnswer}}',
|
|
85
|
+
}],
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### AI Button Behavior
|
|
89
|
+
|
|
90
|
+
When configured, AI buttons are automatically integrated into CRUD page action columns:
|
|
91
|
+
|
|
92
|
+
1. Each table row shows an "AI" dropdown button with all configured buttons as menu items
|
|
93
|
+
2. Clicking a button opens the ChatDrawer and sends `buttonId` + row `context` to the server
|
|
94
|
+
3. Server resolves `prompt` with `{{fieldName}}` replaced by the current row's field values
|
|
95
|
+
4. Context fields not referenced in the template are automatically appended to the prompt
|
|
96
|
+
5. If AI performs CRUD via tool calls, the page auto-refreshes (via `loom:data-changed` event)
|
|
97
|
+
|
|
98
|
+
## Data Access in Skills
|
|
99
|
+
|
|
100
|
+
- **Prefer MCP Tools** for data CRUD: `read_<model>`, `write_<model>`, `update_<model>`, `delete_<model>`
|
|
101
|
+
- Use `loom data read/write <model>` CLI only for debugging
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Skill Development Reference
|
|
2
|
+
|
|
3
|
+
Guide for creating and managing Loom Skills. Load this when adding or editing `.claude/skills/`.
|
|
4
|
+
|
|
5
|
+
## Skill Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
.claude/skills/<skill-name>/
|
|
9
|
+
├── SKILL.md # Required: trigger conditions + workflow
|
|
10
|
+
└── references/ # Optional: detailed rules and reference docs
|
|
11
|
+
└── *.md
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## SKILL.md Format
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
---
|
|
18
|
+
name: <skill-name>
|
|
19
|
+
description: |
|
|
20
|
+
This skill should be used when the user asks to "<trigger phrases>".
|
|
21
|
+
Include both English and Chinese trigger phrases.
|
|
22
|
+
version: 1.0.0
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# <Skill Name>
|
|
26
|
+
|
|
27
|
+
<Description of what this skill does>
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
1. <Step 1>
|
|
32
|
+
2. <Step 2>
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- <Rule 1>
|
|
37
|
+
- <Rule 2>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Best Practices
|
|
41
|
+
|
|
42
|
+
- Keep SKILL.md focused on one capability domain
|
|
43
|
+
- Use `references/` for detailed rules that would clutter the main SKILL.md
|
|
44
|
+
- Specify which MCP Tools (`read_<model>`, `write_<model>`) the skill should use
|
|
45
|
+
- Skills define behavior through prompts, not code generation
|
|
46
|
+
- Run `loom skill validate [name]` to check SKILL.md structure
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Troubleshooting Guide
|
|
2
|
+
|
|
3
|
+
Common issues when creating and running Loom projects.
|
|
4
|
+
|
|
5
|
+
## `loom generate` Fails: Cannot find module '@loom-framework/core'
|
|
6
|
+
|
|
7
|
+
Dependencies not installed. Run `npm install` from the project directory.
|
|
8
|
+
|
|
9
|
+
## `npx @loom-framework/core loom init` Fails
|
|
10
|
+
|
|
11
|
+
The `npx` command cannot find the executable. Use the `-p` flag to specify the package:
|
|
12
|
+
```bash
|
|
13
|
+
npx -p @loom-framework/core loom init <name> --description <desc> --adapter <adapter>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## `loom dev` Port Already in Use (EADDRINUSE)
|
|
17
|
+
|
|
18
|
+
Previous process still running. Kill it: `lsof -ti:3000 | xargs kill -9`
|
|
19
|
+
|
|
20
|
+
## Commands Fail: "No loom.config.ts found"
|
|
21
|
+
|
|
22
|
+
Running from the wrong directory. `cd` into the project directory before running `loom` commands.
|
|
23
|
+
|
|
24
|
+
## Model Name Validation Error
|
|
25
|
+
|
|
26
|
+
Model names must match `^[a-z][a-z0-9_-]*$` (lowercase, hyphens/underscores allowed).
|
|
27
|
+
Field names must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.
|
|
28
|
+
|
|
29
|
+
## `loom build` Backend TSC Fails: Cannot use JSX
|
|
30
|
+
|
|
31
|
+
Root `tsconfig.json` includes `frontend/` with `.tsx` files.
|
|
32
|
+
Add `"frontend"` to `exclude` in root `tsconfig.json`:
|
|
33
|
+
```json
|
|
34
|
+
{ "exclude": ["node_modules", "dist", "frontend"] }
|
|
35
|
+
```
|
|
36
|
+
Frontend has its own `frontend/tsconfig.json` with `jsx: "react-jsx"`.
|
|
37
|
+
|
|
38
|
+
## Debug Tips
|
|
39
|
+
|
|
40
|
+
- `loom data schema <model>` — inspect model fields
|
|
41
|
+
- `loom observe logs` — view AI interaction logs
|
|
42
|
+
- `loom skill validate` — check skill structure
|