docker-swarm 0.7.1 → 0.8.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.
data/lib/docker_swarm.rb CHANGED
@@ -44,6 +44,7 @@ require_relative "docker_swarm/middleware/response_json_parser"
44
44
  require_relative "docker_swarm/middleware/error_handler"
45
45
  require_relative "docker_swarm/connection"
46
46
  require_relative "docker_swarm/api"
47
+ require_relative "docker_swarm/registry_auth"
47
48
 
48
49
  # Concerns deben cargarse antes que Base si Base los incluye
49
50
  require_relative "docker_swarm/concerns/creatable"
data/skill/SKILL.md CHANGED
@@ -9,10 +9,10 @@ description: >-
9
9
  cuando el caller necesita orquestar Docker desde Ruby — listar/crear/
10
10
  actualizar/eliminar recursos del cluster, leer logs de services/tasks/
11
11
  containers, hacer health-check del daemon (System.up/info/df), filtrar por
12
- labels, o capturar errores tipados de Docker (Conflict/NotFound/
13
- Communication). NO activar para builds de imágenes (no implementado), pull
14
- con auth de registry privado (no implementado), o flujos que no son
15
- Swarm (Docker Compose, raw containers).
12
+ labels, pullear imágenes (incl. de registries privados vía X-Registry-Auth),
13
+ o capturar errores tipados de Docker (Conflict/NotFound/Communication). NO
14
+ activar para builds de imágenes (no implementado) o flujos que no son Swarm
15
+ (Docker Compose, raw containers).
16
16
  triggers:
17
17
  - "DockerSwarm::"
18
18
  - "docker-swarm gem"
@@ -55,11 +55,11 @@ Defaults son razonables: en local sin TLS, no necesitás bloque `configure`.
55
55
 
56
56
  | Modelo | Class methods | Instance methods | Notas |
57
57
  |---|---|---|---|
58
- | `Service` | `all(filters)`, `find(id)`, `where(filters)`, `create(attrs)` | `update(attrs)`, `restart`, `destroy`, `logs(query)`, `reload`, `persisted?`, `id` | CRUD completo + force-recreate de tasks |
58
+ | `Service` | `all(filters)`, `find(id)`, `where(filters)`, `create(attrs)` | `update(attrs)`, `restart`, `destroy`, `logs(query)`, `reload`, `persisted?`, `id` | CRUD completo + force-recreate de tasks; `create`/`update` aceptan `registry_auth:` (+ `update`: `registry_auth_from:`) para auth de registry privado |
59
59
  | `Node` | `all(filters)`, `find(id)`, `where(filters)` | `update(attrs)`, `destroy` | No `create` (los nodos se unen fuera de la gema) |
60
60
  | `Task` | `all(filters)`, `find(id)`, `where(filters)` | `logs(query)`, `reload` | Read-only (generados por orquestador) |
61
61
  | `Container` | `all(filters)`, `find(id)`, `where(filters)` | `start`, `stop`, `destroy`, `logs(query)` | **No `create`** (gap conocido, fuera F1) |
62
- | `Image` | `all(filters)`, `find(id)`, `create(attrs)` | `destroy` | `create` = pull. **No soporta `X-Registry-Auth`** (registries privados con auth no funcionan) |
62
+ | `Image` | `all(filters)`, `find(id)`, `pull(image_reference, registry_auth:)` | `destroy` | **No `create`** (retirado; `Image` ya no es Creatable). `pull` = pull explícito síncrono → `{status, image_ref, digest?}`; **soporta `X-Registry-Auth`** para registries privados |
63
63
  | `Network` | `all(filters)`, `find(id)`, `create(attrs)` | `update(attrs)`, `destroy` | CRUD completo |
64
64
  | `Volume` | `all(filters)`, `find(id)`, `create(attrs)` | `destroy` | No `update` (Docker no lo soporta). Respuesta wrapped vía `root_key = "Volumes"` |
65
65
  | `Config` | `all(filters)`, `find(id)`, `create(attrs)` | `destroy` | No `update` — recrear |
