{"id":28837286,"url":"https://github.com/tom-doerr/agent","last_synced_at":"2026-03-06T09:34:12.929Z","repository":{"id":297093528,"uuid":"991630697","full_name":"tom-doerr/agent","owner":"tom-doerr","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-04T21:30:21.000Z","size":1655,"stargazers_count":39,"open_issues_count":5,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-04T22:35:44.654Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tom-doerr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-27T23:29:30.000Z","updated_at":"2025-06-29T14:58:43.000Z","dependencies_parsed_at":"2025-06-04T04:39:00.241Z","dependency_job_id":"f40da0fd-3a86-495e-959b-973bf9e631af","html_url":"https://github.com/tom-doerr/agent","commit_stats":null,"previous_names":["tom-doerr/agent"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tom-doerr/agent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-doerr%2Fagent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-doerr%2Fagent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-doerr%2Fagent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-doerr%2Fagent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tom-doerr","download_url":"https://codeload.github.com/tom-doerr/agent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tom-doerr%2Fagent/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264892940,"owners_count":23679386,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-19T12:05:44.015Z","updated_at":"2026-03-06T09:34:12.921Z","avatar_url":"https://github.com/tom-doerr.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eNLCO Iteration Loop · Timestamp TUI\u003c/h1\u003e\n  \u003cp\u003e\n    \u003ca href=\"https://www.python.org/\"\u003e\u003cimg alt=\"Python\" src=\"https://img.shields.io/badge/Python-3.11%2B-3776AB?logo=python\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://textual.textualize.io/\"\u003e\u003cimg alt=\"Textual\" src=\"https://img.shields.io/badge/Textual-TUI-7B46BE?style=for-the-badge\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/stanfordnlp/dspy\"\u003e\u003cimg alt=\"DSPy\" src=\"https://img.shields.io/badge/DSPy-Enabled-0F7C0F?style=for-the-badge\"\u003e\u003c/a\u003e\n    \u003ca href=\"#mobile-ssh--termux\"\u003e\u003cimg alt=\"Termux Friendly\" src=\"https://img.shields.io/badge/Termux-Friendly-00AA00?logo=android\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n    \u003ca href=\"#testing\"\u003e\u003cimg alt=\"Tests\" src=\"https://img.shields.io/badge/Tests-pytest-0A9EDC?logo=pytest\u0026logoColor=white\u0026style=for-the-badge\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\nRefine an artifact from constraints, and capture new constraints quickly.\n\nContents\n- Quick Start\n- Key Bindings (TUI)\n- Files \u0026 Behavior\n- Configuration\n- Mobile SSH / Termux\n- Testing\n- Subpackages\n\nQuick Start\n- Timestamp TUI (wrapper, recommended)\n  - `./timestamp_tui.sh`\n- Timestamp TUI (one‑liner, hardened)\n  - `stty iutf8; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 ./timestamp_textual_app.py --lenient-input --fallback-encoding cp1252`\n- Headless NLCO loop\n  - `python nlco_iter.py`\n\nKey Bindings (TUI)\n- `gi` focus input • `ga` focus artifact • `F1` help (more reliable than Ctrl+H on some SSH clients) • `Ctrl+C` exit • `PageUp`/`PageDown` scroll artifact.\n\nFiles \u0026 Behavior\n- `constraints.md` — TUI appends under `# YYYY‑MM‑DD` headings and shows the bottom by default; pane is scrollable and preserves newlines.\n- `artifact.md` — headless loop prints reasoning (when provided) and writes updates; TUI renders it read‑only and scrollable.\n- `memory.md`, `short_term_memory.md` — persistent and short‑term notes; not injected into prompts by default.\n\nConfiguration\n- NLCO loop\n  - `NLCO_MAX_ITERS` (default 3) caps iterations per run.\n  - MLflow optional; if not configured, it’s silently ignored.\n- Timestamp TUI\n  - Paths: defaults to `~/.nlco/private/{constraints.md, artifact.md}`.\n    - Override via env: `TIMESTAMP_CONSTRAINTS_PATH`, `TIMESTAMP_ARTIFACT_PATH`.\n    - Override base dir: `NLCO_PRIVATE_DIR` (e.g., `~/nlco-private`).\n    - CLI flags: `--constraints-path /path/to/constraints.md`, `--artifact-path /path/to/artifact.md`.\n  - `TIMESTAMP_CONSTRAINTS_ROWS` sets constraints pane height; tail count derives from it.\n  - `--no-auto-scroll` or `TIMESTAMP_AUTO_SCROLL=0` disables snapping to end.\n  - Mobile SSH aids: `--right-margin N` (env `TIMESTAMP_RIGHT_MARGIN`) and `--pad-eol` (env `TIMESTAMP_PAD_EOL=1`) avoid right‑edge clipping.\n  - Lenient input for non‑UTF‑8 bytes: `--lenient-input [--fallback-encoding cp1252]` or env `TIMESTAMP_LENIENT_INPUT=1`.\n\nMobile SSH / Termux\n- Enable UTF‑8 input: `stty iutf8`.\n- Prefer `F1` for help.\n- If you see right‑edge clipping of the last character, try `--pad-eol` or `--right-margin 2`.\n\nTesting\n- Timestamp TUI: `pytest -q tests/test_timestamp_textual_app.py`\n- Headless NLCO: `pytest -q tests/test_nlco_iter.py`\n\nSubpackages\n- `deepseek-batch` remains available for batch selection experiments; see its folder for CLI docs. It’s not the focus of this README.\n\nDev setup\n```\npython -m pip install -e .\npytest -q tests\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftom-doerr%2Fagent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftom-doerr%2Fagent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftom-doerr%2Fagent/lists"}