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.
Files changed (53) hide show
  1. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/CHANGELOG.md +11 -0
  2. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/PKG-INFO +1 -1
  3. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/pyproject.toml +1 -1
  4. datasecops_cli-0.4.1/src/datasecops_cli/__init__.py +1 -0
  5. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/main.py +16 -7
  6. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/skill_service.py +24 -0
  7. datasecops_cli-0.4.0/src/datasecops_cli/__init__.py +0 -1
  8. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.github/workflows/auto-tag.yml +0 -0
  9. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.github/workflows/publish-cli.yml +0 -0
  10. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/.gitignore +0 -0
  11. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/DEVELOPMENT.md +0 -0
  12. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/LICENSE +0 -0
  13. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/README.md +0 -0
  14. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/getting-started.md +0 -0
  15. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/legacy.md +0 -0
  16. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/legacy_plan_of_action.md +0 -0
  17. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/docs/mcp-server.md +0 -0
  18. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/mcp-servers.json +0 -0
  19. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/setup.ps1 +0 -0
  20. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/setup.sh +0 -0
  21. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/config.py +0 -0
  22. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/__init__.py +0 -0
  23. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/development.py +0 -0
  24. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/downloads.py +0 -0
  25. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/menus/git_operations.py +0 -0
  26. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/__init__.py +0 -0
  27. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/git_helpers.py +0 -0
  28. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/models/project_config.py +0 -0
  29. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/__init__.py +0 -0
  30. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/bootstrap_service.py +0 -0
  31. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/dbt_project_generator.py +0 -0
  32. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/dbt_runner.py +0 -0
  33. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/directory_scaffolder.py +0 -0
  34. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/download_service.py +0 -0
  35. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/git_service.py +0 -0
  36. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/linting_service.py +0 -0
  37. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/snowflake_service.py +0 -0
  38. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/services/upstream_service.py +0 -0
  39. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/__init__.py +0 -0
  40. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/display.py +0 -0
  41. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/file_utils.py +0 -0
  42. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_cli/utilities/yaml_utils.py +0 -0
  43. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/__init__.py +0 -0
  44. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/__main__.py +0 -0
  45. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/connection.py +0 -0
  46. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/src/datasecops_mcp/server.py +0 -0
  47. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/__init__.py +0 -0
  48. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_config.py +0 -0
  49. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_file_utils.py +0 -0
  50. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_main.py +0 -0
  51. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_models.py +0 -0
  52. {datasecops_cli-0.4.0 → datasecops_cli-0.4.1}/tests/test_version.py +0 -0
  53. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datasecops-cli
3
- Version: 0.4.0
3
+ Version: 0.4.1
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.1"
8
8
  description = "DataSecOps Framework CLI for Snowflake Native App"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -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 == 4:
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 == 5 and has_outdated:
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, "downloads - Download Configs & Skills")
468
- menu_option(4, "bootstrap - Set up a new dbt project with all framework config")
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(5, "update pkgs - Update upstream packages to latest versions")
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