passepartout: v0.5.0 hotfix 2 — daemon stable
Some checks failed
Deploy (Gitea) / deploy (push) Failing after 2s

- Restore (in-package :passepartout) to core-reason
- Move *VAULT-MEMORY* back to core-skills
- Fix ASDF and defstruct/defpackage ordering
- Increase daemon timeout to 120s
- Handshake: 0.5.0

Verified: daemon processes messages, TUI clean, gate trace works
This commit is contained in:
2026-05-07 20:14:51 -04:00
parent da160b71e3
commit 924bf8f479
71 changed files with 2976 additions and 3888 deletions

View File

@@ -17,6 +17,9 @@ Structural manipulation tools for Org-mode files. This skill handles reading, wr
5. (org-headline-add ast parent-id title): adds a new child headline.
6. (org-headline-find-by-id ast id): returns the subtree for a matching
headline ID.
7. (org-id-get-create ast target-id): ensures a headline has an :ID: property.
If the headline already has one, returns it. If not, generates a new UUID,
sets it, and returns it. Returns nil if the headline is not found.
* Implementation
@@ -209,7 +212,7 @@ Returns the filtered content as a string."
(defun org-headline-find-by-title (ast title)
"Finds a headline by its title in the AST."
(let ((props (getf ast :properties)))
(when (string-equal (getf props :TITLE) title)
(when (string-equal (getf props :TITLE) title)
(return-from org-headline-find-by-title ast))
(dolist (child (getf ast :contents))
(when (listp child)
@@ -218,6 +221,26 @@ Returns the filtered content as a string."
nil))
#+end_src
** org-id-get-create — Ensure a Headline Has an ID
;; REPL-VERIFIED: 2026-05-07T19:00:00
#+begin_src lisp
(defun org-id-get-create (ast target-id)
"If the headline at TARGET-ID has an :ID property, return it.
If not, generate a new UUID, set it as the :ID property, and return it.
TARGET-ID can be a headline's :ID or :TITLE in the AST.
Returns nil if the headline is not found."
(let ((headline (or (org-headline-find-by-id ast target-id)
(org-headline-find-by-title ast target-id))))
(when headline
(let* ((props (getf headline :properties))
(id (getf props :ID)))
(if id
id
(let ((new-id (org-id-format (org-id-generate))))
(setf (getf props :ID) new-id)
new-id))))))
#+end_src
** Subtree Extraction (from Org text)
Extracts a specific headline subtree from raw Org text by heading name.
@@ -414,4 +437,33 @@ Verification of the structural manipulation for Org-mode files and their AST rep
(is (string= "Child 2" (getf (getf found :properties) :TITLE))))
(let ((missing (org-headline-find-by-id ast "nonexistent")))
(is (null missing) "Missing ID should return nil"))))
(test test-org-id-get-create
"Contract 7: org-id-get-create returns existing ID or creates and sets a new one."
;; Case 1: headline already has an ID
(let* ((ast (list :type :HEADLINE
:properties (list :ID "id:existing" :TITLE "Has ID")
:contents nil)))
(is (string= "id:existing" (org-id-get-create ast "id:existing"))))
;; Case 2: headline exists by title but has no ID — one should be created
(let* ((ast (list :type :HEADLINE
:properties (list :TITLE "No ID")
:contents nil)))
(let ((new-id (org-id-get-create ast "No ID")))
(is (stringp new-id))
(is (uiop:string-prefix-p "id:" new-id))
;; Verify the ID was set on the headline
(is (string= new-id (getf (getf ast :properties) :ID)))))
;; Case 3: idempotent — calling again returns same ID
(let* ((ast (list :type :HEADLINE
:properties (list :TITLE "Idempotent")
:contents nil)))
(let ((id1 (org-id-get-create ast "Idempotent"))
(id2 (org-id-get-create ast "Idempotent")))
(is (string= id1 id2))))
;; Case 4: headline not found returns nil
(let* ((ast (list :type :HEADLINE
:properties (list :ID "root" :TITLE "Root")
:contents nil)))
(is (null (org-id-get-create ast "nonexistent")))))
#+end_src