cycode 3.17.1.dev7__py3-none-any.whl → 3.17.1.dev9__py3-none-any.whl

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.
cycode/__init__.py CHANGED
@@ -5,4 +5,4 @@ import time as _time
5
5
  # end-to-end scan duration from the moment the user actually triggered it.
6
6
  _BOOT_WALL: float = _time.time()
7
7
 
8
- __version__ = '3.17.1.dev7' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
8
+ __version__ = '3.17.1.dev9' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
@@ -3,11 +3,14 @@ Policy loading and configuration management for AI guardrails.
3
3
 
4
4
  Policies are loaded and merged in order (later overrides earlier):
5
5
  1. Built-in defaults (consts.DEFAULT_POLICY)
6
- 2. User-level config (~/.cycode/ai-guardrails.yaml)
7
- 3. Repo-level config (<workspace>/.cycode/ai-guardrails.yaml)
6
+ 2. Machine-wide config (admin/MDM-provisioned; see get_machine_policy_path)
7
+ 3. User-level config (~/.cycode/ai-guardrails.yaml)
8
+ 4. Repo-level config (<workspace>/.cycode/ai-guardrails.yaml)
8
9
  """
9
10
 
10
11
  import json
12
+ import os
13
+ import sys
11
14
  from pathlib import Path
12
15
  from typing import Any, Optional
13
16
 
@@ -16,6 +19,16 @@ import yaml
16
19
  from cycode.cli.apps.ai_guardrails.scan.consts import DEFAULT_POLICY, POLICY_FILE_NAME
17
20
 
18
21
 
22
+ def get_machine_policy_path() -> Path:
23
+ """Machine-wide (admin/MDM-provisioned) policy path, by platform."""
24
+ if sys.platform == 'darwin':
25
+ return Path('/Library/Application Support/Cycode') / POLICY_FILE_NAME
26
+ if sys.platform == 'win32':
27
+ program_data = os.environ.get('PROGRAMDATA', 'C:\\ProgramData')
28
+ return Path(program_data) / 'Cycode' / POLICY_FILE_NAME
29
+ return Path('/etc/cycode') / POLICY_FILE_NAME
30
+
31
+
19
32
  def deep_merge(base: dict, override: dict) -> dict:
20
33
  """Deep merge two dictionaries, with override taking precedence."""
21
34
  result = base.copy()
@@ -61,7 +74,7 @@ def load_policy(workspace_root: Optional[str] = None) -> dict:
61
74
  """
62
75
  Load policy by merging configs in order of precedence.
63
76
 
64
- Merge order: defaults <- user config <- repo config
77
+ Merge order: defaults <- machine <- user config <- repo config
65
78
 
66
79
  Args:
67
80
  workspace_root: Workspace root path for repo-level config lookup.
@@ -69,6 +82,11 @@ def load_policy(workspace_root: Optional[str] = None) -> dict:
69
82
  # Start with defaults
70
83
  policy = load_defaults()
71
84
 
85
+ # Merge machine-wide config (admin/MDM-provisioned) - overrides defaults, below user/repo.
86
+ machine_config = load_yaml_file(get_machine_policy_path())
87
+ if machine_config:
88
+ policy = deep_merge(policy, machine_config)
89
+
72
90
  # Merge user-level config (if exists)
73
91
  user_policy_path = Path.home() / '.cycode' / POLICY_FILE_NAME
