Configuration Reference¶
This document is the central reference for all sase configuration: config files, YAML sections, environment variables, and CLI flags.
Table of Contents¶
- Config File Location
- Deep-Merge System
- Configuration Sections
- amd_h1_title
- ace
- llm_provider
- commit
- linked_repos
- vcs_provider
- axe
- mentor_profiles
- metahooks
- xprompts
- xprompt_aliases
- use_chezmoi
- precommit_command
- timezone
- chat_install
- mobile_gateway
- sdd
- bead
- workspace
- telemetry
- Environment Variables
- CLI Flags
- Directory Sharding
Config File Location¶
All sase configuration lives under ~/.config/sase/. The base config file is:
~/.config/sase/sase.yml
Overlay files matching the glob ~/.config/sase/sase_*.yml are merged on top of the base file. A project-local
./sase.yml in the current working directory usually takes highest priority. The ACE TUI deliberately disables
project-local config loading for its own process so opening sase ace inside a repo does not inherit that repo's
agent-run settings. See Deep-Merge System below.
Deep-Merge System¶
Sase builds a merged configuration through five layers, each merged on top of the previous:
default_config.yml— bundled package defaults- Plugin
default_config.ymlfiles — from installed plugin packages (viasase_configentry points), sorted by entry-point name; lists concatenate sase.yml— user config (~/.config/sase/sase.yml); lists replace defaults (not concatenate)sase_*.ymloverlays — sorted alphabetically; lists concatenate- Local
sase.yml— project-level config in the current working directory; lists concatenate (highest priority)
This allows splitting configuration across multiple files (e.g., sase_work.yml, sase_personal.yml) without
duplication, plugins can provide sensible defaults that users can override, and individual projects can customize
behavior without changing global config.
Merge semantics:
| Type | Behavior |
|---|---|
| Dicts | Merged recursively (overlay keys override base keys). |
| Lists | Concatenated in layers 2, 4, and 5; replaced in layer 3 (user config). |
| Scalars | Override (overlay value replaces base value). |
For example, given a base file with two mentor profiles and an overlay or local project config that adds a third, the
merged result contains all three profiles. A user ~/.config/sase/sase.yml list replaces earlier defaults instead. If
two files define the same scalar key (e.g., axe.max_hook_runners), the later layer wins.
Source: src/sase/config/core.py
Configuration Sections¶
amd_h1_title¶
Opts a root into a generated AMD-managed AGENTS.md by providing the Markdown H1 title for that file.
amd_h1_title: "Structured Agentic Software Engineering (SASE) - Agent Instructions" # default: null
| Field | Type | Default | Description |
|---|---|---|---|
amd_h1_title |
string | null | null |
H1 title used by the AMD AGENTS.md generator when enabled for that scope. |
For ordinary project roots, this field is intentionally local to the root being initialized. The AMD generator reads
only that root's ./sase.yml value, so a global ~/.config/sase/sase.yml value does not opt every repository on the
machine into generated AGENTS.md files.
Home roots are the exception. When sase amd init targets the live home root, user config from
~/.config/sase/sase.yml and ~/.config/sase/sase_*.yml can provide the home AGENTS.md title. When it targets the
chezmoi home source root, source-side config under dot_config/sase/ is used instead. With use_chezmoi: true, AMD
initializes the chezmoi home source root rather than writing a live-home AGENTS.md.
Source: src/sase/default_config.yml, config/sase.schema.json
ace¶
Configures the ACE TUI behavior. Defaults are provided by src/sase/default_config.yml.
ace:
inactive_seconds: 600 # seconds before showing IDLE indicator (default: 600)
keymaps:
app:
next_changespec: "j"
prev_changespec: "k"
# ... all app-level keybindings are configurable
modes:
# Built-in modes (fold, copy, leader, bang) are configurable
leader_mode:
prefix: "comma"
keys:
repeat_last: "comma" # press the leader prefix, then this key; defaults render as `,,`
projects: "p"
temporary_llm_override: "o"
full_history_refresh: "y"
fold_mode:
prefix: "z"
keys:
cycle_commits: "c"
cycle_hooks: "h"
# Custom modes can be added here
my_mode:
prefix: ";"
keys:
run_tests:
key: "t"
shell: "just test"
| Field | Type | Default | Description |
|---|---|---|---|
inactive_seconds |
int | 600 |
Seconds of inactivity before the IDLE badge appears in the TUI top bar. |
keymaps |
dict | - | Configurable keybindings (see below). |
prompt_completion |
dict | see below | Live soft-completion settings for the ACE prompt input. |
repro_output_dir |
str | "" |
Base directory for Agents-tab reproduction bundles. Empty means <SASE_HOME>/repros (default ~/.sase/repros). |
snippets |
dict[string] | {} |
Trigger-word → template mappings for prompt input snippet expansion. |
The IDLE indicator can also be triggered manually via the leader-mode ,I keybinding. External tools can query idle
status via sase.ace.tui_activity.is_idle().
ace.keymaps¶
All TUI keybindings are configurable. The keymaps section has two sub-sections:
app — App-level keybindings. Each key is an action name mapped to a key string. See src/sase/default_config.yml
for the full list of configurable actions and their defaults.
modes — Prefix-key mode definitions. Built-in modes (fold_mode, copy_mode, leader_mode, bang_mode) can be
reconfigured, and custom modes can be added. Each mode has:
| Field | Type | Description |
|---|---|---|
prefix |
str | The activation key for the mode. |
keys |
dict | Sub-key definitions. For custom modes, each entry needs a key field and either shell or action. |
Custom mode key fields:
| Field | Type | Required | Description |
|---|---|---|---|
key |
str | yes | The sub-key to press after the prefix. |
shell |
str | no* | Shell command to execute. |
action |
str | no* | Built-in action name to invoke. |
*Exactly one of shell or action must be provided.
The keymap loader validates configuration: invalid keys are reverted to defaults, duplicate bindings are warned, and prefix conflicts between custom modes and app bindings are detected.
Source: src/sase/default_config.yml, src/sase/ace/tui/keymaps/
ace.snippets¶
Defines expandable text snippets for the prompt input widget. Each entry maps a trigger word to a template string. Press
Tab in the prompt input to expand the trigger word before the cursor.
ace:
snippets:
fix: "Please fix the following issue:\n$0"
review: "Review this code for correctness, performance, and style."
plan: "#plan\n$0"
Templates can contain $0 to mark where the cursor should be placed after expansion. If no $0 is present, the cursor
moves to the end of the expanded text. Templates can also splice another merged snippet with #[trigger]; use
#[trigger(value)] or #[trigger:value] to fill referenced $1, $2, ... tabstops before splicing.
See docs/ace.md — Snippets for usage details.
Source: src/sase/ace/tui/widgets/prompt_text_area.py
ace.prompt_completion¶
Controls automatic non-disruptive suggestions in the ACE prompt input. Suggestions appear in the prompt-bar subtitle and
are accepted with Ctrl+L; Enter still submits the prompt as typed. Manual Ctrl+T completion is independent of
these settings, and the Ctrl+R recursive fuzzy file finder is always manual.
ace:
prompt_completion:
auto: soft
debounce_ms: 90
auto_file_paths: false
auto_xprompt_menu: true
auto_directive_menu: true
max_auto_rows: 1
| Field | Type | Default | Description |
|---|---|---|---|
auto |
bool/string | soft |
Automatic mode. soft, true, on, yes, or 1 enable subtitle suggestions; false/off disables them. |
debounce_ms |
int | 90 |
Delay before computing a live suggestion after text or cursor changes. |
auto_file_paths |
bool | false |
Allow live suggestions to scan file-path candidates. Manual Ctrl+T file completion still works when false. |
auto_xprompt_menu |
bool | true |
Automatically open the xprompt/skill completion menu while typing matching #name, #!name, or /skill tokens. |
auto_directive_menu |
bool | true |
Automatically open the directive completion menu while typing matching %name tokens. |
max_auto_rows |
int | 1 |
Reserved row limit for automatic completion modes; current soft mode shows one suggestion. |
The #+query and first-character +query project/ChangeSpec picker uses the same completion panel but is triggered
directly by the + token; it is not disabled by auto_xprompt_menu. Manual Ctrl+T project/ChangeSpec completion
works regardless of these automatic-completion settings.
File-path completion roots relative lookups in the prompt-selected workspace. A resolvable #cd reference takes
precedence; without #cd, registered workspace-provider refs and known-project refs such as #git:<project> or
#gh:<owner>/<repo> can root lookup in that project checkout. If no prompt workspace ref resolves, lookups fall back to
the TUI process directory. These root rules are shared by live path suggestions, manual Ctrl+T path completion, and
the manual Ctrl+R recursive finder.
Source: src/sase/ace/tui/widgets/prompt_completion.py, src/sase/ace/tui/widgets/_prompt_soft_completion.py,
src/sase/ace/tui/widgets/prompt_completion_root.py, src/sase/ace/tui/widgets/recursive_file_finder.py
llm_provider¶
Configures which LLM backend sase uses and how model tiers map to concrete models. See docs/llms.md for the full LLM provider architecture, preprocessing pipeline, and invocation lifecycle.
llm_provider:
provider: claude # or "qwen", "opencode", "agy" (default: auto-detect)
worker_models:
claude: codex/gpt-5.5 # worker default when primary is on Claude
codex: claude/opus # worker default when primary is on Codex
model_tier_map:
large: opus
small: sonnet
model_aliases:
other: claude/opus
| Field | Type | Default | Description |
|---|---|---|---|
llm_provider.provider |
string | auto-detect | Which registered provider to use. Auto-detects by plugin-declared priority; built-ins default to claude → codex → qwen → opencode → agy. |
llm_provider.worker_models |
dict | unset | Optional worker-lane targets keyed by the effective primary lane. Values accept bare known models, aliases, or explicit provider/model. |
llm_provider.model_tier_map.large |
string | - | Model identifier for the large tier. |
llm_provider.model_tier_map.small |
string | - | Model identifier for the small tier. |
llm_provider.model_aliases |
dict | - | Model aliases usable from %model:<alias> / %m:<alias>. Values can be bare known models, explicit provider/model, or nested provider-local model paths. |
Model aliases are resolved when an agent launches, so reusable xprompts can point at names such as %model:other while
each user's sase.yml controls the concrete provider/model. Unknown aliases and unknown model values keep the existing
fallback behavior and run on the default provider.
The optional worker_models config defines the worker lane used by delegated work, currently including sase bead work
phase agents that do not have an explicit per-bead model. Entries are selected from the current effective primary lane
in this order: exact provider/model, bare model, then provider. Provider entries are defaults only and do not override
model-specific entries. When no entry matches, the worker lane follows the primary default lane: active primary
override, configured provider/tier, then provider auto-detection. See Worker Model for the full
precedence order and TUI behavior.
The alias name other is reserved: when a temporary LLM override is active (see
Temporary Default Override), %model:other resolves to the (provider, model)
that was the effective default immediately before the override was set, rather than to the static
model_aliases.other target. When no override is active, other falls back to the configured alias as usual.
The alias name worker is also reserved: %model:worker resolves through the worker lane and shadows any
model_aliases.worker entry.
The TUI also supports temporary session-level provider/model overrides that do not edit this config. Primary
overrides are persisted to ~/.sase/llm_override.json; worker overrides are persisted to
~/.sase/llm_worker_override.json. Expired entries are deleted on next read. See
docs/llms.md for the resolution order, state-file format, and precedence relative
to SASE_MODEL_TIER_OVERRIDE.
llm_provider.retry¶
Per-provider retry and fallback configuration. See docs/llms.md for the full retry flow and TUI display.
llm_provider:
retry:
claude:
max_retries: 3
error_patterns:
- "API Error: 500"
wait_times: [60, 300, 1800]
fallback_model: "sonnet"
continuation_prompt: "Please continue from the last preserved work."
preserve_workspace: true
spawn_new_agent: false
| Field | Type | Default | Description |
|---|---|---|---|
llm_provider.retry.<provider> |
dict | - | Retry config for a specific provider (e.g., agy, claude, codex). |
llm_provider.retry.<provider>.max_retries |
int | 0 |
Maximum retry attempts. 0 disables retrying. |
llm_provider.retry.<provider>.error_patterns |
list | [] |
Case-insensitive substring patterns matched against error output. |
llm_provider.retry.<provider>.wait_times |
list | [30] |
Per-retry wait times in seconds. Last value reused if list is shorter. |
llm_provider.retry.<provider>.fallback_model |
str | null |
Alternate model to use after exhausting all retries. |
llm_provider.retry.<provider>.continuation_prompt |
str | null |
Prompt text prepended when continuing after a retryable failure. |
llm_provider.retry.<provider>.preserve_workspace |
bool | false |
Preserve on-disk edits across legacy in-process retry attempts. |
llm_provider.retry.<provider>.spawn_new_agent |
bool | false |
Retry by launching a fresh detached agent that inherits the workspace. |
Configured retry policy is merged with provider-supplied retry defaults when a provider declares them. For list fields
such as error_patterns, built-in patterns are kept and configured patterns are appended with duplicates removed.
Claude's provider hook adds workspace-preserving matching for context-limit, socket-close, and Claude CLI API-error
output, plus a continuation nudge. Those hook defaults are merged with the bundled Claude policy in
default_config.yml, so the configured wait times and fallback model still apply unless you override them.
Source: src/sase/llm_provider/retry_config.py, src/sase/llm_provider/config.py
commit¶
Configures commit enforcement around SASE-launched agents. The current commit finalizer is provider-neutral and runs in
the shared LLM invocation layer after a successful provider invocation in a SASE agent session, identified by
SASE_AGENT_TIMESTAMP.
commit:
finalizer:
enabled: true
max_passes: 2
| Field | Type | Default | Description |
|---|---|---|---|
commit.finalizer.enabled |
bool | true |
Run the post-invocation commit finalizer for SASE-launched agent sessions. |
commit.finalizer.max_passes |
int | 2 |
Maximum follow-up invocations before a still-dirty enforced workspace fails the run. |
When enabled, the finalizer checks the main workspace through the active VCS provider. For configured linked_repos Git
worktrees using the numbered-workspace strategy, it checks only linked-repo names recorded in the run's
opened_linked_workspaces.json artifact, normally written by
sase workspace open -p <linked_repo> -r "<reason>" <workspace_num> during the agent run. In that command,
-p/--project names the configured linked repo's hidden backing project record. Dirty enforced workspaces trigger a
follow-up invocation that instructs the same provider to use the appropriate commit skill. Dirty static linked repos
(workspace.strategy: none) are reported to that follow-up as advisory work and do not fail the finalizer if they
remain dirty. Advisory-only static linked-repo changes still get one follow-up prompt so the agent can commit them when
it made those changes. When the only enforced change is one tracked markdown file under sdd/tales/, sdd/epics/,
sdd/legends/, or sdd/myths/, and that file's only diff is leading front matter changing exactly from status: wip
to status: done, the finalizer creates a direct chore: Mark SDD plan done commit instead of invoking the provider
again. When $SASE_ARTIFACTS_DIR is set, each pass writes prompt/response artifacts there, and the final outcome is
recorded in commit_finalizer_result.json.
Set SASE_DISABLE_COMMIT_STOP_HOOK=1 for a one-off bypass. The environment variable name is historical; it now disables
the provider-neutral finalizer.
Source: src/sase/llm_provider/commit_finalizer.py, src/sase/commit_instructions.py
linked_repos¶
Declares related repositories that should be visible to launched agents. Git linked-repo worktrees using numbered
workspace resolution are also eligible for commit-finalizer checks at their resolved workspace_dir, but only after the
agent run opens that linked workspace with sase workspace open -p <linked_repo> -r "<reason>" <workspace_num> and
records the linked repo in its artifacts. The -p/--project value is the linked repo's configured name; SASE
materializes a hidden sibling-state ProjectSpec for that name when needed. Entries can live in user config or a
project-local sase.yml; local entries are resolved relative to the project's primary workspace directory.
The deprecated sibling_repos key is still accepted as an alias during the compatibility window. Prefer linked_repos
in new config.
linked_repos:
- name: core
path: ../sase-core
description: Shared backend/domain behavior used by SASE frontends.
- name: github
path: ../sase-github
description: GitHub VCS and workspace provider plugin.
- name: chezmoi
path: ~/.local/share/chezmoi
description: User dotfiles source managed by chezmoi.
workspace:
strategy: none
| Field | Type | Default | Description |
|---|---|---|---|
linked_repos[].name |
string | required | Stable alias used in generated environment variable names and memory summaries. |
linked_repos[].path |
string | required | Primary checkout path. Relative paths resolve from the project's primary workspace. |
linked_repos[].description |
string | required | Human-readable purpose used when generating agent memory for the linked repository. |
linked_repos[].workspace.strategy |
string | "suffix" |
suffix exposes a workspace-matched checkout for workspace N; none always exposes the primary checkout. |
For suffix linked repos, workspace numbers 0 and 1 use the primary checkout. Higher workspace numbers use
workspace-matched linked-repo checkouts, materializing the checkout through the same workspace.root policy when the
workspace provider can do so. With explicit workspace.root: adjacent that path is a legacy adjacent checkout such as
sase-core_10; with the default xdg-state it lives under the managed state root. Linked repos with
workspace.strategy: none are exposed to agents and can appear as advisory dirty targets in commit finalizer prompts,
but they are not commit-finalizer enforcement targets. SASE passes the resolved paths into environment variables and
agent metadata:
| Variable | Description |
|---|---|
SASE_LINKED_REPOS_JSON |
JSON metadata for all resolved linked repos. |
SASE_LINKED_REPO_<ENV_NAME>_DIR |
Workspace-matched directory for a linked repo. |
SASE_LINKED_REPO_<ENV_NAME>_PRIMARY_DIR |
Primary checkout directory for that linked repo. |
The legacy SASE_SIBLING_REPOS_JSON and SASE_SIBLING_REPO_<ENV_NAME>_* variables are still emitted alongside the
canonical ones during the compatibility window.
<ENV_NAME> is the uppercased, sanitized repo name; duplicates are uniquified with a numeric suffix.
Source: src/sase/linked_repos.py, src/sase/agent/launch_spawn.py
vcs_provider¶
Configures the version control system backend. See docs/vcs.md for the full VCS provider reference including per-command behavior, Git/Mercurial details, and troubleshooting.
vcs_provider:
provider: auto # "git", "hg", or "auto" (default: "auto")
workspace_root: ~/workspace # optional workspace root directory
default_hooks: # optional list overriding built-in default hooks
- "!$my_presubmit"
- "$my_lint"
pr_tags: # optional key-value tags appended to PR commit messages
Bug: "b/12345"
use_project_pr_prefix: false # prepend [<project>] to PR titles (default: false)
| Field | Type | Default | Description |
|---|---|---|---|
vcs_provider.provider |
string | "auto" |
VCS provider: "git", "hg", or "auto" for directory detection. |
vcs_provider.workspace_root |
string | - | Legacy VCS helper workspace root. New numbered-checkout layout is configured by workspace.root below. |
vcs_provider.default_hooks |
list[string] | - | Hook commands added to new ChangeSpecs. Replaces built-in defaults. |
vcs_provider.pr_tags |
dict[string, str] | {} |
Key-value tags appended as TAG=VALUE lines to PR commit messages. |
vcs_provider.use_project_pr_prefix |
bool | false |
Prepend [<project>] to PR titles / CL descriptions (see below). |
When default_hooks is not set, plugins may provide their own defaults via default_config.yml (for example,
Mercurial-specific hooks from a provider plugin). The core sase package has no built-in default hooks.
When use_project_pr_prefix is true, a [<project>] prefix is prepended to PR titles (GitHub) or CL descriptions
(Mercurial) without polluting the ChangeSpec DESCRIPTION or git commit message. The prefix is automatically stripped
when reading descriptions back.
Source: src/sase/vcs_provider/config.py, src/sase/ace/hooks/defaults.py
axe¶
Configures the sase axe lumberjack-based daemon. The axe architecture uses an orchestrator that spawns multiple
lumberjacks, each running a set of chops on a fixed interval. Defaults are provided by src/sase/default_config.yml.
axe:
max_hook_runners: 3 # concurrent hook runners (default: 3)
max_agent_runners: 3 # concurrent agent runners (default: 3)
zombie_timeout_seconds: 7200 # seconds (default: 7200 = 2 hours)
query: "" # query filter for ChangeSpecs (default: all)
chop_script_dirs: [] # additional directories to search for chop scripts
lumberjacks:
hooks:
interval: 5
chop_timeout: "90s"
chops:
- name: hook_checks
description: Complete finished hooks and start stale ones, with zombie detection
- name: mentor_checks
description: Start mentor workflows once all hook prerequisites are met
- name: workflow_checks
description: Complete finished CRS/fix-hook workflows and start stale ones
- name: pending_checks_poll
description: Poll background is_cl_submitted and critique_comments checks for results
- name: comment_zombie_checks
description: Mark comment threads older than zombie_timeout as ZOMBIE
- name: suffix_transforms
description: Strip stale suffixes from older proposals and update mail-readiness markers
- name: orphan_cleanup
description: Release workspace claims orphaned by reverted CLs with dead PIDs
waits:
interval: 10
chops:
- name: wait_checks
description: Resolve successful agent wait dependencies and write ready.json
checks:
interval: 300
chops:
- name: cl_submitted_checks
description: Check if CLs have been submitted
- name: stale_running_cleanup
description: Clean up stale RUNNING entries
comments:
interval: 60
chops:
- name: comment_checks
description: Check for new comments on CLs
housekeeping:
interval: 3600
chops:
- name: error_digest
description: Summarize recent errors into a notification
Top-level fields:
| Field | Type | Default | Description |
|---|---|---|---|
max_hook_runners |
int | 3 |
Maximum concurrent hook runners (non-$ hooks) across all ChangeSpecs. |
max_agent_runners |
int | 3 |
Maximum concurrent agent runners (agents and mentors) across all ChangeSpecs. |
zombie_timeout_seconds |
int | 7200 |
Seconds after which a running hook or workflow is flagged as a zombie. |
query |
string | "" |
Query string for filtering ChangeSpecs (empty = all). |
chop_script_dirs |
list[string] | [] |
Additional directories to search for external chop scripts. |
lumberjack_log_max_bytes |
int | 52428800 |
Maximum bytes retained for each bounded lumberjack log. |
verbose_lumberjack_diagnostics |
bool | false |
Include verbose diagnostics in chop script context JSON. |
lumberjacks |
dict | - | Mapping of lumberjack name → config (see below). |
Lumberjack fields (per entry under lumberjacks):
| Field | Type | Default | Description |
|---|---|---|---|
interval |
int | 1 |
Seconds between chop polling cycles. |
chop_timeout |
string | - | Default duration limit for each chop in this lumberjack, such as "90s" |
chops |
list[string|object] | [] |
List of chops to run on each cycle (see below). |
Chop fields (per entry under chops):
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | yes | - | Chop name identifying the chop script to run. |
description |
string | yes | - | Human-readable description of what the chop does. |
agent |
string | no | null |
XPrompt reference to launch as a background agent (accepts legacy xprompt key). |
run_every |
string | no | - | Time-based duration string (e.g., "60m", "30s", "2h"). Limits how often the chop runs. |
timeout |
string | no | - | Per-chop duration limit. Overrides the lumberjack-level chop_timeout when set. |
env |
dict[string] | no | {} |
Environment variables passed to the chop script subprocess. |
On a scheduled lumberjack tick, script chops remain concurrent, but configured agent chops launch sequentially in config
order. This prevents same-tick run_every agent chops from racing while they allocate workspaces. A manual
sase axe chop run <agent-chop> still launches only that one agent chop.
The built-in wait_checks chop writes ready.json only after named %wait dependencies complete successfully. Failed,
killed, crashed, still-running, malformed, or missing done.json artifacts do not satisfy the dependency.
Each chop entry can also be a plain string (chop name only, legacy format):
chops:
# Object format (required for new chops)
- name: hook_checks
description: Check for completed or failed hooks
- name: custom_chop
description: Run custom analysis
agent: "#analyze"
run_every: "5m"
env:
MY_API_KEY: "secret"
# String format (legacy, description defaults to empty)
- hook_checks
CLI flags on sase axe start override max_hook_runners, max_agent_runners, zombie_timeout_seconds, and query
for a single run (see CLI Flags).
Source: src/sase/axe/config.py, src/sase/default_config.yml
mentor_profiles¶
Defines mentor agents that run automated code reviews when a ChangeSpec's diff, changed files, or amend notes match configurable criteria. Each profile groups one or more mentors with shared matching rules. See docs/mentors.md for the full mentor system reference.
mentor_profiles:
- profile_name: python_review
file_globs:
- "*.py"
mentors:
- mentor_name: style_checker
role: "Python style expert"
focus_areas:
- focus_name: style
description: "PEP 8 compliance and code style"
- focus_name: naming
description: "Variable and function naming conventions"
- profile_name: first_commit_review
first_commit: true
mentors:
- mentor_name: architecture
role: "Software architect"
focus_areas:
- focus_name: design
description: "Overall design and architectural patterns"
Profile fields:
| Field | Type | Required | Description |
|---|---|---|---|
profile_name |
string | yes | Unique name identifying this profile. |
mentors |
list | yes | List of mentor definitions (see below). |
file_globs |
list[string] | no* | Glob patterns matched against changed file paths. |
diff_regexes |
list[string] | no* | Regex patterns matched against the diff content. |
amend_note_regexes |
list[string] | no* | Regex patterns matched against commit/amend notes. |
first_commit |
bool | no | If true, match only on the first commit of a ChangeSpec. |
projects |
list[string] | no | Only match ChangeSpecs in these projects. Auto-set for local sase.yml profiles. |
*At least one of file_globs, diff_regexes, amend_note_regexes, or first_commit must be provided per profile.
Mentor fields:
| Field | Type | Required | Description |
|---|---|---|---|
mentor_name |
string | yes | Unique name identifying this mentor within its profile. |
role |
string | yes | Role or persona for the mentor (e.g., "Security reviewer"). |
focus_areas |
list[object] | yes | List of review focus areas (see below). |
Focus area fields:
| Field | Type | Required | Description |
|---|---|---|---|
focus_name |
string | yes | Short name for this focus area (e.g., "correctness"). |
description |
string | yes | Description of what this focus area reviews. |
Mentors run automatically on ChangeSpecs with Ready or Mailed status when their matching criteria are met. Mentor
comments are structured JSON with severity levels (error, warning, suggestion) that can be reviewed and applied through
the ACE TUI's Mentor Review modal (,m).
Source: src/sase/config/mentor.py
metahooks¶
Metahooks intercept failing hooks before the summarize agent runs. They match based on the hook command (substring match) and the hook output (regex match). When a metahook matches, it can trigger specialized handling instead of the default summarization.
metahooks:
- name: scuba
hook_command: sase_hg_presubmit
output_regex: "SCUBA_ERROR.*timeout"
- name: flaky_test
hook_command: blaze test
output_regex: "FLAKY"
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Unique identifier for this metahook. |
hook_command |
string | yes | Substring matched against the executed hook command. |
output_regex |
string | yes | Regex pattern matched against hook output (multiline). |
Source: src/sase/config/metahook.py
xprompts¶
Defines reusable prompt snippets that can be referenced with #name syntax in any prompt. Supports both simple string
content and structured definitions with typed inputs and Jinja2 templates.
xprompts:
# Simple string format
greeting: "Hello, please review this code."
# Structured format with inputs
review:
input:
language: word
strict: { type: bool, default: false }
content: "Review this {{ language }} code.{{ ' Be strict.' if strict }}"
# With tags for semantic role lookup
my_crs:
content: "Summarize the code review..."
tags: [crs]
Xprompts defined in sase.yml are priority 6 out of 9 in the resolution order:
.xprompts/*.md(CWD, hidden directory)xprompts/*.md(CWD)~/.xprompts/*.md(home, hidden directory)~/xprompts/*.md(home)~/.config/sase/xprompts/{project}/*.md(project-specific)sase.ymlxprompts:section (local./sase.ymloverrides global; see Deep-Merge System)- Plugin packages (via
sase_xpromptsentry points) <sase_package>/default_xprompts/*.md(built-in default markdown xprompts)<sase_package>/xprompts/*.md(built-in package xprompts)
Earlier sources win on name conflicts. File-based xprompts use YAML front matter for metadata and the file body for content.
Source: src/sase/xprompt/loader.py
xprompt_aliases¶
Defines raw text-level alias substitutions that are applied before any xprompt processing. This is useful for creating shorthand references where the alias must be present in the raw text for other processing logic (such as VCS directory-switching) to work correctly.
xprompt_aliases:
c: commit # #c → #commit
p: propose # #p → #propose
gh_sase: "gh:sase" # #gh_sase → #gh:sase
gh_foo: "gh:foo/bar" # #gh_foo → #gh:foo/bar
| Field | Type | Default | Description |
|---|---|---|---|
xprompt_aliases |
dict[string] | {c: commit, p: propose} |
Mapping of alias name → target. Applied as text substitution |
The built-in defaults provide #c as a shorthand for #commit and #p for #propose. Additional aliases can be added
in user config files.
Each entry maps an alias name to a target string. When the processor encounters #alias_name in a prompt, it replaces
it with #target before any other xprompt resolution occurs. Only #-prefixed references are substituted; the alias
name must match [a-zA-Z_][a-zA-Z0-9_]*.
Source: src/sase/xprompt/processor.py
use_chezmoi¶
Enables chezmoi-aware home-file writes. When set to true, SASE writes generated home instructions, memory, skills, and
home-directory xprompt paths through the chezmoi source tree under ~/.local/share/chezmoi/home/ instead of writing the
live home files directly. For example, ~/.xprompts/ is remapped to ~/.local/share/chezmoi/home/dot_xprompts/.
This affects initialization workflow as well as xprompt editing. sase amd init targets the chezmoi home source root
when it needs to initialize home-level AGENTS.md; sase memory init writes home memory there and may run the
configured chezmoi deploy path; sase skill init writes provider skill files there before optional commit, push, and
apply steps.
Home-level AMD provider shims in the chezmoi source are managed as *.md.tmpl files containing
@{{ .chezmoi.homeDir }}/AGENTS.md, so deployed provider files render to absolute home imports on each machine.
use_chezmoi: true # default: false
| Field | Type | Default | Description |
|---|---|---|---|
use_chezmoi |
bool | false |
Write home-managed SASE files through the chezmoi source directory. |
Source: src/sase/config/core.py
precommit_command¶
A shell command to run before commits (e.g., linting, formatting). If set, the commit workflow executes this command before creating a commit. An empty string (the default) means no precommit command is run.
precommit_command: "just fix" # default: ""
| Field | Type | Default | Description |
|---|---|---|---|
precommit_command |
string | "" |
Shell command to run before commits. Empty string means disabled. |
Source: src/sase/default_config.yml, src/sase/workflows/commit/workflow.py
timezone¶
The timezone used for formatting timestamps in notifications, agent logs, and TUI displays.
timezone: "America/New_York" # default: "America/New_York"
| Field | Type | Default | Description |
|---|---|---|---|
timezone |
string | "America/New_York" |
IANA timezone name for timestamp display. |
chat_install¶
Configuration for chat-driven update workflows. External chat integrations can call
sase.integrations.chat_install.start_chat_install_worker() to run the configured command in a detached worker while
briefly stopping axe, syncing the registered primary workspace for the sase project, and restarting axe afterward.
chat_install:
command: "" # default: disabled
sync_workspace: true
timeout_seconds: 900
restart_attempts: 3
| Field | Type | Default | Description |
|---|---|---|---|
chat_install.command |
string | "" |
Shell command to run from the registered sase primary workspace. Empty string disables use. |
chat_install.sync_workspace |
bool | true |
Sync the registered sase primary workspace via the selected VCS provider before updating. |
chat_install.timeout_seconds |
int | 900 |
Maximum runtime for the update command before returning exit code 124. |
chat_install.restart_attempts |
int | 3 |
Number of axe restart attempts after the update command completes/fails. |
Only one chat update worker may run at a time; a lock under ~/.sase/chat_install/install.lock rejects concurrent
starts. Worker output is written to timestamped logs under ~/.sase/chat_install/logs/. The configuration key and state
paths remain named chat_install for compatibility. See docs/integrations.md
for the integration-facing Python API.
Source: src/sase/default_config.yml, src/sase/integrations/chat_install.py
mobile_gateway¶
Configuration for sase mobile gateway start, which launches the workstation-hosted Rust gateway for paired mobile
clients.
mobile_gateway:
bind_address: "127.0.0.1"
port: 7629
state_dir: ""
allow_non_loopback: false
command: ""
push_provider: "disabled"
fcm_project_id: ""
fcm_service_account_json: ""
fcm_credential_env: ""
fcm_dry_run: false
push_timeout_seconds: 5
push_retry_limit: 1
startup_timeout_seconds: 10
| Field | Type | Default | Description |
|---|---|---|---|
mobile_gateway.bind_address |
string | "127.0.0.1" |
Host address to bind. Non-loopback values require explicit opt-in. |
mobile_gateway.port |
int | 7629 |
Gateway HTTP port. |
mobile_gateway.state_dir |
string | "" |
SASE state root for gateway storage. Empty uses the Rust gateway default. |
mobile_gateway.allow_non_loopback |
bool | false |
Allow LAN or tailnet binds after explicit user opt-in. |
mobile_gateway.command |
string | "" |
Gateway binary command override, parsed without a shell. |
mobile_gateway.push_provider |
string | "disabled" |
Push provider: disabled, test, or fcm. |
mobile_gateway.fcm_project_id |
string | "" |
Firebase project ID for FCM HTTP v1. |
mobile_gateway.fcm_service_account_json |
string | "" |
Local service-account JSON path. Do not commit this file. |
mobile_gateway.fcm_credential_env |
string | "" |
Env var containing an FCM bearer token or service-account JSON. |
mobile_gateway.fcm_dry_run |
bool | false |
Ask FCM to validate messages without delivering them. |
mobile_gateway.push_timeout_seconds |
float | 5 |
Timeout per push provider HTTP attempt. |
mobile_gateway.push_retry_limit |
int | 1 |
Retry attempts for best-effort push delivery. |
mobile_gateway.startup_timeout_seconds |
float | 10 |
Seconds to wait for gateway readiness before exiting. |
Push payloads are hint-only and must not contain bearer tokens, pairing codes, prompt bodies, response text, attachment
contents, attachment tokens, or host paths. Only credential paths or environment-variable names are placed on the
gateway command line. See docs/mobile_gateway.md for setup examples and security
notes.
Source: src/sase/default_config.yml, src/sase/integrations/mobile_gateway.py
sdd¶
Configuration for spec-driven development features, including prompt, tale, epic, legend, myth, research, and bead storage.
sdd:
version_controlled: false # default: false
| Field | Type | Default | Description |
|---|---|---|---|
sdd.version_controlled |
bool | false |
For non-bare-git projects, store SDD artifacts and beads under sdd/ in the project repo instead of .sase/sdd/ in the primary workspace. |
When enabled, prompt snapshots, tales, epics, legends, myths, research notes, and the bead database directory are placed
in the project root so they can be committed with the code. When disabled, SDD writes to a standalone .sase/sdd/ git
repo in the primary workspace for providers that support local SDD mode. Projects resolved as the built-in bare_git
VCS provider always use version-controlled SDD under sdd/, even if this option is false. See docs/sdd.md
for storage behavior and docs/beads.md for the bead system reference.
Built-in bare-git projects also auto-create or refresh generated SDD guide files during first-use #git:<project>
initialization, existing bare-repo registration, #git/workspace materialization, and the first version-controlled SDD
write. Setup/materialization flows commit and push only those generated init paths with an Initialize SDD init commit
when needed.
Running sase sdd init or its sase init sdd alias is an explicit non-bare-git opt-in: it creates or updates the
project-local sase.yml so sdd.version_controlled is true, then refreshes generated SDD guide files and the directory
map.
Source: src/sase/default_config.yml
bead¶
Configuration for the bead issue tracker.
bead:
push_after_commit: true # default: true (also accepts false or async)
| Field | Type | Default | Description |
|---|---|---|---|
bead.push_after_commit |
bool or str | true |
Controls the post-commit git push after sase bead work. true pushes synchronously (failures only warn); false skips the push; async launches a detached background push and returns immediately, logging the result to a file. sase bead work --no-push overrides this per-invocation. |
Set to false for local-only checkouts, or when you would rather batch the bead-launch commit with later commits before
pushing. Set to async to keep auto-pushing without blocking the command on remote network/credential latency. See
docs/beads.md for the full sase bead work flow.
Source: src/sase/default_config.yml
workspace¶
Controls how SASE chooses the physical location of managed workspace checkouts. See
docs/workspace.md for the directory-layout reference and CLI workflows.
workspace:
root: xdg-state # "xdg-state", "adjacent", or an absolute path
project_key: "" # explicit project-key override; empty = derive from git remote / primary path
cleanup_ttl_days: 14 # age threshold for `sase workspace cleanup --stale`
| Field | Type | Default | Description |
|---|---|---|---|
workspace.root |
string | "xdg-state" |
Root policy. "xdg-state" uses the platform state dir; "adjacent" keeps the legacy <primary>_<num>/ layout as an explicit opt-in; an absolute path is used as the managed-root base. SASE_WORKSPACE_ROOT overrides this base directory. |
workspace.project_key |
string | "" |
Override the per-project namespace under managed roots. Empty derives a stable key from a single git remote slug or the primary-path basename plus a short hash. |
workspace.cleanup_ttl_days |
int | 14 |
Minimum age (in days) of an unclaimed managed checkout before sase workspace cleanup --stale will remove it. |
Platform defaults for the xdg-state policy:
| Platform | Managed root |
|---|---|
| Linux | $XDG_STATE_HOME/sase/workspaces (falls back to ~/.local/state/sase/workspaces) |
| macOS | ~/Library/Application Support/sase/workspaces |
| Windows | %LOCALAPPDATA%\sase\workspaces |
Numeric identity is the same on every root policy: #0 is the primary checkout, #1–#9 are reserved, and managed
claim workspaces start at #10. See docs/workspace.md for the full identity model
and backup/container/NFS caveats.
For non-adjacent policies, physical checkouts live under <managed-root>/<project_key>/<project>_<num>/. For example,
workspace.root: /mnt/sase-workspaces with project key github.com_org_repo places workspace #10 at
/mnt/sase-workspaces/github.com_org_repo/<project>_10/. When SASE_WORKSPACE_ROOT is set, it supplies the same
<managed-root> base for the process.
Existing adjacent checkouts are not moved automatically by the default. Run sase workspace migrate --to xdg-state to
carry legacy <primary>_<num>/ directories into the managed root, or set workspace.root: adjacent explicitly to keep
the old sibling layout.
sase workspace open NUM -r "<reason>" is an explicit preparation command for a checkout you plan to use outside a
normal sase run launch. It uses the same root policy when it materializes the checkout, backs up uncommitted local
changes through the active VCS provider, cleans the checkout, checks out and syncs the provider default parent revision,
and prints the resulting path. For manual scratch work, choose a claim-range number such as 10; #0 is the primary
checkout and #1 through #9 are reserved compatibility numbers.
Source: src/sase/default_config.yml, src/sase/workspace_provider/store.py
telemetry¶
Configures Prometheus-based telemetry for monitoring sase internals. See docs/telemetry.md for the full telemetry reference including CLI commands, metric catalog, and monitoring stack setup.
telemetry:
enabled: false
prometheus:
exposition_port: 9464
pushgateway_url: "localhost:9091"
health_thresholds:
error_rate_warn: 10.0
error_rate_critical: 25.0
retry_rate_warn: 10.0
retry_rate_critical: 25.0
p95_latency_warn: 300.0
p95_latency_critical: 600.0
| Field | Type | Default | Description |
|---|---|---|---|
telemetry.enabled |
bool | false |
Enable or disable telemetry globally. |
telemetry.prometheus.exposition_port |
int | 9464 |
HTTP server port for metric exposition. |
telemetry.prometheus.pushgateway_url |
str | localhost:9091 |
Prometheus Push Gateway address. |
telemetry.health_thresholds.error_rate_warn |
float | 10.0 |
Error rate % threshold for WARN health status. |
telemetry.health_thresholds.error_rate_critical |
float | 25.0 |
Error rate % threshold for CRITICAL status. |
telemetry.health_thresholds.retry_rate_warn |
float | 10.0 |
Retry rate % threshold for WARN health status. |
telemetry.health_thresholds.retry_rate_critical |
float | 25.0 |
Retry rate % threshold for CRITICAL status. |
telemetry.health_thresholds.p95_latency_warn |
float | 300.0 |
P95 latency threshold (seconds) for WARN status. |
telemetry.health_thresholds.p95_latency_critical |
float | 600.0 |
P95 latency threshold (seconds) for CRITICAL. |
Source: src/sase/default_config.yml, src/sase/telemetry/_config.py
Environment Variables¶
LLM Provider¶
| Variable | Description |
|---|---|
SASE_MODEL_TIER_OVERRIDE |
Force all LLM invocations to a specific tier (large or small). |
SASE_MODEL_SIZE_OVERRIDE |
Legacy alias for SASE_MODEL_TIER_OVERRIDE (big or little). |
SASE_LLM_LARGE_ARGS |
Extra CLI args appended for large tier invocations (any provider). |
SASE_LLM_SMALL_ARGS |
Extra CLI args appended for small tier invocations (any provider). |
SASE_CLAUDE_LARGE_ARGS |
Claude-specific extra args for large tier (fallback if generic unset). |
SASE_CLAUDE_SMALL_ARGS |
Claude-specific extra args for small tier (fallback if generic unset). |
SASE_CODEX_PATH |
Path to the Codex CLI binary (default: PATH lookup, then NVM_BIN/codex). |
SASE_CODEX_LARGE_ARGS |
Codex-specific extra args for large tier (fallback if generic unset). |
SASE_CODEX_SMALL_ARGS |
Codex-specific extra args for small tier (fallback if generic unset). |
SASE_CODEX_DISABLE_SHADOW_HOME |
Set to 1 to launch Codex with the inherited CODEX_HOME. |
SASE_QWEN_PATH |
Path to the Qwen Code CLI binary (default: qwen). |
SASE_QWEN_LARGE_ARGS |
Qwen-specific extra args for large tier (fallback if generic unset). |
SASE_QWEN_SMALL_ARGS |
Qwen-specific extra args for small tier (fallback if generic unset). |
SASE_OPENCODE_PATH |
Path to the OpenCode CLI binary (default: opencode). |
SASE_OPENCODE_LARGE_ARGS |
OpenCode-specific extra args for large tier (fallback if generic unset). |
SASE_OPENCODE_SMALL_ARGS |
OpenCode-specific extra args for small tier (fallback if generic unset). |
SASE_AGY_PATH |
Path to the Antigravity CLI binary (default: agy). |
SASE_AGY_PRINT_TIMEOUT |
Override the agy --print-timeout Go duration (default: 24h). |
SASE_AGY_MAX_NO_PROGRESS_CONTINUATIONS |
Override the no-progress continuation cap (default: 2). |
SASE_AGY_LARGE_ARGS |
Antigravity-specific extra args for large tier (fallback if generic unset). |
SASE_AGY_SMALL_ARGS |
Antigravity-specific extra args for small tier (fallback if generic unset). |
For the per-provider args, the generic SASE_LLM_*_ARGS variables are checked first. If unset, the provider-specific
variable is used as a fallback. Values are split on whitespace and appended to the CLI command.
SASE-launched Codex subprocesses use a disposable shadow CODEX_HOME by default. The shadow home is created under
~/.cache/sase/codex_home/, receives a copy of the real config.toml, symlinks other Codex home entries back to the
real home, and is removed when the subprocess exits. If the real Codex home does not provide AGENTS.override.md or
AGENTS.md, SASE also links ~/AGENTS.md into the shadow as Codex's $CODEX_HOME/AGENTS.md fallback. This prevents
Codex runtime config rewrites from dirtying the user-managed Codex config while preserving auth, hooks, skills, logs,
and caches.
Qwen Code uses qwen --input-format text --output-format stream-json --yolo --model <model> and expects users to
configure Qwen auth through Qwen's supported settings path. Qwen OAuth free tier access ended on 2026-04-15; use API
keys, Alibaba Cloud Coding Plan, OpenRouter, Fireworks, or another Qwen-supported provider.
OpenCode uses opencode run --format json --dangerously-skip-permissions --model <provider/model> --dir <cwd> <prompt>
and expects users to configure OpenCode auth/settings through its normal XDG paths. OpenCode model names usually include
a provider prefix; use opencode models to list models in your configured environment.
VCS Provider¶
| Variable | Description |
|---|---|
SASE_VCS_PROVIDER |
Override VCS provider selection (git, hg, or auto). |
SASE_WORKSPACE_ROOT |
Override the workspace-root base for this process. Use an absolute path; WorkspaceStore appends <project_key>/<project>_<num>/ for managed checkouts. |
SASE_BUG_ID |
Bug ID for PR workflows. When set and non-zero, injects BUG=<id> into PR tags and ChangeSpec. |
SASE_BEAD_ID |
Bead ID for commit workflows. When set, sase commit automatically tags the commit message. |
SASE_DISABLE_COMMIT_STOP_HOOK |
Disable commit finalization for this process. |
SASE_LINKED_REPOS_JSON |
Resolved linked-repo metadata passed to launched agents. |
SASE_LINKED_REPO_<ENV_NAME>_DIR |
Workspace-matched directory for one configured linked repo. |
Plugin System¶
These switches affect plugin-provided resource loading. The VCS, workspace, and LLM provider registries load provider entry points directly.
| Variable | Description |
|---|---|
SASE_DISABLE_PLUGINS |
Disable plugin-provided xprompts, workflows, and config defaults. |
SASE_DISABLE_PLUGIN_XPROMPTS |
Disable plugin-provided xprompt and workflow files. |
SASE_DISABLE_PLUGIN_CONFIG |
Disable plugin-provided default_config.yml files and config xprompts. |
State Root¶
| Variable | Description |
|---|---|
SASE_HOME |
Override the SASE state root. Defaults to ~/.sase; project files, chats, artifacts, notifications, dismissed bundles, saved groups, and logs move under this root. |
General¶
| Variable | Description |
|---|---|
SASE_TMPDIR |
Override the temp directory for all sase operations. Falls back to system default when unset. |
SASE_AGENT_AUTO_APPROVE_PLAN_ACTION |
Plan-specific auto-approval action for an agent; currently approve or epic. |
SASE_AGENT_AUTO_PLAN_ACTION |
Backward-compatible alias for SASE_AGENT_AUTO_APPROVE_PLAN_ACTION. |
SASE_AGENT_AUTO_APPROVE |
Legacy boolean auto-approve flag; maps plan submissions to normal approval. |
SASE_XPROMPT_LSP_CMD |
Override the command used by sase lsp to launch the xprompt language server. |
SASE_CORE_DIR |
Preferred sase-core source checkout for Justfile Rust build/install targets; overrides ../sase-core. |
SASE_PYTEST_WORKERS |
Override the xdist worker count used by just test, just test-slow, just test-visual, and just test-cov. |
SASE_JUST_INVOCATION_DIR |
Internal value set by just so test selectors are normalized from the caller's directory. |
Workspace Management (Internal)¶
These are set automatically by sase when launching agent subprocesses and are not intended for manual use. Workspace
plugins declare an env-var prefix, then SASE passes <PREFIX>_PRE_ALLOCATED, <PREFIX>_WORKSPACE_NUM, and
<PREFIX>_WORKSPACE_DIR into the child process. Built-in prefixes include SASE_CD for #cd and SASE_GIT for
#git; plugin packages may add prefixes such as SASE_GH for GitHub. The launcher clears inherited
SASE_*_PRE_ALLOCATED, SASE_*_WORKSPACE_NUM, and SASE_*_WORKSPACE_DIR variables before applying the current
launch's values so follow-up agents cannot inherit stale workspace claims.
| Variable | Description |
|---|---|
SASE_SYNC_CWD |
Working directory override for sync operations. |
<PREFIX>_PRE_ALLOCATED |
Set to "1" when a workspace provider has pre-allocated a launch context. |
<PREFIX>_WORKSPACE_NUM |
Pre-allocated workspace number, or 0 for non-claiming directory contexts. |
<PREFIX>_WORKSPACE_DIR |
Pre-allocated workspace directory path. |
SASE_CD_*, SASE_GIT_*, ... |
Concrete forms for built-in and plugin-provided workspace prefixes. |
CLI Flags¶
Command groups that default to a nested list command still parse flags at the subcommand level. Use the explicit
list form when passing list options, such as sase notify list -j, sase memory list -j, or
sase workspace list --json.
sase ace¶
| Flag | Values | Default | Description |
|---|---|---|---|
[query] |
string | last saved query or !!! |
Query string for filtering ChangeSpecs. |
-m, --model-tier |
large, small |
- | Override model tier for all LLM invocations. |
-M, --model-size |
big, little |
- | Deprecated alias for --model-tier. |
-p, --profile |
optional path | - | Profile the TUI session with pyinstrument (default output $SASE_TMPDIR/ace_profile_<ts>.txt); after exit, print a shortened path and copy it to the system clipboard when possible. |
-r, --refresh-interval |
int (seconds) | 10 |
Auto-refresh interval (0 to disable). |
-R, --restart-axe |
flag | - | Restart the axe daemon on startup (no-op if axe is not running). |
-t, --tab |
changespecs, agents, axe |
agents |
Tab to focus on startup. |
-T, --tmux |
flag | - | Launch ACE in a new tmux window named sase_tmux_<N> and print the session/window target for external control. |
-x, --no-axe |
flag | - | Disable auto-starting the axe daemon. |
-v, --vcs-provider |
git, hg, auto |
- | Override VCS provider. |
sase axe¶
| Flag | Values | Default | Description |
|---|---|---|---|
-v, --vcs-provider |
git, hg, auto |
- | Override VCS provider. |
sase axe start¶
| Flag | Values | Default | Description |
|---|---|---|---|
-q, --query |
string | "" (all) |
Query string for filtering ChangeSpecs. |
-H, --max-hook-runners |
int | config or 3 |
Maximum concurrent hook runners. |
-A, --max-agent-runners |
int | config or 3 |
Maximum concurrent agent runners. |
-z, --zombie-timeout |
int (seconds) | config or 7200 |
Timeout before marking a hook/workflow as a zombie. |
For sase axe start, CLI flags take precedence over values from the axe config section in sase.yml. If neither is
set, the built-in defaults from default_config.yml are used.
sase repro¶
Agents-tab reproduction bundles capture and replay the loader/apply sequence used to render agent rows. The command is intended for debugging row disappearance, reappearance, and duplicate-parent regressions; see Agents Tab Reproduction Bundles.
| Form | Flag | Values | Default | Description |
|---|---|---|---|---|
sase repro capture agents-tab |
--output |
path | required | Directory where agents_tab_repro.json and capture artifacts are written. |
sase repro capture agents-tab |
--commit-safe |
flag | enabled | Redact local names and paths for a shareable bundle. |
sase repro capture agents-tab |
--no-commit-safe |
flag | - | Keep unredacted local identifiers in the capture. |
sase repro capture agents-tab |
--size |
WxH |
120x40 |
Terminal size label stored with the bundle. |
sase repro capture agents-tab |
--json |
flag | - | Emit a machine-readable capture result. |
sase repro replay |
path |
path | required | Bundle JSON file or bundle directory to replay. |
sase repro replay |
--assert-stable |
flag | - | Exit non-zero if replay invariants fail. |
sase repro replay |
--json |
flag | - | Emit a machine-readable replay verdict. |
sase repro replay |
--write-artifacts |
path | - | Directory for replay screen text and SVG artifacts. |
sase repro replay |
--size |
WxH |
120x40 |
Headless terminal size used for replay. |
sase axe stop¶
No flags. Stops the running axe orchestrator.
sase axe maintenance¶
Maintenance mode pauses scheduled lumberjack ticks without stopping the orchestrator.
| Command | Flags / exit code | Description |
|---|---|---|
sase axe maintenance enter |
-r, --reason required |
Write the maintenance marker with a reason. |
sase axe maintenance exit |
exits 0 | Remove the marker if present. |
sase axe maintenance status |
exits 0 when active, 1 when inactive | Print the active marker reason, PID, timestamp. |
See axe.md — Maintenance Mode for the runtime behavior.
sase commit¶
Dispatches a commit, proposal, or PR via the VCS provider layer. See commit_workflows.md for the full flow, payload, checkpoint, and resume semantics.
| Flag | Values | Default | Description |
|---|---|---|---|
-m, --message |
string | - | Commit message (mutually exclusive with -M). |
-M, --message-file |
path | - | File containing the commit message / PR description (mutually exclusive with -m). |
-f, --file |
path (repeatable) | stage all | Specific file to stage. Repeat for multiple; omit to stage everything. |
-n, --name |
string | - | Branch/CL name (required for create_pull_request). |
-B, --bug-id |
int | $SASE_BUG_ID |
Bug ID to associate with the commit. |
-c, --checkout-target |
string | HEAD~1 |
Branch point for PR creation. |
-p, --parent |
ChangeSpec name | auto | Parent ChangeSpec name (overrides branch-based auto-detection). Unresolvable values are dropped. |
-r, --resume |
flag | - | Resume a previously-checkpointed commit after manual conflict resolution. |
-s, --status |
wip / draft / ready |
$SASE_PR_STATUS/draft |
ChangeSpec status override for PRs. |
-t, --type |
commit / propose / pr … |
$SASE_COMMIT_METHOD |
Commit method — full names (create_commit, etc.) and short aliases are both accepted. |
sase changespec search¶
| Flag | Values | Default | Description |
|---|---|---|---|
query |
string | (required) | Query string for filtering ChangeSpecs. |
-f, --format |
plain, rich, markdown |
rich |
Output format (markdown for agent-friendly output). |
Search uses the normal active-project discovery scope. Inactive and sibling projects are omitted from this CLI path; run
sase project list --state all or sase project show <project> to inspect hidden projects, then reactivate the project
with sase project activate <project> before using normal search and launch surfaces for new work.
sase changespec migrate-extension¶
One-time cleanup for older installs: renames legacy ProjectSpec files under ~/.sase/projects from .gp to .sase,
including archive siblings. Current readers still accept .gp as a fallback, so migration is not required before using
SASE; it just normalizes on-disk filenames to the canonical extension.
If a .sase sibling already exists with identical contents, the redundant .gp copy is removed. If the sibling
differs, the command reports a conflict and preserves both files unless --force is set.
| Flag | Values | Default | Description |
|---|---|---|---|
--force |
flag | - | Replace an existing differing .sase sibling with the legacy .gp file. |
--projects-dir |
path | ~/.sase/projects/ |
Override the project root scanned for legacy .gp files. |
sase project¶
With no subcommand, sase project defaults to sase project list. Project lifecycle state is stored as PROJECT_STATE
metadata in the ProjectSpec header; missing state means active.
| Form | Flags | Description |
|---|---|---|
sase project list |
-s, --state active\|inactive\|sibling\|all |
List projects in one lifecycle state; default is active. |
sase project list |
-j, --json |
Emit machine-readable lifecycle records. |
sase project show <project> |
-j, --json |
Show state, source, project/archive files, workspace, launchability, warnings. |
sase project set-state <project> <state> |
-f, --force |
Set active, inactive, or sibling. |
sase project activate <project> |
-f, --force |
Alias for set-state <project> active; --force has no effect for active. |
sase project deactivate <project> |
-f, --force |
Alias for set-state <project> inactive. |
Deactivating refuses projects with live RUNNING claims or live artifact markers (running.json, waiting.json, or
pending_question.json) unless --force is passed. Legacy archive and close aliases still set inactive, and
legacy PROJECT_STATE: archived / PROJECT_STATE: closed files are read as inactive. The system-managed home project
cannot be mutated through this command. Normal launch and discovery surfaces default to active projects; use
list --state all or show for historical or sibling inspection, then activate before launching normal work in a
hidden project. The sibling state (a legacy backing state name) is intended for configured linked repository records
used by sase workspace open -p <linked_repo> -r "<reason>" <workspace_num>.
ACE exposes the same lifecycle mutations through the Project Management panel at ,p. That panel also supports marks
for bulk lifecycle operations, ProjectSpec editing through $EDITOR, and confirmed deletion of whole SASE project
directories under ~/.sase/projects/ without deleting workspace checkouts. The temporary model override uses ,o by
default.
sase revert¶
| Flag | Values | Default | Description |
|---|---|---|---|
name |
string | (required) | NAME of the ChangeSpec to revert. |
sase restore¶
| Flag | Values | Default | Description |
|---|---|---|---|
[name] |
string | - | NAME of the reverted ChangeSpec to restore. |
-l, --list |
flag | - | List all reverted ChangeSpecs. |
sase run¶
| Flag | Values | Default | Description |
|---|---|---|---|
[query] |
string | - | Prompt text, inline reference (#name), standalone workflow reference (#!name), or . for history picker. |
-d, --daemon |
flag | - | Run as a detached background agent (appears in TUI Agents tab). |
-l, --list |
flag | - | List all available chat history files. |
-r, --resume |
string | - | Resume a previous conversation by agent name or history file basename. |
When invoked with no arguments, opens $EDITOR for composing a prompt interactively. When invoked with ., opens a
prompt history picker. Multi-prompt queries (containing --- separators) are auto-detected and launched as sequential
daemon agents.
sase repro¶
sase repro captures and replays debugging bundles for narrow, reproducible TUI bug classes. The current target is the
Agents-tab loader/apply sequence used to diagnose row disappearance, reappearance, and duplicate workflow parents.
| Form | Flags | Description |
|---|---|---|
sase repro replay <path> |
--assert-stable, --json, --write-artifacts <dir>, --size |
Replay a bundle JSON file or bundle directory through the headless TUI harness. |
sase repro capture agents-tab |
--output <dir>, --commit-safe, --no-commit-safe, --size, --json |
Capture a baseline bundle from current filesystem state. --commit-safe redaction is the default. |
Use the in-TUI ,C capture when a transient row-list bug has just happened in a live ACE session. The CLI capture path
is out-of-band: it loads current filesystem state and cannot reconstruct refreshes that already passed through the
running TUI.
sase xprompt¶
With no subcommand, sase xprompt defaults to sase xprompt list.
sase xprompt expand¶
| Flag | Values | Default | Description |
|---|---|---|---|
[prompt] |
string | stdin | Prompt text to expand (reads from stdin if omitted). |
-t, --trace |
flag | - | Print expansion trace to stderr showing resolved references. |
sase xprompt explain¶
| Flag | Values | Default | Description |
|---|---|---|---|
workflow_name |
string | (required) | Workflow name to explain. |
[args] |
string | - | Positional arguments for the workflow. |
-a, --arg |
string | - | Named argument as KEY=VALUE (repeatable). |
sase xprompt list¶
No flags. Outputs a JSON array of all available xprompts with name, type, source, inputs, tags, is_skill, and preview.
Clients that insert references should prefer kind/insertion metadata when present so standalone workflows are
inserted as #!name and inline-capable entries, including markdown multi-agent xprompts, are inserted as #name. Slash
skill completion clients should filter to entries where is_skill is true.
sase xprompt graph¶
| Flag | Values | Default | Description |
|---|---|---|---|
[workflow_name] |
string | - | Workflow name to graph. Lists all workflows if omitted. |
-f, --format |
mermaid,text |
mermaid |
Output format for the DAG visualization. |
sase xprompt catalog¶
| Flag | Values | Default | Description |
|---|---|---|---|
-o, --out |
path | tempdir | Directory where the rendered PDF should be saved. |
sase init¶
Bare sase init is the onboarding coordinator for SASE-managed resources. It runs read-only planners for AMD, memory,
SDD, and skills, prints a grouped summary, and prompts once per initializer that needs work when stdin is interactive.
Non-interactive runs never prompt; they print the drift summary and ask the caller to rerun with --yes. The AMD
planner only generates managed project AGENTS.md from bare sase init when the current project's own ./sase.yml
sets amd_h1_title.
Advanced deploy controls stay on explicit subcommands such as sase init amd --check, sase init memory --no-commit,
and sase skill init --no-push.
| Flag | Values | Default | Description |
|---|---|---|---|
-c, --check |
flag | - | Report initialization drift without writing; exits non-zero when changes are needed. |
-y, --yes |
flag | - | Run every needed initializer in AMD, memory, SDD, skills order without prompting. |
sase amd¶
With no subcommand, sase amd defaults to sase amd list.
| Form | Flags | Description |
|---|---|---|
sase amd |
- | Show the same read-only agent-markdown inventory as sase amd list. |
sase amd list |
- | Inspect project, home, and chezmoi AGENTS.md files and provider shims. |
sase amd init |
-c, --check |
Create or refresh AGENTS.md files and shims for the selected AMD root or roots, or report drift. |
sase init amd |
-c, --check |
Compatibility alias for sase amd init. |
sase memory¶
With no subcommand, sase memory defaults to sase memory list.
| Form | Flags | Description |
|---|---|---|
sase memory |
- | Show the same read-only memory context dashboard as sase memory list. |
sase memory list |
- | Show loaded, referenced, available, and missing memory files for the current launch context. |
sase memory read <path> |
-r, --reason <reason> required |
Agent-side read of a type: long memory note without leading frontmatter, plus an audit event. |
sase memory write |
--title, --target or --slug, repeatable --evidence, --from-chat, --keyword, --body, --file, --allow-large, --manual-author, --notify, --json |
Create an attributable long-term memory proposal without modifying canonical memory files. |
sase memory review [id] |
--list, --show, --approve, --edit, --reject, --all, --target, --edited-file, --reason, --json |
Human review of pending memory proposals; a bare TTY command opens the interactive review app. |
sase memory log |
--path, --agent, --id, --include, --json |
Summarize or inspect audited memory reads, optionally including proposal and review events. |
Examples:
# read requires SASE agent identity; write requires agent identity unless --manual-author is used for demos
sase memory read generated_skills.md --reason "Need generated skill context"
sase memory write --title "Generated skills" --slug generated_skills --evidence chat:abc123 --body "Durable memory body" --notify
sase memory review --list
sase memory review mem-20260523-142233-a1b2c3d4 --approve
sase memory log
sase memory log --include proposals
sase memory log --path generated_skills.md
sase memory log --id <read-id>
sase memory init¶
Creates or refreshes project and home memory roots and keeps AGENTS.md memory references reachable. It creates a
minimal AGENTS.md when absent for repositories that are not opted into AMD-managed instructions, and it still repairs
provider instruction shims for compatibility. Direct home shims use absolute @/path/to/home/AGENTS.md imports; when
use_chezmoi is enabled, home shim sources are written as *.md.tmpl files. When the project-local ./sase.yml sets
amd_h1_title, memory init synchronizes that project's AMD-managed short/long memory blocks and inserts missing
long-memory description frontmatter. By default it also tries to commit, rebase-pull, and push generated project-side
files. sase init memory is a compatibility alias for this command. Generated linked-repository memory lists direct
paths for workspace.strategy: none linked repos and only includes sase workspace open guidance when a configured
linked repo uses numbered workspace resolution.
| Flag | Values | Default | Description |
|---|---|---|---|
-c, --check |
flag | - | Report memory initialization drift without writing project or home files. |
-C, --no-commit |
flag | - | Write files, but skip only the project git commit/pull/push path; home deployment still follows config. |
sase init sdd¶
sase init sdd is an alias for sase sdd init. It enables version-controlled SDD in the project-local sase.yml, then
creates or refreshes generated SDD README files and the directory map asset. Bare-git projects run the generated-file
refresh automatically during repository setup and first SDD writes, but the explicit command remains available for
manual opt-in, refresh, and --check audits.
| Flag | Values | Default | Description |
|---|---|---|---|
-c, --check |
flag | - | Report SDD config and generated-file drift without writing files. |
-p, --path |
path | ./sdd or ./.sase/sdd |
SDD root or project root path. |
sase skill¶
With no subcommand, sase skill defaults to the read-only sase skill list dashboard. It reports loaded skill sources,
provider targets, and deployed-file drift without writing files. sase skill init generates and deploys agent skill
files from xprompt sources marked with the skill field. Generated skill files begin with a sase skill use directive
so agent-side skill use can be audited and later summarized with sase skill log, unless the source sets
log_skill_use: false. See xprompt.md — Skill Field for the skill-source contract and
provider targets. Existing files are skipped in non-interactive runs unless --force is passed; interactive runs prompt
before overwriting. sase init skills is a compatibility alias for sase skill init.
| Form | Flags | Description |
|---|---|---|
sase skill |
- | Show the same read-only dashboard as sase skill list. |
sase skill list |
- | Inspect generated skill sources, provider targets, and deployed-file drift. |
sase skill init |
-f, --force |
Overwrite existing deployed skill files without confirmation. |
sase skill init |
-n, --dry-run |
Show what would be written without writing files. |
sase skill init |
-p, --provider {claude,agy,codex,opencode,qwen} |
Deploy only for one provider. |
sase skill init |
-A, --no-apply |
With use_chezmoi, skip chezmoi apply after generated files are committed and pushed. |
sase skill init |
-C, --no-commit |
With use_chezmoi, skip the entire git commit, push, and apply sequence. |
sase skill init |
-P, --no-push |
With use_chezmoi, commit generated files but skip pull/rebase, push, and chezmoi apply. |
sase skill log |
-a, --agent; -R, --runtime; -s, --skill; -i, --id; -j, --json |
Summarize or inspect audited generated skill-use events. |
sase skill use |
-r, --reason <reason> required |
Agent-side audit event recording that the current agent is using a generated skill. |
sase init skills |
same as sase skill init |
Compatibility alias for sase skill init. |
sase workspace¶
Workspace commands inspect and maintain the managed checkout registry for the inferred project, or for the project named
by -p/--project. With no subcommand, sase workspace defaults to sase workspace list with default options. Use
sase workspace list -p <project> or sase workspace list --json when passing list flags.
| Command | Flag / argument | Values | Description |
|---|---|---|---|
sase workspace list |
-p, --project |
project name | Query a project other than the one inferred from the current directory. |
sase workspace list |
-j, --json |
flag | Emit a machine-readable JSON object. |
sase workspace path |
workspace_num |
integer | Workspace number to resolve; 0 is the primary checkout and managed claims normally start at 10. |
sase workspace path |
-p, --project |
project name | Query a project other than the inferred one. |
sase workspace open |
workspace_num |
integer | Workspace number to materialize, prepare, and print. |
sase workspace open |
-p, --project |
project name | Query a project other than the inferred one; for configured linked repos, pass the linked repo name. |
sase workspace open |
-r, --reason |
text | Required non-empty reason for opening and preparing the workspace. |
sase workspace open |
-P, --print |
flag | Explicitly print the prepared path; this is also the current default behavior. |
sase workspace open |
-c, --clean |
flag | Compatibility flag for the default prepare/clean/sync behavior. |
sase workspace cleanup |
-p, --project |
project name | Clean a project other than the inferred one. |
sase workspace cleanup |
-s, --stale |
flag | Remove unclaimed managed checkouts older than workspace.cleanup_ttl_days. |
sase workspace cleanup |
-i, --include-shares |
flag | Also consider workflow-share managed checkouts for removal. |
sase workspace cleanup |
-n, --dry-run |
flag | Report planned removals without touching the filesystem. |
sase workspace repair |
-p, --project |
project name | Repair a project other than the inferred one. |
sase workspace repair |
-n, --dry-run |
flag | Report registry/filesystem reconciliation without writing. |
sase workspace migrate |
-p, --project |
project name | Migrate a project other than the inferred one. |
sase workspace migrate |
-t, --to |
xdg-state |
Target managed root policy for migration. |
sase workspace migrate |
-s, --symlink-transition |
flag | Leave <primary>_<num> symlinks pointing to migrated managed checkouts. |
sase workspace migrate |
-f, --finalize |
flag | Remove transition symlinks left behind by a prior migration. |
sase workspace migrate |
-n, --dry-run |
flag | Report planned migration or finalization actions without touching files or the registry. |
For built-in bare-git projects, sase workspace open may initialize generated SDD guide files in the primary checkout
before materializing a numbered workspace. sase workspace list and sase workspace path remain read-only and do not
run SDD initialization.
sase bead¶
With no subcommand, sase bead defaults to sase bead list.
| Flag | Values | Default | Description |
|---|---|---|---|
| subcommand | init, create, list, show, ready, open, update, close, rm, dep, blocked, sync, stats, doctor, onboard, work |
list |
Bead subcommand |
sase bead create¶
| Flag | Values | Default | Description |
|---|---|---|---|
-t, --title |
string | (required) | Issue title |
-T, --type |
string | (required) | Bead type: plan(<file>), plan(<file>,<parent>), or phase(<parent_id>) |
-d, --description |
string | - | Issue description |
-a, --assignee |
string | - | Assignee name |
--tier |
plan, epic, legend |
- | Plan-bead tier |
-c, --changespec |
ChangeSpec name | - | Attach ChangeSpec metadata to a plan bead |
-b, --bug-id |
string | - | Bug ID for the attached ChangeSpec; requires --changespec |
-E, --epic-count |
positive integer | - | Number of epics proposed by a legend plan bead |
sase bead list¶
| Flag | Values | Default | Description |
|---|---|---|---|
-s, --status |
open, in_progress, closed |
- | Filter by status (repeatable) |
-t, --type |
plan, phase |
- | Filter by type (repeatable) |
--tier |
plan, epic, legend |
- | Filter by plan-bead tier (repeatable) |
sase bead search¶
| Flag | Values | Default | Description |
|---|---|---|---|
query |
string | (required) | Literal non-empty text to search for |
-c, --color |
auto, always, never |
auto |
Color mode for compact output |
-f, --format |
compact, json, full |
compact |
Output format |
-n, --limit |
non-negative integer | (unlimited) | Maximum results to print; 0 also means unlimited |
-s, --status |
open, in_progress, closed |
- | Filter by status (repeatable); all statuses are searched by default |
--tier |
plan, epic, legend |
- | Filter by plan-bead tier (repeatable) |
-t, --type |
plan, phase |
- | Filter by type (repeatable) |
sase bead show¶
| Flag | Values | Default | Description |
|---|---|---|---|
id |
string | (required) | Issue ID |
sase bead open¶
| Flag | Values | Default | Description |
|---|---|---|---|
id |
string | (required) | Issue ID to reopen |
sase bead update¶
| Flag | Values | Default | Description |
|---|---|---|---|
id |
string | (required) | Issue ID to update |
-s, --status |
open, in_progress, closed |
- | Change status |
-t, --title |
string | - | Change title |
-d, --description |
string | - | Change description |
-n, --notes |
string | - | Change notes |
-D, --design |
path | - | Change plan path |
-a, --assignee |
string | - | Change assignee |
--tier |
plan, epic, legend |
- | Change plan-bead tier |
-E, --epic-count |
positive integer | - | Change legend epic count |
sase bead close¶
| Flag | Values | Default | Description |
|---|---|---|---|
ids |
string | (required) | One or more issue IDs |
-r, --reason |
string | - | Optional close reason text |
sase bead rm¶
| Flag | Values | Default | Description |
|---|---|---|---|
id |
string | (required) | Issue ID to remove |
sase bead dep add¶
| Flag | Values | Default | Description |
|---|---|---|---|
issue |
string | (required) | Issue that depends |
depends_on |
string | (required) | Issue being depended upon |
sase bead sync¶
| Flag | Values | Default | Description |
|---|---|---|---|
-s, --status |
flag | - | Check sync status without committing |
sase bead work¶
| Flag | Values | Default | Description |
|---|---|---|---|
id |
string | (required) | Epic or legend plan bead ID. |
-n, --dry-run |
flag | - | Print the wave plan and rendered multi-prompt without mutating state. |
-P, --no-push |
flag | - | Commit launched bead state locally but skip the post-commit git push. |
-y, --yes |
flag | - | Skip the launch confirmation prompt when launching phase or epic agents. |
sase sdd¶
sase sdd manages SDD prompt/artifact documentation and frontmatter links. Every subcommand accepts -p/--path, which
may point at an SDD root or at a project root containing sdd/. With no subcommand, sase sdd defaults to
sase sdd list. sase init sdd is an alias for sase sdd init.
| Subcommand | Flags | Description |
|---|---|---|
init |
-p/--path, -c/--check |
Create or refresh sdd/README.md, tier READMEs, and the directory map asset; --check reports drift without writing |
list |
-p/--path, -k/--kind, -j/--json |
List SDD markdown files; kind is prompts, tales, epics, legends, or all |
links |
-p/--path, -j/--json |
List prompt/artifact frontmatter links and bidirectional status |
validate |
-p/--path, -j/--json, -q/--quiet, --strict, -W/--show-warnings |
Validate SDD frontmatter links; strict mode turns unpaired historical files into errors |
repair-links |
-p/--path, -w/--write |
Infer unambiguous prompt/artifact pairs and optionally write link fixes |
sase validate¶
sase validate is the top-level SASE validation command. It currently runs sase init --check and sase sdd validate,
prints one status line per check, and exits non-zero if any check fails. Because sase init --check includes home-level
memory and skill deployment surfaces, this command can fail on user/home initialization drift even when repository-local
SDD validation passes.
sase doctor¶
Runs the read-only support diagnostics bundle for the active runtime, configuration, provider setup, project/workspace state, bead store, agent index, and telemetry when configured. Default mode is bounded and safe to run before asking for help; deep mode adds slower read-only checks.
| Flag | Values | Default | Description |
|---|---|---|---|
-j, --json |
flag | - | Emit the schema_version: 1 JSON support report. |
-v, --verbose |
flag | - | Show every check plus bounded details in human output. |
-D, --deep |
flag | - | Include slower read-only deep checks. |
-s, --strict |
flag | - | Exit non-zero for warnings as well as errors. |
-L, --list-checks |
flag | - | List registered default and deep check ids without running them. |
-C, --check |
id/group | repeat | Run only the selected check id or group; may be passed multiple times. |
-p, --project |
string | infer | Inspect a named project when doctor cannot infer one from the checkout. |
Default exit behavior is 0 for OK, WARN, and SKIP, and 1 for ERROR. Attach sase doctor -v or
sase doctor -j when asking for help.
sase version¶
sase version reports the local runtime that the current sase process is using. It does not query PyPI, GitHub, or
latest available releases. The inventory always includes the host sase package and the required sase-core-rs Rust
core distribution, then adds installed SASE plugin packages discovered through SASE entry points, SASE console scripts,
or sase-* distribution names.
The default human output is a compact runtime panel plus a package table with role, effective version, and code
directory. Development checkouts use PEP 440 local versions such as 0.1.2+4.g26c39e004 or 0.1.2+0.g26c39e004.dirty.
Editable installs prefer source metadata over stale installed distribution metadata, while --verbose and --json
expose both values for auditability.
| Flag | Values | Default | Description |
|---|---|---|---|
-j, --json |
flag | - | Emit a stable JSON object with schema_version: 1, runtime, and packages. |
-v, --verbose |
flag | - | Include install type, dist/source versions, git metadata, and plugin signals. |
sase var¶
sase var set attaches small named string values to the current SASE agent run by merging them into
agent_meta.json["output_variables"]. The command is agent-scoped and requires SASE_AGENT=1 and SASE_ARTIFACTS_DIR.
The variables appear in ACE's Agents-tab OUTPUT VARIABLES metadata panel. Later agents that wait on this agent with
%wait load the stored strings when they start and can render them through the agents Jinja dictionary in prompts and
xprompt workflows.
| Form | Flags / arguments | Description |
|---|---|---|
sase var set KEY=VALUE [...] |
positional assignments | Store one or more output variables for the current agent. |
Keys must be valid Jinja attribute identifiers ([A-Za-z_][A-Za-z0-9_]*). Values are strings split on the first =, so
values may contain additional equals signs. Multiple calls merge into the same variable map; later writes for the same
key replace earlier values. The command does not update prompts that have already started rendering, so write variables
before the producing agent completes and before dependent agents unblock. Downstream prompts read each producer's
variables from the single agents dictionary keyed by the producer's stable agent name, e.g.
{{ agents["build"].report_path }} (or {{ agents.build.report_path }} for identifier-safe names). Do not store
secrets; output variables are persisted in agent_meta.json and shown in ACE.
STOP is a reserved output variable. sase var set stays generic and stores it like any other key, but repeat
orchestration interprets it: setting STOP (e.g. sase var set STOP=1) inside a %repeat / %r iteration stops the
remaining repeat slots, which finalize as successful skipped slots. Truthiness is conservative — "", 0, false,
no, and off (case-insensitive) are not-stop; any other value stops the chain. STOP affects only repeat-chain
continuation; ordinary %wait consumers read it as a normal variable. See
Repeat Directive in the xprompt reference for the full cascade semantics.
sase telemetry¶
With no subcommand, sase telemetry defaults to sase telemetry list.
| Flag | Values | Default | Description |
|---|---|---|---|
| subcommand | status, list, snapshot, dashboard, health, export-config |
list |
Telemetry subcommand |
See docs/telemetry.md for the full CLI reference including per-subcommand flags.
sase logs¶
| Flag | Values | Default | Description |
|---|---|---|---|
daterange |
string | (required) | Date range to collect (e.g., -7d, 260318, 260315..260318) |
Supported date range formats:
- Absolute:
YYmmddorYYmmddHHMMSS - Relative:
-Nd(days ago),-Nh(hours ago),-Nm(minutes ago),0d(today) - Ranges:
START..END(e.g.,-7d..0d); single point means "from that point to now"
sase editor¶
sase editor exposes JSON-over-stdin helper operations for editor integrations. It is intentionally a fixed-operation
bridge rather than a generic shell or filesystem API.
| Form | Input | Description |
|---|---|---|
sase editor helper-bridge xprompt-catalog |
JSON object on stdin | Return the structured xprompt catalog; accepts the same schema as the mobile xprompt-catalog helper operation. |
sase editor helper-bridge snippet-catalog |
JSON object on stdin | Return the composed ACE snippet registry used by sase lsp and editor completion clients. |
The structured catalog includes insertion metadata (insertion, reference_prefix, kind), typed argument metadata,
display/source fields, and definition_path when SASE can resolve a real file to jump to.
The snippet catalog uses the same source ordering as ACE: xprompts marked with snippet front matter plus user-defined
ace.snippets, with ace.snippets winning on trigger collisions.
sase file¶
With no subcommand, sase file defaults to sase file list.
| Form | Flags | Description |
|---|---|---|
sase file list |
-p/--path, -t/--token |
Emit JSON filesystem completion candidates rooted at --path and filtered by the cursor token. |
sase file-history¶
With no subcommand, sase file-history defaults to sase file-history list.
| Form | Flags | Description |
|---|---|---|
sase file-history list |
none | Emit the recency-ordered file-reference history as a JSON array. |
sase file-history delete |
-p/--path |
Remove one entry from the file-reference history. |
sase plugin¶
With no subcommand, sase plugin defaults to sase plugin list with default options. Use sase plugin list --verbose
or sase plugin doctor --json when passing diagnostic flags.
| Form | Flags | Description |
|---|---|---|
sase plugin list |
-j/--json, -v/--verbose |
Inventory installed SASE entry points and configured or available chop scripts. |
sase plugin doctor |
-j/--json, -v/--verbose |
Diagnose resource loading, configured chops, and optional integration prerequisites. |
sase lsp¶
Starts the xprompt language server over stdio for editor integrations. SASE_XPROMPT_LSP_CMD can override the server
command during development. Without that override, sase lsp uses sase-xprompt-lsp from PATH, then checks a sibling
../sase-core checkout for debug/release binaries, then falls back to cargo run from that sibling checkout when Cargo
is available.
| Flag | Values | Default | Description |
|---|---|---|---|
-V, --version |
flag | - | Print the xprompt LSP version and exit |
sase path¶
| Flag | Values | Default | Description |
|---|---|---|---|
name |
xprompts-dir, xprompts-schema, xprompts-collection-schema, config-schema |
(required) | Which path to print |
sase notify¶
With no subcommand, sase notify defaults to the compact sase notify list view. Use sase notify list for JSON,
limit, query, unread, dismissed, or the clearest sender/tag filtering form. Use sase notify create to write a
notification from stdin JSON.
| Form | Flags | Description |
|---|---|---|
sase notify |
-s/--sender, -t/--tag |
Shortcut for sase notify list with default compact output |
sase notify create |
-s/--sender, -t/--tag |
Create a notification from stdin JSON |
sase notify list |
-j/--json, -l/--limit, -q/--query, -t/--tag, -s/--sender, -u/--unread, -a/--all |
List recent notifications; -j emits the stable JSON shape |
sase notify show |
-i/--id, -f/--format (markdown or json) |
Show one notification by id; defaults to markdown |
Create accepts a JSON tags field and repeatable -t/--tag; CLI tags are appended to JSON tags, then normalized and
deduplicated. sase notify list -q also matches tags, and sase notify list --tag <tag> filters to notifications with
that exact normalized tag.
sase plan¶
With no subcommand, sase plan defaults to the sase plan list dashboard.
| Form | Flags | Description |
|---|---|---|
sase plan approve [selector] |
-k/--kind, -m/--model, -p/--prompt |
Approve one pending proposal by notification ID or unique ID prefix. |
sase plan / sase plan list |
-j/--json |
List pending, approved, and inferred rejected plan proposals. |
sase plan propose <plan_file> |
- | Submit a Markdown plan file for approval from the /sase_plan skill. |
sase plan search [query] |
-f/--format, -k/--kind, -s/--status, -o/--source, -r/--sort, -A/--since, -B/--until, -n/--limit, -c/--color |
Search SDD and machine-local Markdown plans. |
sase plan list prints a Rich dashboard by default and emits a stable JSON projection with summary, proposed,
approved, and rejected keys when -j/--json is set. Use the Proposed row's id_prefix as the selector for
sase plan approve; omitting the selector is valid only when exactly one pending proposal exists. Approval kind
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 and legend commit the matching SDD tier and launch the bead follow-up, and commit
records the approved plan in SDD without launching a coder. The -m/--model flag applies to the follow-up agent;
-p/--prompt adds extra coder instructions only for the approve and tale paths.
sase plan search [query] scans repo-local sdd/ plans and the machine-local ~/.sase/plans/ archive. The query is a
literal case-insensitive substring; omit it to browse and filter. --format accepts compact, full, json, or
markdown; --kind is repeatable and filters repo plans to tale, epic, legend, myth, or research; --status
is repeatable and filters frontmatter status to wip or done; --source selects all, repo, or local; --sort
selects relevance, recent, or title (defaulting to relevance with a query and recent without one);
--since/--until accept YYYY-MM-DD, YYYY-MM, YYYYMM, or relative durations such as 14d; and --limit 0
prints all matches.
sase artifact¶
sase artifact create is intended for code agents running with SASE_AGENT=1 and SASE_ARTIFACTS_DIR set. It moves a
generated file into persistent SASE artifact storage and associates it with the current agent so the Agents tab can open
it with A, even after the agent has been dismissed and revived.
| Form | Flags | Description |
|---|---|---|
sase artifact create |
-p/--path, -n/--label, -k/--kind |
Store one explicit artifact for the current agent |
sase questions¶
| Flag | Values | Default | Description |
|---|---|---|---|
questions_json |
string | (required) | JSON string containing questions to ask |
sase agent¶
sase agent provides cross-project visibility into running agents. Subcommands:
| Subcommand | Flags | Description |
|---|---|---|
list |
-a/--all, -j/--json, -p/--project |
List running agents. -a includes DONE/FAILED agents (capped at 50 per project). -j emits a JSON array with a stable schema. -p limits output to a single project. |
show |
-n/--name |
Render a full detail panel (prompt, reply, metadata) for a single agent by name. |
kill |
-n/--name |
SIGTERM a running agent by name. |
tag |
set / unset / list |
Manage the user-defined tag on an agent (used by the Agents tab tag side panels). tag set -n <agent> -t <tag> replaces any prior tag; tag unset -n <agent> clears it; tag list [-n <agent>] prints tags as JSON (filtered when given). |
archive |
rebuild-index / verify |
Maintain the dismissed-agent bundle summary index under ~/.sase/dismissed_bundles/. verify exits non-zero if rows are stale or missing. |
artifacts |
layout status / migrate / verify / rollback, -P/--project, -p/--projects-root, -i/--index-path, -j/--json |
Inspect and migrate the physical ace-run artifact directory layout. status reports flat and sharded directory counts, migrate moves flat timestamp directories into day shards, verify checks current or manifest-backed state, and rollback reverses a manifest-backed migration. |
index |
status / rebuild / verify / gc, -i/--index-path, -p/--projects-root, -j/--json |
Maintain the persistent agent artifact index. Defaults are ~/.sase/agent_artifact_index.sqlite and ~/.sase/projects; status performs a lightweight visible-inbox check without scanning source artifacts, verify exits non-zero when the index diverges from source artifacts, and gc rebuilds the index from source artifacts and replaces the dismissed projection. |
names |
migrate-auto, -f/--force, -j/--json |
Maintain the permanent agent-name registry. migrate-auto runs the historical generated-name namespace migration; --force reruns it after the completion marker exists and --json emits a machine-readable summary. |
sase chat¶
sase chat discovers and inspects saved agent chat transcripts. With no subcommand, it defaults to sase chat list.
Subcommands:
| Subcommand | Flags | Description |
|---|---|---|
list |
-j/--json, -l/--limit, -q/--query |
List recent transcripts. -j emits the stable JSON shape consumed by the /sase_chats skill. |
show |
-n/--agent, -p/--path, -b/--basename, -f/--format |
Show one transcript by agent name, path, or basename. --format accepts raw, resume, or response. |
Directory Sharding¶
A fresh install writes agent artifacts (chat logs, notifications, prompt history, workflow state, etc.) directly under
~/.sase/<kind>/. After a few months of heavy use those directories can accumulate tens of thousands of files, which
slows down filesystem walks and makes ls-style inspection painful.
New files are automatically written into a YYYYMM/ shard inside each high-volume directory (keyed by the current
month). Readers transparently merge sharded and non-sharded files, so the layout is backwards-compatible — existing
unsharded files at the top level are still found and the layout is fully read/write compatible across both forms.
ACE run artifacts also support a day-sharded physical layout under each project's artifact root. Use
sase agent artifacts layout status to inspect flat versus sharded ace-run directories, migrate to move legacy flat
timestamp directories into shards while writing index aliases, verify to check the current or manifest-backed state,
and rollback -m <manifest> to reverse a migration when needed. Migration skips live artifact directories with
running.json, refuses existing targets, and can be previewed with --dry-run.