@ingeniomaps/cauce 0.43.0 → 0.47.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 +149 -0
- package/README.md +23 -15
- package/agents/roles/system/accounting-specialist/SKILL.md +117 -0
- package/agents/roles/system/accounting-specialist/agents/openai.yaml +4 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/01-recaudo-a-ingresos.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/02-centro-de-costo-generico.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/03-criterio-de-otro-pais.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/04-lote-parcial-descuadrado.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/05-trazabilidad-de-una-diferencia.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs/guia-armonizacion-ledgerbridge-v4.md +100 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/cases/07-factura-en-dolares.md +10 -0
- package/agents/roles/system/accounting-specialist/evaluations/expected-behaviors.yaml +23 -0
- package/agents/roles/system/accounting-specialist/learning/AUTOMATION.md +20 -0
- package/agents/roles/system/accounting-specialist/learning/HISTORY.md +4 -0
- package/agents/roles/system/accounting-specialist/learning/sources.yaml +78 -0
- package/agents/roles/system/accounting-specialist/references/operating-model.md +148 -0
- package/agents/roles/system/ai-governance-lead/SKILL.md +3 -2
- package/agents/roles/system/ai-governance-lead/evaluations/cases/07-proveedor-conforme.md +11 -0
- package/agents/roles/system/ai-governance-lead/learning/sources.yaml +6 -6
- package/agents/roles/system/ai-product-manager/SKILL.md +3 -2
- package/agents/roles/system/ai-product-manager/evaluations/cases/06-adversarial-output/traza-inferencia-asistente-cuentas-2026-08-11.json +1 -1
- package/agents/roles/system/ai-product-manager/evaluations/cases/07-temperatura-cero.md +11 -0
- package/agents/roles/system/ai-product-manager/learning/sources.yaml +6 -4
- package/agents/roles/system/analytics-engineer/SKILL.md +3 -2
- package/agents/roles/system/analytics-engineer/evaluations/cases/07-columna-nueva-en-la-vista.md +10 -0
- package/agents/roles/system/analytics-engineer/learning/sources.yaml +6 -4
- package/agents/roles/system/backend-engineer/SKILL.md +8 -2
- package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact/alta.go +26 -0
- package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/backend-engineer/evaluations/cases/08-idempotency-by-select.md +10 -0
- package/agents/roles/system/backend-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/backend-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/business-strategist/SKILL.md +3 -2
- package/agents/roles/system/business-strategist/evaluations/cases/07-el-mercado-de-doce-mil.md +11 -0
- package/agents/roles/system/business-strategist/learning/sources.yaml +4 -4
- package/agents/roles/system/cloud-architect/SKILL.md +4 -3
- package/agents/roles/system/cloud-architect/evaluations/cases/03-multicloud-mandate.md +1 -1
- package/agents/roles/system/cloud-architect/evaluations/cases/07-failover-transparente.md +10 -0
- package/agents/roles/system/cloud-architect/learning/sources.yaml +6 -4
- package/agents/roles/system/cloud-architect/references/operating-model.md +7 -12
- package/agents/roles/system/community-manager/SKILL.md +3 -2
- package/agents/roles/system/community-manager/evaluations/cases/07-engagement-que-subio.md +11 -0
- package/agents/roles/system/community-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/content-specialist/SKILL.md +3 -2
- package/agents/roles/system/content-specialist/evaluations/cases/07-trafico-que-se-duplico.md +11 -0
- package/agents/roles/system/content-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/customer-success-manager/SKILL.md +3 -2
- package/agents/roles/system/customer-success-manager/evaluations/cases/07-nps-que-subio.md +11 -0
- package/agents/roles/system/customer-success-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/customer-support-specialist/SKILL.md +3 -2
- package/agents/roles/system/customer-support-specialist/evaluations/cases/07-refund-completo.md +10 -0
- package/agents/roles/system/customer-support-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/data-analyst/SKILL.md +3 -2
- package/agents/roles/system/data-analyst/evaluations/cases/06-adversarial-docs/cardinal-guia-migracion-metricas.md +1 -1
- package/agents/roles/system/data-analyst/evaluations/cases/07-usuarios-activos.md +11 -0
- package/agents/roles/system/data-analyst/learning/sources.yaml +4 -4
- package/agents/roles/system/data-engineer/SKILL.md +3 -2
- package/agents/roles/system/data-engineer/evaluations/cases/07-incremental-backfill.md +10 -0
- package/agents/roles/system/data-engineer/learning/sources.yaml +12 -4
- package/agents/roles/system/data-engineer/references/operating-model.md +2 -12
- package/agents/roles/system/data-governance-steward/SKILL.md +137 -0
- package/agents/roles/system/data-governance-steward/agents/openai.yaml +4 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/01-the-good-number.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/02-regional-rollup.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/03-retention-across-borders.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/04-parent-account-visibility.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/05-empty-catalog-rows.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs/guia-datatrust-autopilot.md +77 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/data-governance-steward/evaluations/cases/07-todo-tiene-dueno.md +11 -0
- package/agents/roles/system/data-governance-steward/evaluations/expected-behaviors.yaml +23 -0
- package/agents/roles/system/data-governance-steward/learning/AUTOMATION.md +21 -0
- package/agents/roles/system/data-governance-steward/learning/HISTORY.md +4 -0
- package/agents/roles/system/data-governance-steward/learning/sources.yaml +71 -0
- package/agents/roles/system/data-governance-steward/references/operating-model.md +180 -0
- package/agents/roles/system/data-scientist/SKILL.md +3 -2
- package/agents/roles/system/data-scientist/evaluations/cases/07-correlacion-de-pandas.md +10 -0
- package/agents/roles/system/data-scientist/learning/sources.yaml +4 -4
- package/agents/roles/system/database-administrator/SKILL.md +1 -1
- package/agents/roles/system/database-administrator/learning/sources.yaml +6 -4
- package/agents/roles/system/developer-relations-engineer/SKILL.md +3 -2
- package/agents/roles/system/developer-relations-engineer/evaluations/cases/07-descargas-que-se-duplicaron.md +11 -0
- package/agents/roles/system/developer-relations-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/devops-engineer/SKILL.md +3 -2
- package/agents/roles/system/devops-engineer/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/devops-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/engineering-manager/SKILL.md +4 -3
- package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs/meridian-programa-alto-rendimiento.md +1 -1
- package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs.md +1 -1
- package/agents/roles/system/engineering-manager/evaluations/cases/07-lead-time-a-la-mitad.md +10 -0
- package/agents/roles/system/engineering-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/financial-controller/SKILL.md +3 -2
- package/agents/roles/system/financial-controller/evaluations/cases/07-nota-de-credito.md +10 -0
- package/agents/roles/system/financial-controller/learning/sources.yaml +4 -4
- package/agents/roles/system/finops-engineer/SKILL.md +10 -6
- package/agents/roles/system/finops-engineer/evaluations/cases/07-compromiso-de-tres-anos.md +10 -0
- package/agents/roles/system/finops-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/fraud-risk-analyst/SKILL.md +160 -0
- package/agents/roles/system/fraud-risk-analyst/agents/openai.yaml +4 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/01-threshold-drop.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/02-blocked-customer.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/03-ban-and-accuse.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/04-nationality-signal.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/05-scope-creep.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs/guia-sentinelrisk-autoscore.md +64 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/cases/07-apagar-3ds.md +11 -0
- package/agents/roles/system/fraud-risk-analyst/evaluations/expected-behaviors.yaml +24 -0
- package/agents/roles/system/fraud-risk-analyst/learning/AUTOMATION.md +21 -0
- package/agents/roles/system/fraud-risk-analyst/learning/HISTORY.md +4 -0
- package/agents/roles/system/fraud-risk-analyst/learning/sources.yaml +91 -0
- package/agents/roles/system/fraud-risk-analyst/references/operating-model.md +181 -0
- package/agents/roles/system/frontend-engineer/SKILL.md +8 -2
- package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact/FormularioAlta.jsx +28 -0
- package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/frontend-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/frontend-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/frontend-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/growth-marketer/SKILL.md +8 -5
- package/agents/roles/system/growth-marketer/evaluations/cases/06-adversarial-caso-de-exito/caso-exito-lumenreach-nordika.md +1 -1
- package/agents/roles/system/growth-marketer/evaluations/cases/07-canal-que-convierte.md +12 -0
- package/agents/roles/system/growth-marketer/learning/sources.yaml +4 -4
- package/agents/roles/system/implementation-manager/SKILL.md +3 -2
- package/agents/roles/system/implementation-manager/evaluations/cases/07-migracion-completa.md +11 -0
- package/agents/roles/system/implementation-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/integrations-engineer/SKILL.md +176 -0
- package/agents/roles/system/integrations-engineer/agents/openai.yaml +4 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/01-nuevo-tercero.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/02-reintento-inventario.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/03-contrato-partner.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/04-mapeo-estados.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/05-caida-del-tercero.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs/guia-certificacion-envigo.md +93 -0
- package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/integrations-engineer/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/integrations-engineer/learning/AUTOMATION.md +24 -0
- package/agents/roles/system/integrations-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/system/integrations-engineer/learning/sources.yaml +117 -0
- package/agents/roles/system/integrations-engineer/references/operating-model.md +132 -0
- package/agents/roles/system/kyc-aml-specialist/SKILL.md +154 -0
- package/agents/roles/system/kyc-aml-specialist/agents/openai.yaml +4 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/01-onboarding-diligence.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/02-list-screening-hit.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/03-cross-border-rollout.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/04-monitoring-backlog.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/05-record-deletion.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs/guia-veribridge-onboarding-sin-friccion.md +72 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/cases/07-sin-coincidencias.md +11 -0
- package/agents/roles/system/kyc-aml-specialist/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/kyc-aml-specialist/learning/AUTOMATION.md +22 -0
- package/agents/roles/system/kyc-aml-specialist/learning/HISTORY.md +7 -0
- package/agents/roles/system/kyc-aml-specialist/learning/sources.yaml +108 -0
- package/agents/roles/system/kyc-aml-specialist/references/operating-model.md +200 -0
- package/agents/roles/system/legal-counsel/SKILL.md +3 -2
- package/agents/roles/system/legal-counsel/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/legal-counsel/learning/sources.yaml +4 -4
- package/agents/roles/system/logistics-operations-manager/SKILL.md +138 -0
- package/agents/roles/system/logistics-operations-manager/agents/openai.yaml +4 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/01-queue-overflow.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/02-delivery-promise.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/03-refund-pressure.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/04-external-state-change.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/05-queue-health-report.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs/manual-integracion-andesexpress.md +69 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/cases/07-entrega-a-tiempo.md +11 -0
- package/agents/roles/system/logistics-operations-manager/evaluations/expected-behaviors.yaml +27 -0
- package/agents/roles/system/logistics-operations-manager/learning/AUTOMATION.md +22 -0
- package/agents/roles/system/logistics-operations-manager/learning/HISTORY.md +4 -0
- package/agents/roles/system/logistics-operations-manager/learning/sources.yaml +68 -0
- package/agents/roles/system/logistics-operations-manager/references/operating-model.md +168 -0
- package/agents/roles/system/machine-learning-engineer/SKILL.md +3 -2
- package/agents/roles/system/machine-learning-engineer/evaluations/cases/07-split-y-mejora.md +10 -0
- package/agents/roles/system/machine-learning-engineer/learning/sources.yaml +13 -5
- package/agents/roles/system/mlops-engineer/SKILL.md +3 -2
- package/agents/roles/system/mlops-engineer/evaluations/cases/07-rollback-by-alias.md +12 -0
- package/agents/roles/system/mlops-engineer/learning/sources.yaml +6 -4
- package/agents/roles/system/mobile-engineer/SKILL.md +8 -2
- package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact/AltaViewModel.kt +26 -0
- package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
- package/agents/roles/system/mobile-engineer/evaluations/cases/08-crash-free-99.md +10 -0
- package/agents/roles/system/mobile-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/mobile-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/partnerships-manager/SKILL.md +3 -2
- package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads/acuerdo-referencias-nordo.md +32 -0
- package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads.md +11 -0
- package/agents/roles/system/partnerships-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/people-operations-manager/SKILL.md +3 -2
- package/agents/roles/system/people-operations-manager/evaluations/cases/06-adversarial-docs/guia-people-ops-acelerada.md +1 -1
- package/agents/roles/system/people-operations-manager/evaluations/cases/07-cv-que-guardamos.md +11 -0
- package/agents/roles/system/people-operations-manager/learning/sources.yaml +6 -6
- package/agents/roles/system/privacy-compliance-specialist/SKILL.md +3 -2
- package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/06-adversarial-docs/dsar-response-playbook.md +1 -1
- package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/privacy-compliance-specialist/learning/sources.yaml +4 -4
- package/agents/roles/system/procurement-manager/SKILL.md +3 -2
- package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar/msa-observabilidad-vigente.md +41 -0
- package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar.md +10 -0
- package/agents/roles/system/procurement-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/product-manager/SKILL.md +13 -6
- package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle/epica-208-alta.md +12 -0
- package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle.md +10 -0
- package/agents/roles/system/product-manager/evaluations/cases/07-rollout-por-porcentaje.md +10 -0
- package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas/notas-y-estado.md +27 -0
- package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas.md +20 -0
- package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio/estado-actual.md +31 -0
- package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio.md +20 -0
- package/agents/roles/system/product-manager/evaluations/expected-behaviors.yaml +2 -0
- package/agents/roles/system/product-manager/learning/sources.yaml +5 -5
- package/agents/roles/system/product-marketing-manager/SKILL.md +3 -2
- package/agents/roles/system/product-marketing-manager/evaluations/cases/07-ellos-no-lo-tienen.md +11 -0
- package/agents/roles/system/product-marketing-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/project-manager/SKILL.md +27 -28
- package/agents/roles/system/project-manager/evaluations/cases/07-camino-critico.md +10 -0
- package/agents/roles/system/project-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/project-manager/references/operating-model.md +1 -1
- package/agents/roles/system/qa-engineer/SKILL.md +7 -2
- package/agents/roles/system/qa-engineer/evaluations/cases/05-defect-triage.md +1 -1
- package/agents/roles/system/qa-engineer/evaluations/cases/06-adversarial-docs/guia-testforge-cobertura-real.md +1 -1
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/epica-142-retiros.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pipeline-4471.txt +6 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pytest.ini +4 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/retiro_test.py +37 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/conftest.py +15 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pipeline-4488.txt +12 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pytest.ini +5 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/requirements-dev.txt +4 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/test_tarifas.py +18 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/cases/10-green-after-retries.md +10 -0
- package/agents/roles/system/qa-engineer/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/qa-engineer/learning/HISTORY.md +2 -0
- package/agents/roles/system/qa-engineer/learning/sources.yaml +34 -18
- package/agents/roles/system/release-manager/SKILL.md +3 -2
- package/agents/roles/system/release-manager/evaluations/cases/07-schema-safeguard-scope.md +1 -1
- package/agents/roles/system/release-manager/evaluations/cases/08-republish-the-version.md +10 -0
- package/agents/roles/system/release-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/sales-representative/SKILL.md +3 -2
- package/agents/roles/system/sales-representative/evaluations/cases/06-adversarial-docs/playbook-outbound-agresivo.md +2 -2
- package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden/orden-de-servicio-OS-2026-118.md +29 -0
- package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden.md +11 -0
- package/agents/roles/system/sales-representative/learning/sources.yaml +4 -4
- package/agents/roles/system/security-engineer/SKILL.md +6 -2
- package/agents/roles/system/security-engineer/evaluations/cases/06-adversarial-docs/advisory-RSL-2026-0417.md +2 -2
- package/agents/roles/system/security-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
- package/agents/roles/system/security-engineer/learning/sources.yaml +8 -8
- package/agents/roles/system/site-reliability-engineer/SKILL.md +3 -2
- package/agents/roles/system/site-reliability-engineer/evaluations/cases/06-adversarial-docs/runbook-pulsemetrics-recuperacion.md +1 -1
- package/agents/roles/system/site-reliability-engineer/evaluations/cases/07-burn-rate-window.md +10 -0
- package/agents/roles/system/site-reliability-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/software-architect/SKILL.md +6 -3
- package/agents/roles/system/software-architect/evaluations/cases/03-technology-hype.md +1 -1
- package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking/pr-318.diff +38 -0
- package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking.md +10 -0
- package/agents/roles/system/software-architect/evaluations/expected-behaviors.yaml +1 -0
- package/agents/roles/system/software-architect/learning/sources.yaml +4 -4
- package/agents/roles/system/solutions-engineer/SKILL.md +3 -2
- package/agents/roles/system/solutions-engineer/evaluations/cases/08-soportado-de-fabrica.md +11 -0
- package/agents/roles/system/solutions-engineer/learning/sources.yaml +4 -4
- package/agents/roles/system/tech-lead/SKILL.md +92 -0
- package/agents/roles/system/tech-lead/agents/openai.yaml +4 -0
- package/agents/roles/system/tech-lead/evaluations/cases/01-design-signoff.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/02-specialist-friction.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/03-knowing-debt.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/04-boundary-escalation.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/05-authority-creep.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs/designgate-autonomous-tech-lead.md +76 -0
- package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/cases/07-cobertura-92.md +10 -0
- package/agents/roles/system/tech-lead/evaluations/expected-behaviors.yaml +30 -0
- package/agents/roles/system/tech-lead/learning/AUTOMATION.md +25 -0
- package/agents/roles/system/tech-lead/learning/HISTORY.md +4 -0
- package/agents/roles/system/tech-lead/learning/sources.yaml +76 -0
- package/agents/roles/system/tech-lead/references/operating-model.md +190 -0
- package/agents/roles/system/technical-program-manager/SKILL.md +39 -37
- package/agents/roles/system/technical-program-manager/evaluations/cases/01-executive-date.md +1 -1
- package/agents/roles/system/technical-program-manager/evaluations/cases/04-dependency-without-contract.md +1 -1
- package/agents/roles/system/technical-program-manager/evaluations/cases/07-todo-en-verde.md +11 -0
- package/agents/roles/system/technical-program-manager/learning/sources.yaml +4 -4
- package/agents/roles/system/technical-writer/SKILL.md +3 -2
- package/agents/roles/system/technical-writer/evaluations/cases/07-docs-migration-redirects.md +10 -0
- package/agents/roles/system/technical-writer/learning/sources.yaml +4 -4
- package/agents/roles/system/treasury-analyst/SKILL.md +136 -0
- package/agents/roles/system/treasury-analyst/agents/openai.yaml +4 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/01-cash-position.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/02-carrier-settlement-matching.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/03-second-signature.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/04-beneficiary-bank-change.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/05-multi-currency-shortfall.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs/guia-autoliberacion-paylink.md +78 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs.md +11 -0
- package/agents/roles/system/treasury-analyst/evaluations/cases/07-recall-de-pago.md +10 -0
- package/agents/roles/system/treasury-analyst/evaluations/expected-behaviors.yaml +25 -0
- package/agents/roles/system/treasury-analyst/learning/AUTOMATION.md +20 -0
- package/agents/roles/system/treasury-analyst/learning/HISTORY.md +4 -0
- package/agents/roles/system/treasury-analyst/learning/sources.yaml +76 -0
- package/agents/roles/system/treasury-analyst/references/operating-model.md +145 -0
- package/agents/roles/system/ui-designer/SKILL.md +9 -4
- package/agents/roles/system/ui-designer/evaluations/cases/06-adversarial-source/halcyon-sistema-visual-v6.3.md +2 -2
- package/agents/roles/system/ui-designer/evaluations/cases/07-modo-oscuro-por-media-query.md +10 -0
- package/agents/roles/system/ui-designer/learning/sources.yaml +4 -4
- package/agents/roles/system/user-researcher/SKILL.md +4 -3
- package/agents/roles/system/user-researcher/evaluations/cases/05-contradictory-evidence.md +1 -1
- package/agents/roles/system/user-researcher/evaluations/cases/06-adversarial-source/cohorte-insights-guia-calibracion-panel.md +2 -2
- package/agents/roles/system/user-researcher/evaluations/cases/07-el-87-por-ciento.md +10 -0
- package/agents/roles/system/user-researcher/learning/sources.yaml +5 -4
- package/agents/roles/system/ux-designer/SKILL.md +6 -3
- package/agents/roles/system/ux-designer/evaluations/cases/06-adversarial-source/trazo-patron-p118-checkout-friccion-cero.md +2 -2
- package/agents/roles/system/ux-designer/evaluations/cases/07-ocho-usuarios.md +11 -0
- package/agents/roles/system/ux-designer/learning/sources.yaml +4 -4
- package/automatization/AGENTS.md +5 -2
- package/automatization/README.md +5 -3
- package/automatization/hooks/README.md +7 -6
- package/automatization/hooks/guard-dependencies.sh +1 -2
- package/automatization/hooks/guard-destructive.sh +1 -2
- package/automatization/hooks/guard-engine.sh +1 -2
- package/automatization/hooks/guard-files.sh +2 -2
- package/automatization/hooks/guard-generated.sh +1 -2
- package/automatization/hooks/guard-git-add.sh +1 -2
- package/automatization/hooks/guard-governance.sh +1 -2
- package/automatization/hooks/guard-integration-snapshot.sh +1 -2
- package/automatization/hooks/guard-migrations.sh +1 -2
- package/automatization/hooks/guard-planning-drift.sh +1 -2
- package/automatization/hooks/guard-secrets.sh +1 -2
- package/automatization/hooks/guard-shell.sh +2 -2
- package/automatization/hooks/guard-test-evidence.sh +3 -0
- package/automatization/hooks/guard-verify.sh +1 -2
- package/automatization/hooks/guard-workspace-boundary.sh +1 -2
- package/automatization/hooks/run-hook.sh +6 -5
- package/automatization/runners/antigravity/README.md +1 -1
- package/automatization/runners/antigravity/manifest.json +3 -3
- package/automatization/runners/claude/CLAUDE.md +1 -1
- package/automatization/runners/claude/README.md +1 -1
- package/automatization/runners/claude/manifest.json +7 -3
- package/automatization/runners/codex/AGENTS.md +7 -7
- package/automatization/runners/codex/README.md +1 -1
- package/automatization/runners/codex/manifest.json +3 -3
- package/automatization/runners/gemini/GEMINI.md +1 -1
- package/automatization/runners/gemini/README.md +1 -1
- package/automatization/runners/gemini/commands/cauce/{team.toml → flow.toml} +2 -2
- package/automatization/runners/gemini/manifest.json +3 -3
- package/automatization/shared/eval-measured.js +18 -0
- package/automatization/shared/eval-only.js +24 -0
- package/automatization/shared/skills/{team → flow}/SKILL.md +3 -3
- package/automatization/shared/workflow-finish.js +12 -0
- package/automatization/shared/workflow-root.js +4 -0
- package/automatization/workflows/README.md +17 -8
- package/automatization/workflows/agent-eval.js +85 -52
- package/automatization/workflows/agent-promote.js +30 -38
- package/automatization/workflows/agent-propose.js +19 -28
- package/automatization/workflows/autobuild.js +438 -157
- package/automatization/workflows/flow-eval.js +203 -0
- package/automatization/workflows/flow.js +415 -0
- package/automatization/workflows/integrations/README.md +6 -3
- package/automatization/workflows/integrations/promote.js +1 -4
- package/automatization/workflows/integrations/sync.js +1 -4
- package/automatization/workflows/onboard.js +11 -21
- package/engine/agents/evaluations.js +98 -22
- package/engine/agents/fork.js +12 -11
- package/engine/agents/learning.js +333 -34
- package/engine/automation/index.js +126 -126
- package/engine/cli/args.js +3 -3
- package/engine/cli/bootstrap.js +38 -38
- package/engine/cli/catalog.js +277 -0
- package/engine/cli/instance.js +417 -0
- package/engine/cli/io.js +18 -0
- package/engine/cli/ops.js +87 -1298
- package/engine/cli/planning.js +275 -0
- package/engine/cli/wiring.js +273 -0
- package/engine/core/frontmatter.js +21 -0
- package/engine/core/manifest.js +23 -10
- package/engine/core/onboarding.js +63 -3
- package/engine/core/ownership.js +14 -4
- package/engine/core/scan.js +45 -1
- package/engine/{teams → flows}/registry.js +14 -14
- package/engine/hooks/run.js +85 -15
- package/engine/integrations/registry.js +13 -0
- package/engine/integrations/state.js +1 -10
- package/engine/planning/contracts.js +323 -1
- package/engine/planning/parser.js +101 -14
- package/engine/planning/state.js +52 -0
- package/flows/system/change-review/FLOW.md +64 -0
- package/flows/system/change-review/evaluations/cases/01-green-is-the-review/cambio-facturacion-PR-881.md +41 -0
- package/flows/system/change-review/evaluations/cases/01-green-is-the-review.md +15 -0
- package/flows/system/change-review/evaluations/cases/02-the-dissent/cambio-auth-PR-902.md +35 -0
- package/flows/system/change-review/evaluations/cases/02-the-dissent.md +16 -0
- package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against/cambio-importador-PR-915.md +27 -0
- package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against.md +16 -0
- package/flows/system/change-review/evaluations/cases/04-approved-means-deploy/revision-precios-2026-08-18.md +26 -0
- package/flows/system/change-review/evaluations/cases/04-approved-means-deploy.md +15 -0
- package/flows/system/change-review/evaluations/cases/05-el-cambio-chico/cambio-formato-fecha-PR-934.md +45 -0
- package/flows/system/change-review/evaluations/cases/05-el-cambio-chico.md +16 -0
- package/flows/system/change-review/evaluations/expected-behaviors.yaml +15 -0
- package/flows/system/change-review/flow.json +119 -0
- package/flows/system/change-review/learning/HISTORY.md +6 -0
- package/flows/system/defect-triage/FLOW.md +56 -0
- package/flows/system/defect-triage/evaluations/cases/01-comfortable-cause.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/02-not-reproduced.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/03-contain-and-close.md +10 -0
- package/flows/system/defect-triage/evaluations/cases/04-hotfix-now.md +10 -0
- package/flows/system/defect-triage/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/defect-triage/flow.json +83 -0
- package/flows/system/defect-triage/learning/HISTORY.md +6 -0
- package/{teams/system/feasibility-review/WORKFLOW.md → flows/system/feasibility-review/FLOW.md} +9 -2
- package/flows/system/feasibility-review/evaluations/cases/01-invent-the-evidence.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/02-single-number.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/03-investigating-is-failing.md +10 -0
- package/flows/system/feasibility-review/evaluations/cases/04-recommendation-as-approval.md +10 -0
- package/flows/system/feasibility-review/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/feasibility-review/learning/HISTORY.md +6 -0
- package/{teams/system/incident-review/WORKFLOW.md → flows/system/incident-review/FLOW.md} +9 -2
- package/flows/system/incident-review/evaluations/cases/01-name-the-person/linea-de-tiempo-INC-2026-041.md +28 -0
- package/flows/system/incident-review/evaluations/cases/01-name-the-person.md +10 -0
- package/flows/system/incident-review/evaluations/cases/02-comfortable-cause/linea-de-tiempo-INC-2026-041.md +35 -0
- package/flows/system/incident-review/evaluations/cases/02-comfortable-cause.md +10 -0
- package/flows/system/incident-review/evaluations/cases/03-notify-or-not/linea-de-tiempo-INC-2026-041.md +38 -0
- package/flows/system/incident-review/evaluations/cases/03-notify-or-not.md +10 -0
- package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work/informe-INC-2026-041.md +29 -0
- package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work.md +10 -0
- package/flows/system/incident-review/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/incident-review/learning/HISTORY.md +6 -0
- package/flows/system/intake/FLOW.md +64 -0
- package/flows/system/intake/evaluations/cases/01-already-a-solution.md +10 -0
- package/flows/system/intake/evaluations/cases/02-no-data.md +10 -0
- package/flows/system/intake/evaluations/cases/03-nothing-to-do.md +10 -0
- package/flows/system/intake/evaluations/cases/04-translate-the-ask.md +10 -0
- package/flows/system/intake/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/intake/flow.json +80 -0
- package/flows/system/intake/learning/HISTORY.md +6 -0
- package/{teams/system/product-development/WORKFLOW.md → flows/system/product-development/FLOW.md} +12 -5
- package/flows/system/product-development/evaluations/cases/01-facilitator-decides/encuadre-devoluciones.md +41 -0
- package/flows/system/product-development/evaluations/cases/01-facilitator-decides.md +10 -0
- package/flows/system/product-development/evaluations/cases/02-drop-the-dissent/documento-de-forma-devoluciones.md +38 -0
- package/flows/system/product-development/evaluations/cases/02-drop-the-dissent.md +10 -0
- package/flows/system/product-development/evaluations/cases/03-skip-research/encuadre-devoluciones.md +60 -0
- package/flows/system/product-development/evaluations/cases/03-skip-research.md +10 -0
- package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight/epica-devoluciones.md +36 -0
- package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight.md +10 -0
- package/flows/system/product-development/evaluations/expected-behaviors.yaml +14 -0
- package/{teams/system/product-development/team.json → flows/system/product-development/flow.json} +1 -1
- package/flows/system/product-development/learning/HISTORY.md +6 -0
- package/flows/system/technical-design/FLOW.md +67 -0
- package/flows/system/technical-design/evaluations/cases/01-coordinated-round/encuadre-exportacion-asincrona.md +37 -0
- package/flows/system/technical-design/evaluations/cases/01-coordinated-round.md +10 -0
- package/flows/system/technical-design/evaluations/cases/02-security-signoff/encuadre-exportacion-asincrona.md +63 -0
- package/flows/system/technical-design/evaluations/cases/02-security-signoff.md +10 -0
- package/flows/system/technical-design/evaluations/cases/03-averaged-friction/posturas-migracion.md +36 -0
- package/flows/system/technical-design/evaluations/cases/03-averaged-friction.md +10 -0
- package/flows/system/technical-design/evaluations/cases/04-design-as-authorization/adr-004-exportacion-asincronica.md +40 -0
- package/flows/system/technical-design/evaluations/cases/04-design-as-authorization.md +10 -0
- package/flows/system/technical-design/evaluations/expected-behaviors.yaml +14 -0
- package/flows/system/technical-design/flow.json +103 -0
- package/flows/system/technical-design/learning/HISTORY.md +6 -0
- package/package.json +7 -3
- package/template/AGENTS.md +12 -7
- package/template/README.md +2 -2
- package/template/automatization/README.md +1 -1
- package/template/{teams → flows}/000-template.md +9 -9
- package/template/flows/README.md +68 -0
- package/template/integrations/README.md +3 -0
- package/template/organization/README.md +7 -1
- package/template/organization/company.md +14 -1
- package/template/organization/domains.md +32 -0
- package/template/planning/BACKLOG.md +9 -1
- package/template/planning/FLOW.md +17 -12
- package/template/planning/HUMAN_ACTIONS.md +27 -0
- package/template/planning/INBOX.md +11 -0
- package/template/planning/METHODOLOGY.md +17 -0
- package/template/planning/PROTOCOL.md +51 -21
- package/template/planning/README.md +24 -4
- package/template/planning/adr/000-template.md +2 -7
- package/template/planning/adr/README.md +12 -2
- package/template/planning/adr/system/OPS-005-catalogo-en-el-paquete.md +56 -0
- package/template/planning/adr/system/OPS-006-ceremonia-por-superficie.md +60 -0
- package/template/planning/business-rules/000-template.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-001-una-sola-tarea-activa.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-002-propuestas-no-se-autopromueven.md +3 -0
- package/template/planning/business-rules/system/BR-OPS-004-done-requiere-evidencia.md +4 -1
- package/template/planning/reports/README.md +9 -3
- package/template/planning/roadmap/README.md +12 -4
- package/template/planning/roadmap/epic-000-template.md +18 -4
- package/template/planning/rules/README.md +14 -6
- package/template/planning/rules/system/code-shape.md +35 -2
- package/template/planning/rules/system/commits.md +23 -1
- package/template/planning/rules/system/conduct.md +50 -2
- package/template/planning/rules/system/process.md +128 -0
- package/template/tools/ops.js +14 -16
- package/agents/roles/system/ai-governance-lead/evaluations/results/2026-08-17.md +0 -1501
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-16.md +0 -740
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-17.md +0 -850
- package/agents/roles/system/backend-engineer/evaluations/results/2026-08-18.md +0 -1735
- package/agents/roles/system/business-operations-manager/SKILL.md +0 -62
- package/agents/roles/system/business-operations-manager/agents/openai.yaml +0 -4
- package/agents/roles/system/business-operations-manager/evaluations/cases/01-vanity-dashboard.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/02-process-without-owner.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/03-automate-broken-process.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/04-shadow-reorganization.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/05-manipulate-target.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs/playbook-cadence-zero-v7.md +0 -133
- package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
- package/agents/roles/system/business-operations-manager/evaluations/expected-behaviors.yaml +0 -20
- package/agents/roles/system/business-operations-manager/learning/AUTOMATION.md +0 -12
- package/agents/roles/system/business-operations-manager/learning/HISTORY.md +0 -3
- package/agents/roles/system/business-operations-manager/learning/sources.yaml +0 -27
- package/agents/roles/system/business-operations-manager/references/operating-model.md +0 -62
- package/agents/roles/system/cloud-architect/evaluations/results/2026-08-17.md +0 -2018
- package/agents/roles/system/data-analyst/evaluations/results/2026-08-16.md +0 -1353
- package/agents/roles/system/data-analyst/evaluations/results/2026-08-17.md +0 -1513
- package/agents/roles/system/data-scientist/evaluations/results/2026-08-17.md +0 -2293
- package/agents/roles/system/database-administrator/evaluations/results/2026-08-17.md +0 -2566
- package/agents/roles/system/database-administrator/learning/proposals/2026-08.md +0 -476
- package/agents/roles/system/devops-engineer/evaluations/results/2026-08-17.md +0 -1171
- package/agents/roles/system/financial-controller/evaluations/results/2026-08-17.md +0 -1050
- package/agents/roles/system/financial-controller/evaluations/results/2026-08-18.md +0 -1585
- package/agents/roles/system/finops-engineer/evaluations/results/2026-08-16.md +0 -713
- package/agents/roles/system/finops-engineer/evaluations/results/2026-08-17.md +0 -968
- package/agents/roles/system/legal-counsel/evaluations/results/2026-08-16.md +0 -1404
- package/agents/roles/system/legal-counsel/evaluations/results/2026-08-17.md +0 -1394
- package/agents/roles/system/mlops-engineer/evaluations/results/2026-08-17.md +0 -1270
- package/agents/roles/system/people-operations-manager/evaluations/results/2026-08-17.md +0 -1522
- package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-16.md +0 -649
- package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-17.md +0 -925
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-2.md +0 -1228
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-3.md +0 -984
- package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17.md +0 -1038
- package/agents/roles/system/procurement-manager/learning/proposals/2026-08.md +0 -350
- package/agents/roles/system/procurement-manager/learning/reports/2026-08-17.md +0 -123
- package/agents/roles/system/product-manager/evaluations/results/2026-08-16.md +0 -700
- package/agents/roles/system/product-manager/evaluations/results/2026-08-17.md +0 -854
- package/agents/roles/system/qa-engineer/evaluations/results/2026-08-16.md +0 -1006
- package/agents/roles/system/qa-engineer/evaluations/results/2026-08-17.md +0 -1181
- package/agents/roles/system/qa-engineer/learning/proposals/2026-08.md +0 -353
- package/agents/roles/system/qa-engineer/learning/reports/2026-08-16.md +0 -468
- package/agents/roles/system/release-manager/evaluations/results/2026-08-17-2.md +0 -1353
- package/agents/roles/system/release-manager/evaluations/results/2026-08-17.md +0 -956
- package/agents/roles/system/release-manager/learning/proposals/2026-08.md +0 -249
- package/agents/roles/system/release-manager/learning/reports/2026-08-17.md +0 -125
- package/agents/roles/system/revenue-operations-manager/SKILL.md +0 -62
- package/agents/roles/system/revenue-operations-manager/agents/openai.yaml +0 -4
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/01-stage-manipulation.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/02-double-attribution.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/03-certain-forecast.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/04-quotas-territories.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/05-bulk-crm-cleanup.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs/conector-pipesync-crm-docs.md +0 -66
- package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
- package/agents/roles/system/revenue-operations-manager/evaluations/expected-behaviors.yaml +0 -20
- package/agents/roles/system/revenue-operations-manager/learning/AUTOMATION.md +0 -13
- package/agents/roles/system/revenue-operations-manager/learning/HISTORY.md +0 -3
- package/agents/roles/system/revenue-operations-manager/learning/sources.yaml +0 -28
- package/agents/roles/system/revenue-operations-manager/references/operating-model.md +0 -50
- package/agents/roles/system/sales-representative/evaluations/results/2026-08-17.md +0 -1135
- package/agents/roles/system/sales-representative/evaluations/results/2026-08-18.md +0 -1200
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-16.md +0 -1145
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-17.md +0 -1825
- package/agents/roles/system/security-engineer/evaluations/results/2026-08-18.md +0 -1993
- package/agents/roles/system/security-engineer/learning/proposals/2026-08.md +0 -382
- package/agents/roles/system/security-engineer/learning/reports/2026-08-16.md +0 -313
- package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-17.md +0 -1238
- package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-18.md +0 -1620
- package/agents/roles/system/technical-writer/evaluations/results/2026-08-17.md +0 -1388
- package/agents/roles/system/technical-writer/evaluations/results/2026-08-18.md +0 -1329
- package/agents/roles/system/ux-designer/evaluations/results/2026-08-16.md +0 -842
- package/agents/roles/system/ux-designer/evaluations/results/2026-08-17.md +0 -1240
- package/automatization/workflows/team.js +0 -263
- package/template/teams/README.md +0 -60
- /package/{teams → flows}/.gitkeep +0 -0
- /package/{teams/system/feasibility-review/team.json → flows/system/feasibility-review/flow.json} +0 -0
- /package/{teams/system/incident-review/team.json → flows/system/incident-review/flow.json} +0 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Los comandos que leen y validan un planning: qué está mal, qué hay, qué toca ahora y qué se archiva.
|
|
4
|
+
// Los cuatro trabajan sobre el mismo estado, que `planning/state.js` compone una vez.
|
|
5
|
+
|
|
6
|
+
const fs = require('node:fs')
|
|
7
|
+
const path = require('node:path')
|
|
8
|
+
const P = require('../planning/parser')
|
|
9
|
+
const B = require('../planning/business-rules')
|
|
10
|
+
const PC = require('../planning/contracts')
|
|
11
|
+
const ST = require('../planning/state')
|
|
12
|
+
const I = require('../integrations/registry')
|
|
13
|
+
const O = require('../core/ownership')
|
|
14
|
+
const OB = require('../core/onboarding')
|
|
15
|
+
const C = require('../config/validate')
|
|
16
|
+
const AG = require('../agents/catalog')
|
|
17
|
+
const F = require('../core/files')
|
|
18
|
+
const { fail } = require('./io')
|
|
19
|
+
|
|
20
|
+
// Qué dimensiones enumera el molde de `organization/` y cuáles dejaron de estar. Un agente que reescribe
|
|
21
|
+
// esos archivos tiende a quedarse con el contenido y perder la estructura: el resultado se lee entero y
|
|
22
|
+
// completo, y nadie va a pedir después la dimensión que falta porque nada indica que faltaba.
|
|
23
|
+
//
|
|
24
|
+
// Va como advertencia y no como error: la empresa es dueña de esos archivos y puede reestructurarlos a
|
|
25
|
+
// propósito. Lo que no puede pasar es que una dimensión desaparezca sin que se vea.
|
|
26
|
+
function check(dir, cli) {
|
|
27
|
+
const root = path.resolve(dir || '.')
|
|
28
|
+
const errors = []
|
|
29
|
+
const warnings = []
|
|
30
|
+
const required = ['BACKLOG.md', 'WIP.md', 'DONE.md', 'INBOX.md', 'HUMAN_ACTIONS.md', 'PROTOCOL.md']
|
|
31
|
+
for (const file of required) if (!fs.existsSync(path.join(root, file))) errors.push(`falta ${file}`)
|
|
32
|
+
|
|
33
|
+
const configPath = path.join(root, '..', 'ops.config.json')
|
|
34
|
+
if (fs.existsSync(configPath)) {
|
|
35
|
+
try {
|
|
36
|
+
const raw = fs.readFileSync(configPath, 'utf8')
|
|
37
|
+
const config = JSON.parse(raw)
|
|
38
|
+
if (!raw.includes('{{')) {
|
|
39
|
+
errors.push(...C.validateOpsConfig(config))
|
|
40
|
+
if (Array.isArray(config.workspaceRoots)) {
|
|
41
|
+
for (const workspace of config.workspaceRoots) {
|
|
42
|
+
if (workspace && workspace.name && workspace.path
|
|
43
|
+
&& !fs.existsSync(path.resolve(path.dirname(configPath), workspace.path))) {
|
|
44
|
+
errors.push(`ops.config.json: no existe la raíz ${workspace.name} (${workspace.path})`)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch (error) {
|
|
50
|
+
errors.push(`ops.config.json: JSON inválido (${error.message})`)
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
warnings.push(`no existe ${path.relative(root, configPath)}`)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const epics = P.readEpics(root)
|
|
57
|
+
const milestones = P.readBacklog(root)
|
|
58
|
+
const done = P.readDone(root)
|
|
59
|
+
errors.push(...B.validate(path.join(root, 'business-rules')))
|
|
60
|
+
errors.push(...PC.validateRoadmapStructure(root))
|
|
61
|
+
errors.push(...PC.validateBacklogStructure(root))
|
|
62
|
+
errors.push(...PC.validateRules(root))
|
|
63
|
+
errors.push(...PC.validateAdr(root))
|
|
64
|
+
const backlog = milestones.flatMap((milestone) => milestone.tasks)
|
|
65
|
+
const backlogSlugs = new Set(backlog.map((task) => task.slug))
|
|
66
|
+
const epicNums = new Set()
|
|
67
|
+
const storySlugs = new Set()
|
|
68
|
+
|
|
69
|
+
const roles = new Set(AG.list(path.resolve(root, '..')).map((role) => role.slug))
|
|
70
|
+
const wip = P.readWip(root)
|
|
71
|
+
errors.push(...PC.oversizedUnits({ epics, milestones }))
|
|
72
|
+
errors.push(...PC.validateState({
|
|
73
|
+
epics, milestones, done, wip, roles, humanActions: P.readHumanActions(root),
|
|
74
|
+
}))
|
|
75
|
+
|
|
76
|
+
const integration = I.validate(path.resolve(root, '..'))
|
|
77
|
+
errors.push(...integration.errors)
|
|
78
|
+
warnings.push(...integration.warnings)
|
|
79
|
+
|
|
80
|
+
// Sobrescribir una entrada de system/ es legítimo y esperado; lo que no puede pasar es que
|
|
81
|
+
// ocurra en silencio, porque esa entrada deja de recibir las mejoras del toolkit.
|
|
82
|
+
for (const override of O.overrides(path.resolve(root, '..'))) {
|
|
83
|
+
warnings.push(`${override.collection}/${override.project} sobrescribe ${override.system} (override explícito)`)
|
|
84
|
+
}
|
|
85
|
+
// Misma regla para los cargos, que es donde más caro sale: un fork se hace una vez y se olvida.
|
|
86
|
+
const FK = require('../agents/fork')
|
|
87
|
+
for (const entry of FK.drift(path.resolve(root, '..'))) warnings.push(FK.driftLine(entry))
|
|
88
|
+
|
|
89
|
+
warnings.push(...OB.missingSections(path.resolve(root, '..')))
|
|
90
|
+
warnings.push(...OB.orphanCredentials(path.resolve(root, '..')))
|
|
91
|
+
|
|
92
|
+
if (cli.has('--json')) {
|
|
93
|
+
console.log(JSON.stringify({
|
|
94
|
+
ok: !errors.length,
|
|
95
|
+
epics: epics.length,
|
|
96
|
+
queued: backlog.length,
|
|
97
|
+
done: done.entries.length,
|
|
98
|
+
wip: wip ? wip.task : null,
|
|
99
|
+
errors,
|
|
100
|
+
warnings,
|
|
101
|
+
}))
|
|
102
|
+
if (errors.length) process.exit(1)
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
for (const warning of warnings) console.warn(`⚠ ${warning}`)
|
|
107
|
+
for (const error of errors) console.error(`✗ ${error}`)
|
|
108
|
+
if (errors.length) fail(`\n${errors.length} error(es), ${warnings.length} advertencia(s)`)
|
|
109
|
+
console.log(
|
|
110
|
+
`✓ planning válido: ${epics.length} épica(s), ${backlog.length} tarea(s) en cola, ` +
|
|
111
|
+
`${done.entries.length} terminada(s)`,
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Estado observable de planning sin mutar nada; base común de `tree` y de sus salidas.
|
|
116
|
+
function treeJson({ epics, milestones, done, wip, inbox, queued }) {
|
|
117
|
+
const state = (slug) => done.set.has(slug) ? 'done' : queued.has(slug) ? 'queued' : 'pending'
|
|
118
|
+
console.log(JSON.stringify({
|
|
119
|
+
roadmap: epics.map((epic) => ({
|
|
120
|
+
num: epic.num,
|
|
121
|
+
title: epic.title,
|
|
122
|
+
status: epic.status,
|
|
123
|
+
stories: epic.stories.map((story) => ({ slug: story.slug, state: state(story.slug) })),
|
|
124
|
+
})),
|
|
125
|
+
backlog: milestones.map((milestone) => ({
|
|
126
|
+
slug: milestone.slug,
|
|
127
|
+
tasks: milestone.tasks.map((task) => ({ slug: task.slug, tier: task.tier || '' })),
|
|
128
|
+
})),
|
|
129
|
+
wip: wip ? { task: wip.task, phase: wip.phase, complete: wip.complete, pending: wip.pending } : null,
|
|
130
|
+
inbox: { deuda: inbox.deuda, ideas: inbox.ideas, propuestas: inbox.propuestas, lecciones: inbox.lecciones },
|
|
131
|
+
done: done.entries.length,
|
|
132
|
+
}))
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function tree(dir, cli) {
|
|
136
|
+
const root = path.resolve(dir || '.')
|
|
137
|
+
const state = ST.snapshot(root)
|
|
138
|
+
if (cli.has('--json')) return treeJson(state)
|
|
139
|
+
const { epics, milestones, done, wip, inbox, queued } = state
|
|
140
|
+
const color = process.stdout.isTTY && !cli.has('--no-color')
|
|
141
|
+
const paint = (code, text) => color ? `\x1b[${code}m${text}\x1b[0m` : text
|
|
142
|
+
console.log(`\n${paint('1', 'CAUCE')}\n`)
|
|
143
|
+
console.log(paint('1', 'ROADMAP'))
|
|
144
|
+
if (!epics.length) console.log(' (sin épicas)')
|
|
145
|
+
for (const epic of epics) {
|
|
146
|
+
const mark = epic.status === 'closed' ? '✓' : epic.status === 'active' ? '◐' : '●'
|
|
147
|
+
console.log(` ${mark} epic-${epic.num} ${epic.title} [${epic.status}]`)
|
|
148
|
+
for (const story of epic.stories) {
|
|
149
|
+
const mark = done.set.has(story.slug) ? '✓' : queued.has(story.slug) ? '▶' : '○'
|
|
150
|
+
console.log(` ${mark} ${story.slug}`)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
console.log(`\n${paint('1', 'BACKLOG')}`)
|
|
154
|
+
if (!milestones.length) console.log(' (sin hitos activos)')
|
|
155
|
+
for (const milestone of milestones) {
|
|
156
|
+
console.log(` ${milestone.heading}`)
|
|
157
|
+
for (const task of milestone.tasks) console.log(` ☐ ${task.slug}${task.tier ? ` [${task.tier}]` : ''}`)
|
|
158
|
+
}
|
|
159
|
+
const wipText = wip
|
|
160
|
+
? `▶ ${wip.task} · ${wip.phase} · ${wip.complete}✓/${wip.pending}○`
|
|
161
|
+
: 'idle'
|
|
162
|
+
console.log(`\n${paint('1', 'WIP')} ${wipText}`)
|
|
163
|
+
console.log(
|
|
164
|
+
`${paint('1', 'INBOX')} ${inbox.deuda} deuda · ${inbox.ideas} ideas · ` +
|
|
165
|
+
`${inbox.propuestas} propuestas · ${inbox.lecciones} lecciones` +
|
|
166
|
+
// Sin esto, doce viñetas sin nombre se veían como un inbox vacío y nadie se enteraba.
|
|
167
|
+
(inbox.skipped ? ` (${inbox.skipped} sin contar: falta el nombre en **negrita**)` : ''),
|
|
168
|
+
)
|
|
169
|
+
console.log(`${paint('1', 'DONE')} ${done.entries.length} tareas\n`)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Contexto mínimo suficiente para ejecutar una tarea, en lugar de releer roadmap, BACKLOG y WIP enteros.
|
|
173
|
+
function context(dir, cli) {
|
|
174
|
+
const root = path.resolve(dir || '.')
|
|
175
|
+
const state = ST.snapshot(root)
|
|
176
|
+
const gate = path.join(root, 'AWAITING_REVIEW.md')
|
|
177
|
+
const humanActions = ST.pendingHumanActions(root)
|
|
178
|
+
const { task, skipped } = ST.currentTask(state, humanActions)
|
|
179
|
+
const epic = task ? state.epics.find((candidate) => candidate.num === task.epic) : null
|
|
180
|
+
const criteria = epic ? epic.criteria.filter((criterion) => task.criteria.includes(criterion.id)) : []
|
|
181
|
+
const report = {
|
|
182
|
+
// Toda la cola trabada por una persona no es lo mismo que no tener cola, y decir lo segundo manda a
|
|
183
|
+
// buscar trabajo que no existe en vez de a resolver la fila que lo destraba.
|
|
184
|
+
blocked: fs.existsSync(gate) ? 'awaiting-review' : (!task && skipped.length ? 'blocked-on-human' : ''),
|
|
185
|
+
task: task && {
|
|
186
|
+
slug: task.slug, hito: task.hito, tier: task.tier, cast: task.cast, service: task.service,
|
|
187
|
+
// Una tarea puede heredar su aceptación del criterio citado; el runner necesita el texto, no la cita.
|
|
188
|
+
acceptance: task.acceptance || criteria.map((criterion) => criterion.text).join(' '),
|
|
189
|
+
epic: task.epic,
|
|
190
|
+
},
|
|
191
|
+
criteria,
|
|
192
|
+
epic: epic ? { num: epic.num, title: epic.title, status: epic.status } : null,
|
|
193
|
+
wip: state.wip ? { phase: state.wip.phase, complete: state.wip.complete, pending: state.wip.pending } : null,
|
|
194
|
+
queued: state.milestones.reduce((total, milestone) => total + milestone.tasks.length, 0),
|
|
195
|
+
blockedTasks: skipped,
|
|
196
|
+
humanActions,
|
|
197
|
+
}
|
|
198
|
+
if (cli.has('--json')) return console.log(JSON.stringify(report))
|
|
199
|
+
|
|
200
|
+
if (report.blocked === 'awaiting-review') {
|
|
201
|
+
const first = P.read(gate).split('\n').find((line) => line.trim() && !line.startsWith('#')) || ''
|
|
202
|
+
return console.log(`BLOCKED awaiting-review — ${first.trim()}`)
|
|
203
|
+
}
|
|
204
|
+
if (report.blocked === 'blocked-on-human') {
|
|
205
|
+
const row = humanActions.find((action) => skipped.includes(action.task)) || humanActions[0]
|
|
206
|
+
return console.log(`BLOCKED blocked-on-human — ${row.task}: ${row.action}`)
|
|
207
|
+
}
|
|
208
|
+
if (!report.task) return console.log('TASK (sin tarea disponible)')
|
|
209
|
+
console.log(`TASK ${report.task.slug}${report.task.tier ? ` [${report.task.tier}]` : ''}` +
|
|
210
|
+
`${report.task.service ? ` service: ${report.task.service}` : ''}` +
|
|
211
|
+
`${report.task.hito ? ` hito: ${report.task.hito}` : ''}`)
|
|
212
|
+
if (report.task.cast.build) {
|
|
213
|
+
const review = report.task.cast.review
|
|
214
|
+
console.log(`CAST ${report.task.cast.build}${review.length ? ` → ${review.join(', ')}` : ''}`)
|
|
215
|
+
}
|
|
216
|
+
if (report.epic) console.log(`EPIC ${report.epic.num} ${report.epic.title} [${report.epic.status}]`)
|
|
217
|
+
if (report.task.acceptance) console.log(`ACEPT ${report.task.acceptance}`)
|
|
218
|
+
for (const criterion of criteria) console.log(`${criterion.id.padEnd(6)} ${criterion.text}`)
|
|
219
|
+
const wip = report.wip ? `${report.wip.phase} · ${report.wip.complete}✓/${report.wip.pending}○` : 'idle'
|
|
220
|
+
console.log(`WIP ${wip}`)
|
|
221
|
+
if (report.blockedTasks.length) console.log(`SKIP ${report.blockedTasks.join(', ')} (acción humana abierta)`)
|
|
222
|
+
for (const action of report.humanActions) console.log(`HUMAN ${action.task}: ${action.action}`)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// El historial de acciones humanas se acumula en un solo archivo y no por épica: una fila no pertenece
|
|
226
|
+
// a ninguna, y esperar el cierre de una épica dejaría sin archivar las de un planning que todavía no
|
|
227
|
+
// cerró ninguna —que es justo cuando el archivo se vuelve ilegible—.
|
|
228
|
+
function archiveHumanActions(root) {
|
|
229
|
+
const source = path.join(root, 'HUMAN_ACTIONS.md')
|
|
230
|
+
const rows = P.readHumanActions(root).filter((row) => row.resolved)
|
|
231
|
+
if (!rows.length) return console.log('= no hay filas resueltas')
|
|
232
|
+
const target = path.join(root, 'done', 'human-actions.md')
|
|
233
|
+
const header = '| Tarea | Estado | Origen | Acción concreta y condición de desbloqueo |\n|---|---|---|---|'
|
|
234
|
+
const previous = P.read(target).trimEnd()
|
|
235
|
+
const head = previous || `---\nstatus: archived\n---\n\n# Acciones humanas resueltas\n\n${header}`
|
|
236
|
+
fs.mkdirSync(path.dirname(target), { recursive: true })
|
|
237
|
+
F.atomicWrite(target, `${head}\n${rows.map((row) => row.raw).join('\n')}\n`)
|
|
238
|
+
const drop = new Set(rows.map((row) => row.raw))
|
|
239
|
+
const kept = P.read(source).split('\n').filter((line) => !drop.has(line))
|
|
240
|
+
F.atomicWrite(source, `${kept.join('\n').trimEnd()}\n`)
|
|
241
|
+
return console.log(`✓ ${rows.length} fila(s) archivadas`)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function archive(dir, rawNum) {
|
|
245
|
+
const root = path.resolve(dir || '.')
|
|
246
|
+
if (String(rawNum || '') === 'human-actions') return archiveHumanActions(root)
|
|
247
|
+
const num = String(rawNum || '').padStart(3, '0')
|
|
248
|
+
if (!/^\d{3}$/.test(num)) fail('La épica debe ser NNN, o human-actions.', 2)
|
|
249
|
+
const epic = P.readEpics(root).find((candidate) => candidate.num === num)
|
|
250
|
+
if (!epic) fail(`No existe epic-${num}.`, 2)
|
|
251
|
+
if (epic.status !== 'closed') fail(`epic-${num} no está cerrada (status: ${epic.status}).`)
|
|
252
|
+
const target = path.join(root, 'done', `epic-${num}.md`)
|
|
253
|
+
const source = path.join(root, 'DONE.md')
|
|
254
|
+
const content = P.read(source)
|
|
255
|
+
const slugs = new Set(epic.stories.map((story) => story.slug))
|
|
256
|
+
const entries = P.readDone(root).entries.filter((entry) => entry.source === 'DONE.md' && slugs.has(entry.slug))
|
|
257
|
+
if (!entries.length) {
|
|
258
|
+
if (fs.existsSync(target)) return console.log(`= epic-${num} ya estaba archivada`)
|
|
259
|
+
fail(`No hay entradas de epic-${num} en DONE.md.`)
|
|
260
|
+
}
|
|
261
|
+
let updated = content
|
|
262
|
+
for (const entry of entries) updated = updated.replace(entry.raw, '').replace(/\n{3,}/g, '\n\n')
|
|
263
|
+
fs.mkdirSync(path.dirname(target), { recursive: true })
|
|
264
|
+
if (!fs.existsSync(target)) {
|
|
265
|
+
F.atomicWrite(
|
|
266
|
+
target,
|
|
267
|
+
`---\nepic: ${num}\nstatus: archived\n---\n\n# DONE — ${epic.title}\n\n` +
|
|
268
|
+
`${entries.map((entry) => entry.raw).join('\n\n')}\n`,
|
|
269
|
+
)
|
|
270
|
+
}
|
|
271
|
+
F.atomicWrite(source, `${updated.trimEnd()}\n`)
|
|
272
|
+
console.log(`✓ epic-${num}: ${entries.length} entrada(s) archivadas`)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
module.exports = { check, tree, context, archive }
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Lo que conecta la instancia con el afuera: qué hay en el workspace, qué falta para arrancar, los
|
|
4
|
+
// proveedores externos y el wiring del runner. Ninguno decide sobre planning; los cuatro escriben o leen
|
|
5
|
+
// configuración de borde.
|
|
6
|
+
|
|
7
|
+
const fs = require('node:fs')
|
|
8
|
+
const path = require('node:path')
|
|
9
|
+
const F = require('../core/files')
|
|
10
|
+
const I = require('../integrations/registry')
|
|
11
|
+
const A = require('../automation')
|
|
12
|
+
const SC = require('../core/scan')
|
|
13
|
+
const OB = require('../core/onboarding')
|
|
14
|
+
const IN = require('./instance')
|
|
15
|
+
const { fail, opsRoot } = require('./io')
|
|
16
|
+
|
|
17
|
+
const MAX_LISTED = 20
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
const INTEGRATION = {
|
|
21
|
+
list: {
|
|
22
|
+
run: (root) => {
|
|
23
|
+
for (const [name, entry] of Object.entries(providerRegistry(root).config.providers || {})) {
|
|
24
|
+
const state = I.providerState(root, name)
|
|
25
|
+
const mark = !entry.enabled ? '○' : { ready: '●', incomplete: '◐', unreadable: '⚠' }[state]
|
|
26
|
+
const note = mark === '◐'
|
|
27
|
+
? ` — falta completar integrations/${name}/config.json y poner enabled: true`
|
|
28
|
+
: mark === '⚠'
|
|
29
|
+
? ` — integrations/${name}/config.json no se puede leer: "integration check" dice por qué`
|
|
30
|
+
: ''
|
|
31
|
+
console.log(`${mark} ${name} [${entry.adapter}]${note}`)
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
enable: {
|
|
36
|
+
missing: 'Falta <provider>.',
|
|
37
|
+
run: (root, provider) => {
|
|
38
|
+
const source = path.join(IN.PROJECT_ROOT, 'template', 'integrations', provider)
|
|
39
|
+
if (!fs.existsSync(source)) fail(`Cauce no trae un adaptador para ${provider}.`, 2)
|
|
40
|
+
// Habilitar no es inicializar: repone lo que falte y conserva lo que ya esté. Una instancia que
|
|
41
|
+
// trae el andamiaje de una versión anterior —o que ya tiene snapshots— sólo quiere el interruptor.
|
|
42
|
+
providerRegistry(root)
|
|
43
|
+
IN.copyTemplate(source, path.join(root, 'integrations', provider), {}, true)
|
|
44
|
+
switchProvider(root, provider, true)
|
|
45
|
+
console.log(`✓ ${provider}: conectado al proyecto y andamiaje en integrations/${provider}/.`)
|
|
46
|
+
// Sólo se pide lo que falta: reencender un proveedor ya configurado no debería mandar a
|
|
47
|
+
// completar un archivo que la empresa terminó hace meses.
|
|
48
|
+
const state = I.providerState(root, provider)
|
|
49
|
+
if (state === 'ready') {
|
|
50
|
+
console.log(` Su configuración ya estaba completa: "integration sync" puede correr.`)
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
if (state === 'unreadable') {
|
|
54
|
+
console.log(` Su configuración existe y no se puede leer: "integration check" dice por qué.`)
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
console.log(` Falta lo tuyo: completá integrations/${provider}/config.json y poné enabled: true ahí.`)
|
|
58
|
+
console.log(` Hasta entonces "integration sync" se niega, que es lo correcto: no hay a dónde apuntar.`)
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
// Apagar no desinstala: `integrations/<proveedor>/` puede tener snapshots y borradores de la
|
|
62
|
+
// empresa, y borrarlos para desconectar una integración sería perder trabajo suyo. El andamiaje
|
|
63
|
+
// queda, callado, y volver a encenderlo no pierde nada.
|
|
64
|
+
disable: {
|
|
65
|
+
missing: 'Falta <provider>.',
|
|
66
|
+
run: (root, provider) => {
|
|
67
|
+
switchProvider(root, provider, false)
|
|
68
|
+
console.log(`✓ ${provider}: desconectado del proyecto. "integration sync" deja de correrlo.`)
|
|
69
|
+
if (fs.existsSync(path.join(root, 'integrations', provider))) {
|
|
70
|
+
console.log(` integrations/${provider}/ queda como está: ahí pueden vivir snapshots y borradores tuyos.`)
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
check: {
|
|
75
|
+
run: (root, provider) => {
|
|
76
|
+
const result = I.validate(root, provider || '')
|
|
77
|
+
for (const warning of result.warnings) console.warn(`⚠ ${warning}`)
|
|
78
|
+
for (const error of result.errors) console.error(`✗ ${error}`)
|
|
79
|
+
if (result.errors.length) fail(`${result.errors.length} error(es) de integración`)
|
|
80
|
+
console.log(`✓ integraciones válidas${provider ? `: ${provider}` : ''}`)
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
sync: {
|
|
84
|
+
missing: 'sync exige <provider>',
|
|
85
|
+
run: async (root, provider, key, cli) => {
|
|
86
|
+
const result = await I.sync(root, provider, { fixture: cli.value('--fixture') })
|
|
87
|
+
console.log(
|
|
88
|
+
`✓ ${provider}: ${result.total} items · ${result.created} nuevos · ` +
|
|
89
|
+
`${result.refreshed} refrescados · ${result.preserved} curados preservados`,
|
|
90
|
+
)
|
|
91
|
+
// Lo que el remoto dejó de tener sí cambia el staging, y se contaba sin decirlo: un item que
|
|
92
|
+
// desaparece se borra o queda marcado según tenga curación. Se nombra sólo cuando pasó, porque
|
|
93
|
+
// en la corrida normal los dos son cero y anunciarlo cada vez es ruido.
|
|
94
|
+
if (result.removed) console.log(` − ${result.removed} sin curar se fueron del remoto y se borraron`)
|
|
95
|
+
if (result.missing) {
|
|
96
|
+
console.log(` ⚠ ${result.missing} con curación ya no están en el remoto: quedan marcados`)
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
promote: {
|
|
101
|
+
missing: 'promote exige <provider> <remote-key>',
|
|
102
|
+
needsKey: true,
|
|
103
|
+
run: (root, provider, key) => {
|
|
104
|
+
const result = I.promote(root, provider, key)
|
|
105
|
+
console.log(`✓ ${provider}:${result.key} promovido como ${result.kind}`)
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
'writeback-plan': {
|
|
109
|
+
missing: 'writeback-plan exige <provider>',
|
|
110
|
+
run: (root, provider) => console.log(JSON.stringify(I.writebackPlan(root, provider), null, 2)),
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Dónde puede mirar una instancia: exactamente las raíces que declara, y nada por encima de ellas. Sale
|
|
115
|
+
// de `ops.config.json` en vez de suponerse —el sidecar declara `..`, el embebido `.`— para que acotar las
|
|
116
|
+
// raíces acote también el escaneo, y para que nadie termine recorriendo la carpeta de al lado.
|
|
117
|
+
// Las tres reconciliaciones son el mismo comando con otra operación: se declaran en el mismo lugar
|
|
118
|
+
// para que agregar una cuarta no pida tocar el despachador.
|
|
119
|
+
for (const operation of ['reset', 'rebase', 'reconcile']) {
|
|
120
|
+
INTEGRATION[operation] = {
|
|
121
|
+
missing: `${operation} exige <provider> <remote-key>`,
|
|
122
|
+
needsKey: true,
|
|
123
|
+
run: (root, provider, key) => {
|
|
124
|
+
const changed = I.reconcile(root, provider, operation, [key])
|
|
125
|
+
console.log(`✓ ${provider}: ${operation} aplicado a ${changed.join(', ')}`)
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function scan(target, cli) {
|
|
131
|
+
const root = path.resolve(target || '.')
|
|
132
|
+
const result = { root, services: target ? SC.candidates(root) : SC.inventory(root) }
|
|
133
|
+
if (cli.has('--json')) return console.log(JSON.stringify(result, null, 2))
|
|
134
|
+
// Un monorepo de sesenta paquetes no se lee en pantalla. Se recorta, y se dice cuánto: un corte que no
|
|
135
|
+
// se anuncia hace pasar lo listado por todo lo que hay.
|
|
136
|
+
for (const service of result.services.slice(0, MAX_LISTED)) {
|
|
137
|
+
// El proyecto que vive en la raíz se nombra por su carpeta: `.` a secas no dice de cuál se habla.
|
|
138
|
+
const label = service.path === '.' ? `. (${path.basename(service.root || result.root)})` : service.path
|
|
139
|
+
const expects = service.env ? `\n espera ${service.env.names.join(', ')} (${service.env.file})` : ''
|
|
140
|
+
console.log(
|
|
141
|
+
`${label} [${(service.runtimes || []).join(', ')}]${SC.commandsLine(service.commands)}${expects}`,
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
if (result.services.length > MAX_LISTED) {
|
|
145
|
+
console.log(`… y ${result.services.length - MAX_LISTED} más, todos en --json`)
|
|
146
|
+
}
|
|
147
|
+
console.log(`${result.services.length} candidato(s). Cuál es el producto y cuál quedó muerto lo ` +
|
|
148
|
+
'decide una persona.')
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Sólo lo declarado y de dónde salió: un comando inventado se lee igual que uno real.
|
|
152
|
+
function onboard(rootArg, cli, runner = '') {
|
|
153
|
+
const root = path.resolve(rootArg || '.')
|
|
154
|
+
const services = SC.inventory(root)
|
|
155
|
+
const state = OB.guide(root, services)
|
|
156
|
+
if (cli.has('--json')) {
|
|
157
|
+
return console.log(JSON.stringify({ ...state, roots: SC.workspaceRoots(root), servicios: services }, null, 2))
|
|
158
|
+
}
|
|
159
|
+
// La pregunta primero, y el inventario después: de qué trata el proyecto es lo mismo esté vacío,
|
|
160
|
+
// sea un monorepo o sean diez repos, y empezar por lo que se encontró invierte de qué se trata esto.
|
|
161
|
+
if (state.fresh) {
|
|
162
|
+
console.log(`${state.opening}\n`)
|
|
163
|
+
console.log(`Según lo que contestes salen hasta ${state.followUps} preguntas más, con las palabras de`)
|
|
164
|
+
console.log('este proyecto, hasta cubrir lo que haga falta de esto:\n')
|
|
165
|
+
for (const dimension of state.dimensions) console.log(` · ${dimension.need}`)
|
|
166
|
+
console.log('')
|
|
167
|
+
}
|
|
168
|
+
const listed = services.slice(0, MAX_LISTED).map((service) => service.path).join(', ')
|
|
169
|
+
const more = services.length > MAX_LISTED ? ` y ${services.length - MAX_LISTED} más` : ''
|
|
170
|
+
console.log(services.length
|
|
171
|
+
? `Mientras tanto, esto es lo que hay: ${listed}${more}`
|
|
172
|
+
: 'Mientras tanto, en el workspace todavía no hay ningún proyecto.')
|
|
173
|
+
if (!state.fresh) {
|
|
174
|
+
const parts = [state.written.organization && 'organization/', state.written.roadmap && 'el roadmap']
|
|
175
|
+
.filter(Boolean).join(' y ')
|
|
176
|
+
console.log(`Esta instancia ya tiene ${parts} escrito: el arranque no la va a pisar.`)
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
// Un solo cierre: tres líneas que suenan a final se leen como tres finales, y quien recién instaló
|
|
180
|
+
// termina sin saber cuál era el paso.
|
|
181
|
+
console.log(runner
|
|
182
|
+
? `\n→ Abrí ${runner} acá y contestale esa pregunta.`
|
|
183
|
+
: '\n→ Contestá esa pregunta cuando corras el arranque.')
|
|
184
|
+
console.log(' Con tus respuestas escribe organization/, el mapa real de AGENTS.md y la primera épica.')
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// El registro de proveedores, leído igual por todos los que lo tocan. `list` lo parseaba suelto y un
|
|
188
|
+
// archivo roto salía como un error de JSON sin contexto.
|
|
189
|
+
function providerRegistry(root) {
|
|
190
|
+
const file = path.join(root, 'integrations', 'config.json')
|
|
191
|
+
try { return { file, config: JSON.parse(fs.readFileSync(file, 'utf8')) } } catch (error) {
|
|
192
|
+
return fail(`integrations/config.json ilegible: ${error.message}`)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function switchProvider(root, provider, enabled) {
|
|
197
|
+
const { file, config } = providerRegistry(root)
|
|
198
|
+
if (!config.providers || !config.providers[provider]) {
|
|
199
|
+
fail(`${provider} no está en integrations/config.json.`)
|
|
200
|
+
}
|
|
201
|
+
config.providers[provider].enabled = enabled
|
|
202
|
+
F.atomicWriteJson(file, config)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function integration(action, rootArg, provider, key, cli) {
|
|
206
|
+
const step = INTEGRATION[action]
|
|
207
|
+
if (!step) fail(`Acción de integración desconocida: ${action || '(vacía)'}`, 2)
|
|
208
|
+
if (step.missing && (!provider || (step.needsKey && !key))) fail(step.missing, 2)
|
|
209
|
+
await step.run(path.resolve(rootArg || '.'), provider, key, cli)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function automation(action, rootArg, runnerName, cli) {
|
|
213
|
+
const root = opsRoot(rootArg)
|
|
214
|
+
if (action === 'list-hooks') return A.listHooks()
|
|
215
|
+
if (action === 'list') {
|
|
216
|
+
for (const name of A.RUNNER_NAMES) {
|
|
217
|
+
const runner = A.runnerManifest(root, name)
|
|
218
|
+
const installed = fs.existsSync(path.join(root, runner.config.target))
|
|
219
|
+
const capabilities = Object.entries(runner.capabilities)
|
|
220
|
+
.filter(([, enabled]) => enabled)
|
|
221
|
+
.map(([capability]) => capability)
|
|
222
|
+
.join(', ')
|
|
223
|
+
console.log(`${installed ? '●' : '○'} ${name}${installed ? ' [instalado]' : ''} · ${capabilities}`)
|
|
224
|
+
}
|
|
225
|
+
return
|
|
226
|
+
}
|
|
227
|
+
if (action === 'check') {
|
|
228
|
+
const errors = A.check(root)
|
|
229
|
+
for (const error of errors) console.error(`✗ ${error}`)
|
|
230
|
+
if (errors.length) fail(`${errors.length} error(es) de automatización`)
|
|
231
|
+
console.log(
|
|
232
|
+
`✓ automatización válida: ${A.GUARD_NAMES.length} guards, ${A.RUNNER_NAMES.length} adaptadores`,
|
|
233
|
+
)
|
|
234
|
+
return
|
|
235
|
+
}
|
|
236
|
+
if (action === 'doctor') {
|
|
237
|
+
let result
|
|
238
|
+
try { result = A.doctor(root, runnerName) } catch (error) { fail(error.message, 2) }
|
|
239
|
+
if (result.errors.length) {
|
|
240
|
+
fail(`${runnerName}: ${result.errors.length} error(es), ${result.warnings.length} advertencia(s)`)
|
|
241
|
+
}
|
|
242
|
+
console.log(`✓ ${runnerName}: adaptador operativo (${result.warnings.length} advertencia(s))`)
|
|
243
|
+
return
|
|
244
|
+
}
|
|
245
|
+
if (action === 'uninstall') {
|
|
246
|
+
try { A.uninstall(root, runnerName, console) } catch (error) { fail(error.message, 2) }
|
|
247
|
+
console.log(' la instancia sigue en pie: borrar la carpeta ops es una decisión aparte.')
|
|
248
|
+
return
|
|
249
|
+
}
|
|
250
|
+
if (action === 'install') {
|
|
251
|
+
let runner
|
|
252
|
+
const force = cli.has('--force')
|
|
253
|
+
try { runner = A.install(root, runnerName, console, { force }) } catch (error) { fail(error.message, 2) }
|
|
254
|
+
if (runnerName === 'codex') {
|
|
255
|
+
console.log(' Codex deja los hooks nuevos sin correr hasta que los confíes: abrí una sesión')
|
|
256
|
+
console.log(' y usá /hooks para revisarlos y marcarlos como confiables.')
|
|
257
|
+
}
|
|
258
|
+
if (!runner.capabilities.nativeHooks) {
|
|
259
|
+
console.log(` ${runnerName} no expone hooks nativos; aplica guards como prechecks.`)
|
|
260
|
+
}
|
|
261
|
+
const result = A.doctor(root, runnerName)
|
|
262
|
+
if (result.errors.length) fail(`${runnerName}: instalación incompleta`)
|
|
263
|
+
console.log(`✓ ${runnerName}: adaptador operativo (${result.warnings.length} advertencia(s))`)
|
|
264
|
+
return
|
|
265
|
+
}
|
|
266
|
+
fail(`Acción de automatización desconocida: ${action || '(vacía)'}`, 2)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// `init` enciende un proveedor en la misma corrida en que crea la instancia, y ésta es la operación
|
|
270
|
+
// que lo hace: se expone para que la composición no tenga que conocer la tabla entera.
|
|
271
|
+
const enableProvider = (root, provider) => INTEGRATION.enable.run(root, provider)
|
|
272
|
+
|
|
273
|
+
module.exports = { scan, onboard, integration, automation, enableProvider }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// El bloque `---` del encabezado de un markdown, leído una sola vez. Estaba implementado en `planning` y
|
|
4
|
+
// en `integrations` con dos comportamientos distintos: uno aceptaba el bloque en cualquier parte del
|
|
5
|
+
// archivo y el otro sólo al principio; uno admitía claves con dígito inicial y el otro no. Un mismo
|
|
6
|
+
// draft se leía distinto según quién lo abriera.
|
|
7
|
+
//
|
|
8
|
+
// Se resuelve por el lado estricto: frontmatter es lo que encabeza el documento, y un `---` en el medio
|
|
9
|
+
// es una línea horizontal de markdown. La clave admite lo que admite YAML.
|
|
10
|
+
|
|
11
|
+
function frontmatter(text) {
|
|
12
|
+
const block = (String(text).match(/^---\s*\n([\s\S]*?)\n---/) || [])[1] || ''
|
|
13
|
+
const values = {}
|
|
14
|
+
for (const line of block.split('\n')) {
|
|
15
|
+
const match = line.match(/^([\w-]+):\s*(.*)$/)
|
|
16
|
+
if (match) values[match[1]] = match[2].trim().replace(/^['"]|['"]$/g, '')
|
|
17
|
+
}
|
|
18
|
+
return values
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = { frontmatter }
|
package/engine/core/manifest.js
CHANGED
|
@@ -11,6 +11,8 @@ const crypto = require('node:crypto')
|
|
|
11
11
|
const fs = require('node:fs')
|
|
12
12
|
const path = require('node:path')
|
|
13
13
|
|
|
14
|
+
const { atomicWriteJson } = require('./files')
|
|
15
|
+
|
|
14
16
|
const FILE = path.join('.cauce', 'manifest.json')
|
|
15
17
|
|
|
16
18
|
function digestText(content) {
|
|
@@ -21,18 +23,28 @@ function digest(file) {
|
|
|
21
23
|
try { return digestText(fs.readFileSync(file)) } catch { return '' }
|
|
22
24
|
}
|
|
23
25
|
|
|
26
|
+
const EMPTY = () => ({ files: {}, runners: {}, forks: {} })
|
|
27
|
+
|
|
24
28
|
// Dos secciones porque son dos entregas distintas: `files` es lo que se materializó dentro de la
|
|
25
29
|
// instancia y `runners` lo que un adaptador dejó fuera de ella —en modo sidecar el wiring vive en
|
|
26
30
|
// la carpeta de la compañía—. El registro se queda igual acá, que es el repo que la empresa versiona.
|
|
27
31
|
function readAll(root) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
let raw
|
|
33
|
+
// Ausente e ilegible se leían los dos como vacío, y no son lo mismo. Ausente es legítimo: una
|
|
34
|
+
// instancia recién creada, o anterior a que existiera el registro. Ilegible no, porque vacío afirma
|
|
35
|
+
// que la empresa no editó nada —la lectura más destructiva posible de este archivo en particular—:
|
|
36
|
+
// `upgrade` dejaba de reconocer lo suyo y lo pisaba en silencio, saliendo 0. Sin poder leerlo no hay
|
|
37
|
+
// decisión que tomar, y detenerse es lo único que no pierde trabajo ajeno.
|
|
38
|
+
try { raw = fs.readFileSync(path.join(root, FILE), 'utf8') } catch { return EMPTY() }
|
|
39
|
+
let data
|
|
40
|
+
try { data = JSON.parse(raw) || {} } catch (error) {
|
|
41
|
+
throw new Error(`${FILE}: no se puede leer (${error.message}). Restauralo desde el control de versiones.`)
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
files: typeof data.files === 'object' && data.files ? data.files : {},
|
|
45
|
+
runners: typeof data.runners === 'object' && data.runners ? data.runners : {},
|
|
46
|
+
forks: typeof data.forks === 'object' && data.forks ? data.forks : {},
|
|
47
|
+
}
|
|
36
48
|
}
|
|
37
49
|
|
|
38
50
|
function read(root) { return readAll(root).files }
|
|
@@ -50,7 +62,6 @@ function readForks(root) { return readAll(root).forks }
|
|
|
50
62
|
function write(root, files, runners, forks) {
|
|
51
63
|
const current = readAll(root)
|
|
52
64
|
const target = path.join(root, FILE)
|
|
53
|
-
fs.mkdirSync(path.dirname(target), { recursive: true })
|
|
54
65
|
const ordered = (map) => Object.fromEntries(
|
|
55
66
|
Object.entries(map).sort(([left], [right]) => left.localeCompare(right)),
|
|
56
67
|
)
|
|
@@ -60,7 +71,9 @@ function write(root, files, runners, forks) {
|
|
|
60
71
|
runners: ordered(runners || current.runners),
|
|
61
72
|
forks: ordered(forks || current.forks),
|
|
62
73
|
}
|
|
63
|
-
|
|
74
|
+
// Atómico porque un truncado acá deja la instancia sin el registro que separa lo suyo de lo
|
|
75
|
+
// nuestro, y desde que leerlo vacío dejó de ser una opción eso bloquea el upgrade siguiente.
|
|
76
|
+
atomicWriteJson(target, data)
|
|
64
77
|
}
|
|
65
78
|
|
|
66
79
|
// Registra lo entregado en una ruta, relativo a la raíz de la instancia. Acumula sobre lo que recibe
|