219 lines
6.7 KiB
Org Mode
219 lines
6.7 KiB
Org Mode
#+TITLE: Org-GTD Automation Strategies for OpenClaw Integration
|
|
#+author: User
|
|
#+created: [2026-03-16 Mon 14:28]
|
|
#+ID: 20260314_org_gtd_automation_strategies
|
|
#+FILETAGS: org-mode gtd automation emacs org-gtd @personal
|
|
|
|
* Research: Automating Org-GTD for OpenClaw Integration
|
|
|
|
** The Core Problem
|
|
|
|
`org-gtd.el` is designed for *interactive* Emacs use. Most functions rely on:
|
|
- `point` being at a specific entry
|
|
- Interactive prompts (`completing-read`, `yes-or-no-p`)
|
|
- Context from the current buffer position
|
|
|
|
This creates friction for automation—OpenClaw cannot "stand on an item" like a human user.
|
|
|
|
** Approaches to Automation
|
|
|
|
*** Approach 1: ID-Based Operations (Recommended)
|
|
|
|
Org entries have unique IDs. We can use `org-id` to locate entries programmatically:
|
|
|
|
#+begin_src elisp
|
|
;; Move to entry by ID, then execute org-gtd function
|
|
(defun org-gtd-automate-by-id (entry-id command)
|
|
"Execute org-gtd COMMAND at entry with ENTRY-ID."
|
|
(let ((marker (org-id-find entry-id 'marker)))
|
|
(when marker
|
|
(with-current-buffer (marker-buffer marker)
|
|
(goto-char (marker-position marker))
|
|
(funcall command)))))
|
|
|
|
;; Example usage in batch mode:
|
|
;; emacs --batch -l org-gtd \
|
|
;; --eval '(org-gtd-automate-by-id "my-entry-id" #'org-gtd-archive-item)'
|
|
#+end_src
|
|
|
|
*Advantages:*
|
|
- Works with any org-gtd function
|
|
- No regex parsing needed
|
|
- Preserves all org-gtd logic
|
|
|
|
*Limitations:*
|
|
- Requires entries to have IDs (add `:ID:` property)
|
|
- Functions with interactive prompts will still block
|
|
|
|
*** Approach 2: Custom Non-Interactive Wrappers
|
|
|
|
Write wrapper functions that accept arguments instead of using interactive prompts:
|
|
|
|
#+begin_src elisp
|
|
(defun org-gtd-set-status-noninteractive (entry-id new-status)
|
|
"Set status of entry with ENTRY-ID to NEW-STATUS (TODO, NEXT, WAIT, DONE)."
|
|
(let ((marker (org-id-find entry-id 'marker)))
|
|
(when marker
|
|
(with-current-buffer (marker-buffer marker)
|
|
(goto-char (marker-position marker))
|
|
(org-todo new-status)))))
|
|
|
|
(defun org-gtd-archive-by-id (entry-id)
|
|
"Archive entry with ENTRY-ID."
|
|
(let ((marker (org-id-find entry-id 'marker)))
|
|
(when marker
|
|
(with-current-buffer (marker-buffer marker)
|
|
(goto-char (marker-position marker))
|
|
(org-archive-subtree)))))
|
|
#+end_src
|
|
|
|
*Advantages:*
|
|
- Clean API for batch operations
|
|
- No interactive prompts
|
|
- Can chain multiple operations
|
|
|
|
*** Approach 3: Plain Org Mode (Most Automation-Friendly)
|
|
|
|
Instead of `org-gtd.el`, use standard Org features that are designed for automation:
|
|
|
|
#+begin_src org
|
|
,* TODO Project Alpha
|
|
:PROPERTIES:
|
|
:ID: proj-alpha-001
|
|
:CATEGORY: proj-alpha
|
|
:GTD_TYPE: project
|
|
:END:
|
|
,** NEXT First action
|
|
:PROPERTIES:
|
|
:ID: action-001
|
|
:GTD_TYPE: next
|
|
:END:
|
|
,** TODO Second action
|
|
,** WAIT Waiting for response
|
|
|
|
,* TODO Standalone next action :context_home:
|
|
:PROPERTIES:
|
|
:GTD_TYPE: next
|
|
:END:
|
|
#+end_src
|
|
|
|
*Standard Org functions I can use:*
|
|
- `org-todo` — Change TODO state
|
|
- `org-set-property` — Set/change properties
|
|
- `org-archive-subtree` — Archive entries
|
|
- `org-refile` — Move entries between files
|
|
- `org-id-find` — Locate by ID
|
|
- `org-map-entries` — Batch operations across entries
|
|
|
|
** File Structure for Automation
|
|
|
|
*Recommended layout:*
|
|
|
|
#+begin_example
|
|
~/memex/gtd/
|
|
├── inbox.org # Captured items (process to main)
|
|
├── main.org # Active projects and next actions
|
|
├── someday.org # Someday/maybe items
|
|
├── waiting.org # Delegated/waiting items
|
|
├── archive.org # Completed items
|
|
└── templates/ # Capture templates
|
|
#+end_example
|
|
|
|
** Comparison: org-gtd.el vs Plain Org
|
|
|
|
| Feature | org-gtd.el | Plain Org |
|
|
|---------|------------|-----------|
|
|
| Interactive workflow | Excellent | Good |
|
|
| Batch automation | Poor | Excellent |
|
|
| Learning curve | Medium | Low |
|
|
| Community support | Active | Massive |
|
|
| GTD semantics | Built-in | Manual setup |
|
|
| Custom agenda views | Good | Excellent |
|
|
|
|
** Recommendation
|
|
|
|
For your use case (hybrid interactive + automation):
|
|
|
|
1. *Use plain Org Mode* with custom properties for GTD semantics
|
|
2. *Define your own TODO states:* TODO → NEXT → WAIT → DONE/CNCL
|
|
3. *Use ID properties* on all entries for automation targeting
|
|
4. *Create agenda views* for daily/weekly reviews
|
|
5. *Reserve interactive work* for capture, clarification, and review
|
|
6. *Use automation for:*
|
|
- Archiving completed items
|
|
- Moving waiting items to active
|
|
- Generating reports
|
|
- Refiling from inbox to projects
|
|
|
|
** Sample Automation Commands
|
|
|
|
*Archive all DONE items over 30 days old:*
|
|
|
|
#+begin_src elisp
|
|
(defun org-gtd-archive-old-done ()
|
|
"Archive DONE items older than 30 days."
|
|
(org-map-entries
|
|
(lambda ()
|
|
(when (string= (org-get-todo-state) "DONE")
|
|
(let ((closed (org-entry-get nil "CLOSED")))
|
|
(when (and closed
|
|
(> (org-time-stamp-to-now closed) 30))
|
|
(org-archive-subtree)))))
|
|
t 'agenda))
|
|
#+end_src
|
|
|
|
*Find stuck projects (PROJ without NEXT):*
|
|
|
|
#+begin_src elisp
|
|
(defun org-gtd-find-stuck-projects ()
|
|
"Return list of IDs for projects without NEXT actions."
|
|
(let (stuck)
|
|
(org-map-entries
|
|
(lambda ()
|
|
(when (string= (org-get-todo-state) "PROJ")
|
|
(let ((id (org-entry-get nil "ID"))
|
|
(has-next nil))
|
|
(org-map-entries
|
|
(lambda ()
|
|
(when (string= (org-get-todo-state) "NEXT")
|
|
(setq has-next t)))
|
|
nil 'tree)
|
|
(unless has-next
|
|
(push id stuck))))))
|
|
stuck))
|
|
#+end_src
|
|
|
|
** Integration Points with OpenClaw
|
|
|
|
*OpenClaw can:*
|
|
1. Read your gtd.org files to find next actions
|
|
2. Create new entries via `write` tool (append to inbox.org)
|
|
3. Archive completed items by locating via ID
|
|
4. Generate weekly reports (parse files, output summaries)
|
|
5. Trigger reviews based on HEARTBEAT.md schedules
|
|
|
|
*OpenClaw cannot (easily):*
|
|
1. Toggle states interactively (requires cursor position)
|
|
2. Process inbox items (clarification requires human judgment)
|
|
3. Run org-agenda (needs Emacs UI)
|
|
|
|
** Summary
|
|
|
|
- org-gtd.el is optimized for *interactive* use
|
|
- Batch automation works best with *plain Org + ID properties*
|
|
- Consider a hybrid: org-gtd for capture/review, custom functions for automation
|
|
- The "projects as hierarchy" approach (from Desmond Rivet's blog) is automation-friendly
|
|
|
|
** Related
|
|
|
|
- [[file:20260314_agora_open_source_business_models.org][Agora Open Source Business Models]]
|
|
- [[file:agora-pds-relay-architecture.org][Agora PDS & Relay Architecture]]
|
|
- Desmond Rivet's GTD implementation: https://desmondrivet.com/2023/12/05/gtd-org-mode
|
|
- org-gtd.el: https://github.com/Trevoke/org-gtd.el
|
|
|
|
** Next Steps
|
|
|
|
TODO Test org-id based automation on sample files
|
|
TODO Create wrapper functions for common operations
|
|
TODO Design plain Org GTD structure for memex
|
|
TODO Implement capture templates for OpenClaw integration |