Skip to content

Commit 4d0184e

Browse files
authored
Merge pull request #409 from FritzAndFriends/dev
Release v0.17.0 Merge dev to main
2 parents 613390d + de228e5 commit 4d0184e

File tree

14 files changed

+1190
-19
lines changed

14 files changed

+1190
-19
lines changed

.ai-team/agents/beast/history.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,7 @@
7373
📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent — decided by Cyclops
7474
📌 Team update (2026-03-02): Theming sample page uses 6-section progressive layout (Jubilee). Docs should reference this pattern for theming examples — decided by Jubilee
7575

76+
77+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)
78+
79+
Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge

.ai-team/agents/colossus/history.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,5 @@ Added 5 smoke tests (Timer, UpdatePanel, UpdateProgress, ScriptManager, Substitu
5050
Team update (2026-03-01): D-11 through D-14 formally registered. D-12 boolean attrs and GUID IDs now handled by normalizer decided by Forge
5151
📌 Team update (2026-03-02): FontInfo.Name/Names now auto-synced bidirectionally. Theme font-family renders correctly. Integration tests targeting font-family should now work — decided by Cyclops, Rogue
5252
📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent — decided by Cyclops
53+
54+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)

.ai-team/agents/cyclops/history.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,24 @@ Team update (2026-02-28): GetCssClassOrNull() uses IsNullOrEmpty not IsNullOrWhi
7676
- **ApplyThemeSkin guard:** Updated `BaseStyledComponent.ApplyThemeSkin` to check both `Font.Name` AND `Font.Names` are empty before applying theme font. Prevents theme from overriding an explicitly set `Names` value.
7777
- **Root cause:** `ApplyThemeSkin` set `Font.Name` but `HasStyleExtensions.ToStyle()` reads `Font.Names` for `font-family`. Without auto-sync, theme fonts were silently lost.
7878
- **Lesson:** When Web Forms has paired/synced properties (Name↔Names, Value↔SelectedValue, etc.), our Blazor equivalents must replicate the sync behavior or the rendering pipeline breaks at property boundaries.
79+
80+
### CI/CD Unified Release Process (2026-03-02)
81+
82+
- **Unified release.yml:** Created `.github/workflows/release.yml` triggered on `release: published`. Single workflow coordinates all release artifacts: NuGet publish, Docker build+push to GHCR, docs deploy to GitHub Pages, demo builds with release attachment. All jobs extract version from `github.event.release.tag_name` stripping the `v` prefix, ensuring every artifact gets the same version.
83+
- **Version extraction pattern:** Use `${{ github.event.release.tag_name }}` (not `${{ github.ref_name }}`) for release events. Strip `v` prefix via bash `${VERSION#v}` and write to `$GITHUB_ENV` for use across steps.
84+
- **NuGet version override:** Pass both `-p:PackageVersion=$VERSION` and `-p:Version=$VERSION` to `dotnet pack` and `dotnet build` respectively, overriding NBGV-computed versions with the exact release tag version.
85+
- **Secret-gating pattern:** Use `env: NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}` at step level, then `if: env.NUGET_API_KEY != ''` — this is the GitHub Actions idiom for conditional steps based on secret availability.
86+
- **gh CLI in workflows:** Set `GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}` as env var for `gh release upload` commands.
87+
- **Docker image tags lowercase:** Registry/image path must be lowercase: `ghcr.io/fritzandfriends/blazorwebformscomponents/serversidesamples`.
88+
- **deploy-server-side.yml refactored:** Removed `push: branches: [main]` trigger and path filters. Now `workflow_dispatch` only — emergency manual escape hatch.
89+
- **nuget.yml refactored:** Removed `push: tags: [v*]` trigger. Now `workflow_dispatch` with version input — emergency manual NuGet republish.
90+
- **docs.yml fix:** Replaced deprecated `echo ::set-output name=release::${RELEASE}` with `echo "release=${RELEASE}" >> "$GITHUB_OUTPUT"`. Kept push-to-main deploy for doc-only changes between releases.
91+
- **demo.yml versioned artifacts:** Added NBGV version computation step. Artifact names now include version: `demo-server-side-${{ steps.nbgv.outputs.version }}`.
92+
- **version.json:** Changed from `"version": "0.17"` (2-segment) to `"version": "0.17.0"` (3-segment SemVer). NBGV now computes clean 3-segment versions matching our tag format.
93+
- **NBGV key lesson:** NBGV ignores git tags entirely — it reads `version.json` for major.minor and computes patch from git height. Tags are informational; `version.json` must be kept in sync. For releases, override NBGV output with explicit `-p:Version=` from the tag.
94+
- **Workflow dependency order:** release.yml uses `needs:` to enforce: build-and-test → [publish-nuget, deploy-docker, deploy-docs, build-demos] (fan-out after gate job).
95+
- **Lesson:** GitHub Actions `$GITHUB_OUTPUT` replaced `::set-output` (deprecated Oct 2022). Always use `echo "key=value" >> "$GITHUB_OUTPUT"` for step outputs.
96+
97+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)
98+
99+
Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge

.ai-team/agents/forge/history.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,65 @@ Line-by-line classification: DataList (110 lines), GridView (33 lines), ListView
108108

109109
**Also updated:** Summary table, category definitions (added ID Generation, Attribute Format, Style), revision history, header status line.
110110

111+
### Summary: Full Skins & Themes Roadmap (#369) (2026-02-28)
112+
113+
**By:** Forge
114+
**What:** Created prioritized 3-wave roadmap for full theming implementation, 15 work items total.
115+
116+
**Architecture decisions:**
117+
- Sub-component styles use `Dictionary<string, TableItemStyle>` on `ControlSkin`, keyed by style name ("HeaderStyle", "RowStyle", etc.)
118+
- ThemeMode enum (`StyleSheetTheme` vs `Theme`) controls priority — StyleSheetTheme = defaults, Theme = overrides
119+
- Container-level EnableTheming propagation via dedicated cascading bool, not parent chain walking (O(1) vs O(n))
120+
- Runtime theme switching requires new ThemeConfiguration instance (CascadingValue reference equality)
121+
- .skin file parser recommended as build-time source generator (works in all Blazor hosting models)
122+
- JSON theme format is complementary to C# config, not a replacement
123+
124+
**Key findings from code audit:**
125+
- DataBound inheritance chain is correct: DataBoundComponent<T> → BaseDataBoundComponent → BaseStyledComponent — all data controls get top-level theming automatically
126+
- 6 style container interfaces already exist (IGridViewStyleContainer, IDetailsViewStyleContainer, IFormViewStyleContainer, ICalendarStyleContainer, IDataGridStyleContainer, IDataListStyleContainer) with ~41 total sub-style slots
127+
- UiStyle<T> / UiTableItemStyle classes provide sub-component style rendering infrastructure
128+
- ControlSkin is flat (no sub-styles) — extending it is the biggest single work item
129+
130+
**File paths:**
131+
- Roadmap: `.ai-team/decisions/inbox/forge-themes-full-roadmap.md`
132+
- Existing theming code: `src/BlazorWebFormsComponents/Theming/` (ThemeConfiguration.cs, ControlSkin.cs, ThemeProvider.razor)
133+
- Style container interfaces: `src/BlazorWebFormsComponents/Interfaces/I*StyleContainer.cs`
134+
- Base class wiring: `src/BlazorWebFormsComponents/BaseStyledComponent.cs` (OnParametersSet + ApplySkin)
135+
111136
Team update (2026-03-01): Skins & Themes has dual docs SkinsAndThemes.md (guide) and ThemesAndSkins.md (strategy). Review both for architecture audits decided by Beast
112137
Team update (2026-03-01): Normalizer pipeline order codified with 4 enhancements (case-insensitive, boolean attrs, empty styles, GUID IDs). Issue #387 decided by Cyclops
113138
📌 Team update (2026-03-02): FontInfo.Name/Names now auto-synced bidirectionally (backing fields). Theme font-family renders correctly. 11 tests verify. No code changes needed elsewhere — decided by Cyclops, Rogue
114139
📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent. Avoids Blazor duplicate-parameter error from _Imports.razor inheritance — decided by Cyclops
115140
📌 Team update (2026-03-02): Theming sample page uses 6-section progressive layout. BorderStyle enum needs FQN in theming code — decided by Jubilee
141+
142+
### Summary: Build/Version/Release Process Audit (2026-03-02)
143+
144+
**By:** Forge
145+
**What:** Full audit of 7 CI/CD workflows, NBGV version management, and release coordination. Audit saved to `.ai-team/decisions/inbox/forge-version-release-audit.md`.
146+
147+
**Critical findings:**
148+
1. `version.json` on main says `0.15` but latest tag is `v0.16` — NBGV computes `0.15.X`, not `0.16.0`. Every artifact built from main has wrong version prefix.
149+
2. NuGet (tag-triggered), Docker (main-push-triggered), docs (main-push or tag), and demos (main-push) all fire independently with no version coordination.
150+
3. `docs.yml` uses deprecated `::set-output` and has a release-detection regex that never matches this project's 2-segment tags (`v0.16`). Docs only deploy on main push, never on tag.
151+
4. No GitHub Release automation — releases are created manually, not all tags have releases.
152+
5. Docker image version comes from `nbgv get-version` on runner which reads stale `version.json`, not the tag.
153+
154+
**Recommendation:**
155+
- Create unified `release.yml` triggered by GitHub Release `published` event. One trigger → NuGet + Docker + docs + demos, all with same version from tag.
156+
- Keep NBGV but use it correctly: version.json drives dev/CI versions, release workflow overrides with `-p:Version=${TAG}` for exact release version.
157+
- Standardize on 3-segment SemVer tags (`v0.17.0`).
158+
- Retire independent deployment triggers (nuget.yml tag trigger, deploy-server-side.yml main-push trigger).
159+
- Automate post-release version bump via PR to dev.
160+
- Fix docs.yml deprecated syntax and broken regex immediately.
161+
162+
**Key infrastructure details learned:**
163+
- NBGV 3.9.50 in `Directory.Build.props`, applied to all projects
164+
- NuGet PackageId: `Fritz.BlazorWebFormsComponents`
165+
- Docker image: `ghcr.io/fritzandfriends/blazorwebformscomponents/serversidesamples`
166+
- Dockerfile strips NBGV via `sed`, accepts `VERSION` build-arg, passes `-p:Version=$VERSION`
167+
- `version.json` `publicReleaseRefSpec` includes main, master, v-branches, and v-tags
168+
- `version.json` `firstUnstableTag` is `preview` — dev branch gets `-preview.X` suffix
169+
- MkDocs uses Docker-based build (`docs/Dockerfile`), deploys to gh-pages branch via `crazy-max/ghaction-github-pages@v2.1.1`
170+
- `docs.yml` deploy guard: `github.event_name != 'pull_request' && (endsWith(github.ref, 'main') || steps.prepare.outputs.release == 'true')`
171+
172+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)

.ai-team/agents/jubilee/history.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,7 @@
5353

5454
📌 Team update (2026-03-02): FontInfo.Name/Names now auto-synced bidirectionally. Theme font-family renders correctly — decided by Cyclops, Rogue
5555
📌 Team update (2026-03-02): CascadedTheme (not Theme) is the cascading parameter name on BaseWebFormsComponent. Use CascadedTheme in any sample code accessing the cascading theme — decided by Cyclops
56+
57+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)
58+
59+
Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge

.ai-team/agents/rogue/history.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,7 @@ All 1437 tests pass (0 failures). Cyclops's auto-sync fix was already in place
114114
📌 Bug resolved: The Font.Name/Font.Names disconnect is fixed. ApplyThemeSkin sets Font.Name → auto-sync propagates to Font.Names → style builder reads Font.Names → font-family renders correctly. Full pipeline verified. — Rogue
115115

116116
📌 Test pattern: FontInfo sync tests are pure C# unit tests (no bUnit needed). Use `new FontInfo()` then set properties and assert the counterpart. Last-write-wins semantics: setting Name then Names means Names wins, and vice versa. — Rogue
117+
118+
Team update (2026-03-02): Unified release process implemented single release.yml triggered by GitHub Release publication coordinates all artifacts (NuGet, Docker, docs, demos). version.json now uses 3-segment SemVer (0.17.0). Existing nuget.yml and deploy-server-side.yml are workflow_dispatch-only escape hatches. PR #408 decided by Forge (audit), Cyclops (implementation)
119+
120+
Team update (2026-03-02): Full Skins & Themes roadmap defined 3 waves, 15 work items. Wave 1: Theme mode, sub-component styles (41 slots across 6 controls), EnableTheming propagation, runtime switching. See decisions.md for full roadmap and agent assignments decided by Forge

0 commit comments

Comments
 (0)