Skip to main content

Canonical YAML task store with pluggable adapters (mermaid dependency graphs)

Project description

scitex-todo (scitex-todo)

SciTeX

A canonical YAML task store with pluggable adapters — render your dependency graph as a diagram, not a wall of prose.

Full Documentation · uv pip install scitex-todo[all]

pypi python docs

tests install-check quality cov


Problem and Solution

# Problem Solution
1 Prose to-do lists hide the dependency structure — what blocks what is buried in text. A YAML store with explicit depends_on / blocks, rendered as a dependency graph.
2 Task tooling locks your data into one app's format. A plain-YAML single source of truth; adapters render or import it, the store stays portable.
3 Switching views means re-entering the same tasks. One store, multiple adapters — mermaid PNG today, a web board, org-mode on the roadmap.

Quick Start

import scitex_todo as todo

tasks = todo.load_tasks("tasks.yaml")    # validates: id/title/status
mermaid_src = todo.build_mermaid(tasks)  # YAML -> flowchart TB
engine = todo.render(mermaid_src, "tasks.png")
print(f"rendered via {engine}")

From the shell:

# default store: project -> user -> bundled example (or $SCITEX_TODO_TASKS)
scitex-todo render-graph -o tasks.png

# inspect the generated mermaid without rendering
scitex-todo render-graph --print-mermaid

# list the resolved tasks (add --json for machine-readable output)
scitex-todo list-tasks

Installation

Recommended: uv pip install scitex-todo[all] — uv's Rust resolver handles the SciTeX dep set quickly. Plain pip install still works.

# Recommended — uv resolver
uv pip install scitex-todo[all]

# Plain pip also works
pip install scitex-todo

Rendering to PNG additionally needs either mmdc (mermaid-cli, with a puppeteer/playwright chromium) on PATH, or outbound access to kroki.io (the automatic fallback).

Configuration

Copy .env.example to .env (gitignored) at your project root, then edit. CLI flags always override env vars; the full list of variables (with inline comments) lives in .env.example.

Local state directories

scitex-todo resolves your task store from the canonical SciTeX local-state locations (project-local wins; both optional):

Path Scope Purpose
~/.scitex/todo/tasks.yaml user-global your personal task store (the shared-fleet default)
<proj-root>/.scitex/todo/tasks.yaml project-local overrides for the current repo
Shared-fleet TODO across agents

The user-global store (~/.scitex/todo/tasks.yaml) is the centralized list shared between you and every agent that runs on this host. Each task carries an optional scope: label so an agent (or you, via the board) can filter to only the slice that's relevant.

Convention (not enforced — scope is a free-form string):

  • agent:<name> — "for this agent's eyes" (e.g. agent:proj-scitex-todo).
  • project:<name> — "tied to this project" (e.g. project:scitex-clew).
  • private — operator-only.

Each agent in the SciTeX agent container picks up its slice by setting:

export SCITEX_TODO_SCOPE='agent:<name>'   # default filter for `list`/`summary`
export SCITEX_TODO_AGENT='agent:<name>'   # stamps `completed_by` on `done`

The list-side filter ALSO has a per-call --scope LABEL flag. Pass --scope '' (empty string) to opt out of the env default and see the full store.

See GITIGNORED/ARCHITECTURE.md (in the repo working tree) for the 9-requirement → mechanism map and the deferred-but-designed seams (cross-host sync, operator↔agent chat).

Architecture

The YAML store is the canonical backend; everything else is an adapter that reads (or, for the board, writes) it. No adapter owns the data.

flowchart TB
    store["tasks.yaml<br/>(single source of truth)"]
    load["load_tasks()<br/>validate id/title/status"]
    build["build_mermaid()<br/>YAML -> flowchart TB"]
    render["render()<br/>mmdc | kroki.io"]
    png["tasks.png"]
    board["Web board<br/>(React Flow, read-only)"]

    store --> load
    load --> build
    build --> render
    render --> png
    load --> board
    board -. "drag-reorder writes priority" .-> store

Figure 1. scitex-todo data flow: one YAML store feeds the mermaid PNG adapter and the read-only web board.

3 Interfaces

Python API
import scitex_todo as todo

tasks = todo.load_tasks("tasks.yaml")
src = todo.build_mermaid(tasks)
todo.render(src, "tasks.png")

load_tasks, save_tasks, build_mermaid, render, resolve_tasks_path, bundled_example, and the STATUS_STYLE / VALID_STATUSES tables are the public surface (scitex-todo list-python-apis).

