Agentic Task System (ats)
Convierte tu gestor de tareas en memoria de agente: recuperación híbrida (RRF) sobre TickTick o una bóveda de Obsidian mediante un contrato de adaptador. Servidor MCP + CLI, sin necesidad de mantener una base de datos vectorial.
Documentación
Tu gestor de tareas es la mejor memoria de agente que no estás usando.
ats es un servidor MCP y CLI que mantiene el contexto de los agentes de IA en los sistemas de tareas que ya mantienes — TickTick, Taskmaster, Beads, Obsidian, Notion, GitHub, Airtable, Google, o varios a la vez mediante el adaptador compuesto. Recupera tareas, notas, decisiones y runbooks relevantes con procedencia, y luego puede escribir los resultados cuando el adaptador activo admite escrituras. Funciona con Claude Code, Claude Desktop, Cursor y cualquier cliente MCP.
Adaptador, no migración. Tu aplicación de tareas, repositorio o bóveda sigue siendo la autoridad. ATS mapea esa fuente a un contrato de tareas común; las cachés opcionales y los índices vectoriales mejoran la recuperación pero nunca se convierten en un segundo registro que la gente deba editar. Es primero las tareas: la tarea es la columna vertebral, mientras que el material de apoyo, como los issues de GitHub y las especificaciones de Notion, se recupera como contexto detrás de ella.
Dos capas, un solo CLI: tareas y un grafo de conocimiento. La capa de tareas es basada en registros a propósito — cada entrada vive en los proyectos y campos de un backend, y ese backend sigue siendo la autoridad. Una capa basada en registros estructuralmente no puede contener la otra cosa que los agentes acumulan: conocimiento duradero escrito desde cualquier fuente, sobre temas mixtos, en un solo espacio. La capa de grafo de conocimiento — ats kg (kg = knowledge graph) — es la respuesta de ATS a exactamente eso: hechos sujeto–predicado–objeto con procedencia y validez temporal, propuestos por agentes desde cualquier lugar (una llamada, una tarea, un repo, un chat), ratificados por un humano y consultados en un solo lugar sin importar en qué backend viva el trabajo circundante. El almacén integrado es embebido y sin dependencias. Para un motor de grafo dedicado, la combinación recomendada es Graphiti como servidor de base de datos de grafos y LadybugDB como base de datos de grafos embebida: ats kg export --cypher emite un script cargable por LadybugDB (--dialect neo4j|falkordb para los motores de servidor, re-ejecutable), y ats kg export --graphiti emite JSONL de episodios con el registro de procedencia para un pipeline de ingesta de Graphiti.
npm install -g @reneza/ats-cli @reneza/ats-adapter-ticktick
ats config use ticktick
ats auth login
ats find "deployment runbook"
Un ats find a través de GitHub + Notion + TickTick. ATS clasifica las ramas de recuperación disponibles con RRF y conserva la procedencia de los resultados.
Arquitectura y límites de confianza
ATS separa el registro autoritativo de la maquinaria de recuperación que lo rodea:
AI client or operator
|
| local stdio, or token-gated HTTP when self-hosted
v
ATS CLI / MCP server
|
+-- Core: task contract, links, lifecycle, ledger, events
+-- Retrieval: keyword + native + optional dense branches -> RRF
|
v
Adapter boundary (auth, mapping, reads, patch-style writes)
|
+-- TickTick / Notion / GitHub / Airtable / Google
+-- Obsidian / Taskmaster / Beads / OKF files
|
+-- derived retrieval state
corpus cache + optional Qdrant/Ollama index
- El backend sigue siendo la autoridad. ATS no pide a los usuarios editar una base de datos de memoria duplicada. Las escrituras pasan por el adaptador activo, que posee la autenticación específica del backend, el mapeo de campos y los enlaces profundos.
- El estado de recuperación es derivado, no canónico. El núcleo mantiene una caché de corpus de cinco minutos por defecto. La recuperación densa es opcional: los adaptadores pueden proporcionar embeddings, y el adaptador de referencia TickTick puede usar Qdrant más Ollama. Sin vectores, las ramas de palabras clave y nativas del adaptador siguen funcionando.
- Las credenciales permanecen en el límite del adaptador. Un adaptador compuesto delega la autenticación a cada hijo y no almacena credenciales adicionales entre fuentes. Sus hijos aún se ejecutan dentro de un solo proceso ATS; esto es separación de enrutamiento, no aislamiento de procesos. El stdio local no expone un puerto MCP. El blueprint alojado añade una puerta de enlace con token bearer, servicios privados de Qdrant/Ollama y un backend de demostración público separado para el panel de operador opcional.
- El núcleo informa los fallos que puede ver. Las ramas de recuperación y los fallos de corpus compuesto de nivel superior devuelven
degradedywarnings. Las rutas de omisión conocidas dentro de los fallbacks de adaptadores se señalan en Compensaciones y límites. - Los cambios de estado son trazables. Los resultados llevan procedencia de fuente;
find --explainexpone las contribuciones de RRF; las escrituras usan semántica de parche, y las escrituras admitidas pueden conservar imágenes previas para deshacer.
La caché de corpus puede contener registros completos de tareas; el registro de consultas contiene texto de búsqueda; el libro mayor de acciones puede contener imágenes previas de escrituras; y las cargas útiles de Qdrant pueden contener texto de tareas y metadatos además de embeddings. ATS no aplica cifrado a nivel de aplicación ni redacción en tiempo de ejecución a estas copias. Limita el acceso al host, las copias de seguridad, la retención y el despliegue a la sensibilidad de los sistemas de tareas subyacentes. Consulta recuperación, integridad del estado y la guía de despliegue para el comportamiento exacto.
Opciones de despliegue
| Modo | Recuperación | Límite de confianza y operaciones |
|---|---|---|
| Stdio local | Recuperación por palabras clave/nativa por defecto; recuperación densa solo cuando el adaptador la proporciona | El endpoint MCP no está expuesto a la red. Las llamadas del adaptador pueden llegar a sus sistemas de origen; las credenciales y los archivos de caché permanecen en la máquina que ejecuta ATS. |
| Adaptador compuesto | Un corpus hijo combinado; el núcleo clasifica las ramas de palabras clave y de búsqueda nativa unificadas, con RRF entre las ramas disponibles. El compuesto no expone actualmente la búsqueda vectorial de los hijos. | Cada hijo posee su autenticación y mapeo, pero se ejecuta en el mismo proceso ATS. Un fallo de corpus hijo de nivel superior se informa como degradado; consulta las brechas de fallback conocidas a continuación. |
| Blueprint alojado | Recuperación por palabras clave/nativa más servicios privados de Qdrant/Ollama | Una puerta de enlace MCP con token bearer y un backend separado opcional para el panel de operador son públicos; Qdrant y Ollama permanecen en la red de servicios privados. Qdrant/Ollama tienen discos, mientras que los archivos de tiempo de ejecución de ats-mcp son efímeros por defecto. Tú operas la rotación de tokens, la persistencia, las copias de seguridad, la disponibilidad y el costo de alojamiento. |
“Sin migración” significa sin segunda fuente de verdad. No significa cero almacenamiento derivado.
Cómo se compara
| Enfoque | Registro autoritativo | Estado adicional | Recuperación |
|---|---|---|---|
CLAUDE.md / archivos de memoria | Markdown mantenido para el agente | Los propios archivos | Búsqueda de archivo completo o específica del harness |
| Servicio de memoria separado | Base de datos específica del agente | Un corpus y una ruta de ingesta que mantener | Específico del producto |
| Conector de backend simple | Aplicación de tareas, repositorio o bóveda de origen | Generalmente nada más allá del estado del conector | Búsqueda directa o nativa del backend |
| ATS | Aplicación de tareas, repositorio o bóveda de origen | Caché, estado de consulta/acción/evento; índice vectorial derivado opcional | Palabras clave + nativa + recuperación densa opcional, RRF, procedencia, contexto tipado |
ATS es una buena opción cuando el contexto operativo ya vive en sistemas de tareas o herramientas de trabajo conectadas y los agentes necesitan recuperación clasificada y trazable entre ellos. Si el Markdown limpio ya es la fuente de verdad completa y la carga de archivos completos sigue siendo pequeña, un flujo de trabajo nativo de archivos puede ser más simple.
Lo que obtienes
- Un bus bidireccional. El agente lee los campos de tarea que proporciona un adaptador; donde el adaptador admite escrituras, escribe los resultados donde los verás.
- Relevancia en la primera búsqueda. Las ramas basadas en capacidades — palabras clave y búsqueda nativa del adaptador, más recuperación densa cuando esté disponible — se fusionan con RRF y procedencia para reducir los bucles repetidos de búsqueda y refinamiento. Cada
findlleva un veredicto de confianza del acuerdo entre ramas (--min-sources Nes la puerta de coincidencia),--projectlo vincula a un proyecto, una caché de corpus obsoleta responde inmediatamente mientras se actualiza en segundo plano, y una coincidencia exacta vacía (notes find,search,get) responde con los elementos más cercanos en lugar de nada. - Escrituras que sobreviven reintentos y concurrencia.
update --append/--prependañaden al cuerpo que ya existe;--if-match <contentHash>solo se aplica mientras el cuerpo no haya cambiado;create --if-absenty--idempotency-keyhacen que un create reintentado devuelva lo que produjo el primero. Las solicitudes HTTP compartidas tienen plazos y respetan la cancelación. Las lecturas reintentan fallos transitorios; las mutaciones reintentan solo rechazos explícitos por límite de tasa, por lo que los fallos ambiguos no reproducen una escritura. - Enlaces tipados duraderos. Un agente adjunta un enlace
decision/depends-on/output/supersedes; un agente posterior en un contexto nuevo lo recibe medianteats context. La transferencia vive en la aplicación de tareas, no en un registro de chat. - Contexto de ejecución.
ats intentcaptura resultado/por qué/cuándo se hizo;ats lifecycleevita que el contexto obsoleto dirija el trabajo actual;ats securityregistra decisiones de permitir/denegar con alcance para clientes cooperativos;ats ledgerregistra lo que hizo un agente y si la tarea avanzó;ats promoteconvierte la exploración en un objetivo comprometido;ats hierarchy evaluateverifica que el trabajo local aún respalda a su padre. - Eventos acotados.
ats events watch --jsonemitetask.created/updated/completed/...NDJSON determinista, con0600en cola con recuperación pendiente/ack e IDs de deduplicación estables. ATS solo emite observaciones — un consumidor aún evalúa intención, validez y seguridad antes de actuar. - Grafo de tareas para agentes. Las tareas se convierten en nodos estructurados con aristas de prueba, escritura, revisión, ciclo de vida y enlaces en lugar de texto de memoria libre; consulta
docs/task-graph-for-agents.md. - Una capa de hechos.
ats kgmantiene conocimiento duradero sujeto–predicado–objeto junto a las tareas: los agentes proponen (un triple, o un lote JSONL con--file), un humano ratifica (la única ruta de escritura), yats kg askresponde con puntuación léxica determinista, un veredicto de confianza y procedencia completa — sin LLM, sin servidor de grafos, un archivo de solo añadido que viaja conats state export. Una puerta responde antes de que se prepare cualquier cosa: un duplicado es un no-op, una contradicción necesita--supersedeso--additive, un hecho que el revisor rechazó necesita--acknowledge-rejected(salida 4);ats kg pendingmuestra al revisor qué haría cada propuesta. La retracción y la supersesión cierran el intervalo de validez de un hecho en lugar de eliminarlo,--as-ofresponde qué creía el almacén entonces,ats kg historymuestra la cadena de un hecho,ats kg nodesmuestra qué sabe el almacén sobre quién,ats contextlleva los hechos sobre una tarea,--semanticañade el embedder del adaptador como rama densa opcional, yats kg exporthabla con LadybugDB/Kùzu, Neo4j, FalkorDB y Graphiti. - Transferencia de índice de sesión. Los navegadores de sesión de agentes de codificación pueden mantener análisis de transcripciones crudas mientras ATS almacena el resumen duradero vinculado a tareas; consulta
docs/agent-session-index.md.
Los metadatos de ejecución gestionados por ATS pueden codificarse en el cuerpo de la tarea, con enlaces tipados bajo ## Related y fuentes consultadas bajo ## References. Los helpers gestionados están diseñados para preservar filas y enlaces escritos por humanos; update --content reemplaza el cuerpo completo, por lo que los llamadores que añaden a un cuerpo usan --append / --prepend, presentan el contentHash que leyeron con --if-match y verifican el resultado. npm run prove:intent ejecuta una prueba sintética determinista de la ruta de contexto de ejecución.
Para flujos de trabajo confiables de automatización y frescura, consulta Confiabilidad del CLI: paginación con alcance, solicitudes acotadas, claves de reintento/reanudación limitadas por carga útil y confirmaciones de hechos revisadas.
Flujo de trabajo mínimo neutral al adaptador
- Selecciona y verifica un adaptador:
ats config use <adapter>, autentica como describe su README y luego ejecutaats doctor. - Recupera el conjunto de trabajo:
ats find "deployment runbook" --jsonclasifica las ramas disponibles de ese adaptador y conserva la procedencia. - Inspecciona el elemento autoritativo y su contexto:
ats context <project> <task>usa el contrato común de adaptadores y no requiere una capa de notas específica del adaptador. - Adjunta contexto de ejecución duradero:
ats intent set <project> <task> --outcome "..." --done-when "a,b"yats link add <src-project> <src-task> <dst-project> <dst-task> --type depends-on. - Verifica el traspaso ensamblado: vuelve a ejecutar
ats context <project> <task>para leer las decisiones vinculadas, dependencias, pruebas, estado del ciclo de vida y resultados de recuperación relevantes. - Escribe a través del adaptador o la aplicación fuente y luego lee de vuelta. Mantén el backend autoritativo actualizado para que el próximo agente reciba estado duradero en lugar de un traspaso solo de chat.
Despliégalo tú mismo
El panel de operador opcional es una aplicación web estática orientada a teléfonos que se puede desplegar en Cloudflare Pages. El blueprint de Render incluido construye la puerta de enlace/servidor MCP más los servicios privados de Qdrant y Ollama.
Después del despliegue, copia el ATS_MCP_TOKEN autogenerado de la pestaña Entorno del servicio ats-mcp, apunta tu cliente MCP a https://<your-mcp-url>/mcp con el encabezado Authorization: Bearer <ATS_MCP_TOKEN> y establece TICKTICK_ACCESS_TOKEN para leer tus tareas reales. ¿Prefieres tu propia máquina o un VPS? Las mismas piezas como contenedores Docker simples: consulta la guía de despliegue.
Adaptadores disponibles
Los conectores de backend permiten que un agente acceda a Notion, GitHub y sistemas de tareas, pero el acceso por sí solo no proporciona una respuesta clasificada a preguntas como "¿qué sé sobre la migración de autenticación?". ATS añade una capa de recuperación común: el adaptador compuesto combina los corpus hijos instalados, agrupa sus ID de proyecto, une los resultados de búsqueda nativa compatibles y permite que Core clasifique las ramas disponibles con procedencia. Cada hijo lee sus propias credenciales, pero todos los hijos configurados se ejecutan en el mismo proceso de ATS.
| Adaptador | Fuente autoritativa | Notas de recuperación o escritura |
|---|---|---|
ticktick | TickTick OpenAPI v1 | La recuperación por palabras clave/nativa funciona sin vectores; Qdrant + Ollama opcionales añaden recuperación densa. |
obsidian | Bóveda Markdown local | Escrituras nativas de archivo, estilo parche, preservan frontmatter desconocido. |
okf | Paquete Markdown de Open Knowledge Format | Paquete local. |
taskmaster | .taskmaster/tasks/tasks.json local | Estado de tareas local al repositorio. |
beads | Beads local al repositorio vía bd --json | Estado de tareas local con dependencias. |
airtable | API REST de Airtable (tabla = proyecto) | Acceso API con alcance de adaptador. |
google | Google Sheets / Docs / Slides | Solo lectura. |
notion | Bases de datos y páginas de Notion | Acceso con alcance de integración. |
github | Issues y discusiones de GitHub | Acceso con alcance de repositorio. |
composite | Backends hijos instalados | Combina corpus hijos, agrupa ID de proyecto, une resultados de búsqueda nativa y enruta escrituras; no es un almacén de registros independiente y actualmente no expone embeddings hijos. |
things / apple-notes / google-tasks | — | Lista de deseos, no implementado. |
La autenticación y el mapeo por adaptador viven en el README de cada paquete. Se aceptan PRs: crea el andamiaje y verifica contra el contrato:
ats adapter new linear # writes a contract-complete skeleton
ats adapter test ./ats-adapter-linear # pass/fail/skip per contract check
Beads en cada repositorio
Ejecuta ATS dentro del repositorio que contiene .beads; su nombre de directorio es el ID de proyecto predeterminado. Para abordar otro repositorio explícitamente, establece su raíz e ID de proyecto para ese comando:
cd /path/to/my-repo
ats config use beads
export ATS_AGENT_ID=worker-a BEADS_ACTOR=worker-a
ats tasks ready --json
ats update my-repo ISSUE --claim
ats link add my-repo ISSUE my-repo PREREQUISITE --type depends-on --native --dry-run
Usa el mismo nombre de trabajador para ATS_AGENT_ID y BEADS_ACTOR; Beads verifica nuevamente el actor que reclama cuando se completa un issue reclamado.
Desde otro directorio, usa ATS_ADAPTER=@reneza/ats-adapter-beads ATS_BEADS_ROOT=/path/to/my-repo ATS_BEADS_PROJECT_ID=my-repo ats tasks ready --json. El trabajo listo contribuye con una rama RRF nombrada; los reclamos y las escrituras de dependencias nativas usan la puerta de revisión existente. Consulta la guía del adaptador Beads para identidades de trabajador, semántica de dependencias y la prueba CLI real.
Compensaciones y límites
- La frescura depende del adaptador. La caché de corpus de Core tiene un TTL predeterminado de cinco minutos. El comportamiento de sincronización del backend, la paginación y la inclusión de trabajo completado varían según el adaptador; ATS no promete lecturas universales en tiempo real.
ats cache syncactualiza la caché bajo demanda (compatible con cron): de forma incremental cuando el adaptador implementabulkFetchDelta(), como una recuperación completa en caso contrario. - La recuperación densa añade infraestructura. Qdrant y Ollama pueden mejorar el recuerdo semántico, pero añaden trabajo de indexación, persistencia, recursos y respaldo. La línea base
findaún devuelve resultados por palabras clave/nativos cuando los vectores no están disponibles, aunque una rama vectorial intentada puede degradar la respuesta; las operacioneshybridysimilarsolo vectoriales aún requieren esa infraestructura. - El contrato común es intencionalmente pequeño. La interfaz del adaptador define seis métodos de almacenamiento más enlaces del ciclo de vida de autenticación, mientras que la cobertura práctica de escritura, campos más ricos y búsqueda nativa varían. Consulta el README del adaptador antes de asumir paridad entre backends.
- Los resultados degradados siguen siendo resultados parciales. ATS informa ramas de Core fallidas o con tiempo agotado, fuentes de corpus descartadas — incluidos fallos por proyecto dentro de una recuperación compuesta de respaldo y recuperaciones de proyectos de TickTick — y fuentes de búsqueda nativa que un backend no pudo leer. El llamador aún debe decidir si el contexto parcial es aceptable;
warningsdice qué falta, no si importó. - La búsqueda compuesta no es deduplicación semántica.
ats dedupes un comando de análisis separado. La identidad de fusión está espaciada por backend (<backend>:<taskId>), por lo que IDs sin procesar idénticos de diferentes backends permanecen como resultados distintos; las tareas semánticamente duplicadas aún aparecen por separado hasta que las vincules. - El blueprint alojado es un despliegue de referencia, no un servicio gestionado. Un token portador otorga toda la superficie de herramientas MCP; el blueprint no proporciona alcances por usuario o por herramienta, RBAC multiinquilino, alta disponibilidad ni un SLA.
- El estado de ejecución de ATS alojado es efímero por defecto. El blueprint persiste Qdrant y Ollama, pero no monta un disco para
ats-mcp; su caché, registro de consultas, libro de acciones e imágenes previas de deshacer, cola de eventos y metadatos de sincronización vectorial desaparecen en un reinicio o redespliegue. - Los eventos son observaciones, no autorización.
ats events watchpuede informar cambios de tareas, pero un consumidor aún debe evaluar intención, validez y seguridad antes de tomar una acción externa. - La capa de hechos es léxica por defecto y controlada por humanos.
ats kg askes puntuación determinista de palabras clave con procedencia y un veredicto de confianza;--semanticañade el embedder del adaptador activo como rama densa opcional y necesita uno. Nada llega al almacén de hechos sin ratificación humana — una ráfaga de propuestas de agentes espera revisión por diseño — y nada que duplique, contradiga o repita un hecho rechazado llega a la cola de revisión sin decirlo. - La política de ATS no es un sandbox. La CLI aplica los metadatos de aprobación declarados — una escritura cuyo objetivo establece
intent.approvalRequiredo lista la acción ensecurity.approvalRequiredForse pone en escena enats reviewen lugar de llegar al backend (ATS_REVIEW_ALL=1controla cada escritura) — pero esto protege solo la ruta de escritura propia de ATS.ats security checksigue siendo un punto de decisión a nivel de aplicación para clientes cooperativos, y nada aquí intercepta el acceso a shell, sistema de archivos, red, modelo o secretos fuera de ATS. Un cliente que llama a un adaptador directamente evita la puerta de la CLI.
Verificación y evidencia operativa
El benchmark de recuerdo sintético de 50 preguntas compara memorias y consultas idénticas contra ATS y Engram v2.2.1:
| Ruta de recuperación | Recall@5 |
|---|---|
| Solo palabras clave de ATS | 12/50 (24%) |
| ATS denso local + disperso, RRF híbrido | 47/50 (94%) |
Engram SQLite FTS5, all predeterminado | 20/50 (40%) |
Engram SQLite FTS5, any | 32/50 (64%) |
Engram y ATS híbrido recordaron todos los objetivos de título exacto y consulta breve. Este pequeño fixture escrito por el autor prueba preguntas naturales sin procesar sobre diez memorias de decisión distintas; no establece superioridad general del producto. El resultado híbrido requiere embeddings locales, aunque no necesita base de datos vectorial ni clave de modelo alojado. El conjunto de datos, la salida sin procesar, los fallos y los pasos de reproducción están vinculados arriba.
- CI ejecuta la puerta completa del repositorio en Node 20 y 22: lint, verificaciones de reclamos públicos, verificaciones de PII, pruebas unitarias, pruebas de adaptador e intención, y el benchmark de progreso.
- La puerta de seguridad de publicación escanea tanto la superficie del repositorio como los tarballs de paquetes npm en busca de secretos, rutas personales, patrones de datos personales configurados y términos de denylist configurados localmente. Protege las superficies de publicación. En tiempo de ejecución, el adaptador compuesto puede además hacer cumplir niveles de confianza por backend con patrones de redacción configurados — una escritura enrutada a un hijo
"trust": "public"que coincide con un patrón se bloquea, no se elimina silenciosamente (consulta el README compuesto). Esa pantalla protege la ruta de escritura compuesta propia de ATS; no es prevención general de pérdida de datos. - Pruebas y convenciones de integridad de estado cubren escrituras estilo parche, preservación de campos desconocidos, mapeo explícito de almacén a
Task, procedencia de resultados y contribuciones RRF explicables. - Comportamiento de recuperación documenta las ramas de Core, la caché de corpus, los presupuestos de tiempo, el fallo elegante de ramas, el registro de uso y lo que afecta la latencia.
Estas puertas verifican el comportamiento del repositorio; no son una certificación de disponibilidad de producción o seguridad.
Superficie CLI
# Lifecycle
ats init [adapter] # select an adapter and run a health check
ats config use <adapter> # switch the active adapter
ats auth login # delegate login to the active adapter
ats doctor # inspect adapter and service health
# Retrieval (any read command takes --json for piping to jq / agents)
ats find <query> [--explain] # parallel + RRF + provenance + confidence verdict — DEFAULT
ats find <query> --project <id|name> # bind retrieval to a project (--projects a,b for several)
ats find <query> --min-sources 2 # keep only results two branches agree on
ats find <query> --fresh # refresh a stale corpus cache before answering
ats open <project> <task> # open any adapter item by explicit ids
ats context <project> <task> # task + valid linked/retrieved context
ats link list <project> <task> # list portable typed links
ats hybrid <query> # dense+sparse retrieval when embeddings exist
ats similar <id> # related items when embeddings exist
# Notes-layer shortcuts (currently TickTick and Obsidian)
ats get <id-or-title> [--extract raw|json|yaml]
ats url <id-or-title> # paste-ready note cross-reference
ats links <project> <task> # resolve deep-links in a note body
# Authoring
ats create "<title>" [--content ..][--project <id>]
ats create <project> "<title>" --if-absent --idempotency-key <k> # never a duplicate on retry
ats update <project> <task> [--content ..][--title ..]
ats update <project> <task> --append "- 2026-09-05: shipped" --if-match <contentHash> # add to the body; write only if unchanged
# Agent execution context (portable across adapters)
ats intent set <project> <task> --outcome ".." --done-when "a,b"
ats promote <src-proj> <src-task> <target-proj> --outcome ".." --done-when "a,b"
ats hierarchy set <project> <task> --kind task
ats hierarchy evaluate <project> <task>
ats lifecycle set <project> <task> --status active --valid-until 2026-12-31
ats link add <src-proj> <src-task> <dst-proj> <dst-task> --type decision --dry-run --explain
ats graph <project> <task> --depth 3 --max-nodes 500
ats context <project> <task>
ats snapshot <project> <task> --depth 3 --max-nodes 500 # content-addressed context with completeness
ats history <project> <task> # revisions and field-level changes
ats history <project> <task> --restore <revision> --dry-run
# Facts layer (proposed by agents, ratified by you)
ats kg propose "Acme GmbH" "prefers" "invoices as PDF" --domain sales --source "call 2026-08-01"
ats kg propose "Acme GmbH" "prefers" "invoices as XML" --domain sales --supersedes <fact-id> # replaces, in one ratification
ats kg propose --file facts.jsonl --domain sales # one JSON object per line, every line through the gate
ats kg propose "Acme GmbH" "signed" "renewal" --source task://<project>/<task> --tier action-record
ats kg pending # what each queued proposal would do to the graph
ats review approve <id> && ats kg ratify --all # approval comes from someone other than the proposer
ats kg verify # recheck every fact's source; exit 2 when one is gone or changed
ats kg ask "what does Acme prefer" --domain sales --json # + confidence.verdict
ats kg ask "what does Acme prefer" --domain sales --as-of 2026-06-30 # what the store believed then
ats kg ask "invoices" --center "Acme GmbH" --semantic # anchored on one entity, embedder-backed
ats kg nodes acme # what the store knows about whom
ats kg history <fact-id> # events and supersession chain
ats kg export --cypher > facts.cypher # load into LadybugDB / Kùzu, full provenance on every fact
ats kg export --dialect falkordb # openCypher for FalkorDB / Neo4j, re-runnable
ats kg export --graphiti > episodes.jsonl # Graphiti episodes with the provenance record
ats kg export --cypher --include-retracted # closed facts too, with tInvalid and who closed them
ats ledger record <project> <task> --action release.verified --advanced true
ats ledger list --actor-kind agent --session <id> # who acted, agent or human, in which session
ats ledger verify # hash-chained ledger; prints head for --expect-head
ats security set <project> <task> --trust trusted --allow-actions read --allow-resources task:self
ats security check <project> <task> --action read --resource task:self --reason "load context"
ats events watch --json # NDJSON observations; never launches agents
# Ops
ats create --input task.json --dry-run # strict JSON file, or --input - for stdin
ats batch changes.jsonl --dry-run # validate a mutation batch
ats batch changes.jsonl --journal run.jsonl # apply and resume by stable item id
ats state doctor # validate local schemas and file permissions
ats state import bundle.json --force --dry-run
ats auth status --non-interactive # bounded to 15s; override with --timeout-ms
ats tasks completed 30 --projects <id> --require-complete # every completion in the window, paged
ats review list # writes staged by approvalRequired targets
ats review approve ID && ats review apply --all
ats cache sync # refresh the corpus cache (find also refreshes a stale one in the background)
ats cache status # age, stale / servable / revalidating
ats bench run
ats bench score
ats bench progress --json
ats bench analyze-usage --days 7
npm run prove:intent
npm run prove:taskmaster
npm run prove:beads
npm run prove:progress
Las escrituras de tareas revisadas vinculan la aprobación a la carga útil exacta en escena y verifican la
revisión actual de la tarea antes de aplicar. Solo un proceso puede reclamar un elemento.
Inspecciona ats review list --all después de una aplicación interrumpida: los elementos applying o failed
requieren verificar el backend antes de poner en escena una nueva propuesta. Las aprobaciones
anteriores sin resúmenes de carga útil también deben ponerse en escena y aprobarse nuevamente.
Para automatización que requiere una lectura completa, usa
ats find QUERY --require-complete --fresh --json. Los resultados obsoletos, degradados o explícitamente
incompletos conservan su salida JSON y salen con código 2; las lecturas ordinarias preservan
su comportamiento de salida permisivo existente. Doctor admite la misma opción estricta y limita
cada sonda: ats doctor --timeout-ms 1000 --require-complete --json.
La importación de estado valida los contenidos de archivos reconocidos y cualquier suma de verificación proporcionada incluso
con --dry-run, antes de escribir cualquier archivo.
Úsalo desde cualquier cliente MCP (Claude Code, Claude Desktop, Cursor, Windsurf, OpenCode)
@reneza/ats-mcp expone el adaptador activo como un conjunto de herramientas que abarca recuperación, CRUD y contexto de ejecución (find, get_task, create_task, set_task_intent, add_task_link, resolve_task_links, context_for_task, record_action, undo_write, poll_task_events y más). Para Claude Code esto proporciona contexto persistente entre sesiones sin reemplazar el sistema de tareas como fuente de verdad; las cachés opcionales y los índices vectoriales siguen siendo estado de recuperación derivado.
ATS habla MCP sobre stdio, por lo que cualquier cliente que pueda lanzar un servidor MCP stdio funciona. Solo el archivo de configuración y la clave de envoltura difieren; el binario (ats-mcp) y su entorno ATS_ADAPTER son los mismos en todas partes.
| Cliente | Dónde vive la configuración | Clave de envoltura |
|---|---|---|
| Claude Code | claude mcp add (abajo) | n/a |
| Claude Desktop | claude_desktop_config.json | mcpServers |
| Cursor | ~/.cursor/mcp.json | mcpServers |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | mcpServers |
| OpenCode | opencode.json | mcp (la forma difiere, abajo) |
# Claude Code
claude mcp add ats -e ATS_ADAPTER=@reneza/ats-adapter-ticktick -- ats-mcp
// Claude Desktop / Cursor / Windsurf — identical `mcpServers` shape
{
"mcpServers": {
"ats": { "command": "ats-mcp", "env": { "ATS_ADAPTER": "@reneza/ats-adapter-ticktick" } }
}
}
// OpenCode (opencode.json) — local stdio server, note `command` is an array
{
"mcp": {
"ats": {
"type": "local",
"command": ["ats-mcp"],
"environment": { "ATS_ADAPTER": "@reneza/ats-adapter-ticktick" },
"enabled": true
}
}
}
Instala el binario en PATH primero (npm i -g @reneza/ats-cli), o usa una ruta absoluta a ats-mcp si tu cliente no hereda tu PATH de shell.
Convenciones
- Proyecto Wiki. Un proyecto designado (por defecto
Permanent Notes) contiene conocimiento duradero; otros contienen tareas efímeras. - Notas de datos de agente = una nota cuyo cuerpo tiene un bloque de código delimitado
json /yaml block, extracted viaats get <title> --extract json. - Referencias cruzadas = enlaces profundos nativos del adaptador — genéralos con
ats url <title>, no los escribas a mano. - Patrón completo:
docs/wiki-conventions.md.
Integridad del estado
ATS prueba las reescrituras de metadatos gestionados para la preservación de campos escritos por humanos, requiere un mapeo explícito de almacenamiento a Task, y lleva procedencia de resultados (sources, find --explain). La cobertura y el comportamiento de actualización en bruto siguen siendo específicos del adaptador. Una compuerta de seguridad de publicación (check-no-pii.mjs) falla la compilación cuando aparecen patrones de datos personales cubiertos en superficies de repositorio o paquete. Nota completa: docs/state-integrity.md.
Para el modelo operativo del lado del agente, consulta docs/task-graph-for-agents.md: el texto de la tarea es la proyección humana, pero la capa de ejecución necesita enlaces estructurados, comandos de prueba, requisitos de revisión y objetivos de escritura.
Trabajando en ATS
Contribuciones bienvenidas — correcciones de errores y especialmente nuevos adaptadores bajo packages/adapter-*.
Consulta CONTRIBUTING.md para la configuración de desarrollo y el patrón de adaptador, y
AGENTS.md si manejas un agente de codificación sobre el repositorio. Trabajando en el código fuente,
pi-codegraph le da a tu agente un
grafo de llamadas del monorepo — el patrón de adaptador y el radio de impacto de un cambio central —
para que deje de releer todo el árbol en cada sesión.
Lanzamientos y licencia
v0.17.0 añade recuperación de Beads lista con bloqueo, reclamos atómicos nombrados, escrituras de dependencias nativas y verificaciones reales de concurrencia en CLI. También corrige la selección de deshacer nombrada y actualiza dependencias compatibles. Historial completo: CHANGELOG.md.
MIT. Consulta LICENSE.
Si ATS es útil, considera dar una ⭐ — ayuda a otros a encontrarlo.