cycode 2.0.1.dev3__py3-none-any.whl → 2.0.1.dev4__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
@@ -1 +1 @@
1
- __version__ = '2.0.1.dev3' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
1
+ __version__ = '2.0.1.dev4' # DON'T TOUCH. Placeholder. Will be filled automatically on poetry build from Git Tag
File without changes
@@ -0,0 +1,67 @@
1
+ import os
2
+
3
+ import click
4
+ from patch_ng import fromstring
5
+ from rich.console import Console
6
+ from rich.markdown import Markdown
7
+
8
+ from cycode.cli.exceptions.handle_ai_remediation_errors import handle_ai_remediation_exception
9
+ from cycode.cli.models import CliResult
10
+ from cycode.cli.printers import ConsolePrinter
11
+ from cycode.cli.utils.get_api_client import get_scan_cycode_client
12
+
13
+
14
+ def _echo_remediation(context: click.Context, remediation_markdown: str, is_fix_available: bool) -> None:
15
+ printer = ConsolePrinter(context)
16
+ if printer.is_json_printer:
17
+ data = {'remediation': remediation_markdown, 'is_fix_available': is_fix_available}
18
+ printer.print_result(CliResult(success=True, message='Remediation fetched successfully', data=data))
19
+ else: # text or table
20
+ Console().print(Markdown(remediation_markdown))
21
+
22
+
23
+ def _apply_fix(context: click.Context, diff: str, is_fix_available: bool) -> None:
24
+ printer = ConsolePrinter(context)
25
+ if not is_fix_available:
26
+ printer.print_result(CliResult(success=False, message='Fix is not available for this violation'))
27
+ return
28
+
29
+ patch = fromstring(diff.encode('UTF-8'))
30
+ if patch is False:
31
+ printer.print_result(CliResult(success=False, message='Failed to parse fix diff'))
32
+ return
33
+
34
+ is_fix_applied = patch.apply(root=os.getcwd(), strip=0)
35
+ if is_fix_applied:
36
+ printer.print_result(CliResult(success=True, message='Fix applied successfully'))
37
+ else:
38
+ printer.print_result(CliResult(success=False, message='Failed to apply fix'))
39
+
40
+
41
+ @click.command(short_help='Get AI remediation (INTERNAL).', hidden=True)
42
+ @click.argument('detection_id', nargs=1, type=click.UUID, required=True)
43
+ @click.option(
44
+ '--fix',
45
+ is_flag=True,
46
+ default=False,
47
+ help='Apply fixes to resolve violations. Fix is not available for all violations.',
48
+ type=click.BOOL,
49
+ required=False,
50
+ )
51
+ @click.pass_context
52
+ def ai_remediation_command(context: click.Context, detection_id: str, fix: bool) -> None:
53
+ client = get_scan_cycode_client()
54
+
55
+ try:
56
+ remediation_markdown = client.get_ai_remediation(detection_id)
57
+ fix_diff = client.get_ai_remediation(detection_id, fix=True)
58
+ is_fix_available = bool(fix_diff) # exclude empty string, None, etc.
59
+
60
+ if fix:
61
+ _apply_fix(context, fix_diff, is_fix_available)
62
+ else:
63
+ _echo_remediation(context, remediation_markdown, is_fix_available)
64
+ except Exception as err:
65
+ handle_ai_remediation_exception(context, err)
66
+
67
+ context.exit()
@@ -3,6 +3,7 @@ from typing import Optional
3
3
 
4
4
  import click
5
5
 
6
+ from cycode.cli.commands.ai_remediation.ai_remediation_command import ai_remediation_command
6
7
  from cycode.cli.commands.auth.auth_command import auth_command
7
8
  from cycode.cli.commands.configure.configure_command import configure_command
8
9
  from cycode.cli.commands.ignore.ignore_command import ignore_command
@@ -30,6 +31,7 @@ from cycode.cyclient.models import UserAgentOptionScheme
30
31
  'auth': auth_command,
31
32
  'version': version_command,
32
33
  'status': status_command,
34
+ 'ai_remediation': ai_remediation_command,
33
35
  },
34
36
  context_settings=CLI_CONTEXT_SETTINGS,
35
37
  )
@@ -6,7 +6,7 @@ from cycode import __version__
6
6
  from cycode.cli.consts import PROGRAM_NAME
7
7
 
8
8
 
9
- @click.command(short_help='Show the CLI version and exit.')
9
+ @click.command(short_help='Show the CLI version and exit. Use `cycode status` instead.', deprecated=True)
10
10
  @click.pass_context
11
11
  def version_command(context: click.Context) -> None:
12
12
  output = context.obj['output']
cycode/cli/consts.py CHANGED
@@ -159,6 +159,10 @@ SENTRY_MAX_REQUEST_BODY_SIZE = 'never'
159
159
  SYNC_SCAN_TIMEOUT_IN_SECONDS_ENV_VAR_NAME = 'SYNC_SCAN_TIMEOUT_IN_SECONDS'
160
160
  DEFAULT_SYNC_SCAN_TIMEOUT_IN_SECONDS = 180
161
161
 
162
+ # ai remediation
163
+ AI_REMEDIATION_TIMEOUT_IN_SECONDS_ENV_VAR_NAME = 'AI_REMEDIATION_TIMEOUT_IN_SECONDS'
164
+ DEFAULT_AI_REMEDIATION_TIMEOUT_IN_SECONDS = 60
165
+
162
166
  # report with polling
163
167
  REPORT_POLLING_WAIT_INTERVAL_IN_SECONDS = 5
164
168
  DEFAULT_REPORT_POLLING_TIMEOUT_IN_SECONDS = 600
@@ -0,0 +1,37 @@
1
+ from typing import Optional
2
+
3
+ import click
4
+
5
+ from cycode.cli.models import CliError, CliErrors
6
+ from cycode.cli.printers import ConsolePrinter
7
+ from cycode.cli.sentry import capture_exception
8
+
9
+
10
+ def handle_errors(
11
+ context: click.Context, err: BaseException, cli_errors: CliErrors, *, return_exception: bool = False
12
+ ) -> Optional['CliError']:
13
+ ConsolePrinter(context).print_exception(err)
14
+
15
+ if type(err) in cli_errors:
16
+ error = cli_errors[type(err)]
17
+
18
+ if error.soft_fail is True:
19
+ context.obj['soft_fail'] = True
20
+
21
+ if return_exception:
22
+ return error
23
+
24
+ ConsolePrinter(context).print_error(error)
25
+ return None
26
+
27
+ if isinstance(err, click.ClickException):
28
+ raise err
29
+
30
+ capture_exception(err)
31
+
32
+ unknown_error = CliError(code='unknown_error', message=str(err))
33
+ if return_exception:
34
+ return unknown_error
35
+
36
+ ConsolePrinter(context).print_error(unknown_error)
37
+ exit(1)
@@ -0,0 +1,22 @@
1
+ import click
2
+
3
+ from cycode.cli.exceptions.common import handle_errors
4
+ from cycode.cli.exceptions.custom_exceptions import KNOWN_USER_FRIENDLY_REQUEST_ERRORS, RequestHttpError
5
+ from cycode.cli.models import CliError, CliErrors
6
+
7
+
8
+ class AiRemediationNotFoundError(Exception): ...
9
+
10
+
11
+ def handle_ai_remediation_exception(context: click.Context, err: Exception) -> None:
12
+ if isinstance(err, RequestHttpError) and err.status_code == 404:
13
+ err = AiRemediationNotFoundError()
14
+
15
+ errors: CliErrors = {
16
+ **KNOWN_USER_FRIENDLY_REQUEST_ERRORS,
17
+ AiRemediationNotFoundError: CliError(
18
+ code='ai_remediation_not_found',
19
+ message='The AI remediation was not found. Please try different detection ID',
20
+ ),
21
+ }
22
+ handle_errors(context, err, errors)
@@ -1,17 +1,12 @@
1
- from typing import Optional
2
-
3
1
  import click
4
2
 
5
3
  from cycode.cli.exceptions import custom_exceptions
