jekyll-theme-zer0 1.28.0 → 1.30.0

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1143 -13
  3. data/_data/README.md +2 -0
  4. data/_data/ai.yml +5 -3
  5. data/_data/ai_pricing.yml +36 -0
  6. data/_data/backlog.yml +507 -2
  7. data/_data/consumers.yml +157 -9
  8. data/_data/features.yml +303 -20
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/i18n/fr.yml +12 -7
  11. data/_data/i18n/manifest.yml +39 -12
  12. data/_data/ingredient_densities.yml +122 -0
  13. data/_data/landing.yml +5 -2
  14. data/_data/navigation/main.yml +16 -0
  15. data/_data/navigation/quickstart.yml +4 -0
  16. data/_data/recipe_courses.yml +64 -0
  17. data/_data/site_builder.yml +874 -0
  18. data/_data/theme-manifest.yml +160 -124
  19. data/_data/ui-text.yml +26 -0
  20. data/_includes/README.md +26 -2
  21. data/_includes/analytics/posthog.html +2 -2
  22. data/_includes/components/admin-links.html +2 -2
  23. data/_includes/components/admin-tabs.html +2 -2
  24. data/_includes/components/ai-chat.html +14 -11
  25. data/_includes/components/analytics-dashboard.html +8 -8
  26. data/_includes/components/author-bio.html +1 -1
  27. data/_includes/components/author-card.html +10 -2
  28. data/_includes/components/author-eeat.html +4 -4
  29. data/_includes/components/background-customizer.html +10 -10
  30. data/_includes/components/background-image.html +114 -0
  31. data/_includes/components/background-settings.html +28 -15
  32. data/_includes/components/collection-manager.html +5 -5
  33. data/_includes/components/component-showcase.html +13 -13
  34. data/_includes/components/config-editor.html +12 -12
  35. data/_includes/components/config-viewer.html +8 -8
  36. data/_includes/components/cookie-consent.html +15 -15
  37. data/_includes/components/cta-button.html +7 -2
  38. data/_includes/components/dev-shortcuts.html +7 -7
  39. data/_includes/components/env-dashboard.html +8 -8
  40. data/_includes/components/env-switcher.html +9 -9
  41. data/_includes/components/feature-card.html +2 -2
  42. data/_includes/components/halfmoon.html +2 -2
  43. data/_includes/components/info-section.html +42 -37
  44. data/_includes/components/js-cdn.html +15 -15
  45. data/_includes/components/language-toggle.html +168 -21
  46. data/_includes/components/mermaid.html +72 -435
  47. data/_includes/components/nanobar.html +5 -5
  48. data/_includes/components/nav-editor.html +2 -2
  49. data/_includes/components/nav-export.html +2 -2
  50. data/_includes/components/nav-overview.html +2 -2
  51. data/_includes/components/page-feedback.html +45 -30
  52. data/_includes/components/page-views-init.html +55 -0
  53. data/_includes/components/page-views.html +33 -0
  54. data/_includes/components/post-card.html +22 -22
  55. data/_includes/components/post-type-badge.html +2 -2
  56. data/_includes/components/powered-by.html +2 -2
  57. data/_includes/components/preview-image.html +6 -0
  58. data/_includes/components/quick-index.html +2 -2
  59. data/_includes/components/recipe-card.html +67 -0
  60. data/_includes/components/recipe-duration.html +50 -0
  61. data/_includes/components/recipe-grams.html +58 -0
  62. data/_includes/components/recipe-index.html +96 -0
  63. data/_includes/components/recipe-ingredients.html +90 -0
  64. data/_includes/components/recipe-meta.html +96 -0
  65. data/_includes/components/recipe-nutrition.html +57 -0
  66. data/_includes/components/recipe-qty.html +73 -0
  67. data/_includes/components/recipe-ratio.html +151 -0
  68. data/_includes/components/recipe-scaler.html +73 -0
  69. data/_includes/components/recipe-steps.html +86 -0
  70. data/_includes/components/recipe-temp.html +45 -0
  71. data/_includes/components/search-modal.html +29 -4
  72. data/_includes/components/searchbar.html +2 -2
  73. data/_includes/components/shortcuts-modal.html +3 -0
  74. data/_includes/components/svg-background.html +2 -2
  75. data/_includes/components/theme-customizer.html +2 -2
  76. data/_includes/components/theme-info.html +14 -7
  77. data/_includes/components/theme-preview-gallery.html +22 -22
  78. data/_includes/content/giscus.html +2 -2
  79. data/_includes/content/intro.html +8 -8
  80. data/_includes/content/jsonld-faq.html +2 -2
  81. data/_includes/content/jsonld-software.html +24 -5
  82. data/_includes/content/seo.html +4 -4
  83. data/_includes/content/sitemap.html +27 -27
  84. data/_includes/content/toc.html +183 -183
  85. data/_includes/core/branding.html +6 -6
  86. data/_includes/core/console-capture.html +32 -74
  87. data/_includes/core/favicon.html +49 -7
  88. data/_includes/core/footer-fabs.html +17 -3
  89. data/_includes/core/footer.html +49 -34
  90. data/_includes/core/head.html +110 -86
  91. data/_includes/core/header.html +76 -54
  92. data/_includes/docs/bootstrap-docs.html +8 -8
  93. data/_includes/landing/landing-install-cards.html +2 -2
  94. data/_includes/landing/landing-quick-links.html +1 -1
  95. data/_includes/navigation/admin-nav.html +2 -2
  96. data/_includes/navigation/nav-tree.html +8 -8
  97. data/_includes/navigation/navbar.html +12 -12
  98. data/_includes/navigation/section-sidebar.html +109 -27
  99. data/_includes/navigation/sidebar-config.html +36 -2
  100. data/_includes/navigation/sidebar-left.html +17 -16
  101. data/_includes/navigation/sidebar-right.html +8 -7
  102. data/_includes/obsidian/full-graph.html +2 -2
  103. data/_includes/setup/claude-session.html +72 -0
  104. data/_includes/setup/prereq-checklist.html +90 -0
  105. data/_includes/setup/wizard.html +924 -222
  106. data/_includes/stats/stats-categories.html +8 -8
  107. data/_includes/stats/stats-header.html +14 -14
  108. data/_includes/stats/stats-metrics.html +14 -14
  109. data/_includes/stats/stats-no-data.html +12 -12
  110. data/_includes/stats/stats-overview.html +6 -6
  111. data/_includes/stats/stats-tags.html +8 -8
  112. data/_layouts/404.html +38 -24
  113. data/_layouts/README.md +2 -0
  114. data/_layouts/admin.html +24 -24
  115. data/_layouts/article.html +43 -33
  116. data/_layouts/author.html +20 -20
  117. data/_layouts/authors.html +2 -2
  118. data/_layouts/book-abc.html +12 -12
  119. data/_layouts/book-story.html +15 -15
  120. data/_layouts/book.html +12 -12
  121. data/_layouts/collection.html +33 -33
  122. data/_layouts/cookbook.html +88 -0
  123. data/_layouts/default.html +31 -28
  124. data/_layouts/home.html +23 -23
  125. data/_layouts/index.html +10 -10
  126. data/_layouts/landing.html +17 -17
  127. data/_layouts/news.html +44 -44
  128. data/_layouts/note.html +38 -38
  129. data/_layouts/notebook.html +34 -34
  130. data/_layouts/recipe.html +274 -0
  131. data/_layouts/root.html +92 -55
  132. data/_layouts/section.html +62 -33
  133. data/_layouts/setup.html +3 -3
  134. data/_layouts/sitemap-collection.html +49 -49
  135. data/_layouts/stats.html +40 -40
  136. data/_layouts/tag.html +12 -12
  137. data/_layouts/welcome.html +21 -21
  138. data/_sass/components/_callout.scss +1 -1
  139. data/_sass/components/_footer.scss +37 -1
  140. data/_sass/components/_mermaid.scss +375 -0
  141. data/_sass/components/_page-views.scss +36 -0
  142. data/_sass/components/_recipe.scss +506 -0
  143. data/_sass/components/_setup-wizard.scss +764 -0
  144. data/_sass/components/_ui-enhancements.scss +6 -6
  145. data/_sass/core/_navbar.scss +261 -46
  146. data/_sass/layouts/_landing.scss +2 -2
  147. data/_sass/layouts/_navbar-extras.scss +14 -4
  148. data/_sass/tokens/_color.scss +6 -0
  149. data/_sass/tokens/_index.scss +2 -0
  150. data/_sass/tokens/_radius.scss +21 -0
  151. data/_sass/tokens/_typography.scss +4 -0
  152. data/_sass/utilities/_focus.scss +14 -0
  153. data/assets/css/main.scss +4 -0
  154. data/assets/js/ai-chat.js +47 -5
  155. data/assets/js/fleet-feedback-capture.js +124 -0
  156. data/assets/js/fleet-feedback.js +853 -0
  157. data/assets/js/mermaid-diagrams.js +1267 -0
  158. data/assets/js/modules/navigation/config.js +9 -6
  159. data/assets/js/modules/navigation/navbar.js +55 -0
  160. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  161. data/assets/js/modules/theme/appearance.js +8 -2
  162. data/assets/js/obsidian-wiki-links.js +8 -3
  163. data/assets/js/page-feedback.js +125 -192
  164. data/assets/js/page-views.js +372 -0
  165. data/assets/js/recipe-scaler.js +501 -0
  166. data/assets/js/search-modal.js +36 -0
  167. data/assets/js/setup-wizard.js +2279 -226
  168. data/assets/js/site-builder.js +1834 -0
  169. data/assets/js/ui-enhancements.js +11 -3
  170. data/scripts/README.md +44 -0
  171. data/scripts/ai/README.md +38 -0
  172. data/scripts/ai/api_call.rb +124 -0
  173. data/scripts/ai/usage.rb +314 -0
  174. data/scripts/ai/usage_report.rb +225 -0
  175. data/scripts/bin/audit-consumer +39 -7
  176. data/scripts/bin/giscus-discussions +213 -14
  177. data/scripts/bin/manifest +35 -12
  178. data/scripts/ci/agent_review_result.py +164 -0
  179. data/scripts/ci/test_agent_review_result.py +172 -0
  180. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  181. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  182. data/scripts/content-review.rb +20 -1
  183. data/scripts/design-system-check.rb +170 -0
  184. data/scripts/lib/audit.sh +42 -2
  185. data/scripts/lint-liquid-raw.rb +137 -0
  186. data/scripts/test/integration/mermaid +22 -8
  187. data/scripts/test/lib/run_tests.sh +3 -1
  188. data/scripts/test/lib/test_agent_review_result.sh +27 -0
  189. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  190. data/scripts/translate.rb +94 -16
  191. metadata +48 -2
