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.
Files changed (88) hide show
  1. veyra_proof-0.3.0/.cursor/skills/veyra-proof/SKILL.md +115 -0
  2. veyra_proof-0.3.0/.cursor/skills/veyra-proof/reference.md +103 -0
  3. veyra_proof-0.3.0/.github/workflows/ci.yml +71 -0
  4. veyra_proof-0.3.0/.github/workflows/publish.yml +57 -0
  5. veyra_proof-0.3.0/LICENSE +22 -0
  6. veyra_proof-0.3.0/MANIFEST.in +28 -0
  7. veyra_proof-0.3.0/PKG-INFO +417 -0
  8. veyra_proof-0.3.0/README.md +384 -0
  9. veyra_proof-0.3.0/SECURITY.md +7 -0
  10. veyra_proof-0.3.0/Veyra/LICENSE +22 -0
  11. veyra_proof-0.3.0/Veyra/README.md +189 -0
  12. veyra_proof-0.3.0/Veyra/examples/veyra.toml +53 -0
  13. veyra_proof-0.3.0/Veyra/install.py +315 -0
  14. veyra_proof-0.3.0/Veyra/skills/veyra-proof/SKILL.md +115 -0
  15. veyra_proof-0.3.0/Veyra/skills/veyra-proof/reference.md +103 -0
  16. veyra_proof-0.3.0/pyproject.toml +68 -0
  17. veyra_proof-0.3.0/requirements-dev.txt +3 -0
  18. veyra_proof-0.3.0/scripts/ci_assert_evidence.py +344 -0
  19. veyra_proof-0.3.0/scripts/sync_skill.py +361 -0
  20. veyra_proof-0.3.0/setup.cfg +4 -0
  21. veyra_proof-0.3.0/src/veyra_proof/__init__.py +4 -0
  22. veyra_proof-0.3.0/src/veyra_proof/__main__.py +6 -0
  23. veyra_proof-0.3.0/src/veyra_proof/cli.py +550 -0
  24. veyra_proof-0.3.0/src/veyra_proof/command_runner.py +319 -0
  25. veyra_proof-0.3.0/src/veyra_proof/config.py +349 -0
  26. veyra_proof-0.3.0/src/veyra_proof/discovery.py +112 -0
  27. veyra_proof-0.3.0/src/veyra_proof/hashing.py +79 -0
  28. veyra_proof-0.3.0/src/veyra_proof/installer.py +150 -0
  29. veyra_proof-0.3.0/src/veyra_proof/models.py +186 -0
  30. veyra_proof-0.3.0/src/veyra_proof/platform_info.py +111 -0
  31. veyra_proof-0.3.0/src/veyra_proof/reporting.py +399 -0
  32. veyra_proof-0.3.0/src/veyra_proof/templates/report.md.j2 +50 -0
  33. veyra_proof-0.3.0/src/veyra_proof/tool_registry.py +277 -0
  34. veyra_proof-0.3.0/src/veyra_proof/tools/__init__.py +52 -0
  35. veyra_proof-0.3.0/src/veyra_proof/tools/anti_theater.py +561 -0
  36. veyra_proof-0.3.0/src/veyra_proof/tools/audit.py +136 -0
  37. veyra_proof-0.3.0/src/veyra_proof/tools/base.py +430 -0
  38. veyra_proof-0.3.0/src/veyra_proof/tools/cargo_check.py +160 -0
  39. veyra_proof-0.3.0/src/veyra_proof/tools/cargo_test.py +76 -0
  40. veyra_proof-0.3.0/src/veyra_proof/tools/check_external_types.py +71 -0
  41. veyra_proof-0.3.0/src/veyra_proof/tools/clippy.py +142 -0
  42. veyra_proof-0.3.0/src/veyra_proof/tools/deny.py +116 -0
  43. veyra_proof-0.3.0/src/veyra_proof/tools/dylint.py +75 -0
  44. veyra_proof-0.3.0/src/veyra_proof/tools/e2e.py +670 -0
  45. veyra_proof-0.3.0/src/veyra_proof/tools/fuzz.py +110 -0
  46. veyra_proof-0.3.0/src/veyra_proof/tools/geiger.py +136 -0
  47. veyra_proof-0.3.0/src/veyra_proof/tools/kani.py +94 -0
  48. veyra_proof-0.3.0/src/veyra_proof/tools/llvm_cov.py +146 -0
  49. veyra_proof-0.3.0/src/veyra_proof/tools/machete.py +71 -0
  50. veyra_proof-0.3.0/src/veyra_proof/tools/miri.py +86 -0
  51. veyra_proof-0.3.0/src/veyra_proof/tools/mutants.py +82 -0
  52. veyra_proof-0.3.0/src/veyra_proof/tools/nextest.py +68 -0
  53. veyra_proof-0.3.0/src/veyra_proof/tools/reproducible_build.py +211 -0
  54. veyra_proof-0.3.0/src/veyra_proof/tools/rustfmt.py +77 -0
  55. veyra_proof-0.3.0/src/veyra_proof/tools/sast_optional.py +167 -0
  56. veyra_proof-0.3.0/src/veyra_proof/tools/semver_checks.py +90 -0
  57. veyra_proof-0.3.0/src/veyra_proof/tools/vet.py +71 -0
  58. veyra_proof-0.3.0/src/veyra_proof/workspace.py +136 -0
  59. veyra_proof-0.3.0/src/veyra_proof.egg-info/PKG-INFO +417 -0
  60. veyra_proof-0.3.0/src/veyra_proof.egg-info/SOURCES.txt +86 -0
  61. veyra_proof-0.3.0/src/veyra_proof.egg-info/dependency_links.txt +1 -0
  62. veyra_proof-0.3.0/src/veyra_proof.egg-info/entry_points.txt +2 -0
  63. veyra_proof-0.3.0/src/veyra_proof.egg-info/requires.txt +10 -0
  64. veyra_proof-0.3.0/src/veyra_proof.egg-info/top_level.txt +1 -0
  65. veyra_proof-0.3.0/tests/fixtures/cargo_metadata_sample.json +21 -0
  66. veyra_proof-0.3.0/tests/fixtures/demo_crate/Cargo.lock +7 -0
  67. veyra_proof-0.3.0/tests/fixtures/demo_crate/Cargo.toml +8 -0
  68. veyra_proof-0.3.0/tests/fixtures/demo_crate/deny.toml +19 -0
  69. veyra_proof-0.3.0/tests/fixtures/demo_crate/src/lib.rs +79 -0
  70. veyra_proof-0.3.0/tests/fixtures/demo_crate/src/main.rs +128 -0
  71. veyra_proof-0.3.0/tests/fixtures/demo_crate/veyra.toml +42 -0
  72. veyra_proof-0.3.0/tests/test_anti_theater_noise.py +454 -0
  73. veyra_proof-0.3.0/tests/test_ci_assert_evidence.py +442 -0
  74. veyra_proof-0.3.0/tests/test_command_runner.py +84 -0
  75. veyra_proof-0.3.0/tests/test_docs_match_code.py +198 -0
  76. veyra_proof-0.3.0/tests/test_dry_run_cli.py +65 -0
  77. veyra_proof-0.3.0/tests/test_e2e_live.py +151 -0
  78. veyra_proof-0.3.0/tests/test_e2e_tool.py +558 -0
  79. veyra_proof-0.3.0/tests/test_geiger_semver_tools.py +341 -0
  80. veyra_proof-0.3.0/tests/test_hashing_and_policy.py +58 -0
  81. veyra_proof-0.3.0/tests/test_lockfile_policy.py +265 -0
  82. veyra_proof-0.3.0/tests/test_platform_info.py +16 -0
  83. veyra_proof-0.3.0/tests/test_reporting.py +275 -0
  84. veyra_proof-0.3.0/tests/test_skill_document.py +568 -0
  85. veyra_proof-0.3.0/tests/test_tool_registry.py +20 -0
  86. veyra_proof-0.3.0/tests/test_verdicts.py +844 -0
  87. veyra_proof-0.3.0/tests/test_workspace.py +43 -0
  88. 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