datasecops-cli 0.4.0__tar.gz → 0.4.1__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.1}/CHANGELOG.md +11 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/PKG-INFO +1 -1
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/pyproject.toml +1 -1
- datasecops_cli-0.4.1/src/datasecops_cli/__init__.py +1 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/main.py +16 -7
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/skill_service.py +24 -0
- datasecops_cli-0.4.0/src/datasecops_cli/__init__.py +0 -1
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.github/workflows/auto-tag.yml +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.github/workflows/publish-cli.yml +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.gitignore +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/DEVELOPMENT.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/LICENSE +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/README.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/getting-started.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/legacy.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/legacy_plan_of_action.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/mcp-server.md +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/mcp-servers.json +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/setup.ps1 +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/setup.sh +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/config.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/development.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/downloads.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/git_operations.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/git_helpers.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/project_config.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/bootstrap_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/dbt_project_generator.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/dbt_runner.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/directory_scaffolder.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/download_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/git_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/linting_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/snowflake_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/upstream_service.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/display.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/file_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/yaml_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/__main__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/connection.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/server.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/__init__.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_config.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_file_utils.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_main.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_models.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_version.py +0 -0
- {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_yaml_utils.py +0 -0
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the DataSecOps CLI are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.4.1] - 2026-05-17
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **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.
|
|
10
|
+
- **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.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Main menu renumbered** — downloads moved to `[4]`, bootstrap to `[5]`, update pkgs to `[6]` to accommodate the new Cortex Code option at `[3]`
|
|
15
|
+
|
|
5
16
|
## [0.4.0] - 2026-05-16
|
|
6
17
|
|
|
7
18
|
### Added
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.1"
|
|
@@ -17,8 +17,8 @@ from datasecops_cli.menus.development import DevelopmentMenu
|
|
|
17
17
|
from datasecops_cli.menus.git_operations import GitOperationsMenu
|
|
18
18
|
from datasecops_cli.menus.downloads import DownloadsMenu
|
|
19
19
|
from datasecops_cli.utilities.display import (
|
|
20
|
-
clear, section_header, menu_option, get_input_number,
|
|
21
|
-
info_line, error_line, success_line
|
|
20
|
+
clear, section_header, display_action_header, menu_option, get_input_number,
|
|
21
|
+
info_line, error_line, success_line, complete_action
|
|
22
22
|
)
|
|
23
23
|
from datasecops_cli.utilities.yaml_utils import write_datasecops_config
|
|
24
24
|
|
|
@@ -413,6 +413,14 @@ def _main_menu(config: Config, dbt_runner: DbtRunner, git_service: GitService,
|
|
|
413
413
|
git_menu.show()
|
|
414
414
|
|
|
415
415
|
elif option == 3:
|
|
416
|
+
display_action_header("Launch Cortex Code")
|
|
417
|
+
try:
|
|
418
|
+
subprocess.run(["cortex"])
|
|
419
|
+
except FileNotFoundError:
|
|
420
|
+
error_line("Cortex Code CLI not found. Install it from: https://docs.snowflake.com/en/user-guide/cortex-code")
|
|
421
|
+
complete_action()
|
|
422
|
+
|
|
423
|
+
elif option == 4:
|
|
416
424
|
dl_menu = DownloadsMenu(
|
|
417
425
|
download_service, skill_service, dbt_runner,
|
|
418
426
|
profile_name, config.dbt_project_dir,
|
|
@@ -422,7 +430,7 @@ def _main_menu(config: Config, dbt_runner: DbtRunner, git_service: GitService,
|
|
|
422
430
|
)
|
|
423
431
|
dl_menu.show()
|
|
424
432
|
|
|
425
|
-
elif option ==
|
|
433
|
+
elif option == 5:
|
|
426
434
|
from datasecops_cli.utilities.display import get_input_true_false, select_multiple_from_list
|
|
427
435
|
platform = config.source_control.source_control_platform.lower()
|
|
428
436
|
info_line(f"Platform: {platform}")
|
|
@@ -441,7 +449,7 @@ def _main_menu(config: Config, dbt_runner: DbtRunner, git_service: GitService,
|
|
|
441
449
|
bootstrap.run(platform=platform, install_skills=install_skills,
|
|
442
450
|
skill_targets=skill_targets, run_deps=run_deps)
|
|
443
451
|
|
|
444
|
-
elif option ==
|
|
452
|
+
elif option == 6 and has_outdated:
|
|
445
453
|
_update_upstream_packages(config, dbt_runner, upstream_statuses)
|
|
446
454
|
# Refresh upstream statuses after update
|
|
447
455
|
from datasecops_cli.services.upstream_service import check_upstream_versions
|
|
@@ -464,10 +472,11 @@ def _show_main_menu(profile_name: str, git_service: GitService = None,
|
|
|
464
472
|
upstream_info=upstream_statuses)
|
|
465
473
|
menu_option(1, "development - dbt Development Commands")
|
|
466
474
|
menu_option(2, "git - Source Control Operations")
|
|
467
|
-
menu_option(3, "
|
|
468
|
-
menu_option(4, "
|
|
475
|
+
menu_option(3, "cortex code - Launch Cortex Code AI coding agent")
|
|
476
|
+
menu_option(4, "downloads - Download Configs & Skills")
|
|
477
|
+
menu_option(5, "bootstrap - Set up a new dbt project with all framework config")
|
|
469
478
|
if upstream_statuses and any(s.needs_update for s in upstream_statuses):
|
|
470
|
-
menu_option(
|
|
479
|
+
menu_option(6, "update pkgs - Update upstream packages to latest versions")
|
|
471
480
|
menu_option(0, "exit - Exit")
|
|
472
481
|
|
|
473
482
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import subprocess
|
|
1
2
|
from pathlib import Path
|
|
2
3
|
from typing import Optional
|
|
3
4
|
|
|
@@ -112,6 +113,8 @@ class SkillService:
|
|
|
112
113
|
for skill in skills:
|
|
113
114
|
if self.install_skill(skill, targets=targets, target_dir=target_dir):
|
|
114
115
|
count += 1
|
|
116
|
+
if "Cortex Code" in targets:
|
|
117
|
+
self._register_cortex_skills_dir(target_dir)
|
|
115
118
|
success_line(f"Installed {count} skill(s) to {', '.join(targets)}")
|
|
116
119
|
return count
|
|
117
120
|
|
|
@@ -125,6 +128,8 @@ class SkillService:
|
|
|
125
128
|
if self._is_installed(skill.skill_id, target):
|
|
126
129
|
self.install_skill(skill, targets=targets, target_dir=target_dir)
|
|
127
130
|
count += 1
|
|
131
|
+
if "Cortex Code" in targets:
|
|
132
|
+
self._register_cortex_skills_dir(target_dir)
|
|
128
133
|
success_line(f"Updated {count} skill(s)")
|
|
129
134
|
return count
|
|
130
135
|
|
|
@@ -165,3 +170,22 @@ class SkillService:
|
|
|
165
170
|
content,
|
|
166
171
|
]
|
|
167
172
|
return "\n".join(lines)
|
|
173
|
+
|
|
174
|
+
@staticmethod
|
|
175
|
+
def _register_cortex_skills_dir(target_dir: Path = None) -> None:
|
|
176
|
+
"""Register the skills directory with Cortex Code CLI so skills are discoverable."""
|
|
177
|
+
skills_dir = target_dir or get_cortex_skills_dir()
|
|
178
|
+
try:
|
|
179
|
+
result = subprocess.run(
|
|
180
|
+
["cortex", "skill", "add", str(skills_dir)],
|
|
181
|
+
capture_output=True, text=True, timeout=30,
|
|
182
|
+
)
|
|
183
|
+
if result.returncode == 0:
|
|
184
|
+
success_line(f"Registered skills directory with Cortex Code: {skills_dir}")
|
|
185
|
+
else:
|
|
186
|
+
warning_line(f"cortex skill add exited with code {result.returncode}: {result.stderr.strip()}")
|
|
187
|
+
except FileNotFoundError:
|
|
188
|
+
warning_line("Cortex Code CLI not found — run 'cortex skill add "
|
|
189
|
+
f"{skills_dir}' manually to register skills")
|
|
190
|
+
except subprocess.TimeoutExpired:
|
|
191
|
+
warning_line("Cortex Code skill registration timed out")
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.4.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/bootstrap_service.py
RENAMED
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/dbt_project_generator.py
RENAMED
|
File without changes
|
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/directory_scaffolder.py
RENAMED
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/download_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/linting_service.py
RENAMED
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/snowflake_service.py
RENAMED
|
File without changes
|
{datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/upstream_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|