@@ -131,7 +131,8 @@ Todas heredan de `DockerSwarm::Error`. Tres formas de acceso equivalentes: `Dock
131
131
  - **`Spec` se mergea con `deep_merge` en updates**, no se reemplaza. Pasale sólo los campos que cambian: `service.update(Mode: {...})`, no `service.update(Spec: {...completo})`.
132
132
  - **`assign_attributes` muta antes de validar.** Si `update` falla por `valid?` o por el API, la instancia local quedó mutada. Hacé `reload` si necesitás estado limpio.
133
133
  - **`Container.create` no existe** en la gema (gap intencional F1). Si necesitás crear containers standalone, usá `DockerSwarm.request(method: :post, path: "containers/create", ...)` directo.
134
- - **Pull con registry privado no soportado.** `Image.create` no inyecta header `X-Registry-Auth`. Para registries privados, fallback a `DockerSwarm.request` con headers manuales.
134
+ - **`Image.create` retirado (breaking).** Ya no existe (`Image` dejó de ser Creatable; el `create` estaba roto y sin consumidores). Usá `Image.pull(image_reference, registry_auth:)`.
135
+ - **Auth de registry privado soportado** vía credencial opaca base64url en `registry_auth:` — `Image.pull(ref, registry_auth:)`, `Service.create(..., registry_auth:)` y `Service#update(..., registry_auth:` / `registry_auth_from:)`. Viaja por header `X-Registry-Auth` (o query `registryAuthFrom`: `spec`\|`previous-spec`, excluyentes); la gema no la mintea ni decodifica. Ver flujos 3.9/3.10 de `docs/behavior/behavior.md`.
135
136
  - **`destroy` es graceful con 404** (retorna `nil`), no con 409. Si el recurso está en uso, `Conflict` se propaga.
136
137
  - **Logs sensibles enmascarados** automáticamente: keys matching `password|pass|passwd|secret|token|api_key|auth|\bdata\b` → `[FILTERED]`. `\bdata\b` evita filtrar `metadata`/`database`.
137
138
 
