Ctrl K
ComunidadGuías…

config.example.yaml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# assaio-agent configuration (example)
#
# Copy to ~/.config/assaio/config.yaml (honors XDG_CONFIG_HOME).
# Every key here is optional; the values shown are the defaults.
#
# Precedence, lowest to highest:
#   built-in defaults  <  this file  <  ASSAIO_ env vars  <  command-line flags

# Default report lookback window (e.g. 7d, 30d, 90d).
# Override with ASSAIO_SINCE.
since: 30d

# Default report output format: table | json | csv.
# Override with ASSAIO_FORMAT.
format: table

# How far back the session-step timeline is kept. This is the one size bound assaio ships:
# the timeline and its indexes are the largest thing written per unit of usage — 102.0 MB
# against usage_record's 58.3 MB on the maintainer's store — so steps older than this are
# pruned on every ingest.
#
# 30 days is also all that could ever be rebuilt: Claude Code deletes its own transcripts
# after 30 by default, so a longer horizon holds history no re-read can restore.
#
# An explicit 0 means keep everything and is honoured rather than coerced — but then nothing
# prunes the table and it has no upper bound (a measured 3.40 MB/day). `assaio-agent doctor`
# says so on its timeline line.
trace:
  horizon_days: 30

# Override where assaio looks for each tool's session logs — for a custom install
# location, an OS-variant path the built-in defaults don't cover, or a synced/mounted
# home directory.
#
# Resolution rule: a non-empty list for a tool replaces its built-in default roots
# ENTIRELY (never merged with them); an empty or omitted list keeps the default.
# `assaio-agent doctor` reports which roots are in effect, whether each is "default" or
# "config-overridden", and flags a configured path that doesn't exist on disk.
#
# Override with ASSAIO_SOURCES_CLAUDE etc. — one root per env var (not comma-split);
# use the YAML list form for more than one root.
# sources:
#   claude: []          # default: ~/.claude/projects
#   codex: []           # default: ~/.codex/sessions, ~/.codex/archived_sessions
#   gemini: []          # default: ~/.gemini
#   cline: []           # default: VS Code global storage, and ~/.cline/data
#   copilot: []         # default: $COPILOT_HOME, else ~/.copilot
#   agy: []             # default: ~/.gemini/antigravity-cli
#
# Example: a Claude Code install that logs to an external volume.
# sources:
#   claude:
#     - /Volumes/work/.claude/projects

# Out-of-tree exec parser plugins (opt-in only; never discovered from PATH).
# Each plugin is an executable speaking the assaio plugin protocol —
# see docs/extending/parser-plugin.md#write-a-plugin-any-language.
# plugins:
#   - name: mytool            # [a-z0-9-]+; records are stored as tool "plugin:mytool"
#     command: /path/to/assaio-parser-mytool
#     timeout: 60s            # optional, default 60s

# Out-of-tree exec metric plugins: your own analyzers, in any language, without forking
# assaio — see docs/extending/metric-plugin.md. Same entry shape as
# plugins:. Run by `analyze` and `dashboard`; the team server never executes them. The
# plugin receives usage METADATA (project names, models, member pseudonyms, token/line
# counts — never prompts or code) as JSON on stdin, and its result appears as
# "plugin:<name>" beside the built-in validators.
# metrics:
#   - name: weekend-usage     # [a-z0-9-]+; appears as validator "plugin:weekend-usage"
#     command: /path/to/assaio-metric-weekend
#     timeout: 30s            # optional, default 60s
#     needs: [trace]          # metric plugins only. The step timeline is the one section you
#                              # have to ask for -- it encodes to ~44 MB on a real store -- and a
#                              # plugin that does not is told so in the envelope's `withheld`
#                              # rather than handed an empty array. Valid names: usage, sessions,
#                              # trace, attribution, turn-sizing, cache-misses, prices.

# Out-of-tree exec rule plugins: your own CI gate, in any language — see
# docs/extending/rule-plugin.md. Same entry shape as plugins:. Only
# `check` runs them: each reads this window's validator verdicts (exactly what
# `analyze --format json` prints — no usage rows) and emits alerts with a severity of
# info, warn, or error. An error alert makes `check` exit non-zero, and so does a rule
# that could not be evaluated -- a gate that did not run is not a gate that passed.
# rules:
#   - name: budget-drift      # [a-z0-9-]+; stamped on every alert the plugin raises
#     command: /path/to/assaio-rule-budget
#     timeout: 15s            # optional, default 60s

