Work tracking CLI workflows¶
Work Tracking And Planning¶
Flag and option details live in the generated CLI command groups:
- sase patch, sase bead, sase plan, sase goal, sase project
- sase init, sase machine, sase memory, sase instructions, sase repo
Workflows: Patches, Beads, SDD, Goals, Project lifecycle, Initialization, Remote dispatch, Memory.
Patches are PR-sized review records. SDD stores durable prompt and planning artifacts. Beads add git-portable dependency tracking and executable epics on top of those artifacts.
Bead commands that take existing bead IDs — show, update, open, close, rm,
note, +1, snooze, history, dep, ref, pages, epic-symbols, and work —
resolve a full ID against the current project's store first and then route it to the
enabled project that owns it, so sase bead close bob-cli-1e --note done works from
another project. Shorthand suffixes stay local, mutating commands reject batches that
span more than one store before writing, and sase bead create places a child in the
store that owns a full parent ID. Commands without a bead selector (list, search,
ready, blocked, and stats) keep the current-project scope. See
Bead ID Arguments.
sase project defaults to sase project list, and sase project list defaults to
enabled true projects. sase project current prints the current project derived from
the VCS macro MRU head — the project name in that project's accent color, its canonical
directory key, whether it came from a project ref or a Patch, and the MRU ref that
produced it. Launch an agent on a project (or on a Patch owned by that project), or run
sase project set-current, to change it — sase's TUI binds the same operation in the
Projects tab. When nothing resolves, the command explains that and exits 0. Use
sase project list --state all --json to inspect disabled projects and internal
sibling backing records, sase project disable <project> to hide a dormant project
from default launch views, and sase project enable <project> to make it launchable
again. Disabling refuses projects with live RUNNING claims or active artifact markers
unless --force is passed. Project arguments also accept the
project tag spelling, so
sase project show +sase works like sase project show sase. sase project list has a
TAG column and sase project show a Tag: line with each project's +<name>
spelling (- or omitted when the name does not fit tag syntax), colored by project
accent on a color terminal; their --json output adds tag (null when the name does
not fit tag syntax), workflow_type, and accent (null for disabled projects).
Legacy active/inactive values and the deprecated lifecycle command aliases remain
read-compatible. sase's TUI Projects tab (in the SASE Admin Center, opened with #)
provides the interactive counterpart, including marking multiple projects, editing a
ProjectSpec in $EDITOR, and deleting obsolete SASE project directories after
confirmation. There is no CLI delete subcommand; full project-directory deletion is only
available from sase's TUI Projects tab and removes state under ~/.sase/projects/, not
workspace checkouts.
sase project suggest [PROVIDER] [-a|--all] [-j|--json] [-o|--owner OWNER]... [-r|--refresh]
ranks the repositories worth adding as projects, grouped as RESUME, ON THIS MACHINE,
SUGGESTED, LINKED TO YOUR PROJECTS, and DISABLED PROJECTS. Discovery is
cache-first per owner: it creates no repositories or project registrations, so agents
may call it freely. It may refresh local discovery caches, and specifying a provider
records that provider as the wizard preference. -o restricts discovery to the named
owners, -r bypasses the cached repository lists, and -a includes the hidden rows
(sidecars, forks, archived repositories, enabled projects, numbered clone copies, and
third-party local checkouts) that are otherwise only counted in the footer.
sase project add REF [-a|--alias ALIAS]... [-c|--check] [-j|--json] [-m|--make-current] [-n|--name NAME] [-S|--no-setup | -s|--setup] [-Q|--request-path PATH] [-R|--result-path PATH] [-y|--yes]
registers an existing repository. --check is read-only and emits one plan document
with --json; JSON apply streams plan, step, and result events as NDJSON. New projects
are enabled by default. Setup may write sase/sase.yml, commit the marker, and push the
default branch; agents can preview and register with automatic setup omitted, while
explicit --setup is human-only. Repeating the same command resumes an interrupted
operation. After successful setup, a TTY can hand off to sase init -p KEY; sidecar
creation there still requires its own confirmation.
sase project create REF [-a|--alias ALIAS]... [-c|--check] [-d|--description TEXT] [-j|--json] [-m|--make-current] [-n|--name NAME] [-O|--option KEY=VALUE]... [-S|--no-setup | -s|--setup] [-Q|--request-path PATH] [-R|--result-path PATH] [-v|--visibility VISIBILITY] [-y|--yes]
creates a repository (gh:OWNER/NAME, OWNER/NAME, or git:NAME) and registers it.
The apply argv uses a create-parseable ref (git:NAME for bare git). --visibility is
GitHub sugar and is only defaulted or emitted when the provider's creation form has a
visibility field; bare-git has none. Provider options are validated strictly before any
create subprocess. --check lists every provider option with its default, value, and
availability, and is available to agents. Apply refuses inside agents and monitors
(exit 2) unless it runs as an approved /sase_gate option or
SASE_PROJECT_CREATE_BYPASS holds a reason. Repeating the same command resumes an
interrupted create.
-Q/--request-path and -R/--result-path on add and create are integration
options for a durable proc: -Q reads an existing operation-request JSON file and
checks that its target and options match the command; -R writes the outcome of an
apply attempt as typed JSON, including blocked or failed attempts. --check writes no
result file. These companion files are unrelated to project sidecar repositories. When
the flags are omitted, SASE uses $SASE_PROC_REQUEST_PATH and $SASE_PROC_RESULT_PATH
if set; otherwise no request file is read or result file written. Ordinary interactive
commands do not need either flag.
sase project alias list [PROJECT] [-j|--json], add PROJECT ALIAS,
remove PROJECT ALIAS, and clear PROJECT manage ProjectSpec aliases. sase's TUI
Projects sub-tab (in the SASE Admin Center, opened with #) also displays aliases,
includes them in filtering, and opens an alias editor with A. Alias refs are accepted
in launch-bound VCS workspace tags, but prompt history, agent metadata, and artifacts
use the canonical directory-key project name. ProjectSpecs may also carry PROJECT_NAME
as the primary user-facing name. For example, the GitHub provider can create
PROJECT_NAME: foo and then PROJECT_NAME: foo_1 for distinct owner/foo repositories
while keeping stable canonical project records. Existing auto-aliased GitHub projects
remain valid and keep resolving through PROJECT_ALIASES.
Enabled-only true-project discovery is also the default for launch pickers, Patch
searches, project-local macro catalogs, broad mobile helper catalogs, and all-known bead
helper reads. Internal sibling backing records are hidden from those surfaces and
support configured linked repositories. Agents prepare one through /sase_repo; the
underlying audited open infers the host project and workspace from cwd. Agent-history
views that need older artifacts opt into all project states explicitly. An explicitly
typed known-project VCS ref is a launch-time exception: it re-enables a disabled project
before claiming a workspace. A checkout cwd or mobile project value is only
prompt-resolution context, not a workspace ref; without an explicit ref, a bare prompt
defaults to #git:home. Direct low-level claims against a disabled ProjectSpec remain
blocked until the project is enabled.
sase plan defaults to sase plan list. The dashboard has Proposed, Approved, and
Rejected sections; use repeatable -s/--status options to select sections, -n/--limit
to set each history section's size (0 is unlimited), and -t/--tier to filter by
plan-file tier. Proposed rows are never limited and are the actionable rows; each leads
with the plan name in bold cyan (shortest unique form, with the dim id_prefix below
it), plus agent, project, provider/model, plan path, and response directory. A hint line
under the section shows the ready-to-paste approve/reject commands for the first name.
Pass the plan name to sase plan approve <name> or sase plan reject <name> (a
<shard>/<name> path, filesystem path, plan: ref, planner agent, or notification
ID/prefix works too; names TAB-complete). Proposed --json rows carry the same name
field. If the selector is omitted, exactly one pending proposal must exist. When
--kind is omitted, approval defaults to tale; epic-authored plans require an
explicit --kind epic or --kind tale. The Rejected section is inferred from archived
proposal files that are not represented by the proposed or approved state; it is a
history aid, not the selector source for new actions. The approval kind is the workflow
choice: approve runs the coder without asking the runner to commit an SDD plan, tale
commits the plan as an SDD tale and then runs the coder, epic commits the matching SDD
tier and launches the bead follow-up, and commit records the approved plan in SDD
without launching a coder. Use -m/--model to pick the follow-up agent's model. Use
-p/--prompt to add extra coder instructions for the approve and tale paths. A plan
with no live gate can be named by path, plan: reference, archive name, or unavailable
gate ID: it is approved directly and starts a #coder in the planner's agent session
when it can safely attach, otherwise as a standalone agent. The coder launch runs a
ladder: it relocates to a pool workspace when the planner's workspace is taken, falls
back to standalone when the agent session cannot be joined, and retries once on
transient claim errors. Only unlaunchable-machine errors (missing owner identity,
unknown project tag, hard-disabled provider, or an unspawnable process) fail the launch.
On failure the card prints sase plan approve <local plan path> to re-run every
fallback and record the receipt. -n/--dry-run renders that decision without changing
state, and -P/--project supplies project context for the direct route. Re-approving an
already-approved plan relaunches its coder when that coder failed, was killed, or never
launched, and refuses when the coder is still running or has finished. Tale and epic
approvals validate against their target schema before writing a response; a failure
prints the diagnostics and expected schema and leaves the proposal pending for retry.
Plans can also declare typed choices and toggles as Plan Decisions. Ordinary approval
accepts their effective defaults; pass -D/--decide ID=VALUE to approve with different
values, or use sase gate answer with --set decision_<id>=<value> to override them on
a pending gate. See Plan Decisions for the grammar,
memory-consent rules, and current interface limits.
sase plan reject writes the rejection response first, then uses the same durable
cleanup path as the TUI no-feedback rejection action when the matching planner row is
still discoverable. If cleanup cannot find or kill the row, the CLI reports that
separately after the plan has already been rejected.
sase plan search [QUERY] searches plans in the resolved SDD store (the repo source)
and the machine-local ~/.sase/plans/ archive. Omit the query to browse with metadata
filters. Compact and Markdown output group SDD-store matches above local matches; JSON
and full output keep ranked result order with SDD-store matches prioritized over
otherwise-similar local matches. Useful filters include --kind, --status,
--source, --since, --until, --sort, and --format json|markdown for
agent-friendly output.
sase plan show [TARGET] resolves any way a user can name a plan to exactly one plan
and renders it. In -t auto (the default), TARGET is tried against five rungs in order
and the first definitive match wins: path (an existing file, absolute or
cwd-relative), ref (a plan: reference, a legacy marker path, or a month-drifted
reference, Rust resolved), proposal (any pending-plan selector approve/reject
accept: name, <shard>/<name>, planner agent, or notification id/prefix), name (a
corpus slug or <shard>/<slug> lookup, with or without .md), and bead (a bead id
whose design field points at a plan). Pass -t/--target to force one rung with no
fallthrough. Omit TARGET to show the sole visible pending plan proposal, exactly as
sase plan approve/reject treat an omitted selector. Every ambiguity prints its
candidates as re-runnable plan: references and every miss prints close-match
suggestions; neither guesses. -f/--format selects full (the default
section-structured detail view, matching the PLAN lane in sase's TUI), compact (the
same row sase plan search prints), json (a schema-versioned envelope), or raw (the
plan file's exact text, for piping). A plan that fails validation still renders in full
with its diagnostics shown and exits 0; only a missed, ambiguous, or unreadable target
exits 1. -w/--wrap controls goal/phase/diagnostics prose wrapping, and -c/--color
matches sase bead show.
sase plan validate PLAN_FILE reads the required tier: tale|epic property and
validates exactly one path without requiring a project or agent context. With Plan
Decisions, agent-context validation also checks memory selectors and human-request and
corrected-claim quotes; outside an agent, quote verification is deferred to proposal. It
reports every schema problem in one run and prints the expected tier schema plus a
minimal valid example on failure. Use -e/--explain for tier-specific authoring
guidance, -j/--json for the stable machine-readable envelope, or -q/--quiet to
suppress the successful human summary. A plan that has decisions also prints the
Decision Sheet after the result, and, when the live %auto spelling covers the plan's
tier, auto-approved: every decision takes its default. When the spelling does not
cover the tier, sase prints %auto:<mode> does not cover <tier> plans; this plan
waits for review instead. In --json mode stdout stays one JSON document: the sheet,
the %auto note, and the outside-agent quote-verification note live inside the
decisions envelope while the same human text goes to stderr. See the
validation output. The removed
-t/--tier option is now invalid command usage. A valid plan exits 0, a validation
failure exits 1, and invalid command usage exits 2.
Moved to Goals.
_[project]: A sase project is a named unit of work registered with SASE. _[workspace]: A sase workspace is a numbered clone of a project's primary repo, managed by the workspace store and tracked in that project's registry.json. _[agent]: A sase agent is an agent session or a single agent that does not belong to a session. _[prompt]: A prompt is the text SASE hands to a provider to start an agent turn. _[macro]: A macro is a reusable prompt triggered with #name in agent prompts. _[Patch]: A Patch is SASE's local unit of change. _[bead]: A bead is one tracked work item in SASE's git-native issue tracker. _[plan]: A plan is a persisted, approved artifact recording the intent behind agent work. _[TUI]: The TUI is SASE's terminal interface for running agents and reviewing results. _[epic]: An epic is an executable multi-phase plan run with sase bead work. _[gate]: A sase gate is a durable, command-backed request for one user decision, created when work must pause for the user. _[monitor]: A sase monitor is a monitor turn that runs one long command under a detached supervisor, so the command outlives the agent that started it. *[stitch]: A stitch is the lightweight ordered change record inside a Patch's STITCHES: section.