create-harness-btp 0.2.5 → 0.3.1
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/AI/VERSION +1 -1
- package/AI/agents/analyst.md +30 -0
- package/AI/agents/architect.md +29 -0
- package/AI/agents/backend-cap.md +19 -0
- package/AI/agents/deploy-cf.md +26 -0
- package/AI/agents/documentarian.md +20 -0
- package/AI/agents/e2e-fiori.md +62 -0
- package/AI/agents/frontend-ui5.md +20 -0
- package/AI/agents/harness-evolution.md +38 -0
- package/AI/agents/orchestrator.md +41 -0
- package/AI/agents/qa-review.md +28 -0
- package/AI/agents/researcher.md +29 -0
- package/AI/clients/claude/agents/analyst.md +22 -0
- package/AI/clients/claude/agents/architect.md +21 -0
- package/AI/clients/claude/agents/backend-cap.md +18 -0
- package/AI/clients/claude/agents/deploy-cf.md +25 -0
- package/AI/clients/claude/agents/documentarian.md +15 -0
- package/AI/clients/claude/agents/e2e-fiori.md +61 -0
- package/AI/clients/claude/agents/frontend-ui5.md +19 -0
- package/AI/clients/claude/agents/harness-evolution.md +37 -0
- package/AI/clients/claude/agents/orchestrator.md +40 -0
- package/AI/clients/claude/agents/qa-review.md +27 -0
- package/AI/clients/claude/agents/researcher.md +21 -0
- package/AI/clients/claude/commands/flow.md +16 -0
- package/AI/clients/claude/commands/verify.md +18 -0
- package/AI/clients/claude/skills/cap-cli/SKILL.md +21 -0
- package/AI/clients/claude/skills/cf-cli/SKILL.md +41 -0
- package/AI/clients/claude/skills/mta-build/SKILL.md +45 -0
- package/AI/clients/claude/skills/sap-verify/SKILL.md +27 -0
- package/AI/clients/copilot/agents/analyst.agent.md +22 -0
- package/AI/clients/copilot/agents/architect.agent.md +21 -0
- package/AI/clients/copilot/agents/backend-cap.agent.md +18 -0
- package/AI/clients/copilot/agents/deploy-cf.agent.md +25 -0
- package/AI/clients/copilot/agents/documentarian.agent.md +15 -0
- package/AI/clients/copilot/agents/e2e-fiori.agent.md +61 -0
- package/AI/clients/copilot/agents/frontend-ui5.agent.md +19 -0
- package/AI/clients/copilot/agents/harness-evolution.agent.md +37 -0
- package/AI/clients/copilot/agents/orchestrator.agent.md +40 -0
- package/AI/clients/copilot/agents/qa-review.agent.md +27 -0
- package/AI/clients/copilot/agents/researcher.agent.md +21 -0
- package/AI/clients/copilot/prompts/flow.prompt.md +16 -0
- package/AI/clients/copilot/prompts/verify.prompt.md +18 -0
- package/AI/clients/copilot/skills/cap-cli/SKILL.md +21 -0
- package/AI/clients/copilot/skills/cf-cli/SKILL.md +41 -0
- package/AI/clients/copilot/skills/mta-build/SKILL.md +45 -0
- package/AI/clients/copilot/skills/sap-verify/SKILL.md +27 -0
- package/AI/clients/cursor/commands/flow.md +12 -0
- package/AI/clients/cursor/commands/verify.md +14 -0
- package/AI/clients/cursor/skills/cap-cli/SKILL.md +21 -0
- package/AI/clients/cursor/skills/cf-cli/SKILL.md +41 -0
- package/AI/clients/cursor/skills/mta-build/SKILL.md +45 -0
- package/AI/clients/cursor/skills/sap-verify/SKILL.md +27 -0
- package/AI/clients/opencode/agents/analyst.md +29 -0
- package/AI/clients/opencode/agents/architect.md +28 -0
- package/AI/clients/opencode/agents/backend-cap.md +18 -0
- package/AI/clients/opencode/agents/deploy-cf.md +25 -0
- package/AI/clients/opencode/agents/documentarian.md +19 -0
- package/AI/clients/opencode/agents/e2e-fiori.md +61 -0
- package/AI/clients/opencode/agents/frontend-ui5.md +19 -0
- package/AI/clients/opencode/agents/harness-evolution.md +37 -0
- package/AI/clients/opencode/agents/orchestrator.md +40 -0
- package/AI/clients/opencode/agents/qa-review.md +27 -0
- package/AI/clients/opencode/agents/researcher.md +28 -0
- package/AI/clients/opencode/commands/flow.md +16 -0
- package/AI/clients/opencode/commands/verify.md +18 -0
- package/AI/clients/opencode/skills/cap-cli/SKILL.md +21 -0
- package/AI/clients/opencode/skills/cf-cli/SKILL.md +41 -0
- package/AI/clients/opencode/skills/mta-build/SKILL.md +45 -0
- package/AI/clients/opencode/skills/sap-verify/SKILL.md +27 -0
- package/AI/commands/flow.md +16 -0
- package/AI/commands/verify.md +18 -0
- package/AI/skills/cap-cli/SKILL.md +21 -0
- package/AI/skills/cf-cli/SKILL.md +41 -0
- package/AI/skills/mta-build/SKILL.md +45 -0
- package/AI/skills/sap-verify/SKILL.md +27 -0
- package/README.md +83 -17
- package/VERSION +1 -1
- package/bin/harness-btp.js +74 -28
- package/install.ps1 +72 -22
- package/install.sh +88 -28
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cf-cli
|
|
3
|
+
description: Uso estándar del CLI de Cloud Foundry (cf)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CLI Cloud Foundry (`cf`)
|
|
7
|
+
|
|
8
|
+
El CLI de Cloud Foundry se invoca **siempre** como `cf` (instalación
|
|
9
|
+
estándar del CLI; adapta rutas según tu equipo). Si `cf` en tu máquina
|
|
10
|
+
corresponde a otra herramienta, define un alias propio y úsalo de forma
|
|
11
|
+
consistente donde el harness diga `cf`.
|
|
12
|
+
|
|
13
|
+
## Lectura segura (sin secretos)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
cf target # endpoint / org / espacio actuales
|
|
17
|
+
cf api # endpoint y versión API
|
|
18
|
+
cf orgs # solo nombres
|
|
19
|
+
cf spaces # solo nombres
|
|
20
|
+
cf apps # estado observable (started/stopped, rutas)
|
|
21
|
+
cf services # instancias visibles
|
|
22
|
+
cf logs <app> --recent
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`target`, `api`, `orgs`, `spaces` y `app <nombre>` nunca muestran tokens.
|
|
26
|
+
Si una salida incluyera un secreto, redáctalo antes de citarla.
|
|
27
|
+
|
|
28
|
+
## Mutaciones (solo `deploy-cf`, con destino confirmado)
|
|
29
|
+
|
|
30
|
+
- Confirmar endpoint/org/espacio contra la spec **antes** de cada despliegue.
|
|
31
|
+
- `cf push` para apps simples; `cf deploy <archivo>.mtar` para MTA
|
|
32
|
+
(requiere plugin `multiapps`, no instalado: ver skill `mta-build`).
|
|
33
|
+
- Verificar después: `cf apps` + `cf logs <app> --recent` + URL.
|
|
34
|
+
|
|
35
|
+
## Denylist
|
|
36
|
+
|
|
37
|
+
- Borrar o renombrar orgs, espacios, apps o servicios fuera del MVP.
|
|
38
|
+
- `cf login`/re-autenticaciones no solicitadas (si la sesión caduca,
|
|
39
|
+
pedir al usuario el flujo interactivo, nunca credenciales en texto).
|
|
40
|
+
- `--var`/`--vars-file` con secretos en shell compartida; usar archivos ya
|
|
41
|
+
ignorados por Git y no citar sus valores.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mta-build
|
|
3
|
+
description: Construir y verificar artefactos MTAR con mbt en este equipo
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build MTA (`mbt`)
|
|
7
|
+
|
|
8
|
+
`mbt` es Cloud MTA Build Tool 1.2.50 (verificado 2026-10-29). Invocarlo
|
|
9
|
+
siempre como `mbt`, nunca como `cf` ni rutas inventadas.
|
|
10
|
+
|
|
11
|
+
## Flujo
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
mbt build # requiere mta.yaml en la raíz del proyecto
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- El `.mtar` resultante queda en `mta_archives/` con el nombre/versión de
|
|
18
|
+
`mta.yaml`. Comprobar existencia y fecha antes de desplegar.
|
|
19
|
+
- Para módulos Node.js, `mbt` ejecuta `npm install`/`npm run build` según
|
|
20
|
+
`mta.yaml`; para Java necesita Maven (`mvn` no instalado: documentar como
|
|
21
|
+
pendiente si una spec lo exige).
|
|
22
|
+
- `mbt build --help` para flags (`--mtar`, `--platform=cf`).
|
|
23
|
+
|
|
24
|
+
## Despliegue del MTAR
|
|
25
|
+
|
|
26
|
+
`cf deploy <archivo>.mtar` requiere el **plugin multiapps**. Verificar
|
|
27
|
+
siempre con `cf plugins` antes de asumir su ausencia (2026-10-30 resultó
|
|
28
|
+
ya instalado contra lo documentado). Instalarlo solo cuando un MVP necesite
|
|
29
|
+
despliegue MTA:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
cf install-plugin -r CF-Community multiapps
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Alternativa sin plugin para MVPs simples: `cf push` por app según plan.
|
|
36
|
+
|
|
37
|
+
## Notas
|
|
38
|
+
|
|
39
|
+
- El binario `mbt.exe` se obtuvo con el propio `install.js` del paquete npm
|
|
40
|
+
(`node install.js cloud-mta-build-tool`). Si `mbt` vuelve a fallar tras
|
|
41
|
+
una actualización global, repetir ese comando en el directorio del paquete.
|
|
42
|
+
- Nunca versionar `mta_archives/*.mtar` ni `default-services.json` con claves.
|
|
43
|
+
- `mbt` exige `make` en `%PATH%` (ver `AGENTS.md` § Disciplina de shell y
|
|
44
|
+
CLIs): si falla `exec: "make": executable file not found`, anteponer el
|
|
45
|
+
`bin` de ezwinports/GnuWin32 al `$env:PATH` solo para el comando.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sap-verify
|
|
3
|
+
description: Clasificar disponibilidad, cuenta y coste de servicios SAP/BTP
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Verificación de dependencias externas SAP
|
|
7
|
+
|
|
8
|
+
Toda afirmación sobre un servicio, plan, API o capacidad BTP se clasifica en
|
|
9
|
+
una de estas categorías, con fuente y fecha:
|
|
10
|
+
|
|
11
|
+
| Categoría | Significado |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **Documentado** | Docs oficiales vigentes + evidencia (comando, consola o enlace con fecha). |
|
|
14
|
+
| **Pendiente en cuenta** | Existe en docs pero sin comprobar en la subcuenta/destino real. |
|
|
15
|
+
| **Coste por cotizar** | Requiere plan de pago o métrica no verificada; no activar sin confirmación. |
|
|
16
|
+
|
|
17
|
+
## Reglas
|
|
18
|
+
|
|
19
|
+
- Desarrollo local y mocks primero; servicios reales solo con evidencia.
|
|
20
|
+
- Distinguir Windows local frente a BAS/dev space remoto: una instalación o
|
|
21
|
+
capacidad de un lado no implica la del otro.
|
|
22
|
+
- No afirmar que una integración está aprobada o disponible hasta comprobarla
|
|
23
|
+
con documentación y accesos vigentes.
|
|
24
|
+
- Costes: antes de activar cualquier recurso con coste, verificar precio y
|
|
25
|
+
documentarlo en la spec; capa gratuita por defecto.
|
|
26
|
+
- Bloqueos externos no paran el MVP: documentar evidencia y continuar con
|
|
27
|
+
mocks o adaptador local.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Ciclo completo spec-despliegue de un MVP SAP BTP
|
|
3
|
+
agent: orchestrator
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Ejecuta el flujo sobre la especificación: $ARGUMENTS
|
|
7
|
+
(p. ej. `/flow specs/mi-mvp.md`).
|
|
8
|
+
|
|
9
|
+
El orquestador recorre las etapas 0–10 de `AGENTS.md` con los especialistas
|
|
10
|
+
adecuados (`analyst`, `researcher`, `architect`, `frontend-ui5`,
|
|
11
|
+
`backend-cap`, `qa-review`, `deploy-cf`, `documentarian`). En MVPs pequeños
|
|
12
|
+
puede saltar etapas irrelevantes y registrarlo; ningún riesgo o
|
|
13
|
+
incertidumbre bloquea por sí solo: se investiga, se decide con evidencia y
|
|
14
|
+
se continúa con lo resoluble. La puerta de despliegue (etapa 7) es
|
|
15
|
+
obligatoria antes de desplegar. Al cerrar: qué se hizo, verificaciones con
|
|
16
|
+
comandos y resultado real, y qué quedó pendiente y por qué.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Puerta de despliegue CF sin desplegar
|
|
3
|
+
agent: orchestrator
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Ejecuta solo la puerta de despliegue (etapa 7) para $ARGUMENTS
|
|
7
|
+
(spec o nombre de app; si se omite, el MVP en curso).
|
|
8
|
+
|
|
9
|
+
Verificaciones (delegables en `qa-review` + `deploy-cf` en solo lectura):
|
|
10
|
+
|
|
11
|
+
1. `cf target` coincide con el destino de la spec (endpoint/org/espacio).
|
|
12
|
+
2. El artefacto existe y es reciente (`.mtar` en `mta_archives/` o bundle
|
|
13
|
+
para `push`).
|
|
14
|
+
3. Todos los criterios de aceptación están en verde con evidencia.
|
|
15
|
+
4. Diff/Git sin secretos ni archivos que debieran estar ignorados.
|
|
16
|
+
|
|
17
|
+
Veredicto: apto / no apto con motivos concretos. Este comando nunca
|
|
18
|
+
despliega ni muta nada en Cloud Foundry.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cap-cli
|
|
3
|
+
description: Invocación verificada del CLI de CAP y facets en este equipo
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CLI de CAP (`cds`)
|
|
7
|
+
|
|
8
|
+
Nombres verificados el 2026-10-29 (docs cap.cloud.sap vía `context7`;
|
|
9
|
+
paquete `@cap-js/cds-dk` **no existe** — el correcto es `@sap/cds-dk`):
|
|
10
|
+
|
|
11
|
+
- CLI solo vía `npx -p @sap/cds-dk cds ...` (el `node_modules` del proyecto
|
|
12
|
+
no incluye el ejecutable `cds`; `npx cds` a secas falla).
|
|
13
|
+
- Runtime del proyecto: `@sap/cds` v10 + `@cap-js/sqlite` v3 (SQLite solo
|
|
14
|
+
para dev local; sin persistencia en CF).
|
|
15
|
+
- Scaffold: `npx -p @sap/cds-dk cds init <nombre> --nodejs` (no global).
|
|
16
|
+
- Facets usadas en este harness: `mta xsuaa approuter html5-repo
|
|
17
|
+
destination ui5` (lista completa real con `cds add --help`, no de memoria).
|
|
18
|
+
- Tras `cds add`, siempre `npm install` antes del siguiente comando.
|
|
19
|
+
- `cds add` es aditivo y genera `mta.yaml`/`xs-security.json`: revisar el
|
|
20
|
+
diff antes de aceptar lo generado (nombres de instancia deben coincidir
|
|
21
|
+
con las existentes en la subcuenta).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cf-cli
|
|
3
|
+
description: Uso estándar del CLI de Cloud Foundry (cf)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CLI Cloud Foundry (`cf`)
|
|
7
|
+
|
|
8
|
+
El CLI de Cloud Foundry se invoca **siempre** como `cf` (instalación
|
|
9
|
+
estándar del CLI; adapta rutas según tu equipo). Si `cf` en tu máquina
|
|
10
|
+
corresponde a otra herramienta, define un alias propio y úsalo de forma
|
|
11
|
+
consistente donde el harness diga `cf`.
|
|
12
|
+
|
|
13
|
+
## Lectura segura (sin secretos)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
cf target # endpoint / org / espacio actuales
|
|
17
|
+
cf api # endpoint y versión API
|
|
18
|
+
cf orgs # solo nombres
|
|
19
|
+
cf spaces # solo nombres
|
|
20
|
+
cf apps # estado observable (started/stopped, rutas)
|
|
21
|
+
cf services # instancias visibles
|
|
22
|
+
cf logs <app> --recent
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`target`, `api`, `orgs`, `spaces` y `app <nombre>` nunca muestran tokens.
|
|
26
|
+
Si una salida incluyera un secreto, redáctalo antes de citarla.
|
|
27
|
+
|
|
28
|
+
## Mutaciones (solo `deploy-cf`, con destino confirmado)
|
|
29
|
+
|
|
30
|
+
- Confirmar endpoint/org/espacio contra la spec **antes** de cada despliegue.
|
|
31
|
+
- `cf push` para apps simples; `cf deploy <archivo>.mtar` para MTA
|
|
32
|
+
(requiere plugin `multiapps`, no instalado: ver skill `mta-build`).
|
|
33
|
+
- Verificar después: `cf apps` + `cf logs <app> --recent` + URL.
|
|
34
|
+
|
|
35
|
+
## Denylist
|
|
36
|
+
|
|
37
|
+
- Borrar o renombrar orgs, espacios, apps o servicios fuera del MVP.
|
|
38
|
+
- `cf login`/re-autenticaciones no solicitadas (si la sesión caduca,
|
|
39
|
+
pedir al usuario el flujo interactivo, nunca credenciales en texto).
|
|
40
|
+
- `--var`/`--vars-file` con secretos en shell compartida; usar archivos ya
|
|
41
|
+
ignorados por Git y no citar sus valores.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mta-build
|
|
3
|
+
description: Construir y verificar artefactos MTAR con mbt en este equipo
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build MTA (`mbt`)
|
|
7
|
+
|
|
8
|
+
`mbt` es Cloud MTA Build Tool 1.2.50 (verificado 2026-10-29). Invocarlo
|
|
9
|
+
siempre como `mbt`, nunca como `cf` ni rutas inventadas.
|
|
10
|
+
|
|
11
|
+
## Flujo
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
mbt build # requiere mta.yaml en la raíz del proyecto
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- El `.mtar` resultante queda en `mta_archives/` con el nombre/versión de
|
|
18
|
+
`mta.yaml`. Comprobar existencia y fecha antes de desplegar.
|
|
19
|
+
- Para módulos Node.js, `mbt` ejecuta `npm install`/`npm run build` según
|
|
20
|
+
`mta.yaml`; para Java necesita Maven (`mvn` no instalado: documentar como
|
|
21
|
+
pendiente si una spec lo exige).
|
|
22
|
+
- `mbt build --help` para flags (`--mtar`, `--platform=cf`).
|
|
23
|
+
|
|
24
|
+
## Despliegue del MTAR
|
|
25
|
+
|
|
26
|
+
`cf deploy <archivo>.mtar` requiere el **plugin multiapps**. Verificar
|
|
27
|
+
siempre con `cf plugins` antes de asumir su ausencia (2026-10-30 resultó
|
|
28
|
+
ya instalado contra lo documentado). Instalarlo solo cuando un MVP necesite
|
|
29
|
+
despliegue MTA:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
cf install-plugin -r CF-Community multiapps
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Alternativa sin plugin para MVPs simples: `cf push` por app según plan.
|
|
36
|
+
|
|
37
|
+
## Notas
|
|
38
|
+
|
|
39
|
+
- El binario `mbt.exe` se obtuvo con el propio `install.js` del paquete npm
|
|
40
|
+
(`node install.js cloud-mta-build-tool`). Si `mbt` vuelve a fallar tras
|
|
41
|
+
una actualización global, repetir ese comando en el directorio del paquete.
|
|
42
|
+
- Nunca versionar `mta_archives/*.mtar` ni `default-services.json` con claves.
|
|
43
|
+
- `mbt` exige `make` en `%PATH%` (ver `AGENTS.md` § Disciplina de shell y
|
|
44
|
+
CLIs): si falla `exec: "make": executable file not found`, anteponer el
|
|
45
|
+
`bin` de ezwinports/GnuWin32 al `$env:PATH` solo para el comando.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sap-verify
|
|
3
|
+
description: Clasificar disponibilidad, cuenta y coste de servicios SAP/BTP
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Verificación de dependencias externas SAP
|
|
7
|
+
|
|
8
|
+
Toda afirmación sobre un servicio, plan, API o capacidad BTP se clasifica en
|
|
9
|
+
una de estas categorías, con fuente y fecha:
|
|
10
|
+
|
|
11
|
+
| Categoría | Significado |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **Documentado** | Docs oficiales vigentes + evidencia (comando, consola o enlace con fecha). |
|
|
14
|
+
| **Pendiente en cuenta** | Existe en docs pero sin comprobar en la subcuenta/destino real. |
|
|
15
|
+
| **Coste por cotizar** | Requiere plan de pago o métrica no verificada; no activar sin confirmación. |
|
|
16
|
+
|
|
17
|
+
## Reglas
|
|
18
|
+
|
|
19
|
+
- Desarrollo local y mocks primero; servicios reales solo con evidencia.
|
|
20
|
+
- Distinguir Windows local frente a BAS/dev space remoto: una instalación o
|
|
21
|
+
capacidad de un lado no implica la del otro.
|
|
22
|
+
- No afirmar que una integración está aprobada o disponible hasta comprobarla
|
|
23
|
+
con documentación y accesos vigentes.
|
|
24
|
+
- Costes: antes de activar cualquier recurso con coste, verificar precio y
|
|
25
|
+
documentarlo en la spec; capa gratuita por defecto.
|
|
26
|
+
- Bloqueos externos no paran el MVP: documentar evidencia y continuar con
|
|
27
|
+
mocks o adaptador local.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# harness-btp
|
|
2
2
|
|
|
3
|
-
[](https://github.com/horangelmillan/harness-btp/releases/tag/v0.3.1)
|
|
4
4
|
[](LICENSE)
|
|
5
5
|
[](https://github.com/horangelmillan/harness-btp)
|
|
6
6
|
[](https://github.com/horangelmillan/harness-btp)
|
|
@@ -16,8 +16,10 @@ Para quien construye MVPs SAP BTP y quiere empezar cada proyecto con el mismo fl
|
|
|
16
16
|
- [Quickstart](#quickstart)
|
|
17
17
|
- [Instalación](#instalación)
|
|
18
18
|
- [Instalación asistida por agente](#instalación-asistida-por-agente)
|
|
19
|
+
- [Manual de uso](#manual-de-uso)
|
|
19
20
|
- [Actualizar y desinstalar](#actualizar-y-desinstalar)
|
|
20
21
|
- [Adaptadores opcionales](#adaptadores-opcionales)
|
|
22
|
+
- [Multi-cliente](#multi-cliente)
|
|
21
23
|
- [Estructura del repo](#estructura-del-repo)
|
|
22
24
|
- [Cómo lo descubre el agente](#cómo-lo-descubre-el-agente)
|
|
23
25
|
- [Troubleshooting](#troubleshooting)
|
|
@@ -55,7 +57,7 @@ El camino de 30 segundos en un proyecto nuevo. Elige tu shell:
|
|
|
55
57
|
PowerShell (Windows):
|
|
56
58
|
|
|
57
59
|
```powershell
|
|
58
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
60
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
59
61
|
powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
|
|
60
62
|
Remove-Item -Recurse -Force AI-tmp
|
|
61
63
|
```
|
|
@@ -63,7 +65,7 @@ Remove-Item -Recurse -Force AI-tmp
|
|
|
63
65
|
bash (Linux, macOS o Git Bash):
|
|
64
66
|
|
|
65
67
|
```bash
|
|
66
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
68
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
67
69
|
sh AI-tmp/install.sh --dest .
|
|
68
70
|
rm -rf AI-tmp
|
|
69
71
|
```
|
|
@@ -79,7 +81,7 @@ Descarga solo lo necesario, sin historial git:
|
|
|
79
81
|
PowerShell:
|
|
80
82
|
|
|
81
83
|
```powershell
|
|
82
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
84
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
83
85
|
powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
|
|
84
86
|
Remove-Item -Recurse -Force AI-tmp
|
|
85
87
|
```
|
|
@@ -87,7 +89,7 @@ Remove-Item -Recurse -Force AI-tmp
|
|
|
87
89
|
bash:
|
|
88
90
|
|
|
89
91
|
```bash
|
|
90
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
92
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
91
93
|
sh AI-tmp/install.sh --dest .
|
|
92
94
|
rm -rf AI-tmp
|
|
93
95
|
```
|
|
@@ -99,7 +101,7 @@ Clon superficial anclado al tag:
|
|
|
99
101
|
PowerShell:
|
|
100
102
|
|
|
101
103
|
```powershell
|
|
102
|
-
git clone --branch v0.
|
|
104
|
+
git clone --branch v0.3.1 --depth 1 https://github.com/horangelmillan/harness-btp AI-tmp
|
|
103
105
|
powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
|
|
104
106
|
Remove-Item -Recurse -Force AI-tmp
|
|
105
107
|
```
|
|
@@ -107,7 +109,7 @@ Remove-Item -Recurse -Force AI-tmp
|
|
|
107
109
|
bash:
|
|
108
110
|
|
|
109
111
|
```bash
|
|
110
|
-
git clone --branch v0.
|
|
112
|
+
git clone --branch v0.3.1 --depth 1 https://github.com/horangelmillan/harness-btp AI-tmp
|
|
111
113
|
sh AI-tmp/install.sh --dest .
|
|
112
114
|
rm -rf AI-tmp
|
|
113
115
|
```
|
|
@@ -117,24 +119,25 @@ rm -rf AI-tmp
|
|
|
117
119
|
Sin descargas manuales (requiere publicar `create-harness-btp` en el registry). Igual en todos los SO:
|
|
118
120
|
|
|
119
121
|
```bash
|
|
120
|
-
pnpm dlx create-harness-btp@0.
|
|
122
|
+
pnpm dlx create-harness-btp@0.3.1 --dest .
|
|
121
123
|
```
|
|
122
124
|
|
|
123
125
|
### Qué hace el instalador
|
|
124
126
|
|
|
125
127
|
- `CREATE: AI/` o `SKIP: AI/ ya existe` (solo lo reemplaza con `-Force` / `--force`, con backup a `AI.bak`).
|
|
126
128
|
- `CREATE: AGENTS.md` o `SKIP: AGENTS.md ya existe` (tu `AGENTS.md` propio se conserva; con `-Force` / `--force` se respalda a `AGENTS.md.bak`).
|
|
127
|
-
- Fusiona
|
|
129
|
+
- Fusiona el árbol del cliente agéntico (`--client`, por defecto `auto`) desde `AI/clients/<cliente>/` en la raíz (ver [Multi-cliente](#multi-cliente)): sin fuerza solo copia los archivos que falten (`SKIP: <dir>/<ruta> ya existe` por cada uno conservado); con `-Force` / `--force` respalda cada dir a `<dir>.bak` (`BACKUP: <dir>/ -> <dir>.bak`) y copia todo.
|
|
128
130
|
- Fusiona `.gitignore`: añade las líneas que falten, sin duplicar ni borrar las tuyas.
|
|
129
131
|
- **No toca** `package.json` ni `mta.yaml` de tu proyecto, nunca.
|
|
130
132
|
|
|
131
133
|
Salida típica en proyecto nuevo:
|
|
132
134
|
|
|
133
135
|
```text
|
|
134
|
-
CREATE: AI/
|
|
136
|
+
CREATE: AI/ (v0.3.1)
|
|
135
137
|
CREATE: AGENTS.md
|
|
138
|
+
CLIENT: auto -> opencode
|
|
136
139
|
CREATE: .opencode/ (+17 archivos)
|
|
137
|
-
OK: harness v0.
|
|
140
|
+
OK: harness v0.3.1 instalado
|
|
138
141
|
```
|
|
139
142
|
|
|
140
143
|
## Instalación asistida por agente
|
|
@@ -147,6 +150,36 @@ Déjame este proyecto listo con el harness BTP: lee https://raw.githubuserconten
|
|
|
147
150
|
|
|
148
151
|
Vale para proyecto nuevo (con URL), existente, Windows/Linux/macOS y cualquier cliente que lea este README. El archivo `prompts/setup.md` vive versionado con el harness: siempre está al día sin que cambies tu línea.
|
|
149
152
|
|
|
153
|
+
## Manual de uso
|
|
154
|
+
|
|
155
|
+
El recorrido normal de un proyecto, en orden. Cada paso dice **qué hace, con qué comando y cuándo toca**.
|
|
156
|
+
|
|
157
|
+
**1. Instalar (una sola vez por proyecto).** Copia la carpeta `AI/` dentro de tu proyecto con `pnpm dlx`, `degit` o `git clone` (ver [Instalación](#instalación)). No mueve ni renombra nada tuyo; si `AI/` ya existe, avisa en vez de pisar.
|
|
158
|
+
|
|
159
|
+
**2. Comprobar que tu agente lo adoptó.** Abre el proyecto en tu cliente y verifica: el **orquestador** aparece entre sus agentes, existe el comando **`/flow`** y responde si le pides usar una **skill** (p. ej. que te muestre el `target` actual). Si algo de esto falta, mira [Troubleshooting](#troubleshooting) antes de seguir.
|
|
160
|
+
|
|
161
|
+
**3. Contar lo que quieres (la spec).** Copia `AI/specs/_template.md` a `AI/specs/<tu-proyecto>.md` y rellénala: qué debe hacer, dónde vive en SAP y cómo se comprueba que funciona. Sin esto escrito no hay despliegue — el agente lo exige.
|
|
162
|
+
|
|
163
|
+
**4. Ponerlo a trabajar: `/flow`.** Escribe `/flow AI/specs/<tu-proyecto>.md` y el orquestador recorre las etapas (revisar tu spec, investigar la doc oficial, planear, construir, probar, corregir). Te pregunta cuando le falta un dato y al cerrar te cuenta qué hizo, con qué comandos lo verificó y qué quedó pendiente.
|
|
164
|
+
|
|
165
|
+
**5. Revisar antes de publicar: `/verify`.** Es la puerta de despliegue: comprueba destino, artefacto construido, pruebas en verde y Git limpio **sin desplegar nada**. Solo un veredicto "apto" permite pasar al despliegue.
|
|
166
|
+
|
|
167
|
+
**6. Desplegar (solo con tu orden).** El despliegue lo ejecuta un único agente especialista y deja evidencia (apps en marcha, registros, URL). Primer despliegue a un destino nuevo siempre pide tu confirmación del destino.
|
|
168
|
+
|
|
169
|
+
**7. Guardar y contar.** Los cambios se guardan en commits locales; nada sale a remoto sin que lo pidas expresamente. La spec y los informes quedan al día al cerrar.
|
|
170
|
+
|
|
171
|
+
| Comando o guion | Para qué sirve (en una línea) | Cuándo usarlo |
|
|
172
|
+
|---|---|---|
|
|
173
|
+
| `pnpm dlx create-harness-btp …` / `degit` / `git clone` | traer el harness al proyecto | una vez por proyecto; repite contra otro tag para actualizar |
|
|
174
|
+
| `install.ps1` / `install.sh` | copiar `AI/`, crear el puntero y fusionar `.gitignore` sin romper nada | lo corre el paquete solo; úsalo directo si instalaste por `degit`/`clone` |
|
|
175
|
+
| `/flow <spec>` | ejecutar el ciclo completo sobre tu spec | cada vez que construyas o cambies el MVP |
|
|
176
|
+
| `/verify` | revisar que todo está listo sin desplegar | antes de cada despliegue, siempre |
|
|
177
|
+
| `AI/scripts/check-prereqs.*` | decirte qué herramientas te faltan y dónde instalarlas | al estrenar máquina o si algo falla por entorno |
|
|
178
|
+
| `AI/scripts/check-docs.*` | comprobar que los enlaces a documentación oficial siguen vivos | si sospechas docs viejas, o antes de un MVP delicado |
|
|
179
|
+
| `AI/scripts/cf-safe.*` | leer Cloud Foundry tapando secretos | no lo llamas tú: lo usan los agentes por dentro |
|
|
180
|
+
|
|
181
|
+
**Cómo saber que todo va bien:** el instalador termina en `OK:`, `AI/VERSION` dice la versión que instalaste, tu agente muestra al orquestador y `/flow` existe, y `/verify` explica cada veredicto con motivos. Si algo de esto no cuadra, no sigas: está en [Troubleshooting](#troubleshooting).
|
|
182
|
+
|
|
150
183
|
## Actualizar y desinstalar
|
|
151
184
|
|
|
152
185
|
**Actualizar:** repite el mismo comando de instalación contra el tag nuevo. Sin `-Force` / `--force` lo existente se conserva (`SKIP:`); con fuerza se reemplaza con backup:
|
|
@@ -154,7 +187,7 @@ Vale para proyecto nuevo (con URL), existente, Windows/Linux/macOS y cualquier c
|
|
|
154
187
|
PowerShell:
|
|
155
188
|
|
|
156
189
|
```powershell
|
|
157
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
190
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
158
191
|
powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest . -Force
|
|
159
192
|
Remove-Item -Recurse -Force AI-tmp
|
|
160
193
|
# tu versión anterior queda en AI.bak por si quieres comparar
|
|
@@ -163,7 +196,7 @@ Remove-Item -Recurse -Force AI-tmp
|
|
|
163
196
|
bash:
|
|
164
197
|
|
|
165
198
|
```bash
|
|
166
|
-
npx -p degit degit horangelmillan/harness-btp#v0.
|
|
199
|
+
npx -p degit degit horangelmillan/harness-btp#v0.3.1 AI-tmp -- AI-tmp
|
|
167
200
|
sh AI-tmp/install.sh --dest . --force
|
|
168
201
|
rm -rf AI-tmp
|
|
169
202
|
# tu versión anterior queda en AI.bak por si quieres comparar
|
|
@@ -194,9 +227,32 @@ El harness funciona con **cualquier** cliente agéntico que lea `AGENTS.md`. Est
|
|
|
194
227
|
- **`AI/.opencode/`** — agentes, comandos y skills de ejemplo con el layout de OpenCode. Si tu cliente usa otro layout, ignóralos o adaptalos: el flujo vive en `AI/AGENTS.md`, `AI/INICIO.md`, `AI/docs/` y `AI/scripts/`, que son Markdown + shell portátil.
|
|
195
228
|
- **`AI/opencode.fragment.jsonc`** — fragmento de ejemplo para fusionar en tu `opencode.jsonc` (p. ej. el bloque MCP `graphify-code`, deshabilitado por defecto). Solo aplica a OpenCode; otros clientes lo ignoran sin efecto.
|
|
196
229
|
- **`install.ps1` / `install.sh`** — elige el de tu shell; ambos aplican la misma lógica idempotente. Los scripts de `AI/scripts/` también vienen en par `.ps1` / `.sh`.
|
|
230
|
+
- **Multi-cliente:** desde v0.3.0 la fuente única es `AI/agents/`, `AI/commands/`, `AI/skills/` y cada cliente recibe su árbol renderizado en `AI/clients/<cliente>/` (ver [Multi-cliente](#multi-cliente)). `AI/.opencode/` se conserva intacto por compatibilidad.
|
|
197
231
|
|
|
198
232
|
Nada del núcleo exige OpenCode, Windows ni ningún modelo concreto.
|
|
199
233
|
|
|
234
|
+
## Multi-cliente
|
|
235
|
+
|
|
236
|
+
El harness se configura para el cliente agéntico de turno desde UNA sola definición canónica:
|
|
237
|
+
|
|
238
|
+
- **Canónico (`AI/`):** `AI/agents/*.md` (11 agentes), `AI/commands/*.md` (`flow`, `verify`), `AI/skills/*/SKILL.md` (4 skills). Es la única fuente que se edita a mano.
|
|
239
|
+
- **Render (`AI/clients/`):** generado con `node scripts/render-clients.js` (sin dependencias); `node scripts/render-clients.js --check` solo verifica. El CI lo exige en verde antes de publicar (ver `.github/workflows/publish.yml`). No edites `AI/clients/` a mano: tus cambios se pierden en el próximo render.
|
|
240
|
+
|
|
241
|
+
| Cliente | `--client` | Rutas generadas en la raíz | Adaptación |
|
|
242
|
+
|---|---|---|---|
|
|
243
|
+
| OpenCode | `opencode` | `.opencode/agents/`, `.opencode/commands/`, `.opencode/skills/` | copia exacta de `AI/.opencode/` |
|
|
244
|
+
| Claude Code | `claude` | `.claude/agents/`, `.claude/commands/`, `.claude/skills/` | agents con `{name,description}` (sin `mode`) |
|
|
245
|
+
| Cursor | `cursor` | `.cursor/commands/`, `.agents/skills/` | commands sin frontmatter (solo cuerpo) |
|
|
246
|
+
| Copilot | `copilot` | `.github/agents/*.agent.md`, `.github/prompts/*.prompt.md`, `.github/skills/` | renombrados a su convención |
|
|
247
|
+
| Aider (y genéricos) | `aider` | nada que generar | usan el `AGENTS.md` raíz |
|
|
248
|
+
|
|
249
|
+
Flag `--client` en `install.ps1` (`-Client`), `install.sh` y `bin/harness-btp.js`:
|
|
250
|
+
|
|
251
|
+
- `auto` (defecto): detecta por huellas (`CLAUDE.md`/`.claude`→claude, `.cursor`→cursor, `.github`→copilot, `opencode.json*`/`.opencode`→opencode); sin huellas usa opencode por compatibilidad histórica. Si hay huellas de varios clientes, fusiona los detectados.
|
|
252
|
+
- `all`: fusiona los cuatro árboles.
|
|
253
|
+
- Lista explícita (`-Client claude,cursor` / `--client claude,cursor`): solo esos.
|
|
254
|
+
- Fusión idempotente con mensajes `CREATE:`/`SKIP:` por archivo y `BACKUP` a `<dir>.bak` con fuerza (mismo patrón que `AI/`).
|
|
255
|
+
|
|
200
256
|
## Estructura del repo
|
|
201
257
|
|
|
202
258
|
```text
|
|
@@ -204,18 +260,24 @@ harness-btp/
|
|
|
204
260
|
├── AI/ # lo que queda instalado en tu proyecto
|
|
205
261
|
│ ├── AGENTS.md # reglas del harness (parametrizado, sin rutas absolutas)
|
|
206
262
|
│ ├── INICIO.md # punto de entrada para el agente
|
|
263
|
+
│ ├── agents/ # CANÓNICO: 11 agentes (única fuente, se edita a mano)
|
|
264
|
+
│ ├── commands/ # CANÓNICO: flow + verify (única fuente)
|
|
265
|
+
│ ├── skills/ # CANÓNICO: 4 skills (única fuente)
|
|
266
|
+
│ ├── clients/ # RENDERIZADO por scripts/render-clients.js (no editar a mano)
|
|
207
267
|
│ ├── opencode.fragment.jsonc# ADAPTER opcional: ejemplo para opencode.jsonc
|
|
208
|
-
│ ├── .opencode/ # ADAPTER opcional:
|
|
268
|
+
│ ├── .opencode/ # ADAPTER opcional: se conserva intacto (compatibilidad)
|
|
209
269
|
│ ├── scripts/ # pares .ps1 / .sh + provision-espacio.template.ps1
|
|
210
270
|
│ ├── docs/ # flujo-etapas, cf-safe, habilitacion-trial
|
|
211
271
|
│ ├── specs/ # plantilla _template.md
|
|
212
272
|
│ └── .gitignore.fragment # líneas a fusionar en tu .gitignore
|
|
273
|
+
├── scripts/
|
|
274
|
+
│ └── render-clients.js # genera AI/clients/ desde el canónico (--check en CI)
|
|
213
275
|
├── templates/
|
|
214
276
|
│ └── AGENTS.pointer.md # plantilla del puntero AGENTS.md raíz
|
|
215
277
|
├── install.ps1 / install.sh # instaladores idempotentes (SKIP / CREATE / BACKUP / OK)
|
|
216
278
|
├── bin/ # ejecutable de create-harness-btp (pnpm dlx)
|
|
217
279
|
├── package.json # name create-harness-btp
|
|
218
|
-
└── VERSION # 0.
|
|
280
|
+
└── VERSION # 0.3.1
|
|
219
281
|
```
|
|
220
282
|
|
|
221
283
|
## Cómo lo descubre el agente
|
|
@@ -237,8 +299,9 @@ Tú no configuras nada: el agente se adapta solo.
|
|
|
237
299
|
| Líneas duplicadas en `.gitignore` | edición manual tras la fusión | el instalador fusiona sin duplicar; borra el duplicado a mano |
|
|
238
300
|
| `ExecutionPolicy` bloquea `install.ps1` | política de PowerShell | `powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .` (o usa `install.sh` en Git Bash) |
|
|
239
301
|
| `ABORT: opción desconocida` en `install.sh` | flag inexistente | `sh install.sh --help` lista `--dest`, `--force` |
|
|
240
|
-
| `degit` falla sin Node | `degit` corre sobre Node 18+ | instala Node o usa `git clone --branch v0.
|
|
302
|
+
| `degit` falla sin Node | `degit` corre sobre Node 18+ | instala Node o usa `git clone --branch v0.3.1` |
|
|
241
303
|
| Tu cliente no lee los agentes de `.opencode/` | layout específico de OpenCode | son un adapter opcional; el flujo está en `AI/AGENTS.md` + `AI/INICIO.md` |
|
|
304
|
+
| Mi cliente no ve los agentes (claude/cursor/copilot) | instalaste sin el `--client` que usa tu proyecto (`auto` no encontró sus huellas) | reinstala sin fuerza con `--client <tu-cliente>` (p. ej. `--client claude`) y verifica la tabla de [Multi-cliente](#multi-cliente): `.claude/`, `.cursor/commands/` + `.agents/skills/`, o `.github/agents\|prompts\|skills` según cliente; si sigue sin verlos, revisa la fusión y no dupliques archivos a mano |
|
|
242
305
|
| No se deja borrar la carpeta del proyecto ("Carpeta en uso") | procesos huérfanos parados dentro (shells/MCPs de una sesión ya cerrada) | resmon → CPU → Identificadores asociados → busca la carpeta y termina solo esos PIDs; nunca fueron del instalador (solo copia archivos y termina) |
|
|
243
306
|
|
|
244
307
|
## Compatibilidad
|
|
@@ -265,9 +328,12 @@ MIT. Haz lo que quieras con el harness; sin garantía.
|
|
|
265
328
|
|
|
266
329
|
## Changelog
|
|
267
330
|
|
|
331
|
+
- **v0.3.1** — manual de uso: recorrido 1–7, tabla comando→para qué→cuándo, y señales de que todo va bien, en lenguaje normal.
|
|
332
|
+
- **v0.3.0** — multi-cliente: definición canónica única en `AI/agents/`, `AI/commands/`, `AI/skills/`; render a `AI/clients/<cliente>/` con `scripts/render-clients.js` (opencode byte-idéntico a `AI/.opencode/`, que se conserva intacto); instaladores con flag `--client auto|all|<lista>` (detección por huellas, fusión idempotente con `SKIP`/`BACKUP` por dir); `prompts/setup.md` pregunta el cliente si es ambiguo y verifica adopción por cliente; CI exige `render-clients.js --check` antes de la guardia de versiones.
|
|
333
|
+
|
|
268
334
|
- **v0.2.5** — fusión a `.opencode/` raíz: el instalador sincroniza `AI/.opencode/` (agents + commands + skills) en `.opencode/` del proyecto para que OpenCode descubra `orchestrator` y `/flow` (SKIP sin fuerza, `.opencode.bak` con fuerza); `prompts/setup.md` verifica adopción y fusiona el fragmento MCP.
|
|
269
335
|
- **v0.2.4** — estilo Neon: una línea que lee `prompts/setup.md` (versionado, siempre al día) en vez de un bloque que caduca.
|
|
270
336
|
- **v0.2.3** — prompt universal todo-en-uno: clona + instala con la versión que indique el README (nunca caduca), verifica AI/VERSION instalado.
|
|
271
337
|
- **v0.2.2** — anti-huérfanos: bloque de agente con regla de cierre limpio (no dejar servidores corriendo, no borrar carpetas con procesos dentro) + troubleshooting de carpeta bloqueada (resmon → Identificadores asociados).
|
|
272
338
|
- **v0.2.1** — trazabilidad y versión visible: `AI/VERSION` viaja en el paquete, los instaladores imprimen la versión (`OK: harness vX.Y.Z…`, `BACKUP` con vieja→nueva) y el workflow exige que `package.json`, `VERSION` y `AI/VERSION` coincidan. Comandos fijados a `@0.2.1` / `#v0.2.1` / `--branch v0.2.1`.
|
|
273
|
-
- **v0.2.0** — versión inicial: carpeta `AI/` parametrizada, instaladores idempotentes `install.ps1` / `install.sh`, `create-harness-btp` vía `pnpm dlx`, plantilla de puntero, docs de flujo / cf-safe / habilitación trial, plantilla de spec.
|
|
339
|
+
- **v0.2.0** — versión inicial: carpeta `AI/` parametrizada, instaladores idempotentes `install.ps1` / `install.sh`, `create-harness-btp` vía `pnpm dlx`, plantilla de puntero, docs de flujo / cf-safe / habilitación trial, plantilla de spec.
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.3.1
|