jekyll-theme-zer0 1.12.0 → 1.12.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -28
- data/README.md +14 -6
- data/_data/backlog.yml +111 -12
- data/_data/roadmap.yml +62 -6
- data/_includes/components/mermaid.html +1 -1
- data/_layouts/search.html +5 -0
- data/scripts/bin/validate +3 -1
- data/scripts/generate-roadmap.rb +5 -3
- data/scripts/lib/changelog.sh +49 -8
- data/scripts/sync-backlog.rb +1 -1
- data/scripts/test/integration/auto-version +73 -107
- data/scripts/test/integration/mermaid +13 -19
- data/scripts/test/lib/test_changelog.sh +68 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fbc99ee38514486f868b91a616bcfece9ab588d4c27c18f358592c12bac98225
|
|
4
|
+
data.tar.gz: 864ff57c952cfb6c6761ab4b140545401f762bb8485d192c48a31ffee1e9ab65
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ad7d6da5e0c707aa5ea232e5d3a714bbd0ed3955cc220d950dec7103715665a4e9a799f9a028e2eb57e1f161b0bf286dd39a5d145110f0a2936067405a698aae
|
|
7
|
+
data.tar.gz: b5428a640a6a5aee60e170d4c69780e3538704575a9a1ff2d23d26c9583429f0e2ad1da79185906260e75a60092f4d88b139e01fa2b7cf954fa9a77258f2879b
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.12.2] - 2026-06-10
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Version bump: patch release
|
|
7
|
+
|
|
8
|
+
### Commits in this release
|
|
9
|
+
- 846bd9ff chore(backlog): plan the Zer0-Mistake Quality Framework (roadmap v1.13, T-012–T-015) (#133)
|
|
10
|
+
- 33a727c0 docs: expand CLAUDE.md into a comprehensive Claude Code guide (#131)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## [1.12.1] - 2026-06-10
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Version bump: patch release
|
|
17
|
+
|
|
18
|
+
### Commits in this release
|
|
19
|
+
- 0c04f703 fix: repair failing test suites, validator crashes, and roadmap/changelog drift (#132)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
All notable changes to this project will be documented in this file.
|
|
23
|
+
|
|
24
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
25
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
26
|
+
|
|
27
|
+
## [Unreleased]
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
- **Zer0-Mistake Quality Framework (planning)**: new roadmap milestone v1.13 and backlog tasks T-012–T-015 to close the gap between the repo's quality gates and what CI enforces — CI gate parity with the canonical `./scripts/bin/test` entrypoint (whose integration suites previously rotted unnoticed), re-armed pixel-snapshot and docs link-check gates, and a locale-independence regression guard; coverage baseline task T-005 repointed at the new milestone
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
- **Tooling encoding**: `generate-roadmap.rb`, `sync-backlog.rb`, and `scripts/bin/validate` now read repo files as UTF-8 explicitly, fixing `invalid byte sequence in US-ASCII` crashes in environments without a UTF-8 locale (minimal containers, some CI runners) — `generate-roadmap.sh --check` and `validate --quick` both crashed in such environments
|
|
34
|
+
- **Test suite**: repaired the three test suites that failed on `main`:
|
|
35
|
+
- `scripts/test/integration/auto-version` rewritten against the current release architecture (`scripts/analyze-commits.sh` wrapper, `scripts/utils/analyze-commits`, `scripts/bin/release`, `version-bump.yml`) — it previously targeted the retired `gem-publish.sh`/`auto-version-bump.yml` and aborted under `set -e` due to `((var++))` returning non-zero
|
|
36
|
+
- `scripts/test/integration/mermaid` repointed at `pages/_docs/features/mermaid-diagrams.md` (the doc moved from `pages/_docs/jekyll/`) and at the current Bootstrap-aware theming instead of the removed forest theme/FontAwesome config
|
|
37
|
+
- `_layouts/search.html` given a front matter block so theme layout validation passes
|
|
38
|
+
- **Changelog tooling**: `update_changelog_file` now folds any pending `## [Unreleased]` section into the new release entry and inserts before the first release heading (preserving the file preamble) — stale Unreleased blocks no longer accumulate mid-file; the eight historical stray blocks were folded into the releases that shipped them
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- **Roadmap**: advanced to track the shipped gem — v1.9 marked completed, v1.10 (Roadmap Validation) and v1.11 (Continuous-Evolution Loop) recorded, v1.12 (Headless Endpoints) is the active milestone (closes backlog T-001, T-002)
|
|
42
|
+
- **Changelog**: restored the Keep a Changelog preamble at the top of this file
|
|
43
|
+
|
|
3
44
|
## [1.12.0] - 2026-06-03
|
|
4
45
|
|
|
5
46
|
### Changed
|
|
@@ -37,9 +78,6 @@
|
|
|
37
78
|
### Commits in this release
|
|
38
79
|
- 8a5ba7e2 feat(ci): add continuous-evolution backlog loop (#114)
|
|
39
80
|
|
|
40
|
-
|
|
41
|
-
## [Unreleased]
|
|
42
|
-
|
|
43
81
|
### Added
|
|
44
82
|
- **Continuous-evolution loop**: a self-sustaining backlog mechanism so AI agents can keep improving the repo between human sessions.
|
|
45
83
|
- `_data/backlog.yml` — tactical task queue (single source of truth), mirroring the `_data/roadmap.yml` pattern.
|
|
@@ -50,6 +88,8 @@
|
|
|
50
88
|
- `.github/instructions/backlog.instructions.md` — file-scoped guidance for the backlog.
|
|
51
89
|
- `docs/systems/continuous-evolution.md` — full design, autonomy policy, and setup.
|
|
52
90
|
- `CLAUDE.md` — Claude Code pointer to `AGENTS.md` (per the documented convention).
|
|
91
|
+
|
|
92
|
+
|
|
53
93
|
## [1.10.0] - 2026-06-01
|
|
54
94
|
|
|
55
95
|
### Changed
|
|
@@ -153,9 +193,6 @@
|
|
|
153
193
|
### Commits in this release
|
|
154
194
|
- 8a2bd84 feat(install): modular installer with deploy plugins, AI wizard pipeline, scrape v2, and test suite (#111)
|
|
155
195
|
|
|
156
|
-
|
|
157
|
-
## [Unreleased]
|
|
158
|
-
|
|
159
196
|
### Added
|
|
160
197
|
- **Modular installer (`scripts/install/`)**: spec-driven, AI-aware installer dispatched by `scripts/bin/install`. Single `.zer0/install.spec.json` contract feeds CLI flags, the TUI wizard, and the OpenAI wizard into one apply pipeline.
|
|
161
198
|
- **Deploy plugins**: `tasks/deploy_github-pages.sh`, `tasks/deploy_azure-swa.sh`, `tasks/deploy_docker-prod.sh`. Spec deploy targets now auto-render the matching workflow / config from `templates/deploy/`.
|
|
@@ -171,17 +208,16 @@
|
|
|
171
208
|
- Rewrote `ai/prompts/wizard.system.md` with explicit profile, deploy, and agent heuristics plus a full example output, eliminating empty AI responses.
|
|
172
209
|
- `plan_load_profile` and `plan_apply_flags` now return `0` explicitly so Bash 3.2 doesn't propagate a trailing-test exit code.
|
|
173
210
|
|
|
211
|
+
|
|
174
212
|
## [1.8.2] - 2026-05-26
|
|
175
213
|
|
|
176
214
|
### Changed
|
|
177
215
|
- Version bump: patch release
|
|
178
216
|
|
|
179
|
-
|
|
180
|
-
## [Unreleased]
|
|
181
|
-
|
|
182
217
|
### Changed
|
|
183
218
|
- **Gem packaging**: `jekyll-theme-zer0.gemspec` now excludes `assets/images/` (287 MB of content previews/author photos), `assets/backgrounds/`, `.DS_Store` files, and binary media outside `assets/vendor/`, reducing gem payload to ~8.9 MB
|
|
184
219
|
|
|
220
|
+
|
|
185
221
|
## [1.8.1] - 2026-05-26
|
|
186
222
|
|
|
187
223
|
### Changed
|
|
@@ -217,9 +253,6 @@
|
|
|
217
253
|
### Commits in this release
|
|
218
254
|
- 580f2b4 perf: Jekyll build performance improvements + MathJax 3 fix + richer Obsidian cache (#100)
|
|
219
255
|
|
|
220
|
-
|
|
221
|
-
## [Unreleased]
|
|
222
|
-
|
|
223
256
|
### Added
|
|
224
257
|
- **Design system & layouts**: Sass token layers (`_sass/tokens/`), component and layout partials (`_sass/components/`, `_sass/layouts/`), skins (`theme_skins.yml` + `_sass/theme/_skins.scss`), utilities, and developer docs (`docs/design-system.md`, `design-tokens.md`, `theming.md`, `layouts-and-navigation.md`, and related guides). Homepage sections are driven by `_data/landing.yml` per `_includes/components/README.md`.
|
|
225
258
|
- **Navigation & chrome**: Drawer/TOC FAB and sidebar visibility modules (`assets/js/modules/navigation/`), `appearance.js` theme helper, refreshed navbar/footer/breadcrumb markup aligned with Bootstrap 5.3.
|
|
@@ -261,6 +294,7 @@
|
|
|
261
294
|
### Fixed (UI)
|
|
262
295
|
- **Contrast skin — light mode**: The `contrast` skin's `zer0-skin-palette` mixin sets `--bs-link-color: #ffffff` (white accent) which rendered sidebar nav links invisible on a white background in light mode. Added `[data-theme-skin="contrast"]:not([data-bs-theme="dark"])` override in `_sass/theme/_skins.scss` to pin link color to `#111111` in light mode while leaving dark-mode behavior unchanged.
|
|
263
296
|
|
|
297
|
+
|
|
264
298
|
## [1.6.5] - 2026-05-19
|
|
265
299
|
|
|
266
300
|
### Changed
|
|
@@ -394,9 +428,6 @@
|
|
|
394
428
|
- 3d91006 fix(release): replace ((var++)) with var=$((var + 1)) in release path
|
|
395
429
|
- d33e5e6 feat(intro): refocus Copilot Agent prompts on frontend/CMS workflows (#74)
|
|
396
430
|
|
|
397
|
-
|
|
398
|
-
## [Unreleased]
|
|
399
|
-
|
|
400
431
|
### Changed
|
|
401
432
|
- **Docker/Jekyll build performance** — Reduced repeated full-page Liquid scans in the footer, settings offcanvas, and cookie consent includes; cached preview image checks during generation; skipped server-side Obsidian rewrites for documents without Obsidian syntax; and changed Docker dev startup to run `bundle install` only when `bundle check` reports missing dependencies. The profiled Docker build improved from 119.2s to 86.8s in local validation.
|
|
402
433
|
|
|
@@ -501,6 +532,7 @@
|
|
|
501
532
|
`/#setup-wizard`, which is provided by the new welcome layout.
|
|
502
533
|
- **Version-bump workflow no longer crashes on bash 5.x runners.** `scripts/utils/analyze-commits` (and `scripts/lib/changelog.sh`, `scripts/lib/migrate.sh`) used the `((var++))` post-increment idiom. On bash 5.x, when `var` is 0 the expression evaluates to 0 → exit code 1 → `set -euo pipefail` terminates the script silently. macOS bash 3.2 was more forgiving, so the bug only surfaced in CI. Replaced all release-path sites with `var=$((var + 1))`, which always returns 0. Added a static regression check to the unit tests so the pattern can't return.
|
|
503
534
|
|
|
535
|
+
|
|
504
536
|
## [1.0.0] - 2026-04-20
|
|
505
537
|
|
|
506
538
|
First stable major release. Consolidates the breaking-change installer rewrite
|
|
@@ -573,9 +605,6 @@ See [`docs/installation/migration-from-0.x.md`](docs/installation/migration-from
|
|
|
573
605
|
### Commits in this release
|
|
574
606
|
- 7f00e4d docs(roadmap): data-driven roadmap with auto-generated README mermaid diagram (#71)
|
|
575
607
|
|
|
576
|
-
|
|
577
|
-
## [Unreleased]
|
|
578
|
-
|
|
579
608
|
### Changed
|
|
580
609
|
- **Copilot Agent prompts (`_data/prompts.yml`)**: rewritten to focus on
|
|
581
610
|
frontend/CMS workflows for the Jekyll theme. Replaced the previous
|
|
@@ -625,6 +654,7 @@ See [`docs/installation/migration-from-0.x.md`](docs/installation/migration-from
|
|
|
625
654
|
- **Fork cleanup**: `scripts/fork-cleanup.sh` — `posthog`/`giscus` blocks reset only within their own YAML range (no stray matches in unrelated blocks)
|
|
626
655
|
- **Welcome post**: `templates/pages/welcome-post.md.template` and embedded fallback in `scripts/fork-cleanup.sh` — corrected `layout: journals` → `layout: article` so the generated welcome post builds without “Layout does not exist” warnings on a freshly cleaned fork
|
|
627
656
|
|
|
657
|
+
|
|
628
658
|
## [0.22.20] - 2026-04-19
|
|
629
659
|
|
|
630
660
|
### Changed
|
|
@@ -766,9 +796,6 @@ See [`docs/installation/migration-from-0.x.md`](docs/installation/migration-from
|
|
|
766
796
|
### Commits in this release
|
|
767
797
|
- a70ae8a chore: consolidate configuration, dependencies, and installation (PRs #48, #51, #52, #53) (#51)
|
|
768
798
|
|
|
769
|
-
|
|
770
|
-
## [Unreleased] — Universal Installer
|
|
771
|
-
|
|
772
799
|
### Added
|
|
773
800
|
- **Installer**: New `--remote` install mode — forks repo and creates an orphan `gh-pages` branch with only the bare minimum files needed to render via `remote_theme` (no local theme source)
|
|
774
801
|
- **Installer**: New `--github` install mode — interactive fork via `gh` CLI with automatic platform detection and setup
|
|
@@ -793,6 +820,7 @@ See [`docs/installation/migration-from-0.x.md`](docs/installation/migration-from
|
|
|
793
820
|
- **Templates**: `configuration.md.template` — comprehensive rewrite with URL tables, all config sections, cookie consent, dev config
|
|
794
821
|
- **Templates**: `welcome-post.md.template` — enhanced Day 1 tutorial with folder structure diagram, commands table, feature checklist
|
|
795
822
|
|
|
823
|
+
|
|
796
824
|
## [0.22.6] - 2026-04-03
|
|
797
825
|
|
|
798
826
|
### Changed
|
|
@@ -2376,13 +2404,6 @@ See [`docs/installation/migration-from-0.x.md`](docs/installation/migration-from
|
|
|
2376
2404
|
- Initial plan
|
|
2377
2405
|
- Initial plan
|
|
2378
2406
|
|
|
2379
|
-
All notable changes to this project will be documented in this file.
|
|
2380
|
-
|
|
2381
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
2382
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
2383
|
-
|
|
2384
|
-
## [Unreleased]
|
|
2385
|
-
|
|
2386
2407
|
### Added
|
|
2387
2408
|
|
|
2388
2409
|
- Comprehensive documentation organization system in `/docs/` directory
|
|
@@ -2394,6 +2415,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
2394
2415
|
- Migrated scattered documentation files to organized structure
|
|
2395
2416
|
- Improved documentation discoverability and maintenance
|
|
2396
2417
|
|
|
2418
|
+
|
|
2397
2419
|
## [0.5.0] - 2025-10-25
|
|
2398
2420
|
|
|
2399
2421
|
### Added
|
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
title: zer0-mistakes
|
|
3
3
|
sub-title: AI-Native Jekyll Theme
|
|
4
4
|
description: AI-native Jekyll theme for GitHub Pages — Docker-first development, AI-powered installation, multi-agent integration (Copilot, Codex, Cursor, Claude), AI preview-image generation, and AIEO content optimization with Bootstrap 5.3.
|
|
5
|
-
version: 1.12.
|
|
5
|
+
version: 1.12.2
|
|
6
6
|
layout: landing
|
|
7
7
|
tags:
|
|
8
8
|
- jekyll
|
|
@@ -20,7 +20,7 @@ categories:
|
|
|
20
20
|
- bootstrap
|
|
21
21
|
- ai-tooling
|
|
22
22
|
created: 2024-02-10T23:51:11.480Z
|
|
23
|
-
lastmod: 2026-06-
|
|
23
|
+
lastmod: 2026-06-10T22:17:20.000Z
|
|
24
24
|
draft: false
|
|
25
25
|
permalink: /
|
|
26
26
|
slug: zer0
|
|
@@ -827,9 +827,13 @@ gantt
|
|
|
827
827
|
v1.6 About Page & Search Cleanup :done, 2026-04, 2026-04
|
|
828
828
|
v1.7 Build Performance & MathJax 3 :done, 2026-05, 2026-05
|
|
829
829
|
v1.8 Design Tokens & Navigation Chrome :done, 2026-05, 2026-05
|
|
830
|
+
v1.9 Installer v2 & Site Scraper :done, 2026-05, 2026-05
|
|
831
|
+
v1.10 Roadmap Validation :done, 2026-06, 2026-06
|
|
832
|
+
v1.11 Continuous-Evolution Loop :done, 2026-06, 2026-06
|
|
830
833
|
section Current
|
|
831
|
-
v1.
|
|
834
|
+
v1.12 Headless Endpoints :active, 2026-06, 2026-06
|
|
832
835
|
section Future
|
|
836
|
+
v1.13 Zer0-Mistake Quality Framework :2026-06, 2026-08
|
|
833
837
|
v2.0 CMS Integration :2026-06, 2026-08
|
|
834
838
|
v2.1 i18n Support :2026-08, 2026-10
|
|
835
839
|
v2.2 Advanced Analytics :2026-10, 2026-12
|
|
@@ -857,7 +861,11 @@ gantt
|
|
|
857
861
|
| **v1.6** | ✅ Completed | Apr 2026 | Expanded About page and removal of the Algolia search dependency. |
|
|
858
862
|
| **v1.7** | ✅ Completed | May 2026 | Significant Jekyll build speedups and a MathJax 3 inline-math fix. |
|
|
859
863
|
| **v1.8** | ✅ Completed | May 2026 | Sass design-token system, refreshed navigation chrome, and a docs overhaul. |
|
|
860
|
-
| **v1.9** |
|
|
864
|
+
| **v1.9** | ✅ Completed | May 2026 | Modular installer v2 with deploy plugins, AI wizard pipeline, and a site scraper. |
|
|
865
|
+
| **v1.10** | ✅ Completed | Jun 2026 | Roadmap integrity validation and catch-up milestones so the roadmap tracks the shipped gem. |
|
|
866
|
+
| **v1.11** | ✅ Completed | Jun 2026 | Self-sustaining backlog loop so AI agents keep improving the repo between human sessions. |
|
|
867
|
+
| **v1.12** | 🚧 In Progress | Current (1.12.x) | Machine-readable site endpoints for downstream sites and AI agents. |
|
|
868
|
+
| **v1.13** | 🗓 Planned | Q3 2026 | Close the gap between the repo's quality gates and what CI actually enforces — no mistake lands green. |
|
|
861
869
|
| **v2.0** | 🗓 Planned | Q3 2026 | Headless CMS integration with a content API and admin dashboard. |
|
|
862
870
|
| **v2.1** | 🗓 Planned | Q4 2026 | Multi-language content support with locale-aware routing. |
|
|
863
871
|
| **v2.2** | 🗓 Planned | Q4 2026 | Visual theme customizer, A/B testing, and conversion funnels. |
|
|
@@ -901,7 +909,7 @@ git push origin feature/awesome-feature
|
|
|
901
909
|
|
|
902
910
|
| Metric | Value |
|
|
903
911
|
|--------|-------|
|
|
904
|
-
| **Current Version** | 1.12.
|
|
912
|
+
| **Current Version** | 1.12.2 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
|
|
905
913
|
| **Documented Features** | 43 ([Feature Registry](https://github.com/bamr87/zer0-mistakes/blob/main/_data/features.yml)) |
|
|
906
914
|
| **Setup Time** | 2-5 minutes ([install.sh benchmarks](https://github.com/bamr87/zer0-mistakes/blob/main/install.sh)) |
|
|
907
915
|
| **Documentation Pages** | 70+ ([browse docs](https://zer0-mistakes.com/pages/)) |
|
|
@@ -956,6 +964,6 @@ And these AI partners that make zer0-mistakes truly AI-native:
|
|
|
956
964
|
|
|
957
965
|
**Built with ❤️ — and a little help from our AI partners — for the Jekyll community**
|
|
958
966
|
|
|
959
|
-
**v1.12.
|
|
967
|
+
**v1.12.2** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md) • [AI Agent Guide](AGENTS.md)
|
|
960
968
|
|
|
961
969
|
|
data/_data/backlog.yml
CHANGED
|
@@ -55,15 +55,15 @@
|
|
|
55
55
|
|
|
56
56
|
meta:
|
|
57
57
|
title: "zer0-mistakes Backlog"
|
|
58
|
-
updated: 2026-06-
|
|
59
|
-
next_id:
|
|
58
|
+
updated: 2026-06-10
|
|
59
|
+
next_id: 16
|
|
60
60
|
|
|
61
61
|
tasks:
|
|
62
62
|
# --- Housekeeping (seeded so the loop has work on day one) ------------------
|
|
63
63
|
|
|
64
64
|
- id: T-001
|
|
65
65
|
title: "Reconcile roadmap milestone numbering with the published gem version"
|
|
66
|
-
status:
|
|
66
|
+
status: done
|
|
67
67
|
priority: P2
|
|
68
68
|
area: docs
|
|
69
69
|
risk: standard
|
|
@@ -73,17 +73,19 @@ tasks:
|
|
|
73
73
|
`_data/roadmap.yml` milestones run 0.17–1.0 while the gem ships as 1.9.9.
|
|
74
74
|
Decide on a single numbering scheme (or document the mapping) so the
|
|
75
75
|
roadmap, README, and RubyGems version no longer contradict each other.
|
|
76
|
+
Done 2026-06-10: roadmap advanced to track the shipped gem — v1.9
|
|
77
|
+
completed, v1.10/v1.11 recorded, v1.12 active.
|
|
76
78
|
acceptance:
|
|
77
79
|
- "Roadmap version line and gem version no longer contradict (either remapped or an explicit mapping note added to `_data/roadmap.yml` and `pages/roadmap.md`)."
|
|
78
80
|
- "`./scripts/generate-roadmap.sh --check` passes after the change."
|
|
79
81
|
- "No edit to `lib/jekyll-theme-zer0/version.rb`."
|
|
80
82
|
links: { issue: null, pr: null, roadmap: null }
|
|
81
83
|
created: 2026-05-31
|
|
82
|
-
updated: 2026-
|
|
84
|
+
updated: 2026-06-10
|
|
83
85
|
|
|
84
86
|
- id: T-002
|
|
85
87
|
title: "Refresh roadmap `updated:` date and review milestone statuses"
|
|
86
|
-
status:
|
|
88
|
+
status: done
|
|
87
89
|
priority: P3
|
|
88
90
|
area: docs
|
|
89
91
|
risk: low
|
|
@@ -92,13 +94,15 @@ tasks:
|
|
|
92
94
|
summary: >-
|
|
93
95
|
`_data/roadmap.yml` `meta.updated` is 2026-04-18. Refresh it and confirm
|
|
94
96
|
the 0.22 "active" milestone still reflects reality.
|
|
97
|
+
Done 2026-06-10: `meta.updated` refreshed and statuses reconciled with
|
|
98
|
+
shipped releases through v1.12.0.
|
|
95
99
|
acceptance:
|
|
96
100
|
- "`meta.updated` set to the current date."
|
|
97
101
|
- "Active/planned statuses reviewed against shipped work."
|
|
98
102
|
- "`./scripts/generate-roadmap.sh --check` passes."
|
|
99
103
|
links: { issue: null, pr: null, roadmap: null }
|
|
100
104
|
created: 2026-05-31
|
|
101
|
-
updated: 2026-
|
|
105
|
+
updated: 2026-06-10
|
|
102
106
|
|
|
103
107
|
- id: T-003
|
|
104
108
|
title: "Add GitHub issue templates and a pull-request template"
|
|
@@ -141,7 +145,7 @@ tasks:
|
|
|
141
145
|
updated: 2026-05-31
|
|
142
146
|
|
|
143
147
|
- id: T-005
|
|
144
|
-
title: "Coverage baseline: identify the lowest-covered subsystems toward the
|
|
148
|
+
title: "Coverage baseline: identify the lowest-covered subsystems toward the 90% goal"
|
|
145
149
|
status: open
|
|
146
150
|
priority: P1
|
|
147
151
|
area: tests
|
|
@@ -149,16 +153,17 @@ tasks:
|
|
|
149
153
|
effort: L
|
|
150
154
|
source: roadmap
|
|
151
155
|
summary: >-
|
|
152
|
-
The
|
|
153
|
-
|
|
154
|
-
|
|
156
|
+
The 3.0 LTS milestone targets 90%+ automated test coverage, and the v1.13
|
|
157
|
+
Zer0-Mistake Quality Framework starts with knowing where coverage stands.
|
|
158
|
+
Produce a coverage baseline and file follow-up tasks for the lowest-covered
|
|
159
|
+
areas (start with the modular installer and the Obsidian resolver paths).
|
|
155
160
|
acceptance:
|
|
156
161
|
- "A coverage baseline is recorded (test/coverage or a docs note)."
|
|
157
162
|
- "The 2–3 lowest-covered subsystems are identified and filed as new backlog tasks."
|
|
158
163
|
- "No reduction in existing passing tests (`./scripts/bin/test` stays green)."
|
|
159
|
-
links: { issue: null, pr: null, roadmap: "1.
|
|
164
|
+
links: { issue: null, pr: null, roadmap: "1.13" }
|
|
160
165
|
created: 2026-05-31
|
|
161
|
-
updated: 2026-
|
|
166
|
+
updated: 2026-06-10
|
|
162
167
|
|
|
163
168
|
# --- 2026-06-01 audit -------------------------------------------------------
|
|
164
169
|
|
|
@@ -272,3 +277,97 @@ tasks:
|
|
|
272
277
|
links: { issue: null, pr: null, roadmap: "3.0" }
|
|
273
278
|
created: 2026-06-01
|
|
274
279
|
updated: 2026-06-01
|
|
280
|
+
|
|
281
|
+
# --- 2026-06-10 Zer0-Mistake Quality Framework (roadmap v1.13) --------------
|
|
282
|
+
#
|
|
283
|
+
# Origin: main carried 3 failing test suites and 2 crashing validators while
|
|
284
|
+
# every CI check stayed green (fixed in PR #132). Root cause: the PR gate runs
|
|
285
|
+
# only a subset of the canonical test entrypoint, and two checks are warn-only.
|
|
286
|
+
# These tasks close the gap between the quality gates and what CI enforces.
|
|
287
|
+
|
|
288
|
+
- id: T-012
|
|
289
|
+
title: "CI gate parity: run the full canonical test entrypoint on PRs"
|
|
290
|
+
status: open
|
|
291
|
+
priority: P1
|
|
292
|
+
area: infra
|
|
293
|
+
risk: standard
|
|
294
|
+
effort: M
|
|
295
|
+
source: roadmap
|
|
296
|
+
summary: >-
|
|
297
|
+
`ci.yml`'s test job runs `test/test_runner.sh --suites core,quality,installation`,
|
|
298
|
+
which skips the lib unit tests (`scripts/test/lib/`), the integration suites
|
|
299
|
+
(`scripts/test/integration/` — exactly the ones that rotted unnoticed before
|
|
300
|
+
PR #132), the obsidian suite, and the installer e2e suites that
|
|
301
|
+
`./scripts/bin/test` runs locally. PRs must gate on the same entrypoint
|
|
302
|
+
contributors are told to run.
|
|
303
|
+
acceptance:
|
|
304
|
+
- "The `ci.yml` test job executes `./scripts/bin/test` (or an explicit suite list that includes lib, integration, obsidian, and installer e2e) on every code PR."
|
|
305
|
+
- "A deliberately broken integration test fails CI in a draft PR experiment (then reverted)."
|
|
306
|
+
- "`.github/workflows/README.md` documents which gates run on PR vs push vs schedule."
|
|
307
|
+
- "Total PR wall-clock stays under 25 minutes (parallelize jobs if needed)."
|
|
308
|
+
links: { issue: null, pr: null, roadmap: "1.13" }
|
|
309
|
+
created: 2026-06-10
|
|
310
|
+
updated: 2026-06-10
|
|
311
|
+
|
|
312
|
+
- id: T-013
|
|
313
|
+
title: "Refresh Playwright snapshot baselines and re-arm the pixel gate"
|
|
314
|
+
status: open
|
|
315
|
+
priority: P2
|
|
316
|
+
area: tests
|
|
317
|
+
risk: standard
|
|
318
|
+
effort: M
|
|
319
|
+
source: roadmap
|
|
320
|
+
summary: >-
|
|
321
|
+
The snapshot tier in `ci.yml` is `continue-on-error: true` because the
|
|
322
|
+
committed baselines predate the PR #108 UI overhaul. Regenerate the Linux
|
|
323
|
+
baselines via `./test/update-snapshots.sh` and make the tier blocking again
|
|
324
|
+
so visual regressions cannot land silently.
|
|
325
|
+
acceptance:
|
|
326
|
+
- "Baselines under `test/visual/snapshots/` regenerated and committed."
|
|
327
|
+
- "`continue-on-error: true` removed from the snapshot step in `ci.yml`."
|
|
328
|
+
- "Snapshot tier passes in CI on an unchanged follow-up commit."
|
|
329
|
+
links: { issue: null, pr: null, roadmap: "1.13" }
|
|
330
|
+
created: 2026-06-10
|
|
331
|
+
updated: 2026-06-10
|
|
332
|
+
|
|
333
|
+
- id: T-014
|
|
334
|
+
title: "Re-arm the docs link-check gate (remove warn-only || true)"
|
|
335
|
+
status: open
|
|
336
|
+
priority: P2
|
|
337
|
+
area: lint
|
|
338
|
+
risk: standard
|
|
339
|
+
effort: M
|
|
340
|
+
source: roadmap
|
|
341
|
+
summary: >-
|
|
342
|
+
`docs-validate.yml` runs markdown-link-check with `|| true` ("warn-only
|
|
343
|
+
until baseline is clean"), so broken links accumulate. Fix the links it
|
|
344
|
+
currently reports, then drop the `|| true` so the gate blocks.
|
|
345
|
+
acceptance:
|
|
346
|
+
- "All links reported by the current `docs-validate.yml` run are fixed or allowlisted in `.github/config/.markdown-link-check.json`."
|
|
347
|
+
- "Both `|| true` suppressions removed from `docs-validate.yml`."
|
|
348
|
+
- "`docs-validate.yml` passes blocking on a follow-up PR."
|
|
349
|
+
links: { issue: null, pr: null, roadmap: "1.13" }
|
|
350
|
+
created: 2026-06-10
|
|
351
|
+
updated: 2026-06-10
|
|
352
|
+
|
|
353
|
+
- id: T-015
|
|
354
|
+
title: "Locale-independence regression guard for Ruby/Bash tooling"
|
|
355
|
+
status: open
|
|
356
|
+
priority: P2
|
|
357
|
+
area: infra
|
|
358
|
+
risk: standard
|
|
359
|
+
effort: S
|
|
360
|
+
source: roadmap
|
|
361
|
+
summary: >-
|
|
362
|
+
PR #132 fixed `invalid byte sequence in US-ASCII` crashes in
|
|
363
|
+
`generate-roadmap.rb`, `sync-backlog.rb`, and `scripts/bin/validate` that
|
|
364
|
+
only reproduced without a UTF-8 locale. Add a guard so the bug class
|
|
365
|
+
cannot return: run the validators under `LC_ALL=C` in a lib test or a
|
|
366
|
+
dedicated CI step.
|
|
367
|
+
acceptance:
|
|
368
|
+
- "A test (scripts/test/lib/) or CI step runs `generate-roadmap.rb --check`, `sync-backlog.rb --check`, and `validate --quick` with `LC_ALL=C LANG=C`."
|
|
369
|
+
- "The guard fails when the explicit-UTF-8 reads are reverted (verified once locally)."
|
|
370
|
+
- "`./scripts/bin/test` stays green."
|
|
371
|
+
links: { issue: null, pr: null, roadmap: "1.13" }
|
|
372
|
+
created: 2026-06-10
|
|
373
|
+
updated: 2026-06-10
|
data/_data/roadmap.yml
CHANGED
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
meta:
|
|
61
61
|
title: "zer0-mistakes Roadmap"
|
|
62
62
|
tagline: "Past releases, current focus, and future plans for the zer0-mistakes Jekyll theme."
|
|
63
|
-
updated: 2026-
|
|
63
|
+
updated: 2026-06-10
|
|
64
64
|
|
|
65
65
|
milestones:
|
|
66
66
|
# --- Completed -------------------------------------------------------------
|
|
@@ -270,15 +270,12 @@ milestones:
|
|
|
270
270
|
- "Unified Playwright test tiers (smoke / snapshots / regression)"
|
|
271
271
|
- "Design-system developer docs"
|
|
272
272
|
|
|
273
|
-
# --- Current ---------------------------------------------------------------
|
|
274
|
-
|
|
275
273
|
- version: "1.9"
|
|
276
274
|
title: "Installer v2 & Site Scraper"
|
|
277
|
-
status:
|
|
278
|
-
section:
|
|
275
|
+
status: completed
|
|
276
|
+
section: Completed
|
|
279
277
|
start: 2026-05
|
|
280
278
|
end: 2026-05
|
|
281
|
-
target: "Current (1.9.x)"
|
|
282
279
|
released: 2026-05-27
|
|
283
280
|
summary: "Modular installer v2 with deploy plugins, AI wizard pipeline, and a site scraper."
|
|
284
281
|
features:
|
|
@@ -288,8 +285,67 @@ milestones:
|
|
|
288
285
|
- "Quickstart documentation rewrite with screenshots"
|
|
289
286
|
- "Hardened one-line installer path"
|
|
290
287
|
|
|
288
|
+
- version: "1.10"
|
|
289
|
+
title: "Roadmap Validation"
|
|
290
|
+
status: completed
|
|
291
|
+
section: Completed
|
|
292
|
+
start: 2026-06
|
|
293
|
+
end: 2026-06
|
|
294
|
+
released: 2026-06-01
|
|
295
|
+
summary: "Roadmap integrity validation and catch-up milestones so the roadmap tracks the shipped gem."
|
|
296
|
+
features:
|
|
297
|
+
- "`generate-roadmap.rb --validate` mode (status/section/version/date checks)"
|
|
298
|
+
- "Catch-up milestones v1.0–1.9 recorded in the roadmap"
|
|
299
|
+
- "README roadmap accuracy fixes"
|
|
300
|
+
|
|
301
|
+
- version: "1.11"
|
|
302
|
+
title: "Continuous-Evolution Loop"
|
|
303
|
+
status: completed
|
|
304
|
+
section: Completed
|
|
305
|
+
start: 2026-06
|
|
306
|
+
end: 2026-06
|
|
307
|
+
released: 2026-06-01
|
|
308
|
+
summary: "Self-sustaining backlog loop so AI agents keep improving the repo between human sessions."
|
|
309
|
+
features:
|
|
310
|
+
- "`_data/backlog.yml` tactical task queue (single source of truth)"
|
|
311
|
+
- "Backlog ↔ GitHub Issues sync workflow with schema validation"
|
|
312
|
+
- "Auto-merge for low-risk (docs/deps/lint) PRs once CI is green"
|
|
313
|
+
- "`/repo-audit` and `/backlog-implement` agent routines"
|
|
314
|
+
- "Documentation maintenance system and consolidation"
|
|
315
|
+
|
|
316
|
+
# --- Current ---------------------------------------------------------------
|
|
317
|
+
|
|
318
|
+
- version: "1.12"
|
|
319
|
+
title: "Headless Endpoints"
|
|
320
|
+
status: active
|
|
321
|
+
section: Current
|
|
322
|
+
start: 2026-06
|
|
323
|
+
end: 2026-06
|
|
324
|
+
target: "Current (1.12.x)"
|
|
325
|
+
summary: "Machine-readable site endpoints for downstream sites and AI agents."
|
|
326
|
+
features:
|
|
327
|
+
- "Auto-generated `/search.json` endpoint for downstream sites"
|
|
328
|
+
- "Auto-generated `/sitemap/` endpoint"
|
|
329
|
+
- "Ruby gem and Mermaid dependency updates"
|
|
330
|
+
|
|
291
331
|
# --- Future ----------------------------------------------------------------
|
|
292
332
|
|
|
333
|
+
- version: "1.13"
|
|
334
|
+
title: "Zer0-Mistake Quality Framework"
|
|
335
|
+
status: planned
|
|
336
|
+
section: Future
|
|
337
|
+
start: 2026-06
|
|
338
|
+
end: 2026-08
|
|
339
|
+
target: "Q3 2026"
|
|
340
|
+
summary: "Close the gap between the repo's quality gates and what CI actually enforces — no mistake lands green."
|
|
341
|
+
features:
|
|
342
|
+
- "CI gate parity — PRs run the full canonical test entrypoint (lib unit, theme, integration, installer e2e), not a subset"
|
|
343
|
+
- "Re-armed pixel-snapshot gate (refreshed baselines, no `continue-on-error`)"
|
|
344
|
+
- "Re-armed docs link-check gate (clean baseline, no warn-only `|| true`)"
|
|
345
|
+
- "Locale-independence regression guard for the Ruby/Bash tooling"
|
|
346
|
+
- "Coverage baseline with follow-up tasks for the lowest-covered subsystems"
|
|
347
|
+
- "Documented required status checks per branch (the 'controls' contract)"
|
|
348
|
+
|
|
293
349
|
- version: "2.0"
|
|
294
350
|
title: "CMS Integration"
|
|
295
351
|
status: planned
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
Configuration:
|
|
29
29
|
- Mermaid v10 bundled locally (_config.yml mermaid.src)
|
|
30
|
-
-
|
|
30
|
+
- Adaptive light/dark theme following Bootstrap's data-bs-theme
|
|
31
31
|
- Client-side code block conversion for GitHub Pages compatibility
|
|
32
32
|
|
|
33
33
|
GitHub Pages Compatibility:
|
data/_layouts/search.html
CHANGED
data/scripts/bin/validate
CHANGED
|
@@ -236,7 +236,9 @@ versions = {
|
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
if File.file?('package.json')
|
|
239
|
-
|
|
239
|
+
# Explicit UTF-8: package.json contains multibyte characters and the default
|
|
240
|
+
# external encoding is US-ASCII when no locale is set (containers, some CI).
|
|
241
|
+
versions['package.json'] = JSON.parse(File.read('package.json', encoding: 'UTF-8')).fetch('version').to_s
|
|
240
242
|
end
|
|
241
243
|
|
|
242
244
|
expected = versions.values.first
|
data/scripts/generate-roadmap.rb
CHANGED
|
@@ -149,7 +149,7 @@ end
|
|
|
149
149
|
def current_gem_version
|
|
150
150
|
return nil unless File.exist?(VERSION_RB)
|
|
151
151
|
|
|
152
|
-
m = File.read(VERSION_RB).match(/VERSION\s*=\s*["']([^"']+)["']/)
|
|
152
|
+
m = File.read(VERSION_RB, encoding: 'UTF-8').match(/VERSION\s*=\s*["']([^"']+)["']/)
|
|
153
153
|
m && m[1]
|
|
154
154
|
end
|
|
155
155
|
|
|
@@ -318,7 +318,7 @@ def main
|
|
|
318
318
|
begin
|
|
319
319
|
YAML.load_file(DATA_FILE, permitted_classes: [Date, Time])
|
|
320
320
|
rescue ArgumentError
|
|
321
|
-
YAML.safe_load(File.read(DATA_FILE), permitted_classes: [Date, Time], aliases: false)
|
|
321
|
+
YAML.safe_load(File.read(DATA_FILE, encoding: 'UTF-8'), permitted_classes: [Date, Time], aliases: false)
|
|
322
322
|
end
|
|
323
323
|
|
|
324
324
|
return run_validation(data) if options[:mode] == :validate
|
|
@@ -333,7 +333,9 @@ def main
|
|
|
333
333
|
return 0
|
|
334
334
|
end
|
|
335
335
|
|
|
336
|
-
|
|
336
|
+
# Force UTF-8: the README contains emoji, and the default external encoding
|
|
337
|
+
# is US-ASCII when no locale is set (minimal containers, some CI runners).
|
|
338
|
+
original = File.read(README, encoding: 'UTF-8')
|
|
337
339
|
updated = original.dup
|
|
338
340
|
updated = replace_block(updated, MERMAID_START, MERMAID_END, mermaid)
|
|
339
341
|
updated = replace_block(updated, TABLE_START, TABLE_END, table)
|
data/scripts/lib/changelog.sh
CHANGED
|
@@ -305,18 +305,59 @@ update_changelog_file() {
|
|
|
305
305
|
|
|
306
306
|
# Create backup
|
|
307
307
|
cp "$CHANGELOG_FILE" "${CHANGELOG_FILE}.bak"
|
|
308
|
-
|
|
309
|
-
#
|
|
308
|
+
|
|
309
|
+
# Fold any pending "## [Unreleased]" section into the new entry so its
|
|
310
|
+
# notes ship with this release instead of getting buried beneath it
|
|
311
|
+
# (stale Unreleased blocks used to accumulate mid-file).
|
|
312
|
+
local unreleased_start
|
|
313
|
+
unreleased_start=$(grep -n '^## \[Unreleased\]' "$CHANGELOG_FILE" | head -1 | cut -d: -f1)
|
|
314
|
+
|
|
315
|
+
if [[ -n "$unreleased_start" ]]; then
|
|
316
|
+
# First "## " heading after the Unreleased one (relative offset)
|
|
317
|
+
local rel_next
|
|
318
|
+
rel_next=$(tail -n +"$((unreleased_start + 1))" "$CHANGELOG_FILE" | grep -n '^## ' | head -1 | cut -d: -f1)
|
|
319
|
+
|
|
320
|
+
local unreleased_body
|
|
321
|
+
if [[ -n "$rel_next" ]]; then
|
|
322
|
+
unreleased_body=$(sed -n "$((unreleased_start + 1)),$((unreleased_start + rel_next - 1))p" "$CHANGELOG_FILE")
|
|
323
|
+
else
|
|
324
|
+
unreleased_body=$(tail -n +"$((unreleased_start + 1))" "$CHANGELOG_FILE")
|
|
325
|
+
fi
|
|
326
|
+
|
|
327
|
+
# Drop the Unreleased section (header + body) from the file
|
|
328
|
+
{
|
|
329
|
+
head -n "$((unreleased_start - 1))" "$CHANGELOG_FILE"
|
|
330
|
+
[[ -n "$rel_next" ]] && tail -n +"$((unreleased_start + rel_next))" "$CHANGELOG_FILE"
|
|
331
|
+
} > "${CHANGELOG_FILE}.tmp"
|
|
332
|
+
mv "${CHANGELOG_FILE}.tmp" "$CHANGELOG_FILE"
|
|
333
|
+
|
|
334
|
+
# Append the pending notes to the new entry (if any are non-blank)
|
|
335
|
+
if [[ -n "${unreleased_body//[[:space:]]/}" ]]; then
|
|
336
|
+
debug "Folding pending [Unreleased] notes into the new entry"
|
|
337
|
+
entry+=$'\n'"$(echo "$unreleased_body" | sed -e '/./,$!d')"$'\n'
|
|
338
|
+
fi
|
|
339
|
+
fi
|
|
340
|
+
|
|
341
|
+
# Insert the new entry before the first release heading so the file
|
|
342
|
+
# header/preamble (title, Keep a Changelog blurb) stays at the top.
|
|
343
|
+
local first_release
|
|
344
|
+
first_release=$(grep -n '^## ' "$CHANGELOG_FILE" | head -1 | cut -d: -f1)
|
|
345
|
+
|
|
310
346
|
{
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
347
|
+
if [[ -n "$first_release" ]]; then
|
|
348
|
+
head -n "$((first_release - 1))" "$CHANGELOG_FILE"
|
|
349
|
+
echo "$entry"
|
|
350
|
+
tail -n +"$first_release" "$CHANGELOG_FILE"
|
|
351
|
+
else
|
|
352
|
+
cat "$CHANGELOG_FILE"
|
|
353
|
+
echo ""
|
|
354
|
+
echo "$entry"
|
|
355
|
+
fi
|
|
315
356
|
} > "${CHANGELOG_FILE}.tmp"
|
|
316
|
-
|
|
357
|
+
|
|
317
358
|
mv "${CHANGELOG_FILE}.tmp" "$CHANGELOG_FILE"
|
|
318
359
|
rm -f "${CHANGELOG_FILE}.bak"
|
|
319
|
-
|
|
360
|
+
|
|
320
361
|
debug "✓ Updated $CHANGELOG_FILE"
|
|
321
362
|
}
|
|
322
363
|
|
data/scripts/sync-backlog.rb
CHANGED
|
@@ -78,7 +78,7 @@ def load_data
|
|
|
78
78
|
begin
|
|
79
79
|
YAML.load_file(DATA_FILE, permitted_classes: [Date, Time])
|
|
80
80
|
rescue ArgumentError
|
|
81
|
-
YAML.safe_load(File.read(DATA_FILE), permitted_classes: [Date, Time], aliases: false)
|
|
81
|
+
YAML.safe_load(File.read(DATA_FILE, encoding: 'UTF-8'), permitted_classes: [Date, Time], aliases: false)
|
|
82
82
|
end
|
|
83
83
|
end
|
|
84
84
|
|
|
@@ -21,6 +21,13 @@ log_warning() { warn "$@"; }
|
|
|
21
21
|
log_error() { error "$@"; }
|
|
22
22
|
log_test() { step "$@"; }
|
|
23
23
|
|
|
24
|
+
# Paths under test (the workflow calls the wrapper; the implementation
|
|
25
|
+
# lives in scripts/utils/; releases go through scripts/bin/release)
|
|
26
|
+
ANALYZE_WRAPPER="$SCRIPTS_ROOT/analyze-commits.sh"
|
|
27
|
+
ANALYZE_IMPL="$SCRIPTS_ROOT/utils/analyze-commits"
|
|
28
|
+
RELEASE_BIN="$SCRIPTS_ROOT/bin/release"
|
|
29
|
+
WORKFLOW_FILE="$PROJECT_ROOT/.github/workflows/version-bump.yml"
|
|
30
|
+
|
|
24
31
|
# Test counter
|
|
25
32
|
TESTS_RUN=0
|
|
26
33
|
TESTS_PASSED=0
|
|
@@ -29,49 +36,64 @@ run_test() {
|
|
|
29
36
|
local test_name="$1"
|
|
30
37
|
local test_command="$2"
|
|
31
38
|
local expected_result="${3:-}"
|
|
32
|
-
|
|
33
|
-
((
|
|
39
|
+
|
|
40
|
+
# Plain arithmetic assignment: ((VAR++)) returns the pre-increment value,
|
|
41
|
+
# which is non-zero-exit when 0 and aborts the script under `set -e`.
|
|
42
|
+
TESTS_RUN=$((TESTS_RUN + 1))
|
|
34
43
|
log_test "Running: $test_name"
|
|
35
|
-
|
|
44
|
+
|
|
36
45
|
local actual_result
|
|
37
46
|
if actual_result=$(eval "$test_command" 2>&1); then
|
|
38
47
|
if [[ -n "$expected_result" ]]; then
|
|
39
48
|
if [[ "$actual_result" == "$expected_result" ]]; then
|
|
40
49
|
log_success "✅ $test_name"
|
|
41
|
-
((TESTS_PASSED
|
|
50
|
+
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
42
51
|
else
|
|
43
52
|
log_error "❌ $test_name - Expected: '$expected_result', Got: '$actual_result'"
|
|
44
53
|
fi
|
|
45
54
|
else
|
|
46
55
|
log_success "✅ $test_name"
|
|
47
|
-
((TESTS_PASSED
|
|
56
|
+
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
48
57
|
fi
|
|
49
58
|
else
|
|
50
59
|
log_error "❌ $test_name - Command failed: $actual_result"
|
|
51
60
|
fi
|
|
52
61
|
}
|
|
53
62
|
|
|
63
|
+
# Test file permissions and executability
|
|
64
|
+
test_file_permissions() {
|
|
65
|
+
log_info "Testing file permissions..."
|
|
66
|
+
|
|
67
|
+
local scripts=(
|
|
68
|
+
"$ANALYZE_WRAPPER"
|
|
69
|
+
"$ANALYZE_IMPL"
|
|
70
|
+
"$RELEASE_BIN"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
for script in "${scripts[@]}"; do
|
|
74
|
+
local script_name=$(basename "$script")
|
|
75
|
+
run_test "$script_name is executable" "test -x '$script'"
|
|
76
|
+
done
|
|
77
|
+
}
|
|
78
|
+
|
|
54
79
|
# Test the commit analysis script
|
|
55
80
|
test_commit_analysis() {
|
|
56
81
|
log_info "Testing commit analysis functionality..."
|
|
57
|
-
|
|
58
|
-
# Test script exists and is executable
|
|
59
|
-
run_test "Commit analysis script exists" "test -x '$SCRIPT_DIR/analyze-commits.sh'"
|
|
60
|
-
|
|
82
|
+
|
|
61
83
|
# Test help output
|
|
62
|
-
run_test "Help output works" "$
|
|
63
|
-
|
|
84
|
+
run_test "Help output works" "$ANALYZE_IMPL --help | grep -q 'Commit Analysis Script'"
|
|
85
|
+
|
|
64
86
|
# Test with sample commit ranges (if we have git history)
|
|
65
87
|
if git rev-list --count HEAD >/dev/null 2>&1; then
|
|
66
88
|
local commit_count=$(git rev-list --count HEAD)
|
|
67
|
-
|
|
89
|
+
|
|
68
90
|
if [[ $commit_count -gt 1 ]]; then
|
|
69
|
-
# Test analyzing last commit
|
|
70
|
-
run_test "Analyze last commit" "$
|
|
71
|
-
|
|
91
|
+
# Test analyzing last commit (through the wrapper, like the workflow)
|
|
92
|
+
run_test "Analyze last commit" "$ANALYZE_WRAPPER HEAD~1..HEAD | grep -E '^(patch|minor|major|none)$'"
|
|
93
|
+
|
|
72
94
|
# Test analyzing multiple commits if available
|
|
73
95
|
if [[ $commit_count -gt 3 ]]; then
|
|
74
|
-
run_test "Analyze multiple commits" "$
|
|
96
|
+
run_test "Analyze multiple commits" "$ANALYZE_WRAPPER HEAD~3..HEAD | grep -E '^(patch|minor|major|none)$'"
|
|
75
97
|
fi
|
|
76
98
|
fi
|
|
77
99
|
else
|
|
@@ -79,102 +101,51 @@ test_commit_analysis() {
|
|
|
79
101
|
fi
|
|
80
102
|
}
|
|
81
103
|
|
|
82
|
-
# Test
|
|
83
|
-
|
|
84
|
-
log_info "Testing
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
run_test "
|
|
88
|
-
|
|
89
|
-
# Test new automated options
|
|
90
|
-
run_test "Automated release option works" "$SCRIPT_DIR/gem-publish.sh --help | grep -q 'automated-release'"
|
|
91
|
-
run_test "Auto commit range option works" "$SCRIPT_DIR/gem-publish.sh --help | grep -q 'auto-commit-range'"
|
|
92
|
-
|
|
93
|
-
# Test dry run with automated options
|
|
94
|
-
if [[ -f "$PROJECT_ROOT/lib/jekyll-theme-zer0/version.rb" ]]; then
|
|
95
|
-
run_test "Dry run with automated options" "$SCRIPT_DIR/gem-publish.sh patch --dry-run --automated-release --skip-tests --skip-publish --no-github-release | grep -q 'Automated Release Mode'"
|
|
96
|
-
fi
|
|
104
|
+
# Test release command compatibility (replaces the retired gem-publish.sh)
|
|
105
|
+
test_release_command() {
|
|
106
|
+
log_info "Testing release command compatibility..."
|
|
107
|
+
|
|
108
|
+
run_test "Release help works" "$RELEASE_BIN --help | grep -q 'VERSION TYPES'"
|
|
109
|
+
run_test "Dry-run option documented" "$RELEASE_BIN --help | grep -q -- '--dry-run'"
|
|
110
|
+
run_test "Skip-publish option documented" "$RELEASE_BIN --help | grep -q -- '--skip-publish'"
|
|
97
111
|
}
|
|
98
112
|
|
|
99
113
|
# Test workflow files syntax
|
|
100
114
|
test_workflow_syntax() {
|
|
101
115
|
log_info "Testing GitHub Actions workflow syntax..."
|
|
102
|
-
|
|
116
|
+
|
|
117
|
+
run_test "version-bump workflow exists" "test -f '$WORKFLOW_FILE'"
|
|
118
|
+
|
|
103
119
|
# Check if yamllint is available
|
|
104
120
|
if command -v yamllint >/dev/null 2>&1; then
|
|
105
|
-
run_test "
|
|
121
|
+
run_test "version-bump workflow syntax" "yamllint -c '$PROJECT_ROOT/.github/config/.yamllint.yml' '$WORKFLOW_FILE'"
|
|
106
122
|
else
|
|
107
|
-
# Basic YAML syntax check with
|
|
108
|
-
|
|
109
|
-
run_test "Auto-version-bump workflow syntax" "python3 -c 'import yaml; yaml.safe_load(open(\"$PROJECT_ROOT/.github/workflows/auto-version-bump.yml\"))'"
|
|
110
|
-
else
|
|
111
|
-
log_warning "Neither yamllint nor python3 available for YAML validation"
|
|
112
|
-
fi
|
|
123
|
+
# Basic YAML syntax check with Ruby (always present for this repo)
|
|
124
|
+
run_test "version-bump workflow syntax" "ruby -ryaml -e 'YAML.safe_load_file(\"$WORKFLOW_FILE\", aliases: true)'"
|
|
113
125
|
fi
|
|
114
126
|
}
|
|
115
127
|
|
|
116
|
-
# Test file permissions and executability
|
|
117
|
-
test_file_permissions() {
|
|
118
|
-
log_info "Testing file permissions..."
|
|
119
|
-
|
|
120
|
-
local scripts=(
|
|
121
|
-
"$SCRIPT_DIR/analyze-commits.sh"
|
|
122
|
-
"$SCRIPT_DIR/gem-publish.sh"
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
for script in "${scripts[@]}"; do
|
|
126
|
-
local script_name=$(basename "$script")
|
|
127
|
-
run_test "$script_name is executable" "test -x '$script'"
|
|
128
|
-
done
|
|
129
|
-
}
|
|
130
|
-
|
|
131
128
|
# Test integration between components
|
|
132
129
|
test_integration() {
|
|
133
130
|
log_info "Testing integration between components..."
|
|
134
|
-
|
|
135
|
-
#
|
|
136
|
-
if
|
|
137
|
-
|
|
138
|
-
if
|
|
139
|
-
|
|
140
|
-
if [[ $commit_count -gt 0 ]]; then
|
|
141
|
-
run_test "Integration: commit analysis returns valid output" "$SCRIPT_DIR/analyze-commits.sh HEAD~1..HEAD | grep -E '^(patch|minor|major|none)$'"
|
|
142
|
-
fi
|
|
131
|
+
|
|
132
|
+
# The workflow invokes ./scripts/analyze-commits.sh and validates its output
|
|
133
|
+
if git rev-list --count HEAD >/dev/null 2>&1; then
|
|
134
|
+
local commit_count=$(git rev-list --count HEAD)
|
|
135
|
+
if [[ $commit_count -gt 0 ]]; then
|
|
136
|
+
run_test "Integration: commit analysis returns valid output" "$ANALYZE_WRAPPER HEAD~1..HEAD | grep -E '^(patch|minor|major|none)$'"
|
|
143
137
|
fi
|
|
144
138
|
fi
|
|
145
|
-
|
|
146
|
-
# Test that gem-publish.sh accepts the new parameters
|
|
147
|
-
if [[ -x "$SCRIPT_DIR/gem-publish.sh" ]]; then
|
|
148
|
-
run_test "Integration: gem-publish accepts automated params" "$SCRIPT_DIR/gem-publish.sh patch --dry-run --automated-release --auto-commit-range=HEAD~1..HEAD --skip-tests --skip-publish --no-github-release | grep -q 'DRY RUN MODE'"
|
|
149
|
-
fi
|
|
150
139
|
}
|
|
151
140
|
|
|
152
141
|
# Test conventional commit detection
|
|
153
142
|
test_conventional_commits() {
|
|
154
143
|
log_info "Testing conventional commit detection..."
|
|
155
|
-
|
|
156
|
-
#
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
"BREAKING CHANGE: remove deprecated API"
|
|
161
|
-
"chore: update dependencies"
|
|
162
|
-
"docs: improve documentation"
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
local expected_results=(
|
|
166
|
-
"minor"
|
|
167
|
-
"patch"
|
|
168
|
-
"major"
|
|
169
|
-
"patch"
|
|
170
|
-
"patch"
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
# Note: This would require a more sophisticated test setup
|
|
174
|
-
# For now, just test that the patterns exist in the script
|
|
175
|
-
run_test "Conventional commit patterns exist" "grep -q 'feat.*minor' '$SCRIPT_DIR/analyze-commits.sh'"
|
|
176
|
-
run_test "Fix patterns exist" "grep -q 'fix.*patch' '$SCRIPT_DIR/analyze-commits.sh'"
|
|
177
|
-
run_test "Breaking change patterns exist" "grep -q 'BREAKING.*major' '$SCRIPT_DIR/analyze-commits.sh'"
|
|
144
|
+
|
|
145
|
+
# Test that the documented mapping exists in the analyzer
|
|
146
|
+
run_test "Conventional commit patterns exist" "grep -q 'feat.*minor' '$ANALYZE_IMPL'"
|
|
147
|
+
run_test "Fix patterns exist" "grep -q 'fix.*patch' '$ANALYZE_IMPL'"
|
|
148
|
+
run_test "Breaking change patterns exist" "grep -q 'BREAKING.*major' '$ANALYZE_IMPL'"
|
|
178
149
|
}
|
|
179
150
|
|
|
180
151
|
# Main test execution
|
|
@@ -182,18 +153,18 @@ main() {
|
|
|
182
153
|
log_info "🧪 Starting Automated Version Bump System Tests"
|
|
183
154
|
echo "=================================================="
|
|
184
155
|
echo ""
|
|
185
|
-
|
|
156
|
+
|
|
186
157
|
# Change to project root
|
|
187
158
|
cd "$PROJECT_ROOT"
|
|
188
|
-
|
|
159
|
+
|
|
189
160
|
# Run all test suites
|
|
190
161
|
test_file_permissions
|
|
191
162
|
test_commit_analysis
|
|
192
|
-
|
|
163
|
+
test_release_command
|
|
193
164
|
test_workflow_syntax
|
|
194
165
|
test_integration
|
|
195
166
|
test_conventional_commits
|
|
196
|
-
|
|
167
|
+
|
|
197
168
|
# Test summary
|
|
198
169
|
echo ""
|
|
199
170
|
echo "=================================================="
|
|
@@ -201,7 +172,7 @@ main() {
|
|
|
201
172
|
echo "Tests Run: $TESTS_RUN"
|
|
202
173
|
echo "Tests Passed: $TESTS_PASSED"
|
|
203
174
|
echo "Tests Failed: $((TESTS_RUN - TESTS_PASSED))"
|
|
204
|
-
|
|
175
|
+
|
|
205
176
|
if [[ $TESTS_PASSED -eq $TESTS_RUN ]]; then
|
|
206
177
|
log_success "🎉 All tests passed! Automated version bump system is ready."
|
|
207
178
|
exit 0
|
|
@@ -221,23 +192,18 @@ USAGE:
|
|
|
221
192
|
|
|
222
193
|
DESCRIPTION:
|
|
223
194
|
This script tests the automated version bump system including:
|
|
224
|
-
- Commit analysis functionality
|
|
225
|
-
|
|
226
|
-
-
|
|
195
|
+
- Commit analysis functionality (scripts/analyze-commits.sh wrapper
|
|
196
|
+
and scripts/utils/analyze-commits implementation)
|
|
197
|
+
- Release command compatibility (scripts/bin/release)
|
|
198
|
+
- Workflow file syntax validation (.github/workflows/version-bump.yml)
|
|
227
199
|
- Integration between components
|
|
228
200
|
- Conventional commit detection
|
|
229
201
|
|
|
230
202
|
REQUIREMENTS:
|
|
231
203
|
- Git repository with commit history
|
|
232
|
-
-
|
|
233
|
-
- Valid GitHub Actions workflow files
|
|
234
|
-
|
|
235
|
-
OUTPUT:
|
|
236
|
-
Detailed test results and summary
|
|
237
|
-
Exit code 0 on success, 1 on failure
|
|
204
|
+
- Bash 3.2+ compatible environment
|
|
238
205
|
EOF
|
|
239
206
|
exit 0
|
|
240
207
|
fi
|
|
241
208
|
|
|
242
|
-
|
|
243
|
-
main "$@"
|
|
209
|
+
main "$@"
|
|
@@ -166,9 +166,7 @@ main() {
|
|
|
166
166
|
log_info "Testing core files..."
|
|
167
167
|
|
|
168
168
|
test_file_exists "_includes/components/mermaid.html" "Mermaid include file exists"
|
|
169
|
-
test_file_exists "pages/_docs/
|
|
170
|
-
test_file_exists "pages/_docs/jekyll/mermaid-test-suite.md" "Test suite exists"
|
|
171
|
-
test_file_exists "pages/_docs/jekyll/jekyll-diagram-with-mermaid.md" "Tutorial exists"
|
|
169
|
+
test_file_exists "pages/_docs/features/mermaid-diagrams.md" "Main documentation exists"
|
|
172
170
|
|
|
173
171
|
# Configuration tests
|
|
174
172
|
log_info "Testing configuration..."
|
|
@@ -183,16 +181,14 @@ main() {
|
|
|
183
181
|
|
|
184
182
|
test_file_content "_includes/components/mermaid.html" "site.mermaid.src" "Mermaid script from _config (local vendor path)"
|
|
185
183
|
test_file_content "_includes/components/mermaid.html" "mermaid.initialize" "Mermaid initialization script"
|
|
186
|
-
test_file_content "_includes/components/mermaid.html" "
|
|
187
|
-
test_file_content "_includes/components/mermaid.html" "
|
|
184
|
+
test_file_content "_includes/components/mermaid.html" "data-bs-theme" "Bootstrap theme detection configured"
|
|
185
|
+
test_file_content "_includes/components/mermaid.html" "getMermaidConfig" "Adaptive light/dark theming configured"
|
|
188
186
|
|
|
189
187
|
# Documentation tests
|
|
190
188
|
log_info "Testing documentation..."
|
|
191
189
|
|
|
192
|
-
test_file_content "pages/_docs/
|
|
193
|
-
test_file_content "pages/_docs/
|
|
194
|
-
test_file_content "pages/_docs/jekyll/mermaid.md" "graph TD" "Main docs have examples"
|
|
195
|
-
test_file_content "pages/_docs/jekyll/mermaid-test-suite.md" "graph TD" "Test suite has examples"
|
|
190
|
+
test_file_content "pages/_docs/features/mermaid-diagrams.md" "mermaid: true" "Main docs have front matter"
|
|
191
|
+
test_file_content "pages/_docs/features/mermaid-diagrams.md" "graph TD" "Main docs have examples"
|
|
196
192
|
|
|
197
193
|
# Server tests (if not quick mode)
|
|
198
194
|
if [ "$QUICK" = false ]; then
|
|
@@ -204,11 +200,10 @@ main() {
|
|
|
204
200
|
|
|
205
201
|
# Check if local server is running
|
|
206
202
|
if curl -s -f "http://localhost:4000" >/dev/null 2>&1; then
|
|
207
|
-
test_url "http://localhost:4000/docs/
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
test_diagram_rendering "http://localhost:4000/docs/jekyll/mermaid-test-suite/" "Diagrams render on test page"
|
|
203
|
+
test_url "http://localhost:4000/docs/features/mermaid-diagrams/" "Main documentation accessible"
|
|
204
|
+
test_mermaid_script "http://localhost:4000/docs/features/mermaid-diagrams/" "Mermaid script loads on docs page"
|
|
205
|
+
test_mermaid_init "http://localhost:4000/docs/features/mermaid-diagrams/" "Mermaid initializes on docs page"
|
|
206
|
+
test_diagram_rendering "http://localhost:4000/docs/features/mermaid-diagrams/" "Diagrams render on docs page"
|
|
212
207
|
else
|
|
213
208
|
log_warning "Local Jekyll server not running. Start with: bundle exec jekyll serve"
|
|
214
209
|
fi
|
|
@@ -220,11 +215,10 @@ main() {
|
|
|
220
215
|
|
|
221
216
|
# Check if Docker container is running
|
|
222
217
|
if docker ps | grep -q "zer0-mistakes-jekyll"; then
|
|
223
|
-
test_url "http://localhost:4000/docs/
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
test_diagram_rendering "http://localhost:4000/docs/jekyll/mermaid-test-suite/" "Docker: Diagrams render"
|
|
218
|
+
test_url "http://localhost:4000/docs/features/mermaid-diagrams/" "Docker: Main documentation accessible"
|
|
219
|
+
test_mermaid_script "http://localhost:4000/docs/features/mermaid-diagrams/" "Docker: Mermaid script loads"
|
|
220
|
+
test_mermaid_init "http://localhost:4000/docs/features/mermaid-diagrams/" "Docker: Mermaid initializes"
|
|
221
|
+
test_diagram_rendering "http://localhost:4000/docs/features/mermaid-diagrams/" "Docker: Diagrams render"
|
|
228
222
|
else
|
|
229
223
|
log_warning "Docker container not running. Start with: docker-compose up -d"
|
|
230
224
|
fi
|
|
@@ -87,4 +87,72 @@ test_categorization "security: patch vulnerability" "security"
|
|
|
87
87
|
test_categorization "BREAKING: major change" "breaking"
|
|
88
88
|
test_categorization "random commit" "other"
|
|
89
89
|
|
|
90
|
+
# Test: update_changelog_file
|
|
91
|
+
echo -e "\nTesting update_changelog_file..."
|
|
92
|
+
|
|
93
|
+
# Each case runs in a throwaway directory; CHANGELOG_FILE is the relative
|
|
94
|
+
# default ("CHANGELOG.md"), so the function operates on the temp copy.
|
|
95
|
+
_changelog_tmp=$(mktemp -d)
|
|
96
|
+
pushd "$_changelog_tmp" >/dev/null
|
|
97
|
+
|
|
98
|
+
# Case 1: pending [Unreleased] notes are folded into the new entry and the
|
|
99
|
+
# preamble stays at the top of the file.
|
|
100
|
+
cat > CHANGELOG.md <<'FIXTURE'
|
|
101
|
+
# Changelog
|
|
102
|
+
|
|
103
|
+
All notable changes are documented here.
|
|
104
|
+
|
|
105
|
+
## [Unreleased]
|
|
106
|
+
|
|
107
|
+
### Added
|
|
108
|
+
- Pending feature A
|
|
109
|
+
|
|
110
|
+
## [1.0.0] - 2026-01-01
|
|
111
|
+
|
|
112
|
+
### Added
|
|
113
|
+
- Initial release
|
|
114
|
+
FIXTURE
|
|
115
|
+
|
|
116
|
+
update_changelog_file "## [1.1.0] - 2026-06-10
|
|
117
|
+
|
|
118
|
+
### Changed
|
|
119
|
+
- Version bump: minor release
|
|
120
|
+
" >/dev/null 2>&1
|
|
121
|
+
|
|
122
|
+
assert_false "grep -q '^## \[Unreleased\]' CHANGELOG.md" "Pending Unreleased section is consumed"
|
|
123
|
+
assert_true "grep -q 'Pending feature A' CHANGELOG.md" "Pending notes are preserved"
|
|
124
|
+
assert_equals "# Changelog" "$(head -n 1 CHANGELOG.md)" "Preamble heading stays on line 1"
|
|
125
|
+
# The folded notes must land inside the new 1.1.0 entry (above 1.0.0)
|
|
126
|
+
_pending_line=$(grep -n 'Pending feature A' CHANGELOG.md | cut -d: -f1)
|
|
127
|
+
_v110_line=$(grep -n '^## \[1.1.0\]' CHANGELOG.md | cut -d: -f1)
|
|
128
|
+
_v100_line=$(grep -n '^## \[1.0.0\]' CHANGELOG.md | cut -d: -f1)
|
|
129
|
+
assert_true "[[ $_pending_line -gt $_v110_line && $_pending_line -lt $_v100_line ]]" "Folded notes live inside the new entry"
|
|
130
|
+
|
|
131
|
+
# Case 2: without an Unreleased section the entry is inserted before the
|
|
132
|
+
# first release heading, after the preamble.
|
|
133
|
+
cat > CHANGELOG.md <<'FIXTURE'
|
|
134
|
+
# Changelog
|
|
135
|
+
|
|
136
|
+
All notable changes are documented here.
|
|
137
|
+
|
|
138
|
+
## [1.0.0] - 2026-01-01
|
|
139
|
+
|
|
140
|
+
### Added
|
|
141
|
+
- Initial release
|
|
142
|
+
FIXTURE
|
|
143
|
+
|
|
144
|
+
update_changelog_file "## [1.0.1] - 2026-06-10
|
|
145
|
+
|
|
146
|
+
### Fixed
|
|
147
|
+
- A bug
|
|
148
|
+
" >/dev/null 2>&1
|
|
149
|
+
|
|
150
|
+
_v101_line=$(grep -n '^## \[1.0.1\]' CHANGELOG.md | cut -d: -f1)
|
|
151
|
+
_v100_line=$(grep -n '^## \[1.0.0\]' CHANGELOG.md | cut -d: -f1)
|
|
152
|
+
assert_true "[[ $_v101_line -lt $_v100_line ]]" "New entry inserted before previous release"
|
|
153
|
+
assert_true "grep -q 'All notable changes' CHANGELOG.md" "Preamble preserved without Unreleased"
|
|
154
|
+
|
|
155
|
+
popd >/dev/null
|
|
156
|
+
rm -rf "$_changelog_tmp"
|
|
157
|
+
|
|
90
158
|
echo -e "\n${GREEN}changelog.sh tests complete${NC}"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jekyll-theme-zer0
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.12.
|
|
4
|
+
version: 1.12.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Amr Abdel
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-06-
|
|
11
|
+
date: 2026-06-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|