Skip to content

Releases: CKGrafico/loop-task

v2.0.0 — Loop-task rebuild

Choose a tag to compare

@CKGrafico CKGrafico released this 03 Jul 18:42

v2.0.0: The big rebuild

demo

This release rebuilds loop-task from the ground up: a new TUI rendering engine, an HTTP API with Swagger documentation, polished forms, and dozens of UX improvements. No more Bun dependency: everything runs on Node >= 20.

Highlights

HTTP API + Swagger UI

The daemon now exposes a full REST + SSE API on \localhost:8845. Manage loops, tasks, projects, and logs from any HTTP client: curl, Postman, a browser dashboard, or automation scripts.

\\�ash

Swagger UI (interactive docs)

open http://127.0.0.1:8845/api/docs

Or from the CLI

loop-task api

List, create, pause, stream logs: all via HTTP

curl http://127.0.0.1:8845/api/loops
curl -N http://127.0.0.1:8845/api/loops/abc/logs/stream # SSE
curl -N http://127.0.0.1:8845/api/events # SSE events
\\

  • 20+ REST endpoints (loops, tasks, projects, logs)
  • Server-Sent Events for live log streaming and daemon event push
  • OpenAPI 3.0 spec at /api/openapi.json\
  • Swagger UI served inline at /api/docs\ (no external deps)
  • Localhost-only (\127.0.0.1), configurable port via \LOOP_CLI_HTTP_PORT\
  • Graceful degradation: if port is taken, IPC still works

Ink 7 + React 19 TUI

Rebuilt the entire terminal UI on Ink 7 with React 19. The board is faster, more responsive, and no longer requires Bun.

Polished loop create/edit forms

  • Task mode toggle: switch between inline command and existing task selection
  • Per-field validation: duration, command, description, CWD, maxRuns: errors shown inline
  • Smart CWD default: pre-fills \process.cwd()\ on create
  • Clipboard copy: copy command/cwd to clipboard from the edit form
  • Direct edit navigation: selecting a loop goes straight to the edit form (no detail view detour)
  • Works across both board and TUI forms

Board UX improvements

  • Visual hierarchy: status colors, muted waiting state, red failure indicators
  • Right-aligned numeric columns (RUNS, SKIP)
  • Confirm mode with inline options and danger accent
  • Filter chips replacing duplicate status filters
  • SelectModal: filterable modal replaces arrow-cycle selects
  • Hint bar with keyboard shortcuts
  • Humanized durations in run history
  • Command display unescaping in lists

All closed issues in this release

  • #4 v2.0.0 Epic: Loop-task rebuild
  • #5 Migrate TUI rendering engine from OpenTUI to Ink
  • #6 Establish design system: colors, spacing, focus model, themes
  • #7 Rebuild all TUI views on Ink with proper architecture
  • #8 Multi-line command editor with cursor, copy/paste, and syntax awareness
  • #9 Rich log viewer with search, filter, fold, scroll lock, and export
  • #10 Hot-reloading JSON configs with fs.watch + reconcile
  • #11 Exposed API: CLI --json, export/import, optional HTTP server
  • #12 Run history trends: sparklines, streaks, averages
  • #13 Chain visual editor: tree view of task chains with wiring
  • #14 Docker support and GitHub Actions CI
  • #15 First-run onboarding with example loops
  • #16 Daemon push notifications (replace 2s polling with real-time events)
  • #17 v2.0.0 release: version bump, docs, npm publish
  • #18 Fix and expand test suite: existing failures, TUI coverage, hot-reload tests
  • #21 Polished loop create/edit form with task selection, inline command editing, smart defaults, and field validation

Breaking changes from v1.x

  • Bun is no longer required. The board runs on Node >= 20 via Ink 7 + React 19.
  • \loop-task\ (no args) opens the board using Node/tsx, not Bun.

Full changelog

https://github.com/CKGrafico/loop-task/commits/v2.0.0

v1.5.0 - Chain Context Sharing + Searchable Selects

Choose a tag to compare

@CKGrafico CKGrafico released this 27 Jun 09:30

What's New

Chain Context Sharing

Tasks in a chain can now pass data to each other. Each task's stdout is automatically captured and parsed into a context object that downstream tasks can reference via {{key}}\ templates.

Zero config - no flags, no schema changes. Just emit JSON from your tasks and use {{key}}\ in downstream commands.

\\Task 1 (primary): gh issue list --label "to refine" --json number,title,body --jq '{number: .[0].number, title: .[0].title, body: .[0].body}'

Task 2 (chain): gh issue edit {{number}} --add-label "refining" --remove-label "to refine"

Task 3 (chain): opencode run "Rewrite this GitHub issue as a detailed user story..." --model "opencode/big-pickle"

Task 4 (chain): gh issue edit {{number}} --title "{{title}}" --body "{{body}}" --remove-label "refining" --add-label "to implement"
\\

Parse rules:

  • JSON object: merges keys into context
  • JSONL (multiple JSON lines): merges each line
  • Plain text: stored under \output\ key
  • Empty: no change

Template syntax: {{key}}\ replaced before spawning chain tasks. Missing keys resolve to empty string.

Press ?\ in the task list to open the Context Help modal with the full contract.

Searchable Selects

Replaced the broken OpenTUI <select>\ with a new reusable \SearchSelect\ component:

  • Inline filter: type to filter options by name/value (case-insensitive)
  • Keyboard navigation: up/down to navigate filtered list (wraps around), Enter to select, Escape to clear filter
  • No more key hijacking: up/down inside a select no longer jumps to another form field
  • Tab propagates: Tab still moves to the next form field

Replaced selects in:

  • TaskForm (chain task selection: onSuccessTaskId, onFailureTaskId)
  • CreateForm (project selection)

Stop Button for Running Loops

Running loops now show a Stop button in the action bar (previously only Edit and Delete were shown).

Action Buttons Refactor

Refactored the if/else chain in \getActions()\ to a dictionary-based \STATUS_ACTIONS\ lookup, following the project's convention of no nested if/else for dispatch.


Full Changelog: https://github.com/anomalyco/loop-cli/commits/v1.5.0