cortexapps-cli 1.37.0__tar.gz → 1.39.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 (254) hide show
  1. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/PKG-INFO +1 -1
  2. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/solutions.py +109 -12
  3. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/setup.py +1 -1
  4. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/README.md +8 -8
  5. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/catalog/cli-commands.yaml +1 -1
  6. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/catalog/cli-core.yaml +1 -1
  7. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/catalog/cli-docker.yaml +1 -1
  8. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/catalog/cli-solutions.yaml +1 -1
  9. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/catalog/cli-tests.yaml +1 -1
  10. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-commands/cortex.yaml +1 -1
  11. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-core/cortex.yaml +1 -1
  12. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-docker/cortex.yaml +1 -1
  13. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-solutions/cortex.yaml +1 -1
  14. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-tests/cortex.yaml +1 -1
  15. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/setup.py +1 -1
  16. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/README.md +255 -0
  17. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/ecommerce.tf +116 -0
  18. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/provider.tf +14 -0
  19. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/scorecards.tf +116 -0
  20. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/supply-chain.tf +113 -0
  21. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/teams.tf +125 -0
  22. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/terraform.tfvars.example +10 -0
  23. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform/variables.tf +11 -0
  24. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform-delta/ecommerce.tf +163 -0
  25. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/_templates/terraform-delta/teams.tf +130 -0
  26. cortexapps_cli-1.39.0/cortexapps_cli/solutions/terraform/setup.py +196 -0
  27. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/pyproject.toml +1 -1
  28. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/LICENSE +0 -0
  29. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/README.rst +0 -0
  30. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/__init__.py +0 -0
  31. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/cli.py +0 -0
  32. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/command_options.py +0 -0
  33. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/ai_skills.py +0 -0
  34. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/api_keys.py +0 -0
  35. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/audit_logs.py +0 -0
  36. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/backup.py +0 -0
  37. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/backup_commands/cortex_export.py +0 -0
  38. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/catalog.py +0 -0
  39. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/custom_data.py +0 -0
  40. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/custom_events.py +0 -0
  41. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/custom_metrics.py +0 -0
  42. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/dependencies.py +0 -0
  43. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/deploys.py +0 -0
  44. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/discovery_audit.py +0 -0
  45. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/docs.py +0 -0
  46. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/entity_relationship_types.py +0 -0
  47. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/entity_relationships.py +0 -0
  48. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/entity_types.py +0 -0
  49. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/gitops_logs.py +0 -0
  50. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/groups.py +0 -0
  51. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/initiatives.py +0 -0
  52. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations.py +0 -0
  53. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/apiiro.py +0 -0
  54. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/argocd.py +0 -0
  55. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/aws.py +0 -0
  56. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/azure_active_directory.py +0 -0
  57. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/azure_devops.py +0 -0
  58. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/azure_resources.py +0 -0
  59. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/bamboohr.py +0 -0
  60. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/bitbucket.py +0 -0
  61. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/bugsnag.py +0 -0
  62. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/buildkite.py +0 -0
  63. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/checkmarx_sast.py +0 -0
  64. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/circleci.py +0 -0
  65. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/clickup.py +0 -0
  66. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/codecov.py +0 -0
  67. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/coralogix.py +0 -0
  68. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/datadog.py +0 -0
  69. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/dynatrace.py +0 -0
  70. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/firehydrant.py +0 -0
  71. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/github.py +0 -0
  72. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/gitlab.py +0 -0
  73. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/harness.py +0 -0
  74. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/incidentio.py +0 -0
  75. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/instana.py +0 -0
  76. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/jenkins.py +0 -0
  77. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/jira.py +0 -0
  78. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/launchdarkly.py +0 -0
  79. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/mend_sast.py +0 -0
  80. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/mend_sca.py +0 -0
  81. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/newrelic.py +0 -0
  82. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/okta.py +0 -0
  83. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/opsgenie.py +0 -0
  84. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/pagerduty.py +0 -0
  85. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/prometheus.py +0 -0
  86. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/rollbar.py +0 -0
  87. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/rootly.py +0 -0
  88. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/semgrep.py +0 -0
  89. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/sentry.py +0 -0
  90. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/servicenow.py +0 -0
  91. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/servicenow_cloud_observability.py +0 -0
  92. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/snyk.py +0 -0
  93. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/sonarqube.py +0 -0
  94. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/splunk_observability_cloud.py +0 -0
  95. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/splunk_on_call.py +0 -0
  96. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/sumologic.py +0 -0
  97. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/veracode.py +0 -0
  98. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/wiz.py +0 -0
  99. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/workday.py +0 -0
  100. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/integrations_commands/xmatters.py +0 -0
  101. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/ip_allowlist.py +0 -0
  102. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/on_call.py +0 -0
  103. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages.py +0 -0
  104. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages_commands/go.py +0 -0
  105. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages_commands/java.py +0 -0
  106. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages_commands/node.py +0 -0
  107. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages_commands/nuget.py +0 -0
  108. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/packages_commands/python.py +0 -0
  109. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/plugins.py +0 -0
  110. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/queries.py +0 -0
  111. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/rest.py +0 -0
  112. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/scaffolders.py +0 -0
  113. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/scim.py +0 -0
  114. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/scorecards.py +0 -0
  115. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/scorecards_commands/exemptions.py +0 -0
  116. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/secrets.py +0 -0
  117. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/teams.py +0 -0
  118. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/users.py +0 -0
  119. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/users_commands/roles.py +0 -0
  120. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/commands/workflows.py +0 -0
  121. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/cortex_client.py +0 -0
  122. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/models/team.py +0 -0
  123. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/__init__.py +0 -0
  124. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/_lib/__init__.py +0 -0
  125. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/_lib/setup_base.py +0 -0
  126. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/README.md +0 -0
  127. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/address-reviews.yaml +0 -0
  128. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/audit-flags.yaml +0 -0
  129. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/code-review.yaml +0 -0
  130. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/fix-issue.yaml +0 -0
  131. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/incident-trends.yaml +0 -0
  132. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/jira-to-kb.yaml +0 -0
  133. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/release-to-sha.yaml +0 -0
  134. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/search-troubleshooting-kb.yaml +0 -0
  135. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/catalog/simplify-test.yaml +0 -0
  136. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/entity-types/ai-agent.json +0 -0
  137. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-agents/scorecards/ai-agent-governance.yaml +0 -0
  138. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/README.md +0 -0
  139. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/catalog/api-doc-sync.yaml +0 -0
  140. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/catalog/changelog-writer.yaml +0 -0
  141. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-generator.yaml +0 -0
  142. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-portal.yaml +0 -0
  143. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-service.json +0 -0
  144. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-skills.json +0 -0
  145. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-skill-service.json +0 -0
  146. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-plugin.json +0 -0
  147. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-skill.json +0 -0
  148. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml +0 -0
  149. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/.github/workflows/sync-claude-spend.yaml +0 -0
  150. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/README.md +0 -0
  151. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-alice-chen.yaml +0 -0
  152. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-bob-martinez.yaml +0 -0
  153. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-carol-kim.yaml +0 -0
  154. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-david-osei.yaml +0 -0
  155. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-emma-johnson.yaml +0 -0
  156. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/team-data.yaml +0 -0
  157. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/team-engineering.yaml +0 -0
  158. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/team-frontend.yaml +0 -0
  159. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/catalog/team-platform.yaml +0 -0
  160. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/custom-metrics/ai-spend.json +0 -0
  161. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/entity-relationship-types/team-member.json +0 -0
  162. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/entity-types/employee.json +0 -0
  163. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/plugins/team-ai-spend.json +0 -0
  164. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/scorecards/ai-spend-scorecard.yaml +0 -0
  165. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/ai-spend/scripts/sync-claude-spend.py +0 -0
  166. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/.github/workflows/cortex-service-version.yaml +0 -0
  167. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/README.md +0 -0
  168. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.0.1.yaml +0 -0
  169. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.0.yaml +0 -0
  170. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.1.yaml +0 -0
  171. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/api-gateway.yaml +0 -0
  172. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.0.yaml +0 -0
  173. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.1.yaml +0 -0
  174. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/auth-2.2.0.yaml +0 -0
  175. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/auth.yaml +0 -0
  176. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/aws-dev-us-west-2.yaml +0 -0
  177. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/billing-1.1.0.yaml +0 -0
  178. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/billing-1.2.0.yaml +0 -0
  179. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/billing.yaml +0 -0
  180. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/cart-1.0.2.yaml +0 -0
  181. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/cart.yaml +0 -0
  182. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.2.0.yaml +0 -0
  183. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.3.0.yaml +0 -0
  184. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.4.0.yaml +0 -0
  185. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/checkout.yaml +0 -0
  186. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-east-1.yaml +0 -0
  187. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-west-1.yaml +0 -0
  188. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/gcp-staging-us-east-1.yaml +0 -0
  189. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.0.yaml +0 -0
  190. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.1.yaml +0 -0
  191. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.1.0.yaml +0 -0
  192. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/notifications.yaml +0 -0
  193. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.0.1.yaml +0 -0
  194. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.1.0.yaml +0 -0
  195. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/order-service.yaml +0 -0
  196. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/payments-1.6.1.yaml +0 -0
  197. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.0.yaml +0 -0
  198. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.1.yaml +0 -0
  199. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/payments.yaml +0 -0
  200. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/release-2026-06-20.yaml +0 -0
  201. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-01.yaml +0 -0
  202. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-09.yaml +0 -0
  203. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-10.yaml +0 -0
  204. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/search-4.0.0.yaml +0 -0
  205. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/search-4.1.0.yaml +0 -0
  206. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/search.yaml +0 -0
  207. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.2.0.yaml +0 -0
  208. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.3.0.yaml +0 -0
  209. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/catalog/user-service.yaml +0 -0
  210. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/entity-relationship-types/environments.json +0 -0
  211. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/entity-relationship-types/versions.json +0 -0
  212. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/entity-types/environment.json +0 -0
  213. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/entity-types/release.json +0 -0
  214. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/entity-types/service-version.json +0 -0
  215. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/workflows/create-environment.yaml +0 -0
  216. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/workflows/create-release.yaml +0 -0
  217. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/environments/workflows/trigger-github-release.yaml +0 -0
  218. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/README.md +0 -0
  219. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-async-callback.yml +0 -0
  220. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-deploy.yml +0 -0
  221. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-register-deploy.yml +0 -0
  222. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/github-actions-deploy.yaml +0 -0
  223. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/catalog/github-actions-demo.yaml +0 -0
  224. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/scorecards/deploy-health.yaml +0 -0
  225. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/github-actions-deploy/setup.py +0 -0
  226. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/README.md +0 -0
  227. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-async-callback-template.yaml +0 -0
  228. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-deploy-pipeline.yaml +0 -0
  229. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-record-deploy-template.yaml +0 -0
  230. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/_templates/trigger-harness-deploy.yaml +0 -0
  231. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/catalog/harness-demo.yaml +0 -0
  232. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/harness-deploy/scorecards/deploy-health.yaml +0 -0
  233. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/README.md +0 -0
  234. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/_templates/Jenkinsfile +0 -0
  235. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/_templates/trigger-jenkins-deploy.yaml +0 -0
  236. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/catalog/jenkins-demo.yaml +0 -0
  237. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/scorecards/deploy-health.yaml +0 -0
  238. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/jenkins-deploy/setup.py +0 -0
  239. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/scorecards/monorepo-component-health.yaml +0 -0
  240. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-commands/README.md +0 -0
  241. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-commands/src/commands.py +0 -0
  242. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-core/README.md +0 -0
  243. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-core/src/cli.py +0 -0
  244. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-docker/Dockerfile +0 -0
  245. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-docker/README.md +0 -0
  246. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-solutions/README.md +0 -0
  247. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-solutions/src/solutions.py +0 -0
  248. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-tests/README.md +0 -0
  249. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/monorepo/services/cli-tests/src/test_cli.py +0 -0
  250. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/workday/README.md +0 -0
  251. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/workday/data/configuration.json +0 -0
  252. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/workday/data/pied-piper-supervisory-org.json +0 -0
  253. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.0}/cortexapps_cli/solutions/workday/setup.py +0 -0
  254. {cortexapps_cli-1.37.0 → cortexapps_cli-1.39.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.37.0
3
+ Version: 1.39.0
4
4
  Summary: Command Line Interface for cortexapps
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -568,7 +568,84 @@ def _apply_hyperlinks(line: str, entity_tags: set[str], ui_url: str) -> str:
568
568
  return "".join(parts)
569
569
 
570
570
 
571
- def _show_diagram(readme: str, entity_tags: set[str] | None = None, ui_url: str = "https://app.getcortexapp.com") -> None:
571
+ _GITHUB_BLOB = "https://github.com/cortexapps/cli/blob/main/cortexapps_cli/solutions"
572
+
573
+
574
+ def _parse_tf_tags_by_type(solution_dir: Path) -> tuple[set[str], set[str]]:
575
+ """Scan *.tf files under _templates/<solution>/ and return (entity_tags, scorecard_tags)."""
576
+ entity_tags: set[str] = set()
577
+ scorecard_tags: set[str] = set()
578
+ templates = next(
579
+ (d for d in (solution_dir / "_templates").iterdir() if d.is_dir() and not d.name.endswith("-delta")),
580
+ None,
581
+ ) if (solution_dir / "_templates").exists() else None
582
+ if templates is None:
583
+ return entity_tags, scorecard_tags
584
+ for tf in templates.glob("*.tf"):
585
+ current_type: str | None = None
586
+ depth = 0
587
+ for line in tf.read_text(encoding="utf-8").split("\n"):
588
+ m = re.match(r'\s*resource\s+"(cortex_\w+)"\s+"[^"]+"\s*\{', line)
589
+ if m:
590
+ current_type = m.group(1)
591
+ depth = 1
592
+ continue
593
+ if current_type:
594
+ depth += line.count("{") - line.count("}")
595
+ if depth <= 0:
596
+ current_type = None
597
+ depth = 0
598
+ continue
599
+ tm = re.search(r'\btag\s*=\s*"([^"]+)"', line)
600
+ if tm:
601
+ if current_type == "cortex_catalog_entity":
602
+ entity_tags.add(tm.group(1))
603
+ elif current_type == "cortex_scorecard":
604
+ scorecard_tags.add(tm.group(1))
605
+ return entity_tags, scorecard_tags
606
+
607
+
608
+ def _extract_tf_entity_tags(solution_dir: Path) -> set[str]:
609
+ """Return only cortex_catalog_entity tags from .tf template files."""
610
+ entity_tags, _ = _parse_tf_tags_by_type(solution_dir)
611
+ return entity_tags
612
+
613
+
614
+
615
+ def _apply_file_hyperlinks(line: str, solution_tag: str) -> str:
616
+ """Replace bare filenames in the diagram with OSC 8 links to GitHub blob URLs."""
617
+ base = f"{_GITHUB_BLOB}/{solution_tag}/_templates/{solution_tag}"
618
+ parts = []
619
+ i = 0
620
+ while i < len(line):
621
+ # Look for a word boundary start: not alphanumeric/hyphen/dot before current pos
622
+ for filename in sorted(
623
+ (f for f in [
624
+ "teams.tf", "ecommerce.tf", "supply-chain.tf", "scorecards.tf",
625
+ "provider.tf", "variables.tf", "terraform.tfvars",
626
+ ] if line.find(f, i) == i),
627
+ key=len, reverse=True,
628
+ ):
629
+ after = i + len(filename)
630
+ # Ensure word boundary after: next char must not be alphanumeric
631
+ if after < len(line) and (line[after].isalnum() or line[after] in "-_."):
632
+ continue
633
+ parts.append(_osc8(f"{base}/{filename}", filename))
634
+ i = after
635
+ break
636
+ else:
637
+ parts.append(line[i])
638
+ i += 1
639
+ return "".join(parts)
640
+
641
+
642
+
643
+ def _show_diagram(
644
+ readme: str,
645
+ entity_tags: set[str] | None = None,
646
+ ui_url: str = "https://app.getcortexapp.com",
647
+ solution_tag: str = "",
648
+ ) -> None:
572
649
  block = _extract_first_codeblock(readme)
573
650
  if not block:
574
651
  return
@@ -577,23 +654,26 @@ def _show_diagram(readme: str, entity_tags: set[str] | None = None, ui_url: str
577
654
 
578
655
  print()
579
656
  for line in block.split("\n"):
580
- if entity_tags and links_supported:
581
- line = _apply_hyperlinks(line, entity_tags, ui_url)
657
+ if links_supported:
658
+ if entity_tags:
659
+ line = _apply_hyperlinks(line, entity_tags, ui_url)
660
+ if solution_tag:
661
+ line = _apply_file_hyperlinks(line, solution_tag)
582
662
  # Use print() not console.print(): Rich counts OSC 8 escape bytes as
583
663
  # visible characters, shifting ASCII art alignment.
584
664
  print(f" {line}")
585
665
 
586
666
  if entity_tags and not links_supported:
587
- diagram_tags = sorted(
667
+ entity_rows = sorted(
588
668
  (tag for tag in entity_tags if tag in block),
589
669
  key=lambda t: t.lower(),
590
670
  )
591
- if diagram_tags:
671
+ if entity_rows:
592
672
  print()
593
673
  table = Table(show_header=True, header_style="bold", box=None, padding=(0, 2, 0, 0))
594
674
  table.add_column("Entity")
595
675
  table.add_column("URL")
596
- for tag in diagram_tags:
676
+ for tag in entity_rows:
597
677
  table.add_row(tag, f"{ui_url}/admin/resources?tag={tag}")
598
678
  console.print(table)
599
679
 
@@ -612,18 +692,21 @@ def _post_install_menu(
612
692
  import_report: str = "",
613
693
  entity_tags: set[str] | None = None,
614
694
  ui_url: str = "https://app.getcortexapp.com",
695
+ solution_tag: str = "",
615
696
  ) -> None:
616
697
  options = [
617
698
  ("1", "Data Model"),
618
699
  ("2", "Next steps"),
619
- ("3", "Import report"),
620
- ("4", "Exit"),
621
700
  ]
622
701
  actions = {
623
- "1": lambda: _show_diagram(readme, entity_tags=entity_tags, ui_url=ui_url),
702
+ "1": lambda: _show_diagram(readme, entity_tags=entity_tags, ui_url=ui_url, solution_tag=solution_tag),
624
703
  "2": lambda: _show_next_steps(readme),
625
- "3": lambda: (console.print(), typer.echo(import_report)),
626
704
  }
705
+ if import_report:
706
+ options.append(("3", "Import report"))
707
+ actions["3"] = lambda: (console.print(), typer.echo(import_report))
708
+ exit_key = str(len(options) + 1)
709
+ options.append((exit_key, "Exit"))
627
710
 
628
711
  while True:
629
712
  console.print()
@@ -634,7 +717,7 @@ def _post_install_menu(
634
717
 
635
718
  choice = Prompt.ask("Choice", choices=[k for k, _ in options], show_choices=False)
636
719
 
637
- if choice == "4":
720
+ if choice == exit_key:
638
721
  break
639
722
  actions[choice]()
640
723
 
@@ -731,9 +814,23 @@ def install(
731
814
  with as_file(root / solution) as sp:
732
815
  resources = _collect_solution_resources(sp)
733
816
  entity_tags = set(resources.get("catalog", []))
817
+ if solutions_dir:
818
+ entity_tags |= _extract_tf_entity_tags(root / solution)
819
+ else:
820
+ with as_file(root / solution) as sp:
821
+ entity_tags |= _extract_tf_entity_tags(sp)
734
822
  except Exception:
735
823
  pass
736
- _post_install_menu(readme, import_report=output, entity_tags=entity_tags, ui_url=ui_url)
824
+ has_import_results = bool(
825
+ total_match and (int(total_match.group(1)) > 0 or int(total_match.group(2)) > 0)
826
+ )
827
+ _post_install_menu(
828
+ readme,
829
+ import_report=output if has_import_results else "",
830
+ entity_tags=entity_tags,
831
+ ui_url=ui_url,
832
+ solution_tag=solution,
833
+ )
737
834
 
738
835
 
739
836
  @app.command(name="post-install")
@@ -231,7 +231,7 @@ class HarnessDeploySetup(SolutionSetup):
231
231
  base_url = self._answers["cortex_base_url"].rstrip("/")
232
232
  app_url = base_url.replace("api.", "app.", 1) if "api." in base_url else base_url
233
233
  entity_tag = self._answers["entity_tag"]
234
- cortex_url = f"{app_url}/admin/resources?tag={entity_tag}" # /admin/resources is the correct URL path (entity terminology in UI)
234
+ cortex_url = f"{app_url}/admin/resources?tag={entity_tag}"
235
235
 
236
236
  harness_pipeline_url = (
237
237
  f"{self._harness_base()}/ng/account/{self._harness_account()}"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Monorepo
3
- description: Model a real monorepo in Cortex — five Cortex services mapped to subdirectories of a single public GitHub repo, each scoped by basePath.
3
+ description: Model a real monorepo in Cortex — five Cortex services mapped to subdirectories of a single public GitHub repo, each scoped by basepath.
4
4
  ---
5
5
 
6
6
  # Monorepo
@@ -62,7 +62,7 @@ info:
62
62
  github:
63
63
  alias: cortex-cli # only needed with multiple GitHub integrations, and your repo isn't under the default
64
64
  repository: cortexapps/cli
65
- basePath: cortexapps_cli/solutions/monorepo/services/cli-core
65
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-core
66
66
  ```
67
67
 
68
68
  All five entities are tagged with the group `monorepo-demo` for easy catalog filtering.
@@ -71,7 +71,7 @@ All five entities are tagged with the group `monorepo-demo` for easy catalog fil
71
71
 
72
72
  **5 service entities** (group: `monorepo-demo`)
73
73
 
74
- | Tag | basePath | Description |
74
+ | Tag | basepath | Description |
75
75
  |---|---|---|
76
76
  | `monorepo-demo-cli-core` | `services/cli-core` | Core CLI — Typer app, HTTP client, config, utils |
77
77
  | `monorepo-demo-cli-commands` | `services/cli-commands` | Command implementations per Cortex resource |
@@ -79,10 +79,10 @@ All five entities are tagged with the group `monorepo-demo` for easy catalog fil
79
79
  | `monorepo-demo-cli-tests` | `services/cli-tests` | Integration test suite against live Cortex API |
80
80
  | `monorepo-demo-cli-docker` | `services/cli-docker` | Container infra — published `cortexapp/cli` image |
81
81
 
82
- > Full basePaths are prefixed with `cortexapps_cli/solutions/monorepo/` — shortened above for readability.
82
+ > Full basepaths are prefixed with `cortexapps_cli/solutions/monorepo/` — shortened above for readability.
83
83
 
84
84
  **1 scorecard** — `monorepo-component-health` — Bronze/Silver/Gold:
85
- - Bronze: has description + git configured with basePath
85
+ - Bronze: has description + git configured with basepath
86
86
  - Silver: belongs to at least one group
87
87
  - Gold: verified within 90 days
88
88
 
@@ -161,15 +161,15 @@ GitOps syncs automatically on each push to the repo. To trigger a manual sync wi
161
161
  3. Select **GitHub**
162
162
  4. Follow the prompts to select the `cortexapps/cli` repository
163
163
 
164
- Cortex will find the `cortex.yaml` files in each subdirectory and recreate the deleted entities exactly as defined — group, git basePath, description, and all.
164
+ Cortex will find the `cortex.yaml` files in each subdirectory and recreate the deleted entities exactly as defined — group, git basepath, description, and all.
165
165
 
166
166
  ## Adapting for Your Own Monorepo
167
167
 
168
168
  1. Add a `cortex.yaml` to each component subdirectory in your repo
169
- 2. Set `x-cortex-git.github.repository` and `basePath` for each component
169
+ 2. Set `x-cortex-git.github.repository` and `basepath` for each component
170
170
  3. Add `x-cortex-git.github.alias` if you have more than one GitHub integration configured and your repo isn't under the default
171
171
  4. Add a consistent group tag to all components (e.g. `my-monorepo`)
172
172
  5. Add GitOps → your repo in Cortex Settings
173
173
  6. Cortex discovers and syncs all components automatically
174
174
 
175
- The `basePath` is what splits one repo into many scoped entities — each service sees only the activity in its own directory.
175
+ The `basepath` is what splits one repo into many scoped entities — each service sees only the activity in its own directory.
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-commands
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-commands
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-core
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-core
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-docker
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-docker
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-solutions
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-solutions
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-tests
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-tests
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-commands
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-commands
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-core
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-core
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-docker
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-docker
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-solutions
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-solutions
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -10,7 +10,7 @@ info:
10
10
  github:
11
11
  alias: cortex-cli
12
12
  repository: cortexapps/cli
13
- basePath: cortexapps_cli/solutions/monorepo/services/cli-tests
13
+ basepath: cortexapps_cli/solutions/monorepo/services/cli-tests
14
14
  x-cortex-link:
15
15
  - name: GitHub
16
16
  type: repo
@@ -233,7 +233,7 @@ class MonorepoSetup(SolutionSetup):
233
233
  print(f"4. Ready to model your own monorepo?")
234
234
  print(f" For each component in your repo:")
235
235
  print(f" a. Add a cortex.yaml to the component's subdirectory")
236
- print(f" b. Set x-cortex-git.github.repository and basePath to match")
236
+ print(f" b. Set x-cortex-git.github.repository and basepath to match")
237
237
  print(f" c. Add a consistent group tag (e.g. my-monorepo) to all components")
238
238
  print(f" d. Add x-cortex-git.github.alias if you have more than one GitHub integration configured,")
239
239
  print(f" and your entities aren't represented by the 'default' integration")
@@ -0,0 +1,255 @@
1
+ ---
2
+ name: Terraform
3
+ description: Manage your Cortex catalog as code using the Cortex Terraform provider.
4
+ ---
5
+
6
+ # Terraform
7
+
8
+ The [Cortex Terraform provider](https://github.com/cortexapps/terraform-provider-cortex) lets you define your entire service catalog — teams, services, domains, scorecards — as HCL code in `.tf` files. Changes go through PR review and apply automatically on merge, giving you a fully auditable, GitOps-driven catalog.
9
+
10
+ ## Data Model
11
+
12
+ ```
13
+ ┌──────────────────────────────────────────────────────┐
14
+ │ Terraform Repo │
15
+ │ │
16
+ │ teams.tf scorecards.tf │
17
+ │ ecommerce.tf provider.tf │
18
+ │ supply-chain.tf variables.tf │
19
+ └─────────────────────────────┬────────────────────────┘
20
+
21
+ │ terraform apply
22
+
23
+
24
+ ┌──────────────────────────────────────────────────────┐
25
+ │ Cortex Catalog │
26
+ │ │
27
+ │ Teams │
28
+ │ ┌────────────────────────────────────────────────┐ │
29
+ │ │ terraform-demo-team-development │ │
30
+ │ │ terraform-demo-team-operations │ │
31
+ │ │ terraform-demo-team-security │ │
32
+ │ │ terraform-demo-team-qa │ │
33
+ │ └────────────────────────────────────────────────┘ │
34
+ │ │
35
+ │ Domains │
36
+ │ ┌────────────────────────────────────────────────┐ │
37
+ │ │ terraform-demo-domain-ecommerce │ │
38
+ │ │ terraform-demo-domain-supply-chain │ │
39
+ │ └────────────────────────────────────────────────┘ │
40
+ │ │
41
+ │ Services │
42
+ │ ┌────────────────────────────────────────────────┐ │
43
+ │ │ terraform-demo-phoenix │ │
44
+ │ │ terraform-demo-parts-catalog-api │ │
45
+ │ │ terraform-demo-payments-service │ │
46
+ │ │ terraform-demo-inventory-service │ │
47
+ │ │ terraform-demo-ordering-service │ │
48
+ │ │ terraform-demo-shipping-service │ │
49
+ │ └────────────────────────────────────────────────┘ │
50
+ │ │
51
+ │ Scorecard │
52
+ │ ┌────────────────────────────────────────────────┐ │
53
+ │ │ terraform-demo-production-readiness │ │
54
+ │ └────────────────────────────────────────────────┘ │
55
+ └──────────────────────────────────────────────────────┘
56
+ ```
57
+
58
+ ## What is HCL?
59
+
60
+ HCL (HashiCorp Configuration Language) is the declarative language used in `.tf` files. It reads like structured config rather than code:
61
+
62
+ ```hcl
63
+ resource "cortex_catalog_entity" "phoenix" {
64
+ tag = "terraform-demo-phoenix"
65
+ name = "The Phoenix Project"
66
+ description = "Main e-commerce monolith for Parts Unlimited."
67
+
68
+ owners = [{ name = "terraform-demo-team-development", type = "group", provider = "CORTEX" }]
69
+
70
+ git = {
71
+ github = { repository = "parts-unlimited/phoenix" }
72
+ }
73
+ }
74
+ ```
75
+
76
+ Terraform reads all `.tf` files in a directory, compares them to the current live state, and applies only what changed.
77
+
78
+ ## Terraform vs. cortex.yaml — two flavors of GitOps
79
+
80
+ Both approaches keep your catalog in git and apply changes on merge. The difference is where the files live:
81
+
82
+ | | Terraform | cortex.yaml |
83
+ |---|---|---|
84
+ | **Files live in** | One central infra repo | Each service's own repo |
85
+ | **Managed by** | Platform / infra team | Individual service teams |
86
+ | **Also manages** | AWS, GCP, everything else | Just Cortex catalog |
87
+ | **Apply mechanism** | CI runs `terraform apply` | Cortex git integration polls files |
88
+
89
+ Neither is better. Platform teams who already manage cloud infrastructure with Terraform often prefer the centralized approach. Dev teams who want catalog config alongside their code prefer cortex.yaml.
90
+
91
+ ## File ownership at scale
92
+
93
+ Terraform has no requirements on file names — it reads all `.tf` files in a directory and merges them. This means you can split by team or domain ownership:
94
+
95
+ ```
96
+ infra-catalog/
97
+ ├── provider.tf ← platform team
98
+ ├── teams.tf ← platform team
99
+ ├── scorecards.tf ← platform team
100
+ ├── ecommerce.tf ← e-commerce team (domain + services)
101
+ ├── supply-chain.tf ← supply chain team (domain + services)
102
+ └── payments.tf ← payments team
103
+ ```
104
+
105
+ Each team submits PRs touching only their file. At very large scale (100K+ services), teams use Terraform modules (subdirectories) to organize further — but the ownership model is the same.
106
+
107
+ ## What's Included
108
+
109
+ This solution installs a demo org for **Parts Unlimited** (from *The Phoenix Project*):
110
+
111
+ - **4 teams**: Development (Bill's team), IT Operations (Brent's domain), Information Security (John's team), QA
112
+ - **2 domains**: E-Commerce, Supply Chain
113
+ - **6 services**: The Phoenix Project, Parts Catalog API, Payments Service, Inventory Service, Ordering Service, Shipping Service
114
+ - **1 scorecard**: Terraform Demo Production Readiness (Bronze/Silver/Gold)
115
+
116
+ All services start at **Bronze** — intentionally incomplete so you can see the delta in action.
117
+
118
+ ## Prerequisites
119
+
120
+ - Terraform >= 1.5 — install at https://developer.hashicorp.com/terraform/install
121
+ - Cortex API key with write access
122
+
123
+ ## Install
124
+
125
+ ```bash
126
+ cortex solutions post-install -s terraform
127
+ ```
128
+
129
+ You'll be asked where to create the working directory (default: `~/parts-unlimited-terraform`). The script will:
130
+ 1. Verify Terraform is installed
131
+ 2. Copy the `.tf` files to your working directory
132
+ 3. Write your credentials to `terraform.tfvars`
133
+ 4. Run `terraform init` to download the Cortex provider
134
+ 5. Run `terraform apply` to create all entities in Cortex
135
+
136
+ ## After Installing
137
+
138
+ Terraform created 13 entities in your Cortex catalog: 4 teams, 2 domains, and 6 services — all tagged with the `terraform-demo` group.
139
+
140
+ **Create a catalog to filter to the demo entities**
141
+
142
+ 1. Go to [Catalogs](https://app.getcortexapp.com/admin/catalogs) → **New Catalog**
143
+ 2. Name it **Terraform Demo**
144
+ 3. Set the catalog filter:
145
+ - **Entity type:** `service`
146
+ - **Advanced options → Groups → Include:** `terraform-demo`
147
+
148
+ **Open the scorecard**
149
+
150
+ Open [Scorecards](https://app.getcortexapp.com/admin/scorecards) and find **Terraform Demo Production Readiness** to see all 6 services at Bronze.
151
+
152
+ ### Try the Delta
153
+
154
+ The delta shows what a real team PR looks like — modify a file, plan, apply, watch the scorecard update.
155
+
156
+ **Step 1: Copy the delta files into your working directory**
157
+
158
+ The exact delta file paths were printed when you ran `cortex solutions post-install -s terraform`. Copy the delta files shown there to your working directory.
159
+
160
+ **Step 2: See what will change**
161
+
162
+ ```bash
163
+ cd ~/parts-unlimited-terraform
164
+ terraform plan
165
+ ```
166
+
167
+ You'll see:
168
+ - `~ cortex_catalog_entity.phoenix` — **update** (adds links, metadata to `terraform-demo-phoenix`)
169
+ - `+ cortex_catalog_entity.notification_service` — **create** (`terraform-demo-notification-service`)
170
+ - `~ cortex_catalog_entity.team_development` — **update** (new member on `terraform-demo-team-development`)
171
+
172
+ **Step 3: Apply**
173
+
174
+ ```bash
175
+ terraform apply
176
+ ```
177
+
178
+ **Step 4: Check the scorecard**
179
+
180
+ Open [Scorecards](https://app.getcortexapp.com/admin/scorecards) and find **Terraform Demo Production Readiness** in Cortex. The Phoenix Project should now show **Silver**. Also check that the new **Notification Service** appears in your catalog.
181
+
182
+ ## File Walkthrough
183
+
184
+ **`provider.tf`** — Declares the `cortexapps/cortex` provider version and reads credentials from variables. This is the only file that changes if you upgrade the provider version.
185
+
186
+ **`variables.tf`** — Defines `cortex_api_token` (sensitive) and `cortex_base_url`. Values come from `terraform.tfvars` (never committed) or environment variables (`CORTEX_API_TOKEN`, `CORTEX_API_URL`).
187
+
188
+ **`teams.tf`** — Owned by the platform team. Defines all teams and their members. Changes here require a platform PR.
189
+
190
+ **`ecommerce.tf`** — Owned by the e-commerce team. Defines the E-Commerce domain and its three services. Changes here — new services, updated descriptions, added links — are the e-commerce team's PR to make.
191
+
192
+ **`supply-chain.tf`** — Same pattern, owned by the supply chain team.
193
+
194
+ **`scorecards.tf`** — Owned by the platform team. Defines the Terraform Demo Production Readiness scorecard and its Bronze/Silver/Gold rules.
195
+
196
+ ## Customizing for Your Org
197
+
198
+ 1. Rename entity tags and display names throughout
199
+ 2. Replace `parts-unlimited/*` GitHub repos with your actual repos
200
+ 3. Add more services: copy any service block from `ecommerce.tf` and adjust the tag, name, and owner
201
+ 4. Extend scorecard rules: add rules to `scorecards.tf` with the expression language shown in the [Cortex docs](https://docs.cortex.io/docs/reference/scorecard-rules)
202
+ 5. Split into more files as your team grows — Terraform reads them all
203
+
204
+ ## Next Steps: CI/CD Integration
205
+
206
+ In practice, customers commit their `.tf` files to a repo and let CI handle applies. Here's a minimal GitHub Actions workflow:
207
+
208
+ ```yaml
209
+ # .github/workflows/cortex-catalog.yml
210
+ name: Cortex Catalog
211
+
212
+ on:
213
+ pull_request:
214
+ paths: ['catalog/**']
215
+ push:
216
+ branches: [main]
217
+ paths: ['catalog/**']
218
+
219
+ jobs:
220
+ plan:
221
+ if: github.event_name == 'pull_request'
222
+ runs-on: ubuntu-latest
223
+ steps:
224
+ - uses: actions/checkout@v4
225
+ - uses: hashicorp/setup-terraform@v3
226
+ with:
227
+ terraform_version: "~> 1.5"
228
+ - run: terraform init
229
+ working-directory: catalog
230
+ env:
231
+ TF_VAR_cortex_api_token: ${{ secrets.CORTEX_API_TOKEN }}
232
+ - run: terraform plan
233
+ working-directory: catalog
234
+ env:
235
+ TF_VAR_cortex_api_token: ${{ secrets.CORTEX_API_TOKEN }}
236
+
237
+ apply:
238
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
239
+ runs-on: ubuntu-latest
240
+ steps:
241
+ - uses: actions/checkout@v4
242
+ - uses: hashicorp/setup-terraform@v3
243
+ with:
244
+ terraform_version: "~> 1.5"
245
+ - run: terraform init
246
+ working-directory: catalog
247
+ env:
248
+ TF_VAR_cortex_api_token: ${{ secrets.CORTEX_API_TOKEN }}
249
+ - run: terraform apply -auto-approve
250
+ working-directory: catalog
251
+ env:
252
+ TF_VAR_cortex_api_token: ${{ secrets.CORTEX_API_TOKEN }}
253
+ ```
254
+
255
+ Store `CORTEX_API_TOKEN` as a GitHub Actions secret. Now every PR shows a plan diff as a CI check, and every merge to main applies automatically.