@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.
- package/bin/ossiq/_internal/Python.framework/Versions/3.13/Python +0 -0
- package/bin/ossiq/_internal/Python.framework/Versions/3.13/Resources/Info.plist +30 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/RECORD +37 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
- package/bin/ossiq/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
- package/bin/ossiq/_internal/base_library.zip +0 -0
- package/bin/ossiq/_internal/cel/cel.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/certifi/cacert.pem +3959 -0
- package/bin/ossiq/_internal/certifi/py.typed +0 -0
- package/bin/ossiq/_internal/charset_normalizer/cd.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/charset_normalizer/md.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/METADATA +261 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/RECORD +16 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/WHEEL +4 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/entry_points.txt +2 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/licenses/LICENSE +201 -0
- package/bin/ossiq/_internal/common_expression_language-0.10.0.dist-info/sboms/cel.cyclonedx.json +2109 -0
- package/bin/ossiq/_internal/libcrypto.3.dylib +0 -0
- package/bin/ossiq/_internal/libncurses.6.dylib +0 -0
- package/bin/ossiq/_internal/libssl.3.dylib +0 -0
- package/bin/ossiq/_internal/ossiq/data/SKILL.md +313 -0
- package/bin/ossiq/_internal/ossiq/domain/README.md +373 -0
- package/bin/ossiq/_internal/ossiq/solver/README.md +155 -0
- package/bin/ossiq/_internal/ossiq/strategy/README.md +182 -0
- package/bin/ossiq/_internal/ossiq/ui/html_templates/filter_format_highlight_days.html +7 -0
- package/bin/ossiq/_internal/ossiq/ui/html_templates/spa_app.html +18125 -0
- package/bin/ossiq/_internal/ossiq/ui/html_templates/tag_versions_difference.html +33 -0
- package/bin/ossiq/_internal/ossiq/ui/renderers/export/README.md +207 -0
- package/bin/ossiq/_internal/ossiq/ui/renderers/export/schemas/export_schema_v1.5.json +1637 -0
- package/bin/ossiq/_internal/ossiq/ui/renderers/export/schemas/export_schema_v1.5_standard.json +1164 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/METADATA +385 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/RECORD +13 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/WHEEL +4 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/direct_url.json +1 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/entry_points.txt +2 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/licenses/AUTHORS +8 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/licenses/LICENSE +661 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/uv_build.json +1 -0
- package/bin/ossiq/_internal/ossiq-0.1.12.dist-info/uv_cache.json +1 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/METADATA +171 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/RECORD +154 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/WHEEL +5 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/licenses/AUTHORS.rst +11 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/licenses/LICENSE +27 -0
- package/bin/ossiq/_internal/prompt_toolkit-3.0.53.dist-info/top_level.txt +1 -0
- package/bin/ossiq/_internal/pycard.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/METADATA +1307 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/RECORD +113 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/WHEEL +4 -0
- package/bin/ossiq/_internal/pydantic-2.13.5.dist-info/licenses/LICENSE +21 -0
- package/bin/ossiq/_internal/pydantic_core/_pydantic_core.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/pyformula.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/pysolvers.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_asyncio.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_bisect.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_blake2.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_bz2.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_cn.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_hk.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_iso2022.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_jp.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_kr.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_codecs_tw.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_contextvars.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_csv.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_ctypes.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_curses.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_datetime.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_decimal.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_hashlib.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_heapq.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_json.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_lzma.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_md5.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_multibytecodec.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_multiprocessing.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_opcode.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_pickle.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_posixshmem.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_posixsubprocess.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_queue.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_random.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_scproxy.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_sha1.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_sha2.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_sha3.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_socket.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_sqlite3.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_ssl.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_statistics.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_struct.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_uuid.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/_zoneinfo.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/array.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/binascii.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/fcntl.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/grp.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/math.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/mmap.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/pyexpat.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/readline.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/resource.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/select.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/syslog.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/termios.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/unicodedata.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/python3.13/lib-dynload/zlib.cpython-313-darwin.so +0 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/INSTALLER +1 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/LICENSE +22 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/METADATA +324 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/RECORD +10 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/REQUESTED +0 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/WHEEL +6 -0
- package/bin/ossiq/_internal/semantic_version-2.10.0.dist-info/top_level.txt +1 -0
- package/bin/ossiq/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +2 -0
- package/bin/ossiq/_internal/wcwidth/py.typed +0 -0
- package/bin/ossiq/_internal/wcwidth/textwrap.py,cover +664 -0
- package/bin/ossiq/_internal/yaml/_yaml.cpython-313-darwin.so +0 -0
- package/bin/ossiq/ossiq +0 -0
- package/package.json +24 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<div class="flex">
|
|
2
|
+
{% if comparison.diff_index == diff_types.DIFF_MAJOR %}
|
|
3
|
+
<span class="material-symbols-rounded text-base text-gray-500 dark:text-gray-300 text-xl mr-2">flood</span>
|
|
4
|
+
|
|
5
|
+
<span class="px-3 py-1 rounded-full bg-red-700 dark:bg-red-700 text-white dark:text-white text-sm font-bold">
|
|
6
|
+
MAJOR
|
|
7
|
+
</span>
|
|
8
|
+
{% elif comparison.diff_index == diff_types.DIFF_MINOR %}
|
|
9
|
+
<span class="material-symbols-rounded text-base text-gray-500 dark:text-gray-300 text-xl mr-2">warning</span>
|
|
10
|
+
<span
|
|
11
|
+
class="px-3 py-1 rounded-full bg-yellow-300 dark:bg-yellow-700/70 text-amber-700 dark:text-white text-sm font-bold">
|
|
12
|
+
MINOR
|
|
13
|
+
</span>
|
|
14
|
+
{% elif comparison.diff_index == diff_types.DIFF_PATCH %}
|
|
15
|
+
<span class="material-symbols-rounded text-base text-gray-500 dark:text-gray-300 text-xl mr-2">timer</span>
|
|
16
|
+
<span
|
|
17
|
+
class="px-3 py-1 rounded-full bg-blue-500 text-white dark:bg-blue-700/60 text-blue-500 dark:text-blue-200 text-sm font-bold">
|
|
18
|
+
PATCH
|
|
19
|
+
</span>
|
|
20
|
+
{% elif comparison.diff_index == diff_types.NO_DIFF %}
|
|
21
|
+
|
|
22
|
+
<span class="material-symbols-rounded text-base text-gray-500 dark:text-gray-300 text-xl mr-2">unpublished</span>
|
|
23
|
+
|
|
24
|
+
<span class="px-3 py-1 rounded-full text-red-700 dark:text-red-700 bg-white dark:bg-white text-sm font-bold">
|
|
25
|
+
UNPUBLISHED
|
|
26
|
+
</span>
|
|
27
|
+
{% else %}
|
|
28
|
+
<span class="material-symbols-rounded text-base text-gray-500 dark:text-gray-300 text-xl mr-2">check</span>
|
|
29
|
+
<span class="px-3 py-1 rounded-full bg-green-500 dark:bg-green-700/60 text-white dark:text-white text-sm font-bold">
|
|
30
|
+
LATEST
|
|
31
|
+
</span>
|
|
32
|
+
{% endif %}
|
|
33
|
+
</div>
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Export Format Versioning Guide
|
|
2
|
+
|
|
3
|
+
This directory owns the versioned JSON export format. Follow this guide when introducing a new schema version (e.g. v1.6).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Profiles: standard and full
|
|
8
|
+
|
|
9
|
+
Every schema version has two profiles, each with its own schema file:
|
|
10
|
+
|
|
11
|
+
| Profile | Produced by | Carries | Schema |
|
|
12
|
+
|---------|-------------|---------|--------|
|
|
13
|
+
| `standard` | `ossiq export` (default) | Every direct dependency, the transitives `needs_attention` selects, decision fields only; optional nulls and empty lists omitted from per-package records | `export_schema_v<N>_standard.json` |
|
|
14
|
+
| `full` | `ossiq export --full`, `ossiq html` | Everything: every transitive, `dependency_tree`, provenance URLs, the raw upstream signals behind each verdict | `export_schema_v<N>.json` |
|
|
15
|
+
|
|
16
|
+
`standard` is a **projection** of `full`: the same field names and meanings, fewer fields and fewer
|
|
17
|
+
transitive entries, nothing renamed or added. `metadata.profile` says which one a document is.
|
|
18
|
+
|
|
19
|
+
- **Which fields are full-only** is decided on the field itself, in `models.py`:
|
|
20
|
+
`Field(..., json_schema_extra=FULL_ONLY)`. `ProfiledExportModel` drops them at dump time, and
|
|
21
|
+
`export_json()` is the one place a document becomes JSON.
|
|
22
|
+
- **Adding a field:** decide its profile where you declare it. An agent needs it to decide what to
|
|
23
|
+
do → leave it untagged. Only dashboards, archives or recalibration need it → tag it `FULL_ONLY`.
|
|
24
|
+
`test_standard_field_sets_are_a_deliberate_choice` fails until you make that call.
|
|
25
|
+
- **The two schemas are kept in sync by a test**, not by hand-diffing:
|
|
26
|
+
`TestStandardSchemaIsAProjectionOfFull` requires the standard schema to equal the full one minus
|
|
27
|
+
exactly the `FULL_ONLY` fields, property by property. The standard schema sets
|
|
28
|
+
`additionalProperties: false`, so a leaked full-only field fails validation.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Versioning policy
|
|
34
|
+
|
|
35
|
+
Two kinds of changes require a new version:
|
|
36
|
+
|
|
37
|
+
| Change type | Example | New version? |
|
|
38
|
+
|-------------|---------|--------------|
|
|
39
|
+
| Additive — new optional fields on existing models | Adding `maintainer_count` to `PackageMetrics` | Yes (minor) |
|
|
40
|
+
| Structural — changed field types, renamed fields, different array item shapes | v1.3's `transitive_packages` item type change | Yes (minor) |
|
|
41
|
+
|
|
42
|
+
Breaking changes (removing required fields, renaming) are **never** made to an existing version — always bump.
|
|
43
|
+
|
|
44
|
+
### The standing exception: v1.5 while it is unreleased
|
|
45
|
+
|
|
46
|
+
v1.5 has not shipped in a release (the package is still `0.1.10`), so it has no consumers outside
|
|
47
|
+
this repository and additive fields have been **amended into `export_schema_v1.5.json` in place**
|
|
48
|
+
rather than bumped. Amended this way so far: the version-ladder fields (`latest_in_range`,
|
|
49
|
+
`latest_in_major`, `latest_compatible_major`, `recommended_from_rung`), the module-system and
|
|
50
|
+
engine fields, `next_action` / `requires_constraint_widening`, the data-completeness
|
|
51
|
+
diagnostics (`data_completeness.sources[].failures` and `data_completeness.api_budgets`), and
|
|
52
|
+
`latest_preserving_module_system` / `module_system_note`, and the profile split
|
|
53
|
+
(`metadata.profile`, `summary.transitive_packages`, `runtime_context.runtime_mismatch`,
|
|
54
|
+
`CVEInfo.affected_ranges` / `fixed_in`, `TransitivePackageMetrics.recommended_version` /
|
|
55
|
+
`required_by`, and root `ignored_packages` / `upgrade_paths` / `manifest_lock_divergent`, plus the
|
|
56
|
+
new `export_schema_v1.5_standard.json`). Each addition to the full schema is optional, not in
|
|
57
|
+
`required`, and none of its `$defs` sets `additionalProperties: false`, so documents produced before
|
|
58
|
+
the amendment still validate. `runtime_context.engine_context_source` also gained the `provided`
|
|
59
|
+
value it was missing since the stated-runtime change.
|
|
60
|
+
|
|
61
|
+
One rename was also made in place: `triage_action` became `dependency_health_action`. Agents read
|
|
62
|
+
the old name as the answer to "should I update?". With no released consumer, a rename cost nothing
|
|
63
|
+
that a v1.6 bump would have saved. A pre-rename document still validates, since the old key is
|
|
64
|
+
simply an unknown extra property, but it no longer populates the field.
|
|
65
|
+
|
|
66
|
+
This exception ends the moment v1.5 ships. After that the policy above applies without
|
|
67
|
+
qualification: additive changes bump the minor version. Amending in place still means running the
|
|
68
|
+
rest of the checklist below — regenerate the TS types, type-check the frontend, rebuild the SPA.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Step-by-step: introducing v1.6
|
|
73
|
+
|
|
74
|
+
### 1. Enum — `src/ossiq/domain/common.py`
|
|
75
|
+
|
|
76
|
+
Add the new version to `ExportJsonSchemaVersion`:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
class ExportJsonSchemaVersion(StrEnum):
|
|
80
|
+
V1_5 = "1.5"
|
|
81
|
+
V1_6 = "1.6" # add
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 2. Python models — `src/ossiq/ui/renderers/export/models.py`
|
|
87
|
+
|
|
88
|
+
There is a single `ExportData` root (the former v1.3 shape: `constraint_type_map`,
|
|
89
|
+
`transitive_packages` as `TransitivePackageMetrics`, and `dependency_tree`).
|
|
90
|
+
|
|
91
|
+
**Additive-only change (new optional fields on `PackageMetrics` / `TransitivePackageMetrics`):**
|
|
92
|
+
add the field as optional with `default=None` and update the `from_domain` constructor. No new
|
|
93
|
+
subclass, no factory branch — existing serialization picks it up automatically.
|
|
94
|
+
|
|
95
|
+
**Structural change** (a package-array item shape changes): add a new `ExportData` subclass and
|
|
96
|
+
branch `build_export_data()` on `schema_version` to return it, keeping the old root for the
|
|
97
|
+
previous version.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 3. JSON schema — `src/ossiq/ui/renderers/export/schemas/`
|
|
102
|
+
|
|
103
|
+
Copy the previous version as a starting point:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
cp export_schema_v1.5.json export_schema_v1.6.json
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Edit `export_schema_v1.6.json`:
|
|
110
|
+
- Update `$id` → `https://ossiq.org/schemas/export/v1.6.json`
|
|
111
|
+
- Update `title` and `description`
|
|
112
|
+
- Update `metadata.properties.schema_version.const` → `"1.6"`
|
|
113
|
+
- Apply the structural or additive changes to `$defs`
|
|
114
|
+
|
|
115
|
+
Do the same for the standard profile (`export_schema_v1.6_standard.json`): copy the previous
|
|
116
|
+
standard schema, bump its `$id` / `title`, and mirror every change that isn't `FULL_ONLY`. The
|
|
117
|
+
projection test tells you exactly which properties are missing or extra.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### 4. Schema registry — `src/ossiq/ui/renderers/export/json_schema_registry.py`
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
SCHEMA_FILES = {
|
|
125
|
+
(ExportJsonSchemaVersion.V1_5, ExportProfile.FULL): "export_schema_v1.5.json",
|
|
126
|
+
(ExportJsonSchemaVersion.V1_5, ExportProfile.STANDARD): "export_schema_v1.5_standard.json",
|
|
127
|
+
(ExportJsonSchemaVersion.V1_6, ExportProfile.FULL): "export_schema_v1.6.json", # add
|
|
128
|
+
(ExportJsonSchemaVersion.V1_6, ExportProfile.STANDARD): "export_schema_v1.6_standard.json", # add
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
def get_latest_version(self) -> ExportJsonSchemaVersion:
|
|
132
|
+
return ExportJsonSchemaVersion.V1_6 # bump
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Also widen the `--schema-version` `Literal` in `src/ossiq/cli.py` and update
|
|
136
|
+
`HELP_SCHEMA_VERSION` in `src/ossiq/messages.py`.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
### 5. Frontend types — `frontend/package.json`
|
|
141
|
+
|
|
142
|
+
Update the `generate:types` script to point at the new JSON schema:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
"generate:types": "json2ts -i ../src/ossiq/ui/renderers/export/schemas/export_schema_v1.6.json -o src/types/report.ts"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Then regenerate:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
cd frontend
|
|
152
|
+
npm run generate:types
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
This overwrites `frontend/src/types/report.ts`. TypeScript compiler errors after regeneration are the authoritative list of breaking changes to fix in Vue components.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### 6. Frontend alignment
|
|
160
|
+
|
|
161
|
+
Run `npm run type-check` in `frontend/` to surface all type errors introduced by the schema change.
|
|
162
|
+
|
|
163
|
+
Common patterns to check in Vue components and stores:
|
|
164
|
+
- New required fields need to be supplied in fixtures / mock data used in `vitest` tests
|
|
165
|
+
- Removed or renamed fields need updating at every access site
|
|
166
|
+
- Structural changes (like v1.3's `dependency_path → dependency_paths`) require updating iteration logic, filter callbacks, and any `d3` graph-building code that expands the transitive package list
|
|
167
|
+
|
|
168
|
+
After all type errors are resolved, rebuild the SPA and regenerate the embedded template:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
cd frontend && npm run build
|
|
172
|
+
# then run whatever script bakes spa_app.html into the Python package
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### 7. Tests
|
|
178
|
+
|
|
179
|
+
**New schema registry test file** — copy `tests/ui/renderers/export/test_json_schema_registry_v1_5.py` and update version strings and structural assertions.
|
|
180
|
+
|
|
181
|
+
**Update existing tests** — hardcoded version strings to update:
|
|
182
|
+
- `test_metadata_contains_schema_version_and_timestamp` in `test_json.py`
|
|
183
|
+
- `test_get_latest_version_returns_v1_X` and `included_versions` in the previous schema registry test file
|
|
184
|
+
|
|
185
|
+
**New renderer tests** — add a `TestJsonExportRendererV16` class in `test_json.py` covering:
|
|
186
|
+
- Output validates against the new JSON schema
|
|
187
|
+
- Any new structural invariants (e.g. deduplication counts, new field presence)
|
|
188
|
+
- Backward compat: v1.5 still produces v1.5-shaped output (if the previous version is kept registered)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Checklist
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
[ ] ExportJsonSchemaVersion.V1_6 added to domain/common.py
|
|
196
|
+
[ ] New Pydantic fields / subclass added to models.py
|
|
197
|
+
[ ] build_export_data() factory branch added (only if structural)
|
|
198
|
+
[ ] export_schema_v1.6.json and export_schema_v1.6_standard.json created
|
|
199
|
+
[ ] json_schema_registry.py updated + get_latest_version() bumped
|
|
200
|
+
[ ] --schema-version Literal widened in cli.py + HELP_SCHEMA_VERSION updated
|
|
201
|
+
[ ] frontend/package.json generate:types script updated to v1.6
|
|
202
|
+
[ ] npm run generate:types run — src/types/report.ts regenerated
|
|
203
|
+
[ ] npm run type-check passes — all Vue component access sites updated
|
|
204
|
+
[ ] SPA rebuilt and spa_app.html regenerated
|
|
205
|
+
[ ] Schema registry tests added (full and standard), projection test pointed at v1.6
|
|
206
|
+
[ ] Renderer tests updated
|
|
207
|
+
```
|