R2MO RAD CLI Dev Skill (Lain Native)
require). NO ESM.const Ec = require('../epic'); for logging/flow.const Utils = require('../utils/mxt-*'); for helpers.require('../utils/mxt-menu'). NO raw readline.Ec for all logging.src/commander/{cmd}.jsonsrc/executor/execute{Cmd}.jssrc/utils/ (mxt-fs, mxt-menu, mxt-args){
"executor": "executeName", "command": "name", "description": "desc",
"options": [{ "name": "arg", "alias": "a", "type": "string" }]
}
const Ec = require('../epic');
const Args = require('../utils/mxt-args');
const FS = require('../utils/mxt-fs');
const { selectSingle } = require('../utils/mxt-menu');
module.exports = async (options) => {
try {
// 1. Parsing
const opts = Args.parseStandard(options);
const target = Args.parsePositional()[0];
// 2. Logic
Ec.waiting('Working...');
if (!FS.exists(target)) Ec.error('Path not found');
// 3. Menu Example
const item = await selectSingle([{name: 'Go'}], 'Title');
if(!item) process.exit(0);
// 4. Finish
Ec.info('✅ Done');
process.exit(0);
} catch (e) { Ec.error(e.message); process.exit(1); }
};
mxt-fs.js )Combines file-utils and yaml-parser.
const FS = require('../utils/mxt-fs');
// Methods:
ensureDir(path), exists(path), readJson(path), writeJson(path, data)
copyDir(src, dest), scanDir(dir, filterFn?), createTempDir(prefix?)
cleanup(path), gitClone(url, dest)
parseFile(path) // YAML Frontmatter
mxt-menu.js )const { selectMultiple, selectSingle, clearScreen } = require('../utils/mxt-menu');
// selectMultiple returns { indices: [], items: [] }
// selectSingle returns Item | null
mxt-args.js )const Args = require('../utils/mxt-args');
// Methods:
parseStandard(options) // Standard KV
parseOptional(flag, alias)
parseBool(flag, alias)
parsePositional()
../epic)Ec.info/warn/error/waiting(msg)
await Ec.ask(query) (Use only AFTER menu closes)
String colors: .green, .blue, .bold, etc.