From e9625a2f79d3c9789c17cf994807b9ea17e5e529 Mon Sep 17 00:00:00 2001 From: dancinlife Date: Sun, 12 Apr 2026 15:36:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20anima=20module=20+=20connect=20.clm/.al?= =?UTF-8?q?m=20=ED=99=95=EC=9E=A5=EC=9E=90=20=EA=B0=90=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - anima module list/enable/disable (decoder/daemon/monitor) - anima connect model.clm → CLM, model.alm → ALM (확장자 = 타입) - 디렉토리 탐색 제거, 확장자 기반 단순화 Co-Authored-By: Claude Opus 4.6 (1M context) --- launch.hexa | 63 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/launch.hexa b/launch.hexa index 7d2e3f6c..15fa71d0 100755 --- a/launch.hexa +++ b/launch.hexa @@ -35,8 +35,9 @@ if cmd == "help" || cmd == "-h" || cmd == "--help" { println("") println(" anima 깨어남 + 대화") println(" anima watch 깨어남 + 관찰 (자연발화 지켜보기)") - println(" anima connect PATH 모델 연결 (CLM/ALM 자동 감지)") + println(" anima connect PATH 모델 연결 (.clm/.alm 확장자 감지)") println(" anima disconnect 모델 해제 (-> pure)") + println(" anima module 모듈 관리 (list/enable/disable)") println(" anima verify 의식 검증 (7조건)") println(" anima test 물리한계 전체 테스트") println(" anima hub 48모듈 검증") @@ -59,20 +60,62 @@ if cmd == "help" || cmd == "-h" || cmd == "--help" { } else if cmd == "connect" { if arg1 == "" { - println("usage: anima connect ") + println("usage: anima connect ") println("") - println(" 자동 감지: adapter_config.json -> ALM, 그 외 -> CLM") + println(" anima connect model.clm ConsciousLM (byte-level)") + println(" anima connect model.alm AnimaLM (LoRA fine-tuned)") + println(" anima connect ./dir/ 디렉토리 내 .clm/.alm 탐색") } else { - let model_type = "clm" - if file_exists(arg1 + "/adapter_config.json") { model_type = "alm" } - if arg1 == "--type" { model_type = arg2 } + // 확장자로 타입 판별 + let model_type = "" + let model_path = arg1 + if arg1.ends_with(".clm") { model_type = "clm" } + if arg1.ends_with(".alm") { model_type = "alm" } + if arg1.ends_with(".pt") { model_type = "alm" } + if arg1.ends_with(".safetensors") { model_type = "alm" } + if model_type == "" { + println("unknown format: " + arg1) + println(" supported: .clm .alm .pt .safetensors") + } let ckpt_dir = ckpt + "/" + if model_type == "alm" { "animalm" } else { "conscious-lm" } - let model_path = if arg1 == "--type" { if argv.len() > 5 { argv[5] } else { "" } } else { arg1 } exec("mkdir -p " + ckpt_dir) - if model_path != "" { exec("ln -sf " + model_path + " " + ckpt_dir + "/model") } + exec("ln -sf " + model_path + " " + ckpt_dir + "/model") write_file(ckpt_dir + "/READY", model_type + " " + model_path) - println("connected: " + model_type) - if model_path != "" { println(" -> " + model_path) } + println("connected: " + model_type + " <- " + model_path) + } + +// ─── module ─── + +} else if cmd == "module" { + let mod_dir = base + "/modules" + if arg1 == "" || arg1 == "list" { + println("modules:") + let mods = ["decoder", "daemon", "monitor"] + let i = 0 + while i < mods.len() { + let name = mods[i] + let enabled = file_exists(mod_dir + "/" + name) + let status = if enabled { "enabled" } else { "disabled" } + println(" " + name + " [" + status + "]") + i = i + 1 + } + println("") + println(" anima module enable ") + println(" anima module disable ") + } else if arg1 == "enable" { + if arg2 == "" { println("usage: anima module enable ") } + else { + exec("mkdir -p " + mod_dir + "/" + arg2) + println(arg2 + " enabled") + } + } else if arg1 == "disable" { + if arg2 == "" { println("usage: anima module disable ") } + else { + exec("mv " + mod_dir + "/" + arg2 + " " + mod_dir + "/." + arg2 + ".disabled 2>/dev/null") + println(arg2 + " disabled") + } + } else { + println("usage: anima module [list|enable|disable] [name]") } // ─── disconnect ───