@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,55 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs')
|
|
4
|
+
const path = require('node:path')
|
|
5
|
+
|
|
6
|
+
function isWithin(base, target) {
|
|
7
|
+
const relative = path.relative(path.resolve(base), path.resolve(target))
|
|
8
|
+
return relative === '' || relative !== '..' && !relative.startsWith(`..${path.sep}`)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function assertWithin(base, target, label = 'ruta') {
|
|
12
|
+
if (!isWithin(base, target)) throw new Error(`${label} fuera de la raíz permitida: ${target}`)
|
|
13
|
+
return path.resolve(target)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function assertNoSymlinkPath(base, target) {
|
|
17
|
+
const resolvedBase = path.resolve(base)
|
|
18
|
+
const resolvedTarget = assertWithin(resolvedBase, target)
|
|
19
|
+
const relative = path.relative(resolvedBase, resolvedTarget)
|
|
20
|
+
let current = resolvedBase
|
|
21
|
+
for (const segment of relative.split(path.sep).filter(Boolean)) {
|
|
22
|
+
current = path.join(current, segment)
|
|
23
|
+
if (!fs.existsSync(current)) break
|
|
24
|
+
if (fs.lstatSync(current).isSymbolicLink()) {
|
|
25
|
+
throw new Error(`La ruta destino contiene un symlink: ${current}`)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function atomicWrite(file, content) {
|
|
31
|
+
const dir = path.dirname(file)
|
|
32
|
+
fs.mkdirSync(dir, { recursive: true })
|
|
33
|
+
const temporary = path.join(
|
|
34
|
+
dir,
|
|
35
|
+
`.${path.basename(file)}.${process.pid}.${Date.now()}.tmp`,
|
|
36
|
+
)
|
|
37
|
+
try {
|
|
38
|
+
fs.writeFileSync(temporary, content)
|
|
39
|
+
fs.renameSync(temporary, file)
|
|
40
|
+
} finally {
|
|
41
|
+
try { fs.unlinkSync(temporary) } catch { /* renamed or never created */ }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function atomicWriteJson(file, value) {
|
|
46
|
+
atomicWrite(file, `${JSON.stringify(value, null, 2)}\n`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = {
|
|
50
|
+
assertNoSymlinkPath,
|
|
51
|
+
assertWithin,
|
|
52
|
+
atomicWrite,
|
|
53
|
+
atomicWriteJson,
|
|
54
|
+
isWithin,
|
|
55
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict'
|
|
3
|
+
|
|
4
|
+
const fs = require('fs')
|
|
5
|
+
const os = require('os')
|
|
6
|
+
const path = require('path')
|
|
7
|
+
const { spawnSync } = require('child_process')
|
|
8
|
+
|
|
9
|
+
function readInput() {
|
|
10
|
+
let raw = ''
|
|
11
|
+
try { raw = fs.readFileSync(0, 'utf8') } catch { /* no stdin */ }
|
|
12
|
+
try { return raw.trim() ? JSON.parse(raw) : {} } catch { return {} }
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function commandOf(input) {
|
|
16
|
+
const value = input.tool_input && (input.tool_input.command || input.tool_input.cmd)
|
|
17
|
+
|| input.command || input.input && input.input.command || process.env.OPS_HOOK_COMMAND || ''
|
|
18
|
+
return Array.isArray(value) ? value.join(' ') : String(value)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function fileOf(input) {
|
|
22
|
+
return String(input.tool_input && (input.tool_input.file_path || input.tool_input.path)
|
|
23
|
+
|| input.file_path || input.path || process.env.OPS_HOOK_FILE || '')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function filesOf(input) {
|
|
27
|
+
const files = new Set()
|
|
28
|
+
const direct = fileOf(input)
|
|
29
|
+
if (direct) files.add(direct)
|
|
30
|
+
const patch = String(input.tool_input && (input.tool_input.patch || input.tool_input.input)
|
|
31
|
+
|| input.patch || '')
|
|
32
|
+
for (const match of patch.matchAll(/^\*\*\* (?:Add|Update|Delete) File:\s*(.+)$/gm)) files.add(match[1].trim())
|
|
33
|
+
return [...files]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function contentOf(input) {
|
|
37
|
+
return String(input.tool_input && (
|
|
38
|
+
input.tool_input.content
|
|
39
|
+
|| input.tool_input.new_string
|
|
40
|
+
|| input.tool_input.patch
|
|
41
|
+
|| input.tool_input.input
|
|
42
|
+
)
|
|
43
|
+
|| input.content || input.patch || '')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function cwdOf(input) {
|
|
47
|
+
const cwd = input.cwd || input.tool_input && input.tool_input.cwd
|
|
48
|
+
|| process.env.OPS_ROOT || process.cwd()
|
|
49
|
+
return path.resolve(String(cwd))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function block(message) {
|
|
53
|
+
const error = new Error(message)
|
|
54
|
+
error.blocked = true
|
|
55
|
+
throw error
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function gitDirectory(command, cwd) {
|
|
59
|
+
const flag = command.match(/(?:^|\s)git\s+-C\s+(['"]?)([^\s'";&|]+)\1/)
|
|
60
|
+
const cd = command.match(/(?:^|[;&|]\s*)cd\s+(['"]?)([^\s'";&|]+)\1/)
|
|
61
|
+
return path.resolve(cwd, flag ? flag[2] : cd ? cd[2] : '.')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isCommit(command) {
|
|
65
|
+
return /(?:^|[;&|]\s*)git(?:\s+-C\s+\S+)?\s+commit(?:\s|$)/.test(command)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function stagedFiles(dir) {
|
|
69
|
+
const result = spawnSync('git', ['-C', dir, 'diff', '--cached', '--name-only'], { encoding: 'utf8' })
|
|
70
|
+
return result.status === 0 ? result.stdout.trim().split('\n').filter(Boolean) : []
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function destructive(input) {
|
|
74
|
+
const command = commandOf(input)
|
|
75
|
+
const rules = [
|
|
76
|
+
[/\bgit\s+push\b/, "'git push' publica cambios y requiere una acción humana."],
|
|
77
|
+
[/\bgit\s+reset\s+--hard\b/, "'git reset --hard' destruye cambios locales."],
|
|
78
|
+
[/\bgit\s+clean\s+-[^\s]*f/, "'git clean -f' borra archivos sin seguimiento."],
|
|
79
|
+
[
|
|
80
|
+
/\bdocker(?:\s+\w+)*\s+(?:volume\s+(?:rm|prune)|system\s+prune|network\s+prune)\b/,
|
|
81
|
+
'La limpieza global de Docker puede borrar datos compartidos.',
|
|
82
|
+
],
|
|
83
|
+
[
|
|
84
|
+
/\bdocker(?:\s+compose|-compose)\s+(?:\S+\s+)*(?:down|stop|kill|rm)\b/,
|
|
85
|
+
'Detener un stack Compose puede interrumpir servicios compartidos.',
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
/(?:^|\s)(?:mkfs\S*|shred)\s|\bdd\s+[^;&|]*\bof=\/dev\/|>\s*\/dev\/(?:sd|nvme|disk)/,
|
|
89
|
+
'Operación destructiva sobre disco o dispositivo.',
|
|
90
|
+
],
|
|
91
|
+
[
|
|
92
|
+
/\brm\s+(?:-[^\s]*r[^\s]*\s+)+(?:\/\*?|~\/?|\$HOME|\.\.)(?:\s|$)/,
|
|
93
|
+
"'rm -r' sobre /, home o el directorio padre es catastrófico.",
|
|
94
|
+
],
|
|
95
|
+
]
|
|
96
|
+
for (const [pattern, message] of rules) if (pattern.test(command)) block(message)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function gitAdd(input) {
|
|
100
|
+
const command = commandOf(input)
|
|
101
|
+
if (/\bgit\s+add\s+(?:[^;&|]*\s)?(?:-A\b|--all\b|\.)(?:\s|$|[;&|])/.test(command)) {
|
|
102
|
+
block("'git add -A/--all/.' está prohibido. Stagea rutas explícitas.")
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function secrets(input) {
|
|
107
|
+
for (const file of filesOf(input)) {
|
|
108
|
+
const base = path.basename(file)
|
|
109
|
+
if (/^(?:\.env|\.env\..+)$/.test(base) && !/\.(?:example|sample|template|schema|dist|tpl)$/.test(base)) {
|
|
110
|
+
block(`${file} parece contener secretos. Edita una plantilla o registra una acción humana.`)
|
|
111
|
+
}
|
|
112
|
+
if (/^(?:accesos\.md|credenciales.*|credentials.*\.json|.*service-account.*\.json|.*\.(?:pem|key))$/i.test(base)) {
|
|
113
|
+
block(`${file} parece un archivo de credenciales en texto plano.`)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function integrationSnapshot(input) {
|
|
119
|
+
for (const raw of filesOf(input)) {
|
|
120
|
+
const file = raw.replace(/\\/g, '/')
|
|
121
|
+
if (/(?:^|\/)integrations\/[^/]+\/staging\/(?:.+\/remote\.json|sync-state\.json)$/.test(file)) {
|
|
122
|
+
block(`${file} pertenece al sincronizador. Cura draft.md; no edites snapshots a mano.`)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function generated(input) {
|
|
128
|
+
for (const raw of filesOf(input)) {
|
|
129
|
+
const file = raw.replace(/\\/g, '/')
|
|
130
|
+
const base = path.basename(file)
|
|
131
|
+
if (/(?:^|[._-])generated\.[^.]+$/i.test(base) || /(?:^|[._-])gen\.(?:go|ts|js|py)$/i.test(base)) {
|
|
132
|
+
block(`${file} parece código generado. Modifica su fuente y ejecuta el generador; no lo edites a mano.`)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function workspaceBoundary(input) {
|
|
138
|
+
const root = findOpsRoot(process.env.OPS_ROOT || process.env.CLAUDE_PROJECT_DIR || cwdOf(input))
|
|
139
|
+
if (!root) return
|
|
140
|
+
let config
|
|
141
|
+
try { config = JSON.parse(fs.readFileSync(path.join(root, 'ops.config.json'), 'utf8')) } catch { return }
|
|
142
|
+
const allowed = [root, ...(config.workspaceRoots || []).map((entry) => path.resolve(root, entry.path))]
|
|
143
|
+
for (const raw of filesOf(input)) {
|
|
144
|
+
const file = path.resolve(cwdOf(input), raw)
|
|
145
|
+
if (!allowed.some((base) => file === base || file.startsWith(`${base}${path.sep}`))) {
|
|
146
|
+
block(`${file} está fuera de las raíces declaradas en ops.config.json.`)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function migrations(input) {
|
|
152
|
+
if (process.env.OPS_MIGRATIONS_OVERRIDE === '1') return
|
|
153
|
+
const destructiveSql = new RegExp(
|
|
154
|
+
String.raw`\b(?:drop\s+(?:table|database|schema)|truncate\s+(?:table\s+)?` +
|
|
155
|
+
String.raw`|delete\s+from\s+\S+\s*(?:;|$))\b`,
|
|
156
|
+
'i',
|
|
157
|
+
)
|
|
158
|
+
if (destructiveSql.test(contentOf(input))) {
|
|
159
|
+
block('La migración contiene SQL destructivo. Requiere revisión y OPS_MIGRATIONS_OVERRIDE=1.')
|
|
160
|
+
}
|
|
161
|
+
for (const raw of filesOf(input)) {
|
|
162
|
+
const normalized = raw.replace(/\\/g, '/')
|
|
163
|
+
if (!/(?:^|\/)(?:migrations?|migrate)\/.*\.sql$/i.test(normalized)) continue
|
|
164
|
+
const file = path.resolve(cwdOf(input), raw)
|
|
165
|
+
if (fs.existsSync(file)) {
|
|
166
|
+
block(`${raw} es una migración existente. Crea una nueva en vez de reescribir historial.`)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function dependencies(input) {
|
|
172
|
+
if (process.env.OPS_DEPENDENCIES_OVERRIDE === '1') return
|
|
173
|
+
const command = commandOf(input)
|
|
174
|
+
const unsafePackageCommand = /\b(?:npm|pnpm|yarn|bun)\s+publish\b/.test(command)
|
|
175
|
+
|| /\b(?:npm|pnpm|yarn)\s+(?:install|add)\b[^;&|]*(?:\s-g\b|\s--global\b)/.test(command)
|
|
176
|
+
if (unsafePackageCommand) {
|
|
177
|
+
block('Publicar paquetes o instalar dependencias globales requiere una acción humana explícita.')
|
|
178
|
+
}
|
|
179
|
+
if (!isCommit(command)) return
|
|
180
|
+
const dir = gitDirectory(command, cwdOf(input))
|
|
181
|
+
const staged = stagedFiles(dir)
|
|
182
|
+
const manifests = new Set(['package.json', 'pyproject.toml', 'requirements.txt', 'go.mod', 'Cargo.toml'])
|
|
183
|
+
const locks = new Set([
|
|
184
|
+
'package-lock.json',
|
|
185
|
+
'pnpm-lock.yaml',
|
|
186
|
+
'yarn.lock',
|
|
187
|
+
'bun.lock',
|
|
188
|
+
'bun.lockb',
|
|
189
|
+
'poetry.lock',
|
|
190
|
+
'uv.lock',
|
|
191
|
+
'go.sum',
|
|
192
|
+
'Cargo.lock',
|
|
193
|
+
])
|
|
194
|
+
const byDir = new Map()
|
|
195
|
+
for (const file of staged) {
|
|
196
|
+
const base = path.basename(file)
|
|
197
|
+
if (!manifests.has(base) && !locks.has(base)) continue
|
|
198
|
+
const parent = path.dirname(file)
|
|
199
|
+
const state = byDir.get(parent) || { manifests: [], locks: [] }
|
|
200
|
+
state[manifests.has(base) ? 'manifests' : 'locks'].push(base)
|
|
201
|
+
byDir.set(parent, state)
|
|
202
|
+
}
|
|
203
|
+
for (const [parent, state] of byDir) {
|
|
204
|
+
const existingLocks = [...locks].filter((name) => fs.existsSync(path.join(dir, parent, name)))
|
|
205
|
+
if (existingLocks.length > 1) {
|
|
206
|
+
block(`${parent}: hay varios lockfiles (${existingLocks.join(', ')}). Conserva uno solo.`)
|
|
207
|
+
}
|
|
208
|
+
if (state.manifests.length && existingLocks.length && !state.locks.length) {
|
|
209
|
+
block(`${parent}: cambió ${state.manifests.join(', ')} sin actualizar su lockfile.`)
|
|
210
|
+
}
|
|
211
|
+
if (state.locks.length && !state.manifests.length) {
|
|
212
|
+
block(`${parent}: cambió ${state.locks.join(', ')} sin un cambio explícito en el manifest.`)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function governance(input) {
|
|
218
|
+
if (process.env.OPS_GOVERNANCE_OVERRIDE === '1') return
|
|
219
|
+
const command = commandOf(input)
|
|
220
|
+
if (!isCommit(command)) return
|
|
221
|
+
const dir = gitDirectory(command, cwdOf(input))
|
|
222
|
+
const governedPattern = new RegExp(
|
|
223
|
+
String.raw`^(?:(?:template\/)?planning\/(?:rules\/|adr\/|PROTOCOL\.md|` +
|
|
224
|
+
String.raw`METHODOLOGY\.md|FLOW\.md)|automatization\/|engine\/)`,
|
|
225
|
+
)
|
|
226
|
+
const governed = stagedFiles(dir).filter((file) => governedPattern.test(file))
|
|
227
|
+
if (governed.length) {
|
|
228
|
+
const files = governed.map((file) => ` - ${file}`).join('\n')
|
|
229
|
+
block(`El commit toca gobernanza protegida:\n${files}\n` +
|
|
230
|
+
'Usa OPS_GOVERNANCE_OVERRIDE=1 solo con aprobación.')
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function run(program, args, cwd) {
|
|
235
|
+
const env = { ...process.env }
|
|
236
|
+
delete env.NODE_TEST_CONTEXT
|
|
237
|
+
const result = spawnSync(program, args, { cwd, encoding: 'utf8', stdio: 'pipe', env })
|
|
238
|
+
return {
|
|
239
|
+
ok: result.status === 0,
|
|
240
|
+
status: result.status,
|
|
241
|
+
output: `${result.stdout || ''}${result.stderr || ''}`.trim(),
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function verify(input) {
|
|
246
|
+
if (process.env.OPS_SKIP_VERIFY === '1') return
|
|
247
|
+
const command = commandOf(input)
|
|
248
|
+
if (!isCommit(command)) return
|
|
249
|
+
const dir = gitDirectory(command, cwdOf(input))
|
|
250
|
+
const staged = stagedFiles(dir)
|
|
251
|
+
const changedOpenApi = staged.some((file) => /^(?:openapi|api|spec)(?:\/.*)?\/[^/]+\.ya?ml$/i.test(file))
|
|
252
|
+
|| staged.some((file) => /^(?:openapi|swagger)\.ya?ml$/i.test(file))
|
|
253
|
+
const changedSqlSource = staged.some((file) => /^(?:db\/queries|queries)\/.*\.sql$/i.test(file))
|
|
254
|
+
const hasApiGenerated = staged.some((file) => /(?:^|\/)[^/]*(?:generated|\.gen)\.(?:go|ts|js|py)$/i.test(file))
|
|
255
|
+
const hasSqlGenerated = staged.some((file) => /(?:^|\/)(?:sqlc|generated)(?:\/|.*\.(?:go|ts|js|py)$)/i.test(file))
|
|
256
|
+
if (changedOpenApi && !hasApiGenerated) {
|
|
257
|
+
block('Cambió una fuente OpenAPI/Swagger sin incluir código regenerado. Ejecuta el generador y stagea su salida.')
|
|
258
|
+
}
|
|
259
|
+
if (changedSqlSource && !hasSqlGenerated) {
|
|
260
|
+
block('Cambió una consulta SQL fuente sin artefactos regenerados. Ejecuta el generador.')
|
|
261
|
+
}
|
|
262
|
+
if (!staged.some((file) => /\.(?:ts|tsx|js|jsx|mjs|cjs|go|py|html|css|scss|prisma)$/.test(file))) return
|
|
263
|
+
const failures = []
|
|
264
|
+
if (fs.existsSync(path.join(dir, 'package.json'))) {
|
|
265
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'))
|
|
266
|
+
const usesPnpm = fs.existsSync(path.join(dir, 'pnpm-lock.yaml'))
|
|
267
|
+
&& !fs.existsSync(path.join(dir, 'package-lock.json'))
|
|
268
|
+
const pm = usesPnpm ? 'pnpm' : 'npm'
|
|
269
|
+
for (const script of ['test', 'lint', 'typecheck', 'build']) {
|
|
270
|
+
if (!pkg.scripts || !pkg.scripts[script]) continue
|
|
271
|
+
const result = run(pm, ['run', script], dir)
|
|
272
|
+
if (!result.ok) failures.push(`${script} (exit ${result.status})`)
|
|
273
|
+
}
|
|
274
|
+
} else if (fs.existsSync(path.join(dir, 'go.mod'))) {
|
|
275
|
+
const makefile = path.join(dir, 'Makefile')
|
|
276
|
+
if (fs.existsSync(makefile) && /^ci:/m.test(fs.readFileSync(makefile, 'utf8'))) {
|
|
277
|
+
const result = run('make', ['ci'], dir)
|
|
278
|
+
if (!result.ok) failures.push(`make ci (exit ${result.status})`)
|
|
279
|
+
} else {
|
|
280
|
+
for (const args of [['test', './...'], ['build', './...']]) {
|
|
281
|
+
const result = run('go', args, dir)
|
|
282
|
+
if (!result.ok) failures.push(`go ${args[0]} (exit ${result.status})`)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} else if (fs.existsSync(path.join(dir, 'pyproject.toml')) || fs.existsSync(path.join(dir, 'requirements.txt'))) {
|
|
286
|
+
const makefile = path.join(dir, 'Makefile')
|
|
287
|
+
if (fs.existsSync(makefile) && /^test:/m.test(fs.readFileSync(makefile, 'utf8'))) {
|
|
288
|
+
const result = run('make', ['test'], dir)
|
|
289
|
+
if (!result.ok) failures.push(`make test (exit ${result.status})`)
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (failures.length) block(`Verify falló en ${path.basename(dir)}: ${failures.join(', ')}. No se commitea en rojo.`)
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function findOpsRoot(start) {
|
|
296
|
+
let current = path.resolve(start)
|
|
297
|
+
while (true) {
|
|
298
|
+
if (fs.existsSync(path.join(current, 'ops.config.json'))
|
|
299
|
+
&& fs.existsSync(path.join(current, 'planning'))) {
|
|
300
|
+
return current
|
|
301
|
+
}
|
|
302
|
+
const parent = path.dirname(current)
|
|
303
|
+
if (parent === current) return ''
|
|
304
|
+
current = parent
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function planningDrift(input) {
|
|
309
|
+
const root = findOpsRoot(process.env.OPS_ROOT || process.env.CLAUDE_PROJECT_DIR || cwdOf(input))
|
|
310
|
+
if (!root) return
|
|
311
|
+
const local = path.join(root, 'tools', 'ops.js')
|
|
312
|
+
const source = path.join(root, 'engine', 'cli', 'ops.js')
|
|
313
|
+
const cli = fs.existsSync(local) ? local : source
|
|
314
|
+
if (!fs.existsSync(cli)) return
|
|
315
|
+
const result = run(process.execPath, [cli, 'check', path.join(root, 'planning')], root)
|
|
316
|
+
const session = String(input.session_id || input.sessionId || 'nosession').replace(/[^a-zA-Z0-9_-]/g, '_')
|
|
317
|
+
const marker = path.join(os.tmpdir(), `cauce-drift-${session}`)
|
|
318
|
+
if (result.ok) {
|
|
319
|
+
try { fs.unlinkSync(marker) } catch { /* already clean */ }
|
|
320
|
+
return
|
|
321
|
+
}
|
|
322
|
+
if (fs.existsSync(marker)) return
|
|
323
|
+
fs.writeFileSync(marker, '')
|
|
324
|
+
block(`Planning o integraciones quedaron desalineados:\n${result.output}`)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
const guards = {
|
|
328
|
+
destructive, 'git-add': gitAdd, secrets, generated, 'workspace-boundary': workspaceBoundary,
|
|
329
|
+
migrations, dependencies, governance, verify, 'planning-drift': planningDrift,
|
|
330
|
+
'integration-snapshot': integrationSnapshot,
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Grupos por evento: un runner corre el grupo entero en un solo proceso en lugar de un guard por hook.
|
|
334
|
+
const hookGroups = {
|
|
335
|
+
'pre-shell': ['destructive', 'git-add', 'dependencies', 'governance', 'verify'],
|
|
336
|
+
'pre-files': ['secrets', 'generated', 'workspace-boundary', 'migrations', 'integration-snapshot'],
|
|
337
|
+
stop: ['planning-drift'],
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const hookMetadata = [
|
|
341
|
+
{
|
|
342
|
+
name: 'destructive',
|
|
343
|
+
event: 'PreToolUse · shell',
|
|
344
|
+
purpose: 'Bloquea publicación y comandos con pérdida de datos.',
|
|
345
|
+
},
|
|
346
|
+
{ name: 'git-add', event: 'PreToolUse · shell', purpose: 'Exige stagear rutas explícitas.' },
|
|
347
|
+
{
|
|
348
|
+
name: 'dependencies',
|
|
349
|
+
event: 'PreToolUse · shell',
|
|
350
|
+
purpose: 'Protege manifests, lockfiles y publicación de paquetes.',
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
name: 'governance',
|
|
354
|
+
event: 'PreToolUse · shell',
|
|
355
|
+
purpose: 'Impide commitear cambios de gobernanza sin aprobación.',
|
|
356
|
+
},
|
|
357
|
+
{ name: 'verify', event: 'PreToolUse · shell', purpose: 'Ejecuta los gates reales antes de cada commit.' },
|
|
358
|
+
{ name: 'secrets', event: 'PreToolUse · files', purpose: 'Bloquea escritura de secretos y credenciales.' },
|
|
359
|
+
{ name: 'generated', event: 'PreToolUse · files', purpose: 'Impide editar código generado manualmente.' },
|
|
360
|
+
{ name: 'workspace-boundary', event: 'PreToolUse · files', purpose: 'Limita escrituras a las raíces declaradas.' },
|
|
361
|
+
{ name: 'migrations', event: 'PreToolUse · files', purpose: 'Protege migraciones existentes y SQL destructivo.' },
|
|
362
|
+
{
|
|
363
|
+
name: 'integration-snapshot',
|
|
364
|
+
event: 'PreToolUse · files',
|
|
365
|
+
purpose: 'Protege snapshots administrados por integraciones.',
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
name: 'planning-drift',
|
|
369
|
+
event: 'Stop / SessionEnd',
|
|
370
|
+
purpose: 'Evita cerrar con planning o integraciones desalineados.',
|
|
371
|
+
},
|
|
372
|
+
]
|
|
373
|
+
|
|
374
|
+
function execute(name, input) {
|
|
375
|
+
const guard = guards[name]
|
|
376
|
+
if (!guard) throw new Error(`Hook desconocido: ${name}`)
|
|
377
|
+
guard(input)
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Expande grupos a guards y conserva el orden declarado; el primero que bloquea corta la ejecución.
|
|
381
|
+
function resolve(names) {
|
|
382
|
+
const resolved = names.flatMap((name) => hookGroups[name] || [name])
|
|
383
|
+
if (!resolved.length) throw new Error('Se requiere el nombre de un guard o de un grupo.')
|
|
384
|
+
return resolved
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function executeAll(names, input) {
|
|
388
|
+
for (const name of resolve(names)) execute(name, input)
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
if (require.main === module) {
|
|
392
|
+
try { executeAll(process.argv.slice(2), readInput()) } catch (error) {
|
|
393
|
+
console.error(`BLOQUEADO: ${error.message}`)
|
|
394
|
+
process.exit(error.blocked ? 2 : 1)
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
module.exports = {
|
|
399
|
+
commandOf, execute, executeAll, fileOf, filesOf, findOpsRoot, guards, hookGroups, hookMetadata,
|
|
400
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs')
|
|
4
|
+
const path = require('node:path')
|
|
5
|
+
const S = require('./state')
|
|
6
|
+
|
|
7
|
+
const STATES = ['draft', 'approved', 'published']
|
|
8
|
+
const TYPES = ['Epic', 'Story', 'Task', 'Sub-task']
|
|
9
|
+
|
|
10
|
+
function read(root, provider) {
|
|
11
|
+
const dir = path.join(root, 'integrations', provider, 'proposed')
|
|
12
|
+
let files = []
|
|
13
|
+
try {
|
|
14
|
+
files = fs.readdirSync(dir).filter((file) => file.endsWith('.md') && file !== 'README.md')
|
|
15
|
+
} catch { return [] }
|
|
16
|
+
return files.sort().map((file) => {
|
|
17
|
+
const content = fs.readFileSync(path.join(dir, file), 'utf8')
|
|
18
|
+
const fields = S.frontmatter(content)
|
|
19
|
+
const body = content.replace(/^---[\s\S]*?---\s*/, '')
|
|
20
|
+
const summary = ((body.match(/^#\s+(.+)$/m) || [])[1] || '').trim()
|
|
21
|
+
const description = ((body.match(
|
|
22
|
+
/^##\s+Descripción\s*\n([\s\S]*?)(?=^##\s+|(?![\s\S]))/im,
|
|
23
|
+
) || [])[1] || '').trim()
|
|
24
|
+
return {
|
|
25
|
+
file,
|
|
26
|
+
path: path.join(dir, file),
|
|
27
|
+
content,
|
|
28
|
+
fields,
|
|
29
|
+
summary,
|
|
30
|
+
description,
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function validate(root, provider, workspaces = []) {
|
|
36
|
+
const errors = []
|
|
37
|
+
const stagedKeys = new Set(S.readStaging(root, provider).map((item) => item.key))
|
|
38
|
+
let maxHours = 4
|
|
39
|
+
try {
|
|
40
|
+
const config = JSON.parse(fs.readFileSync(path.join(root, 'ops.config.json'), 'utf8'))
|
|
41
|
+
maxHours = config.runner.maxTaskHours
|
|
42
|
+
} catch { /* reported by the main validator */ }
|
|
43
|
+
for (const proposal of read(root, provider)) {
|
|
44
|
+
const at = `integrations/${provider}/proposed/${proposal.file}`
|
|
45
|
+
const fields = proposal.fields
|
|
46
|
+
if (fields.provider !== provider) errors.push(`${at}: provider debe ser ${provider}`)
|
|
47
|
+
if (!STATES.includes(fields.state)) errors.push(`${at}: state inválido`)
|
|
48
|
+
if (!TYPES.includes(fields.type)) errors.push(`${at}: type inválido`)
|
|
49
|
+
if (!proposal.summary) errors.push(`${at}: falta título`)
|
|
50
|
+
if (!proposal.description) errors.push(`${at}: falta Descripción`)
|
|
51
|
+
if (fields.parent && !/^[A-Za-z][A-Za-z0-9_]*-\d+$/.test(fields.parent)) {
|
|
52
|
+
errors.push(`${at}: parent no es una clave remota válida`)
|
|
53
|
+
}
|
|
54
|
+
if (fields.type !== 'Epic' && !fields.parent) {
|
|
55
|
+
errors.push(`${at}: ${fields.type || 'el tipo'} exige parent`)
|
|
56
|
+
}
|
|
57
|
+
if (fields.parent && !stagedKeys.has(fields.parent)) {
|
|
58
|
+
errors.push(`${at}: parent ${fields.parent} no está presente en staging`)
|
|
59
|
+
}
|
|
60
|
+
if (fields.state === 'approved') {
|
|
61
|
+
if (!fields.service) errors.push(`${at}: approved exige service`)
|
|
62
|
+
const exists = workspaces.some((workspace) => {
|
|
63
|
+
return fs.existsSync(path.join(workspace.resolved, fields.service || ''))
|
|
64
|
+
})
|
|
65
|
+
if (fields.service && !exists) errors.push(`${at}: service no existe`)
|
|
66
|
+
const estimate = Number(fields.estimateHours)
|
|
67
|
+
if (!Number.isFinite(estimate) || estimate <= 0) {
|
|
68
|
+
errors.push(`${at}: approved exige estimateHours mayor que cero`)
|
|
69
|
+
} else if (estimate > maxHours && !fields.justification) {
|
|
70
|
+
errors.push(`${at}: supera ${maxHours}h; debe dividirse o justificarlo`)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (fields.state === 'published' && !fields.remote) {
|
|
74
|
+
errors.push(`${at}: published exige remote`)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return errors
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = { STATES, TYPES, read, validate }
|