From 4d45cd2eaae5bf52eb90e4d5c6c3d11c643d2638 Mon Sep 17 00:00:00 2001 From: dancinlife Date: Sun, 12 Apr 2026 15:42:47 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20anima=20module=20=E2=80=94=20=EB=AA=A8?= =?UTF-8?q?=EB=93=88=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EB=A7=A4=EB=8B=88?= =?UTF-8?q?=EC=A0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - anima module 전체 모듈 목록 (local 3 + external 9) - anima module get GitHub에서 모듈 다운로드 - anima module enable/disable 활성화/비활성화 - anima module remove 모듈 삭제 Co-Authored-By: Claude Opus 4.6 (1M context) --- launch.hexa | 91 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 14 deletions(-) diff --git a/launch.hexa b/launch.hexa index 15fa71d0..04996b03 100755 --- a/launch.hexa +++ b/launch.hexa @@ -88,34 +88,97 @@ if cmd == "help" || cmd == "-h" || cmd == "--help" { } else if cmd == "module" { let mod_dir = base + "/modules" + let org = "need-singularity" + // all known modules: local (modules/) + top-level (anima-*) + let local_mods = ["decoder", "daemon", "monitor"] + let ext_mods = ["agent", "body", "eeg", "engines", "hexad", "measurement", "physics", "speak", "tools"] + if arg1 == "" || arg1 == "list" { println("modules:") - let mods = ["decoder", "daemon", "monitor"] + println("") + // local modules let i = 0 - while i < mods.len() { - let name = mods[i] + while i < local_mods.len() { + let name = local_mods[i] let enabled = file_exists(mod_dir + "/" + name) - let status = if enabled { "enabled" } else { "disabled" } - println(" " + name + " [" + status + "]") + let disabled = file_exists(mod_dir + "/." + name + ".disabled") + let status = if enabled { "enabled " } else { if disabled { "disabled" } else { "missing " } } + println(" " + name + " [" + status + "] modules/" + name) + i = i + 1 + } + // external modules (anima-*) + i = 0 + while i < ext_mods.len() { + let name = ext_mods[i] + let dir = base + "/anima-" + name + let installed = file_exists(dir) + let status = if installed { "installed" } else { "not installed" } + let count = if installed { exec("find " + dir + " -name '*.hexa' 2>/dev/null | wc -l") } else { "0" } + println(" " + name + " [" + status + "] anima-" + name + "/ (" + count + " .hexa)") i = i + 1 } println("") - println(" anima module enable ") - println(" anima module disable ") + println(" anima module get 다운로드") + println(" anima module enable 활성화") + println(" anima module disable 비활성화") + println(" anima module remove 삭제") + + } else if arg1 == "get" { + if arg2 == "" { + println("usage: anima module get ") + println(" available: agent body eeg engines hexad measurement physics speak tools") + } else { + let target = base + "/anima-" + arg2 + if file_exists(target) { + println(arg2 + " already installed at " + target) + } else { + let repo = "https://github.com/" + org + "/anima-" + arg2 + ".git" + println("downloading " + arg2 + " ...") + let result = exec("git clone --depth 1 " + repo + " " + target + " 2>&1") + if file_exists(target) { + let count = exec("find " + target + " -name '*.hexa' | wc -l") + println(arg2 + " installed (" + count + " .hexa)") + } else { + println("failed: " + result) + } + } + } + } else if arg1 == "enable" { - if arg2 == "" { println("usage: anima module enable ") } + if arg2 == "" { println("usage: anima module enable ") } else { - exec("mkdir -p " + mod_dir + "/" + arg2) - println(arg2 + " enabled") + let disabled = mod_dir + "/." + arg2 + ".disabled" + if file_exists(disabled) { + exec("mv " + disabled + " " + mod_dir + "/" + arg2) + println(arg2 + " enabled") + } else { + exec("mkdir -p " + mod_dir + "/" + arg2) + println(arg2 + " enabled") + } } + } else if arg1 == "disable" { - if arg2 == "" { println("usage: anima module disable ") } + if arg2 == "" { println("usage: anima module disable ") } else { - exec("mv " + mod_dir + "/" + arg2 + " " + mod_dir + "/." + arg2 + ".disabled 2>/dev/null") - println(arg2 + " disabled") + let target = mod_dir + "/" + arg2 + if file_exists(target) { + exec("mv " + target + " " + mod_dir + "/." + arg2 + ".disabled") + println(arg2 + " disabled") + } else { println(arg2 + " not found in modules/") } } + + } else if arg1 == "remove" { + if arg2 == "" { println("usage: anima module remove ") } + else { + let target = base + "/anima-" + arg2 + if file_exists(target) { + exec("rm -rf " + target) + println(arg2 + " removed") + } else { println(arg2 + " not installed") } + } + } else { - println("usage: anima module [list|enable|disable] [name]") + println("usage: anima module [list|get|enable|disable|remove] [name]") } // ─── disconnect ───