4
+ from cycode.cli.exceptions.common import handle_errors
6
5
  from cycode.cli.exceptions.custom_exceptions import KNOWN_USER_FRIENDLY_REQUEST_ERRORS
7
6
  from cycode.cli.models import CliError, CliErrors
8
- from cycode.cli.printers import ConsolePrinter
9
- from cycode.cli.sentry import capture_exception
10
-
11
7
 
12
- def handle_report_exception(context: click.Context, err: Exception) -> Optional[CliError]:
13
- ConsolePrinter(context).print_exception()
14
8
 
9
+ def handle_report_exception(context: click.Context, err: Exception) -> None:
15
10
  errors: CliErrors = {
16
11
  **KNOWN_USER_FRIENDLY_REQUEST_ERRORS,
17
12
  custom_exceptions.ScanAsyncError: CliError(
@@ -25,16 +20,4 @@ def handle_report_exception(context: click.Context, err: Exception) -> Optional[
25
20
  'Please try again by executing the `cycode report` command',
26
21
  ),
27
22
  }
28
-
29
- if type(err) in errors:
30
- error = errors[type(err)]
31
-
32
- ConsolePrinter(context).print_error(error)
33
- return None
34
-
35
- if isinstance(err, click.ClickException):
36
- raise err
37
-
38
- capture_exception(err)
39
-
40
- raise click.ClickException(str(err))
23
+ handle_errors(context, err, errors)
@@ -3,20 +3,17 @@ from typing import Optional
3
3
  import click
4
4
 
5
5
  from cycode.cli.exceptions import custom_exceptions
6
+ from cycode.cli.exceptions.common import handle_errors
6
7
  from cycode.cli.exceptions.custom_exceptions import KNOWN_USER_FRIENDLY_REQUEST_ERRORS
7
8
  from cycode.cli.models import CliError, CliErrors
8
- from cycode.cli.printers import ConsolePrinter
9
- from cycode.cli.sentry import capture_exception
10
9
  from cycode.cli.utils.git_proxy import git_proxy
11
10
 
12
11
 
13
12
  def handle_scan_exception(
14
- context: click.Context, e: Exception, *, return_exception: bool = False
13
+ context: click.Context, err: Exception, *, return_exception: bool = False
15
14
  ) -> Optional[CliError]:
16
15
  context.obj['did_fail'] = True
17
16
 
18
- ConsolePrinter(context).print_exception(e)
19
-
20
17
  errors: CliErrors = {
21
18
  **KNOWN_USER_FRIENDLY_REQUEST_ERRORS,
22
19
  custom_exceptions.ScanAsyncError: CliError(
@@ -35,7 +32,7 @@ def handle_scan_exception(
35
32
  custom_exceptions.TfplanKeyError: CliError(
36
33
  soft_fail=True,
37
34
  code='key_error',
38
- message=f'\n{e!s}\n'
35
+ message=f'\n{err!s}\n'
39
36
  'A crucial field is missing in your terraform plan file. '
40
37
  'Please make sure that your file is well formed '
41
38
  'and execute the scan again',
@@ -48,26 +45,4 @@ def handle_scan_exception(
48
45
  ),
49
46
  }
50
47
 
51
- if type(e) in errors:
52
- error = errors[type(e)]
53
-
54
- if error.soft_fail is True:
55
- context.obj['soft_fail'] = True
56
-
57
- if return_exception:
58
- return error
59
-
60
- ConsolePrinter(context).print_error(error)
61
- return None
62
-
63
- if isinstance(e, click.ClickException):
64
- raise e
65
-
66
- capture_exception(e)
67
-
68
- unknown_error = CliError(code='unknown_error', message=str(e))
69
- if return_exception:
70
- return unknown_error
71
-
72
- ConsolePrinter(context).print_error(unknown_error)
73
- exit(1)
48
+ return handle_errors(context, err, errors, return_exception=return_exception)
cycode/cli/models.py CHANGED
@@ -63,7 +63,7 @@ class CliError(NamedTuple):
63
63
  soft_fail: bool = False
64
64
 
65
65
 
66
- CliErrors = Dict[Type[Exception], CliError]
66
+ CliErrors = Dict[Type[BaseException], CliError]
67
67
 
68
68
 
69
69
  class CliResult(NamedTuple):
@@ -60,3 +60,15 @@ class ConsolePrinter:
60
60
  """Print traceback message in stderr if verbose mode is set."""
61
61
  if force_print or self.context.obj.get('verbose', False):
62
62
  self._printer_class(self.context).print_exception(e)
63
+
64
+ @property
65
+ def is_json_printer(self) -> bool:
66
+ return self._printer_class == JsonPrinter
67
+
68
+ @property
69
+ def is_table_printer(self) -> bool:
70
+ return self._printer_class == TablePrinter
71
+
72
+ @property
73
+ def is_text_printer(self) -> bool:
74
+ return self._printer_class == TextPrinter
@@ -113,6 +113,13 @@ class ConfigurationManager:
113
113
  )
114
114
  )
115
115
 
116
+ def get_ai_remediation_timeout_in_seconds(self) -> int:
117
+ return int(
118
+ self._get_value_from_environment_variables(
119
+ consts.AI_REMEDIATION_TIMEOUT_IN_SECONDS_ENV_VAR_NAME, consts.DEFAULT_AI_REMEDIATION_TIMEOUT_IN_SECONDS
120
+ )
121
+ )
122
+
116
123
  def get_report_polling_timeout_in_seconds(self) -> int:
117
124
  return int(
118
125
  self._get_value_from_environment_variables(
cycode/cyclient/models.py CHANGED
@@ -13,8 +13,10 @@ class Detection(Schema):
13
13
  detection_details: dict,
14
14
  detection_rule_id: str,
15
15
  severity: Optional[str] = None,
16
+ id: Optional[str] = None,
16
17
  ) -> None:
17
18
  super().__init__()
19
+ self.id = id
18
20
  self.message = message
19
21
  self.type = type
20
22
  self.severity = severity
@@ -36,6 +38,7 @@ class DetectionSchema(Schema):
36
38
  class Meta:
37
39
  unknown = EXCLUDE
38
40
 
41
+ id = fields.String(missing=None)
39
42
  message = fields.String()
40
43
  type = fields.String()
41
44
  severity = fields.String(missing=None)
@@ -206,6 +206,28 @@ class ScanClient:
206
206
  response = self.scan_cycode_client.get(url_path='preferences/api/v1/supportedmodules')
207
207
  return models.SupportedModulesPreferencesSchema().load(response.json())
208
208
 
209
+ @staticmethod
210
+ def get_ai_remediation_path(detection_id: str) -> str:
211
+ return f'scm-remediator/api/v1/ContentRemediation/preview/{detection_id}'
212
+
213
+ def get_ai_remediation(self, detection_id: str, *, fix: bool = False) -> str:
214
+ path = self.get_ai_remediation_path(detection_id)
215
+
216
+ data = {
217
+ 'resolving_parameters': {
218
+ 'get_diff': True,
219
+ 'use_code_snippet': True,
220
+ 'add_diff_header': True,
221
+ }
222
+ }
223
+ if not fix:
224
+ data['resolving_parameters']['remediation_action'] = 'ReplyWithRemediationDetails'
225
+
226
+ response = self.scan_cycode_client.get(
227
+ url_path=path, json=data, timeout=configuration_manager.get_ai_remediation_timeout_in_seconds()
228
+ )
229
+ return response.text.strip()
230
+
209
231
  @staticmethod
210
232
  def _get_policy_type_by_scan_type(scan_type: str) -> str:
211
233
  scan_type_to_policy_type = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cycode
3
- Version: 2.0.1.dev3
3
+ Version: 2.0.1.dev4
4
4
  Summary: Boost security in your dev lifecycle via SAST, SCA, Secrets & IaC scanning.
5
5
  Home-page: https://github.com/cycodehq/cycode-cli
6
6
  License: MIT
@@ -28,10 +28,12 @@ Requires-Dist: click (>=8.1.0,<8.2.0)
28
28
  Requires-Dist: colorama (>=0.4.3,<0.5.0)
29
29
  Requires-Dist: gitpython (>=3.1.30,<3.2.0)
30
30
  Requires-Dist: marshmallow (>=3.15.0,<3.23.0)
31
+ Requires-Dist: patch-ng (==1.18.1)
31
32
  Requires-Dist: pathspec (>=0.11.1,<0.13.0)
32
33
  Requires-Dist: pyjwt (>=2.8.0,<3.0)
33
34
  Requires-Dist: pyyaml (>=6.0,<7.0)
34
35
  Requires-Dist: requests (>=2.32.2,<3.0)
36
+ Requires-Dist: rich (>=13.9.4,<14)
35
37
  Requires-Dist: sentry-sdk (>=2.8.0,<3.0)
36
38
  Requires-Dist: texttable (>=1.6.7,<1.8.0)
37
39
  Requires-Dist: urllib3 (==1.26.19)
@@ -1,6 +1,8 @@
1
- cycode/__init__.py,sha256=WIKoL2XY1z5jcr2GXtp1ikkC7nZTKxUFKUuFktIudZs,114
1
+ cycode/__init__.py,sha256=oRyf-eqjP-vdO9f5gxzgLewFcIqZFzYS-0jBwbVNmd0,114
2
2
  cycode/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  cycode/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ cycode/cli/commands/ai_remediation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ cycode/cli/commands/ai_remediation/ai_remediation_command.py,sha256=lKv_LkW5rpWGANDxyY6BrdG3yEazljFkFe7tAdaaJyM,2546
4
6
  cycode/cli/commands/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
7
  cycode/cli/commands/auth/auth_command.py,sha256=gM_tTS-8wwQJ6OWTwqbovBM6tLGiNf2ICaf9BRM74fg,2559
6
8
  cycode/cli/commands/auth/auth_manager.py,sha256=xUW8CJyfRkFd7zOifUZjkwhTMGrgquHdlnNElx2UVsA,4726
@@ -9,7 +11,7 @@ cycode/cli/commands/configure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
9
11
  cycode/cli/commands/configure/configure_command.py,sha256=OTv6s1gmQaAhxbjVk-3wnaOL3sRGp4RclnVd1VQ_wS4,5501
10
12
  cycode/cli/commands/ignore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
13
  cycode/cli/commands/ignore/ignore_command.py,sha256=I2xW8LFXBCblquAKTaFUMZDMm5hQpNHslh6VM2BLUJg,3948
12
- cycode/cli/commands/main_cli.py,sha256=GwMru1sm695Hy1kNxaOsC3Ic6joYxAy56Mf6dH9D9Zg,2706
14
+ cycode/cli/commands/main_cli.py,sha256=8UCGHTaeeB2tk_Kx8COUDq3cBYr8VcWXnHFssVCtgSI,2849
13
15
  cycode/cli/commands/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
16
  cycode/cli/commands/report/report_command.py,sha256=7IRLQZWaNucXXSBWZ5b6exTqYVb2NJ-49m1zHC6A9TA,637
15
17
  cycode/cli/commands/report/sbom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -39,14 +41,16 @@ cycode/cli/commands/scan/scan_command.py,sha256=NaTxREAbsWUsY-TTHt62kiIVM0_qgNwb
39
41
  cycode/cli/commands/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
42
  cycode/cli/commands/status/status_command.py,sha256=DlIHHLv7CgmlXd6Kn9p26VF0TfRUmhGKLFc3FUEPQOo,4295
41
43
  cycode/cli/commands/version/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- cycode/cli/commands/version/version_command.py,sha256=drxn12TSHxeD9pjT9dH5L8-0Xytejdn5cBbGR4CKRAQ,509
44
+ cycode/cli/commands/version/version_command.py,sha256=CdLccqFoK3_yE13H7QUpxjsEZltke1emN-_qHHpnghU,555
43
45
  cycode/cli/config.py,sha256=JR_-uZdWVV-AaffRqTbDH0V7O4KLGNKn50v3huuPlts,466
44
46
  cycode/cli/config.yaml,sha256=SBs5VNdaY9BVbRlwgnTF_j53GBbjJVwwBj9qx_qvrds,463
45
- cycode/cli/consts.py,sha256=E64mQZaI6uglxyUCIq-Gr9eMmV5xJc8UqAJPV1zNPk8,6688
47
+ cycode/cli/consts.py,sha256=yM0TyOGyvu_LwdexXp4EIwrK1-YJsr182YYstLB5sbA,6838
46
48
  cycode/cli/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ cycode/cli/exceptions/common.py,sha256=Si_e8bn_VfsnCww_eN1czF9iBPbQZxS8L8Oy4YoA0cA,954
47
50
  cycode/cli/exceptions/custom_exceptions.py,sha256=7HiXUoh0lnIP7yUwO-lv1p9AXiMU2bIJdlUvu9H6CKY,3466
48
- cycode/cli/exceptions/handle_report_sbom_errors.py,sha256=KgpqbZx2NJ9Vao9jIJ-H6qGZb21t8lN65txkVNmIXvE,1287
49
- cycode/cli/exceptions/handle_scan_errors.py,sha256=ZSEOVuN9cZeCgghONzVP703QIOsMlsSjVVY8EOw3OpY,2487
51
+ cycode/cli/exceptions/handle_ai_remediation_errors.py,sha256=qi51N5oTFDUcsBtjxzocHW5BuLK0yW6EdHaIOfbkOhU,786
52
+ cycode/cli/exceptions/handle_report_sbom_errors.py,sha256=Y09AlYCRmRHlZjDpwYzdTEdjBec6FddCX9FlormmddU,927
53
+ cycode/cli/exceptions/handle_scan_errors.py,sha256=9zZ7QUsVeL9bZ6ls6_mp0MBeATrGIjDAo1KLFuhn94I,1942
50
54
  cycode/cli/files_collector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
55
  cycode/cli/files_collector/excluder.py,sha256=XraxZqlwFjC08Bt3XeQZ25vPea5bNj55b75ThWkqAkU,6214
52
56
  cycode/cli/files_collector/iac/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -73,9 +77,9 @@ cycode/cli/files_collector/sca/sbt/restore_sbt_dependencies.py,sha256=hlRoQWEFba
73
77
  cycode/cli/files_collector/sca/sca_code_scanner.py,sha256=E5cIBdjwrL2Exy7U6r9HiZX-ex86QeX7LCkDK2km2Sc,7145
74
78
  cycode/cli/files_collector/zip_documents.py,sha256=64ovgvzG7399bPWIg_g0T3KebSuFpRXZaxBTeNdJ17k,1873
75
79
  cycode/cli/main.py,sha256=TWZxfs7nu-zSm1YU4H801T_u16xeV3S-gZcb4gSSD24,387
76
- cycode/cli/models.py,sha256=y869G4jKPy81SPX9L3VM7gk7Kydw8XeejAGd4DJA-cw,2301
80
+ cycode/cli/models.py,sha256=-qR7YenbWQ42VohdoJED9GatKwREnuuae4p7wDmV9Ts,2305
77
81
  cycode/cli/printers/__init__.py,sha256=ALwAXSZy2lNXWC3NfCIxf8K0F6eFrbZa9PLZwPINi5E,93
78
- cycode/cli/printers/console_printer.py,sha256=EmztKipDc8e9SE16b7ZCpPDN5FH2j6lksY82j2dz_DY,2496
82
+ cycode/cli/printers/console_printer.py,sha256=C0FHTciocdQeSzanCehP6T-pQ89XLnZDntYGWMKHrhE,2810
79
83
  cycode/cli/printers/json_printer.py,sha256=r6SMAi16xFwpAB-q-tSHi1yrF3RQy_ZWeU4ZTXhRfLs,2511
80
84
  cycode/cli/printers/printer_base.py,sha256=mSSkUM9h5GvXW0LRwyp_lwKkPivR-LipJQdpNfA9uds,1636
81
85
  cycode/cli/printers/tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -89,7 +93,7 @@ cycode/cli/sentry.py,sha256=SQkssy2PvcfSpfyNzBJIibBxTCIqrQGU1W_SxnNpCjA,3610
89
93
  cycode/cli/user_settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
94
  cycode/cli/user_settings/base_file_manager.py,sha256=cMqTFq6lCMTC5tYFIopogvpZmj4Z_iMKzzHczJho5w0,549
91
95
  cycode/cli/user_settings/config_file_manager.py,sha256=PYn6MEaO63OJjN_bia8qMGYKG0m5L1Ubu-_MdWw1wU8,4939
92
- cycode/cli/user_settings/configuration_manager.py,sha256=F0w0xT2NlwxwpoAvDdKzyHHgpLmkodg4fkjSUiTT3vQ,7857
96
+ cycode/cli/user_settings/configuration_manager.py,sha256=VepwbC7wbbYThkX8gRSIm1ermpsAfY1Jp274F6R4bCU,8138
93
97
  cycode/cli/user_settings/credentials_manager.py,sha256=WyCL0tmXgMH3HxyVER-0f_nmEoT5PVX2Ym1PT5EIzfI,3153
94
98
  cycode/cli/user_settings/jwt_creator.py,sha256=xEkFLFqhwbNJnXuIi02XDxoj2E-4Nw-m10uJaHl3luA,745
95
99
  cycode/cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -116,12 +120,12 @@ cycode/cyclient/cycode_client_base.py,sha256=bDk4RsVQlfGFyr2KCGCXkdgaqcCGLOOeCP3
116
120
  cycode/cyclient/cycode_dev_based_client.py,sha256=JeAUZDVgptUs2LcWWvby2mfDf9JZBX7nZl8BBR6_jzc,670
117
121
  cycode/cyclient/cycode_token_based_client.py,sha256=tD_HWgkz0VDcU4AQsPxHxGTwfQ8KlpXGHNbyfRxu2jk,3779
118
122
  cycode/cyclient/headers.py,sha256=5KnigR9_1ifxW63z1iYgETfjD3D1v85jkth3oc2fERM,1434
119
- cycode/cyclient/models.py,sha256=5ka8hfIoO1wJMcaUXogdiaSJCgKdcwXIVIH-dNhIS9E,14262
123
+ cycode/cyclient/models.py,sha256=iUrTtQrIvls1kgtOadCa8QPzsvh8_kj2eZIX73FIIpk,14354
120
124
  cycode/cyclient/report_client.py,sha256=sNLOm64oaONz-TUBs6fpFfbb7RfxALPS6YBqadMo2-8,3971
121
- cycode/cyclient/scan_client.py,sha256=jISrjksprxGm0aKEqIS8hIhIHW86WBi5HfTiDTQjDg0,13879
125
+ cycode/cyclient/scan_client.py,sha256=BvoMiwgPImvdyp3n6qKwqGtWxjPkeb1JvBd3QphGkz0,14696
122
126
  cycode/cyclient/scan_config_base.py,sha256=sM69JOIt6Y0zFT-kp0KXSBjG8ViKl2Y2y6Fh95-57io,1642
123
- cycode-2.0.1.dev3.dist-info/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
124
- cycode-2.0.1.dev3.dist-info/METADATA,sha256=pPMkp5MjYmDoHJ6OfpeiyPx8xWfJpjDLfJx-pwg1vB0,45698
125
- cycode-2.0.1.dev3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
126
- cycode-2.0.1.dev3.dist-info/entry_points.txt,sha256=GKZlS6LtUdABDPd7-o9bwNSI5gYQnyA3qGrFFQKt3Vc,51
127
- cycode-2.0.1.dev3.dist-info/RECORD,,
127
+ cycode-2.0.1.dev4.dist-info/LICENCE,sha256=2Wx4N6mD_4xB7-E3hPkZ3MPhpJy__k_I8MaCSO-PDRo,1068
128
+ cycode-2.0.1.dev4.dist-info/METADATA,sha256=Dyw-25oMR7ilZle-pzodrzo9bxUL1Uflrd7Tj9XymRw,45768
129
+ cycode-2.0.1.dev4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
130
+ cycode-2.0.1.dev4.dist-info/entry_points.txt,sha256=GKZlS6LtUdABDPd7-o9bwNSI5gYQnyA3qGrFFQKt3Vc,51
131
+ cycode-2.0.1.dev4.dist-info/RECORD,,