@ossiq/cli-darwin-arm64 0.1.12

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 (131) hide show
  1. package/bin/ossiq/_internal/Python.framework/Versions/3.13/Python +0 -0
  2. package/bin/ossiq/_internal/Python.framework/Versions/3.13/Resources/Info.plist +30 -0
  3. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
  4. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
  5. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/RECORD +37 -0
  6. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/REQUESTED +0 -0
  7. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
  8. package/bin/ossiq/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
  9. package/bin/ossiq/_internal/base_library.zip +0 -0
  10. package/bin/ossiq/_internal/cel/cel.cpython-313-darwin.so +0 -0
  11. package/bin/ossiq/_internal/certifi/cacert.pem +3959 -0
  12. package/bin/ossiq/_internal/certifi/py.typed +0 -0
  13. package/bin/ossiq/_internal/charset_normalizer/cd.cpython-313-darwin.so +0 -0
  14. package/bin/ossiq/_internal/charset_normalizer/md.cpython-313-darwin.so +0 -0
  15. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/INSTALLER +1 -0
  16. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/METADATA +261 -0
  17. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/RECORD +16 -0
  18. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/REQUESTED +0 -0
  19. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/WHEEL +4 -0
  20. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/entry_points.txt +2 -0
  21. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/licenses/LICENSE +201 -0
  22. package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/sboms/cel.cyclonedx.json +2109 -0
  23. package/bin/ossiq/_internal/libcrypto.3.dylib +0 -0
  24. package/bin/ossiq/_internal/libncurses.6.dylib +0 -0
  25. package/bin/ossiq/_internal/libssl.3.dylib +0 -0
  26. package/bin/ossiq/_internal/ossiq/data/SKILL.md +313 -0
  27. package/bin/ossiq/_internal/ossiq/domain/README.md +373 -0
  28. package/bin/ossiq/_internal/ossiq/solver/README.md +155 -0
  29. package/bin/ossiq/_internal/ossiq/strategy/README.md +182 -0
  30. package/bin/ossiq/_internal/ossiq/ui/html_templates/filter_format_highlight_days.html +7 -0
  31. package/bin/ossiq/_internal/ossiq/ui/html_templates/spa_app.html +18125 -0
  32. package/bin/ossiq/_internal/ossiq/ui/html_templates/tag_versions_difference.html +33 -0
  33. package/bin/ossiq/_internal/ossiq/ui/renderers/export/README.md +207 -0
  34. package/bin/ossiq/_internal/ossiq/ui/renderers/export/schemas/export_schema_v1.5.json +1637 -0
  35. package/bin/ossiq/_internal/ossiq/ui/renderers/export/schemas/export_schema_v1.5_standard.json +1164 -0
  36. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/INSTALLER +1 -0
  37. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/METADATA +385 -0
  38. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/RECORD +13 -0
  39. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/REQUESTED +0 -0
  40. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/WHEEL +4 -0
  41. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/direct_url.json +1 -0
  42. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/entry_points.txt +2 -0
  43. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/licenses/AUTHORS +8 -0
  44. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/licenses/LICENSE +661 -0
  45. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/uv_build.json +1 -0
  46. package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/uv_cache.json +1 -0
  47. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/INSTALLER +1 -0
  48. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/METADATA +171 -0
  49. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/RECORD +154 -0
  50. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/REQUESTED +0 -0
  51. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/WHEEL +5 -0
  52. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/licenses/AUTHORS.rst +11 -0
  53. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/licenses/LICENSE +27 -0
  54. package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/top_level.txt +1 -0
  55. package/bin/ossiq/_internal/pycard.cpython-313-darwin.so +0 -0
  56. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/INSTALLER +1 -0
  57. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/METADATA +1307 -0
  58. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/RECORD +113 -0
  59. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/REQUESTED +0 -0
  60. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/WHEEL +4 -0
  61. package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/licenses/LICENSE +21 -0
  62. package/bin/ossiq/_internal/pydantic_core/_pydantic_core.cpython-313-darwin.so +0 -0
  63. package/bin/ossiq/_internal/pyformula.cpython-313-darwin.so +0 -0
  64. package/bin/ossiq/_internal/pysolvers.cpython-313-darwin.so +0 -0
  65. package/bin/ossiq/_internal/python3.13/lib-dynload/_asyncio.cpython-313-darwin.so +0 -0
  66. package/bin/ossiq/_internal/python3.13/lib-dynload/_bisect.cpython-313-darwin.so +0 -0
  67. package/bin/ossiq/_internal/python3.13/lib-dynload/_blake2.cpython-313-darwin.so +0 -0
  68. package/bin/ossiq/_internal/python3.13/lib-dynload/_bz2.cpython-313-darwin.so +0 -0
  69. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_cn.cpython-313-darwin.so +0 -0
  70. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_hk.cpython-313-darwin.so +0 -0
  71. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_iso2022.cpython-313-darwin.so +0 -0
  72. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_jp.cpython-313-darwin.so +0 -0
  73. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_kr.cpython-313-darwin.so +0 -0
  74. package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_tw.cpython-313-darwin.so +0 -0
  75. package/bin/ossiq/_internal/python3.13/lib-dynload/_contextvars.cpython-313-darwin.so +0 -0
  76. package/bin/ossiq/_internal/python3.13/lib-dynload/_csv.cpython-313-darwin.so +0 -0
  77. package/bin/ossiq/_internal/python3.13/lib-dynload/_ctypes.cpython-313-darwin.so +0 -0
  78. package/bin/ossiq/_internal/python3.13/lib-dynload/_curses.cpython-313-darwin.so +0 -0
  79. package/bin/ossiq/_internal/python3.13/lib-dynload/_datetime.cpython-313-darwin.so +0 -0
  80. package/bin/ossiq/_internal/python3.13/lib-dynload/_decimal.cpython-313-darwin.so +0 -0
  81. package/bin/ossiq/_internal/python3.13/lib-dynload/_hashlib.cpython-313-darwin.so +0 -0
  82. package/bin/ossiq/_internal/python3.13/lib-dynload/_heapq.cpython-313-darwin.so +0 -0
  83. package/bin/ossiq/_internal/python3.13/lib-dynload/_json.cpython-313-darwin.so +0 -0
  84. package/bin/ossiq/_internal/python3.13/lib-dynload/_lzma.cpython-313-darwin.so +0 -0
  85. package/bin/ossiq/_internal/python3.13/lib-dynload/_md5.cpython-313-darwin.so +0 -0
  86. package/bin/ossiq/_internal/python3.13/lib-dynload/_multibytecodec.cpython-313-darwin.so +0 -0
  87. package/bin/ossiq/_internal/python3.13/lib-dynload/_multiprocessing.cpython-313-darwin.so +0 -0
  88. package/bin/ossiq/_internal/python3.13/lib-dynload/_opcode.cpython-313-darwin.so +0 -0
  89. package/bin/ossiq/_internal/python3.13/lib-dynload/_pickle.cpython-313-darwin.so +0 -0
  90. package/bin/ossiq/_internal/python3.13/lib-dynload/_posixshmem.cpython-313-darwin.so +0 -0
  91. package/bin/ossiq/_internal/python3.13/lib-dynload/_posixsubprocess.cpython-313-darwin.so +0 -0
  92. package/bin/ossiq/_internal/python3.13/lib-dynload/_queue.cpython-313-darwin.so +0 -0
  93. package/bin/ossiq/_internal/python3.13/lib-dynload/_random.cpython-313-darwin.so +0 -0
  94. package/bin/ossiq/_internal/python3.13/lib-dynload/_scproxy.cpython-313-darwin.so +0 -0
  95. package/bin/ossiq/_internal/python3.13/lib-dynload/_sha1.cpython-313-darwin.so +0 -0
  96. package/bin/ossiq/_internal/python3.13/lib-dynload/_sha2.cpython-313-darwin.so +0 -0
  97. package/bin/ossiq/_internal/python3.13/lib-dynload/_sha3.cpython-313-darwin.so +0 -0
  98. package/bin/ossiq/_internal/python3.13/lib-dynload/_socket.cpython-313-darwin.so +0 -0
  99. package/bin/ossiq/_internal/python3.13/lib-dynload/_sqlite3.cpython-313-darwin.so +0 -0
  100. package/bin/ossiq/_internal/python3.13/lib-dynload/_ssl.cpython-313-darwin.so +0 -0
  101. package/bin/ossiq/_internal/python3.13/lib-dynload/_statistics.cpython-313-darwin.so +0 -0
  102. package/bin/ossiq/_internal/python3.13/lib-dynload/_struct.cpython-313-darwin.so +0 -0
  103. package/bin/ossiq/_internal/python3.13/lib-dynload/_uuid.cpython-313-darwin.so +0 -0
  104. package/bin/ossiq/_internal/python3.13/lib-dynload/_zoneinfo.cpython-313-darwin.so +0 -0
  105. package/bin/ossiq/_internal/python3.13/lib-dynload/array.cpython-313-darwin.so +0 -0
  106. package/bin/ossiq/_internal/python3.13/lib-dynload/binascii.cpython-313-darwin.so +0 -0
  107. package/bin/ossiq/_internal/python3.13/lib-dynload/fcntl.cpython-313-darwin.so +0 -0
  108. package/bin/ossiq/_internal/python3.13/lib-dynload/grp.cpython-313-darwin.so +0 -0
  109. package/bin/ossiq/_internal/python3.13/lib-dynload/math.cpython-313-darwin.so +0 -0
  110. package/bin/ossiq/_internal/python3.13/lib-dynload/mmap.cpython-313-darwin.so +0 -0
  111. package/bin/ossiq/_internal/python3.13/lib-dynload/pyexpat.cpython-313-darwin.so +0 -0
  112. package/bin/ossiq/_internal/python3.13/lib-dynload/readline.cpython-313-darwin.so +0 -0
  113. package/bin/ossiq/_internal/python3.13/lib-dynload/resource.cpython-313-darwin.so +0 -0
  114. package/bin/ossiq/_internal/python3.13/lib-dynload/select.cpython-313-darwin.so +0 -0
  115. package/bin/ossiq/_internal/python3.13/lib-dynload/syslog.cpython-313-darwin.so +0 -0
  116. package/bin/ossiq/_internal/python3.13/lib-dynload/termios.cpython-313-darwin.so +0 -0
  117. package/bin/ossiq/_internal/python3.13/lib-dynload/unicodedata.cpython-313-darwin.so +0 -0
  118. package/bin/ossiq/_internal/python3.13/lib-dynload/zlib.cpython-313-darwin.so +0 -0
  119. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/INSTALLER +1 -0
  120. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/LICENSE +22 -0
  121. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/METADATA +324 -0
  122. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/RECORD +10 -0
  123. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/REQUESTED +0 -0
  124. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/WHEEL +6 -0
  125. package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/top_level.txt +1 -0
  126. package/bin/ossiq/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +2 -0
  127. package/bin/ossiq/_internal/wcwidth/py.typed +0 -0
  128. package/bin/ossiq/_internal/wcwidth/textwrap.py,cover +664 -0
  129. package/bin/ossiq/_internal/yaml/_yaml.cpython-313-darwin.so +0 -0
  130. package/bin/ossiq/ossiq +0 -0
  131. package/package.json +24 -0
