stratum-cli 0.9.0-beta.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.stratumrc.json.example +40 -7
- package/CHANGELOG.md +52 -0
- package/dist/index.js +21366 -13786
- package/evals/scenarios/code/code-edit-typographic-quotes.json +58 -0
- package/package.json +2 -2
- package/skills/.stratum-builtin-skills +1 -0
- package/skills/stratum-global-memory/SKILL.md +42 -0
- package/skills/stratum-project-memory/SKILL.md +56 -0
- package/skills/stratum-skill-authoring/SKILL.md +56 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "code-edit-typographic-quotes",
|
|
3
|
+
"group": "code",
|
|
4
|
+
"title": "Editar una línea con comillas tipográficas y guion largo",
|
|
5
|
+
"difficulty": "basic",
|
|
6
|
+
"setup": {
|
|
7
|
+
"files": {
|
|
8
|
+
"docs/nota.md": "# Nota\n\nEl \u201cinforme\u201d \u2014 pendiente de revisi\u00f3n\n"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"input": "En docs/nota.md, marca el informe como listo: deja la línea del informe como `El \"informe\" - listo`. No cambies nada más.",
|
|
12
|
+
"script": [
|
|
13
|
+
{
|
|
14
|
+
"toolCalls": [
|
|
15
|
+
{
|
|
16
|
+
"name": "read_file",
|
|
17
|
+
"args": {
|
|
18
|
+
"path": "docs/nota.md"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"toolCalls": [
|
|
25
|
+
{
|
|
26
|
+
"name": "edit_file",
|
|
27
|
+
"args": {
|
|
28
|
+
"path": "docs/nota.md",
|
|
29
|
+
"old_string": "El \"informe\" - pendiente de revisi\u00f3n",
|
|
30
|
+
"new_string": "El \"informe\" - listo"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"text": "Línea actualizada: el informe queda como listo."
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"expect": {
|
|
40
|
+
"description": "La línea del informe queda con comillas rectas y guion normal, sin tocar el resto del documento.",
|
|
41
|
+
"checks": [
|
|
42
|
+
{
|
|
43
|
+
"type": "command",
|
|
44
|
+
"label": "docs/nota.md tiene la línea reescrita y el resto intacto",
|
|
45
|
+
"run": [
|
|
46
|
+
"node",
|
|
47
|
+
"-e",
|
|
48
|
+
"const fs=require('fs');const want='# Nota\\n\\nEl \"informe\" - listo\\n';const got=fs.readFileSync('docs/nota.md','utf8');if(got!==want){console.error(JSON.stringify(got));process.exit(1)}"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"type": "metric",
|
|
53
|
+
"metric": "toolCalls",
|
|
54
|
+
"max": 6
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stratum-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Agente CLI extensible sobre un loop ReAct — provider-agnostic (Ollama, llama.cpp, vLLM, LiteLLM, OpenAI), con plan-and-execute, subagentes, MCP y SSH nativo",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"files": [
|
|
41
41
|
"dist/",
|
|
42
42
|
"evals/scenarios/",
|
|
43
|
+
"skills/",
|
|
43
44
|
"STRATUM.md",
|
|
44
45
|
".stratumrc.json.example",
|
|
45
46
|
"README.md",
|
|
@@ -57,7 +58,6 @@
|
|
|
57
58
|
"scripts": {
|
|
58
59
|
"dev": "tsx src/cli/index.ts",
|
|
59
60
|
"build": "tsup",
|
|
60
|
-
"build:desktop": "tsup --config tsup.desktop.config.ts",
|
|
61
61
|
"prepare": "tsup",
|
|
62
62
|
"test": "vitest",
|
|
63
63
|
"test:run": "vitest run",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Marca de la carpeta de skills de serie de Stratum (bundledSkillsDir). No borrar.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stratum-global-memory
|
|
3
|
+
description: Úsala antes de guardar o consultar algo de tu memoria a largo plazo — una preferencia del usuario, un hecho estable sobre él o su trabajo — o cuando pida «recuerda», «apunta», «olvida» o pregunte qué te contó antes.
|
|
4
|
+
presets: [assistant]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Memoria global del asistente
|
|
8
|
+
|
|
9
|
+
Tu memoria es **global**: la compartes entre todas las conversaciones con este usuario y no pertenece a ningún proyecto. No ves la memoria de los repositorios donde trabaja su agente de código, y lo que guardes no llega allí.
|
|
10
|
+
|
|
11
|
+
| Capa | Para qué | Cómo |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Decisiones | Preferencias, hechos estables y acuerdos que deben durar | `store_decision` / `recall_decisions` |
|
|
14
|
+
| `STRATUM.md` global | Instrucciones permanentes que el usuario escribió para ti | Ya está en tus instrucciones. Solo lectura |
|
|
15
|
+
|
|
16
|
+
La memoria de la conversación en curso es automática: no tiene tool y no la gestionas tú.
|
|
17
|
+
|
|
18
|
+
## Antes de responder: consulta
|
|
19
|
+
|
|
20
|
+
Si una preferencia o un hecho pasado podría cambiar tu respuesta (cómo le gusta que le escribas, a qué se dedica, algo que te pidió recordar), llama antes a `recall_decisions`. Si el índice no está disponible, sigue sin él: no reintentes.
|
|
21
|
+
|
|
22
|
+
## Qué guardar con `store_decision`
|
|
23
|
+
|
|
24
|
+
- una preferencia del usuario (tono, idioma, formato, herramientas que usa);
|
|
25
|
+
- un hecho estable sobre él o su trabajo que le ayudará en otras conversaciones;
|
|
26
|
+
- algo que te pide explícitamente que recuerdes.
|
|
27
|
+
|
|
28
|
+
Usa `type: user_preference` para preferencias; para lo demás, el que mejor encaje. `title` corto, `content` con el contexto, hasta 5 `tags` e `importance`.
|
|
29
|
+
|
|
30
|
+
**No guardes nunca:** secretos, contraseñas, datos de pago o de salud que no te haya pedido guardar; detalles de un proyecto concreto (eso es de la memoria de ese proyecto); lo que solo vale para esta conversación. Stratum también extrae recuerdos por su cuenta: no repitas a mano lo trivial.
|
|
31
|
+
|
|
32
|
+
## Si `store_decision` devuelve un id que ya existía
|
|
33
|
+
|
|
34
|
+
La memoria deduplica por significado: no se guardó nada nuevo porque ya había algo casi igual. No reintentes con otras palabras.
|
|
35
|
+
|
|
36
|
+
## Corregir u olvidar
|
|
37
|
+
|
|
38
|
+
No puedes editar ni borrar recuerdos. Para corregir uno, guarda otro cuyo `content` empiece por «Sustituye a `dec_…`:» con lo que cambió. Si el usuario quiere borrar algo, dile que puede hacerlo con `stratum memory forget --global <id>` (el id lo da `recall_decisions`).
|
|
39
|
+
|
|
40
|
+
## `STRATUM.md` global
|
|
41
|
+
|
|
42
|
+
No puedes escribirlo. Si algo merece ser una instrucción permanente («contéstame siempre en inglés»), propón al usuario el texto exacto y dile que lo añada a `~/.stratum/STRATUM.md`; mientras, guárdalo con `store_decision`.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stratum-project-memory
|
|
3
|
+
description: Úsala antes de guardar o consultar algo de la memoria del proyecto — una decisión técnica, una convención, una preferencia del usuario sobre este repo — o cuando el usuario pida «recuerda», «apunta», «olvida» o pregunte qué se decidió antes.
|
|
4
|
+
presets: [coding]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Memoria del proyecto
|
|
8
|
+
|
|
9
|
+
Trabajas en un proyecto y solo ves **su** memoria. No hay memoria global en esta sesión: lo que guardes se queda en este repositorio.
|
|
10
|
+
|
|
11
|
+
| Capa | Dónde vive | Para qué |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Decisiones | `<raíz del repo>/.stratum/memory/decisions.json` (con `store_decision` / `recall_decisions`) | Decisiones, convenciones y preferencias que deben sobrevivir a esta tarea |
|
|
14
|
+
| `STRATUM.md` | `<raíz del repo>/STRATUM.md` (lo ves ya en tus instrucciones) | Reglas del proyecto que deben estar presentes en **cada** sesión |
|
|
15
|
+
|
|
16
|
+
La memoria de la conversación (lo que se compacta en sesiones largas) es automática: no tiene tool y no la gestionas tú.
|
|
17
|
+
|
|
18
|
+
## Antes de decidir: consulta
|
|
19
|
+
|
|
20
|
+
Si vas a elegir algo que podría estar decidido ya (una librería, un patrón, cómo nombrar, cómo probar), llama antes a `recall_decisions` con una consulta en lenguaje natural. Si devuelve algo aplicable, síguelo y menciónalo; si contradice lo que pide el usuario, pregúntale.
|
|
21
|
+
|
|
22
|
+
Si responde que el índice semántico no está disponible, sigue sin él: no reintentes.
|
|
23
|
+
|
|
24
|
+
## Qué guardar con `store_decision`
|
|
25
|
+
|
|
26
|
+
Guarda solo lo que un agente futuro necesitaría y no podría deducir del código:
|
|
27
|
+
|
|
28
|
+
- una decisión con su porqué («usamos X en lugar de Y porque…»);
|
|
29
|
+
- una convención del proyecto que no está escrita en otro sitio;
|
|
30
|
+
- la causa de un bug difícil y cómo se resolvió;
|
|
31
|
+
- una preferencia del usuario sobre cómo trabajar en este repo.
|
|
32
|
+
|
|
33
|
+
Rellena todos los campos: `title` corto (≤ 100), `content` con contexto, alternativas y razón, `type` (`architectural`, `tooling`, `convention`, `bug_fix`, `security`, `user_preference`), hasta 5 `tags` e `importance`.
|
|
34
|
+
|
|
35
|
+
**No guardes nunca:** secretos, tokens, contraseñas o rutas a credenciales; el estado de la tarea en curso (eso va en `todo`); lo que ya está en `STRATUM.md` o en el código; detalles que solo valen para esta conversación. Además Stratum extrae decisiones por su cuenta al final de cada respuesta: no repitas a mano lo trivial.
|
|
36
|
+
|
|
37
|
+
## Si `store_decision` devuelve un id que ya existía
|
|
38
|
+
|
|
39
|
+
La memoria deduplica por significado (similitud ≥ 0,9). Si el id devuelto no es nuevo, **no se guardó nada**: había una decisión casi igual. No reintentes con otras palabras. Si lo nuevo de verdad matiza lo anterior, guárdalo como corrección (abajo).
|
|
40
|
+
|
|
41
|
+
## Corregir u olvidar
|
|
42
|
+
|
|
43
|
+
No puedes editar ni borrar decisiones. Para corregir una:
|
|
44
|
+
|
|
45
|
+
1. Guarda una decisión nueva cuyo `content` empiece por «Sustituye a `dec_…`:» y explique qué cambió y por qué.
|
|
46
|
+
2. Dile al usuario que puede borrar la antigua con `stratum memory forget <id>`.
|
|
47
|
+
|
|
48
|
+
Si el usuario pide olvidar algo, dale ese mismo comando con el id (búscalo con `recall_decisions`).
|
|
49
|
+
|
|
50
|
+
## Cuándo usar `STRATUM.md`
|
|
51
|
+
|
|
52
|
+
Para reglas que el agente debe tener siempre delante en este repo (comandos de build y test, convenciones de estilo, zonas que no tocar). Edítalo con `edit_file`, de forma breve: se carga entero en cada sesión. Si la regla es una decisión puntual, mejor `store_decision`. No escribas el `STRATUM.md` global (`~/.stratum/STRATUM.md`): es del asistente, no de este proyecto.
|
|
53
|
+
|
|
54
|
+
## Modo read-only y modo plan
|
|
55
|
+
|
|
56
|
+
`store_decision` no está disponible en una sesión read-only ni antes de aprobar un plan. No lo intentes: anota lo que guardarías y propónselo al usuario al final. `recall_decisions` sí funciona.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stratum-skill-authoring
|
|
3
|
+
description: Úsala cuando el usuario quiera crear, escribir, mejorar o revisar una skill de Stratum, o convertir una forma de trabajar que repite en instrucciones reutilizables.
|
|
4
|
+
presets: [coding, assistant]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Diseñar una skill
|
|
8
|
+
|
|
9
|
+
Una skill es un fichero markdown con instrucciones para un tipo de tarea. Stratum pone en tus instrucciones solo su nombre y su `description`; el cuerpo se carga con `read_skill` cuando la tarea encaja. Por eso la `description` decide si la skill se usa, y el cuerpo, si se usa bien.
|
|
10
|
+
|
|
11
|
+
## 1. Entiende la tarea antes de escribir
|
|
12
|
+
|
|
13
|
+
Pregunta (con `question`, en una sola tanda) lo que no sepas:
|
|
14
|
+
|
|
15
|
+
- ¿Qué tarea concreta cubre y qué frases usaría el usuario al pedirla?
|
|
16
|
+
- ¿Qué hace hoy mal o de forma inconsistente el agente sin ella?
|
|
17
|
+
- ¿Para el agente de código, para el asistente o para ambos?
|
|
18
|
+
- ¿Solo para un proyecto o para todos los del usuario?
|
|
19
|
+
|
|
20
|
+
## 2. Escribe el frontmatter
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
---
|
|
24
|
+
name: nombre-en-minusculas-con-guiones
|
|
25
|
+
description: Úsala cuando … (disparadores concretos: verbos, objetos, frases del usuario).
|
|
26
|
+
presets: [coding] # coding, assistant, o ambos
|
|
27
|
+
---
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- `name`: corto, en minúsculas, con guiones. Una skill con el mismo nombre que otra de menor precedencia la sustituye.
|
|
31
|
+
- `description`: empieza por «Úsala cuando…» y nombra situaciones reconocibles, no el contenido. Mal: «Guía de despliegue». Bien: «Úsala cuando el usuario pida desplegar, publicar una release o subir a producción».
|
|
32
|
+
- `presets`: sin él la skill vale solo para el agente de código.
|
|
33
|
+
|
|
34
|
+
## 3. Escribe el cuerpo
|
|
35
|
+
|
|
36
|
+
- Pasos accionables en imperativo, en el orden en que se hacen. Nada de teoría ni de historia.
|
|
37
|
+
- Lo que el agente no sabría solo: comandos exactos, rutas, criterios para decidir, errores típicos y cómo evitarlos.
|
|
38
|
+
- Qué no hacer, si hay un error frecuente.
|
|
39
|
+
- Cómo comprobar que salió bien (un comando, un resultado esperado).
|
|
40
|
+
- Breve: si pasa de una pantalla, probablemente son dos skills.
|
|
41
|
+
- No incluyas secretos ni datos personales: la skill puede compartirse.
|
|
42
|
+
|
|
43
|
+
## 4. Guárdala en su sitio
|
|
44
|
+
|
|
45
|
+
| Para | Ruta |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Este proyecto | `<repo>/.stratum/skills/<name>/SKILL.md` |
|
|
48
|
+
| Todos los proyectos del usuario | `~/.stratum/skills/<name>/SKILL.md` |
|
|
49
|
+
|
|
50
|
+
Precedencia: proyecto > usuario > las de serie de Stratum. Las nuevas se ven al empezar la siguiente sesión (`stratum skills list` las enumera).
|
|
51
|
+
|
|
52
|
+
**Si eres el asistente** (no puedes escribir fuera de tu carpeta): escribe el fichero en `outputs/<name>/SKILL.md` y dile al usuario a qué ruta de la tabla copiarlo. Recuerda que el asistente solo carga las skills de serie de Stratum: una skill de usuario la usará su agente de código.
|
|
53
|
+
|
|
54
|
+
## 5. Revísala con el usuario
|
|
55
|
+
|
|
56
|
+
Enséñale la `description` y pregúntale si reconoce en ella las frases con las que pediría esa tarea. Si no, reescríbela: es lo que más importa.
|