veyra-proof 0.3.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.
- veyra_proof-0.3.0/.cursor/skills/veyra-proof/SKILL.md +115 -0
- veyra_proof-0.3.0/.cursor/skills/veyra-proof/reference.md +103 -0
- veyra_proof-0.3.0/.github/workflows/ci.yml +71 -0
- veyra_proof-0.3.0/.github/workflows/publish.yml +57 -0
- veyra_proof-0.3.0/LICENSE +22 -0
- veyra_proof-0.3.0/MANIFEST.in +28 -0
- veyra_proof-0.3.0/PKG-INFO +417 -0
- veyra_proof-0.3.0/README.md +384 -0
- veyra_proof-0.3.0/SECURITY.md +7 -0
- veyra_proof-0.3.0/Veyra/LICENSE +22 -0
- veyra_proof-0.3.0/Veyra/README.md +189 -0
- veyra_proof-0.3.0/Veyra/examples/veyra.toml +53 -0
- veyra_proof-0.3.0/Veyra/install.py +315 -0
- veyra_proof-0.3.0/Veyra/skills/veyra-proof/SKILL.md +115 -0
- veyra_proof-0.3.0/Veyra/skills/veyra-proof/reference.md +103 -0
- veyra_proof-0.3.0/pyproject.toml +68 -0
- veyra_proof-0.3.0/requirements-dev.txt +3 -0
- veyra_proof-0.3.0/scripts/ci_assert_evidence.py +344 -0
- veyra_proof-0.3.0/scripts/sync_skill.py +361 -0
- veyra_proof-0.3.0/setup.cfg +4 -0
- veyra_proof-0.3.0/src/veyra_proof/__init__.py +4 -0
- veyra_proof-0.3.0/src/veyra_proof/__main__.py +6 -0
- veyra_proof-0.3.0/src/veyra_proof/cli.py +550 -0
- veyra_proof-0.3.0/src/veyra_proof/command_runner.py +319 -0
- veyra_proof-0.3.0/src/veyra_proof/config.py +349 -0
- veyra_proof-0.3.0/src/veyra_proof/discovery.py +112 -0
- veyra_proof-0.3.0/src/veyra_proof/hashing.py +79 -0
- veyra_proof-0.3.0/src/veyra_proof/installer.py +150 -0
- veyra_proof-0.3.0/src/veyra_proof/models.py +186 -0
- veyra_proof-0.3.0/src/veyra_proof/platform_info.py +111 -0
- veyra_proof-0.3.0/src/veyra_proof/reporting.py +399 -0
- veyra_proof-0.3.0/src/veyra_proof/templates/report.md.j2 +50 -0
- veyra_proof-0.3.0/src/veyra_proof/tool_registry.py +277 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/__init__.py +52 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/anti_theater.py +561 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/audit.py +136 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/base.py +430 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/cargo_check.py +160 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/cargo_test.py +76 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/check_external_types.py +71 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/clippy.py +142 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/deny.py +116 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/dylint.py +75 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/e2e.py +670 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/fuzz.py +110 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/geiger.py +136 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/kani.py +94 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/llvm_cov.py +146 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/machete.py +71 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/miri.py +86 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/mutants.py +82 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/nextest.py +68 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/reproducible_build.py +211 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/rustfmt.py +77 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/sast_optional.py +167 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/semver_checks.py +90 -0
- veyra_proof-0.3.0/src/veyra_proof/tools/vet.py +71 -0
- veyra_proof-0.3.0/src/veyra_proof/workspace.py +136 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/PKG-INFO +417 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/SOURCES.txt +86 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/dependency_links.txt +1 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/entry_points.txt +2 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/requires.txt +10 -0
- veyra_proof-0.3.0/src/veyra_proof.egg-info/top_level.txt +1 -0
- veyra_proof-0.3.0/tests/fixtures/cargo_metadata_sample.json +21 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/Cargo.lock +7 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/Cargo.toml +8 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/deny.toml +19 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/src/lib.rs +79 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/src/main.rs +128 -0
- veyra_proof-0.3.0/tests/fixtures/demo_crate/veyra.toml +42 -0
- veyra_proof-0.3.0/tests/test_anti_theater_noise.py +454 -0
- veyra_proof-0.3.0/tests/test_ci_assert_evidence.py +442 -0
- veyra_proof-0.3.0/tests/test_command_runner.py +84 -0
- veyra_proof-0.3.0/tests/test_docs_match_code.py +198 -0
- veyra_proof-0.3.0/tests/test_dry_run_cli.py +65 -0
- veyra_proof-0.3.0/tests/test_e2e_live.py +151 -0
- veyra_proof-0.3.0/tests/test_e2e_tool.py +558 -0
- veyra_proof-0.3.0/tests/test_geiger_semver_tools.py +341 -0
- veyra_proof-0.3.0/tests/test_hashing_and_policy.py +58 -0
- veyra_proof-0.3.0/tests/test_lockfile_policy.py +265 -0
- veyra_proof-0.3.0/tests/test_platform_info.py +16 -0
- veyra_proof-0.3.0/tests/test_reporting.py +275 -0
- veyra_proof-0.3.0/tests/test_skill_document.py +568 -0
- veyra_proof-0.3.0/tests/test_tool_registry.py +20 -0
- veyra_proof-0.3.0/tests/test_verdicts.py +844 -0
- veyra_proof-0.3.0/tests/test_workspace.py +43 -0
- veyra_proof-0.3.0/veyra-proof.spec +45 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: veyra-proof
|
|
3
|
+
description: >-
|
|
4
|
+
Audits a Rust Cargo workspace by actually running the real toolchain (fmt,
|
|
5
|
+
clippy, test, llvm-cov, cargo-deny, cargo-geiger, machete, semver-checks,
|
|
6
|
+
miri, cargo-fuzz, kani, mutants) plus anti-theater heuristics, then writes
|
|
7
|
+
reproducible evidence. Use when the user asks to audit, scan, or check a
|
|
8
|
+
Rust/Cargo workspace, run veyra doctor/plan/audit, wire it into a repo, or
|
|
9
|
+
wants a CI-grade pass/fail verdict. Reports MISSING or SKIPPED instead of a
|
|
10
|
+
green checkmark it cannot justify.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Veyra Proof
|
|
14
|
+
|
|
15
|
+
Evidence-based auditor for local Rust Cargo workspaces. Results come only from tools that actually ran.
|
|
16
|
+
|
|
17
|
+
This folder is the **canonical copy**. It follows the open `SKILL.md` standard, so the same file works in Cursor, Claude Code, Codex, Antigravity, Freebuff, OpenCode, Copilot, and Windsurf. Maintainers: see the repository README for the fan-out command.
|
|
18
|
+
|
|
19
|
+
<!-- HARD_RULES_START -->
|
|
20
|
+
## Hard rules
|
|
21
|
+
|
|
22
|
+
The block between `HARD_RULES_START` and `HARD_RULES_END` is frozen. No automated mutation — skill optimizer, `mcp_mutate_skill`, self-revision, or linter — may edit, reorder, reword, or drop anything inside it. Only a human may change it, deliberately, in a reviewable diff.
|
|
23
|
+
|
|
24
|
+
- Never invent tool output, pass/fail, versions, or evidence.
|
|
25
|
+
- Never `curl | sh`, never arbitrary download installers, never disable lints or tests to pass.
|
|
26
|
+
- Never mutate `Cargo.toml` (V1 has no automatic manifest edits).
|
|
27
|
+
- Never run `cargo update` unless the user explicitly asked for `--update-lockfile`.
|
|
28
|
+
- `--install-missing` only when the user confirmed installs **or** passed `--yes`.
|
|
29
|
+
- If Cargo or rustup is missing, stop and report; do not install Rust toolchains via scripts.
|
|
30
|
+
- Quote real exit codes and paths from the run; say SKIPPED or MISSING when that is what happened.
|
|
31
|
+
- Never report a tool as OK when it was not run, not installed, or timed out.
|
|
32
|
+
<!-- HARD_RULES_END -->
|
|
33
|
+
|
|
34
|
+
## Resolve the CLI (`VEYRA`)
|
|
35
|
+
|
|
36
|
+
Pick the first that works:
|
|
37
|
+
|
|
38
|
+
1. `veyra` on PATH — check with `command -v veyra`
|
|
39
|
+
2. Env `VEYRA_PROOF_BIN` — absolute path to the binary
|
|
40
|
+
3. Env `VEYRA_PROOF_HOME` — then `"$VEYRA_PROOF_HOME/.venv/bin/python" -m veyra_proof` (Windows: `.venv\Scripts\python`)
|
|
41
|
+
4. A clone in the current repo — `.venv/bin/python -m veyra_proof` (Windows: `.venv\Scripts\python`), after confirming `.venv` exists
|
|
42
|
+
5. `python3 -m veyra_proof` if the package is importable
|
|
43
|
+
|
|
44
|
+
Set the shell variable `VEYRA` to the winning invocation. Examples: `VEYRA="veyra"`, `VEYRA=".venv/bin/python -m veyra_proof"`.
|
|
45
|
+
|
|
46
|
+
Never hardcode a machine-specific absolute path. If none of the five resolve, ask the user for the clone path or binary, then export one of the two env vars.
|
|
47
|
+
|
|
48
|
+
**Done when:** `$VEYRA --version` prints a version, or the install branch is required.
|
|
49
|
+
|
|
50
|
+
## Branch: install
|
|
51
|
+
|
|
52
|
+
When the user wants Veyra available (any project, this machine):
|
|
53
|
+
|
|
54
|
+
1. If resolution already works, run `$VEYRA doctor` and stop. Print cargo and rustc status honestly.
|
|
55
|
+
2. Otherwise ask once for the source: **editable clone path** or **existing PyInstaller binary**.
|
|
56
|
+
3. Editable install (preferred for agents):
|
|
57
|
+
```bash
|
|
58
|
+
cd "$CLONE" && python3 -m venv .venv
|
|
59
|
+
.venv/bin/pip install -e .
|
|
60
|
+
export VEYRA_PROOF_HOME="$CLONE"
|
|
61
|
+
```
|
|
62
|
+
4. Binary: copy or symlink `veyra` onto PATH, or set `VEYRA_PROOF_BIN`.
|
|
63
|
+
5. Re-resolve `VEYRA`, run `$VEYRA doctor`. If cargo is missing, give guidance only — no rustup bootstrap scripts.
|
|
64
|
+
|
|
65
|
+
**Done when:** `$VEYRA doctor` returns JSON and cargo is OK, or you reported the exact blocker.
|
|
66
|
+
|
|
67
|
+
## Branch: audit
|
|
68
|
+
|
|
69
|
+
Target is a path containing `Cargo.toml` (workspace or package). Default profile is `standard` unless the user asked for `quick` or `hardened`.
|
|
70
|
+
|
|
71
|
+
1. Resolve `VEYRA` (use the install branch if missing).
|
|
72
|
+
2. `$VEYRA plan "$TARGET" --profile <profile>`
|
|
73
|
+
3. If the plan shows pending installs:
|
|
74
|
+
- The user already said yes, or `--yes` was passed — add `--install-missing --yes`, plus `--verbose` and a higher `--timeout` when installs will compile.
|
|
75
|
+
- Otherwise list the pending tools and **ask** before installing.
|
|
76
|
+
4. Run:
|
|
77
|
+
```bash
|
|
78
|
+
$VEYRA audit "$TARGET" --profile <profile> [flags]
|
|
79
|
+
```
|
|
80
|
+
5. Report from real output only: the decision, the exit code, and the evidence dir under `$TARGET/.veyra/evidence/<UTC>/` (or wherever `--evidence-dir` pointed).
|
|
81
|
+
6. If the project declares `[[e2e.scenarios]]` in `veyra.toml`, `veyra-e2e` builds the workspace and drives the produced binary through each declared journey. Report what each scenario observed — exit code and printed output, from its log — not only the tool's status. No declared scenarios means SKIPPED: say the behavior was not verified instead of implying it was.
|
|
82
|
+
7. Say `INCONCLUSIVE` in words. It covers a stale lockfile, a nightly-only target and a timeout — each one means a check did not complete. Never describe an accepted run as "clean" without naming what was skipped, inconclusive or informational; the anti-theater log opens with a rule histogram of everything it noticed.
|
|
83
|
+
|
|
84
|
+
**Done when:** the audit finished (or dry-run / plan-only if that is what was asked) and the user sees the real verdict plus the evidence path.
|
|
85
|
+
|
|
86
|
+
Useful flags, profiles, and exit codes live in [reference.md](reference.md).
|
|
87
|
+
|
|
88
|
+
## Branch: wire
|
|
89
|
+
|
|
90
|
+
Lightweight project wiring, with no `Cargo.toml` edits:
|
|
91
|
+
|
|
92
|
+
1. Confirm the target is a Cargo root.
|
|
93
|
+
2. Only if the user asked for config, write a minimal `veyra.toml`. Do not invent fuzz targets, CodeQL databases, or mutants paths.
|
|
94
|
+
3. Optionally add a short note to the project README: how to run `$VEYRA doctor` and `$VEYRA audit . --profile quick`.
|
|
95
|
+
4. Do **not** auto-commit. Do **not** add CI secrets or remote download steps.
|
|
96
|
+
|
|
97
|
+
Minimal optional `veyra.toml` skeleton — edit only what the user wants:
|
|
98
|
+
|
|
99
|
+
```toml
|
|
100
|
+
[project]
|
|
101
|
+
critical_paths = []
|
|
102
|
+
|
|
103
|
+
[policy]
|
|
104
|
+
# leave defaults unless the user specifies policy knobs
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Done when:** the requested files exist and the commands to run are stated, with no "wired and passing" claim that no audit run supports.
|
|
108
|
+
|
|
109
|
+
## Honesty checklist
|
|
110
|
+
|
|
111
|
+
- [ ] Every claimed status came from a real command
|
|
112
|
+
- [ ] Missing tools are reported as MISSING or SKIPPED, never OK
|
|
113
|
+
- [ ] Installs happened only with confirmation or `--yes`
|
|
114
|
+
- [ ] The evidence path is cited whenever an audit ran
|
|
115
|
+
- [ ] No "verified end to end" claim without a scenario that observed it
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Veyra reference
|
|
2
|
+
|
|
3
|
+
## Profiles
|
|
4
|
+
|
|
5
|
+
| Profile | Intent |
|
|
6
|
+
|---------|--------|
|
|
7
|
+
| `quick` | rustfmt, cargo-check, clippy `-D warnings`, cargo-test, audit, veyra-anti-theater, veyra-e2e (if scenarios declared) |
|
|
8
|
+
| `standard` | quick + nextest, llvm-cov, deny, geiger, machete, dylint (if configured), semver-checks (libs) |
|
|
9
|
+
| `hardened` | standard + miri, mutants (configured paths), fuzz (configured targets), kani, vet, check-external-types, reproducible-build |
|
|
10
|
+
|
|
11
|
+
Heavy tools SKIP with an explicit reason when config/targets are missing.
|
|
12
|
+
|
|
13
|
+
`reproducible-build` runs two clean builds and compares the final artifacts; it is
|
|
14
|
+
the most expensive check in `hardened` and `--exclude reproducible-build` turns it
|
|
15
|
+
off. Differing hashes are `INCONCLUSIVE` with both digests, never a pass, and are
|
|
16
|
+
informational unless `policy.require_reproducible_build = true`.
|
|
17
|
+
|
|
18
|
+
Every tool records its own duration: `report.json` has a `timing` block and
|
|
19
|
+
`report.md` a `## Time` table with per-tool seconds, the total and the wall clock.
|
|
20
|
+
Quote it when someone asks why an audit took minutes — on a real crate the cost is
|
|
21
|
+
usually its own test suite. Veyra neither caches builds across runs nor skips checks
|
|
22
|
+
to go faster.
|
|
23
|
+
|
|
24
|
+
## Verdicts that are not passes
|
|
25
|
+
|
|
26
|
+
| Situation | Verdict |
|
|
27
|
+
|-----------|---------|
|
|
28
|
+
| `Cargo.lock` out of date with `Cargo.toml` | `INCONCLUSIVE` — cargo runs with `--locked`, and Veyra will not rewrite the lockfile |
|
|
29
|
+
| Manifest declares dependencies, no lockfile | `SKIPPED` + `unlocked-dependencies` — dependency safety is unknown |
|
|
30
|
+
| A target needs nightly (`#![feature]`) | `INCONCLUSIVE`, naming the files not verified; lib/bins/tests are still checked |
|
|
31
|
+
| Scenario timed out, tool timed out | `INCONCLUSIVE` |
|
|
32
|
+
|
|
33
|
+
## Heuristic policy (`veyra.toml` `[policy]`)
|
|
34
|
+
|
|
35
|
+
`todo!()` / `unimplemented!()` in a production path are blockers. Everything else is
|
|
36
|
+
reported and only blocks when asked for: `fail_on_ignored_tests`, `fail_on_panic`,
|
|
37
|
+
`fail_on_lint_allow`, `fail_on_weak_oracles`, `fail_on_cfg_tricks`, `deny_unsafe`.
|
|
38
|
+
|
|
39
|
+
## Exit codes
|
|
40
|
+
|
|
41
|
+
| Code | Meaning |
|
|
42
|
+
|------|---------|
|
|
43
|
+
| 0 | Required checks completed without blocking findings |
|
|
44
|
+
| 1 | Problems / findings / rejection |
|
|
45
|
+
| 2 | Missing prerequisites, unauthorized install, or required tools not executable |
|
|
46
|
+
| 3 | Internal application error |
|
|
47
|
+
|
|
48
|
+
## End-to-end behavior (`veyra-e2e`)
|
|
49
|
+
|
|
50
|
+
Builds the workspace with the real toolchain and runs the binary cargo produced through the journeys declared in `veyra.toml`, comparing exit code, stdout, stderr and written files with what was declared. It only proves what the scenarios cover.
|
|
51
|
+
|
|
52
|
+
```toml
|
|
53
|
+
[e2e]
|
|
54
|
+
build_profile = "release" # or "debug"
|
|
55
|
+
features = [] # feature flags of the shipped configuration
|
|
56
|
+
no_default_features = false
|
|
57
|
+
binaries = [] # defaults to the workspace's first built bin target
|
|
58
|
+
timeout_seconds = 60
|
|
59
|
+
|
|
60
|
+
[[e2e.scenarios]]
|
|
61
|
+
name = "add sums two integers"
|
|
62
|
+
argv = ["add", "1", "2"]
|
|
63
|
+
expect_exit = 0
|
|
64
|
+
expect_stdout_regex = '^3\r?\n?$'
|
|
65
|
+
# stdin = ""
|
|
66
|
+
# expect_stderr_regex = 'division by zero'
|
|
67
|
+
# expect_files = ["out/report.txt"]
|
|
68
|
+
# expect_failure = true # any non-zero exit; set expect_exit for an exact one
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
| Outcome | Meaning |
|
|
72
|
+
|---------|---------|
|
|
73
|
+
| `OK` | every scenario observed what it declared |
|
|
74
|
+
| `FINDINGS` | `E2E00` vacuous scenario, `E2E01` exit mismatch, `E2E02` output/file mismatch, `E2ECFG` invalid configuration, `E2E03` informational reachability note |
|
|
75
|
+
| `INCONCLUSIVE` | the build or a scenario timed out, or the workspace builds no binary |
|
|
76
|
+
| `SKIPPED` | no scenarios declared: behavior was **not** verified |
|
|
77
|
+
| `ERROR` | `cargo build` failed; nothing was executed |
|
|
78
|
+
|
|
79
|
+
Required in every profile exactly when scenarios are declared (and available to `--include`). `E2E03` never blocks a verdict.
|
|
80
|
+
|
|
81
|
+
## Evidence
|
|
82
|
+
|
|
83
|
+
Default: `PATH/.veyra/evidence/<UTC_TIMESTAMP>/` with `report.md`, `report.json`, `manifest.json`, per-tool logs, hashes.
|
|
84
|
+
|
|
85
|
+
Every log a tool writes — `stdout.log`, `stderr.log`, and `skip.txt` when a tool skips after running — is pinned by its sha256 in that tool's `artifact_hashes`, so the report states what its own evidence held. `scripts/ci_assert_evidence.py` recomputes those digests and fails a report whose log changed after the run, was deleted, or is not pinned at all for an `OK` verdict.
|
|
86
|
+
|
|
87
|
+
## Safety defaults
|
|
88
|
+
|
|
89
|
+
| Action | Default |
|
|
90
|
+
|--------|---------|
|
|
91
|
+
| Modify `Cargo.toml` | Forbidden |
|
|
92
|
+
| Rewrite `Cargo.lock` during a run | Forbidden — cargo runs with `--locked` |
|
|
93
|
+
| `cargo update` | Needs `--update-lockfile` |
|
|
94
|
+
| Install tools | Needs `--install-missing` + confirm or `--yes` |
|
|
95
|
+
| `curl \| sh` | Never |
|
|
96
|
+
|
|
97
|
+
`--fail-on none` accepts the run whatever it found; the findings stay in `report.json`.
|
|
98
|
+
It is the only value that disables rejection, and it cannot excuse an unauthorized
|
|
99
|
+
project file change.
|
|
100
|
+
|
|
101
|
+
## Packaging note
|
|
102
|
+
|
|
103
|
+
PyInstaller binaries are OS/arch-specific. Build on the target host; unsigned macOS binaries may need Gatekeeper “Open anyway.”
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
name: py${{ matrix.python }} / ${{ matrix.os }}
|
|
19
|
+
runs-on: ${{ matrix.os }}
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
24
|
+
python: ["3.10", "3.13"]
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.python }}
|
|
30
|
+
|
|
31
|
+
# One command per step: `&&` is not portable across the default shells
|
|
32
|
+
# of ubuntu, macos and windows runners.
|
|
33
|
+
- name: Upgrade pip
|
|
34
|
+
run: python -m pip install --upgrade pip
|
|
35
|
+
- name: Install
|
|
36
|
+
run: python -m pip install -e ".[dev]"
|
|
37
|
+
|
|
38
|
+
- name: Tests
|
|
39
|
+
run: python -m pytest
|
|
40
|
+
|
|
41
|
+
- name: The console script is on PATH
|
|
42
|
+
run: veyra --version
|
|
43
|
+
|
|
44
|
+
audit:
|
|
45
|
+
name: live audit of the demo crate
|
|
46
|
+
runs-on: ubuntu-latest
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
- uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: "3.12"
|
|
52
|
+
|
|
53
|
+
- name: Install
|
|
54
|
+
run: python -m pip install -e ".[dev]"
|
|
55
|
+
|
|
56
|
+
# `quick` makes cargo-audit required as soon as the target has a lockfile,
|
|
57
|
+
# and the runner images do not ship it. Without the binary the auditor
|
|
58
|
+
# exits 2 (missing prerequisites), which is not a verdict and fails here.
|
|
59
|
+
- name: Install cargo-audit
|
|
60
|
+
run: cargo install cargo-audit --locked
|
|
61
|
+
|
|
62
|
+
- name: Report the toolchain this run will use
|
|
63
|
+
run: |
|
|
64
|
+
cargo --version
|
|
65
|
+
rustc --version
|
|
66
|
+
|
|
67
|
+
# Unit tests mock subprocess, so they cannot catch a broken tool
|
|
68
|
+
# invocation. This runs the real thing: real cargo, real exit codes,
|
|
69
|
+
# and then a check that the evidence on disk matches the claim.
|
|
70
|
+
- name: Run the auditor and verify its evidence
|
|
71
|
+
run: python scripts/ci_assert_evidence.py tests/fixtures/demo_crate
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Publishing uses PyPI trusted publishing (OIDC): the `id-token: write`
|
|
4
|
+
# permission below is what replaces an API token. Nothing secret lives in this
|
|
5
|
+
# repository, and nothing needs rotating.
|
|
6
|
+
#
|
|
7
|
+
# One-time setup on PyPI, for the project `veyra-proof`:
|
|
8
|
+
# https://pypi.org/manage/account/publishing/ -> add a pending publisher
|
|
9
|
+
# owner: ExyonQ
|
|
10
|
+
# repo: Veyra-Proof
|
|
11
|
+
# workflow: publish.yml
|
|
12
|
+
# The `pypi` environment referenced below must also exist on the repository.
|
|
13
|
+
|
|
14
|
+
on:
|
|
15
|
+
release:
|
|
16
|
+
types: [published]
|
|
17
|
+
workflow_dispatch:
|
|
18
|
+
|
|
19
|
+
permissions:
|
|
20
|
+
contents: read
|
|
21
|
+
|
|
22
|
+
jobs:
|
|
23
|
+
build:
|
|
24
|
+
name: build distributions
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- uses: actions/setup-python@v5
|
|
29
|
+
with:
|
|
30
|
+
python-version: "3.12"
|
|
31
|
+
|
|
32
|
+
- name: Build sdist and wheel
|
|
33
|
+
run: |
|
|
34
|
+
python -m pip install --upgrade build
|
|
35
|
+
python -m build
|
|
36
|
+
|
|
37
|
+
- name: Describe what will be published
|
|
38
|
+
run: ls -l dist
|
|
39
|
+
|
|
40
|
+
- uses: actions/upload-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
|
|
45
|
+
publish:
|
|
46
|
+
name: upload to PyPI
|
|
47
|
+
needs: build
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
environment: pypi
|
|
50
|
+
permissions:
|
|
51
|
+
id-token: write
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/download-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: dist
|
|
56
|
+
path: dist/
|
|
57
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Antonio Cantallops Alba
|
|
4
|
+
Contact: contact@exyonq.org
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# The published sdist should describe the whole product, not just the importable
|
|
2
|
+
# package. Half of what this project ships is the agent skill, and the other
|
|
3
|
+
# half is the tooling that keeps it honest.
|
|
4
|
+
#
|
|
5
|
+
# `.cursor` is listed file by file on purpose. A wildcard there would sweep up
|
|
6
|
+
# editor and agent state that happens to sit in the working copy — brain
|
|
7
|
+
# databases, hook scripts, local rule files — and none of that belongs on PyPI.
|
|
8
|
+
|
|
9
|
+
include LICENSE
|
|
10
|
+
include README.md
|
|
11
|
+
include SECURITY.md
|
|
12
|
+
include requirements-dev.txt
|
|
13
|
+
include veyra-proof.spec
|
|
14
|
+
include MANIFEST.in
|
|
15
|
+
|
|
16
|
+
include .cursor/skills/veyra-proof/SKILL.md
|
|
17
|
+
include .cursor/skills/veyra-proof/reference.md
|
|
18
|
+
include Veyra/skills/veyra-proof/SKILL.md
|
|
19
|
+
include Veyra/skills/veyra-proof/reference.md
|
|
20
|
+
|
|
21
|
+
recursive-include scripts *.py
|
|
22
|
+
recursive-include Veyra *.md *.py *.toml LICENSE
|
|
23
|
+
recursive-include tests *.py *.json *.toml *.lock *.rs
|
|
24
|
+
recursive-include .github *.yml
|
|
25
|
+
|
|
26
|
+
global-exclude __pycache__/* *.py[cod] .DS_Store
|
|
27
|
+
prune tests/fixtures/demo_crate/target
|
|
28
|
+
prune tests/fixtures/demo_crate/.veyra
|