refactor: Flatten directory structure library->harness, library/gen->skills

This commit is contained in:
2026-04-27 08:41:26 -04:00
parent 43dbe3cf2d
commit 664ba8243d
68 changed files with 637 additions and 666 deletions

View File

@@ -10,29 +10,31 @@ A static, hardcoded architecture is inherently fragile. The ~opencortex~ Skill E
** Global Skill Registry
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(in-package :opencortex)
(defun COSINE-SIMILARITY (v1 v2)
"Computes the cosine similarity between two vectors.
Both arguments should be sequences of numbers. Returns a value between -1.0 and 1.0."
(let ((len1 (length v1)) (len2 (length v2)))
"Computes the cosine similarity between two vectors."
(let* ((len1 (length v1))
(len2 (length v2)))
(if (or (zerop len1) (zerop len2))
0.0
(let ((dot-product 0.0d0)
(norm1 0.0d0)
(norm2 0.0d0))
(let ((len (min len1 len2)))
(dotimes (i len)
(let ((x (coerce (elt v1 i) 'double-float)))
(let ((y (coerce (elt v2 i) 'double-float)))
(incf dot-product (* x y))
(incf norm1 (* x x))
(incf norm2 (* y y))))))
(let* ((dot-product 0.0d0)
(norm1 0.0d0)
(norm2 0.0d0))
(dotimes (i (min len1 len2))
(let* ((x (coerce (elt v1 i) 'double-float))
(y (coerce (elt v2 i) 'double-float)))
(incf dot-product (* x y))
(incf norm1 (* x x))
(incf norm2 (* y y))))
(if (or (zerop norm1) (zerop norm2))
0.0
(/ dot-product (sqrt (* norm1 norm2))))))))
(defun VAULT-MASK-STRING (s) "[MASKED]") ; Stub
;; TODO: Stub for vault - implement later
(defun VAULT-MASK-STRING (s) "[MASKED]")
(defvar *VAULT-MEMORY* (make-hash-table :test 'equal))
@@ -62,11 +64,11 @@ Both arguments should be sequences of numbers. Returns a value between -1.0 and
"Registers a new skill into the global registry."
`(setf (gethash (string-downcase (string ,name)) *skills-registry*)
(make-skill :name (string-downcase (string ,name))
:priority (or ,priority 10)
:dependencies ',dependencies
:trigger-fn ,trigger
:probabilistic-prompt ,probabilistic
:deterministic-fn ,deterministic)))
:priority (or ,priority 10)
:dependencies ',dependencies
:trigger-fn ,trigger
:probabilistic-prompt ,probabilistic
:deterministic-fn ,deterministic)))
(defun resolve-skill-dependencies (skill-name)
"Recursively resolves dependencies for a given skill name."
@@ -84,26 +86,30 @@ Both arguments should be sequences of numbers. Returns a value between -1.0 and
#+end_src
** Skill File Analysis (parse-skill-metadata)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(defun parse-skill-metadata (filepath)
"Extracts ID and DEPENDS_ON tags using robust regex scanning."
"Extracts ID and DEPENDS_ON tags from org file."
(let ((dependencies nil)
(id nil)
(content (uiop:read-file-string filepath)))
;; Extract ID
(multiple-value-bind (match regs)
(ppcre:scan-to-strings "(?im:^:ID:\\s*([^\\s\\r\\n]+))" content)
(when match (setf id (aref regs 0))))
;; Extract all DEPENDS_ON lines
(ppcre:do-register-groups (deps-string)
("(?im:^#\\+DEPENDS_ON:\\s*(.*))" content)
(let ((deps (ppcre:split "\\s+" (string-trim " " deps-string))))
(setf dependencies (append dependencies (mapcar (lambda (s) (string-trim "[] " s)) deps)))))
(values id (remove-if (lambda (s) (= 0 (length s))) dependencies))))
;; Simple ID extraction using string search
(let ((id-start (search ":ID:" content)))
(when id-start
(let ((id-end (position #\Newline content :start id-start)))
(when id-end
(setf id (subseq content (+ id-start 4) id-end)))))
;; Simple DEPENDS_ON extraction
(let ((pos 0))
(loop while (setf pos (search "#+DEPENDS_ON:" content :start2 pos))
do (let ((end (position #\Newline content :start pos)))
(when end
(push (subseq content (+ pos 13) end) dependencies)
(setf pos end))))
(values id (reverse dependencies))))
#+end_src
** Dependency Resolution (topological-sort-skills)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(defun topological-sort-skills (skills-dir)
"Returns a list of skill filepaths sorted by dependency (dependencies first)."
(let ((files (uiop:directory-files skills-dir "org-skill-*.org"))
@@ -147,7 +153,7 @@ Both arguments should be sequences of numbers. Returns a value between -1.0 and
#+end_src
** Jailed Loading (load-skill-from-org)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(defun validate-lisp-syntax (code-string)
"Checks if a string contains valid, readable Common Lisp forms.
Delegates to the Lisp Validator skill when available; falls back to a basic
@@ -201,7 +207,7 @@ Only loads blocks that specify a .lisp tangle target, ignoring tests and example
((and in-lisp-block collect-this-block)
(unless (or (uiop:string-prefix-p ":PROPERTIES:" (string-upcase clean-line))
(uiop:string-prefix-p ":END:" (string-upcase clean-line)))
(setf lisp-code (concatenate 'string lisp-code line (string #\Newline))))))))
(setf lisp-code (concatenate 'string lisp-code line (string #\Newline)))))))
(if (= (length lisp-code) 0)
(progn (setf (skill-entry-status entry) :ready) t)
@@ -221,7 +227,7 @@ Only loads blocks that specify a .lisp tangle target, ignoring tests and example
(harness-log "LOADER ERROR in skill '~a': ~a" skill-base-name msg)
(setf (skill-entry-status entry) :failed)
(setf (skill-entry-error-log entry) msg)
nil)))))
nil)))
(defun load-skill-with-timeout (filepath timeout-seconds)
"Loads a skill Org file with a hard execution timeout."
@@ -246,7 +252,7 @@ Only loads blocks that specify a .lisp tangle target, ignoring tests and example
#+end_src
** Initializing All Skills (initialize-all-skills)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(defun initialize-all-skills ()
"Scans the directory defined by SKILLS_DIR and hot-loads skills using topological order."
(let* ((env-path (uiop:getenv "SKILLS_DIR"))
@@ -292,7 +298,7 @@ Only loads blocks that specify a .lisp tangle target, ignoring tests and example
#+end_src
** Toolbelt Prompt Generation (generate-tool-belt-prompt)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(defun generate-tool-belt-prompt ()
"Aggregates all registered cognitive tools into a descriptive prompt."
(let ((output (format nil "AVAILABLE TOOLS:
@@ -317,7 +323,7 @@ EXAMPLES:
** The Default Tool Belt
*** The Eval Tool (Internal Inspection)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :eval "Evaluates raw Common Lisp code in the harness image. Use this for complex calculations or internal state inspection."
((:code :type :string :description "The Lisp code to evaluate"))
:guard (lambda (args context)
@@ -335,7 +341,7 @@ EXAMPLES:
#+end_src
*** The Grep Tool (File Discovery)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :grep-search "Searches for a pattern in the project files."
((:pattern :type :string :description "The regex pattern to search for")
(:dir :type :string :description "Directory to search in (default is project root)"))
@@ -347,7 +353,7 @@ EXAMPLES:
#+end_src
*** The Shell Tool (Machine Actuation)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :shell "Executes a shell command on the local machine. Use this for file operations, system checks, or running tests."
((:cmd :type :string :description "The full bash command to execute"))
:guard (lambda (args context)
@@ -362,7 +368,7 @@ EXAMPLES:
#+end_src
*** The Reload-Skill Tool (Hot Reload)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :reload-skill "Reloads a skill from its Org-mode source file, recompiling into the live image without restarting the daemon."
((:skill :type :string :description "The skill name (e.g., \"org-skill-policy\") or full path to the .org file"))
:guard (lambda (args context)
@@ -398,7 +404,7 @@ EXAMPLES:
#+end_src
*** The File Read Tool (V 0.2.0 File I/O)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :read-file "Reads the contents of a file as a string."
((:file :type :string :description "The path to the file to read"))
:guard (lambda (args context)
@@ -417,7 +423,7 @@ EXAMPLES:
#+end_src
*** The File Write Tool (V 0.2.0 File I/O)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :write-file "Writes content to a file, creating it if it doesn't exist."
((:file :type :string :description "The path to the file to write")
(:content :type :string :description "The content to write")
@@ -449,7 +455,7 @@ EXAMPLES:
#+end_src
*** The String Replace Tool (V 0.2.0 File I/O)
#+begin_src lisp :tangle ../library/skills.lisp
#+begin_src lisp :tangle ./skills.lisp
(def-cognitive-tool :replace-string "Replaces occurrences of old-string with new-string in a file."
((:file :type :string :description "The path to the file")
(:old :type :string :description "The substring to find and replace")
@@ -484,7 +490,7 @@ EXAMPLES:
These tests verify the Skill Engine and loader. Run with:
~(fiveam:run! 'boot-suite)~
#+begin_src lisp :tangle ../tests/boot-sequence-tests.lisp
#+begin_src lisp :tangle ./tests/boot-sequence-tests.lisp
(defpackage :opencortex-boot-tests
(:use :cl :fiveam :opencortex)
(:export #:boot-suite))