code-jig 0.12.0__py3-none-any.whl

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 (52) hide show
  1. code_jig-0.12.0.dist-info/METADATA +154 -0
  2. code_jig-0.12.0.dist-info/RECORD +52 -0
  3. code_jig-0.12.0.dist-info/WHEEL +4 -0
  4. code_jig-0.12.0.dist-info/entry_points.txt +2 -0
  5. code_jig-0.12.0.dist-info/licenses/LICENSE +202 -0
  6. codejig/__init__.py +1 -0
  7. codejig/__main__.py +106 -0
  8. codejig/_core/VERSION +2 -0
  9. codejig/_core/bench/requirements.toml +4 -0
  10. codejig/_core/core/AGENTS.core.md +9 -0
  11. codejig/_core/core/agents/explorer.toml +24 -0
  12. codejig/_core/core/agents/judge.toml +19 -0
  13. codejig/_core/core/agents/reviewer.toml +10 -0
  14. codejig/_core/core/tiers.toml +4 -0
  15. codejig/_core/skills/bug-hunt/SKILL.md +131 -0
  16. codejig/_core/skills/code-analysis/SKILL.md +72 -0
  17. codejig/_core/skills/codegen/SKILL.md +46 -0
  18. codejig/_core/skills/cross-review/SKILL.md +32 -0
  19. codejig/_core/skills/grilling/SKILL.md +60 -0
  20. codejig/_core/skills/hld-trace/SKILL.md +69 -0
  21. codejig/_core/skills/improve/SKILL.md +38 -0
  22. codejig/_core/skills/redacao/SKILL.md +114 -0
  23. codejig/_core/skills/redacao/checar.py +75 -0
  24. codejig/_core/skills/redacao/reference.md +118 -0
  25. codejig/_core/skills/regression-tests/SKILL.md +53 -0
  26. codejig/_core/skills/remove-ai-attribution/SKILL.md +33 -0
  27. codejig/_core/skills/skill-validate/SKILL.md +58 -0
  28. codejig/_core/skills/web-consensus/SKILL.md +55 -0
  29. codejig/analyze.py +499 -0
  30. codejig/atomicwrite.py +49 -0
  31. codejig/collect.py +311 -0
  32. codejig/doctor.py +370 -0
  33. codejig/evidence.py +418 -0
  34. codejig/feedback.py +165 -0
  35. codejig/gitgate.py +278 -0
  36. codejig/hooks.py +64 -0
  37. codejig/humanize.py +206 -0
  38. codejig/install.py +381 -0
  39. codejig/managed.py +64 -0
  40. codejig/migrate.py +515 -0
  41. codejig/overlay.py +43 -0
  42. codejig/paths.py +40 -0
  43. codejig/probe.py +136 -0
  44. codejig/review.py +73 -0
  45. codejig/scrub.py +255 -0
  46. codejig/skillcheck.py +400 -0
  47. codejig/skilllint.py +99 -0
  48. codejig/sources.py +248 -0
  49. codejig/tiers.py +63 -0
  50. codejig/tokens.py +118 -0
  51. codejig/trace.py +137 -0
  52. codejig/watermark.py +147 -0
