cortexapps-cli 1.24.0__tar.gz → 1.26.0__tar.gz
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.
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/PKG-INFO +1 -1
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/cli.py +2 -0
- cortexapps_cli-1.26.0/cortexapps_cli/commands/ai_skills.py +200 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_types.py +6 -1
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/README.md +85 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/api-doc-sync.yaml +11 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/changelog-writer.yaml +11 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/docs-generator.yaml +15 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/docs-portal.yaml +6 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-service.json +24 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-skills.json +24 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-skill-service.json +24 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-types/ai-plugin.json +1 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-types/ai-skill.json +1 -0
- cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml +76 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/pyproject.toml +1 -1
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/LICENSE +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/README.rst +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/__init__.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/command_options.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/api_keys.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/audit_logs.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/backup.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/backup_commands/cortex_export.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/catalog.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_data.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_events.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_metrics.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/dependencies.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/deploys.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/discovery_audit.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/docs.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationship_types.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationships.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/gitops_logs.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/groups.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/initiatives.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/apiiro.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/argocd.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/aws.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_active_directory.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_devops.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_resources.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bamboohr.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bitbucket.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bugsnag.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/buildkite.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/checkmarx_sast.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/circleci.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/clickup.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/codecov.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/coralogix.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/datadog.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/dynatrace.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/firehydrant.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/github.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/gitlab.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/incidentio.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/instana.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/jenkins.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/jira.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/launchdarkly.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/mend_sast.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/mend_sca.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/newrelic.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/okta.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/opsgenie.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/pagerduty.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/prometheus.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/rollbar.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/rootly.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/semgrep.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sentry.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/servicenow.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/servicenow_cloud_observability.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/snyk.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sonarqube.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/splunk_observability_cloud.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/splunk_on_call.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sumologic.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/veracode.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/wiz.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/workday.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/xmatters.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/ip_allowlist.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/on_call.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/go.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/java.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/node.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/nuget.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/python.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/plugins.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/queries.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/rest.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scim.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scorecards.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scorecards_commands/exemptions.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/secrets.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/solutions.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/teams.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/users.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/users_commands/roles.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/workflows.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/cortex_client.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/models/team.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/__init__.py +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/.github/workflows/cortex-service-version.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/README.md +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.0.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.2.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/aws-dev-us-west-2.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing-1.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing-1.2.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/cart-1.0.2.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/cart.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.2.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.3.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.4.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-east-1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-west-1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-staging-us-east-1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.0.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.6.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.1.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-06-20.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-01.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-09.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-10.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search-4.0.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search-4.1.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.2.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.3.0.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-relationship-types/environments.json +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-relationship-types/versions.json +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/environment.json +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/release.json +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/service-version.json +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/create-environment.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/create-release.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/trigger-github-release.yaml +0 -0
- {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/utils.py +0 -0
|
@@ -14,6 +14,7 @@ import requests
|
|
|
14
14
|
|
|
15
15
|
from cortexapps_cli.cortex_client import CortexClient
|
|
16
16
|
|
|
17
|
+
import cortexapps_cli.commands.ai_skills as ai_skills
|
|
17
18
|
import cortexapps_cli.commands.api_keys as api_keys
|
|
18
19
|
import cortexapps_cli.commands.audit_logs as audit_logs
|
|
19
20
|
import cortexapps_cli.commands.backup as backup
|
|
@@ -248,6 +249,7 @@ def version():
|
|
|
248
249
|
print(version)
|
|
249
250
|
|
|
250
251
|
# Register all commands alphabetically so they appear in order in --help
|
|
252
|
+
app.add_typer(ai_skills.app, name="ai-skills")
|
|
251
253
|
app.add_typer(api_keys.app, name="api-keys")
|
|
252
254
|
app.add_typer(audit_logs.app, name="audit-logs")
|
|
253
255
|
app.add_typer(backup.app, name="backup")
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import re
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
import typer
|
|
7
|
+
import yaml
|
|
8
|
+
from typing_extensions import Annotated
|
|
9
|
+
|
|
10
|
+
app = typer.Typer(help="AI Skills commands", no_args_is_help=True)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _parse_frontmatter(content: str) -> tuple[dict, str]:
|
|
14
|
+
"""Split a SKILL.md file into its YAML frontmatter and body."""
|
|
15
|
+
match = re.match(r"^---\n(.*?)\n---\n(.*)$", content, re.DOTALL)
|
|
16
|
+
if not match:
|
|
17
|
+
return {}, content
|
|
18
|
+
try:
|
|
19
|
+
frontmatter = yaml.safe_load(match.group(1)) or {}
|
|
20
|
+
except yaml.YAMLError:
|
|
21
|
+
frontmatter = {}
|
|
22
|
+
return frontmatter, match.group(2)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _local_links(text: str, base_dir: Path) -> list[Path]:
|
|
26
|
+
"""Return local files referenced by markdown links in text, resolved against base_dir."""
|
|
27
|
+
links = []
|
|
28
|
+
for target in re.findall(r"\]\(([^)]+)\)", text):
|
|
29
|
+
target = target.split("#")[0].strip()
|
|
30
|
+
if not target or target.startswith(("http://", "https://", "${")):
|
|
31
|
+
continue
|
|
32
|
+
candidate = (base_dir / target).resolve()
|
|
33
|
+
if candidate.is_file():
|
|
34
|
+
links.append(candidate)
|
|
35
|
+
return links
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _has_deep_references(skill_dir: Path, body: str) -> bool:
|
|
39
|
+
"""True if a file SKILL.md links to itself links to another local file (>1 level deep)."""
|
|
40
|
+
for linked in _local_links(body, skill_dir):
|
|
41
|
+
try:
|
|
42
|
+
linked_body = linked.read_text(encoding="utf-8")
|
|
43
|
+
except OSError:
|
|
44
|
+
continue
|
|
45
|
+
if _local_links(linked_body, linked.parent):
|
|
46
|
+
return True
|
|
47
|
+
return False
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _entity_yaml(tag: str, entity_type: str, description: str, relationships: list) -> str:
|
|
51
|
+
info = {
|
|
52
|
+
"title": tag,
|
|
53
|
+
"description": description or "",
|
|
54
|
+
"x-cortex-tag": tag,
|
|
55
|
+
"x-cortex-type": entity_type,
|
|
56
|
+
"x-cortex-definition": {},
|
|
57
|
+
}
|
|
58
|
+
if relationships:
|
|
59
|
+
info["x-cortex-relationships"] = relationships
|
|
60
|
+
doc = {"openapi": "3.0.0", "info": info}
|
|
61
|
+
return yaml.safe_dump(doc, sort_keys=False)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _push_entity(client, entity_yaml: str) -> None:
|
|
65
|
+
client.post(
|
|
66
|
+
"api/v1/open-api",
|
|
67
|
+
data=entity_yaml,
|
|
68
|
+
content_type="application/openapi;charset=UTF-8",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _push_custom_data(client, tag: str, key: str, value) -> None:
|
|
73
|
+
client.post(
|
|
74
|
+
f"api/v1/catalog/{tag}/custom-data",
|
|
75
|
+
data={"key": key, "value": str(value)},
|
|
76
|
+
params={"force": False},
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@app.command()
|
|
81
|
+
def sync(
|
|
82
|
+
ctx: typer.Context,
|
|
83
|
+
directory: Annotated[
|
|
84
|
+
Path,
|
|
85
|
+
typer.Option(
|
|
86
|
+
"--directory", "-d",
|
|
87
|
+
help="Directory containing plugin folders, each with .claude-plugin/plugin.json and skills/*/SKILL.md (the eng-commons layout).",
|
|
88
|
+
),
|
|
89
|
+
],
|
|
90
|
+
service: Annotated[
|
|
91
|
+
Optional[str],
|
|
92
|
+
typer.Option(
|
|
93
|
+
"--service", "-s",
|
|
94
|
+
help="Cortex Service tag to link every synced plugin/skill's ownership to (ai-plugin-service / ai-skill-service).",
|
|
95
|
+
show_default=False,
|
|
96
|
+
),
|
|
97
|
+
] = None,
|
|
98
|
+
dry_run: Annotated[
|
|
99
|
+
bool,
|
|
100
|
+
typer.Option("--dry-run", "-n", help="Print what would be synced without pushing anything to Cortex."),
|
|
101
|
+
] = False,
|
|
102
|
+
):
|
|
103
|
+
"""
|
|
104
|
+
Scan a plugins directory and sync ai-plugin / ai-skill catalog entities into Cortex.
|
|
105
|
+
|
|
106
|
+
Expects the eng-commons layout:
|
|
107
|
+
|
|
108
|
+
<directory>/<plugin>/.claude-plugin/plugin.json
|
|
109
|
+
<directory>/<plugin>/skills/<skill>/SKILL.md
|
|
110
|
+
|
|
111
|
+
For each skill, also pushes the lineCount, descriptionCharCount, and
|
|
112
|
+
hasDeepReferences Custom Data keys the ai-skills-quality scorecard reads
|
|
113
|
+
(see cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml),
|
|
114
|
+
via the Custom Data API.
|
|
115
|
+
|
|
116
|
+
Re-run this on a schedule tied to when skills actually change (a GitHub
|
|
117
|
+
Action or webhook on push to the plugins repo), not on a fixed timer —
|
|
118
|
+
these values change maybe a couple of times a year, so recomputing them
|
|
119
|
+
multiple times a day is wasted work the scorecard evaluator would
|
|
120
|
+
otherwise have to redo live against git on every single evaluation.
|
|
121
|
+
"""
|
|
122
|
+
client = None if dry_run else ctx.obj["client"]
|
|
123
|
+
|
|
124
|
+
plugin_dirs = sorted(
|
|
125
|
+
p for p in directory.iterdir()
|
|
126
|
+
if p.is_dir() and (p / ".claude-plugin" / "plugin.json").is_file()
|
|
127
|
+
)
|
|
128
|
+
if not plugin_dirs:
|
|
129
|
+
typer.echo(f"No plugins found under {directory} (expected <plugin>/.claude-plugin/plugin.json)")
|
|
130
|
+
raise typer.Exit(1)
|
|
131
|
+
|
|
132
|
+
synced_plugins = 0
|
|
133
|
+
synced_skills = 0
|
|
134
|
+
|
|
135
|
+
for plugin_dir in plugin_dirs:
|
|
136
|
+
manifest = json.loads((plugin_dir / ".claude-plugin" / "plugin.json").read_text(encoding="utf-8"))
|
|
137
|
+
plugin_tag = manifest.get("name", plugin_dir.name)
|
|
138
|
+
plugin_description = manifest.get("description", "")
|
|
139
|
+
|
|
140
|
+
skill_tags = []
|
|
141
|
+
skills_dir = plugin_dir / "skills"
|
|
142
|
+
if skills_dir.is_dir():
|
|
143
|
+
for skill_dir in sorted(p for p in skills_dir.iterdir() if p.is_dir()):
|
|
144
|
+
skill_md = skill_dir / "SKILL.md"
|
|
145
|
+
if not skill_md.is_file():
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
content = skill_md.read_text(encoding="utf-8")
|
|
149
|
+
frontmatter, body = _parse_frontmatter(content)
|
|
150
|
+
skill_tag = frontmatter.get("name", skill_dir.name)
|
|
151
|
+
skill_description = frontmatter.get("description", "")
|
|
152
|
+
|
|
153
|
+
line_count = len(body.strip("\n").split("\n")) if body.strip("\n") else 0
|
|
154
|
+
description_char_count = len(skill_description)
|
|
155
|
+
has_deep_references = _has_deep_references(skill_dir, body)
|
|
156
|
+
|
|
157
|
+
relationships = []
|
|
158
|
+
if service:
|
|
159
|
+
relationships.append({"type": "ai-skill-service", "destinations": [{"tag": service}]})
|
|
160
|
+
|
|
161
|
+
skill_yaml = _entity_yaml(skill_tag, "ai-skill", skill_description, relationships)
|
|
162
|
+
|
|
163
|
+
if dry_run:
|
|
164
|
+
typer.echo(f"--- {skill_tag} (ai-skill) ---")
|
|
165
|
+
typer.echo(skill_yaml)
|
|
166
|
+
typer.echo(
|
|
167
|
+
f" custom-data: lineCount={line_count} "
|
|
168
|
+
f"descriptionCharCount={description_char_count} "
|
|
169
|
+
f"hasDeepReferences={has_deep_references}"
|
|
170
|
+
)
|
|
171
|
+
else:
|
|
172
|
+
_push_entity(client, skill_yaml)
|
|
173
|
+
_push_custom_data(client, skill_tag, "lineCount", line_count)
|
|
174
|
+
_push_custom_data(client, skill_tag, "descriptionCharCount", description_char_count)
|
|
175
|
+
_push_custom_data(client, skill_tag, "hasDeepReferences", "true" if has_deep_references else "false")
|
|
176
|
+
|
|
177
|
+
skill_tags.append(skill_tag)
|
|
178
|
+
synced_skills += 1
|
|
179
|
+
|
|
180
|
+
relationships = []
|
|
181
|
+
if skill_tags:
|
|
182
|
+
relationships.append({
|
|
183
|
+
"type": "ai-plugin-skills",
|
|
184
|
+
"destinations": [{"tag": t} for t in skill_tags],
|
|
185
|
+
})
|
|
186
|
+
if service:
|
|
187
|
+
relationships.append({"type": "ai-plugin-service", "destinations": [{"tag": service}]})
|
|
188
|
+
|
|
189
|
+
plugin_yaml = _entity_yaml(plugin_tag, "ai-plugin", plugin_description, relationships)
|
|
190
|
+
|
|
191
|
+
if dry_run:
|
|
192
|
+
typer.echo(f"--- {plugin_tag} (ai-plugin) ---")
|
|
193
|
+
typer.echo(plugin_yaml)
|
|
194
|
+
else:
|
|
195
|
+
_push_entity(client, plugin_yaml)
|
|
196
|
+
|
|
197
|
+
synced_plugins += 1
|
|
198
|
+
|
|
199
|
+
suffix = " (dry run — nothing was pushed)" if dry_run else ""
|
|
200
|
+
typer.echo(f"\nSynced {synced_plugins} plugin(s), {synced_skills} skill(s){suffix}.")
|
|
@@ -100,6 +100,7 @@ def update(
|
|
|
100
100
|
ctx: typer.Context,
|
|
101
101
|
file_input: Annotated[typer.FileText, typer.Option("--file", "-f", help=" File containing custom entity definition; can be passed as stdin with -, example: -f-")] = None,
|
|
102
102
|
entity_type: str = typer.Option(..., "--type", "-t", help="The entity type"),
|
|
103
|
+
_print: CommandOptions._print = True,
|
|
103
104
|
):
|
|
104
105
|
"""
|
|
105
106
|
Update entity type
|
|
@@ -108,7 +109,11 @@ def update(
|
|
|
108
109
|
client = ctx.obj["client"]
|
|
109
110
|
data = json.loads("".join([line for line in file_input]))
|
|
110
111
|
|
|
111
|
-
r = client.
|
|
112
|
+
r = client.put("api/v1/catalog/definitions/" + entity_type, data=data)
|
|
113
|
+
if _print:
|
|
114
|
+
print_output_with_context(ctx, r)
|
|
115
|
+
else:
|
|
116
|
+
return(r)
|
|
112
117
|
|
|
113
118
|
@app.command()
|
|
114
119
|
def get(
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: AI Skills Catalog
|
|
3
|
+
description: Catalog your AI plugins and skills as first-class Cortex entities, with ownership and best-practice quality scorecards.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI Skills Catalog
|
|
7
|
+
|
|
8
|
+
Model your AI plugins and the skills they bundle (e.g. Claude Code plugins and Agent Skills) as Cortex entities — owned, scored, and discoverable just like your services.
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌──────────────────────┐
|
|
14
|
+
│ ai-plugin │
|
|
15
|
+
│ docs-generator │
|
|
16
|
+
└──────────┬───────────┘
|
|
17
|
+
│
|
|
18
|
+
ai-plugin-skills
|
|
19
|
+
┌─────────────────────────┴─────────────────────────┐
|
|
20
|
+
▼ ▼
|
|
21
|
+
┌──────────────────────┐ │ ┌──────────────────────┐
|
|
22
|
+
│ ai-skill │ │ │ ai-skill │
|
|
23
|
+
│ changelog-writer │ │ │ api-doc-sync │
|
|
24
|
+
└──────────┬───────────┘ │ └──────────┬───────────┘
|
|
25
|
+
│ │ │
|
|
26
|
+
└─────────────────────────┴─────────────────────────┘
|
|
27
|
+
▼
|
|
28
|
+
ai-plugin-service / ai-skill-service
|
|
29
|
+
┌──────────────────────┐
|
|
30
|
+
│ service │
|
|
31
|
+
│ docs-portal │
|
|
32
|
+
└──────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Ownership is never duplicated onto the AI entities themselves — `ai-plugin-service` and `ai-skill-service` relationships point at a Service (or however you already model repos) that already carries an owning team in your Catalog. A skill's or plugin's owner is always "whoever owns the linked Service."
|
|
36
|
+
|
|
37
|
+
## What's Included
|
|
38
|
+
|
|
39
|
+
**Entity types:** `ai-plugin`, `ai-skill`
|
|
40
|
+
|
|
41
|
+
**Relationship types:**
|
|
42
|
+
- `ai-plugin-skills` — a plugin's bundled skills (plugin → skill)
|
|
43
|
+
- `ai-plugin-service` — the Service/repo that owns and hosts a plugin
|
|
44
|
+
- `ai-skill-service` — the Service/repo that owns a skill directly, for cases where a skill's ownership differs from its parent plugin's (e.g. distinct CODEOWNERS within a monorepo)
|
|
45
|
+
|
|
46
|
+
**Scorecard:** `ai-skills-quality` — 8 rules covering ownership (via the relationships above) and Anthropic's [Agent Skills authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices): concise SKILL.md (both this org's stricter target and Anthropic's hard limit), substantive descriptions within the spec's length bounds, no reserved words in the name, and shallow (one-level-deep) file references.
|
|
47
|
+
|
|
48
|
+
**Sample entities:** one plugin (`docs-generator`), two skills (`changelog-writer`, `api-doc-sync`), and one sample service (`docs-portal`) they're linked to — enough to see the shape without assuming anything about your real catalog.
|
|
49
|
+
|
|
50
|
+
## Installation
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
cortex solutions install -s ai-skills
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## After Installing
|
|
57
|
+
|
|
58
|
+
**Populate quality data for real skills**
|
|
59
|
+
|
|
60
|
+
Three of the scorecard's rules — concise (`lineCount`), description length (`descriptionCharCount`, named to avoid confusion with the entity's own `description` field), and shallow references (`hasDeepReferences`) — read from Cortex custom metadata. `cortex ai-skills sync` pushes these via the Custom Data API. For each real skill you ingest:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
cortex custom-data add --tag <skill-tag> --key lineCount --value <int>
|
|
64
|
+
cortex custom-data add --tag <skill-tag> --key descriptionCharCount --value <int>
|
|
65
|
+
cortex custom-data add --tag <skill-tag> --key hasDeepReferences --value <true|false>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The `cortex ai-skills sync` command computes and pushes all three automatically. Recompute on change, not on a timer — wire a GitHub Action or webhook to fire when a plugin/skill's files change, rather than recalculating on a fixed schedule. These values move maybe a couple of times a year; there's no reason to redo the work (or hit the git API) on every scorecard evaluation.
|
|
69
|
+
|
|
70
|
+
The sample entities above don't have these set, so they'll score lower on those three rules until you do — that's expected; they're there to show the entity/relationship shape, not a passing score.
|
|
71
|
+
|
|
72
|
+
**Link real plugins and skills to your own Services**
|
|
73
|
+
|
|
74
|
+
Point `ai-plugin-service` / `ai-skill-service` at whatever Service (or repository entity) already owns that code in your Catalog, instead of the sample `docs-portal`.
|
|
75
|
+
|
|
76
|
+
**Set up your AI Skills catalog**
|
|
77
|
+
|
|
78
|
+
Cortex Catalogs (the nav-level groupings like Services, Infrastructure, Domains) are UI-only today — there's no API or CLI support yet to script this step:
|
|
79
|
+
|
|
80
|
+
1. Go to [Catalogs](https://app.getcortexapp.com/admin/catalogs) → **New Catalog**
|
|
81
|
+
2. Relationship type: `ai-plugin-skills`
|
|
82
|
+
3. Root entity type: `ai-plugin`
|
|
83
|
+
4. Name it **AI Skills**
|
|
84
|
+
|
|
85
|
+
> Catalog creation will be automated once catalog API support is added to the CLI.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
openapi: "3.0.0"
|
|
2
|
+
info:
|
|
3
|
+
title: api-doc-sync
|
|
4
|
+
x-cortex-tag: api-doc-sync
|
|
5
|
+
x-cortex-type: ai-skill
|
|
6
|
+
description: Keeps API reference docs in sync with OpenAPI spec changes, flagging drift for review.
|
|
7
|
+
x-cortex-definition: {}
|
|
8
|
+
x-cortex-relationships:
|
|
9
|
+
- type: ai-skill-service
|
|
10
|
+
destinations:
|
|
11
|
+
- tag: docs-portal
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
openapi: "3.0.0"
|
|
2
|
+
info:
|
|
3
|
+
title: changelog-writer
|
|
4
|
+
x-cortex-tag: changelog-writer
|
|
5
|
+
x-cortex-type: ai-skill
|
|
6
|
+
description: Drafts changelog entries from merged PR titles and descriptions, grouped by conventional-commit type.
|
|
7
|
+
x-cortex-definition: {}
|
|
8
|
+
x-cortex-relationships:
|
|
9
|
+
- type: ai-skill-service
|
|
10
|
+
destinations:
|
|
11
|
+
- tag: docs-portal
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
openapi: "3.0.0"
|
|
2
|
+
info:
|
|
3
|
+
title: docs-generator
|
|
4
|
+
x-cortex-tag: docs-generator
|
|
5
|
+
x-cortex-type: ai-plugin
|
|
6
|
+
description: Generates and maintains developer-facing documentation from code and PR context.
|
|
7
|
+
x-cortex-definition: {}
|
|
8
|
+
x-cortex-relationships:
|
|
9
|
+
- type: ai-plugin-skills
|
|
10
|
+
destinations:
|
|
11
|
+
- tag: changelog-writer
|
|
12
|
+
- tag: api-doc-sync
|
|
13
|
+
- type: ai-plugin-service
|
|
14
|
+
destinations:
|
|
15
|
+
- tag: docs-portal
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tag": "ai-plugin-service",
|
|
3
|
+
"name": "AI Plugin Service",
|
|
4
|
+
"description": "Links an AI Plugin to the Cortex Service that owns and hosts it, so ownership is inherited from the Catalog instead of duplicated. Sources: ai-plugin. Destinations: service.",
|
|
5
|
+
"definitionLocation": "SOURCE",
|
|
6
|
+
"isSingleSource": false,
|
|
7
|
+
"isSingleDestination": true,
|
|
8
|
+
"allowCycles": false,
|
|
9
|
+
"sourcesFilter": {
|
|
10
|
+
"include": true,
|
|
11
|
+
"types": [
|
|
12
|
+
"ai-plugin"
|
|
13
|
+
],
|
|
14
|
+
"providers": []
|
|
15
|
+
},
|
|
16
|
+
"destinationsFilter": {
|
|
17
|
+
"include": true,
|
|
18
|
+
"types": [
|
|
19
|
+
"service"
|
|
20
|
+
],
|
|
21
|
+
"providers": []
|
|
22
|
+
},
|
|
23
|
+
"inheritances": []
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tag": "ai-plugin-skills",
|
|
3
|
+
"name": "AI Plugin Skills",
|
|
4
|
+
"description": "Links an AI Plugin to the AI Skills it bundles. Sources: ai-plugin. Destinations: ai-skill.",
|
|
5
|
+
"definitionLocation": "SOURCE",
|
|
6
|
+
"isSingleSource": false,
|
|
7
|
+
"isSingleDestination": false,
|
|
8
|
+
"allowCycles": false,
|
|
9
|
+
"sourcesFilter": {
|
|
10
|
+
"include": true,
|
|
11
|
+
"types": [
|
|
12
|
+
"ai-plugin"
|
|
13
|
+
],
|
|
14
|
+
"providers": []
|
|
15
|
+
},
|
|
16
|
+
"destinationsFilter": {
|
|
17
|
+
"include": true,
|
|
18
|
+
"types": [
|
|
19
|
+
"ai-skill"
|
|
20
|
+
],
|
|
21
|
+
"providers": []
|
|
22
|
+
},
|
|
23
|
+
"inheritances": []
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tag": "ai-skill-service",
|
|
3
|
+
"name": "AI Skill Service",
|
|
4
|
+
"description": "Links an AI Skill directly to the Cortex Service that owns it, for cases where a skill's ownership differs from its parent plugin's (e.g. distinct CODEOWNERS within a monorepo). Sources: ai-skill. Destinations: service.",
|
|
5
|
+
"definitionLocation": "SOURCE",
|
|
6
|
+
"isSingleSource": false,
|
|
7
|
+
"isSingleDestination": true,
|
|
8
|
+
"allowCycles": false,
|
|
9
|
+
"sourcesFilter": {
|
|
10
|
+
"include": true,
|
|
11
|
+
"types": [
|
|
12
|
+
"ai-skill"
|
|
13
|
+
],
|
|
14
|
+
"providers": []
|
|
15
|
+
},
|
|
16
|
+
"destinationsFilter": {
|
|
17
|
+
"include": true,
|
|
18
|
+
"types": [
|
|
19
|
+
"service"
|
|
20
|
+
],
|
|
21
|
+
"providers": []
|
|
22
|
+
},
|
|
23
|
+
"inheritances": []
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "ai-plugin", "name": "AI Plugin", "description": "A bundle of AI skills distributed and versioned together (e.g. a Claude Code plugin). Installed as a unit, managed like a service.", "iconTag": "Cortex-builtin::PlugsConnected", "schema": {"type": "object", "properties": {}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "ai-skill", "name": "AI Skill", "description": "An individual AI skill (e.g. a Claude Code SKILL.md) bundled inside an AI Plugin.", "iconTag": "Cortex-builtin::MagicWand", "schema": {"type": "object", "properties": {}}}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# AI Skill quality & ownership scorecard.
|
|
2
|
+
#
|
|
3
|
+
# The "Concise", "Description substantive/hard-limit", and "Line count hard
|
|
4
|
+
# limit" rules read numeric/boolean values via Cortex custom metadata.
|
|
5
|
+
# `cortex ai-skills sync` populates these via the Custom Data API (POST
|
|
6
|
+
# api/v1/custom-data) for each key referenced below -- you can also set them
|
|
7
|
+
# yourself with `cortex custom-data add --tag <skill> --key <key> --value
|
|
8
|
+
# <value>` (or the bulk endpoint):
|
|
9
|
+
# lineCount (int) - line count of the skill's SKILL.md body
|
|
10
|
+
# descriptionCharCount (int) - character length of the skill's description
|
|
11
|
+
# (named to avoid confusion with the
|
|
12
|
+
# entity's own "description" field, which
|
|
13
|
+
# already appears in both this YAML and the
|
|
14
|
+
# API response)
|
|
15
|
+
# hasDeepReferences (bool) - whether the skill's docs reference files
|
|
16
|
+
# more than one level deep from SKILL.md (see
|
|
17
|
+
# https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices#avoid-deeply-nested-references)
|
|
18
|
+
#
|
|
19
|
+
# `--value true`/`--value false` on the CLI are stored and evaluated as real
|
|
20
|
+
# booleans (confirmed live) -- use jq(custom("key"), "not") or
|
|
21
|
+
# jq(custom("key"), ". == false") for boolean checks, not custom("key") ==
|
|
22
|
+
# false/"false" directly (both fail against the live evaluator).
|
|
23
|
+
#
|
|
24
|
+
# Recompute these on change, not on a timer: wire a GitHub Action or webhook
|
|
25
|
+
# to fire when a plugin/skill's files change and re-run the sync, rather than
|
|
26
|
+
# recalculating on a fixed schedule -- these values move maybe a couple of
|
|
27
|
+
# times a year, so there's no reason to redo the work (or hit the git API)
|
|
28
|
+
# every time the scorecard evaluates.
|
|
29
|
+
tag: ai-skills-quality
|
|
30
|
+
name: AI Skill Quality & Ownership
|
|
31
|
+
description: Checks that AI skills are owned via a linked Cortex Service, bundled under a plugin, and follow Anthropic's Agent Skills authoring best practices.
|
|
32
|
+
filter:
|
|
33
|
+
kind: GENERIC
|
|
34
|
+
types:
|
|
35
|
+
include:
|
|
36
|
+
- ai-skill
|
|
37
|
+
rules:
|
|
38
|
+
- title: Owned by a Cortex Service
|
|
39
|
+
description: The skill is linked to a Service via the ai-skill-service relationship, so there's a clear owning team in the Catalog.
|
|
40
|
+
weight: 3
|
|
41
|
+
expression: 'entity.destinations(relationshipType = "ai-skill-service").length > 0'
|
|
42
|
+
|
|
43
|
+
- title: Belongs to a plugin
|
|
44
|
+
description: The skill is bundled under an AI Plugin rather than managed ad hoc.
|
|
45
|
+
weight: 2
|
|
46
|
+
expression: 'entity.sources(relationshipType = "ai-plugin-skills").length > 0'
|
|
47
|
+
|
|
48
|
+
- title: Concise (team target -- <=200 lines)
|
|
49
|
+
description: '"Good skills should only be 200 lines" -- keeps SKILL.md focused and maintainable. Requires custom-data key "lineCount".'
|
|
50
|
+
weight: 2
|
|
51
|
+
expression: 'jq(custom("lineCount"), ". | tonumber") <= 200'
|
|
52
|
+
|
|
53
|
+
- title: Within Anthropic's SKILL.md line limit (<=500 lines)
|
|
54
|
+
description: 'Anthropic''s Agent Skills docs recommend keeping SKILL.md body under 500 lines for optimal performance -- a looser ceiling than this org''s 200-line target, useful for skills that miss the team target but aren''t badly bloated. Requires custom-data key "lineCount".'
|
|
55
|
+
weight: 1
|
|
56
|
+
expression: 'jq(custom("lineCount"), ". | tonumber") <= 500'
|
|
57
|
+
|
|
58
|
+
- title: Description is substantive
|
|
59
|
+
description: 'Per Anthropic''s guidance, avoid vague descriptions like "Helps with documents" -- the description drives skill discovery/triggering, so it needs real content. Requires custom-data key "descriptionCharCount".'
|
|
60
|
+
weight: 1
|
|
61
|
+
expression: 'jq(custom("descriptionCharCount"), ". | tonumber") >= 40'
|
|
62
|
+
|
|
63
|
+
- title: Description within Anthropic's hard limit (<=1024 chars)
|
|
64
|
+
description: 'The Agent Skills spec caps the description frontmatter field at 1024 characters. Requires custom-data key "descriptionCharCount".'
|
|
65
|
+
weight: 1
|
|
66
|
+
expression: 'jq(custom("descriptionCharCount"), ". | tonumber") <= 1024'
|
|
67
|
+
|
|
68
|
+
- title: No reserved words in tag/name
|
|
69
|
+
description: Anthropic's naming rules forbid "claude" or "anthropic" in a Skill's name field -- checked here against the Cortex tag as a proxy.
|
|
70
|
+
weight: 1
|
|
71
|
+
expression: '!(entity.tag().matches(".*claude.*") OR entity.tag().matches(".*anthropic.*"))'
|
|
72
|
+
|
|
73
|
+
- title: References stay one level deep
|
|
74
|
+
description: 'Per Anthropic''s progressive-disclosure guidance, all reference files should link directly from SKILL.md -- nested references (SKILL.md -> advanced.md -> details.md) cause Claude to partially read files with `head`, losing information. Requires custom-data key "hasDeepReferences" (boolean, as "true"/"false").'
|
|
75
|
+
weight: 1
|
|
76
|
+
expression: 'jq(custom("hasDeepReferences"), "not")'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationship_types.py
RENAMED
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationships.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/aws.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/wiz.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/go.py
RENAMED
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/java.py
RENAMED
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/node.py
RENAMED
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/nuget.py
RENAMED
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/python.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/users_commands/roles.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|