jekyll-theme-zer0 1.26.0 → 1.28.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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +558 -5
  3. data/README.md +10 -27
  4. data/_data/authors.yml +4 -3
  5. data/_data/backlog.yml +28 -0
  6. data/_data/consumers.yml +147 -0
  7. data/_data/features.yml +142 -23
  8. data/_data/i18n/fr.yml +98 -0
  9. data/_data/i18n/languages.yml +36 -0
  10. data/_data/i18n/manifest.yml +1502 -0
  11. data/_data/navigation/docs.yml +2 -0
  12. data/_data/navigation/main.yml +6 -0
  13. data/_data/series.yml +19 -0
  14. data/_data/theme-manifest.yml +348 -268
  15. data/_data/ui-text.yml +36 -246
  16. data/_includes/README.md +25 -2
  17. data/_includes/analytics/google-tag-manager-body.html +11 -2
  18. data/_includes/analytics/google-tag-manager-head.html +16 -6
  19. data/_includes/analytics/posthog.html +33 -4
  20. data/_includes/components/abc-letter.html +43 -0
  21. data/_includes/components/author-avatar-url.html +4 -2
  22. data/_includes/components/book-card.html +42 -0
  23. data/_includes/components/book-nav.html +80 -0
  24. data/_includes/components/book-plate.html +31 -0
  25. data/_includes/components/book-toc.html +47 -0
  26. data/_includes/components/bookshelf.html +68 -0
  27. data/_includes/components/card-grid.html +60 -0
  28. data/_includes/components/data-card.html +95 -0
  29. data/_includes/components/env-switcher.html +3 -1
  30. data/_includes/components/halfmoon.html +5 -1
  31. data/_includes/components/language-toggle.html +81 -0
  32. data/_includes/components/page-feedback.html +65 -2
  33. data/_includes/components/search-modal.html +2 -2
  34. data/_includes/components/shortcuts-modal.html +1 -1
  35. data/_includes/components/theme-controls-bar.html +10 -2
  36. data/_includes/components/theme-customizer.html +8 -2
  37. data/_includes/components/translation-notice.html +27 -0
  38. data/_includes/content/intro.html +16 -15
  39. data/_includes/content/seo.html +9 -3
  40. data/_includes/core/color-mode-init.html +13 -4
  41. data/_includes/core/favicon.html +46 -0
  42. data/_includes/core/footer.html +9 -4
  43. data/_includes/core/head.html +18 -0
  44. data/_includes/core/header.html +9 -4
  45. data/_includes/core/hreflang.html +33 -0
  46. data/_includes/core/i18n.html +36 -0
  47. data/_includes/custom/body-end.html +18 -0
  48. data/_includes/custom/body-start.html +17 -0
  49. data/_includes/custom/footer.html +18 -0
  50. data/_includes/custom/head.html +18 -0
  51. data/_includes/navigation/breadcrumbs.html +1 -1
  52. data/_includes/navigation/local-graph.html +28 -2
  53. data/_includes/navigation/nav-tree.html +3 -3
  54. data/_includes/navigation/navbar.html +5 -4
  55. data/_includes/navigation/sidebar-config.html +21 -0
  56. data/_includes/navigation/sidebar-nav.html +4 -0
  57. data/_includes/navigation/sidebar-pagetree.html +150 -0
  58. data/_includes/navigation/sidebar-right.html +3 -2
  59. data/_includes/navigation/unified-drawer.html +9 -3
  60. data/_includes/obsidian/full-graph.html +165 -136
  61. data/_layouts/404.html +260 -0
  62. data/_layouts/README.md +2 -0
  63. data/_layouts/article.html +7 -1
  64. data/_layouts/book-abc.html +106 -0
  65. data/_layouts/book-story.html +91 -0
  66. data/_layouts/book.html +113 -0
  67. data/_layouts/collection.html +17 -5
  68. data/_layouts/default.html +5 -3
  69. data/_layouts/home.html +5 -2
  70. data/_layouts/landing.html +9 -0
  71. data/_layouts/news.html +159 -33
  72. data/_layouts/root.html +29 -9
  73. data/_layouts/section.html +61 -17
  74. data/_sass/components/_book.scss +423 -0
  75. data/_sass/core/_navbar.scss +13 -0
  76. data/_sass/core/_obsidian.scss +295 -7
  77. data/_sass/layouts/_navbar-extras.scss +6 -1
  78. data/_sass/theme/_backgrounds.scss +21 -8
  79. data/assets/css/main.scss +1 -0
  80. data/assets/js/auto-hide-nav.js +5 -1
  81. data/assets/js/halfmoon.js +26 -0
  82. data/assets/js/obsidian-graph.js +707 -265
  83. data/assets/js/obsidian-local-graph.js +161 -54
  84. data/assets/js/search-modal.js +4 -1
  85. data/scripts/README.md +20 -26
  86. data/scripts/bin/audit-consumer +1 -1
  87. data/scripts/bin/manifest +31 -5
  88. data/scripts/bin/sync-plugins +0 -1
  89. data/scripts/bin/validate +5 -1
  90. data/scripts/dev/rasterize-svg.js +65 -0
  91. data/scripts/features/generate-preview-images +49 -1390
  92. data/scripts/features/install-preview-generator +55 -33
  93. data/scripts/install/README.md +55 -25
  94. data/scripts/install/ai/client.sh +302 -93
  95. data/scripts/install/ai/prompts/spec.schema.json +1 -1
  96. data/scripts/install/ai/prompts/wizard.system.md +8 -17
  97. data/scripts/install/ai/wizard.sh +10 -5
  98. data/scripts/install/apply.sh +7 -3
  99. data/scripts/install/cli.sh +54 -4
  100. data/scripts/install/config.sh +167 -0
  101. data/scripts/install/doctor.sh +38 -0
  102. data/scripts/install/plan.sh +10 -0
  103. data/scripts/install/spec.sh +15 -7
  104. data/scripts/install/template.sh +4 -0
  105. data/scripts/lib/README.md +1 -5
  106. data/scripts/lib/install/deploy/README.md +3 -9
  107. data/scripts/lib/preview_generator.py +2261 -1341
  108. data/scripts/propagate.rb +277 -0
  109. data/scripts/translate.rb +1204 -0
  110. metadata +34 -3
  111. data/_plugins/preview_image_generator.rb +0 -351