@@ -0,0 +1,154 @@
1
+ Metadata-Version: 2.4
2
+ Name: code-jig
3
+ Version: 0.12.0
4
+ Summary: Personal harness core for Codex and Claude Code
5
+ Project-URL: Source, https://github.com/jeancarlos/code-jig
6
+ License-Expression: Apache-2.0
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.11
9
+ Description-Content-Type: text/markdown
10
+
11
+ # code-jig
12
+
13
+ [![CI](https://github.com/jeancarlos/code-jig/actions/workflows/ci.yml/badge.svg)](https://github.com/jeancarlos/code-jig/actions/workflows/ci.yml)
14
+ [![security](https://github.com/jeancarlos/code-jig/actions/workflows/security.yml/badge.svg)](https://github.com/jeancarlos/code-jig/actions/workflows/security.yml)
15
+ [![coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/jeancarlos/code-jig/badges/coverage.json)](https://github.com/jeancarlos/code-jig/actions/workflows/ci.yml)
16
+ [![release](https://img.shields.io/github/v/release/jeancarlos/code-jig)](https://github.com/jeancarlos/code-jig/releases/latest)
17
+ [![license](https://img.shields.io/github/license/jeancarlos/code-jig)](LICENSE)
18
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/jeancarlos/code-jig/badge)](https://scorecard.dev/viewer/?uri=github.com/jeancarlos/code-jig)
19
+ ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)
20
+ ![platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey)
21
+ ![dependencies: none (stdlib)](https://img.shields.io/badge/dependencies-none%20(stdlib)-brightgreen)
22
+
23
+ **Make the official Codex CLI cheaper, safer and smarter, by configuration alone.**
24
+
25
+ code-jig is an open-source config pack for [OpenAI Codex](https://github.com/openai/codex). One command turns a stock install into a tuned setup: model tiers, automatic command review, a local token tracker, a set of battle-tested skills and a knowledge base that grows with you. No proxy, no daemon, no fork, no extra binaries. Just Python's standard library and the settings Codex already ships.
26
+
27
+ ## Why I built it
28
+
29
+ I use coding agents every day, and I kept running into the same four problems.
30
+
31
+ **1. Tokens disappear and nobody can say where.** Input, not output, is the bill: every request re-sends the whole conversation. I wanted to see exactly where it goes (which sessions, which commands, how much the safety reviews cost) without sending a byte to anyone. So code-jig reads Codex's own session files into a local SQLite database after every turn. Its totals match Codex's own per-thread count and [ccusage](https://github.com/ryoppippi/ccusage) to the token.
32
+
33
+ **2. Safety that asks you a hundred times a day gets switched off.** Codex ships Guardian, a reviewer model that approves or denies commands leaving the sandbox. code-jig turns it on in every tier and lets you *add* local policy on top of the upstream rules instead of replacing them. You stay protected, and you stop clicking "approve".
34
+
35
+ **3. Tips are cheap, measurements are not.** Every choice here was tested on a real bench before it shipped, and some popular ideas did not survive. An output-compression layer I used to swear by turned out to save little; Codex's own `tool_output_token_limit` already covered what mattered, so it went. One Guardian review costs about 7,000 input tokens on the bench, 84% of them cached, so I know what safety costs instead of guessing.
36
+
37
+ **4. A setup should get better with use, and travel.** Lessons learned on a laptop usually die in that laptop's shell history. Here they become rules, Guardian policy, skills or knowledge facts in a small **overlay**, reviewed like code. The shared **core** stays clean and versioned; every machine gets its own overlay; nothing private ever flows back into the core.
38
+
39
+ ## What you get
40
+
41
+ - **Tiers**: `default`, `deep`, `bulk`, `review`, each a generated Codex profile with its own model and reasoning effort. Pick the right brain for the job; [daily use](docs/runbooks/daily-use.md#which-model-for-which-job) maps jobs and skills to models for a public and an enterprise catalog.
42
+ - **Cheap subagents**: an `explorer` role on the `bulk` model answers lookups with line ranges instead of file dumps, a `reviewer` role on the `review` model attacks plans and findings, and a `judge` role on the `deep` model decides disputes. Code-writing subagents keep the session's model.
43
+ - **Guardian everywhere**, with your additions layered on the upstream policy.
44
+ - **Token tracker**: `code-jig tokens` shows input, cache hit, Guardian share, escalated commands, the heaviest sessions and per-model usage. All local.
45
+ - **Evidence**: `code-jig evidence` compares commits made in Codex sessions with the same repos' other commits (rework, `analyze` findings) and reports test runs, skill use, Guardian decisions and cost. Local data only.
46
+ - **Cross-family review**: `code-jig cross-review` sends your diff to a model from another family, read-only, before you push.
47
+ - **Sonar-style analysis without a server**: `code-jig analyze` runs the analyzers you already have (lizard, ruff, vulture, mypy, eslint with sonarjs, knip, tsc, dotnet build with SonarAnalyzer and NuGet audit, semgrep, gitleaks, osv-scanner) and groups the findings like Sonar: security, secrets, dependencies, bugs, types, unused code, complexity, duplication.
48
+ - **Requirement tracing**: `code-jig trace` checks which requirement IDs (from Azure DevOps, GitHub issues or a Markdown design) have tests, and which tests cite IDs that no longer exist.
49
+ - **Skills**: `cross-review`, `grilling` (stress-test a decision), `web-consensus` (settle facts against live sources), `improve` (turn a lesson into a durable change), and the deterministic toolbox: `code-analysis`, `regression-tests`, `hld-trace`, `bug-hunt` (property tests, fuzzing, mutation testing), `codegen` (OpenAPI clients, codemods) and `skill-validate`. Plus [superpowers](https://github.com/obra/superpowers) in one command.
50
+ - **Knowledge base**: one fact per file, indexed, pointed at by the generated AGENTS.md.
51
+ - **Sourced research**: `web-consensus` runs researchers, challenger and judge on the model each job needs, and `code-jig check-sources` confirms every quoted sentence is really on the cited page.
52
+ - **No AI attribution, no unreviewed prose**: an opt-in git gate strips AI co-author lines from commit messages, removes invisible characters from staged files, refuses agent-written docs until you commit them yourself, cleans attribution from the commits you are about to push (then asks you to push again), and refuses pushes that fail your test command.
53
+ - **Skills proven on Codex**: `code-jig lint-skill` and the `skill-validate` skill check a skill's text; `code-jig skill-check --review --live` has Codex review it and run its test cases, and CI refuses a skill whose stamp is not current.
54
+ - **Edit feedback**: after every agent write, syntax errors and undefined names in Python, JSON and TOML, and a notice when a test is deleted or skipped, go straight back to the model. Nothing blocks.
55
+ - **Doctor**: checks the binary, the pins, every tier's model against your account's catalog, the subagent roles, managed requirements, the AGENTS.md budget and the size of the skills list sent with every request, and probes each tier for free.
56
+ - **Works on locked-down machines**: native Windows support, no scripts required, respects administrator-managed Codex config and tells you how it differs from what was tested.
57
+
58
+ ## Quick start
59
+
60
+ Requires Python 3.11+ and git. Your overlay is a folder or git repository with an `overlay.toml`; see [personalizing](docs/personalizing.md). With no overlay, the installer makes `~/code-jig-overlay` for you.
61
+
62
+ ### From a release (no git checkout)
63
+
64
+ <!-- install:start -->
65
+ Latest release: **v0.12.0**. Everything downloads from GitHub. Copy a block as it is; it runs without edits.
66
+
67
+ Linux and macOS:
68
+
69
+ ```sh
70
+ curl -fsSL https://github.com/jeancarlos/code-jig/releases/download/v0.12.0/bootstrap.py | python3 -I -
71
+ ```
72
+
73
+ Windows (PowerShell):
74
+
75
+ ```powershell
76
+ irm https://github.com/jeancarlos/code-jig/releases/download/v0.12.0/bootstrap.py -OutFile bootstrap.py
77
+ py -3 -I bootstrap.py
78
+ ```
79
+
80
+ To use your own overlay instead of the default `~/code-jig-overlay`, add `--overlay` and its folder or git URL at the end of the `python3`/`py` line, for example `--overlay ~/my-overlay`.
81
+
82
+ A piped script cannot check itself. To read what you run, download only `bootstrap.py`, read it, then run it:
83
+
84
+ ```sh
85
+ curl -fsSL -o bootstrap.py https://github.com/jeancarlos/code-jig/releases/download/v0.12.0/bootstrap.py
86
+ python3 -I bootstrap.py
87
+ ```
88
+
89
+ `bootstrap.py` has no checksum of its own; reading it is the check. The bootstrap downloads the zip itself and checks it against the release's `SHA256SUMS`. That catches a corrupted download, but not a compromised GitHub release. Releases before v0.11.0 have no zip.
90
+
91
+ **No one-liner allowed?** On a machine that blocks the download or PATH edits, download `code-jig.zip`, `SHA256SUMS` and `bootstrap.py` from the [v0.12.0 release page](https://github.com/jeancarlos/code-jig/releases/tag/v0.12.0) into one folder and run `py -3 -I bootstrap.py --zip code-jig.zip` there (`python3 -I` on Linux and macOS). The launcher does not need to be on PATH: the generated `AGENTS.md` tells agents its full path.
92
+ <!-- install:end -->
93
+
94
+ The bootstrap unpacks the release into `~/.local/share/code-jig/vX.Y.Z/` (`%LOCALAPPDATA%\code-jig\vX.Y.Z\` on Windows), runs `install`, writes `code-jig` and `cjig` launchers in `~/.local/bin` and runs `doctor`. The overlay's `core_version` picks the release. To change it, edit `core_version` and run the bootstrap again; see [upgrade and rollback](docs/runbooks/upgrade-and-rollback.md).
95
+
96
+ ### From a checkout (to change the core)
97
+
98
+ ```sh
99
+ git clone https://github.com/jeancarlos/code-jig
100
+ cp -r code-jig/overlay-examples/personal ~/code-jig-overlay # your overlay
101
+ export CODE_JIG_OVERLAY=~/code-jig-overlay
102
+ cd code-jig
103
+ ./install.sh # Windows: py -3 -m codejig install
104
+ PYTHONPATH=. python3 -m codejig doctor
105
+ codex --profile default
106
+ ```
107
+
108
+ Edit `~/code-jig-overlay/profiles.toml` to pick your models; `doctor` lists the ones your account can use.
109
+
110
+ ### What the install counts
111
+
112
+ The tool sends nothing. The download site counts requests for `bootstrap.py` and for release zips, and stores the event, the version, the client type (curl, PowerShell, Python or other) and the country. It does not store your IP address, your user-agent string or any install ID. The counts are request counts, not installs. See [ADR 0027](docs/adr/0027-install-from-a-release-url.md).
113
+
114
+ **Prefer pipx?** `pipx install code-jig` installs the same release files as a wheel from PyPI, published from CI with Trusted Publishing and a PyPI attestation. Pick the overlay with `--overlay` and run `code-jig install` and `code-jig doctor`; `core_version` must match the installed version, and `pipx install code-jig==X.Y.Z` pins it. The first PyPI release is v0.12.0.
115
+
116
+ ## Documentation
117
+
118
+ | Read | When |
119
+ |---|---|
120
+ | [Daily use](docs/runbooks/daily-use.md) | Tiers, skills, reviews, the repo's own AGENTS.md |
121
+ | [Doctor](docs/runbooks/doctor.md) | What every check means and how to fix it |
122
+ | [Tokens](docs/runbooks/tokens.md) | Reading the usage report |
123
+ | [Evidence](docs/runbooks/evidence.md) | Whether code-jig pays off: rework, tests, skills, cost |
124
+ | [Code quality](docs/runbooks/code-quality.md) | `analyze`, `trace`, the toolbox skills, installing the tools |
125
+ | [Managed machines](docs/runbooks/managed-machine.md) | Installing where someone else administers the machine |
126
+ | [Network and certificates](docs/runbooks/network-and-certificates.md) | TLS-inspecting networks, git and CLI tools in the sandbox |
127
+ | [Circuit breaker](docs/runbooks/circuit-breaker.md) | When Guardian stops a turn |
128
+ | [Commit attribution](docs/runbooks/commit-attribution.md) | Codex's co-author trailer and how to turn it off |
129
+ | [Watermarks, humanizing and edit feedback](docs/runbooks/watermark-and-humanize.md) | What the write hook strips from agent output, what it reports back to the model, and how to run or disable it |
130
+ | [Upgrade and rollback](docs/runbooks/upgrade-and-rollback.md) | Updates, rollbacks, uninstalling |
131
+ | [Personalizing](docs/personalizing.md) | Overlay slots, pinning, the clean-room rule |
132
+ | [Decisions](docs/adr/) | Why each design choice was made, and what was rejected |
133
+ | [Contributing](CONTRIBUTING.md) | Code rules and tests |
134
+ | [Editing the deck](docs/deck/README.md) | The presentation and its data files |
135
+
136
+ ## Principles
137
+
138
+ - **Configuration, not interception.** code-jig writes files Codex reads. It never sits between you and the model.
139
+ - **Measure, then decide.** Bench data in the repo, never guesses.
140
+ - **Additive safety.** Local policy extends upstream policy; it never replaces it.
141
+ - **Clean-room overlays.** Private context stays in private overlays. The core carries only what anyone could use.
142
+
143
+ ## Verify a release
144
+
145
+ Every release asset has a Sigstore bundle (`<asset>.sigstore.json`), a SLSA build provenance file (`code-jig.intoto.jsonl`) and an SPDX SBOM (`code-jig.spdx.json`). Verify with:
146
+
147
+ ```
148
+ gh attestation verify code-jig.zip --repo jeancarlos/code-jig
149
+ cosign verify-blob code-jig.zip --bundle code-jig.zip.sigstore.json --certificate-identity-regexp '^https://github.com/jeancarlos/code-jig/' --certificate-oidc-issuer https://token.actions.githubusercontent.com
150
+ ```
151
+
152
+ ## License
153
+
154
+ Apache-2.0.
@@ -0,0 +1,52 @@
1
+ codejig/__init__.py,sha256=oFXJ29j3C1ptyR4srl_tl-0-F7jzcbzJxfN7qHOHwv0,19
2
+ codejig/__main__.py,sha256=9uMApG4EwjhSPByD35-l1PnTpHcqGydtTjXap8t_4uw,3895
3
+ codejig/analyze.py,sha256=tcCsPI48tpd6QGbAjSVDuybwxVSdyolj3yDKULc11po,22361
4
+ codejig/atomicwrite.py,sha256=ZYbujtL-Z-GDEmHdigtbglFmpOnrrCl06ftqDVE4zfs,1792
5
+ codejig/collect.py,sha256=TjwTeNRklihGK9reFyFwmkIr44t3BbLS_w21xLSPMnw,12870
6
+ codejig/doctor.py,sha256=McJp0dRuOKswbvfuAURVJO0WACdszTPBONeoIMO9fLg,15626
7
+ codejig/evidence.py,sha256=h919W8OQz3tWtjt84KmNJWeI5c0UmDF03yptaWTRA_w,17082
8
+ codejig/feedback.py,sha256=8ioe5xRyI5PF0nB2EY3cQbP4o-0xGUi0CYaQzODrOgI,5980
9
+ codejig/gitgate.py,sha256=dbRf5oPhecU3sjaQR7EFdc68C2gdoVKYh7jhBkJMQmM,11460
10
+ codejig/hooks.py,sha256=bF6SvwKJorX4uzZz8JLhSkm8Hj08YhTyN5A-IazlDHA,2422
11
+ codejig/humanize.py,sha256=_qa29ilrucGECb7c8leCZUjBqkdE98SMWrP0DX3BQys,6472
12
+ codejig/install.py,sha256=5fg8vmNLr77uYljioIRVM4FFy61KHfpFDa9mgvaU_BE,16124
13
+ codejig/managed.py,sha256=JMK5GzQER8hSdbBj_Ml3NaKGkN_PI5u5ytU-OtJy4Kg,3006
14
+ codejig/migrate.py,sha256=shuk4Cm27TPiR2zDavwLoF_8l7CDDqwMTyyCLG1LyFQ,19430
15
+ codejig/overlay.py,sha256=jYR_AgErdFLO1-L_mzk4g-i0_SflSAp1xyTcCDY0ltA,1655
16
+ codejig/paths.py,sha256=jBkb-VDsoXmppdiYsf8n5bobi9gDLNihC6OZUCBM7aE,1270
17
+ codejig/probe.py,sha256=0oBBOa90iU6poFz6q3c2QFYIdYY3jlVoGGTuU8MNBKs,6020
18
+ codejig/review.py,sha256=-CjXPhYJcnUUDL9kuw5KOlE6_qf2HJH9cJWKIBYsLl8,3323
19
+ codejig/scrub.py,sha256=Lg2DLrmCIqlY3ErOe1y70p7gKSfpw8t-wVPSRfw0npo,10619
20
+ codejig/skillcheck.py,sha256=k08ZSEFhMhs4m-VmRd3YI3iyn0YbgztxKhIfIfRGbNY,19222
21
+ codejig/skilllint.py,sha256=tUFNGlTdtSiySOiDlnLgqFpD8jH5OpvbJG3iWPRi16E,4257
22
+ codejig/sources.py,sha256=Eh3bIXUxHfjYVn19NBDVgj__W3VzpvYFeOSI-9opSko,8576
23
+ codejig/tiers.py,sha256=2hE9_aG9hxx3uyPc56HnroV96H7AkhksNQ2LVX8rPBY,2162
24
+ codejig/tokens.py,sha256=6WBrDG7nBwh9QGqcI92FtmUsoX_4wtj2fwrkYR6eCmI,5313
25
+ codejig/trace.py,sha256=ijw2bxjpFRVocc0XGrkUiWd4KGcj7YK2Ztugf3ihAVQ,4879
26
+ codejig/watermark.py,sha256=Qbe2QXPvmMsfxzPvRvf0CKh43LXU5mbL8W-OoWArurE,5020
27
+ codejig/_core/VERSION,sha256=t7HtzNCbro8KktA0YpR4NFTGF-OFvEMjHz6O7GUDZM8,73
28
+ codejig/_core/bench/requirements.toml,sha256=7OqsLeLDvcvI9Lk3q2e06iW4M7GhREiSoXEdJ_LP8T0,203
29
+ codejig/_core/core/AGENTS.core.md,sha256=OjenxuZiO0e6L_3y91cMxFJrgkFBJ_2D7b1WDuP7WKQ,1510
30
+ codejig/_core/core/tiers.toml,sha256=Pr2qyqI_5sOnpxvaJOjkVQJJR8XHxZkUqEKHo4qbbXE,62
31
+ codejig/_core/core/agents/explorer.toml,sha256=AFVWPqy9fstEvdxYQ2qfZySut5l-Ffn19j7mniBetPg,1439
32
+ codejig/_core/core/agents/judge.toml,sha256=RDFd4KgIh0XGWDDcFFXD6PoSJ_T6-5qYrMgGRRff6dY,1051
33
+ codejig/_core/core/agents/reviewer.toml,sha256=caolxqS4cuCT7oVqNMCcwoor7qz1x1qvGXehiSe5-ew,728
34
+ codejig/_core/skills/bug-hunt/SKILL.md,sha256=M3DfVUn8PBv21g0T1DRC4lFze2TKWS-Ut-Ur_GjSFEU,10470
35
+ codejig/_core/skills/code-analysis/SKILL.md,sha256=VUTuNkAFXimmAfHyX8nqE5TS6QVy7AU7DhhLpJ7mX2k,5972
36
+ codejig/_core/skills/codegen/SKILL.md,sha256=chXoMeY5lGPPoW5qZ0_F37mh3XHJOJmCDukjOPLHZVQ,2789
37
+ codejig/_core/skills/cross-review/SKILL.md,sha256=N20NaHzIGLxORc16YthdkedlcFilFDu5sPI1eENbP1g,1678
38
+ codejig/_core/skills/grilling/SKILL.md,sha256=1ck-o6nM8eU2SkVwLNTX9wXtA3Pr1qbB2eW0pLJ2YQM,3220
39
+ codejig/_core/skills/hld-trace/SKILL.md,sha256=VCgrmblWlPM-2wHL1CoCRo_CREFAFl4j043Yg-yrdag,4847
40
+ codejig/_core/skills/improve/SKILL.md,sha256=_gTcDsyHt3RwFF0W9q3q5JSLHg8EQNdGPy6uiniFKRU,2346
41
+ codejig/_core/skills/redacao/SKILL.md,sha256=B1UZLJ7CE5-jDmfR53rQxQzdptG9SqWrSiBdswBE-rg,9776
42
+ codejig/_core/skills/redacao/checar.py,sha256=8ysAFXU1bLbI9iUyWFuflM7JeblfhAv4f4gwwtpngEE,2966
43
+ codejig/_core/skills/redacao/reference.md,sha256=2kLfx4XH6YmRdXU07DKOA5P8GbmMBDv5l-JVwmcUk44,9775
44
+ codejig/_core/skills/regression-tests/SKILL.md,sha256=SQFEbVwWprf2tmOJjYtF2wuzvUmBuKrbmjuHkIH1My8,2720
45
+ codejig/_core/skills/remove-ai-attribution/SKILL.md,sha256=zlxhS6H30SGj6W4GzPso7MV1u_9UHvUyLs2Ldb18H9o,2981
46
+ codejig/_core/skills/skill-validate/SKILL.md,sha256=0573vaSlkVqNbpINWo9OQuo_qbsvF77I7xw3I0HCVjc,3853
47
+ codejig/_core/skills/web-consensus/SKILL.md,sha256=kgWcHEx53tRGLe7Ezmsmzmg_MWkF_3d0jnQPGwial-4,6351
48
+ code_jig-0.12.0.dist-info/METADATA,sha256=OSc-R_DuXmyo88_-9YaeHuTimdsa8sltv2ZVMhaxSek,13314
49
+ code_jig-0.12.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
50
+ code_jig-0.12.0.dist-info/entry_points.txt,sha256=hcZkHUw2L_IOmVHY822XmHfG0sFWE4iYvo02LSHevMA,51
51
+ code_jig-0.12.0.dist-info/licenses/LICENSE,sha256=Ln2GpwCk-iWdsvheE5ZizciKqkCp6y_rl-4XvsAv5YY,11341
52
+ code_jig-0.12.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ code-jig = codejig.__main__:main
@@ -0,0 +1,202 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Jean Souza
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
202
+
codejig/__init__.py ADDED
@@ -0,0 +1 @@
1
+ VERSION = "0.12.0"
codejig/__main__.py ADDED
@@ -0,0 +1,106 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import importlib
5
+ import sys
6
+
7
+
8
+ def build_parser() -> argparse.ArgumentParser:
9
+ p = argparse.ArgumentParser(prog="code-jig")
10
+ p.add_argument("--overlay")
11
+ p.add_argument("--codex-home")
12
+ sub = p.add_subparsers(dest="cmd", required=True)
13
+ sub.add_parser("install")
14
+ d = sub.add_parser("doctor")
15
+ d.add_argument("--codex-bin")
16
+ d.add_argument("--check-binary", action="store_true")
17
+ d.add_argument("--live", action="store_true")
18
+ c = sub.add_parser("collect")
19
+ c.add_argument("--rescan", action="store_true")
20
+ h = sub.add_parser("hooks")
21
+ h.add_argument("--hook-type", choices=["claude-code", "codex"], required=True)
22
+ h.add_argument("path", nargs="*")
23
+ hu = sub.add_parser("humanize")
24
+ hu.add_argument("path", nargs="*")
25
+ hu.add_argument("--check", action="store_true", help="dry-run: report changes without writing")
26
+ t = sub.add_parser("tokens")
27
+ t.add_argument("--days", type=int, default=7)
28
+ t.add_argument("--cache-floor", type=float, default=97.5)
29
+ t.add_argument("--top", type=int, default=10)
30
+ r = sub.add_parser("cross-review")
31
+ r.add_argument("--base")
32
+ r.add_argument("--profile", default="review")
33
+ r.add_argument("--codex-bin")
34
+ r.add_argument("files", nargs="*")
35
+ a = sub.add_parser("analyze")
36
+ a.add_argument("path", nargs="?", default=".")
37
+ a.add_argument("--base")
38
+ a.add_argument("--top", type=int, default=10)
39
+ a.add_argument("--json", action="store_true")
40
+ a.add_argument("--timeout", type=int, default=600)
41
+ tr = sub.add_parser("trace")
42
+ tr.add_argument("ids")
43
+ tr.add_argument("--path", default=".")
44
+ tr.add_argument("--pattern", default="REQ-{id}")
45
+ tr.add_argument("--json", action="store_true")
46
+ ev = sub.add_parser("evidence")
47
+ ev.add_argument("--days", type=int, default=90)
48
+ ev.add_argument("--repo")
49
+ ev.add_argument("--analyze", type=int, default=0)
50
+ ev.add_argument("--timeout", type=int, default=600)
51
+ ev.add_argument("--json", action="store_true")
52
+ ls = sub.add_parser("lint-skill")
53
+ ls.add_argument("path", nargs="*")
54
+ sc = sub.add_parser("scrub")
55
+ sc.add_argument("path", nargs="?", default=".")
56
+ sc.add_argument("--author", action="append", default=[])
57
+ sc.add_argument("--dry-run", action="store_true")
58
+ gh = sub.add_parser("git-hook")
59
+ gh.add_argument("name")
60
+ gh.add_argument("rest", nargs="*")
61
+ gh.add_argument("--prose", action="store_true")
62
+ gh.add_argument("--cleanup", action="store_true")
63
+ sk = sub.add_parser("skill-check")
64
+ sk.add_argument("skills", nargs="+")
65
+ sk.add_argument("--review", action="store_true")
66
+ sk.add_argument("--live", action="store_true")
67
+ sk.add_argument("--profile", default="default")
68
+ sk.add_argument("--codex-bin")
69
+ sk.add_argument("--trust-evals", action="store_true")
70
+ cs = sub.add_parser("check-sources")
71
+ cs.add_argument("files", nargs="+")
72
+ mg = sub.add_parser("migrate")
73
+ mg.add_argument("--dry-run", action="store_true")
74
+ mg.add_argument("repos", nargs="*")
75
+ return p
76
+
77
+
78
+ COMMAND_MODULES = {
79
+ "install": "install",
80
+ "collect": "collect",
81
+ "tokens": "tokens",
82
+ "cross-review": "review",
83
+ "analyze": "analyze",
84
+ "trace": "trace",
85
+ "evidence": "evidence",
86
+ "hooks": "hooks",
87
+ "humanize": "humanize",
88
+ "lint-skill": "skilllint",
89
+ "scrub": "scrub",
90
+ "git-hook": "gitgate",
91
+ "skill-check": "skillcheck",
92
+ "check-sources": "sources",
93
+ "migrate": "migrate",
94
+ }
95
+
96
+
97
+ def main(argv: list[str] | None = None) -> int:
98
+ if sys.version_info < (3, 11):
99
+ print("code-jig: Python 3.11 or newer is required", file=sys.stderr)
100
+ return 2
101
+ args = build_parser().parse_args(argv)
102
+ return importlib.import_module(f"codejig.{COMMAND_MODULES.get(args.cmd, 'doctor')}").cli(args)
103
+
104
+
105
+ if __name__ == "__main__":
106
+ sys.exit(main())
codejig/_core/VERSION ADDED
@@ -0,0 +1,2 @@
1
+ v0.12.0
2
+ 2fab5fa59ef304350c13b21e599093037f18e73bb97d9b583bc338ee2c67b70b
@@ -0,0 +1,4 @@
1
+ allowed_approval_policies = ["untrusted", "on-request"]
2
+ allowed_approvals_reviewers = ["user", "auto_review"]
3
+ allowed_sandbox_modes = ["read-only", "workspace-write"]
4
+ check_for_update_on_startup = false
@@ -0,0 +1,9 @@
1
+ # code-jig core rules
2
+
3
+ - One thread per task. When the topic changes, finish and start a new thread instead of continuing.
4
+ - Deterministic first. Before reasoning about anything countable or checkable, run the `code-jig` command or script that answers it.
5
+ - No polling loops. Do not chain `sleep`/`wait` calls when one blocking command or a single check gives the answer.
6
+ - Minimal code. Reuse what exists, prefer the standard library, delete before adding, no speculative abstractions.
7
+ - Root cause over symptom. Fix the shared function, not each caller.
8
+ - No AI attribution. Never write `Co-authored-by` or `Generated with` lines for an AI, `AI-assisted` notes or robot emoji in commits, pull requests, comments or files. If one already reached history, use the `remove-ai-attribution` skill.
9
+ - Subagent check. Before each `spawn_agent`, decide whether the job needs one and which `agent_type` fits. Skip it for one grep, one file read or a few commands: do those yourself. `explorer` (bulk tier) for lookups, `worker` for one bounded change with a clear file scope, checked before the next, `reviewer` (review tier) to attack a plan, diff or claim before acting on it, `judge` (deep tier) to decide between gathered conflicting claims, `default` for any other self-contained task. Keep architecture, subtle multi-file logic, security and root-cause debugging in the main thread, and say so when they need the deep tier. At most three in parallel unless asked. Name the agent you picked and why in one line.
@@ -0,0 +1,24 @@
1
+ name = "explorer"
2
+ description = """
3
+ Use `explorer` for lookups: where something is defined or used, what a file, doc or command output says, what a web source says.
4
+ It runs on the bulk tier, a fast and cheap model, and returns paths with line ranges instead of file contents.
5
+ - Give it a self-contained question with the paths or names it needs, and do not fork your history into it (`fork_turns`): a forked explorer re-reads the whole conversation.
6
+ - Spawn several in parallel for independent questions, and keep working while they run.
7
+ - Trust their answers unless a fact is load-bearing; then read the lines they cite yourself.
8
+ - It costs a full request of its own; for one grep or one file read, run it yourself.
9
+ - Never use it to write or change code."""
10
+ developer_instructions = """
11
+ You are an explorer. Answer the one question you were given, and only that question.
12
+ - Read files, search, and run commands that change nothing. Use web search only for facts outside the repository.
13
+ - Never edit files, install anything, or run commands that change state.
14
+ - Answer with what you found: `path:start-end` line ranges with a one-line fact each, and for web facts the URL with a short exact quote.
15
+ - Never paste whole files or long command output. Quote at most the few lines that prove a point.
16
+ - Say what you could not find, then stop."""
17
+
18
+ [skills]
19
+ include_instructions = false
20
+
21
+ [features]
22
+ apps = false
23
+ plugins = false
24
+ memories = false
@@ -0,0 +1,19 @@
1
+ name = "judge"
2
+ description = """
3
+ Use `judge` to decide between conflicting claims, findings or options when the material is already gathered: a web-consensus verdict, competing fixes, a disputed review finding.
4
+ It runs on the deep tier, the strongest model, and decides from the material it is given.
5
+ Give it the question and every piece of evidence it should weigh, including what the other side said. It does not search or edit."""
6
+ developer_instructions = """
7
+ You are a judge. Decide the question you were given from the material you were given, and nothing else.
8
+ - Do not search, browse or run commands that fetch anything new. If the material cannot settle a point, say so and name the evidence that would.
9
+ - Weigh sources, not voices: a claim stands on its cited evidence, not on who argued it, how often, or how confidently.
10
+ - Give the decision first, then for each point: what decides it, the source, and how sure you are.
11
+ - Never edit files."""
12
+
13
+ [skills]
14
+ include_instructions = false
15
+
16
+ [features]
17
+ apps = false
18
+ plugins = false
19
+ memories = false
@@ -0,0 +1,10 @@
1
+ name = "reviewer"
2
+ description = """
3
+ Use `reviewer` to attack a plan, diff, finding or claim before acting on it.
4
+ It runs on the review tier, a different model family, and looks for what is wrong, not for what is right.
5
+ Give it the material and the claim to check. It does not edit."""
6
+ developer_instructions = """
7
+ You are a reviewer from a different model family. Find what is wrong with the material you were given: bugs, false claims, missing cases, unsafe steps.
8
+ - Check every claim against the files, commands or sources you can read. Never edit anything.
9
+ - Report each problem as: location, what is wrong, the evidence, and how sure you are.
10
+ - Report nothing you cannot support. If you find nothing, say so in one line."""
@@ -0,0 +1,4 @@
1
+ default = "medium"
2
+ deep = "high"
3
+ bulk = "low"
4
+ review = "high"