@@ -164,10 +165,16 @@ Logs salen en formato KV (`component=docker_swarm.connection event=request_succe
164
165
 
165
166
  ## Índice de artefactos
166
167
 
168
+ - [`docs/interface/interface.md`](docs/interface/interface.md) — API Ruby pública (11 modelos + `Base` + concerns + `Api`/`Connection`). La tabla de símbolos de arriba es el resumen; el detalle por símbolo acá.
169
+ - [`docs/errors/errors.md`](docs/errors/errors.md) — jerarquía de excepciones + mapeo status HTTP → excepción. La tabla de errores de arriba es el resumen.
170
+ - [`docs/consumed/docker-engine-api.md`](docs/consumed/docker-engine-api.md) — superficie del Docker Engine API consumida (`Api::ENDPOINTS`) + política de retry estructural.
167
171
  - [`docs/glossary/glossary.md`](docs/glossary/glossary.md) — definición de términos (primitivas Docker + conceptos internos).
168
172
  - [`docs/behavior/behavior.md`](docs/behavior/behavior.md) — secuencias load-bearing (create+reload, update+Version, retry-policy, error-mapping, etc.).
173
+ - [`docs/config/configuracion.md`](docs/config/configuracion.md) — inventario de configuración runtime (7 opciones del bloque `configure`, sin env vars, ninguna secreta). El bloque de arriba es el resumen; shape/defaults/consumidores en el detalle.
174
+ - [`docs/topology/topology.md`](docs/topology/topology.md) — dependencias runtime (3) + grafo de contexto.
175
+ - [`docs/test/testing.md`](docs/test/testing.md) — estructura de la suite RSpec (unit + integration) y comandos de corrida.
169
176
  - `docs/data/` — `n/a` (gema sin DB).
170
- - `docs/api/`, `docs/interface/`, `docs/topology/` — F2 declaradas, **no implementadas**. El contrato resumido de arriba reside **transitoriamente** acá (RFC-008 §2 coexistencia transitoria con destino pendiente).
177
+ - `docs/api/` (operaciones), `docs/events/` — `n/a` (la gema no expone superficie HTTP/CLI/eventos propia; su superficie pública es la interfaz Ruby).
171
178
 
172
179
  ## Versionado del contrato
173
180
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-swarm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel
@@ -91,8 +91,14 @@ files:
91
91
  - LICENSE
92
92
  - README.md
93
93
  - docs/behavior/behavior.md
94
- - docs/config/config.md
94
+ - docs/config/configuracion.md
95
+ - docs/consumed/docker-engine-api.md
96
+ - docs/errors/errors.md
95
97
  - docs/glossary/glossary.md
98
+ - docs/interface/interface.md
99
+ - docs/release/release.md
100
+ - docs/test/testing.md
101
+ - docs/topology/topology.md
96
102
  - lib/docker-swarm.rb
97
103
  - lib/docker_swarm.rb
98
104
  - lib/docker_swarm/api.rb
@@ -120,6 +126,7 @@ files:
120
126
  - lib/docker_swarm/models/system.rb
121
127
  - lib/docker_swarm/models/task.rb
122
128
  - lib/docker_swarm/models/volume.rb
129
+ - lib/docker_swarm/registry_auth.rb
123
130
  - lib/docker_swarm/version.rb
124
131
  - skill/SKILL.md
125
132
  homepage: https://github.com/gedera/docker-swarm
@@ -128,9 +135,9 @@ licenses:
128
135
  metadata:
129
136
  homepage_uri: https://github.com/gedera/docker-swarm
130
137
  source_code_uri: https://github.com/gedera/docker-swarm
131
- changelog_uri: https://github.com/gedera/docker-swarm/blob/v0.7.1/CHANGELOG.md
138
+ changelog_uri: https://github.com/gedera/docker-swarm/blob/v0.8.0/CHANGELOG.md
132
139
  bug_tracker_uri: https://github.com/gedera/docker-swarm/issues
133
- documentation_uri: https://github.com/gedera/docker-swarm/blob/v0.7.1/skill/SKILL.md
140
+ documentation_uri: https://github.com/gedera/docker-swarm/blob/v0.8.0/skill/SKILL.md
134
141
  rubygems_mfa_required: 'true'
135
142
  rdoc_options: []
136
143
  require_paths:
@@ -1,140 +0,0 @@
1
- # Inventario de Configuración — docker-swarm
2
-
3
- > meta: artefacto · generado manual · anclado a `b3549e7` · cobertura: archivos de configuración versionados del repo (excluye `lib/`, `spec/`, `skill/`, `docs/`)
4
-
5
- ## 1. Resumen
6
-
7
- Lista de archivos de configuración del repo, qué controlan, quién los consume y dónde tocar para cambiar comportamiento. Agrupados por dominio: **gema**, **Ruby/lint**, **CI/CD**, **dependencias automatizadas**, **agentes/skills**, **entorno local**.
8
-
9
- ## 2. Gema
10
-
11
- ### `docker-swarm.gemspec`
12
-
13
- Especificación de la gema (nombre, versión, autoría, deps runtime, ficheros incluidos, metadatos RubyGems). Versión leída desde `lib/docker_swarm/version.rb`.
14
-
15
- - Ruby mínimo: `>= 3.2.0`
16
- - Runtime deps: `activesupport >= 6.0`, `activemodel >= 6.0`, `excon >= 0.80`
17
- - Dev deps: `rake ~> 13.0`, `rspec ~> 3.0`
18
- - Files glob: `{lib,exe,skill,docs}/**/*` + `README.md`, `CHANGELOG.md`, `LICENSE`
19
- - MFA RubyGems: requerido (`rubygems_mfa_required = true`)
20
- - Cambio típico: bumpear versión → editar `lib/docker_swarm/version.rb` (no acá).
21
-
22
- ### `Gemfile`
23
-
24
- Sólo declara `gemspec` + grupos `:development, :test` y `:test`. Runtime deps viven en el gemspec.
25
-
26
- - `:development, :test`: `rspec`, `pry`, `rubocop-rails-omakase`
27
- - `:test`: `activemodel`, `activesupport`, `excon` (re-declaradas para resolver en test sin runtime gemspec)
28
-
29
- ### `Gemfile.lock`
30
-
31
- Lock generado por Bundler. Versionado. No editar a mano.
32
-
33
- ## 3. Ruby / Lint
34
-
35
- ### `.rubocop.yml`
36
-
37
- Base: `rubocop-rails-omakase`.
38
-
39
- - `TargetRubyVersion: 3.2`
40
- - Exclude: `bin/**/*`, `vendor/**/*`, `spec/fixtures/**/*`, `Gemfile`, `Gemfile.lock`, `docker-swarm.gemspec`
41
- - `Style/Documentation`: deshabilitado (ruido masivo; habilitar cuando YARD esté completo)
42
- - `Naming/MethodName`: excluido en `lib/docker_swarm/base.rb` y `lib/docker_swarm/models/**/*` (justificación: PascalCase fiel a Docker API)
43
-
44
- Sin `.ruby-version` en el repo. Ruby de runtime se infiere del gemspec (`>= 3.2.0`) y CI fija `3.4.4`.
45
-
46
- ## 4. CI/CD
47
-
48
- ### `.github/workflows/main.yml`
49
-
50
- Workflow `Ruby` — corre en `push` a `main` y en cada `pull_request`.
51
-
52
- - Runner: `ubuntu-latest`
53
- - Matrix Ruby: `['3.4.4']`
54
- - Steps: checkout (`actions/checkout@v6`, `persist-credentials: false`) → `ruby/setup-ruby@v1` con `bundler-cache: true` → `bundle exec rspec --tag ~type:integration` → `bundle exec rubocop`
55
- - Tests de integración (`type:integration`) excluidos en CI — requieren Docker Engine real, correr local.
56
-
57
- ### `.github/workflows/release.yml`
58
-
59
- Workflow `Publish to RubyGems` — corre en push de tag `v*`.
60
-
61
- - Runner: `ubuntu-latest`
62
- - Permisos: `contents: read`, `packages: write`
63
- - Steps: checkout → setup Ruby 3.4.4 → `gem build *.gemspec` → `gem push *.gem`
64
- - Secret requerido: `RUBYGEMS_API_KEY`
65
- - Trigger manual: pushear tag `v<version>` (ver `/gem-release`).
66
-
67
- ## 5. Dependencias automatizadas
68
-
69
- ### `.github/dependabot.yml`
70
-
71
- Dos ecosistemas:
72
-
73
- - `bundler` (`/`): semanal, máx 10 PRs abiertos. Grupo `development-dependencies` agrupa `rubocop*`, `rspec*`, `pry*` en un sólo PR.
74
- - `github-actions` (`/`): mensual.
75
-
76
- ## 6. Agentes / Skills
77
-
78
- ### `skills.yml`
79
-
80
- Declara MCPs y skills externas a sincronizar.
81
-
82
- - MCPs: `github`, `clickup`
83
- - Skills (todas `repo: sequre/ai_knowledge` excepto donde se indique): `yard`, `quality-code`, `gem-release`, `dev-structure`, `dev-compose`, `dev-enrich`, `skill-feedback`, `agent-issue`, `dev-flow`, `matrix-element`, `documentation-writer` (`repo: github/awesome-copilot`, `path: skills/documentation-writer`)
84
- - `matrix-element` consume env `MATRIX_AUTH_TOKEN` + homeserver `https://matrix.cloud.wispro.co` + room `agents`.
85
-
86
- ### `skills.lock`
87
-
88
- Lock de skills sincronizadas (`synced_at: 2026-04-07`). Todas con `scope: local` y path en `.agents/skills/`. Regenerable con `ruby .agents/skills/skill-manager/scripts/sync.rb`.
89
-
90
- ### `.claude/settings.local.json`
91
-
92
- Permisos locales de Claude Code (no versionar credenciales acá). Allow:
93
-
94
- - `Bash(find /Users/gabriel/src/gems/docker-swarm/spec/integration -type f -name "*_spec.rb" -exec wc -l {} \\;)`
95
- - `Bash(grep "^[[:space:]]*class " /Users/gabriel/src/gems/docker-swarm/lib/docker_swarm/**/*.rb)`
96
- - `Bash(git rm *)`
97
- - `Bash(bundle exec *)`
98
-
99
- ### `.claude/commands/*.md`
100
-
101
- Slash commands del proyecto. Cuatro archivos: `api.md`, `errors.md`, `orm.md`, `test.md`. Invocables como `/api`, `/errors`, `/orm`, `/test` desde Claude Code.
102
-
103
- ## 7. Entorno local
104
-
105
- ### `.env`
106
-
107
- **No versionado** (`.gitignore`). Variables ClickUp para reporting de agentes:
108
-
109
- - `AI_REPORTS_SPACE_ID`, `AI_REPORTS_BUG_REPORTS_LIST_ID`, `AI_REPORTS_IMPROVEMENTS_LIST_ID`
110
- - `AGENT_REVIEW_SAPCE_ID` (sic, typo), `AGENT_LIST_ID`, `AGENT_ACTION_PLAN_LIST_ID`
111
-
112
- ### `.gitignore`
113
-
114
- Ignora: `.agents/` (skills sincronizadas, regenerables) y `.env` (variables de entorno).
115
-
116
- ## 8. Tabla resumen
117
-
118
- | Archivo | Dominio | Consumidor | Versionado |
119
- |---|---|---|---|
120
- | `docker-swarm.gemspec` | Gema | Bundler / RubyGems | sí |
121
- | `Gemfile` | Gema | Bundler | sí |
122
- | `Gemfile.lock` | Gema | Bundler | sí |
123
- | `.rubocop.yml` | Lint | RuboCop | sí |
124
- | `.github/workflows/main.yml` | CI | GitHub Actions | sí |
125
- | `.github/workflows/release.yml` | CD | GitHub Actions | sí |
126
- | `.github/dependabot.yml` | Deps auto | GitHub Dependabot | sí |
127
- | `skills.yml` | Skills | `skill-manager` | sí |
128
- | `skills.lock` | Skills | `skill-manager` | sí |
129
- | `.claude/settings.local.json` | Agente | Claude Code | sí |
130
- | `.claude/commands/*.md` | Agente | Claude Code | sí |
131
- | `.env` | Entorno | runtime local | **no** |
132
- | `.gitignore` | VCS | git | sí |
133
-
134
- ## 9. Secrets / credenciales
135
-
136
- - GitHub Actions: `RUBYGEMS_API_KEY` (release.yml)
137
- - Local `.env`: IDs ClickUp (no secretos pero específicos del workspace)
138
- - Skills `matrix-element`: `MATRIX_AUTH_TOKEN`
139
-
140
- Ninguna credencial hardcodeada en archivos versionados.