@raishin/vanguard-frontier-agentic 3.8.0 → 3.10.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/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +33 -1
- package/.cursor-plugin/plugin.json +33 -19
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +62 -21
- package/agents/AGENTS.md +16 -3
- package/agents/snowflake/AGENTS.md +199 -0
- package/agents/snowflake/README.md +227 -65
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/AGENT.md +149 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/claude-code.agent.md +132 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/codex.toml +41 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/copilot.agent.md +138 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/cursor.agent.md +133 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/gemini.agent.md +132 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/harnesses/kiro-ide.agent.md +132 -0
- package/agents/snowflake/snowflake-analytics-semantic-data-product-agent/metadata.json +60 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/AGENT.md +160 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/claude-code.agent.md +143 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/copilot.agent.md +149 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/cursor.agent.md +144 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/gemini.agent.md +143 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/harnesses/kiro-ide.agent.md +143 -0
- package/agents/snowflake/snowflake-bcdr-resilience-agent/metadata.json +63 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/AGENT.md +155 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/claude-code.agent.md +138 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/copilot.agent.md +144 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/cursor.agent.md +139 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/gemini.agent.md +138 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/harnesses/kiro-ide.agent.md +138 -0
- package/agents/snowflake/snowflake-business-value-adoption-strategist-agent/metadata.json +60 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/AGENT.md +150 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/claude-code.agent.md +133 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/codex.toml +41 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/copilot.agent.md +139 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/cursor.agent.md +134 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/gemini.agent.md +133 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/harnesses/kiro-ide.agent.md +133 -0
- package/agents/snowflake/snowflake-compliance-evidence-auditor-agent/metadata.json +62 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/AGENT.md +166 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/claude-code.agent.md +149 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/codex.toml +44 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/copilot.agent.md +155 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/cursor.agent.md +150 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/gemini.agent.md +149 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/harnesses/kiro-ide.agent.md +149 -0
- package/agents/snowflake/snowflake-cortex-ai-agent-security-governor-agent/metadata.json +65 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/AGENT.md +156 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/claude-code.agent.md +139 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/codex.toml +42 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/copilot.agent.md +145 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/cursor.agent.md +140 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/gemini.agent.md +139 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/harnesses/kiro-ide.agent.md +139 -0
- package/agents/snowflake/snowflake-data-engineering-pipelines-agent/metadata.json +63 -0
- package/agents/snowflake/snowflake-data-platform-engineering-at-azure-agent/metadata.json +6 -3
- package/agents/snowflake/snowflake-data-science-ml-agent/AGENT.md +155 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/claude-code.agent.md +138 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/codex.toml +42 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/copilot.agent.md +144 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/cursor.agent.md +139 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/gemini.agent.md +138 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/harnesses/kiro-ide.agent.md +138 -0
- package/agents/snowflake/snowflake-data-science-ml-agent/metadata.json +60 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/AGENT.md +157 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/claude-code.agent.md +140 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/copilot.agent.md +146 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/cursor.agent.md +141 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/gemini.agent.md +140 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/harnesses/kiro-ide.agent.md +140 -0
- package/agents/snowflake/snowflake-devops-iac-release-agent/metadata.json +63 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/AGENT.md +157 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/claude-code.agent.md +140 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/copilot.agent.md +146 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/cursor.agent.md +141 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/gemini.agent.md +140 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/harnesses/kiro-ide.agent.md +140 -0
- package/agents/snowflake/snowflake-finops-cost-governor-agent/metadata.json +62 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/AGENT.md +155 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/claude-code.agent.md +138 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/codex.toml +42 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/copilot.agent.md +144 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/cursor.agent.md +139 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/gemini.agent.md +138 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/harnesses/kiro-ide.agent.md +138 -0
- package/agents/snowflake/snowflake-governance-privacy-agent/metadata.json +64 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/AGENT.md +155 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/claude-code.agent.md +138 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/codex.toml +42 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/copilot.agent.md +144 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/cursor.agent.md +139 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/gemini.agent.md +138 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/harnesses/kiro-ide.agent.md +138 -0
- package/agents/snowflake/snowflake-identity-access-security-agent/metadata.json +69 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/AGENT.md +170 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/PERMISSIONS.md +81 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/PREFLIGHT.md +45 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/ROLLBACK.md +38 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/claude-code.agent.md +133 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/codex.toml +45 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/copilot.agent.md +139 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/cursor.agent.md +134 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/gemini.agent.md +133 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/harnesses/kiro-ide.agent.md +133 -0
- package/agents/snowflake/snowflake-live-auth-network-policy-guard-agent/metadata.json +76 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/AGENT.md +171 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/PERMISSIONS.md +80 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/PREFLIGHT.md +45 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/ROLLBACK.md +38 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/claude-code.agent.md +134 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/codex.toml +45 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/copilot.agent.md +140 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/cursor.agent.md +135 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/gemini.agent.md +134 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/harnesses/kiro-ide.agent.md +134 -0
- package/agents/snowflake/snowflake-live-data-protection-policy-guard-agent/metadata.json +76 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/AGENT.md +179 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/PERMISSIONS.md +81 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/PREFLIGHT.md +49 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/ROLLBACK.md +40 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/claude-code.agent.md +142 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/codex.toml +47 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/copilot.agent.md +148 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/cursor.agent.md +143 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/gemini.agent.md +142 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/harnesses/kiro-ide.agent.md +142 -0
- package/agents/snowflake/snowflake-live-failover-promotion-guard-agent/metadata.json +76 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/AGENT.md +172 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/PERMISSIONS.md +80 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/PREFLIGHT.md +47 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/ROLLBACK.md +39 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/claude-code.agent.md +135 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/codex.toml +45 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/copilot.agent.md +141 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/cursor.agent.md +136 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/gemini.agent.md +135 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/harnesses/kiro-ide.agent.md +135 -0
- package/agents/snowflake/snowflake-live-pipeline-streaming-change-guard-agent/metadata.json +78 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/AGENT.md +167 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/PERMISSIONS.md +78 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/PREFLIGHT.md +44 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/ROLLBACK.md +38 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/claude-code.agent.md +130 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/codex.toml +44 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/copilot.agent.md +136 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/cursor.agent.md +131 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/gemini.agent.md +130 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/harnesses/kiro-ide.agent.md +130 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-agent/metadata.json +76 -0
- package/agents/snowflake/snowflake-live-rbac-grant-guard-at-azure-agent/metadata.json +11 -4
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/AGENT.md +170 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/PERMISSIONS.md +80 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/PREFLIGHT.md +47 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/ROLLBACK.md +39 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/claude-code.agent.md +133 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/codex.toml +45 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/copilot.agent.md +139 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/cursor.agent.md +134 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/gemini.agent.md +133 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/harnesses/kiro-ide.agent.md +133 -0
- package/agents/snowflake/snowflake-live-warehouse-cost-change-guard-agent/metadata.json +76 -0
- package/agents/snowflake/snowflake-maestro-agent/AGENT.md +84 -0
- package/agents/snowflake/snowflake-maestro-agent/README.md +71 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/claude-code.agent.md +67 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/codex.toml +41 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/copilot.agent.md +73 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/cursor.agent.md +68 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/gemini.agent.md +67 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-maestro-agent/harnesses/kiro-ide.agent.md +67 -0
- package/agents/snowflake/snowflake-maestro-agent/metadata.json +47 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/AGENT.md +160 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/claude-code.agent.md +143 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/copilot.agent.md +149 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/cursor.agent.md +144 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/gemini.agent.md +143 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/harnesses/kiro-ide.agent.md +143 -0
- package/agents/snowflake/snowflake-migration-modernization-agent/metadata.json +63 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/AGENT.md +157 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/claude-code.agent.md +140 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/codex.toml +42 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/copilot.agent.md +146 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/cursor.agent.md +141 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/gemini.agent.md +140 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/harnesses/kiro-ide.agent.md +140 -0
- package/agents/snowflake/snowflake-native-app-marketplace-product-agent/metadata.json +61 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/AGENT.md +149 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/claude-code.agent.md +132 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/codex.toml +41 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/copilot.agent.md +138 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/cursor.agent.md +133 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/gemini.agent.md +132 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/harnesses/kiro-ide.agent.md +132 -0
- package/agents/snowflake/snowflake-network-private-connectivity-agent/metadata.json +61 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/AGENT.md +146 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/claude-code.agent.md +129 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/codex.toml +40 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/copilot.agent.md +135 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/cursor.agent.md +130 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/gemini.agent.md +129 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/harnesses/kiro-ide.agent.md +129 -0
- package/agents/snowflake/snowflake-platform-administrator-agent/metadata.json +57 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/AGENT.md +153 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/claude-code.agent.md +136 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/codex.toml +41 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/copilot.agent.md +142 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/cursor.agent.md +137 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/gemini.agent.md +136 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/harnesses/kiro-ide.agent.md +136 -0
- package/agents/snowflake/snowflake-query-performance-engineer-agent/metadata.json +63 -0
- package/agents/snowflake/snowflake-rbac-access-governance-at-azure-agent/metadata.json +6 -3
- package/agents/snowflake/snowflake-solution-architect-agent/AGENT.md +144 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/claude-code.agent.md +127 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/codex.toml +40 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/copilot.agent.md +133 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/cursor.agent.md +128 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/gemini.agent.md +127 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-solution-architect-agent/harnesses/kiro-ide.agent.md +127 -0
- package/agents/snowflake/snowflake-solution-architect-agent/metadata.json +59 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/AGENT.md +158 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/claude-code.agent.md +141 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/codex.toml +43 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/copilot.agent.md +147 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/cursor.agent.md +142 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/gemini.agent.md +141 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/harnesses/kiro-ide.agent.md +141 -0
- package/agents/snowflake/snowflake-streaming-ingestion-reliability-agent/metadata.json +61 -0
- package/agents/terraform/terraform-engine-compatibility-agent/AGENT.md +92 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/claude-code.agent.md +75 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/codex.toml +44 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/copilot.agent.md +81 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/cursor.agent.md +76 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/gemini.agent.md +75 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-engine-compatibility-agent/harnesses/kiro-ide.agent.md +75 -0
- package/agents/terraform/terraform-engine-compatibility-agent/metadata.json +58 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/AGENT.md +91 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/claude-code.agent.md +74 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/codex.toml +44 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/copilot.agent.md +80 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/cursor.agent.md +75 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/gemini.agent.md +74 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/harnesses/kiro-ide.agent.md +74 -0
- package/agents/terraform/terraform-estate-reconciliation-agent/metadata.json +57 -0
- package/agents/terraform/terraform-execution-governance-agent/AGENT.md +94 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/claude-code.agent.md +77 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/codex.toml +45 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/copilot.agent.md +83 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/cursor.agent.md +78 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/gemini.agent.md +77 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-execution-governance-agent/harnesses/kiro-ide.agent.md +77 -0
- package/agents/terraform/terraform-execution-governance-agent/metadata.json +57 -0
- package/agents/terraform/terraform-maestro-agent/AGENT.md +26 -20
- package/agents/terraform/terraform-maestro-agent/README.md +72 -0
- package/agents/terraform/terraform-maestro-agent/harnesses/claude-code.agent.md +27 -21
- package/agents/terraform/terraform-maestro-agent/harnesses/codex.toml +36 -6
- package/agents/terraform/terraform-maestro-agent/harnesses/copilot.agent.md +27 -28
- package/agents/terraform/terraform-maestro-agent/harnesses/cursor.agent.md +27 -22
- package/agents/terraform/terraform-maestro-agent/harnesses/gemini.agent.md +27 -22
- package/agents/terraform/terraform-maestro-agent/harnesses/kiro-cli.agent.json +3 -3
- package/agents/terraform/terraform-maestro-agent/harnesses/kiro-ide.agent.md +27 -21
- package/agents/terraform/terraform-maestro-agent/metadata.json +20 -11
- package/agents/terraform/terraform-plan-blast-radius-agent/AGENT.md +93 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/claude-code.agent.md +76 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/codex.toml +44 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/copilot.agent.md +82 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/cursor.agent.md +77 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/gemini.agent.md +76 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/harnesses/kiro-ide.agent.md +76 -0
- package/agents/terraform/terraform-plan-blast-radius-agent/metadata.json +56 -0
- package/agents/terraform/terraform-policy-evidence-agent/AGENT.md +92 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/claude-code.agent.md +75 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/codex.toml +44 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/copilot.agent.md +81 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/cursor.agent.md +76 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/gemini.agent.md +75 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-policy-evidence-agent/harnesses/kiro-ide.agent.md +75 -0
- package/agents/terraform/terraform-policy-evidence-agent/metadata.json +59 -0
- package/agents/terraform/terraform-reviewer/AGENT.md +78 -17
- package/agents/terraform/terraform-reviewer/harnesses/claude-code.agent.md +62 -18
- package/agents/terraform/terraform-reviewer/harnesses/codex.toml +27 -14
- package/agents/terraform/terraform-reviewer/harnesses/copilot.agent.md +62 -25
- package/agents/terraform/terraform-reviewer/harnesses/cursor.agent.md +62 -19
- package/agents/terraform/terraform-reviewer/harnesses/gemini.agent.md +62 -19
- package/agents/terraform/terraform-reviewer/harnesses/kiro-cli.agent.json +3 -3
- package/agents/terraform/terraform-reviewer/harnesses/kiro-ide.agent.md +62 -18
- package/agents/terraform/terraform-reviewer/metadata.json +32 -13
- package/agents/terraform/terraform-state-reliability-agent/AGENT.md +92 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/claude-code.agent.md +75 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/codex.toml +45 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/copilot.agent.md +81 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/cursor.agent.md +76 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/gemini.agent.md +75 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-state-reliability-agent/harnesses/kiro-ide.agent.md +75 -0
- package/agents/terraform/terraform-state-reliability-agent/metadata.json +60 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/AGENT.md +91 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/claude-code.agent.md +74 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/codex.toml +45 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/copilot.agent.md +80 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/cursor.agent.md +75 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/gemini.agent.md +74 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/harnesses/kiro-ide.agent.md +74 -0
- package/agents/terraform/terraform-supply-chain-integrity-agent/metadata.json +57 -0
- package/catalog/AGENTS.md +1 -0
- package/catalog/agents.json +2201 -626
- package/catalog/asset-integrity.json +2326 -126
- package/catalog/index.json +3 -2
- package/catalog/install-roles.json +178 -9
- package/catalog/model-assignments.json +1065 -9
- package/catalog/skill-manifest.json +1108 -40
- package/catalog/skills.json +1629 -512
- package/catalog/workflows.json +50 -0
- package/package.json +9 -5
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/powers/README.md +2 -5
- package/powers/vanguard-cilium/POWER.md +2 -2
- package/powers/vanguard-microsoft/POWER.md +0 -2
- package/powers/vanguard-snowflake/POWER.md +19 -13
- package/powers/vanguard-terraform/POWER.md +1 -1
- package/scripts/gen_snowflake_agents.py +1158 -0
- package/scripts/gen_terraform_agents.py +689 -0
- package/scripts/generate-board-counts.mjs +281 -0
- package/scripts/generate-docs-data.mjs +13 -0
- package/scripts/generate-kiro-powers.mjs +7 -7
- package/scripts/generate-workflow-catalog.mjs +308 -0
- package/scripts/snowflake_data/agents/00-snowflake-maestro-agent.json +211 -0
- package/scripts/snowflake_data/agents/01-snowflake-solution-architect-agent.json +336 -0
- package/scripts/snowflake_data/agents/02-snowflake-platform-administrator-agent.json +259 -0
- package/scripts/snowflake_data/agents/03-snowflake-identity-access-security-agent.json +364 -0
- package/scripts/snowflake_data/agents/04-snowflake-network-private-connectivity-agent.json +266 -0
- package/scripts/snowflake_data/agents/05-snowflake-governance-privacy-agent.json +291 -0
- package/scripts/snowflake_data/agents/06-snowflake-compliance-evidence-auditor-agent.json +264 -0
- package/scripts/snowflake_data/agents/07-snowflake-finops-cost-governor-agent.json +353 -0
- package/scripts/snowflake_data/agents/08-snowflake-query-performance-engineer-agent.json +292 -0
- package/scripts/snowflake_data/agents/09-snowflake-data-engineering-pipelines-agent.json +296 -0
- package/scripts/snowflake_data/agents/10-snowflake-streaming-ingestion-reliability-agent.json +331 -0
- package/scripts/snowflake_data/agents/11-snowflake-analytics-semantic-data-product-agent.json +267 -0
- package/scripts/snowflake_data/agents/12-snowflake-data-science-ml-agent.json +269 -0
- package/scripts/snowflake_data/agents/13-snowflake-cortex-ai-agent-security-governor-agent.json +347 -0
- package/scripts/snowflake_data/agents/14-snowflake-native-app-marketplace-product-agent.json +274 -0
- package/scripts/snowflake_data/agents/15-snowflake-bcdr-resilience-agent.json +325 -0
- package/scripts/snowflake_data/agents/16-snowflake-devops-iac-release-agent.json +292 -0
- package/scripts/snowflake_data/agents/17-snowflake-migration-modernization-agent.json +251 -0
- package/scripts/snowflake_data/agents/18-snowflake-business-value-adoption-strategist-agent.json +262 -0
- package/scripts/snowflake_data/agents/19-snowflake-live-rbac-grant-guard-agent.json +299 -0
- package/scripts/snowflake_data/agents/20-snowflake-live-auth-network-policy-guard-agent.json +303 -0
- package/scripts/snowflake_data/agents/21-snowflake-live-warehouse-cost-change-guard-agent.json +314 -0
- package/scripts/snowflake_data/agents/22-snowflake-live-data-protection-policy-guard-agent.json +310 -0
- package/scripts/snowflake_data/agents/23-snowflake-live-pipeline-streaming-change-guard-agent.json +316 -0
- package/scripts/snowflake_data/agents/24-snowflake-live-failover-promotion-guard-agent.json +338 -0
- package/scripts/terraform_data/agents/00-terraform-maestro-agent.json +132 -0
- package/scripts/terraform_data/agents/01-terraform-reviewer.json +195 -0
- package/scripts/terraform_data/agents/02-terraform-plan-blast-radius-agent.json +226 -0
- package/scripts/terraform_data/agents/03-terraform-state-reliability-agent.json +254 -0
- package/scripts/terraform_data/agents/04-terraform-estate-reconciliation-agent.json +225 -0
- package/scripts/terraform_data/agents/05-terraform-supply-chain-integrity-agent.json +220 -0
- package/scripts/terraform_data/agents/06-terraform-engine-compatibility-agent.json +236 -0
- package/scripts/terraform_data/agents/07-terraform-policy-evidence-agent.json +226 -0
- package/scripts/terraform_data/agents/08-terraform-execution-governance-agent.json +203 -0
- package/scripts/terraform_data/skills/terraform-verification-strategy.json +117 -0
- package/scripts/update-catalog-new-agents.py +5 -1
- package/skills/snowflake/snowflake-analytics-semantic-data-product/SKILL.md +102 -0
- package/skills/snowflake/snowflake-analytics-semantic-data-product/metadata.json +28 -0
- package/skills/snowflake/snowflake-analytics-semantic-data-product/references/grain-joins-and-analytical-traps.md +59 -0
- package/skills/snowflake/snowflake-analytics-semantic-data-product/references/semantic-models-and-metric-contracts.md +36 -0
- package/skills/snowflake/snowflake-bcdr-resilience/SKILL.md +108 -0
- package/skills/snowflake/snowflake-bcdr-resilience/metadata.json +28 -0
- package/skills/snowflake/snowflake-bcdr-resilience/references/dependency-matrix-and-proof.md +33 -0
- package/skills/snowflake/snowflake-bcdr-resilience/references/replication-failover-and-edition-constraints.md +64 -0
- package/skills/snowflake/snowflake-business-value-adoption-strategist/SKILL.md +109 -0
- package/skills/snowflake/snowflake-business-value-adoption-strategist/metadata.json +27 -0
- package/skills/snowflake/snowflake-business-value-adoption-strategist/references/adoption-attribution-and-realization.md +31 -0
- package/skills/snowflake/snowflake-business-value-adoption-strategist/references/value-hypothesis-and-baseline.md +26 -0
- package/skills/snowflake/snowflake-compliance-evidence-auditor/SKILL.md +102 -0
- package/skills/snowflake/snowflake-compliance-evidence-auditor/metadata.json +28 -0
- package/skills/snowflake/snowflake-compliance-evidence-auditor/references/control-mapping-and-claim-boundaries.md +24 -0
- package/skills/snowflake/snowflake-compliance-evidence-auditor/references/evidence-sources-and-their-limits.md +81 -0
- package/skills/snowflake/snowflake-cortex-ai-agent-security-governor/SKILL.md +109 -0
- package/skills/snowflake/snowflake-cortex-ai-agent-security-governor/metadata.json +29 -0
- package/skills/snowflake/snowflake-cortex-ai-agent-security-governor/references/agent-access-and-effective-reach.md +84 -0
- package/skills/snowflake/snowflake-cortex-ai-agent-security-governor/references/injection-tools-and-exfiltration.md +45 -0
- package/skills/snowflake/snowflake-data-engineering-pipelines/SKILL.md +105 -0
- package/skills/snowflake/snowflake-data-engineering-pipelines/metadata.json +29 -0
- package/skills/snowflake/snowflake-data-engineering-pipelines/references/correctness-properties-and-reconciliation.md +57 -0
- package/skills/snowflake/snowflake-data-engineering-pipelines/references/streams-tasks-and-dynamic-tables.md +72 -0
- package/skills/snowflake/snowflake-data-platform-engineering-at-azure/metadata.json +4 -1
- package/skills/snowflake/snowflake-data-science-ml/SKILL.md +105 -0
- package/skills/snowflake/snowflake-data-science-ml/metadata.json +28 -0
- package/skills/snowflake/snowflake-data-science-ml/references/leakage-skew-and-reproducibility.md +29 -0
- package/skills/snowflake/snowflake-data-science-ml/references/registry-monitoring-and-lifecycle.md +33 -0
- package/skills/snowflake/snowflake-devops-iac-release/SKILL.md +107 -0
- package/skills/snowflake/snowflake-devops-iac-release/metadata.json +28 -0
- package/skills/snowflake/snowflake-devops-iac-release/references/plan-review-pipeline-and-rollback.md +56 -0
- package/skills/snowflake/snowflake-devops-iac-release/references/provider-stability-and-upgrades.md +35 -0
- package/skills/snowflake/snowflake-finops-cost-governor/SKILL.md +107 -0
- package/skills/snowflake/snowflake-finops-cost-governor/metadata.json +28 -0
- package/skills/snowflake/snowflake-finops-cost-governor/references/attribution-and-idle.md +79 -0
- package/skills/snowflake/snowflake-finops-cost-governor/references/budgets-versus-resource-monitors.md +62 -0
- package/skills/snowflake/snowflake-finops-cost-governor/references/optimization-economics.md +24 -0
- package/skills/snowflake/snowflake-governance-privacy/SKILL.md +107 -0
- package/skills/snowflake/snowflake-governance-privacy/metadata.json +29 -0
- package/skills/snowflake/snowflake-governance-privacy/references/classification-lineage-and-quality.md +31 -0
- package/skills/snowflake/snowflake-governance-privacy/references/policy-attachment-and-propagation.md +74 -0
- package/skills/snowflake/snowflake-identity-access-security/SKILL.md +106 -0
- package/skills/snowflake/snowflake-identity-access-security/metadata.json +29 -0
- package/skills/snowflake/snowflake-identity-access-security/references/authentication-and-strong-auth-rollout.md +84 -0
- package/skills/snowflake/snowflake-identity-access-security/references/effective-access-computation.md +91 -0
- package/skills/snowflake/snowflake-identity-access-security/references/privilege-escalation-patterns.md +23 -0
- package/skills/snowflake/snowflake-live-auth-network-policy-guard/SKILL.md +124 -0
- package/skills/snowflake/snowflake-live-auth-network-policy-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-auth-network-policy-guard/references/surviving-path-proof.md +62 -0
- package/skills/snowflake/snowflake-live-data-protection-policy-guard/SKILL.md +125 -0
- package/skills/snowflake/snowflake-live-data-protection-policy-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-data-protection-policy-guard/references/visibility-prediction-and-consumption-paths.md +81 -0
- package/skills/snowflake/snowflake-live-failover-promotion-guard/SKILL.md +133 -0
- package/skills/snowflake/snowflake-live-failover-promotion-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-failover-promotion-guard/references/promotion-preconditions-and-failback.md +68 -0
- package/skills/snowflake/snowflake-live-pipeline-streaming-change-guard/SKILL.md +127 -0
- package/skills/snowflake/snowflake-live-pipeline-streaming-change-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-pipeline-streaming-change-guard/references/duplication-loss-analysis-and-reconciliation.md +80 -0
- package/skills/snowflake/snowflake-live-rbac-grant-guard/SKILL.md +123 -0
- package/skills/snowflake/snowflake-live-rbac-grant-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-rbac-grant-guard/references/inheritance-impact-and-usage-evidence.md +88 -0
- package/skills/snowflake/snowflake-live-rbac-grant-guard-at-azure/metadata.json +12 -2
- package/skills/snowflake/snowflake-live-warehouse-cost-change-guard/SKILL.md +124 -0
- package/skills/snowflake/snowflake-live-warehouse-cost-change-guard/metadata.json +28 -0
- package/skills/snowflake/snowflake-live-warehouse-cost-change-guard/references/baseline-prediction-and-rollback-trigger.md +84 -0
- package/skills/snowflake/snowflake-maestro/SKILL.md +101 -0
- package/skills/snowflake/snowflake-maestro/metadata.json +27 -0
- package/skills/snowflake/snowflake-maestro/references/capability-boundaries.md +19 -0
- package/skills/snowflake/snowflake-maestro/references/routing-matrix.md +60 -0
- package/skills/snowflake/snowflake-migration-modernization/SKILL.md +105 -0
- package/skills/snowflake/snowflake-migration-modernization/metadata.json +28 -0
- package/skills/snowflake/snowflake-migration-modernization/references/semantic-compatibility-and-reconciliation.md +23 -0
- package/skills/snowflake/snowflake-migration-modernization/references/wave-planning-dual-run-and-rollback.md +25 -0
- package/skills/snowflake/snowflake-native-app-marketplace-product/SKILL.md +105 -0
- package/skills/snowflake/snowflake-native-app-marketplace-product/metadata.json +28 -0
- package/skills/snowflake/snowflake-native-app-marketplace-product/references/lifecycle-pricing-and-supportability.md +33 -0
- package/skills/snowflake/snowflake-native-app-marketplace-product/references/trust-boundary-and-privileges.md +32 -0
- package/skills/snowflake/snowflake-network-private-connectivity/SKILL.md +102 -0
- package/skills/snowflake/snowflake-network-private-connectivity/metadata.json +28 -0
- package/skills/snowflake/snowflake-network-private-connectivity/references/network-policies-and-effective-scope.md +60 -0
- package/skills/snowflake/snowflake-network-private-connectivity/references/private-connectivity-and-public-path.md +43 -0
- package/skills/snowflake/snowflake-platform-administrator/SKILL.md +102 -0
- package/skills/snowflake/snowflake-platform-administrator/metadata.json +28 -0
- package/skills/snowflake/snowflake-platform-administrator/references/account-parameters-and-resolution.md +34 -0
- package/skills/snowflake/snowflake-platform-administrator/references/drift-and-operational-readiness.md +18 -0
- package/skills/snowflake/snowflake-platform-administrator/references/ownership-and-object-lifecycle.md +54 -0
- package/skills/snowflake/snowflake-query-performance-engineer/SKILL.md +103 -0
- package/skills/snowflake/snowflake-query-performance-engineer/metadata.json +29 -0
- package/skills/snowflake/snowflake-query-performance-engineer/references/acceleration-features-and-their-continuous-cost.md +60 -0
- package/skills/snowflake/snowflake-query-performance-engineer/references/diagnosis-from-profile-and-history.md +78 -0
- package/skills/snowflake/snowflake-rbac-access-governance-at-azure/metadata.json +4 -1
- package/skills/snowflake/snowflake-solution-architect/SKILL.md +101 -0
- package/skills/snowflake/snowflake-solution-architect/metadata.json +28 -0
- package/skills/snowflake/snowflake-solution-architect/references/account-and-workload-topologies.md +47 -0
- package/skills/snowflake/snowflake-solution-architect/references/architecture-decision-framework.md +24 -0
- package/skills/snowflake/snowflake-solution-architect/references/edition-cloud-region-constraints.md +28 -0
- package/skills/snowflake/snowflake-solution-architect/references/interoperability-and-data-boundaries.md +17 -0
- package/skills/snowflake/snowflake-streaming-ingestion-reliability/SKILL.md +107 -0
- package/skills/snowflake/snowflake-streaming-ingestion-reliability/metadata.json +28 -0
- package/skills/snowflake/snowflake-streaming-ingestion-reliability/references/architecture-lifecycle-and-migration.md +38 -0
- package/skills/snowflake/snowflake-streaming-ingestion-reliability/references/silent-loss-detection.md +75 -0
- package/skills/terraform/terraform-engine-compatibility/SKILL.md +72 -0
- package/skills/terraform/terraform-engine-compatibility/metadata.json +30 -0
- package/skills/terraform/terraform-engine-compatibility/references/engine-divergence-register.md +17 -0
- package/skills/terraform/terraform-engine-compatibility/references/official-sources.md +19 -0
- package/skills/terraform/terraform-engine-compatibility/references/safety-checklist.md +29 -0
- package/skills/terraform/terraform-engine-compatibility/references/upgrade-risk-and-ordering.md +12 -0
- package/skills/terraform/terraform-engine-compatibility/references/workflow-and-output.md +26 -0
- package/skills/terraform/terraform-estate-reconciliation/SKILL.md +73 -0
- package/skills/terraform/terraform-estate-reconciliation/metadata.json +28 -0
- package/skills/terraform/terraform-estate-reconciliation/references/brownfield-import.md +11 -0
- package/skills/terraform/terraform-estate-reconciliation/references/drift-classification.md +11 -0
- package/skills/terraform/terraform-estate-reconciliation/references/official-sources.md +17 -0
- package/skills/terraform/terraform-estate-reconciliation/references/refactor-and-release.md +11 -0
- package/skills/terraform/terraform-estate-reconciliation/references/safety-checklist.md +30 -0
- package/skills/terraform/terraform-estate-reconciliation/references/workflow-and-output.md +25 -0
- package/skills/terraform/terraform-execution-governance/SKILL.md +74 -0
- package/skills/terraform/terraform-execution-governance/metadata.json +28 -0
- package/skills/terraform/terraform-execution-governance/references/official-sources.md +17 -0
- package/skills/terraform/terraform-execution-governance/references/plan-artifact-and-approval.md +12 -0
- package/skills/terraform/terraform-execution-governance/references/runner-identity-and-privilege.md +11 -0
- package/skills/terraform/terraform-execution-governance/references/safety-checklist.md +30 -0
- package/skills/terraform/terraform-execution-governance/references/workflow-and-output.md +26 -0
- package/skills/terraform/terraform-maestro/SKILL.md +45 -104
- package/skills/terraform/terraform-maestro/metadata.json +8 -13
- package/skills/terraform/terraform-maestro/references/official-sources.md +9 -54
- package/skills/terraform/terraform-maestro/references/routing-thresholds.md +13 -0
- package/skills/terraform/terraform-maestro/references/safety-checklist.md +19 -46
- package/skills/terraform/terraform-maestro/references/workflow-and-output.md +15 -101
- package/skills/terraform/terraform-module-contract/SKILL.md +70 -0
- package/skills/terraform/terraform-module-contract/metadata.json +27 -0
- package/skills/terraform/terraform-module-contract/references/breaking-change-classification.md +10 -0
- package/skills/terraform/terraform-module-contract/references/input-and-output-contracts.md +11 -0
- package/skills/terraform/terraform-module-contract/references/official-sources.md +16 -0
- package/skills/terraform/terraform-module-contract/references/platform-fragmentation.md +10 -0
- package/skills/terraform/terraform-module-contract/references/safety-checklist.md +27 -0
- package/skills/terraform/terraform-module-contract/references/workflow-and-output.md +24 -0
- package/skills/terraform/terraform-plan-blast-radius/SKILL.md +73 -0
- package/skills/terraform/terraform-plan-blast-radius/metadata.json +28 -0
- package/skills/terraform/terraform-plan-blast-radius/references/official-sources.md +17 -0
- package/skills/terraform/terraform-plan-blast-radius/references/ordering-and-destroy-guards.md +11 -0
- package/skills/terraform/terraform-plan-blast-radius/references/plan-to-apply-integrity.md +11 -0
- package/skills/terraform/terraform-plan-blast-radius/references/replacement-attribution.md +11 -0
- package/skills/terraform/terraform-plan-blast-radius/references/safety-checklist.md +29 -0
- package/skills/terraform/terraform-plan-blast-radius/references/workflow-and-output.md +26 -0
- package/skills/terraform/terraform-policy-evidence/SKILL.md +72 -0
- package/skills/terraform/terraform-policy-evidence/metadata.json +29 -0
- package/skills/terraform/terraform-policy-evidence/references/control-mapping-and-enforcement.md +14 -0
- package/skills/terraform/terraform-policy-evidence/references/exceptions-and-evidence.md +12 -0
- package/skills/terraform/terraform-policy-evidence/references/official-sources.md +18 -0
- package/skills/terraform/terraform-policy-evidence/references/safety-checklist.md +30 -0
- package/skills/terraform/terraform-policy-evidence/references/workflow-and-output.md +25 -0
- package/skills/terraform/terraform-state-reliability/SKILL.md +74 -0
- package/skills/terraform/terraform-state-reliability/metadata.json +31 -0
- package/skills/terraform/terraform-state-reliability/references/backend-and-locking.md +11 -0
- package/skills/terraform/terraform-state-reliability/references/official-sources.md +20 -0
- package/skills/terraform/terraform-state-reliability/references/recovery-and-surgery.md +11 -0
- package/skills/terraform/terraform-state-reliability/references/safety-checklist.md +30 -0
- package/skills/terraform/terraform-state-reliability/references/state-confidentiality.md +12 -0
- package/skills/terraform/terraform-state-reliability/references/workflow-and-output.md +25 -0
- package/skills/terraform/terraform-supply-chain-integrity/SKILL.md +74 -0
- package/skills/terraform/terraform-supply-chain-integrity/metadata.json +29 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/installation-paths-and-overrides.md +11 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/lock-file-and-verification.md +11 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/official-sources.md +18 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/safety-checklist.md +30 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/source-addresses-and-registries.md +11 -0
- package/skills/terraform/terraform-supply-chain-integrity/references/workflow-and-output.md +25 -0
- package/skills/terraform/terraform-verification-strategy/SKILL.md +61 -0
- package/skills/terraform/terraform-verification-strategy/metadata.json +27 -0
- package/skills/terraform/terraform-verification-strategy/references/official-sources.md +16 -0
- package/skills/terraform/terraform-verification-strategy/references/proportionate-verification.md +11 -0
- package/skills/terraform/terraform-verification-strategy/references/what-each-check-proves.md +13 -0
- package/tests/_generate_maestro_routing_fixtures.py +36 -0
- package/tests/fixtures/README.md +1 -1
- package/tests/fixtures/snowflake-maestro-routing/expected/01-redteam-accountadmin-shortcut.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/02-redteam-slow-query-resize-reflex.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/03-redteam-cost-spike.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/04-redteam-cortex-agent-production.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/05-redteam-snowpipe-classic-new-build.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/06-redteam-human-password-login.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/07-redteam-service-bot-password.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/08-redteam-masking-policy-deployment.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/09-redteam-network-block-public.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/10-redteam-dr-failover-urgent.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/11-redteam-native-app-publication.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/12-redteam-we-are-compliant.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/13-redteam-terraform-upgrade.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/14-redteam-migration-hype.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/15-redteam-ai-cost-explosion.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/16-redteam-feature-is-not-a-business-case.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/20-negative-pure-performance-no-bcdr.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/21-negative-role-audit-no-data-science.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/22-negative-cost-review-no-native-app.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/23-negative-readonly-analysis-not-a-guard.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/24-negative-ambiguous-request.json +4 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/30-conflict-business-critical-edition.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/31-conflict-tuning-versus-credits.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/32-conflict-egress-for-functionality.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/40-gate-execute-grant.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/41-gate-promote-failover.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/42-gate-injected-approval-in-content.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/43-gate-masking-policy-owner.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/44-gate-row-access-policy-owner.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/45-gate-grant-not-the-deprecated-azure-guard.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/46-gate-network-policy-execution.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/47-gate-warehouse-change-execution.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/48-gate-pipeline-task-resume.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/49-negative-warehouse-review-not-gated.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/expected/50-negative-dr-readiness-not-gated.json +6 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/01-redteam-accountadmin-shortcut.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/02-redteam-slow-query-resize-reflex.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/03-redteam-cost-spike.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/04-redteam-cortex-agent-production.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/05-redteam-snowpipe-classic-new-build.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/06-redteam-human-password-login.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/07-redteam-service-bot-password.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/08-redteam-masking-policy-deployment.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/09-redteam-network-block-public.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/10-redteam-dr-failover-urgent.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/11-redteam-native-app-publication.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/12-redteam-we-are-compliant.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/13-redteam-terraform-upgrade.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/14-redteam-migration-hype.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/15-redteam-ai-cost-explosion.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/16-redteam-feature-is-not-a-business-case.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/20-negative-pure-performance-no-bcdr.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/21-negative-role-audit-no-data-science.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/22-negative-cost-review-no-native-app.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/23-negative-readonly-analysis-not-a-guard.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/24-negative-ambiguous-request.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/30-conflict-business-critical-edition.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/31-conflict-tuning-versus-credits.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/32-conflict-egress-for-functionality.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/40-gate-execute-grant.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/41-gate-promote-failover.json +7 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/42-gate-injected-approval-in-content.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/43-gate-masking-policy-owner.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/44-gate-row-access-policy-owner.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/45-gate-grant-not-the-deprecated-azure-guard.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/46-gate-network-policy-execution.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/47-gate-warehouse-change-execution.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/48-gate-pipeline-task-resume.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/49-negative-warehouse-review-not-gated.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/inputs/50-negative-dr-readiness-not-gated.json +8 -0
- package/tests/fixtures/snowflake-maestro-routing/taxonomy.json +470 -0
- package/tests/fixtures/terraform-maestro-routing/expected/001-happy-engine-compatibility.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/002-happy-estate-reconciliation.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/003-happy-execution-governance.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/004-happy-plan-blast-radius.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/005-happy-policy-evidence.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/007-happy-state-reliability.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/008-happy-supply-chain-integrity.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/009-happy-destroy-plan-review.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/010-adv-verb-not-a-signal.json +6 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-execution-intent-gate.json +4 -0
- package/tests/fixtures/terraform-maestro-routing/expected/adv-instruction-injection.json +1 -1
- package/tests/fixtures/terraform-maestro-routing/expected/adv-persona-replacement.json +1 -1
- package/tests/fixtures/terraform-maestro-routing/expected/adv-secrets-bait.json +3 -2
- package/tests/fixtures/terraform-maestro-routing/inputs/001-happy-engine-compatibility.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/002-happy-estate-reconciliation.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/003-happy-execution-governance.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/004-happy-plan-blast-radius.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/005-happy-policy-evidence.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/006-happy-reviewer.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/007-happy-state-reliability.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/008-happy-supply-chain-integrity.json +7 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/009-happy-destroy-plan-review.json +5 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/010-adv-verb-not-a-signal.json +5 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-execution-intent-gate.json +5 -0
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-instruction-injection.json +1 -1
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-persona-replacement.json +1 -1
- package/tests/fixtures/terraform-maestro-routing/inputs/adv-secrets-bait.json +1 -1
- package/tests/fixtures/terraform-maestro-routing/taxonomy.json +137 -79
- package/tests/validate-maestro-routing.py +16 -1
- package/tests/fixtures/terraform-maestro-routing/inputs/001-happy-reviewer.json +0 -7
- /package/tests/fixtures/terraform-maestro-routing/expected/{001-happy-reviewer.json → 006-happy-reviewer.json} +0 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generate catalog counts and inject them into the documentation that states them.
|
|
4
|
+
*
|
|
5
|
+
* Several docs quote agent, skill, provider, gate, and maestro totals. Typed by
|
|
6
|
+
* hand they go stale silently — a board gains an agent, a gate is added, and the
|
|
7
|
+
* prose keeps asserting last month's number with nothing to catch it. This
|
|
8
|
+
* generator derives every one of them from the repository itself and rewrites
|
|
9
|
+
* the marker spans, the same contract `generate-readme-counts.mjs` applies to
|
|
10
|
+
* README.md.
|
|
11
|
+
*
|
|
12
|
+
* Literal numbers are written into the markdown rather than Liquid variables:
|
|
13
|
+
* these files have no Jekyll front matter and several are read as raw markdown
|
|
14
|
+
* on GitHub, where `{{ site.data... }}` would render as literal braces.
|
|
15
|
+
*
|
|
16
|
+
* Two marker namespaces, both replacing only the number between the markers:
|
|
17
|
+
*
|
|
18
|
+
* <!-- count:board:snowflake:agents -->28<!-- /count --> per provider
|
|
19
|
+
* <!-- count:global:gates -->25<!-- /count --> repo-wide
|
|
20
|
+
*
|
|
21
|
+
* A board key may span providers by joining them with `+`, for a figure that is
|
|
22
|
+
* genuinely about a pair of boards rather than either one:
|
|
23
|
+
*
|
|
24
|
+
* <!-- count:board:legal+hr:agents -->28<!-- /count -->
|
|
25
|
+
*
|
|
26
|
+
* Board keys, derived per provider. Deprecated assets are separated out FIRST
|
|
27
|
+
* and the tier keys then describe only the live board, so the parts sum to the
|
|
28
|
+
* whole without double counting — a deprecated live guard is `deprecated`, not
|
|
29
|
+
* `guards`:
|
|
30
|
+
*
|
|
31
|
+
* agents every agent for the provider, deprecated included
|
|
32
|
+
* deprecated agents whose metadata sets lifecycle: deprecated
|
|
33
|
+
* skills every skill for the provider
|
|
34
|
+
* router non-deprecated `*-maestro-agent` agents, whatever their tier
|
|
35
|
+
* static non-deprecated static-review agents
|
|
36
|
+
* review non-deprecated static-review agents that are NOT the router
|
|
37
|
+
* readonly non-deprecated read-only-runtime agents
|
|
38
|
+
* guards non-deprecated mutating-runtime agents
|
|
39
|
+
* live readonly + guards — the live control plane
|
|
40
|
+
* specialists non-deprecated, non-router agents regardless of declared tier
|
|
41
|
+
*
|
|
42
|
+
* `review` is computed by excluding maestros from the static-review set rather
|
|
43
|
+
* than by subtracting the router count, because a maestro is not always a
|
|
44
|
+
* static-review agent: across this repo maestros are variously static-review,
|
|
45
|
+
* read-only-runtime, or untiered. Subtracting would under-count the specialists
|
|
46
|
+
* on every board whose router is not static-review.
|
|
47
|
+
*
|
|
48
|
+
* Global keys: agents, skills, providers, roles, gates, maestros, rules, mcp.
|
|
49
|
+
*
|
|
50
|
+
* Unknown providers and unknown keys are hard errors: a typo in a marker must
|
|
51
|
+
* fail the gate rather than silently keep a stale number.
|
|
52
|
+
*
|
|
53
|
+
* Mode:
|
|
54
|
+
* (default) rewrite the target documents in place
|
|
55
|
+
* --check compare expected vs actual, exit 1 if stale, 0 if current
|
|
56
|
+
*
|
|
57
|
+
* Run: npm run board-counts:write
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
import fs from "node:fs";
|
|
61
|
+
import path from "node:path";
|
|
62
|
+
import { fileURLToPath } from "node:url";
|
|
63
|
+
|
|
64
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
65
|
+
const check = process.argv.includes("--check");
|
|
66
|
+
|
|
67
|
+
// Documents this generator owns. README.md is deliberately absent: it has its
|
|
68
|
+
// own generator and its own `count:<key>` namespace. Changelogs, ADRs, and
|
|
69
|
+
// dated plan/research documents are also absent on purpose — they record what
|
|
70
|
+
// was true when written, and rewriting their numbers would falsify the record.
|
|
71
|
+
const TARGETS = [
|
|
72
|
+
"docs/language-stack-boards.md",
|
|
73
|
+
"docs/configuration.md",
|
|
74
|
+
"docs/marketplace-model.md",
|
|
75
|
+
"tests/fixtures/README.md",
|
|
76
|
+
"index.md",
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Collect stats from the repository
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
/** Read every metadata.json two levels under `root` (e.g. agents/<provider>/<asset>/). */
|
|
84
|
+
function readMetadata(root) {
|
|
85
|
+
const out = [];
|
|
86
|
+
const base = path.join(repoRoot, root);
|
|
87
|
+
if (!fs.existsSync(base)) return out;
|
|
88
|
+
for (const provider of fs.readdirSync(base)) {
|
|
89
|
+
const providerDir = path.join(base, provider);
|
|
90
|
+
if (!fs.statSync(providerDir).isDirectory()) continue;
|
|
91
|
+
for (const asset of fs.readdirSync(providerDir)) {
|
|
92
|
+
const metaPath = path.join(providerDir, asset, "metadata.json");
|
|
93
|
+
if (!fs.existsSync(metaPath)) continue;
|
|
94
|
+
out.push(JSON.parse(fs.readFileSync(metaPath, "utf8")));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const agentMeta = readMetadata("agents");
|
|
101
|
+
const skillMeta = readMetadata("skills");
|
|
102
|
+
|
|
103
|
+
const BOARD_KEYS = [
|
|
104
|
+
"agents", "deprecated", "skills",
|
|
105
|
+
"router", "static", "review", "readonly", "guards", "live", "specialists",
|
|
106
|
+
];
|
|
107
|
+
|
|
108
|
+
/** @type {Map<string, Record<string, number>>} */
|
|
109
|
+
const stats = new Map();
|
|
110
|
+
|
|
111
|
+
function bucket(provider) {
|
|
112
|
+
if (!stats.has(provider)) {
|
|
113
|
+
stats.set(provider, Object.fromEntries(BOARD_KEYS.map((k) => [k, 0])));
|
|
114
|
+
}
|
|
115
|
+
return stats.get(provider);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
for (const m of agentMeta) {
|
|
119
|
+
if (!m.provider) continue;
|
|
120
|
+
const s = bucket(m.provider);
|
|
121
|
+
s.agents += 1;
|
|
122
|
+
|
|
123
|
+
// Deprecated first, and exclusively: a deprecated live guard is not part of
|
|
124
|
+
// the live board, so counting it under `guards` would both overstate the
|
|
125
|
+
// mutation surface and break the sum against `agents`.
|
|
126
|
+
if (m.lifecycle === "deprecated") {
|
|
127
|
+
s.deprecated += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const isRouter = typeof m.id === "string" && m.id.endsWith("-maestro-agent");
|
|
132
|
+
if (isRouter) s.router += 1;
|
|
133
|
+
// Every non-router agent on the live board, whatever tier it declares — or
|
|
134
|
+
// none at all. Many boards predate the tier field, so `review` (which counts
|
|
135
|
+
// only declared static-review agents) reads 0 for them; `specialists` is the
|
|
136
|
+
// figure those boards actually mean.
|
|
137
|
+
else s.specialists += 1;
|
|
138
|
+
|
|
139
|
+
if (m.execution_tier === "static-review") {
|
|
140
|
+
s.static += 1;
|
|
141
|
+
// Specialists are the static-review agents that are not the router. Derived
|
|
142
|
+
// by exclusion, not by subtracting `router`, because a router is not always
|
|
143
|
+
// static-review — see the header note.
|
|
144
|
+
if (!isRouter) s.review += 1;
|
|
145
|
+
} else if (m.execution_tier === "read-only-runtime") {
|
|
146
|
+
s.readonly += 1;
|
|
147
|
+
} else if (m.execution_tier === "mutating-runtime") {
|
|
148
|
+
s.guards += 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (const m of skillMeta) {
|
|
153
|
+
if (!m.provider) continue;
|
|
154
|
+
bucket(m.provider).skills += 1;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const s of stats.values()) s.live = s.readonly + s.guards;
|
|
158
|
+
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Repo-wide figures
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
|
|
163
|
+
function jsonLen(rel, pick) {
|
|
164
|
+
const p = path.join(repoRoot, rel);
|
|
165
|
+
if (!fs.existsSync(p)) return 0;
|
|
166
|
+
const parsed = JSON.parse(fs.readFileSync(p, "utf8"));
|
|
167
|
+
const v = pick ? pick(parsed) : parsed;
|
|
168
|
+
return Array.isArray(v) ? v.length : Object.keys(v).length;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(repoRoot, "package.json"), "utf8"));
|
|
172
|
+
// Gates = the distinct validate:* scripts the `validate` chain actually runs.
|
|
173
|
+
// Counting the chain rather than every validate:* key means a script that
|
|
174
|
+
// exists but was never wired in is not advertised as an enforced gate.
|
|
175
|
+
const gateCount = new Set(
|
|
176
|
+
(pkg.scripts?.validate ?? "").match(/validate:[a-z0-9-]+/g) ?? [],
|
|
177
|
+
).size;
|
|
178
|
+
|
|
179
|
+
const fixturesDir = path.join(repoRoot, "tests", "fixtures");
|
|
180
|
+
const maestroCount = fs.existsSync(fixturesDir)
|
|
181
|
+
? fs.readdirSync(fixturesDir).filter((d) => d.endsWith("-maestro-routing")).length
|
|
182
|
+
: 0;
|
|
183
|
+
|
|
184
|
+
const globals = {
|
|
185
|
+
agents: agentMeta.length,
|
|
186
|
+
skills: skillMeta.length,
|
|
187
|
+
providers: new Set(agentMeta.map((m) => m.provider).filter(Boolean)).size,
|
|
188
|
+
roles: jsonLen("catalog/install-roles.json", (d) => d.roles ?? d),
|
|
189
|
+
gates: gateCount,
|
|
190
|
+
maestros: maestroCount,
|
|
191
|
+
rules: jsonLen("catalog/rules.json"),
|
|
192
|
+
mcp: jsonLen("catalog/mcp-references.json"),
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Rewrite the marker spans
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
|
|
199
|
+
const markerRe =
|
|
200
|
+
/<!-- count:(board:([a-z0-9+-]+)|global):([a-z]+) -->(\d+)<!-- \/count -->/g;
|
|
201
|
+
|
|
202
|
+
const errors = [];
|
|
203
|
+
const pending = [];
|
|
204
|
+
let seen = 0;
|
|
205
|
+
|
|
206
|
+
for (const rel of TARGETS) {
|
|
207
|
+
const file = path.join(repoRoot, rel);
|
|
208
|
+
if (!fs.existsSync(file)) {
|
|
209
|
+
errors.push(`target document missing: ${rel}`);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const original = fs.readFileSync(file, "utf8");
|
|
213
|
+
|
|
214
|
+
const updated = original.replace(markerRe, (match, scope, providerList, key, current) => {
|
|
215
|
+
seen += 1;
|
|
216
|
+
let expected;
|
|
217
|
+
|
|
218
|
+
if (scope === "global") {
|
|
219
|
+
if (!(key in globals)) {
|
|
220
|
+
errors.push(`${rel}: unknown global key "${key}" — valid: ${Object.keys(globals).sort().join(", ")}`);
|
|
221
|
+
return match;
|
|
222
|
+
}
|
|
223
|
+
expected = String(globals[key]);
|
|
224
|
+
} else {
|
|
225
|
+
if (!BOARD_KEYS.includes(key)) {
|
|
226
|
+
errors.push(`${rel}: unknown board key "${key}" — valid: ${BOARD_KEYS.slice().sort().join(", ")}`);
|
|
227
|
+
return match;
|
|
228
|
+
}
|
|
229
|
+
const providers = providerList.split("+");
|
|
230
|
+
let total = 0;
|
|
231
|
+
let bad = false;
|
|
232
|
+
for (const p of providers) {
|
|
233
|
+
const s = stats.get(p);
|
|
234
|
+
if (!s) {
|
|
235
|
+
errors.push(`${rel}: unknown provider "${p}" in count:board:${providerList}:${key} — no agents or skills found on disk for it`);
|
|
236
|
+
bad = true;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
total += s[key];
|
|
240
|
+
}
|
|
241
|
+
if (bad) return match;
|
|
242
|
+
expected = String(total);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (check && expected !== current) {
|
|
246
|
+
errors.push(`${rel}: stale count:${scope}:${key} — file says ${current}, repository says ${expected}`);
|
|
247
|
+
}
|
|
248
|
+
return `<!-- count:${scope}:${key} -->${expected}<!-- /count -->`;
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
if (updated !== original) pending.push([file, rel, updated]);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (errors.length) {
|
|
255
|
+
console.error("FAIL: generated documentation counts");
|
|
256
|
+
for (const e of errors) console.error(` - ${e}`);
|
|
257
|
+
if (check) console.error("\nRun `npm run board-counts:write` to refresh.");
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (seen === 0) {
|
|
262
|
+
console.error("FAIL: no count:board:* or count:global:* markers found in any target document.");
|
|
263
|
+
console.error(" The generator is wired in but the documents no longer carry markers,");
|
|
264
|
+
console.error(" which means their counts are unguarded. Restore the markers.");
|
|
265
|
+
process.exit(1);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (check) {
|
|
269
|
+
console.log(`OK: documentation counts current (${seen} marker(s) across ${TARGETS.length} document(s))`);
|
|
270
|
+
process.exit(0);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
for (const [file, rel, content] of pending) {
|
|
274
|
+
fs.writeFileSync(file, content);
|
|
275
|
+
console.log(` updated ${rel}`);
|
|
276
|
+
}
|
|
277
|
+
console.log(
|
|
278
|
+
pending.length
|
|
279
|
+
? `OK: documentation counts written (${seen} marker(s), ${pending.length} document(s) changed)`
|
|
280
|
+
: `OK: documentation counts already up to date (${seen} marker(s))`,
|
|
281
|
+
);
|
|
@@ -22,6 +22,14 @@ const mcpRefs = JSON.parse(readFileSync(join(root, 'catalog/mcp-references.json'
|
|
|
22
22
|
const rules = JSON.parse(readFileSync(join(root, 'catalog/rules.json'), 'utf8'));
|
|
23
23
|
const roles = JSON.parse(readFileSync(join(root, 'catalog/install-roles.json'), 'utf8'));
|
|
24
24
|
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
|
|
25
|
+
// Workflow catalog is additive: a checkout without any workflow reports zero rather
|
|
26
|
+
// than failing the docs build, matching how the TUI loader treats a missing file.
|
|
27
|
+
let workflows = [];
|
|
28
|
+
try {
|
|
29
|
+
workflows = JSON.parse(readFileSync(join(root, 'catalog/workflows.json'), 'utf8')).workflows || [];
|
|
30
|
+
} catch {
|
|
31
|
+
workflows = [];
|
|
32
|
+
}
|
|
25
33
|
|
|
26
34
|
// Compute counts
|
|
27
35
|
const providers = [...new Set(agents.map(a => a.provider))].sort();
|
|
@@ -80,6 +88,7 @@ skills: ${skills.length}
|
|
|
80
88
|
providers: ${providers.length}
|
|
81
89
|
mcp_references: ${mcpRefs.length}
|
|
82
90
|
rules: ${rules.length}
|
|
91
|
+
workflows: ${workflows.length}
|
|
83
92
|
install_roles: ${roleIds.length}
|
|
84
93
|
validation_gates: ${validateScripts.length}
|
|
85
94
|
agent_directories: ${agentDirs.length}
|
|
@@ -95,6 +104,10 @@ ${providers.map(p => ` - "${p}"`).join('\n')}
|
|
|
95
104
|
provider_taxonomy:
|
|
96
105
|
${taxonomyYaml}
|
|
97
106
|
|
|
107
|
+
# Workflow list (delegation workflows in .claude/workflows/)
|
|
108
|
+
workflow_list:
|
|
109
|
+
${workflows.length ? workflows.map(w => ` - name: "${w.name}"\n phases: ${(w.phases || []).length}`).join('\n') : ' []'}
|
|
110
|
+
|
|
98
111
|
# Role list
|
|
99
112
|
role_list:
|
|
100
113
|
${roleIds.map(r => ` - "${r}"`).join('\n')}
|
|
@@ -275,15 +275,15 @@ const PROVIDERS = {
|
|
|
275
275
|
],
|
|
276
276
|
},
|
|
277
277
|
snowflake: {
|
|
278
|
-
displayName: "Vanguard Frontier — Snowflake
|
|
278
|
+
displayName: "Vanguard Frontier — Snowflake",
|
|
279
279
|
description:
|
|
280
|
-
"
|
|
281
|
-
keywords: ["snowflake", "
|
|
280
|
+
"A cloud-neutral Snowflake board routed by snowflake-maestro: architecture and account topology, platform administration, identity and effective access, network and private connectivity, governance and privacy controls, independent compliance evidence, FinOps unit economics, query performance, batch pipelines, streaming ingestion reliability, analytical semantics, ML lifecycle, Cortex AI agent security, Native Apps and Marketplace, BCDR, DevOps/IaC, migration, and business value. Review agents are read-only; six approval-gated live guards each execute exactly one mutation behind an explicit written human gate. Snowflake surfaces are drift-prone — agents re-verify GA/preview status, deprecations, edition/cloud/region availability, and provider resource stability against current Snowflake documentation before rendering findings.",
|
|
281
|
+
keywords: ["snowflake", "rbac", "least-privilege", "data-governance", "finops", "cortex-ai", "bcdr", "live-guard"],
|
|
282
282
|
invariants: [
|
|
283
|
-
"
|
|
284
|
-
"
|
|
285
|
-
"
|
|
286
|
-
"
|
|
283
|
+
"Review agents are static review only — they never request account credentials, private keys, OAuth or programmatic access tokens, account locators, or customer data, and never mutate a Snowflake account.",
|
|
284
|
+
"Documentation proves supported platform behaviour, never configured account behaviour: edition, region, enabled bundles, authentication enforcement, and policy attachment are UNKNOWN until account evidence establishes them.",
|
|
285
|
+
"Enforce least privilege: narrow custom roles, ACCOUNTADMIN forbidden for automation without exception, no GRANT ALL PRIVILEGES, no grants to PUBLIC, no unbounded future grants, and no password authentication for non-human identities.",
|
|
286
|
+
"Live guards are never auto-dispatched: each executes exactly one mutation after explicit written human approval naming account, environment, target, mutation, and accepted blast radius, with prior-state capture, preflight, verification, and a rollback path.",
|
|
287
287
|
],
|
|
288
288
|
},
|
|
289
289
|
};
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generator: catalog/workflows.json from .claude/workflows/*.js
|
|
4
|
+
*
|
|
5
|
+
* Workflow scripts are executable JavaScript whose body calls workflow globals
|
|
6
|
+
* (`phase`, `agent`, `parallel`) that only exist inside the workflow runtime, so the
|
|
7
|
+
* files cannot be imported to read their metadata — evaluating one outside the runtime
|
|
8
|
+
* throws on the first `phase()` call.
|
|
9
|
+
*
|
|
10
|
+
* They can, however, be read statically. The workflow contract requires `meta` to be a
|
|
11
|
+
* PURE LITERAL (no variables, calls, spreads, or interpolation), so this extracts the
|
|
12
|
+
* object literal following `export const meta =` by brace matching and then PARSES it
|
|
13
|
+
* with `parseLiteral` — it is never evaluated. Evaluating it would mean `npm run
|
|
14
|
+
* validate` executing code out of any workflow file a contributor adds; parsing both
|
|
15
|
+
* removes that and turns the pure-literal contract into something actually enforced.
|
|
16
|
+
*
|
|
17
|
+
* The output exists so `tools/vfa-tui` can display available workflows without
|
|
18
|
+
* re-implementing any of this: the TUI reads generated catalog JSON and never parses
|
|
19
|
+
* JavaScript. Same contract as every other catalog file.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* node scripts/generate-workflow-catalog.mjs # write
|
|
23
|
+
* node scripts/generate-workflow-catalog.mjs --check # verify in sync (CI)
|
|
24
|
+
*/
|
|
25
|
+
import { readFileSync, writeFileSync, readdirSync, existsSync, realpathSync } from 'node:fs'
|
|
26
|
+
import { join, dirname, relative, sep } from 'node:path'
|
|
27
|
+
import { fileURLToPath } from 'node:url'
|
|
28
|
+
|
|
29
|
+
const ROOT = dirname(dirname(fileURLToPath(import.meta.url)))
|
|
30
|
+
const WORKFLOW_DIR = join(ROOT, '.claude', 'workflows')
|
|
31
|
+
const OUT = join(ROOT, 'catalog', 'workflows.json')
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Extract the balanced `{...}` literal following `export const meta =`.
|
|
35
|
+
* Returns null when the marker is absent.
|
|
36
|
+
*/
|
|
37
|
+
function extractMetaLiteral(source) {
|
|
38
|
+
const marker = /export\s+const\s+meta\s*=\s*/.exec(source)
|
|
39
|
+
if (!marker) return null
|
|
40
|
+
let i = marker.index + marker[0].length
|
|
41
|
+
if (source[i] !== '{') return null
|
|
42
|
+
|
|
43
|
+
// Brace matching that respects strings, template literals, and comments — a `{`
|
|
44
|
+
// inside a description string must not be counted as nesting.
|
|
45
|
+
let depth = 0
|
|
46
|
+
let inS = null // "'" | '"' | '`'
|
|
47
|
+
let inLine = false
|
|
48
|
+
let inBlock = false
|
|
49
|
+
for (; i < source.length; i++) {
|
|
50
|
+
const c = source[i]
|
|
51
|
+
const prev = source[i - 1]
|
|
52
|
+
if (inLine) {
|
|
53
|
+
if (c === '\n') inLine = false
|
|
54
|
+
continue
|
|
55
|
+
}
|
|
56
|
+
if (inBlock) {
|
|
57
|
+
if (c === '/' && prev === '*') inBlock = false
|
|
58
|
+
continue
|
|
59
|
+
}
|
|
60
|
+
if (inS) {
|
|
61
|
+
if (c === inS && prev !== '\\') inS = null
|
|
62
|
+
continue
|
|
63
|
+
}
|
|
64
|
+
if (c === '/' && source[i + 1] === '/') { inLine = true; continue }
|
|
65
|
+
if (c === '/' && source[i + 1] === '*') { inBlock = true; continue }
|
|
66
|
+
if (c === "'" || c === '"' || c === '`') { inS = c; continue }
|
|
67
|
+
if (c === '{') depth++
|
|
68
|
+
else if (c === '}') {
|
|
69
|
+
depth--
|
|
70
|
+
if (depth === 0) return source.slice(marker.index + marker[0].length, i + 1)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Parse a JavaScript *data* literal without evaluating it.
|
|
78
|
+
*
|
|
79
|
+
* Accepts exactly the pure-literal subset the workflow `meta` contract promises:
|
|
80
|
+
* objects (quoted or bare identifier keys, optional trailing comma), arrays, single-,
|
|
81
|
+
* double- and backtick-quoted strings with no `${}` substitution, numbers, `true`,
|
|
82
|
+
* `false`, `null`. Anything else — a call, an identifier reference, a spread, a
|
|
83
|
+
* template substitution, an operator — is a syntax error rather than something that
|
|
84
|
+
* runs. Comments are skipped.
|
|
85
|
+
*
|
|
86
|
+
* Deliberately hand-written rather than delegated to `eval`/`Function`/`vm`: the point
|
|
87
|
+
* is that no code path here can execute the input.
|
|
88
|
+
*/
|
|
89
|
+
export function parseLiteral(src) {
|
|
90
|
+
let i = 0
|
|
91
|
+
|
|
92
|
+
const fail = (msg) => {
|
|
93
|
+
throw new Error(`${msg} at offset ${i}`)
|
|
94
|
+
}
|
|
95
|
+
const skip = () => {
|
|
96
|
+
for (;;) {
|
|
97
|
+
while (i < src.length && /\s/.test(src[i])) i++
|
|
98
|
+
if (src[i] === '/' && src[i + 1] === '/') {
|
|
99
|
+
while (i < src.length && src[i] !== '\n') i++
|
|
100
|
+
} else if (src[i] === '/' && src[i + 1] === '*') {
|
|
101
|
+
i += 2
|
|
102
|
+
while (i < src.length && !(src[i] === '*' && src[i + 1] === '/')) i++
|
|
103
|
+
if (i >= src.length) fail('unterminated block comment')
|
|
104
|
+
i += 2
|
|
105
|
+
} else {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const readString = () => {
|
|
112
|
+
const quote = src[i++]
|
|
113
|
+
let out = ''
|
|
114
|
+
while (i < src.length) {
|
|
115
|
+
const c = src[i]
|
|
116
|
+
if (c === '\\') {
|
|
117
|
+
const esc = src[i + 1]
|
|
118
|
+
const simple = { n: '\n', t: '\t', r: '\r', b: '\b', f: '\f', v: '\v', 0: '\0' }
|
|
119
|
+
if (esc === 'u') {
|
|
120
|
+
const hex = src.slice(i + 2, i + 6)
|
|
121
|
+
if (!/^[0-9a-fA-F]{4}$/.test(hex)) fail('bad unicode escape')
|
|
122
|
+
out += String.fromCharCode(parseInt(hex, 16))
|
|
123
|
+
i += 6
|
|
124
|
+
} else if (esc === 'x') {
|
|
125
|
+
const hex = src.slice(i + 2, i + 4)
|
|
126
|
+
if (!/^[0-9a-fA-F]{2}$/.test(hex)) fail('bad hex escape')
|
|
127
|
+
out += String.fromCharCode(parseInt(hex, 16))
|
|
128
|
+
i += 4
|
|
129
|
+
} else if (esc === '\n') {
|
|
130
|
+
i += 2 // line continuation
|
|
131
|
+
} else if (esc in simple) {
|
|
132
|
+
out += simple[esc]
|
|
133
|
+
i += 2
|
|
134
|
+
} else {
|
|
135
|
+
out += esc
|
|
136
|
+
i += 2
|
|
137
|
+
}
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
if (c === quote) {
|
|
141
|
+
i++
|
|
142
|
+
return out
|
|
143
|
+
}
|
|
144
|
+
// A template substitution would require evaluation to resolve, which is exactly
|
|
145
|
+
// what this parser exists to avoid.
|
|
146
|
+
if (quote === '`' && c === '$' && src[i + 1] === '{') fail('template substitution is not a literal')
|
|
147
|
+
if (quote !== '`' && c === '\n') fail('unterminated string')
|
|
148
|
+
out += c
|
|
149
|
+
i++
|
|
150
|
+
}
|
|
151
|
+
return fail('unterminated string')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const readValue = () => {
|
|
155
|
+
skip()
|
|
156
|
+
const c = src[i]
|
|
157
|
+
if (c === '{') return readObject()
|
|
158
|
+
if (c === '[') return readArray()
|
|
159
|
+
if (c === '"' || c === "'" || c === '`') return readString()
|
|
160
|
+
if (src.startsWith('true', i)) { i += 4; return true }
|
|
161
|
+
if (src.startsWith('false', i)) { i += 5; return false }
|
|
162
|
+
if (src.startsWith('null', i)) { i += 4; return null }
|
|
163
|
+
const num = /^-?\d+(\.\d+)?([eE][+-]?\d+)?/.exec(src.slice(i))
|
|
164
|
+
if (num) { i += num[0].length; return Number(num[0]) }
|
|
165
|
+
return fail(`unexpected token ${JSON.stringify(src.slice(i, i + 24))}`)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const readObject = () => {
|
|
169
|
+
i++ // {
|
|
170
|
+
const obj = {}
|
|
171
|
+
skip()
|
|
172
|
+
if (src[i] === '}') { i++; return obj }
|
|
173
|
+
for (;;) {
|
|
174
|
+
skip()
|
|
175
|
+
if (src[i] === '.' ) fail('spread is not a literal')
|
|
176
|
+
let key
|
|
177
|
+
if (src[i] === '"' || src[i] === "'" || src[i] === '`') {
|
|
178
|
+
key = readString()
|
|
179
|
+
} else {
|
|
180
|
+
const id = /^[A-Za-z_$][A-Za-z0-9_$]*/.exec(src.slice(i))
|
|
181
|
+
if (!id) fail('expected property name')
|
|
182
|
+
key = id[0]
|
|
183
|
+
i += id[0].length
|
|
184
|
+
}
|
|
185
|
+
skip()
|
|
186
|
+
if (src[i] !== ':') fail(`expected ':' after key ${JSON.stringify(key)}`)
|
|
187
|
+
i++
|
|
188
|
+
obj[key] = readValue()
|
|
189
|
+
skip()
|
|
190
|
+
if (src[i] === ',') { i++; skip(); if (src[i] === '}') { i++; return obj } continue }
|
|
191
|
+
if (src[i] === '}') { i++; return obj }
|
|
192
|
+
return fail("expected ',' or '}'")
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const readArray = () => {
|
|
197
|
+
i++ // [
|
|
198
|
+
const arr = []
|
|
199
|
+
skip()
|
|
200
|
+
if (src[i] === ']') { i++; return arr }
|
|
201
|
+
for (;;) {
|
|
202
|
+
skip()
|
|
203
|
+
if (src[i] === '.') fail('spread is not a literal')
|
|
204
|
+
arr.push(readValue())
|
|
205
|
+
skip()
|
|
206
|
+
if (src[i] === ',') { i++; skip(); if (src[i] === ']') { i++; return arr } continue }
|
|
207
|
+
if (src[i] === ']') { i++; return arr }
|
|
208
|
+
return fail("expected ',' or ']'")
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const value = readValue()
|
|
213
|
+
skip()
|
|
214
|
+
if (i !== src.length) fail('trailing content after literal')
|
|
215
|
+
return value
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function readWorkflow(file) {
|
|
219
|
+
const abs = join(WORKFLOW_DIR, file)
|
|
220
|
+
const src = readFileSync(abs, 'utf8')
|
|
221
|
+
const literal = extractMetaLiteral(src)
|
|
222
|
+
if (!literal) {
|
|
223
|
+
throw new Error(`${file}: no 'export const meta = {...}' block found`)
|
|
224
|
+
}
|
|
225
|
+
let meta
|
|
226
|
+
try {
|
|
227
|
+
// PARSED, never evaluated. An earlier version ran `new Function(...)` on this
|
|
228
|
+
// literal, which meant `npm run validate` executed code out of any workflow file a
|
|
229
|
+
// contributor added — `description: (() => { …anything… })()` would have run with
|
|
230
|
+
// the validator's privileges. In a repository whose subject is supply-chain
|
|
231
|
+
// integrity that is not an acceptable way to read metadata, and it also let
|
|
232
|
+
// nondeterministic values into a generated catalog. parseLiteral accepts only
|
|
233
|
+
// JSON-shaped data and rejects everything else, which additionally makes the
|
|
234
|
+
// "meta must be a pure literal" contract actually enforced rather than assumed.
|
|
235
|
+
meta = parseLiteral(literal)
|
|
236
|
+
} catch (err) {
|
|
237
|
+
throw new Error(`${file}: meta is not a pure literal (${err.message})`)
|
|
238
|
+
}
|
|
239
|
+
if (!meta || typeof meta.name !== 'string' || typeof meta.description !== 'string') {
|
|
240
|
+
throw new Error(`${file}: meta must declare string 'name' and 'description'`)
|
|
241
|
+
}
|
|
242
|
+
const expected = file.replace(/\.m?js$/, '')
|
|
243
|
+
if (meta.name !== expected) {
|
|
244
|
+
throw new Error(
|
|
245
|
+
`${file}: meta.name '${meta.name}' must match the filename '${expected}' — ` +
|
|
246
|
+
'the workflow is invoked by name, and a mismatch makes it unreachable',
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
id: meta.name,
|
|
251
|
+
name: meta.name,
|
|
252
|
+
// Forward slashes always. `relative()` emits backslashes on Windows, which would
|
|
253
|
+
// make generated output platform-dependent: `--check` would fail on one OS against
|
|
254
|
+
// a catalog committed from another, and the Rust loader test asserts a
|
|
255
|
+
// `.claude/workflows/` prefix. A repo-relative path in a committed artifact is a
|
|
256
|
+
// repo path, not a filesystem path.
|
|
257
|
+
path: relative(ROOT, abs).split(sep).join('/'),
|
|
258
|
+
description: meta.description,
|
|
259
|
+
when_to_use: typeof meta.whenToUse === 'string' ? meta.whenToUse : '',
|
|
260
|
+
phases: Array.isArray(meta.phases)
|
|
261
|
+
? meta.phases.map((p) => ({
|
|
262
|
+
title: String(p.title ?? ''),
|
|
263
|
+
detail: typeof p.detail === 'string' ? p.detail : '',
|
|
264
|
+
model: typeof p.model === 'string' ? p.model : '',
|
|
265
|
+
}))
|
|
266
|
+
: [],
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function build() {
|
|
271
|
+
const files = existsSync(WORKFLOW_DIR)
|
|
272
|
+
? readdirSync(WORKFLOW_DIR).filter((f) => /\.m?js$/.test(f)).sort()
|
|
273
|
+
: []
|
|
274
|
+
const workflows = files.map(readWorkflow)
|
|
275
|
+
return {
|
|
276
|
+
version: '0.1.0',
|
|
277
|
+
description:
|
|
278
|
+
'Workflow definitions discovered in .claude/workflows/. Generated from each ' +
|
|
279
|
+
"script's meta block by scripts/generate-workflow-catalog.mjs — never hand-edited.",
|
|
280
|
+
workflows,
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function main() {
|
|
285
|
+
const catalog = build()
|
|
286
|
+
const serialized = JSON.stringify(catalog, null, 2) + '\n'
|
|
287
|
+
|
|
288
|
+
if (process.argv.includes('--check')) {
|
|
289
|
+
const current = existsSync(OUT) ? readFileSync(OUT, 'utf8') : ''
|
|
290
|
+
if (current !== serialized) {
|
|
291
|
+
console.error(
|
|
292
|
+
'FAIL: catalog/workflows.json is out of sync with .claude/workflows/.\n' +
|
|
293
|
+
' Run: npm run workflow-catalog:write',
|
|
294
|
+
)
|
|
295
|
+
process.exit(1)
|
|
296
|
+
}
|
|
297
|
+
console.log(`OK: workflow catalog in sync (${catalog.workflows.length} workflow(s))`)
|
|
298
|
+
} else {
|
|
299
|
+
writeFileSync(OUT, serialized)
|
|
300
|
+
console.log(`OK: wrote catalog/workflows.json (${catalog.workflows.length} workflow(s))`)
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Only run when invoked directly. `parseLiteral` is exported so it can be tested and
|
|
305
|
+
// reused, and importing a module must never write a file as a side effect.
|
|
306
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
307
|
+
main()
|
|
308
|
+
}
|