create-harness-btp 0.1.1 → 0.2.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/.opencode/agents/deploy-cf.md +7 -7
- package/AI/.opencode/agents/orchestrator.md +1 -1
- package/AI/.opencode/commands/verify.md +1 -1
- package/AI/.opencode/skills/cf-cli/SKILL.md +41 -0
- package/AI/.opencode/skills/mta-build/SKILL.md +4 -4
- package/AI/AGENTS.md +22 -21
- package/AI/INICIO.md +34 -15
- package/AI/VERSION +1 -0
- package/AI/docs/cf-safe.md +5 -5
- package/AI/docs/flujo-etapas.md +1 -1
- package/AI/docs/fuentes-oficiales.md +27 -0
- package/AI/docs/habilitacion-trial.md +2 -2
- package/AI/docs/prerequisitos.md +60 -0
- package/AI/scripts/cf-safe.ps1 +14 -14
- package/AI/scripts/check-docs.ps1 +78 -0
- package/AI/scripts/check-docs.sh +42 -0
- package/AI/scripts/check-prereqs.ps1 +129 -0
- package/AI/scripts/check-prereqs.sh +136 -0
- package/AI/scripts/provision-espacio.template.ps1 +10 -10
- package/README.md +119 -41
- package/VERSION +1 -1
- package/bin/harness-btp.js +10 -4
- package/install.ps1 +18 -4
- package/install.sh +24 -6
- package/package.json +1 -1
- package/AI/.opencode/skills/sap-cf-cli/SKILL.md +0 -41
|
@@ -3,23 +3,23 @@ description: Construye MTAR y despliega en Cloud Foundry con evidencia
|
|
|
3
3
|
mode: subagent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Cloud Foundry y despliegue MTA. Único rol que ejecuta `
|
|
6
|
+
Cloud Foundry y despliegue MTA. Único rol que ejecuta `cf` con efecto y
|
|
7
7
|
`mbt build`.
|
|
8
8
|
|
|
9
9
|
Entradas: spec con destino confirmado, `mta.yaml` revisado, criterios de la
|
|
10
10
|
puerta de despliegue.
|
|
11
11
|
|
|
12
|
-
Procedimiento (cargar skills `
|
|
12
|
+
Procedimiento (cargar skills `cf-cli` y `mta-build` antes del primer
|
|
13
13
|
comando del turno):
|
|
14
14
|
|
|
15
|
-
1. `
|
|
15
|
+
1. `cf target` y confirmar endpoint/org/espacio contra la spec.
|
|
16
16
|
Sin coincidencia: detenerse y pedir el dato indispensable.
|
|
17
17
|
2. `mbt build`; comprobar que el `.mtar` existe en `mta_archives/`.
|
|
18
|
-
3. Desplegar (`
|
|
19
|
-
según plan) y verificar con evidencia observable (`
|
|
20
|
-
`
|
|
18
|
+
3. Desplegar (`cf deploy` si hay plugin multiapps, si no `cf push`
|
|
19
|
+
según plan) y verificar con evidencia observable (`cf apps`,
|
|
20
|
+
`cf logs <app> --recent`, URL de la app).
|
|
21
21
|
|
|
22
|
-
Denylist:
|
|
22
|
+
Denylist: borrar orgs/espacios/apps ajenas al MVP,
|
|
23
23
|
desvincular servicios no previstos, `push --no-start` sin avisar,
|
|
24
24
|
cualquier acción sobre producción sin autorización expresa. Cero secretos en
|
|
25
25
|
salidas e informes.
|
|
@@ -25,7 +25,7 @@ nunca el historial del turno. Ver `AGENTS.md` § Presupuesto anti-bloqueo):
|
|
|
25
25
|
- `e2e-fiori`: pruebas E2E en navegador abierto (chrome-devtools/playwright) con evidencia por criterio; veredicto APTO/NO APTO sin declarar verde lo no ejecutado.
|
|
26
26
|
- `documentarian`: edita solo `*.md` (specs, INICIO, informe de cierre).
|
|
27
27
|
- `harness-evolution`: cosecha lecciones del MVP en etapa 10 (solo propone diffs al harness; los aplicas tú tras revisión).
|
|
28
|
-
- `deploy-cf`: build MTAR y despliegue. Solo él ejecuta `
|
|
28
|
+
- `deploy-cf`: build MTAR y despliegue. Solo él ejecuta `cf` con efecto.
|
|
29
29
|
|
|
30
30
|
Paralelo solo en tareas realmente independientes (p. ej. `researcher` +
|
|
31
31
|
`analyst` en etapa 0–1). Integras y revisas todo: no delegas decisiones
|
|
@@ -8,7 +8,7 @@ Ejecuta solo la puerta de despliegue (etapa 7) para $ARGUMENTS
|
|
|
8
8
|
|
|
9
9
|
Verificaciones (delegables en `qa-review` + `deploy-cf` en solo lectura):
|
|
10
10
|
|
|
11
|
-
1. `
|
|
11
|
+
1. `cf target` coincide con el destino de la spec (endpoint/org/espacio).
|
|
12
12
|
2. El artefacto existe y es reciente (`.mtar` en `mta_archives/` o bundle
|
|
13
13
|
para `push`).
|
|
14
14
|
3. Todos los criterios de aceptación están en verde con evidencia.
|
|
@@ -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.
|
|
@@ -23,16 +23,16 @@ mbt build # requiere mta.yaml en la raíz del proyecto
|
|
|
23
23
|
|
|
24
24
|
## Despliegue del MTAR
|
|
25
25
|
|
|
26
|
-
`
|
|
27
|
-
siempre con `
|
|
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
28
|
ya instalado contra lo documentado). Instalarlo solo cuando un MVP necesite
|
|
29
29
|
despliegue MTA:
|
|
30
30
|
|
|
31
31
|
```
|
|
32
|
-
|
|
32
|
+
cf install-plugin -r CF-Community multiapps
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
Alternativa sin plugin para MVPs simples: `
|
|
35
|
+
Alternativa sin plugin para MVPs simples: `cf push` por app según plan.
|
|
36
36
|
|
|
37
37
|
## Notas
|
|
38
38
|
|
package/AI/AGENTS.md
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
# Harness MVP SAP BTP — Reglas del proyecto
|
|
2
|
-
> Nota portabilidad: verificado en Windows
|
|
2
|
+
> Nota portabilidad: verificado en Windows (PowerShell 5.1) y Git Bash; adapta rutas a tu equipo.
|
|
3
3
|
|
|
4
4
|
> Flujo reutilizable especificación → despliegue en SAP BTP Cloud Foundry,
|
|
5
|
-
> orquestado por
|
|
6
|
-
> `
|
|
7
|
-
> manda este archivo.
|
|
5
|
+
> orquestado por tu cliente agéntico (verificado con OpenCode). Si tu cliente
|
|
6
|
+
> carga un `AGENTS.md` global, en caso de conflicto manda este archivo.
|
|
8
7
|
|
|
9
8
|
## Herramientas: nombres intocables
|
|
10
9
|
|
|
11
10
|
| Uso | Comando | Notas |
|
|
12
11
|
|---|---|---|
|
|
13
|
-
| Cloud Foundry | `
|
|
12
|
+
| Cloud Foundry | `cf` | CLI estándar de Cloud Foundry (v8). |
|
|
14
13
|
| MTA build | `mbt` | Cloud MTA Build Tool (binario recuperado vía su propio `install.js`). |
|
|
15
|
-
| Cloudflare | `cf` | **Prohibido** usar `cf` para Cloud Foundry: ese comando es el CLI de Cloudflare en [TU_PC]. |
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
Si `cf` en tu máquina corresponde a otra herramienta, define un alias propio y úsalo donde el harness diga `cf`.
|
|
16
|
+
|
|
17
|
+
Ver skill local `cf-cli` antes del primer comando CF del turno;
|
|
18
18
|
ver `mta-build` antes del primer build MTAR.
|
|
19
19
|
|
|
20
20
|
## Destino Cloud Foundry conocido (sin secretos)
|
|
21
21
|
|
|
22
|
-
- Endpoint
|
|
22
|
+
- Endpoint: el de tu paisaje (p. ej. `https://api.cf.<region>.hana.ondemand.com`;
|
|
23
23
|
registrar el valor real en la spec del MVP, nunca aquí).
|
|
24
|
-
- Org y espacio objetivo (ver `
|
|
24
|
+
- Org y espacio objetivo (ver `cf target`;
|
|
25
25
|
no se transcriben aquí por higiene). Antes de **cada despliegue**, el
|
|
26
26
|
orquestador re-verifica endpoint/org/espacio contra la especificación del
|
|
27
27
|
MVP. Si no coinciden o no pueden deducirse, se pide solo el dato
|
|
28
28
|
indispensable y no se despliega.
|
|
29
|
-
- Despliegue MTA (`
|
|
30
|
-
Antes de asumir su ausencia o instalarlo, verificar con `
|
|
29
|
+
- Despliegue MTA (`cf deploy *.mtar`) requiere el plugin **multiapps**.
|
|
30
|
+
Antes de asumir su ausencia o instalarlo, verificar con `cf plugins`
|
|
31
31
|
(lección: verificar siempre antes de asumir su ausencia).
|
|
32
32
|
Instalarlo solo cuando un MVP lo requiera (ver `mta-build`).
|
|
33
33
|
- Placeholders MTA a credenciales: antes de diseñar un placeholder, verificar
|
|
@@ -47,13 +47,13 @@ ver `mta-build` antes del primer build MTAR.
|
|
|
47
47
|
> poseer. Objetivo: portar un MVP entre espacios/cuentas sin intervención
|
|
48
48
|
> humana salvo decisiones de coste/acceso.
|
|
49
49
|
|
|
50
|
-
| En MTA (`mta.yaml`) | Fuera del MTA (agentes por `
|
|
50
|
+
| En MTA (`mta.yaml`) | Fuera del MTA (agentes por `cf`, una vez por espacio) |
|
|
51
51
|
|---|---|
|
|
52
52
|
| `managed-service`: xsuaa, destination, html5-repo-host/runtime, todo lo que el deploy puede crear/actualizar | `existing-service`: bindings a instancias pre-existentes (p. ej. DIE trial, `it-rt` integration-flow), espacios, roles `SpaceDeveloper`, entitlements/cuotas |
|
|
53
53
|
| Keys DECLARADAS por nombre (`service-key: name:`); el deploy reutiliza la key existente del espacio, nunca la crea con secretos | Creación idempotente de espacio/instancias/roles vía `scripts/provision-<espacio>.ps1` (ver § Paisajes); cero secretos en repo, solo nombres |
|
|
54
54
|
| Destinos versionados con referencias por nombre (`TokenServiceInstanceName/KeyName`, `~{srv-api/srv-url}`); ninguna credencial literal | Lo que el deploy-service rechace (p. ej. placeholders a keys anidadas `credentials.oauth`) NO se reintenta igual: fallback = binding nativo o destino MANUAL en cockpit registrado como pendiente conocido con su causa |
|
|
55
55
|
|
|
56
|
-
-
|
|
56
|
+
- El CLI de Cloud Foundry se invoca siempre como `cf`.
|
|
57
57
|
- Keys rotadas por deploy (el deploy-service puede borrar la
|
|
58
58
|
`service-key` en cada deploy): el runtime NUNCA lee keys; solo binding/VCAP.
|
|
59
59
|
Las keys son solo de diseño (temporal borrable, solo nombre documentado).
|
|
@@ -63,10 +63,10 @@ ver `mta-build` antes del primer build MTAR.
|
|
|
63
63
|
## Paisajes .mtaext y pre-provisión idempotente
|
|
64
64
|
|
|
65
65
|
- Cada paisaje = un `<paisaje>.mtaext` en la raíz del MVP (`dev.mtaext`, `prd.mtaext`): `extends: <mta-id>`, overrides SOLO por paisaje (nombres de `existing-service`, `service-key`, URL del iFlow). `mta.yaml` guarda el default (= dev vivo). Cero secretos.
|
|
66
|
-
- Cadena de deploy: `
|
|
66
|
+
- Cadena de deploy: `cf target -s <paisaje>` → `cf deploy mta_archives/<mtar> -e <paisaje>.mtaext`. Sin `-e` no hay deploy multi-paisaje.
|
|
67
67
|
- Puerta `/verify` (etapa 7) exige en verde: `mbt mtad-gen -e <paisaje>.mtaext` por cada `.mtaext` afectado + target coincide con spec + instancia/key esperadas existen verificadas (comando o cockpit, nunca heredadas de notas).
|
|
68
68
|
- Persistencia efímera (p. ej. SQLite `:memory:` se vacía en cada redeploy/restart): la spec lo declara; el E2E resiembra tras cada deploy y ningún CA exige datos supervivientes salvo que la spec defina persistencia real.
|
|
69
|
-
- Pre-provisión: `scripts/provision-<espacio>.ps1` por paisaje no-dev, idempotente (cada paso comprueba y emite `SKIP:` si existe), NO despliega nada. Plantilla obligatoria: preflight de target (endpoint+org, aborta si no coinciden) → crea espacio si falta → guardia de marketplace (aborta antes de crear si falta un offering) → crea instancias solo si faltan → asigna rol solo si falta. Allowlist cerrada: `target, spaces, space-users, services, marketplace, create-space, create-service, set-space-role`. PROHIBIDO: `delete-*`, `unbind-*`, `purge-*`, `restage-*`. Usa `
|
|
69
|
+
- Pre-provisión: `scripts/provision-<espacio>.ps1` por paisaje no-dev, idempotente (cada paso comprueba y emite `SKIP:` si existe), NO despliega nada. Plantilla obligatoria: preflight de target (endpoint+org, aborta si no coinciden) → crea espacio si falta → guardia de marketplace (aborta antes de crear si falta un offering) → crea instancias solo si faltan → asigna rol solo si falta. Allowlist cerrada: `target, spaces, space-users, services, marketplace, create-space, create-service, set-space-role`. PROHIBIDO: `delete-*`, `unbind-*`, `purge-*`, `restage-*`. Usa `cf`.
|
|
70
70
|
|
|
71
71
|
## Flujo por etapas (`/flow <ruta-spec>`)
|
|
72
72
|
|
|
@@ -76,6 +76,7 @@ ver `mta-build` antes del primer build MTAR.
|
|
|
76
76
|
9. Git → 10. Documentación (+ cosecha de lecciones: `harness-evolution`
|
|
77
77
|
propone, el orquestador aplica tras revisión).
|
|
78
78
|
|
|
79
|
+
- En etapa 0, si la spec exige builds o despliegues, el orquestador pide al usuario el resultado de `AI/scripts/check-prereqs.ps1` (o `.sh`) antes de planificar.
|
|
79
80
|
- Cada etapa tiene entregable verificable; el orquestador define el criterio
|
|
80
81
|
de avance en el plan y lo exige antes de continuar.
|
|
81
82
|
- Rigor proporcional al MVP: saltar etapas irrelevantes está permitido y se
|
|
@@ -88,7 +89,7 @@ ver `mta-build` antes del primer build MTAR.
|
|
|
88
89
|
vueltas y presupuesto explícito por vuelta:
|
|
89
90
|
1. El MVP tiene al menos un despliegue anterior con éxito al MISMO
|
|
90
91
|
endpoint/org/espacio, registrado en la spec;
|
|
91
|
-
2. `
|
|
92
|
+
2. `cf target` re-verificado coincide con la spec;
|
|
92
93
|
3. El cambio no puede verificarse por completo en local (integraciones
|
|
93
94
|
que solo existen en SAP: DIE, iFlow, XSUAA, HTML5 Repo…) o el usuario
|
|
94
95
|
ordenó el despliegue.
|
|
@@ -130,8 +131,8 @@ ver `mta-build` antes del primer build MTAR.
|
|
|
130
131
|
|
|
131
132
|
## Local frente a BAS
|
|
132
133
|
|
|
133
|
-
Este harness corre en
|
|
134
|
-
(`
|
|
134
|
+
Este harness corre en tu máquina local (verificado en Windows + Git Bash). No presuponer que una instalación local
|
|
135
|
+
(`cf`, `mbt`, Node, Java, Python) existe en un dev space
|
|
135
136
|
remoto de BAS, ni viceversa. `cds` y `ui5` CLIs no están instalados
|
|
136
137
|
globalmente: se instalan por proyecto cuando la especificación los exija.
|
|
137
138
|
|
|
@@ -176,7 +177,7 @@ encadenarlo en pipes.
|
|
|
176
177
|
la ruta `temp/<tarea>/` en cada delegación que implique tests, builds o
|
|
177
178
|
navegador; la evidencia que deba conservarse se mueve a `evidencia/` con su
|
|
178
179
|
referencia en docs. Al cerrar la tarea se borra lo transitorio.
|
|
179
|
-
- El target CF puede cambiar entre sesiones: re-verificar `
|
|
180
|
+
- El target CF puede cambiar entre sesiones: re-verificar `cf target`
|
|
180
181
|
en cada puerta y registrar el cambio en la spec antes de desplegar.
|
|
181
182
|
- Higiene de navegador y CDP (regla irrestricta, ver § Higiene obligatoria de
|
|
182
183
|
navegador y CDP): matar procesos solo por PID con filtro de perfil temporal
|
|
@@ -228,14 +229,14 @@ el `ECONNREFUSED`. `chrome-devtools` usa canal propio y no necesita `:9222`.
|
|
|
228
229
|
|
|
229
230
|
- `context7` (`resolve-library-id` → `query-docs`): docs de CAP, UI5, CF CLI,
|
|
230
231
|
MTA y cualquier librería antes de suponer APIs. Lo usan `researcher` y los
|
|
231
|
-
especialistas. Ante un error de servicio con código (p. ej. EP003) o un
|
|
232
|
+
especialistas. En etapa 1 el `researcher` re-verifica con `AI/scripts/check-docs` las fuentes de `AI/docs/fuentes-oficiales.md` que la spec vaya a usar y registra la fecha. Ante un error de servicio con código (p. ej. EP003) o un
|
|
232
233
|
payload dudoso, contrastar el payload contra el tutorial oficial vigente +
|
|
233
234
|
el error real antes de asumir; las docs viejas o el scaffold no mandan.
|
|
234
235
|
- `codebase-memory`: contexto del índice cuando el MVP viva en un proyecto
|
|
235
236
|
indexado (`index_status`/`detect_changes` para frescura al arrancar;
|
|
236
237
|
`index_repository` tras cambios si hay novedades); nada que asumir si
|
|
237
238
|
puede recuperarse del grafo. `graphify-code` local como complemento
|
|
238
|
-
cuando esté `connected` (ver `opencode.jsonc
|
|
239
|
+
cuando esté `connected` (ver fragmento `opencode.fragment.jsonc`, opcional); índice local por defecto,
|
|
239
240
|
sin reindexar redundante en ambos en el mismo turno.
|
|
240
241
|
- `github`: solo si la especificación pide repo remoto/PR. Sin spec que lo
|
|
241
242
|
pida, trabajo local.
|
package/AI/INICIO.md
CHANGED
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
# Guía de inicio — Harness MVP SAP BTP
|
|
2
2
|
|
|
3
|
-
> Nota portabilidad: verificado en Windows
|
|
3
|
+
> Nota portabilidad: verificado en Windows (PowerShell 5.1) y Git Bash; adapta rutas a tu equipo.
|
|
4
4
|
|
|
5
|
-
Entorno local Windows para llevar MVPs SAP de especificación a despliegue en
|
|
6
|
-
Cloud Foundry, con
|
|
5
|
+
Entorno local (Windows/Linux/macOS) para llevar MVPs SAP de especificación a despliegue en
|
|
6
|
+
Cloud Foundry, con tu cliente agéntico como orquestador.
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## Antes de empezar
|
|
9
|
+
|
|
10
|
+
Verifica qué tienes instalado **antes** de usar el harness (el flujo asume
|
|
11
|
+
que tu máquina cumple los prerrequisitos):
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
powershell -ExecutionPolicy Bypass -File AI/scripts/check-prereqs.ps1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Tabla Herramienta | Necesaria para | Estado (OK/FALTA) | Cómo instalarla.
|
|
18
|
+
`exit 1` = falta algo REQUERIDO; `exit 0` con avisos = solo faltan opcionales.
|
|
19
|
+
Detalle por caso y re-verificación: `docs/prerequisitos.md`.
|
|
20
|
+
|
|
21
|
+
## Estado verificado de referencia
|
|
9
22
|
|
|
10
23
|
| Herramienta | Resultado |
|
|
11
24
|
|---|---|
|
|
12
|
-
| `
|
|
25
|
+
| `cf --version` | CLI de Cloud Foundry, sesión activa contra tu endpoint (ver `cf target`) |
|
|
13
26
|
| `mbt --version` | Cloud MTA Build Tool (binario recuperado; el `install.js` del paquete npm pedía `cloud-mta-build-tool`, no `mbt`) |
|
|
14
|
-
| `node` / `npm` | versión
|
|
15
|
-
| `java` | versión instalada en
|
|
16
|
-
|
|
|
17
|
-
| OpenCode | agente `orchestrator` por defecto (este proyecto) |
|
|
27
|
+
| `node` / `npm` | versión 18+ (verifica con `check-prereqs`) |
|
|
28
|
+
| `java` | versión instalada en tu equipo — sirve para builds MTA Java si la spec los pide |
|
|
29
|
+
| Cliente agéntico | agente `orchestrator` por defecto (verificado con OpenCode) |
|
|
18
30
|
| MCP heredados (global) | `context7`, `codebase-memory`, `github`, `playwright`, `eslint`, `chrome-devtools` |
|
|
19
31
|
| Skill instalada útil | `sapui5` (global) |
|
|
20
|
-
| Pendiente (a propósito) | CLIs `cds`/`ui5`, skills SAP externas — se instalan solo si una spec los exige. Plugin CF `multiapps`: verificar con `
|
|
32
|
+
| Pendiente (a propósito) | CLIs `cds`/`ui5`, skills SAP externas — se instalan solo si una spec los exige. Plugin CF `multiapps`: verificar con `cf plugins` antes de asumir |
|
|
21
33
|
|
|
22
34
|
## Cómo proporcionar una especificación
|
|
23
35
|
|
|
@@ -47,20 +59,27 @@ proporcional al tamaño del MVP. Comando de apoyo:
|
|
|
47
59
|
## Comandos locales de referencia
|
|
48
60
|
|
|
49
61
|
```
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
62
|
+
cf target # endpoint/org/espacio actuales (sin secretos)
|
|
63
|
+
cf apps # estado observable tras desplegar
|
|
64
|
+
cf logs <app> --recent
|
|
53
65
|
mbt build # genera .mtar en mta_archives/ (requiere mta.yaml)
|
|
54
66
|
```
|
|
55
67
|
|
|
56
|
-
Nunca
|
|
68
|
+
Nunca pegar tokens en terminal ni en specs.
|
|
57
69
|
|
|
58
70
|
## Lecturas CF seguras (broker cf-safe)
|
|
59
71
|
|
|
60
72
|
Toda lectura CF con secreto potencial vía `scripts/cf-safe.ps1`
|
|
61
|
-
(nunca `
|
|
73
|
+
(nunca `cf` directo en agentes/scripts si la salida puede traer
|
|
62
74
|
credenciales). Detalle: `docs/cf-safe.md`.
|
|
63
75
|
|
|
76
|
+
## Papeles guía
|
|
77
|
+
|
|
78
|
+
Documentación oficial que respalda las guías del harness:
|
|
79
|
+
`docs/fuentes-oficiales.md` (tabla Fuente | URL oficial | Qué cubre | Última
|
|
80
|
+
verificación). Antes de usar una fuente, refresca su estado con
|
|
81
|
+
`AI/scripts/check-docs.ps1` (o `.sh`).
|
|
82
|
+
|
|
64
83
|
## Skills candidatas (no instaladas)
|
|
65
84
|
|
|
66
85
|
Inspeccionadas solo por procedencia; adoptar **únicamente** si
|
package/AI/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.1
|
package/AI/docs/cf-safe.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# cf-safe — broker determinista para Cloud Foundry
|
|
2
2
|
|
|
3
|
-
Punto único de salida hacia `
|
|
3
|
+
Punto único de salida hacia `cf`. Fail-closed: nada ejecuta sin pasar
|
|
4
4
|
denylist → allowlist → validación de target.
|
|
5
5
|
|
|
6
6
|
Fuentes: `scripts/cf-safe.ps1` (cabecera, líneas 1-34), `scripts/cf-safe-patterns.ps1`,
|
|
@@ -13,7 +13,7 @@ redacción 24/24. Sin E2E real contra CF todavía (pendiente).
|
|
|
13
13
|
## Qué es
|
|
14
14
|
|
|
15
15
|
- `scripts/cf-safe.ps1`: broker. Recibe `-CfArgs`, valida, ejecuta solo
|
|
16
|
-
`
|
|
16
|
+
`cf` (binario estándar, resuelto en `PATH`) y devuelve UNA línea JSON
|
|
17
17
|
`{ok, exit, verb, redacted, rawLog, names, output}`.
|
|
18
18
|
- `scripts/cf-safe-patterns.ps1`: tabla central de redacción (6 regex +
|
|
19
19
|
marcador `***REDACTED***`, fail-closed: ante error devuelve el marcador,
|
|
@@ -27,7 +27,7 @@ redacción 24/24. Sin E2E real contra CF todavía (pendiente).
|
|
|
27
27
|
|
|
28
28
|
## Por qué (sin LLM ejecutor)
|
|
29
29
|
|
|
30
|
-
Ningún agente/LLM invoca `
|
|
30
|
+
Ningún agente/LLM invoca `cf` directamente para lecturas con secreto
|
|
31
31
|
potencial: el broker aplica las reglas de forma determinista (código, no
|
|
32
32
|
criterio del modelo). El LLM solo recibe `output` ya redactado y truncado;
|
|
33
33
|
el crudo nunca llega a stdout ni a prompts.
|
|
@@ -57,12 +57,12 @@ Invoke-SapCfSeguro -CfArgs @('services') -ExpectedApi 'https://api.cf.us10-001.h
|
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Regla: **toda lectura CF con secreto potencial vía cf-safe** (nunca
|
|
60
|
-
`
|
|
60
|
+
`cf` directo en agentes/scripts cuando la salida pueda traer
|
|
61
61
|
credenciales: `env`, `service-key` con valores, `logs --recent`).
|
|
62
62
|
|
|
63
63
|
## Allowlist / denylist y códigos
|
|
64
64
|
|
|
65
|
-
Orden: 1) binario
|
|
65
|
+
Orden: 1) binario (`cf` resuelto en `PATH`) → 2) denylist →
|
|
66
66
|
3) allowlist → 4) target → 5) ejecución.
|
|
67
67
|
|
|
68
68
|
- Denylist (exit 1): `delete-*`, `unbind-*`, `purge-*`, `restage-*`,
|
package/AI/docs/flujo-etapas.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| 0 | Evaluación | `analyst` | Veredicto + supuestos + CA verificables | Spec completable; bloqueos con dato mínimo pedido |
|
|
9
9
|
| 1 | Investigación | `researcher` | Tabla fuente\|fecha\|evidencia (documentado/pendiente/coste) | Ninguna API/servicio supuesto sin fuente |
|
|
10
10
|
| 2 | Plan/Arquitectura | `architect` | Topología + esqueleto `mta.yaml` + planes verificados | Decisiones y descartes registrados; persistencia fijada |
|
|
11
|
-
| 3 | Preparación | orquestador | Scaffold + facets + deps instaladas + target CF confirmado | `cds version` OK; `
|
|
11
|
+
| 3 | Preparación | orquestador | Scaffold + facets + deps instaladas + target CF confirmado | `cds version` OK; `cf target` coincide con spec |
|
|
12
12
|
| 4 | Desarrollo | `backend-cap` + `frontend-ui5` | Modelo/servicios CAP + UI + mocks DIE/iFlow corriendo en local | CA1–CA3 observables con `cds watch` |
|
|
13
13
|
| 5 | Pruebas | `qa-review` | Resultado por CA (comando + salida real) | Sin rojo; vulnerabilidades del scaffold dictaminadas |
|
|
14
14
|
| 6 | Correcciones | especialistas | Fixes verificados | Plan de pruebas en verde |
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Fuentes oficiales del harness BTP
|
|
2
|
+
|
|
3
|
+
Tabla de documentación oficial que respalda las guías del harness.
|
|
4
|
+
Antes de usar una fuente en una spec, re-verifica su estado y registra la fecha:
|
|
5
|
+
|
|
6
|
+
```powershell
|
|
7
|
+
# Windows
|
|
8
|
+
powershell -ExecutionPolicy Bypass -File AI/scripts/check-docs.ps1
|
|
9
|
+
# Linux/macOS o Git Bash
|
|
10
|
+
sh AI/scripts/check-docs.sh
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`exit 1` = alguna fuente REQUERIDA está rota. `PENDIENTE` = no hubo respuesta
|
|
14
|
+
(timeout/DNS: avisa, no falla); actualiza la fecha tras re-verificar.
|
|
15
|
+
|
|
16
|
+
| Fuente | URL oficial | Qué cubre | Nivel | Última verificación |
|
|
17
|
+
|---|---|---|---|---|
|
|
18
|
+
| Cloud Foundry CLI | https://docs.cloudfoundry.org/cf-cli/install-go-cli.html | Instalación y uso del CLI `cf` v8 (target, push, plugins como multiapps) | REQUERIDA | 2026-10-31 |
|
|
19
|
+
| Cloud MTA Build Tool | https://github.com/SAP/cloud-mta-build-tool | Construcción de MTAR desde `mta.yaml`, comandos `mbt`, requisitos (`make`) | REQUERIDA | 2026-10-31 |
|
|
20
|
+
| CAP | https://cap.cloud.sap/docs/get-started/ | Setup Node.js/`cds-dk`, comandos `cds`, arranque de proyectos CAP | REQUERIDA | 2026-10-31 |
|
|
21
|
+
| UI5 CLI | https://ui5.github.io/cli/ | Instalación y uso del CLI `ui5` para proyectos UI5/Fiori | REQUERIDA | 2026-10-31 |
|
|
22
|
+
| OpenCode | https://docs.opencode.ai/docs | Agente orquestador, MCP servers, configuración (la raíz `docs.opencode.ai/` devuelve 404; `/docs` es la entrada canónica) | REQUERIDA | 2026-10-31 |
|
|
23
|
+
| npm trusted publishers | https://docs.npmjs.com/trusted-publishers/ | Publicación OIDC sin tokens de larga vida (CI: GitHub Actions, GitLab, CircleCI) | REQUERIDA | 2026-10-31 |
|
|
24
|
+
| 1Password op CLI | https://developer.1password.com/docs/cli/get-started/ | Gestión opcional de secretos de equipo (responde 308 a `/cli/get-started`, verificado con seguimiento; solo referencia opcional) | OPCIONAL | 2026-10-31 |
|
|
25
|
+
|
|
26
|
+
Verificación 2026-10-31: `webfetch` + `curl.exe` GET (`-L`, timeout 15 s)
|
|
27
|
+
y `AI/scripts/check-docs.ps1` en esta máquina (todas OK, `exit 0`).
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
## Paso 0. Verificar el entorno Cloud Foundry (lectura, sin cambios)
|
|
10
10
|
|
|
11
11
|
- **Para qué sirve.** Confirma contra qué org/espacio desplegará el MTA.
|
|
12
|
-
- **Cómo.** En el equipo local: `
|
|
12
|
+
- **Cómo.** En el equipo local: `cf target` (endpoint, org, espacio).
|
|
13
13
|
- **Casos de uso / cuándo.** Antes de cada despliegue y siempre que el
|
|
14
14
|
cockpit muestre un espacio con otro nombre (aquí: cockpit `dev` frente a
|
|
15
15
|
la sesión local). Si no coinciden, se ajusta el target en la puerta de
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
## Concepto clave: usuarios de plataforma frente a usuarios de negocio
|
|
114
114
|
|
|
115
115
|
El trial te da un **usuario de plataforma** (tu login, p. ej. el `HM` del
|
|
116
|
-
cockpit): administra la cuenta global —cockpit, `
|
|
116
|
+
cockpit): administra la cuenta global —cockpit, `cf`, crear
|
|
117
117
|
instancias— autenticado por el IdP por defecto de SAP. Ese usuario **no**
|
|
118
118
|
sirve para entrar a las aplicaciones desplegadas.
|
|
119
119
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Prerrequisitos del harness BTP
|
|
2
|
+
|
|
3
|
+
Verifica tu máquina **antes** de iniciar el flujo (`/flow`):
|
|
4
|
+
|
|
5
|
+
```powershell
|
|
6
|
+
# Windows
|
|
7
|
+
powershell -ExecutionPolicy Bypass -File AI/scripts/check-prereqs.ps1
|
|
8
|
+
# Linux/macOS o Git Bash
|
|
9
|
+
sh AI/scripts/check-prereqs.sh
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Si tu MVP exige builds o despliegues, promociona opcionales a requeridos:
|
|
13
|
+
|
|
14
|
+
```powershell
|
|
15
|
+
AI/scripts/check-prereqs.ps1 -NeedMtar -NeedCds # MTAR + CAP/UI5
|
|
16
|
+
sh AI/scripts/check-prereqs.sh --need-mtar --need-gh
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Requerido siempre
|
|
20
|
+
|
|
21
|
+
| Herramienta | Para qué | Instalación oficial |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `git` | versiones del MVP | https://git-scm.com/downloads |
|
|
24
|
+
| `node` 18+ | CAP, UI5, mbt, scripts | https://nodejs.org/ |
|
|
25
|
+
| `cf` CLI v8 | despliegues y lecturas Cloud Foundry | https://docs.cloudfoundry.org/cf-cli/install-go-cli.html |
|
|
26
|
+
| cliente agéntico | leer `AGENTS.md` y orquestar | https://docs.opencode.ai/ (o tu cliente; verifica que lea `AGENTS.md`) |
|
|
27
|
+
|
|
28
|
+
## Opcional según el MVP
|
|
29
|
+
|
|
30
|
+
| Herramienta | Solo si… | Instalación oficial |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `mbt` + `make` | el MVP construye MTAR | https://github.com/SAP/cloud-mta-build-tool y https://www.gnu.org/software/make/ |
|
|
33
|
+
| `java` 17 | builds MTA Java | https://adoptium.net/ |
|
|
34
|
+
| `cds` | la spec exige CAP (`npx -p @sap/cds-dk` vale, sin instalación global) | https://cap.cloud.sap/docs/get-started/ |
|
|
35
|
+
| `ui5` | la spec exige UI5/Fiori | https://ui5.github.io/cli/ |
|
|
36
|
+
| `gh` | la spec pide repo remoto/PR | https://cli.github.com/ |
|
|
37
|
+
| `op` (1Password) | el equipo lo adopta | https://developer.1password.com/docs/cli/get-started/ |
|
|
38
|
+
|
|
39
|
+
## MCPs y skills (no detectables desde shell)
|
|
40
|
+
|
|
41
|
+
El script solo verifica **presencia de archivos** (`AI/.opencode/skills/*/SKILL.md`,
|
|
42
|
+
`AI/.opencode/agents/*.md`, `AI/opencode.fragment.jsonc`). Los **MCPs viven en tu
|
|
43
|
+
cliente agéntico**, no en el repo: debes tener configurados
|
|
44
|
+
`context7`, `codebase-memory`, `github`, `playwright`, `eslint` y `chrome-devtools`.
|
|
45
|
+
|
|
46
|
+
- MCPs en OpenCode: https://docs.opencode.ai/mcp-servers/
|
|
47
|
+
- Context7: https://github.com/upstash/context7
|
|
48
|
+
- Playwright MCP: https://github.com/microsoft/playwright-mcp
|
|
49
|
+
- Chrome DevTools MCP: https://github.com/ChromeDevTools/chrome-devtools-mcp
|
|
50
|
+
- GitHub CLI (MCP `github`): https://cli.github.com/
|
|
51
|
+
- ESLint: https://eslint.org/docs/latest/use/getting-started
|
|
52
|
+
|
|
53
|
+
## Re-verificar
|
|
54
|
+
|
|
55
|
+
Tras instalar lo que falte, re-ejecuta `check-prereqs` (mismo comando de arriba):
|
|
56
|
+
`exit 0` = puedes empezar; `exit 1` = aún falta algo **REQUERIDO** (la tabla dice cuál y dónde instalarlo).
|
|
57
|
+
El script nunca imprime secretos (solo ejecuta `<comando> --version`).
|
|
58
|
+
|
|
59
|
+
Fuentes oficiales: `AI/scripts/check-docs.ps1` (o `.sh`) verifica las URLs de
|
|
60
|
+
`AI/docs/fuentes-oficiales.md`; `exit 1` = alguna REQUERIDA rota.
|
package/AI/scripts/cf-safe.ps1
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<#
|
|
2
2
|
.SYNOPSIS
|
|
3
|
-
Broker determinista para Cloud Foundry: unico punto de salida hacia
|
|
3
|
+
Broker determinista para Cloud Foundry: unico punto de salida hacia cf.
|
|
4
4
|
Fail-closed: denylist primero, luego allowlist, luego validacion de target.
|
|
5
5
|
|
|
6
6
|
.DESCRIPTION
|
|
7
7
|
Orden de evaluacion (nada ejecuta antes de pasarla):
|
|
8
|
-
1. Binario:
|
|
8
|
+
1. Binario: `cf` (CLI estandar de Cloud Foundry, resuelto en PATH).
|
|
9
9
|
2. Denylist -> exit 1: delete-*, unbind-*, purge-*, restage-*, set-env sin
|
|
10
10
|
-AllowWrite, create-service-key directo, service-key con valores sin
|
|
11
11
|
-NeedValues (y sin -AllowWrite), inyeccion (| > ; ` $()).
|
|
@@ -49,7 +49,7 @@ param(
|
|
|
49
49
|
[switch]$AllowWrite,
|
|
50
50
|
[switch]$PassThru,
|
|
51
51
|
[switch]$WhatIf,
|
|
52
|
-
[string]$CfBinary = '
|
|
52
|
+
[string]$CfBinary = 'cf',
|
|
53
53
|
[switch]$NeedValues
|
|
54
54
|
)
|
|
55
55
|
|
|
@@ -63,7 +63,7 @@ if ($CfArgs.Count -gt 0 -and $CfArgs[0] -eq '--') {
|
|
|
63
63
|
$CfArgs = @($CfArgs | Select-Object -Skip 1)
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
$
|
|
66
|
+
$CfCmd = (Get-Command cf -ErrorAction SilentlyContinue).Source
|
|
67
67
|
$TempDir = Join-Path (Split-Path $PSScriptRoot -Parent) 'temp\cf-safe'
|
|
68
68
|
$MaxOutput = 4000
|
|
69
69
|
$MaxLogLines = 200
|
|
@@ -90,15 +90,15 @@ $verb = if ($CfArgs.Count -gt 0) { [string]$CfArgs[0] } else { '' }
|
|
|
90
90
|
$verbNorm = $verb.ToLowerInvariant()
|
|
91
91
|
$joined = ($CfArgs -join ' ')
|
|
92
92
|
|
|
93
|
-
# 1. Binario
|
|
93
|
+
# 1. Binario: solo `cf` (resuelto en PATH).
|
|
94
94
|
$binNorm = ([string]$CfBinary).ToLowerInvariant()
|
|
95
|
-
$binOk = ($binNorm -eq '
|
|
95
|
+
$binOk = ($binNorm -eq 'cf' -or $binNorm -eq 'cf.exe')
|
|
96
96
|
if (-not $binOk) {
|
|
97
|
-
Emit-Result -Ok $false -Code 1 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text "DENY: binario no autorizado [$CfBinary]. Solo
|
|
97
|
+
Emit-Result -Ok $false -Code 1 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text "DENY: binario no autorizado [$CfBinary]. Solo cf."
|
|
98
98
|
exit 1
|
|
99
99
|
}
|
|
100
|
-
if (-not
|
|
101
|
-
Emit-Result -Ok $false -Code 4 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text
|
|
100
|
+
if (-not $CfCmd) {
|
|
101
|
+
Emit-Result -Ok $false -Code 4 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text 'ERROR: cf no encontrado en PATH.'
|
|
102
102
|
exit 4
|
|
103
103
|
}
|
|
104
104
|
|
|
@@ -145,8 +145,8 @@ if ($verbNorm -eq 'logs' -and $joined -notmatch '(?i)--recent') {
|
|
|
145
145
|
|
|
146
146
|
# Modo WhatIf: no toca red ni ejecuta; util para tests offline.
|
|
147
147
|
if ($WhatIf) {
|
|
148
|
-
$preview = Redact-Secrets ("WHATIF:
|
|
149
|
-
Emit-Result -Ok $true -Code 0 -Verb $verb -WasRedacted ($preview -ne ("WHATIF:
|
|
148
|
+
$preview = Redact-Secrets ("WHATIF: cf " + $joined)
|
|
149
|
+
Emit-Result -Ok $true -Code 0 -Verb $verb -WasRedacted ($preview -ne ("WHATIF: cf " + $joined)) -RawLog '' -Names @() -Text $preview
|
|
150
150
|
exit 0
|
|
151
151
|
}
|
|
152
152
|
if ($CfArgs.Count -eq 0) {
|
|
@@ -156,7 +156,7 @@ if ($CfArgs.Count -eq 0) {
|
|
|
156
156
|
|
|
157
157
|
# 4. Validacion de target (endpoint siempre; org solo si ExpectedOrg no vacio).
|
|
158
158
|
try {
|
|
159
|
-
$tRaw = & $
|
|
159
|
+
$tRaw = & $CfCmd target 2>&1 | Out-String
|
|
160
160
|
if ($tRaw -notmatch [regex]::Escape($ExpectedApi)) {
|
|
161
161
|
Emit-Result -Ok $false -Code 3 -Verb $verb -WasRedacted $true -RawLog '' -Names @() -Text (Redact-Secrets ('TARGET MISMATCH: endpoint no coincide con ' + $ExpectedApi))
|
|
162
162
|
exit 3
|
|
@@ -175,10 +175,10 @@ New-Item -ItemType Directory -Force -Path $TempDir | Out-Null
|
|
|
175
175
|
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
|
|
176
176
|
$rawLog = Join-Path $TempDir ("cf-" + $stamp + "-PID" + $PID + ".raw.log")
|
|
177
177
|
try {
|
|
178
|
-
$raw = & $
|
|
178
|
+
$raw = & $CfCmd @CfArgs 2>&1 | Out-String
|
|
179
179
|
$code = $LASTEXITCODE
|
|
180
180
|
} catch {
|
|
181
|
-
Emit-Result -Ok $false -Code 4 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text 'ERROR: fallo al invocar
|
|
181
|
+
Emit-Result -Ok $false -Code 4 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text 'ERROR: fallo al invocar cf.'
|
|
182
182
|
exit 4
|
|
183
183
|
}
|
|
184
184
|
try { Set-Content -Path $rawLog -Value $raw -Encoding UTF8 } catch { $rawLog = '' }
|