From d4be2fcdc7a678b72d3e053b3a9fc98e10d27115 Mon Sep 17 00:00:00 2001 From: Amr Gharbeia Date: Fri, 17 Apr 2026 17:49:27 -0400 Subject: [PATCH] fix(mvp): Final TUI system definition, syntax fixes, and robust bootstrapper --- literate/manifest.org | 9 +++++++++ literate/setup.org | 6 +++--- literate/skills.org | 2 +- opencortex.asd | 4 ++++ opencortex.sh | 46 +++++++++++++++++++------------------------ src/skills.lisp | 2 +- 6 files changed, 38 insertions(+), 31 deletions(-) diff --git a/literate/manifest.org b/literate/manifest.org index 77ea808..64360a5 100644 --- a/literate/manifest.org +++ b/literate/manifest.org @@ -75,3 +75,12 @@ This system contains the empirical tests required by the Engineering Standards. (uiop:symbol-call :fiveam :run! (uiop:find-symbol* :memory-suite :opencortex-memory-tests)) (uiop:symbol-call :fiveam :run! (uiop:find-symbol* :immune-suite :opencortex-immune-system-tests)))) #+end_src + +** TUI Client Definition +This system defines the native Croatoan TUI client. + +#+begin_src lisp :tangle ../opencortex.asd +(defsystem :opencortex/tui + :depends-on (:opencortex :croatoan :usocket :bordeaux-threads) + :components ((:file "src/tui-client"))) +#+end_src diff --git a/literate/setup.org b/literate/setup.org index d311213..1e31db4 100644 --- a/literate/setup.org +++ b/literate/setup.org @@ -115,7 +115,7 @@ setup_system() { sbcl --non-interactive \ --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ - --eval "(ql:quickload :opencortex)" + --eval "(ql:quickload '(:opencortex :croatoan))" if [ $? -ne 0 ]; then echo -e "${RED}āœ— Compilation or Loading failed.${NC}" @@ -171,7 +171,7 @@ if [[ "$1" == "--boot" ]]; then --eval "(setf *debugger-hook* (lambda (c h) (declare (ignore h)) (format *error-output* \"FATAL LISP ERROR: ~a~%\" c) (uiop:print-backtrace :stream *error-output*) (uiop:quit 1)))" \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ --eval "(format t \"--- Quickloading OpenCortex ---~%\")" \ - --eval "(ql:quickload :opencortex)" \ + --eval "(ql:quickload '(:opencortex :croatoan))" \ --eval "(opencortex:main)" fi @@ -194,7 +194,7 @@ if [[ "$1" == "tui" ]]; then exec sbcl --non-interactive \ --load ~/quicklisp/setup.lisp \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ - --eval "(ql:quickload :opencortex/tui :silent t)" \ + --eval "(ql:quickload '(:opencortex :croatoan)/tui :silent t)" \ --eval "(opencortex.tui:main)" fi diff --git a/literate/skills.org b/literate/skills.org index 5ecb24d..829eed6 100644 --- a/literate/skills.org +++ b/literate/skills.org @@ -333,7 +333,7 @@ The `initialize-all-skills` function is the unified orchestrator for the system '("org-skill-policy" "org-skill-bouncer")))) (dolist (req mandatory-skills) (unless (member req sorted-files :key #'pathname-name :test #'string-equal) - (error "BOOT FAILURE: Mandatory skill '~a' not found in skills directory: ~a" req (uiop:native-namestring skills-dir)))) + (error "BOOT FAILURE: Mandatory skill '~a' not found in skills directory: ~a" req (uiop:native-namestring skills-dir))) (harness-log "==================================================") (harness-log " LOADER: Initializing ~a skills..." (length sorted-files)) diff --git a/opencortex.asd b/opencortex.asd index 3327586..5925199 100644 --- a/opencortex.asd +++ b/opencortex.asd @@ -37,3 +37,7 @@ (uiop:symbol-call :fiveam :run! (uiop:find-symbol* :boot-suite :opencortex-boot-tests)) (uiop:symbol-call :fiveam :run! (uiop:find-symbol* :memory-suite :opencortex-memory-tests)) (uiop:symbol-call :fiveam :run! (uiop:find-symbol* :immune-suite :opencortex-immune-system-tests)))) + +(defsystem :opencortex/tui + :depends-on (:opencortex :croatoan :usocket :bordeaux-threads) + :components ((:file "src/tui-client"))) diff --git a/opencortex.sh b/opencortex.sh index 17e343a..981ba18 100755 --- a/opencortex.sh +++ b/opencortex.sh @@ -106,7 +106,7 @@ setup_system() { sbcl --non-interactive \ --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ - --eval "(ql:quickload :opencortex)" + --eval "(ql:quickload '(:opencortex :croatoan))" if [ $? -ne 0 ]; then echo -e "${RED}āœ— Compilation or Loading failed.${NC}" @@ -157,12 +157,12 @@ if [[ "$1" == "--boot" ]]; then fi done < "$SCRIPT_DIR/.env" fi - exec sbcl --non-interactive \ + exec sbcl --non-interactive \\ --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \ --eval "(setf *debugger-hook* (lambda (c h) (declare (ignore h)) (format *error-output* \"FATAL LISP ERROR: ~a~%\" c) (uiop:print-backtrace :stream *error-output*) (uiop:quit 1)))" \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ --eval "(format t \"--- Quickloading OpenCortex ---~%\")" \ - --eval "(ql:quickload :opencortex)" \ + --eval "(ql:quickload '(:opencortex :croatoan))" \ --eval "(opencortex:main)" fi @@ -182,34 +182,28 @@ if [[ "$1" == "tui" ]]; then # Launch TUI echo -e "${BLUE}Launching Croatoan TUI...${NC}" - exec sbcl --non-interactive \ - --load ~/quicklisp/setup.lisp \ + exec sbcl --non-interactive \\ + --eval "(load (merge-pathnames \"quicklisp/setup.lisp\" (user-homedir-pathname)))" \ --eval "(push (truename \"$SCRIPT_DIR/\") asdf:*central-registry*)" \ - --eval "(ql:quickload :opencortex/tui :silent t)" \ + --eval "(format t \"--- Loading TUI ---~%\")" --eval "(ql:quickload :opencortex/tui)" \ --eval "(opencortex.tui:main)" fi + connect() { - if command_exists socat && socat - TCP:$HOST:$PORT,connect-timeout=1 2>/dev/null; then - socat - TCP:$HOST:$PORT - return 0 - elif command_exists nc && nc -z $HOST $PORT 2>/dev/null; then - nc $HOST $PORT - return 0 - fi + if nc -z $HOST $PORT 2>/dev/null; then return 0; fi return 1 } -if connect; then exit 0; fi - -echo -e "${YELLOW}Brain is offline. Awakening...${NC}" -"$SCRIPT_DIR/opencortex.sh" --boot > "$SCRIPT_DIR/brain.log" 2>&1 & - -for i in {1..15}; do - sleep 2 - if connect; then exit 0; fi - echo -n "." -done - -echo -e "${RED}\nāœ— Failed to connect to brain.${NC}" -exit 1 +if [ -z "$1" ]; then + if ! connect; then + echo -e "${YELLOW}Brain is offline. Awakening...${NC}" + "$SCRIPT_DIR/opencortex.sh" --boot > "$SCRIPT_DIR/brain.log" 2>&1 & + for i in {1..15}; do sleep 2; if connect; then break; fi; echo -n "."; done; echo "" + fi + if connect; then + if command_exists socat; then exec socat - TCP:$HOST:$PORT; else exec nc $HOST $PORT; fi + else + echo -e "${RED}āœ— Failed to connect to brain.${NC}"; exit 1 + fi +fi diff --git a/src/skills.lisp b/src/skills.lisp index 47b6282..12be0f2 100644 --- a/src/skills.lisp +++ b/src/skills.lisp @@ -205,7 +205,7 @@ '("org-skill-policy" "org-skill-bouncer")))) (dolist (req mandatory-skills) (unless (member req sorted-files :key #'pathname-name :test #'string-equal) - (error "BOOT FAILURE: Mandatory skill '~a' not found in skills directory: ~a" req (uiop:native-namestring skills-dir)))) + (error "BOOT FAILURE: Mandatory skill '~a' not found in skills directory: ~a" req (uiop:native-namestring skills-dir))) (harness-log "==================================================") (harness-log " LOADER: Initializing ~a skills..." (length sorted-files))