riskforge 0.1.0__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.
- riskforge-0.1.0/.github/workflows/ci.yml +124 -0
- riskforge-0.1.0/.github/workflows/release.yml +64 -0
- riskforge-0.1.0/.gitignore +39 -0
- riskforge-0.1.0/.pre-commit-config.yaml +17 -0
- riskforge-0.1.0/CHANGELOG.md +35 -0
- riskforge-0.1.0/HLD-RiskForge-v1.0.md +389 -0
- riskforge-0.1.0/LLD-RiskForge-v1.0.md +1484 -0
- riskforge-0.1.0/Makefile +37 -0
- riskforge-0.1.0/PKG-INFO +217 -0
- riskforge-0.1.0/PRD-RiskForge-v1.0.md +832 -0
- riskforge-0.1.0/README.md +163 -0
- riskforge-0.1.0/docker/Dockerfile +46 -0
- riskforge-0.1.0/docker/docker-compose.enterprise.yml +42 -0
- riskforge-0.1.0/docker/docker-compose.yml +38 -0
- riskforge-0.1.0/docs/adr/ADR-01-file-based-storage.md +28 -0
- riskforge-0.1.0/docs/adr/ADR-02-import-boundaries.md +27 -0
- riskforge-0.1.0/docs/contributing/add-exporter.md +44 -0
- riskforge-0.1.0/docs/contributing/add-pattern.md +40 -0
- riskforge-0.1.0/docs/contributing/add-question.md +49 -0
- riskforge-0.1.0/pyproject.toml +102 -0
- riskforge-0.1.0/src/riskforge/__init__.py +2 -0
- riskforge-0.1.0/src/riskforge/_data/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/_data/patterns/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/_data/patterns/patterns.yaml +147 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/data_governance.yaml +57 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/discrimination.yaml +46 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/fundamental_rights.yaml +46 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/health_safety.yaml +68 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/human_oversight.yaml +46 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/privacy.yaml +57 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/robustness.yaml +57 -0
- riskforge-0.1.0/src/riskforge/_data/question_bank/transparency.yaml +46 -0
- riskforge-0.1.0/src/riskforge/_data/schemas/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/_data/schemas/rmf.schema.json +184 -0
- riskforge-0.1.0/src/riskforge/_data/templates/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/adapters/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/adapters/base.py +24 -0
- riskforge-0.1.0/src/riskforge/adapters/rag_benchmarking.py +68 -0
- riskforge-0.1.0/src/riskforge/adapters/traceforge.py +82 -0
- riskforge-0.1.0/src/riskforge/cli/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/cli/commands/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/cli/commands/assess.py +32 -0
- riskforge-0.1.0/src/riskforge/cli/commands/diff.py +37 -0
- riskforge-0.1.0/src/riskforge/cli/commands/export.py +73 -0
- riskforge-0.1.0/src/riskforge/cli/commands/import_cmd.py +51 -0
- riskforge-0.1.0/src/riskforge/cli/commands/init.py +60 -0
- riskforge-0.1.0/src/riskforge/cli/commands/risk.py +72 -0
- riskforge-0.1.0/src/riskforge/cli/commands/serve.py +48 -0
- riskforge-0.1.0/src/riskforge/cli/commands/system.py +28 -0
- riskforge-0.1.0/src/riskforge/cli/commands/tests_cmd.py +34 -0
- riskforge-0.1.0/src/riskforge/cli/commands/validate.py +57 -0
- riskforge-0.1.0/src/riskforge/cli/commands/verify.py +36 -0
- riskforge-0.1.0/src/riskforge/cli/main.py +55 -0
- riskforge-0.1.0/src/riskforge/engine/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/engine/assess.py +89 -0
- riskforge-0.1.0/src/riskforge/engine/audit.py +71 -0
- riskforge-0.1.0/src/riskforge/engine/export.py +100 -0
- riskforge-0.1.0/src/riskforge/engine/migrations.py +42 -0
- riskforge-0.1.0/src/riskforge/engine/risk.py +111 -0
- riskforge-0.1.0/src/riskforge/engine/tests.py +106 -0
- riskforge-0.1.0/src/riskforge/engine/validate.py +145 -0
- riskforge-0.1.0/src/riskforge/exporters/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/exporters/base.py +19 -0
- riskforge-0.1.0/src/riskforge/exporters/json_exporter.py +19 -0
- riskforge-0.1.0/src/riskforge/exporters/markdown_exporter.py +71 -0
- riskforge-0.1.0/src/riskforge/exporters/pdf/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/exporters/pdf/pdf_exporter.py +50 -0
- riskforge-0.1.0/src/riskforge/exporters/pdf/templates/report.css +291 -0
- riskforge-0.1.0/src/riskforge/exporters/pdf/templates/report.html +192 -0
- riskforge-0.1.0/src/riskforge/migrations/__init__.py +0 -0
- riskforge-0.1.0/src/riskforge/migrations/m0001_initial.py +22 -0
- riskforge-0.1.0/src/riskforge/models/__init__.py +15 -0
- riskforge-0.1.0/src/riskforge/models/audit.py +31 -0
- riskforge-0.1.0/src/riskforge/models/register.py +52 -0
- riskforge-0.1.0/src/riskforge/models/risk.py +139 -0
- riskforge-0.1.0/src/riskforge/models/rmf.py +58 -0
- riskforge-0.1.0/src/riskforge/models/system.py +48 -0
- riskforge-0.1.0/src/riskforge/plugins/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/plugins/builtin.py +48 -0
- riskforge-0.1.0/src/riskforge/plugins/loader.py +46 -0
- riskforge-0.1.0/src/riskforge/plugins/registry.py +64 -0
- riskforge-0.1.0/src/riskforge/server/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/server/app.py +57 -0
- riskforge-0.1.0/src/riskforge/server/auth.py +31 -0
- riskforge-0.1.0/src/riskforge/server/config.py +14 -0
- riskforge-0.1.0/src/riskforge/server/metrics.py +20 -0
- riskforge-0.1.0/src/riskforge/server/middleware.py +30 -0
- riskforge-0.1.0/src/riskforge/server/routers/__init__.py +1 -0
- riskforge-0.1.0/src/riskforge/server/routers/exports.py +14 -0
- riskforge-0.1.0/src/riskforge/server/routers/health.py +18 -0
- riskforge-0.1.0/src/riskforge/server/routers/registers.py +20 -0
- riskforge-0.1.0/src/riskforge/server/routers/risks.py +20 -0
- riskforge-0.1.0/src/riskforge/server/routers/webhooks.py +20 -0
- riskforge-0.1.0/src/riskforge/storage/__init__.py +4 -0
- riskforge-0.1.0/src/riskforge/storage/base.py +235 -0
- riskforge-0.1.0/src/riskforge/storage/filesystem.py +486 -0
- riskforge-0.1.0/tests/boundary/__init__.py +0 -0
- riskforge-0.1.0/tests/boundary/test_import_boundaries.py +99 -0
- riskforge-0.1.0/tests/conftest.py +16 -0
- riskforge-0.1.0/tests/contract/__init__.py +0 -0
- riskforge-0.1.0/tests/contract/test_schema_validation.py +83 -0
- riskforge-0.1.0/tests/fixtures/upstream/sample_rag_benchmarking_report.json +13 -0
- riskforge-0.1.0/tests/fixtures/upstream/sample_traceforge_report.json +24 -0
- riskforge-0.1.0/tests/integration/__init__.py +0 -0
- riskforge-0.1.0/tests/integration/test_cli_pipeline.py +17 -0
- riskforge-0.1.0/tests/unit/__init__.py +0 -0
- riskforge-0.1.0/tests/unit/test_risk_scoring.py +72 -0
- riskforge-0.1.0/tests/unit/test_validate_engine.py +100 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main", "develop"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["main"]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
lint:
|
|
14
|
+
name: Lint & Format
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.11"
|
|
22
|
+
cache: pip
|
|
23
|
+
|
|
24
|
+
- name: Install ruff
|
|
25
|
+
run: pip install ruff==0.4.4
|
|
26
|
+
|
|
27
|
+
- name: Lint
|
|
28
|
+
run: ruff check src/ tests/
|
|
29
|
+
|
|
30
|
+
- name: Format check
|
|
31
|
+
run: ruff format --check src/ tests/
|
|
32
|
+
|
|
33
|
+
test:
|
|
34
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
strategy:
|
|
37
|
+
matrix:
|
|
38
|
+
python-version: ["3.11", "3.12"]
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- uses: actions/setup-python@v5
|
|
43
|
+
with:
|
|
44
|
+
python-version: ${{ matrix.python-version }}
|
|
45
|
+
cache: pip
|
|
46
|
+
|
|
47
|
+
- name: Install WeasyPrint system dependencies
|
|
48
|
+
run: |
|
|
49
|
+
sudo apt-get update
|
|
50
|
+
sudo apt-get install -y libpango-1.0-0 libpangocairo-1.0-0 libcairo2 \
|
|
51
|
+
libgdk-pixbuf2.0-0 libffi-dev shared-mime-info
|
|
52
|
+
|
|
53
|
+
- name: Install RiskForge with dev extras
|
|
54
|
+
run: pip install -e ".[dev]"
|
|
55
|
+
|
|
56
|
+
- name: Run test suite
|
|
57
|
+
run: pytest --cov --cov-report=xml --cov-report=term-missing
|
|
58
|
+
|
|
59
|
+
- name: Upload coverage to Codecov
|
|
60
|
+
if: matrix.python-version == '3.11'
|
|
61
|
+
uses: codecov/codecov-action@v4
|
|
62
|
+
with:
|
|
63
|
+
files: ./coverage.xml
|
|
64
|
+
fail_ci_if_error: false
|
|
65
|
+
|
|
66
|
+
schema-validate:
|
|
67
|
+
name: Schema Validation
|
|
68
|
+
runs-on: ubuntu-latest
|
|
69
|
+
steps:
|
|
70
|
+
- uses: actions/checkout@v4
|
|
71
|
+
|
|
72
|
+
- uses: actions/setup-python@v5
|
|
73
|
+
with:
|
|
74
|
+
python-version: "3.11"
|
|
75
|
+
cache: pip
|
|
76
|
+
|
|
77
|
+
- name: Install jsonschema
|
|
78
|
+
run: pip install jsonschema
|
|
79
|
+
|
|
80
|
+
- name: Validate rmf.schema.json is valid JSON Schema
|
|
81
|
+
run: |
|
|
82
|
+
python -c "
|
|
83
|
+
import json, jsonschema
|
|
84
|
+
schema = json.load(open('src/riskforge/_data/schemas/rmf.schema.json'))
|
|
85
|
+
jsonschema.Draft202012Validator.check_schema(schema)
|
|
86
|
+
print('Schema valid:', schema.get('\$id'))
|
|
87
|
+
"
|
|
88
|
+
|
|
89
|
+
security:
|
|
90
|
+
name: Security Scan
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
steps:
|
|
93
|
+
- uses: actions/checkout@v4
|
|
94
|
+
|
|
95
|
+
- uses: actions/setup-python@v5
|
|
96
|
+
with:
|
|
97
|
+
python-version: "3.11"
|
|
98
|
+
cache: pip
|
|
99
|
+
|
|
100
|
+
- name: Install security tools
|
|
101
|
+
run: pip install bandit pip-audit
|
|
102
|
+
|
|
103
|
+
- name: Static security analysis
|
|
104
|
+
run: bandit -ll -r src/ --exit-zero
|
|
105
|
+
|
|
106
|
+
- name: Dependency vulnerability audit
|
|
107
|
+
run: pip install -e ".[dev]" && pip-audit --strict || true
|
|
108
|
+
|
|
109
|
+
boundary-test:
|
|
110
|
+
name: Import Boundary Enforcement (ADR-02)
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v4
|
|
114
|
+
|
|
115
|
+
- uses: actions/setup-python@v5
|
|
116
|
+
with:
|
|
117
|
+
python-version: "3.11"
|
|
118
|
+
cache: pip
|
|
119
|
+
|
|
120
|
+
- name: Install RiskForge
|
|
121
|
+
run: pip install -e ".[test]"
|
|
122
|
+
|
|
123
|
+
- name: Run boundary tests
|
|
124
|
+
run: pytest tests/boundary/ -v
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*.*.*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write # PyPI OIDC trusted publishing
|
|
9
|
+
contents: write # GitHub Release creation
|
|
10
|
+
attestations: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release:
|
|
14
|
+
name: Build & Publish
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
environment: pypi-publish
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.11"
|
|
23
|
+
|
|
24
|
+
- name: Install dev dependencies + build frontend
|
|
25
|
+
run: |
|
|
26
|
+
pip install build pip-audit bandit
|
|
27
|
+
pip install -e ".[dev]"
|
|
28
|
+
|
|
29
|
+
- name: Security gates (advisory)
|
|
30
|
+
run: |
|
|
31
|
+
bandit -ll -r src/ --exit-zero
|
|
32
|
+
pip-audit --strict || true
|
|
33
|
+
|
|
34
|
+
- name: Run full test suite
|
|
35
|
+
run: pytest --cov
|
|
36
|
+
|
|
37
|
+
- name: Build wheel + sdist
|
|
38
|
+
run: python -m build
|
|
39
|
+
|
|
40
|
+
- name: List built artifacts
|
|
41
|
+
run: ls -lh dist/
|
|
42
|
+
|
|
43
|
+
- name: Generate CycloneDX SBOM
|
|
44
|
+
run: |
|
|
45
|
+
pip install "cyclonedx-bom<5"
|
|
46
|
+
cyclonedx-py environment -o sbom.cdx.json --format json || \
|
|
47
|
+
cyclonedx-py environment > sbom.cdx.json || true
|
|
48
|
+
|
|
49
|
+
- name: Attest build provenance (GitHub + Sigstore)
|
|
50
|
+
uses: actions/attest-build-provenance@v2
|
|
51
|
+
with:
|
|
52
|
+
subject-path: dist/*
|
|
53
|
+
|
|
54
|
+
- name: Publish to PyPI (OIDC trusted publisher)
|
|
55
|
+
uses: pypa/gh-action-pypi-publish@v1.12.4
|
|
56
|
+
|
|
57
|
+
- name: Create GitHub Release
|
|
58
|
+
uses: softprops/action-gh-release@v2
|
|
59
|
+
with:
|
|
60
|
+
generate_release_notes: true
|
|
61
|
+
files: |
|
|
62
|
+
dist/*.whl
|
|
63
|
+
dist/*.tar.gz
|
|
64
|
+
sbom.cdx.json
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
.eggs/
|
|
8
|
+
*.egg
|
|
9
|
+
|
|
10
|
+
# Virtual environments
|
|
11
|
+
.venv/
|
|
12
|
+
venv/
|
|
13
|
+
env/
|
|
14
|
+
|
|
15
|
+
# Testing
|
|
16
|
+
.pytest_cache/
|
|
17
|
+
.coverage
|
|
18
|
+
htmlcov/
|
|
19
|
+
coverage.xml
|
|
20
|
+
|
|
21
|
+
# RiskForge project files (sensitive — never commit)
|
|
22
|
+
.riskforge/
|
|
23
|
+
riskforge.yaml
|
|
24
|
+
systems/
|
|
25
|
+
*.riskforge
|
|
26
|
+
|
|
27
|
+
# IDE
|
|
28
|
+
.vscode/
|
|
29
|
+
.idea/
|
|
30
|
+
*.swp
|
|
31
|
+
|
|
32
|
+
# OS
|
|
33
|
+
.DS_Store
|
|
34
|
+
Thumbs.db
|
|
35
|
+
|
|
36
|
+
# Secrets
|
|
37
|
+
.env
|
|
38
|
+
*.pem
|
|
39
|
+
*.key
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.4.4
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
9
|
+
rev: v4.6.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: check-yaml
|
|
12
|
+
- id: check-json
|
|
13
|
+
- id: trailing-whitespace
|
|
14
|
+
- id: end-of-file-fixer
|
|
15
|
+
- id: check-merge-conflict
|
|
16
|
+
- id: check-added-large-files
|
|
17
|
+
args: [--maxkb=500]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to RiskForge are documented here.
|
|
4
|
+
Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
|
5
|
+
Versioning: [Semantic Versioning](https://semver.org/)
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.1.0] - 2026-04-12
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- Initial release of RiskForge
|
|
13
|
+
- Article 9 risk management system CLI
|
|
14
|
+
- 8 risk dimensions with 50+ questions
|
|
15
|
+
- 5x5 likelihood x severity scoring matrix
|
|
16
|
+
- JSON, PDF, and Markdown export formats
|
|
17
|
+
- SHA-256 hash-chain audit trail
|
|
18
|
+
- Integration adapters for rag-benchmarking and TraceForge
|
|
19
|
+
- `riskforge init`, `assess`, `validate`, `export`, `verify` commands
|
|
20
|
+
- `riskforge risk list/add/edit/accept/score` subcommands
|
|
21
|
+
- `riskforge system show/edit` subcommands
|
|
22
|
+
- `riskforge tests generate/list` subcommands
|
|
23
|
+
- `riskforge diff` and `riskforge import` commands
|
|
24
|
+
- Optional FastAPI server (`pip install riskforge[server]`)
|
|
25
|
+
- 8 export readiness gates (G1-G8)
|
|
26
|
+
- Plugin system via Python entry points (question banks, exporters, adapters)
|
|
27
|
+
- WeasyPrint PDF rendering with Jinja2 HTML templates
|
|
28
|
+
- `rmf.schema.json` (JSON Schema draft-2020-12) as versioned output contract
|
|
29
|
+
- FileStore storage backend (YAML + JSONL, git-friendly)
|
|
30
|
+
- Exit code 2 for `riskforge verify` failures (CI-detectable)
|
|
31
|
+
- Zero-telemetry guarantee enforced via pytest-socket in CI
|
|
32
|
+
- Docker Compose setup for team deployment
|
|
33
|
+
- Sigstore OIDC signing on all PyPI releases
|
|
34
|
+
- CycloneDX SBOM attached to every GitHub Release
|
|
35
|
+
- Build provenance attestation via GitHub Actions
|