momo-ai 1.0.21 → 1.0.22

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 (94) hide show
  1. package/.claude/skills/r2mo-rad-lain/SKILL.md +63 -374
  2. package/.trae/skills/algorithmic-art/LICENSE.txt +202 -0
  3. package/.trae/skills/algorithmic-art/SKILL.md +405 -0
  4. package/.trae/skills/algorithmic-art/templates/generator_template.js +223 -0
  5. package/.trae/skills/algorithmic-art/templates/viewer.html +599 -0
  6. package/.trae/skills/doc-coauthoring/SKILL.md +375 -0
  7. package/.trae/skills/frontend-design/LICENSE.txt +177 -0
  8. package/.trae/skills/frontend-design/SKILL.md +42 -0
  9. package/.trae/skills/r2mo-rad-lain/SKILL.md +101 -0
  10. package/README.md +9 -32
  11. package/docs/images/r2mo-lain.png +0 -0
  12. package/package.json +11 -11
  13. package/skills/r2mo-rad-domain/SKILL.md +70 -0
  14. package/src/_skill/repositories.json +9 -3
  15. package/src/_template/LAIN/.obsidian/app.json +1 -0
  16. package/src/_template/LAIN/.obsidian/appearance.json +10 -0
  17. package/src/_template/LAIN/.obsidian/community-plugins.json +7 -0
  18. package/src/_template/LAIN/.obsidian/core-plugins.json +33 -0
  19. package/src/_template/LAIN/.obsidian/plugins/dataview/main.js +20876 -0
  20. package/src/_template/LAIN/.obsidian/plugins/dataview/manifest.json +11 -0
  21. package/src/_template/LAIN/.obsidian/plugins/dataview/styles.css +141 -0
  22. package/src/_template/LAIN/.obsidian/plugins/obsidian-excalidraw-plugin/data.json +815 -0
  23. package/src/_template/LAIN/.obsidian/plugins/obsidian-excalidraw-plugin/main.js +10 -0
  24. package/src/_template/LAIN/.obsidian/plugins/obsidian-excalidraw-plugin/manifest.json +12 -0
  25. package/src/_template/LAIN/.obsidian/plugins/obsidian-excalidraw-plugin/styles.css +1 -0
  26. package/src/_template/LAIN/.obsidian/plugins/obsidian-kanban/main.js +153 -0
  27. package/src/_template/LAIN/.obsidian/plugins/obsidian-kanban/manifest.json +11 -0
  28. package/src/_template/LAIN/.obsidian/plugins/obsidian-kanban/styles.css +1 -0
  29. package/src/_template/LAIN/.obsidian/plugins/obsidian-plantuml/main.js +7732 -0
  30. package/src/_template/LAIN/.obsidian/plugins/obsidian-plantuml/manifest.json +10 -0
  31. package/src/_template/LAIN/.obsidian/plugins/obsidian-plantuml/styles.css +38 -0
  32. package/src/_template/LAIN/.obsidian/plugins/obsidian-tasks-plugin/main.js +504 -0
  33. package/src/_template/LAIN/.obsidian/plugins/obsidian-tasks-plugin/manifest.json +12 -0
  34. package/src/_template/LAIN/.obsidian/plugins/obsidian-tasks-plugin/styles.css +1 -0
  35. package/src/_template/LAIN/.obsidian/snippets/body-font.css +27 -0
  36. package/src/_template/LAIN/.obsidian/themes/Primary/manifest.json +9 -0
  37. package/src/_template/LAIN/.obsidian/themes/Primary/theme.css +3878 -0
  38. package/src/_template/LAIN/.obsidian/themes/Retro Windows/manifest.json +7 -0
  39. package/src/_template/LAIN/.obsidian/themes/Retro Windows/theme.css +582 -0
  40. package/src/_template/LAIN/.obsidian/themes/RetroOS 98/manifest.json +9 -0
  41. package/src/_template/LAIN/.obsidian/themes/RetroOS 98/theme.css +2566 -0
  42. package/src/_template/LAIN/.obsidian/types.json +28 -0
  43. package/src/_template/LAIN/.obsidian/workspace.json +184 -0
  44. package/src/_template/LAIN/AGENTS.md +170 -16
  45. package/src/_template/R2MO/domain-enhance.md +10 -0
  46. package/src/commander/app.json +13 -0
  47. package/src/commander/apply.json +13 -0
  48. package/src/commander/ask.json +6 -0
  49. package/src/commander/docs.json +13 -0
  50. package/src/commander/domain.json +19 -0
  51. package/src/commander/init.json +1 -1
  52. package/src/commander/mmr0.json +6 -0
  53. package/src/commander/mmr2.json +6 -0
  54. package/src/executor/executeApp.js +133 -0
  55. package/src/executor/{executeSkills.js → executeApply.js} +166 -302
  56. package/src/executor/executeAsk.js +274 -0
  57. package/src/executor/executeDocs.js +498 -0
  58. package/src/executor/executeDomain.js +293 -0
  59. package/src/executor/executeInit.js +159 -383
  60. package/src/executor/executeMcp.js +74 -1
  61. package/src/executor/executeMmr0.js +488 -0
  62. package/src/executor/executeMmr2.js +880 -0
  63. package/src/executor/index.js +15 -3
  64. package/src/python/r2mo_proto.py +418 -0
  65. package/src/python/r2mo_proto_database.py +369 -0
  66. package/src/python/r2mo_proto_domain.py +458 -0
  67. package/src/utils/momo-menu.js +43 -13
  68. package/.claude/skills/r2mo-rad-lain/PROMPT.md +0 -281
  69. package/.claude/skills/r2mo-rad-lain/README.md +0 -192
  70. package/.claude/skills/r2mo-rad-lain/examples/argument-parsing.js +0 -154
  71. package/.claude/skills/r2mo-rad-lain/examples/file-operations.js +0 -182
  72. package/.claude/skills/r2mo-rad-lain/file-utils-api.md +0 -281
  73. package/.claude/skills/r2mo-rad-lain/menu-api.md +0 -187
  74. package/.claude/skills/r2mo-rad-lain/scripts/file-utils.js +0 -223
  75. package/.claude/skills/r2mo-rad-lain/scripts/menu.js +0 -289
  76. package/.claude/skills/r2mo-rad-lain/scripts/yaml-parser.js +0 -209
  77. package/.claude/skills/r2mo-rad-lain/templates/command.json.template +0 -13
  78. package/.claude/skills/r2mo-rad-lain/templates/executor.js.template +0 -32
  79. package/.claude/skills/r2mo-rad-lain/templates/interactive-menu.js.template +0 -221
  80. package/src/_template/LAIN/.momo/advanced/actor.md +0 -42
  81. package/src/_template/LAIN/.momo/advanced/refer.json +0 -46
  82. package/src/_template/LAIN/.momo/scripts/submodule-clean.sh +0 -56
  83. package/src/_template/LAIN/changes/proposal.md +0 -39
  84. package/src/_template/LAIN/changes/tasks/task-detail.md +0 -45
  85. package/src/_template/LAIN/changes/tasks.md +0 -49
  86. package/src/_template/LAIN/execute/admin-n-f-dashboard.md +0 -53
  87. package/src/_template/LAIN/execute/admin-n-f-form.md +0 -51
  88. package/src/_template/LAIN/execute/admin-n-f-home.md +0 -49
  89. package/src/_template/LAIN/execute/admin-n-f-list.md +0 -52
  90. package/src/_template/LAIN/execute/admin-n-f-login.md +0 -56
  91. package/src/_template/LAIN/specification/project-model.md +0 -13
  92. package/src/_template/LAIN/specification/project.md +0 -73
  93. package/src/_template/LAIN/specification/requirement.md +0 -25
  94. package/src/commander/skills.json +0 -20