@@ -0,0 +1,385 @@
1
+ Metadata-Version: 2.5
2
+ Name: ossiq
3
+ Version: 0.1.12
4
+ Summary: Utility to forecast risks associated with currently installed packages updates
5
+ Project-URL: bugs, https://github.com/ossiq/ossiq/issues
6
+ Project-URL: changelog, https://github.com/ossiq/ossiq/blob/master/changelog.md
7
+ Project-URL: homepage, https://github.com/ossiq/ossiq
8
+ Project-URL: repository, https://github.com/ossiq/ossiq.git
9
+ Author-email: Maksym Klymyshyn <klymyshyn@gmail.com>
10
+ Maintainer-email: Maksym Klymyshyn <klymyshyn@gmail.com>
11
+ License-Expression: AGPL-3.0-only
12
+ License-File: AUTHORS
13
+ License-File: LICENSE
14
+ Keywords: engineering,maintenance,tech debt,techdebt,toc
15
+ Classifier: Development Status :: 3 - Alpha
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Intended Audience :: Information Technology
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Programming Language :: Python :: 3.14
25
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
26
+ Classifier: Topic :: Security
27
+ Classifier: Topic :: Software Development
28
+ Classifier: Topic :: Software Development :: Build Tools
29
+ Classifier: Topic :: Software Development :: Quality Assurance
30
+ Classifier: Topic :: Software Development :: Version Control
31
+ Classifier: Topic :: System :: Monitoring
32
+ Classifier: Topic :: System :: Software Distribution
33
+ Classifier: Topic :: Utilities
34
+ Requires-Python: >=3.11
35
+ Requires-Dist: common-expression-language>=0.5.6
36
+ Requires-Dist: jsonschema>=4.18.0
37
+ Requires-Dist: packaging>=24.0
38
+ Requires-Dist: pydantic-settings==2.15.0
39
+ Requires-Dist: pydantic==2.13.5
40
+ Requires-Dist: python-dotenv>=1.0.0
41
+ Requires-Dist: python-sat==1.9.dev7
42
+ Requires-Dist: requests-cache>=1.3.1
43
+ Requires-Dist: requests>=2.28.0
44
+ Requires-Dist: rich>=13.0.0
45
+ Requires-Dist: semver>=3.0.0
46
+ Requires-Dist: termcolor>=2.0.0
47
+ Requires-Dist: typer>=0.9.0
48
+ Requires-Dist: univers>=32.0.1
49
+ Provides-Extra: cli
50
+ Provides-Extra: docs
51
+ Requires-Dist: myst-parser>=5.0.0; extra == 'docs'
52
+ Requires-Dist: sphinx-autobuild>=2025.8.25; extra == 'docs'
53
+ Requires-Dist: sphinx-immaterial>=0.13.9; extra == 'docs'
54
+ Requires-Dist: sphinx>=8.0.0; extra == 'docs'
55
+ Requires-Dist: sphinxcontrib-mermaid>=2.1.0; extra == 'docs'
56
+ Requires-Dist: sphinxext-opengraph>=0.13.0; extra == 'docs'
57
+ Description-Content-Type: text/markdown
58
+
59
+ # OSS IQ
60
+
61
+ [![PyPI version](https://img.shields.io/pypi/v/ossiq.svg)](https://pypi.org/project/ossiq)
62
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
63
+ ![maintenance-status](https://img.shields.io/badge/maintenance-actively--developed-brightgreen.svg)
64
+
65
+ > Make better dependency decisions - before and after installation.
66
+
67
+ **OSS IQ** helps developers and code agents answer:
68
+
69
+ **Should I add it? Update it? Refactor it out?**
70
+
71
+ Before you add a new dependency, OSS IQ checks whether
72
+ the package and version is healthy, maintained and appropriate for your project -
73
+ helping to avoid deprecated, outdated or too fresh dependencies getting in.
74
+
75
+ OSS IQ helps you understand when and how to upgrade your existing dependencies,
76
+ verifies that they're compatible with your project, and supplies coding agents
77
+ such as **Claude** and **Codex** with the **validated context** they need to safely make the upgrade.
78
+
79
+ You can run OSS IQ from the command line, or hook it up to coding agents with both **SKILL.md** and local **MCP server**.
80
+
81
+ Free and open source (AGPL v3), for npm, uv, and pip.
82
+
83
+ ![OSS IQ HTML Report](https://ossiq.dev/_static/images/ossiq-cli-report-2026-07-13.png)
84
+
85
+ **Start where you are:**
86
+
87
+ | You want to | Go to |
88
+ |---|---|
89
+ | Stop your coding agent from adding a risky package | [Coding agents](#coding-agents) |
90
+ | Check, plan, and apply updates yourself | [The CLI workflow](#the-cli-workflow) |
91
+ | Give your team a report to prioritize from | [Reports and exports](#reports-and-exports) |
92
+
93
+ ## Quick start
94
+
95
+ No install required - run it from your project directory:
96
+
97
+ ```bash
98
+ uvx ossiq status # Python toolchain
99
+ npx @ossiq/cli status # Node toolchain - ships a binary, no Python needed
100
+ ```
101
+
102
+ OSS IQ detects the manifest (`package.json`, `pyproject.toml`, `requirements.txt`) in the target directory. A full scan makes hundreds of GitHub API calls, so [add a token](#github-token) before you rely on the results.
103
+
104
+ If you prefer a persistent install:
105
+
106
+ | Channel | Install | Notes |
107
+ | --- | --- | --- |
108
+ | PyPI | `uv tool install ossiq` (or `pipx install ossiq`) | Needs Python 3.11+ |
109
+ | npm | `npm install -g @ossiq/cli` | Self-contained binary, no Python |
110
+ | Docker | `docker pull ossiq/ossiq-cli` | See [Docker](#docker) |
111
+
112
+ ```bash
113
+ ossiq status
114
+ ```
115
+
116
+ The npm packages ship prebuilt binaries for macOS, Linux (glibc) and Windows on x64 and arm64. On musl-based Linux (Alpine) or Windows on ARM, install from PyPI instead.
117
+
118
+ ## Coding agents
119
+
120
+ Give Claude Code, Codex, or GitHub Copilot a skill and a local MCP server, so they check dependency health *before* they edit your manifest:
121
+
122
+ ```bash
123
+ # Install for all three tools
124
+ uvx ossiq install skills
125
+
126
+ # Or target one: claude, codex, copilot
127
+ uvx ossiq install skills claude
128
+ ```
129
+
130
+ This writes `SKILL.md` and registers `ossiq` as a local stdio MCP server (`ossiq mcp`) for Claude Code (`~/.claude/`) and Codex (`~/.codex/`), and adds the skill to Copilot's `~/.copilot/copilot-instructions.md`. Re-running is safe — existing config is merged, not overwritten.
131
+
132
+ The agent gets two read-only tools:
133
+
134
+ | Tool | Answers |
135
+ |---|---|
136
+ | `ossiq_evaluate_dependency` | Should I add this package, and at which version? |
137
+ | `ossiq_evaluate_updates` | Which existing dependencies should I bump, and in what order? |
138
+
139
+ Both return the same compact decision the CLI produces with `--format agent`:
140
+
141
+ ```bash
142
+ ossiq info requests --format agent
143
+ ```
144
+
145
+ ```json
146
+ {
147
+ "operation": "add",
148
+ "package": "requests",
149
+ "next_action": "install with caution",
150
+ "recommended_version": "2.31.0",
151
+ "reasons": ["recommend 2.31.0 rather than latest 2.32.0", "single maintainer — bus factor risk"],
152
+ "cves": [],
153
+ "warnings": ["SINGLE_MAINTAINER"]
154
+ }
155
+ ```
156
+
157
+ The install command prompts for a GitHub token (or takes `--github-token`; blank skips) and stores it in `~/.ossiq/config` and in each tool's MCP entry, so agent scans get the higher rate limit too. Files written, token handling, and running from a local checkout with `--dev`: [Reference → install skills](https://ossiq.dev/reference.html#install-skills).
158
+
159
+ ## The CLI workflow
160
+
161
+ ```bash
162
+ ossiq status # dependency health for the whole project
163
+ ossiq status --full # every package, every column (EPSS, update mode, lag, maintenance state)
164
+ ossiq status --security # CVE-affected packages only
165
+ ossiq info requests # one package: drift, CVEs, tree path, peer requirements
166
+ ossiq add requests # quality-gated install of the recommended version
167
+ ossiq plan # what the solver would change — read-only
168
+ ossiq apply # execute the plan, with rollback on failure
169
+ ```
170
+
171
+ Each takes an optional project path (default: `.`) and `--registry-type npm|pypi` to disambiguate a polyglot repo. `info` prints drift status, the dependency tree trace, policy compliance, direct and transitive CVEs, and peer requirements — one section per concern, [documented here](https://ossiq.dev/reference.html#info-package-report).
172
+
173
+ ### `add` — a gate in front of `uv add` and `npm install`
174
+
175
+ Package managers install the newest version that satisfies your constraints. `ossiq add` installs the *recommended* one: it runs the same analysis as `info`, shows drift, CVEs, transitive vulnerabilities and maintainer signals before touching a file, blocks critically unhealthy packages unless you pass `--force`, and confirms the exact spec before installing.
176
+
177
+ ```bash
178
+ ossiq add lodash --registry-type npm
179
+ ossiq add requests --version 2.31.0 # pin yourself, bypassing the recommendation
180
+ ```
181
+
182
+ ### `plan` and `apply` — updates with their transitive cascade
183
+
184
+ `plan` is a faithful preview of the matching `apply`: every flag is accepted by both. The solver simulates the full transitive impact of each recommendation before committing to it — the table shows a `↳` sub-row for each transitive package that would also move, falls back to the next-best version when the top candidate would cause a downstream conflict, and marks non-actionable entries with `✗`.
185
+
186
+ - **npm** — backs up `package.json`, injects all recommended versions as `overrides` in one pass, runs `npm install --ignore-scripts`, then removes the overrides block.
187
+ - **uv / pip** — rewrites specifiers in `pyproject.toml` or `requirements.txt` in place, then runs `uv lock --upgrade-package` / `pip install -c <constraints>`. Changes are rolled back automatically if the update fails.
188
+
189
+ The solver resolves in a single pass against your *current* lockfile, so a second `plan` can legitimately show more: applying re-resolves the tree, and the new constraints unlock recommendations that were not visible before. Repeat `apply` → `plan` until it reports no updates; most projects converge in one or two passes.
190
+
191
+ <details>
192
+ <summary><b>All <code>plan</code> / <code>apply</code> flags</b></summary>
193
+
194
+ | Option | Description |
195
+ |---|---|
196
+ | `--production` | Limit to production dependencies only |
197
+ | `--registry-type npm\|pypi` | Narrow to a specific ecosystem |
198
+ | `--security` | Include only CVE-affected packages (direct and transitive) |
199
+ | `--allow-prerelease` | Include pre-release versions across all packages |
200
+ | `--allow-prerelease-package <name>` | Allow pre-release for one package (repeatable) |
201
+ | `--ignore <name>`, `-i` | Exclude a package from the plan entirely (repeatable) |
202
+ | `--override <pkg>==<ver>` | Force an exact version, bypassing the solver and the cooldown (repeatable) |
203
+ | `--pin-all` | Write `==new_version` for every updated direct dependency, converting `^`, `~=`, `>=` to exact pins |
204
+ | `--rewrite-versions` | Include already-pinned (`==x.y.z`) dependencies and rewrite their version |
205
+ | `--yes`, `-y` | (`apply` only) Skip the confirmation prompt |
206
+
207
+ </details>
208
+
209
+ <details>
210
+ <summary><b>Pinning workflow — <code>--pin-all</code> and <code>--rewrite-versions</code></b></summary>
211
+
212
+ Packages pinned with an exact specifier (`==x.y.z`) are **frozen** by default, so an intentional lock is never upgraded by accident. The two flags together let you run a fully pinned dependency file:
213
+
214
+ ```bash
215
+ # 1. Migrate all direct deps to exact pins
216
+ ossiq apply --pin-all
217
+
218
+ # 2. Later, preview what is available (pinned deps stay hidden)
219
+ ossiq plan
220
+
221
+ # 3. Upgrade and re-pin in one pass — optionally holding some back
222
+ ossiq apply --pin-all --rewrite-versions
223
+ ossiq apply --pin-all --rewrite-versions --ignore requests --ignore django
224
+ ```
225
+
226
+ | Flags | `>=x` (declared) | `~=x` (narrowed) | `==x` (pinned) |
227
+ |---|---|---|---|
228
+ | *(none)* | lockfile-only update | rewrite `~=new` | frozen / skipped |
229
+ | `--pin-all` | rewrite `==new` | rewrite `==new` | frozen / skipped |
230
+ | `--rewrite-versions` | lockfile-only update | rewrite `~=new` | rewrite `==new` |
231
+ | `--pin-all --rewrite-versions` | rewrite `==new` | rewrite `==new` | rewrite `==new` |
232
+
233
+ </details>
234
+
235
+ ### Cooldown — freshness as a supply-chain guard
236
+
237
+ `--cooldown-period` (default: 7 days) keeps you off releases that were published minutes ago, where supply-chain attacks land. Versions younger than the cooldown are heavily penalized inside the solver, and any recommendation still younger than it after solving is withheld into a *"Held for cooldown"* section and never applied.
238
+
239
+ Two deliberate exceptions: a **CVE fix bypasses the hold** when the installed version is vulnerable (tagged `CVE`, with a `cooldown bypassed` note), and **brand-new transitive dependencies** are resolved by npm/uv at apply time, so the plan projects their version and age and flags fresh ones with `⚠`.
240
+
241
+ When the only version that fixes a CVE is itself still quarantined, you are trading a *known* risk against a *statistical* one. Three levers, from automatic to manual:
242
+
243
+ 1. **Default** — the fix is applied regardless of age. For most teams a concrete CVE beats a hypothetical supply-chain risk.
244
+ 2. **`--security`** — `ossiq apply --security --yes` patches vulnerabilities and touches nothing else, while your regular cadence stays on cooldown.
245
+ 3. **`--override pkg==version`** — force a version you have vetted yourself: `ossiq apply --override urllib3==2.0.7`. For a transitive package this writes a *persistent* entry (`overrides` in `package.json`, `override-dependencies` under `[tool.uv]`), and `status` keeps reporting it with the `OVERRIDE` constraint type until you remove it.
246
+
247
+ Full solver rules: [Reference → update solver](https://ossiq.dev/reference.html#update-solver).
248
+
249
+ ## Reports and exports
250
+
251
+ ```bash
252
+ # Single self-contained HTML file — share it, attach it to a ticket
253
+ ossiq html --output report.html
254
+
255
+ # Machine-readable JSON output for pipelines
256
+ ossiq export --output metrics.json
257
+ ```
258
+
259
+ The HTML report is the view for planning work rather than fixing one package: sort by drift or severity, drill into any dependency's tree path, CVEs, peer requirements and recommended version, and decide what to read release notes for before it enters the backlog. Exports use versioned schemas (`--schema-version`) so a metric you gate on today keeps its meaning tomorrow — see [Reference → outputs](https://ossiq.dev/reference.html#outputs) and the [GitHub Actions quality-gate tutorial](https://ossiq.dev/tutorials/tutorial-github-actions.html).
260
+
261
+ ## Configuration
262
+
263
+ ### GitHub token
264
+
265
+ OSS IQ mines repository history, which can take hundreds of GitHub API requests per run. Without a token you will be rate-limited at 60 requests/hour.
266
+
267
+ ```bash
268
+ export OSSIQ_GITHUB_TOKEN=$(gh auth token)
269
+
270
+ # Or persist it
271
+ echo "OSSIQ_GITHUB_TOKEN=$(gh auth token)" >> ~/.ossiq/config
272
+ ```
273
+
274
+ A read-only fine-grained token scoped to public repositories is the safer choice — see [Getting started → GitHub token](https://ossiq.dev/getting-started.html#github-personal-access-token).
275
+
276
+ ### Config file
277
+
278
+ Every `OSSIQ_*` environment variable can also live in `~/.ossiq/config` (dotenv format: `KEY=value`, `#` comments):
279
+
280
+ ```bash
281
+ # ~/.ossiq/config
282
+ OSSIQ_GITHUB_TOKEN=ghp_your_token
283
+ OSSIQ_COOLDOWN_PERIOD=14
284
+ OSSIQ_CACHE_TTL=48
285
+ ```
286
+
287
+ Point at a different file with `ossiq --config ./ossiq.conf status`. Values resolve highest-wins: CLI flags → environment variables → config file → built-in defaults.
288
+
289
+ ### Time controls
290
+
291
+ Two global options change how OSS IQ perceives time. They apply to `status`, `export`, `plan`, `apply`, and `info`, and combine freely.
292
+
293
+ | Option | Env var | Default | Effect |
294
+ |---|---|---|---|
295
+ | `--cutoff-date YYYY-MM-DD` | `OSSIQ_CUTOFF_DATE` | today | Treat versions published after this date as invisible (23:59:59 UTC). Reproduces a past state of your dependencies. |
296
+ | `--cooldown-period N` | `OSSIQ_COOLDOWN_PERIOD` | `7` | Soft-penalize versions younger than N days in the solver. `0` disables the penalty. |
297
+
298
+ ```bash
299
+ # Time-travel view with a wider freshness buffer
300
+ ossiq --cutoff-date 2025-01-01 --cooldown-period 14 status
301
+
302
+ # Same thing from the environment, for CI
303
+ OSSIQ_CUTOFF_DATE=2025-01-01 OSSIQ_COOLDOWN_PERIOD=14 ossiq status
304
+ ```
305
+
306
+ ## Supported ecosystems
307
+
308
+ | Ecosystem | Supported | Not yet |
309
+ |---|---|---|
310
+ | JavaScript | [npm](https://docs.npmjs.com/cli/v11/commands/npm) (`package.json` + `package-lock.json`) | [Yarn](https://yarnpkg.com/), [pnpm](https://pnpm.io/) — see the [issue tracker](https://github.com/ossiq/ossiq/issues) |
311
+ | Python | [uv](https://docs.astral.sh/uv/) (`pyproject.toml` + `uv.lock`), [pip lock](https://pip.pypa.io/en/stable/cli/pip_lock/) ([`pylock.toml`](https://packaging.python.org/en/latest/specifications/pylock-toml/#pylock-toml-spec)), [pip classic](https://pip.pypa.io/en/stable/reference/requirements-file-format/) (`requirements.txt`, best with `pip freeze` output) | [Poetry](https://python-poetry.org/) — export to `pylock.toml` as a workaround ([discussion](https://github.com/orgs/python-poetry/discussions/10322)) |
312
+
313
+ Analysis aggregates public data from [OSV](https://osv.dev/) (advisories), the [npm registry](https://www.npmjs.com/) and [PyPI](https://pypi.org/) (metadata and version history), and [GitHub](https://github.com/) (repository activity and maintainer signals).
314
+
315
+ ## Docker
316
+
317
+ ```bash
318
+ docker pull ossiq/ossiq-cli
319
+ export OSSIQ_GITHUB_TOKEN=$(gh auth token)
320
+
321
+ # Status
322
+ docker run --rm -e OSSIQ_GITHUB_TOKEN \
323
+ -v /path/to/your/project:/project:ro \
324
+ ossiq/ossiq-cli status /project
325
+
326
+ # HTML report or JSON export into ./reports
327
+ docker run --rm -e OSSIQ_GITHUB_TOKEN \
328
+ -v /path/to/your/project:/project:ro -v $(pwd)/reports:/output \
329
+ ossiq/ossiq-cli html -o /output/report.html /project
330
+ ```
331
+
332
+ Tags: `latest`, `0.1` (latest patch in the minor), `0.1.10` (exact version).
333
+
334
+ <details>
335
+ <summary><b>GitHub Actions example</b></summary>
336
+
337
+ ```yaml
338
+ jobs:
339
+ dependency-check:
340
+ runs-on: ubuntu-latest
341
+ steps:
342
+ - uses: actions/checkout@v4
343
+ - name: Analyze dependencies
344
+ run: |
345
+ docker run --rm \
346
+ -e OSSIQ_GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} \
347
+ -v ${{ github.workspace }}:/project:ro \
348
+ ossiq/ossiq-cli status /project
349
+ ```
350
+
351
+ </details>
352
+
353
+ ## Contributing
354
+
355
+ ```bash
356
+ git clone https://github.com/ossiq/ossiq.git
357
+ cd ossiq
358
+ uv sync
359
+
360
+ uv run hatch run ossiq status
361
+ uv run hatch run ossiq html -o ./test_report.html
362
+
363
+ # Point the agent skill and MCP server at your checkout instead of PyPI
364
+ uv run hatch run ossiq install skills --dev "$(pwd)"
365
+ ```
366
+
367
+ Issues and pull requests are welcome — start with the [issue tracker](https://github.com/ossiq/ossiq/issues). If OSS IQ saves you a maintenance afternoon, a ⭐ helps other people find it.
368
+
369
+ ## FAQ
370
+
371
+ **How is this different from `npm audit` or `pip-audit`?**
372
+ Audit tools find known vulnerabilities. OSS IQ also scores the risks that have no CVE: how far behind you are, whether a package is still maintained, what a version bump would drag in transitively, and which version to move to. It produces stable scores meant for CI gates and platform governance, not one-off alerts.
373
+
374
+ **Is it free?**
375
+ Yes — free and open source under AGPL v3.
376
+
377
+ **Which ecosystems?**
378
+ npm for JavaScript, and uv, pip lock, and classic pip for Python. More are on the roadmap.
379
+
380
+ **Where are the full docs?**
381
+ [ossiq.dev](https://ossiq.dev) — [getting started](https://ossiq.dev/getting-started.html), [reference](https://ossiq.dev/reference.html), and [tutorials](https://ossiq.dev/tutorials/index.html).
382
+
383
+ ## License
384
+
385
+ Licensed under the **GNU Affero General Public License v3.0**. See [LICENSE](LICENSE).
@@ -0,0 +1,13 @@
1
+ ../../../bin/ossiq,sha256=91xtlEsOshL63-xziZC62U2gmPqRxRLMjbYUZV1uoW0,320
2
+ _editable_impl_ossiq.pth,sha256=6h0NxJ80g3Wgh6fYiFTT_sdO3Z3E_woOi6LnxEzWwQw,34
3
+ ossiq-0.1.12.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
4
+ ossiq-0.1.12.dist-info/METADATA,sha256=FyFpZeGiwwzDutUxpNCwQJiSc67IJzLpOw7v4n2dzVQ,18758
5
+ ossiq-0.1.12.dist-info/RECORD,,
6
+ ossiq-0.1.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ ossiq-0.1.12.dist-info/WHEEL,sha256=THafob7ofN-NsuMN7Mg4qZyHaQI7KkD-QlcQatYhXPo,87
8
+ ossiq-0.1.12.dist-info/direct_url.json,sha256=uM_pa5n4TNiarZQA22CrgBVwtIlA8T7ULEmpOsLq7pA,76
9
+ ossiq-0.1.12.dist-info/entry_points.txt,sha256=7rWuXe8kJlWHSOTIeX2f73SqSPxhi1EQ20r6Fp2V0NY,40
10
+ ossiq-0.1.12.dist-info/licenses/AUTHORS,sha256=NBkGjKo5QjuDcE6Sw2bHQmXTfWeIYix8CRW8d06leno,320
11
+ ossiq-0.1.12.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
12
+ ossiq-0.1.12.dist-info/uv_build.json,sha256=-o-qXzqrNj9LviCmhA9Po5DyS7XDYIFpaWsVvaPJkVo,116
13
+ ossiq-0.1.12.dist-info/uv_cache.json,sha256=1HD1C1qAXcplgXWrhS5cRsI5PHjnbOao3z0nqAJLGJI,194
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.3
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1 @@
1
+ {"url":"file:///Users/runner/work/ossiq/ossiq","dir_info":{"editable":true}}
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ossiq = ossiq.cli:app
@@ -0,0 +1,8 @@
1
+ # This is the list of OSS IQ significant contributors.
2
+ #
3
+ # This does not necessarily list everyone who has contributed code,
4
+ # especially since many employees of one corporation may be contributing.
5
+ # To see the full list of contributors, see the revision history in
6
+ # source control.
7
+ Maksym Klymyshyn
8
+ Oleksandr Shulika