data/README.md CHANGED
@@ -44,14 +44,7 @@ hero_image: /assets/images/wizard-on-journey.png
44
44
  excerpt: "AI-native Jekyll theme for GitHub Pages — multi-agent ready (Copilot, Codex, Cursor, Claude), AI-powered install & preview images, AIEO-optimized, with Docker-first development and 43 documented features"
45
45
  ---
46
46
 
47
- [![pages-build-deployment](https://github.com/bamr87/zer0-mistakes/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/bamr87/zer0-mistakes/actions/workflows/pages/pages-build-deployment)
48
- [![Gem Version](https://badge.fury.io/rb/jekyll-theme-zer0.svg)](https://badge.fury.io/rb/jekyll-theme-zer0)
49
- [![CI](https://github.com/bamr87/zer0-mistakes/actions/workflows/ci.yml/badge.svg)](https://github.com/bamr87/zer0-mistakes/actions/workflows/ci.yml)
50
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
51
- [![Docker](https://img.shields.io/badge/docker-ready-blue.svg)](https://github.com/bamr87/zer0-mistakes/blob/main/docker-compose.yml)
52
- [![Bootstrap](https://img.shields.io/badge/Bootstrap-5.3.3-purple.svg)](https://getbootstrap.com/)
53
- [![AI-Native](https://img.shields.io/badge/AI--Native-Copilot%20%7C%20Codex%20%7C%20Cursor%20%7C%20Claude-8A2BE2)](AGENTS.md)
54
- [![AIEO](https://img.shields.io/badge/AIEO-Optimized-ff69b4)](#-aieo-optimized--built-for-ai-citation)
47
+ [![pages-build-deployment](https://github.com/bamr87/zer0-mistakes/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/bamr87/zer0-mistakes/actions/workflows/pages/pages-build-deployment) [![Gem Version](https://badge.fury.io/rb/jekyll-theme-zer0.svg)](https://badge.fury.io/rb/jekyll-theme-zer0) [![CI](https://github.com/bamr87/zer0-mistakes/actions/workflows/ci.yml/badge.svg)](https://github.com/bamr87/zer0-mistakes/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/docker-ready-blue.svg)](https://github.com/bamr87/zer0-mistakes/blob/main/docker-compose.yml) [![Bootstrap](https://img.shields.io/badge/Bootstrap-5.3.3-purple.svg)](https://getbootstrap.com/) [![AI-Native](https://img.shields.io/badge/AI--Native-Copilot%20%7C%20Codex%20%7C%20Cursor%20%7C%20Claude-8A2BE2)](AGENTS.md) [![AIEO](https://img.shields.io/badge/AIEO-Optimized-ff69b4)](#-aieo-optimized--built-for-ai-citation)
55
48
 
56
49
  # zer0-mistakes
57
50
 
@@ -155,9 +148,7 @@ The installer auto-detects your operating system, sets up Docker, downloads the
155
148
 
156
149
  ## 🎯 Bare-Minimum Starter (3 files, zero install)
157
150
 
158
- Don't want to run the installer? You can publish a working site to GitHub
159
- Pages with **just three files** in your repo. The remote theme provides every
160
- layout, style, and even an in-browser configuration wizard.
151
+ Don't want to run the installer? You can publish a working site to GitHub Pages with **just three files** in your repo. The remote theme provides every layout, style, and even an in-browser configuration wizard.
161
152
 
162
153
  ```text
163
154
  my-site/
@@ -200,11 +191,7 @@ title: Home
200
191
  # Welcome to my site
201
192
  ```
202
193
 
203
- Push to a GitHub Pages–enabled repository and visit your site. Until you set
204
- `site_configured: true`, the home page renders the **welcome layout** — a hero
205
- card and a full in-browser wizard that generates a personalised `_config.yml`
206
- you can download. Flip the flag (or fill in `title`/`founder`/`email`) and your
207
- own content takes over.
194
+ Push to a GitHub Pages–enabled repository and visit your site. Until you set `site_configured: true`, the home page renders the **welcome layout** — a hero card and a full in-browser wizard that generates a personalised `_config.yml` you can download. Flip the flag (or fill in `title`/`founder`/`email`) and your own content takes over.
208
195
 
209
196
  ---
210
197
 
@@ -248,7 +235,7 @@ zer0-mistakes treats AI as core infrastructure across **install → author → b
248
235
  | **File-scoped instructions** | `applyTo:` globs auto-load guidance for `_layouts/`, `_includes/`, `scripts/`, `test/`, `docs/`, version files | [`.github/instructions/`](.github/instructions/) |
249
236
  | **Reusable agent prompts** | `commit-publish`, `frontmatter-maintainer`, `seed` (full-rebuild blueprint) | [`.github/prompts/`](.github/prompts/) |
250
237
  | **Cursor slash-commands** | Mirrors prompts as `/commit-publish`, `/frontend-run-improve` | [`.cursor/commands/`](.cursor/commands/) |
251
- | **AI preview images** | Jekyll plugin + script generate OpenAI/DALL·E images for posts missing previews | [`_plugins/preview_image_generator.rb`](_plugins/preview_image_generator.rb), [`scripts/generate-preview-images.sh`](scripts/generate-preview-images.sh) |
238
+ | **AI preview images** | Python engine + script generate OpenAI/DALL·E images for posts missing previews | [`scripts/lib/preview_generator.py`](scripts/lib/preview_generator.py), [`scripts/generate-preview-images.sh`](scripts/generate-preview-images.sh) |
252
239
  | **AI release pipeline** | Conventional-commit analyzer chooses MAJOR/MINOR/PATCH, writes CHANGELOG, tags & publishes | [`scripts/analyze-commits.sh`](scripts/analyze-commits.sh), [`scripts/bin/release`](scripts/bin/release) |
253
240
  | **AIEO content layer** | `SoftwareApplication`, `WebPage`, `FAQPage`, `Person` JSON-LD; glossary; FAQ; dated roadmap | [See AIEO section](#-aieo-optimized--built-for-ai-citation) |
254
241
 
@@ -303,7 +290,7 @@ zer0-mistakes is a layered system: your content (Markdown + YAML) flows through
303
290
  | **Development** | Docker | Cross-platform consistency |
304
291
  | **Templates** | Liquid | Dynamic content rendering |
305
292
  | **AI Agents** | Copilot · Codex · Cursor · Claude Code · Aider · Jules · Continue | Multi-tool agentic development via [`AGENTS.md`](AGENTS.md) + `.github/instructions/` |
306
- | **AI Content** | OpenAI Images API | AI-generated preview images via [`_plugins/preview_image_generator.rb`](_plugins/preview_image_generator.rb) |
293
+ | **AI Content** | OpenAI Images API | AI-generated preview images via [`scripts/lib/preview_generator.py`](scripts/lib/preview_generator.py) |
307
294
  | **AI Automation** | Conventional-commit analyzer | Auto semantic versioning + changelog ([`scripts/analyze-commits.sh`](scripts/analyze-commits.sh)) |
308
295
  | **AIEO** | JSON-LD + FAQ + Glossary schema | Optimized for AI citation and retrieval |
309
296
  | **Analytics** | PostHog | Privacy-first tracking |
@@ -430,8 +417,7 @@ GDPR/CCPA compliant PostHog integration with granular consent: it respects Do No
430
417
 
431
418
  ### 🧠 Obsidian Vault Integration
432
419
 
433
- Edit your content as an [Obsidian](https://obsidian.md) vault — same files,
434
- same git history, identical rendering on the published site:
420
+ Edit your content as an [Obsidian](https://obsidian.md) vault — same files, same git history, identical rendering on the published site:
435
421
 
436
422
  - **Open repo as a vault**: shared `.obsidian/` config commits with the repo.
437
423
  - **Wiki-links** `[[Page Title]]` and aliases `[[Page|Alias]]` resolve to permalinks.
@@ -440,17 +426,14 @@ same git history, identical rendering on the published site:
440
426
  - **Backlinks panel** auto-renders on every note (and on any page with `backlinks: true`).
441
427
  - **Inline tags** `#topic` link to the tag index, hierarchical tags supported.
442
428
  - **Zero plugin requirements**: works on the default GitHub Pages
443
- `remote_theme` build via a client-side resolver
444
- (`assets/js/obsidian-wiki-links.js`) backed by a Liquid-generated
445
- `assets/data/wiki-index.json`.
429
+ `remote_theme` build via a client-side resolver (`assets/js/obsidian-wiki-links.js`) backed by a Liquid-generated `assets/data/wiki-index.json`.
446
430
 
447
431
  ```bash
448
432
  # Open the repo root as an Obsidian vault, edit, then commit & push
449
433
  git commit -am "note: today's thinking" && git push
450
434
  ```
451
435
 
452
- Read the [Obsidian docs](pages/_docs/obsidian/) for setup, syntax reference,
453
- authoring workflow, and troubleshooting.
436
+ Read the [Obsidian docs](pages/_docs/obsidian/) for setup, syntax reference, authoring workflow, and troubleshooting.
454
437
 
455
438
  ### 📓 Jupyter Notebook Support
456
439
 
@@ -646,8 +629,8 @@ git commit -m "feat: add new component"
646
629
  ### Testing Commands
647
630
 
648
631
  ```bash
649
- # Quick validation
650
- ./test/test_installation.sh
632
+ # Quick validation (preflight)
633
+ ./scripts/validate --quick
651
634
 
652
635
  # Full test suite
653
636
  ./test/test_runner.sh --verbose
data/_data/authors.yml CHANGED
@@ -47,11 +47,12 @@
47
47
  # generator. When a post sets `author: <this key>`, these
48
48
  # values WIN over _config.yml › preview_images for that
49
49
  # post's banner, giving each AI author a distinct look.
50
- # (scripts/features/generate-preview-images and
51
- # scripts/lib/preview_generator.py read this block.)
50
+ # (Read by the consolidated engine
51
+ # scripts/lib/preview_generator.py every provider.)
52
52
  # style: .. Art-style prompt fragment (overrides preview_images.style).
53
53
  # style_modifiers: .. Extra modifiers (overrides preview_images.style_modifiers).
54
- # size/quality/model: Optional generator overrides (bash generator only).
54
+ # size/quality/model: Optional generator overrides (all providers; a model
55
+ # from another vendor family falls back to the default).
55
56
 
56
57
  default:
57
58
  name: "Zer0-Mistakes Team"
data/_data/backlog.yml CHANGED
@@ -888,3 +888,31 @@ tasks:
888
888
  links: { issue: null, pr: null, roadmap: null }
889
889
  created: 2026-07-06
890
890
  updated: 2026-07-06
891
+ - id: T-034
892
+ title: "Remove the dead preview_image_generator.rb Jekyll plugin and its test surface"
893
+ status: done
894
+ priority: P3
895
+ area: infra
896
+ risk: standard
897
+ effort: M
898
+ source: user
899
+ route: code-fixer
900
+ summary: >-
901
+ _plugins/preview_image_generator.rb never loads anywhere (the github-pages gem
902
+ forces safe mode + a randomized plugins_dir), and the consolidated Python engine
903
+ (scripts/lib/preview_generator.py, ZER0-004) now owns all generation logic while
904
+ _includes/components/preview-image.html + _includes/content/seo.html cover
905
+ rendering in pure Liquid. Remove the plugin, its PreviewImageGeneratorTest half
906
+ of test/test_plugins.rb, the consumer fixture
907
+ test/fixtures/consumer-remote/_plugins/preview_image_generator.rb, and its
908
+ entries in REQUIRED_PLUGIN_FILES (scripts/bin/audit-consumer, sync-plugins,
909
+ manifest) and the installer SOURCE/DEST_FILES. Touches CODEOWNERS-owned
910
+ _plugins/ and scripts/bin/ paths, so this is a human-review PR.
911
+ acceptance:
912
+ - "_plugins/preview_image_generator.rb deleted; docs no longer advertise its Liquid filters."
913
+ - "test_plugins.rb keeps its content-statistics coverage; preview plugin specs removed."
914
+ - "audit-consumer/sync-plugins/manifest lists and the consumer fixture updated; test_audit.sh green."
915
+ - "install-preview-generator no longer ships the plugin; installer tests green."
916
+ links: { issue: 302, pr: null, roadmap: null }
917
+ created: 2026-07-12
918
+ updated: 2026-07-16
@@ -0,0 +1,147 @@
1
+ # ==============================================================================
2
+ # _data/consumers.yml — downstream consumers of this theme
3
+ # ==============================================================================
4
+ #
5
+ # The registry that makes theme releases propagate instead of sitting unnoticed.
6
+ # Every site that renders with zer0-mistakes is listed here together with HOW it
7
+ # consumes the theme and WHICH files hold its version pin.
8
+ #
9
+ # Read by:
10
+ # - scripts/bin/propagate report pin drift; dispatch release events
11
+ # - .github/workflows/propagate-theme.yml release fan-out
12
+ #
13
+ # Why this exists: nothing connected a release to the sites built on it. When
14
+ # 1.27.0 shipped, all five consumers were still on v1.26.0 (or floating on main)
15
+ # and none of them knew. Bumps were a manual, five-repo chore that nobody
16
+ # remembered, so pins drifted until a site broke.
17
+ #
18
+ # ------------------------------------------------------------------------------
19
+ # Consumption modes
20
+ # ------------------------------------------------------------------------------
21
+ # remote_theme_pinned `remote_theme: bamr87/zer0-mistakes@vX.Y.Z` — GitHub
22
+ # Pages fetches the tagged theme at build time. Gets a
23
+ # bump PR on release.
24
+ # remote_theme_floating `remote_theme: bamr87/zer0-mistakes` with no tag —
25
+ # tracks main, so every push to this repo reaches
26
+ # production immediately. Nothing to bump; what these
27
+ # need is a canary, not a PR. See `risk` below.
28
+ # gem `gem "jekyll-theme-zer0", "~> X.Y.Z"` — the theme is
29
+ # resolved from RubyGems, not GitHub. Bumping means
30
+ # editing a Gemfile and re-locking. This is the mode the
31
+ # scheduled updater matters most for: no remote_theme
32
+ # means no automatic pickup of anything, ever.
33
+ # path `gem "jekyll-theme-zer0", path: ...` — a local
34
+ # checkout for development. Never version-pinned and
35
+ # never bumped; listed so audits don't flag it.
36
+ #
37
+ # ------------------------------------------------------------------------------
38
+ # Pin kinds (scripts/bin/propagate knows how to read/rewrite each)
39
+ # ------------------------------------------------------------------------------
40
+ # remote_theme `remote_theme: "bamr87/zer0-mistakes@vX.Y.Z"` in a config
41
+ # hub_registry `theme_repo: bamr87/zer0-mistakes@vX.Y.Z` in _data/hub.yml
42
+ # gem_constraint `gem 'jekyll-theme-zer0', '~> X.Y.Z'` in a Gemfile
43
+ # theme_name `theme: "jekyll-theme-zer0"` — names the gem, carries no
44
+ # version; tracked so a bump doesn't miss the config that
45
+ # activates it
46
+ # path_gem local path gem, unversioned (development only)
47
+ # ==============================================================================
48
+
49
+ version: 1
50
+
51
+ defaults:
52
+ branch: main
53
+ # repository_dispatch event type consumers listen for. Their side of the
54
+ # contract lives in templates/consumer/theme-bump.yml.
55
+ dispatch_event: theme-release
56
+
57
+ consumers:
58
+ # ---------------------------------------------------------------------------
59
+ - repo: bamr87/it-journey
60
+ mode: remote_theme_floating
61
+ site: https://it-journey.dev
62
+ dispatch: false
63
+ risk: >-
64
+ 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.
69
+ pins:
70
+ - file: _config.yml
71
+ kind: remote_theme
72
+ note: line 36, no tag — floats main
73
+
74
+ # ---------------------------------------------------------------------------
75
+ - repo: bamr87/lifehacker.dev
76
+ mode: remote_theme_floating
77
+ site: https://lifehacker.dev
78
+ dispatch: false
79
+ risk: >-
80
+ Unpinned, same exposure as it-journey. Small override surface (2 includes).
81
+ Recommend pinning and joining the fan-out.
82
+ pins:
83
+ - file: _config.yml
84
+ kind: remote_theme
85
+ note: line 40, no tag — floats main
86
+
87
+ # ---------------------------------------------------------------------------
88
+ - repo: bamr87/bashconsultants
89
+ mode: gem
90
+ site: https://bashconsultants.com
91
+ dispatch: true
92
+ note: >-
93
+ Three stacks, three theme surfaces: GitHub Pages uses the pinned
94
+ remote_theme, Azure Static Web Apps resolves the published gem via
95
+ Gemfile.azure + _config.azure.yml, and local dev mounts a path gem. A bump
96
+ must move the remote_theme tag and the gem constraint together or the two
97
+ production stacks render different theme versions.
98
+ pins:
99
+ - file: _config.yml
100
+ kind: remote_theme
101
+ note: line 31
102
+ - file: Gemfile.azure
103
+ kind: gem_constraint
104
+ note: line 9 — must match the remote_theme tag
105
+ - file: _config.azure.yml
106
+ kind: theme_name
107
+ note: line 3 — activates the gem; no version of its own
108
+ - file: Gemfile
109
+ kind: path_gem
110
+ note: line 40 — dev checkout via ZER0_MISTAKES_PATH; never bumped
111
+
112
+ # ---------------------------------------------------------------------------
113
+ - repo: year-of-ai/year-of-ai.github.io
114
+ mode: remote_theme_pinned
115
+ site: https://year-of-ai.github.io
116
+ dispatch: true
117
+ fans_out_to_members: true
118
+ note: >-
119
+ An org hub, not just a site. Its _data/hub.yml theme_repo is the value
120
+ stamped into every member repo's _config.yml by scripts/provision-org-sites.rb,
121
+ so one bump here re-rolls the whole org (12 sites). The hub's own
122
+ _config.yml and hub.yml must move together — they are read by different
123
+ code paths and drift silently otherwise.
124
+ pins:
125
+ - file: _config.yml
126
+ kind: remote_theme
127
+ note: line 40
128
+ - file: _data/hub.yml
129
+ kind: hub_registry
130
+ note: "line 42 (pages.theme_repo) — re-roll members after bumping"
131
+
132
+ # ---------------------------------------------------------------------------
133
+ - repo: ai-world-view/ai-world-view.github.io
134
+ mode: remote_theme_pinned
135
+ site: https://ai-world-view.github.io
136
+ dispatch: true
137
+ fans_out_to_members: true
138
+ note: >-
139
+ Same two-file hub shape as year-of-ai; members join by auto_discover, so
140
+ the member count grows without this file changing.
141
+ pins:
142
+ - file: _config.yml
143
+ kind: remote_theme
144
+ note: line 35
145
+ - file: _data/hub.yml
146
+ kind: hub_registry
147
+ note: "line 39 (pages.theme_repo) — re-roll members after bumping"
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.25.0
4
- # Last Updated: 2026-07-03
3
+ # Version: 1.26.0
4
+ # Last Updated: 2026-07-17
5
5
 
6
6
  features:
7
7
  # ============================================================================
@@ -80,7 +80,7 @@ features:
80
80
  issue: null
81
81
  tests:
82
82
  - "test/test_installer.sh"
83
- - "test/test_installation.sh"
83
+ - "test/test_install_legacy_flags.sh"
84
84
  references:
85
85
  script: "install.sh"
86
86
  cli: "scripts/bin/install"
@@ -106,13 +106,13 @@ features:
106
106
 
107
107
  - id: ZER0-004
108
108
  title: "AI Preview Image Generator"
109
- description: "AI-powered automatic preview image generation for posts using OpenAI gpt-image-2 / DALL-E, Stability AI, xAI, or local placeholders. Configurable assets prefix, retro pixel art defaults, batch regeneration"
109
+ description: "Claude-orchestrated preview-image engine: Claude analyzes each article into an art brief and vision-reviews the render (one corrective regeneration), while OpenAI gpt-image-2 / DALL-E (default), xAI, Stability AI, Google Gemini, or a deterministic local template renders. Per-author styles, batch regeneration"
110
110
  implemented: true
111
- version: "1.5.0"
111
+ version: "1.27.0"
112
112
  link: "/docs/features/preview-image-generator/"
113
113
  docs: "/docs/features/preview-image-generator/"
114
- tags: [ai, images, automation, openai, content]
115
- date: 2025-01-28
114
+ tags: [ai, images, automation, claude, openai, content]
115
+ date: 2026-07-12
116
116
  provenance:
117
117
  introduced_in: "1.5.0"
118
118
  pr: 83
@@ -120,9 +120,11 @@ features:
120
120
  issue: null
121
121
  tests:
122
122
  - "test/test_core.sh"
123
+ - "test/test_preview_generator.py"
123
124
  references:
124
- plugin: "_plugins/preview_image_generator.rb"
125
+ engine: "scripts/lib/preview_generator.py"
125
126
  script: "scripts/generate-preview-images.sh"
127
+ rasterizer: "scripts/dev/rasterize-svg.js"
126
128
  install: "scripts/install-preview-generator.sh"
127
129
  config: "_config.yml"
128
130
  include: "_includes/components/preview-image.html"
@@ -130,25 +132,33 @@ features:
130
132
  script: "scripts/install-preview-generator.sh"
131
133
  config_section: "preview_images"
132
134
  dependencies:
133
- required: [curl, jq]
134
- optional: [yq, python3]
135
+ required: [python3, pyyaml]
136
+ optional: [librsvg, inkscape, imagemagick, node]
137
+ orchestration:
138
+ name: claude
139
+ description: "Claude analyzes articles into art briefs and vision-reviews renders (prompt_engine/review_engine)"
140
+ env_var: CLAUDE_CODE_OAUTH_TOKEN
135
141
  providers:
136
142
  - name: openai
137
- description: "OpenAI gpt-image-2 / DALL-E 3 image generation"
143
+ description: "OpenAI gpt-image-2 / DALL-E 3 image generation (default renderer; + --enhance edits)"
138
144
  env_var: OPENAI_API_KEY
139
- - name: stability
140
- description: "Stability AI Stable Diffusion"
141
- env_var: STABILITY_API_KEY
142
145
  - name: xai
143
146
  description: "xAI Grok image generation"
144
147
  env_var: XAI_API_KEY
148
+ - name: stability
149
+ description: "Stability AI Stable Diffusion"
150
+ env_var: STABILITY_API_KEY
151
+ - name: gemini
152
+ description: "Google Gemini image generation"
153
+ env_var: GEMINI_API_KEY
145
154
  - name: local
146
- description: "Local placeholder (no API needed)"
155
+ description: "Deterministic template SVG/PNG (no API needed)"
147
156
  env_var: null
148
157
  features:
149
- - "Multiple AI provider support"
150
- - "Automatic image optimization"
151
- - "Retro pixel art default style"
158
+ - "Claude orchestration: article analysis into art briefs + vision review with one corrective regeneration"
159
+ - "Five-renderer framework with per-vendor model validation"
160
+ - "Graceful degradation to template prompts without a Claude credential"
161
+ - "Retro pixel art default style with per-author overrides"
152
162
  - "Front matter integration"
153
163
  - "Batch processing"
154
164
 
@@ -1403,14 +1413,14 @@ features:
1403
1413
  - "Optional Ruby plugin for self-builds"
1404
1414
 
1405
1415
  - id: ZER0-045
1406
- title: "Obsidian Local Graph Panel"
1407
- description: "Standalone neighborhood graph view for the current note, extracted as a reusable include for sidebars and modals"
1416
+ title: "Obsidian Graph Views (Full + Local)"
1417
+ description: "Obsidian-desktop-style graph views: a full site graph with a Filters/Display/Forces settings panel, collection legend-filters, tag:/path: search, zoom + fullscreen controls and hover previews, plus a per-page local graph panel with depth and direction controls"
1408
1418
  implemented: true
1409
- version: "1.4.0"
1419
+ version: "1.28.0"
1410
1420
  link: "/docs/obsidian/graph/"
1411
1421
  docs: "/docs/obsidian/graph/"
1412
1422
  tags: [obsidian, graph, visualization, navigation]
1413
- date: 2026-03-25
1423
+ date: 2026-08-08
1414
1424
  provenance:
1415
1425
  introduced_in: "1.4.0"
1416
1426
  pr: 77
@@ -1418,13 +1428,22 @@ features:
1418
1428
  issue: null
1419
1429
  tests:
1420
1430
  - "test/test_obsidian.sh"
1421
- - "test/visual/features/obsidian-callouts.spec.js"
1431
+ - "test/visual/features/obsidian-graph.spec.js"
1422
1432
  references:
1423
1433
  includes:
1424
1434
  - "_includes/obsidian/full-graph.html"
1425
1435
  - "_includes/navigation/local-graph.html"
1426
1436
  scripts:
1427
1437
  - "assets/js/obsidian-graph.js"
1438
+ - "assets/js/obsidian-local-graph.js"
1439
+ styles:
1440
+ - "_sass/core/_obsidian.scss"
1441
+ features:
1442
+ - "Filters: search with tag:/path: operators, per-collection toggles generated from the wiki-index (count + color swatch = legend), show-orphans, show-unresolved"
1443
+ - "Display: link arrows, node size, link thickness, label fade threshold — applied live"
1444
+ - "Forces: repel force + link distance sliders with animated re-layout; settings persist to localStorage"
1445
+ - "Hover preview card, zoom/fit/fullscreen stack, live dark-mode restyling"
1446
+ - "Local graph: depth selector (1-3) + outgoing/incoming switches, re-rendered in place"
1428
1447
 
1429
1448
  # ============================================================================
1430
1449
  # SETUP, NAVIGATION & DEVELOPER UX (v0.20+)
@@ -2137,3 +2156,103 @@ features:
2137
2156
  - "Appearance tab: one-click color mode, 9 theme skins, background layer opacity, primary color"
2138
2157
  - "Site tab: environment badge, copyable page URL, quick links, theme & build info, admin links"
2139
2158
  - "Developer tab: breadcrumb page location, page metadata, source-code shortcuts"
2159
+
2160
+ - id: ZER0-078
2161
+ title: "AI-Generated Multilingual Translations"
2162
+ description: "Build-time translation pipeline: English stays the only human-maintained language while scripts/translate.rb (Claude Code OAuth) generates alternate-language pages, UI strings, and the manifest behind the language toggle"
2163
+ implemented: true
2164
+ version: "1.27.0"
2165
+ link: "/"
2166
+ docs: "https://github.com/bamr87/zer0-mistakes/blob/main/docs/systems/multilingual-translation.md"
2167
+ tags: [i18n, ai, automation, content, ui]
2168
+ date: 2026-07-17
2169
+ provenance:
2170
+ introduced_in: "1.27.0"
2171
+ pr: 316
2172
+ commit: "01dc8fa"
2173
+ issue: null
2174
+ tests:
2175
+ - "test/test_i18n.sh"
2176
+ - "test/visual/features/language-toggle.spec.js"
2177
+ references:
2178
+ includes:
2179
+ - "_includes/core/i18n.html"
2180
+ - "_includes/core/hreflang.html"
2181
+ - "_includes/components/language-toggle.html"
2182
+ - "_includes/components/translation-notice.html"
2183
+ scripts:
2184
+ - "scripts/translate.rb"
2185
+ workflows:
2186
+ - ".github/workflows/translate.yml"
2187
+ data:
2188
+ - "_data/ui-text.yml"
2189
+ - "_data/i18n/languages.yml"
2190
+ docs: "docs/systems/multilingual-translation.md"
2191
+ features:
2192
+ - "One large full-translation job (workflow_dispatch) plus bounded incremental runs when English content changes"
2193
+ - "Manifest-driven SHA change detection, pruning of deleted sources, and generated /fr<en-url> permalinks (GitHub Pages safe-mode friendly)"
2194
+ - "Markdown-safe segment translation: code, Liquid, wiki-links and URLs masked as placeholders and validated"
2195
+ - "Navbar language toggle with availability states, hreflang alternates, per-page html lang, machine-translation notice"
2196
+
2197
+ - id: ZER0-079
2198
+ title: "Config-Driven Favicon and Browser Identity"
2199
+ description: "Head include emitting favicon, SVG icon, Apple touch icon, web manifest, and theme-color tags from an optional favicon config block, with an explicit /favicon.ico fallback that works on baseurl deployments"
2200
+ implemented: true
2201
+ version: "1.28.0"
2202
+ link: "/"
2203
+ docs: "/docs/features/favicon/"
2204
+ tags: [seo, branding, ui, configuration]
2205
+ date: 2026-07-22
2206
+ provenance:
2207
+ introduced_in: "1.28.0"
2208
+ pr: null
2209
+ commit: "a11e29f"
2210
+ issue: null
2211
+ tests:
2212
+ - "test/test_core.sh"
2213
+ references:
2214
+ includes:
2215
+ - "_includes/core/favicon.html"
2216
+ - "_includes/core/head.html"
2217
+ docs: "pages/_docs/features/favicon.md"
2218
+ features:
2219
+ - "Zero-config default: explicit /favicon.ico link on every page (fixes silent 404s and baseurl project sites)"
2220
+ - "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"
2222
+
2223
+ - id: ZER0-080
2224
+ title: "Books Collection — Children's Picture-Book Publishing"
2225
+ description: "A `books` collection with immersive cover-to-cover layouts: book landing page (cover hero + TOC), story reading pages with illustration plates and prev/next navigation, bookshelf components, and AI-provenance colophons whose front matter doubles as the image-generation manifest"
2226
+ implemented: true
2227
+ version: "1.28.0"
2228
+ link: "/books/zer0-tales/"
2229
+ docs: "/docs/features/book-collection/"
2230
+ tags: [books, collections, layouts, storybook, ai-images, children]
2231
+ date: 2026-07-22
2232
+ provenance:
2233
+ introduced_in: "1.28.0"
2234
+ pr: 328
2235
+ commit: "1b521f6"
2236
+ issue: null
2237
+ tests:
2238
+ - "test/visual/features/books.spec.js"
2239
+ - "pages/_books/zer0-tales/index.md"
2240
+ references:
2241
+ layouts:
2242
+ - "_layouts/book.html"
2243
+ - "_layouts/book-story.html"
2244
+ includes:
2245
+ - "_includes/components/bookshelf.html"
2246
+ - "_includes/components/book-card.html"
2247
+ - "_includes/components/book-toc.html"
2248
+ - "_includes/components/book-nav.html"
2249
+ - "_includes/components/book-plate.html"
2250
+ styles:
2251
+ - "_sass/components/_book.scss"
2252
+ config: "_config.yml"
2253
+ docs: "pages/_docs/features/book-collection.md"
2254
+ features:
2255
+ - "Book = folder of chapters + index.md; numeric chapter: front matter drives TOC and prev/next ordering (no dates needed)"
2256
+ - "Immersive sidebar-free reading surface: storybook serif, responsive type scale, drop cap, plate styling for bare markdown images"
2257
+ - "illustrations: front matter renders a collapsed prompt colophon — the same list drives OpenAI image generation on consumer sites (drsai)"
2258
+ - "Demo book The Tales of Zer0 ships with the theme; reference platform: bamr87/drsai with Dodge & Reena as the test book"
data/_data/i18n/fr.yml ADDED
@@ -0,0 +1,98 @@
1
+ # ================================================================
2
+ # GENERATED FILE — do not edit by hand.
3
+ # Machine-translated UI strings (fr) produced by
4
+ # scripts/translate.rb from _data/ui-text.yml (en). Regenerate via
5
+ # the Translate workflow or: ruby scripts/translate.rb --langs fr
6
+ # ================================================================
7
+ skip_links: Liens d'évitement
8
+ skip_primary_nav: Aller à la navigation principale
9
+ skip_content: Aller au contenu
10
+ skip_main_content: Aller au contenu principal
11
+ skip_footer: Aller au pied de page
12
+ page: Page
13
+ pagination_previous: Précédent
14
+ pagination_next: Suivant
15
+ breadcrumb_home_label: Accueil
16
+ breadcrumb_separator: "/"
17
+ menu_label: Afficher/masquer le menu
18
+ search_label: Afficher/masquer la recherche
19
+ toc_label: Sur cette page
20
+ ext_link_label: Lien direct
21
+ less_than: moins de
22
+ minute_read: minute de lecture
23
+ share_on_label: Partager sur
24
+ tags_label: 'Étiquettes :'
25
+ categories_label: 'Catégories :'
26
+ date_label: 'Mis à jour :'
27
+ author_label: 'Auteur :'
28
+ comments_label: Laisser un commentaire
29
+ comments_title: Commentaires
30
+ more_label: En savoir plus
31
+ related_label: Vous aimerez peut-être aussi
32
+ follow_label: 'Suivre :'
33
+ feed_label: Flux
34
+ powered_by: Propulsé par
35
+ website_label: Site web
36
+ email_label: E-mail
37
+ recent_posts: Articles récents
38
+ undefined_wpm: Paramètre words_per_minute non défini dans _config.yml
39
+ comment_form_info: Votre adresse e-mail ne sera pas publiée. Les champs obligatoires
40
+ sont indiqués
41
+ comment_form_comment_label: Commentaire
42
+ comment_form_md_info: Le Markdown est pris en charge.
43
+ comment_form_name_label: Nom
44
+ comment_form_email_label: Adresse e-mail
45
+ comment_form_website_label: Site web (facultatif)
46
+ comment_btn_submit: Envoyer le commentaire
47
+ comment_btn_submitted: Envoyé
48
+ comment_success_msg: Merci pour votre commentaire ! Il apparaîtra sur le site une
49
+ fois approuvé.
50
+ comment_error_msg: Désolé, une erreur s'est produite lors de l'envoi. Veuillez vérifier
51
+ que tous les champs obligatoires sont remplis et réessayer.
52
+ loading_label: Chargement...
53
+ search_label_text: Saisissez votre terme de recherche...
54
+ search_placeholder_text: Saisissez votre terme de recherche...
55
+ search_no_results: Aucun résultat
56
+ results_found: Résultat(s) trouvé(s)
57
+ back_to_top: Retour en haut
58
+ stats_total_posts: Total des articles
59
+ stats_total_pages: Total des pages
60
+ stats_categories: Catégories
61
+ stats_tags: Étiquettes
62
+ stats_last_updated: Dernière mise à jour
63
+ stats_overview: Aperçu
64
+ stats_content_breakdown: Répartition du contenu
65
+ theme_toggle: Changer de thème
66
+ dark_mode: Mode sombre
67
+ light_mode: Mode clair
68
+ view_source: Voir la source
69
+ edit_page: Modifier cette page
70
+ report_issue: Signaler un problème
71
+ breadcrumbs_root: Accueil
72
+ breadcrumbs_aria: Fil d'Ariane
73
+ shortcuts_title: Raccourcis clavier
74
+ shortcuts_search: Ouvrir la recherche
75
+ shortcuts_prev_section: Section précédente
76
+ shortcuts_next_section: Section suivante
77
+ shortcuts_toggle_sidebar: Afficher/masquer la barre latérale
78
+ shortcuts_toggle_toc: Afficher/masquer la table des matières
79
+ shortcuts_show_help: Afficher cette aide
80
+ home_label: Accueil
81
+ main_nav_label: Navigation principale
82
+ search_button_label: Rechercher
83
+ settings_button_label: Paramètres
84
+ toc_title: Table des matières
85
+ published_label: Publié
86
+ updated_label: Mis à jour
87
+ reading_time_label: 'Temps de lecture estimé :'
88
+ reading_time_minute: minute
89
+ share_label: Partager
90
+ copy_link_label: Copier le lien
91
+ improve_label: Améliorer
92
+ edit_on_github: Modifier sur GitHub
93
+ lang_toggle_label: Langue
94
+ lang_toggle_aria: Changer de langue
95
+ lang_not_available: Pas encore traduit
96
+ machine_translation_notice: Cette page a été traduite automatiquement à partir de
97
+ l'original en anglais.
98
+ machine_translation_view_source: Voir l'original