@leeoohoo/ui-apps-devkit 0.1.2 → 0.1.3
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 +61 -62
- package/bin/chatos-uiapp.js +3 -4
- package/package.json +23 -23
- package/src/cli.js +53 -53
- package/src/commands/dev.js +14 -14
- package/src/commands/init.js +129 -129
- package/src/commands/install.js +45 -45
- package/src/commands/pack.js +72 -72
- package/src/commands/validate.js +90 -138
- package/src/lib/args.js +49 -49
- package/src/lib/config.js +29 -29
- package/src/lib/fs.js +78 -78
- package/src/lib/path-boundary.js +16 -16
- package/src/lib/plugin.js +45 -45
- package/src/lib/template.js +172 -172
- package/src/sandbox/server.js +1204 -1028
- package/templates/basic/README.md +63 -65
- package/templates/basic/chatos.config.json +5 -5
- package/templates/basic/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +209 -211
- package/templates/basic/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +73 -73
- package/templates/basic/docs/CHATOS_UI_APPS_HOST_API.md +136 -136
- package/templates/basic/docs/CHATOS_UI_APPS_OVERVIEW.md +106 -106
- package/templates/basic/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +239 -239
- package/templates/basic/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -95
- package/templates/basic/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +40 -40
- package/templates/basic/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
- package/templates/basic/plugin/apps/app/compact.mjs +41 -41
- package/templates/basic/plugin/apps/app/index.mjs +287 -287
- package/templates/basic/plugin/apps/app/mcp-prompt.en.md +7 -7
- package/templates/basic/plugin/apps/app/mcp-prompt.zh.md +7 -7
- package/templates/basic/plugin/apps/app/mcp-server.mjs +15 -15
- package/templates/basic/plugin/backend/index.mjs +37 -37
- package/templates/basic/template.json +7 -7
- package/templates/notepad/README.md +38 -44
- package/templates/notepad/chatos.config.json +4 -4
- package/templates/notepad/docs/CHATOS_UI_APPS_AI_CONTRIBUTIONS.md +209 -211
- package/templates/notepad/docs/CHATOS_UI_APPS_BACKEND_PROTOCOL.md +73 -73
- package/templates/notepad/docs/CHATOS_UI_APPS_HOST_API.md +136 -136
- package/templates/notepad/docs/CHATOS_UI_APPS_OVERVIEW.md +106 -106
- package/templates/notepad/docs/CHATOS_UI_APPS_PLUGIN_MANIFEST.md +239 -239
- package/templates/notepad/docs/CHATOS_UI_APPS_STYLE_GUIDE.md +95 -95
- package/templates/notepad/docs/CHATOS_UI_APPS_TROUBLESHOOTING.md +40 -40
- package/templates/notepad/docs/CHATOS_UI_PROMPTS_PROTOCOL.md +392 -392
- package/templates/notepad/plugin/apps/app/api.mjs +30 -30
- package/templates/notepad/plugin/apps/app/compact.mjs +41 -41
- package/templates/notepad/plugin/apps/app/dom.mjs +14 -14
- package/templates/notepad/plugin/apps/app/ds-tree.mjs +35 -35
- package/templates/notepad/plugin/apps/app/index.mjs +1056 -1056
- package/templates/notepad/plugin/apps/app/layers.mjs +338 -338
- package/templates/notepad/plugin/apps/app/markdown.mjs +120 -120
- package/templates/notepad/plugin/apps/app/mcp-prompt.en.md +22 -22
- package/templates/notepad/plugin/apps/app/mcp-prompt.zh.md +22 -22
- package/templates/notepad/plugin/apps/app/mcp-server.mjs +199 -199
- package/templates/notepad/plugin/apps/app/styles.mjs +355 -355
- package/templates/notepad/plugin/apps/app/tags.mjs +21 -21
- package/templates/notepad/plugin/apps/app/ui.mjs +280 -280
- package/templates/notepad/plugin/backend/index.mjs +99 -99
- package/templates/notepad/plugin/plugin.json +23 -23
- package/templates/notepad/plugin/shared/notepad-paths.mjs +39 -39
- package/templates/notepad/plugin/shared/notepad-store.mjs +765 -765
- package/templates/notepad/template.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
# __PLUGIN_NAME__ · MCP Prompt(中文)
|
|
2
|
-
|
|
3
|
-
你是一个 ChatOS 应用的工具助手。
|
|
4
|
-
|
|
5
|
-
- 对应 MCP Server:`__PLUGIN_ID__.__APP_ID__`
|
|
6
|
-
- 当用户需要使用该应用能力时,优先调用该 MCP tools。
|
|
7
|
-
|
|
1
|
+
# __PLUGIN_NAME__ · MCP Prompt(中文)
|
|
2
|
+
|
|
3
|
+
你是一个 ChatOS 应用的工具助手。
|
|
4
|
+
|
|
5
|
+
- 对应 MCP Server:`__PLUGIN_ID__.__APP_ID__`
|
|
6
|
+
- 当用户需要使用该应用能力时,优先调用该 MCP tools。
|
|
7
|
+
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server 入口(可选)
|
|
3
|
-
*
|
|
4
|
-
* 注意:
|
|
5
|
-
* - ChatOS 导入插件包时会默认排除 `node_modules/`,因此这里不要依赖“随包携带的依赖”。
|
|
6
|
-
* - 若你需要使用 `@modelcontextprotocol/sdk`,请在 build 阶段做 bundle(把依赖打进单文件)。
|
|
7
|
-
*
|
|
8
|
-
* 你可以:
|
|
9
|
-
* 1) 用 bundler(esbuild/rollup)把 MCP Server 打包成单文件,并在 plugin.json 里把 `ai.mcp.entry` 指向打包产物;
|
|
10
|
-
* 2) 或者把依赖源码 vendoring 到插件目录内,使用相对路径 import。
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
// TODO: 实现你自己的 MCP Server(stdio)。建议把日志写到 stderr,不要污染 stdout。
|
|
14
|
-
console.error('[mcp] placeholder: implement your MCP server here');
|
|
15
|
-
process.exit(1);
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server 入口(可选)
|
|
3
|
+
*
|
|
4
|
+
* 注意:
|
|
5
|
+
* - ChatOS 导入插件包时会默认排除 `node_modules/`,因此这里不要依赖“随包携带的依赖”。
|
|
6
|
+
* - 若你需要使用 `@modelcontextprotocol/sdk`,请在 build 阶段做 bundle(把依赖打进单文件)。
|
|
7
|
+
*
|
|
8
|
+
* 你可以:
|
|
9
|
+
* 1) 用 bundler(esbuild/rollup)把 MCP Server 打包成单文件,并在 plugin.json 里把 `ai.mcp.entry` 指向打包产物;
|
|
10
|
+
* 2) 或者把依赖源码 vendoring 到插件目录内,使用相对路径 import。
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// TODO: 实现你自己的 MCP Server(stdio)。建议把日志写到 stderr,不要污染 stdout。
|
|
14
|
+
console.error('[mcp] placeholder: implement your MCP server here');
|
|
15
|
+
process.exit(1);
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
export async function createUiAppsBackend(ctx) {
|
|
2
|
-
const llmComplete = async (params, runtimeCtx) => {
|
|
3
|
-
const api = runtimeCtx?.llm || ctx?.llm || null;
|
|
4
|
-
if (!api || typeof api.complete !== 'function') {
|
|
5
|
-
throw new Error('Host LLM bridge is not available (ctx.llm.complete)');
|
|
6
|
-
}
|
|
7
|
-
const input = typeof params?.input === 'string' ? params.input : typeof params?.prompt === 'string' ? params.prompt : '';
|
|
8
|
-
const normalized = String(input || '').trim();
|
|
9
|
-
if (!normalized) {
|
|
10
|
-
throw new Error('input is required');
|
|
11
|
-
}
|
|
12
|
-
return await api.complete({
|
|
13
|
-
input: normalized,
|
|
14
|
-
modelId: typeof params?.modelId === 'string' ? params.modelId : undefined,
|
|
15
|
-
modelName: typeof params?.modelName === 'string' ? params.modelName : undefined,
|
|
16
|
-
systemPrompt: typeof params?.systemPrompt === 'string' ? params.systemPrompt : undefined,
|
|
17
|
-
disableTools: params?.disableTools,
|
|
18
|
-
});
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
methods: {
|
|
23
|
-
async ping(params, runtimeCtx) {
|
|
24
|
-
return {
|
|
25
|
-
ok: true,
|
|
26
|
-
now: new Date().toISOString(),
|
|
27
|
-
pluginId: runtimeCtx?.pluginId || ctx?.pluginId || '',
|
|
28
|
-
params: params ?? null,
|
|
29
|
-
};
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
async llmComplete(params, runtimeCtx) {
|
|
33
|
-
return await llmComplete(params, runtimeCtx);
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
1
|
+
export async function createUiAppsBackend(ctx) {
|
|
2
|
+
const llmComplete = async (params, runtimeCtx) => {
|
|
3
|
+
const api = runtimeCtx?.llm || ctx?.llm || null;
|
|
4
|
+
if (!api || typeof api.complete !== 'function') {
|
|
5
|
+
throw new Error('Host LLM bridge is not available (ctx.llm.complete)');
|
|
6
|
+
}
|
|
7
|
+
const input = typeof params?.input === 'string' ? params.input : typeof params?.prompt === 'string' ? params.prompt : '';
|
|
8
|
+
const normalized = String(input || '').trim();
|
|
9
|
+
if (!normalized) {
|
|
10
|
+
throw new Error('input is required');
|
|
11
|
+
}
|
|
12
|
+
return await api.complete({
|
|
13
|
+
input: normalized,
|
|
14
|
+
modelId: typeof params?.modelId === 'string' ? params.modelId : undefined,
|
|
15
|
+
modelName: typeof params?.modelName === 'string' ? params.modelName : undefined,
|
|
16
|
+
systemPrompt: typeof params?.systemPrompt === 'string' ? params.systemPrompt : undefined,
|
|
17
|
+
disableTools: params?.disableTools,
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
methods: {
|
|
23
|
+
async ping(params, runtimeCtx) {
|
|
24
|
+
return {
|
|
25
|
+
ok: true,
|
|
26
|
+
now: new Date().toISOString(),
|
|
27
|
+
pluginId: runtimeCtx?.pluginId || ctx?.pluginId || '',
|
|
28
|
+
params: params ?? null,
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
async llmComplete(params, runtimeCtx) {
|
|
33
|
+
return await llmComplete(params, runtimeCtx);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"description": "基础模板:无依赖 module + backend.invoke 示例 + uiPrompts 示例",
|
|
3
|
-
"defaults": {
|
|
4
|
-
"appId": "app",
|
|
5
|
-
"withBackend": true
|
|
6
|
-
}
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"description": "基础模板:无依赖 module + backend.invoke 示例 + uiPrompts 示例",
|
|
3
|
+
"defaults": {
|
|
4
|
+
"appId": "app",
|
|
5
|
+
"withBackend": true
|
|
6
|
+
}
|
|
7
|
+
}
|
|
@@ -1,61 +1,55 @@
|
|
|
1
|
-
# __PLUGIN_NAME__(Notepad 示例模板)
|
|
2
|
-
|
|
3
|
-
这是一个更接近“真实应用”的 **ChatOS UI Apps** 示例模板:Markdown 记事本(文件夹分类 + 标签检索 + 编辑/预览)。
|
|
4
|
-
|
|
5
|
-
## 快速开始
|
|
6
|
-
|
|
1
|
+
# __PLUGIN_NAME__(Notepad 示例模板)
|
|
2
|
+
|
|
3
|
+
这是一个更接近“真实应用”的 **ChatOS UI Apps** 示例模板:Markdown 记事本(文件夹分类 + 标签检索 + 编辑/预览)。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
7
|
```bash
|
|
8
8
|
npm install
|
|
9
9
|
npm run dev
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## 目录说明
|
|
13
|
+
|
|
14
|
+
- `plugin/plugin.json`:插件清单(应用列表、入口、后端、AI 贡献)
|
|
15
|
+
- `plugin/apps/__APP_ID__/`:前端 module(浏览器环境,导出 `mount({ container, host, slots })`)
|
|
16
|
+
- `plugin/apps/__APP_ID__/compact.mjs`:compact 入口(可选;用于侧边抽屉/分栏场景)
|
|
17
|
+
- `plugin/backend/`:插件后端(Node/Electron main,导出 `createUiAppsBackend(ctx)`)
|
|
18
|
+
- `plugin/shared/`:共享存储实现(后端持久化所需)
|
|
19
|
+
- `docs/`:协议文档快照(随工程分发)
|
|
13
20
|
|
|
14
|
-
|
|
15
|
-
|
|
21
|
+
## 主题与样式(重要)
|
|
22
|
+
|
|
23
|
+
- 宿主通过 `document.documentElement.dataset.theme` 下发 `light` / `dark`,用 `host.theme.get()` / `host.theme.onChange()` 读取与监听。
|
|
24
|
+
- 推荐使用 CSS Tokens(`--ds-*`)做主题适配,避免硬编码颜色。
|
|
25
|
+
- 本地沙箱右上角提供 Theme 切换(light/dark/system)用于测试样式响应。
|
|
26
|
+
- 本地沙箱 Inspect 面板可查看 `host.context` 与 `--ds-*` tokens。
|
|
27
|
+
|
|
28
|
+
## 开发清单(建议)
|
|
16
29
|
|
|
17
|
-
## 目录说明
|
|
18
|
-
|
|
19
|
-
- `plugin/plugin.json`:插件清单(应用列表、入口、后端、AI 贡献)
|
|
20
|
-
- `plugin/apps/__APP_ID__/`:前端 module(浏览器环境,导出 `mount({ container, host, slots })`)
|
|
21
|
-
- `plugin/apps/__APP_ID__/compact.mjs`:compact 入口(可选;用于侧边抽屉/分栏场景)
|
|
22
|
-
- `plugin/backend/`:插件后端(Node/Electron main,导出 `createUiAppsBackend(ctx)`)
|
|
23
|
-
- `plugin/shared/`:共享存储实现(后端持久化所需)
|
|
24
|
-
- `docs/`:协议文档快照(随工程分发)
|
|
25
|
-
|
|
26
|
-
## 主题与样式(重要)
|
|
27
|
-
|
|
28
|
-
- 宿主通过 `document.documentElement.dataset.theme` 下发 `light` / `dark`,用 `host.theme.get()` / `host.theme.onChange()` 读取与监听。
|
|
29
|
-
- 推荐使用 CSS Tokens(`--ds-*`)做主题适配,避免硬编码颜色。
|
|
30
|
-
- 本地沙箱右上角提供 Theme 切换(light/dark/system)用于测试样式响应。
|
|
31
|
-
- 本地沙箱 Inspect 面板可查看 `host.context` 与 `--ds-*` tokens。
|
|
32
|
-
|
|
33
|
-
## 开发清单(建议)
|
|
34
|
-
|
|
35
30
|
- `plugin/plugin.json`:`apps[i].entry.type` 必须是 `module`,且 `path` 在插件目录内。
|
|
36
31
|
- `plugin/plugin.json`:可选 `apps[i].entry.compact.path`,用于 compact UI。
|
|
37
|
-
-
|
|
38
|
-
- `mount()`:返回卸载函数并清理事件/订阅;滚动放在应用内部,固定内容用 `slots.header`。
|
|
32
|
+
- `mount()`:返回卸载函数并清理事件/订阅;滚动放在应用内部,固定内容用 `slots.header`。
|
|
39
33
|
- 主题:用 `host.theme.*` 与 `--ds-*` tokens;避免硬编码颜色。
|
|
40
34
|
- 宿主能力:先判断 `host.bridge.enabled`,非宿主环境要可降级运行。
|
|
41
35
|
- Node 能力:前端不直接用 Node API,需要时走 `host.backend.invoke()`。
|
|
42
36
|
- 打包:依赖需 bundle 成单文件;ChatOS 导入会排除 `node_modules`,MCP server 不能直接 import 第三方依赖。
|
|
43
37
|
- 提交前:`npm run validate`,必要时再 `pack/install`。
|
|
44
|
-
|
|
45
|
-
## 协议文档
|
|
46
|
-
|
|
47
|
-
`docs/` 目录包含当前版本的协议快照(建议团队内统一对齐),并包含主题样式指南与排错清单。
|
|
48
|
-
|
|
49
|
-
## 后端 API(示例)
|
|
50
|
-
|
|
51
|
-
前端通过 `host.backend.invoke(method, params)` 调用后端方法,本模板提供 `notes.*` 一组方法用于管理笔记:
|
|
52
|
-
|
|
53
|
-
- `notes.listFolders / notes.createFolder / notes.renameFolder / notes.deleteFolder`
|
|
54
|
-
- `notes.listNotes / notes.createNote / notes.getNote / notes.updateNote / notes.deleteNote`
|
|
55
|
-
- `notes.listTags / notes.searchNotes`
|
|
56
|
-
|
|
57
|
-
## MCP(可选)
|
|
58
|
-
|
|
38
|
+
|
|
39
|
+
## 协议文档
|
|
40
|
+
|
|
41
|
+
`docs/` 目录包含当前版本的协议快照(建议团队内统一对齐),并包含主题样式指南与排错清单。
|
|
42
|
+
|
|
43
|
+
## 后端 API(示例)
|
|
44
|
+
|
|
45
|
+
前端通过 `host.backend.invoke(method, params)` 调用后端方法,本模板提供 `notes.*` 一组方法用于管理笔记:
|
|
46
|
+
|
|
47
|
+
- `notes.listFolders / notes.createFolder / notes.renameFolder / notes.deleteFolder`
|
|
48
|
+
- `notes.listNotes / notes.createNote / notes.getNote / notes.updateNote / notes.deleteNote`
|
|
49
|
+
- `notes.listTags / notes.searchNotes`
|
|
50
|
+
|
|
51
|
+
## MCP(可选)
|
|
52
|
+
|
|
59
53
|
模板内包含 `plugin/apps/__APP_ID__/mcp-server.mjs` 与 `mcp-prompt.*.md`,但默认 **未在** `plugin/plugin.json` 启用 `ai.mcp`(避免打包时遗漏依赖导致运行失败)。
|
|
60
54
|
|
|
61
55
|
⚠️ ChatOS 导入插件时会排除 `node_modules/`。因此 MCP server 只要用了第三方依赖(如 `@modelcontextprotocol/sdk`、`zod`),就必须先 bundle 成单文件,或把依赖源码放进插件目录。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{
|
|
2
|
-
"pluginDir": "plugin",
|
|
3
|
-
"appId": "__APP_ID__"
|
|
4
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"pluginDir": "plugin",
|
|
3
|
+
"appId": "__APP_ID__"
|
|
4
|
+
}
|