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.
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # harness-btp
2
2
 
3
- [![version](https://img.shields.io/badge/version-v0.1.0-blue)](https://github.com/horangelmillan/harness-btp/releases/tag/v0.1.0)
3
+ [![version](https://img.shields.io/badge/version-v0.2.0-blue)](https://github.com/horangelmillan/harness-btp/releases/tag/v0.2.0)
4
4
  [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE)
5
- [![platform](https://img.shields.io/badge/platform-windows%20%7C%20linux-lightgrey)](https://github.com/horangelmillan/harness-btp)
6
- [![opencode](https://img.shields.io/badge/agent-OpenCode-purple)](https://opencode.ai)
5
+ [![platform](https://img.shields.io/badge/platform-windows%20%7C%20linux%20%7C%20macos-lightgrey)](https://github.com/horangelmillan/harness-btp)
6
+ [![agent](https://img.shields.io/badge/agent-any%20AGENTS.md--compatible-purple)](https://github.com/horangelmillan/harness-btp)
7
7
 
8
- Reglas, agentes y scripts reutilizables para llevar un MVP SAP de la especificación al despliegue en Cloud Foundry con OpenCode.
8
+ Reglas, agentes y scripts reutilizables para llevar un MVP SAP de la especificación al despliegue en Cloud Foundry, con cualquier cliente agéntico que lea `AGENTS.md`.
9
9
 
10
- Para quien construye MVPs SAP BTP en equipo Windows con OpenCode y quiere empezar cada proyecto con el mismo flujo probado, sin copiar y pegar.
10
+ Para quien construye MVPs SAP BTP y quiere empezar cada proyecto con el mismo flujo probado, sin copiar y pegar. Funciona en Windows, Linux y macOS, con OpenCode, Claude Code o cualquier otro cliente que lea `AGENTS.md` y ejecute scripts del proyecto.
11
11
 
12
12
  ## Contenidos
13
13
 
@@ -16,6 +16,7 @@ Para quien construye MVPs SAP BTP en equipo Windows con OpenCode y quiere empeza
16
16
  - [Quickstart](#quickstart)
17
17
  - [Instalación](#instalación)
18
18
  - [Actualizar y desinstalar](#actualizar-y-desinstalar)
19
+ - [Adaptadores opcionales](#adaptadores-opcionales)
19
20
  - [Estructura del repo](#estructura-del-repo)
20
21
  - [Cómo lo descubre el agente](#cómo-lo-descubre-el-agente)
21
22
  - [Troubleshooting](#troubleshooting)
@@ -27,71 +28,101 @@ Para quien construye MVPs SAP BTP en equipo Windows con OpenCode y quiere empeza
27
28
  ## Features
28
29
 
29
30
  - **Carpeta `AI/` sin envolver:** se instala dentro de tu proyecto (nuevo o existente) sin mover ni renombrar nada de lo que ya tienes.
30
- - **Idempotente con `SKIP` / `-Force` + backup:** repetir la instalación no pisa nada; solo reemplaza con `-Force` y guarda copia en `AI.bak`.
31
+ - **Idempotente con `SKIP` / `-Force` + backup:** repetir la instalación no pisa nada; solo reemplaza con `-Force` (`.ps1`) o `--force` (`.sh`) y guarda copia en `AI.bak`.
31
32
  - **Sin secretos:** el repo no contiene credenciales, tokens ni rutas de máquina; solo nombres y placeholders por paisaje.
32
33
  - **Tres formas de instalar:** `degit`, `git clone` o `pnpm dlx`, todas ancladas a un tag versionado.
33
34
  - **Versionado por tags:** cada versión es un tag `vX.Y.Z`; actualizar es repetir el comando contra el tag nuevo.
34
- - **El agente se adapta solo:** deja un puntero `AGENTS.md` en la raíz y OpenCode encuentra `AI/AGENTS.md`, `INICIO.md`, agentes, skills y plantilla de spec.
35
+ - **Instaladores pares:** `install.ps1` (PowerShell) e `install.sh` (bash/sh) con la misma lógica (`SKIP` / `CREATE` / `BACKUP` / `OK`). Elige el de tu shell.
36
+ - **Agnóstico al cliente:** el núcleo es Markdown + shell (`AI/AGENTS.md`, `AI/INICIO.md`, `AI/docs/`, `AI/scripts/`). `AI/.opencode/` y `AI/opencode.fragment.jsonc` son adaptadores opcionales de ejemplo, no requisitos (ver [Adaptadores opcionales](#adaptadores-opcionales)).
37
+ - **El agente se adapta solo:** deja un puntero `AGENTS.md` en la raíz y el cliente encuentra `AI/AGENTS.md`, `INICIO.md`, agentes, skills y plantilla de spec.
35
38
 
36
39
  ## Requisitos
37
40
 
38
41
  | Necesitas | Versión | Para qué |
39
42
  |---|---|---|
40
- | Windows PowerShell 5.1 / bash | incluido en el SO | ejecutar `install.ps1` / `install.sh` |
43
+ | PowerShell 5.1+ o bash/sh | incluido en el SO | ejecutar `install.ps1` / `install.sh` |
41
44
  | Node.js 18+ | solo si usas `degit` o `pnpm dlx` | descargar e instalar el harness |
42
45
  | `gh` (opcional) | cualquiera reciente | clonar repo privado o crear PRs |
43
- | OpenCode | cualquiera reciente | leer `AGENTS.md` y orquestar el flujo |
46
+ | Cliente agéntico | cualquiera reciente que lea `AGENTS.md` (OpenCode, Claude Code, etc.) | leer `AGENTS.md` y orquestar el flujo |
44
47
 
45
48
  > Sin Node también puedes instalar vía `git clone`, que no lo necesita.
46
49
 
47
50
  ## Quickstart
48
51
 
49
- El camino de 30 segundos en un proyecto nuevo (Windows, recomendado):
52
+ El camino de 30 segundos en un proyecto nuevo. Elige tu shell:
53
+
54
+ PowerShell (Windows):
50
55
 
51
56
  ```powershell
52
- npx -p degit degit horangelmillan/harness-btp#v0.1.0 AI-tmp -- AI-tmp
57
+ npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
53
58
  powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
54
59
  Remove-Item -Recurse -Force AI-tmp
55
60
  ```
56
61
 
57
- Eso es todo. Abre el proyecto en OpenCode y el agente ya sabe qué hacer: lee `AGENTS.md` → `AI/AGENTS.md` → `AI/INICIO.md`.
62
+ bash (Linux, macOS o Git Bash):
58
63
 
59
- ## Instalación
64
+ ```bash
65
+ npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
66
+ sh AI-tmp/install.sh --dest .
67
+ rm -rf AI-tmp
68
+ ```
60
69
 
61
- > En Linux/macOS sustituye `install.ps1 -Dest .` por `install.sh --dest .` en todos los ejemplos.
70
+ Eso es todo. Abre el proyecto en tu cliente agéntico y el agente ya sabe qué hacer: lee `AGENTS.md` → `AI/AGENTS.md` → `AI/INICIO.md`.
71
+
72
+ ## Instalación
62
73
 
63
74
  ### Opción 1 — degit (recomendado)
64
75
 
65
76
  Descarga solo lo necesario, sin historial git:
66
77
 
78
+ PowerShell:
79
+
67
80
  ```powershell
68
- npx -p degit degit horangelmillan/harness-btp#v0.1.0 AI-tmp -- AI-tmp
81
+ npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
69
82
  powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
70
83
  Remove-Item -Recurse -Force AI-tmp
71
84
  ```
72
85
 
86
+ bash:
87
+
88
+ ```bash
89
+ npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
90
+ sh AI-tmp/install.sh --dest .
91
+ rm -rf AI-tmp
92
+ ```
93
+
73
94
  ### Opción 2 — git clone
74
95
 
75
96
  Clon superficial anclado al tag:
76
97
 
98
+ PowerShell:
99
+
77
100
  ```powershell
78
- git clone --branch v0.1.0 --depth 1 https://github.com/horangelmillan/harness-btp AI-tmp
101
+ git clone --branch v0.2.0 --depth 1 https://github.com/horangelmillan/harness-btp AI-tmp
79
102
  powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .
80
103
  Remove-Item -Recurse -Force AI-tmp
81
104
  ```
82
105
 
106
+ bash:
107
+
108
+ ```bash
109
+ git clone --branch v0.2.0 --depth 1 https://github.com/horangelmillan/harness-btp AI-tmp
110
+ sh AI-tmp/install.sh --dest .
111
+ rm -rf AI-tmp
112
+ ```
113
+
83
114
  ### Opción 3 — pnpm dlx
84
115
 
85
- Sin descargas manuales (requiere publicar `create-harness-btp` en el registry):
116
+ Sin descargas manuales (requiere publicar `create-harness-btp` en el registry). Igual en todos los SO:
86
117
 
87
- ```powershell
118
+ ```bash
88
119
  pnpm dlx create-harness-btp --dest .
89
120
  ```
90
121
 
91
122
  ### Qué hace el instalador
92
123
 
93
- - `CREATE: AI/` o `SKIP: AI/ ya existe` (solo lo reemplaza con `-Force`, con backup a `AI.bak`).
94
- - `CREATE: AGENTS.md` o `SKIP: AGENTS.md ya existe` (tu `AGENTS.md` propio se conserva; con `-Force` se respalda a `AGENTS.md.bak`).
124
+ - `CREATE: AI/` o `SKIP: AI/ ya existe` (solo lo reemplaza con `-Force` / `--force`, con backup a `AI.bak`).
125
+ - `CREATE: AGENTS.md` o `SKIP: AGENTS.md ya existe` (tu `AGENTS.md` propio se conserva; con `-Force` / `--force` se respalda a `AGENTS.md.bak`).
95
126
  - Fusiona `.gitignore`: añade las líneas que falten, sin duplicar ni borrar las tuyas.
96
127
  - **No toca** `package.json` ni `mta.yaml` de tu proyecto, nunca.
97
128
 
@@ -100,12 +131,14 @@ Salida típica en proyecto nuevo:
100
131
  ```text
101
132
  CREATE: AI/
102
133
  CREATE: AGENTS.md
103
- OK: harness v0.1.0 instalado
134
+ OK: harness v0.2.0 instalado
104
135
  ```
105
136
 
106
137
  ## Actualizar y desinstalar
107
138
 
108
- **Actualizar:** repite el mismo comando de instalación contra el tag nuevo. Sin `-Force` lo existente se conserva (`SKIP:`); con `-Force` se reemplaza con backup:
139
+ **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:
140
+
141
+ PowerShell:
109
142
 
110
143
  ```powershell
111
144
  npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
@@ -114,15 +147,43 @@ Remove-Item -Recurse -Force AI-tmp
114
147
  # tu versión anterior queda en AI.bak por si quieres comparar
115
148
  ```
116
149
 
150
+ bash:
151
+
152
+ ```bash
153
+ npx -p degit degit horangelmillan/harness-btp#v0.2.0 AI-tmp -- AI-tmp
154
+ sh AI-tmp/install.sh --dest . --force
155
+ rm -rf AI-tmp
156
+ # tu versión anterior queda en AI.bak por si quieres comparar
157
+ ```
158
+
117
159
  **Desinstalar:** borra la carpeta y el puntero. No deja servicios ni hooks:
118
160
 
161
+ PowerShell:
162
+
119
163
  ```powershell
120
164
  Remove-Item -Recurse -Force AI
121
165
  Remove-Item -Force AGENTS.md # solo si es el puntero al harness
122
166
  ```
123
167
 
168
+ bash:
169
+
170
+ ```bash
171
+ rm -rf AI
172
+ rm -f AGENTS.md # solo si es el puntero al harness
173
+ ```
174
+
124
175
  > Si tu `AGENTS.md` tenía contenido propio antes del harness, el instalador lo respaldó en `AGENTS.md.bak`: restáuralo en vez de borrarlo.
125
176
 
177
+ ## Adaptadores opcionales
178
+
179
+ El harness funciona con **cualquier** cliente agéntico que lea `AGENTS.md`. Estos archivos son ayudas para un cliente concreto, no requisitos:
180
+
181
+ - **`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.
182
+ - **`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.
183
+ - **`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`.
184
+
185
+ Nada del núcleo exige OpenCode, Windows ni ningún modelo concreto.
186
+
126
187
  ## Estructura del repo
127
188
 
128
189
  ```text
@@ -130,9 +191,9 @@ harness-btp/
130
191
  ├── AI/ # lo que queda instalado en tu proyecto
131
192
  │ ├── AGENTS.md # reglas del harness (parametrizado, sin rutas absolutas)
132
193
  │ ├── INICIO.md # punto de entrada para el agente
133
- │ ├── opencode.fragment.jsonc# fragmento relativo para tu opencode.jsonc
134
- │ ├── .opencode/ # 11 agents + 2 commands + 4 skills
135
- │ ├── scripts/ # 5 scripts .ps1 + provision-espacio.template.ps1
194
+ │ ├── opencode.fragment.jsonc# ADAPTER opcional: ejemplo para opencode.jsonc
195
+ │ ├── .opencode/ # ADAPTER opcional: agents + commands + skills de ejemplo
196
+ │ ├── scripts/ # pares .ps1 / .sh + provision-espacio.template.ps1
136
197
  │ ├── docs/ # flujo-etapas, cf-safe, habilitacion-trial
137
198
  │ ├── specs/ # plantilla _template.md
138
199
  │ └── .gitignore.fragment # líneas a fusionar en tu .gitignore
@@ -141,15 +202,15 @@ harness-btp/
141
202
  ├── install.ps1 / install.sh # instaladores idempotentes (SKIP / CREATE / BACKUP / OK)
142
203
  ├── bin/ # ejecutable de create-harness-btp (pnpm dlx)
143
204
  ├── package.json # name create-harness-btp
144
- └── VERSION # 0.1.0
205
+ └── VERSION # 0.2.0
145
206
  ```
146
207
 
147
208
  ## Cómo lo descubre el agente
148
209
 
149
- 1. OpenCode abre tu proyecto y lee `AGENTS.md` en la raíz (el puntero que deja el instalador).
150
- 2. El puntero lo lleva a `AI/AGENTS.md`: reglas, herramientas (`sap_cf`, `mbt`) y presupuestos.
151
- 3. Desde ahí sigue a `AI/INICIO.md` para el flujo por etapas (`/flow`), descubre agentes en `.opencode/`, skills y scripts, y usa `AI/specs/_template.md` para nuevas especificaciones.
152
- 4. Antes del primer despliegue adapta los dos placeholders a tu máquina y destino (ver `AI/INICIO.md`).
210
+ 1. Tu cliente agéntico abre el proyecto y lee `AGENTS.md` en la raíz (el puntero que deja el instalador).
211
+ 2. El puntero lo lleva a `AI/AGENTS.md`: reglas, herramientas (`cf`, `mbt`) y presupuestos.
212
+ 3. Desde ahí sigue a `AI/INICIO.md` para el flujo por etapas (`/flow`), descubre los agentes de ejemplo en `.opencode/`, skills y scripts, y usa `AI/specs/_template.md` para nuevas especificaciones.
213
+ 4. Antes del primer despliegue adapta los dos placeholders a tu destino (ver `AI/INICIO.md`).
153
214
 
154
215
  Tú no configuras nada: el agente se adapta solo.
155
216
 
@@ -157,17 +218,24 @@ Tú no configuras nada: el agente se adapta solo.
157
218
 
158
219
  | Problema | Causa | Comando |
159
220
  |---|---|---|
160
- | `SKIP: AI/ ya existe` y quería actualizar | reinstalación sin `-Force` conserva lo existente | repite con `-Force` (guarda `AI.bak`) |
161
- | Mi `AGENTS.md` propio desapareció | se instaló con `-Force` | recupera `AGENTS.md.bak` |
221
+ | `SKIP: AI/ ya existe` y quería actualizar | reinstalación sin fuerza conserva lo existente | repite con `-Force` (`.ps1`) o `--force` (`.sh`); guarda `AI.bak` |
222
+ | Mi `AGENTS.md` propio desapareció | se instaló con fuerza | recupera `AGENTS.md.bak` |
162
223
  | Líneas duplicadas en `.gitignore` | edición manual tras la fusión | el instalador fusiona sin duplicar; borra el duplicado a mano |
163
- | `ExecutionPolicy` bloquea `install.ps1` | política de PowerShell | `powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .` |
164
- | `degit` falla sin Node | `degit` corre sobre Node 18+ | instala Node o usa `git clone --branch v0.1.0` |
224
+ | `ExecutionPolicy` bloquea `install.ps1` | política de PowerShell | `powershell -ExecutionPolicy Bypass -File AI-tmp/install.ps1 -Dest .` (o usa `install.sh` en Git Bash) |
225
+ | `ABORT: opción desconocida` en `install.sh` | flag inexistente | `sh install.sh --help` lista `--dest`, `--force` |
226
+ | `degit` falla sin Node | `degit` corre sobre Node 18+ | instala Node o usa `git clone --branch v0.2.0` |
227
+ | 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` |
165
228
 
166
229
  ## Compatibilidad
167
230
 
168
- - Windows 10/11 + PowerShell 5.1 verificado.
169
- - Linux/macOS vía `install.sh` (mismo comportamiento `SKIP` / `--force` + backup).
170
- - OpenCode como orquestador del flujo.
231
+ Matriz honesta cliente × SO (`verificado` = probado con evidencia; `esperado` = sin bloqueo conocido, pendiente de evidencia):
232
+
233
+ | Cliente agéntico | Windows | Linux | macOS |
234
+ |---|---|---|---|
235
+ | OpenCode | verificado | esperado (`install.sh` par verificado en Git Bash) | esperado |
236
+ | Claude Code, otros que lean `AGENTS.md` | esperado | esperado | esperado |
237
+
238
+ - Instaladores y `check-prereqs` / `check-docs` verificados en Windows (`.ps1` nativo, `.sh` vía Git Bash, paridad CREATE/SKIP/BACKUP/OK + mismos `exit`).
171
239
  - SAP BTP Cloud Foundry solo cuando el MVP lo pida: el harness no crea cuentas ni espacios por sí solo.
172
240
 
173
241
  ## Contribuir
@@ -182,4 +250,4 @@ MIT. Haz lo que quieras con el harness; sin garantía.
182
250
 
183
251
  ## Changelog
184
252
 
185
- - **v0.1.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.
253
+ - **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.1
1
+ 0.2.0
package/install.ps1 CHANGED
@@ -58,3 +58,9 @@ if (Test-Path $GiDst) {
58
58
  }
59
59
 
60
60
  Write-Output "OK: harness instalado en $Dest (package.json y mta.yaml intactos)"
61
+
62
+ # Verificación de prerrequisitos en modo aviso (no bloquea la instalación).
63
+ try {
64
+ $Check = Join-Path $AiSrc "scripts\check-prereqs.ps1"
65
+ if (Test-Path $Check) { & $Check -WarnOnly }
66
+ } catch { Write-Output "AVISO: no se pudo ejecutar check-prereqs.ps1 (ver AI/docs/prerequisitos.md)" }
package/install.sh CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/bin/sh
2
2
  # Instalador del harness BTP (idempotente, POSIX sh).
3
- # Uso: ./install.sh [--dest .] [--force]
3
+ # Uso: ./install.sh [--dest <dir>] [--force] [--help]
4
4
  # Sin secretos. No toca package.json ni mta.yaml del proyecto.
5
5
  DEST="."
6
6
  FORCE=0
@@ -8,7 +8,13 @@ while [ $# -gt 0 ]; do
8
8
  case "$1" in
9
9
  --dest) DEST="$2"; shift 2 ;;
10
10
  --force) FORCE=1; shift ;;
11
- *) echo "ABORT: opción desconocida $1"; exit 1 ;;
11
+ -h|--help)
12
+ echo "Uso: ./install.sh [--dest <dir>] [--force] [--help]"
13
+ echo " --dest <dir> proyecto destino (por defecto: .)"
14
+ echo " --force reinstala AI/ con backup a AI.bak"
15
+ echo " -h, --help muestra esta ayuda"
16
+ exit 0 ;;
17
+ *) echo "ABORT: opción desconocida $1 (usa --help)"; exit 1 ;;
12
18
  esac
13
19
  done
14
20
  SRC="$(cd "$(dirname "$0")" && pwd)"
@@ -46,3 +52,10 @@ if [ "$ADDED" -eq 0 ]; then echo "SKIP: .gitignore ya contiene el fragmento"
46
52
  else echo "CREATE: .gitignore (+$ADDED líneas)"; fi
47
53
 
48
54
  echo "OK: harness instalado en $DEST (package.json y mta.yaml intactos)"
55
+
56
+ # Verificación de prerrequisitos en modo aviso (no bloquea la instalación).
57
+ if [ -f "$SRC/AI/scripts/check-prereqs.sh" ]; then
58
+ sh "$SRC/AI/scripts/check-prereqs.sh" --warn-only || true
59
+ else
60
+ echo "AVISO: no se encontró check-prereqs.sh (ver AI/docs/prerequisitos.md)"
61
+ fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-harness-btp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Instala el harness MVP SAP BTP como carpeta AI/ en cualquier proyecto",
5
5
  "keywords": ["sap-btp", "opencode", "harness", "agents", "scaffolder", "create"],
6
6
  "homepage": "https://github.com/horangelmillan/harness-btp#readme",
@@ -1,41 +0,0 @@
1
- ---
2
- name: sap-cf-cli
3
- description: Uso seguro del CLI de Cloud Foundry como sap_cf en Windows
4
- ---
5
-
6
- # CLI Cloud Foundry (`sap_cf`)
7
-
8
- En [TU_PC] `cf` es el CLI de **Cloudflare**. Cloud Foundry se invoca
9
- **siempre** como `sap_cf` (`sap_cf.cmd`, ruta de instalación de
10
- Cloud Foundry CLI en [TU_PC]; verificado en Windows, adapta rutas).
11
-
12
- ## Lectura segura (sin secretos)
13
-
14
- ```
15
- sap_cf target # endpoint / org / espacio actuales
16
- sap_cf api # endpoint y versión API
17
- sap_cf orgs # solo nombres
18
- sap_cf spaces # solo nombres
19
- sap_cf apps # estado observable (started/stopped, rutas)
20
- sap_cf services # instancias visibles
21
- sap_cf logs <app> --recent
22
- ```
23
-
24
- `target`, `api`, `orgs`, `spaces` y `app <nombre>` nunca muestran tokens.
25
- Si una salida incluyera un secreto, redáctalo antes de citarla.
26
-
27
- ## Mutaciones (solo `deploy-cf`, con destino confirmado)
28
-
29
- - Confirmar endpoint/org/espacio contra la spec **antes** de cada despliegue.
30
- - `sap_cf push` para apps simples; `sap_cf deploy <archivo>.mtar` para MTA
31
- (requiere plugin `multiapps`, no instalado: ver skill `mta-build`).
32
- - Verificar después: `sap_cf apps` + `sap_cf logs <app> --recent` + URL.
33
-
34
- ## Denylist
35
-
36
- - `cf ...` para cualquier operación Foundry.
37
- - Borrar o renombrar orgs, espacios, apps o servicios fuera del MVP.
38
- - `sap_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.