ui-design-workbench-cli 0.5.0__tar.gz → 0.6.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/PKG-INFO +8 -7
  2. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/README.md +7 -6
  3. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/SKILL.md +9 -5
  4. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/pyproject.toml +6 -2
  5. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/agent-integrations.md +1 -1
  6. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/cache-protocol.md +4 -0
  7. ui_design_workbench_cli-0.6.6/references/component-catalog.json +121 -0
  8. ui_design_workbench_cli-0.6.6/references/component-catalog.md +22 -0
  9. ui_design_workbench_cli-0.6.6/references/component-inventory.json +209 -0
  10. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/fidelity.md +5 -3
  11. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/ir-schema.md +1 -1
  12. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/native-rendering.md +2 -2
  13. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/fidelity_adapters.py +34 -9
  14. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/fidelity_platform_adapters.py +417 -33
  15. ui_design_workbench_cli-0.6.6/scripts/layout_model.py +489 -0
  16. ui_design_workbench_cli-0.6.6/scripts/platform_component_catalog.py +294 -0
  17. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/render_preview.py +106 -14
  18. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/scan_ui.py +186 -11
  19. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/scoped_context.py +104 -8
  20. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/smoke_preview.js +6 -2
  21. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/PKG-INFO +8 -7
  22. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/SOURCES.txt +5 -0
  23. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/top_level.txt +2 -0
  24. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/uidw.py +256 -60
  25. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/uidw_mcp.py +43 -9
  26. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/adapter-api.md +0 -0
  27. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/design-modes.md +0 -0
  28. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/platform-profiles.json +0 -0
  29. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/platform-standards.md +0 -0
  30. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/platforms.md +0 -0
  31. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/quality-automation.md +0 -0
  32. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/review-workflow.md +0 -0
  33. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/ui-guidance-mode.md +0 -0
  34. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/ui-policy-schema.md +0 -0
  35. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/ui-reviewer.md +0 -0
  36. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/validation.md +0 -0
  37. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/references/workbench-ui.md +0 -0
  38. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/native-render-state.schema.json +0 -0
  39. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/ui-agent-job.schema.json +0 -0
  40. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/ui-graph.schema.json +0 -0
  41. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/ui-ir.patch.schema.json +0 -0
  42. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/ui-ir.schema.json +0 -0
  43. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/schemas/uidw-config.schema.json +0 -0
  44. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/android_resource_resolver.py +0 -0
  45. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/android_xml_support.py +0 -0
  46. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/apple_resource_resolver.py +0 -0
  47. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/coverage_report.py +0 -0
  48. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/fidelity_adapter_api.py +0 -0
  49. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/fidelity_core.py +0 -0
  50. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/generate_interaction_matrix.py +0 -0
  51. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ir_contracts.py +0 -0
  52. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/merge_review_state.py +0 -0
  53. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/native_render_android.py +0 -0
  54. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/native_render_apple.py +0 -0
  55. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/native_render_contracts.py +0 -0
  56. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/native_render_registry.py +0 -0
  57. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/quality_common.py +0 -0
  58. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/dependency_links.txt +0 -0
  59. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/entry_points.txt +0 -0
  60. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/ui_design_workbench_cli.egg-info/requires.txt +0 -0
  61. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/validate_platform_profiles.py +0 -0
  62. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/scripts/visual_regression.py +0 -0
  63. {ui_design_workbench_cli-0.5.0 → ui_design_workbench_cli-0.6.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ui-design-workbench-cli
3
- Version: 0.5.0
3
+ Version: 0.6.6
4
4
  Summary: Repository UI indexing, graph, preview, and deterministic review CLI
5
5
  Author: Elgreed
6
6
  Project-URL: Homepage, https://github.com/Elgreed/ui-design-workbench
@@ -19,7 +19,7 @@ Requires-Dist: mcp<3,>=2; extra == "mcp"
19
19
 
20
20
  # UI Design Workbench
21
21
 
22
- [Русская версия](README.ru.md) · [Changelog](CHANGELOG.md) · [Release guide](RELEASING.md)
22
+ [Русская версия](README.ru.md) · [Changelog](CHANGELOG.md)
23
23
 
24
24
  Turn repository UI source into an offline interactive HTML workbench—without building or running the application.
25
25
 
@@ -82,7 +82,7 @@ uidw --repo <repo> review --output-dir <review-dir> --level full
82
82
  - Incremental scans that reprocess only changed UI files.
83
83
  - Property-level evidence and explicit unsupported gaps instead of guessed UI.
84
84
  - Sparse review patches and a separate, authorized source-apply step.
85
- - Structural Android and Apple resource projection, plus discovery of available native capture paths.
85
+ - Runtime-free Android, Apple, and Flutter source projection with deterministic geometry for the supported subset; native evidence is required only before claiming visual or pixel parity and is never launched automatically.
86
86
 
87
87
  Supported source families include Web, React, Vue, Svelte, Jetpack Compose, Android Views XML, SwiftUI, Storyboard/XIB, WinUI/WPF, and Flutter.
88
88
 
@@ -105,8 +105,8 @@ Run `uidw help overview`, `uidw help advanced`, or `uidw <command> --help` for d
105
105
 
106
106
  ## Accuracy and safety
107
107
 
108
- - HTML is a static source projection, not proof of runtime or pixel parity.
109
- - Android and Apple translation remains structural until a source-matched native capture exists.
108
+ - HTML is a deterministic runtime-free source projection for the supported shared layout subset, not proof of runtime or pixel parity.
109
+ - Android, Apple, and Flutter translation uses deterministic projection geometry for the supported shared layout subset; without separate native evidence it remains a structural projection, not proof of runtime or pixel parity.
110
110
  - Unsupported bindings, custom drawing, runtime data, and platform behavior remain explicit gaps.
111
111
  - Preview and review keep application source read-only; applying a proposal is a separate step.
112
112
  - Derived cache and review state live outside the target repository by default.
@@ -123,11 +123,12 @@ A Windows `.exe` is not published yet. PyPI + `pipx` is the primary cross-platfo
123
123
  ## Documentation
124
124
 
125
125
  - [Changelog](CHANGELOG.md)
126
- - [Release and distribution guide](RELEASING.md)
127
126
  - [Agent integrations](references/agent-integrations.md)
128
127
  - [Fidelity contract](references/fidelity.md)
129
128
  - [Native rendering](references/native-rendering.md)
129
+ - [Cache protocol](references/cache-protocol.md)
130
+ - [Platform component catalog](references/component-catalog.md)
130
131
  - [IR schema](references/ir-schema.md)
131
132
  - [Review workflow](references/review-workflow.md)
132
133
 
133
- Current CLI version: `0.5.0`.
134
+ Current CLI version: `0.6.6`.
@@ -1,6 +1,6 @@
1
1
  # UI Design Workbench
2
2
 
3
- [Русская версия](README.ru.md) · [Changelog](CHANGELOG.md) · [Release guide](RELEASING.md)
3
+ [Русская версия](README.ru.md) · [Changelog](CHANGELOG.md)
4
4
 
5
5
  Turn repository UI source into an offline interactive HTML workbench—without building or running the application.
6
6
 
@@ -63,7 +63,7 @@ uidw --repo <repo> review --output-dir <review-dir> --level full
63
63
  - Incremental scans that reprocess only changed UI files.
64
64
  - Property-level evidence and explicit unsupported gaps instead of guessed UI.
65
65
  - Sparse review patches and a separate, authorized source-apply step.
66
- - Structural Android and Apple resource projection, plus discovery of available native capture paths.
66
+ - Runtime-free Android, Apple, and Flutter source projection with deterministic geometry for the supported subset; native evidence is required only before claiming visual or pixel parity and is never launched automatically.
67
67
 
68
68
  Supported source families include Web, React, Vue, Svelte, Jetpack Compose, Android Views XML, SwiftUI, Storyboard/XIB, WinUI/WPF, and Flutter.
69
69
 
@@ -86,8 +86,8 @@ Run `uidw help overview`, `uidw help advanced`, or `uidw <command> --help` for d
86
86
 
87
87
  ## Accuracy and safety
88
88
 
89
- - HTML is a static source projection, not proof of runtime or pixel parity.
90
- - Android and Apple translation remains structural until a source-matched native capture exists.
89
+ - HTML is a deterministic runtime-free source projection for the supported shared layout subset, not proof of runtime or pixel parity.
90
+ - Android, Apple, and Flutter translation uses deterministic projection geometry for the supported shared layout subset; without separate native evidence it remains a structural projection, not proof of runtime or pixel parity.
91
91
  - Unsupported bindings, custom drawing, runtime data, and platform behavior remain explicit gaps.
92
92
  - Preview and review keep application source read-only; applying a proposal is a separate step.
93
93
  - Derived cache and review state live outside the target repository by default.
@@ -104,11 +104,12 @@ A Windows `.exe` is not published yet. PyPI + `pipx` is the primary cross-platfo
104
104
  ## Documentation
105
105
 
106
106
  - [Changelog](CHANGELOG.md)
107
- - [Release and distribution guide](RELEASING.md)
108
107
  - [Agent integrations](references/agent-integrations.md)
109
108
  - [Fidelity contract](references/fidelity.md)
110
109
  - [Native rendering](references/native-rendering.md)
110
+ - [Cache protocol](references/cache-protocol.md)
111
+ - [Platform component catalog](references/component-catalog.md)
111
112
  - [IR schema](references/ir-schema.md)
112
113
  - [Review workflow](references/review-workflow.md)
113
114
 
114
- Current CLI version: `0.5.0`.
115
+ Current CLI version: `0.6.6`.
@@ -14,22 +14,26 @@ Use UIDW as a deterministic local utility. The CLI, not the skill prompt, owns s
14
14
  Prefer MCP tools `ui_project` then `ui_scope` when the local UIDW MCP is configured. Otherwise use the complete CLI fallback:
15
15
 
16
16
  ```text
17
- uidw --repo <repo> context --json
18
- uidw --repo <repo> scope --ir <ui-ir.json> --screen <id> --budget 4000
17
+ uidw --repo <repo> scope --budget 4000
18
+ uidw --repo <repo> scope --screen <id> --budget 4000
19
19
  ```
20
20
 
21
- If `uidw` is unavailable, run `python <skill-dir>/scripts/uidw.py ...`. Reuse a clean cache. Never paste or read the complete `ui-ir.json` when a scoped context can answer the task. Request another screen/finding scope only when needed.
21
+ The first command initializes or reuses the cache and writes a compact catalog; the second writes the selected screen context. Scope provenance is compact by default. Use `ui_fidelity` or `uidw fidelity explain <node-id>` only for nodes that need full source evidence. Reuse the returned `scopeHash` through `if_none_match` or `--if-none-match` before requesting the same scope again.
22
+
23
+ If `uidw` is unavailable, run `python <skill-dir>/scripts/uidw.py ...`. Reuse a clean cache. Never paste or read the complete `ui-ir.json` when a scoped context can answer the task. Request another screen/finding scope only when needed. If a scope reports `over-budget`, narrow it or explicitly raise the budget; no partial node tree was returned.
22
24
 
23
25
  If first-use context says `setupRequired`, ask only for `low`, `medium`, or `high` using its short descriptions. Mock-data depth follows that choice. Do not recommend a level. Optional `uiMode` remains off until explicitly enabled.
24
26
 
25
27
  ## 2. Route the request
26
28
 
27
- - Reconstruct/generate/redesign: read [references/design-modes.md](references/design-modes.md), then only the matching platform section from [references/platform-standards.md](references/platform-standards.md). Use cached evidence and `uidw workbench`; validate transfer fidelity, not product UX. For Android or Apple visual accuracy also read [references/native-rendering.md](references/native-rendering.md) and call MCP `ui_native_status` (or `uidw native status`).
29
+ - Reconstruct/generate/redesign: read [references/design-modes.md](references/design-modes.md), then only the matching platform section from [references/platform-standards.md](references/platform-standards.md). Use cached evidence and `uidw workbench`; validate transfer fidelity, not product UX. Layout fidelity comes from the runtime-free deterministic projection; do not build or launch the source application.
28
30
  - Explicit review/audit/critique: read [references/ui-reviewer.md](references/ui-reviewer.md) and [references/review-workflow.md](references/review-workflow.md). Review immutable Before only and work in bounded screen batches.
29
31
  - Workbench chrome behavior: read [references/workbench-ui.md](references/workbench-ui.md).
30
32
  - Ordinary UI source task with `uiMode.enabled=true`: read [references/ui-guidance-mode.md](references/ui-guidance-mode.md). Do not create a preview or review unless requested.
31
33
  - Cache/install/agent integration question: read only [references/cache-protocol.md](references/cache-protocol.md) or [references/agent-integrations.md](references/agent-integrations.md), respectively.
32
34
 
35
+ Legacy provider discovery remains available through read-only MCP `ui_native_status` (or `uidw native status`). It is optional compatibility diagnostics and must not be called as part of reconstruction, deterministic layout, rendering, or fidelity gating.
36
+
33
37
  ## 3. Return sparse changes
34
38
 
35
39
  Review/proposal agents write `ui-ir.patch.json`, never a replacement full IR:
@@ -47,6 +51,6 @@ Allowed operations are `upsert-findings`, `upsert-versions`, `merge-annotations`
47
51
  - Do not run the target app, emulator, simulator, build, or dev server unless separately requested. Headless checks may open only generated local HTML.
48
52
  - Preserve discovered screens, routes, project components, platform idioms, tokens, themes, states, provenance, and unsupported gaps. Do not invent polish or browser-default replacements.
49
53
  - HTML is a projection. Base IR is immutable Before; proposal versions are sparse overrides.
50
- - Android/Apple source translation is structural-only until a source-matched native capture exists. Never call HTML a native render.
54
+ - Android, Apple, Windows, and Flutter source translation uses deterministic projection geometry where the shared layout subset is known. Never call HTML a native render or claim runtime/pixel parity without matching native evidence.
51
55
  - Applying a proposal to real source requires a separate explicit `Apply to project` or direct-fix authorization, bounded source targets, incremental sync, and targeted verification. Never repeat the full AI review automatically.
52
56
  - Keep cache and review artifacts outside source control unless the user explicitly requests otherwise.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ui-design-workbench-cli"
7
- version = "0.5.0"
7
+ version = "0.6.6"
8
8
  description = "Repository UI indexing, graph, preview, and deterministic review CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -39,12 +39,14 @@ py-modules = [
39
39
  "android_xml_support",
40
40
  "scan_ui",
41
41
  "ir_contracts",
42
+ "layout_model",
42
43
  "fidelity_core",
43
44
  "fidelity_adapter_api",
44
45
  "fidelity_adapters",
45
46
  "fidelity_platform_adapters",
46
47
  "android_resource_resolver",
47
48
  "apple_resource_resolver",
49
+ "platform_component_catalog",
48
50
  "native_render_contracts",
49
51
  "native_render_android",
50
52
  "native_render_apple",
@@ -57,7 +59,7 @@ py-modules = [
57
59
 
58
60
  [tool.setuptools.data-files]
59
61
  "share/ui-design-workbench" = ["SKILL.md"]
60
- "share/ui-design-workbench/references" = ["references/*.md", "references/platform-profiles.json"]
62
+ "share/ui-design-workbench/references" = ["references/*.md", "references/platform-profiles.json", "references/component-catalog.json", "references/component-inventory.json"]
61
63
  "share/ui-design-workbench/schemas" = ["schemas/*.json"]
62
64
  "share/ui-design-workbench/scripts" = [
63
65
  "scripts/android_resource_resolver.py",
@@ -70,11 +72,13 @@ py-modules = [
70
72
  "scripts/fidelity_platform_adapters.py",
71
73
  "scripts/generate_interaction_matrix.py",
72
74
  "scripts/ir_contracts.py",
75
+ "scripts/layout_model.py",
73
76
  "scripts/merge_review_state.py",
74
77
  "scripts/native_render_android.py",
75
78
  "scripts/native_render_apple.py",
76
79
  "scripts/native_render_contracts.py",
77
80
  "scripts/native_render_registry.py",
81
+ "scripts/platform_component_catalog.py",
78
82
  "scripts/quality_common.py",
79
83
  "scripts/render_preview.py",
80
84
  "scripts/scan_ui.py",
@@ -36,4 +36,4 @@ For ordinary source tasks, `uidw init` can opt a project into lightweight UI gui
36
36
 
37
37
  Codex may opt into `render_preview.py --agent codex`, which enables the official local `codex://new` preparation path. Other agents use copied prompts or the JSON job. Provider-specific adapters are optional presentation conveniences and must not change the IR, cache, review semantics, permissions, or approval boundary.
38
38
 
39
- The optional `uidw-mcp` stdio server is a transport facade over the same deterministic CLI core. It exposes compact project discovery, bounded screen/finding context, job preparation, sparse patch application, preview building, and fidelity explanation. MCP is an optional dependency; installing or running the regular CLI must not require it. Configure an agent to launch `uidw-mcp --repo <absolute-project-path>` as a local stdio command; it opens no port and keeps all project data on the local machine.
39
+ The optional `uidw-mcp` stdio server is a transport facade over the same deterministic CLI core. It exposes compact project discovery, strictly bounded screen/finding context, job preparation, sparse patch application, preview building, and on-demand fidelity explanation. Scoped nodes omit full source expressions by default and expose a stable `scopeHash`; pass it back as `if_none_match` before repeating the same request. MCP is an optional dependency; installing or running the regular CLI must not require it. Configure an agent to launch `uidw-mcp --repo <absolute-project-path>` as a local stdio command; it opens no port and keeps project caches on the local machine. Selected model-facing context is still visible to the host agent and should be treated as derived source data.
@@ -34,6 +34,8 @@ uidw --repo <repo> status --json
34
34
  uidw --repo <repo> sync
35
35
  uidw --repo <repo> context --screen <screen-id> --json
36
36
  uidw --repo <repo> context --screen <screen-id> --budget 4000 --format markdown
37
+ uidw --repo <repo> scope --budget 4000
38
+ uidw --repo <repo> scope --screen <screen-id> --budget 4000
37
39
  uidw --repo <repo> map --output <docs-or-artifact-dir>/ui-graph.json
38
40
  uidw --repo <repo> diff
39
41
  uidw --repo <repo> workbench --output-dir <artifact-dir>
@@ -59,3 +61,5 @@ Interactive `init` asks only for detail level and does not recommend or preselec
59
61
  UI guidance is not asked during setup and remains off unless explicitly enabled. `init --ui-mode` and `init --no-ui-mode` make automation deterministic. Later use `ui-mode --enable`, `ui-mode --disable`, or `config set ui-mode on|off`. Enabling guidance changes agent behavior only for UI-related tasks and does not imply review, redesign, preview generation, or source-edit permission.
60
62
 
61
63
  Mock data follows detail level automatically: `low` uses `minimal`, `medium` uses `representative`, and `high` uses `exhaustive`. This derived change refreshes model context but never causes another repository source scan by itself. Preserve existing `scenarioFixtures` and `screen.scenarios` for unaffected screen IDs during incremental sync; regenerate only fixtures whose source dependencies changed.
64
+
65
+ Use `scope` rather than JSON `context --screen` for agent prompts. It includes only referenced tokens and theme overrides, summarizes property provenance, enforces the requested budget without returning a partial tree, and supports `scopeHash` reuse. The older `context` command remains a human-readable cache summary and compatibility surface.
@@ -0,0 +1,121 @@
1
+ {
2
+ "version": 1,
3
+ "authorityOrder": ["official-platform-documentation", "built-in-renderer-calibration", "project-authored-overrides"],
4
+ "note": "Component identity and semantics follow official platform documentation. HTML geometry is a calibrated fallback only; explicit project values always win.",
5
+ "families": {
6
+ "android": {
7
+ "sources": [
8
+ {"title": "Material 3 components", "url": "https://m3.material.io/components", "authority": "official"},
9
+ {"title": "Compose accessibility defaults", "url": "https://developer.android.com/develop/ui/compose/accessibility/api-defaults", "authority": "official"}
10
+ ],
11
+ "components": {
12
+ "button": {"aliases": ["Button", "MaterialButton", "FilledButton", "FilledTonalButton"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 24}, "style": {"backgroundColor": "#6750a4", "color": "#ffffff", "radius": 20, "fontFamily": "Roboto, Arial, sans-serif", "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
13
+ "outlined-button": {"aliases": ["OutlinedButton"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 24}, "style": {"backgroundColor": "transparent", "color": "#6750a4", "borderColor": "#79747e", "borderWidth": 1, "borderStyle": "solid", "radius": 20, "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
14
+ "text-button": {"aliases": ["TextButton"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 12}, "style": {"backgroundColor": "transparent", "color": "#6750a4", "radius": 20, "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
15
+ "icon-button": {"aliases": ["IconButton", "ImageButton", "FloatingActionButton", "ExtendedFloatingActionButton"], "rendererKind": "icon-button", "layout": {"width": 48, "height": 48}, "style": {"backgroundColor": "transparent", "color": "#49454f", "radius": 24}, "semantics": {"role": "button"}},
16
+ "text-field": {"aliases": ["TextField", "OutlinedTextField", "EditText", "TextInputEditText"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 56, "paddingHorizontal": 16}, "style": {"backgroundColor": "#f7f2fa", "color": "#1d1b20", "borderColor": "#79747e", "borderWidth": 1, "borderStyle": "solid", "radius": 4, "fontFamily": "Roboto, Arial, sans-serif", "fontSize": 16}, "semantics": {"role": "textbox"}},
17
+ "card": {"aliases": ["Card", "Surface", "MaterialCardView", "CardView", "ElevatedCard", "OutlinedCard"], "types": ["card"], "rendererKind": "surface", "layout": {"padding": 16}, "style": {"backgroundColor": "#f7f2fa", "color": "#1d1b20", "radius": 12}},
18
+ "text": {"aliases": ["Text", "TextView", "MaterialTextView"], "types": ["text"], "rendererKind": "text", "style": {"color": "#1d1b20", "fontFamily": "Roboto, Arial, sans-serif", "fontSize": 16, "lineHeight": 24}},
19
+ "switch": {"aliases": ["Switch", "SwitchMaterial"], "rendererKind": "switch", "layout": {"width": 52, "height": 32}, "style": {"backgroundColor": "#79747e", "color": "#ffffff", "radius": 16}, "semantics": {"role": "switch"}},
20
+ "checkbox": {"aliases": ["Checkbox", "CheckBox", "RadioButton"], "rendererKind": "checkbox", "layout": {"width": 48, "height": 48}, "style": {"color": "#6750a4"}, "semantics": {"role": "checkbox"}},
21
+ "navigation": {"aliases": ["NavigationBar", "NavigationRail", "TopAppBar", "CenterAlignedTopAppBar", "Toolbar"], "rendererKind": "navigation", "layout": {"minHeight": 64, "paddingHorizontal": 16}, "style": {"backgroundColor": "#fffbfe", "color": "#1d1b20"}, "semantics": {"role": "navigation"}},
22
+ "list-item": {"aliases": ["ListItem"], "rendererKind": "surface", "layout": {"minHeight": 56, "paddingHorizontal": 16, "paddingVertical": 8}, "style": {"backgroundColor": "transparent", "color": "#1d1b20"}},
23
+ "neutral": {"aliases": [], "rendererKind": "surface"},
24
+ "progress": {"aliases": ["LinearProgressIndicator", "CircularProgressIndicator", "ProgressBar"], "rendererKind": "progress", "layout": {"height": 4}, "style": {"backgroundColor": "#e7e0ec", "color": "#6750a4", "radius": 2}, "semantics": {"role": "progressbar"}}
25
+ }
26
+ },
27
+ "ios": {
28
+ "sources": [
29
+ {"title": "Apple Human Interface Guidelines — Components", "url": "https://developer.apple.com/design/human-interface-guidelines/components", "authority": "official"},
30
+ {"title": "Apple Human Interface Guidelines — Designing for iOS", "url": "https://developer.apple.com/design/human-interface-guidelines/designing-for-ios", "authority": "official"}
31
+ ],
32
+ "components": {
33
+ "button": {"aliases": ["Button", "button", "CupertinoButton"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 44, "paddingHorizontal": 16}, "style": {"backgroundColor": "#007aff", "color": "#ffffff", "radius": 10, "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontSize": 17, "fontWeight": 600, "textAlign": "center"}, "semantics": {"role": "button"}},
34
+ "icon-button": {"aliases": ["IconButton"], "rendererKind": "icon-button", "layout": {"width": 44, "height": 44}, "style": {"backgroundColor": "transparent", "color": "#007aff", "radius": 22}, "semantics": {"role": "button"}},
35
+ "text-field": {"aliases": ["TextField", "SecureField", "textField", "textView", "CupertinoTextField"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 44, "paddingHorizontal": 12}, "style": {"backgroundColor": "#e9e9eb", "color": "#000000", "radius": 10, "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontSize": 17}, "semantics": {"role": "textbox"}},
36
+ "card": {"aliases": ["GroupBox", "Section"], "types": ["card"], "rendererKind": "surface", "layout": {"padding": 16}, "style": {"backgroundColor": "#ffffff", "color": "#000000", "radius": 12, "boxShadow": "0 1px 3px rgba(0,0,0,.12)"}},
37
+ "text": {"aliases": ["Text", "Label", "label"], "types": ["text"], "rendererKind": "text", "style": {"color": "#000000", "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontSize": 17, "lineHeight": 22}},
38
+ "switch": {"aliases": ["Toggle", "switch"], "rendererKind": "switch", "layout": {"width": 51, "height": 31}, "style": {"backgroundColor": "#8e8e93", "color": "#ffffff", "radius": 16}, "semantics": {"role": "switch"}},
39
+ "checkbox": {"aliases": ["Checkbox"], "rendererKind": "checkbox", "layout": {"width": 44, "height": 44}, "style": {"color": "#007aff"}, "semantics": {"role": "checkbox"}},
40
+ "navigation": {"aliases": ["NavigationStack", "NavigationView", "navigationBar", "toolbar"], "rendererKind": "navigation", "layout": {"minHeight": 44, "paddingHorizontal": 16}, "style": {"backgroundColor": "rgba(249,249,249,.94)", "color": "#000000"}, "semantics": {"role": "navigation"}},
41
+ "list": {"aliases": ["List", "Form", "tableView", "collectionView"], "types": ["list"], "rendererKind": "list", "style": {"backgroundColor": "#f2f2f7", "color": "#000000"}},
42
+ "neutral": {"aliases": [], "rendererKind": "surface"},
43
+ "progress": {"aliases": ["ProgressView", "progressView"], "rendererKind": "progress", "layout": {"height": 4}, "style": {"backgroundColor": "#d1d1d6", "color": "#007aff", "radius": 2}, "semantics": {"role": "progressbar"}}
44
+ }
45
+ },
46
+ "macos": {
47
+ "sources": [
48
+ {"title": "Apple Human Interface Guidelines — Components", "url": "https://developer.apple.com/design/human-interface-guidelines/components", "authority": "official"},
49
+ {"title": "Apple Human Interface Guidelines — Designing for macOS", "url": "https://developer.apple.com/design/human-interface-guidelines/designing-for-macos", "authority": "official"}
50
+ ],
51
+ "components": {
52
+ "button": {"aliases": ["Button", "button"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 28, "paddingHorizontal": 12}, "style": {"backgroundColor": "#0a84ff", "color": "#ffffff", "radius": 6, "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontSize": 13, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
53
+ "text-field": {"aliases": ["TextField", "SecureField", "textField", "textView"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 22, "paddingHorizontal": 7}, "style": {"backgroundColor": "#ffffff", "color": "#1e1e1e", "borderColor": "#8e8e93", "borderWidth": 1, "borderStyle": "solid", "radius": 5, "fontSize": 13}, "semantics": {"role": "textbox"}},
54
+ "card": {"aliases": ["GroupBox", "Section"], "types": ["card"], "rendererKind": "surface", "layout": {"padding": 12}, "style": {"backgroundColor": "#f5f5f5", "color": "#1e1e1e", "radius": 8, "borderColor": "#d1d1d1", "borderWidth": 1, "borderStyle": "solid"}},
55
+ "text": {"aliases": ["Text", "Label", "label"], "types": ["text"], "rendererKind": "text", "style": {"color": "#1e1e1e", "fontFamily": "-apple-system, BlinkMacSystemFont, sans-serif", "fontSize": 13, "lineHeight": 17}},
56
+ "switch": {"aliases": ["Toggle", "switch"], "rendererKind": "switch", "layout": {"width": 38, "height": 22}, "style": {"backgroundColor": "#8e8e93", "color": "#ffffff", "radius": 11}, "semantics": {"role": "switch"}},
57
+ "navigation": {"aliases": ["NavigationSplitView", "toolbar", "NSToolbar", "NSSplitView"], "rendererKind": "navigation", "layout": {"minHeight": 38, "paddingHorizontal": 10}, "style": {"backgroundColor": "rgba(246,246,246,.94)", "color": "#1e1e1e", "borderColor": "#c8c8c8", "borderBottomWidth": 1, "borderStyle": "solid"}, "semantics": {"role": "navigation"}},
58
+ "list": {"aliases": ["List", "Table", "tableView", "collectionView"], "types": ["list"], "rendererKind": "list", "style": {"backgroundColor": "#ffffff", "color": "#1e1e1e"}},
59
+ "checkbox": {"aliases": ["CheckBox", "RadioButton", "checkBox", "radioButton", "segmentedControl"], "rendererKind": "checkbox", "layout": {"width": 28, "height": 22}, "style": {"color": "#0a84ff"}, "semantics": {"role": "checkbox"}},
60
+ "neutral": {"aliases": [], "rendererKind": "surface"},
61
+ "progress": {"aliases": ["ProgressView", "progressIndicator", "levelIndicator"], "rendererKind": "progress", "layout": {"height": 4}, "style": {"backgroundColor": "#d1d1d6", "color": "#0a84ff", "radius": 2}, "semantics": {"role": "progressbar"}}
62
+ }
63
+ },
64
+ "windows": {
65
+ "sources": [
66
+ {"title": "Windows app controls", "url": "https://learn.microsoft.com/en-us/windows/apps/design/controls/", "authority": "official"}
67
+ ],
68
+ "components": {
69
+ "button": {"aliases": ["Button", "HyperlinkButton"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 32, "paddingHorizontal": 12}, "style": {"backgroundColor": "#005fb8", "color": "#ffffff", "radius": 4, "fontFamily": "Segoe UI, sans-serif", "fontSize": 14, "fontWeight": 600, "textAlign": "center"}, "semantics": {"role": "button"}},
70
+ "icon-button": {"aliases": ["AppBarButton"], "rendererKind": "icon-button", "layout": {"width": 40, "height": 40}, "style": {"backgroundColor": "transparent", "color": "#1a1a1a", "radius": 4}, "semantics": {"role": "button"}},
71
+ "text-field": {"aliases": ["TextBox", "PasswordBox", "AutoSuggestBox", "NumberBox"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 32, "paddingHorizontal": 10}, "style": {"backgroundColor": "#ffffff", "color": "#1a1a1a", "borderColor": "#8a8886", "borderWidth": 1, "borderStyle": "solid", "radius": 4, "fontFamily": "Segoe UI, sans-serif", "fontSize": 14}, "semantics": {"role": "textbox"}},
72
+ "card": {"aliases": ["Border", "Expander"], "types": ["card"], "rendererKind": "surface", "layout": {"padding": 12}, "style": {"backgroundColor": "#ffffff", "color": "#1a1a1a", "radius": 8, "borderColor": "#e5e5e5", "borderWidth": 1, "borderStyle": "solid"}},
73
+ "text": {"aliases": ["TextBlock", "Label"], "types": ["text"], "rendererKind": "text", "style": {"color": "#1a1a1a", "fontFamily": "Segoe UI, sans-serif", "fontSize": 14, "lineHeight": 20}},
74
+ "switch": {"aliases": ["ToggleSwitch", "ToggleButton"], "rendererKind": "switch", "layout": {"width": 40, "height": 20}, "style": {"backgroundColor": "#8a8886", "color": "#ffffff", "radius": 10}, "semantics": {"role": "switch"}},
75
+ "checkbox": {"aliases": ["CheckBox", "RadioButton"], "rendererKind": "checkbox", "layout": {"width": 32, "height": 32}, "style": {"color": "#005fb8"}, "semantics": {"role": "checkbox"}},
76
+ "navigation": {"aliases": ["NavigationView", "CommandBar", "MenuBar", "ToolBar"], "rendererKind": "navigation", "layout": {"minHeight": 48, "paddingHorizontal": 12}, "style": {"backgroundColor": "#f3f3f3", "color": "#1a1a1a", "borderColor": "#e5e5e5", "borderBottomWidth": 1, "borderStyle": "solid"}, "semantics": {"role": "navigation"}},
77
+ "list": {"aliases": ["ListView", "GridView", "ItemsControl", "TreeView"], "types": ["list"], "rendererKind": "list", "style": {"backgroundColor": "#ffffff", "color": "#1a1a1a"}},
78
+ "neutral": {"aliases": [], "rendererKind": "surface"},
79
+ "progress": {"aliases": ["ProgressBar", "ProgressRing"], "rendererKind": "progress", "layout": {"height": 4}, "style": {"backgroundColor": "#d1d1d1", "color": "#005fb8", "radius": 2}, "semantics": {"role": "progressbar"}}
80
+ }
81
+ },
82
+ "flutter": {
83
+ "sources": [
84
+ {"title": "Flutter widget catalog", "url": "https://docs.flutter.dev/ui/widgets", "authority": "official"},
85
+ {"title": "Flutter Material component widgets", "url": "https://docs.flutter.dev/ui/widgets/material", "authority": "official"},
86
+ {"title": "Flutter Cupertino widgets", "url": "https://docs.flutter.dev/ui/widgets/cupertino", "authority": "official"}
87
+ ],
88
+ "components": {
89
+ "button": {"aliases": ["ElevatedButton", "FilledButton", "CupertinoButton"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 24}, "style": {"backgroundColor": "#6750a4", "color": "#ffffff", "radius": 20, "fontFamily": "Roboto, Arial, sans-serif", "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
90
+ "outlined-button": {"aliases": ["OutlinedButton"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 24}, "style": {"backgroundColor": "transparent", "color": "#6750a4", "borderColor": "#79747e", "borderWidth": 1, "borderStyle": "solid", "radius": 20, "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
91
+ "text-button": {"aliases": ["TextButton"], "rendererKind": "button", "layout": {"minHeight": 48, "paddingHorizontal": 12}, "style": {"backgroundColor": "transparent", "color": "#6750a4", "radius": 20, "fontSize": 14, "fontWeight": 500, "textAlign": "center"}, "semantics": {"role": "button"}},
92
+ "icon-button": {"aliases": ["IconButton", "FloatingActionButton"], "rendererKind": "icon-button", "layout": {"width": 48, "height": 48}, "style": {"backgroundColor": "transparent", "color": "#49454f", "radius": 24}, "semantics": {"role": "button"}},
93
+ "text-field": {"aliases": ["TextField", "TextFormField", "CupertinoTextField"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 56, "paddingHorizontal": 16}, "style": {"backgroundColor": "#f7f2fa", "color": "#1d1b20", "borderColor": "#79747e", "borderWidth": 1, "borderStyle": "solid", "radius": 4, "fontSize": 16}, "semantics": {"role": "textbox"}},
94
+ "card": {"aliases": ["Card"], "types": ["card"], "rendererKind": "surface", "layout": {"padding": 16}, "style": {"backgroundColor": "#f7f2fa", "color": "#1d1b20", "radius": 12, "boxShadow": "0 1px 3px rgba(0,0,0,.16)"}},
95
+ "text": {"aliases": ["Text"], "types": ["text"], "rendererKind": "text", "style": {"color": "#1d1b20", "fontFamily": "Roboto, Arial, sans-serif", "fontSize": 14, "lineHeight": 20}},
96
+ "switch": {"aliases": ["Switch", "CupertinoSwitch"], "rendererKind": "switch", "layout": {"width": 52, "height": 32}, "style": {"backgroundColor": "#79747e", "color": "#ffffff", "radius": 16}, "semantics": {"role": "switch"}},
97
+ "checkbox": {"aliases": ["Checkbox", "Radio"], "rendererKind": "checkbox", "layout": {"width": 48, "height": 48}, "style": {"color": "#6750a4"}, "semantics": {"role": "checkbox"}},
98
+ "navigation": {"aliases": ["AppBar", "NavigationBar", "BottomNavigationBar"], "rendererKind": "navigation", "layout": {"minHeight": 64, "paddingHorizontal": 16}, "style": {"backgroundColor": "#fffbfe", "color": "#1d1b20"}, "semantics": {"role": "navigation"}},
99
+ "list-item": {"aliases": ["ListTile"], "rendererKind": "surface", "layout": {"minHeight": 56, "paddingHorizontal": 16, "paddingVertical": 8}, "style": {"backgroundColor": "transparent", "color": "#1d1b20"}},
100
+ "neutral": {"aliases": [], "rendererKind": "surface"},
101
+ "progress": {"aliases": ["LinearProgressIndicator", "CircularProgressIndicator"], "rendererKind": "progress", "layout": {"height": 4}, "style": {"backgroundColor": "#e7e0ec", "color": "#6750a4", "radius": 2}, "semantics": {"role": "progressbar"}}
102
+ }
103
+ },
104
+ "web": {
105
+ "sources": [
106
+ {"title": "HTML Living Standard", "url": "https://html.spec.whatwg.org/multipage/", "authority": "official-standard"},
107
+ {"title": "WAI-ARIA Authoring Practices", "url": "https://www.w3.org/WAI/ARIA/apg/", "authority": "official-standard"}
108
+ ],
109
+ "components": {
110
+ "button": {"aliases": ["button"], "types": ["button"], "rendererKind": "button", "layout": {"minHeight": 30, "paddingHorizontal": 8}, "style": {"backgroundColor": "#efefef", "color": "#111111", "borderColor": "#767676", "borderWidth": 1, "borderStyle": "solid", "radius": 2, "fontFamily": "Arial, sans-serif", "fontSize": 13, "textAlign": "center"}, "semantics": {"role": "button"}},
111
+ "input": {"aliases": ["input", "textarea", "select"], "types": ["input"], "rendererKind": "input", "layout": {"minHeight": 30, "paddingHorizontal": 6}, "style": {"backgroundColor": "#ffffff", "color": "#111111", "borderColor": "#767676", "borderWidth": 1, "borderStyle": "solid", "radius": 2, "fontFamily": "Arial, sans-serif", "fontSize": 13}, "semantics": {"role": "textbox"}},
112
+ "text": {"aliases": ["p", "span", "label", "h1", "h2", "h3", "h4", "h5", "h6"], "types": ["text"], "rendererKind": "text", "style": {"color": "#111111", "fontFamily": "Arial, sans-serif", "fontSize": 16, "lineHeight": 20}},
113
+ "navigation": {"aliases": ["nav"], "rendererKind": "navigation", "semantics": {"role": "navigation"}},
114
+ "list": {"aliases": ["ul", "ol", "table"], "types": ["list"], "rendererKind": "list"},
115
+ "neutral": {"aliases": [], "rendererKind": "surface"},
116
+ "link": {"aliases": ["a"], "rendererKind": "text", "style": {"color": "#0000ee", "textDecoration": "underline"}, "semantics": {"role": "link"}},
117
+ "progress": {"aliases": ["progress"], "rendererKind": "progress", "layout": {"height": 8}, "style": {"backgroundColor": "#d1d5db", "color": "#2563eb", "radius": 4}, "semantics": {"role": "progressbar"}}
118
+ }
119
+ }
120
+ }
121
+ }
@@ -0,0 +1,22 @@
1
+ # Platform component inventory and renderer catalog
2
+
3
+ The component model has two deliberately separate layers:
4
+
5
+ - `component-inventory.json` is the complete public visual-component inventory recognized by the source adapters. It groups framework/API names into official concepts for Android, iOS, macOS, Windows, Flutter, and Web.
6
+ - `component-catalog.json` contains calibrated HTML renderer recipes. Several official components can share one recipe without being treated as the same source component.
7
+
8
+ The current inventory contains 178 official concept groups and 593 concrete framework bindings. The renderer has 66 conservative recipes. These counts are different on purpose: copying hundreds of near-identical CSS recipes would make calibration inconsistent and would not improve fidelity.
9
+
10
+ The authority order is deliberate:
11
+
12
+ 1. official platform documentation defines component identity, semantics, and expected behavior;
13
+ 2. built-in renderer calibration supplies conservative HTML geometry when source code has no explicit value;
14
+ 3. project-authored layout, theme, token, style, and accessibility values always override the fallback.
15
+
16
+ Every family links to its official documentation in JSON. `uidw fidelity capabilities` reports recipe, concept, and binding coverage separately and fails when bindings conflict, an inventory concept references a missing recipe, a family has no source, or a renderer kind is invalid.
17
+
18
+ “Complete” means the public visual primitives and controls in the linked official component/widget/control catalogs. It intentionally excludes nonvisual controllers, delegates, routes, painters, internal implementation classes, deprecated platform-specific products, and runtime-generated project components. Project wrappers are discovered separately and mapped back to this inventory with source provenance.
19
+
20
+ The fallback is not a native screenshot and must not be described as pixel-perfect. Official documentation does not encode every runtime measurement, font rasterization detail, OS-version variation, or project theme override. Native captures remain the visual authority where exact evidence is required.
21
+
22
+ Large-project analysis is secondary. It may discover project wrappers such as `PrimaryButton`, theme indirection, and frequently combined primitives, but it must not redefine official controls or copy proprietary UI code into the global catalog. Project-specific mappings belong to the project cache and must retain source provenance.