jekyll-theme-zer0 1.12.2 → 1.13.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbc99ee38514486f868b91a616bcfece9ab588d4c27c18f358592c12bac98225
4
- data.tar.gz: 864ff57c952cfb6c6761ab4b140545401f762bb8485d192c48a31ffee1e9ab65
3
+ metadata.gz: 8ad83858a690a41ecdcffeb9d1666bdb477c74f5dc0e203bc0059a56e7ed68a2
4
+ data.tar.gz: 88b906b270107cc25861394ff63b9772b9b1758c39315a2758bbe45f42ec00cc
5
5
  SHA512:
6
- metadata.gz: ad7d6da5e0c707aa5ea232e5d3a714bbd0ed3955cc220d950dec7103715665a4e9a799f9a028e2eb57e1f161b0bf286dd39a5d145110f0a2936067405a698aae
7
- data.tar.gz: b5428a640a6a5aee60e170d4c69780e3538704575a9a1ff2d23d26c9583429f0e2ad1da79185906260e75a60092f4d88b139e01fa2b7cf954fa9a77258f2879b
6
+ metadata.gz: a24b1b809afaff0913078bbdbf5ba74799c757d330203ef54f0bccc21e8d4fe82920430ce3d981a540bcea0ac89f8e31b1284eb92db60d0f89c3986b16891126
7
+ data.tar.gz: 01dd7a1a0ae1ab4f82936db64ecd509280c76714e80ae55be46c0f67dbca6c59efd5f7590960d11f46237380b6b680873f816e6bb72845d7726c24137b57e4c6
data/CHANGELOG.md CHANGED
@@ -1,34 +1,54 @@
1
1
  # Changelog
2
2
 
3
- ## [1.12.2] - 2026-06-10
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.13.1] - 2026-06-11
4
9
 
5
10
  ### Changed
6
11
  - Version bump: patch release
7
12
 
8
13
  ### 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)
