kekkai-cli 1.0.5__py3-none-any.whl → 1.1.1__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.
Files changed (53) hide show
  1. kekkai/cli.py +789 -19
  2. kekkai/compliance/__init__.py +68 -0
  3. kekkai/compliance/hipaa.py +235 -0
  4. kekkai/compliance/mappings.py +136 -0
  5. kekkai/compliance/owasp.py +517 -0
  6. kekkai/compliance/owasp_agentic.py +267 -0
  7. kekkai/compliance/pci_dss.py +205 -0
  8. kekkai/compliance/soc2.py +209 -0
  9. kekkai/dojo.py +91 -14
  10. kekkai/dojo_import.py +9 -1
  11. kekkai/fix/__init__.py +47 -0
  12. kekkai/fix/audit.py +278 -0
  13. kekkai/fix/differ.py +427 -0
  14. kekkai/fix/engine.py +500 -0
  15. kekkai/fix/prompts.py +251 -0
  16. kekkai/output.py +10 -12
  17. kekkai/report/__init__.py +41 -0
  18. kekkai/report/compliance_matrix.py +98 -0
  19. kekkai/report/generator.py +365 -0
  20. kekkai/report/html.py +69 -0
  21. kekkai/report/pdf.py +63 -0
  22. kekkai/report/unified.py +226 -0
  23. kekkai/scanners/container.py +33 -3
  24. kekkai/scanners/gitleaks.py +3 -1
  25. kekkai/scanners/semgrep.py +1 -1
  26. kekkai/scanners/trivy.py +1 -1
  27. kekkai/threatflow/model_adapter.py +143 -1
  28. kekkai/triage/__init__.py +54 -1
  29. kekkai/triage/loader.py +196 -0
  30. kekkai_cli-1.1.1.dist-info/METADATA +379 -0
  31. {kekkai_cli-1.0.5.dist-info → kekkai_cli-1.1.1.dist-info}/RECORD +34 -33
  32. {kekkai_cli-1.0.5.dist-info → kekkai_cli-1.1.1.dist-info}/entry_points.txt +0 -1
  33. {kekkai_cli-1.0.5.dist-info → kekkai_cli-1.1.1.dist-info}/top_level.txt +0 -1
  34. kekkai_cli-1.0.5.dist-info/METADATA +0 -135
  35. portal/__init__.py +0 -19
  36. portal/api.py +0 -155
  37. portal/auth.py +0 -103
  38. portal/enterprise/__init__.py +0 -32
  39. portal/enterprise/audit.py +0 -435
  40. portal/enterprise/licensing.py +0 -342
  41. portal/enterprise/rbac.py +0 -276
  42. portal/enterprise/saml.py +0 -595
  43. portal/ops/__init__.py +0 -53
  44. portal/ops/backup.py +0 -553
  45. portal/ops/log_shipper.py +0 -469
  46. portal/ops/monitoring.py +0 -517
  47. portal/ops/restore.py +0 -469
  48. portal/ops/secrets.py +0 -408
  49. portal/ops/upgrade.py +0 -591
  50. portal/tenants.py +0 -340
  51. portal/uploads.py +0 -259
  52. portal/web.py +0 -384
  53. {kekkai_cli-1.0.5.dist-info → kekkai_cli-1.1.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,196 @@
1
+ """Triage findings loader with scanner format detection.
2
+
3
+ Supports loading findings from:
4
+ - Native triage JSON (list or {"findings": [...]})
5
+ - Raw scanner outputs (Semgrep/Trivy/Gitleaks)
6
+ - Run directories (aggregates all *-results.json)
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ from pathlib import Path
13
+ from typing import TYPE_CHECKING, Any
14
+
15
+ if TYPE_CHECKING:
16
+ from ..scanners.base import Finding
17
+ from ..scanners.base import Severity as ScannerSeverity
18
+
19
+ from .models import FindingEntry
20
+ from .models import Severity as TriageSeverity
21
+
22
+ __all__ = [
23
+ "load_findings_from_path",
24
+ ]
25
+
26
+ # Size limits for DoS mitigation (ASVS V10.3.3)
27
+ MAX_FILE_SIZE_MB = 200
28
+ WARN_FILE_SIZE_MB = 50
29
+
30
+
31
+ def load_findings_from_path(
32
+ path: Path,
33
+ ) -> tuple[list[FindingEntry], list[str]]:
34
+ """Load findings from file or directory.
35
+
36
+ Supports:
37
+ - Unified report (kekkai-report.json) - PREFERRED
38
+ - Native triage JSON (list or {"findings": [...]})
39
+ - Raw scanner outputs (Semgrep/Trivy/Gitleaks)
40
+ - Run directories (aggregates all *-results.json)
41
+
42
+ Priority:
43
+ 1. kekkai-report.json (unified report)
44
+ 2. *-results.json (individual scanner outputs)
45
+ 3. Any other JSON files (excluding metadata)
46
+
47
+ Args:
48
+ path: Path to findings file or run directory.
49
+
50
+ Returns:
51
+ Tuple of (findings, error_messages).
52
+ Error messages include filename only (no full paths) per ASVS V7.4.1.
53
+ """
54
+ errors: list[str] = []
55
+
56
+ # Determine input type
57
+ if path.is_dir():
58
+ # Priority 1: Check for unified report first
59
+ unified_report = path / "kekkai-report.json"
60
+ if unified_report.exists():
61
+ files = [unified_report]
62
+ else:
63
+ # Priority 2: Prefer canonical scan outputs
64
+ files = sorted(path.glob("*-results.json"))
65
+ if not files:
66
+ # Priority 3: Fallback to all JSON (excluding metadata files)
67
+ files = sorted(
68
+ [
69
+ p
70
+ for p in path.glob("*.json")
71
+ if p.name not in ("run.json", "policy-result.json")
72
+ ]
73
+ )
74
+ else:
75
+ files = [path]
76
+
77
+ findings: list[FindingEntry] = []
78
+ for file in files:
79
+ # Check if file exists first
80
+ if not file.exists():
81
+ errors.append(f"{file.name}: OSError")
82
+ continue
83
+
84
+ # Size check (DoS mitigation per ASVS V10.3.3)
85
+ size_mb = file.stat().st_size / (1024 * 1024)
86
+ if size_mb > MAX_FILE_SIZE_MB:
87
+ msg = f"{file.name}: file too large ({size_mb:.1f} MB, max {MAX_FILE_SIZE_MB} MB)"
88
+ errors.append(msg)
89
+ continue
90
+
91
+ try:
92
+ content = file.read_text(encoding="utf-8")
93
+ if not content.strip():
94
+ continue
95
+ data = json.loads(content)
96
+ except (OSError, json.JSONDecodeError) as exc:
97
+ # ASVS V7.4.1: Don't leak full path, only filename
98
+ errors.append(f"{file.name}: {type(exc).__name__}")
99
+ continue
100
+
101
+ # Detect format and parse
102
+ try:
103
+ batch = _parse_findings(data, file.stem)
104
+ findings.extend(batch)
105
+ except Exception as exc:
106
+ errors.append(f"{file.name}: unsupported format ({str(exc)[:50]})")
107
+
108
+ # Deduplicate by stable key
109
+ seen: set[str] = set()
110
+ deduped: list[FindingEntry] = []
111
+ for f in findings:
112
+ key = f"{f.scanner}:{f.rule_id}:{f.file_path}:{f.line}"
113
+ if key not in seen:
114
+ seen.add(key)
115
+ deduped.append(f)
116
+
117
+ return deduped, errors
118
+
119
+
120
+ def _parse_findings(data: Any, stem: str) -> list[FindingEntry]:
121
+ """Parse findings from JSON data.
122
+
123
+ Args:
124
+ data: Parsed JSON data.
125
+ stem: File stem (used to detect scanner type).
126
+
127
+ Returns:
128
+ List of FindingEntry objects.
129
+
130
+ Raises:
131
+ ValueError: If format is unknown or scanner not found.
132
+ """
133
+ # Try native triage format first (ASVS V5.1.2: strongly typed validation)
134
+ if isinstance(data, list) and data and isinstance(data[0], dict) and "scanner" in data[0]:
135
+ return [FindingEntry.from_dict(item) for item in data]
136
+
137
+ if isinstance(data, dict) and "findings" in data:
138
+ findings_data = data["findings"]
139
+ if isinstance(findings_data, list):
140
+ return [FindingEntry.from_dict(item) for item in findings_data]
141
+
142
+ # Try scanner-specific format
143
+ scanner_name = stem.replace("-results", "")
144
+
145
+ # Lazy import to avoid circular dependency
146
+ from ..cli import _create_scanner
147
+
148
+ scanner = _create_scanner(scanner_name)
149
+ if not scanner:
150
+ raise ValueError(f"Unknown scanner: {scanner_name}")
151
+
152
+ # Use canonical scanner parser (reuses validated logic)
153
+ raw_json = json.dumps(data)
154
+ canonical_findings = scanner.parse(raw_json)
155
+
156
+ # Convert to triage format
157
+ return [_finding_to_entry(f) for f in canonical_findings]
158
+
159
+
160
+ def _finding_to_entry(f: Finding) -> FindingEntry:
161
+ """Convert scanner Finding to triage FindingEntry.
162
+
163
+ Args:
164
+ f: Scanner Finding object.
165
+
166
+ Returns:
167
+ Triage FindingEntry object.
168
+ """
169
+ return FindingEntry(
170
+ id=f.dedupe_hash(),
171
+ title=f.title,
172
+ severity=_map_severity(f.severity),
173
+ scanner=f.scanner,
174
+ file_path=f.file_path or "",
175
+ line=f.line,
176
+ description=f.description,
177
+ rule_id=f.rule_id or "",
178
+ )
179
+
180
+
181
+ def _map_severity(s: ScannerSeverity) -> TriageSeverity:
182
+ """Map scanner Severity to triage Severity.
183
+
184
+ Both use the same enum values, just different type namespaces.
185
+
186
+ Args:
187
+ s: Scanner severity enum.
188
+
189
+ Returns:
190
+ Triage severity enum.
191
+ """
192
+ try:
193
+ return TriageSeverity(s.value)
194
+ except ValueError:
195
+ # Fallback to INFO for unknown severities
196
+ return TriageSeverity.INFO
@@ -0,0 +1,379 @@
1
+ Metadata-Version: 2.4
2
+ Name: kekkai-cli
3
+ Version: 1.1.1
4
+ Summary: Kekkai monorepo (local-first AppSec orchestration + compliance checker)
5
+ Requires-Python: >=3.12
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: rich>=13.0.0
8
+ Requires-Dist: jsonschema>=4.20.0
9
+ Requires-Dist: textual>=0.50.0
10
+ Requires-Dist: httpx>=0.24.0
11
+
12
+ <p align="center">
13
+ <img src="https://raw.githubusercontent.com/kademoslabs/assets/main/logos/kekkai-slim.png" alt="Kekkai CLI Logo" width="250"/>
14
+ </p>
15
+
16
+ <p align="center"><strong>Security orchestration at developer speed.</strong></p>
17
+ <p align="center"><i>One tool for the entire AppSec lifecycle: Predict, Detect, Triage, Manage.</i></p>
18
+
19
+ <p align="center">
20
+ <img src="https://img.shields.io/github/actions/workflow/status/kademoslabs/kekkai/docker-publish.yml?logo=github"/>
21
+ <img src="https://img.shields.io/circleci/build/github/kademoslabs/kekkai?logo=circleci"/>
22
+ <img src="https://img.shields.io/pypi/v/kekkai-cli?pypiBaseUrl=https%3A%2F%2Fpypi.org&logo=pypi"/>
23
+ </p>
24
+
25
+ ---
26
+
27
+ # Kekkai
28
+
29
+ Stop juggling security tools. **Kekkai orchestrates your entire AppSec lifecycle** — from AI-powered threat modeling to vulnerability management — in a single CLI.
30
+
31
+ ![Hero GIF](https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/kekkai-start.gif)
32
+
33
+ ---
34
+
35
+ ## The Five Pillars
36
+
37
+ | Pillar | Feature | Command | Description |
38
+ |--------|---------|---------|-------------|
39
+ | 🔮 **Predict** | AI Threat Modeling | `kekkai threatflow` | Generate STRIDE threat models before writing code |
40
+ | 🔍 **Detect** | Unified Scanning | `kekkai scan` | Run Trivy, Semgrep, Gitleaks in isolated containers |
41
+ | ✅ **Triage** | Interactive Review | `kekkai triage` | Review findings in a terminal UI, mark false positives |
42
+ | 🚦 **Gate** | CI/CD Policy | `kekkai scan --ci` | Break builds on severity thresholds |
43
+ | 📊 **Manage** | DefectDojo | `kekkai dojo up` | Spin up vulnerability management in 60 seconds |
44
+
45
+ ---
46
+
47
+ ## Quick Start (60 Seconds)
48
+
49
+ ### 1. Install
50
+
51
+ ```bash
52
+ pipx install kekkai-cli
53
+ ```
54
+
55
+ ### 2. Predict (Threat Model)
56
+
57
+ ```bash
58
+ kekkai threatflow --repo . --model-mode local
59
+ # Generates THREATS.md with STRIDE analysis and Data Flow Diagram
60
+ ```
61
+
62
+ ### 3. Detect (Scan)
63
+
64
+ ```bash
65
+ kekkai scan
66
+ # Runs Trivy (CVEs), Semgrep (code), Gitleaks (secrets)
67
+ # Outputs unified kekkai-report.json
68
+ ```
69
+
70
+ ### 4. Triage (Review)
71
+
72
+ ```bash
73
+ kekkai triage
74
+ # Interactive TUI to accept, reject, or ignore findings
75
+ ```
76
+
77
+ ### 5. Manage (DefectDojo)
78
+
79
+ ```bash
80
+ kekkai dojo up --wait
81
+ kekkai upload
82
+ # Full vulnerability management platform + automated import
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Why Kekkai?
88
+
89
+ | Capability | Manual Approach | Kekkai |
90
+ |------------|-----------------|--------|
91
+ | **Tooling** | Install/update 5+ tools individually | One binary, auto-pulls scanner containers |
92
+ | **Output** | Parse 5 different JSON formats | Unified `kekkai-report.json` |
93
+ | **Threat Modeling** | Expensive consultants or whiteboarding | AI-generated `THREATS.md` locally |
94
+ | **DefectDojo** | 200-line docker-compose + debugging | `kekkai dojo up` (one command) |
95
+ | **Triage** | Read JSON files manually | Interactive terminal UI |
96
+ | **CI/CD** | Complex bash scripts | `kekkai scan --ci --fail-on high` |
97
+ | **PR Feedback** | Manual security review comments | Auto-comments on GitHub PRs |
98
+
99
+ ---
100
+
101
+ ## Feature Deep Dives
102
+
103
+ ### 🔮 ThreatFlow — AI-Powered Threat Modeling
104
+
105
+ Generate STRIDE-aligned threat models and Mermaid.js Data Flow Diagrams from your codebase.
106
+
107
+ ![Hero GIF](https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/kekkai-threatflow.gif)
108
+
109
+ ```bash
110
+ # Ollama (recommended - easy setup, privacy-preserving)
111
+ ollama pull mistral
112
+ kekkai threatflow --repo . --model-mode ollama --model-name mistral
113
+
114
+ # Local GGUF model (requires llama-cpp-python)
115
+ kekkai threatflow --repo . --model-mode local --model-path ./mistral-7b.gguf
116
+
117
+ # Remote API (faster, requires API key)
118
+ export KEKKAI_THREATFLOW_API_KEY="sk-..."
119
+ kekkai threatflow --repo . --model-mode openai
120
+ ```
121
+
122
+ **Output:** `THREATS.md` containing:
123
+ - Attack surface analysis
124
+ - STRIDE threat classification
125
+ - Mermaid.js architecture diagram
126
+ - Recommended mitigations
127
+
128
+ [Full ThreatFlow Documentation →](docs/threatflow/README.md)
129
+
130
+ ---
131
+
132
+ ### 🔍 Unified Scanning
133
+
134
+ Run industry-standard scanners without installing them individually. Each scanner runs in an isolated Docker container with security hardening.
135
+
136
+ ```bash
137
+ kekkai scan # Scan current directory
138
+ kekkai scan --repo /path/to/project # Scan specific path
139
+ kekkai scan --output results.json # Custom output path
140
+ ```
141
+
142
+ **Scanners Included:**
143
+ | Scanner | Finds | Image |
144
+ |---------|-------|-------|
145
+ | Trivy | CVEs in dependencies | `aquasec/trivy:latest` |
146
+ | Semgrep | Code vulnerabilities | `semgrep/semgrep:latest` |
147
+ | Gitleaks | Hardcoded secrets | `zricethezav/gitleaks:latest` |
148
+
149
+ **Container Security:**
150
+ - Read-only filesystem
151
+ - No network access
152
+ - Memory limited (2GB)
153
+ - No privilege escalation
154
+
155
+ ---
156
+
157
+ ### ✅ Interactive Triage TUI
158
+
159
+ Stop reading JSON. Review security findings in your terminal.
160
+
161
+ ```bash
162
+ kekkai triage
163
+ ```
164
+
165
+ **Features:**
166
+ - Navigate findings with keyboard
167
+ - Mark as: Accept, Reject, False Positive, Ignore
168
+ - Filter by severity, scanner, or status
169
+ - Persist decisions in `.kekkai-ignore`
170
+ - Export triaged results
171
+
172
+ <!-- Screenshot placeholder: ![Triage TUI](https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/triage-tui.png) -->
173
+
174
+ [Full Triage Documentation →](docs/triage/README.md)
175
+
176
+ ---
177
+
178
+ ### 🚦 CI/CD Policy Gate
179
+
180
+ Automate security enforcement in your pipelines.
181
+
182
+ <p align="center">
183
+ <img src="https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/kekkai-scan.png" alt="Kekkai Scanning" width="650"/>
184
+ </p>
185
+
186
+ ```bash
187
+ # Fail on any critical or high findings
188
+ kekkai scan --ci --fail-on high
189
+
190
+ # Fail only on critical
191
+ kekkai scan --ci --fail-on critical
192
+
193
+ # Custom threshold: fail on 5+ medium findings
194
+ kekkai scan --ci --fail-on medium --max-findings 5
195
+ ```
196
+
197
+ **Exit Codes:**
198
+ | Code | Meaning |
199
+ |------|---------|
200
+ | 0 | No findings above threshold |
201
+ | 1 | Findings exceed threshold |
202
+ | 2 | Scanner error |
203
+
204
+ **GitHub Actions Example:**
205
+
206
+ ```yaml
207
+ - name: Security Scan
208
+ run: |
209
+ pipx install kekkai-cli
210
+ kekkai scan --ci --fail-on high
211
+ ```
212
+
213
+ [Full CI Documentation →](docs/ci/ci-mode.md)
214
+
215
+ ---
216
+
217
+ ### 📊 DefectDojo Integration
218
+
219
+ Spin up a complete vulnerability management platform locally.
220
+
221
+ <p align="center">
222
+ <img src="https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/kekkai-dojo.png" alt="Kekkai Dojo" width="650"/>
223
+ </p>
224
+
225
+ ```bash
226
+ kekkai dojo up --wait # Start DefectDojo (Nginx, Postgres, Redis, Celery)
227
+ kekkai dojo status # Check service health
228
+ kekkai upload # Import scan results
229
+ kekkai dojo down # Stop and clean up (removes volumes)
230
+ ```
231
+
232
+ **What You Get:**
233
+ - DefectDojo web UI at `http://localhost:8080`
234
+ - Automatic credential generation
235
+ - Pre-configured for Kekkai imports
236
+ - Clean teardown (no orphaned volumes)
237
+
238
+ <p align="center">
239
+ <img src="https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/Active-Engagements-kekkai-dojo.png" alt="Kekkai Dojo" width="850"/>
240
+ </p>
241
+
242
+ <p align="center">
243
+ <img src="https://raw.githubusercontent.com/kademoslabs/assets/main/screenshots/kekkai-dojo-dashboard-findings.png" alt="Kekkai Dojo" width="850"/>
244
+ </p
245
+
246
+ [Full Dojo Documentation →](docs/dojo/dojo.md)
247
+
248
+ ---
249
+
250
+ ### 🔔 GitHub PR Comments
251
+
252
+ Get security feedback directly in pull requests.
253
+
254
+ ```bash
255
+ export GITHUB_TOKEN="ghp_..."
256
+ kekkai scan --github-comment
257
+ ```
258
+
259
+ Kekkai will:
260
+ 1. Run all scanners
261
+ 2. Post findings as PR review comments
262
+ 3. Annotate specific lines with inline comments
263
+
264
+ ---
265
+
266
+ ## Installation
267
+
268
+ ### pipx (Recommended)
269
+
270
+ Isolated environment, no conflicts with system Python.
271
+
272
+ ```bash
273
+ pipx install kekkai-cli
274
+ ```
275
+
276
+ ### Homebrew (macOS/Linux)
277
+
278
+ ```bash
279
+ brew install kademoslabs/tap/kekkai
280
+ ```
281
+
282
+ ### Scoop (Windows)
283
+
284
+ ```bash
285
+ scoop bucket add kademoslabs https://github.com/kademoslabs/scoop-bucket
286
+ scoop install kekkai
287
+ ```
288
+
289
+ ### Docker (No Python Required)
290
+
291
+ ```bash
292
+ docker pull kademoslabs/kekkai:latest
293
+ alias kekkai='docker run --rm -v "$(pwd):/repo" kademoslabs/kekkai:latest'
294
+ ```
295
+
296
+ ### pip (Traditional)
297
+
298
+ ```bash
299
+ pip install kekkai-cli
300
+ ```
301
+
302
+ ---
303
+
304
+ ## Enterprise Features
305
+
306
+ For organizations that need advanced capabilities, **Kekkai Enterprise** provides:
307
+
308
+ | Feature | Description |
309
+ |---------|-------------|
310
+ | **Multi-Tenant Portal** | Web dashboard for managing multiple teams/projects ([Learn More](docs/portal/README.md)) |
311
+ | **SAML 2.0 SSO** | Integrate with Okta, Azure AD, Google Workspace |
312
+ | **Role-Based Access Control** | Fine-grained permissions per team/project |
313
+ | **Advanced Operations** | Automated backup/restore, monitoring, zero-downtime upgrades ([Learn More](docs/ops/README.md)) |
314
+ | **Compliance Reporting** | Map findings to OWASP, PCI-DSS, HIPAA, SOC 2 |
315
+ | **Audit Logging** | Cryptographically signed compliance trails |
316
+
317
+ **Architecture:**
318
+ - Open-source CLI remains fully functional standalone
319
+ - Enterprise features available in separate private repository for licensed customers
320
+ - Optional integration: CLI can sync results to enterprise portal
321
+ - Self-hosted or Kademos-managed deployment options
322
+
323
+ [Contact us for enterprise access →](mailto:sales@kademos.org)
324
+
325
+ ---
326
+
327
+ ## Security
328
+
329
+ Kekkai is designed with security as a core principle:
330
+
331
+ - **Container Isolation**: Scanners run in hardened Docker containers
332
+ - **No Network Access**: Containers cannot reach external networks
333
+ - **Local-First AI**: ThreatFlow can run entirely on your machine
334
+ - **SLSA Level 3**: Release artifacts include provenance attestations
335
+ - **Signed Images**: Docker images are Cosign-signed
336
+
337
+ For vulnerability reports, see [SECURITY.md](SECURITY.md).
338
+
339
+ ---
340
+
341
+ ## Documentation
342
+
343
+ | Guide | Description |
344
+ |-------|-------------|
345
+ | [Installation](docs/README.md#installation-methods) | All installation methods |
346
+ | [ThreatFlow](docs/threatflow/README.md) | AI threat modeling setup |
347
+ | [Dojo Quick Start](docs/dojo/dojo-quickstart.md) | DefectDojo in 5 minutes |
348
+ | [CI Mode](docs/ci/ci-mode.md) | Pipeline integration |
349
+ | [Portal](docs/portal/README.md) | Enterprise features overview |
350
+ | [Portal SSO](docs/portal/saml-setup.md) | SAML 2.0 SSO configuration |
351
+ | [Portal RBAC](docs/portal/rbac.md) | Role-based access control |
352
+ | [Portal Deployment](docs/portal/deployment.md) | Self-hosted deployment |
353
+ | [Security](docs/security/slsa-provenance.md) | SLSA provenance verification |
354
+
355
+ ---
356
+
357
+ ## CI/CD Status
358
+
359
+ [![Kekkai Security Scan](https://github.com/kademoslabs/kekkai/actions/workflows/kekkai-pr-scan.yml/badge.svg)](https://github.com/kademoslabs/kekkai/actions/workflows/kekkai-pr-scan.yml)
360
+ [![Docker Image Publish](https://github.com/kademoslabs/kekkai/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/kademoslabs/kekkai/actions/workflows/docker-publish.yml)
361
+ [![Docker Security Scan](https://github.com/kademoslabs/kekkai/actions/workflows/docker-security-scan.yml/badge.svg)](https://github.com/kademoslabs/kekkai/actions/workflows/docker-security-scan.yml)
362
+ [![Cross-Platform Tests](https://github.com/kademoslabs/kekkai/actions/workflows/test-cross-platform.yml/badge.svg)](https://github.com/kademoslabs/kekkai/actions/workflows/test-cross-platform.yml)
363
+ [![Release with SLSA Provenance](https://github.com/kademoslabs/kekkai/actions/workflows/release-slsa.yml/badge.svg)](https://github.com/kademoslabs/kekkai/actions/workflows/release-slsa.yml)
364
+
365
+ ---
366
+
367
+ ## Contributing
368
+
369
+ We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
370
+
371
+ ---
372
+
373
+ ## License
374
+
375
+ Apache-2.0 — See [LICENSE](LICENSE) for details.
376
+
377
+ ---
378
+
379
+ <p align="center"><i>Built by <a href="https://kademos.org">Kademos Labs</a></i></p>
@@ -1,13 +1,25 @@
1
1
  kekkai/__init__.py,sha256=_VrBvJRyqHiXs31S8HOhATk_O2iy-ac0_9X7rHH75j8,143
2
- kekkai/cli.py,sha256=f_IsxjlmzYKwl_x_BNIlVYBnBnSNfKskwclJdGwhWAo,35705
2
+ kekkai/cli.py,sha256=-Kix3HMEsroCgtOLu-QCtPwi7OqOSi3YzXzboT5tGvU,63529
3
3
  kekkai/config.py,sha256=LE7bKsmv5dim5KnZya0V7_LtviNQ1V0pMN_6FyAsMpc,13084
4
- kekkai/dojo.py,sha256=DchLaTnDBwX0D14lTRdCtwql_II8aDEZ0JEq9F-n4MI,15887
5
- kekkai/dojo_import.py,sha256=oI-vwpLITA7-U2_MxhaTp_PYfr5HqvcFy3VzKsWA6IY,6911
4
+ kekkai/dojo.py,sha256=erLdTMOioTyzVhXYW8xgdbU5Ro-KQx1OcTQN7_zemmY,18634
5
+ kekkai/dojo_import.py,sha256=D0ZQM_0JYHqUqJA3l4nKD-RkpvcOcgj-4zv59HRcQ6k,7274
6
6
  kekkai/manifest.py,sha256=Ph5xGDKuVxMW1GVIisRhxUelaiVZQe-W5sZWsq4lHqs,1887
7
- kekkai/output.py,sha256=x-snLSv4qKG1r4n1cSWzORbqfsAjCov9XfkdXHvU_uA,5572
7
+ kekkai/output.py,sha256=nPKsf3FjWtWf_nHj4HVpgqeZtLpPOtZoLJElVLSyPK4,5500
8
8
  kekkai/paths.py,sha256=EcyG3CEOQFQygowu7O5Mp85dKkXWWvnm1h0j_BetGxY,1190
9
9
  kekkai/policy.py,sha256=0XCUH-SbnO1PsM-exjSFHYHRnLkiNa50QfkyPakwNko,9792
10
10
  kekkai/runner.py,sha256=MBFUiJ4sSVEGNbJ6cv-8p1WHaHqjio6yWEfr_K4GuTs,2037
11
+ kekkai/compliance/__init__.py,sha256=FLcAb9Jr7AWwoesX8m8DlkZjdziVHWAB7iQLKEa4rmQ,1888
12
+ kekkai/compliance/hipaa.py,sha256=-lWOeV0kZcbz7-5o76vW6VIS73vC3WsniLO7QUw-W7E,8470
13
+ kekkai/compliance/mappings.py,sha256=Ky8lGnqvkHn2WpUFmMNg4bHvmtRSPWGHRbcXe9B54kM,4202
14
+ kekkai/compliance/owasp.py,sha256=E0JxaW_w3abc8kBRz0dJohF1871RQY0k8EoJn1tV_Kk,13606
15
+ kekkai/compliance/owasp_agentic.py,sha256=4GgjkiVOZ54ifg9xa_PBwHIanEDYe8WJDRARQGVd_Eg,8940
16
+ kekkai/compliance/pci_dss.py,sha256=rQIhuO-ArcSUfxBs1O-eohMImaA5Q-kOIZoppJGuDwc,7789
17
+ kekkai/compliance/soc2.py,sha256=Cj6UPSU-G1Wit36sa-zkIgLE5jUSV3u56mYKfz6TT-0,7435
18
+ kekkai/fix/__init__.py,sha256=pjYo-9NACM6uX5K5ridTC6U1ZQ4P-arRd4VHbayHWyY,1305
19
+ kekkai/fix/audit.py,sha256=3kch_5mUsMWRSqkhCADnmsQ0OFBJTpj1EiDl3nMXfI0,8747
20
+ kekkai/fix/differ.py,sha256=RA-zQMdX7f8nK5fq7Blz498TghYEKz0c9leq7_bfBVE,13283
21
+ kekkai/fix/engine.py,sha256=iQEP-MIrGUu95zda-ip9Cjj-O7wmK3UXMDsNByblD8M,16860
22
+ kekkai/fix/prompts.py,sha256=oByag-PrQTwWh1FMTflUNIO9y0hr2cQL0zqLyueHu6s,7965
11
23
  kekkai/github/__init__.py,sha256=3EQ7LkRqgQwr5uTt7hNvVXLiKTpzE47woc8lZQjy5cE,386
12
24
  kekkai/github/commenter.py,sha256=v19pEctYJvUvA7e-t6eOA5dZaNIt16ocCxC92IUxQeM,5906
13
25
  kekkai/github/models.py,sha256=baW5prDEVncKrfC8aLoKjaTpPKYtRzZOBOg4Zje3qug,1340
@@ -18,13 +30,19 @@ kekkai/installer/extract.py,sha256=r4wYGCZ7zV2lIki5kns7t9bFRV1fahqOral8Jl7LZcQ,5
18
30
  kekkai/installer/manager.py,sha256=FqHTmHvTc2YkWWISvdS1uW7IZV6bHqyEg33TDb4Ldtc,7881
19
31
  kekkai/installer/manifest.py,sha256=oZFquI9pUtgtB4ZXontQND5D7m4WzjjJuybhlePk3k4,5544
20
32
  kekkai/installer/verify.py,sha256=ThtWfKnjrdx90_XBJclBGiw4yzTFs5HKoFJ0IyVPsMM,2186
33
+ kekkai/report/__init__.py,sha256=TTjXFMAKSboWTLBiQ_kkarfneHwNY4nsjjXfjtRn5Ag,1036
34
+ kekkai/report/compliance_matrix.py,sha256=WOz7Fr6Hkfl7agY2DKea7Ir0z6PtC2qT0RQgfUy_A_Q,3305
35
+ kekkai/report/generator.py,sha256=E1hMqUm_tB1jFLa6yWQFytukl4w-LIgTQ9gsA1LpCsc,11893
36
+ kekkai/report/html.py,sha256=6VJoyW08qPUWotzA0pDoO3s1Ll8E-2ypA7ldwBD_Pig,2363
37
+ kekkai/report/pdf.py,sha256=zGwfEQo6419MpNz2TeB5sgLG_bsLsok0v6ellCMd0FA,1751
38
+ kekkai/report/unified.py,sha256=2MaqwTuNRAQtGl-CtSXmsaxSLjuxh7aN1kTe7eD0mRM,6623
21
39
  kekkai/scanners/__init__.py,sha256=uKJqnBgcf47eJlDB3mvHpLsobR6M6N6uO2L0Dor1MaE,1552
22
40
  kekkai/scanners/base.py,sha256=uy7HgOaQxNcp6-X1gfXAecSYpKXaEsuVeluf6SwkbwM,2678
23
- kekkai/scanners/container.py,sha256=OhD0Meld_Zm4YcTuON91kx08Cj5h4R1FR0ABGbx7kQI,4197
41
+ kekkai/scanners/container.py,sha256=A_qBZkUNVAowWeEQUVn8VPW4obRM8KtOk9rSqX7GQUA,5328
24
42
  kekkai/scanners/falco.py,sha256=Y0kjg9QArIZnXw8Q-EEZv8o7iUOehOY3jTKh3AMR1yU,7384
25
- kekkai/scanners/gitleaks.py,sha256=8hRWXsH_EMhkqGcP2AtJdaMWHmQa91XdG2oVnq8g-kI,7159
26
- kekkai/scanners/semgrep.py,sha256=v4RDV_mHv1UXqdhV7FSyQUCu0EUCOoERGzDVowqwgVA,6758
27
- kekkai/scanners/trivy.py,sha256=E0B31eomyNF0k3ULnDkqfFoQM54UtrIIFPm3jqgE9VA,7788
43
+ kekkai/scanners/gitleaks.py,sha256=grm15elwFl9rtPFHImowxUTA72qnR24pqPIBIoujebY,7285
44
+ kekkai/scanners/semgrep.py,sha256=0qE3F6kwfxvd3PsYqXBF2NCqz15IY4f3ZS9i3eQiEDE,6756
45
+ kekkai/scanners/trivy.py,sha256=D8l7BnGc2GUKI2ykr7lTRmRXYM5W1rt0yOWD6CHS05w,7786
28
46
  kekkai/scanners/url_policy.py,sha256=0V4ESDd2R1MSyI1bs_WtFZxZpKX33O154qFIrD6uk5U,5209
29
47
  kekkai/scanners/zap.py,sha256=64NHzM-GF3oOV4UZ_W9N2v55mz91FPPg_k6hgcwlX1I,10932
30
48
  kekkai/scanners/backends/__init__.py,sha256=Rdo17FeCPGTI-1QeKtBSkg4NrW26RnvX9vgzdsxY5fg,372
@@ -36,14 +54,15 @@ kekkai/threatflow/artifacts.py,sha256=8h3IGk798U4Wkco4x0uKgzUsZCh7VfTOufwrxs7rTT
36
54
  kekkai/threatflow/chunking.py,sha256=0FNVnaQoU3FEmtjYHVaiLsKBSzHx6Vo4oozVwwWkOHM,9981
37
55
  kekkai/threatflow/core.py,sha256=CYLUI38n30zEq3DbUNI_H9mqBwwlPoL7TtFOiiwC3wI,15421
38
56
  kekkai/threatflow/mermaid.py,sha256=Brp-x-LUHMRjC7OBh4Vxzlk3NeCcdmWfWXlv7WL1ZdE,11579
39
- kekkai/threatflow/model_adapter.py,sha256=xqVPYc0rDys5RgvqJwR2VULJyzx8eToLQsOtKO1fKRE,15394
57
+ kekkai/threatflow/model_adapter.py,sha256=Vl0wBWvBUxEGTmFghjwpp-N7Zt3qkpUSxrPVjKC5QgA,20647
40
58
  kekkai/threatflow/prompts.py,sha256=lgbj7FJ1c3UYj4ofGnlLoRmywYBfdAKY0QEHmIB_JFw,8525
41
59
  kekkai/threatflow/redaction.py,sha256=mGUcNQB6YPVKArtMrEYcXCWslgUiCkloiowY9IlZ1iY,7622
42
60
  kekkai/threatflow/sanitizer.py,sha256=uQsxYZ5VDXutZoj-WMl7fo5T07uHuQZqgVzoVMoaKec,22688
43
- kekkai/triage/__init__.py,sha256=5La5HUnO6ehoUoRbOfZ_QvRj0U4ud4W2o79oraBhpCg,798
61
+ kekkai/triage/__init__.py,sha256=gYf4XPIYZTthU0Q0kaptbgMKulkjLxWQWG0HQvtlu-o,2182
44
62
  kekkai/triage/app.py,sha256=MU2tBI50d8sOdDKESGNrWYiREG9bBtrSccaMoiMv5gM,5027
45
63
  kekkai/triage/audit.py,sha256=UVaSKKC6tZkHxEoMcnIZkMOT_ngj7QzHWYuDAHas_sc,5842
46
64
  kekkai/triage/ignore.py,sha256=uBKM7zKyzORj9LJ5AAnoYWZQTRy57P0ZofSapiDWcfI,7305
65
+ kekkai/triage/loader.py,sha256=vywhS8fcre7PiBX3H2CpKXFxzvO7LcDnIHIB0kzG3R4,5850
47
66
  kekkai/triage/models.py,sha256=nRmWtELMqHWHX1NqZ2upH2ZAJVeBxa3Wh8f3kkB9WYo,5384
48
67
  kekkai/triage/screens.py,sha256=6eEiHvuuS_gGESS_K3NjPiQx8G7CR18-j9upU1p5nRg,11004
49
68
  kekkai/triage/widgets.py,sha256=eOF6Qoo5uBqjxiEkbpgcO1tbIOGBQBKn75wP9Jw_AaE,4733
@@ -65,26 +84,8 @@ kekkai_core/windows/chocolatey.py,sha256=tF5S5eN-HeENRt6yQ4TZgwng0oRMX_ScskQ3-eb
65
84
  kekkai_core/windows/installer.py,sha256=MePAywHH3JTIAENv52XtkUMOGqmYqZqkH77VW5PST8o,6945
66
85
  kekkai_core/windows/scoop.py,sha256=lvothICrAoB3lGfkvhqVeNTB50eMmVGA0BE7JNCfHdI,5284
67
86
  kekkai_core/windows/validators.py,sha256=45xUuAbHcKc0WLIZ-0rByPeDD88MAV8KvopngyYBHpQ,6525
68
- portal/__init__.py,sha256=vLjCqUgIqzHbT-oIMMWuWQ-lDA5jvuOOEa9qdBRLcIY,507
69
- portal/api.py,sha256=4_hQwkUnP8P3EjCdB5Tb7uRcuH3H7M6GxTvwTTmhLv4,4066
70
- portal/auth.py,sha256=4K_Ya9W_2sZl2MF0FNVr9QASjTOKAO3CMdgGUuYbb9s,3102
71
- portal/tenants.py,sha256=91SOqzjGefcHXodfN8LIHER8boeSB-Jb-WoHPTWI5GI,11394
72
- portal/uploads.py,sha256=WhosreaTKFYHNKXW9F4jOmB_OwUl1YGtT5DeaXnRMqk,7352
73
- portal/web.py,sha256=nW9ShBI18TitVFxaN0OmGgqtMdUnv5UPZcBMT12VuvM,14173
74
- portal/enterprise/__init__.py,sha256=djxFlSUZ5-YwhT9SXJsAOaD1rRHDL14BXigh6l4WDC4,763
75
- portal/enterprise/audit.py,sha256=VTm-M4gVKOxcBREqIJBs4r5wyqqqf1eCOsHi3FFiDcI,13772
76
- portal/enterprise/licensing.py,sha256=M8PFfE_v73UJL6Lfr4qhqfAGrvtJyPwDPb4SMRMGfV0,11002
77
- portal/enterprise/rbac.py,sha256=vrZoyIVmWM0C90CIgZaprwqhiDbAM-ggNNg36Zu-5lU,8548
78
- portal/enterprise/saml.py,sha256=TXHBbILI7qMe0ertcFPnuSUSPbJzEeBiHmZzhY9-Ix8,20367
79
- portal/ops/__init__.py,sha256=ZyEYmFM_4LFWfQfgp9Kh2vqmolSjVKFdk1vX1vkhjqc,1391
80
- portal/ops/backup.py,sha256=eLUnZcUtS0svEoagb0jQQmT7TcAGjBA3fUlM2YoCfLg,20102
81
- portal/ops/log_shipper.py,sha256=Age3YfvsJ5YWrPQYdHELr4Qa9jJCATHiwv3Q-rMJwJs,15237
82
- portal/ops/monitoring.py,sha256=xhLbKjVaob709K4x0dEsOo4lh7Ddm2A4UE2ZmhfmMtI,17908
83
- portal/ops/restore.py,sha256=rgzKoBIilgoPPv5gZhSSBuLKG1skKw5ryoCRR3d7CPQ,17058
84
- portal/ops/secrets.py,sha256=wu2bUfJGctbGjyuGUgvUc_Y6IH1SCW16dExtqcKu_kg,14338
85
- portal/ops/upgrade.py,sha256=fXsIXCJYYABdWDECDXkt7F2PidzNtO6Zr-g0Y5PLlVU,20106
86
- kekkai_cli-1.0.5.dist-info/METADATA,sha256=S6I2wrKWDsKlwRR6ZEmEcFbFj7SAC3nMbzzeRmivHG0,3652
87
- kekkai_cli-1.0.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
88
- kekkai_cli-1.0.5.dist-info/entry_points.txt,sha256=WUEX6IISnRcwlQAdhisPfIIV3Us2MYCwtJoyPpLJO44,75
89
- kekkai_cli-1.0.5.dist-info/top_level.txt,sha256=u0J4T-Rnb0cgs0LfzZAUNt6nx1d5l7wKn8vOuo9FBEY,26
90
- kekkai_cli-1.0.5.dist-info/RECORD,,
87
+ kekkai_cli-1.1.1.dist-info/METADATA,sha256=_Wt5_uAwnvnEK-Hmc7RxwZozkiwU_6JpLFD_xTpgDTM,11667
88
+ kekkai_cli-1.1.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
89
+ kekkai_cli-1.1.1.dist-info/entry_points.txt,sha256=MBV1OIfxJmT2oJvzeeFKIH1eh8M9kKAn7JqFBeuMfWA,43
90
+ kekkai_cli-1.1.1.dist-info/top_level.txt,sha256=wWwh7GGPaUjcaCRmt70ueL3WQoQbeGa5L0T0hgOh-MY,19
91
+ kekkai_cli-1.1.1.dist-info/RECORD,,
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  kekkai = kekkai.cli:main
3
- kekkai-portal = portal.web:main
@@ -1,3 +1,2 @@
1
1
  kekkai
2
2
  kekkai_core
3
- portal