@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,200 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Grader for finops-cloud-price-advisor v0.2.0 integration test fixtures.
|
|
3
|
+
|
|
4
|
+
Validates structure and provenance labels of the expected output fixtures
|
|
5
|
+
against their paired inputs. No network calls are made — all checks are
|
|
6
|
+
deterministic against static JSON files.
|
|
7
|
+
|
|
8
|
+
Exit codes:
|
|
9
|
+
0 — all fixtures pass
|
|
10
|
+
1 — one or more fixtures fail
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import re
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
21
|
+
FIXTURE_DIR = ROOT / "tests" / "fixtures" / "finops-cloud-price-advisor"
|
|
22
|
+
INPUTS_DIR = FIXTURE_DIR / "inputs"
|
|
23
|
+
EXPECTED_DIR = FIXTURE_DIR / "expected"
|
|
24
|
+
TAXONOMY_PATH = FIXTURE_DIR / "taxonomy.json"
|
|
25
|
+
|
|
26
|
+
VALID_PROVIDERS = {"aws", "azure", "oci", "scaleway", "gandi", "alibaba", "tencent", "comparative"}
|
|
27
|
+
VALID_CURRENCIES = {"USD", "EUR", "CNY"}
|
|
28
|
+
VALID_PROVENANCE_LABELS = {"live-price", "documentation-based", "assumed", "excluded"}
|
|
29
|
+
REQUIRED_TAXONOMY_PROVIDERS = {"aws", "azure", "oci", "scaleway", "gandi", "alibaba", "tencent"}
|
|
30
|
+
|
|
31
|
+
# Credential patterns — must be wrapped in <FAKE> when present in fixtures.
|
|
32
|
+
# Each tuple is (name, compiled pattern).
|
|
33
|
+
_CREDENTIAL_PATTERNS: list[tuple[str, re.Pattern[str]]] = [
|
|
34
|
+
("AWS access key", re.compile(r"AKIA[0-9A-Z]{16}")),
|
|
35
|
+
("Alibaba access key", re.compile(r"LTAI[0-9A-Za-z]{12,20}")),
|
|
36
|
+
("Tencent secret ID", re.compile(r"AKID[0-9A-Za-z]{13,28}")),
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _load_json(path: Path) -> dict:
|
|
41
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _input_has_unmarked_credential(inp: dict) -> list[str]:
|
|
45
|
+
"""Return a list of violation descriptions for any real-looking credential
|
|
46
|
+
patterns that are not wrapped in <FAKE> tags.
|
|
47
|
+
|
|
48
|
+
The raw string value is never echoed to output — only the field name and
|
|
49
|
+
pattern name are returned to avoid leaking credential-shaped strings into
|
|
50
|
+
CI logs.
|
|
51
|
+
"""
|
|
52
|
+
violations: list[str] = []
|
|
53
|
+
raw = json.dumps(inp)
|
|
54
|
+
for name, pattern in _CREDENTIAL_PATTERNS:
|
|
55
|
+
for match in pattern.finditer(raw):
|
|
56
|
+
start = max(0, match.start() - 7)
|
|
57
|
+
# Check a small window around the match for the <FAKE> marker.
|
|
58
|
+
window = raw[start : match.end() + 7]
|
|
59
|
+
if "<FAKE>" not in window:
|
|
60
|
+
violations.append(f"unmarked {name} pattern found in input JSON")
|
|
61
|
+
return violations
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _validate_expected(inp: dict, exp: dict) -> list[str]:
|
|
65
|
+
"""Return a list of failure reasons for a single fixture pair."""
|
|
66
|
+
failures: list[str] = []
|
|
67
|
+
fixture_id = inp.get("id", "?")
|
|
68
|
+
|
|
69
|
+
# --- provider ---
|
|
70
|
+
provider = exp.get("provider")
|
|
71
|
+
if provider is None:
|
|
72
|
+
failures.append("expected: missing 'provider' field")
|
|
73
|
+
elif provider not in VALID_PROVIDERS:
|
|
74
|
+
failures.append(f"expected: provider {provider!r} not in valid set {sorted(VALID_PROVIDERS)}")
|
|
75
|
+
|
|
76
|
+
# --- currency ---
|
|
77
|
+
currency = exp.get("currency")
|
|
78
|
+
if currency is None:
|
|
79
|
+
failures.append("expected: missing 'currency' field")
|
|
80
|
+
elif currency not in VALID_CURRENCIES:
|
|
81
|
+
failures.append(f"expected: currency {currency!r} not in {sorted(VALID_CURRENCIES)}")
|
|
82
|
+
|
|
83
|
+
# --- provenance_label ---
|
|
84
|
+
provenance_label = exp.get("provenance_label")
|
|
85
|
+
if provenance_label is None:
|
|
86
|
+
failures.append("expected: missing 'provenance_label' field")
|
|
87
|
+
elif provenance_label not in VALID_PROVENANCE_LABELS:
|
|
88
|
+
failures.append(
|
|
89
|
+
f"expected: provenance_label {provenance_label!r} not in {sorted(VALID_PROVENANCE_LABELS)}"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# --- key_stored must be false ---
|
|
93
|
+
key_stored = exp.get("key_stored")
|
|
94
|
+
if key_stored is not False:
|
|
95
|
+
failures.append(f"expected: key_stored must be false, got {key_stored!r}")
|
|
96
|
+
|
|
97
|
+
# --- CNY fixtures must declare requires_usd_conversion: true ---
|
|
98
|
+
if currency == "CNY":
|
|
99
|
+
if exp.get("requires_usd_conversion") is not True:
|
|
100
|
+
failures.append("expected: CNY fixture must have requires_usd_conversion: true")
|
|
101
|
+
|
|
102
|
+
# --- Gandi with-key fixture: disclaimer_required and key_stored checks ---
|
|
103
|
+
auth_mode = inp.get("auth_mode") or exp.get("auth_mode")
|
|
104
|
+
if inp.get("provider") == "gandi" and auth_mode == "user-provided":
|
|
105
|
+
if exp.get("disclaimer_required") is not True:
|
|
106
|
+
failures.append("expected: Gandi user-provided-key fixture must have disclaimer_required: true")
|
|
107
|
+
if exp.get("key_stored") is not False:
|
|
108
|
+
failures.append("expected: Gandi user-provided-key fixture must have key_stored: false")
|
|
109
|
+
|
|
110
|
+
# --- Input credential sweep (skip for adversarial fixtures — intentional payloads) ---
|
|
111
|
+
if not inp.get("intent"):
|
|
112
|
+
cred_violations = _input_has_unmarked_credential(inp)
|
|
113
|
+
for v in cred_violations:
|
|
114
|
+
failures.append(f"input: {v}")
|
|
115
|
+
|
|
116
|
+
# --- Fixture 004: user_key_marker must carry <FAKE> prefix ---
|
|
117
|
+
if fixture_id == "004":
|
|
118
|
+
marker = inp.get("user_key_marker", "")
|
|
119
|
+
if not marker.startswith("<FAKE>"):
|
|
120
|
+
failures.append("input 004: user_key_marker must start with <FAKE>")
|
|
121
|
+
|
|
122
|
+
return failures
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _validate_taxonomy() -> list[str]:
|
|
126
|
+
"""Check that taxonomy.json covers all required providers and counts."""
|
|
127
|
+
failures: list[str] = []
|
|
128
|
+
if not TAXONOMY_PATH.exists():
|
|
129
|
+
return ["taxonomy.json not found"]
|
|
130
|
+
taxonomy = _load_json(TAXONOMY_PATH)
|
|
131
|
+
coverage = set(taxonomy.get("provider_coverage", []))
|
|
132
|
+
missing = REQUIRED_TAXONOMY_PROVIDERS - coverage
|
|
133
|
+
if missing:
|
|
134
|
+
failures.append(f"taxonomy.json provider_coverage missing: {sorted(missing)}")
|
|
135
|
+
extra = coverage - REQUIRED_TAXONOMY_PROVIDERS
|
|
136
|
+
if extra:
|
|
137
|
+
failures.append(f"taxonomy.json provider_coverage has unexpected entries: {sorted(extra)}")
|
|
138
|
+
# Verify adversarial_count is declared when adversarial fixtures exist
|
|
139
|
+
if taxonomy.get("adversarial_count", 0) == 0:
|
|
140
|
+
adv_inputs = list(INPUTS_DIR.glob("adv-*.json")) if INPUTS_DIR.is_dir() else []
|
|
141
|
+
if adv_inputs:
|
|
142
|
+
failures.append("taxonomy.json missing adversarial_count but adversarial fixtures exist")
|
|
143
|
+
return failures
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def main() -> int:
|
|
147
|
+
passes = 0
|
|
148
|
+
fails = 0
|
|
149
|
+
|
|
150
|
+
# Validate taxonomy first.
|
|
151
|
+
taxonomy_errors = _validate_taxonomy()
|
|
152
|
+
for err in taxonomy_errors:
|
|
153
|
+
print(f"FAIL: taxonomy — {err}")
|
|
154
|
+
fails += 1
|
|
155
|
+
if not taxonomy_errors:
|
|
156
|
+
print("PASS: taxonomy — provider_coverage validated")
|
|
157
|
+
|
|
158
|
+
# Discover input fixtures in sorted order.
|
|
159
|
+
if not INPUTS_DIR.is_dir():
|
|
160
|
+
print(f"ERROR: inputs directory not found at {INPUTS_DIR}", file=sys.stderr)
|
|
161
|
+
return 1
|
|
162
|
+
|
|
163
|
+
input_files = sorted(INPUTS_DIR.glob("*.json"))
|
|
164
|
+
if not input_files:
|
|
165
|
+
print("ERROR: no input fixtures found", file=sys.stderr)
|
|
166
|
+
return 1
|
|
167
|
+
|
|
168
|
+
for inp_path in input_files:
|
|
169
|
+
stem = inp_path.stem
|
|
170
|
+
exp_path = EXPECTED_DIR / f"{stem}.json"
|
|
171
|
+
|
|
172
|
+
if not exp_path.exists():
|
|
173
|
+
print(f"FAIL: {stem} — missing expected file {exp_path.name}")
|
|
174
|
+
fails += 1
|
|
175
|
+
continue
|
|
176
|
+
|
|
177
|
+
try:
|
|
178
|
+
inp = _load_json(inp_path)
|
|
179
|
+
exp = _load_json(exp_path)
|
|
180
|
+
except json.JSONDecodeError as exc:
|
|
181
|
+
print(f"FAIL: {stem} — JSON parse error: {exc}")
|
|
182
|
+
fails += 1
|
|
183
|
+
continue
|
|
184
|
+
|
|
185
|
+
errors = _validate_expected(inp, exp)
|
|
186
|
+
if errors:
|
|
187
|
+
for err in errors:
|
|
188
|
+
print(f"FAIL: {stem} — {err}")
|
|
189
|
+
fails += 1
|
|
190
|
+
else:
|
|
191
|
+
print(f"PASS: {stem}")
|
|
192
|
+
passes += 1
|
|
193
|
+
|
|
194
|
+
total = passes + fails
|
|
195
|
+
print(f"\nResults: {passes}/{total} fixtures PASS")
|
|
196
|
+
return 0 if fails == 0 else 1
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
if __name__ == "__main__":
|
|
200
|
+
sys.exit(main())
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate Kiro Powers under powers/ for spec conformance.
|
|
3
|
+
|
|
4
|
+
Kiro Powers (kirodotdev/powers) frontmatter is strictly limited to FIVE
|
|
5
|
+
fields: name, displayName, description, keywords, author. Any extra
|
|
6
|
+
field — version, repository, license, tags — is forbidden and will be
|
|
7
|
+
rejected by the Kiro Powers UI.
|
|
8
|
+
|
|
9
|
+
Gates:
|
|
10
|
+
1. Every powers/<name>/ subdirectory has a POWER.md.
|
|
11
|
+
2. POWER.md frontmatter contains exactly the five allowed fields.
|
|
12
|
+
3. name is lowercase kebab-case.
|
|
13
|
+
4. description has at most three sentences (Kiro constraint).
|
|
14
|
+
5. keywords is a non-empty list of specific (non-broad) terms.
|
|
15
|
+
6. Generator (scripts/generate-kiro-powers.mjs) is in sync.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import re
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
REPO = Path(__file__).resolve().parent.parent
|
|
26
|
+
POWERS = REPO / "powers"
|
|
27
|
+
GENERATOR = REPO / "scripts" / "generate-kiro-powers.mjs"
|
|
28
|
+
|
|
29
|
+
ALLOWED_FIELDS = {"name", "displayName", "description", "keywords", "author"}
|
|
30
|
+
NAME_RE = re.compile(r"^[a-z][a-z0-9-]*$")
|
|
31
|
+
# Broad terms that Kiro docs warn against — these are too generic to scope
|
|
32
|
+
# activation reliably and produce false positives across unrelated tasks.
|
|
33
|
+
BROAD_KEYWORDS = {
|
|
34
|
+
"cloud",
|
|
35
|
+
"code",
|
|
36
|
+
"devops",
|
|
37
|
+
"infrastructure",
|
|
38
|
+
"infra",
|
|
39
|
+
"agent",
|
|
40
|
+
"agents",
|
|
41
|
+
"ai",
|
|
42
|
+
"ml",
|
|
43
|
+
"ops",
|
|
44
|
+
"automation",
|
|
45
|
+
"tool",
|
|
46
|
+
"tools",
|
|
47
|
+
"general",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def fail(msg: str) -> None:
|
|
52
|
+
print(f"FAIL [kiro-powers] {msg}", file=sys.stderr)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _unquote(value: str) -> str:
|
|
56
|
+
value = value.strip()
|
|
57
|
+
if len(value) >= 2 and value[0] == value[-1] and value[0] in ("'", '"'):
|
|
58
|
+
return value[1:-1]
|
|
59
|
+
return value
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _parse_flow_list(value: str) -> list[str] | None:
|
|
63
|
+
value = value.strip()
|
|
64
|
+
if not (value.startswith("[") and value.endswith("]")):
|
|
65
|
+
return None
|
|
66
|
+
inner = value[1:-1].strip()
|
|
67
|
+
if not inner:
|
|
68
|
+
return []
|
|
69
|
+
return [_unquote(item.strip()) for item in inner.split(",") if item.strip()]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def parse_frontmatter(text: str, path: Path) -> dict | None:
|
|
73
|
+
"""Parse the strict-5 Kiro Powers frontmatter without a YAML library.
|
|
74
|
+
|
|
75
|
+
Accepted shapes:
|
|
76
|
+
key: value
|
|
77
|
+
key: "quoted value"
|
|
78
|
+
key: [item, item] # flow list
|
|
79
|
+
key: # block list
|
|
80
|
+
- item
|
|
81
|
+
- item
|
|
82
|
+
Anything outside this shape is rejected with a clear error.
|
|
83
|
+
"""
|
|
84
|
+
if not text.startswith("---\n"):
|
|
85
|
+
fail(f"{path.relative_to(REPO)}: POWER.md must start with YAML frontmatter delimiter")
|
|
86
|
+
return None
|
|
87
|
+
end = text.find("\n---\n", 4)
|
|
88
|
+
if end == -1:
|
|
89
|
+
fail(f"{path.relative_to(REPO)}: POWER.md frontmatter is not terminated")
|
|
90
|
+
return None
|
|
91
|
+
block = text[4:end]
|
|
92
|
+
|
|
93
|
+
data: dict = {}
|
|
94
|
+
lines = block.split("\n")
|
|
95
|
+
i = 0
|
|
96
|
+
while i < len(lines):
|
|
97
|
+
line = lines[i]
|
|
98
|
+
if not line.strip() or line.lstrip().startswith("#"):
|
|
99
|
+
i += 1
|
|
100
|
+
continue
|
|
101
|
+
if ":" not in line:
|
|
102
|
+
fail(f"{path.relative_to(REPO)}: malformed frontmatter line: {line!r}")
|
|
103
|
+
return None
|
|
104
|
+
key, _, rest = line.partition(":")
|
|
105
|
+
key = key.strip()
|
|
106
|
+
rest = rest.strip()
|
|
107
|
+
if rest == "":
|
|
108
|
+
items: list[str] = []
|
|
109
|
+
i += 1
|
|
110
|
+
while i < len(lines) and lines[i].lstrip().startswith("- "):
|
|
111
|
+
items.append(_unquote(lines[i].lstrip()[2:].strip()))
|
|
112
|
+
i += 1
|
|
113
|
+
data[key] = items
|
|
114
|
+
continue
|
|
115
|
+
flow = _parse_flow_list(rest)
|
|
116
|
+
if flow is not None:
|
|
117
|
+
data[key] = flow
|
|
118
|
+
else:
|
|
119
|
+
data[key] = _unquote(rest)
|
|
120
|
+
i += 1
|
|
121
|
+
|
|
122
|
+
if not data:
|
|
123
|
+
fail(f"{path.relative_to(REPO)}: frontmatter must be a mapping")
|
|
124
|
+
return None
|
|
125
|
+
return data
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
_DECIMAL_RE = re.compile(r"\d\.\d")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def count_sentences(text: str) -> int:
|
|
132
|
+
# Count terminal punctuation only when followed by whitespace or EOL,
|
|
133
|
+
# excluding periods inside decimal numbers (e.g. "MLPS 2.0", "v1.2.3")
|
|
134
|
+
# and abbreviation dots (e.g. "i.e.", "e.g.") that are not at a word
|
|
135
|
+
# boundary. Matches the same algorithm used in test-marketplace-validators.py
|
|
136
|
+
# to keep test expectations and live validation in sync.
|
|
137
|
+
text = text.strip()
|
|
138
|
+
if not text:
|
|
139
|
+
return 0
|
|
140
|
+
masked = _DECIMAL_RE.sub(lambda m: m.group(0).replace(".", "_"), text)
|
|
141
|
+
return len(re.findall(r"[.!?](?:\s|$)", masked))
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def validate_power(power_dir: Path) -> list[str]:
|
|
145
|
+
errs: list[str] = []
|
|
146
|
+
md = power_dir / "POWER.md"
|
|
147
|
+
if not md.is_file():
|
|
148
|
+
return [f"{power_dir.relative_to(REPO)}: POWER.md is missing"]
|
|
149
|
+
|
|
150
|
+
data = parse_frontmatter(md.read_text(), md)
|
|
151
|
+
if data is None:
|
|
152
|
+
return [f"{md.relative_to(REPO)}: frontmatter could not be parsed"]
|
|
153
|
+
|
|
154
|
+
keys = set(data.keys())
|
|
155
|
+
extra = keys - ALLOWED_FIELDS
|
|
156
|
+
missing = ALLOWED_FIELDS - keys
|
|
157
|
+
if extra:
|
|
158
|
+
errs.append(
|
|
159
|
+
f"{md.relative_to(REPO)}: forbidden frontmatter fields (Kiro strict-5 rule): {sorted(extra)}",
|
|
160
|
+
)
|
|
161
|
+
if missing:
|
|
162
|
+
errs.append(
|
|
163
|
+
f"{md.relative_to(REPO)}: missing required frontmatter fields: {sorted(missing)}",
|
|
164
|
+
)
|
|
165
|
+
if extra or missing:
|
|
166
|
+
return errs
|
|
167
|
+
|
|
168
|
+
name = data["name"]
|
|
169
|
+
if not isinstance(name, str) or not NAME_RE.match(name):
|
|
170
|
+
errs.append(f"{md.relative_to(REPO)}: name must be lowercase kebab-case ({name!r})")
|
|
171
|
+
if name != power_dir.name:
|
|
172
|
+
errs.append(
|
|
173
|
+
f"{md.relative_to(REPO)}: name {name!r} must match directory name {power_dir.name!r}",
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
description = data["description"]
|
|
177
|
+
if not isinstance(description, str) or not description.strip():
|
|
178
|
+
errs.append(f"{md.relative_to(REPO)}: description must be a non-empty string")
|
|
179
|
+
else:
|
|
180
|
+
n = count_sentences(description)
|
|
181
|
+
if n > 3:
|
|
182
|
+
errs.append(
|
|
183
|
+
f"{md.relative_to(REPO)}: description has {n} sentences; Kiro limit is 3",
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
keywords = data["keywords"]
|
|
187
|
+
if not isinstance(keywords, list) or not any(
|
|
188
|
+
isinstance(k, str) and k.strip() for k in keywords
|
|
189
|
+
):
|
|
190
|
+
errs.append(f"{md.relative_to(REPO)}: keywords must be a non-empty list")
|
|
191
|
+
else:
|
|
192
|
+
for k in keywords:
|
|
193
|
+
if not isinstance(k, str):
|
|
194
|
+
errs.append(f"{md.relative_to(REPO)}: keyword {k!r} is not a string")
|
|
195
|
+
elif k.lower() in BROAD_KEYWORDS:
|
|
196
|
+
errs.append(
|
|
197
|
+
f"{md.relative_to(REPO)}: keyword {k!r} is too broad; "
|
|
198
|
+
"Kiro docs warn that broad keywords cause false activations",
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
if not isinstance(data.get("author"), str) or not data["author"].strip():
|
|
202
|
+
errs.append(f"{md.relative_to(REPO)}: author must be a non-empty string")
|
|
203
|
+
if not isinstance(data.get("displayName"), str) or not data["displayName"].strip():
|
|
204
|
+
errs.append(f"{md.relative_to(REPO)}: displayName must be a non-empty string")
|
|
205
|
+
|
|
206
|
+
return errs
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def main() -> int:
|
|
210
|
+
if not POWERS.is_dir():
|
|
211
|
+
fail("powers/ directory is missing")
|
|
212
|
+
return 1
|
|
213
|
+
|
|
214
|
+
errors: list[str] = []
|
|
215
|
+
power_dirs = sorted(p for p in POWERS.iterdir() if p.is_dir())
|
|
216
|
+
if not power_dirs:
|
|
217
|
+
fail("no powers found under powers/")
|
|
218
|
+
return 1
|
|
219
|
+
|
|
220
|
+
for d in power_dirs:
|
|
221
|
+
errors.extend(validate_power(d))
|
|
222
|
+
|
|
223
|
+
# Generator drift
|
|
224
|
+
result = subprocess.run(
|
|
225
|
+
["node", str(GENERATOR), "--check"],
|
|
226
|
+
capture_output=True,
|
|
227
|
+
text=True,
|
|
228
|
+
timeout=60,
|
|
229
|
+
)
|
|
230
|
+
if result.returncode != 0:
|
|
231
|
+
errors.append((result.stderr or result.stdout).strip())
|
|
232
|
+
|
|
233
|
+
if errors:
|
|
234
|
+
for err in errors:
|
|
235
|
+
fail(err)
|
|
236
|
+
return 1
|
|
237
|
+
|
|
238
|
+
print(f"OK: {len(power_dirs)} Kiro Powers valid (strict-5 frontmatter, kebab-case names, ≤3-sentence descriptions, generator in sync)")
|
|
239
|
+
return 0
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
if __name__ == "__main__":
|
|
243
|
+
sys.exit(main())
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate README local links and catalog official links."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
import sys
|
|
10
|
+
import urllib.request
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
14
|
+
LOCAL_LINK_RE = re.compile(r"\[([^\]]+)\]\((?!https?://|mailto:|#)([^)]+)\)")
|
|
15
|
+
URL_RE = re.compile(r"https?://[^\s>)]+")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def load_json(path: Path):
|
|
19
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def catalog_urls() -> list[str]:
|
|
23
|
+
urls: list[str] = []
|
|
24
|
+
for path in (ROOT / "catalog").glob("*.json"):
|
|
25
|
+
data = load_json(path)
|
|
26
|
+
if isinstance(data, list):
|
|
27
|
+
for item in data:
|
|
28
|
+
urls.extend(item.get("official_docs", []))
|
|
29
|
+
if item.get("official_project_url"):
|
|
30
|
+
urls.append(item["official_project_url"])
|
|
31
|
+
return sorted(set(urls))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def markdown_urls() -> list[str]:
|
|
35
|
+
urls: list[str] = []
|
|
36
|
+
for path in [ROOT / "README.md", *ROOT.glob("mcp/**/*.md"), *ROOT.glob("docs/**/*.md")]:
|
|
37
|
+
if path.exists():
|
|
38
|
+
urls.extend(URL_RE.findall(path.read_text(encoding="utf-8", errors="ignore")))
|
|
39
|
+
return sorted(set(urls))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def validate_local_readme_links(errors: list[str]) -> None:
|
|
43
|
+
readme = ROOT / "README.md"
|
|
44
|
+
text = readme.read_text(encoding="utf-8")
|
|
45
|
+
for _, raw in LOCAL_LINK_RE.findall(text):
|
|
46
|
+
target = raw.split("#", 1)[0]
|
|
47
|
+
if not target:
|
|
48
|
+
continue
|
|
49
|
+
if not (ROOT / target).exists():
|
|
50
|
+
errors.append(f"README local link does not exist: {raw}")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def check_url(url: str, errors: list[str]) -> None:
|
|
54
|
+
req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "vanguard-frontier-agentic-link-check/1.0"})
|
|
55
|
+
try:
|
|
56
|
+
with urllib.request.urlopen(req, timeout=15) as resp:
|
|
57
|
+
if resp.status >= 400:
|
|
58
|
+
errors.append(f"{url}: HTTP {resp.status}")
|
|
59
|
+
except Exception:
|
|
60
|
+
# Some sites reject HEAD. Retry GET with a small range.
|
|
61
|
+
req = urllib.request.Request(url, method="GET", headers={"User-Agent": "vanguard-frontier-agentic-link-check/1.0", "Range": "bytes=0-1024"})
|
|
62
|
+
try:
|
|
63
|
+
with urllib.request.urlopen(req, timeout=15) as resp:
|
|
64
|
+
if resp.status >= 400:
|
|
65
|
+
errors.append(f"{url}: HTTP {resp.status}")
|
|
66
|
+
except Exception as exc:
|
|
67
|
+
errors.append(f"{url}: {exc}")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def main() -> int:
|
|
71
|
+
parser = argparse.ArgumentParser()
|
|
72
|
+
parser.add_argument("--offline", action="store_true", help="Only validate local links and URL syntax.")
|
|
73
|
+
args = parser.parse_args()
|
|
74
|
+
|
|
75
|
+
errors: list[str] = []
|
|
76
|
+
validate_local_readme_links(errors)
|
|
77
|
+
urls = sorted(set(catalog_urls() + markdown_urls()))
|
|
78
|
+
for url in urls:
|
|
79
|
+
if not URL_RE.match(url):
|
|
80
|
+
errors.append(f"invalid URL syntax: {url}")
|
|
81
|
+
elif not args.offline:
|
|
82
|
+
check_url(url, errors)
|
|
83
|
+
|
|
84
|
+
if errors:
|
|
85
|
+
for error in errors:
|
|
86
|
+
print(f"ERROR: {error}", file=sys.stderr)
|
|
87
|
+
return 1
|
|
88
|
+
mode = "offline" if args.offline else "online"
|
|
89
|
+
print(f"OK: validated README links and {len(urls)} URLs ({mode})")
|
|
90
|
+
return 0
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
raise SystemExit(main())
|