data/_data/consumers.yml CHANGED
@@ -44,6 +44,9 @@
44
44
  # version; tracked so a bump doesn't miss the config that
45
45
  # activates it
46
46
  # path_gem local path gem, unversioned (development only)
47
+ # gem_unconstrained `gem 'jekyll-theme-zer0'` with no version — resolves
48
+ # whatever RubyGems has at `bundle update` time; tracked
49
+ # only (like resolved_lockfile), never reports drift
47
50
  # ==============================================================================
48
51
 
49
52
  version: 1
@@ -62,10 +65,18 @@ consumers:
62
65
  dispatch: false
63
66
  risk: >-
64
67
  Unpinned. Every push to this theme's main reaches production with no gate
65
- and no rollback. Shadows ~55 theme files (5 layouts, 34 includes, 8 JS, 6
66
- CSS, 2 plugins) the largest override surface in the fleet, including
67
- ~75 lines of !important CSS working around the stacking bug fixed in #338.
68
- Recommend pinning and joining the fan-out.
68
+ and no rollback that part is the real exposure. Recommend pinning and
69
+ joining the fan-out. NOTE: this entry previously claimed it "shadows ~55
70
+ theme files … ~75 lines of !important CSS working around #338", which
71
+ audit-consumer does not support. Only 2 files actually shadow a theme
72
+ file (_includes/content/giscus.html, assets/js/particles-source.js); the
73
+ other ~52 are it-journey's own quest-system layouts and includes that
74
+ share no filename with anything in this theme, so they carry no drift
75
+ risk at all. The !important CSS is real but is 31 lines in
76
+ assets/css/user-overrides.css — this theme's own documented extension
77
+ hook, enabled by `user_overrides: true`, not a shadow — and no fix
78
+ numbered #338 could be substantiated in that repo. Keep this field
79
+ derived from audit-consumer output, not hand-maintained estimates.
69
80
  pins:
