create-harness-btp 0.1.1 → 0.2.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.
@@ -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 `sap_cf` con efecto y
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 `sap-cf-cli` y `mta-build` antes del primer
12
+ Procedimiento (cargar skills `cf-cli` y `mta-build` antes del primer
13
13
  comando del turno):
14
14
 
15
- 1. `sap_cf target` y confirmar endpoint/org/espacio contra la spec.
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 (`sap_cf deploy` si hay plugin multiapps, si no `sap_cf push`
19
- según plan) y verificar con evidencia observable (`sap_cf apps`,
20
- `sap_cf logs <app> --recent`, URL de la app).
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: usar `cf` para Foundry, borrar orgs/espacios/apps ajenas al MVP,
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 `sap_cf` con efecto.
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. `sap_cf target` coincide con el destino de la spec (endpoint/org/espacio).
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
- `sap_cf deploy <archivo>.mtar` requiere el **plugin multiapps**. Verificar
27
- siempre con `sap_cf plugins` antes de asumir su ausencia (2026-10-30 resultó
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
- sap_cf install-plugin -r CF-Community multiapps
32
+ cf install-plugin -r CF-Community multiapps
33
33
  ```
34
34
 
35
- Alternativa sin plugin para MVPs simples: `sap_cf push` por app según plan.
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, adapta rutas a [TU_PC].
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 OpenCode en este equipo Windows. El `AGENTS.md` global de
6
- > `[TU_PC]\.config\opencode` sigue cargándose; en caso de conflicto,
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 | `sap_cf` | `sap_cf.cmd` (ruta de instalación de Cloud Foundry CLI en [TU_PC]). |
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
- Ver skill local `sap-cf-cli` antes del primer comando CF del turno;
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 verificado: `[TU_ENDPOINT_CF]` (p. ej. `https://api.cf.<region>.hana.ondemand.com`;
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 `sap_cf target`;
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 (`sap_cf deploy *.mtar`) requiere el plugin **multiapps**.
30
- Antes de asumir su ausencia o instalarlo, verificar con `sap_cf plugins`
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 `sap_cf`, una vez por espacio) |
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
- - `sap_cf` siempre; `cf` prohibido (es Cloudflare en [TU_PC]).
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: `sap_cf target -s <paisaje>` → `sap_cf deploy mta_archives/<mtar> -e <paisaje>.mtaext`. Sin `-e` no hay deploy multi-paisaje.
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 `sap_cf` (nunca `cf`).
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. `sap_cf target` re-verificado coincide con la spec;
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 Windows local ([TU_PC]). No presuponer que una instalación local
134
- (`sap_cf`, `mbt`, Node, Java, Python) existe en un dev space
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 `sap_cf target`
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`); índice local por defecto,
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, adapta rutas a [TU_PC].
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 OpenCode como orquestador.
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
- ## Estado verificado (Windows, [TU_PC])
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
- | `sap_cf --version` | CF CLI, sesión activa contra `[TU_ENDPOINT_CF]` |
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 instalada en [TU_PC] |
15
- | `java` | versión instalada en [TU_PC] — sirve para builds MTA Java si la spec los pide |
16
- | `cf` | CLI de Cloudflare — no usar para Foundry |
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 `sap_cf plugins` antes de asumir |
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
- sap_cf target # endpoint/org/espacio actuales (sin secretos)
51
- sap_cf apps # estado observable tras desplegar
52
- sap_cf logs <app> --recent
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 `cf ...` para Foundry. Nunca pegar tokens en terminal ni en specs.
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 `sap_cf` directo en agentes/scripts si la salida puede traer
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
@@ -1,6 +1,6 @@
1
1
  # cf-safe — broker determinista para Cloud Foundry
2
2
 
3
- Punto único de salida hacia `sap_cf`. Fail-closed: nada ejecuta sin pasar
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
- `sap_cf` (`sap_cf.cmd`, ruta fija) y devuelve UNA línea JSON
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 `sap_cf` directamente para lecturas con secreto
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
- `sap_cf` directo en agentes/scripts cuando la salida pueda traer
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 fijo (`cf` de Cloudflare se rechaza) → 2) denylist →
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-*`,
@@ -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; `sap_cf target` coincide con spec |
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: `sap_cf target` (endpoint, org, espacio).
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, `sap_cf`, crear
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.
@@ -1,11 +1,11 @@
1
1
  <#
2
2
  .SYNOPSIS
3
- Broker determinista para Cloud Foundry: unico punto de salida hacia sap_cf.
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: solo sap_cf / sap_cf.cmd (ruta fija). `cf` (Cloudflare aqui) se rechaza.
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 = 'sap_cf',
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
- $SapCfCmd = 'C:\Program Files\Cloud Foundry\sap_cf.cmd'
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 fijo: rechaza `cf` y cualquier otro binario.
93
+ # 1. Binario: solo `cf` (resuelto en PATH).
94
94
  $binNorm = ([string]$CfBinary).ToLowerInvariant()
95
- $binOk = ($binNorm -eq 'sap_cf' -or $binNorm -eq 'sap_cf.cmd' -or $binNorm -eq $SapCfCmd.ToLowerInvariant())
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 sap_cf."
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 (Test-Path $SapCfCmd)) {
101
- Emit-Result -Ok $false -Code 4 -Verb $verb -WasRedacted $false -RawLog '' -Names @() -Text "ERROR: no existe $SapCfCmd."
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: sap_cf " + $joined)
149
- Emit-Result -Ok $true -Code 0 -Verb $verb -WasRedacted ($preview -ne ("WHATIF: sap_cf " + $joined)) -RawLog '' -Names @() -Text $preview
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 = & $SapCfCmd target 2>&1 | Out-String
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 = & $SapCfCmd @CfArgs 2>&1 | Out-String
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 sap_cf.'
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 = '' }