cortexapps-cli 1.33.0__tar.gz → 1.35.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/PKG-INFO +1 -1
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/cli.py +2 -0
- cortexapps_cli-1.35.0/cortexapps_cli/commands/scaffolders.py +156 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/solutions.py +3 -3
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/_lib/setup_base.py +5 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/setup.py +1 -3
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/setup.py +1 -1
- cortexapps_cli-1.35.0/cortexapps_cli/solutions/workday/README.md +137 -0
- cortexapps_cli-1.35.0/cortexapps_cli/solutions/workday/data/configuration.json +31 -0
- cortexapps_cli-1.35.0/cortexapps_cli/solutions/workday/data/pied-piper-supervisory-org.json +113 -0
- cortexapps_cli-1.35.0/cortexapps_cli/solutions/workday/setup.py +145 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/pyproject.toml +1 -1
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/LICENSE +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/README.rst +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/__init__.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/command_options.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/ai_skills.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/api_keys.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/audit_logs.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/backup.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/backup_commands/cortex_export.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/catalog.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/custom_data.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/custom_events.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/custom_metrics.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/dependencies.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/deploys.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/discovery_audit.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/docs.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/entity_relationship_types.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/entity_relationships.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/entity_types.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/gitops_logs.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/groups.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/initiatives.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/apiiro.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/argocd.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/aws.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/azure_active_directory.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/azure_devops.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/azure_resources.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/bamboohr.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/bitbucket.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/bugsnag.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/buildkite.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/checkmarx_sast.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/circleci.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/clickup.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/codecov.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/coralogix.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/datadog.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/dynatrace.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/firehydrant.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/github.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/gitlab.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/harness.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/incidentio.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/instana.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/jenkins.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/jira.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/launchdarkly.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/mend_sast.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/mend_sca.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/newrelic.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/okta.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/opsgenie.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/pagerduty.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/prometheus.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/rollbar.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/rootly.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/semgrep.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/sentry.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/servicenow.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/servicenow_cloud_observability.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/snyk.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/sonarqube.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/splunk_observability_cloud.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/splunk_on_call.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/sumologic.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/veracode.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/wiz.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/workday.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/integrations_commands/xmatters.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/ip_allowlist.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/on_call.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages_commands/go.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages_commands/java.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages_commands/node.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages_commands/nuget.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/packages_commands/python.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/plugins.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/queries.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/rest.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/scim.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/scorecards.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/scorecards_commands/exemptions.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/secrets.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/teams.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/users.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/users_commands/roles.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/commands/workflows.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/cortex_client.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/models/team.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/__init__.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/_lib/__init__.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/address-reviews.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/audit-flags.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/code-review.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/fix-issue.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/incident-trends.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/jira-to-kb.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/release-to-sha.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/search-troubleshooting-kb.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/catalog/simplify-test.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/entity-types/ai-agent.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-agents/scorecards/ai-agent-governance.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/catalog/api-doc-sync.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/catalog/changelog-writer.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-generator.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/catalog/docs-portal.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-service.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-plugin-skills.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/entity-relationship-types/ai-skill-service.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-plugin.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/entity-types/ai-skill.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-skills/scorecards/ai-skills-quality.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/.github/workflows/sync-claude-spend.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-alice-chen.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-bob-martinez.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-carol-kim.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-david-osei.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/employee-emma-johnson.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/team-data.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/team-engineering.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/team-frontend.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/catalog/team-platform.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/custom-metrics/ai-spend.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/entity-relationship-types/team-member.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/entity-types/employee.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/plugins/team-ai-spend.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/scorecards/ai-spend-scorecard.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/ai-spend/scripts/sync-claude-spend.py +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/.github/workflows/cortex-service-version.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.0.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/api-gateway-3.1.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/api-gateway.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/auth-2.1.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/auth-2.2.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/auth.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/aws-dev-us-west-2.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/billing-1.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/billing-1.2.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/billing.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/cart-1.0.2.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/cart.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.2.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.3.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/checkout-2.4.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/checkout.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-east-1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/gcp-prod-us-west-1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/gcp-staging-us-east-1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.0.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/notifications-1.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/notifications.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.0.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/order-service-2.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/order-service.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/payments-1.6.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/payments-1.7.1.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/payments.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/release-2026-06-20.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-01.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-09.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/release-2026-07-10.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/search-4.0.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/search-4.1.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/search.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.2.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/user-service-1.3.0.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/catalog/user-service.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/entity-relationship-types/environments.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/entity-relationship-types/versions.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/entity-types/environment.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/entity-types/release.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/entity-types/service-version.json +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/workflows/create-environment.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/workflows/create-release.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/environments/workflows/trigger-github-release.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-async-callback.yml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-deploy.yml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/cortex-register-deploy.yml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/_templates/github-actions-deploy.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/catalog/github-actions-demo.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/github-actions-deploy/scorecards/deploy-health.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/README.md +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-async-callback-template.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-deploy-pipeline.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/_templates/cortex-record-deploy-template.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/_templates/trigger-harness-deploy.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/catalog/harness-demo.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/scorecards/deploy-health.yaml +0 -0
- {cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/utils.py +0 -0
|
@@ -39,6 +39,7 @@ import cortexapps_cli.commands.packages as packages
|
|
|
39
39
|
import cortexapps_cli.commands.plugins as plugins
|
|
40
40
|
import cortexapps_cli.commands.queries as queries
|
|
41
41
|
import cortexapps_cli.commands.rest as rest
|
|
42
|
+
import cortexapps_cli.commands.scaffolders as scaffolders
|
|
42
43
|
import cortexapps_cli.commands.scim as scim
|
|
43
44
|
import cortexapps_cli.commands.scorecards as scorecards
|
|
44
45
|
import cortexapps_cli.commands.secrets as secrets
|
|
@@ -277,6 +278,7 @@ app.add_typer(packages.app, name="packages")
|
|
|
277
278
|
app.add_typer(plugins.app, name="plugins")
|
|
278
279
|
app.add_typer(queries.app, name="queries")
|
|
279
280
|
app.add_typer(rest.app, name="rest")
|
|
281
|
+
app.add_typer(scaffolders.app, name="scaffolders")
|
|
280
282
|
app.add_typer(scim.app, name="scim")
|
|
281
283
|
app.add_typer(scorecards.app, name="scorecards")
|
|
282
284
|
app.add_typer(secrets.app, name="secrets")
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from cortexapps_cli.command_options import CommandOptions
|
|
2
|
+
from cortexapps_cli.command_options import ListCommandOptions
|
|
3
|
+
from cortexapps_cli.utils import print_output_with_context, print_output
|
|
4
|
+
from typing_extensions import Annotated
|
|
5
|
+
import json
|
|
6
|
+
import typer
|
|
7
|
+
import yaml
|
|
8
|
+
|
|
9
|
+
app = typer.Typer(
|
|
10
|
+
help="Scaffolder template commands",
|
|
11
|
+
no_args_is_help=True
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
def _is_valid_yaml(filepath):
|
|
15
|
+
try:
|
|
16
|
+
yaml.safe_load(filepath)
|
|
17
|
+
filepath.seek(0)
|
|
18
|
+
return True
|
|
19
|
+
except yaml.YAMLError:
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
def _is_valid_json(filepath):
|
|
23
|
+
try:
|
|
24
|
+
json.load(filepath)
|
|
25
|
+
filepath.seek(0)
|
|
26
|
+
return True
|
|
27
|
+
except json.JSONDecodeError:
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
def _read_definition(file_input):
|
|
31
|
+
if _is_valid_json(file_input):
|
|
32
|
+
content_type = "application/json"
|
|
33
|
+
data = json.loads("".join([line for line in file_input]))
|
|
34
|
+
elif _is_valid_yaml(file_input):
|
|
35
|
+
data = file_input.read()
|
|
36
|
+
content_type = "application/yaml"
|
|
37
|
+
else:
|
|
38
|
+
raise typer.BadParameter("Input file is neither valid JSON nor YAML.")
|
|
39
|
+
return data, content_type
|
|
40
|
+
|
|
41
|
+
@app.command()
|
|
42
|
+
def list(
|
|
43
|
+
ctx: typer.Context,
|
|
44
|
+
_print: CommandOptions._print = True,
|
|
45
|
+
page: ListCommandOptions.page = None,
|
|
46
|
+
page_size: ListCommandOptions.page_size = 250,
|
|
47
|
+
table_output: ListCommandOptions.table_output = False,
|
|
48
|
+
csv_output: ListCommandOptions.csv_output = False,
|
|
49
|
+
columns: ListCommandOptions.columns = [],
|
|
50
|
+
no_headers: ListCommandOptions.no_headers = False,
|
|
51
|
+
filters: ListCommandOptions.filters = [],
|
|
52
|
+
sort: ListCommandOptions.sort = [],
|
|
53
|
+
):
|
|
54
|
+
"""
|
|
55
|
+
List Scaffolder templates.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
client = ctx.obj["client"]
|
|
59
|
+
|
|
60
|
+
params = {
|
|
61
|
+
"page": page,
|
|
62
|
+
"pageSize": page_size
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (table_output or csv_output) and not ctx.params.get('columns'):
|
|
66
|
+
ctx.params['columns'] = [
|
|
67
|
+
"Tag=tag",
|
|
68
|
+
"Name=name",
|
|
69
|
+
"Description=description",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
# remove any params that are None
|
|
73
|
+
params = {k: v for k, v in params.items() if v is not None}
|
|
74
|
+
|
|
75
|
+
if page is None:
|
|
76
|
+
# if page is not specified, we want to fetch all pages
|
|
77
|
+
r = client.fetch("api/v1/scaffolders", params=params)
|
|
78
|
+
else:
|
|
79
|
+
# if page is specified, we want to fetch only that page
|
|
80
|
+
r = client.get("api/v1/scaffolders", params=params)
|
|
81
|
+
|
|
82
|
+
if _print:
|
|
83
|
+
print_output_with_context(ctx, r)
|
|
84
|
+
else:
|
|
85
|
+
return(r)
|
|
86
|
+
|
|
87
|
+
@app.command()
|
|
88
|
+
def get(
|
|
89
|
+
ctx: typer.Context,
|
|
90
|
+
tag: str = typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template"),
|
|
91
|
+
yaml: bool = typer.Option(False, "--yaml", "-y", help="When true, returns the YAML representation of the template."),
|
|
92
|
+
_print: CommandOptions._print = True,
|
|
93
|
+
):
|
|
94
|
+
"""
|
|
95
|
+
Retrieve Scaffolder template by tag or Cortex ID.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
client = ctx.obj["client"]
|
|
99
|
+
|
|
100
|
+
if yaml:
|
|
101
|
+
headers={'Accept': 'application/yaml'}
|
|
102
|
+
else:
|
|
103
|
+
headers={'Accept': 'application/json'}
|
|
104
|
+
r = client.get("api/v1/scaffolders/" + tag, headers=headers)
|
|
105
|
+
|
|
106
|
+
if _print:
|
|
107
|
+
if yaml:
|
|
108
|
+
print(r)
|
|
109
|
+
else:
|
|
110
|
+
print_output_with_context(ctx, r)
|
|
111
|
+
else:
|
|
112
|
+
return(r)
|
|
113
|
+
|
|
114
|
+
@app.command()
|
|
115
|
+
def create(
|
|
116
|
+
ctx: typer.Context,
|
|
117
|
+
file_input: Annotated[typer.FileText, typer.Option(..., "--file", "-f", help="File containing the Scaffolder template definition; can be passed as stdin with -, example: -f-")],
|
|
118
|
+
):
|
|
119
|
+
"""
|
|
120
|
+
Create or update a Scaffolder template. API key must have the Configure Scaffolder permission. Note: If a Scaffolder template with the same tag already exists, it will be updated.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
client = ctx.obj["client"]
|
|
124
|
+
|
|
125
|
+
data, content_type = _read_definition(file_input)
|
|
126
|
+
r = client.post("api/v1/scaffolders", data=data, content_type=content_type)
|
|
127
|
+
print_output(r)
|
|
128
|
+
|
|
129
|
+
@app.command()
|
|
130
|
+
def update(
|
|
131
|
+
ctx: typer.Context,
|
|
132
|
+
tag: Annotated[str, typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template")],
|
|
133
|
+
file_input: Annotated[typer.FileText, typer.Option(..., "--file", "-f", help="File containing the Scaffolder template definition; can be passed as stdin with -, example: -f-")],
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Update a Scaffolder template by tag or Cortex ID. API key must have the Configure Scaffolder permission.
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
client = ctx.obj["client"]
|
|
140
|
+
|
|
141
|
+
data, content_type = _read_definition(file_input)
|
|
142
|
+
r = client.put("api/v1/scaffolders/" + tag, data=data, content_type=content_type)
|
|
143
|
+
print_output(r)
|
|
144
|
+
|
|
145
|
+
@app.command()
|
|
146
|
+
def delete(
|
|
147
|
+
ctx: typer.Context,
|
|
148
|
+
tag: str = typer.Option(..., "--tag", "-t", help="The tag or unique, auto-generated Cortex ID of the Scaffolder template"),
|
|
149
|
+
):
|
|
150
|
+
"""
|
|
151
|
+
Delete Scaffolder template by tag or Cortex ID. API key must have the Configure Scaffolder permission.
|
|
152
|
+
"""
|
|
153
|
+
|
|
154
|
+
client = ctx.obj["client"]
|
|
155
|
+
|
|
156
|
+
r = client.delete("api/v1/scaffolders/" + tag)
|
|
@@ -223,8 +223,8 @@ def _get_setup_description(solution_tag: str, solutions_dir: str | None = None)
|
|
|
223
223
|
"""Return the SETUP_DESCRIPTION from a solution's setup.py, or a generic fallback."""
|
|
224
224
|
module = _load_setup_module(solution_tag, solutions_dir)
|
|
225
225
|
if module:
|
|
226
|
-
return getattr(module, "SETUP_DESCRIPTION", "This solution includes a
|
|
227
|
-
return "This solution includes a
|
|
226
|
+
return getattr(module, "SETUP_DESCRIPTION", "This solution includes a setup script.")
|
|
227
|
+
return "This solution includes a setup script."
|
|
228
228
|
|
|
229
229
|
|
|
230
230
|
def _run_post_install_script(solution_tag: str, solutions_dir: str | None = None, ctx=None, no_prompt: bool = False) -> None:
|
|
@@ -700,7 +700,7 @@ def install(
|
|
|
700
700
|
if failed_m:
|
|
701
701
|
typer.echo(failed_m.group(0))
|
|
702
702
|
typer.echo(f"\n {total_imported} imported, {total_failed} failed")
|
|
703
|
-
|
|
703
|
+
elif total_imported > 0:
|
|
704
704
|
typer.echo(f" {total_imported} entities imported")
|
|
705
705
|
else:
|
|
706
706
|
typer.echo(output)
|
|
@@ -139,6 +139,11 @@ class SolutionSetup(ABC):
|
|
|
139
139
|
self._state[key] = True
|
|
140
140
|
self._save_file()
|
|
141
141
|
|
|
142
|
+
def mark_undone(self, key: str) -> None:
|
|
143
|
+
"""Clear a step's completion state (e.g., after the underlying resource is deleted)."""
|
|
144
|
+
self._state.pop(key, None)
|
|
145
|
+
self._save_file()
|
|
146
|
+
|
|
142
147
|
@abstractmethod
|
|
143
148
|
def collect_prompts(self) -> None:
|
|
144
149
|
"""Collect all user inputs upfront before executing steps."""
|
|
@@ -5,7 +5,7 @@ Run via: cortex solutions post-install -s github-actions-deploy
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
SETUP_DESCRIPTION = (
|
|
8
|
-
"This solution includes a
|
|
8
|
+
"This solution includes a setup script that will create a GitHub "
|
|
9
9
|
"repository, seed it with a GitHub workflow that will add a deploy to a Cortex entity, and configure the required secrets."
|
|
10
10
|
)
|
|
11
11
|
import base64
|
|
@@ -172,8 +172,6 @@ class GitHubActionsSetup(SolutionSetup):
|
|
|
172
172
|
|
|
173
173
|
if self._session_base_url:
|
|
174
174
|
self._answers["cortex_base_url"] = self._session_base_url
|
|
175
|
-
else:
|
|
176
|
-
self.prompt("cortex_base_url", "Cortex base URL", default=self._session_base_url)
|
|
177
175
|
else:
|
|
178
176
|
self.prompt(
|
|
179
177
|
"cortex_base_url",
|
{cortexapps_cli-1.33.0 → cortexapps_cli-1.35.0}/cortexapps_cli/solutions/harness-deploy/setup.py
RENAMED
|
@@ -6,7 +6,7 @@ Run via: cortex solutions post-install -s harness-deploy
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
SETUP_DESCRIPTION = (
|
|
9
|
-
"This solution includes a
|
|
9
|
+
"This solution includes a setup script that will configure your Harness "
|
|
10
10
|
"integration in Cortex, create the deploy pipeline and cortex_api_key secret in Harness, "
|
|
11
11
|
"import the Cortex trigger workflow, and optionally fire a test deploy."
|
|
12
12
|
)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Workday Integration
|
|
3
|
+
description: Configure the Cortex Workday integration with a sample org hierarchy from the fictional company Pied Piper (from the TV show Silicon Valley) to sync employees and teams into your service catalog.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Workday Integration
|
|
7
|
+
|
|
8
|
+
Get the Cortex Workday integration running in minutes using a sample org hierarchy from the fictional company Pied Piper (from the TV show *Silicon Valley*). After install, trigger a sync to see employees and teams appear in your catalog — including the full team hierarchy.
|
|
9
|
+
|
|
10
|
+
## Data Model
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
|
|
14
|
+
│ Workday Report │────▶│ Cortex Integration │────▶│ Team Catalog │
|
|
15
|
+
│ (JSON / RaaS) │ │ (field mapping) │ │ + Members │
|
|
16
|
+
└──────────────────────┘ └──────────────────────┘ └──────────────────────┘
|
|
17
|
+
|
|
18
|
+
Sample: Pied Piper supervisory org (Silicon Valley)
|
|
19
|
+
|
|
20
|
+
PP: Pied Piper (Erlich Bachman)
|
|
21
|
+
├── PP: Engineering (Richard Hendricks)
|
|
22
|
+
│ ├── PP: Platform (Bertram Gilfoyle)
|
|
23
|
+
│ │ └── PP: Infrastructure (Nelson Bighetti)
|
|
24
|
+
│ └── PP: Frontend (Dinesh Chugtai)
|
|
25
|
+
└── PP: Operations (Jared Dunn)
|
|
26
|
+
└── PP: People Ops (Monica Hall)
|
|
27
|
+
|
|
28
|
+
Report Format
|
|
29
|
+
─────────────
|
|
30
|
+
Each entry represents one employee. Workteam_Group lists the employee's teams.
|
|
31
|
+
Hierarchy is encoded as parentTeamId → teamName. Root teams use "NONE".
|
|
32
|
+
Managers have Team_Managed set to their team's teamName.
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
"Report_Entry": [
|
|
36
|
+
{
|
|
37
|
+
"Email": "erlich.bachman@piedpiper.com",
|
|
38
|
+
"Employee_ID": "PP-100000",
|
|
39
|
+
"First_Name": "Erlich",
|
|
40
|
+
"Last_Name": "Bachman",
|
|
41
|
+
"Managers_Email": "erlich.bachman@piedpiper.com",
|
|
42
|
+
"employeeRole": "CEO",
|
|
43
|
+
"Workteam_Group": [
|
|
44
|
+
{
|
|
45
|
+
"teamName": "PP: Pied Piper",
|
|
46
|
+
"teamDisplayName": "PP: Pied Piper",
|
|
47
|
+
"parentTeamId": "NONE",
|
|
48
|
+
"Team_Managed": "PP: Pied Piper"
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
...
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
Field Mapping (data/configuration.json)
|
|
57
|
+
────────────────────────────────────────
|
|
58
|
+
Maps report columns to employee fields, team identity, and hierarchy.
|
|
59
|
+
Workday reports can be customized — the configuration defines the field
|
|
60
|
+
attributes and the hierarchy, so it works with any supervisory org report.
|
|
61
|
+
|
|
62
|
+
{
|
|
63
|
+
"ownershipReportUrl": "<your-report-url>",
|
|
64
|
+
"reportMappingV2": {
|
|
65
|
+
"email": { "columnName": "Email" },
|
|
66
|
+
"employeeId": { "columnName": "Employee_ID" },
|
|
67
|
+
"firstName": { "columnName": "First_Name" },
|
|
68
|
+
"lastName": { "columnName": "Last_Name" },
|
|
69
|
+
"employeeRole": { "columnName": "employeeRole" },
|
|
70
|
+
"teamListFields": {
|
|
71
|
+
"teamListKey": { "columnName": "Workteam_Group" },
|
|
72
|
+
"teamId": { "columnName": "teamName" },
|
|
73
|
+
"teamName": { "columnName": "teamDisplayName" },
|
|
74
|
+
"hierarchy": {
|
|
75
|
+
"fieldOnParentNode": { "columnName": "teamName" },
|
|
76
|
+
"fieldOnChildNode": { "columnName": "parentTeamId" }
|
|
77
|
+
},
|
|
78
|
+
"teamEmployeeManages": { "columnName": "Team_Managed" }
|
|
79
|
+
},
|
|
80
|
+
"type": "ONE_EMPLOYEE_MULTIPLE_TEAMS"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## After Installing
|
|
86
|
+
|
|
87
|
+
Trigger the sync in Cortex to import the Pied Piper org hierarchy:
|
|
88
|
+
|
|
89
|
+
**Catalog → All Entities → Import Entities → Workday → Sync Entities → Next Step**
|
|
90
|
+
|
|
91
|
+
You should see 7 teams appear in your catalog with the full hierarchy:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
PP: Pied Piper (Erlich Bachman)
|
|
95
|
+
├── PP: Engineering (Richard Hendricks)
|
|
96
|
+
│ ├── PP: Platform (Bertram Gilfoyle)
|
|
97
|
+
│ │ └── PP: Infrastructure (Nelson Bighetti)
|
|
98
|
+
│ └── PP: Frontend (Dinesh Chugtai)
|
|
99
|
+
└── PP: Operations (Jared Dunn)
|
|
100
|
+
└── PP: People Ops (Monica Hall)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Workday reports can be customized to match your org structure. The configuration defines which report columns map to employee fields, team identity, and the parent-child hierarchy — so the integration works with any supervisory org report that follows the same shape.
|
|
104
|
+
|
|
105
|
+
## What's Included
|
|
106
|
+
|
|
107
|
+
- **Pied Piper org data:** 7 employees across 4 levels of hierarchy (Erlich → Richard → Gilfoyle/Dinesh, Jared → Monica, Gilfoyle → Big Head)
|
|
108
|
+
- **Integration config:** field mapping and report URL pre-configured, pointing at the hosted data
|
|
109
|
+
- **Setup script:** one-command configuration of the Cortex Workday integration via API
|
|
110
|
+
|
|
111
|
+
## Quick Start
|
|
112
|
+
|
|
113
|
+
1. Install the solution:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
cortex solutions install -s workday
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
2. Follow the post-install setup prompts, or run later:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
cortex solutions post-install -s workday
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
3. Trigger the import in Cortex:
|
|
126
|
+
|
|
127
|
+
**Catalog → All Entities → Import Entities → Workday → Sync Entities → Next Step**
|
|
128
|
+
|
|
129
|
+
4. Check your team hierarchy to see the Pied Piper org chart.
|
|
130
|
+
|
|
131
|
+
## How It Works
|
|
132
|
+
|
|
133
|
+
The setup script calls the Cortex Workday integration API to configure a report URL pointing at the bundled Pied Piper supervisory org data. Cortex fetches the report and syncs employees and teams into your catalog on the next import run.
|
|
134
|
+
|
|
135
|
+
## Adapting to Real Workday Data
|
|
136
|
+
|
|
137
|
+
To connect your own Workday report, go to **Settings → Integrations → Workday** in the Cortex UI and update the Report URL, username, and password. The field mapping in `data/configuration.json` works unchanged for any Workday supervisory org report that uses the same column names.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"username": "ISU_Cortex",
|
|
3
|
+
"ownershipReportUrl": "https://jeff-test-org.github.io/workday-mocks/pied-piper-supervisory-org",
|
|
4
|
+
"reportMappingV2": {
|
|
5
|
+
"email": { "columnName": "Email" },
|
|
6
|
+
"employeeId": { "columnName": "Employee_ID" },
|
|
7
|
+
"firstName": { "columnName": "First_Name" },
|
|
8
|
+
"lastName": { "columnName": "Last_Name" },
|
|
9
|
+
"managerEmail": null,
|
|
10
|
+
"employeeRole": { "columnName": "employeeRole" },
|
|
11
|
+
"rootTeams": [],
|
|
12
|
+
"teamListFields": {
|
|
13
|
+
"teamListKey": { "columnName": "Workteam_Group" },
|
|
14
|
+
"teamId": { "columnName": "teamName" },
|
|
15
|
+
"teamName": { "columnName": "teamDisplayName" },
|
|
16
|
+
"hierarchy": {
|
|
17
|
+
"fieldOnChildNode": { "columnName": "parentTeamId" },
|
|
18
|
+
"fieldOnParentNode": { "columnName": "teamName", "isList": false }
|
|
19
|
+
},
|
|
20
|
+
"teamEmployeeManages": { "columnName": "Team_Managed" }
|
|
21
|
+
},
|
|
22
|
+
"fallbackFields": {
|
|
23
|
+
"teamId": null,
|
|
24
|
+
"teamName": null,
|
|
25
|
+
"fieldOnParentNode": null,
|
|
26
|
+
"fieldOnChildNode": null
|
|
27
|
+
},
|
|
28
|
+
"type": "ONE_EMPLOYEE_MULTIPLE_TEAMS"
|
|
29
|
+
},
|
|
30
|
+
"password": "asdf"
|
|
31
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Report_Entry": [
|
|
3
|
+
{
|
|
4
|
+
"Email": "erlich.bachman@piedpiper.com",
|
|
5
|
+
"Employee_ID": "PP-100000",
|
|
6
|
+
"First_Name": "Erlich",
|
|
7
|
+
"Last_Name": "Bachman",
|
|
8
|
+
"Managers_Email": "erlich.bachman@piedpiper.com",
|
|
9
|
+
"employeeRole": "CEO",
|
|
10
|
+
"Workteam_Group": [
|
|
11
|
+
{
|
|
12
|
+
"teamName": "PP: Pied Piper",
|
|
13
|
+
"teamDisplayName": "PP: Pied Piper",
|
|
14
|
+
"parentTeamId": "NONE",
|
|
15
|
+
"Team_Managed": "PP: Pied Piper"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"Email": "richard.hendricks@piedpiper.com",
|
|
21
|
+
"Employee_ID": "PP-100001",
|
|
22
|
+
"First_Name": "Richard",
|
|
23
|
+
"Last_Name": "Hendricks",
|
|
24
|
+
"Managers_Email": "erlich.bachman@piedpiper.com",
|
|
25
|
+
"employeeRole": "CTO",
|
|
26
|
+
"Workteam_Group": [
|
|
27
|
+
{
|
|
28
|
+
"teamName": "PP: Engineering",
|
|
29
|
+
"teamDisplayName": "PP: Engineering",
|
|
30
|
+
"parentTeamId": "PP: Pied Piper",
|
|
31
|
+
"Team_Managed": "PP: Engineering"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"Email": "bertram.gilfoyle@piedpiper.com",
|
|
37
|
+
"Employee_ID": "PP-100002",
|
|
38
|
+
"First_Name": "Bertram",
|
|
39
|
+
"Last_Name": "Gilfoyle",
|
|
40
|
+
"Managers_Email": "richard.hendricks@piedpiper.com",
|
|
41
|
+
"employeeRole": "Staff Engineer",
|
|
42
|
+
"Workteam_Group": [
|
|
43
|
+
{
|
|
44
|
+
"teamName": "PP: Platform",
|
|
45
|
+
"teamDisplayName": "PP: Platform",
|
|
46
|
+
"parentTeamId": "PP: Engineering",
|
|
47
|
+
"Team_Managed": "PP: Platform"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"Email": "dinesh.chugtai@piedpiper.com",
|
|
53
|
+
"Employee_ID": "PP-100003",
|
|
54
|
+
"First_Name": "Dinesh",
|
|
55
|
+
"Last_Name": "Chugtai",
|
|
56
|
+
"Managers_Email": "richard.hendricks@piedpiper.com",
|
|
57
|
+
"employeeRole": "Senior Engineer",
|
|
58
|
+
"Workteam_Group": [
|
|
59
|
+
{
|
|
60
|
+
"teamName": "PP: Frontend",
|
|
61
|
+
"teamDisplayName": "PP: Frontend",
|
|
62
|
+
"parentTeamId": "PP: Engineering"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"Email": "jared.dunn@piedpiper.com",
|
|
68
|
+
"Employee_ID": "PP-100004",
|
|
69
|
+
"First_Name": "Jared",
|
|
70
|
+
"Last_Name": "Dunn",
|
|
71
|
+
"Managers_Email": "erlich.bachman@piedpiper.com",
|
|
72
|
+
"employeeRole": "COO",
|
|
73
|
+
"Workteam_Group": [
|
|
74
|
+
{
|
|
75
|
+
"teamName": "PP: Operations",
|
|
76
|
+
"teamDisplayName": "PP: Operations",
|
|
77
|
+
"parentTeamId": "PP: Pied Piper",
|
|
78
|
+
"Team_Managed": "PP: Operations"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"Email": "monica.hall@piedpiper.com",
|
|
84
|
+
"Employee_ID": "PP-100005",
|
|
85
|
+
"First_Name": "Monica",
|
|
86
|
+
"Last_Name": "Hall",
|
|
87
|
+
"Managers_Email": "jared.dunn@piedpiper.com",
|
|
88
|
+
"employeeRole": "VP People",
|
|
89
|
+
"Workteam_Group": [
|
|
90
|
+
{
|
|
91
|
+
"teamName": "PP: People Ops",
|
|
92
|
+
"teamDisplayName": "PP: People Ops",
|
|
93
|
+
"parentTeamId": "PP: Operations"
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"Email": "nelson.bighetti@piedpiper.com",
|
|
99
|
+
"Employee_ID": "PP-100006",
|
|
100
|
+
"First_Name": "Nelson",
|
|
101
|
+
"Last_Name": "Bighetti",
|
|
102
|
+
"Managers_Email": "bertram.gilfoyle@piedpiper.com",
|
|
103
|
+
"employeeRole": "Engineer",
|
|
104
|
+
"Workteam_Group": [
|
|
105
|
+
{
|
|
106
|
+
"teamName": "PP: Infrastructure",
|
|
107
|
+
"teamDisplayName": "PP: Infrastructure",
|
|
108
|
+
"parentTeamId": "PP: Platform"
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Post-install setup script for the workday solution.
|
|
3
|
+
Configures the Cortex Workday integration to sync the Pied Piper org hierarchy.
|
|
4
|
+
Run via: cortex solutions post-install -s workday
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
SETUP_DESCRIPTION = (
|
|
8
|
+
"This solution includes a setup script that will configure "
|
|
9
|
+
"the Cortex Workday integration to sync the Pied Piper org hierarchy."
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
import requests
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from cortexapps_cli.solutions._lib.setup_base import SolutionSetup
|
|
19
|
+
except ImportError:
|
|
20
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
21
|
+
from _lib.setup_base import SolutionSetup
|
|
22
|
+
|
|
23
|
+
DATA_DIR = Path(__file__).parent / "data"
|
|
24
|
+
CONFIG_FILE = DATA_DIR / "configuration.json"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class WorkdayIntegrationSetup(SolutionSetup):
|
|
28
|
+
solution_tag = "workday"
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
cortex_api_key: str = None,
|
|
33
|
+
cortex_base_url: str = None,
|
|
34
|
+
no_prompt: bool = False,
|
|
35
|
+
**kwargs,
|
|
36
|
+
):
|
|
37
|
+
super().__init__(no_prompt=no_prompt, **kwargs)
|
|
38
|
+
self._api_key = cortex_api_key or ""
|
|
39
|
+
self._base_url = (cortex_base_url or "https://api.getcortexapp.com").rstrip("/")
|
|
40
|
+
|
|
41
|
+
def _cortex_headers(self) -> dict:
|
|
42
|
+
return {
|
|
43
|
+
"Authorization": f"Bearer {self._api_key}",
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def collect_prompts(self) -> None:
|
|
48
|
+
pass # credentials come from CLI session
|
|
49
|
+
|
|
50
|
+
def _check_and_replace_existing(self) -> None:
|
|
51
|
+
"""Check for an existing Workday config; backup and delete it if user confirms."""
|
|
52
|
+
r = requests.get(
|
|
53
|
+
f"{self._base_url}/api/v1/workday/default-configuration",
|
|
54
|
+
headers=self._cortex_headers(),
|
|
55
|
+
)
|
|
56
|
+
if r.status_code == 404:
|
|
57
|
+
self.mark_undone("configure") # no integration on server — reconfigure regardless of cached state
|
|
58
|
+
return
|
|
59
|
+
r.raise_for_status()
|
|
60
|
+
|
|
61
|
+
if not self.confirm("Existing Workday integration found. Replace it?", default=False):
|
|
62
|
+
print("Keeping existing Workday integration. Exiting.")
|
|
63
|
+
raise SystemExit(0)
|
|
64
|
+
|
|
65
|
+
# Back up the existing config
|
|
66
|
+
backup_dir = Path.home() / ".cortex" / "solutions" / "workday"
|
|
67
|
+
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
backup_file = backup_dir / "backup-config.json"
|
|
69
|
+
backup_file.write_text(json.dumps(r.json(), indent=2))
|
|
70
|
+
print(f" Backed up existing config to {backup_file}")
|
|
71
|
+
|
|
72
|
+
# Delete the existing config
|
|
73
|
+
del_r = requests.delete(
|
|
74
|
+
f"{self._base_url}/api/v1/workday/configurations",
|
|
75
|
+
headers=self._cortex_headers(),
|
|
76
|
+
)
|
|
77
|
+
del_r.raise_for_status()
|
|
78
|
+
self.mark_undone("configure")
|
|
79
|
+
|
|
80
|
+
def _configure_integration(self) -> None:
|
|
81
|
+
"""POST the bundled Workday integration configuration."""
|
|
82
|
+
if self.already_done("configure"):
|
|
83
|
+
return "Already configured (skipped)"
|
|
84
|
+
config = json.loads(CONFIG_FILE.read_text())
|
|
85
|
+
print(f" (cortex integrations workday add -f {CONFIG_FILE})")
|
|
86
|
+
r = requests.post(
|
|
87
|
+
f"{self._base_url}/api/v1/workday/configuration",
|
|
88
|
+
headers=self._cortex_headers(),
|
|
89
|
+
json=config,
|
|
90
|
+
)
|
|
91
|
+
if not r.ok:
|
|
92
|
+
raise RuntimeError(
|
|
93
|
+
f"Failed to configure Workday integration: {r.status_code} {r.text}"
|
|
94
|
+
)
|
|
95
|
+
self.mark_done("configure")
|
|
96
|
+
|
|
97
|
+
def _validate_integration(self) -> None:
|
|
98
|
+
"""Validate the Workday integration configuration."""
|
|
99
|
+
print(f" (cortex integrations workday validate)")
|
|
100
|
+
r = requests.post(
|
|
101
|
+
f"{self._base_url}/api/v1/workday/configuration/validate",
|
|
102
|
+
headers=self._cortex_headers(),
|
|
103
|
+
)
|
|
104
|
+
r.raise_for_status()
|
|
105
|
+
configs = r.json().get("configurations", [])
|
|
106
|
+
if not configs:
|
|
107
|
+
raise RuntimeError("Validation returned no results — is the integration configured?")
|
|
108
|
+
result = configs[0]
|
|
109
|
+
if not result.get("isValid", False):
|
|
110
|
+
raise RuntimeError(f"Validation failed: {result.get('message', 'unknown error')}")
|
|
111
|
+
print(f" ✓ Configuration validated successfully")
|
|
112
|
+
|
|
113
|
+
def _enable_auto_import(self) -> None:
|
|
114
|
+
"""Prompt user to enable Auto Import Workday Teams in Cortex settings."""
|
|
115
|
+
print(" In Cortex: Settings → Entities → Teams → Enable 'Auto import Workday teams'")
|
|
116
|
+
if not self.confirm(" Is 'Auto import Workday teams' enabled?", default=False):
|
|
117
|
+
print("Please enable it before continuing.")
|
|
118
|
+
raise SystemExit(0)
|
|
119
|
+
|
|
120
|
+
def steps(self) -> list:
|
|
121
|
+
return [
|
|
122
|
+
("Enable Auto Import Workday teams", self._enable_auto_import),
|
|
123
|
+
("Check for existing Workday integration", self._check_and_replace_existing),
|
|
124
|
+
("Configure Workday integration", self._configure_integration),
|
|
125
|
+
("Validate Workday integration", self._validate_integration),
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
def post_steps(self) -> None:
|
|
129
|
+
print("\n✓ Workday integration configured with the Pied Piper org hierarchy.\n")
|
|
130
|
+
print("Next: trigger a sync in Cortex:")
|
|
131
|
+
print(" Catalog → All Entities → Import Entities → Workday")
|
|
132
|
+
print(" Click 'Sync Entities', then 'Next Step' to import.\n")
|
|
133
|
+
print("Then check your team hierarchy to see the Pied Piper org chart.")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def main(cortex_api_key=None, cortex_base_url=None, no_prompt=False, **kwargs):
|
|
137
|
+
WorkdayIntegrationSetup(
|
|
138
|
+
cortex_api_key=cortex_api_key,
|
|
139
|
+
cortex_base_url=cortex_base_url,
|
|
140
|
+
no_prompt=no_prompt,
|
|
141
|
+
).run()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
if __name__ == "__main__":
|
|
145
|
+
main()
|