70
81
  - file: _config.yml
71
82
  kind: remote_theme
@@ -109,6 +120,39 @@ consumers:
109
120
  kind: path_gem
110
121
  note: line 40 — dev checkout via ZER0_MISTAKES_PATH; never bumped
111
122
 
123
+ # ---------------------------------------------------------------------------
124
+ - repo: amr-bash/bash-365.com
125
+ mode: remote_theme_floating
126
+ site: https://bash-365.com
127
+ dispatch: false
128
+ note: >-
129
+ BASH Consulting's site, forked from bamr87/bashconsultants (which stays
130
+ registered above) and carrying the same three-stack shape: GitHub Pages
131
+ via remote_theme, Azure Static Web Apps via Gemfile.azure +
132
+ _config.azure.yml, local dev via a path gem. Unlike its parent, nothing
133
+ here carries a version any more — remote_theme is untagged and
134
+ Gemfile.azure names the gem with no constraint — so there is no pin for a
135
+ bump PR to rewrite. Declares its intentional forks in .theme-overrides.yml.
136
+ risk: >-
137
+ Unpinned on Pages; the Azure stack advances only when someone runs
138
+ `bundle update jekyll-theme-zer0`, so the two production stacks can
139
+ render different theme versions with nothing here to notice. Recommend
140
+ pinning remote_theme and constraining Gemfile.azure together and joining
141
+ the fan-out.
142
+ pins:
143
+ - file: _config.yml
144
+ kind: remote_theme
145
+ note: line 33, no tag — floats main
146
+ - file: Gemfile.azure
147
+ kind: gem_unconstrained
148
+ note: line 10 — no version; `bundle update jekyll-theme-zer0` advances it
149
+ - file: _config.azure.yml
150
+ kind: theme_name
151
+ note: line 3 — activates the gem; no version of its own
152
+ - file: Gemfile
153
+ kind: path_gem
154
+ note: line 59 — dev checkout via ZER0_MISTAKES_PATH; never bumped
155
+
112
156
  # ---------------------------------------------------------------------------
113
157
  - repo: year-of-ai/year-of-ai.github.io
114
158
  mode: remote_theme_pinned
@@ -131,17 +175,121 @@ consumers:
131
175
 
132
176
  # ---------------------------------------------------------------------------
133
177
  - repo: ai-world-view/ai-world-view.github.io
134
- mode: remote_theme_pinned
178
+ mode: remote_theme_floating
135
179
  site: https://ai-world-view.github.io
136
- dispatch: true
180
+ dispatch: false
137
181
  fans_out_to_members: true
138
182
  note: >-
139
183
  Same two-file hub shape as year-of-ai; members join by auto_discover, so
140
- the member count grows without this file changing.
184
+ the member count grows without this file changing. Was registered as
185
+ remote_theme_pinned until the 2026-09 fleet harmonization, but both its
186
+ _config.yml remote_theme and its hub.yml theme_repo carry NO tag — the
187
+ hub and every member it stamps float on this theme's main.
188
+ risk: >-
189
+ Unpinned, and an org hub: a theme break here reaches every auto-discovered
190
+ member site at once. Recommend pinning both files together and joining
191
+ the fan-out (dispatch: true) like year-of-ai.
141
192
  pins:
142
193
  - file: _config.yml
143
194
  kind: remote_theme
144
- note: line 35
195
+ note: line 36, no tag — floats main
145
196
  - file: _data/hub.yml
146
197
  kind: hub_registry
147
- note: "line 39 (pages.theme_repo) — re-roll members after bumping"
198
+ note: "line 39 (pages.theme_repo), no tag — members float too"
199
+
200
+ # ---------------------------------------------------------------------------
201
+ # The four entries below were missing entirely until the 2026-08 fleet audit.
202
+ # Unregistered consumers are invisible to propagate.rb in BOTH directions: no
203
+ # release dispatch reaches them, and they never appear in the weekly drift
204
+ # report — so their pins can rot indefinitely with nothing to notice. That is
205
+ # exactly what happened to zer0-pages, which sat three minors behind on a gem
206
+ # constraint that already permitted the current release.
207
+ # ---------------------------------------------------------------------------
208
+ - repo: bamr87/zer0-pages
209
+ mode: gem
210
+ site: https://bamr87.github.io/zer0-pages/
211
+ dispatch: true
212
+ note: >-
213
+ Dual Obsidian-vault / Jekyll repo. Two things make it unlike every other
214
+ consumer. (1) It sets `source: pages`, so the whole themable tree lives
215
+ under pages/ — audit-consumer follows `source:` for this reason; auditing
216
+ the repo root reports a falsely clean result. (2) It is gem mode with no
217
+ remote_theme anywhere, so NOTHING is picked up automatically: the
218
+ scheduled bump is its only path to a new version.
219
+ risk: >-
220
+ Gemfile.lock resolved 1.25.0 while the Gemfile constraint (~> 1.25)
221
+ already permitted 1.28.0 — stale purely because nothing was nudging it.
222
+ Keeps two deliberate include forks, declared in its .theme-overrides.yml.
223
+ pins:
224
+ - file: Gemfile
225
+ kind: gem_constraint
226
+ note: 'line 11 — `gem "jekyll-theme-zer0", "~> 1.25"`'
227
+ - file: Gemfile.lock
228
+ kind: resolved_lockfile
229
+ note: "line 86 — re-lock with `bundle lock --update jekyll-theme-zer0`"
230
+ - file: _config.yml
231
+ kind: theme_name
232
+ note: "line 29 — `theme: jekyll-theme-zer0`; activates the gem, no version of its own"
233
+
234
+ # ---------------------------------------------------------------------------
235
+ - repo: bamr87/irony-works
236
+ mode: remote_theme_floating
237
+ site: https://bamr87.github.io/irony-works/
238
+ dispatch: false
239
+ note: >-
240
+ Vault + Node engine; engine/scripts/transplant.mjs converts vault/ into
241
+ the _entries/ collection before Jekyll runs. Has NO Gemfile at all — it
242
+ builds via actions/jekyll-build-pages (the github-pages image), so it can
243
+ only ever be tracked as remote_theme_floating; there is no gem constraint
244
+ surface for a bump to rewrite.
245
+ risk: >-
246
+ Unpinned, and with no local preview path a contributor cannot see a theme
247
+ break before pushing. Keeps three deliberate overrides, declared in its
248
+ .theme-overrides.yml.
249
+ pins:
250
+ - file: _config.yml
251
+ kind: remote_theme
252
+ note: line 4, no tag — floats main
253
+
254
+ # ---------------------------------------------------------------------------
255
+ - repo: bamr87/wargames
256
+ mode: remote_theme_floating
257
+ site: https://bamr87.github.io/wargames/
258
+ dispatch: false
259
+ note: >-
260
+ Content-only vendored mirror of the OverTheWire challenges. Zero local
261
+ theme files — one of the cleanest consumers in the fleet. Its _config.yml
262
+ uses column-aligned YAML (`remote_theme : "..."`), the style
263
+ that used to defeat audit-consumer's mode detection.
264
+ risk: >-
265
+ Unpinned, and its only build runs on push to main (jekyll-gh-pages.yml),
266
+ so a break ships before anyone sees it.
267
+ pins:
268
+ - file: _config.yml
269
+ kind: remote_theme
270
+ note: line 44, no tag — floats main
271
+
272
+ # ---------------------------------------------------------------------------
273
+ - repo: bamr87/zer0-pages-remote
274
+ mode: remote_theme_floating
275
+ site: https://bamr87.github.io/zer0-pages-remote/
276
+ dispatch: false
277
+ note: >-
278
+ The minimal reference consumer: _config.yml + Gemfile + index.md, no
279
+ local theme files and no _data at all, still showing the onboarding
280
+ wizard by design. Useful as the canary for what a stock remote_theme
281
+ consumer gets with zero customisation — if the theme breaks a bare site,
282
+ it breaks here first.
283
+ private: true
284
+ risk: >-
285
+ Unpinned. Low stakes (a demo, not a content site), but it has already
286
+ caught one real integration break: PR #8 fixed a Liquid `include_cached`
287
+ failure caused by a Gemfile plugin missing from the safe-mode whitelist.
288
+ This repo is PRIVATE, so an unauthenticated `propagate.rb` run reports it
289
+ "unreachable" rather than reading its pin — drift reporting needs a token
290
+ here even though it is read-only. CI already supplies one; a bare local
291
+ run will not.
292
+ pins:
293
+ - file: _config.yml
294
+ kind: remote_theme
295
+ note: line 12, no tag — floats main
data/_data/features.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  # zer0-mistakes Theme Features Registry
2
2
  # Comprehensive feature tracking for the zer0-mistakes Jekyll theme
3
- # Version: 1.26.0
4
- # Last Updated: 2026-07-17
3
+ # Version: 1.29.0
4
+ # Last Updated: 2026-09-07
5
5
 
6
6
  features:
7
7
  # ============================================================================
@@ -435,22 +435,25 @@ features:
435
435
 
436
436
  - id: ZER0-013
437
437
  title: "Mermaid Diagram Support"
438
- description: "Client-side Mermaid.js integration for 10+ diagram types. GitHub Pages compatible with no build plugins required"
438
+ description: "Client-side Mermaid.js diagrams for 10+ diagram types, rendered as accessible figures: a zoom / fullscreen / copy-source / SVG-export toolbar, accTitle captions, an error card that keeps the source visible, and colours derived from the live design tokens so diagrams follow the colour mode and skin. GitHub Pages compatible with no build plugins required"
439
439
  implemented: true
440
- version: "0.3.0"
441
- link: "/"
440
+ version: "1.30.0"
441
+ link: "/docs/features/mermaid-diagrams/"
442
442
  docs: "/docs/features/mermaid-diagrams/"
443
- tags: [mermaid, diagrams, visualization, documentation]
444
- date: 2025-01-27
443
+ tags: [mermaid, diagrams, visualization, documentation, accessibility, ui]
444
+ date: 2026-09-05
445
445
  provenance:
446
446
  introduced_in: "0.3.0"
447
447
  pr: null
448
448
  commit: "1a6184b"
449
449
  issue: null
450
450
  tests:
451
- - "test/test_core.sh"
451
+ - "test/visual/features/mermaid.spec.js"
452
452
  references:
453
453
  include: "_includes/components/mermaid.html"
454
+ script: "assets/js/mermaid-diagrams.js"
455
+ styles: "_sass/components/_mermaid.scss"
456
+ evidence: "test/visual/mermaid-evidence.mjs"
454
457
  config: "_config.yml"
455
458
  diagram_types:
456
459
  - "Flowchart (graph TD)"
@@ -1037,6 +1040,7 @@ features:
1037
1040
  - "Client-side JSON search index"
1038
1041
  - "Bootstrap modal interface"
1039
1042
  - "Keyboard shortcut (/) activation"
1043
+ - "Cmd/Ctrl+K shortcut with visible navbar affordance — a / kbd chip on the search button (design-system navbar pattern), hover titles with platform-aware Cmd-K/Ctrl+K, aria-keyshortcuts, and shortcut hints on the sidebar (b) and TOC (t) toggles"
1040
1044
  - "Real-time search results"
1041
1045
  - "Accessible search input"
1042
1046
  - "No external dependency (Algolia removed v1.5.1)"
@@ -1752,14 +1756,14 @@ features:
1752
1756
  includes:
1753
1757
  - "_includes/content/backlinks.html"
1754
1758
  - id: ZER0-060
1755
- title: "AI Chat Assistant (Claude + GitHub)"
1756
- description: "Claude-powered floating chat grounded in the current page: streaming replies, GitHub issue/PR actions (after confirmation), and a dev-only mode that edits the page source file live"
1759
+ title: "AI Chat Assistant (Claude or Grok + GitHub)"
1760
+ description: "Floating chat grounded in the current page, answered by Claude or Grok through the proxy: streaming replies, GitHub issue/PR actions (after confirmation), and a dev-only mode that edits the page source file live"
1757
1761
  implemented: true
1758
- version: "1.18.0"
1762
+ version: "1.30.0"
1759
1763
  link: "/docs/features/ai-chat-assistant/"
1760
1764
  docs: "/docs/features/ai-chat-assistant/"
1761
- tags: [ai, chatbot, claude, github, proxy, accessibility]
1762
- date: 2026-06-13
1765
+ tags: [ai, chatbot, claude, grok, github, proxy, accessibility]
1766
+ date: 2026-09-07
1763
1767
  provenance:
1764
1768
  introduced_in: "1.18.0"
1765
1769
  pr: 33
@@ -1770,7 +1774,7 @@ features:
1770
1774
  references:
1771
1775
  includes: ["_includes/components/ai-chat.html"]
1772
1776
  layouts: ["_layouts/root.html"]
1773
- scripts: ["assets/js/ai-chat.js", "templates/deploy/chat-proxy/worker.js", "templates/deploy/chat-proxy/dev-proxy.mjs", "templates/deploy/chat-proxy/page-store.mjs"]
1777
+ scripts: ["assets/js/ai-chat.js", "templates/deploy/chat-proxy/worker.js", "templates/deploy/chat-proxy/providers.js", "templates/deploy/chat-proxy/dev-proxy.mjs", "templates/deploy/chat-proxy/page-store.mjs"]
1774
1778
  config: "_config.yml"
1775
1779
  instructions: ".github/instructions/ai-chat.instructions.md"
1776
1780
 
@@ -1917,25 +1921,27 @@ features:
1917
1921
 
1918
1922
  - id: ZER0-067
1919
1923
  title: "Setup Wizard"
1920
- description: "Multi-step in-browser wizard that assembles a complete _config.yml and lets you download or copy it, lowering first-run setup friction"
1924
+ description: "Nine-step in-browser wizard that assembles a complete starter project — _config.yml, dev config, Gemfile, docker-compose, navigation, first pages with per-file download and a self-extracting bundle; the form half of the Site Builder"
1921
1925
  implemented: true
1922
- version: "0.22.7"
1926
+ version: "1.30.0"
1923
1927
  link: "/setup/"
1924
- docs: "/docs/quickstart/bare-minimum/"
1928
+ docs: "/docs/features/site-builder/"
1925
1929
  tags: [setup, onboarding, configuration]
1926
- date: 2026-04-03
1930
+ date: 2026-09-05
1927
1931
  provenance:
1928
1932
  introduced_in: "0.22.7"
1929
1933
  pr: 51
1930
1934
  commit: "a70ae8a5"
1931
1935
  issue: null
1932
1936
  tests:
1933
- - na: "Client-side config generator; exercised manually and via the build"
1937
+ - "test/visual/features/setup-wizard.spec.js"
1934
1938
  references:
1935
1939
  include: "_includes/setup/wizard.html"
1936
1940
  scripts:
1937
1941
  - "assets/js/setup-wizard.js"
1942
+ styles: ["_sass/components/_setup-wizard.scss"]
1938
1943
  layout: "_layouts/setup.html"
1944
+ data: "_data/site_builder.yml"
1939
1945
 
1940
1946
  - id: ZER0-068
1941
1947
  title: "Table CSV Copy"
@@ -2218,7 +2224,7 @@ features:
2218
2224
  features:
2219
2225
  - "Zero-config default: explicit /favicon.ico link on every page (fixes silent 404s and baseurl project sites)"
2220
2226
  - "Optional SVG favicon, PNG sizes, apple-touch-icon, and web manifest links"
2221
- - "theme-color meta sourced from favicon.theme_color with fallback to theme_color.main design token"
2227
+ - "scheme-aware theme-color metas tracking --bs-body-bg (light #ffffff / dark #212529), emitted even with no config; favicon.theme_color pins a single value"
2222
2228
 
2223
2229
  - id: ZER0-080
2224
2230
  title: "Books Collection — Children's Picture-Book Publishing"
@@ -2256,3 +2262,280 @@ features:
2256
2262
  - "Immersive sidebar-free reading surface: storybook serif, responsive type scale, drop cap, plate styling for bare markdown images"
2257
2263
  - "illustrations: front matter renders a collapsed prompt colophon — the same list drives OpenAI image generation on consumer sites (drsai)"
2258
2264
  - "Demo book The Tales of Zer0 ships with the theme; reference platform: bamr87/drsai with Dodge & Reena as the test book"