14
+ - 583fa997 fix(infra): sanitize sensitive config keys before DOM injection (T-009) (#141)
11
15
 
16
+ ### Security
17
+ - **Admin config page sanitization (T-009)**: the hidden `<pre id="cfg-full-yaml">` element on the admin config page now has values masked for keys matching `api_key`, `secret`, `password`, `token`, and `phc_` (PostHog) prefixes via a new `sanitize_config_yaml` Liquid filter (`_plugins/sanitize_config_filter.rb`); the corresponding Playwright regression guard (`test/visual/security.spec.js`) is promoted from `test.fixme` to a live test
12
18
 
13
- ## [1.12.1] - 2026-06-10
19
+ ## [1.13.0] - 2026-06-11
14
20
 
15
21
  ### Changed
16
- - Version bump: patch release
22
+ - Version bump: minor release
17
23
 
18
24
  ### Commits in this release
19
- - 0c04f703 fix: repair failing test suites, validator crashes, and roadmap/changelog drift (#132)
20
-
25
+ - cee6f379 feat(ci): gate PRs on the full canonical test entrypoint (T-012) (#138)
21
26
 
22
- All notable changes to this project will be documented in this file.
27
+ ### Added
28
+ - **CI gate parity (T-012)**: the `ci.yml` test job now runs every non-Playwright theme suite (core, deployment, quality, installation, installer, site_generation, obsidian) plus the canonical `./scripts/bin/test` script suites (lib unit, theme validate, integration, installer e2e) on every code PR — previously only `core,quality,installation` gated, which is how three suites rotted unnoticed before PR #132; a "Gate Coverage — What Enforces What" table in `.github/workflows/README.md` now documents the controls contract
23
29
 
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).
30
+ ### Fixed
31
+ - **Release changelog path**: `version-bump.yml` now inserts release entries via the shared `update_changelog_file` library instead of an inline `head`/`tail` prepend that duplicated (and regressed) the insertion logic the 1.12.1 release had pushed the file preamble below its entry and stranded the pending `[Unreleased]` notes; both repaired in this file
26
32
 
27
- ## [Unreleased]
33
+ ## [1.12.2] - 2026-06-10
28
34
 
29
35
  ### Added
30
36
  - **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
37
 
38
+ ### Changed
39
+ - Version bump: patch release
40
+
41
+ ### Commits in this release
42
+ - 846bd9ff chore(backlog): plan the Zer0-Mistake Quality Framework (roadmap v1.13, T-012–T-015) (#133)
43
+ - 33a727c0 docs: expand CLAUDE.md into a comprehensive Claude Code guide (#131)
44
+
45
+ ## [1.12.1] - 2026-06-10
46
+
47
+ ### Changed
48
+ - Version bump: patch release
49
+ - **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)
50
+ - **Changelog**: restored the Keep a Changelog preamble at the top of this file
51
+
32
52
  ### Fixed
33
53
  - **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
54
  - **Test suite**: repaired the three test suites that failed on `main`:
@@ -37,9 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
37
57
  - `_layouts/search.html` given a front matter block so theme layout validation passes
38
58
  - **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
59
 
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
60
+ ### Commits in this release
61
+ - 0c04f703 fix: repair failing test suites, validator crashes, and roadmap/changelog drift (#132)
43
62
 
44
63
  ## [1.12.0] - 2026-06-03
45
64
 
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.2
5
+ version: 1.13.1
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-10T22:17:20.000Z
23
+ lastmod: 2026-06-11T21:37:24.000Z
24
24
  draft: false
25
25
  permalink: /
26
26
  slug: zer0
@@ -909,7 +909,7 @@ git push origin feature/awesome-feature
909
909
 
910
910
  | Metric | Value |
911
911
  |--------|-------|
912
- | **Current Version** | 1.12.2 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
912
+ | **Current Version** | 1.13.1 ([RubyGems](https://rubygems.org/gems/jekyll-theme-zer0), [CHANGELOG](/CHANGELOG)) |
913
913
  | **Documented Features** | 43 ([Feature Registry](https://github.com/bamr87/zer0-mistakes/blob/main/_data/features.yml)) |
914
914
  | **Setup Time** | 2-5 minutes ([install.sh benchmarks](https://github.com/bamr87/zer0-mistakes/blob/main/install.sh)) |
915
915
  | **Documentation Pages** | 70+ ([browse docs](https://zer0-mistakes.com/pages/)) |
@@ -964,6 +964,6 @@ And these AI partners that make zer0-mistakes truly AI-native:
964
964
 
965
965
  **Built with ❤️ — and a little help from our AI partners — for the Jekyll community**
966
966
 
967
- **v1.12.2** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md) • [AI Agent Guide](AGENTS.md)
967
+ **v1.13.1** • [Changelog](CHANGELOG.md) • [License](LICENSE) • [Contributing](CONTRIBUTING.md) • [AI Agent Guide](AGENTS.md)
968
968
 
969
969
 
data/_data/backlog.yml CHANGED
@@ -55,8 +55,8 @@
55
55
 
56
56
  meta:
57
57
  title: "zer0-mistakes Backlog"
58
- updated: 2026-06-10
59
- next_id: 16
58
+ updated: 2026-06-11
59
+ next_id: 18
60
60
 
61
61
  tasks:
62
62
  # --- Housekeeping (seeded so the loop has work on day one) ------------------
@@ -213,7 +213,7 @@ tasks:
213
213
 
214
214
  - id: T-009
215
215
  title: "Sanitize sensitive config keys from admin config-page DOM injection"
216
- status: open
216
+ status: done
217
217
  priority: P1
218
218
  area: infra
219
219
  risk: standard
@@ -231,7 +231,7 @@ tasks:
231
231
  - "The visible config display in the admin UI is unaffected (only the raw hidden element is sanitised)."
232
232
  links: { issue: null, pr: null, roadmap: null }
233
233
  created: 2026-06-01
234
- updated: 2026-06-01
234
+ updated: 2026-06-11
235
235
 
236
236
  - id: T-010
237
237
  title: "Complete v1.9 quickstart docs rewrite with getting-started guide and screenshots"
@@ -287,7 +287,7 @@ tasks:
287
287
 
288
288
  - id: T-012
289
289
  title: "CI gate parity: run the full canonical test entrypoint on PRs"
290
- status: open
290
+ status: done
291
291
  priority: P1
292
292
  area: infra
293
293
  risk: standard
@@ -300,6 +300,13 @@ tasks:
300
300
  PR #132), the obsidian suite, and the installer e2e suites that
301
301
  `./scripts/bin/test` runs locally. PRs must gate on the same entrypoint
302
302
  contributors are told to run.
303
+ Done 2026-06-10: test job expanded to all seven non-Playwright theme
304
+ suites plus a `./scripts/bin/test` step; gate-coverage table added to
305
+ the workflows README. Canary experiment: a deliberately failing
306
+ integration test was committed and reverted on the implementing PR;
307
+ GitHub did not schedule the CI pipeline on the canary push, so the
308
+ gate failure was verified locally (`./scripts/bin/test` exit 1) and
309
+ the new gate is exercised for real by the PR's final CI run.
303
310
  acceptance:
304
311
  - "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
312
  - "A deliberately broken integration test fails CI in a draft PR experiment (then reverted)."
@@ -371,3 +378,50 @@ tasks:
371
378
  links: { issue: null, pr: null, roadmap: "1.13" }
372
379
  created: 2026-06-10
373
380
  updated: 2026-06-10
381
+
382
+ - id: T-016
383
+ title: "site_generation suite: fail on Jekyll build errors instead of warning"
384
+ status: open
385
+ priority: P2
386
+ area: tests
387
+ risk: standard
388
+ effort: S
389
+ source: audit
390
+ summary: >-
391
+ `test/test_site_generation.sh` downgrades `bundle exec jekyll build`
392
+ failures to a warning ("Don't fail the test for build issues (may be
393
+ environment)"), so the suite reports success even when every mode's
394
+ build fails — a masked gate discovered while implementing T-012. With
395
+ the suite now gating PRs in CI (working bundler guaranteed), build
396
+ failures should fail the suite; keep the skip only for genuinely
397
+ missing toolchain (no bundler).
398
+ acceptance:
399
+ - "A non-zero `jekyll build` exit fails the suite when bundler is available."
400
+ - "The bundler-missing path still skips with a warning (local minimal environments)."
401
+ - "Suite passes in CI and via `./test/test_runner.sh --suites site_generation` locally."
402
+ links: { issue: null, pr: null, roadmap: "1.13" }
403
+ created: 2026-06-10
404
+ updated: 2026-06-10
405
+
406
+ - id: T-017
407
+ title: "Fix yamllint violations in .github/workflows/version-bump.yml"
408
+ status: open
409
+ priority: P2
410
+ area: lint
411
+ risk: low
412
+ effort: S
413
+ source: audit
414
+ summary: >-
415
+ `.github/workflows/version-bump.yml` has ~30 trailing-space lines, two
416
+ indentation errors, and one brackets error that cause the `auto-version`
417
+ integration test (which runs yamllint) to fail in CI on every PR. Discovered
418
+ while babysitting PR #141 — the file was unchanged by that PR, confirming
419
+ the failures are pre-existing.
420
+ acceptance:
421
+ - "`yamllint -c .github/config/.yamllint.yml .github/workflows/version-bump.yml` exits 0."
422
+ - "`./scripts/test/integration/auto-version` passes the 'version-bump workflow syntax' check."
423
+ - "No functional change to the workflow logic."
424
+ links: { issue: null, pr: null, roadmap: null }
425
+ created: 2026-06-11
426
+ updated: 2026-06-11
427
+
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # File: sanitize_config_filter.rb
4
+ # Path: _plugins/sanitize_config_filter.rb
5
+ # Purpose: Liquid filter that masks sensitive key-value pairs in raw YAML
6
+ # before the content is injected into the DOM. Used by the admin
7
+ # config page to sanitize <pre id="cfg-full-yaml">.
8
+ #
9
+ # Masked patterns:
10
+ # Key names: api_key, apikey, secret, password, token (case-insensitive)
11
+ # Value prefix: phc_ (PostHog project API keys)
12
+
13
+ module Jekyll
14
+ module SanitizeConfigFilter
15
+ # Matches YAML lines whose key name is a common secret identifier.
16
+ SENSITIVE_KEY_RE = /\A(\s*(?:api[_-]?key|secret|password|token)\s*:)/i.freeze
17
+ # Matches PostHog project API key values anywhere on a line.
18
+ PHC_VALUE_RE = /phc_[A-Za-z0-9]+/.freeze
19
+
20
+ def sanitize_config_yaml(input)
21
+ return input unless input.is_a?(String)
22
+
23
+ input.each_line.map do |line|
24
+ if SENSITIVE_KEY_RE.match?(line)
25
+ # Keep the key name and colon; replace everything after with [REDACTED]
26
+ line.sub(/(:\s*).*$/, '\1[REDACTED]')
27
+ elsif PHC_VALUE_RE.match?(line)
28
+ line.gsub(PHC_VALUE_RE, '[REDACTED]')
29
+ else
30
+ line
31
+ end
32
+ end.join
33
+ end
34
+ end
35
+ end
36
+
37
+ Liquid::Template.register_filter(Jekyll::SanitizeConfigFilter)
@@ -331,27 +331,33 @@ update_changelog_file() {
331
331
  } > "${CHANGELOG_FILE}.tmp"
332
332
  mv "${CHANGELOG_FILE}.tmp" "$CHANGELOG_FILE"
333
333
 
334
- # Append the pending notes to the new entry (if any are non-blank)
334
+ # Append the pending notes to the new entry (if any are non-blank),
335
+ # separated by a blank line so section headings don't collide.
335
336
  if [[ -n "${unreleased_body//[[:space:]]/}" ]]; then
336
337
  debug "Folding pending [Unreleased] notes into the new entry"
337
- entry+=$'\n'"$(echo "$unreleased_body" | sed -e '/./,$!d')"$'\n'
338
+ entry="${entry%$'\n'}"$'\n\n'"$(echo "$unreleased_body" | sed -e '/./,$!d')"$'\n'
338
339
  fi
339
340
  fi
340
341
 
341
342
  # Insert the new entry before the first release heading so the file
342
343
  # header/preamble (title, Keep a Changelog blurb) stays at the top.
344
+ # Normalize the entry's trailing newlines first: callers that build the
345
+ # entry via command substitution (e.g. version-bump.yml's
346
+ # `"$(cat "$TEMP_FILE")"`) lose them, so guarantee exactly one blank
347
+ # line between the entry and the next release block here.
348
+ while [[ "$entry" == *$'\n' ]]; do entry="${entry%$'\n'}"; done
349
+
343
350
  local first_release
344
351
  first_release=$(grep -n '^## ' "$CHANGELOG_FILE" | head -1 | cut -d: -f1)
345
352
 
346
353
  {
347
354
  if [[ -n "$first_release" ]]; then
348
355
  head -n "$((first_release - 1))" "$CHANGELOG_FILE"
349
- echo "$entry"
356
+ printf '%s\n\n' "$entry"
350
357
  tail -n +"$first_release" "$CHANGELOG_FILE"
351
358
  else
352
359
  cat "$CHANGELOG_FILE"
353
- echo ""
354
- echo "$entry"
360
+ printf '\n%s\n' "$entry"
355
361
  fi
356
362
  } > "${CHANGELOG_FILE}.tmp"
357
363
 
@@ -152,6 +152,15 @@ _v100_line=$(grep -n '^## \[1.0.0\]' CHANGELOG.md | cut -d: -f1)
152
152
  assert_true "[[ $_v101_line -lt $_v100_line ]]" "New entry inserted before previous release"
153
153
  assert_true "grep -q 'All notable changes' CHANGELOG.md" "Preamble preserved without Unreleased"
154
154
 
155
+ # Case 3: entries passed via command substitution lose trailing newlines
156
+ # (e.g. version-bump.yml's "$(cat "$TEMP_FILE")"); the insert must still
157
+ # leave exactly one blank line before the next release block.
158
+ printf '## [1.0.2] - 2026-06-11\n\n### Fixed\n- Another bug\n\n' > entry.txt
159
+ update_changelog_file "$(cat entry.txt)" >/dev/null 2>&1
160
+ _v101_line=$(grep -n '^## \[1.0.1\]' CHANGELOG.md | cut -d: -f1)
161
+ assert_true "[[ -z \"\$(sed -n $((_v101_line - 1))p CHANGELOG.md)\" ]]" "Blank line separates entry from next release block"
162
+ assert_true "[[ -n \"\$(sed -n $((_v101_line - 2))p CHANGELOG.md)\" ]]" "Exactly one blank line (no double spacing)"
163
+
155
164
  popd >/dev/null
156
165
  rm -rf "$_changelog_tmp"
157
166
 
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.2
4
+ version: 1.13.1
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-10 00:00:00.000000000 Z
11
+ date: 2026-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -220,6 +220,7 @@ files:
220
220
  - _plugins/content_statistics_generator.rb
221
221
  - _plugins/obsidian_links.rb
222
222
  - _plugins/preview_image_generator.rb
223
+ - _plugins/sanitize_config_filter.rb
223
224
  - _plugins/search_and_sitemap_generator.rb
224
225
  - _plugins/theme_version.rb
225
226
  - _sass/components/_back-to-top.scss