CLI
scitex-todo render-graph -o tasks.png      # YAML -> dependency PNG
scitex-todo list-tasks --json              # resolved tasks, machine-readable
scitex-todo board --port 8051              # read-only web board (needs [web])
scitex-todo list-python-apis -v            # introspect the Python surface
scitex-todo install-shell-completion       # bash/zsh/fish tab-completion
Web board

A browser view of the dependency graph, rendered with React Flow (nodes colored by status, depends_on arrows, blocks ⊣ inhibition edges). Install the web extra and launch the standalone server:

pip install scitex-todo[web]
scitex-todo board                          # opens http://127.0.0.1:8051/

Task store schema

A YAML document with a top-level tasks: list. Each task:

Field Required Meaning
id yes unique id, referenced by depends_on / blocks
title yes short label
status yes goal | pending | in_progress | blocked | done | deferred | failed
repo no owning repo / area
depends_on no ids this task depends on -> arrow dep --> task
blocks no ids this task inhibits -> blocker -- blocks --x target
note no free-text annotation, shown under the title
priority no integer rank (lower = higher); document order if absent
parent no id of the task this nests under (drill-down view)
kind no task (default) | compute — closed enum; compute marks a row whose status is updated by an external writer (Spartan/CI watcher)
job_id no opaque compute-job id (slurm id, GH Actions run, …); only with kind: compute
host no where the compute job runs (spartan, mba, github, …); only with kind: compute
command no shell invocation / pipeline for the compute job; only with kind: compute
started_at no ISO-8601 timestamp the writer observed start; only with kind: compute
finished_at no ISO-8601 timestamp the writer observed completion; only with kind: compute

status -> color

status fill edge style
goal gold #ffe082 solid
done green #c8e6c9 solid
in_progress yellow #fff9c4 solid
blocked bright-orange #ff8a65 solid
pending grey #eceff1 solid
deferred amber #ffca28 dashed border
failed red #ffcdd2 solid

Roadmap

The YAML store is the canonical backend; adapters layer on top.

  • mermaid adapter — YAML -> dependency PNG. (done)
  • Web UI (read-only board) — browser view via React Flow. (done)
  • Web UI (drag-to-reprioritize) — drag a task to change its priority and write back to the YAML store. (in progress)
  • org adapter — read/write org-mode TODO trees (:BLOCKER: / ORDERED / org-edna) so deps are derivable from Emacs. (future)
  • MCP / HTTP / RTD / full skills — agentic + service surfaces, intended to make the store a shared task backend across SciTeX (e.g. orochi). (future)

Part of SciTeX

scitex-todo is part of SciTeX.

Four Freedoms for Research

  1. The freedom to run your research anywhere — your machine, your terms.
  2. The freedom to study how every step works — from raw data to final manuscript.
  3. The freedom to redistribute your workflows, not just your papers.
  4. The freedom to modify any module and share improvements with the community.

AGPL-3.0 — because we believe research infrastructure deserves the same freedoms as the software it runs on.


SciTeX

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scitex_todo-0.5.6.tar.gz (10.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scitex_todo-0.5.6-py3-none-any.whl (8.9 MB view details)

Uploaded Python 3

File details

Details for the file scitex_todo-0.5.6.tar.gz.

File metadata

  • Download URL: scitex_todo-0.5.6.tar.gz
  • Upload date:
  • Size: 10.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for scitex_todo-0.5.6.tar.gz
Algorithm Hash digest
SHA256 84fa888d7ed4e7464154c9bf4215dc7ac9a56a27997a3356a9ce29f280ae7a6b
MD5 7360146c21717b298afff7bfb0ccafc2
BLAKE2b-256 cc80d593d27022f57c320c1bca2903b53c3dc2b2bc013d667e5d09dba844b858

See more details on using hashes here.

Provenance

The following attestation bundles were made for scitex_todo-0.5.6.tar.gz:

Publisher: pypi-publish-and-github-release-on-tag.yml on ywatanabe1989/scitex-todo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file scitex_todo-0.5.6-py3-none-any.whl.

File metadata

  • Download URL: scitex_todo-0.5.6-py3-none-any.whl
  • Upload date:
  • Size: 8.9 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for scitex_todo-0.5.6-py3-none-any.whl
Algorithm Hash digest
SHA256 d951aaa004928340519fbd675339afb24d41f0457627bfe0f6e3eb9738866a6d
MD5 c5891ff9f875f3703d68c827a7b9a356
BLAKE2b-256 6ff607b57e622a099b15fad99b49672313e2eb436c1509d86fbe6cab7ad1f594

See more details on using hashes here.

Provenance

The following attestation bundles were made for scitex_todo-0.5.6-py3-none-any.whl:

Publisher: pypi-publish-and-github-release-on-tag.yml on ywatanabe1989/scitex-todo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page