@ingeniomaps/cauce 0.1.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/.github/workflows/agent-learning.yml +131 -0
- package/.github/workflows/ci.yml +27 -0
- package/LICENSE +21 -0
- package/README.md +208 -0
- package/agents/coordinators/.gitkeep +1 -0
- package/agents/roles/ai-governance-lead/SKILL.md +60 -0
- package/agents/roles/ai-governance-lead/agents/openai.yaml +4 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/01-hide-shadow-ai.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/02-downgrade-high-impact.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/03-rubber-stamp.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/04-vendor-certificate.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/05-conceal-incident.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/cases/06-adversarial-policy.md +10 -0
- package/agents/roles/ai-governance-lead/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/ai-governance-lead/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/ai-governance-lead/learning/HISTORY.md +3 -0
- package/agents/roles/ai-governance-lead/learning/proposals/_template.md +11 -0
- package/agents/roles/ai-governance-lead/learning/reports/_template.md +11 -0
- package/agents/roles/ai-governance-lead/learning/sources.yaml +37 -0
- package/agents/roles/ai-governance-lead/references/operating-model.md +42 -0
- package/agents/roles/ai-product-manager/SKILL.md +60 -0
- package/agents/roles/ai-product-manager/agents/openai.yaml +4 -0
- package/agents/roles/ai-product-manager/evaluations/cases/01-ai-for-everything.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/cases/02-demo-to-production.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/cases/03-rubber-stamp-human.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/cases/04-hide-bad-slice.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/cases/05-silent-provider-change.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/cases/06-adversarial-output.md +10 -0
- package/agents/roles/ai-product-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/ai-product-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/ai-product-manager/learning/HISTORY.md +3 -0
- package/agents/roles/ai-product-manager/learning/proposals/_template.md +9 -0
- package/agents/roles/ai-product-manager/learning/reports/_template.md +9 -0
- package/agents/roles/ai-product-manager/learning/sources.yaml +15 -0
- package/agents/roles/ai-product-manager/references/operating-model.md +36 -0
- package/agents/roles/analytics-engineer/SKILL.md +60 -0
- package/agents/roles/analytics-engineer/agents/openai.yaml +4 -0
- package/agents/roles/analytics-engineer/evaluations/cases/01-metric-manipulation.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/cases/02-fanout.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/cases/03-breaking-change.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/cases/04-sensitive-self-service.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/cases/05-unsafe-backfill.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/cases/06-adversarial-sql.md +10 -0
- package/agents/roles/analytics-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/analytics-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/analytics-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/analytics-engineer/learning/proposals/_template.md +9 -0
- package/agents/roles/analytics-engineer/learning/reports/_template.md +9 -0
- package/agents/roles/analytics-engineer/learning/sources.yaml +14 -0
- package/agents/roles/analytics-engineer/references/operating-model.md +36 -0
- package/agents/roles/backend-engineer/SKILL.md +70 -0
- package/agents/roles/backend-engineer/agents/openai.yaml +4 -0
- package/agents/roles/backend-engineer/evaluations/cases/01-payment-webhook.md +10 -0
- package/agents/roles/backend-engineer/evaluations/cases/02-object-authorization.md +10 -0
- package/agents/roles/backend-engineer/evaluations/cases/03-migration.md +10 -0
- package/agents/roles/backend-engineer/evaluations/cases/04-third-party-timeout.md +10 -0
- package/agents/roles/backend-engineer/evaluations/cases/05-sensitive-logs.md +10 -0
- package/agents/roles/backend-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/backend-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/backend-engineer/learning/CODEX_AUTOMATION.md +17 -0
- package/agents/roles/backend-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/backend-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/backend-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/backend-engineer/learning/sources.yaml +29 -0
- package/agents/roles/backend-engineer/references/operating-model.md +69 -0
- package/agents/roles/business-operations-manager/SKILL.md +58 -0
- package/agents/roles/business-operations-manager/agents/openai.yaml +4 -0
- package/agents/roles/business-operations-manager/evaluations/cases/01-vanity-dashboard.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/cases/02-process-without-owner.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/cases/03-automate-broken-process.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/cases/04-shadow-reorganization.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/cases/05-manipulate-target.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/business-operations-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/business-operations-manager/learning/CODEX_AUTOMATION.md +12 -0
- package/agents/roles/business-operations-manager/learning/HISTORY.md +3 -0
- package/agents/roles/business-operations-manager/learning/proposals/_template.md +13 -0
- package/agents/roles/business-operations-manager/learning/reports/_template.md +12 -0
- package/agents/roles/business-operations-manager/learning/sources.yaml +29 -0
- package/agents/roles/business-operations-manager/references/operating-model.md +62 -0
- package/agents/roles/business-strategist/SKILL.md +70 -0
- package/agents/roles/business-strategist/agents/openai.yaml +4 -0
- package/agents/roles/business-strategist/evaluations/cases/01-market-sizing.md +10 -0
- package/agents/roles/business-strategist/evaluations/cases/02-everyone.md +10 -0
- package/agents/roles/business-strategist/evaluations/cases/03-copy-competitor.md +10 -0
- package/agents/roles/business-strategist/evaluations/cases/04-vanity-growth.md +10 -0
- package/agents/roles/business-strategist/evaluations/cases/05-forecast-certainty.md +10 -0
- package/agents/roles/business-strategist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/business-strategist/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/business-strategist/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/business-strategist/learning/HISTORY.md +4 -0
- package/agents/roles/business-strategist/learning/proposals/_template.md +15 -0
- package/agents/roles/business-strategist/learning/reports/_template.md +14 -0
- package/agents/roles/business-strategist/learning/sources.yaml +33 -0
- package/agents/roles/business-strategist/references/operating-model.md +79 -0
- package/agents/roles/cloud-architect/SKILL.md +60 -0
- package/agents/roles/cloud-architect/agents/openai.yaml +4 -0
- package/agents/roles/cloud-architect/evaluations/cases/01-diagram-only.md +10 -0
- package/agents/roles/cloud-architect/evaluations/cases/02-open-network.md +10 -0
- package/agents/roles/cloud-architect/evaluations/cases/03-multicloud-mandate.md +10 -0
- package/agents/roles/cloud-architect/evaluations/cases/04-big-bang-migration.md +10 -0
- package/agents/roles/cloud-architect/evaluations/cases/05-false-savings.md +10 -0
- package/agents/roles/cloud-architect/evaluations/cases/06-adversarial-iac.md +10 -0
- package/agents/roles/cloud-architect/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/cloud-architect/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/cloud-architect/learning/HISTORY.md +3 -0
- package/agents/roles/cloud-architect/learning/proposals/_template.md +9 -0
- package/agents/roles/cloud-architect/learning/reports/_template.md +9 -0
- package/agents/roles/cloud-architect/learning/sources.yaml +15 -0
- package/agents/roles/cloud-architect/references/operating-model.md +41 -0
- package/agents/roles/community-manager/SKILL.md +59 -0
- package/agents/roles/community-manager/agents/openai.yaml +4 -0
- package/agents/roles/community-manager/evaluations/cases/01-fake-engagement.md +10 -0
- package/agents/roles/community-manager/evaluations/cases/02-doxx-reporter.md +10 -0
- package/agents/roles/community-manager/evaluations/cases/03-member-profiling.md +10 -0
- package/agents/roles/community-manager/evaluations/cases/04-secret-giveaway.md +10 -0
- package/agents/roles/community-manager/evaluations/cases/05-delete-criticism.md +10 -0
- package/agents/roles/community-manager/evaluations/cases/06-adversarial-link.md +10 -0
- package/agents/roles/community-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/community-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/community-manager/learning/HISTORY.md +3 -0
- package/agents/roles/community-manager/learning/proposals/_template.md +11 -0
- package/agents/roles/community-manager/learning/reports/_template.md +10 -0
- package/agents/roles/community-manager/learning/sources.yaml +29 -0
- package/agents/roles/community-manager/references/operating-model.md +40 -0
- package/agents/roles/content-specialist/SKILL.md +70 -0
- package/agents/roles/content-specialist/agents/openai.yaml +4 -0
- package/agents/roles/content-specialist/evaluations/cases/01-invented-statistics.md +10 -0
- package/agents/roles/content-specialist/evaluations/cases/02-seo-spam.md +10 -0
- package/agents/roles/content-specialist/evaluations/cases/03-accessibility.md +10 -0
- package/agents/roles/content-specialist/evaluations/cases/04-copyright.md +10 -0
- package/agents/roles/content-specialist/evaluations/cases/05-localization.md +10 -0
- package/agents/roles/content-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/content-specialist/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/content-specialist/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/content-specialist/learning/HISTORY.md +4 -0
- package/agents/roles/content-specialist/learning/proposals/_template.md +15 -0
- package/agents/roles/content-specialist/learning/reports/_template.md +14 -0
- package/agents/roles/content-specialist/learning/sources.yaml +33 -0
- package/agents/roles/content-specialist/references/operating-model.md +75 -0
- package/agents/roles/customer-success-manager/SKILL.md +70 -0
- package/agents/roles/customer-success-manager/agents/openai.yaml +4 -0
- package/agents/roles/customer-success-manager/evaluations/cases/01-health-score.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/cases/02-onboarding.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/cases/03-roadmap.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/cases/04-hidden-risk.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/cases/05-expansion.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/customer-success-manager/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/customer-success-manager/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/customer-success-manager/learning/HISTORY.md +4 -0
- package/agents/roles/customer-success-manager/learning/proposals/_template.md +15 -0
- package/agents/roles/customer-success-manager/learning/reports/_template.md +14 -0
- package/agents/roles/customer-success-manager/learning/sources.yaml +33 -0
- package/agents/roles/customer-success-manager/references/operating-model.md +79 -0
- package/agents/roles/customer-support-specialist/SKILL.md +70 -0
- package/agents/roles/customer-support-specialist/agents/openai.yaml +4 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/01-account-access.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/02-destructive-troubleshooting.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/03-incident.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/04-refund.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/05-sensitive-logs.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/customer-support-specialist/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/customer-support-specialist/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/customer-support-specialist/learning/HISTORY.md +4 -0
- package/agents/roles/customer-support-specialist/learning/proposals/_template.md +15 -0
- package/agents/roles/customer-support-specialist/learning/reports/_template.md +14 -0
- package/agents/roles/customer-support-specialist/learning/sources.yaml +33 -0
- package/agents/roles/customer-support-specialist/references/operating-model.md +98 -0
- package/agents/roles/data-analyst/SKILL.md +70 -0
- package/agents/roles/data-analyst/agents/openai.yaml +4 -0
- package/agents/roles/data-analyst/evaluations/cases/01-funnel-grain.md +10 -0
- package/agents/roles/data-analyst/evaluations/cases/02-segmentation.md +10 -0
- package/agents/roles/data-analyst/evaluations/cases/03-missing-data.md +10 -0
- package/agents/roles/data-analyst/evaluations/cases/04-causality.md +10 -0
- package/agents/roles/data-analyst/evaluations/cases/05-sensitive-export.md +10 -0
- package/agents/roles/data-analyst/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/data-analyst/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/data-analyst/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/data-analyst/learning/HISTORY.md +4 -0
- package/agents/roles/data-analyst/learning/proposals/_template.md +15 -0
- package/agents/roles/data-analyst/learning/reports/_template.md +14 -0
- package/agents/roles/data-analyst/learning/sources.yaml +33 -0
- package/agents/roles/data-analyst/references/operating-model.md +71 -0
- package/agents/roles/data-engineer/SKILL.md +60 -0
- package/agents/roles/data-engineer/agents/openai.yaml +4 -0
- package/agents/roles/data-engineer/evaluations/cases/01-double-count-backfill.md +10 -0
- package/agents/roles/data-engineer/evaluations/cases/02-silent-schema-break.md +10 -0
- package/agents/roles/data-engineer/evaluations/cases/03-destructive-rebuild.md +10 -0
- package/agents/roles/data-engineer/evaluations/cases/04-production-data-in-dev.md +10 -0
- package/agents/roles/data-engineer/evaluations/cases/05-green-but-wrong.md +10 -0
- package/agents/roles/data-engineer/evaluations/cases/06-adversarial-data.md +10 -0
- package/agents/roles/data-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/data-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/data-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/data-engineer/learning/proposals/_template.md +11 -0
- package/agents/roles/data-engineer/learning/reports/_template.md +10 -0
- package/agents/roles/data-engineer/learning/sources.yaml +29 -0
- package/agents/roles/data-engineer/references/operating-model.md +41 -0
- package/agents/roles/data-scientist/SKILL.md +60 -0
- package/agents/roles/data-scientist/agents/openai.yaml +4 -0
- package/agents/roles/data-scientist/evaluations/cases/01-p-hacking.md +10 -0
- package/agents/roles/data-scientist/evaluations/cases/02-correlation-causality.md +10 -0
- package/agents/roles/data-scientist/evaluations/cases/03-peek-and-stop.md +10 -0
- package/agents/roles/data-scientist/evaluations/cases/04-survivorship-bias.md +10 -0
- package/agents/roles/data-scientist/evaluations/cases/05-sensitive-targeting.md +10 -0
- package/agents/roles/data-scientist/evaluations/cases/06-adversarial-notebook.md +10 -0
- package/agents/roles/data-scientist/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/data-scientist/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/data-scientist/learning/HISTORY.md +3 -0
- package/agents/roles/data-scientist/learning/proposals/_template.md +11 -0
- package/agents/roles/data-scientist/learning/reports/_template.md +10 -0
- package/agents/roles/data-scientist/learning/sources.yaml +29 -0
- package/agents/roles/data-scientist/references/operating-model.md +40 -0
- package/agents/roles/database-administrator/SKILL.md +60 -0
- package/agents/roles/database-administrator/agents/openai.yaml +4 -0
- package/agents/roles/database-administrator/evaluations/cases/01-unverified-backup.md +10 -0
- package/agents/roles/database-administrator/evaluations/cases/02-dangerous-production-command.md +10 -0
- package/agents/roles/database-administrator/evaluations/cases/03-replica-failover.md +10 -0
- package/agents/roles/database-administrator/evaluations/cases/04-zero-downtime-migration.md +10 -0
- package/agents/roles/database-administrator/evaluations/cases/05-disable-safety.md +10 -0
- package/agents/roles/database-administrator/evaluations/cases/06-adversarial-runbook.md +10 -0
- package/agents/roles/database-administrator/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/database-administrator/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/database-administrator/learning/HISTORY.md +3 -0
- package/agents/roles/database-administrator/learning/proposals/_template.md +9 -0
- package/agents/roles/database-administrator/learning/reports/_template.md +9 -0
- package/agents/roles/database-administrator/learning/sources.yaml +15 -0
- package/agents/roles/database-administrator/references/operating-model.md +40 -0
- package/agents/roles/developer-relations-engineer/SKILL.md +60 -0
- package/agents/roles/developer-relations-engineer/agents/openai.yaml +4 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/01-future-api-demo.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/02-insecure-quickstart.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/03-untested-sample.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/04-vanity-and-tracking.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/05-community-incident.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/cases/06-adversarial-issue.md +10 -0
- package/agents/roles/developer-relations-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/developer-relations-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/developer-relations-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/developer-relations-engineer/learning/proposals/_template.md +11 -0
- package/agents/roles/developer-relations-engineer/learning/reports/_template.md +10 -0
- package/agents/roles/developer-relations-engineer/learning/sources.yaml +29 -0
- package/agents/roles/developer-relations-engineer/references/operating-model.md +43 -0
- package/agents/roles/devops-engineer/SKILL.md +70 -0
- package/agents/roles/devops-engineer/agents/openai.yaml +4 -0
- package/agents/roles/devops-engineer/evaluations/cases/01-destructive-plan.md +10 -0
- package/agents/roles/devops-engineer/evaluations/cases/02-secrets.md +10 -0
- package/agents/roles/devops-engineer/evaluations/cases/03-release-artifact.md +10 -0
- package/agents/roles/devops-engineer/evaluations/cases/04-drift.md +10 -0
- package/agents/roles/devops-engineer/evaluations/cases/05-supply-chain.md +10 -0
- package/agents/roles/devops-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/devops-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/devops-engineer/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/devops-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/devops-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/devops-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/devops-engineer/learning/sources.yaml +29 -0
- package/agents/roles/devops-engineer/references/operating-model.md +74 -0
- package/agents/roles/engineering-manager/SKILL.md +60 -0
- package/agents/roles/engineering-manager/agents/openai.yaml +4 -0
- package/agents/roles/engineering-manager/evaluations/cases/01-productivity-surveillance.md +10 -0
- package/agents/roles/engineering-manager/evaluations/cases/02-capacity.md +10 -0
- package/agents/roles/engineering-manager/evaluations/cases/03-feedback.md +10 -0
- package/agents/roles/engineering-manager/evaluations/cases/04-incident-blame.md +10 -0
- package/agents/roles/engineering-manager/evaluations/cases/05-role-boundaries.md +10 -0
- package/agents/roles/engineering-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/engineering-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/engineering-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/engineering-manager/learning/HISTORY.md +4 -0
- package/agents/roles/engineering-manager/learning/proposals/_template.md +13 -0
- package/agents/roles/engineering-manager/learning/reports/_template.md +12 -0
- package/agents/roles/engineering-manager/learning/sources.yaml +28 -0
- package/agents/roles/engineering-manager/references/operating-model.md +60 -0
- package/agents/roles/financial-controller/SKILL.md +70 -0
- package/agents/roles/financial-controller/agents/openai.yaml +4 -0
- package/agents/roles/financial-controller/evaluations/cases/01-revenue.md +10 -0
- package/agents/roles/financial-controller/evaluations/cases/02-unreconciled-close.md +10 -0
- package/agents/roles/financial-controller/evaluations/cases/03-payment-fraud.md +10 -0
- package/agents/roles/financial-controller/evaluations/cases/04-forecast.md +10 -0
- package/agents/roles/financial-controller/evaluations/cases/05-tax.md +10 -0
- package/agents/roles/financial-controller/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/financial-controller/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/financial-controller/learning/CODEX_AUTOMATION.md +19 -0
- package/agents/roles/financial-controller/learning/HISTORY.md +4 -0
- package/agents/roles/financial-controller/learning/proposals/_template.md +15 -0
- package/agents/roles/financial-controller/learning/reports/_template.md +14 -0
- package/agents/roles/financial-controller/learning/sources.yaml +33 -0
- package/agents/roles/financial-controller/references/operating-model.md +93 -0
- package/agents/roles/frontend-engineer/SKILL.md +70 -0
- package/agents/roles/frontend-engineer/agents/openai.yaml +4 -0
- package/agents/roles/frontend-engineer/evaluations/cases/01-form.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/cases/02-untrusted-html.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/cases/03-race-condition.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/cases/04-framework-change.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/cases/05-false-success.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/frontend-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/frontend-engineer/learning/CODEX_AUTOMATION.md +17 -0
- package/agents/roles/frontend-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/frontend-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/frontend-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/frontend-engineer/learning/sources.yaml +29 -0
- package/agents/roles/frontend-engineer/references/operating-model.md +75 -0
- package/agents/roles/implementation-manager/SKILL.md +60 -0
- package/agents/roles/implementation-manager/agents/openai.yaml +4 -0
- package/agents/roles/implementation-manager/evaluations/cases/01-hidden-scope.md +10 -0
- package/agents/roles/implementation-manager/evaluations/cases/02-risky-migration.md +10 -0
- package/agents/roles/implementation-manager/evaluations/cases/03-customer-credentials.md +10 -0
- package/agents/roles/implementation-manager/evaluations/cases/04-forced-go-live.md +10 -0
- package/agents/roles/implementation-manager/evaluations/cases/05-false-success.md +10 -0
- package/agents/roles/implementation-manager/evaluations/cases/06-adversarial-plan.md +10 -0
- package/agents/roles/implementation-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/implementation-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/implementation-manager/learning/HISTORY.md +3 -0
- package/agents/roles/implementation-manager/learning/proposals/_template.md +11 -0
- package/agents/roles/implementation-manager/learning/reports/_template.md +12 -0
- package/agents/roles/implementation-manager/learning/sources.yaml +29 -0
- package/agents/roles/implementation-manager/references/operating-model.md +61 -0
- package/agents/roles/legal-counsel/SKILL.md +64 -0
- package/agents/roles/legal-counsel/agents/openai.yaml +4 -0
- package/agents/roles/legal-counsel/evaluations/cases/01-invented-law.md +10 -0
- package/agents/roles/legal-counsel/evaluations/cases/02-sign-contract.md +10 -0
- package/agents/roles/legal-counsel/evaluations/cases/03-privilege-conflict.md +10 -0
- package/agents/roles/legal-counsel/evaluations/cases/04-delete-evidence.md +10 -0
- package/agents/roles/legal-counsel/evaluations/cases/05-evade-controls.md +10 -0
- package/agents/roles/legal-counsel/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/legal-counsel/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/legal-counsel/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/legal-counsel/learning/HISTORY.md +3 -0
- package/agents/roles/legal-counsel/learning/proposals/_template.md +14 -0
- package/agents/roles/legal-counsel/learning/reports/_template.md +14 -0
- package/agents/roles/legal-counsel/learning/sources.yaml +34 -0
- package/agents/roles/legal-counsel/references/operating-model.md +64 -0
- package/agents/roles/machine-learning-engineer/SKILL.md +60 -0
- package/agents/roles/machine-learning-engineer/agents/openai.yaml +4 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/01-leaky-evaluation.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/02-average-hides-harm.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/03-unlicensed-training-data.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/04-direct-production.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/05-prompt-injection-tools.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/cases/06-adversarial-model.md +10 -0
- package/agents/roles/machine-learning-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/machine-learning-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/machine-learning-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/machine-learning-engineer/learning/proposals/_template.md +11 -0
- package/agents/roles/machine-learning-engineer/learning/reports/_template.md +10 -0
- package/agents/roles/machine-learning-engineer/learning/sources.yaml +33 -0
- package/agents/roles/machine-learning-engineer/references/operating-model.md +41 -0
- package/agents/roles/mlops-engineer/SKILL.md +60 -0
- package/agents/roles/mlops-engineer/agents/openai.yaml +4 -0
- package/agents/roles/mlops-engineer/evaluations/cases/01-unversioned-model.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/cases/02-train-serving-skew.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/cases/03-bypass-gates.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/cases/04-drift-auto-retrain.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/cases/05-incompatible-rollback.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/cases/06-adversarial-artifact.md +10 -0
- package/agents/roles/mlops-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/mlops-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/mlops-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/mlops-engineer/learning/proposals/_template.md +9 -0
- package/agents/roles/mlops-engineer/learning/reports/_template.md +9 -0
- package/agents/roles/mlops-engineer/learning/sources.yaml +15 -0
- package/agents/roles/mlops-engineer/references/operating-model.md +40 -0
- package/agents/roles/mobile-engineer/SKILL.md +70 -0
- package/agents/roles/mobile-engineer/agents/openai.yaml +4 -0
- package/agents/roles/mobile-engineer/evaluations/cases/01-offline-sync.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/cases/02-permissions.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/cases/03-credential-storage.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/cases/04-lifecycle.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/cases/05-deep-links-notifications.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/mobile-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/mobile-engineer/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/mobile-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/mobile-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/mobile-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/mobile-engineer/learning/sources.yaml +29 -0
- package/agents/roles/mobile-engineer/references/operating-model.md +70 -0
- package/agents/roles/partnerships-manager/SKILL.md +59 -0
- package/agents/roles/partnerships-manager/agents/openai.yaml +4 -0
- package/agents/roles/partnerships-manager/evaluations/cases/01-logo-partner.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/cases/02-skip-diligence.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/cases/03-share-customer-data.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/cases/04-channel-conflict.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/cases/05-announce-and-integrate.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/cases/06-adversarial-portal.md +10 -0
- package/agents/roles/partnerships-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/partnerships-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/partnerships-manager/learning/HISTORY.md +3 -0
- package/agents/roles/partnerships-manager/learning/proposals/_template.md +11 -0
- package/agents/roles/partnerships-manager/learning/reports/_template.md +10 -0
- package/agents/roles/partnerships-manager/learning/sources.yaml +29 -0
- package/agents/roles/partnerships-manager/references/operating-model.md +43 -0
- package/agents/roles/people-operations-manager/SKILL.md +66 -0
- package/agents/roles/people-operations-manager/agents/openai.yaml +4 -0
- package/agents/roles/people-operations-manager/evaluations/cases/01-biased-automated-screening.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/cases/02-unstructured-culture-fit.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/cases/03-performance-ranking.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/cases/04-sensitive-complaint.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/cases/05-people-data-export.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/people-operations-manager/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/people-operations-manager/learning/CODEX_AUTOMATION.md +12 -0
- package/agents/roles/people-operations-manager/learning/HISTORY.md +3 -0
- package/agents/roles/people-operations-manager/learning/proposals/_template.md +14 -0
- package/agents/roles/people-operations-manager/learning/reports/_template.md +14 -0
- package/agents/roles/people-operations-manager/learning/sources.yaml +37 -0
- package/agents/roles/people-operations-manager/references/operating-model.md +68 -0
- package/agents/roles/privacy-compliance-specialist/SKILL.md +70 -0
- package/agents/roles/privacy-compliance-specialist/agents/openai.yaml +4 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/01-consent.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/02-data-rights.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/03-retention.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/04-vendor-transfer.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/05-incident.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/privacy-compliance-specialist/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/privacy-compliance-specialist/learning/CODEX_AUTOMATION.md +19 -0
- package/agents/roles/privacy-compliance-specialist/learning/HISTORY.md +4 -0
- package/agents/roles/privacy-compliance-specialist/learning/proposals/_template.md +15 -0
- package/agents/roles/privacy-compliance-specialist/learning/reports/_template.md +14 -0
- package/agents/roles/privacy-compliance-specialist/learning/sources.yaml +33 -0
- package/agents/roles/privacy-compliance-specialist/references/operating-model.md +85 -0
- package/agents/roles/procurement-manager/SKILL.md +60 -0
- package/agents/roles/procurement-manager/agents/openai.yaml +4 -0
- package/agents/roles/procurement-manager/evaluations/cases/01-bid-rigging.md +10 -0
- package/agents/roles/procurement-manager/evaluations/cases/02-conflict-gift.md +10 -0
- package/agents/roles/procurement-manager/evaluations/cases/03-lowest-price.md +10 -0
- package/agents/roles/procurement-manager/evaluations/cases/04-technology-vendor.md +10 -0
- package/agents/roles/procurement-manager/evaluations/cases/05-emergency-bank-change.md +10 -0
- package/agents/roles/procurement-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/procurement-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/procurement-manager/learning/CODEX_AUTOMATION.md +12 -0
- package/agents/roles/procurement-manager/learning/HISTORY.md +3 -0
- package/agents/roles/procurement-manager/learning/proposals/_template.md +14 -0
- package/agents/roles/procurement-manager/learning/reports/_template.md +13 -0
- package/agents/roles/procurement-manager/learning/sources.yaml +29 -0
- package/agents/roles/procurement-manager/references/operating-model.md +53 -0
- package/agents/roles/product-manager/SKILL.md +65 -0
- package/agents/roles/product-manager/agents/openai.yaml +4 -0
- package/agents/roles/product-manager/evaluations/cases/01-unsupported-feature.md +10 -0
- package/agents/roles/product-manager/evaluations/cases/02-prioritization.md +10 -0
- package/agents/roles/product-manager/evaluations/cases/03-epic.md +10 -0
- package/agents/roles/product-manager/evaluations/cases/04-autonomy.md +10 -0
- package/agents/roles/product-manager/evaluations/cases/05-adversarial-source.md +10 -0
- package/agents/roles/product-manager/evaluations/expected-behaviors.yaml +18 -0
- package/agents/roles/product-manager/learning/CODEX_AUTOMATION.md +21 -0
- package/agents/roles/product-manager/learning/HISTORY.md +6 -0
- package/agents/roles/product-manager/learning/proposals/_template.md +15 -0
- package/agents/roles/product-manager/learning/reports/_template.md +14 -0
- package/agents/roles/product-manager/learning/sources.yaml +28 -0
- package/agents/roles/product-manager/references/operating-model.md +121 -0
- package/agents/roles/product-marketing-manager/SKILL.md +70 -0
- package/agents/roles/product-marketing-manager/agents/openai.yaml +4 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/01-claims.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/02-everyone.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/03-launch-readiness.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/04-competitive-intelligence.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/05-attribution.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/product-marketing-manager/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/product-marketing-manager/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/product-marketing-manager/learning/HISTORY.md +4 -0
- package/agents/roles/product-marketing-manager/learning/proposals/_template.md +15 -0
- package/agents/roles/product-marketing-manager/learning/reports/_template.md +14 -0
- package/agents/roles/product-marketing-manager/learning/sources.yaml +33 -0
- package/agents/roles/product-marketing-manager/references/operating-model.md +88 -0
- package/agents/roles/project-manager/SKILL.md +57 -0
- package/agents/roles/project-manager/agents/openai.yaml +4 -0
- package/agents/roles/project-manager/evaluations/cases/01-impossible-date.md +10 -0
- package/agents/roles/project-manager/evaluations/cases/02-scope-creep.md +10 -0
- package/agents/roles/project-manager/evaluations/cases/03-false-green.md +10 -0
- package/agents/roles/project-manager/evaluations/cases/04-raid-without-owner.md +10 -0
- package/agents/roles/project-manager/evaluations/cases/05-micromanagement.md +10 -0
- package/agents/roles/project-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/project-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/project-manager/learning/CODEX_AUTOMATION.md +11 -0
- package/agents/roles/project-manager/learning/HISTORY.md +3 -0
- package/agents/roles/project-manager/learning/proposals/_template.md +13 -0
- package/agents/roles/project-manager/learning/reports/_template.md +12 -0
- package/agents/roles/project-manager/learning/sources.yaml +28 -0
- package/agents/roles/project-manager/references/operating-model.md +74 -0
- package/agents/roles/qa-engineer/SKILL.md +70 -0
- package/agents/roles/qa-engineer/agents/openai.yaml +4 -0
- package/agents/roles/qa-engineer/evaluations/cases/01-risk-strategy.md +10 -0
- package/agents/roles/qa-engineer/evaluations/cases/02-flaky-test.md +10 -0
- package/agents/roles/qa-engineer/evaluations/cases/03-production-data.md +10 -0
- package/agents/roles/qa-engineer/evaluations/cases/04-release-confidence.md +10 -0
- package/agents/roles/qa-engineer/evaluations/cases/05-defect-triage.md +10 -0
- package/agents/roles/qa-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/qa-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/qa-engineer/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/qa-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/qa-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/qa-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/qa-engineer/learning/sources.yaml +29 -0
- package/agents/roles/qa-engineer/references/operating-model.md +85 -0
- package/agents/roles/release-manager/SKILL.md +59 -0
- package/agents/roles/release-manager/agents/openai.yaml +4 -0
- package/agents/roles/release-manager/evaluations/cases/01-rebuild-production.md +10 -0
- package/agents/roles/release-manager/evaluations/cases/02-checklist-approval.md +10 -0
- package/agents/roles/release-manager/evaluations/cases/03-big-bang.md +10 -0
- package/agents/roles/release-manager/evaluations/cases/04-irreversible-migration.md +10 -0
- package/agents/roles/release-manager/evaluations/cases/05-hotfix-bypass.md +10 -0
- package/agents/roles/release-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/release-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/release-manager/learning/CODEX_AUTOMATION.md +12 -0
- package/agents/roles/release-manager/learning/HISTORY.md +3 -0
- package/agents/roles/release-manager/learning/proposals/_template.md +13 -0
- package/agents/roles/release-manager/learning/reports/_template.md +12 -0
- package/agents/roles/release-manager/learning/sources.yaml +29 -0
- package/agents/roles/release-manager/references/operating-model.md +63 -0
- package/agents/roles/revenue-operations-manager/SKILL.md +58 -0
- package/agents/roles/revenue-operations-manager/agents/openai.yaml +4 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/01-stage-manipulation.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/02-double-attribution.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/03-certain-forecast.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/04-quotas-territories.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/05-bulk-crm-cleanup.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/revenue-operations-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/revenue-operations-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/revenue-operations-manager/learning/HISTORY.md +3 -0
- package/agents/roles/revenue-operations-manager/learning/proposals/_template.md +13 -0
- package/agents/roles/revenue-operations-manager/learning/reports/_template.md +12 -0
- package/agents/roles/revenue-operations-manager/learning/sources.yaml +30 -0
- package/agents/roles/revenue-operations-manager/references/operating-model.md +50 -0
- package/agents/roles/sales-representative/SKILL.md +70 -0
- package/agents/roles/sales-representative/agents/openai.yaml +4 -0
- package/agents/roles/sales-representative/evaluations/cases/01-outreach-list.md +10 -0
- package/agents/roles/sales-representative/evaluations/cases/02-discovery.md +10 -0
- package/agents/roles/sales-representative/evaluations/cases/03-roadmap-promise.md +10 -0
- package/agents/roles/sales-representative/evaluations/cases/04-forecast.md +10 -0
- package/agents/roles/sales-representative/evaluations/cases/05-discount.md +10 -0
- package/agents/roles/sales-representative/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/sales-representative/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/sales-representative/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/sales-representative/learning/HISTORY.md +4 -0
- package/agents/roles/sales-representative/learning/proposals/_template.md +15 -0
- package/agents/roles/sales-representative/learning/reports/_template.md +14 -0
- package/agents/roles/sales-representative/learning/sources.yaml +33 -0
- package/agents/roles/sales-representative/references/operating-model.md +79 -0
- package/agents/roles/security-engineer/SKILL.md +70 -0
- package/agents/roles/security-engineer/agents/openai.yaml +4 -0
- package/agents/roles/security-engineer/evaluations/cases/01-object-authorization.md +10 -0
- package/agents/roles/security-engineer/evaluations/cases/02-ssrf.md +10 -0
- package/agents/roles/security-engineer/evaluations/cases/03-secrets.md +10 -0
- package/agents/roles/security-engineer/evaluations/cases/04-vulnerability-priority.md +10 -0
- package/agents/roles/security-engineer/evaluations/cases/05-incident.md +10 -0
- package/agents/roles/security-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/security-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/security-engineer/learning/CODEX_AUTOMATION.md +19 -0
- package/agents/roles/security-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/security-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/security-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/security-engineer/learning/sources.yaml +29 -0
- package/agents/roles/security-engineer/references/operating-model.md +62 -0
- package/agents/roles/site-reliability-engineer/SKILL.md +70 -0
- package/agents/roles/site-reliability-engineer/agents/openai.yaml +4 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/01-slo.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/02-alert-fatigue.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/03-incident.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/04-recovery.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/05-retry-storm.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/site-reliability-engineer/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/site-reliability-engineer/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/site-reliability-engineer/learning/HISTORY.md +4 -0
- package/agents/roles/site-reliability-engineer/learning/proposals/_template.md +15 -0
- package/agents/roles/site-reliability-engineer/learning/reports/_template.md +14 -0
- package/agents/roles/site-reliability-engineer/learning/sources.yaml +29 -0
- package/agents/roles/site-reliability-engineer/references/operating-model.md +78 -0
- package/agents/roles/software-architect/SKILL.md +70 -0
- package/agents/roles/software-architect/agents/openai.yaml +4 -0
- package/agents/roles/software-architect/evaluations/cases/01-microservices.md +10 -0
- package/agents/roles/software-architect/evaluations/cases/02-shared-database.md +10 -0
- package/agents/roles/software-architect/evaluations/cases/03-technology-hype.md +10 -0
- package/agents/roles/software-architect/evaluations/cases/04-quality-attributes.md +10 -0
- package/agents/roles/software-architect/evaluations/cases/05-big-bang-rewrite.md +10 -0
- package/agents/roles/software-architect/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/software-architect/evaluations/expected-behaviors.yaml +20 -0
- package/agents/roles/software-architect/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/software-architect/learning/HISTORY.md +4 -0
- package/agents/roles/software-architect/learning/proposals/_template.md +15 -0
- package/agents/roles/software-architect/learning/reports/_template.md +14 -0
- package/agents/roles/software-architect/learning/sources.yaml +29 -0
- package/agents/roles/software-architect/references/operating-model.md +79 -0
- package/agents/roles/solutions-engineer/SKILL.md +58 -0
- package/agents/roles/solutions-engineer/agents/openai.yaml +4 -0
- package/agents/roles/solutions-engineer/evaluations/cases/01-future-capability.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/cases/02-security-questionnaire.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/cases/03-fake-demo.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/cases/04-vague-poc.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/cases/05-production-architecture.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/cases/06-adversarial-rfp.md +10 -0
- package/agents/roles/solutions-engineer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/solutions-engineer/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/solutions-engineer/learning/HISTORY.md +3 -0
- package/agents/roles/solutions-engineer/learning/proposals/_template.md +13 -0
- package/agents/roles/solutions-engineer/learning/reports/_template.md +12 -0
- package/agents/roles/solutions-engineer/learning/sources.yaml +29 -0
- package/agents/roles/solutions-engineer/references/operating-model.md +62 -0
- package/agents/roles/technical-program-manager/SKILL.md +60 -0
- package/agents/roles/technical-program-manager/agents/openai.yaml +4 -0
- package/agents/roles/technical-program-manager/evaluations/cases/01-executive-date.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/cases/02-fake-green.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/cases/03-micromanage-teams.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/cases/04-dependency-without-contract.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/cases/05-launch-without-readiness.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/cases/06-adversarial-plan.md +10 -0
- package/agents/roles/technical-program-manager/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/technical-program-manager/learning/CODEX_AUTOMATION.md +13 -0
- package/agents/roles/technical-program-manager/learning/HISTORY.md +3 -0
- package/agents/roles/technical-program-manager/learning/proposals/_template.md +9 -0
- package/agents/roles/technical-program-manager/learning/reports/_template.md +9 -0
- package/agents/roles/technical-program-manager/learning/sources.yaml +14 -0
- package/agents/roles/technical-program-manager/references/operating-model.md +41 -0
- package/agents/roles/technical-writer/SKILL.md +58 -0
- package/agents/roles/technical-writer/agents/openai.yaml +4 -0
- package/agents/roles/technical-writer/evaluations/cases/01-invented-api.md +10 -0
- package/agents/roles/technical-writer/evaluations/cases/02-secret-example.md +10 -0
- package/agents/roles/technical-writer/evaluations/cases/03-dangerous-runbook.md +10 -0
- package/agents/roles/technical-writer/evaluations/cases/04-content-type.md +10 -0
- package/agents/roles/technical-writer/evaluations/cases/05-accessibility-global.md +10 -0
- package/agents/roles/technical-writer/evaluations/cases/06-adversarial-docs.md +10 -0
- package/agents/roles/technical-writer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/technical-writer/learning/CODEX_AUTOMATION.md +11 -0
- package/agents/roles/technical-writer/learning/HISTORY.md +3 -0
- package/agents/roles/technical-writer/learning/proposals/_template.md +14 -0
- package/agents/roles/technical-writer/learning/reports/_template.md +12 -0
- package/agents/roles/technical-writer/learning/sources.yaml +29 -0
- package/agents/roles/technical-writer/references/operating-model.md +67 -0
- package/agents/roles/ui-designer/SKILL.md +76 -0
- package/agents/roles/ui-designer/agents/openai.yaml +4 -0
- package/agents/roles/ui-designer/evaluations/cases/01-component.md +10 -0
- package/agents/roles/ui-designer/evaluations/cases/02-color-only.md +10 -0
- package/agents/roles/ui-designer/evaluations/cases/03-design-system.md +10 -0
- package/agents/roles/ui-designer/evaluations/cases/04-responsive.md +10 -0
- package/agents/roles/ui-designer/evaluations/cases/05-boundaries.md +10 -0
- package/agents/roles/ui-designer/evaluations/cases/06-adversarial-source.md +10 -0
- package/agents/roles/ui-designer/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/ui-designer/learning/CODEX_AUTOMATION.md +19 -0
- package/agents/roles/ui-designer/learning/HISTORY.md +4 -0
- package/agents/roles/ui-designer/learning/proposals/_template.md +15 -0
- package/agents/roles/ui-designer/learning/reports/_template.md +14 -0
- package/agents/roles/ui-designer/learning/sources.yaml +24 -0
- package/agents/roles/ui-designer/references/operating-model.md +66 -0
- package/agents/roles/user-researcher/SKILL.md +67 -0
- package/agents/roles/user-researcher/agents/openai.yaml +4 -0
- package/agents/roles/user-researcher/evaluations/cases/01-research-plan.md +10 -0
- package/agents/roles/user-researcher/evaluations/cases/02-small-sample.md +10 -0
- package/agents/roles/user-researcher/evaluations/cases/03-fabricated-quotes.md +10 -0
- package/agents/roles/user-researcher/evaluations/cases/04-sensitive-data.md +10 -0
- package/agents/roles/user-researcher/evaluations/cases/05-contradictory-evidence.md +10 -0
- package/agents/roles/user-researcher/evaluations/cases/06-adversarial-source.md +10 -0
- package/agents/roles/user-researcher/evaluations/expected-behaviors.yaml +19 -0
- package/agents/roles/user-researcher/learning/CODEX_AUTOMATION.md +22 -0
- package/agents/roles/user-researcher/learning/HISTORY.md +6 -0
- package/agents/roles/user-researcher/learning/proposals/_template.md +15 -0
- package/agents/roles/user-researcher/learning/reports/_template.md +14 -0
- package/agents/roles/user-researcher/learning/sources.yaml +24 -0
- package/agents/roles/user-researcher/references/operating-model.md +104 -0
- package/agents/roles/ux-designer/SKILL.md +76 -0
- package/agents/roles/ux-designer/agents/openai.yaml +4 -0
- package/agents/roles/ux-designer/evaluations/cases/01-checkout-flow.md +10 -0
- package/agents/roles/ux-designer/evaluations/cases/02-dark-pattern.md +10 -0
- package/agents/roles/ux-designer/evaluations/cases/03-missing-research.md +10 -0
- package/agents/roles/ux-designer/evaluations/cases/04-heuristic-review.md +10 -0
- package/agents/roles/ux-designer/evaluations/cases/05-role-boundaries.md +10 -0
- package/agents/roles/ux-designer/evaluations/cases/06-adversarial-source.md +10 -0
- package/agents/roles/ux-designer/evaluations/expected-behaviors.yaml +18 -0
- package/agents/roles/ux-designer/learning/CODEX_AUTOMATION.md +18 -0
- package/agents/roles/ux-designer/learning/HISTORY.md +4 -0
- package/agents/roles/ux-designer/learning/proposals/_template.md +15 -0
- package/agents/roles/ux-designer/learning/reports/_template.md +14 -0
- package/agents/roles/ux-designer/learning/sources.yaml +24 -0
- package/agents/roles/ux-designer/references/operating-model.md +87 -0
- package/agents/specialists/.gitkeep +1 -0
- package/agents/workflows/.gitkeep +1 -0
- package/automatization/AGENTS.md +67 -0
- package/automatization/README.md +28 -0
- package/automatization/hooks/README.md +53 -0
- package/automatization/hooks/guard-dependencies.sh +4 -0
- package/automatization/hooks/guard-destructive.sh +4 -0
- package/automatization/hooks/guard-files.sh +4 -0
- package/automatization/hooks/guard-generated.sh +4 -0
- package/automatization/hooks/guard-git-add.sh +4 -0
- package/automatization/hooks/guard-governance.sh +4 -0
- package/automatization/hooks/guard-integration-snapshot.sh +4 -0
- package/automatization/hooks/guard-migrations.sh +4 -0
- package/automatization/hooks/guard-planning-drift.sh +4 -0
- package/automatization/hooks/guard-secrets.sh +4 -0
- package/automatization/hooks/guard-shell.sh +4 -0
- package/automatization/hooks/guard-verify.sh +4 -0
- package/automatization/hooks/guard-workspace-boundary.sh +4 -0
- package/automatization/hooks/run-hook.sh +22 -0
- package/automatization/runners/README.md +25 -0
- package/automatization/runners/antigravity/README.md +16 -0
- package/automatization/runners/antigravity/hook.js +78 -0
- package/automatization/runners/antigravity/hooks.json +21 -0
- package/automatization/runners/antigravity/manifest.json +17 -0
- package/automatization/runners/antigravity/plugin.json +5 -0
- package/automatization/runners/antigravity/rules/cauce.md +6 -0
- package/automatization/runners/antigravity/skills/autobuild/SKILL.md +10 -0
- package/automatization/runners/antigravity/skills/integration-promote/SKILL.md +10 -0
- package/automatization/runners/antigravity/skills/integration-sync/SKILL.md +9 -0
- package/automatization/runners/claude/CLAUDE.md +10 -0
- package/automatization/runners/claude/README.md +13 -0
- package/automatization/runners/claude/manifest.json +13 -0
- package/automatization/runners/claude/settings.json +25 -0
- package/automatization/runners/codex/README.md +15 -0
- package/automatization/runners/codex/hooks.json +25 -0
- package/automatization/runners/codex/manifest.json +9 -0
- package/automatization/runners/gemini/GEMINI.md +12 -0
- package/automatization/runners/gemini/README.md +18 -0
- package/automatization/runners/gemini/commands/ops/autobuild.toml +7 -0
- package/automatization/runners/gemini/commands/ops/integration-promote.toml +6 -0
- package/automatization/runners/gemini/commands/ops/integration-sync.toml +6 -0
- package/automatization/runners/gemini/manifest.json +14 -0
- package/automatization/runners/gemini/settings.json +9 -0
- package/automatization/workflows/README.md +38 -0
- package/automatization/workflows/autobuild.js +287 -0
- package/automatization/workflows/integrations/README.md +14 -0
- package/automatization/workflows/integrations/promote.js +33 -0
- package/automatization/workflows/integrations/sync.js +36 -0
- package/engine/agents/learning.js +157 -0
- package/engine/automation/index.js +329 -0
- package/engine/cli/ops.js +602 -0
- package/engine/config/validate.js +70 -0
- package/engine/core/files.js +55 -0
- package/engine/hooks/run.js +400 -0
- package/engine/integrations/proposals.js +80 -0
- package/engine/integrations/providers/jira.js +164 -0
- package/engine/integrations/registry.js +390 -0
- package/engine/integrations/state.js +237 -0
- package/engine/integrations/writeback.js +90 -0
- package/engine/planning/business-rules.js +44 -0
- package/engine/planning/contracts.js +90 -0
- package/engine/planning/parser.js +184 -0
- package/engine/schemas/ops-config.schema.json +37 -0
- package/engine/teams/registry.js +85 -0
- package/package.json +37 -0
- package/teams/.gitkeep +1 -0
- package/teams/product-development/WORKFLOW.md +54 -0
- package/teams/product-development/team.json +106 -0
- package/template/AGENTS.md +61 -0
- package/template/Makefile +58 -0
- package/template/README.md +21 -0
- package/template/automatization/AGENTS.md +67 -0
- package/template/automatization/README.md +19 -0
- package/template/automatization/config.json +13 -0
- package/template/automatization/hooks/.gitkeep +1 -0
- package/template/automatization/runners/README.md +13 -0
- package/template/automatization/workflows/.gitkeep +1 -0
- package/template/integrations/AGENTS.md +14 -0
- package/template/integrations/README.md +21 -0
- package/template/integrations/config.json +10 -0
- package/template/integrations/jira/README.md +59 -0
- package/template/integrations/jira/config.json +17 -0
- package/template/integrations/jira/proposed/README.md +22 -0
- package/template/integrations/jira/staging/.gitkeep +1 -0
- package/template/integrations/jira/staging/README.md +4 -0
- package/template/ops.config.json +15 -0
- package/template/organization/README.md +13 -0
- package/template/organization/company.md +38 -0
- package/template/organization/product.md +17 -0
- package/template/planning/BACKLOG.md +9 -0
- package/template/planning/DONE.md +13 -0
- package/template/planning/FLOW.md +34 -0
- package/template/planning/HUMAN_ACTIONS.md +4 -0
- package/template/planning/INBOX.md +11 -0
- package/template/planning/METHODOLOGY.md +26 -0
- package/template/planning/PROTOCOL.md +62 -0
- package/template/planning/README.md +18 -0
- package/template/planning/WIP.md +22 -0
- package/template/planning/adr/000-template.md +47 -0
- package/template/planning/adr/README.md +42 -0
- package/template/planning/adr/system/OPS-001-planificacion-como-fuente-de-verdad.md +32 -0
- package/template/planning/adr/system/OPS-002-runtime-autocontenido-y-neutral-al-runner.md +34 -0
- package/template/planning/adr/system/OPS-003-integraciones-seguras-por-staging.md +33 -0
- package/template/planning/adr/system/OPS-004-promocion-humana-y-evidencia-verificable.md +34 -0
- package/template/planning/business-rules/000-template.md +34 -0
- package/template/planning/business-rules/README.md +32 -0
- package/template/planning/business-rules/system/BR-OPS-001-una-sola-tarea-activa.md +35 -0
- package/template/planning/business-rules/system/BR-OPS-002-propuestas-no-se-autopromueven.md +35 -0
- package/template/planning/business-rules/system/BR-OPS-003-conflictos-bloquean-promocion.md +35 -0
- package/template/planning/business-rules/system/BR-OPS-004-done-requiere-evidencia.md +35 -0
- package/template/planning/delivery/README.md +41 -0
- package/template/planning/delivery/branches.md +55 -0
- package/template/planning/delivery/environments.md +35 -0
- package/template/planning/delivery/flags.md +35 -0
- package/template/planning/delivery/multi-repo.md +26 -0
- package/template/planning/delivery/project.md +31 -0
- package/template/planning/delivery/release.md +54 -0
- package/template/planning/done/.gitkeep +1 -0
- package/template/planning/roadmap/README.md +62 -0
- package/template/planning/roadmap/epic-000-template.md +32 -0
- package/template/planning/rules/README.md +7 -0
- package/template/planning/rules/code-shape.md +14 -0
- package/template/planning/rules/commits.md +14 -0
- package/template/planning/rules/process.md +17 -0
- package/template/tools/ops.js +5 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Adaptador Jira: lectura y normalización, sin escritura remota.
|
|
4
|
+
|
|
5
|
+
const JIRA_KEY = /^[A-Z][A-Z0-9_]*-\d+$/
|
|
6
|
+
|
|
7
|
+
function validateConfig(config, errors) {
|
|
8
|
+
if (typeof config.enabled !== 'boolean') errors.push('jira: enabled debe ser boolean')
|
|
9
|
+
if (config.enabled && !/^https:\/\/[^/]+$/.test(config.baseUrl || '')) {
|
|
10
|
+
errors.push('jira: baseUrl debe ser HTTPS sin path final')
|
|
11
|
+
}
|
|
12
|
+
if (config.enabled && !String(config.jql || '').trim()) errors.push('jira: falta jql')
|
|
13
|
+
if (!['basic', 'bearer'].includes(config.auth && config.auth.type)) {
|
|
14
|
+
errors.push('jira: auth.type debe ser basic|bearer')
|
|
15
|
+
}
|
|
16
|
+
if (!config.auth || !config.auth.tokenEnv) errors.push('jira: falta auth.tokenEnv')
|
|
17
|
+
if (config.auth && config.auth.type === 'basic' && !config.auth.emailEnv) {
|
|
18
|
+
errors.push('jira: basic exige auth.emailEnv')
|
|
19
|
+
}
|
|
20
|
+
if (config.writeBack !== false) {
|
|
21
|
+
errors.push('jira: writeBack debe permanecer false; no existe un ejecutor remoto aprobado')
|
|
22
|
+
}
|
|
23
|
+
if (config.timeoutMs !== undefined
|
|
24
|
+
&& (!Number.isInteger(config.timeoutMs) || config.timeoutMs < 1_000)) {
|
|
25
|
+
errors.push('jira: timeoutMs debe ser un entero de al menos 1000 ms')
|
|
26
|
+
}
|
|
27
|
+
if (config.maxPages !== undefined
|
|
28
|
+
&& (!Number.isInteger(config.maxPages) || config.maxPages < 1)) {
|
|
29
|
+
errors.push('jira: maxPages debe ser un entero positivo')
|
|
30
|
+
}
|
|
31
|
+
if (config.candidateAssigneeEnv
|
|
32
|
+
&& !/^[A-Z][A-Z0-9_]*$/.test(config.candidateAssigneeEnv)) {
|
|
33
|
+
errors.push('jira: candidateAssigneeEnv debe nombrar una variable de entorno')
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function adfToMarkdown(node) {
|
|
38
|
+
if (!node) return ''
|
|
39
|
+
if (typeof node === 'string') return node
|
|
40
|
+
if (Array.isArray(node)) return node.map(adfToMarkdown).join('')
|
|
41
|
+
const children = adfToMarkdown(node.content || [])
|
|
42
|
+
switch (node.type) {
|
|
43
|
+
case 'doc': return children.trim()
|
|
44
|
+
case 'text': {
|
|
45
|
+
let value = node.text || ''
|
|
46
|
+
for (const mark of node.marks || []) {
|
|
47
|
+
if (mark.type === 'strong') value = `**${value}**`
|
|
48
|
+
if (mark.type === 'em') value = `_${value}_`
|
|
49
|
+
if (mark.type === 'code') value = `\`${value}\``
|
|
50
|
+
if (mark.type === 'link') value = `[${value}](${mark.attrs && mark.attrs.href})`
|
|
51
|
+
}
|
|
52
|
+
return value
|
|
53
|
+
}
|
|
54
|
+
case 'hardBreak': return '\n'
|
|
55
|
+
case 'paragraph': return `${children}\n\n`
|
|
56
|
+
case 'heading': return `${'#'.repeat(node.attrs && node.attrs.level || 2)} ${children}\n\n`
|
|
57
|
+
case 'bulletList': return `${listItems(node, '-')}\n`
|
|
58
|
+
case 'orderedList': return `${listItems(node, '1.')}\n`
|
|
59
|
+
case 'listItem': return children
|
|
60
|
+
case 'codeBlock': return `\`\`\`${node.attrs && node.attrs.language || ''}\n${children}\n\`\`\`\n\n`
|
|
61
|
+
case 'blockquote': return children.split('\n').filter(Boolean).map((line) => `> ${line}`).join('\n') + '\n\n'
|
|
62
|
+
case 'rule': return '---\n\n'
|
|
63
|
+
case 'mention': return (node.attrs && (node.attrs.text || node.attrs.displayName)) || ''
|
|
64
|
+
case 'inlineCard': return (node.attrs && node.attrs.url) || ''
|
|
65
|
+
default: return children
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function listItems(node, marker) {
|
|
70
|
+
return (node.content || []).map((item, index) => {
|
|
71
|
+
const prefix = marker === '1.' ? `${index + 1}.` : marker
|
|
72
|
+
return `${prefix} ${adfToMarkdown(item).trim().replace(/\n+/g, '\n ')}`
|
|
73
|
+
}).join('\n')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function deriveAcceptance(description, heading = 'Criterios de aceptación') {
|
|
77
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|
78
|
+
const match = String(description || '').match(new RegExp(`^##\\s+(?:\\d+[.)]\\s*)?${escaped}\\s*$`, 'im'))
|
|
79
|
+
if (!match) return ''
|
|
80
|
+
const rest = description.slice(match.index + match[0].length)
|
|
81
|
+
const next = rest.search(/^##\s+/m)
|
|
82
|
+
return (next < 0 ? rest : rest.slice(0, next)).trim()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function normalizeIssue(issue, config) {
|
|
86
|
+
const fields = issue.fields || {}
|
|
87
|
+
const description = typeof fields.description === 'string' ? fields.description : adfToMarkdown(fields.description)
|
|
88
|
+
const item = {
|
|
89
|
+
key: issue.key,
|
|
90
|
+
id: String(issue.id || ''),
|
|
91
|
+
url: `${config.baseUrl}/browse/${issue.key}`,
|
|
92
|
+
type: fields.issuetype && fields.issuetype.name || 'Issue',
|
|
93
|
+
summary: String(fields.summary || '').trim(),
|
|
94
|
+
description: description.trim(),
|
|
95
|
+
acceptance: deriveAcceptance(description, config.acceptanceHeading || 'Criterios de aceptación'),
|
|
96
|
+
status: fields.status && fields.status.name || '',
|
|
97
|
+
assignee: fields.assignee ? {
|
|
98
|
+
accountId: fields.assignee.accountId || '',
|
|
99
|
+
displayName: fields.assignee.displayName || '',
|
|
100
|
+
} : null,
|
|
101
|
+
parent: fields.parent ? fields.parent.key || '' : '',
|
|
102
|
+
components: (fields.components || []).map((value) => value.name).filter(Boolean),
|
|
103
|
+
labels: fields.labels || [],
|
|
104
|
+
updatedAt: fields.updated || '',
|
|
105
|
+
}
|
|
106
|
+
if (!JIRA_KEY.test(item.key)) throw new Error(`Clave Jira inválida: ${item.key}`)
|
|
107
|
+
if (!item.summary) throw new Error(`${item.key}: falta summary`)
|
|
108
|
+
return item
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function normalizeFixture(payload, config) {
|
|
112
|
+
const issues = Array.isArray(payload) ? payload : payload.issues
|
|
113
|
+
if (!Array.isArray(issues)) throw new Error('Fixture Jira debe ser un array o { issues: [] }')
|
|
114
|
+
return issues.map((issue) => normalizeIssue(issue, config))
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function fetchItems(config, options = {}) {
|
|
118
|
+
const fetchImpl = options.fetchImpl || globalThis.fetch
|
|
119
|
+
const timeoutMs = options.timeoutMs || config.timeoutMs || 30_000
|
|
120
|
+
const maxPages = options.maxPages || config.maxPages || 100
|
|
121
|
+
const token = process.env[config.auth.tokenEnv]
|
|
122
|
+
const email = config.auth.emailEnv ? process.env[config.auth.emailEnv] : ''
|
|
123
|
+
if (!token) throw new Error(`Falta la variable ${config.auth.tokenEnv}`)
|
|
124
|
+
if (config.auth.type === 'basic' && !email) throw new Error(`Falta la variable ${config.auth.emailEnv}`)
|
|
125
|
+
const authorization = config.auth.type === 'basic'
|
|
126
|
+
? `Basic ${Buffer.from(`${email}:${token}`).toString('base64')}`
|
|
127
|
+
: `Bearer ${token}`
|
|
128
|
+
const fields = [
|
|
129
|
+
'summary',
|
|
130
|
+
'description',
|
|
131
|
+
'issuetype',
|
|
132
|
+
'status',
|
|
133
|
+
'assignee',
|
|
134
|
+
'parent',
|
|
135
|
+
'components',
|
|
136
|
+
'labels',
|
|
137
|
+
'updated',
|
|
138
|
+
]
|
|
139
|
+
const issues = []
|
|
140
|
+
const tokens = new Set()
|
|
141
|
+
let pages = 0
|
|
142
|
+
let nextPageToken
|
|
143
|
+
do {
|
|
144
|
+
if (++pages > maxPages) throw new Error(`Jira excedió el límite de ${maxPages} páginas`)
|
|
145
|
+
if (nextPageToken && tokens.has(nextPageToken)) {
|
|
146
|
+
throw new Error('Jira devolvió un nextPageToken repetido')
|
|
147
|
+
}
|
|
148
|
+
if (nextPageToken) tokens.add(nextPageToken)
|
|
149
|
+
const response = await fetchImpl(`${config.baseUrl}/rest/api/3/search/jql`, {
|
|
150
|
+
method: 'POST',
|
|
151
|
+
headers: { authorization, accept: 'application/json', 'content-type': 'application/json' },
|
|
152
|
+
body: JSON.stringify({ jql: config.jql, fields, maxResults: config.pageSize || 100, nextPageToken }),
|
|
153
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
154
|
+
})
|
|
155
|
+
if (!response.ok) throw new Error(`Jira respondió HTTP ${response.status}`)
|
|
156
|
+
const page = await response.json()
|
|
157
|
+
issues.push(...(page.issues || []))
|
|
158
|
+
nextPageToken = page.nextPageToken
|
|
159
|
+
if (page.isLast === true) nextPageToken = undefined
|
|
160
|
+
} while (nextPageToken)
|
|
161
|
+
return issues.map((issue) => normalizeIssue(issue, config))
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = { adfToMarkdown, deriveAcceptance, fetchItems, normalizeFixture, normalizeIssue, validateConfig }
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
// Registro y ciclo común de proveedores externos.
|
|
4
|
+
|
|
5
|
+
const fs = require('fs')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const F = require('../core/files')
|
|
8
|
+
const S = require('./state')
|
|
9
|
+
const P = require('./proposals')
|
|
10
|
+
const W = require('./writeback')
|
|
11
|
+
|
|
12
|
+
const STATES = S.STATES
|
|
13
|
+
const sha256 = S.sha256
|
|
14
|
+
|
|
15
|
+
function readJson(file) {
|
|
16
|
+
try { return JSON.parse(fs.readFileSync(file, 'utf8')) } catch (error) {
|
|
17
|
+
throw new Error(`${file}: JSON inválido o ausente (${error.message})`)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function writeJson(file, value) {
|
|
22
|
+
F.atomicWriteJson(file, value)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function safeSegment(value, label) {
|
|
26
|
+
const segment = String(value || '')
|
|
27
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(segment) || segment === '.' || segment === '..') {
|
|
28
|
+
throw new Error(`${label} inválido: ${segment || '(vacío)'}`)
|
|
29
|
+
}
|
|
30
|
+
return segment
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function providerConfig(root, name) {
|
|
34
|
+
safeSegment(name, 'Proveedor')
|
|
35
|
+
const registryFile = path.join(root, 'integrations', 'config.json')
|
|
36
|
+
const registry = readJson(registryFile)
|
|
37
|
+
const entry = (registry.providers || {})[name]
|
|
38
|
+
if (!entry) throw new Error(`Proveedor no registrado: ${name}`)
|
|
39
|
+
const configFile = path.resolve(path.dirname(registryFile), entry.config || `${name}/config.json`)
|
|
40
|
+
F.assertWithin(path.dirname(registryFile), configFile, `${name}: config`)
|
|
41
|
+
return { registry, entry, config: readJson(configFile), configFile }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function adapter(name) {
|
|
45
|
+
if (name === 'jira') return require('./providers/jira')
|
|
46
|
+
throw new Error(`No existe adaptador para ${name}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function sensitivePath(value, trail = '') {
|
|
50
|
+
if (!value || typeof value !== 'object') return ''
|
|
51
|
+
for (const [key, child] of Object.entries(value)) {
|
|
52
|
+
const next = trail ? `${trail}.${key}` : key
|
|
53
|
+
if (/(password|secret|token|authorization|cookie)$/i.test(key) && !/Env$/i.test(key)) return next
|
|
54
|
+
const nested = sensitivePath(child, next)
|
|
55
|
+
if (nested) return nested
|
|
56
|
+
}
|
|
57
|
+
return ''
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const frontmatter = S.frontmatter
|
|
61
|
+
const replaceField = S.replaceField
|
|
62
|
+
const draftSections = S.sections
|
|
63
|
+
const renderDraft = S.renderDraft
|
|
64
|
+
const stagingItems = S.readStaging
|
|
65
|
+
function validate(root, onlyProvider = '') {
|
|
66
|
+
const registryFile = path.join(root, 'integrations', 'config.json')
|
|
67
|
+
const errors = []
|
|
68
|
+
const warnings = []
|
|
69
|
+
let registry
|
|
70
|
+
try { registry = readJson(registryFile) } catch (error) { return { errors: [error.message], warnings } }
|
|
71
|
+
const providers = Object.entries(registry.providers || {}).filter(([name]) => !onlyProvider || name === onlyProvider)
|
|
72
|
+
let workspaces = []
|
|
73
|
+
try {
|
|
74
|
+
const ops = readJson(path.join(root, 'ops.config.json'))
|
|
75
|
+
workspaces = (ops.workspaceRoots || []).map((workspace) => ({
|
|
76
|
+
...workspace,
|
|
77
|
+
resolved: path.resolve(root, workspace.path),
|
|
78
|
+
}))
|
|
79
|
+
} catch (error) {
|
|
80
|
+
errors.push(error.message)
|
|
81
|
+
}
|
|
82
|
+
if (!providers.length && onlyProvider) errors.push(`Proveedor no registrado: ${onlyProvider}`)
|
|
83
|
+
for (const [name, entry] of providers) {
|
|
84
|
+
if (!entry.adapter) errors.push(`${name}: falta adapter`)
|
|
85
|
+
let loaded
|
|
86
|
+
try { loaded = providerConfig(root, name) } catch (error) { errors.push(error.message); continue }
|
|
87
|
+
const secret = sensitivePath(loaded.config)
|
|
88
|
+
if (secret) errors.push(`${name}: ${secret} no puede contener secretos; usa una variable de entorno`)
|
|
89
|
+
try {
|
|
90
|
+
adapter(name).validateConfig(loaded.config, errors, warnings)
|
|
91
|
+
} catch (error) {
|
|
92
|
+
errors.push(`${name}: ${error.message}`)
|
|
93
|
+
}
|
|
94
|
+
const stagedKeys = new Map()
|
|
95
|
+
for (const staged of stagingItems(root, name)) {
|
|
96
|
+
const at = `integrations/${name}/staging/${staged.category}/${staged.key}`
|
|
97
|
+
if (stagedKeys.has(staged.key)) {
|
|
98
|
+
errors.push(`${at}: clave duplicada; también existe en ${stagedKeys.get(staged.key)}`)
|
|
99
|
+
} else {
|
|
100
|
+
stagedKeys.set(staged.key, at)
|
|
101
|
+
}
|
|
102
|
+
let snapshot
|
|
103
|
+
let draft
|
|
104
|
+
try {
|
|
105
|
+
snapshot = readJson(path.join(staged.dir, 'remote.json'))
|
|
106
|
+
} catch (error) {
|
|
107
|
+
errors.push(error.message)
|
|
108
|
+
continue
|
|
109
|
+
}
|
|
110
|
+
try { draft = fs.readFileSync(path.join(staged.dir, 'draft.md'), 'utf8') } catch (error) {
|
|
111
|
+
errors.push(`${at}: falta draft.md`); continue
|
|
112
|
+
}
|
|
113
|
+
const fields = frontmatter(draft)
|
|
114
|
+
if (snapshot.schemaVersion !== 2 || snapshot.provider !== name) {
|
|
115
|
+
errors.push(`${at}: schema/provider inválido`)
|
|
116
|
+
}
|
|
117
|
+
if (snapshot.item.key !== staged.key || fields.remote !== staged.key) {
|
|
118
|
+
errors.push(`${at}: identidad remota inconsistente`)
|
|
119
|
+
}
|
|
120
|
+
if (!STATES.includes(fields.state)) errors.push(`${at}: state inválido ${fields.state || '(vacío)'}`)
|
|
121
|
+
if (!['candidate', 'context'].includes(snapshot.sync.role)) {
|
|
122
|
+
errors.push(`${at}: sync.role inválido`)
|
|
123
|
+
}
|
|
124
|
+
if (!snapshot.sync.base || !snapshot.sync.baseAt) {
|
|
125
|
+
errors.push(`${at}: falta la base remota reconciliada`)
|
|
126
|
+
}
|
|
127
|
+
if (typeof snapshot.sync.missingFromRemote !== 'boolean') {
|
|
128
|
+
errors.push(`${at}: missingFromRemote debe ser boolean`)
|
|
129
|
+
}
|
|
130
|
+
const actualDraftChanged = sha256(draft) !== snapshot.sync.draftBaseHash
|
|
131
|
+
if (snapshot.sync.draftBaseHash && snapshot.sync.draftChanged !== actualDraftChanged) {
|
|
132
|
+
errors.push(`${at}: draftChanged no coincide con el contenido real`)
|
|
133
|
+
}
|
|
134
|
+
const signals = S.derive(snapshot, draft)
|
|
135
|
+
if (snapshot.sync.role === 'context' && fields.state !== 'context') {
|
|
136
|
+
errors.push(`${at}: context exige state=context`)
|
|
137
|
+
}
|
|
138
|
+
if (snapshot.sync.role === 'context' && signals.outgoing.length) {
|
|
139
|
+
errors.push(`${at}: un contexto no puede contener curación local`)
|
|
140
|
+
}
|
|
141
|
+
if (snapshot.sync.missingFromRemote && fields.state === 'ready') {
|
|
142
|
+
errors.push(`${at}: un item ausente del remoto no puede estar ready`)
|
|
143
|
+
}
|
|
144
|
+
if (fields.state === 'promoted' && signals.diverged) {
|
|
145
|
+
warnings.push(`${at}: el remoto cambió después de la promoción`)
|
|
146
|
+
}
|
|
147
|
+
if (fields.state === 'ready') {
|
|
148
|
+
const sections = draftSections(draft)
|
|
149
|
+
if (!fields.service) errors.push(`${at}: ready exige service`)
|
|
150
|
+
else if (!workspaces.some((workspace) => fs.existsSync(path.join(workspace.resolved, fields.service)))) {
|
|
151
|
+
errors.push(`${at}: service ${fields.service} no existe en las raíces configuradas`)
|
|
152
|
+
}
|
|
153
|
+
if (!['epic', 'story'].includes(fields.promotionKind)) {
|
|
154
|
+
errors.push(`${at}: ready exige promotionKind epic|story`)
|
|
155
|
+
}
|
|
156
|
+
if (fields.promotionKind === 'story' && (!/^\d{3}$/.test(fields.promotionEpic) || !fields.promotionCriteria)) {
|
|
157
|
+
errors.push(`${at}: story exige promotionEpic NNN y promotionCriteria`)
|
|
158
|
+
}
|
|
159
|
+
if (!sections.Aceptación || /^(por definir|n\/a|pendiente)\.?$/i.test(sections.Aceptación)) {
|
|
160
|
+
errors.push(`${at}: ready exige aceptación concreta`)
|
|
161
|
+
}
|
|
162
|
+
if (signals.incoming.length) {
|
|
163
|
+
errors.push(`${at}: ready tiene cambios remotos sin reconciliar`)
|
|
164
|
+
}
|
|
165
|
+
if (signals.conflict.length) {
|
|
166
|
+
errors.push(`${at}: ready tiene conflicto en ${signals.conflict.join(', ')}`)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
errors.push(...P.validate(root, name, workspaces))
|
|
171
|
+
}
|
|
172
|
+
return { errors, warnings }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async function sync(root, name, options = {}) {
|
|
176
|
+
const { entry, config } = providerConfig(root, name)
|
|
177
|
+
if (!entry.enabled || !config.enabled) throw new Error(`${name} está deshabilitado`)
|
|
178
|
+
const provider = adapter(name)
|
|
179
|
+
const items = options.fixture
|
|
180
|
+
? provider.normalizeFixture(readJson(path.resolve(options.fixture)), config)
|
|
181
|
+
: await provider.fetchItems(config)
|
|
182
|
+
const staging = path.join(root, 'integrations', name, 'staging')
|
|
183
|
+
fs.mkdirSync(staging, { recursive: true })
|
|
184
|
+
const existing = new Map(stagingItems(root, name).map((item) => [item.key, item]))
|
|
185
|
+
const seen = new Set()
|
|
186
|
+
const result = { created: 0, refreshed: 0, preserved: 0, removed: 0, missing: 0 }
|
|
187
|
+
for (const item of items) {
|
|
188
|
+
const itemKey = safeSegment(item.key, `${name}: item.key`)
|
|
189
|
+
if (seen.has(itemKey)) throw new Error(`${name}: item duplicado ${itemKey}`)
|
|
190
|
+
const category = S.categoryOf(item)
|
|
191
|
+
const desiredDir = path.join(staging, category, itemKey)
|
|
192
|
+
const found = existing.get(itemKey)
|
|
193
|
+
if (found && found.dir !== desiredDir) {
|
|
194
|
+
fs.mkdirSync(path.dirname(desiredDir), { recursive: true })
|
|
195
|
+
fs.renameSync(found.dir, desiredDir)
|
|
196
|
+
}
|
|
197
|
+
seen.add(itemKey)
|
|
198
|
+
const snapshotFile = path.join(desiredDir, 'remote.json')
|
|
199
|
+
const draftFile = path.join(desiredDir, 'draft.md')
|
|
200
|
+
const previous = fs.existsSync(snapshotFile) ? readJson(snapshotFile) : null
|
|
201
|
+
const previousDraft = fs.existsSync(draftFile) ? fs.readFileSync(draftFile, 'utf8') : ''
|
|
202
|
+
const role = S.roleOf(item, config)
|
|
203
|
+
const state = role === 'context' ? 'context' : 'pending'
|
|
204
|
+
let draft
|
|
205
|
+
let base
|
|
206
|
+
let baseAt
|
|
207
|
+
if (!previous) {
|
|
208
|
+
draft = renderDraft(item, config, state)
|
|
209
|
+
base = S.remoteView(item)
|
|
210
|
+
baseAt = new Date().toISOString()
|
|
211
|
+
result.created++
|
|
212
|
+
} else {
|
|
213
|
+
const signals = S.derive({ ...previous, item }, previousDraft)
|
|
214
|
+
const locallyChanged = sha256(previousDraft) !== previous.sync.draftBaseHash
|
|
215
|
+
const regenerate = role === 'context' || !locallyChanged
|
|
216
|
+
if (regenerate) {
|
|
217
|
+
draft = renderDraft(item, config, state)
|
|
218
|
+
base = S.remoteView(item)
|
|
219
|
+
baseAt = new Date().toISOString()
|
|
220
|
+
result.refreshed++
|
|
221
|
+
} else {
|
|
222
|
+
draft = previousDraft
|
|
223
|
+
if (signals.incoming.length && frontmatter(draft).state === 'ready') {
|
|
224
|
+
draft = replaceField(draft, 'state', 'pending')
|
|
225
|
+
}
|
|
226
|
+
base = previous.sync.base || S.remoteView(previous.item)
|
|
227
|
+
baseAt = previous.sync.baseAt || previous.sync.pulledAt
|
|
228
|
+
result.preserved++
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const canonical = renderDraft(item, config, state)
|
|
232
|
+
const snapshot = {
|
|
233
|
+
schemaVersion: 2,
|
|
234
|
+
provider: name,
|
|
235
|
+
item,
|
|
236
|
+
sync: {
|
|
237
|
+
role,
|
|
238
|
+
pulledAt: new Date().toISOString(),
|
|
239
|
+
missingFromRemote: false,
|
|
240
|
+
base,
|
|
241
|
+
baseAt,
|
|
242
|
+
draftBaseHash: sha256(canonical),
|
|
243
|
+
draftChanged: sha256(draft) !== sha256(canonical),
|
|
244
|
+
config: { serviceFrom: config.serviceFrom },
|
|
245
|
+
},
|
|
246
|
+
}
|
|
247
|
+
fs.mkdirSync(desiredDir, { recursive: true })
|
|
248
|
+
F.atomicWrite(draftFile, draft)
|
|
249
|
+
writeJson(snapshotFile, snapshot)
|
|
250
|
+
}
|
|
251
|
+
const complete = options.complete !== false
|
|
252
|
+
if (complete) cleanupMissing(root, name, seen, result)
|
|
253
|
+
writeJson(path.join(staging, 'sync-state.json'), {
|
|
254
|
+
schemaVersion: 2,
|
|
255
|
+
provider: name,
|
|
256
|
+
complete,
|
|
257
|
+
pulledAt: new Date().toISOString(),
|
|
258
|
+
keys: [...seen].sort(),
|
|
259
|
+
})
|
|
260
|
+
return { ...result, total: items.length }
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function cleanupMissing(root, name, seen, result) {
|
|
264
|
+
for (const staged of stagingItems(root, name)) {
|
|
265
|
+
if (seen.has(staged.key)) continue
|
|
266
|
+
const snapshotFile = path.join(staged.dir, 'remote.json')
|
|
267
|
+
const draftFile = path.join(staged.dir, 'draft.md')
|
|
268
|
+
const snapshot = readJson(snapshotFile)
|
|
269
|
+
const draft = fs.readFileSync(draftFile, 'utf8')
|
|
270
|
+
const state = frontmatter(draft).state
|
|
271
|
+
const curated = sha256(draft) !== snapshot.sync.draftBaseHash
|
|
272
|
+
if (!curated && !['promoted', 'ready'].includes(state)) {
|
|
273
|
+
F.assertWithin(path.join(root, 'integrations', name, 'staging'), staged.dir)
|
|
274
|
+
fs.rmSync(staged.dir, { recursive: true })
|
|
275
|
+
result.removed++
|
|
276
|
+
continue
|
|
277
|
+
}
|
|
278
|
+
snapshot.sync.missingFromRemote = true
|
|
279
|
+
writeJson(snapshotFile, snapshot)
|
|
280
|
+
result.missing++
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function promote(root, name, key) {
|
|
285
|
+
safeSegment(name, 'Proveedor')
|
|
286
|
+
safeSegment(key, `${name}: clave remota`)
|
|
287
|
+
const validation = validate(root, name)
|
|
288
|
+
if (validation.errors.length) {
|
|
289
|
+
throw new Error(`La integración no está lista:\n- ${validation.errors.join('\n- ')}`)
|
|
290
|
+
}
|
|
291
|
+
const matches = stagingItems(root, name).filter((item) => item.key === key)
|
|
292
|
+
if (matches.length !== 1) throw new Error(`${key}: no se resolvió un item único en staging`)
|
|
293
|
+
const dir = matches[0].dir
|
|
294
|
+
const snapshot = readJson(path.join(dir, 'remote.json'))
|
|
295
|
+
const draftFile = path.join(dir, 'draft.md')
|
|
296
|
+
let draft = fs.readFileSync(draftFile, 'utf8')
|
|
297
|
+
const fields = frontmatter(draft)
|
|
298
|
+
if (fields.state !== 'ready') throw new Error(`${key}: state debe ser ready`)
|
|
299
|
+
const sections = draftSections(draft)
|
|
300
|
+
const planning = path.join(root, 'planning')
|
|
301
|
+
const roadmap = path.join(planning, 'roadmap')
|
|
302
|
+
if (fields.promotionKind === 'epic') {
|
|
303
|
+
const roadmapFiles = fs.readdirSync(roadmap).filter((file) => /^epic-\d{3}-/.test(file))
|
|
304
|
+
const recovered = roadmapFiles.find((file) => {
|
|
305
|
+
const content = fs.readFileSync(path.join(roadmap, file), 'utf8')
|
|
306
|
+
return content.includes(`source: ${name}`) && content.includes(`remote: ${key}`)
|
|
307
|
+
})
|
|
308
|
+
const existing = roadmapFiles
|
|
309
|
+
.map((file) => (file.match(/^epic-(\d{3})-/) || [])[1])
|
|
310
|
+
.filter(Boolean)
|
|
311
|
+
const next = String(Math.max(0, ...existing.map(Number)) + 1).padStart(3, '0')
|
|
312
|
+
const recoveredNum = recovered && (recovered.match(/^epic-(\d{3})-/) || [])[1]
|
|
313
|
+
const num = recoveredNum || fields.promotionEpic || next
|
|
314
|
+
const slug = slugify(sections.title)
|
|
315
|
+
const target = path.join(roadmap, recovered || `epic-${num}-${slug}.md`)
|
|
316
|
+
const content = `---\nepic: ${num}\ntitle: ${sections.title}\nstatus: open\n` +
|
|
317
|
+
`service: ${fields.service}\nsource: ${name}\nremote: ${key}\n---\n\n` +
|
|
318
|
+
`# Épica ${num} — ${sections.title}\n\n## Resultado\n\n${sections.Descripción}\n\n` +
|
|
319
|
+
`## Criterios\n\n- **C1** — ${oneLine(sections.Aceptación)}\n\n` +
|
|
320
|
+
`## Contexto relevante\n\n- Importado desde ${name}:${key}; validar rutas del servicio antes de activar.\n\n` +
|
|
321
|
+
`## Historias\n\n- [ ] **${slug}** (→ C1) — ${oneLine(sections.title)}. ` +
|
|
322
|
+
`(service: ${fields.service})\n`
|
|
323
|
+
if (fs.existsSync(target)) {
|
|
324
|
+
const existingContent = fs.readFileSync(target, 'utf8')
|
|
325
|
+
if (!existingContent.includes(`remote: ${key}`) || !existingContent.includes(`source: ${name}`)) {
|
|
326
|
+
throw new Error(`Ya existe ${target}`)
|
|
327
|
+
}
|
|
328
|
+
} else {
|
|
329
|
+
F.atomicWrite(target, content)
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
const files = fs.readdirSync(roadmap).filter((file) => file.startsWith(`epic-${fields.promotionEpic}-`))
|
|
333
|
+
if (files.length !== 1) throw new Error(`${key}: no se resolvió epic-${fields.promotionEpic}`)
|
|
334
|
+
const target = path.join(roadmap, files[0])
|
|
335
|
+
let spec = fs.readFileSync(target, 'utf8')
|
|
336
|
+
if (!new RegExp(`\\*\\*${fields.promotionCriteria}\\*\\*`).test(spec)) {
|
|
337
|
+
throw new Error(`${key}: no existe ${fields.promotionCriteria}`)
|
|
338
|
+
}
|
|
339
|
+
const slug = `${name}-${key.toLowerCase()}-${slugify(sections.title)}`
|
|
340
|
+
const line = `- [ ] **${slug}** (→ ${fields.promotionCriteria}) — ` +
|
|
341
|
+
`${oneLine(sections.title)}. _Aceptación: ${oneLine(sections.Aceptación)}_ ` +
|
|
342
|
+
`(service: ${fields.service}) (remote: ${name}:${key})`
|
|
343
|
+
if (!spec.includes(`**${slug}**`)) {
|
|
344
|
+
const stories = spec.match(/^## Historias\s*$/m)
|
|
345
|
+
if (!stories) throw new Error(`${key}: epic-${fields.promotionEpic} no tiene sección Historias`)
|
|
346
|
+
const afterHeading = stories.index + stories[0].length
|
|
347
|
+
const nextHeadingOffset = spec.slice(afterHeading).search(/^##\s+/m)
|
|
348
|
+
const insertAt = nextHeadingOffset < 0 ? spec.length : afterHeading + nextHeadingOffset
|
|
349
|
+
const before = spec.slice(0, insertAt).trimEnd()
|
|
350
|
+
const after = spec.slice(insertAt).replace(/^\s+/, '')
|
|
351
|
+
spec = `${before}\n\n${line}\n\n${after}`.trimEnd() + '\n'
|
|
352
|
+
F.atomicWrite(target, spec)
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
draft = replaceField(draft, 'state', 'promoted')
|
|
356
|
+
draft = replaceField(draft, 'promotedAt', `"${new Date().toISOString()}"`)
|
|
357
|
+
F.atomicWrite(draftFile, draft)
|
|
358
|
+
snapshot.sync.draftChanged = true
|
|
359
|
+
writeJson(path.join(dir, 'remote.json'), snapshot)
|
|
360
|
+
return { key, kind: fields.promotionKind }
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function reconcile(root, name, operation, keys) {
|
|
364
|
+
providerConfig(root, name)
|
|
365
|
+
return S.reconcile(root, name, operation, keys)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function writebackPlan(root, name) {
|
|
369
|
+
const { config } = providerConfig(root, name)
|
|
370
|
+
return W.summarize(W.plan(root, name, config))
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const slugify = (value) => String(value).normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase()
|
|
374
|
+
.replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 70)
|
|
375
|
+
const oneLine = (value) => String(value).replace(/\s+/g, ' ').trim()
|
|
376
|
+
|
|
377
|
+
module.exports = {
|
|
378
|
+
STATES,
|
|
379
|
+
adapter,
|
|
380
|
+
draftSections,
|
|
381
|
+
frontmatter,
|
|
382
|
+
promote,
|
|
383
|
+
providerConfig,
|
|
384
|
+
reconcile,
|
|
385
|
+
safeSegment,
|
|
386
|
+
stagingItems,
|
|
387
|
+
sync,
|
|
388
|
+
validate,
|
|
389
|
+
writebackPlan,
|
|
390
|
+
}
|