momo-ai 1.0.20 → 1.0.21
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/.claude/skills/algorithmic-art/LICENSE.txt +202 -0
- package/.claude/skills/algorithmic-art/SKILL.md +405 -0
- package/.claude/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/.claude/skills/algorithmic-art/templates/viewer.html +599 -0
- package/.claude/skills/r2mo-rad-lain/PROMPT.md +281 -0
- package/.claude/skills/r2mo-rad-lain/README.md +192 -0
- package/.claude/skills/r2mo-rad-lain/SKILL.md +412 -0
- package/.claude/skills/r2mo-rad-lain/examples/argument-parsing.js +154 -0
- package/.claude/skills/r2mo-rad-lain/examples/file-operations.js +182 -0
- package/.claude/skills/r2mo-rad-lain/file-utils-api.md +281 -0
- package/.claude/skills/r2mo-rad-lain/menu-api.md +187 -0
- package/.claude/skills/r2mo-rad-lain/scripts/file-utils.js +223 -0
- package/.claude/skills/r2mo-rad-lain/scripts/menu.js +289 -0
- package/.claude/skills/r2mo-rad-lain/scripts/yaml-parser.js +209 -0
- package/.claude/skills/r2mo-rad-lain/templates/command.json.template +13 -0
- package/.claude/skills/r2mo-rad-lain/templates/executor.js.template +32 -0
- package/.claude/skills/r2mo-rad-lain/templates/interactive-menu.js.template +221 -0
- package/.cursor/mcp.json +17 -0
- package/.obsidian/app.json +1 -0
- package/.obsidian/appearance.json +4 -0
- package/.obsidian/community-plugins.json +4 -0
- package/.obsidian/core-plugins.json +33 -0
- package/.obsidian/plugins/ai-agent/main.js +98495 -0
- package/.obsidian/plugins/ai-agent/manifest.json +11 -0
- package/.obsidian/plugins/ai-agent/styles.css +806 -0
- package/.obsidian/plugins/dataview/main.js +20876 -0
- package/.obsidian/plugins/dataview/manifest.json +11 -0
- package/.obsidian/plugins/dataview/styles.css +141 -0
- package/.obsidian/plugins/obsidian-excalidraw-plugin/main.js +10 -0
- package/.obsidian/plugins/obsidian-excalidraw-plugin/manifest.json +12 -0
- package/.obsidian/plugins/obsidian-excalidraw-plugin/styles.css +1 -0
- package/.obsidian/plugins/templater-obsidian/main.js +45 -0
- package/.obsidian/plugins/templater-obsidian/manifest.json +11 -0
- package/.obsidian/plugins/templater-obsidian/styles.css +226 -0
- package/.obsidian/plugins/terminal/main.js +200 -0
- package/.obsidian/plugins/terminal/manifest.json +14 -0
- package/.obsidian/plugins/terminal/styles.css +32 -0
- package/.obsidian/themes/AnuPpuccin/manifest.json +7 -0
- package/.obsidian/themes/AnuPpuccin/theme.css +9080 -0
- package/.obsidian/themes/Things/manifest.json +7 -0
- package/.obsidian/themes/Things/theme.css +1628 -0
- package/.obsidian/workspace.json +196 -0
- package/README.md +10 -123
- package/docs/images/logo.jpeg +0 -0
- package/install.sh +1 -0
- package/package.json +6 -2
- package/skills/r2mo-rad-lain/SKILL.md +101 -0
- package/src/_mcp/skills-server.mjs +70 -0
- package/src/_skill/repositories.json +16 -0
- package/src/commander/help.json +5 -0
- package/src/commander/mcp.json +13 -0
- package/src/commander/open.json +8 -2
- package/src/commander/skills.json +20 -0
- package/src/executor/executeEnv.js +48 -38
- package/src/executor/executeHelp.js +77 -16
- package/src/executor/executeInit.js +203 -149
- package/src/executor/executeMcp.js +290 -0
- package/src/executor/executeOpen.js +144 -125
- package/src/executor/executeSkills.js +747 -0
- package/src/executor/index.js +5 -39
- package/src/momo.js +2 -1
- package/src/utils/momo-args.js +39 -0
- package/src/utils/momo-file-utils.js +75 -0
- package/src/utils/momo-menu.js +54 -0
- package/src/commander/actor.json +0 -12
- package/src/commander/actors.json +0 -6
- package/src/commander/add.json +0 -12
- package/src/commander/agent.json +0 -12
- package/src/commander/agentcfg.json +0 -5
- package/src/commander/archive.json +0 -12
- package/src/commander/commit.json +0 -12
- package/src/commander/console.json +0 -7
- package/src/commander/lain.json +0 -7
- package/src/commander/list.json +0 -7
- package/src/commander/plan.json +0 -12
- package/src/commander/project.json +0 -12
- package/src/commander/pull.json +0 -6
- package/src/commander/push.json +0 -6
- package/src/commander/repo.json +0 -18
- package/src/commander/run.json +0 -18
- package/src/commander/show.json +0 -12
- package/src/commander/tasks.json +0 -18
- package/src/commander/unlock.json +0 -6
- package/src/commander/validate.json +0 -12
- package/src/executor/executeActor.js +0 -133
- package/src/executor/executeActors.js +0 -58
- package/src/executor/executeAdd.js +0 -307
- package/src/executor/executeAgent.js +0 -299
- package/src/executor/executeAgentCfg.js +0 -210
- package/src/executor/executeArchive.js +0 -124
- package/src/executor/executeCommit.js +0 -202
- package/src/executor/executeConsole.js +0 -142
- package/src/executor/executeList.js +0 -133
- package/src/executor/executePlan.js +0 -164
- package/src/executor/executeProject.js +0 -313
- package/src/executor/executePull.js +0 -127
- package/src/executor/executePush.js +0 -243
- package/src/executor/executeRepo.js +0 -238
- package/src/executor/executeRun.js +0 -644
- package/src/executor/executeShow.js +0 -164
- package/src/executor/executeTasks.js +0 -384
- package/src/executor/executeUnlock.js +0 -110
- package/src/executor/executeValidate.js +0 -210
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"executor": "execute{{CommandName}}",
|
|
3
|
+
"description": "{{description}}",
|
|
4
|
+
"command": "{{command}}",
|
|
5
|
+
"options": [
|
|
6
|
+
{
|
|
7
|
+
"name": "{{optionName}}",
|
|
8
|
+
"alias": "{{optionAlias}}",
|
|
9
|
+
"description": "{{optionDescription}}",
|
|
10
|
+
"type": "string"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const Ec = require('../epic');
|
|
4
|
+
const fsAsync = require('fs').promises;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* {{description}}
|
|
8
|
+
* @param {Array} options 命令选项配置
|
|
9
|
+
*/
|
|
10
|
+
module.exports = async (options) => {
|
|
11
|
+
try {
|
|
12
|
+
// 参数解析
|
|
13
|
+
const parsed = Ec.parseArgument(options);
|
|
14
|
+
|
|
15
|
+
// 获取参数值(支持 --name 和 -n 两种形式)
|
|
16
|
+
// const paramValue = parsed.param || parsed.p;
|
|
17
|
+
|
|
18
|
+
// TODO: 实现业务逻辑
|
|
19
|
+
Ec.waiting('正在执行 {{command}} 命令...');
|
|
20
|
+
|
|
21
|
+
// 示例:文件操作
|
|
22
|
+
// const projectDir = process.cwd();
|
|
23
|
+
// const targetPath = path.join(projectDir, 'target');
|
|
24
|
+
|
|
25
|
+
// 成功退出
|
|
26
|
+
Ec.info('✅ {{command}} 命令执行成功!');
|
|
27
|
+
process.exit(0);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
Ec.error(`❌ 执行过程中发生错误: ${error.message}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const Ec = require('../epic');
|
|
4
|
+
const fsAsync = require('fs').promises;
|
|
5
|
+
const readline = require('readline');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 交互式多选菜单
|
|
9
|
+
* @param {Array} items 菜单项列表 [{ name, description, ... }]
|
|
10
|
+
* @param {string} title 菜单标题
|
|
11
|
+
* @returns {Promise<Object>} { indices: 选中索引, items: 选中项 }
|
|
12
|
+
*/
|
|
13
|
+
const _createSelectMenu = (items, title = '选择菜单') => {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
const selected = new Array(items.length).fill(false);
|
|
16
|
+
let cursor = 0;
|
|
17
|
+
|
|
18
|
+
// 计算最大名称长度用于对齐
|
|
19
|
+
const maxNameLen = Math.max(...items.map(i => i.name.length), 4);
|
|
20
|
+
|
|
21
|
+
const render = () => {
|
|
22
|
+
// 清屏并移动到顶部
|
|
23
|
+
process.stdout.write('\x1B[2J\x1B[0f');
|
|
24
|
+
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log('[Momo AI]'.blue.bold + ` ====== ${title} ======`.blue);
|
|
27
|
+
console.log('');
|
|
28
|
+
|
|
29
|
+
items.forEach((item, index) => {
|
|
30
|
+
const isActive = index === cursor;
|
|
31
|
+
const checkbox = selected[index] ? '[✓]'.green : '[ ]';
|
|
32
|
+
const pointer = isActive ? '▸'.cyan : ' ';
|
|
33
|
+
const name = item.name.padEnd(maxNameLen);
|
|
34
|
+
|
|
35
|
+
if (isActive) {
|
|
36
|
+
console.log(` ${pointer} ${checkbox} ${name.cyan.bold}`);
|
|
37
|
+
} else {
|
|
38
|
+
console.log(` ${pointer} ${checkbox} ${name.cyan}`);
|
|
39
|
+
}
|
|
40
|
+
if (item.description) {
|
|
41
|
+
console.log(` ${item.description.gray}`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
console.log('');
|
|
46
|
+
console.log(' ─────────────────────────────────────────────────'.gray);
|
|
47
|
+
console.log(' ↑/↓ 移动 │ 空格 选择/取消 │ a 全选 │ n 清空 │ 回车 确认 │ q 退出'.gray);
|
|
48
|
+
console.log('');
|
|
49
|
+
|
|
50
|
+
const selectedCount = selected.filter(s => s).length;
|
|
51
|
+
if (selectedCount > 0) {
|
|
52
|
+
console.log(` 已选择 ${selectedCount} 项`.green);
|
|
53
|
+
} else {
|
|
54
|
+
console.log(' 未选择任何项'.yellow);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const getSelectedResult = () => {
|
|
59
|
+
const indices = [];
|
|
60
|
+
const selectedItems = [];
|
|
61
|
+
selected.forEach((sel, idx) => {
|
|
62
|
+
if (sel) {
|
|
63
|
+
indices.push(idx);
|
|
64
|
+
selectedItems.push(items[idx]);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return { indices, items: selectedItems };
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// 启用原始模式
|
|
71
|
+
readline.emitKeypressEvents(process.stdin);
|
|
72
|
+
if (process.stdin.isTTY) {
|
|
73
|
+
process.stdin.setRawMode(true);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
render();
|
|
77
|
+
|
|
78
|
+
const onKeypress = (str, key) => {
|
|
79
|
+
if (!key) return;
|
|
80
|
+
|
|
81
|
+
// Ctrl+C 退出
|
|
82
|
+
if (key.ctrl && key.name === 'c') {
|
|
83
|
+
process.stdin.setRawMode(false);
|
|
84
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
85
|
+
process.exit(0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// q 或 ESC 退出
|
|
89
|
+
if (key.name === 'q' || key.name === 'escape') {
|
|
90
|
+
process.stdin.setRawMode(false);
|
|
91
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
92
|
+
process.stdout.write('\x1B[2J\x1B[0f');
|
|
93
|
+
resolve({ indices: [], items: [] });
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// 上移
|
|
98
|
+
if (key.name === 'up') {
|
|
99
|
+
cursor = cursor > 0 ? cursor - 1 : items.length - 1;
|
|
100
|
+
render();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 下移
|
|
105
|
+
if (key.name === 'down') {
|
|
106
|
+
cursor = cursor < items.length - 1 ? cursor + 1 : 0;
|
|
107
|
+
render();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 空格切换选中
|
|
112
|
+
if (key.name === 'space') {
|
|
113
|
+
selected[cursor] = !selected[cursor];
|
|
114
|
+
render();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// a 全选
|
|
119
|
+
if (key.name === 'a') {
|
|
120
|
+
selected.fill(true);
|
|
121
|
+
render();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// n 清空选择
|
|
126
|
+
if (key.name === 'n') {
|
|
127
|
+
selected.fill(false);
|
|
128
|
+
render();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// 回车确认
|
|
133
|
+
if (key.name === 'return') {
|
|
134
|
+
const result = getSelectedResult();
|
|
135
|
+
|
|
136
|
+
if (result.indices.length === 0) {
|
|
137
|
+
// 没有选择,继续显示菜单
|
|
138
|
+
render();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
process.stdin.setRawMode(false);
|
|
143
|
+
process.stdin.removeListener('keypress', onKeypress);
|
|
144
|
+
|
|
145
|
+
// 清屏显示选中结果
|
|
146
|
+
process.stdout.write('\x1B[2J\x1B[0f');
|
|
147
|
+
console.log('');
|
|
148
|
+
console.log('[Momo AI]'.blue.bold + ' 已选择:');
|
|
149
|
+
console.log('');
|
|
150
|
+
result.items.forEach(item => {
|
|
151
|
+
console.log(` ✓ ${item.name}`.green);
|
|
152
|
+
});
|
|
153
|
+
console.log('');
|
|
154
|
+
|
|
155
|
+
resolve(result);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
process.stdin.on('keypress', onKeypress);
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 带确认的交互式选择
|
|
166
|
+
* @param {Array} items 菜单项列表
|
|
167
|
+
* @param {string} title 菜单标题
|
|
168
|
+
* @returns {Promise<Array>} 选中的项
|
|
169
|
+
*/
|
|
170
|
+
const _selectWithConfirm = async (items, title) => {
|
|
171
|
+
// 第一步:菜单选择
|
|
172
|
+
const result = await _createSelectMenu(items, title);
|
|
173
|
+
|
|
174
|
+
if (result.indices.length === 0) {
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// 第二步:确认
|
|
179
|
+
const answer = await Ec.ask('确认选择?(y/N): ');
|
|
180
|
+
if (answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes') {
|
|
181
|
+
return result.items;
|
|
182
|
+
} else {
|
|
183
|
+
Ec.waiting('已取消');
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// ============================================================
|
|
189
|
+
// 主执行器
|
|
190
|
+
// ============================================================
|
|
191
|
+
|
|
192
|
+
module.exports = async (options) => {
|
|
193
|
+
try {
|
|
194
|
+
// 示例数据
|
|
195
|
+
const items = [
|
|
196
|
+
{ name: 'item-1', description: '第一个选项' },
|
|
197
|
+
{ name: 'item-2', description: '第二个选项' },
|
|
198
|
+
{ name: 'item-3', description: '第三个选项' },
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
// 使用交互式菜单
|
|
202
|
+
const selected = await _selectWithConfirm(items, '示例菜单');
|
|
203
|
+
|
|
204
|
+
if (selected.length === 0) {
|
|
205
|
+
Ec.waiting('未选择任何项,退出');
|
|
206
|
+
process.exit(0);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// 处理选中的项
|
|
210
|
+
Ec.info(`选择了 ${selected.length} 项`);
|
|
211
|
+
selected.forEach(item => {
|
|
212
|
+
Ec.waiting(` - ${item.name}`);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
Ec.info('✅ 执行成功!');
|
|
216
|
+
process.exit(0);
|
|
217
|
+
} catch (error) {
|
|
218
|
+
Ec.error(`❌ 执行过程中发生错误: ${error.message}`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
};
|
package/.cursor/mcp.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"momo-skills": {
|
|
4
|
+
"command": "node",
|
|
5
|
+
"args": [
|
|
6
|
+
"/Users/lang/zero-cloud/app-zero/r2mo-matrix/r2mo-lain/.r2mo/mcpserver/skills-server.mjs"
|
|
7
|
+
],
|
|
8
|
+
"env": {
|
|
9
|
+
"NODE_ENV": "production",
|
|
10
|
+
"MOMO_PROJECT_SKILLS_DIR": "/Users/lang/zero-cloud/app-zero/r2mo-matrix/r2mo-lain/.claude/skills",
|
|
11
|
+
"MOMO_GLOBAL_SKILLS_DIR": "/Users/lang/.claude/skills"
|
|
12
|
+
},
|
|
13
|
+
"disabled": false,
|
|
14
|
+
"alwaysAllow": []
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"file-explorer": true,
|
|
3
|
+
"global-search": true,
|
|
4
|
+
"switcher": true,
|
|
5
|
+
"graph": true,
|
|
6
|
+
"backlink": true,
|
|
7
|
+
"canvas": true,
|
|
8
|
+
"outgoing-link": true,
|
|
9
|
+
"tag-pane": true,
|
|
10
|
+
"footnotes": false,
|
|
11
|
+
"properties": true,
|
|
12
|
+
"page-preview": true,
|
|
13
|
+
"daily-notes": true,
|
|
14
|
+
"templates": true,
|
|
15
|
+
"note-composer": true,
|
|
16
|
+
"command-palette": true,
|
|
17
|
+
"slash-command": false,
|
|
18
|
+
"editor-status": true,
|
|
19
|
+
"bookmarks": true,
|
|
20
|
+
"markdown-importer": false,
|
|
21
|
+
"zk-prefixer": false,
|
|
22
|
+
"random-note": false,
|
|
23
|
+
"outline": true,
|
|
24
|
+
"word-count": true,
|
|
25
|
+
"slides": false,
|
|
26
|
+
"audio-recorder": false,
|
|
27
|
+
"workspaces": false,
|
|
28
|
+
"file-recovery": true,
|
|
29
|
+
"publish": false,
|
|
30
|
+
"sync": true,
|
|
31
|
+
"bases": true,
|
|
32
|
+
"webviewer": false
|
|
33
|
+
}
|