Skip to content

feat: CLI interactiva v0.1.0 — perfiles, pipelines, aprobaciones, work items, secure files y extensiones - #2

Merged
henryd24 merged 4 commits into
mainfrom
claude/confident-clarke-td96ec
Oct 4, 2026
Merged

henryd24 merged 4 commits into
mainfrom
claude/confident-clarke-td96ec

Conversation

@henryd24

@henryd24 henryd24 commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Resumen

Convierte la CLI en una herramienta interactiva y mucho más completa, y reescribe su núcleo para que sea fiable en scripts y CI. Detalle completo en RELEASE_NOTES.md (v0.1.0) y README.md.

Cambios

Núcleo

  • Cliente HTTP centralizado: valida el código de respuesta de todas las llamadas, errores legibles, detección de PAT inválido (203 / sesión anónima en proyectos públicos), reintentos ante 429/5xx, escape de URLs, --debug.
  • Librería (azdevops/) sin E/S de consola; comandos con RunE y códigos de salida (0 / 1 / 130).

Experiencia de uso

  • Modo interactivo: azdevops sin argumentos abre un menú generado del árbol de comandos; todos los comandos preguntan lo que falte (listas filtrables, secretos ocultos, confirmaciones). Se desactiva con --no-input, AZDEVOPS_NO_INPUT o CI.
  • Perfiles: login, config view|use|delete|path; el PAT va al llavero del sistema cuando está disponible.
  • Salida -o table|json|yaml|tsv y --query (JMESPath), autocompletado dinámico, --version.

Comandos nuevos

  • variables: list, get --id, export/import (.env/JSON), copy (entre proyectos), diff (--exit-code).
  • pipelines: list, run con --name/--branch/progreso en vivo/código de salida, runs, status, logs --failed, cancel.
  • approvals y environments.
  • workitems (wi): list, get, create, update, delete.
  • service-connections (sc) y agents.
  • securefiles (sf), incluido replace, que cambia el contenido conservando pipelines autorizados, roles, herencia y aprobaciones, con reversión automática.
  • security: list-members, remove-member, list-groups --search/--project-only.
  • open para abrir recursos en el navegador.
  • extension (ext): init genera una extensión lista (src/tasks + azde-scripts + ncc + tfx, config dev/release, UUIDs, conexión opcional); add-task, bump, validate, reset-ids, uuid, pack, publish.

Correcciones

  • set-permissions aplicaba solo al primer grupo coincidente; pipelines create --branch se ignoraba; run --wait podía esperar indefinidamente o devolver éxito si fallaba la consulta; update fallaba sin process/repository; fugas de conexiones; README con flags incorrectos; nombre del binario en la ayuda.

Infraestructura

  • Workflow de CI (gofmt, vet, tests con -race, build), versión inyectada con ldflags, make test/vet/install.

⚠️ Cambios de comportamiento

  • Mensajes de estado en stderr; stdout solo para datos.
  • pipelines run --wait termina con código 1 si la ejecución falla o se cancela.
  • Sin terminal, las eliminaciones exigen --yes.
  • variables get / pipelines get --name devuelven error si no hay resultados.
  • pipelines get-by-id queda obsoleto (pipelines get --id).

Pruebas

  • Tests unitarios (cliente HTTP con httptest, parsing, perfiles/llavero, render JMESPath/YAML/TSV, diff de variables, WIQL, securefiles replace con servidor simulado incluyendo reversión, generador de extensiones).
  • Verificado contra una organización real: lecturas en varios proyectos; escrituras solo con recursos temporales en Pruebas y education (Variable Groups, un work item enviado a la papelera, secure files), eliminados al terminar.
  • extension init: proyecto generado con npm install, jest, tsc, .vsix y ejecución del index.js empaquetado; comandos de mantenimiento verificados sobre una copia de azdevops-extension-exec-pipeline.
  • No probado de punta a punta: aprobar/rechazar (no había pendientes), sc share, agents enable/disable, el llavero real del SO y ext publish con un token válido del Marketplace.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DPPr3c5aKtRBhPuTSFYFmA


Generated by Claude Code

claude added 4 commits October 4, 2026 02:10
…ariables

- Modo interactivo: menú navegable (azdevops / azdevops interactive) y
  prompts automáticos para los datos que falten en cada comando.
- Perfiles: azdevops login y config view/use/delete/path; flags globales
  --org, --project, --pat, --profile, -o, --no-input y --debug.
- Cliente HTTP centralizado: valida códigos de respuesta, errores legibles,
  detección de PAT inválido, reintentos ante 429/5xx y escape de URLs.
- Variable Groups: list, export/import (.env/JSON), get --id y salida en tabla.
- Pipelines: list, runs, status, logs, cancel; run con --name, --branch,
  progreso en vivo y código de salida según el resultado.
- Seguridad: list-members, remove-member, list-groups --search/--project-only.
- Tests unitarios, workflow de CI, versión inyectada con ldflags y README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPPr3c5aKtRBhPuTSFYFmA
… llavero y salida yaml/tsv/--query

- approvals list/approve/reject y environments list/deployments.
- workitems (wi) list/get/create/update/delete con WIQL, @me y modo guiado.
- service-connections list/get/history/share y agents pools/list/enable/disable.
- variables copy (también entre proyectos) y variables diff con --exit-code.
- azdevops open para abrir recursos en el navegador.
- Salida -o yaml|tsv y --query con JMESPath.
- PAT en el llavero del sistema (login --store auto|keyring|file).
- login verifica la identidad para no aceptar PATs inválidos en orgs con
  proyectos públicos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPPr3c5aKtRBhPuTSFYFmA
…obaciones

- securefiles (sf) list/get/upload/delete/authorize/set-role.
- securefiles replace: renombra el archivo actual, sube el nuevo con el
  nombre original y copia propiedades, pipelines autorizados (incluido el
  acceso abierto), roles asignados, herencia de permisos y checks; elimina
  el anterior (o lo conserva con --keep-old). Revierte si algo falla y
  omite el rol propio, que Azure DevOps no permite modificar.
- --dry-run para ver qué se conservará.
- El cliente HTTP acepta cuerpos binarios ([]byte).
- open securefiles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPPr3c5aKtRBhPuTSFYFmA
- extension init: genera una extensión lista para compilar, probar y
  empaquetar con la estructura de src/tasks + azde-scripts + ncc + tfx,
  config dev/release, iconos de ejemplo, UUIDs nuevos y conexión de
  servicio opcional; modo guiado o con flags, npm install y git init.
- extension add-task, bump, validate, reset-ids, uuid, pack y publish.
- Edición de JSON que conserva el orden y el formato de las claves no
  modificadas, para que los diffs sean mínimos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPPr3c5aKtRBhPuTSFYFmA
@henryd24
henryd24 marked this pull request as ready for review October 4, 2026 03:25
@henryd24
henryd24 merged commit 7e18249 into main Oct 4, 2026
2 checks passed
@henryd24
henryd24 deleted the claude/confident-clarke-td96ec branch October 4, 2026 03:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants