Updated GitHub Actions workflow to include permissions and modified installation command for mdcms. Changed directory handling for building sections to use a loop instead of hardcoded values.
- mdcms.py: expand abbreviated notice to full boilerplate
- app/index.html: fix version in comment header (v0.3.8 → v0.4)
- app/config.yml: add missing final two lines of notice
- app/theme.yml: add full licence notice (was missing entirely)
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Branching: main=release, development=default dev branch, no per-conversation branches
- Add v0.4 renderer features section (callouts, TOC, theme, icons, PWA, fetch-deps)
- Note topbar nav is broken — always use sidebar
- Update version markers to v0.4 throughout
- Add note that tag pushes must be done locally (cloud env blocks them)
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Completes the v0.4 milestone. All 7 phases merged and tested.
Phase 7: manifest.json + service-worker.js generation, cache-first offline SW,
offline message from config.yml, favicon.png, PWA installable on desktop.
Also: callout border-color/background CSS fix; v0.4.0 version bump across all files.
- mdcms.py: CLI_VERSION 0.4.0, updated docstring and comment
- pyproject.toml: version 0.4.0
- app/index.html: site format marker → mdcms v0.4
- app/config.yml: site format marker → mdcms v0.4
- app/theme.yml: add site format marker mdcms v0.4
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
border-left was 4px solid without color; background was missing.
JS sets --callout-primary and --callout-bg on each callout element
but CSS wasn't referencing them.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Cherry-pick had auto-merged with wrong base (reverted TOC/callout CSS
and renderTocTag). Now uses main's index.html with only the three
phase7 additions applied on top: manifest link, SW registration
script, and offline-message localStorage handling.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- config.yml: pwa: yes, navigation: sidebar, offline-message
- home.md: Phase 7 test instructions
- about.md, docs.md: sample pages for offline cache testing
- test_phase.py: all phases point to claude/* branches; EXTRA_FILES for 5 and 7
- version bump to 0.3.9
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Add generate_pwa(): builds manifest.json (name, short_name, theme_color,
standalone display, favicon icon) and service-worker.js with a
cache-first strategy; cache name is versioned by a hash of the precache
file list so new builds automatically invalidate old caches; precache
list covers index.html, config.yml, nav.yml, search.json, theme file,
and all pages/posts/assets
- Call generate_pwa() from run_build() when pwa: yes/true in config.yml
- index.html: add <link rel="manifest"> and SW registration script in
<head>; both silently no-op when the generated files are absent
- index.html boot(): write offline-message from config to localStorage
on every load so the message survives cache eviction
- index.html navigateTo(): show localStorage offline message when a page
fetch fails instead of the generic not-found message
- Update CLAUDE.md with PWA config key reference
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- Add renderTocTag(): groups visible pages by section in section sort
order; sorts pages within each section by sort then filename; excludes
current page, draft sections, and category-invisible pages; renders
section headings and linked page lists; replaces the tag placeholder
- Add toc dispatch in hydrateMdcmsTags()
- Add .mdcms-toc, .mdcms-toc-section, .mdcms-toc-list CSS
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- iconEl: use actual icon filename as <img src> fallback so browser
shows a visible broken image when the file is missing (was src="")
- Remove debug console.log statements added for diagnosis
- home.md: add test cases for message: override (with console warning)
and missing icon (broken image should render)
- home.md: add explanatory text for message: key test
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
Helps diagnose why title row is not showing. Logging shows the raw tag
data and whether the title branch is taken. Inline style bypasses any
CSS custom-property cascade issues.
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Phase 4 branch points to claude/debug-api-errors-gd730
- Phase 4 EXTRA_FILES checks out app/config.yml and app/pages/home.md
from the branch (needed for message: key test and callout test cases)
- Updated Phase 4 verify checklist covers all spec requirements:
basic types, title row, no-title, markdown body, icon override,
message: key, dark mode
- Added EXTRA_FILES mechanism for per-phase content file checkout
- Improved checklist formatting with section headers
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Extend renderer.code to match `mdcms <type>` fence syntax (e.g. ```mdcms callout-info)
- Extend parseMdcmsTag to capture body lines after the key-value block
- Add renderCalloutTag: icon + title row, markdown body, colour CSS vars
- Add hexToRgba helper for low-opacity background colour
- Make themeConfig module-level so callout renderer can read callout defaults
- Add callout CSS: left border, title row flex layout, icon fill
- Add reusable message: key support with category-aware language resolution
- Add aitranslation callout message to config.yml for test
- Update home.md with full Phase 4 test cases
https://claude.ai/code/session_01UP8Wo2CKPNhvvTkzX48CWF
- Add validate_assets(): scans config.yml and theme.yml recursively for
string values starting with assets/, and all markdown files in pages/
and posts/ via regex; deduplicates by (path, source) before checking
- Add _collect_yaml_assets() helper for recursive YAML traversal
- Call validate_assets() in run_build() after writing nav.yml and
search.json; prints yellow warnings for each missing asset, build
continues on all warnings
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- Add 17 SVG icons to app/assets/icons/ (Material Icons paths, Apache 2.0)
- Remove Google Material Icons and Symbols CDN link tags
- Add normaliseIconName(), loadIcon(), getIcon(), iconEl() — icon name
normalisation per spec §2.3, async fetch-and-cache, sync accessor,
element builder with broken-image fallback for missing icons
- Preload all standard icons (+ categories-selecticon if set) concurrently
in boot() before UI is built, so all icon references are sync after that
- Replace ICONS object with icon cache system throughout:
theme toggle → light_mode/dark_mode, search → search, hamburgers → menu,
section toggles → arrow_right/arrow_drop_down, dropdown carets →
arrow_drop_down, category selecticon → normalised SVG lookup
- Update .toggle-icon, .category-icon, .nav-caret CSS for SVG layout
- Add .mdcms-icon CSS class (inline-flex, currentColor fill)
- Fix pre-existing ICONS.close bug (was undefined; hamburger now always
shows menu icon)
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c
- Add app/theme.yml: colours (light/dark), semantic colours, callout
defaults, fonts (with bunny: provider support), font-size, line-height,
main-width, nav-width
- app/config.yml: add `theme: theme.yml` reference; remove font and
layout keys that now live in theme.yml
- index.html: add applyThemeYml() that reads the new theme.yml format
and derives all CSS custom properties (accent-rgb, nav-active-bg,
nav-hover-bg, table-header-bg, link-colour) from the 5 user keys per
mode; add --colour-info/warning/success/error CSS vars with hardcoded
defaults; add --line-height-body CSS var
- index.html: update loadFonts() to accept themeConfig, support
provider:name:weight format for Bunny Fonts and Google Fonts
- index.html: boot() fetches theme file named by config.theme, routes
to applyThemeYml() for new format or applyConfigTheme() for legacy;
falls back gracefully to hardcoded defaults when theme key is absent
https://claude.ai/code/session_015XtsgTMi8UtmgxEgb5Qt2c