# Privacy settings for shareable exports (today: `assaio-agent dashboard` and the team
# server's served dashboard both read this). The interactive CLI tables
# (status/report/effectiveness) always show real *project* names regardless of this setting.
# Member names are stricter and not governed by it: every `report` format renders a pseudonym,
# and `report --identify` is the only door to raw ones.
# privacy:
#   anonymize: true          # pseudonymize project names in the dashboard HTML; also
#                             # governs member names in the dashboard's Team section
#                             # (see server: below) -- override per run with
#                             # --anonymize/--no-anonymize

# Team server (`assaio-agent serve`): a self-hosted HTTP endpoint that collects usage
# pushed by `assaio-agent sync` from every teammate's machine and serves it back as one
# aggregated, pseudonymized-by-default Assay dashboard. This server and sync are the only
# parts of assaio that use the network. You run and control this server yourself, on your
# own network. A configured exec plugin is your own program; its network use is its own.
# Security model: every route but the /healthz probe requires a bearer token, the dashboard
# included. There is no
# TLS -- put a reverse proxy in front (see internal/server's package doc). Not
# production-hardened.
# server:
#   addr: 127.0.0.1:8787      # listen address (loopback by default; widen deliberately);
#                              # override with ASSAIO_SERVER_ADDR
#   token: ""                 # required to start `serve`, at least 16 characters; override
#                              # with ASSAIO_SERVER_TOKEN -- do not commit a real token here.
#                              # With only this set, any holder can push under any member
#                              # name: prefer members: below.
#   members:                  # one secret per member -> the server decides who a request is
#     alice: ""               # from the token, and ignores the name in the request body.
#     bob: ""                 # Keep the real secrets out of a committed file.
#   rate_limit_per_minute: 120 # per secret, not per address; a negative value disables it

# Sync (`assaio-agent sync`): pushes this machine's local usage to a team server.
# member identifies the sender on the server. By default sync derives a stable
# pseudonym from hostname+OS-user (e.g. "member-a1b2"), so a push is anonymous unless
# you opt in to a real name below (pseudonymized is assaio's default privacy mode).
# sync:
#   server: ""                # team server base URL, e.g. http://assaio.internal:8787
#   token: ""                 # override with ASSAIO_SYNC_TOKEN
#   member: ""                # opt-in self-identification; default: auto pseudonym. A server
#                              # configured with server.members decides this from your token
#                              # and ignores whatever is set here.

# Pricing basis: by default every "$" assaio prints is an ESTIMATE at public pay-as-you-go
# API rates (the vendored LiteLLM table) -- not your actual spend. If you pay a flat
# subscription (Claude Pro/Max, ChatGPT Plus/Pro) or a negotiated rate, your effective cost
# per token differs; set this so assaio shows your real basis alongside the estimate.
# Leaving it unset keeps the honest default: API-equivalent estimate, disclosed as such.
# pricing:
#   max_unpriced_share: 0.05  # doctor --strict fails above this share of stored tokens
#                              # carrying no price; 0 disables that half of the gate
#   mode: subscription              # "api" (default) or "subscription"; override ASSAIO_PRICING_MODE
#   effective_per_token: 0.0        # your blended $/token (e.g. monthly cost / tokens used)
#   monthly_subscription_cost: 0.0  # flat plan price per month, to compare vs API-equivalent spend

# Suggested labels (`assaio-agent mark --suggest`): turn what a session already recorded
# into a proposed annotation, so reading metrics per kind of work stops depending on a
# chore nobody does twice. Nothing here ever writes a label on its own -- `--suggest`
# shows, `--accept-suggested` writes, and a label made by hand is never replaced.
#
# The built-in rules read branch naming conventions only (feat/, fix/, test/, refactor/,
# docs/, spike/, review/ and their common spellings), because a branch prefix is the one
# convention that is widespread and tool independent. Nothing about skills or sub-agents
# ships as a default: a skill name is one team's toolchain, and a default over it would
# encode whoever wrote it. Add your own below -- source is branch|skill|agent|entrypoint,
# match is an RE2 pattern, and value must be in that axis's closed vocabulary.
# labels:
#   defaults: true            # false drops the built-in branch rules, leaving only yours
#   rules:
#     - source: branch
#       match: "(?i)^[A-Z]+-[0-9]+-fix"   # e.g. a JIRA convention: PROJ-1234-fix-...
#       axis: task
#       value: bugfix
#     - source: skill
#       match: "(?i)debug"
#       axis: task
#       value: bugfix