sistema-multiagente-sdlc 1.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/CHANGELOG.md +126 -0
- package/LICENSE +21 -0
- package/README.md +155 -0
- package/bin/sdlc.js +4 -0
- package/migrations/1.0.1/README.md +28 -0
- package/migrations/1.0.1/up.mjs +6 -0
- package/migrations/1.1.0/up.mjs +8 -0
- package/migrations/1.2.0/up.mjs +17 -0
- package/package.json +63 -0
- package/profiles/greenfield-sdd/openspec.config.yaml +15 -0
- package/profiles/legacy-brownfield-sdd/openspec.config.yaml +16 -0
- package/schemas/sdlc.config.schema.json +106 -0
- package/scripts/install-sistema-sdlc.ps1 +22 -0
- package/scripts/install-sistema-sdlc.sh +33 -0
- package/scripts/validate-agent-persona-schema.mjs +44 -0
- package/scripts/validate-config-schema.mjs +13 -0
- package/scripts/validate-docs-links-exist.mjs +51 -0
- package/scripts/validate-external-tools-policy.mjs +35 -0
- package/scripts/validate-governance-precedence.mjs +32 -0
- package/scripts/validate-manifest-integrity.mjs +49 -0
- package/scripts/validate-models-schema.mjs +42 -0
- package/scripts/validate-mustache-references-exist.mjs +44 -0
- package/scripts/validate-no-inline-managed-content.mjs +92 -0
- package/scripts/validate-no-personal-paths.mjs +28 -0
- package/scripts/validate-no-placeholder-scripts.mjs +33 -0
- package/scripts/validate-openspec-consistency.mjs +38 -0
- package/scripts/validate-skill-manifest-consistency.mjs +28 -0
- package/scripts/validate-template-sanitization.mjs +44 -0
- package/src/cli.js +671 -0
- package/src/config-validator.js +30 -0
- package/src/file-utils.js +87 -0
- package/src/migrations.js +43 -0
- package/src/render.js +93 -0
- package/src/template-loader.js +158 -0
- package/templates/.agents/skills/.gitkeep +1 -0
- package/templates/.claude/skills/.gitkeep +1 -0
- package/templates/.claude/skills/commit/SKILL.md +18 -0
- package/templates/.claude/skills/contexto-proyecto/SKILL.md +15 -0
- package/templates/.claude/skills/enrich-us/SKILL.md +23 -0
- package/templates/.github/AGENTS.md +29 -0
- package/templates/.github/agent-state/README.md +19 -0
- package/templates/.github/agent-state/active-slices.yaml +21 -0
- package/templates/.github/agent-state/calibration/.gitkeep +1 -0
- package/templates/.github/agent-state/calibration/SCHEMA.md +22 -0
- package/templates/.github/agent-state/current-slice.md +39 -0
- package/templates/.github/agent-state/drafts/.gitkeep +1 -0
- package/templates/.github/agent-state/handoffs/.gitkeep +1 -0
- package/templates/.github/agent-state/handoffs/TEMPLATE.md +21 -0
- package/templates/.github/agent-state/open-decisions.md +13 -0
- package/templates/.github/agent-state/open-risks.md +16 -0
- package/templates/.github/agent-state/phase-graph.yaml +192 -0
- package/templates/.github/agent-state/phase-status.yaml +32 -0
- package/templates/.github/agent-state/platform-context.json +12 -0
- package/templates/.github/agent-state/telemetry/.gitkeep +1 -0
- package/templates/.github/agent-state/telemetry/SCHEMA.md +11 -0
- package/templates/.github/agent-state/templates/handoff.md +23 -0
- package/templates/.github/agent-state/templates/issue-rework.md +19 -0
- package/templates/.github/agent-state/templates/phase-gate.md +7 -0
- package/templates/.github/agents/README.md +19 -0
- package/templates/.github/agents/analista-requisitos.agent.md +25 -0
- package/templates/.github/agents/analista-requisitos.md +24 -0
- package/templates/.github/agents/api-agent.md +22 -0
- package/templates/.github/agents/api-nestjs.agent.md +25 -0
- package/templates/.github/agents/arquitecto-modular-clean.agent.md +25 -0
- package/templates/.github/agents/arquitecto.md +22 -0
- package/templates/.github/agents/mobile-sync.agent.md +25 -0
- package/templates/.github/agents/orquestador-opus.agent.md +25 -0
- package/templates/.github/agents/orquestador-opus.md +18 -0
- package/templates/.github/agents/ownership-matrix.md +11 -0
- package/templates/.github/agents/planificador-opus.agent.md +25 -0
- package/templates/.github/agents/planificador-opus.md +18 -0
- package/templates/.github/agents/qa-security-review.agent.md +25 -0
- package/templates/.github/agents/qa-security-review.md +18 -0
- package/templates/.github/agents/semantic-guardrails.json +30 -0
- package/templates/.github/agents/surface-traceability.json +52 -0
- package/templates/.github/agents/web-admin.agent.md +25 -0
- package/templates/.github/agents/web-agent.md +22 -0
- package/templates/.github/copilot-instructions-greenfield.md +22 -0
- package/templates/.github/copilot-instructions-legacy.md +22 -0
- package/templates/.github/copilot-instructions.md +34 -0
- package/templates/.github/skills/backend-audit/SKILL.md +57 -0
- package/templates/.github/skills/commit/SKILL.md +18 -0
- package/templates/.github/skills/contexto-proyecto/SKILL.md +15 -0
- package/templates/.github/skills/documentacion-viva/SKILL.md +82 -0
- package/templates/.github/skills/enrich-us/SKILL.md +23 -0
- package/templates/.github/skills/openspec-apply/SKILL.md +17 -0
- package/templates/.github/skills/openspec-archive/SKILL.md +15 -0
- package/templates/.github/skills/openspec-continue/SKILL.md +68 -0
- package/templates/.github/skills/openspec-explore/SKILL.md +15 -0
- package/templates/.github/skills/openspec-ff/SKILL.md +76 -0
- package/templates/.github/skills/openspec-new/SKILL.md +64 -0
- package/templates/.github/skills/openspec-propose/SKILL.md +14 -0
- package/templates/.github/skills/openspec-sync/SKILL.md +64 -0
- package/templates/.github/skills/openspec-verify/SKILL.md +16 -0
- package/templates/.github/skills/operacion-cli-devops/SKILL.md +77 -0
- package/templates/.github/skills/orquestacion-multiagente/SKILL.md +21 -0
- package/templates/.github/skills/ui-ux-diseno/SKILL.md +59 -0
- package/templates/.sdlc/README.md +7 -0
- package/templates/.windsurf/skills/.gitkeep +1 -0
- package/templates/AGENTS.md +11 -0
- package/templates/CLAUDE.md +26 -0
- package/templates/docs/agents/catalogo-comandos-proyecto.md +42 -0
- package/templates/docs/agents/domain.md +14 -0
- package/templates/docs/agents/external-tools-matrix.md +120 -0
- package/templates/docs/agents/guardrails-semanticos-del-dominio.md +21 -0
- package/templates/docs/agents/issue-tracker.md +9 -0
- package/templates/docs/agents/mapa-de-agentes-y-handoffs.md +17 -0
- package/templates/docs/agents/matriz-de-trazabilidad-por-superficie.md +17 -0
- package/templates/docs/agents/presentacion-sistema-multiagente-sdlc.md +44 -0
- package/templates/docs/agents/stack-map.md +15 -0
- package/templates/docs/agents/triage-labels.md +16 -0
- package/templates/docs/guides/adopcion_openspec_sdd.md +155 -0
- package/templates/docs/guides/business-production-readiness.md +257 -0
- package/templates/docs/guides/memoria-persistente-multiagente.md +196 -0
- package/templates/docs/guides/sdlc-multiagente.md +18 -0
- package/templates/docs/guides/skills-multi-entorno.md +118 -0
- package/templates/graphifyignore +18 -0
- package/templates/indice-operativo.md +12 -0
- package/templates/manifest.yaml +273 -0
- package/templates/openspec/changes/.gitkeep +0 -0
- package/templates/openspec/config-greenfield.yaml +24 -0
- package/templates/openspec/config-legacy.yaml +24 -0
- package/templates/openspec/profiles/expanded.yaml +28 -0
- package/templates/openspec/profiles/minimal.yaml +20 -0
- package/templates/openspec/schemas/greenfield-sdd/schema.yaml +143 -0
- package/templates/openspec/schemas/greenfield-sdd/templates/design.md +27 -0
- package/templates/openspec/schemas/greenfield-sdd/templates/proposal.md +42 -0
- package/templates/openspec/schemas/greenfield-sdd/templates/spec.md +9 -0
- package/templates/openspec/schemas/greenfield-sdd/templates/tasks.md +14 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/schema.yaml +312 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/templates/design.md +31 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/templates/proposal.md +47 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/templates/research.md +119 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/templates/spec.md +9 -0
- package/templates/openspec/schemas/legacy-brownfield-sdd/templates/tasks.md +14 -0
- package/templates/openspec/specs/.gitkeep +0 -0
- package/templates/openspec/specs/business-production-readiness/README.md +27 -0
- package/templates/openspec/specs/business-production-readiness/spec.md +72 -0
- package/templates/openspec/specs/project-phases/spec.md +62 -0
- package/templates/scripts/agent-skills.manifest.json +63 -0
- package/templates/scripts/bootstrap-agent-skills.ps1 +137 -0
- package/templates/scripts/bootstrap-obsidian-vault.ps1 +186 -0
- package/templates/scripts/claude-to-obsidian.py +154 -0
- package/templates/scripts/compute-calibration.ps1 +79 -0
- package/templates/scripts/continua.ps1 +141 -0
- package/templates/scripts/export-graphify-obsidian.py +123 -0
- package/templates/scripts/models.yaml +30 -0
- package/templates/scripts/obsidian-memory.config.example.json +39 -0
- package/templates/scripts/publish-trace.ps1 +179 -0
- package/templates/scripts/register-claude-sync-task.ps1 +52 -0
- package/templates/scripts/sync-claude-obsidian.ps1 +73 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.2.0] — Unreleased
|
|
4
|
+
|
|
5
|
+
### Phase 1 — Versionado y migraciones
|
|
6
|
+
|
|
7
|
+
- Prepara metadata npm publica para `sistema-multiagente-sdlc`.
|
|
8
|
+
- Actualiza `frameworkVersion` a `1.2.0`.
|
|
9
|
+
- Reserva `scale` en config (`bug`, `feature`, `epic`, `platform`) para adaptive scale de v1.3.0.
|
|
10
|
+
- Agrega targets de migracion `1.1.0` y `1.2.0` para cubrir upgrades `1.0.0 -> 1.2.0` y `1.1.0 -> 1.2.0`.
|
|
11
|
+
|
|
12
|
+
### Phase 2 — Scripts operativos
|
|
13
|
+
|
|
14
|
+
- Reemplaza stubs por 12 scripts sanitizados en `templates/scripts/`.
|
|
15
|
+
- Agrega politica opt-in: `publish-trace` y scheduler requieren `-Apply`; sync externo requiere flags explicitos.
|
|
16
|
+
- Instala `agent-skills.manifest.json`, `models.yaml` routing-only y config ejemplo de memoria Obsidian.
|
|
17
|
+
- Amplia regresion con pruebas golden para `continua`, `publish-trace`, `register-claude-sync-task`, `compute-calibration` y `bootstrap-agent-skills`.
|
|
18
|
+
|
|
19
|
+
### Phase 3 — C5/C6 skills
|
|
20
|
+
|
|
21
|
+
- Agrega stack-skills canonicas `backend-audit` y `ui-ux-diseno` bajo `.github/skills`.
|
|
22
|
+
- Agrega scaffolds de mirrors `.claude/skills`, `.agents/skills` y `.windsurf/skills`.
|
|
23
|
+
- Extiende `stack` con `database` y `designSystem` para las nuevas skills parametrizadas.
|
|
24
|
+
|
|
25
|
+
### Phase 4 — Gobierno operativo
|
|
26
|
+
|
|
27
|
+
- Enriquece `.github/agent-state/` con `phase-status`, `active-slices`, decisiones, riesgos, lock TTL, drafts, calibration y templates de rework/handoff.
|
|
28
|
+
- Fortalece `phase-graph.yaml` con rework label-driven, `F3_5` tecnico y `F3.5` display.
|
|
29
|
+
- Agrega personas `.agent.md` validables, README de agentes y trazabilidad/guardrails genericos.
|
|
30
|
+
|
|
31
|
+
### Phase 5 — Docs operativas
|
|
32
|
+
|
|
33
|
+
- Agrega `docs/agents/` con presentacion F0-F17, catalogo de comandos, triage labels, mapa de handoffs, stack map y dominio base.
|
|
34
|
+
- Documenta la instalacion opt-in de Obsidian, Graphify, caveman y sync de memoria en `external-tools-matrix.md`.
|
|
35
|
+
- Agrega matriz de trazabilidad por superficie y guardrails semanticos genericos.
|
|
36
|
+
|
|
37
|
+
### Phase 6 — OpenSpec specs base
|
|
38
|
+
|
|
39
|
+
- Instala specs canonicas `business-production-readiness` y `project-phases`.
|
|
40
|
+
- Deja specs donor especificas como referencia educativa no instalada en `docs/examples/openspec-specs-ejemplos/`.
|
|
41
|
+
|
|
42
|
+
### Phase 7 — Validators
|
|
43
|
+
|
|
44
|
+
- Agrega 9 validators nuevos: placeholder scripts, politica de herramientas externas, precedencia de gobierno, consistencia de skills, schema de personas, links docs, OpenSpec, Mustache y `models.yaml`.
|
|
45
|
+
- `npm run validate` ahora ejecuta 14 validators en cadena.
|
|
46
|
+
|
|
47
|
+
### Phase 8 — Doctor
|
|
48
|
+
|
|
49
|
+
- `sdlc doctor` reporta runtime Node, PowerShell y Git.
|
|
50
|
+
- Verifica agent-state base, specs canonicas, manifest de skills y `scale`.
|
|
51
|
+
- Reporta Obsidian, Graphify y mirrors como checks informativos cuando siguen opt-in.
|
|
52
|
+
|
|
53
|
+
### Phase 9-11 — E2E, community y CI/CD
|
|
54
|
+
|
|
55
|
+
- Agrega alias `sdlc init` para `sdlc install` y prueba de regresion `init-alias`.
|
|
56
|
+
- Expande README con quick start `npx`, flujo F0-F17, validators, matriz BMAD y roadmap.
|
|
57
|
+
- Agrega workflows `regression-install`, `release` y `publish` manual con provenance.
|
|
58
|
+
|
|
59
|
+
## [1.1.0] — 2026-05-18
|
|
60
|
+
|
|
61
|
+
### Fase A — Template engine
|
|
62
|
+
|
|
63
|
+
- Externaliza contenido inline a `templates/` con manifest selectivo (`templates/manifest.yaml`).
|
|
64
|
+
- Motor logicless Mustache (`interpolate()`); placeholders `{{project.name}}`, `{{project.slug}}`, `{{mode}}`, `{{stack.*}}`, `{{gitFlow.*}}`, `{{obsidian.*}}`, `{{surfaces.*}}`.
|
|
65
|
+
- Ningún template usa extensión `.mustache`; todos los archivos se interpolan al instalar.
|
|
66
|
+
|
|
67
|
+
### Fase H — AJV schema-driven config validation
|
|
68
|
+
|
|
69
|
+
- Validador de config basado en AJV; `config-schema.json` governa el contrato de entrada.
|
|
70
|
+
- `validate:config-schema` corre antes de cualquier `install/upgrade`.
|
|
71
|
+
|
|
72
|
+
### Fase E — Sistema de migraciones dinámico
|
|
73
|
+
|
|
74
|
+
- `migrations/` con migraciones versionadas; `upgrade` y `rollback` con backup automático.
|
|
75
|
+
- `doctor` detecta drift entre versión instalada y versión del framework.
|
|
76
|
+
|
|
77
|
+
### Fase B — Extraction manifest
|
|
78
|
+
|
|
79
|
+
- `docs/extraction/v1.0.0/extraction-manifest.yaml`: catálogo auditado de 75 entries (C1–C9 activos + C5–C6 diferidos + exclusiones).
|
|
80
|
+
- Bloquea walk ciego de `templates/`; solo entradas explícitas en manifest se instalan.
|
|
81
|
+
|
|
82
|
+
### Fase C — Template extraction (C1→C9)
|
|
83
|
+
|
|
84
|
+
**C1 — Governance:**
|
|
85
|
+
- `templates/AGENTS.md`, `templates/.github/AGENTS.md`, `templates/CLAUDE.md`, `templates/indice-operativo.md`.
|
|
86
|
+
|
|
87
|
+
**C2 — Agent personas (7 activos):**
|
|
88
|
+
- `planificador-opus`, `orquestador-opus`, `analista-requisitos` (legacy), `arquitecto`, `api-agent`, `web-agent`, `qa-security-review`.
|
|
89
|
+
- Sanitizados: domain-specific refs (DIAN, FacturacionDian, Samcol) eliminadas; stack refs parametrizadas con `{{stack.backend}}`/`{{stack.frontend}}`.
|
|
90
|
+
|
|
91
|
+
**C3 — Copilot instructions:**
|
|
92
|
+
- `copilot-instructions-greenfield.md` (mode: greenfield), `copilot-instructions-legacy.md` (mode: legacy).
|
|
93
|
+
- Ambos apuntan al mismo target `.github/copilot-instructions.md` según mode activo.
|
|
94
|
+
|
|
95
|
+
**C4 — Core skills (18 archivos, 19 entries en extraction-manifest):**
|
|
96
|
+
- `contexto-proyecto` (claude + github), `orquestacion-multiagente`, `enrich-us` (claude + github), `commit` (claude + github).
|
|
97
|
+
- OpenSpec skills: `propose`, `explore`, `apply`, `archive`, `verify`, `sync`, `ff`, `new`, `continue`.
|
|
98
|
+
- `documentacion-viva`, `operacion-cli-devops`.
|
|
99
|
+
|
|
100
|
+
**C7 — OpenSpec schemas:**
|
|
101
|
+
- `legacy-brownfield-sdd/`: `schema.yaml` + 5 templates (research, proposal, specs, design, tasks). Mode: legacy.
|
|
102
|
+
- `greenfield-sdd/`: `schema.yaml` + 4 templates (proposal, specs, design, tasks). Mode: greenfield. New, no donor.
|
|
103
|
+
- Profiles: `minimal.yaml`, `expanded.yaml`.
|
|
104
|
+
- Scaffolds: `openspec/specs/.gitkeep`, `openspec/changes/.gitkeep`, `openspec/specs/business-production-readiness/README.md`.
|
|
105
|
+
- Config mode-specific: `openspec/config-greenfield.yaml`, `openspec/config-legacy.yaml`.
|
|
106
|
+
|
|
107
|
+
**C9 — Docs guides:**
|
|
108
|
+
- `adopcion_openspec_sdd.md`, `business-production-readiness.md`, `memoria-persistente-multiagente.md`, `skills-multi-entorno.md`.
|
|
109
|
+
- Sanitizados: paths específicos → `{{obsidian.memoryWorkspace}}`, `{{project.slug}}`; ejemplos domain-specific → genéricos.
|
|
110
|
+
|
|
111
|
+
### Diferidos → v1.2.0
|
|
112
|
+
|
|
113
|
+
- **C5** Stack skills (11): nestjs, nextjs, react, prisma, turborepo, vitest, playwright, tailwind, vercel, accessibility, bash-defensive-patterns.
|
|
114
|
+
- **C6** Skill mirrors (3): `.agents/skills/`, `.windsurf/skills/`, `.cursorrules`.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## [1.0.0] — 2026-05-11
|
|
119
|
+
|
|
120
|
+
Lanzamiento inicial del framework reusable extraído de `FacturacionDian` (commit `f1e7acafe7`).
|
|
121
|
+
|
|
122
|
+
- CLI `sdlc install/upgrade/rollback/doctor/diff/prune-backups`.
|
|
123
|
+
- Template engine con manifest selectivo.
|
|
124
|
+
- AJV config validation.
|
|
125
|
+
- Migration system con backup automático.
|
|
126
|
+
- Extraction manifest v1.0.0 con catálogo completo de 75 entries.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Juan David Castrejon / GrupoIT
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# SistemaMultiagente_SDLC
|
|
2
|
+
|
|
3
|
+
AI-assisted SDLC framework con governance enterprise, SDD y enfoque brownfield-first.
|
|
4
|
+
|
|
5
|
+
> BMAD orquesta; SistemaMultiagente_SDLC orquesta y verifica.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
This project installs a governed multi-agent SDLC into greenfield or legacy repos. It combines reusable agent personas, OpenSpec/SDD workflows, phase gates, migrations, validators, rollback and optional persistent memory.
|
|
10
|
+
|
|
11
|
+
The operating model is SDD waterfall by slice and agile by release: each slice has explicit requirements, readiness, design, implementation, verification and archive gates, while releases can stay iterative.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
Published package flow for v1.2.0:
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
npx sistema-multiagente-sdlc init --target . --mode greenfield --project-name "My Project"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Local development flow:
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
git clone https://github.com/JuanCastrejon/SistemaMultiagente_SDLC.git
|
|
25
|
+
cd SistemaMultiagente_SDLC
|
|
26
|
+
npm install
|
|
27
|
+
npm run validate
|
|
28
|
+
npm test
|
|
29
|
+
node ./bin/sdlc.js install --target ../my-project --mode greenfield --project-name "My Project"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Legacy/brownfield:
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
node ./bin/sdlc.js install --target ../legacy-project --mode legacy --project-name "Legacy Project"
|
|
36
|
+
node ./bin/sdlc.js doctor --target ../legacy-project --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Modes
|
|
40
|
+
|
|
41
|
+
| Mode | Use when | Adds |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `greenfield` | new repo or clean product start | greenfield SDD templates and governance |
|
|
44
|
+
| `legacy` | existing repo, migration or brownfield modernization | mandatory research templates and legacy discovery gates |
|
|
45
|
+
|
|
46
|
+
## Agents
|
|
47
|
+
|
|
48
|
+
| Plane | Personas |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| Control | `planificador-opus`, `orquestador-opus` |
|
|
51
|
+
| Definition | `analista-requisitos`, `arquitecto-modular-clean` |
|
|
52
|
+
| Specialist | `api-nestjs`, `web-admin`, `mobile-sync` |
|
|
53
|
+
| Gate | `qa-security-review` |
|
|
54
|
+
|
|
55
|
+
## Phase Flow
|
|
56
|
+
|
|
57
|
+
```mermaid
|
|
58
|
+
flowchart LR
|
|
59
|
+
F0["F0 Bootstrap"] --> F1["F1 Requirements"]
|
|
60
|
+
F1 --> F2["F2 Human draft review"]
|
|
61
|
+
F2 --> F3["F3 Local issue"]
|
|
62
|
+
F3 --> F35["F3.5 Branch"]
|
|
63
|
+
F35 --> F4["F4 Readiness handoff"]
|
|
64
|
+
F4 --> F5["F5 SDD planning"]
|
|
65
|
+
F5 --> F6["F6 Planner handoff"]
|
|
66
|
+
F6 --> F7["F7 Orchestration"]
|
|
67
|
+
F7 --> F8["F8 Implementation"]
|
|
68
|
+
F8 --> F9["F9 QA"]
|
|
69
|
+
F9 --> F10["F10 Security"]
|
|
70
|
+
F10 --> F11["F11 Commit"]
|
|
71
|
+
F11 --> F12["F12 PR"]
|
|
72
|
+
F12 --> F13["F13 Human gate"]
|
|
73
|
+
F13 --> F14["F14 Merge"]
|
|
74
|
+
F14 --> F15["F15 Verify"]
|
|
75
|
+
F15 --> F16["F16 Archive"]
|
|
76
|
+
F16 --> F17["F17 Docs + trace"]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Validators
|
|
80
|
+
|
|
81
|
+
`npm run validate` runs 14 validators:
|
|
82
|
+
|
|
83
|
+
- config schema
|
|
84
|
+
- no personal paths
|
|
85
|
+
- template sanitization
|
|
86
|
+
- no inline managed content
|
|
87
|
+
- manifest integrity
|
|
88
|
+
- no placeholder scripts
|
|
89
|
+
- external tools policy
|
|
90
|
+
- governance precedence
|
|
91
|
+
- skill manifest consistency
|
|
92
|
+
- agent persona schema
|
|
93
|
+
- docs links exist
|
|
94
|
+
- OpenSpec consistency
|
|
95
|
+
- Mustache references exist
|
|
96
|
+
- models schema
|
|
97
|
+
|
|
98
|
+
## Optional External Tools
|
|
99
|
+
|
|
100
|
+
See `templates/docs/agents/external-tools-matrix.md` for setup details.
|
|
101
|
+
|
|
102
|
+
| Tool | Required | Purpose |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| OpenSpec | yes | SDD specs, changes and archive |
|
|
105
|
+
| Graphify | no | structural graph for fast orientation |
|
|
106
|
+
| Obsidian | no | local persistent memory vault |
|
|
107
|
+
| caveman | no | token-saving communication mode |
|
|
108
|
+
| gh CLI | yes for GitHub publish | issues, PRs and releases |
|
|
109
|
+
|
|
110
|
+
All external installs are opt-in. Scripts default to dry-run or local-only behavior unless `-Apply` or another explicit install flag is provided.
|
|
111
|
+
|
|
112
|
+
## BMAD Comparison
|
|
113
|
+
|
|
114
|
+
| Feature | BMAD-METHOD | SistemaMultiagente_SDLC |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| AI-driven agents | 12+ personas | 8 personas plus extensible roadmap |
|
|
117
|
+
| Workflows | agile | SDD waterfall by slice, agile by release |
|
|
118
|
+
| Scale-adaptive | yes | reserved for v1.3.0 |
|
|
119
|
+
| Party mode | yes | roundtable opt-in planned for v1.3.0 |
|
|
120
|
+
| Help CLI | bmad-help | `sdlc next` planned for v1.3.0 |
|
|
121
|
+
| Modules/packs | yes | packs marketplace planned for v2.0.0 |
|
|
122
|
+
| Governance validators | not core | 14 validators |
|
|
123
|
+
| OpenSpec/SDD | not core | integrated |
|
|
124
|
+
| Readiness L1/L2/L3 | not core | integrated |
|
|
125
|
+
| Multi-agent lock | not core | TTL platform-context lock |
|
|
126
|
+
| Brownfield-first | no | yes |
|
|
127
|
+
| Migration system | not core | backup and rollback |
|
|
128
|
+
| Sanitization validators | not core | no-personal-paths and template-sanitization |
|
|
129
|
+
|
|
130
|
+
## Roadmap
|
|
131
|
+
|
|
132
|
+
v1.3.0:
|
|
133
|
+
|
|
134
|
+
- bash parity for critical scripts
|
|
135
|
+
- `sdlc next`
|
|
136
|
+
- adaptive scale: bug, feature, epic, platform
|
|
137
|
+
- calibration extensions
|
|
138
|
+
- roundtable opt-in
|
|
139
|
+
- docs site
|
|
140
|
+
|
|
141
|
+
v2.0.0:
|
|
142
|
+
|
|
143
|
+
- extensible packs
|
|
144
|
+
- plugin API
|
|
145
|
+
- marketplace registry
|
|
146
|
+
- English i18n
|
|
147
|
+
- interactive contextual help
|
|
148
|
+
|
|
149
|
+
## Contributing
|
|
150
|
+
|
|
151
|
+
Read `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` and `SECURITY.md`.
|
|
152
|
+
|
|
153
|
+
## License
|
|
154
|
+
|
|
155
|
+
MIT.
|
package/bin/sdlc.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Migration 1.0.1
|
|
2
|
+
|
|
3
|
+
Migracion de prueba para validar `upgrade`, backup, manifest integrity y rollback.
|
|
4
|
+
|
|
5
|
+
## Efecto
|
|
6
|
+
|
|
7
|
+
Agrega `.sdlc/migrations/1.0.1-applied.txt` y actualiza `frameworkVersion` en `.sdlc/config.json`.
|
|
8
|
+
|
|
9
|
+
## Convencion de migraciones
|
|
10
|
+
|
|
11
|
+
Cada directorio `migrations/<version>/` contiene:
|
|
12
|
+
- `README.md` — descripcion del cambio, precondiciones y notas de rollback.
|
|
13
|
+
- El estado aplicado se registra en `.sdlc/migrations/<version>-applied.txt` dentro del repo consumidor.
|
|
14
|
+
- Las migraciones deben ser idempotentes: re-aplicar no rompe nada.
|
|
15
|
+
|
|
16
|
+
## Trigger
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
sdlc upgrade --target <repo> --to-version 1.0.1
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Rollback
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
sdlc rollback --target <repo> --to <backup-id>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
El backup-id se devuelve en la respuesta JSON del comando `upgrade`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// v1.1.0 published the governed template baseline.
|
|
2
|
+
// It is represented as a migration target so upgrades can traverse 1.0.0 -> 1.2.0
|
|
3
|
+
// and 1.1.0 -> 1.2.0 consistently.
|
|
4
|
+
export function up() {
|
|
5
|
+
return {
|
|
6
|
+
".sdlc/migrations/1.1.0-applied.txt": "Migration 1.1.0 applied by SistemaMultiagente_SDLC.\ngenerated-by-sdlc\n"
|
|
7
|
+
};
|
|
8
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function up(files = {}) {
|
|
2
|
+
const extra = {
|
|
3
|
+
".sdlc/migrations/1.2.0-applied.txt": "Migration 1.2.0 applied by SistemaMultiagente_SDLC.\ngenerated-by-sdlc\n"
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
const configPath = ".sdlc/config.json";
|
|
7
|
+
if (typeof files[configPath] === "string") {
|
|
8
|
+
const config = JSON.parse(files[configPath]);
|
|
9
|
+
if (!config.scale) {
|
|
10
|
+
config.scale = "feature";
|
|
11
|
+
}
|
|
12
|
+
config.frameworkVersion = "1.2.0";
|
|
13
|
+
extra[configPath] = `${JSON.stringify(config, null, 2)}\n`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return extra;
|
|
17
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sistema-multiagente-sdlc",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Framework reusable para instalar un SDLC multiagente gobernado en repos greenfield o legacy.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sdlc": "./bin/sdlc.js"
|
|
8
|
+
},
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin/",
|
|
14
|
+
"src/",
|
|
15
|
+
"schemas/",
|
|
16
|
+
"templates/",
|
|
17
|
+
"profiles/",
|
|
18
|
+
"migrations/",
|
|
19
|
+
"scripts/",
|
|
20
|
+
"README.md",
|
|
21
|
+
"LICENSE",
|
|
22
|
+
"CHANGELOG.md"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"ai",
|
|
26
|
+
"sdlc",
|
|
27
|
+
"multiagent",
|
|
28
|
+
"claude-code",
|
|
29
|
+
"openspec",
|
|
30
|
+
"governance",
|
|
31
|
+
"template",
|
|
32
|
+
"brownfield",
|
|
33
|
+
"sdd"
|
|
34
|
+
],
|
|
35
|
+
"repository": "github:JuanCastrejon/SistemaMultiagente_SDLC",
|
|
36
|
+
"bugs": "https://github.com/JuanCastrejon/SistemaMultiagente_SDLC/issues",
|
|
37
|
+
"homepage": "https://github.com/JuanCastrejon/SistemaMultiagente_SDLC#readme",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"sdlc": "node ./bin/sdlc.js",
|
|
40
|
+
"test": "node ./tests/run-regression.mjs",
|
|
41
|
+
"validate": "npm run validate:config-schema && npm run validate:no-personal-paths && npm run validate:template-sanitization && npm run validate:no-inline-managed-content && npm run validate:manifest-integrity && npm run validate:no-placeholder-scripts && npm run validate:external-tools-policy && npm run validate:governance-precedence && npm run validate:skill-manifest-consistency && npm run validate:agent-persona-schema && npm run validate:docs-links-exist && npm run validate:openspec-consistency && npm run validate:mustache-references-exist && npm run validate:models-schema",
|
|
42
|
+
"validate:config-schema": "node ./scripts/validate-config-schema.mjs",
|
|
43
|
+
"validate:no-personal-paths": "node ./scripts/validate-no-personal-paths.mjs",
|
|
44
|
+
"validate:template-sanitization": "node ./scripts/validate-template-sanitization.mjs",
|
|
45
|
+
"validate:no-inline-managed-content": "node ./scripts/validate-no-inline-managed-content.mjs",
|
|
46
|
+
"validate:manifest-integrity": "node ./scripts/validate-manifest-integrity.mjs --allow-empty",
|
|
47
|
+
"validate:no-placeholder-scripts": "node ./scripts/validate-no-placeholder-scripts.mjs",
|
|
48
|
+
"validate:external-tools-policy": "node ./scripts/validate-external-tools-policy.mjs",
|
|
49
|
+
"validate:governance-precedence": "node ./scripts/validate-governance-precedence.mjs",
|
|
50
|
+
"validate:skill-manifest-consistency": "node ./scripts/validate-skill-manifest-consistency.mjs",
|
|
51
|
+
"validate:agent-persona-schema": "node ./scripts/validate-agent-persona-schema.mjs",
|
|
52
|
+
"validate:docs-links-exist": "node ./scripts/validate-docs-links-exist.mjs",
|
|
53
|
+
"validate:openspec-consistency": "node ./scripts/validate-openspec-consistency.mjs",
|
|
54
|
+
"validate:mustache-references-exist": "node ./scripts/validate-mustache-references-exist.mjs",
|
|
55
|
+
"validate:models-schema": "node ./scripts/validate-models-schema.mjs"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18"
|
|
59
|
+
},
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"ajv": "^8.20.0"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
schema: greenfield-sdd
|
|
2
|
+
context: |
|
|
3
|
+
Proyecto nuevo gobernado por SistemaMultiagente_SDLC.
|
|
4
|
+
Investigar docs, backlog y prior art antes de proponer capacidades.
|
|
5
|
+
rules:
|
|
6
|
+
research:
|
|
7
|
+
- Declarar objetivo, usuarios, KPI principal, riesgos y NFRs minimos.
|
|
8
|
+
proposal:
|
|
9
|
+
- Mantener cambios pequenos y trazables.
|
|
10
|
+
specs:
|
|
11
|
+
- Escribir comportamiento observable con Given/When/Then.
|
|
12
|
+
design:
|
|
13
|
+
- Registrar trade-offs y contratos entre superficies.
|
|
14
|
+
tasks:
|
|
15
|
+
- Dividir en slices verificables.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
schema: legacy-brownfield-sdd
|
|
2
|
+
context: |
|
|
3
|
+
Proyecto legacy/brownfield gobernado por SistemaMultiagente_SDLC.
|
|
4
|
+
La investigacion debe declarar fuente primaria, secundaria, evidencia y drift.
|
|
5
|
+
rules:
|
|
6
|
+
research:
|
|
7
|
+
- Declarar fuente primaria, secundaria, evidencia revisada y vacios.
|
|
8
|
+
- Documentar AS-IS y TO-BE cuando cambie un flujo existente.
|
|
9
|
+
proposal:
|
|
10
|
+
- Referenciar evidencia legacy y exclusiones de alcance.
|
|
11
|
+
specs:
|
|
12
|
+
- No inventar comportamiento no confirmado.
|
|
13
|
+
design:
|
|
14
|
+
- Explicar transicion, rollback, paridad y riesgos.
|
|
15
|
+
tasks:
|
|
16
|
+
- Incluir validaciones de migracion y readiness.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://example.invalid/sistema-multiagente-sdlc/sdlc.config.schema.json",
|
|
4
|
+
"title": "SistemaMultiagente_SDLC config",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schemaVersion", "frameworkVersion", "project", "mode", "surfaces", "gitFlow", "openspec"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": { "type": "integer", "const": 1 },
|
|
9
|
+
"frameworkVersion": { "type": "string" },
|
|
10
|
+
"project": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"required": ["name", "slug"],
|
|
13
|
+
"properties": {
|
|
14
|
+
"name": { "type": "string", "minLength": 1 },
|
|
15
|
+
"slug": { "type": "string", "minLength": 1 },
|
|
16
|
+
"organization": { "type": "string" }
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"mode": { "type": "string", "enum": ["greenfield", "legacy"] },
|
|
20
|
+
"scale": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"enum": ["bug", "feature", "epic", "platform"],
|
|
23
|
+
"default": "feature",
|
|
24
|
+
"description": "Reserved for v1.3.0 adaptive scale. Not consumed in v1.2.0."
|
|
25
|
+
},
|
|
26
|
+
"stack": {
|
|
27
|
+
"type": "object",
|
|
28
|
+
"properties": {
|
|
29
|
+
"backend": { "type": "string" },
|
|
30
|
+
"frontend": { "type": "string" },
|
|
31
|
+
"database": { "type": "string" },
|
|
32
|
+
"designSystem": { "type": "string" },
|
|
33
|
+
"mobile": { "type": "string" }
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"surfaces": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"items": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"required": ["id", "path", "owner"],
|
|
41
|
+
"properties": {
|
|
42
|
+
"id": { "type": "string" },
|
|
43
|
+
"path": { "type": "string" },
|
|
44
|
+
"owner": { "type": "string" }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"gitFlow": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": ["integrationBranch", "stableBranch"],
|
|
51
|
+
"properties": {
|
|
52
|
+
"integrationBranch": { "type": "string" },
|
|
53
|
+
"stableBranch": { "type": "string" },
|
|
54
|
+
"branchPrefixes": { "type": "array", "items": { "type": "string" } }
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"openspec": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"required": ["profile"],
|
|
60
|
+
"properties": {
|
|
61
|
+
"profile": { "type": "string", "enum": ["minimal", "expanded", "custom"] },
|
|
62
|
+
"customProfile": {
|
|
63
|
+
"anyOf": [
|
|
64
|
+
{ "type": "null" },
|
|
65
|
+
{
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": ["name", "workflows"],
|
|
68
|
+
"properties": {
|
|
69
|
+
"name": { "type": "string", "minLength": 1 },
|
|
70
|
+
"workflows": { "type": "array", "minItems": 1, "items": { "type": "string" } }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"if": {
|
|
79
|
+
"properties": {
|
|
80
|
+
"openspec": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"properties": { "profile": { "const": "custom" } },
|
|
83
|
+
"required": ["profile"]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"required": ["openspec"]
|
|
87
|
+
},
|
|
88
|
+
"then": {
|
|
89
|
+
"properties": {
|
|
90
|
+
"openspec": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"required": ["customProfile"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"customProfile": {
|
|
95
|
+
"type": "object",
|
|
96
|
+
"required": ["name", "workflows"],
|
|
97
|
+
"properties": {
|
|
98
|
+
"name": { "type": "string", "minLength": 1 },
|
|
99
|
+
"workflows": { "type": "array", "minItems": 1, "items": { "type": "string" } }
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
param(
|
|
2
|
+
[Parameter(Mandatory = $true)]
|
|
3
|
+
[string]$Target,
|
|
4
|
+
[ValidateSet('greenfield', 'legacy')]
|
|
5
|
+
[string]$Mode = 'greenfield',
|
|
6
|
+
[string]$ProjectName = '',
|
|
7
|
+
[string]$ProjectSlug = '',
|
|
8
|
+
[switch]$DryRun,
|
|
9
|
+
[switch]$Json
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
$ErrorActionPreference = 'Stop'
|
|
13
|
+
$repoRoot = Split-Path -Path $PSScriptRoot -Parent
|
|
14
|
+
$argsList = @((Join-Path $repoRoot 'bin\sdlc.js'), 'install', '--target', $Target, '--mode', $Mode)
|
|
15
|
+
|
|
16
|
+
if ($ProjectName) { $argsList += @('--project-name', $ProjectName) }
|
|
17
|
+
if ($ProjectSlug) { $argsList += @('--project-slug', $ProjectSlug) }
|
|
18
|
+
if ($DryRun) { $argsList += '--dry-run' }
|
|
19
|
+
if ($Json) { $argsList += '--json' }
|
|
20
|
+
|
|
21
|
+
node @argsList
|
|
22
|
+
exit $LASTEXITCODE
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
6
|
+
|
|
7
|
+
TARGET=""
|
|
8
|
+
MODE="greenfield"
|
|
9
|
+
PROJECT_NAME=""
|
|
10
|
+
PROJECT_SLUG=""
|
|
11
|
+
DRY_RUN=""
|
|
12
|
+
JSON_FLAG=""
|
|
13
|
+
|
|
14
|
+
while [[ $# -gt 0 ]]; do
|
|
15
|
+
case "$1" in
|
|
16
|
+
--target) TARGET="$2"; shift 2 ;;
|
|
17
|
+
--mode) MODE="$2"; shift 2 ;;
|
|
18
|
+
--project-name) PROJECT_NAME="$2"; shift 2 ;;
|
|
19
|
+
--project-slug) PROJECT_SLUG="$2"; shift 2 ;;
|
|
20
|
+
--dry-run) DRY_RUN="--dry-run"; shift ;;
|
|
21
|
+
--json) JSON_FLAG="--json"; shift ;;
|
|
22
|
+
*) echo "Opcion desconocida: $1" >&2; exit 1 ;;
|
|
23
|
+
esac
|
|
24
|
+
done
|
|
25
|
+
|
|
26
|
+
ARGS=("$REPO_ROOT/bin/sdlc.js" install --mode "$MODE")
|
|
27
|
+
[[ -n "$TARGET" ]] && ARGS+=(--target "$TARGET")
|
|
28
|
+
[[ -n "$PROJECT_NAME" ]] && ARGS+=(--project-name "$PROJECT_NAME")
|
|
29
|
+
[[ -n "$PROJECT_SLUG" ]] && ARGS+=(--project-slug "$PROJECT_SLUG")
|
|
30
|
+
[[ -n "$DRY_RUN" ]] && ARGS+=("$DRY_RUN")
|
|
31
|
+
[[ -n "$JSON_FLAG" ]] && ARGS+=("$JSON_FLAG")
|
|
32
|
+
|
|
33
|
+
node "${ARGS[@]}"
|