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.
Files changed (161) hide show
  1. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/PKG-INFO +1 -1
  2. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/cli.py +2 -0
  3. cortexapps_cli-1.26.0/cortexapps_cli/commands/ai_skills.py +200 -0
  4. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_types.py +6 -1
  5. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/README.md +85 -0
  6. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/api-doc-sync.yaml +11 -0
  7. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/changelog-writer.yaml +11 -0
  8. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/docs-generator.yaml +15 -0
  9. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/catalog/docs-portal.yaml +6 -0
  10. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-service.json +24 -0
  11. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-skills.json +24 -0
  12. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-skill-service.json +24 -0
  13. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-types/ai-plugin.json +1 -0
  14. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/entity-types/ai-skill.json +1 -0
  15. cortexapps_cli-1.26.0/cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml +76 -0
  16. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/pyproject.toml +1 -1
  17. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/LICENSE +0 -0
  18. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/README.rst +0 -0
  19. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/__init__.py +0 -0
  20. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/command_options.py +0 -0
  21. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/api_keys.py +0 -0
  22. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/audit_logs.py +0 -0
  23. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/backup.py +0 -0
  24. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/backup_commands/cortex_export.py +0 -0
  25. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/catalog.py +0 -0
  26. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_data.py +0 -0
  27. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_events.py +0 -0
  28. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/custom_metrics.py +0 -0
  29. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/dependencies.py +0 -0
  30. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/deploys.py +0 -0
  31. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/discovery_audit.py +0 -0
  32. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/docs.py +0 -0
  33. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationship_types.py +0 -0
  34. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/entity_relationships.py +0 -0
  35. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/gitops_logs.py +0 -0
  36. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/groups.py +0 -0
  37. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/initiatives.py +0 -0
  38. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations.py +0 -0
  39. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/apiiro.py +0 -0
  40. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/argocd.py +0 -0
  41. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/aws.py +0 -0
  42. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_active_directory.py +0 -0
  43. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_devops.py +0 -0
  44. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/azure_resources.py +0 -0
  45. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bamboohr.py +0 -0
  46. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bitbucket.py +0 -0
  47. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/bugsnag.py +0 -0
  48. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/buildkite.py +0 -0
  49. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/checkmarx_sast.py +0 -0
  50. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/circleci.py +0 -0
  51. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/clickup.py +0 -0
  52. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/codecov.py +0 -0
  53. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/coralogix.py +0 -0
  54. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/datadog.py +0 -0
  55. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/dynatrace.py +0 -0
  56. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/firehydrant.py +0 -0
  57. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/github.py +0 -0
  58. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/gitlab.py +0 -0
  59. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/incidentio.py +0 -0
  60. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/instana.py +0 -0
  61. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/jenkins.py +0 -0
  62. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/jira.py +0 -0
  63. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/launchdarkly.py +0 -0
  64. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/mend_sast.py +0 -0
  65. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/mend_sca.py +0 -0
  66. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/newrelic.py +0 -0
  67. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/okta.py +0 -0
  68. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/opsgenie.py +0 -0
  69. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/pagerduty.py +0 -0
  70. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/prometheus.py +0 -0
  71. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/rollbar.py +0 -0
  72. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/rootly.py +0 -0
  73. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/semgrep.py +0 -0
  74. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sentry.py +0 -0
  75. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/servicenow.py +0 -0
  76. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/servicenow_cloud_observability.py +0 -0
  77. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/snyk.py +0 -0
  78. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sonarqube.py +0 -0
  79. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/splunk_observability_cloud.py +0 -0
  80. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/splunk_on_call.py +0 -0
  81. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/sumologic.py +0 -0
  82. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/veracode.py +0 -0
  83. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/wiz.py +0 -0
  84. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/workday.py +0 -0
  85. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/integrations_commands/xmatters.py +0 -0
  86. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/ip_allowlist.py +0 -0
  87. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/on_call.py +0 -0
  88. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages.py +0 -0
  89. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/go.py +0 -0
  90. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/java.py +0 -0
  91. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/node.py +0 -0
  92. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/nuget.py +0 -0
  93. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/packages_commands/python.py +0 -0
  94. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/plugins.py +0 -0
  95. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/queries.py +0 -0
  96. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/rest.py +0 -0
  97. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scim.py +0 -0
  98. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scorecards.py +0 -0
  99. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/scorecards_commands/exemptions.py +0 -0
  100. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/secrets.py +0 -0
  101. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/solutions.py +0 -0
  102. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/teams.py +0 -0
  103. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/users.py +0 -0
  104. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/users_commands/roles.py +0 -0
  105. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/commands/workflows.py +0 -0
  106. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/cortex_client.py +0 -0
  107. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/models/team.py +0 -0
  108. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/__init__.py +0 -0
  109. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/.github/workflows/cortex-service-version.yaml +0 -0
  110. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/README.md +0 -0
  111. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.0.1.yaml +0 -0
  112. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.0.yaml +0 -0
  113. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.1.yaml +0 -0
  114. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/api-gateway.yaml +0 -0
  115. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.0.yaml +0 -0
  116. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.1.yaml +0 -0
  117. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth-2.2.0.yaml +0 -0
  118. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/auth.yaml +0 -0
  119. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/aws-dev-us-west-2.yaml +0 -0
  120. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing-1.1.0.yaml +0 -0
  121. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing-1.2.0.yaml +0 -0
  122. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/billing.yaml +0 -0
  123. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/cart-1.0.2.yaml +0 -0
  124. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/cart.yaml +0 -0
  125. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.2.0.yaml +0 -0
  126. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.3.0.yaml +0 -0
  127. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.4.0.yaml +0 -0
  128. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/checkout.yaml +0 -0
  129. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-east-1.yaml +0 -0
  130. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-west-1.yaml +0 -0
  131. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/gcp-staging-us-east-1.yaml +0 -0
  132. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.0.yaml +0 -0
  133. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.1.yaml +0 -0
  134. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.1.0.yaml +0 -0
  135. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/notifications.yaml +0 -0
  136. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.0.1.yaml +0 -0
  137. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.1.0.yaml +0 -0
  138. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/order-service.yaml +0 -0
  139. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.6.1.yaml +0 -0
  140. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.0.yaml +0 -0
  141. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.1.yaml +0 -0
  142. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/payments.yaml +0 -0
  143. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-06-20.yaml +0 -0
  144. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-01.yaml +0 -0
  145. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-09.yaml +0 -0
  146. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-10.yaml +0 -0
  147. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search-4.0.0.yaml +0 -0
  148. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search-4.1.0.yaml +0 -0
  149. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/search.yaml +0 -0
  150. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.2.0.yaml +0 -0
  151. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.3.0.yaml +0 -0
  152. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/catalog/user-service.yaml +0 -0
  153. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-relationship-types/environments.json +0 -0
  154. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-relationship-types/versions.json +0 -0
  155. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/environment.json +0 -0
  156. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/release.json +0 -0
  157. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/entity-types/service-version.json +0 -0
  158. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/create-environment.yaml +0 -0
  159. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/create-release.yaml +0 -0
  160. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/solutions/environments/workflows/trigger-github-release.yaml +0 -0
  161. {cortexapps_cli-1.24.0 → cortexapps_cli-1.26.0}/cortexapps_cli/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cortexapps-cli
3
- Version: 1.24.0
3
+ Version: 1.26.0
4
4
  Summary: Command Line Interface for cortexapps
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -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.update("api/v1/catalog/definitions/" + entity_type, data=data)
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,6 @@
1
+ openapi: "3.0.0"
2
+ info:
3
+ title: docs-portal
4
+ x-cortex-tag: docs-portal
5
+ x-cortex-type: service
6
+ description: Internal documentation portal and static site.
@@ -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")'
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "cortexapps-cli"
3
3
  # version will be incremented via command line as part of github actions build
4
- version = "1.24.0"
4
+ version = "1.26.0"
5
5
  description = "Command Line Interface for cortexapps"
6
6
  license = "MIT"
7
7
  authors = [
File without changes