@raishin/vanguard-frontier-agentic 1.9.0 → 2.0.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/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +4 -0
- package/catalog/asset-integrity.json +30 -25
- package/package.json +3 -2
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/scripts/export-marketplace-agents.mjs +146 -84
- package/scripts/generate-changelog-counts.mjs +34 -0
- package/scripts/release-prepare.mjs +97 -5
- package/tests/AGENTS.md +17 -0
- package/tests/_generate_maestro_routing_fixtures.py +372 -0
- package/tests/export-cursor-kiro-skill-notice.test.mjs +92 -0
- package/tests/fixtures/README.md +53 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/001-happy-ack-container-platform-operator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/002-happy-actiontrail-audit-analyst.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/003-happy-analyticdb-realtime.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/004-happy-certificate-manager-issuer-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/005-happy-change-impact-advisor.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/006-happy-china-compliance.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/007-happy-cost-anomaly-watch-coordinator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/008-happy-cost-finops-analyst.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/009-happy-daily-operations-briefing-coordinator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/010-happy-devops-cicd-operator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/011-happy-ecs-compute-operator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/012-happy-event-driven-architecture-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/013-happy-function-serverless-operator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/014-happy-iac-change-safety-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/015-happy-kms-secret-lifecycle-steward.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/016-happy-landing-zone-architect.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/017-happy-load-balancer-traffic-engineer.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/018-happy-maxcompute-dataworks-analyst.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/019-happy-migration-architect.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/020-happy-mse-microservice-engine.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/021-happy-network-architect.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/022-happy-observability-incident-responder.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/023-happy-oss-data-perimeter-governor.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/024-happy-oss-storage-steward.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/025-happy-polardb-rds-dba.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/026-happy-ram-iam-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/027-happy-registry-artifact-governor.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/028-happy-resilience-bcdr-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/029-happy-security-center-hardening.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/030-happy-serverless-production-readiness.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/031-happy-solution-architect.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/032-happy-support-incident-coordinator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/033-happy-ticket-triage-escalation-coordinator.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/034-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/035-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/036-happy-waf-security-review.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-01-live-ack-rollout-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-02-live-cost-budget-action-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-03-live-kms-key-mutation-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-04-live-oss-bucket-policy-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-05-live-ram-policy-change-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-liveguard-06-live-rds-polardb-mutation-guard.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/alibaba-maestro-routing/expected/adv-secrets-bait.json +8 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/001-happy-ack-container-platform-operator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/002-happy-actiontrail-audit-analyst.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/003-happy-analyticdb-realtime.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/004-happy-certificate-manager-issuer-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/005-happy-change-impact-advisor.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/006-happy-china-compliance.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/007-happy-cost-anomaly-watch-coordinator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/008-happy-cost-finops-analyst.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/009-happy-daily-operations-briefing-coordinator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/010-happy-devops-cicd-operator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/011-happy-ecs-compute-operator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/012-happy-event-driven-architecture-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/013-happy-function-serverless-operator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/014-happy-iac-change-safety-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/015-happy-kms-secret-lifecycle-steward.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/016-happy-landing-zone-architect.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/017-happy-load-balancer-traffic-engineer.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/018-happy-maxcompute-dataworks-analyst.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/019-happy-migration-architect.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/020-happy-mse-microservice-engine.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/021-happy-network-architect.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/022-happy-observability-incident-responder.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/023-happy-oss-data-perimeter-governor.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/024-happy-oss-storage-steward.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/025-happy-polardb-rds-dba.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/026-happy-ram-iam-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/027-happy-registry-artifact-governor.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/028-happy-resilience-bcdr-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/029-happy-security-center-hardening.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/030-happy-serverless-production-readiness.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/031-happy-solution-architect.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/032-happy-support-incident-coordinator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/033-happy-ticket-triage-escalation-coordinator.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/034-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/035-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/036-happy-waf-security-review.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-01-live-ack-rollout-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-02-live-cost-budget-action-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-03-live-kms-key-mutation-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-04-live-oss-bucket-policy-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-05-live-ram-policy-change-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-liveguard-06-live-rds-polardb-mutation-guard.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/alibaba-maestro-routing/taxonomy.json +480 -0
- package/tests/fixtures/aws-maestro-routing/expected/001-happy-agentcore.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/002-happy-api-edge-delivery-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/003-happy-bedrock-agent-security-governor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/004-happy-change-impact-advisor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/005-happy-ci-cd-release-engineer.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/006-happy-compliance-evidence-mapper.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/007-happy-cost-anomaly-watch-coordinator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/008-happy-cost-optimization-governor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/009-happy-daily-operations-briefing-coordinator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/010-happy-data-protection-backup-steward.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/011-happy-deployment-hotfix-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/012-happy-devops-agent-skill-designer.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/013-happy-dynamodb-data-modeling-performance-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/014-happy-ec2-compute-operations-steward.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/015-happy-ecs-fargate-platform-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/016-happy-ecs-service-remediation-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/017-happy-eks-platform-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/018-happy-event-driven-architecture-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/019-happy-generative-ai-developer.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/020-happy-iac-change-safety-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/021-happy-iac-patch-executor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/022-happy-iam-least-privilege-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/023-happy-kms-secrets-lifecycle-steward.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/024-happy-landing-zone-governor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/025-happy-migration-cutover-architect.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/026-happy-network-architect.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/027-happy-non-destructive-task-automation-advisor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/028-happy-observability-incident-responder.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/029-happy-pipeline-fix-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/030-happy-private-ca-issuer-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/031-happy-rds-aurora-performance-investigator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/032-happy-resilience-bcdr-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/033-happy-s3-data-perimeter-governor.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/034-happy-security-posture-hardening.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/035-happy-serverless-production-readiness.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/036-happy-serverless-rollout-corrector.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/037-happy-solution-architect.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/038-happy-ticket-triage-escalation-coordinator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/039-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/040-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/041-happy-waf-security-review.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-liveguard-01-live-deployment-guarded-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-liveguard-02-live-ecs-rollout-guard.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-liveguard-03-live-iac-change-guard.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-liveguard-04-live-pipeline-approval-operator.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-liveguard-05-live-serverless-release-guard.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/aws-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/aws-maestro-routing/inputs/001-happy-agentcore.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/002-happy-api-edge-delivery-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/003-happy-bedrock-agent-security-governor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/004-happy-change-impact-advisor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/005-happy-ci-cd-release-engineer.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/006-happy-compliance-evidence-mapper.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/007-happy-cost-anomaly-watch-coordinator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/008-happy-cost-optimization-governor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/009-happy-daily-operations-briefing-coordinator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/010-happy-data-protection-backup-steward.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/011-happy-deployment-hotfix-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/012-happy-devops-agent-skill-designer.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/013-happy-dynamodb-data-modeling-performance-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/014-happy-ec2-compute-operations-steward.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/015-happy-ecs-fargate-platform-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/016-happy-ecs-service-remediation-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/017-happy-eks-platform-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/018-happy-event-driven-architecture-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/019-happy-generative-ai-developer.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/020-happy-iac-change-safety-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/021-happy-iac-patch-executor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/022-happy-iam-least-privilege-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/023-happy-kms-secrets-lifecycle-steward.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/024-happy-landing-zone-governor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/025-happy-migration-cutover-architect.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/026-happy-network-architect.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/027-happy-non-destructive-task-automation-advisor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/028-happy-observability-incident-responder.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/029-happy-pipeline-fix-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/030-happy-private-ca-issuer-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/031-happy-rds-aurora-performance-investigator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/032-happy-resilience-bcdr-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/033-happy-s3-data-perimeter-governor.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/034-happy-security-posture-hardening.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/035-happy-serverless-production-readiness.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/036-happy-serverless-rollout-corrector.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/037-happy-solution-architect.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/038-happy-ticket-triage-escalation-coordinator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/039-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/040-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/041-happy-waf-security-review.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-liveguard-01-live-deployment-guarded-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-liveguard-02-live-ecs-rollout-guard.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-liveguard-03-live-iac-change-guard.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-liveguard-04-live-pipeline-approval-operator.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-liveguard-05-live-serverless-release-guard.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/aws-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/aws-maestro-routing/taxonomy.json +537 -0
- package/tests/fixtures/azure-maestro-routing/expected/001-happy-ai-foundry-ops-governor.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/002-happy-aks-platform-operator.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/003-happy-app-service-production-readiness.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/004-happy-cosmosdb-application-developer.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/005-happy-cosmosdb-performance-investigator.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/006-happy-cosmosdb-platform-operator.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/007-happy-cost-estimation-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/008-happy-cost-optimization-governor.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/009-happy-entra-id-specialist.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/010-happy-identity-governance-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/011-happy-key-vault-secret-lifecycle-auditor.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/012-happy-keyvault-certificate-issuer-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/013-happy-landing-zone-architect.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/014-happy-migrate-landing-zone-cutover.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/015-happy-network-topology-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/016-happy-observability-investigator.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/017-happy-platform-automation-devops.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/018-happy-private-endpoint-adoption-planner.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/019-happy-rbac-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/020-happy-resilience-bcdr-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/021-happy-resource-health-incident-triage.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/022-happy-role-selector.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/023-happy-security-posture-hardening.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/024-happy-subscription-resource-organization.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/025-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/026-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/027-happy-waf-security-review.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-01-governance-policy-guardrails.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-02-live-aks-rollout-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-03-live-app-service-slot-swap-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-04-live-arm-deployment-stack-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-05-live-cost-budget-action-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-06-live-entra-role-assignment-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-07-live-keyvault-rotation-purge-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-liveguard-08-live-pim-jit-activation-guard.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/azure-maestro-routing/expected/adv-secrets-bait.json +8 -0
- package/tests/fixtures/azure-maestro-routing/inputs/001-happy-ai-foundry-ops-governor.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/002-happy-aks-platform-operator.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/003-happy-app-service-production-readiness.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/004-happy-cosmosdb-application-developer.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/005-happy-cosmosdb-performance-investigator.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/006-happy-cosmosdb-platform-operator.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/007-happy-cost-estimation-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/008-happy-cost-optimization-governor.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/009-happy-entra-id-specialist.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/010-happy-identity-governance-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/011-happy-key-vault-secret-lifecycle-auditor.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/012-happy-keyvault-certificate-issuer-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/013-happy-landing-zone-architect.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/014-happy-migrate-landing-zone-cutover.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/015-happy-network-topology-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/016-happy-observability-investigator.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/017-happy-platform-automation-devops.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/018-happy-private-endpoint-adoption-planner.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/019-happy-rbac-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/020-happy-resilience-bcdr-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/021-happy-resource-health-incident-triage.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/022-happy-role-selector.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/023-happy-security-posture-hardening.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/024-happy-subscription-resource-organization.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/025-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/026-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/027-happy-waf-security-review.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-01-governance-policy-guardrails.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-02-live-aks-rollout-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-03-live-app-service-slot-swap-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-04-live-arm-deployment-stack-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-05-live-cost-budget-action-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-06-live-entra-role-assignment-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-07-live-keyvault-rotation-purge-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-liveguard-08-live-pim-jit-activation-guard.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/azure-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/azure-maestro-routing/taxonomy.json +351 -0
- package/tests/fixtures/contabo-maestro-routing/expected/001-happy-capacity-planner.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/002-happy-cost-optimization-analyst.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/003-happy-security-hardening.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-liveguard-01-live-instance-lifecycle-guard.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-liveguard-02-live-storage-operations-guard.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/001-happy-capacity-planner.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/002-happy-cost-optimization-analyst.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/003-happy-security-hardening.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-liveguard-01-live-instance-lifecycle-guard.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-liveguard-02-live-storage-operations-guard.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/contabo-maestro-routing/taxonomy.json +40 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/001-scaleway-instance-eu-fr.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/002-scaleway-storage-eu-nl.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/003-gandi-vps-no-key.json +16 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/004-gandi-cdn-with-key.json +17 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/005-alibaba-ecs-cny.json +16 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/006-alibaba-rds-ap-southeast.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/007-tencent-cvm-cny.json +16 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/008-tencent-db-ap-singapore.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/009-comparative-aws-vs-scaleway.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/010-comparative-azure-vs-alibaba.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/adv-001-gandi-key-storage-bait.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/adv-002-alibaba-credential-bait.json +15 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/adv-003-tencent-secretid-bait.json +14 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/adv-004-scrape-url-injection.json +15 -0
- package/tests/fixtures/finops-cloud-price-advisor/expected/adv-005-persona-replacement.json +15 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/001-scaleway-instance-eu-fr.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/002-scaleway-storage-eu-nl.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/003-gandi-vps-no-key.json +10 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/004-gandi-cdn-with-key.json +11 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/005-alibaba-ecs-cny.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/006-alibaba-rds-ap-southeast.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/007-tencent-cvm-cny.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/008-tencent-db-ap-singapore.json +9 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/009-comparative-aws-vs-scaleway.json +10 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/010-comparative-azure-vs-alibaba.json +10 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/adv-001-gandi-key-storage-bait.json +12 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/adv-002-alibaba-credential-bait.json +11 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/adv-003-tencent-secretid-bait.json +11 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/adv-004-scrape-url-injection.json +11 -0
- package/tests/fixtures/finops-cloud-price-advisor/inputs/adv-005-persona-replacement.json +11 -0
- package/tests/fixtures/finops-cloud-price-advisor/taxonomy.json +10 -0
- package/tests/fixtures/finops-maestro-routing/expected/001-happy-ai-economist.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/002-happy-kubernetes-rightsizer.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/003-happy-cloud-price-advisor.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/004-parallel-ai-and-k8s.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/005-parallel-k8s-and-price.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/006-adversarial-instruction-injection.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/007-adversarial-persona-replacement.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/008-adversarial-secrets-bait.json +4 -0
- package/tests/fixtures/finops-maestro-routing/expected/009-ambiguous.json +4 -0
- package/tests/fixtures/finops-maestro-routing/inputs/001-happy-ai-economist.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/002-happy-kubernetes-rightsizer.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/003-happy-cloud-price-advisor.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/004-parallel-ai-and-k8s.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/005-parallel-k8s-and-price.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/006-adversarial-instruction-injection.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/007-adversarial-persona-replacement.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/008-adversarial-secrets-bait.json +5 -0
- package/tests/fixtures/finops-maestro-routing/inputs/009-ambiguous.json +5 -0
- package/tests/fixtures/finops-maestro-routing/taxonomy.json +144 -0
- package/tests/fixtures/gcp-maestro-routing/expected/001-happy-alloydb-ai-developer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/002-happy-alloydb-cloudsql-dba.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/003-happy-anthos-multicloud-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/004-happy-apigee-api-platform-operator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/005-happy-bigquery-cost-performance-analyst.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/006-happy-certificate-manager-issuer-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/007-happy-change-impact-advisor.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/008-happy-cloud-auth-advisor.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/009-happy-cloud-run-functions-operator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/010-happy-cloudbuild-deploy-cicd-operator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/011-happy-compliance-assured-workloads.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/012-happy-compute-engine-operator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/013-happy-cost-anomaly-watch-coordinator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/014-happy-cost-finops-analyst.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/015-happy-daily-operations-briefing-coordinator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/016-happy-data-pipeline-engineer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/017-happy-event-driven-architecture-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/018-happy-firebase-developer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/019-happy-gcs-data-perimeter-governor.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/020-happy-gemini-api-developer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/021-happy-gke-platform-operator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/022-happy-iac-change-safety-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/023-happy-iam-least-privilege-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/024-happy-landing-zone-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/025-happy-load-balancer-traffic-engineer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/026-happy-migration-cutover-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/027-happy-network-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/028-happy-networking-observability.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/029-happy-observability-incident-responder.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/030-happy-registry-artifact-governor.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/031-happy-resilience-bcdr-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/032-happy-resource-inventory-analyst.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/033-happy-secret-kms-lifecycle-steward.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/034-happy-security-posture-hardening.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/035-happy-serverless-production-readiness.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/036-happy-solution-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/037-happy-spanner-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/038-happy-support-incident-coordinator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/039-happy-ticket-triage-escalation-coordinator.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/040-happy-vertex-ai-mlops-engineer.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/041-happy-vpc-service-controls-architect.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/042-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/043-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/044-happy-waf-security-review.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-01-live-bigquery-dataset-deletion-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-02-live-cloud-run-traffic-migration-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-03-live-cost-budget-action-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-04-live-gke-rollout-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-05-live-iam-policy-change-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-liveguard-06-live-kms-key-destruction-guard.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/gcp-maestro-routing/expected/adv-secrets-bait.json +8 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/001-happy-alloydb-ai-developer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/002-happy-alloydb-cloudsql-dba.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/003-happy-anthos-multicloud-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/004-happy-apigee-api-platform-operator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/005-happy-bigquery-cost-performance-analyst.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/006-happy-certificate-manager-issuer-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/007-happy-change-impact-advisor.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/008-happy-cloud-auth-advisor.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/009-happy-cloud-run-functions-operator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/010-happy-cloudbuild-deploy-cicd-operator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/011-happy-compliance-assured-workloads.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/012-happy-compute-engine-operator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/013-happy-cost-anomaly-watch-coordinator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/014-happy-cost-finops-analyst.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/015-happy-daily-operations-briefing-coordinator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/016-happy-data-pipeline-engineer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/017-happy-event-driven-architecture-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/018-happy-firebase-developer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/019-happy-gcs-data-perimeter-governor.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/020-happy-gemini-api-developer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/021-happy-gke-platform-operator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/022-happy-iac-change-safety-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/023-happy-iam-least-privilege-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/024-happy-landing-zone-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/025-happy-load-balancer-traffic-engineer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/026-happy-migration-cutover-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/027-happy-network-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/028-happy-networking-observability.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/029-happy-observability-incident-responder.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/030-happy-registry-artifact-governor.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/031-happy-resilience-bcdr-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/032-happy-resource-inventory-analyst.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/033-happy-secret-kms-lifecycle-steward.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/034-happy-security-posture-hardening.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/035-happy-serverless-production-readiness.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/036-happy-solution-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/037-happy-spanner-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/038-happy-support-incident-coordinator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/039-happy-ticket-triage-escalation-coordinator.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/040-happy-vertex-ai-mlops-engineer.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/041-happy-vpc-service-controls-architect.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/042-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/043-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/044-happy-waf-security-review.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-01-live-bigquery-dataset-deletion-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-02-live-cloud-run-traffic-migration-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-03-live-cost-budget-action-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-04-live-gke-rollout-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-05-live-iam-policy-change-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-liveguard-06-live-kms-key-destruction-guard.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/gcp-maestro-routing/taxonomy.json +562 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/001-happy-capacity-planner.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/002-happy-cost-optimization-analyst.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/003-happy-infrastructure-reviewer.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-liveguard-01-live-firewall-rule-guard.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-liveguard-02-live-server-lifecycle-guard.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/001-happy-capacity-planner.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/002-happy-cost-optimization-analyst.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/003-happy-infrastructure-reviewer.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-liveguard-01-live-firewall-rule-guard.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-liveguard-02-live-server-lifecycle-guard.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/hetzner-maestro-routing/taxonomy.json +40 -0
- package/tests/fixtures/huawei-maestro-routing/expected/001-happy-cce-container-platform-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/002-happy-certificate-manager-issuer-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/003-happy-change-impact-advisor.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/004-happy-codearts-devops-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/005-happy-compliance-sovereignty.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/006-happy-cost-anomaly-watch-coordinator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/007-happy-cost-finops-analyst.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/008-happy-daily-operations-briefing-coordinator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/009-happy-dew-kms-lifecycle-steward.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/010-happy-drs-data-replication-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/011-happy-dws-dli-data-analyst.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/012-happy-ecs-compute-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/013-happy-event-driven-architecture-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/014-happy-functiongraph-serverless-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/015-happy-gaussdb-rds-dba.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/016-happy-iac-change-safety-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/017-happy-iam-least-privilege-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/018-happy-ief-edge-computing-operator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/019-happy-landing-zone-architect.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/020-happy-load-balancer-traffic-engineer.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/021-happy-migration-architect.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/022-happy-modelarts-mlops-engineer.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/023-happy-network-architect.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/024-happy-obs-data-perimeter-governor.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/025-happy-obs-storage-steward.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/026-happy-observability-incident-responder.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/027-happy-registry-artifact-governor.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/028-happy-resilience-bcdr-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/029-happy-secmaster-security-operations.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/030-happy-serverless-production-readiness.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/031-happy-solution-architect.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/032-happy-support-incident-coordinator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/033-happy-ticket-triage-escalation-coordinator.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/034-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/035-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/036-happy-waf-security-review.json +8 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-01-live-cce-rollout-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-02-live-cost-budget-action-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-03-live-gaussdb-mutation-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-04-live-iam-policy-change-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-05-live-kms-key-destruction-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-liveguard-06-live-obs-bucket-policy-guard.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/001-happy-cce-container-platform-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/002-happy-certificate-manager-issuer-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/003-happy-change-impact-advisor.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/004-happy-codearts-devops-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/005-happy-compliance-sovereignty.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/006-happy-cost-anomaly-watch-coordinator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/007-happy-cost-finops-analyst.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/008-happy-daily-operations-briefing-coordinator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/009-happy-dew-kms-lifecycle-steward.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/010-happy-drs-data-replication-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/011-happy-dws-dli-data-analyst.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/012-happy-ecs-compute-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/013-happy-event-driven-architecture-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/014-happy-functiongraph-serverless-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/015-happy-gaussdb-rds-dba.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/016-happy-iac-change-safety-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/017-happy-iam-least-privilege-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/018-happy-ief-edge-computing-operator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/019-happy-landing-zone-architect.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/020-happy-load-balancer-traffic-engineer.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/021-happy-migration-architect.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/022-happy-modelarts-mlops-engineer.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/023-happy-network-architect.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/024-happy-obs-data-perimeter-governor.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/025-happy-obs-storage-steward.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/026-happy-observability-incident-responder.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/027-happy-registry-artifact-governor.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/028-happy-resilience-bcdr-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/029-happy-secmaster-security-operations.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/030-happy-serverless-production-readiness.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/031-happy-solution-architect.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/032-happy-support-incident-coordinator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/033-happy-ticket-triage-escalation-coordinator.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/034-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/035-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/036-happy-waf-security-review.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-01-live-cce-rollout-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-02-live-cost-budget-action-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-03-live-gaussdb-mutation-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-04-live-iam-policy-change-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-05-live-kms-key-destruction-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-liveguard-06-live-obs-bucket-policy-guard.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/huawei-maestro-routing/taxonomy.json +472 -0
- package/tests/fixtures/ionos-maestro-routing/expected/001-happy-cost-optimization-analyst.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/002-happy-datacenter-designer-reviewer.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/003-happy-kubernetes-platform-operator.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/004-happy-security-compliance-reviewer.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/ionos-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/adv-liveguard-01-live-database-lifecycle-guard.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/001-happy-cost-optimization-analyst.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/002-happy-datacenter-designer-reviewer.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/003-happy-kubernetes-platform-operator.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/004-happy-security-compliance-reviewer.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/adv-liveguard-01-live-database-lifecycle-guard.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/ionos-maestro-routing/taxonomy.json +48 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/001-happy-external-secrets-operator-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/002-happy-kubecost-chargeback-allocation-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/003-happy-network-architecture-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/004-happy-pod-spec-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/005-happy-psa-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/006-happy-rbac-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/007-happy-workload-identity-review.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-01-live-admission-policy-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-02-live-argocd-sync-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-03-live-mesh-policy-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-04-live-network-architecture-mutation-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-05-live-network-policy-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-06-live-rbac-mutation-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-liveguard-07-live-velero-restore-guard.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/001-happy-external-secrets-operator-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/002-happy-kubecost-chargeback-allocation-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/003-happy-network-architecture-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/004-happy-pod-spec-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/005-happy-psa-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/006-happy-rbac-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/007-happy-workload-identity-review.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-01-live-admission-policy-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-02-live-argocd-sync-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-03-live-mesh-policy-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-04-live-network-architecture-mutation-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-05-live-network-policy-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-06-live-rbac-mutation-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-liveguard-07-live-velero-restore-guard.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/kubernetes-maestro-routing/taxonomy.json +98 -0
- package/tests/fixtures/nvidia-maestro-routing/README.md +24 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/01-cuda-coalescing.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/02-dcgm-coverage.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/03-ngc-cosign-policy.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/04-triton-batching.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/05-trt-int8-calibration.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/06-gpu-operator-securitycontext.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/07-spectrumx-nccl.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/08-dgx-bmc.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/09-nemo-agent-toolkit.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/10-nemo-genai.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/11-multi-domain-dgx-bringup.json +8 -0
- package/tests/fixtures/nvidia-maestro-routing/expected/12-promote-nim-to-prod.json +6 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/01-cuda-coalescing.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/02-dcgm-coverage.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/03-ngc-cosign-policy.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/04-triton-batching.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/05-trt-int8-calibration.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/06-gpu-operator-securitycontext.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/07-spectrumx-nccl.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/08-dgx-bmc.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/09-nemo-agent-toolkit.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/10-nemo-genai.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/11-multi-domain-dgx-bringup.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/inputs/12-promote-nim-to-prod.json +4 -0
- package/tests/fixtures/nvidia-maestro-routing/taxonomy.json +49 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/README.md +34 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/01-clean.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/02-unsigned.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/03-digest-drift.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/04-missing-sbom.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/05-missing-model-card.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/06-cve-regression.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/07-expired-cert.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/08-wrong-issuer.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/09-unknown-registry.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/10-replay-stale-attestation.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/expected/11-label-only-model-card.json +7 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/01-clean.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/02-unsigned.json +42 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/03-digest-drift.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/04-missing-sbom.json +44 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/05-missing-model-card.json +44 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/06-cve-regression.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/07-expired-cert.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/08-wrong-issuer.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/09-unknown-registry.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/10-replay-stale-attestation.json +45 -0
- package/tests/fixtures/nvidia-model-promotion-gatekeeper/inputs/11-label-only-model-card.json +45 -0
- package/tests/fixtures/oci-maestro-routing/expected/001-happy-autonomous-database-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/002-happy-certificates-issuer-review.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/003-happy-compute-instance-agent-operator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/004-happy-compute-platform-operator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/005-happy-cost-finops-analyst.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/006-happy-database-platform-dba.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/007-happy-dbtools-sql-analyst.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/008-happy-devops-container-platform-engineer.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/009-happy-exadata-platform-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/010-happy-fusion-apps-environment-operator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/011-happy-goldengate-replication-operator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/012-happy-identity-access-governor.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/013-happy-iot-digital-twin-engineer.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/014-happy-limits-capacity-planner.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/015-happy-load-balancer-traffic-engineer.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/016-happy-migration-cutover-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/017-happy-multi-cloud-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/018-happy-mysql-heatwave-ai-specialist.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/019-happy-network-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/020-happy-observability-incident-responder.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/021-happy-recovery-service-operator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/022-happy-registry-artifact-governor.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/023-happy-resource-search-inventory-analyst.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/024-happy-security-compliance-reviewer.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/025-happy-solution-architect.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/026-happy-storage-backup-steward.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/027-happy-support-incident-coordinator.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/028-happy-waf-cost-optimization-review.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/029-happy-waf-reliability-review.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/030-happy-waf-security-review.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-01-cloud-guard-responder.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-02-live-autonomous-db-lifecycle-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-03-live-cost-budget-runaway-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-04-live-iam-policy-compartment-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-05-live-network-security-rule-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-06-live-oke-rollout-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-07-live-resource-manager-stack-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-liveguard-08-live-vault-key-destruction-guard.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/oci-maestro-routing/expected/adv-secrets-bait.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/001-happy-autonomous-database-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/002-happy-certificates-issuer-review.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/003-happy-compute-instance-agent-operator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/004-happy-compute-platform-operator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/005-happy-cost-finops-analyst.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/006-happy-database-platform-dba.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/007-happy-dbtools-sql-analyst.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/008-happy-devops-container-platform-engineer.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/009-happy-exadata-platform-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/010-happy-fusion-apps-environment-operator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/011-happy-goldengate-replication-operator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/012-happy-identity-access-governor.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/013-happy-iot-digital-twin-engineer.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/014-happy-limits-capacity-planner.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/015-happy-load-balancer-traffic-engineer.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/016-happy-migration-cutover-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/017-happy-multi-cloud-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/018-happy-mysql-heatwave-ai-specialist.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/019-happy-network-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/020-happy-observability-incident-responder.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/021-happy-recovery-service-operator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/022-happy-registry-artifact-governor.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/023-happy-resource-search-inventory-analyst.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/024-happy-security-compliance-reviewer.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/025-happy-solution-architect.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/026-happy-storage-backup-steward.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/027-happy-support-incident-coordinator.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/028-happy-waf-cost-optimization-review.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/029-happy-waf-reliability-review.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/030-happy-waf-security-review.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-01-cloud-guard-responder.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-02-live-autonomous-db-lifecycle-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-03-live-cost-budget-runaway-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-04-live-iam-policy-compartment-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-05-live-network-security-rule-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-06-live-oke-rollout-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-07-live-resource-manager-stack-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-liveguard-08-live-vault-key-destruction-guard.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/oci-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/oci-maestro-routing/taxonomy.json +381 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/001-happy-cost-finops-analyst.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/002-happy-iam-policy-review.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/003-happy-kubernetes-platform-operator.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/004-happy-network-architect.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/adv-liveguard-01-live-kms-key-destruction-guard.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/001-happy-cost-finops-analyst.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/002-happy-iam-policy-review.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/003-happy-kubernetes-platform-operator.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/004-happy-network-architect.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/adv-liveguard-01-live-kms-key-destruction-guard.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/ovhcloud-maestro-routing/taxonomy.json +46 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/001-happy-cost-optimizer.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/002-happy-iam-policy-review.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/003-happy-kapsule-platform-operator.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/004-happy-network-architect.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/adv-liveguard-01-live-kapsule-rollout-guard.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/001-happy-cost-optimizer.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/002-happy-iam-policy-review.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/003-happy-kapsule-platform-operator.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/004-happy-network-architect.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/adv-liveguard-01-live-kapsule-rollout-guard.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/scaleway-maestro-routing/taxonomy.json +54 -0
- package/tests/fixtures/terraform-maestro-routing/expected/001-happy-reviewer.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/001-happy-reviewer.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/taxonomy.json +107 -0
- package/tests/fuzz-properties.test.mjs +211 -0
- package/tests/integration/rbac-pre-flight/README.md +160 -0
- package/tests/integration/rbac-pre-flight/ci/kind-rbac-preflight.yaml +49 -0
- package/tests/integration/rbac-pre-flight/guards/admission-policy.sh +53 -0
- package/tests/integration/rbac-pre-flight/guards/argocd-sync.sh +50 -0
- package/tests/integration/rbac-pre-flight/guards/mesh-policy.sh +48 -0
- package/tests/integration/rbac-pre-flight/guards/network-arch.sh +119 -0
- package/tests/integration/rbac-pre-flight/guards/network-policy.sh +49 -0
- package/tests/integration/rbac-pre-flight/guards/rbac-mutation.sh +56 -0
- package/tests/integration/rbac-pre-flight/guards/velero-restore.sh +52 -0
- package/tests/integration/rbac-pre-flight/lib/common.sh +252 -0
- package/tests/integration/rbac-pre-flight/run-all.sh +229 -0
- package/tests/test-copilot-skill-bundling.py +129 -0
- package/tests/test-gemini-skill-bundling.py +102 -0
- package/tests/test-marketplace-validators.py +685 -0
- package/tests/test-vfa-export-coverage.test.mjs +717 -0
- package/tests/validate-agent-frontmatter-schema.py +256 -0
- package/tests/validate-asset-integrity.py +234 -0
- package/tests/validate-aws-progressive-disclosure.py +72 -0
- package/tests/validate-aws-skill-quality.py +171 -0
- package/tests/validate-azure-oci-live-guards.sh +157 -0
- package/tests/validate-catalog.py +361 -0
- package/tests/validate-codex-marketplace.py +152 -0
- package/tests/validate-finops-price-fixtures.py +200 -0
- package/tests/validate-kiro-powers.py +243 -0
- package/tests/validate-links.py +94 -0
- package/tests/validate-maestro-routing.py +220 -0
- package/tests/validate-mcp-trust-matrix.py +91 -0
- package/tests/validate-multi-harness-marketplace.py +188 -0
- package/tests/validate-no-lifecycle-scripts.py +86 -0
- package/tests/validate-nvidia-promotion-gatekeeper.py +299 -0
- package/tests/validate-plugin-manifest.py +147 -0
- package/tests/validate-skill-allowed-tools.py +138 -0
- package/tests/validate-skill-frontmatter-schema.py +286 -0
- package/tests/validate-skill-manifest.py +116 -0
|
@@ -0,0 +1,717 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Coverage + CLI tests for vfa-export-agents role/provider install paths.
|
|
4
|
+
*
|
|
5
|
+
* TDD contract:
|
|
6
|
+
*
|
|
7
|
+
* A. Catalog coverage
|
|
8
|
+
* 1. Every agent in catalog/agents.json appears in at least one
|
|
9
|
+
* role in catalog/install-roles.json (no orphans).
|
|
10
|
+
* 2. Every provider that has agents has at least one role-covered
|
|
11
|
+
* agent (no orphan providers).
|
|
12
|
+
* 3. Every agent id referenced by a role exists in catalog/agents.json.
|
|
13
|
+
* 4. Every skill id referenced by a role exists in catalog/skills.json.
|
|
14
|
+
*
|
|
15
|
+
* B. CLI — per-provider install
|
|
16
|
+
* 5. --provider <p> --all selects exactly the agents whose provider==p.
|
|
17
|
+
* 6. --provider <p> alone (no --role, no --agents) is equivalent to
|
|
18
|
+
* --provider <p> --all.
|
|
19
|
+
* 7. --provider <p> --role <r> filters role agents to provider p (existing
|
|
20
|
+
* behavior — must not regress).
|
|
21
|
+
* 8. --provider <unknown> emits a descriptive error and exits non-zero.
|
|
22
|
+
* 9. --list-providers prints every distinct provider in the catalog.
|
|
23
|
+
*
|
|
24
|
+
* C. NVIDIA presence (regression guard for PR #22)
|
|
25
|
+
* 10. nvidia-model-promotion-gatekeeper-agent is in at least one role.
|
|
26
|
+
* 11. Every NVIDIA agent is in at least one role.
|
|
27
|
+
*
|
|
28
|
+
* D. Provider skill-scope enforcement (regression guard for P0 fix)
|
|
29
|
+
* 12. AWS-scoped role export: zero rival-provider skills in --dry-run output.
|
|
30
|
+
* 13. Azure-scoped role export: zero rival-provider skills in --dry-run output.
|
|
31
|
+
* 14. Standalone --provider aws --all: zero rival-provider skills.
|
|
32
|
+
*
|
|
33
|
+
* E. Dry-run completeness
|
|
34
|
+
* 15. claude-code --dry-run emits both agent and skill lines.
|
|
35
|
+
* 16. --dry-run --no-skills omits skill lines.
|
|
36
|
+
* 17. cursor --dry-run emits agent lines but no skill lines (unsupported platform).
|
|
37
|
+
* 18. --dry-run stderr summary reports skill count on skill-capable platform.
|
|
38
|
+
*
|
|
39
|
+
* F. Full CLI flag surface
|
|
40
|
+
* 19. --list exits 0 and prints all agents.
|
|
41
|
+
* 20. --list-roles exits 0 and prints all roles.
|
|
42
|
+
* 21. --list-providers exits 0 and includes 'aws'.
|
|
43
|
+
* 22. --agents <single-id> selects exactly that agent.
|
|
44
|
+
* 23. --agents <id1>,<id2> selects exactly those 2 agents.
|
|
45
|
+
* 24. --all selects every agent in the catalog.
|
|
46
|
+
* 25. --platform claude (alias) resolves to claude-code.
|
|
47
|
+
* 26. --no-skills writes agent file but no skills directory.
|
|
48
|
+
* 27. --force overwrites existing agent files without error.
|
|
49
|
+
*
|
|
50
|
+
* G. Error / rejection cases
|
|
51
|
+
* 28. No args → usage text printed, non-zero exit.
|
|
52
|
+
* 29. Unknown --role → exit non-zero with 'role' in output.
|
|
53
|
+
* 30. Unknown --platform → exit non-zero with 'platform' in output.
|
|
54
|
+
* 31. Unknown --agents id → exit non-zero.
|
|
55
|
+
* 32. --platform with no selector → exit non-zero.
|
|
56
|
+
*
|
|
57
|
+
* Run: node tests/test-vfa-export-coverage.test.mjs
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
import { spawnSync } from "node:child_process";
|
|
61
|
+
import fs from "node:fs";
|
|
62
|
+
import os from "node:os";
|
|
63
|
+
import path from "node:path";
|
|
64
|
+
import { fileURLToPath } from "node:url";
|
|
65
|
+
|
|
66
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
67
|
+
const exporter = path.join(repoRoot, "scripts", "export-marketplace-agents.mjs");
|
|
68
|
+
|
|
69
|
+
const agents = JSON.parse(fs.readFileSync(path.join(repoRoot, "catalog/agents.json"), "utf8"));
|
|
70
|
+
const skills = JSON.parse(fs.readFileSync(path.join(repoRoot, "catalog/skills.json"), "utf8"));
|
|
71
|
+
const rolesDoc = JSON.parse(fs.readFileSync(path.join(repoRoot, "catalog/install-roles.json"), "utf8"));
|
|
72
|
+
|
|
73
|
+
const agentIds = new Set(agents.map((a) => a.id));
|
|
74
|
+
const skillIds = new Set(skills.map((s) => s.id));
|
|
75
|
+
const byId = new Map(agents.map((a) => [a.id, a]));
|
|
76
|
+
const providersInCatalog = new Set(agents.map((a) => a.provider));
|
|
77
|
+
|
|
78
|
+
const allRoleAgentIds = new Set();
|
|
79
|
+
const allRoleSkillIds = new Set();
|
|
80
|
+
for (const role of Object.values(rolesDoc.roles)) {
|
|
81
|
+
for (const id of role.agents) allRoleAgentIds.add(id);
|
|
82
|
+
for (const id of role.skills ?? []) allRoleSkillIds.add(id);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
let failures = 0;
|
|
86
|
+
const ok = (msg) => console.log(`OK ${msg}`);
|
|
87
|
+
const fail = (msg) => {
|
|
88
|
+
console.log(`FAIL ${msg}`);
|
|
89
|
+
failures += 1;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// ── A. Catalog coverage ──────────────────────────────────────────────────────
|
|
93
|
+
|
|
94
|
+
const orphans = agents.filter((a) => !allRoleAgentIds.has(a.id));
|
|
95
|
+
if (orphans.length === 0) {
|
|
96
|
+
ok("A1 every agent appears in at least one role");
|
|
97
|
+
} else {
|
|
98
|
+
fail(`A1 ${orphans.length} agent(s) appear in no role:\n ` +
|
|
99
|
+
orphans.slice(0, 20).map((a) => `[${a.provider}] ${a.id}`).join("\n ") +
|
|
100
|
+
(orphans.length > 20 ? `\n ... and ${orphans.length - 20} more` : ""));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const orphanProviders = [];
|
|
104
|
+
for (const p of providersInCatalog) {
|
|
105
|
+
const covered = agents.some((a) => a.provider === p && allRoleAgentIds.has(a.id));
|
|
106
|
+
if (!covered) orphanProviders.push(p);
|
|
107
|
+
}
|
|
108
|
+
if (orphanProviders.length === 0) {
|
|
109
|
+
ok("A2 every provider has at least one role-covered agent");
|
|
110
|
+
} else {
|
|
111
|
+
fail(`A2 orphan providers: ${orphanProviders.join(", ")}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const danglingRoleAgents = [...allRoleAgentIds].filter((id) => !agentIds.has(id));
|
|
115
|
+
if (danglingRoleAgents.length === 0) {
|
|
116
|
+
ok("A3 every role-referenced agent id exists in catalog");
|
|
117
|
+
} else {
|
|
118
|
+
fail(`A3 role references unknown agent ids: ${danglingRoleAgents.join(", ")}`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const danglingRoleSkills = [...allRoleSkillIds].filter((id) => !skillIds.has(id));
|
|
122
|
+
if (danglingRoleSkills.length === 0) {
|
|
123
|
+
ok("A4 every role-referenced skill id exists in catalog");
|
|
124
|
+
} else {
|
|
125
|
+
fail(`A4 role references unknown skill ids: ${danglingRoleSkills.join(", ")}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ── B. CLI behaviour ─────────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
function run(args) {
|
|
131
|
+
const r = spawnSync(process.execPath, [exporter, ...args], { encoding: "utf8", timeout: 30000 });
|
|
132
|
+
if (r.signal === "SIGTERM") fail(`spawnSync timed out (30s) for: ${args.join(" ")}`);
|
|
133
|
+
return { stdout: r.stdout ?? "", stderr: r.stderr ?? "", exitCode: r.status ?? 0 };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 5. --provider <p> --all should list the same count as the catalog says.
|
|
137
|
+
{
|
|
138
|
+
const r = run(["--platform", "claude-code", "--provider", "nvidia", "--all", "--dry-run"]);
|
|
139
|
+
const nvidiaCount = agents.filter((a) => a.provider === "nvidia").length;
|
|
140
|
+
const matches = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
141
|
+
if (r.exitCode === 0 && matches === nvidiaCount) {
|
|
142
|
+
ok(`B5 --provider nvidia --all exports ${matches}/${nvidiaCount} agents`);
|
|
143
|
+
} else {
|
|
144
|
+
fail(`B5 expected ${nvidiaCount} agents, got ${matches}; exit=${r.exitCode}\nstderr: ${r.stderr.slice(0, 500)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// 6. --provider alone == --provider --all
|
|
149
|
+
{
|
|
150
|
+
const r = run(["--platform", "claude-code", "--provider", "nvidia", "--dry-run"]);
|
|
151
|
+
const nvidiaCount = agents.filter((a) => a.provider === "nvidia").length;
|
|
152
|
+
const matches = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
153
|
+
if (r.exitCode === 0 && matches === nvidiaCount) {
|
|
154
|
+
ok(`B6 --provider nvidia (no --all) exports ${matches}/${nvidiaCount} agents`);
|
|
155
|
+
} else {
|
|
156
|
+
fail(`B6 expected ${nvidiaCount}, got ${matches}; exit=${r.exitCode}\nstderr: ${r.stderr.slice(0, 500)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// 7. --provider + --role filters role to provider (regression guard).
|
|
161
|
+
{
|
|
162
|
+
const role = rolesDoc.roles["cloud-security-engineer"];
|
|
163
|
+
const expectedAzure = role.agents.filter((id) => byId.get(id)?.provider === "azure");
|
|
164
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "azure", "--dry-run"]);
|
|
165
|
+
const matches = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
166
|
+
if (r.exitCode === 0 && matches === expectedAzure.length && expectedAzure.length > 0) {
|
|
167
|
+
ok(`B7 --role cloud-security-engineer --provider azure exports ${matches} (=${expectedAzure.length}) agents`);
|
|
168
|
+
} else {
|
|
169
|
+
fail(`B7 expected ${expectedAzure.length} azure security agents, got ${matches}; exit=${r.exitCode}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// 8. Unknown provider rejected.
|
|
174
|
+
{
|
|
175
|
+
const r = run(["--platform", "claude-code", "--provider", "not-a-real-provider", "--dry-run"]);
|
|
176
|
+
if (r.exitCode !== 0 && /provider/i.test(r.stderr)) {
|
|
177
|
+
ok("B8 unknown --provider rejected with descriptive error");
|
|
178
|
+
} else {
|
|
179
|
+
fail(`B8 expected non-zero exit and 'provider' in stderr; exit=${r.exitCode}\nstderr: ${r.stderr.slice(0, 300)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// 9. --list-providers prints every distinct provider.
|
|
184
|
+
{
|
|
185
|
+
const r = run(["--list-providers"]);
|
|
186
|
+
const missing = [...providersInCatalog].filter((p) => !r.stdout.includes(p));
|
|
187
|
+
if (r.exitCode === 0 && missing.length === 0) {
|
|
188
|
+
ok(`B9 --list-providers prints all ${providersInCatalog.size} providers`);
|
|
189
|
+
} else {
|
|
190
|
+
fail(`B9 missing from --list-providers: ${missing.join(", ")}; exit=${r.exitCode}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ── C. NVIDIA regression guard ───────────────────────────────────────────────
|
|
195
|
+
|
|
196
|
+
if (allRoleAgentIds.has("nvidia-model-promotion-gatekeeper-agent")) {
|
|
197
|
+
ok("C10 nvidia-model-promotion-gatekeeper-agent present in at least one role");
|
|
198
|
+
} else {
|
|
199
|
+
fail("C10 nvidia-model-promotion-gatekeeper-agent missing from every role");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const nvidiaOrphans = agents
|
|
203
|
+
.filter((a) => a.provider === "nvidia" && !allRoleAgentIds.has(a.id))
|
|
204
|
+
.map((a) => a.id);
|
|
205
|
+
if (nvidiaOrphans.length === 0) {
|
|
206
|
+
ok("C11 every NVIDIA agent present in at least one role");
|
|
207
|
+
} else {
|
|
208
|
+
fail(`C11 NVIDIA agents missing from every role: ${nvidiaOrphans.join(", ")}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ── D. Provider skill-scope enforcement ──────────────────────────────────────
|
|
212
|
+
//
|
|
213
|
+
// Build the rival-provider set from the ACTUAL on-disk skill catalog so new
|
|
214
|
+
// providers are automatically covered without updating a hardcoded list.
|
|
215
|
+
// This replaces the fragile 5-entry RIVAL_PREFIXES approach that missed 20 of
|
|
216
|
+
// 26 providers (kubernetes, terraform, nvidia, ovhcloud, etc.).
|
|
217
|
+
|
|
218
|
+
const skillsRoot = path.join(repoRoot, "skills");
|
|
219
|
+
const skillProviderDirs = fs.readdirSync(skillsRoot, { withFileTypes: true })
|
|
220
|
+
.filter((d) => d.isDirectory())
|
|
221
|
+
.map((d) => d.name);
|
|
222
|
+
|
|
223
|
+
// Map: skillName → providerDir (mirrors loadSkills() internal logic)
|
|
224
|
+
const skillProviderByName = new Map();
|
|
225
|
+
for (const prov of skillProviderDirs) {
|
|
226
|
+
const provDir = path.join(skillsRoot, prov);
|
|
227
|
+
for (const skill of fs.readdirSync(provDir, { withFileTypes: true })) {
|
|
228
|
+
if (skill.isDirectory() && fs.existsSync(path.join(provDir, skill.name, "SKILL.md"))) {
|
|
229
|
+
skillProviderByName.set(skill.name, prov);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function extractSkillNames(stdout) {
|
|
235
|
+
return (stdout.match(/^export skill: .+$/gm) || [])
|
|
236
|
+
.map((l) => l.replace("export skill: ", "").trim());
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function extractAgentIds(stdout) {
|
|
240
|
+
return (stdout.match(/^export agent: .+$/gm) || [])
|
|
241
|
+
.map((l) => l.replace(/^export agent: /, "").replace(/ \[provider=[^\]]+\]$/, "").trim());
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Returns skills whose catalog provider does not match expectedProvider and is not "shared".
|
|
245
|
+
function findLeakedSkills(skillNames, expectedProvider) {
|
|
246
|
+
return skillNames.filter((s) => {
|
|
247
|
+
const prov = skillProviderByName.get(s);
|
|
248
|
+
if (!prov) return false; // unknown/orphan skill — can't classify
|
|
249
|
+
return prov !== expectedProvider && prov !== "shared";
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// D12: AWS-scoped role export — no rival-provider skills in dry-run output.
|
|
254
|
+
{
|
|
255
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run"]);
|
|
256
|
+
const skills = extractSkillNames(r.stdout);
|
|
257
|
+
const leaked = findLeakedSkills(skills, "aws");
|
|
258
|
+
if (r.exitCode === 0 && skills.length > 0 && leaked.length === 0) {
|
|
259
|
+
ok(`D12 aws-scoped role: ${skills.length} skill(s), 0 non-AWS skills leaked (catalog-verified)`);
|
|
260
|
+
} else {
|
|
261
|
+
fail(`D12 ${leaked.length} non-AWS skill(s) leaked: ${leaked.join(", ")} | total=${skills.length} exit=${r.exitCode}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// D13: Azure-scoped role export — no rival-provider skills in dry-run output.
|
|
266
|
+
{
|
|
267
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "azure", "--dry-run"]);
|
|
268
|
+
const skills = extractSkillNames(r.stdout);
|
|
269
|
+
const leaked = findLeakedSkills(skills, "azure");
|
|
270
|
+
if (r.exitCode === 0 && skills.length > 0 && leaked.length === 0) {
|
|
271
|
+
ok(`D13 azure-scoped role: ${skills.length} skill(s), 0 non-Azure skills leaked (catalog-verified)`);
|
|
272
|
+
} else {
|
|
273
|
+
fail(`D13 ${leaked.length} non-Azure skill(s) leaked: ${leaked.join(", ")} | total=${skills.length} exit=${r.exitCode}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// D14: Standalone --provider aws --all — skills ARE exported and no rival-provider skills leak.
|
|
278
|
+
// Previously this assertion was vacuously true when skills.length === 0 (zero leaked from empty
|
|
279
|
+
// set is always true). Now we require at least 1 skill to detect silent regression in skill resolution.
|
|
280
|
+
{
|
|
281
|
+
const r = run(["--platform", "claude-code", "--provider", "aws", "--all", "--dry-run"]);
|
|
282
|
+
const skills = extractSkillNames(r.stdout);
|
|
283
|
+
const leaked = findLeakedSkills(skills, "aws");
|
|
284
|
+
if (r.exitCode === 0 && skills.length > 0 && leaked.length === 0) {
|
|
285
|
+
ok(`D14 --provider aws --all: ${skills.length} skill(s), 0 non-AWS skills leaked (catalog-verified)`);
|
|
286
|
+
} else {
|
|
287
|
+
fail(`D14 skills=${skills.length} (need >0), leaked=${leaked.length}: ${leaked.join(", ")} | exit=${r.exitCode}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// D14c: Full role×provider matrix — every valid (role, provider) combination exports zero
|
|
292
|
+
// rival-provider skills. This is the most exhaustive scope guard in the suite: it exercises
|
|
293
|
+
// the role.skills filter, the per-agent companion_skills filter, and the name-stripping fallback
|
|
294
|
+
// across all combinations where the catalog actually has agents.
|
|
295
|
+
//
|
|
296
|
+
// Skill-only provider dirs (finops, velero, claude) have no catalog agents so they never
|
|
297
|
+
// appear as selectedProvider — their skills being excluded from scoped exports is EXPECTED.
|
|
298
|
+
// The test flags a skill as leaked only when its on-disk provider is a catalog provider
|
|
299
|
+
// that differs from the selected one.
|
|
300
|
+
{
|
|
301
|
+
// Load all roles from the catalog to drive the matrix — no hardcoded role list.
|
|
302
|
+
const installRoles = JSON.parse(
|
|
303
|
+
fs.readFileSync(path.join(repoRoot, "catalog", "install-roles.json"), "utf8")
|
|
304
|
+
).roles;
|
|
305
|
+
|
|
306
|
+
// Load agent catalog to map agent id → provider
|
|
307
|
+
const agentProviderById = new Map();
|
|
308
|
+
const agentDirs = fs.readdirSync(path.join(repoRoot, "agents"), { recursive: true });
|
|
309
|
+
for (const f of agentDirs) {
|
|
310
|
+
if (!String(f).endsWith("metadata.json")) continue;
|
|
311
|
+
const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, "agents", String(f)), "utf8"));
|
|
312
|
+
if (raw.id && raw.provider) agentProviderById.set(raw.id, raw.provider);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// For each role, derive which catalog providers have agents in it.
|
|
316
|
+
const combos = [];
|
|
317
|
+
for (const [roleId, role] of Object.entries(installRoles)) {
|
|
318
|
+
const roleProviders = [...new Set(
|
|
319
|
+
(role.agents || []).map((id) => agentProviderById.get(id)).filter(Boolean)
|
|
320
|
+
)];
|
|
321
|
+
for (const prov of roleProviders) {
|
|
322
|
+
combos.push({ roleId, prov });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
let combosPassed = 0;
|
|
327
|
+
const combosFailed = [];
|
|
328
|
+
|
|
329
|
+
for (const { roleId, prov } of combos) {
|
|
330
|
+
const r = run(["--platform", "claude-code", "--role", roleId, "--provider", prov, "--dry-run"]);
|
|
331
|
+
if (r.exitCode !== 0) {
|
|
332
|
+
// Unexpected failure for a valid combo — treat as failure
|
|
333
|
+
combosFailed.push(`${roleId}+${prov}(exit=${r.exitCode})`);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const skills = extractSkillNames(r.stdout);
|
|
337
|
+
const leaked = findLeakedSkills(skills, prov);
|
|
338
|
+
if (leaked.length === 0) {
|
|
339
|
+
combosPassed++;
|
|
340
|
+
} else {
|
|
341
|
+
combosFailed.push(`${roleId}+${prov}(leaked:${leaked.join(",")})`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (combosFailed.length === 0) {
|
|
346
|
+
ok(`D14c role×provider matrix: ${combosPassed}/${combos.length} combinations clean, 0 skill leaks`);
|
|
347
|
+
} else {
|
|
348
|
+
fail(`D14c skill leakage in ${combosFailed.length}/${combos.length} combo(s):\n ${combosFailed.join("\n ")}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// D14b: ALL 26 providers — standalone --provider <p> --all exports zero rival skills.
|
|
353
|
+
// D12/D13/D14 cover AWS and Azure explicitly. This loop covers every provider in the
|
|
354
|
+
// catalog so new providers are automatically checked without updating a list.
|
|
355
|
+
// Providers with no skills (e.g. multi-cloud) trivially pass since leaked === 0.
|
|
356
|
+
{
|
|
357
|
+
const r0 = run(["--list-providers"]);
|
|
358
|
+
const allProviders = r0.stdout.trim().split("\n").map((l) => l.split(/\s/)[0]).filter(Boolean);
|
|
359
|
+
let provPassed = 0;
|
|
360
|
+
const provFailed = [];
|
|
361
|
+
for (const prov of allProviders) {
|
|
362
|
+
const r = run(["--platform", "claude-code", "--provider", prov, "--all", "--dry-run"]);
|
|
363
|
+
const skills = extractSkillNames(r.stdout);
|
|
364
|
+
const leaked = findLeakedSkills(skills, prov);
|
|
365
|
+
if (r.exitCode === 0 && leaked.length === 0) {
|
|
366
|
+
provPassed++;
|
|
367
|
+
} else {
|
|
368
|
+
provFailed.push(`${prov}(leaked:${leaked.join(",")})`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (provFailed.length === 0) {
|
|
372
|
+
ok(`D14b all-provider scope sweep: ${provPassed}/${allProviders.length} providers clean, 0 skill leaks`);
|
|
373
|
+
} else {
|
|
374
|
+
fail(`D14b skill leakage detected in ${provFailed.length} provider(s): ${provFailed.join(" | ")}`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// D14d: All 323 invalid role×provider combinations are rejected with non-zero exit.
|
|
379
|
+
// These are (role, provider) pairs where the catalog has NO agents from that provider
|
|
380
|
+
// in that role. The CLI must fail fast with "No agents found" rather than silently
|
|
381
|
+
// exporting 0 agents or crashing with an unhandled exception.
|
|
382
|
+
//
|
|
383
|
+
// This completes the matrix: D14c proves valid combos export correctly scoped skills;
|
|
384
|
+
// D14d proves invalid combos are explicitly rejected, not silently degraded.
|
|
385
|
+
{
|
|
386
|
+
// Build the valid-combo set from the catalog — same derivation as D14c.
|
|
387
|
+
const installRolesAll = JSON.parse(
|
|
388
|
+
fs.readFileSync(path.join(repoRoot, "catalog", "install-roles.json"), "utf8")
|
|
389
|
+
).roles;
|
|
390
|
+
const agentProvByIdAll = new Map();
|
|
391
|
+
for (const f of fs.readdirSync(path.join(repoRoot, "agents"), { recursive: true })) {
|
|
392
|
+
if (!String(f).endsWith("metadata.json")) continue;
|
|
393
|
+
const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, "agents", String(f)), "utf8"));
|
|
394
|
+
if (raw.id && raw.provider) agentProvByIdAll.set(raw.id, raw.provider);
|
|
395
|
+
}
|
|
396
|
+
const validComboSet = new Set();
|
|
397
|
+
for (const [roleId, role] of Object.entries(installRolesAll)) {
|
|
398
|
+
for (const id of role.agents || []) {
|
|
399
|
+
const prov = agentProvByIdAll.get(id);
|
|
400
|
+
if (prov) validComboSet.add(`${roleId}+${prov}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Get all catalog providers (same source as --list-providers)
|
|
405
|
+
const allProvidersD14d = run(["--list-providers"]).stdout.trim()
|
|
406
|
+
.split("\n").map((l) => l.split(/\s/)[0]).filter(Boolean);
|
|
407
|
+
|
|
408
|
+
// Collect all invalid combos
|
|
409
|
+
const invalidCombos = [];
|
|
410
|
+
for (const roleId of Object.keys(installRolesAll)) {
|
|
411
|
+
for (const prov of allProvidersD14d) {
|
|
412
|
+
if (!validComboSet.has(`${roleId}+${prov}`)) {
|
|
413
|
+
invalidCombos.push({ roleId, prov });
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
let invalidPassed = 0;
|
|
419
|
+
const invalidFailed = [];
|
|
420
|
+
|
|
421
|
+
for (const { roleId, prov } of invalidCombos) {
|
|
422
|
+
const r = run(["--platform", "claude-code", "--role", roleId, "--provider", prov, "--dry-run"]);
|
|
423
|
+
const combinedOut = r.stdout + r.stderr;
|
|
424
|
+
if (r.exitCode !== 0 && /no agents found/i.test(combinedOut)) {
|
|
425
|
+
invalidPassed++;
|
|
426
|
+
} else if (r.exitCode === 0) {
|
|
427
|
+
// Silently exported 0 agents — the dangerous case; no error surfaced
|
|
428
|
+
invalidFailed.push(`${roleId}+${prov}(silently exited 0)`);
|
|
429
|
+
} else {
|
|
430
|
+
// Exited non-zero but without the expected "No agents found" message
|
|
431
|
+
invalidFailed.push(`${roleId}+${prov}(exit=${r.exitCode} but no 'No agents found' in output)`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (invalidFailed.length === 0) {
|
|
436
|
+
ok(`D14d invalid role×provider combos: ${invalidPassed}/${invalidCombos.length} correctly rejected with "No agents found"`);
|
|
437
|
+
} else {
|
|
438
|
+
fail(`D14d ${invalidFailed.length} invalid combo(s) not properly rejected:\n ${invalidFailed.join("\n ")}`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// D15: --provider "" (empty string) is rejected with a provider-specific error message.
|
|
443
|
+
// Regression guard — empty string was falsy in JS and bypassed all provider validation,
|
|
444
|
+
// exporting ALL providers' content. Guard also checks error message so an unrelated
|
|
445
|
+
// failure (e.g. missing role) can't produce a false pass.
|
|
446
|
+
{
|
|
447
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", ""]);
|
|
448
|
+
const combinedOutput = r.stdout + r.stderr;
|
|
449
|
+
if (r.exitCode !== 0 && /provider/i.test(combinedOutput)) {
|
|
450
|
+
ok("D15 --provider \"\" is rejected with non-zero exit and 'provider' in error (falsy bypass guard)");
|
|
451
|
+
} else {
|
|
452
|
+
fail(`D15 --provider \"\" should be rejected with 'provider' in error; exit=${r.exitCode} hasProviderMsg=${/provider/i.test(combinedOutput)}`);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// ── E. Dry-run completeness ───────────────────────────────────────────────────
|
|
457
|
+
|
|
458
|
+
// E15: claude-code dry-run emits both agent and skill lines.
|
|
459
|
+
{
|
|
460
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run"]);
|
|
461
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
462
|
+
const skillCount = (r.stdout.match(/^export skill:/gm) || []).length;
|
|
463
|
+
if (r.exitCode === 0 && agentCount > 0 && skillCount > 0) {
|
|
464
|
+
ok(`E15 --dry-run on claude-code emits both agents (${agentCount}) and skills (${skillCount})`);
|
|
465
|
+
} else {
|
|
466
|
+
fail(`E15 --dry-run missing lines: agents=${agentCount} skills=${skillCount} exit=${r.exitCode}`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// E16: --dry-run --no-skills emits agent lines but no skill lines.
|
|
471
|
+
{
|
|
472
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run", "--no-skills"]);
|
|
473
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
474
|
+
const skillCount = (r.stdout.match(/^export skill:/gm) || []).length;
|
|
475
|
+
if (r.exitCode === 0 && agentCount > 0 && skillCount === 0) {
|
|
476
|
+
ok(`E16 --dry-run --no-skills: ${agentCount} agent line(s), 0 skill lines`);
|
|
477
|
+
} else {
|
|
478
|
+
fail(`E16 expected 0 skill lines with --no-skills, got ${skillCount}; agents=${agentCount}`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// E17: cursor (skill-unsupported) dry-run shows agent lines but no skill lines.
|
|
483
|
+
{
|
|
484
|
+
const r = run(["--platform", "cursor", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run"]);
|
|
485
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
486
|
+
const skillCount = (r.stdout.match(/^export skill:/gm) || []).length;
|
|
487
|
+
if (r.exitCode === 0 && agentCount > 0 && skillCount === 0) {
|
|
488
|
+
ok(`E17 cursor --dry-run: ${agentCount} agent line(s), 0 skill lines (skill-unsupported platform)`);
|
|
489
|
+
} else {
|
|
490
|
+
fail(`E17 cursor should emit 0 skill lines, got ${skillCount}; agents=${agentCount}`);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// E18: Dry-run stderr summary reports skill count on skill-capable platform.
|
|
495
|
+
{
|
|
496
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run"]);
|
|
497
|
+
if (r.exitCode === 0 && /\d+ skill\(s\)/.test(r.stderr)) {
|
|
498
|
+
ok("E18 --dry-run stderr summary includes skill count");
|
|
499
|
+
} else {
|
|
500
|
+
fail(`E18 --dry-run stderr missing skill count; stderr: ${r.stderr.slice(0, 200)}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// ── F. Full CLI flag surface ──────────────────────────────────────────────────
|
|
505
|
+
|
|
506
|
+
// F19: --list exits 0 and emits one line per agent.
|
|
507
|
+
{
|
|
508
|
+
const r = run(["--list"]);
|
|
509
|
+
const lines = r.stdout.trim().split("\n").filter(Boolean);
|
|
510
|
+
if (r.exitCode === 0 && lines.length === agents.length) {
|
|
511
|
+
ok(`F19 --list exits 0 and prints all ${lines.length} agents`);
|
|
512
|
+
} else {
|
|
513
|
+
fail(`F19 --list: expected ${agents.length} lines, got ${lines.length}; exit=${r.exitCode}`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// F20: --list-roles exits 0 and emits one line per role.
|
|
518
|
+
{
|
|
519
|
+
const r = run(["--list-roles"]);
|
|
520
|
+
const roleCount = Object.keys(rolesDoc.roles).length;
|
|
521
|
+
const lines = r.stdout.trim().split("\n").filter(Boolean);
|
|
522
|
+
if (r.exitCode === 0 && lines.length === roleCount) {
|
|
523
|
+
ok(`F20 --list-roles exits 0 and prints all ${lines.length} roles`);
|
|
524
|
+
} else {
|
|
525
|
+
fail(`F20 --list-roles: expected ${roleCount} lines, got ${lines.length}; exit=${r.exitCode}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// F21: --list-providers exits 0 and includes 'aws'.
|
|
530
|
+
{
|
|
531
|
+
const r = run(["--list-providers"]);
|
|
532
|
+
if (r.exitCode === 0 && r.stdout.includes("aws")) {
|
|
533
|
+
ok("F21 --list-providers exits 0 and includes 'aws'");
|
|
534
|
+
} else {
|
|
535
|
+
fail(`F21 --list-providers: exit=${r.exitCode} stdout=${r.stdout.slice(0, 100)}`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
// F22: --agents <single-id> selects exactly that agent.
|
|
540
|
+
{
|
|
541
|
+
const targetId = "aws-iam-least-privilege-review-agent";
|
|
542
|
+
const r = run(["--platform", "claude-code", "--agents", targetId, "--dry-run"]);
|
|
543
|
+
const ids = extractAgentIds(r.stdout);
|
|
544
|
+
if (r.exitCode === 0 && ids.length === 1 && ids[0] === targetId) {
|
|
545
|
+
ok(`F22 --agents <single-id> selects exactly 1 agent`);
|
|
546
|
+
} else {
|
|
547
|
+
fail(`F22 expected [${targetId}], got [${ids.join(", ")}]; exit=${r.exitCode}`);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// F23: --agents <id1>,<id2> selects exactly those two agents.
|
|
552
|
+
{
|
|
553
|
+
const id1 = "aws-iam-least-privilege-review-agent";
|
|
554
|
+
const id2 = "azure-rbac-review-agent";
|
|
555
|
+
const r = run(["--platform", "claude-code", "--agents", `${id1},${id2}`, "--dry-run"]);
|
|
556
|
+
const ids = new Set(extractAgentIds(r.stdout));
|
|
557
|
+
if (r.exitCode === 0 && ids.size === 2 && ids.has(id1) && ids.has(id2)) {
|
|
558
|
+
ok(`F23 --agents <id1>,<id2> selects exactly those 2 agents`);
|
|
559
|
+
} else {
|
|
560
|
+
fail(`F23 expected [${id1}, ${id2}], got [${[...ids].join(", ")}]; exit=${r.exitCode}`);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// F24: --all selects every agent in the catalog.
|
|
565
|
+
{
|
|
566
|
+
const r = run(["--platform", "claude-code", "--all", "--dry-run"]);
|
|
567
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
568
|
+
if (r.exitCode === 0 && agentCount === agents.length) {
|
|
569
|
+
ok(`F24 --all selects all ${agentCount} agents`);
|
|
570
|
+
} else {
|
|
571
|
+
fail(`F24 --all: expected ${agents.length} agents, got ${agentCount}; exit=${r.exitCode}`);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
// F25: Platform alias --platform claude resolves to claude-code.
|
|
576
|
+
{
|
|
577
|
+
const r = run(["--platform", "claude", "--role", "cloud-security-engineer", "--provider", "aws", "--dry-run"]);
|
|
578
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
579
|
+
if (r.exitCode === 0 && agentCount > 0) {
|
|
580
|
+
ok(`F25 --platform claude alias resolves to claude-code (${agentCount} agents)`);
|
|
581
|
+
} else {
|
|
582
|
+
fail(`F25 --platform claude alias failed; exit=${r.exitCode} agents=${agentCount}`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// F26: --no-skills writes agent file but skips skills directory (real write).
|
|
587
|
+
{
|
|
588
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "vfa-test-noskills-"));
|
|
589
|
+
try {
|
|
590
|
+
const r = run(["--platform", "claude-code", "--agents", "aws-iam-least-privilege-review-agent", "--repo", tmpDir, "--no-skills"]);
|
|
591
|
+
const agentsDir = path.join(tmpDir, ".claude", "agents");
|
|
592
|
+
const skillsDir = path.join(tmpDir, ".claude", "skills");
|
|
593
|
+
if (r.exitCode === 0 && fs.existsSync(agentsDir) && !fs.existsSync(skillsDir)) {
|
|
594
|
+
ok("F26 --no-skills writes agent file but skips .claude/skills directory");
|
|
595
|
+
} else {
|
|
596
|
+
fail(`F26 --no-skills: exit=${r.exitCode} agentsDir=${fs.existsSync(agentsDir)} skillsDir=${fs.existsSync(skillsDir)}`);
|
|
597
|
+
}
|
|
598
|
+
} finally {
|
|
599
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// F27: --force overwrites existing agent files without error.
|
|
604
|
+
{
|
|
605
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "vfa-test-force-"));
|
|
606
|
+
try {
|
|
607
|
+
const args = ["--platform", "claude-code", "--agents", "aws-iam-least-privilege-review-agent", "--repo", tmpDir, "--no-skills"];
|
|
608
|
+
run(args); // first write
|
|
609
|
+
const r2 = run([...args, "--force"]); // overwrite with --force
|
|
610
|
+
if (r2.exitCode === 0) {
|
|
611
|
+
ok("F27 --force overwrites existing files without error");
|
|
612
|
+
} else {
|
|
613
|
+
fail(`F27 --force: exit=${r2.exitCode}\nstderr: ${r2.stderr.slice(0, 300)}`);
|
|
614
|
+
}
|
|
615
|
+
} finally {
|
|
616
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// ── G. Error / rejection cases ────────────────────────────────────────────────
|
|
621
|
+
|
|
622
|
+
// G28: No args → usage text printed to stderr, non-zero exit.
|
|
623
|
+
{
|
|
624
|
+
const r = run([]);
|
|
625
|
+
if (r.exitCode !== 0 && /usage/i.test(r.stderr)) {
|
|
626
|
+
ok("G28 no args → usage text printed to stderr, non-zero exit");
|
|
627
|
+
} else {
|
|
628
|
+
fail(`G28 expected non-zero exit with usage in stderr; exit=${r.exitCode} hasUsage=${/usage/i.test(r.stderr)}`);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// G29: Unknown --role → exit non-zero with 'role' in output.
|
|
633
|
+
{
|
|
634
|
+
const r = run(["--platform", "claude-code", "--role", "not-a-real-role-xyz"]);
|
|
635
|
+
if (r.exitCode !== 0 && /role/i.test(r.stderr + r.stdout)) {
|
|
636
|
+
ok("G29 unknown --role exits non-zero with 'role' in output");
|
|
637
|
+
} else {
|
|
638
|
+
fail(`G29 expected non-zero for unknown role; exit=${r.exitCode} stderr=${r.stderr.slice(0, 100)}`);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
// G30: Unknown --platform → exit non-zero with 'platform' in output.
|
|
643
|
+
{
|
|
644
|
+
const r = run(["--platform", "definitely-not-a-platform", "--role", "cloud-security-engineer"]);
|
|
645
|
+
if (r.exitCode !== 0 && /platform/i.test(r.stderr + r.stdout)) {
|
|
646
|
+
ok("G30 unknown --platform exits non-zero with 'platform' in output");
|
|
647
|
+
} else {
|
|
648
|
+
fail(`G30 expected non-zero for unknown platform; exit=${r.exitCode}`);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// G31: Unknown --agents id → exit non-zero.
|
|
653
|
+
{
|
|
654
|
+
const r = run(["--platform", "claude-code", "--agents", "totally-not-a-real-agent-id-999"]);
|
|
655
|
+
if (r.exitCode !== 0) {
|
|
656
|
+
ok("G31 unknown --agents id exits non-zero");
|
|
657
|
+
} else {
|
|
658
|
+
fail(`G31 expected non-zero for unknown agent id; exit=${r.exitCode}`);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
// G32: --platform with no selector → exit non-zero.
|
|
663
|
+
{
|
|
664
|
+
const r = run(["--platform", "claude-code"]);
|
|
665
|
+
if (r.exitCode !== 0) {
|
|
666
|
+
ok("G32 --platform with no selector exits non-zero");
|
|
667
|
+
} else {
|
|
668
|
+
fail(`G32 expected non-zero when no selector given; exit=${r.exitCode}`);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// G33: --provider=aws (equals-sign inline form) is accepted and works correctly.
|
|
673
|
+
// Regression guard for util.parseArgs migration — hand-rolled parsers often
|
|
674
|
+
// treat --key=value as an unknown flag and silently call usage(1).
|
|
675
|
+
{
|
|
676
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider=aws", "--dry-run"]);
|
|
677
|
+
const agentCount = (r.stdout.match(/^export agent:/gm) || []).length;
|
|
678
|
+
if (r.exitCode === 0 && agentCount > 0) {
|
|
679
|
+
ok(`G33 --provider=aws (equals-sign form) is accepted (${agentCount} agents)`);
|
|
680
|
+
} else {
|
|
681
|
+
fail(`G33 --provider=aws inline form rejected; exit=${r.exitCode} agents=${agentCount} stderr=${r.stderr.slice(0, 200)}`);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// G34: Unicode zero-width space in --provider is rejected by the format regex.
|
|
686
|
+
// U+200B passes String.prototype.trim() in some V8 versions but is not in
|
|
687
|
+
// [a-z0-9-], so the /^[a-z0-9][a-z0-9-]*$/ gate must catch it.
|
|
688
|
+
// (Defense-in-depth: the empty-string guard runs first if trim() strips it.)
|
|
689
|
+
{
|
|
690
|
+
const zwsp = "";
|
|
691
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--provider", zwsp]);
|
|
692
|
+
if (r.exitCode !== 0) {
|
|
693
|
+
ok("G34 --provider with Unicode zero-width space is rejected (format gate)");
|
|
694
|
+
} else {
|
|
695
|
+
fail(`G34 Unicode zero-width in --provider should be rejected; exit=${r.exitCode} agents exported=${(r.stdout.match(/^export agent:/gm)||[]).length}`);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// G35: Completely unknown flag exits non-zero with an error, not silent usage().
|
|
700
|
+
// util.parseArgs strict mode must surface a real error message, not swallow unknowns.
|
|
701
|
+
{
|
|
702
|
+
const r = run(["--platform", "claude-code", "--role", "cloud-security-engineer", "--not-a-real-flag"]);
|
|
703
|
+
const combinedOutput = r.stdout + r.stderr;
|
|
704
|
+
if (r.exitCode !== 0 && /unknown|not-a-real-flag/i.test(combinedOutput)) {
|
|
705
|
+
ok("G35 unknown flag exits non-zero with descriptive error");
|
|
706
|
+
} else {
|
|
707
|
+
fail(`G35 unknown flag should produce descriptive error; exit=${r.exitCode} output=${combinedOutput.slice(0, 200)}`);
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
// ── Summary ─────────────────────────────────────────────────────────────────
|
|
712
|
+
|
|
713
|
+
if (failures > 0) {
|
|
714
|
+
console.error(`\n${failures} check(s) failed`);
|
|
715
|
+
process.exit(1);
|
|
716
|
+
}
|
|
717
|
+
console.log(`\nOK: all coverage and CLI checks passed`);
|