Python library that makes org-mode files first-class citizens for AI agent workflows.
If you need to read and write org-mode task lists from Python — create tasks, transition states, query deadlines, or coordinate multiple agents over a shared org file — org-workspace is the library for it.
Built on a vendored fork of orgparse with write support (PR #77), it adds:
- Multi-file workspace management — load a directory, track dirty files, save only what changed
- Safe serialization — round-trip invariant: unmodified nodes are byte-identical on save
- GTD query layer —
agenda(),deadlines(),overdue(),next_action(),ai_tasks() - Concurrency primitives —
TaskClaim(atomic claiming),OptimisticLock,FileLock - Dependency DAG — parse
DEPENDS_ONproperties, topological sort,ready_tasks()
pip install org-workspacefrom pathlib import Path
from org_workspace import OrgWorkspace, Query
# Load workspace
ws = OrgWorkspace(roots=[Path.home() / "org"])
# Query tasks
q = Query(ws)
next_up = q.next_action()
ai_tasks = q.ai_tasks(states=["TODO"])
deadlines = q.deadlines(days=14)
# Create a task
task = ws.create_node(
file=Path.home() / "org" / "inbox.org",
heading="Research org-mode parsing",
state="TODO",
tags=["AI", "research"],
body="Investigate approaches for org-mode mutation",
)
# Transition state
ws.transition(task, "DONE", agent="my-agent")
# Save changes (only modified files are written)
ws.save()- Quick start guide — from install to first AI-readable task list in five minutes
- Comparison: org-workspace vs orgparse vs organice — factual feature comparison for developers choosing a library
- Multi-file loading with dirty-file tracking
- Content-addressed ID generation with dedup
- Round-trip safe serialization (zero byte-diff on unchanged files)
- Stateless, non-caching read-only views over org nodes
- Generation-counter staleness detection
- Safe for concurrent access patterns
create_node()— create headings with state, tags, properties, bodyrefile()— move nodes between files preserving subtreeremove_node()— delete nodes from filestransition()— state changes with LOGBOOK entriesset_property(),set_heading(),set_tags()
agenda(),deadlines(),overdue(),stale()by_state(),by_tag(),by_property()ai_tasks()— find:AI:tagged tasks for agent executionnext_action()— GTD next action selection
- Parse
DEPENDS_ONproperties into dependency graphs - Topological sort for execution ordering
ready_tasks(),blocked_tasks(), cycle detection
FileLock— file-level lockingOptimisticLock— hash-based conflict detectionTaskClaim— agent-level task claiming with staleness timeoutmulti_lock()— deadlock-free multi-file locking (lexicographic order)
add_logbook_entry(),add_state_change_entry(),add_clock_entry()SessionLogfor buffered per-session logging
archive_node()— archive with hierarchy preservationarchive_done()— bulk archive completed tasksarchive_plan()— archive entire dependency plans
build_execution_context()— structured context from task propertiesget_prompt()— PROMPT property with body fallbackget_role()— agent persona from ROLE property
from org_workspace import StateConfig
# Default: the DIP-0009 v2.0 vocabulary
config = StateConfig.default()
# #+SEQ_TODO: TODO NEXT WAITING REVIEW | DONE DEFERRED CANCELLED
# terminal: DONE, CANCELLED. DEFERRED is done-class but not terminal (it can wake to TODO).
# StateConfig.nightshift() is a deprecated alias for default(). The v1.1
# execution overlay (QUEUED, WORKING, FAILED) is retired; a reader of a legacy
# file passes its own StateConfig, or relies on that file's #+SEQ_TODO header.BSD 2-Clause. See LICENSE.
This library includes a vendored copy of orgparse (BSD 2-Clause, Copyright 2012 Takafumi Arakaki) with modifications from datacore-one/orgparse PR #77 adding write support.