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.
Files changed (109) hide show
  1. riskforge-0.1.0/.github/workflows/ci.yml +124 -0
  2. riskforge-0.1.0/.github/workflows/release.yml +64 -0
  3. riskforge-0.1.0/.gitignore +39 -0
  4. riskforge-0.1.0/.pre-commit-config.yaml +17 -0
  5. riskforge-0.1.0/CHANGELOG.md +35 -0
  6. riskforge-0.1.0/HLD-RiskForge-v1.0.md +389 -0
  7. riskforge-0.1.0/LLD-RiskForge-v1.0.md +1484 -0
  8. riskforge-0.1.0/Makefile +37 -0
  9. riskforge-0.1.0/PKG-INFO +217 -0
  10. riskforge-0.1.0/PRD-RiskForge-v1.0.md +832 -0
  11. riskforge-0.1.0/README.md +163 -0
  12. riskforge-0.1.0/docker/Dockerfile +46 -0
  13. riskforge-0.1.0/docker/docker-compose.enterprise.yml +42 -0
  14. riskforge-0.1.0/docker/docker-compose.yml +38 -0
  15. riskforge-0.1.0/docs/adr/ADR-01-file-based-storage.md +28 -0
  16. riskforge-0.1.0/docs/adr/ADR-02-import-boundaries.md +27 -0
  17. riskforge-0.1.0/docs/contributing/add-exporter.md +44 -0
  18. riskforge-0.1.0/docs/contributing/add-pattern.md +40 -0
  19. riskforge-0.1.0/docs/contributing/add-question.md +49 -0
  20. riskforge-0.1.0/pyproject.toml +102 -0
  21. riskforge-0.1.0/src/riskforge/__init__.py +2 -0
  22. riskforge-0.1.0/src/riskforge/_data/__init__.py +0 -0
  23. riskforge-0.1.0/src/riskforge/_data/patterns/__init__.py +0 -0
  24. riskforge-0.1.0/src/riskforge/_data/patterns/patterns.yaml +147 -0
  25. riskforge-0.1.0/src/riskforge/_data/question_bank/__init__.py +0 -0
  26. riskforge-0.1.0/src/riskforge/_data/question_bank/data_governance.yaml +57 -0
  27. riskforge-0.1.0/src/riskforge/_data/question_bank/discrimination.yaml +46 -0
  28. riskforge-0.1.0/src/riskforge/_data/question_bank/fundamental_rights.yaml +46 -0
  29. riskforge-0.1.0/src/riskforge/_data/question_bank/health_safety.yaml +68 -0
  30. riskforge-0.1.0/src/riskforge/_data/question_bank/human_oversight.yaml +46 -0
  31. riskforge-0.1.0/src/riskforge/_data/question_bank/privacy.yaml +57 -0
  32. riskforge-0.1.0/src/riskforge/_data/question_bank/robustness.yaml +57 -0
  33. riskforge-0.1.0/src/riskforge/_data/question_bank/transparency.yaml +46 -0
  34. riskforge-0.1.0/src/riskforge/_data/schemas/__init__.py +0 -0
  35. riskforge-0.1.0/src/riskforge/_data/schemas/rmf.schema.json +184 -0
  36. riskforge-0.1.0/src/riskforge/_data/templates/__init__.py +0 -0
  37. riskforge-0.1.0/src/riskforge/adapters/__init__.py +1 -0
  38. riskforge-0.1.0/src/riskforge/adapters/base.py +24 -0
  39. riskforge-0.1.0/src/riskforge/adapters/rag_benchmarking.py +68 -0
  40. riskforge-0.1.0/src/riskforge/adapters/traceforge.py +82 -0
  41. riskforge-0.1.0/src/riskforge/cli/__init__.py +1 -0
  42. riskforge-0.1.0/src/riskforge/cli/commands/__init__.py +1 -0
  43. riskforge-0.1.0/src/riskforge/cli/commands/assess.py +32 -0
  44. riskforge-0.1.0/src/riskforge/cli/commands/diff.py +37 -0
  45. riskforge-0.1.0/src/riskforge/cli/commands/export.py +73 -0
  46. riskforge-0.1.0/src/riskforge/cli/commands/import_cmd.py +51 -0
  47. riskforge-0.1.0/src/riskforge/cli/commands/init.py +60 -0
  48. riskforge-0.1.0/src/riskforge/cli/commands/risk.py +72 -0
  49. riskforge-0.1.0/src/riskforge/cli/commands/serve.py +48 -0
  50. riskforge-0.1.0/src/riskforge/cli/commands/system.py +28 -0
  51. riskforge-0.1.0/src/riskforge/cli/commands/tests_cmd.py +34 -0
  52. riskforge-0.1.0/src/riskforge/cli/commands/validate.py +57 -0
  53. riskforge-0.1.0/src/riskforge/cli/commands/verify.py +36 -0
  54. riskforge-0.1.0/src/riskforge/cli/main.py +55 -0
  55. riskforge-0.1.0/src/riskforge/engine/__init__.py +1 -0
  56. riskforge-0.1.0/src/riskforge/engine/assess.py +89 -0
  57. riskforge-0.1.0/src/riskforge/engine/audit.py +71 -0
  58. riskforge-0.1.0/src/riskforge/engine/export.py +100 -0
  59. riskforge-0.1.0/src/riskforge/engine/migrations.py +42 -0
  60. riskforge-0.1.0/src/riskforge/engine/risk.py +111 -0
  61. riskforge-0.1.0/src/riskforge/engine/tests.py +106 -0
  62. riskforge-0.1.0/src/riskforge/engine/validate.py +145 -0
  63. riskforge-0.1.0/src/riskforge/exporters/__init__.py +1 -0
  64. riskforge-0.1.0/src/riskforge/exporters/base.py +19 -0
  65. riskforge-0.1.0/src/riskforge/exporters/json_exporter.py +19 -0
  66. riskforge-0.1.0/src/riskforge/exporters/markdown_exporter.py +71 -0
  67. riskforge-0.1.0/src/riskforge/exporters/pdf/__init__.py +1 -0
  68. riskforge-0.1.0/src/riskforge/exporters/pdf/pdf_exporter.py +50 -0
  69. riskforge-0.1.0/src/riskforge/exporters/pdf/templates/report.css +291 -0
  70. riskforge-0.1.0/src/riskforge/exporters/pdf/templates/report.html +192 -0
  71. riskforge-0.1.0/src/riskforge/migrations/__init__.py +0 -0
  72. riskforge-0.1.0/src/riskforge/migrations/m0001_initial.py +22 -0
  73. riskforge-0.1.0/src/riskforge/models/__init__.py +15 -0
  74. riskforge-0.1.0/src/riskforge/models/audit.py +31 -0
  75. riskforge-0.1.0/src/riskforge/models/register.py +52 -0
  76. riskforge-0.1.0/src/riskforge/models/risk.py +139 -0
  77. riskforge-0.1.0/src/riskforge/models/rmf.py +58 -0
  78. riskforge-0.1.0/src/riskforge/models/system.py +48 -0
  79. riskforge-0.1.0/src/riskforge/plugins/__init__.py +1 -0
  80. riskforge-0.1.0/src/riskforge/plugins/builtin.py +48 -0
  81. riskforge-0.1.0/src/riskforge/plugins/loader.py +46 -0
  82. riskforge-0.1.0/src/riskforge/plugins/registry.py +64 -0
  83. riskforge-0.1.0/src/riskforge/server/__init__.py +1 -0
  84. riskforge-0.1.0/src/riskforge/server/app.py +57 -0
  85. riskforge-0.1.0/src/riskforge/server/auth.py +31 -0
  86. riskforge-0.1.0/src/riskforge/server/config.py +14 -0
  87. riskforge-0.1.0/src/riskforge/server/metrics.py +20 -0
  88. riskforge-0.1.0/src/riskforge/server/middleware.py +30 -0
  89. riskforge-0.1.0/src/riskforge/server/routers/__init__.py +1 -0
  90. riskforge-0.1.0/src/riskforge/server/routers/exports.py +14 -0
  91. riskforge-0.1.0/src/riskforge/server/routers/health.py +18 -0
  92. riskforge-0.1.0/src/riskforge/server/routers/registers.py +20 -0
  93. riskforge-0.1.0/src/riskforge/server/routers/risks.py +20 -0
  94. riskforge-0.1.0/src/riskforge/server/routers/webhooks.py +20 -0
  95. riskforge-0.1.0/src/riskforge/storage/__init__.py +4 -0
  96. riskforge-0.1.0/src/riskforge/storage/base.py +235 -0
  97. riskforge-0.1.0/src/riskforge/storage/filesystem.py +486 -0
  98. riskforge-0.1.0/tests/boundary/__init__.py +0 -0
  99. riskforge-0.1.0/tests/boundary/test_import_boundaries.py +99 -0
  100. riskforge-0.1.0/tests/conftest.py +16 -0
  101. riskforge-0.1.0/tests/contract/__init__.py +0 -0
  102. riskforge-0.1.0/tests/contract/test_schema_validation.py +83 -0
  103. riskforge-0.1.0/tests/fixtures/upstream/sample_rag_benchmarking_report.json +13 -0
  104. riskforge-0.1.0/tests/fixtures/upstream/sample_traceforge_report.json +24 -0
  105. riskforge-0.1.0/tests/integration/__init__.py +0 -0
  106. riskforge-0.1.0/tests/integration/test_cli_pipeline.py +17 -0
  107. riskforge-0.1.0/tests/unit/__init__.py +0 -0
  108. riskforge-0.1.0/tests/unit/test_risk_scoring.py +72 -0
  109. 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