iris-security-cli 0.2.14__tar.gz → 0.2.16__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.
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/PKG-INFO +5 -5
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/README.md +1 -1
- iris_security_cli-0.2.16/iris_cli/compliance_scan_cmd.py +216 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/explain.py +1 -1
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/main.py +28 -2
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/quickstart.py +2 -2
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/scm.py +1 -1
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/PKG-INFO +5 -5
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/SOURCES.txt +1 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/requires.txt +1 -1
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/pyproject.toml +4 -4
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/__init__.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/action_plan.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/assess.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/audit_log.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/cedar_parser.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/certify.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/compiler_config.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/compliance_check_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/compliance_fix.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/cost.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/declare.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/delegation.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/discover.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/dlp_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/drift.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/enforce.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/entitlements_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/evidence.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/framework_suggest.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/framework_test.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/hitl.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/license_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/list_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/mcp_server.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/models_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/onboarding_report.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/org_policy.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/policy_cache.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/policy_commit.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/policy_diff.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/policy_status.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/preview.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/redteam.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/regulatory.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/scan_govern.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/scan_report.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/sentinel.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/status_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/users.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/vault.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/watch.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_cli/witness.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/dependency_links.txt +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/entry_points.txt +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/top_level.txt +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/setup.cfg +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_audit_log.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_docs_pages_check.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_entitlements_display.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_evidence.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_evidence_export.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_evidence_query.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_framework_suggest.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_framework_test.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_hitl_cli.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_list_cmd.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_mcp_model_governance.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_policy_diff.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_quickstart.py +0 -0
- {iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/tests/test_vocabulary.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iris-security-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.16
|
|
4
4
|
Summary: IRIS CLI — declare, compile, preview, enforce, witness, certify, sentinel
|
|
5
5
|
License: Apache-2.0
|
|
6
|
-
Project-URL: Homepage, https://
|
|
7
|
-
Project-URL: Repository, https://github.com/
|
|
6
|
+
Project-URL: Homepage, https://github.com/gimartinb/iris-sdk
|
|
7
|
+
Project-URL: Repository, https://github.com/gimartinb/iris-sdk
|
|
8
8
|
Classifier: Development Status :: 3 - Alpha
|
|
9
9
|
Classifier: Intended Audience :: Developers
|
|
10
10
|
Classifier: Topic :: Security
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: iris-security-core>=0.1.16
|
|
19
|
-
Requires-Dist: iris-security-sdk>=0.2.
|
|
19
|
+
Requires-Dist: iris-security-sdk>=0.2.16
|
|
20
20
|
Requires-Dist: click>=8.1
|
|
21
21
|
Requires-Dist: rich>=13.0
|
|
22
22
|
Requires-Dist: pyyaml>=6.0
|
|
@@ -29,7 +29,7 @@ IRIS CLI — `iris scan`, `iris register`, `iris policy`, `iris compliance`.
|
|
|
29
29
|
|
|
30
30
|
Command-line tools for AI agent governance and Colorado AI Act compliance.
|
|
31
31
|
|
|
32
|
-
Part of the [IRIS SDK](https://github.com/
|
|
32
|
+
Part of the [IRIS SDK](https://github.com/gimartinb/iris-sdk).
|
|
33
33
|
|
|
34
34
|
## Install
|
|
35
35
|
|
|
@@ -4,7 +4,7 @@ IRIS CLI — `iris scan`, `iris register`, `iris policy`, `iris compliance`.
|
|
|
4
4
|
|
|
5
5
|
Command-line tools for AI agent governance and Colorado AI Act compliance.
|
|
6
6
|
|
|
7
|
-
Part of the [IRIS SDK](https://github.com/
|
|
7
|
+
Part of the [IRIS SDK](https://github.com/gimartinb/iris-sdk).
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""iris compliance scan — offline workload detection + local obligation eval."""
|
|
2
|
+
|
|
3
|
+
# Copyright 2024-2025 Gilbert Martin / IRIS Security, Inc.
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
# Author: Gilbert Martin <gilbert@iris-security.io>
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
import click
|
|
13
|
+
from rich.console import Console
|
|
14
|
+
from rich.panel import Panel
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
|
|
17
|
+
from iris.scan import detect_workload
|
|
18
|
+
from iris_core.compliance.workload_eval import (
|
|
19
|
+
applicable_frameworks,
|
|
20
|
+
evaluate_workload_profile,
|
|
21
|
+
top_recommended_actions,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
console = Console()
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _resolve_profile(
|
|
28
|
+
*,
|
|
29
|
+
scan_source: str | None,
|
|
30
|
+
path: str,
|
|
31
|
+
litellm_config: str | None,
|
|
32
|
+
litellm_proxy: str | None,
|
|
33
|
+
lookback_days: int,
|
|
34
|
+
) -> dict:
|
|
35
|
+
if scan_source is None:
|
|
36
|
+
return detect_workload(path)
|
|
37
|
+
|
|
38
|
+
if scan_source == "langfuse":
|
|
39
|
+
try:
|
|
40
|
+
from iris_langfuse import profile_from_langfuse
|
|
41
|
+
except ImportError as exc:
|
|
42
|
+
raise click.ClickException(
|
|
43
|
+
'iris-langfuse is not installed. Run: pip install "iris-langfuse[live]"'
|
|
44
|
+
) from exc
|
|
45
|
+
try:
|
|
46
|
+
return profile_from_langfuse(lookback_days=lookback_days)
|
|
47
|
+
except ImportError as exc:
|
|
48
|
+
raise click.ClickException(
|
|
49
|
+
'Langfuse SDK missing. Run: pip install "iris-langfuse[live]"'
|
|
50
|
+
) from exc
|
|
51
|
+
except ValueError as exc:
|
|
52
|
+
raise click.ClickException(str(exc)) from exc
|
|
53
|
+
|
|
54
|
+
if scan_source == "litellm":
|
|
55
|
+
try:
|
|
56
|
+
from iris_litellm import profile_from_litellm_config, profile_from_litellm_proxy
|
|
57
|
+
except ImportError as exc:
|
|
58
|
+
raise click.ClickException(
|
|
59
|
+
'iris-litellm is not installed. Run: pip install "iris-litellm[live]"'
|
|
60
|
+
) from exc
|
|
61
|
+
if litellm_config:
|
|
62
|
+
return profile_from_litellm_config(litellm_config)
|
|
63
|
+
if litellm_proxy:
|
|
64
|
+
return profile_from_litellm_proxy(litellm_proxy)
|
|
65
|
+
raise click.ClickException(
|
|
66
|
+
"LiteLLM source requires --config <litellm.config.yaml> or --proxy <base_url>"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
raise click.ClickException(f"Unknown scan source: {scan_source}")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _scan_subtitle(scan_source: str | None) -> str:
|
|
73
|
+
if scan_source == "langfuse":
|
|
74
|
+
return "Langfuse trace metadata — no prompt content read."
|
|
75
|
+
if scan_source == "litellm":
|
|
76
|
+
return "LiteLLM config/proxy — models and providers inferred."
|
|
77
|
+
return "Offline detection — no network calls required."
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _print_profile(profile: dict) -> None:
|
|
81
|
+
table = Table(title="What you're building", show_header=True, header_style="bold")
|
|
82
|
+
table.add_column("Attribute")
|
|
83
|
+
table.add_column("Detected values")
|
|
84
|
+
for key in (
|
|
85
|
+
"providers",
|
|
86
|
+
"frameworks",
|
|
87
|
+
"models",
|
|
88
|
+
"data_categories",
|
|
89
|
+
"deployment_regions",
|
|
90
|
+
"agent_count",
|
|
91
|
+
"autonomy_level",
|
|
92
|
+
"customer_facing",
|
|
93
|
+
):
|
|
94
|
+
value = profile.get(key, [])
|
|
95
|
+
if isinstance(value, bool):
|
|
96
|
+
display = "yes" if value else "no"
|
|
97
|
+
elif isinstance(value, list):
|
|
98
|
+
display = ", ".join(value) if value else "—"
|
|
99
|
+
else:
|
|
100
|
+
display = str(value)
|
|
101
|
+
table.add_row(key.replace("_", " ").title(), display)
|
|
102
|
+
console.print(table)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _print_frameworks(profile: dict) -> None:
|
|
106
|
+
table = Table(title="Applicable frameworks", show_header=True, header_style="bold")
|
|
107
|
+
table.add_column("Framework")
|
|
108
|
+
table.add_column("Triggered by")
|
|
109
|
+
for fw, reasons in applicable_frameworks(profile):
|
|
110
|
+
table.add_row(fw, ", ".join(reasons))
|
|
111
|
+
console.print(table)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _print_actions(obligations: list[dict]) -> None:
|
|
115
|
+
actions = top_recommended_actions(obligations, limit=5)
|
|
116
|
+
if not actions:
|
|
117
|
+
console.print("[dim]No obligations triggered for detected profile.[/dim]")
|
|
118
|
+
return
|
|
119
|
+
table = Table(title="Top recommended actions", show_header=True, header_style="bold")
|
|
120
|
+
table.add_column("#", style="dim")
|
|
121
|
+
table.add_column("Severity")
|
|
122
|
+
table.add_column("Framework")
|
|
123
|
+
table.add_column("Action")
|
|
124
|
+
for idx, action in enumerate(actions, 1):
|
|
125
|
+
sev = action.get("severity", "recommended")
|
|
126
|
+
color = {"blocker": "red", "required": "yellow"}.get(sev, "cyan")
|
|
127
|
+
table.add_row(
|
|
128
|
+
str(idx),
|
|
129
|
+
f"[{color}]{sev}[/{color}]",
|
|
130
|
+
action.get("framework_key", ""),
|
|
131
|
+
(action.get("recommended_action") or "")[:80],
|
|
132
|
+
)
|
|
133
|
+
console.print(table)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _push_profile(profile: dict) -> None:
|
|
137
|
+
api_key = os.environ.get("IRIS_API_KEY") or os.environ.get("IRIS_CLOUD_API_KEY")
|
|
138
|
+
base_url = os.environ.get("IRIS_API_URL", "http://localhost:8000")
|
|
139
|
+
if not api_key:
|
|
140
|
+
console.print("[yellow]Set IRIS_API_KEY to push profile to cloud.[/yellow]")
|
|
141
|
+
return
|
|
142
|
+
import httpx
|
|
143
|
+
|
|
144
|
+
response = httpx.post(
|
|
145
|
+
f"{base_url.rstrip('/')}/intelligence/profile/scan",
|
|
146
|
+
headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
|
|
147
|
+
json=profile,
|
|
148
|
+
timeout=30,
|
|
149
|
+
)
|
|
150
|
+
if response.status_code >= 400:
|
|
151
|
+
console.print(f"[red]Push failed ({response.status_code}): {response.text}[/red]")
|
|
152
|
+
return
|
|
153
|
+
console.print("[green]Profile pushed to IRIS Cloud.[/green]")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@click.command("scan")
|
|
157
|
+
@click.option("--path", default=".", help="Project path to scan (default local code scan)")
|
|
158
|
+
@click.option(
|
|
159
|
+
"--from",
|
|
160
|
+
"scan_source",
|
|
161
|
+
type=click.Choice(["langfuse", "litellm"], case_sensitive=False),
|
|
162
|
+
default=None,
|
|
163
|
+
help="Observability source instead of local code scan",
|
|
164
|
+
)
|
|
165
|
+
@click.option("--config", "litellm_config", type=click.Path(exists=True), help="LiteLLM config.yaml")
|
|
166
|
+
@click.option("--proxy", "litellm_proxy", help="LiteLLM proxy base URL")
|
|
167
|
+
@click.option("--lookback-days", default=30, show_default=True, help="Langfuse lookback window")
|
|
168
|
+
@click.option("--push", is_flag=True, help="POST profile to cloud when IRIS_API_KEY is set")
|
|
169
|
+
@click.option("--json", "as_json", is_flag=True, help="Output raw JSON")
|
|
170
|
+
def compliance_scan_cmd(
|
|
171
|
+
path: str,
|
|
172
|
+
scan_source: str | None,
|
|
173
|
+
litellm_config: str | None,
|
|
174
|
+
litellm_proxy: str | None,
|
|
175
|
+
lookback_days: int,
|
|
176
|
+
push: bool,
|
|
177
|
+
as_json: bool,
|
|
178
|
+
) -> None:
|
|
179
|
+
"""Detect workload attributes and evaluate local regulatory obligations (offline)."""
|
|
180
|
+
root = Path(path).resolve()
|
|
181
|
+
if scan_source is None and not root.exists():
|
|
182
|
+
raise click.ClickException(f"Path not found: {root}")
|
|
183
|
+
|
|
184
|
+
profile = _resolve_profile(
|
|
185
|
+
scan_source=scan_source,
|
|
186
|
+
path=str(root),
|
|
187
|
+
litellm_config=litellm_config,
|
|
188
|
+
litellm_proxy=litellm_proxy,
|
|
189
|
+
lookback_days=lookback_days,
|
|
190
|
+
)
|
|
191
|
+
obligations = evaluate_workload_profile(profile)
|
|
192
|
+
|
|
193
|
+
if as_json:
|
|
194
|
+
import json
|
|
195
|
+
|
|
196
|
+
click.echo(json.dumps({"profile": profile, "obligations": obligations}, indent=2))
|
|
197
|
+
if push:
|
|
198
|
+
_push_profile(profile)
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
console.print(
|
|
202
|
+
Panel(
|
|
203
|
+
"[bold]IRIS Compliance Intelligence Scan[/bold]\n"
|
|
204
|
+
+ _scan_subtitle(scan_source),
|
|
205
|
+
border_style="cyan",
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
_print_profile(profile)
|
|
209
|
+
_print_frameworks(profile)
|
|
210
|
+
_print_actions(obligations)
|
|
211
|
+
console.print(
|
|
212
|
+
"\n[dim]Continuous monitoring, evidence mapping, and team workflows: "
|
|
213
|
+
"iris cloud connect -> https://iris-security.io[/dim]"
|
|
214
|
+
)
|
|
215
|
+
if push:
|
|
216
|
+
_push_profile(profile)
|
|
@@ -30,7 +30,7 @@ Your existing tests will pass without modification.
|
|
|
30
30
|
|
|
31
31
|
To verify: run your test suite after adding IRIS.
|
|
32
32
|
If any test fails, report it as a bug at:
|
|
33
|
-
github.com/
|
|
33
|
+
github.com/gimartinb/iris-sdk/issues"""
|
|
34
34
|
|
|
35
35
|
TECHNICAL_EXPLANATION = """\
|
|
36
36
|
Proxy pattern (identical attribute forwarding):
|
|
@@ -17,6 +17,7 @@ Every iris scan or iris certify is a weekly active developer event.
|
|
|
17
17
|
import click
|
|
18
18
|
import sys
|
|
19
19
|
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
20
21
|
from rich.console import Console
|
|
21
22
|
from rich.panel import Panel
|
|
22
23
|
|
|
@@ -25,9 +26,31 @@ from iris_core.cli_timing.instrument import timed_cli_command
|
|
|
25
26
|
console = Console()
|
|
26
27
|
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
class IrisCLI(click.Group):
|
|
30
|
+
"""Click group that records daily aggregated CLI usage after each command."""
|
|
31
|
+
|
|
32
|
+
def invoke(self, ctx: click.Context) -> Any:
|
|
33
|
+
result = super().invoke(ctx)
|
|
34
|
+
if not ctx.resilient_parsing:
|
|
35
|
+
command = self._resolved_command(ctx)
|
|
36
|
+
if command:
|
|
37
|
+
from iris._telemetry import maybe_record_cli_usage
|
|
38
|
+
|
|
39
|
+
maybe_record_cli_usage(command)
|
|
40
|
+
return result
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def _resolved_command(ctx: click.Context) -> str | None:
|
|
44
|
+
if ctx.invoked_subcommand is None:
|
|
45
|
+
return None
|
|
46
|
+
if ctx.command_path:
|
|
47
|
+
return " ".join(ctx.command_path)
|
|
48
|
+
return ctx.invoked_subcommand
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@click.group(cls=IrisCLI)
|
|
29
52
|
@click.version_option(
|
|
30
|
-
version="0.2.
|
|
53
|
+
version="0.2.16",
|
|
31
54
|
prog_name="iris",
|
|
32
55
|
message="%(prog)s %(version)s · AARM Core conformant (R1–R6) · "
|
|
33
56
|
"AIUC-1 Q1 2026 aligned · https://iris-security.io",
|
|
@@ -560,6 +583,9 @@ def ping():
|
|
|
560
583
|
from iris_cli.compliance_check_cmd import compliance_check_cmd
|
|
561
584
|
compliance.add_command(compliance_check_cmd, name="check")
|
|
562
585
|
|
|
586
|
+
from iris_cli.compliance_scan_cmd import compliance_scan_cmd
|
|
587
|
+
compliance.add_command(compliance_scan_cmd, name="scan")
|
|
588
|
+
|
|
563
589
|
cli.add_command(compliance)
|
|
564
590
|
cli.add_command(framework)
|
|
565
591
|
|
|
@@ -167,7 +167,7 @@ def _print_welcome() -> None:
|
|
|
167
167
|
" · How to register and govern a new agent\n"
|
|
168
168
|
" · Your compliance score in real time\n\n"
|
|
169
169
|
"No API key required for most steps.\n"
|
|
170
|
-
"github.com/
|
|
170
|
+
"github.com/gimartinb/iris-sdk",
|
|
171
171
|
title="Welcome to IRIS",
|
|
172
172
|
style="blue",
|
|
173
173
|
)
|
|
@@ -363,7 +363,7 @@ def _print_summary(findings_count: int) -> None:
|
|
|
363
363
|
" [cyan]from iris_anthropic import IrisAnthropic[/cyan]\n"
|
|
364
364
|
" [cyan]client = IrisAnthropic(passport=passport)[/cyan]\n\n"
|
|
365
365
|
" 4. Read the full guide:\n"
|
|
366
|
-
" github.com/
|
|
366
|
+
" github.com/gimartinb/iris-sdk/blob/main/QUICKSTART.md\n\n"
|
|
367
367
|
"Questions? gilbert.martin@gmail.com",
|
|
368
368
|
title="Quickstart complete",
|
|
369
369
|
style="green",
|
|
@@ -330,7 +330,7 @@ Step 1: Go to github.com/organizations/{org_name}/settings/apps
|
|
|
330
330
|
Step 2: Click "New GitHub App"
|
|
331
331
|
Step 3: Fill in:
|
|
332
332
|
Name: IRIS Governance
|
|
333
|
-
Homepage URL: https://github.com/
|
|
333
|
+
Homepage URL: https://github.com/gimartinb/iris-sdk
|
|
334
334
|
Webhook: leave unchecked for now
|
|
335
335
|
Step 4: Set permissions (read-only):
|
|
336
336
|
Repository permissions:
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: iris-security-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.16
|
|
4
4
|
Summary: IRIS CLI — declare, compile, preview, enforce, witness, certify, sentinel
|
|
5
5
|
License: Apache-2.0
|
|
6
|
-
Project-URL: Homepage, https://
|
|
7
|
-
Project-URL: Repository, https://github.com/
|
|
6
|
+
Project-URL: Homepage, https://github.com/gimartinb/iris-sdk
|
|
7
|
+
Project-URL: Repository, https://github.com/gimartinb/iris-sdk
|
|
8
8
|
Classifier: Development Status :: 3 - Alpha
|
|
9
9
|
Classifier: Intended Audience :: Developers
|
|
10
10
|
Classifier: Topic :: Security
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/markdown
|
|
18
18
|
Requires-Dist: iris-security-core>=0.1.16
|
|
19
|
-
Requires-Dist: iris-security-sdk>=0.2.
|
|
19
|
+
Requires-Dist: iris-security-sdk>=0.2.16
|
|
20
20
|
Requires-Dist: click>=8.1
|
|
21
21
|
Requires-Dist: rich>=13.0
|
|
22
22
|
Requires-Dist: pyyaml>=6.0
|
|
@@ -29,7 +29,7 @@ IRIS CLI — `iris scan`, `iris register`, `iris policy`, `iris compliance`.
|
|
|
29
29
|
|
|
30
30
|
Command-line tools for AI agent governance and Colorado AI Act compliance.
|
|
31
31
|
|
|
32
|
-
Part of the [IRIS SDK](https://github.com/
|
|
32
|
+
Part of the [IRIS SDK](https://github.com/gimartinb/iris-sdk).
|
|
33
33
|
|
|
34
34
|
## Install
|
|
35
35
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "iris-security-cli"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.16"
|
|
8
8
|
description = "IRIS CLI — declare, compile, preview, enforce, witness, certify, sentinel"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "Apache-2.0" }
|
|
@@ -21,7 +21,7 @@ classifiers = [
|
|
|
21
21
|
]
|
|
22
22
|
dependencies = [
|
|
23
23
|
"iris-security-core>=0.1.16",
|
|
24
|
-
"iris-security-sdk>=0.2.
|
|
24
|
+
"iris-security-sdk>=0.2.16",
|
|
25
25
|
"click>=8.1",
|
|
26
26
|
"rich>=13.0",
|
|
27
27
|
"pyyaml>=6.0",
|
|
@@ -31,8 +31,8 @@ dependencies = [
|
|
|
31
31
|
scm = ["iris-security-scm[all]>=0.2.0"]
|
|
32
32
|
|
|
33
33
|
[project.urls]
|
|
34
|
-
Homepage = "https://
|
|
35
|
-
Repository = "https://github.com/
|
|
34
|
+
Homepage = "https://github.com/gimartinb/iris-sdk"
|
|
35
|
+
Repository = "https://github.com/gimartinb/iris-sdk"
|
|
36
36
|
|
|
37
37
|
[project.scripts]
|
|
38
38
|
iris = "iris_cli.main:cli"
|
|
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
|
|
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
|
{iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{iris_security_cli-0.2.14 → iris_security_cli-0.2.16}/iris_security_cli.egg-info/top_level.txt
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
|