- task tracker: small, local, file-based. Tasks live as files under
.autosk/in your repo. You can use it to scope agent attention to concrete context. - workflow engine: each workflow is a directed graph of steps, and each step is owned by an agent managed by the daemon. Workflows and agents are code registered by extensions.
- interface: a convenient way to manage and observe the system — the
autoskCLI, theautosk lazyTUI, and the desktop/mobile GUI.
You can stop at step 1 if all you want is a backlog. Step 2 is opt-in.
Inspired by:
- beads — but simpler and more flexible
- pi.dev — for its approach to extensibility
- sandcastle — for its programmatic approach to workflows
$ autosk create "Wire up the auth flow"
ask-3f9b2c
$ autosk enroll ask-3f9b2c --workflow feature-dev
# the daemon picks it up, runs the agent pipeline, and returns to you when done or parkedautosk v2 stores tasks as files under
.autosk/and is driven by theautoskddaemon. It does not read the old.autosk/dbdatabase, and there is no migrator. If you have an existing v1 project, keep using the last v1 release —v0.1.6— to open it; v2 treats a directory as a fresh project. Workflows and agents are now code (extensions), not database rows or installed npm-package agents.
-
Install autosk:
-
macOS — Homebrew cask (installs the desktop GUI and puts
autosk+autoskdonPATH):brew install --cask wierdbytes/autosk/autosk
The cask is signed + notarized (Apple Silicon); the GUI bundles the
autoskCLI/TUI and theautoskddaemon as sidecars, so a Finder launch auto-spawns the embedded daemon with no shellPATHdependency. -
Linux — grab the
autosk+autoskdbinaries (and the GUI.AppImage/.deb, if you want the desktop app) from the latest GitHub Release. Linux is not served via Homebrew. -
From source (any platform):
make install
Every path installs both binaries: the
autoskCLI/TUI and theautoskddaemon it auto-spawns. Thefeature-devworkflow is fetched from npm on first run (see below). -
-
pi.dev — installed and configured for at least one LLM provider (the shipped agents drive
pi --mode rpc). -
Node.js 22+ (with
npm) — needed on first run so the daemon can install the default@autosk/feature-devworkflow into~/.autosk/packages/, and whenever you add other npm-packaged extensions (listed insettings.json). Your own local.autosk/extensions/*.tsneed nothing extra; the daemon runs them in-process.
Tasks, sessions, workflows, and agents in one screen. Selecting a session streams its transcript live into the Detail pane.
A TUI for easy manipulation and observability. Or go further and use the CLI (see below).
cd ~/your/project
autosk lazyHere you can press n to create a new task or ? to see hotkeys.
A native desktop app (Tauri: React/Vite UI + Rust backend) at feature parity
with autosk lazy — projects in a sidebar, a live session transcript, and a
state-aware composer (steer / follow-up / abort, comment / resume, enroll).
The Tauri backend is a pure JSON-RPC client of autoskd; the front end is
transport-agnostic and runs in either mode:
- Local — connects over the Unix-domain socket and auto-spawns
autoskdwhen it isn't already running. Zero configuration, exactly likeautosk lazy. - Remote — dials a configured
host:portand authenticates with a token (first request ismeta.auth{token}). The remoteautoskdmust be running explicitly — you can't auto-spawn a process on another host. Set the mode and host/token in the in-app Settings view.
Run it from a checkout:
cd gui
npm install
npm run tauri:dev # launch the desktop app (needs a display + webkit)See gui/README.md for the architecture, the IPC chokepoints,
and the full script list. To build and install a release build on desktop,
iPad, or iPhone (a compact single-pane layout), see
docs/gui-release.md.
The autosk CLI is the scriptable front end — every verb, flag, env var, and a
few scripting recipes are in docs/cli.md. A taste:
-
Create your first task. using the CLI:
cd ~/your/project autosk create "Tidy the README" autosk list # everything that's open autosk ready # what should I work on right now? autosk done ask-3f9b2c # mark it finished
The first write verb in a fresh directory prompts you to create
.autosk/. PressEnter(ory) to accept; pressnto abort.autosk initis the explicit form and is idempotent. Scripts and CI auto-accept silently — setAUTOSK_AUTOINIT_ASSUME_YES=1(or disable the behaviour entirely withAUTOSK_NO_AUTOINIT=1). The same prompt fires when you launchautosk lazyfor the first time in a fresh project. There is no database and no per-project workflow seeding — thefeature-devworkflow is provisioned once (on the daemon's first run) and is then available to every project. -
(Optional) Hand a task to the developer workflow. The
feature-devworkflow (dev → review → docs → validator → accept) is installed from npm on the daemon's first run and is available in every project, so all that's left is to enroll a task:id=$(autosk create "Fix the flaky test" --workflow feature-dev --json | jq -r .id)The daemon —
autoskd, auto-spawned on first use (there is no manualservestep) — picks up the task, runs the workflow, and either closes it todoneor parks it tohumanfor review.feature-devruns each agent step in its own git worktree (a per-taskworktreeSandbox()), so the project root must be a git repo; a finalcleanupstep tears the worktree down on the way todone. -
(Optional) Use your own workflow. Drop a TypeScript extension into
~/.autosk/extensions/(or your project's.autosk/extensions/) that registers a workflow (its agents are inline step values), then enroll into it:# ~/.autosk/extensions/mine.ts registers a workflow named my-flow id=$(autosk create "Fix the flaky test" --json | jq -r .id) autosk enroll "$id" --workflow my-flow
To pull in a published or local extension package instead, use
autosk ext add npm:@scope/pkg(orautosk ext add ./my-ext); add-l/--localto scope it to the current project, andautosk ext list/autosk ext removeto inspect or drop entries, orautosk ext updateto bump floating npm extensions to their latest registry version. New to extensions? The extension tutorial builds one from scratch and the Claude Code workflow tutorial wires in a real agent; docs/extensions.md is the full contract, and docs/workflows.md covers full workflows.
autosk has four moving parts. You only need to touch them as you grow into them. For the full mental model, see docs/concepts.md.
Tasks live as files under .autosk/ inside your repo
(tasks/<id>/task.json + comments.jsonl). Each one has:
- An id like
ask-3f9b2cand a title. - A status:
new(open work),work(an agent is on it),human(waiting for a person),done, orcancel. - Optional blockers —
autosk block <id> <blocker-id>makes a task wait for another. - A free-form metadata bag —
autosk metadata show/set/unset <id> …reads and edits it; the engine keeps each workflow's visit counts under the reservedstep_visitskey (resettable by hand).
autosk ready returns the ready set: tasks in new status with no open blocker. That's what humans and agents pull from.
An agent owns a task step. AI agents are code defined inline in a
workflow's steps by extensions — the npm-published
@autosk/pi-agent drives pi --mode rpc, its twin @autosk/claude-agent drives
Claude Code (claude -p headless stream-json), and you can write your own. There is
no install step: a step whose value is an AgentDefinition (it has an onRun)
is an agent step, and the step key is the agent's name, so registering a
workflow registers its agents — no per-step registry needed. A
statusStep("human") is the only non-agent step (a human gate). (Extensions can
also publish a named agent via registerAgent to back an interactive chat
session — a taskless conversation
that is not part of any workflow.)
A workflow is a directed graph of steps, where each step has an agent and one or more outgoing transitions. Workflows can be as small as one step, one agent, or as branchy as developer → reviewer → either back to developer or on to validator.
Workflows are code registered by extensions — you write a
WorkflowDefinition and the daemon drives it. autosk workflow is a read-only
view:
autosk workflow list # workflows registered by this project's extensions
autosk workflow show feature-devThe daemon installs feature-dev (dev → review → docs → validator → accept → cleanup → done, each step in a per-task worktreeSandbox()) from npm on first
run and makes it available to every project. For a one-off
agent, register a tiny workflow with a single agent step (plus a terminal
statusStep).
The catalog of ready-to-use workflows and agents that ship as @autosk/*
packages — feature-dev and its Claude Code / Docker twins, the
merge-to-current integration step, and the pi/claude agents — is documented
in docs/shipped.md. See
Make your own workflow to adapt one
for your dev pipeline, and docs/extensions.md for how
extensions are discovered and loaded.
The daemon
The daemon — autoskd, a Bun/TypeScript program compiled to a standalone binary
— is a long-running process that drives tasks through their workflows and owns
the .autosk/ directory. It is auto-spawned on first use; for a foreground
daemon, run autoskd directly. One daemon per host serves any number of
projects — it picks the project from the {cwd} each request carries.
What the daemon does for each task in work status:
- Resolves the current step's agent (code, from the project's extension registry).
- Runs the agent's
onRunin a session at the project root. Isolation is the agent's concern, not the engine's: a step's agent may wrap its harness in a sandbox (a git worktree or a container) and run it there. - Streams the agent's pi-format transcript to
.autosk/sessions/<id>.jsonland to any attached viewer (autosk lazy, the GUI). - Follows the transition the agent commits (
ctx.transit) — a sibling step or a terminal/park status.
If the agent fails to transition cleanly, the daemon parks the task to human and waits for you to resume it (autosk resume <id>).
Want to see all of this for yourself? The daemon tutorial walks you through running your own daemon, watching a live session + transcript, serving two projects from one daemon, and exposing it over TCP for the GUI.
autosk session list # one row per agent run in this project
autosk session get <id>
autosk session transcript <id>
autosk session abort <id> # abort a live session
autosk project diagnostics # extension load errors for this projectMIT — see LICENSE.