@@ -1,281 +0,0 @@
1
- # 提示词范例
2
-
3
- 本文档提供开发 Momo CLI 命令时的常见提示词范例。
4
-
5
- ## 基础命令开发
6
-
7
- ### 创建简单命令
8
-
9
- ```
10
- 为 Momo 项目开发一个新命令 `momo hello`,功能是输出 "Hello, World!"。
11
-
12
- 要求:
13
- 1. 创建命令配置文件 src/commander/hello.json
14
- 2. 创建执行器 src/executor/executeHello.js
15
- 3. 在 src/executor/index.js 中注册
16
- 4. 使用 Ec.info 输出信息
17
- ```
18
-
19
- ### 创建带参数的命令
20
-
21
- ```
22
- 为 Momo 项目开发命令 `momo greet`,功能是向用户打招呼。
23
-
24
- 要求:
25
- 1. 支持参数 -n/--name 指定名称
26
- 2. 如果未提供名称,提示错误并退出
27
- 3. 输出 "Hello, {name}!"
28
-
29
- 示例:
30
- momo greet -n Alice -> Hello, Alice!
31
- ```
32
-
33
- ### 创建带默认值的命令
34
-
35
- ```
36
- 开发命令 `momo config`,用于显示配置信息。
37
-
38
- 要求:
39
- 1. 参数 -e/--env 指定环境,默认值为 "development"
40
- 2. 参数 -f/--format 指定输出格式,可选 json/yaml,默认 json
41
- 3. 读取 .momo/config.json 并按格式输出
42
- ```
43
-
44
- ## 交互式命令
45
-
46
- ### 单选菜单
47
-
48
- ```
49
- 开发命令 `momo select-env`,让用户从菜单中选择环境。
50
-
51
- 要求:
52
- 1. 显示环境列表:development, staging, production
53
- 2. 使用交互式单选菜单
54
- 3. 选择后输出 "已选择: {env}"
55
-
56
- 参考技能中的 scripts/menu.js 和 menu-api.md
57
- ```
58
-
59
- ### 多选菜单
60
-
61
- ```
62
- 开发命令 `momo install-plugins`,让用户选择要安装的插件。
63
-
64
- 要求:
65
- 1. 从 .momo/plugins/ 目录扫描可用插件
66
- 2. 显示多选菜单,支持全选/清空
67
- 3. 确认后将选中的插件拷贝到项目 plugins/ 目录
68
-
69
- 参考技能中的 scripts/menu.js 和 scripts/file-utils.js
70
- ```
71
-
72
- ### 菜单 + 确认
73
-
74
- ```
75
- 开发命令 `momo cleanup`,清理临时文件。
76
-
77
- 要求:
78
- 1. 扫描 .momo/.working/ 目录下的临时文件
79
- 2. 显示多选菜单让用户选择要删除的文件
80
- 3. 选择后显示确认提示 "确认删除 N 个文件?(y/N)"
81
- 4. 确认后执行删除
82
-
83
- 注意:菜单选择和确认输入要分离处理
84
- ```
85
-
86
- ## 文件操作命令
87
-
88
- ### 拷贝目录
89
-
90
- ```
91
- 开发命令 `momo copy-template`,将模板目录拷贝到指定位置。
92
-
93
- 要求:
94
- 1. 参数 -t/--template 指定模板名称
95
- 2. 参数 -d/--dest 指定目标目录,默认为当前目录
96
- 3. 从 .momo/template/{template}/ 拷贝到目标位置
97
- 4. 如果目标已存在,询问是否覆盖
98
-
99
- 参考技能中的 scripts/file-utils.js
100
- ```
101
-
102
- ### 扫描并处理
103
-
104
- ```
105
- 开发命令 `momo list-skills`,列出所有可用技能。
106
-
107
- 要求:
108
- 1. 扫描 ~/.claude/skills/ 目录
109
- 2. 解析每个技能的 SKILL.md 文件,提取 name 和 description
110
- 3. 以表格形式输出:
111
- 名称 描述
112
- ─────────────────────────────
113
- skill-1 描述一
114
- skill-2 描述二
115
-
116
- 参考技能中的 scripts/yaml-parser.js
117
- ```
118
-
119
- ### 远程仓库操作
120
-
121
- ```
122
- 开发命令 `momo fetch-repo`,从 Git 仓库获取内容。
123
-
124
- 要求:
125
- 1. 参数 -u/--url 指定仓库 URL
126
- 2. 参数 -p/--path 指定要提取的子目录
127
- 3. 克隆仓库到临时目录
128
- 4. 将指定子目录拷贝到当前项目
129
- 5. 清理临时目录
130
-
131
- 使用 try/finally 确保临时目录被清理
132
- 参考技能中的 scripts/file-utils.js (gitClone, createTempDir, cleanup)
133
- ```
134
-
135
- ## 复杂命令
136
-
137
- ### 带可选值参数
138
-
139
- ```
140
- 开发命令 `momo deploy`,支持 -e 参数可带可不带值。
141
-
142
- 行为:
143
- momo deploy -> 部署到默认环境 (production)
144
- momo deploy -e -> 显示环境选择菜单
145
- momo deploy -e staging -> 直接部署到 staging
146
-
147
- 注意:Ec.parseArgument 不支持可选值,需要自行解析 process.argv
148
- 参考 SKILL.md 中的 "参数解析限制" 部分
149
- ```
150
-
151
- ### 多步骤流程
152
-
153
- ```
154
- 开发命令 `momo init-project`,初始化新项目。
155
-
156
- 流程:
157
- 1. 显示项目类型选择菜单(web, api, cli)
158
- 2. 询问项目名称
159
- 3. 询问是否初始化 git
160
- 4. 创建目录结构
161
- 5. 拷贝对应模板
162
- 6. 如果选择了 git,执行 git init
163
-
164
- 每个步骤都要有进度提示
165
- ```
166
-
167
- ### 配置文件驱动
168
-
169
- ```
170
- 开发命令 `momo run-task`,根据配置文件执行任务。
171
-
172
- 要求:
173
- 1. 读取 .momo/tasks.json 配置
174
- 2. 配置格式:{ "tasks": [{ "name": "...", "command": "..." }] }
175
- 3. 显示任务选择菜单
176
- 4. 执行选中任务的命令
177
- 5. 显示执行结果
178
-
179
- 参考 scripts/file-utils.js 的 readJson
180
- ```
181
-
182
- ## 错误处理
183
-
184
- ### 参数校验
185
-
186
- ```
187
- 开发命令时,确保正确处理参数校验:
188
-
189
- 1. 必需参数缺失时,使用 Ec.error 输出错误并 process.exit(1)
190
- 2. 参数值无效时,给出具体的错误说明
191
- 3. 文件/目录不存在时,给出路径提示
192
-
193
- 示例:
194
- Ec.error('❌ 缺少必需参数 -n/--name');
195
- Ec.error('❌ 无效的环境值,可选: development, staging, production');
196
- Ec.error('❌ 目录不存在: /path/to/dir');
197
- ```
198
-
199
- ### 异常捕获
200
-
201
- ```
202
- 使用 try/catch 包装主逻辑:
203
-
204
- module.exports = async (options) => {
205
- try {
206
- // 主逻辑
207
- } catch (error) {
208
- Ec.error(`❌ 执行失败: ${error.message}`);
209
- process.exit(1);
210
- }
211
- };
212
- ```
213
-
214
- ## 输出美化
215
-
216
- ### 表格对齐
217
-
218
- ```
219
- 输出列表时要求动态对齐:
220
-
221
- 1. 计算所有项的最大长度
222
- 2. 使用 padEnd 补齐空格
223
- 3. 使用颜色区分不同部分
224
-
225
- 示例输出:
226
- 名称 版本 描述
227
- ──────────────────────────────────
228
- skill-one 1.0.0 第一个技能
229
- skill-two-long 2.1.0 第二个技能
230
- ```
231
-
232
- ### 进度提示
233
-
234
- ```
235
- 长时间操作要有进度提示:
236
-
237
- Ec.waiting('正在克隆仓库...');
238
- // 克隆操作
239
- Ec.waiting('✓ 克隆完成'.green);
240
-
241
- Ec.waiting('正在安装依赖...');
242
- // 安装操作
243
- Ec.waiting('✓ 安装完成'.green);
244
-
245
- Ec.info('✅ 全部完成!');
246
- ```
247
-
248
- ## 模板使用
249
-
250
- ### 使用命令配置模板
251
-
252
- ```
253
- 基于 templates/command.json.template 创建命令配置:
254
-
255
- 将 {{CommandName}} 替换为实际命令名(首字母大写)
256
- 将 {{command}} 替换为命令名(小写)
257
- 将 {{description}} 替换为命令描述
258
- 配置 options 数组
259
- ```
260
-
261
- ### 使用执行器模板
262
-
263
- ```
264
- 基于 templates/executor.js.template 创建执行器:
265
-
266
- 1. 复制模板内容
267
- 2. 替换 {{command}} 和 {{description}}
268
- 3. 在 TODO 位置添加业务逻辑
269
- 4. 根据需要添加参数解析
270
- ```
271
-
272
- ### 使用菜单模板
273
-
274
- ```
275
- 基于 templates/interactive-menu.js.template 创建带菜单的执行器:
276
-
277
- 1. 复制模板内容
278
- 2. 修改 items 数据源
279
- 3. 修改菜单标题
280
- 4. 在确认后添加业务逻辑
281
- ```
@@ -1,192 +0,0 @@
1
- # r2mo-rad-lain
2
-
3
- R2MO RAD (快速应用开发) LAIN 技能 - 专注于 Momo/LAIN 项目的 CLI 命令开发。
4
-
5
- ## 快速开始
6
-
7
- ### 1. 开发新命令
8
-
9
- ```bash
10
- # 步骤 1: 创建命令配置
11
- # 文件: src/commander/mycommand.json
12
-
13
- # 步骤 2: 创建执行器
14
- # 文件: src/executor/executeMyCommand.js
15
-
16
- # 步骤 3: 注册执行器
17
- # 文件: src/executor/index.js
18
-
19
- # 步骤 4: 测试
20
- node src/momo.js mycommand
21
- ```
22
-
23
- ### 2. 使用交互式菜单
24
-
25
- ```javascript
26
- // 复制脚本到项目
27
- cp -r skills/r2mo-rad-lain/scripts src/_scripts
28
-
29
- // 在执行器中使用
30
- const { selectMultiple } = require('../_scripts/menu');
31
- const result = await selectMultiple(items, '选择菜单');
32
- ```
33
-
34
- ## 文件说明
35
-
36
- | 文件 | 说明 |
37
- |------|------|
38
- | `SKILL.md` | 主技能文档,包含完整开发指南 |
39
- | `menu-api.md` | 交互式菜单 API 参考 |
40
- | `file-utils-api.md` | 文件操作工具 API 参考 |
41
- | `PROMPT.md` | 常见提示词范例 |
42
-
43
- ### scripts/ 目录
44
-
45
- 可复用的脚本模块:
46
-
47
- | 脚本 | 功能 |
48
- |------|------|
49
- | `menu.js` | 交互式单选/多选菜单 |
50
- | `file-utils.js` | 文件操作(拷贝、扫描、临时目录) |
51
- | `yaml-parser.js` | YAML Frontmatter 解析 |
52
-
53
- ### templates/ 目录
54
-
55
- 代码模板:
56
-
57
- | 模板 | 用途 |
58
- |------|------|
59
- | `command.json.template` | 命令配置文件模板 |
60
- | `executor.js.template` | 基础执行器模板 |
61
- | `interactive-menu.js.template` | 带菜单的执行器模板 |
62
-
63
- ### examples/ 目录
64
-
65
- 示例代码:
66
-
67
- | 示例 | 内容 |
68
- |------|------|
69
- | `file-operations.js` | 文件操作示例 |
70
- | `argument-parsing.js` | 参数解析示例 |
71
-
72
- ## 使用流程
73
-
74
- ### 流程图
75
-
76
- ```
77
- 开始开发新命令
78
-
79
-
80
- ┌──────────────────┐
81
- │ 1. 阅读 SKILL.md │
82
- └────────┬─────────┘
83
-
84
-
85
- ┌──────────────────────┐
86
- │ 2. 确定命令需求 │
87
- │ - 需要交互菜单? │
88
- │ - 需要文件操作? │
89
- │ - 需要远程仓库? │
90
- └────────┬─────────────┘
91
-
92
- ┌────┴────┐
93
- │ │
94
- ▼ ▼
95
- 需要菜单 需要文件操作
96
- │ │
97
- ▼ ▼
98
- 阅读 阅读
99
- menu-api.md file-utils-api.md
100
- │ │
101
- └────┬────┘
102
-
103
-
104
- ┌──────────────────────┐
105
- │ 3. 创建命令配置 │
106
- │ src/commander/ │
107
- │ {command}.json │
108
- └────────┬─────────────┘
109
-
110
-
111
- ┌──────────────────────┐
112
- │ 4. 创建执行器 │
113
- │ src/executor/ │
114
- │ execute{Cmd}.js │
115
- └────────┬─────────────┘
116
-
117
-
118
- ┌──────────────────────┐
119
- │ 5. 注册执行器 │
120
- │ src/executor/ │
121
- │ index.js │
122
- └────────┬─────────────┘
123
-
124
-
125
- ┌──────────────────────┐
126
- │ 6. 测试命令 │
127
- │ node src/momo.js │
128
- │ {command} │
129
- └──────────────────────┘
130
- ```
131
-
132
- ### 阅读顺序
133
-
134
- 1. **必读**:`SKILL.md` - 了解项目架构和规范
135
- 2. **按需**:`menu-api.md` - 如需交互式菜单
136
- 3. **按需**:`file-utils-api.md` - 如需文件操作
137
- 4. **参考**:`PROMPT.md` - 提示词范例
138
-
139
- ## 技术栈要求
140
-
141
- - Node.js >= 22.x
142
- - CommonJS 模块规范
143
- - 使用 Epic 工具库(Ec)
144
-
145
- ## 常见场景
146
-
147
- ### 场景 1: 简单命令
148
-
149
- 只需执行一个操作,无交互。
150
-
151
- ```
152
- 参考: templates/executor.js.template
153
- ```
154
-
155
- ### 场景 2: 带参数的命令
156
-
157
- 需要用户提供参数。
158
-
159
- ```
160
- 参考: examples/argument-parsing.js
161
- ```
162
-
163
- ### 场景 3: 交互式选择
164
-
165
- 需要用户从列表中选择。
166
-
167
- ```
168
- 参考: templates/interactive-menu.js.template
169
- menu-api.md
170
- ```
171
-
172
- ### 场景 4: 文件/目录操作
173
-
174
- 需要拷贝、扫描目录等。
175
-
176
- ```
177
- 参考: scripts/file-utils.js
178
- file-utils-api.md
179
- ```
180
-
181
- ### 场景 5: 解析配置文件
182
-
183
- 需要读取 YAML/JSON 配置。
184
-
185
- ```
186
- 参考: scripts/yaml-parser.js
187
- file-utils-api.md
188
- ```
189
-
190
- ## 许可
191
-
192
- Apache 2.0
@@ -1,154 +0,0 @@
1
- /**
2
- * 参数解析示例
3
- * 演示如何处理复杂的命令行参数
4
- */
5
-
6
- // ============================================================
7
- // 使用 Ec.parseArgument(标准方式)
8
- // ============================================================
9
-
10
- /**
11
- * 标准参数解析
12
- * 适用于 key-value 成对参数
13
- *
14
- * 命令示例:momo cmd -n value --name value
15
- */
16
- const standardParsing = (options) => {
17
- const Ec = require('../epic');
18
- const parsed = Ec.parseArgument(options);
19
-
20
- // 支持 --name 和 -n 两种形式
21
- const name = parsed.name || parsed.n;
22
- const type = parsed.type || parsed.t;
23
-
24
- return { name, type };
25
- };
26
-
27
- // ============================================================
28
- // 自定义参数解析(支持可选值)
29
- // ============================================================
30
-
31
- /**
32
- * 解析可选值参数
33
- * 适用于参数值可以省略的情况
34
- *
35
- * 命令示例:
36
- * momo cmd -r -> hasFlag: true, value: null
37
- * momo cmd -r value -> hasFlag: true, value: 'value'
38
- * momo cmd -> hasFlag: false, value: null
39
- */
40
- const parseOptionalArg = (flagName, aliasName) => {
41
- const args = process.argv.slice(3);
42
- let hasFlag = false;
43
- let value = null;
44
-
45
- for (let i = 0; i < args.length; i++) {
46
- const arg = args[i];
47
- if (arg === `-${aliasName}` || arg === `--${flagName}`) {
48
- hasFlag = true;
49
- // 检查下一个参数是否是值(不以 - 开头)
50
- const nextArg = args[i + 1];
51
- if (nextArg && !nextArg.startsWith('-')) {
52
- value = nextArg;
53
- }
54
- break;
55
- }
56
- }
57
-
58
- return { hasFlag, value };
59
- };
60
-
61
- // ============================================================
62
- // 布尔标志解析
63
- // ============================================================
64
-
65
- /**
66
- * 解析布尔标志
67
- *
68
- * 命令示例:
69
- * momo cmd --verbose -> true
70
- * momo cmd -v -> true
71
- * momo cmd -> false
72
- */
73
- const parseBooleanFlag = (flagName, aliasName) => {
74
- const args = process.argv.slice(3);
75
- return args.includes(`--${flagName}`) || args.includes(`-${aliasName}`);
76
- };
77
-
78
- // ============================================================
79
- // 位置参数解析
80
- // ============================================================
81
-
82
- /**
83
- * 解析位置参数
84
- *
85
- * 命令示例:
86
- * momo cmd arg1 arg2 -> ['arg1', 'arg2']
87
- */
88
- const parsePositionalArgs = () => {
89
- const args = process.argv.slice(3);
90
- const positional = [];
91
-
92
- let i = 0;
93
- while (i < args.length) {
94
- const arg = args[i];
95
- if (arg.startsWith('-')) {
96
- // 跳过 flag 和它的值
97
- i += 2;
98
- } else {
99
- positional.push(arg);
100
- i++;
101
- }
102
- }
103
-
104
- return positional;
105
- };
106
-
107
- // ============================================================
108
- // 完整示例
109
- // ============================================================
110
-
111
- /**
112
- * 综合参数解析示例
113
- *
114
- * 命令格式:momo mycommand [target] -n name -r [repo] --verbose
115
- */
116
- const parseAllArgs = (options) => {
117
- // 1. 标准参数
118
- const Ec = require('../epic');
119
- let parsed = {};
120
- try {
121
- parsed = Ec.parseArgument(options);
122
- } catch (e) {
123
- // 忽略缺少值的错误,手动处理
124
- }
125
-
126
- // 2. 可选值参数
127
- const remote = parseOptionalArg('remote', 'r');
128
-
129
- // 3. 布尔标志
130
- const verbose = parseBooleanFlag('verbose', 'v');
131
-
132
- // 4. 位置参数
133
- const positional = parsePositionalArgs();
134
- const target = positional[0] || '.';
135
-
136
- return {
137
- name: parsed.name || parsed.n,
138
- remote: remote,
139
- verbose: verbose,
140
- target: target
141
- };
142
- };
143
-
144
- // ============================================================
145
- // 导出
146
- // ============================================================
147
-
148
- module.exports = {
149
- standardParsing,
150
- parseOptionalArg,
151
- parseBooleanFlag,
152
- parsePositionalArgs,
153
- parseAllArgs
154
- };