rsil 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.
- rsil-0.1.0/.claude/CLAUDE.md +136 -0
- rsil-0.1.0/.claude/settings.json +11 -0
- rsil-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
- rsil-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +41 -0
- rsil-0.1.0/.github/workflows/ci.yml +59 -0
- rsil-0.1.0/.github/workflows/publish.yml +83 -0
- rsil-0.1.0/.gitignore +211 -0
- rsil-0.1.0/CHANGELOG.md +63 -0
- rsil-0.1.0/CONTRIBUTING.md +139 -0
- rsil-0.1.0/LICENSE +21 -0
- rsil-0.1.0/Makefile +118 -0
- rsil-0.1.0/PKG-INFO +330 -0
- rsil-0.1.0/README.md +274 -0
- rsil-0.1.0/docs/architecture.md +340 -0
- rsil-0.1.0/docs/roadmap.md +203 -0
- rsil-0.1.0/examples/fastapi_app/README.md +48 -0
- rsil-0.1.0/examples/fastapi_app/main.py +57 -0
- rsil-0.1.0/examples/fastapi_app/requirements.txt +2 -0
- rsil-0.1.0/examples/simple_app/README.md +45 -0
- rsil-0.1.0/examples/simple_app/app.py +25 -0
- rsil-0.1.0/pyproject.toml +72 -0
- rsil-0.1.0/rsil/__init__.py +3 -0
- rsil-0.1.0/rsil/cli/__init__.py +1 -0
- rsil-0.1.0/rsil/cli/commands/__init__.py +1 -0
- rsil-0.1.0/rsil/cli/commands/add.py +46 -0
- rsil-0.1.0/rsil/cli/commands/delete.py +38 -0
- rsil-0.1.0/rsil/cli/commands/init.py +35 -0
- rsil-0.1.0/rsil/cli/commands/list.py +52 -0
- rsil-0.1.0/rsil/cli/commands/run.py +69 -0
- rsil-0.1.0/rsil/cli/main.py +58 -0
- rsil-0.1.0/rsil/core/__init__.py +1 -0
- rsil-0.1.0/rsil/core/cleanup.py +47 -0
- rsil-0.1.0/rsil/core/env_builder.py +44 -0
- rsil-0.1.0/rsil/core/executor.py +100 -0
- rsil-0.1.0/rsil/core/isolation.py +21 -0
- rsil-0.1.0/rsil/core/process.py +124 -0
- rsil-0.1.0/rsil/policy/__init__.py +1 -0
- rsil-0.1.0/rsil/policy/engine.py +75 -0
- rsil-0.1.0/rsil/policy/rules.py +68 -0
- rsil-0.1.0/rsil/policy/validator.py +46 -0
- rsil-0.1.0/rsil/secrets/__init__.py +1 -0
- rsil-0.1.0/rsil/secrets/crypto.py +65 -0
- rsil-0.1.0/rsil/secrets/manager.py +103 -0
- rsil-0.1.0/rsil/secrets/models.py +39 -0
- rsil-0.1.0/rsil/secrets/store.py +44 -0
- rsil-0.1.0/rsil/security/__init__.py +1 -0
- rsil-0.1.0/rsil/security/audit.py +55 -0
- rsil-0.1.0/rsil/security/process_guard.py +99 -0
- rsil-0.1.0/rsil/security/redact.py +36 -0
- rsil-0.1.0/rsil/utils/__init__.py +1 -0
- rsil-0.1.0/rsil/utils/config.py +71 -0
- rsil-0.1.0/rsil/utils/logger.py +22 -0
- rsil-0.1.0/tests/__init__.py +0 -0
- rsil-0.1.0/tests/conftest.py +61 -0
- rsil-0.1.0/tests/fixtures/__init__.py +0 -0
- rsil-0.1.0/tests/fixtures/mock_store.py +46 -0
- rsil-0.1.0/tests/fixtures/sample_policy.yaml +20 -0
- rsil-0.1.0/tests/integration/__init__.py +0 -0
- rsil-0.1.0/tests/integration/test_run_command.py +100 -0
- rsil-0.1.0/tests/integration/test_secret_lifecycle.py +73 -0
- rsil-0.1.0/tests/unit/__init__.py +0 -0
- rsil-0.1.0/tests/unit/test_crypto.py +79 -0
- rsil-0.1.0/tests/unit/test_env_builder.py +56 -0
- rsil-0.1.0/tests/unit/test_executor.py +47 -0
- rsil-0.1.0/tests/unit/test_manager.py +86 -0
- rsil-0.1.0/tests/unit/test_process_guard.py +67 -0
- rsil-0.1.0/tests/unit/test_redact.py +67 -0
- rsil-0.1.0/tests/unit/test_store.py +71 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# RSIL — Claude Code Project Context
|
|
2
|
+
|
|
3
|
+
## What this project is
|
|
4
|
+
|
|
5
|
+
RSIL (Runtime Secret Isolation Layer) is a Python CLI tool and library that injects secrets into processes at runtime without ever storing them in plaintext on disk. It uses `fork()`/`execve()` to create minimal-environment child processes, Fernet encryption for the local secret store, and process-inspection to detect and block AI coding agents from accessing secrets.
|
|
6
|
+
|
|
7
|
+
GitHub tagline: **"Runtime secret injection with process-level isolation — built for the AI-agent era."**
|
|
8
|
+
|
|
9
|
+
The project solves a new threat model: AI coding assistants (Claude Code, Cursor, Copilot) run inside local repositories and can read `.env` files and `os.environ`. RSIL prevents that by eliminating `.env` files and only materializing secrets inside short-lived, isolated child processes.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Key directories
|
|
14
|
+
|
|
15
|
+
| Path | What it contains |
|
|
16
|
+
|------|-----------------|
|
|
17
|
+
| `rsil/cli/` | typer-based CLI, one file per command (`init`, `add`, `list`, `delete`, `run`) |
|
|
18
|
+
| `rsil/core/` | Execution engine: executor, process spawning, env builder, cleanup, isolation stub |
|
|
19
|
+
| `rsil/secrets/` | Encrypted store, Fernet crypto primitives, SecretManager |
|
|
20
|
+
| `rsil/policy/` | YAML-based access control rules and evaluation engine |
|
|
21
|
+
| `rsil/security/` | Process guard (AI agent detection), output redactor, audit logger |
|
|
22
|
+
| `rsil/utils/` | Logger, config loader (`~/.rsil/config.toml`) |
|
|
23
|
+
| `tests/unit/` | Fast, fully mocked unit tests |
|
|
24
|
+
| `tests/integration/` | Tests that exercise the full run path with mock secrets |
|
|
25
|
+
| `tests/fixtures/` | Mock store helpers and sample policy YAML |
|
|
26
|
+
| `examples/simple_app/` | Minimal Python app to test `rsil run` locally |
|
|
27
|
+
| `examples/fastapi_app/` | FastAPI app demonstrating RSIL in a web context |
|
|
28
|
+
| `docs/` | `architecture.md` (deep technical doc), `roadmap.md` (12-week plan) |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Dev install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install -e ".[dev]"
|
|
36
|
+
# or
|
|
37
|
+
uv sync --extra dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## How to run tests
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pytest # all tests
|
|
46
|
+
pytest tests/unit/ # unit tests only (fast)
|
|
47
|
+
pytest tests/integration/ # integration tests
|
|
48
|
+
pytest -k test_crypto # specific test module
|
|
49
|
+
pytest --cov=rsil # with coverage report
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Linting and type checking
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
ruff check rsil/ tests/
|
|
58
|
+
ruff format rsil/ tests/
|
|
59
|
+
mypy rsil/
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## CLI usage (after install)
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
rsil --help
|
|
68
|
+
rsil init
|
|
69
|
+
rsil add MY_KEY=myvalue --service demo
|
|
70
|
+
rsil list --service demo
|
|
71
|
+
rsil run --service demo -- python examples/simple_app/app.py
|
|
72
|
+
rsil delete MY_KEY --service demo
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Architecture summary (8-step execution flow)
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
rsil run --service payment-api -- python app.py
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
1. `cli/commands/run.py` parses command and service name
|
|
84
|
+
2. `core/executor.py :: Executor.run()` orchestrates the lifecycle
|
|
85
|
+
3. `security/process_guard.py` checks if parent process is a known AI agent → denies if so
|
|
86
|
+
4. `policy/engine.py` evaluates access rules (stub in v0.1 — always passes)
|
|
87
|
+
5. `secrets/manager.py` decrypts `~/.rsil/secrets.enc` → `{"STRIPE_KEY": "..."}`
|
|
88
|
+
6. `core/env_builder.py` builds minimal env dict — **never** copies `os.environ`
|
|
89
|
+
7. `core/process.py` calls `os.fork()` + `os.execve()` with isolated env; pipes stdout/stderr through `security/redact.py`
|
|
90
|
+
8. `core/cleanup.py` zeroes secret values; `security/audit.py` writes JSON event to `~/.rsil/audit.log`
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## CRITICAL constraints — read before writing any code
|
|
95
|
+
|
|
96
|
+
These are not preferences. Violating them introduces real security vulnerabilities.
|
|
97
|
+
|
|
98
|
+
1. **Never read `~/.rsil/secrets.enc` or `~/.rsil/master.key` directly.** Always go through `secrets/manager.py`. These paths are also blocked in `settings.json`.
|
|
99
|
+
|
|
100
|
+
2. **Never use `os.environ.copy()` or inherit the full environment** when building child process environments. Only `core/env_builder.build_minimal_env()` is allowed to construct child envs. This is the central security invariant.
|
|
101
|
+
|
|
102
|
+
3. **Never hardcode secret values in tests.** All tests must use the mock fixtures in `tests/fixtures/mock_store.py`. Use `pytest-mock` for `SecretManager`.
|
|
103
|
+
|
|
104
|
+
4. **Never call `rsil run` with real secrets in tests.** Integration tests use `rsil run -- env` or `python -c "print('hello')"` with mock secrets injected via `conftest.py` fixtures.
|
|
105
|
+
|
|
106
|
+
5. **Never log raw secret values.** The `utils/logger.py` logger must never receive raw secret strings. Pass data through `security/redact.py` first.
|
|
107
|
+
|
|
108
|
+
6. **Never import from `cli/` inside `core/`, `secrets/`, `policy/`, or `security/`.** Dependency direction: `cli` → `core` → `secrets`/`policy`/`security`/`utils`. No upward imports.
|
|
109
|
+
|
|
110
|
+
7. **Never write to `~/.rsil/` during tests.** Always use `monkeypatch.setenv("RSIL_HOME", str(tmp_path))` to redirect all RSIL paths to a temporary directory.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Testing philosophy
|
|
115
|
+
|
|
116
|
+
- Unit tests mock `SecretManager` entirely using `pytest-mock`
|
|
117
|
+
- `test_crypto.py` generates fresh Fernet keys per test, never reuses keys across tests
|
|
118
|
+
- `test_executor.py` patches `core.process.spawn()` to avoid forking in unit tests
|
|
119
|
+
- Integration tests use a temporary `RSIL_HOME` via a `tmp_path` fixture
|
|
120
|
+
- No test should leave files in the real `~/.rsil/` directory
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Current version and status
|
|
125
|
+
|
|
126
|
+
See `pyproject.toml` for the current version (`0.1.0`).
|
|
127
|
+
See `docs/roadmap.md` for weekly milestones.
|
|
128
|
+
See `CHANGELOG.md` for version history.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Platform notes
|
|
133
|
+
|
|
134
|
+
- **macOS + Linux only.** `os.fork()` is a POSIX call. Windows is not supported.
|
|
135
|
+
- The process guard uses `psutil` (not `/proc`) so it works on both macOS and Linux.
|
|
136
|
+
- Tests should pass on both platforms.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Report a bug in RSIL
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Describe the bug
|
|
10
|
+
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
## To reproduce
|
|
14
|
+
|
|
15
|
+
Steps to reproduce the behavior:
|
|
16
|
+
|
|
17
|
+
1. Run `rsil ...`
|
|
18
|
+
2. See error
|
|
19
|
+
|
|
20
|
+
## Expected behavior
|
|
21
|
+
|
|
22
|
+
What you expected to happen.
|
|
23
|
+
|
|
24
|
+
## Actual behavior
|
|
25
|
+
|
|
26
|
+
What actually happened. Include error output if available.
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
paste error output here
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Environment
|
|
33
|
+
|
|
34
|
+
- OS: [e.g. macOS 15.0, Ubuntu 22.04]
|
|
35
|
+
- Python version: [e.g. 3.12.0]
|
|
36
|
+
- RSIL version: [e.g. 0.1.0 — run `rsil --version`]
|
|
37
|
+
- Install method: [pip / uv / source]
|
|
38
|
+
|
|
39
|
+
## Additional context
|
|
40
|
+
|
|
41
|
+
Any other context about the problem.
|
|
42
|
+
|
|
43
|
+
## Security note
|
|
44
|
+
|
|
45
|
+
**Do not include real secret values in bug reports.** Use placeholder values like `sk_test_XXXX`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest a new feature or improvement for RSIL
|
|
4
|
+
title: "[feat] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
A short description of the feature you'd like.
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
What problem does this solve? Who benefits from it?
|
|
16
|
+
|
|
17
|
+
## Proposed solution
|
|
18
|
+
|
|
19
|
+
How would this feature work? Include examples if possible.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Example CLI usage
|
|
23
|
+
rsil new-command --flag value
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Alternatives considered
|
|
27
|
+
|
|
28
|
+
Other approaches you've thought about and why you prefer this one.
|
|
29
|
+
|
|
30
|
+
## Scope
|
|
31
|
+
|
|
32
|
+
Which RSIL version milestone does this fit?
|
|
33
|
+
- [ ] v0.2 (process guard + env isolation)
|
|
34
|
+
- [ ] v0.3 (pipe-based injection)
|
|
35
|
+
- [ ] v0.4 (policy engine)
|
|
36
|
+
- [ ] post-v1.0 (team sync, daemon mode, network backends)
|
|
37
|
+
- [ ] unsure
|
|
38
|
+
|
|
39
|
+
## Additional context
|
|
40
|
+
|
|
41
|
+
Any other context, screenshots, or references.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
name: Lint & typecheck
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: "3.12"
|
|
19
|
+
|
|
20
|
+
- name: Install dev dependencies
|
|
21
|
+
run: pip install -e ".[dev]"
|
|
22
|
+
|
|
23
|
+
- name: Ruff lint
|
|
24
|
+
run: ruff check rsil/ tests/
|
|
25
|
+
|
|
26
|
+
- name: Ruff format check
|
|
27
|
+
run: ruff format --check rsil/ tests/
|
|
28
|
+
|
|
29
|
+
- name: Mypy
|
|
30
|
+
run: mypy rsil/
|
|
31
|
+
|
|
32
|
+
test:
|
|
33
|
+
name: Test (Python ${{ matrix.python-version }}, ${{ matrix.os }})
|
|
34
|
+
runs-on: ${{ matrix.os }}
|
|
35
|
+
strategy:
|
|
36
|
+
fail-fast: false
|
|
37
|
+
matrix:
|
|
38
|
+
python-version: ["3.11", "3.12"]
|
|
39
|
+
os: [ubuntu-latest, macos-latest]
|
|
40
|
+
|
|
41
|
+
steps:
|
|
42
|
+
- uses: actions/checkout@v4
|
|
43
|
+
|
|
44
|
+
- uses: actions/setup-python@v5
|
|
45
|
+
with:
|
|
46
|
+
python-version: ${{ matrix.python-version }}
|
|
47
|
+
|
|
48
|
+
- name: Install dependencies
|
|
49
|
+
run: pip install -e ".[dev]"
|
|
50
|
+
|
|
51
|
+
- name: Run tests
|
|
52
|
+
run: pytest --cov=rsil --cov-report=xml -q
|
|
53
|
+
|
|
54
|
+
- name: Upload coverage
|
|
55
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
|
|
56
|
+
uses: codecov/codecov-action@v4
|
|
57
|
+
with:
|
|
58
|
+
files: coverage.xml
|
|
59
|
+
fail_ci_if_error: false
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
environment:
|
|
9
|
+
description: "Target environment"
|
|
10
|
+
required: true
|
|
11
|
+
default: "testpypi"
|
|
12
|
+
type: choice
|
|
13
|
+
options:
|
|
14
|
+
- testpypi
|
|
15
|
+
- pypi
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
name: Build distribution
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- uses: actions/setup-python@v5
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
|
|
28
|
+
- name: Install build tools
|
|
29
|
+
run: pip install build
|
|
30
|
+
|
|
31
|
+
- name: Build sdist and wheel
|
|
32
|
+
run: python -m build
|
|
33
|
+
|
|
34
|
+
- name: Upload build artifacts
|
|
35
|
+
uses: actions/upload-artifact@v4
|
|
36
|
+
with:
|
|
37
|
+
name: dist
|
|
38
|
+
path: dist/
|
|
39
|
+
|
|
40
|
+
test-publish:
|
|
41
|
+
name: Publish to TestPyPI
|
|
42
|
+
needs: build
|
|
43
|
+
# Runs on every release, or when manually targeting testpypi
|
|
44
|
+
if: github.event_name == 'release' || inputs.environment == 'testpypi'
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
environment: testpypi
|
|
47
|
+
permissions:
|
|
48
|
+
id-token: write
|
|
49
|
+
steps:
|
|
50
|
+
- name: Download build artifacts
|
|
51
|
+
uses: actions/download-artifact@v4
|
|
52
|
+
with:
|
|
53
|
+
name: dist
|
|
54
|
+
path: dist/
|
|
55
|
+
|
|
56
|
+
- name: Publish to TestPyPI
|
|
57
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
58
|
+
with:
|
|
59
|
+
repository-url: https://test.pypi.org/legacy/
|
|
60
|
+
|
|
61
|
+
publish:
|
|
62
|
+
name: Publish to PyPI
|
|
63
|
+
needs: [build, test-publish]
|
|
64
|
+
# On release: runs after test-publish succeeds.
|
|
65
|
+
# On manual pypi trigger: test-publish is skipped, so allow skipped.
|
|
66
|
+
if: |
|
|
67
|
+
always() &&
|
|
68
|
+
needs.build.result == 'success' &&
|
|
69
|
+
(needs.test-publish.result == 'success' || needs.test-publish.result == 'skipped') &&
|
|
70
|
+
(github.event_name == 'release' || inputs.environment == 'pypi')
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
environment: pypi
|
|
73
|
+
permissions:
|
|
74
|
+
id-token: write
|
|
75
|
+
steps:
|
|
76
|
+
- name: Download build artifacts
|
|
77
|
+
uses: actions/download-artifact@v4
|
|
78
|
+
with:
|
|
79
|
+
name: dist
|
|
80
|
+
path: dist/
|
|
81
|
+
|
|
82
|
+
- name: Publish to PyPI
|
|
83
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
rsil-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# docs
|
|
10
|
+
.gitignore
|
|
11
|
+
docs/publishing.md
|
|
12
|
+
|
|
13
|
+
# Distribution / packaging
|
|
14
|
+
.Python
|
|
15
|
+
build/
|
|
16
|
+
develop-eggs/
|
|
17
|
+
dist/
|
|
18
|
+
downloads/
|
|
19
|
+
eggs/
|
|
20
|
+
.eggs/
|
|
21
|
+
lib/
|
|
22
|
+
lib64/
|
|
23
|
+
parts/
|
|
24
|
+
sdist/
|
|
25
|
+
var/
|
|
26
|
+
wheels/
|
|
27
|
+
share/python-wheels/
|
|
28
|
+
*.egg-info/
|
|
29
|
+
.installed.cfg
|
|
30
|
+
*.egg
|
|
31
|
+
MANIFEST
|
|
32
|
+
|
|
33
|
+
# PyInstaller
|
|
34
|
+
# Usually these files are written by a python script from a template
|
|
35
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
36
|
+
*.manifest
|
|
37
|
+
*.spec
|
|
38
|
+
|
|
39
|
+
# Installer logs
|
|
40
|
+
pip-log.txt
|
|
41
|
+
pip-delete-this-directory.txt
|
|
42
|
+
|
|
43
|
+
# Unit test / coverage reports
|
|
44
|
+
htmlcov/
|
|
45
|
+
.tox/
|
|
46
|
+
.nox/
|
|
47
|
+
.coverage
|
|
48
|
+
.coverage.*
|
|
49
|
+
.cache
|
|
50
|
+
nosetests.xml
|
|
51
|
+
coverage.xml
|
|
52
|
+
*.cover
|
|
53
|
+
*.py.cover
|
|
54
|
+
.hypothesis/
|
|
55
|
+
.pytest_cache/
|
|
56
|
+
cover/
|
|
57
|
+
|
|
58
|
+
# Translations
|
|
59
|
+
*.mo
|
|
60
|
+
*.pot
|
|
61
|
+
|
|
62
|
+
# Django stuff:
|
|
63
|
+
*.log
|
|
64
|
+
local_settings.py
|
|
65
|
+
db.sqlite3
|
|
66
|
+
db.sqlite3-journal
|
|
67
|
+
|
|
68
|
+
# Flask stuff:
|
|
69
|
+
instance/
|
|
70
|
+
.webassets-cache
|
|
71
|
+
|
|
72
|
+
# Scrapy stuff:
|
|
73
|
+
.scrapy
|
|
74
|
+
|
|
75
|
+
# Sphinx documentation
|
|
76
|
+
docs/_build/
|
|
77
|
+
|
|
78
|
+
# PyBuilder
|
|
79
|
+
.pybuilder/
|
|
80
|
+
target/
|
|
81
|
+
|
|
82
|
+
# Jupyter Notebook
|
|
83
|
+
.ipynb_checkpoints
|
|
84
|
+
|
|
85
|
+
# IPython
|
|
86
|
+
profile_default/
|
|
87
|
+
ipython_config.py
|
|
88
|
+
|
|
89
|
+
# pyenv
|
|
90
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
91
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
92
|
+
# .python-version
|
|
93
|
+
|
|
94
|
+
# pipenv
|
|
95
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
96
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
97
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
98
|
+
# install all needed dependencies.
|
|
99
|
+
#Pipfile.lock
|
|
100
|
+
|
|
101
|
+
# UV
|
|
102
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
103
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
104
|
+
# commonly ignored for libraries.
|
|
105
|
+
#uv.lock
|
|
106
|
+
|
|
107
|
+
# poetry
|
|
108
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
109
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
110
|
+
# commonly ignored for libraries.
|
|
111
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
112
|
+
#poetry.lock
|
|
113
|
+
#poetry.toml
|
|
114
|
+
|
|
115
|
+
# pdm
|
|
116
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
117
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
118
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
119
|
+
#pdm.lock
|
|
120
|
+
#pdm.toml
|
|
121
|
+
.pdm-python
|
|
122
|
+
.pdm-build/
|
|
123
|
+
|
|
124
|
+
# pixi
|
|
125
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
126
|
+
#pixi.lock
|
|
127
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
128
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
129
|
+
.pixi
|
|
130
|
+
|
|
131
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
132
|
+
__pypackages__/
|
|
133
|
+
|
|
134
|
+
# Celery stuff
|
|
135
|
+
celerybeat-schedule
|
|
136
|
+
celerybeat.pid
|
|
137
|
+
|
|
138
|
+
# SageMath parsed files
|
|
139
|
+
*.sage.py
|
|
140
|
+
|
|
141
|
+
# Environments
|
|
142
|
+
.env
|
|
143
|
+
.envrc
|
|
144
|
+
.venv
|
|
145
|
+
env/
|
|
146
|
+
venv/
|
|
147
|
+
ENV/
|
|
148
|
+
env.bak/
|
|
149
|
+
venv.bak/
|
|
150
|
+
|
|
151
|
+
# Spyder project settings
|
|
152
|
+
.spyderproject
|
|
153
|
+
.spyproject
|
|
154
|
+
|
|
155
|
+
# Rope project settings
|
|
156
|
+
.ropeproject
|
|
157
|
+
|
|
158
|
+
# mkdocs documentation
|
|
159
|
+
/site
|
|
160
|
+
|
|
161
|
+
# mypy
|
|
162
|
+
.mypy_cache/
|
|
163
|
+
.dmypy.json
|
|
164
|
+
dmypy.json
|
|
165
|
+
|
|
166
|
+
# Pyre type checker
|
|
167
|
+
.pyre/
|
|
168
|
+
|
|
169
|
+
# pytype static type analyzer
|
|
170
|
+
.pytype/
|
|
171
|
+
|
|
172
|
+
# Cython debug symbols
|
|
173
|
+
cython_debug/
|
|
174
|
+
|
|
175
|
+
# PyCharm
|
|
176
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
177
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
178
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
179
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
180
|
+
#.idea/
|
|
181
|
+
|
|
182
|
+
# Abstra
|
|
183
|
+
# Abstra is an AI-powered process automation framework.
|
|
184
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
185
|
+
# Learn more at https://abstra.io/docs
|
|
186
|
+
.abstra/
|
|
187
|
+
|
|
188
|
+
# Visual Studio Code
|
|
189
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
190
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
191
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
192
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
193
|
+
# .vscode/
|
|
194
|
+
|
|
195
|
+
# Ruff stuff:
|
|
196
|
+
.ruff_cache/
|
|
197
|
+
|
|
198
|
+
# PyPI configuration file
|
|
199
|
+
.pypirc
|
|
200
|
+
|
|
201
|
+
# Cursor
|
|
202
|
+
# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
|
|
203
|
+
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
|
|
204
|
+
# refer to https://docs.cursor.com/context/ignore-files
|
|
205
|
+
.cursorignore
|
|
206
|
+
.cursorindexingignore
|
|
207
|
+
|
|
208
|
+
# Marimo
|
|
209
|
+
marimo/_static/
|
|
210
|
+
marimo/_lsp/
|
|
211
|
+
__marimo__/
|
rsil-0.1.0/CHANGELOG.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to RSIL are documented here.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Initial project scaffold
|
|
12
|
+
- `pyproject.toml` with hatchling build backend
|
|
13
|
+
- Full package skeleton: `rsil/cli/`, `rsil/core/`, `rsil/secrets/`, `rsil/policy/`, `rsil/security/`, `rsil/utils/`
|
|
14
|
+
- `rsil/secrets/` — Fernet-based encrypted local store
|
|
15
|
+
- `rsil/core/` — POSIX fork/execve execution engine with minimal environment
|
|
16
|
+
- `rsil/security/` — process guard (AI agent detection), output redactor, audit logger
|
|
17
|
+
- `rsil/policy/` — YAML-based policy rule loader and stub engine
|
|
18
|
+
- `rsil/utils/` — config loader and logger
|
|
19
|
+
- `docs/architecture.md` — full architecture documentation
|
|
20
|
+
- `docs/roadmap.md` — 12-week development roadmap
|
|
21
|
+
- `.claude/CLAUDE.md` — project context and constraints for AI-assisted development
|
|
22
|
+
- `examples/simple_app/` — minimal Python app demonstrating secret injection
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## [0.1.0] — *Target: 2026-05-02*
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- `rsil init` — initialize `~/.rsil/` and generate master key
|
|
30
|
+
- `rsil add KEY=value --service NAME` — add/update a secret
|
|
31
|
+
- `rsil list [--service NAME]` — list secret keys (never values)
|
|
32
|
+
- `rsil delete KEY --service NAME` — remove a secret
|
|
33
|
+
- `rsil run --service NAME -- COMMAND` — run a command with secrets injected
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## [0.2.0] — *Target: 2026-05-23*
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- Process guard: detect and block AI coding agents by parent process name
|
|
41
|
+
- Minimal environment: child process inherits only `PATH`, `HOME`, `USER`, `LANG`, `TERM`
|
|
42
|
+
- Core dump prevention: `RLIMIT_CORE = 0` in child before exec
|
|
43
|
+
- Full integration test suite
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## [0.3.0] — *Target: 2026-06-13*
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
- Pipe-based secret injection (`--inject-mode=pipe`)
|
|
51
|
+
- `rsil.inject` helper for Python apps to read secrets from fd 3
|
|
52
|
+
- Audit logging to `~/.rsil/audit.log` (JSON-lines)
|
|
53
|
+
- `~/.rsil/config.toml` support
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## [0.4.0] — *Target: 2026-07-05*
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- Policy engine: YAML-based allow/deny rules evaluated at runtime
|
|
61
|
+
- Binary hash verification in policy rules
|
|
62
|
+
- `rsil policy validate` and `rsil policy check` commands
|
|
63
|
+
- `examples/fastapi_app/` — FastAPI demo with RSIL integration
|