2265
+
2266
+ - id: ZER0-081
2267
+ title: "Claude Design System Round-Trip"
2268
+ description: "Design-token layer aligned with the zer0-mistakes Claude Design project: corner-radius, logo-palette, and display-size tokens join _sass/tokens/; a git mirror of the design project lives under _design-system/ (plain-CSS tokens, React component specs from buttons to FABs to post cards to skeletons, foundation cards, website UI kit); and a CI parity check fails when theme and mirror drift"
2269
+ implemented: true
2270
+ version: "1.29.0"
2271
+ link: "/"
2272
+ docs: "https://github.com/bamr87/zer0-mistakes/blob/main/docs/ui/design-system.md"
2273
+ tags: [design-system, tokens, sass, ai, tooling]
2274
+ date: 2026-08-14
2275
+ provenance:
2276
+ introduced_in: "1.29.0"
2277
+ pr: 389
2278
+ commit: "7fc2fe02"
2279
+ issue: null
2280
+ tests:
2281
+ - "test/visual/core/styling.spec.js"
2282
+ - "scripts/design-system-check.rb"
2283
+ references:
2284
+ styles:
2285
+ - "_sass/tokens/_radius.scss"
2286
+ - "_sass/tokens/_index.scss"
2287
+ scripts:
2288
+ - "scripts/design-system-check.rb"
2289
+ design:
2290
+ - "_design-system/components/"
2291
+ - "_design-system/guidelines/"
2292
+ - "_design-system/tokens/"
2293
+ docs: "docs/ui/design-system.md"
2294
+ features:
2295
+ - "--zer0-radius-* corner radii, --zer0-logo-* brand palette, and --zer0-text-display-* fluid hero sizes declared once and consumed by callouts, landing cards, nav, and focus rings"
2296
+ - "_design-system/ mirrors the claude.ai/design project (id e75121c0-9210-42d1-ade3-2c8af9111cbe) so interfaces can be designed in Claude Design and folded back into the theme — contract in _design-system/SYNC.md"
2297
+ - "scripts/design-system-check.rb (core test suite) resolves var() alias chains and fails CI on token drift, plus flags fallback-less var(--zer0-*) references that are never declared"
2298
+ - "Component specs ship the theme's primitives as React twins — Button, Badge, Fab/FabStack, Card, FeatureCard, PostCard, Callout, Skeleton, Input — with foundation cards for colors, type, spacing, motion, layers, and brand (PR 391)"
2299
+ - "No webfonts, Bootstrap-first, seven skins, light+dark — the imported system and the theme now state one identical visual contract"
2300
+
2301
+ - id: ZER0-082
2302
+ title: "Live Design System Pages"
2303
+ description: "The design system published on the site itself: _design-system/ is force-included in the Jekyll build so tokens, styles.css, specimen cards, and component sources get real URLs under /_design-system/, and a /design/ hub page renders the foundation specimens in live iframes, catalogs the component twins, and links the Claude Design page canvas covering all 24 layouts"
2304
+ implemented: true
2305
+ version: "1.29.0"
2306
+ link: "/design/"
2307
+ docs: "https://github.com/bamr87/zer0-mistakes/blob/main/docs/ui/design-system.md"
2308
+ tags: [design-system, tokens, pages, navigation, ui]
2309
+ date: 2026-08-14
2310
+ provenance:
2311
+ introduced_in: "1.29.0"
2312
+ pr: 392
2313
+ commit: "6ac9f77d"
2314
+ issue: null
2315
+ tests:
2316
+ - "test/visual/features/design-hub.spec.js"
2317
+ references:
2318
+ pages:
2319
+ - "pages/_about/design.md"
2320
+ data:
2321
+ - "_data/navigation/main.yml"
2322
+ tests:
2323
+ - "test/visual/features/design-hub.spec.js"
2324
+ config: "_config.yml"
2325
+ features:
2326
+ - "Publishing is one config line — include: [_design-system] — so the mirror's plain-CSS tokens double as a hosted stylesheet any prototype can link"
2327
+ - "/design/ foundations gallery renders the actual specimen cards in iframes against the published tokens — living documentation, never screenshots"
2328
+ - "Component-twin catalog links every React spec (.jsx/.d.ts/.prompt.md) served raw from the mirror; interactive rendering stays in Claude Design"
2329
+ - "Page canvas: every layout, nav pattern, and chrome surface recreated as a Claude Design presentation, linked from the hub with a screen-to-repo-file map"
2330
+
2331
+ # ============================================================================
2332
+ # READER ENGAGEMENT (v1.29+)
2333
+ # ============================================================================
2334
+
2335
+ - id: ZER0-083
2336
+ title: "Page View Counter"
2337
+ description: "Per-page view tracking with the count shown in the article meta row — a local-first provider that needs no server, or an HTTP counter endpoint, both gated by DNT, GPC, and consent"
2338
+ implemented: true
2339
+ version: "1.29.0"
2340
+ link: "/"
2341
+ docs: "https://github.com/bamr87/zer0-mistakes/blob/main/docs/features/page-views.md"
2342
+ tags: [analytics, privacy, engagement, metrics, ui]
2343
+ date: 2026-08-23
2344
+ provenance:
2345
+ introduced_in: "1.29.0"
2346
+ pr: 413
2347
+ commit: "6ca4961b"
2348
+ issue: null
2349
+ tests:
2350
+ - "test/visual/features/page-views.spec.js"
2351
+ references:
2352
+ layouts:
2353
+ - "_layouts/article.html"
2354
+ includes:
2355
+ - "_includes/components/page-views.html"
2356
+ - "_includes/components/page-views-init.html"
2357
+ - "_includes/core/head.html"
2358
+ scripts:
2359
+ - "assets/js/page-views.js"
2360
+ styles:
2361
+ - "_sass/components/_page-views.scss"
2362
+ tests:
2363
+ - "test/visual/features/page-views.spec.js"
2364
+ config: "_config.yml"
2365
+ docs: "docs/features/page-views.md"
2366
+ features:
2367
+ - "Two providers: 'local' (default) keeps counts in the visitor's localStorage — no server, no network, GitHub-Pages safe; 'remote' reads a counter endpoint the site owns ({path} substitution, configurable method, dotted count_key)"
2368
+ - "Privacy gates mirror the posthog block (DNT, Global Privacy Control, optional cookie-consent 'analytics' tie-in) and suppress RECORDING only — a view blocked pending consent is recorded when consent arrives"
2369
+ - "dedupe: session counts one view per page per browser session, so a reload cannot inflate the number"
2370
+ - "The badge ships hidden and is revealed only once a count exists — no '0 views' flash — and carries its own leading separator so a hidden badge leaves no dangling bullet in the meta row"
2371
+ - "Every storage touch is probed and wrapped: private mode, blocked cookies, a corrupt payload, or an exceeded quota degrade to 'no count' instead of throwing"
2372
+ - "window.zer0PageViews (get/all/refresh/reset) plus a 'zer0:page-views' CustomEvent let a site build on the count without polling"
2373
+ - id: ZER0-084
2374
+ title: "Cookbook & Recipes Collection"
2375
+ description: "A `recipes` collection whose structured front matter (ingredients, steps, yield, times, ratio_basis) renders as a working recipe page: a fact bar, a serving scaler, an ingredient checklist, a numbered method, a build-time baker's-percentage table, and schema.org Recipe JSON-LD — with client-side scaling and US/metric conversion (volume↔weight via an ingredient density table) layered on as progressive enhancement"
2376
+ implemented: true
2377
+ version: "1.29.0"
2378
+ link: "/recipes/"
2379
+ docs: "/docs/features/cookbook-collection/"
2380
+ tags: [recipes, cookbook, collections, layouts, unit-conversion, structured-data]
2381
+ date: 2026-08-23
2382
+ provenance:
2383
+ introduced_in: "1.29.0"
2384
+ pr: null
2385
+ commit: "45354f34"
2386
+ issue: null
2387
+ tests:
2388
+ - "test/test_core.sh"
2389
+ references:
2390
+ layouts:
2391
+ - "_layouts/recipe.html"
2392
+ - "_layouts/cookbook.html"
2393
+ includes:
2394
+ - "_includes/components/recipe-index.html"
2395
+ - "_includes/components/recipe-card.html"
2396
+ - "_includes/components/recipe-meta.html"
2397
+ - "_includes/components/recipe-scaler.html"
2398
+ - "_includes/components/recipe-ingredients.html"
2399
+ - "_includes/components/recipe-steps.html"
2400
+ - "_includes/components/recipe-ratio.html"
2401
+ - "_includes/components/recipe-nutrition.html"
2402
+ - "_includes/components/recipe-qty.html"
2403
+ - "_includes/components/recipe-temp.html"
2404
+ - "_includes/components/recipe-grams.html"
2405
+ - "_includes/components/recipe-duration.html"
2406
+ styles: ["_sass/components/_recipe.scss"]
2407
+ scripts: ["assets/js/recipe-scaler.js"]
2408
+ data:
2409
+ - "_data/recipe_courses.yml"
2410
+ - "_data/ingredient_densities.yml"
2411
+ pages:
2412
+ - "pages/_recipes/index.md"
2413
+ - "pages/_docs/features/cookbook-collection.md"
2414
+ config: "_config.yml"
2415
+ components:
2416
+ - "Serving scaler — stepper, ½×/1×/2×/3× presets, ?servings= and ?scale= links, per-recipe scale remembered in localStorage"
2417
+ - "Unit switch — as written / metric / US, rewriting quantities, units and oven temperatures in place"
2418
+ - "Volume↔weight conversion driven by _data/ingredient_densities.yml, overridable per ingredient with grams_per_cup"
2419
+ - "Baker's-percentage ratio table computed at build time, so percentages are correct with JavaScript disabled"
2420
+ - "Progressive enhancement: quantities render as authored by Jekyll; the control bar stays hidden until the script reveals it"
2421
+
2422
+ - id: ZER0-085
2423
+ title: "Visual Evidence Autogen"
2424
+ description: "CI produces a UI pull request's visual artifacts instead of only verifying them: before/after evidence from the PR's generator or a generic base-vs-head render, and 9-skin pixel baselines refreshed only when the reviewer agent judges the diff to be the change the PR describes"
2425
+ implemented: true
2426
+ version: "1.30.0"
2427
+ link: "/"
2428
+ docs: "/docs/development/testing/"
2429
+ tags: [ci-cd, testing, automation, ai, quality]
2430
+ date: 2026-09-05
2431
+ provenance:
2432
+ introduced_in: "1.30.0"
2433
+ pr: 462
2434
+ commit: "d0bfc0d1"
2435
+ issue: null
2436
+ tests:
2437
+ - "scripts/ci/test_visual_evidence_autogen.py"
2438
+ references:
2439
+ workflow: ".github/workflows/visual-evidence-autogen.yml"
2440
+ scripts:
2441
+ - "scripts/ci/visual_evidence_autogen.py"
2442
+ - "test/visual/pr-evidence.mjs"
2443
+ - "test/visual/snapshot-diff-montage.mjs"
2444
+ - "test/update-snapshots.sh"
2445
+ agent: ".claude/agents/visual-evidence-reviewer.md"
2446
+ docs: "docs/systems/continuous-evolution.md"
2447
+ features:
2448
+ - "Runs on every same-repo PR event: plans from the diff, brings Jekyll up with docker compose, and renders inside the same jammy Playwright image the snapshot gate compares with"
2449
+ - "Evidence from the PR's own test/visual/*-evidence.mjs generators, or from the generic base-vs-head generator that renders the base branch and the head side by side — no hand-written unfixCss needed"
2450
+ - "Pixel baselines are refreshed only on an 'intentional' verdict from the visual-evidence-reviewer agent, which views the expected | actual | diff montage; a code step disposes, the model only proposes (#417)"
2451
+ - "Loop guard on its own [visual-autogen] commits, a three-commit budget per PR, per-folder manifests so author-made evidence is never overwritten, kill switch VISUAL_EVIDENCE_AUTOGEN_ENABLED=false, and the evidence gate's opt-out labels"
2452
+ - "One sticky PR comment with the montages and the verdict; render output uploaded as an artifact on every run; the evidence gate now requires generated proof and ci-self-repair hands a red Visual Snapshots job to this lane"
2453
+
2454
+ - id: ZER0-086
2455
+ title: "Claude-Guided Site Builder"
2456
+ description: "An embedded Claude session that rides alongside the setup wizard: it sees every answer, fills in the forms, checks the machine, reads the theme's real source, writes the generated project to disk and starts Docker — through the local dev proxy, with a confirmation card before every action"
2457
+ implemented: true
2458
+ version: "1.30.0"
2459
+ link: "/setup/"
2460
+ docs: "/docs/features/site-builder/"
2461
+ tags: [ai, claude, grok, setup, onboarding, docker, proxy]
2462
+ date: 2026-09-07
2463
+ provenance:
2464
+ introduced_in: "1.30.0"
2465
+ pr: null
2466
+ commit: "331ae16c"
2467
+ issue: null
2468
+ tests:
2469
+ - "test/visual/features/setup-wizard.spec.js"
2470
+ - "test/test_wizard_store.mjs"
2471
+ references:
2472
+ includes:
2473
+ - "_includes/setup/wizard.html"
2474
+ - "_includes/setup/claude-session.html"
2475
+ - "_includes/setup/prereq-checklist.html"
2476
+ scripts:
2477
+ - "assets/js/site-builder.js"
2478
+ - "templates/deploy/chat-proxy/wizard-store.mjs"
2479
+ - "templates/deploy/chat-proxy/dev-proxy.mjs"
2480
+ - "test/visual/site-builder-walkthrough.mjs"
2481
+ - "test/visual/site-builder-scenarios.mjs"
2482
+ data: "_data/site_builder.yml"
2483
+ config: "_config.yml"
2484
+ instructions: ".github/instructions/ai-chat.instructions.md"
2485
+ pages:
2486
+ - "pages/_quickstart/site-builder.md"
2487
+ - "pages/_docs/features/site-builder.md"
2488
+ components:
2489
+ - "Connect step — detects the dev proxy, shows the three commands to connect (claude setup-token → .env → node --env-file), re-checks every 15 s"
2490
+ - "Prerequisites — live Docker/Git/gh/VS Code/Node/Claude CLI checks through a fixed command table, per-OS install commands from machine-setup, manual toggles offline"
2491
+ - "Tools — get/set wizard fields, go to step, get/override generated files, read theme source, list theme dirs, search the docs index, resolve target, write project, docker compose up/ps/logs/down, check the site is live"
2492
+ - "Context propagation — the whole wizard state, field schema and generated-file list are in the system prompt on every turn; the form is the single source of truth"
2493
+ - "Safety — proxy-only (no credential in the page), escape-first rendering, confirmation cards for every mutation, scaffold confined to a new folder beside the theme"
2494
+ - "Validation — test/visual/site-builder-walkthrough.mjs samples a random brief per site type (site-builder-scenarios.mjs), drives the wizard on video, builds the site with Docker and asserts routes/title/skin; replayable by seed"
2495
+ - "Site plan — plan_schema in _data/site_builder.yml (JSON-Schema subset, validated in the browser) describes landing templates/sections, navigation style + sidebar, palette/font/radius overrides and example pages; set_site_plan applies it behind a confirmation card and the generators emit index.md + _data/landing.yml, navigation data, assets/css/user-overrides.css + _includes/custom/head.html and one file per planned page"
2496
+ - "Providers, bring-your-own token, open sessions, project editing and image generation — see ZER0-087"
2497
+
2498
+ - id: ZER0-087
2499
+ title: "Bring-Your-Own AI Provider (Claude or Grok) and Open Site Builder Sessions"
2500
+ description: "The Site Builder and chat proxy answer with Claude (Anthropic) or Grok (xAI): users paste their own token on the Connect step, pick a model and an image renderer, and run a guided or open session that can also modify an existing site file by file and render images with Grok Imagine"
2501
+ implemented: true
2502
+ version: "1.30.0"
2503
+ link: "/setup/"
2504
+ docs: "/docs/features/site-builder/"
2505
+ tags: [ai, claude, grok, xai, setup, onboarding, proxy, images]
2506
+ date: 2026-09-07
2507
+ provenance:
2508
+ introduced_in: "1.30.0"
2509
+ pr: null
2510
+ commit: "b43a2bf6"
2511
+ issue: null
2512
+ tests:
2513
+ - "test/test_providers.mjs"
2514
+ - "test/test_wizard_store.mjs"
2515
+ - "test/visual/features/setup-wizard.spec.js"
2516
+ references:
2517
+ includes:
2518
+ - "_includes/setup/wizard.html"
2519
+ - "_includes/setup/claude-session.html"
2520
+ scripts:
2521
+ - "assets/js/site-builder.js"
2522
+ - "assets/js/setup-wizard.js"
2523
+ - "templates/deploy/chat-proxy/providers.js"
2524
+ - "templates/deploy/chat-proxy/credential-store.mjs"
2525
+ - "templates/deploy/chat-proxy/worker.js"
2526
+ - "templates/deploy/chat-proxy/dev-proxy.mjs"
2527
+ - "templates/deploy/chat-proxy/wizard-store.mjs"
2528
+ - "test/visual/site-builder-providers-evidence.mjs"
2529
+ data: "_data/site_builder.yml"
2530
+ config: "_config.yml"
2531
+ instructions: ".github/instructions/ai-chat.instructions.md"
2532
+ pages:
2533
+ - "pages/_docs/features/site-builder.md"
2534
+ - "pages/_quickstart/site-builder.md"
2535
+ components:
2536
+ - "Provider layer (providers.js, Worker + Node) — Anthropic Messages dialect translated to and from xAI's OpenAI-compatible chat API, streaming tool calls included, so ai-chat.js, site-builder.js and the feedback triage are unchanged; CHAT_PROVIDER / CHAT_MODEL / XAI_CHAT_MODEL pinned server-side, client models accepted only from the selected provider's family"
2537
+ - "Connect step — Claude and Grok cards with masked key state, a password token field posted once to the localhost proxy (memory only, probed upstream, optional .env save with mode 600, Forget), model catalog, image renderer (Grok Imagine / OpenAI Images) and guided vs open session; the dev proxy starts without a credential"
2538
+ - "Open session — chat-driven, any order, up to 24 tool rounds per turn with a Stop button; interrupted tool calls get synthetic results so the history stays valid"
2539
+ - "Project session — list/open an existing site under WIZARD_TARGET_ROOT, tree/read, write/edit (unique snippet)/delete text files behind confirmation cards, git status/diff/log/init, jekyll build inside the container"
2540
+ - "Image generation — generate_image renders with grok-imagine-image-2.0 (or gpt-image-2) into assets/ (PNG/JPEG/WebP sniffed, 8 MB cap) with a thumbnail card; generated sites carry ai_chat.provider, preview_images and the matching .env.example keys"
2541
+ - "Validation — test/test_providers.mjs (mock xAI + Anthropic upstreams), test/test_wizard_store.mjs (project + asset rules), setup-wizard.spec.js (mocked proxy: connect as Grok, token never stored, open mode, existing sites), evidence in test/visual/evidence/site-builder-providers/"