datasecops-cli 0.4.0__tar.gz → 0.4.2__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 (57) hide show
  1. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/CHANGELOG.md +43 -0
  2. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/PKG-INFO +1 -1
  3. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/pyproject.toml +1 -1
  4. datasecops_cli-0.4.2/setup.ps1 +139 -0
  5. datasecops_cli-0.4.2/setup.sh +145 -0
  6. datasecops_cli-0.4.2/src/datasecops_cli/__init__.py +1 -0
  7. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/config.py +1 -0
  8. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/main.py +310 -32
  9. datasecops_cli-0.4.2/src/datasecops_cli/menus/configuration.py +252 -0
  10. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/development.py +0 -60
  11. datasecops_cli-0.4.2/src/datasecops_cli/menus/downloads.py +233 -0
  12. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/project_config.py +1 -0
  13. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/skill_service.py +24 -0
  14. datasecops_cli-0.4.0/setup.ps1 +0 -282
  15. datasecops_cli-0.4.0/setup.sh +0 -249
  16. datasecops_cli-0.4.0/src/datasecops_cli/__init__.py +0 -1
  17. datasecops_cli-0.4.0/src/datasecops_cli/menus/downloads.py +0 -107
  18. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.github/workflows/auto-tag.yml +0 -0
  19. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.github/workflows/publish-cli.yml +0 -0
  20. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.gitignore +0 -0
  21. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/DEVELOPMENT.md +0 -0
  22. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/LICENSE +0 -0
  23. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/README.md +0 -0
  24. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/getting-started.md +0 -0
  25. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/legacy.md +0 -0
  26. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/legacy_plan_of_action.md +0 -0
  27. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/mcp-server.md +0 -0
  28. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/mcp-servers.json +0 -0
  29. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/__init__.py +0 -0
  30. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/git_operations.py +0 -0
  31. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/__init__.py +0 -0
  32. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/git_helpers.py +0 -0
  33. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/__init__.py +0 -0
  34. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/bootstrap_service.py +0 -0
  35. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/dbt_project_generator.py +0 -0
  36. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/dbt_runner.py +0 -0
  37. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/directory_scaffolder.py +0 -0
  38. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/download_service.py +0 -0
  39. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/git_service.py +0 -0
  40. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/linting_service.py +0 -0
  41. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/snowflake_service.py +0 -0
  42. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/upstream_service.py +0 -0
  43. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/__init__.py +0 -0
  44. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/display.py +0 -0
  45. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/file_utils.py +0 -0
  46. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/yaml_utils.py +0 -0
  47. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/__init__.py +0 -0
  48. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/__main__.py +0 -0
  49. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/connection.py +0 -0
  50. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/server.py +0 -0
  51. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/__init__.py +0 -0
  52. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_config.py +0 -0
  53. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_file_utils.py +0 -0
  54. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_main.py +0 -0
  55. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_models.py +0 -0
  56. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_version.py +0 -0
  57. {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_yaml_utils.py +0 -0
@@ -2,6 +2,49 @@
2
2
 
3
3
  All notable changes to the DataSecOps CLI are documented in this file.
4
4
 
5
+ ## [0.4.2] - 2026-05-17
6
+
7
+ ### Added
8
+
9
+ - **Configuration menu** — new `[4] configure` top-level menu consolidating tool installation and project setup:
10
+ - Install dbt-core & dbt-snowflake from framework-pinned versions
11
+ - Install SQLFluff from framework-pinned versions
12
+ - Configure MCP servers for VS Code, Cursor, Claude Code, or Cortex Code
13
+ - Initialize a new dbt project with framework profiles
14
+ - Update Cortex Code to the latest version (`cortex update`)
15
+ - **Cortex Code agent connection** — new `cortex_connection` field in `.datasecops.yml` to configure the Cortex Code agent connection separately from the SQL connection. Selected during setup, checked on launch with a prompt to update if mismatched.
16
+ - **profiles.yml generation during setup** — setup now connects to Snowflake, fetches framework PROJECT settings and targets, and creates the profile entry in `profiles.yml` at the framework-defined `profile_dir` location. Creates directory and file if missing, preserves existing profiles.
17
+ - **Profile name resolution during setup** — setup reads `profile_name` from `dbt_project.yml` if it exists, otherwise fetches profiles from the native app (auto-selects single profile, prompts for multiple).
18
+ - **MCP server configuration during setup** — setup now offers to configure MCP servers for AI tools (VS Code, Cursor, Claude Code, Cortex Code) with platform auto-detected from framework SOURCE_CONTROL config.
19
+ - **Cortex Code and Node.js prerequisite checks** — setup now checks for `cortex` and `node` on PATH alongside existing `dbtf`, `gh`, and `az` checks.
20
+ - **Auto-install prerequisites in setup scripts** — `setup.ps1` and `setup.sh` now offer to install missing tools: uv (auto), dbt Fusion (auto), Cortex Code, GitHub CLI (`winget`/`brew`/`apt`), Azure CLI (`winget`/`brew`/`curl`).
21
+
22
+ ### Changed
23
+
24
+ - **Main menu renumbered** — configure `[4]`, downloads `[5]`, bootstrap `[6]`, update pkgs `[7]`
25
+ - **Install options moved to configuration menu** — removed `[14] install lint` from development menu and `[6] install` from SQLFluff lint submenu; removed `[6] new project` and `[7] mcp servers` from downloads menu
26
+ - **Setup prompt defaults to yes** — `Run setup now?` now defaults to `y` with a branded header
27
+ - **Cortex Code launch sets both connections** — runs `cortex connections set` for SQL and `cortex --connection` for agent, with mismatch detection against `settings.json`
28
+
29
+ ### Fixed
30
+
31
+ - **FileNotFoundError during setup** — `gh` and `az` subprocess calls wrapped with `FileNotFoundError` handling for Windows PATH/app alias edge cases
32
+ - **Profile name not persisted** — single-profile auto-selection now writes `profile_name` back to `.datasecops.yml`
33
+ - **`cortex_connection` not loaded** — `config.py` now reads `cortex_connection` from `.datasecops.yml`
34
+ - **`warning_line` not imported** — added missing import in `main.py`
35
+ - **CLI auth check duplication** — extracted `_check_cli_auth` helper with clearer "appears in PATH but is not runnable" messages
36
+
37
+ ## [0.4.1] - 2026-05-17
38
+
39
+ ### Added
40
+
41
+ - **Launch Cortex Code from main menu** — new option `[3] cortex code` launches the Cortex Code AI coding agent directly from the CLI. Shows an error with install link if `cortex` is not on PATH.
42
+ - **Automatic skill registration with Cortex Code** — after installing skills to `~/.cortex/skills/`, the CLI now runs `cortex skill add` to register the directory so skills are immediately discoverable as `$skill-name` commands. Previously skills were written to disk but not registered.
43
+
44
+ ### Changed
45
+
46
+ - **Main menu renumbered** — downloads moved to `[4]`, bootstrap to `[5]`, update pkgs to `[6]` to accommodate the new Cortex Code option at `[3]`
47
+
5
48
  ## [0.4.0] - 2026-05-16
6
49
 
7
50
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datasecops-cli
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: DataSecOps Framework CLI for Snowflake Native App
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "datasecops-cli"
7
- version = "0.4.0"
7
+ version = "0.4.2"
8
8
  description = "DataSecOps Framework CLI for Snowflake Native App"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,139 @@
1
+ Write-Host "============================================================================" -ForegroundColor Green
2
+ Write-Host " DataSecOps Framework CLI Setup" -ForegroundColor Green
3
+ Write-Host "============================================================================" -ForegroundColor Green
4
+ Write-Host ""
5
+
6
+ # --- Step 1: Install & check prerequisites ---
7
+
8
+ Write-Host "--- Prerequisites ---" -ForegroundColor Green
9
+ Write-Host ""
10
+
11
+ # uv (required)
12
+ try {
13
+ $uvVersion = uv --version 2>$null
14
+ Write-Host "[OK] uv $uvVersion" -ForegroundColor Green
15
+ } catch {
16
+ Write-Host "uv not found. Installing..." -ForegroundColor Yellow
17
+ Invoke-WebRequest -Uri "https://astral.sh/uv/install.ps1" -OutFile "$env:TEMP\install-uv.ps1"
18
+ & "$env:TEMP\install-uv.ps1"
19
+ $env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
20
+ Write-Host "[OK] uv installed" -ForegroundColor Green
21
+ }
22
+
23
+ # dbt Fusion (required)
24
+ try {
25
+ $null = Get-Command dbtf -ErrorAction Stop
26
+ Write-Host "[OK] dbt Fusion (dbtf) found" -ForegroundColor Green
27
+ } catch {
28
+ Write-Host "dbt Fusion not found. Installing..." -ForegroundColor Yellow
29
+ try {
30
+ Invoke-Expression (Invoke-RestMethod -Uri "https://public.cdn.getdbt.com/fs/install/install.ps1")
31
+ Write-Host "[OK] dbt Fusion installed" -ForegroundColor Green
32
+ } catch {
33
+ Write-Host "WARNING: Failed to install dbt Fusion automatically." -ForegroundColor Yellow
34
+ Write-Host " Install manually: irm https://public.cdn.getdbt.com/fs/install/install.ps1 | iex" -ForegroundColor Yellow
35
+ }
36
+ }
37
+
38
+ # Cortex Code (optional)
39
+ try {
40
+ $null = Get-Command cortex -ErrorAction Stop
41
+ Write-Host "[OK] Cortex Code found" -ForegroundColor Green
42
+ } catch {
43
+ $installCortex = Read-Host "Cortex Code not found. Install it? (y/N)"
44
+ if ($installCortex -eq 'y') {
45
+ try {
46
+ Invoke-Expression (Invoke-RestMethod -Uri "https://cortex.snowflake.com/install.ps1")
47
+ Write-Host "[OK] Cortex Code installed" -ForegroundColor Green
48
+ } catch {
49
+ Write-Host "WARNING: Failed to install Cortex Code automatically." -ForegroundColor Yellow
50
+ Write-Host " Install manually: https://docs.snowflake.com/en/user-guide/cortex-code" -ForegroundColor Yellow
51
+ }
52
+ } else {
53
+ Write-Host "[INFO] Cortex Code skipped (optional)" -ForegroundColor Cyan
54
+ }
55
+ }
56
+
57
+ # GitHub CLI (optional)
58
+ try {
59
+ $null = Get-Command gh -ErrorAction Stop
60
+ $ghAuthResult = gh auth status 2>&1
61
+ if ($LASTEXITCODE -eq 0) {
62
+ Write-Host "[OK] GitHub CLI (gh) found and authenticated" -ForegroundColor Green
63
+ } else {
64
+ Write-Host "[OK] GitHub CLI (gh) found but not logged in — run: gh auth login" -ForegroundColor Yellow
65
+ }
66
+ } catch {
67
+ $installGh = Read-Host "GitHub CLI not found. Install it? (y/N)"
68
+ if ($installGh -eq 'y') {
69
+ try {
70
+ winget install --id GitHub.cli --source winget --silent
71
+ Write-Host "[OK] GitHub CLI installed — run 'gh auth login' to authenticate" -ForegroundColor Green
72
+ } catch {
73
+ Write-Host "WARNING: Failed to install GitHub CLI. Install manually from https://cli.github.com" -ForegroundColor Yellow
74
+ }
75
+ } else {
76
+ Write-Host "[INFO] GitHub CLI skipped (optional)" -ForegroundColor Cyan
77
+ }
78
+ }
79
+
80
+ # Azure CLI (optional)
81
+ try {
82
+ $null = Get-Command az -ErrorAction Stop
83
+ $azResult = az account show 2>&1
84
+ if ($LASTEXITCODE -eq 0) {
85
+ Write-Host "[OK] Azure CLI (az) found and authenticated" -ForegroundColor Green
86
+ } else {
87
+ Write-Host "[OK] Azure CLI (az) found but not logged in — run: az login" -ForegroundColor Yellow
88
+ }
89
+ } catch {
90
+ $installAz = Read-Host "Azure CLI not found. Install it? (y/N)"
91
+ if ($installAz -eq 'y') {
92
+ try {
93
+ winget install --exact --id Microsoft.AzureCLI --version 2.67.0 --silent
94
+ Write-Host "[OK] Azure CLI installed — run 'az login' to authenticate" -ForegroundColor Green
95
+ } catch {
96
+ Write-Host "WARNING: Failed to install Azure CLI. Install manually from https://aka.ms/installazurecli" -ForegroundColor Yellow
97
+ }
98
+ } else {
99
+ Write-Host "[INFO] Azure CLI skipped (optional)" -ForegroundColor Cyan
100
+ }
101
+ }
102
+
103
+ # Node.js (optional)
104
+ try {
105
+ $nodeVersion = node --version 2>$null
106
+ Write-Host "[OK] Node.js $nodeVersion found" -ForegroundColor Green
107
+ } catch {
108
+ Write-Host "[INFO] Node.js not found (optional — needed for GitHub/Azure DevOps MCP servers)" -ForegroundColor Cyan
109
+ }
110
+
111
+ # --- Step 2: Create venv & install packages ---
112
+
113
+ Write-Host ""
114
+ Write-Host "--- Install datasecops-cli ---" -ForegroundColor Green
115
+ Write-Host ""
116
+
117
+ Write-Host "Creating virtual environment..." -ForegroundColor Cyan
118
+ uv venv .venv
119
+ Write-Host "[OK] Virtual environment created at .venv\" -ForegroundColor Green
120
+
121
+ Write-Host ""
122
+ Write-Host "Installing datasecops-cli with MCP server..." -ForegroundColor Cyan
123
+ uv pip install "datasecops-cli[mcp]"
124
+ Write-Host "[OK] datasecops-cli installed (with MCP server)" -ForegroundColor Green
125
+
126
+ # --- Done ---
127
+
128
+ Write-Host ""
129
+ Write-Host "============================================================================" -ForegroundColor Green
130
+ Write-Host " Setup complete!" -ForegroundColor Green
131
+ Write-Host "============================================================================" -ForegroundColor Green
132
+ Write-Host ""
133
+ Write-Host " To get started:" -ForegroundColor Cyan
134
+ Write-Host " .\.venv\Scripts\Activate.ps1" -ForegroundColor White
135
+ Write-Host " datasecops" -ForegroundColor White
136
+ Write-Host ""
137
+ Write-Host " The CLI will configure .datasecops.yml, profiles.yml," -ForegroundColor Cyan
138
+ Write-Host " and MCP servers on first run." -ForegroundColor Cyan
139
+ Write-Host ""
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ echo "============================================================================"
5
+ echo " DataSecOps Framework CLI Setup"
6
+ echo "============================================================================"
7
+ echo ""
8
+
9
+ # --- Step 1: Install & check prerequisites ---
10
+
11
+ echo "--- Prerequisites ---"
12
+ echo ""
13
+
14
+ # uv (required)
15
+ if ! command -v uv &> /dev/null; then
16
+ echo "uv not found. Installing..."
17
+ curl -LsSf https://astral.sh/uv/install.sh | sh
18
+ export PATH="$HOME/.local/bin:$PATH"
19
+ fi
20
+ echo "[OK] uv $(uv --version 2>/dev/null || echo 'installed')"
21
+
22
+ # dbt Fusion (required)
23
+ if ! command -v dbtf &> /dev/null; then
24
+ echo "dbt Fusion not found. Installing..."
25
+ if curl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update; then
26
+ echo "[OK] dbt Fusion installed"
27
+ else
28
+ echo "WARNING: Failed to install dbt Fusion automatically."
29
+ echo " Install manually: curl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update"
30
+ fi
31
+ else
32
+ echo "[OK] dbt Fusion (dbtf) found"
33
+ fi
34
+
35
+ # Cortex Code (optional)
36
+ if command -v cortex &> /dev/null; then
37
+ echo "[OK] Cortex Code found"
38
+ else
39
+ read -rp "Cortex Code not found. Install it? (y/N): " INSTALL_CORTEX
40
+ if [[ "${INSTALL_CORTEX,,}" == "y" ]]; then
41
+ if curl -fsSL https://cortex.snowflake.com/install.sh | sh; then
42
+ echo "[OK] Cortex Code installed"
43
+ else
44
+ echo "WARNING: Failed to install Cortex Code automatically."
45
+ echo " Install manually: https://docs.snowflake.com/en/user-guide/cortex-code"
46
+ fi
47
+ else
48
+ echo "[INFO] Cortex Code skipped (optional)"
49
+ fi
50
+ fi
51
+
52
+ # GitHub CLI (optional)
53
+ if command -v gh &> /dev/null; then
54
+ if gh auth status &> /dev/null; then
55
+ echo "[OK] GitHub CLI (gh) found and authenticated"
56
+ else
57
+ echo "[OK] GitHub CLI (gh) found but not logged in — run: gh auth login"
58
+ fi
59
+ else
60
+ read -rp "GitHub CLI not found. Install it? (y/N): " INSTALL_GH
61
+ if [[ "${INSTALL_GH,,}" == "y" ]]; then
62
+ if [[ "$OSTYPE" == "darwin"* ]]; then
63
+ brew install gh 2>/dev/null || echo "WARNING: Install gh manually from https://cli.github.com"
64
+ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
65
+ (type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \
66
+ && sudo mkdir -p -m 755 /etc/apt/keyrings \
67
+ && out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \
68
+ && cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
69
+ && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
70
+ && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
71
+ && sudo apt update \
72
+ && sudo apt install gh -y \
73
+ || echo "WARNING: Install gh manually from https://cli.github.com"
74
+ else
75
+ echo "WARNING: Install gh manually from https://cli.github.com"
76
+ fi
77
+ if command -v gh &> /dev/null; then
78
+ echo "[OK] GitHub CLI installed — run 'gh auth login' to authenticate"
79
+ fi
80
+ else
81
+ echo "[INFO] GitHub CLI skipped (optional)"
82
+ fi
83
+ fi
84
+
85
+ # Azure CLI (optional)
86
+ if command -v az &> /dev/null; then
87
+ if az account show &> /dev/null; then
88
+ echo "[OK] Azure CLI (az) found and authenticated"
89
+ else
90
+ echo "[OK] Azure CLI (az) found but not logged in — run: az login"
91
+ fi
92
+ else
93
+ read -rp "Azure CLI not found. Install it? (y/N): " INSTALL_AZ
94
+ if [[ "${INSTALL_AZ,,}" == "y" ]]; then
95
+ if [[ "$OSTYPE" == "darwin"* ]]; then
96
+ brew install azure-cli 2>/dev/null || echo "WARNING: Install az manually from https://aka.ms/installazurecli"
97
+ elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
98
+ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash || echo "WARNING: Install az manually from https://aka.ms/installazurecli"
99
+ else
100
+ echo "WARNING: Install az manually from https://aka.ms/installazurecli"
101
+ fi
102
+ if command -v az &> /dev/null; then
103
+ echo "[OK] Azure CLI installed — run 'az login' to authenticate"
104
+ fi
105
+ else
106
+ echo "[INFO] Azure CLI skipped (optional)"
107
+ fi
108
+ fi
109
+
110
+ # Node.js (optional)
111
+ if command -v node &> /dev/null; then
112
+ echo "[OK] Node.js $(node --version 2>/dev/null) found"
113
+ else
114
+ echo "[INFO] Node.js not found (optional — needed for GitHub/Azure DevOps MCP servers)"
115
+ fi
116
+
117
+ # --- Step 2: Create venv & install packages ---
118
+
119
+ echo ""
120
+ echo "--- Install datasecops-cli ---"
121
+ echo ""
122
+
123
+ echo "Creating virtual environment..."
124
+ uv venv .venv
125
+ echo "[OK] Virtual environment created at .venv/"
126
+
127
+ echo ""
128
+ echo "Installing datasecops-cli with MCP server..."
129
+ uv pip install "datasecops-cli[mcp]"
130
+ echo "[OK] datasecops-cli installed (with MCP server)"
131
+
132
+ # --- Done ---
133
+
134
+ echo ""
135
+ echo "============================================================================"
136
+ echo " Setup complete!"
137
+ echo "============================================================================"
138
+ echo ""
139
+ echo " To get started:"
140
+ echo " source .venv/bin/activate"
141
+ echo " datasecops"
142
+ echo ""
143
+ echo " The CLI will configure .datasecops.yml, profiles.yml,"
144
+ echo " and MCP servers on first run."
145
+ echo ""
@@ -0,0 +1 @@
1
+ __version__ = "0.4.2"
@@ -35,6 +35,7 @@ class Config:
35
35
  connection_name=raw.get("connection_name", ""),
36
36
  app_database=raw.get("app_database", ""),
37
37
  profile_name=raw.get("profile_name", ""),
38
+ cortex_connection=raw.get("cortex_connection", ""),
38
39
  )
39
40
 
40
41
  if not self.datasecops.connection_name or not self.datasecops.app_database: