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.
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/CHANGELOG.md +43 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/PKG-INFO +1 -1
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/pyproject.toml +1 -1
- datasecops_cli-0.4.2/setup.ps1 +139 -0
- datasecops_cli-0.4.2/setup.sh +145 -0
- datasecops_cli-0.4.2/src/datasecops_cli/__init__.py +1 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/config.py +1 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/main.py +310 -32
- datasecops_cli-0.4.2/src/datasecops_cli/menus/configuration.py +252 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/development.py +0 -60
- datasecops_cli-0.4.2/src/datasecops_cli/menus/downloads.py +233 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/project_config.py +1 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/skill_service.py +24 -0
- datasecops_cli-0.4.0/setup.ps1 +0 -282
- datasecops_cli-0.4.0/setup.sh +0 -249
- datasecops_cli-0.4.0/src/datasecops_cli/__init__.py +0 -1
- datasecops_cli-0.4.0/src/datasecops_cli/menus/downloads.py +0 -107
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.github/workflows/auto-tag.yml +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.github/workflows/publish-cli.yml +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/.gitignore +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/DEVELOPMENT.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/LICENSE +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/README.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/getting-started.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/legacy.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/legacy_plan_of_action.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/docs/mcp-server.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/mcp-servers.json +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/menus/git_operations.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/models/git_helpers.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/bootstrap_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/dbt_project_generator.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/dbt_runner.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/directory_scaffolder.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/download_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/git_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/linting_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/snowflake_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/services/upstream_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/display.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/file_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_cli/utilities/yaml_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/__main__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/connection.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/src/datasecops_mcp/server.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_config.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_file_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_main.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_models.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.2}/tests/test_version.py +0 -0
- {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
|
|
@@ -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:
|