74
92
  user_config = load_yaml_file(user_policy_path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cycode
3
- Version: 3.17.1.dev7
3
+ Version: 3.17.1.dev9
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  License-Expression: MIT
6
6
  License-File: LICENCE
@@ -1,4 +1,4 @@
1
- cycode/__init__.py,sha256=X_9J5Y-8AaEYDIWByi5x4t0fQJqyuEGehwbatEaJnOI,396
1
+ cycode/__init__.py,sha256=-jiONx4Gu1pAuKoFpKdsmYtrlLAACStzV1EMAtyBG-E,396
2
2
  cycode/__main__.py,sha256=Z3bD5yrA7yPvAChcADQrqCaZd0ChGI1gdiwALwbWJ6U,104
3
3
  cycode/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  cycode/cli/app.py,sha256=AlR2durAEbsa47PDfIj7JtMvJDWA_Dq6wPtVuMJYSCs,10250
@@ -19,7 +19,7 @@ cycode/cli/apps/ai_guardrails/scan/__init__.py,sha256=qJc82XiQGiAuc1sYY8Ij_A-qXp
19
19
  cycode/cli/apps/ai_guardrails/scan/consts.py,sha256=drAslw6vW3kxmbCs2qPCUbUPR7PJouT2lsXtu5sD-lQ,1094
20
20
  cycode/cli/apps/ai_guardrails/scan/handlers.py,sha256=pf5PrUIVnGLEEE6QKPny9at5V6Ms5u2IEtFP72hKgqA,15523
21
21
  cycode/cli/apps/ai_guardrails/scan/payload.py,sha256=pvT3UUqNMvdK3EVzzPjy4JMlOrF-WgxZ3fHN2AtN5eA,1126
22
- cycode/cli/apps/ai_guardrails/scan/policy.py,sha256=39s8hnxgjny1l6XAO59wsRcAlpW-LG00GUnO0PfqvuY,2566
22
+ cycode/cli/apps/ai_guardrails/scan/policy.py,sha256=BZoNNdDQ9tqnfwhB4X1-bDtudaOQc_gXizm3IVwa28o,3351
23
23
  cycode/cli/apps/ai_guardrails/scan/scan_command.py,sha256=-Gl7cHELF1wlwLGno6ZVukFtK6NI6Z3-dTpIOsz8ors,6079
24
24
  cycode/cli/apps/ai_guardrails/scan/types.py,sha256=lDttkYFBfOkdMEEaRbq1IT2QTK0R-7Ht3T8vZdyB3b4,1038
25
25
  cycode/cli/apps/ai_guardrails/scan/utils.py,sha256=KVfX-NrcM-QW4quLtoNqfmz4GF0FlDs-TkqUOu1hAWM,2057
@@ -209,8 +209,8 @@ cycode/cyclient/report_client.py,sha256=Scq30NeJPzgXv0hPLO1U05AdE9i_2iu6cIrSKpEJ
209
209
  cycode/cyclient/scan_client.py,sha256=6TK5FQkfrvV7PHqRnUzEn1PBNd2oPYVamvIixcUfe3c,16755
210
210
  cycode/cyclient/scan_config_base.py,sha256=mXsPZGYCtp85rv5GIige40yQZXuRcEKUW-VQJ0vgFzk,1201
211
211
  cycode/logger.py,sha256=EfZGRK6VC5rE_LAjIcRrHFiQCueylCDXoG6bvGkrIME,2111
212
- cycode-3.17.1.dev7.dist-info/METADATA,sha256=SFL4azW4g6gWF8vY6kmw2q8XiOu31K3MzHFIzvrmQEU,89246
213
- cycode-3.17.1.dev7.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
214
- cycode-3.17.1.dev7.dist-info/entry_points.txt,sha256=iDcVJM8ByLElVgvBgtYxDjw1kT7O8Mo0LcWZIT5L3Ig,45
215
- cycode-3.17.1.dev7.dist-info/licenses/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
216
- cycode-3.17.1.dev7.dist-info/RECORD,,
212
+ cycode-3.17.1.dev9.dist-info/METADATA,sha256=OXkZniyGD-j04N9TGCEcPdYheNbETp6Sft29rMJ0WPc,89246
213
+ cycode-3.17.1.dev9.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
214
+ cycode-3.17.1.dev9.dist-info/entry_points.txt,sha256=iDcVJM8ByLElVgvBgtYxDjw1kT7O8Mo0LcWZIT5L3Ig,45
215
+ cycode-3.17.1.dev9.dist-info/licenses/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
216
+ cycode-3.17.1.dev9.dist-info/RECORD,,