Pair programming TDD cycle (RED → GREEN → REFACTOR) para cambios dentro de una feature existente de PryApp
Cuando ya hay una feature armada con /new-feature y querés agregar un comportamiento nuevo (o arreglar un bug, o refactorizar), este skill conduce el ciclo RED-GREEN-REFACTOR de forma explícita.
La diferencia con /new-feature: este no crea archivos. Edita los existentes siguiendo el ciclo.
/new-feature/tdd <qué querés hacer> — ej. /tdd BlockStore soporta wildcards con *.example.com
Si el mensaje es vago, preguntar:
Editar el archivo de tests correspondiente. Agregar un solo test que exprese el comportamiento nuevo. Asserts reales, no placeholders.
func test_isBlocked_withWildcardPattern_matchesSubdomain() {
// GIVEN
store.add("*.example.com")
// WHEN
let result = store.isBlocked("api.example.com")
// THEN
XCTAssertTrue(result)
}
Correr el test:
swift test --filter <TestClass>/<testMethod>
Esperar: FAIL. Si pasa de entrada, el test está mal (no prueba nada nuevo) — mostrar al usuario y replantear.
Mostrar la salida al usuario y decir: "✓ RED confirmado. Listo para implementar?"
Editar el archivo de producción. Implementar lo mínimo para que el test pase. No agregar features adicionales. No optimizar todavía.
Correr el test:
swift test --filter <TestClass>/<testMethod>
Esperar: PASS. Correr también toda la suite de la feature para confirmar que no rompimos nada:
swift test --filter <FeatureName>
Si algún test existente rompió, parar y analizar con el usuario antes de continuar.
Mostrar salida: "✓ GREEN. ¿Refactorizamos o seguimos con otro test?"
Preguntar al usuario: "¿Ves algo para mejorar en el código nuevo o existente? Si querés, revisaré yo."
Si hay refactor claro (extraer función, renombrar, eliminar duplicación), proponerlo como diff. Después de cada refactor:
swift test --filter <FeatureName>
Tests deben seguir GREEN. Si no, revertir.
swift test para confirmar transiciones. No asumir.~/.pry/ real en tests. Usar temp dirs y fakes.[RED]
swift test --filter BlockStoreTests/test_isBlocked_withWildcardPattern_matchesSubdomain
→ Test Case '-[BlockStoreTests test_isBlocked_withWildcardPattern_matchesSubdomain]' failed
XCTAssertTrue failed - 0 != 1
✓ Confirmado en RED. Implemento `isBlocked` para soportar wildcards?
[GREEN]
swift test --filter BlockStore
→ Test Suite 'BlockStoreTests' passed
✓ GREEN (8/8 tests pasan). ¿Refactor o seguimos con el siguiente behavior?
Sources/PryApp/Features/{X}/)Tests/PryAppTests/Features/{X}/)docs/ADR-006-new-architecture-desktop-app.md solo si el cambio involucra el patrón Interceptor/EventBus