@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,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
+ ```