Skip to content

Commit c7b4b4b

Browse files
authored
v0.18 Release
v0.18 Release
2 parents f1e050d + 9a884b7 commit c7b4b4b

File tree

181 files changed

+17152
-170
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

181 files changed

+17152
-170
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,12 @@
8989
Team update (2026-03-06): Forge produced 8 script improvement recommendations (S1-S8) assigned to Bishop S1: @inherits WebFormsPageBase in _Imports.razor, S2: AddHttpContextAccessor in Program.cs, S3: : Page : WebFormsPageBase, S4: @using Enums, S5: Page_Load rename, S6: Cookie auth scaffold, S7: src~/action~ URL conversion, S8: Stub base class. Recommended Cycle 1: S1+S2+S3+S4 decided by Forge
9090
Team update (2026-03-06): LoginView is native BWFC migration script must stop converting to AuthorizeView. Strip asp: prefix only, preserve template names decided by Jeffrey T. Fritz, Forge
9191
Team update (2026-03-06): WebFormsPageBase is the canonical base class for all migrated pages (not ComponentBase). All agents must use WebFormsPageBase decided by Jeffrey T. Fritz
92+
93+
### RouteData → [Parameter] Bug Fix (Bishop)
94+
95+
- **Bug:** `[RouteData]` on Web Forms method parameters was replaced with `[Parameter]` inline — but `[Parameter]` targets Properties only (CS0592). Also, using `//` TODO comments inline risked absorbing the closing `)` of method signatures.
96+
- **Root cause:** `[RouteData]` is a Web Forms model-binding attribute for method parameters. `[Parameter]` is a Blazor component attribute valid only on properties. No inline Blazor equivalent exists for method parameter route binding.
97+
- **Fix:** Changed regex to strip `[RouteData]` entirely from method parameters (not replace with `[Parameter]`). A `/* TODO */` block comment is placed on the preceding line directing Layer 2 to promote the value to a `[Parameter]` property on the component class. Block comment (`/* */`) used instead of line comment (`//`) to avoid absorbing trailing code.
98+
- **Regex change:** `([ \t]*)\[RouteData\]``([ \t]*)\[RouteData\]\s*` (also consumes trailing whitespace to keep formatting clean).
99+
- **L1 tests:** All 15 pass (100% pass rate, 100% line accuracy).
100+
- **Key pattern:** When a Web Forms attribute has no inline Blazor equivalent, strip it and leave a TODO for Layer 2 — never substitute an attribute that targets a different declaration type.

.github/workflows/build.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,51 @@ jobs:
4242
dotnet restore src/BlazorWebFormsComponents/BlazorWebFormsComponents.csproj
4343
dotnet restore src/BlazorWebFormsComponents.Test/BlazorWebFormsComponents.Test.csproj
4444
dotnet restore samples/AfterBlazorServerSide/AfterBlazorServerSide.csproj
45+
dotnet restore src/BlazorWebFormsComponents.Analyzers.Test/BlazorWebFormsComponents.Analyzers.Test.csproj
46+
dotnet restore scripts/GenerateHealthSnapshot/GenerateHealthSnapshot.csproj
4547
4648
- name: Build library
4749
run: dotnet build src/BlazorWebFormsComponents/BlazorWebFormsComponents.csproj --configuration Release --no-restore
4850

4951
- name: Build test project
5052
run: dotnet build src/BlazorWebFormsComponents.Test/BlazorWebFormsComponents.Test.csproj --configuration Release --no-restore
5153

54+
- name: Build analyzer tests
55+
run: dotnet build src/BlazorWebFormsComponents.Analyzers.Test/BlazorWebFormsComponents.Analyzers.Test.csproj --configuration Release --no-restore
56+
5257
- name: Build server-side sample
5358
run: dotnet build samples/AfterBlazorServerSide/AfterBlazorServerSide.csproj --configuration Release --no-restore
5459

5560
- name: Run tests
5661
run: dotnet test src/BlazorWebFormsComponents.Test/BlazorWebFormsComponents.Test.csproj --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=test-results.trx" --results-directory src/BlazorWebFormsComponents.Test/TestResults
5762

63+
- name: Run analyzer tests
64+
run: dotnet test src/BlazorWebFormsComponents.Analyzers.Test/BlazorWebFormsComponents.Analyzers.Test.csproj --configuration Release --no-build --verbosity normal --logger "trx;LogFileName=analyzer-test-results.trx" --results-directory src/BlazorWebFormsComponents.Analyzers.Test/TestResults
65+
66+
- name: Generate health snapshot
67+
run: dotnet run --project scripts/GenerateHealthSnapshot/GenerateHealthSnapshot.csproj --configuration Release -- ${{ github.workspace }} ${{ github.workspace }}/health-snapshot.json
68+
69+
- name: Upload health snapshot
70+
uses: actions/upload-artifact@v4
71+
if: always()
72+
with:
73+
name: health-snapshot
74+
path: health-snapshot.json
75+
5876
- name: Upload test results
5977
uses: actions/upload-artifact@v4
6078
if: always()
6179
with:
6280
name: test-results
6381
path: src/BlazorWebFormsComponents.Test/TestResults/*.trx
6482

83+
- name: Upload analyzer test results
84+
uses: actions/upload-artifact@v4
85+
if: always()
86+
with:
87+
name: analyzer-test-results
88+
path: src/BlazorWebFormsComponents.Analyzers.Test/TestResults/*.trx
89+
6590
- name: Publish test results
6691
uses: dorny/test-reporter@v2
6792
if: always()
@@ -70,3 +95,12 @@ jobs:
7095
path: src/BlazorWebFormsComponents.Test/TestResults/*.trx
7196
reporter: dotnet-trx
7297
fail-on-error: true
98+
99+
- name: Publish analyzer test results
100+
uses: dorny/test-reporter@v2
101+
if: always()
102+
with:
103+
name: Analyzer Test Results
104+
path: src/BlazorWebFormsComponents.Analyzers.Test/TestResults/*.trx
105+
reporter: dotnet-trx
106+
fail-on-error: true

.github/workflows/squad-ci.yml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ jobs:
1717
steps:
1818
- uses: actions/checkout@v4
1919

20+
- name: Setup .NET
21+
uses: actions/setup-dotnet@v4
22+
with:
23+
dotnet-version: '10.0.x'
24+
2025
- name: Build and test
2126
run: |
22-
# TODO: Add your dotnet build/test commands here
23-
# Go: go test ./...
24-
# Python: pip install -r requirements.txt && pytest
25-
# .NET: dotnet test
26-
# Java (Maven): mvn test
27-
# Java (Gradle): ./gradlew test
28-
echo "No build commands configured — update squad-ci.yml"
27+
dotnet restore
28+
dotnet build --configuration Release --no-restore
29+
dotnet test src/BlazorWebFormsComponents.Test/BlazorWebFormsComponents.Test.csproj --configuration Release --no-build --verbosity normal
30+
dotnet test src/BlazorWebFormsComponents.Analyzers.Test/BlazorWebFormsComponents.Analyzers.Test.csproj --configuration Release --no-build --verbosity normal

.squad/agents/beast/history.md

Lines changed: 133 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,38 @@
3131
- Run 9 Skill Fixes — 6 RF items across 4 skill files (2026-03-07)
3232
- Run 9 RCA Documentation — path preservation + CSS verification rules (2026-03-07)
3333

34-
### Issue #438: Deprecation Guidance Docs (Latest)
34+
### Issue #438: Deprecation Guidance Docs
3535

3636
📌 **Team update (2026-03-17):** #471 & #472 resolved. GUID IDs removed from CheckBox/RadioButton/RadioButtonList; L1 script test suite 100%. 2105 tests passing. — decided by Cyclops
3737

38-
**Delivered:** Comprehensive deprecation guidance page (`docs/Migration/DeprecationGuidance.md`) covering Web Forms patterns with no Blazor equivalent.
39-
40-
**Content:**
41-
- `runat="server"` → Blazor native components
42-
- `ViewState` → Component fields + scoped services
43-
- `UpdatePanel` → Blazor's incremental component rendering
44-
- `ScriptManager``IJSRuntime` + `HttpClient`
45-
- PostBack events → Component lifecycle + event handlers
46-
- Page lifecycle (`Page_Load`, `Page_Init`) → `OnInitializedAsync`, `OnParametersSetAsync`
47-
- `IsPostBack` → Removed (use `OnInitializedAsync`)
48-
- Server-side control properties → Declarative data binding
49-
- Application/Session state → Singleton/scoped services
50-
- Data binding events (`ItemDataBound`) → Component templates with `@context`
38+
**✅ DELIVERED** — Comprehensive deprecation guidance page covering Web Forms patterns with no Blazor equivalent.
5139

52-
**Format:** Before/after tabbed code examples, migration checklist table, lifecycle mapping.
40+
**Session (2026-03-17 by Beast):**
41+
- Created `docs/Migration/DeprecationGuidance.md` — 32 KB, ~600 lines covering 8 deprecation patterns
42+
- Updated `mkdocs.yml` — added "Deprecation Guidance" to Migration navigation section (after "Automated Migration Guide")
43+
- Created decision record: `.squad/decisions/inbox/beast-deprecation-docs.md`
5344

54-
**Branch:** `squad/438-deprecation-docs` — pushed to FritzAndFriends upstream. Commit 5b17682b.
45+
**Content patterns documented:**
46+
- `runat="server"` — Scope marker; remove (Blazor components always server-side)
47+
- `ViewState` — Use component fields + scoped/singleton services instead
48+
- `UpdatePanel` — Blazor incremental rendering makes triggers obsolete; UpdatePanel is now just a CSS-compatible wrapper
49+
- `Page_Load` / `IsPostBack``OnInitializedAsync` + event handlers + lifecycle mapping table
50+
- `ScriptManager` — Stub for migration compat; replace with `IJSRuntime` + `HttpClient` + DI
51+
- Server control properties → Reactive data binding (fields, not imperative assignment)
52+
- Application/Session state → Singleton/scoped services
53+
- Data binding events (`ItemDataBound`) → Component templates with `@context`
5554

56-
**Files:**
57-
- Created `docs/Migration/DeprecationGuidance.md` (23.3 KB, ~400 lines)
58-
- Updated `mkdocs.yml` — added to Migration section navigation
55+
**Format & Tone:**
56+
- Each pattern: "What It Was" → "Why Deprecated" → "What To Do Instead" + before/after code
57+
- Tabbed markdown for side-by-side comparison of Web Forms vs Blazor
58+
- Lifecycle mapping table (Page_Init → OnInitializedAsync, etc.)
59+
- Empathetic tone — acknowledges these are familiar patterns being left behind
60+
- Audience: Experienced Web Forms developers learning Blazor
5961

60-
**Design decision:** Placed after "Automated Migration Guide" in nav to catch developers early in their migration journey. Each section pairs Web Forms pattern with clear Blazor alternative, supporting the library's goal of enabling code reuse with minimal markup changes.
62+
**Design decision rationale:**
63+
- Placed after "Automated Migration Guide" in nav — developers run L1 automation first, then encounter these patterns; this doc is their reference
64+
- Each section pairs Web Forms pattern with clear Blazor alternative — supports library goal of enabling code reuse with minimal markup changes
65+
- Comprehensive coverage including derived patterns (e.g., application state → services)
6166

6267
**Summary (2026-03-05 through 2026-03-07 pre-Run 11)
6368

@@ -159,7 +164,7 @@ Captured three critical Run 22 learnings (39/40 tests passing) in migration skil
159164
1. **Overview** — What `.ashx` handlers are, why migration is needed, `HttpHandlerBase` value proposition
160165
2. **Quick Start** — 6-step migration checklist (mechanical changes)
161166
3. **Registration** — Four registration patterns:
162-
- Explicit path via `[HandlerRoute]` attribute
167+
- Explicit path via `MapHandler<T>("/path")` in `Program.cs`
163168
- Convention-based routing (derive from class name)
164169
- Multi-path registration with `MapHandler<T>()`
165170
- Chaining auth/CORS with `.RequireAuthorization()`, `.RequireCors()`
@@ -451,3 +456,110 @@ Updated `.squad/skills/migration-standards/SKILL.md` to add new section at end:
451456

452457

453458

459+
460+
## BaseValidator & BaseCompareValidator Documentation (2026-03-17)
461+
462+
**Session (2026-03-17 by Beast):**
463+
- Created docs/ValidationControls/BaseValidator.md 6.6 KB comprehensive base class docs covering:
464+
- Abstract base class overview for all validators
465+
- Shared properties: ControlToValidate, ControlRef, Display, Text, ErrorMessage, ValidationGroup, Enabled, style properties
466+
- ForwardRef<InputBase<T>> pattern for Blazor-native field binding
467+
- Validation lifecycle (EditContext integration, cascading context, registration/validation/cleanup)
468+
- Child validator references (RequiredFieldValidator, CompareValidator, RangeValidator, RegularExpressionValidator, CustomValidator)
469+
- Web Forms Blazor comparison with code examples
470+
471+
- Created docs/ValidationControls/BaseCompareValidator.md 6.4 KB docs for comparison-based validators:
472+
- Abstract base class extending BaseValidator with type conversion and comparison logic
473+
- Type property with supported types table (String, Integer, Double, Date, Currency)
474+
- CultureInvariantValues property explanation with practical examples
475+
- Type conversion and comparison logic documentation
476+
- Comprehensive examples (Integer, Date, Currency) with real code samples
477+
- Web Forms Blazor syntax comparison
478+
- Child validator references (CompareValidator, RangeValidator)
479+
480+
- Updated mkdocs.yml added BaseCompareValidator and BaseValidator alphabetically in Validation Controls section
481+
- Verified MkDocs build: --strict mode passes with no broken links (55.59 seconds build time)
482+
483+
**Pattern Consistency:**
484+
- Followed RequiredFieldValidator.md and CompareValidator.md formatting conventions
485+
- Maintained heading structure: Overview, Properties, Examples, Web Forms comparison, Child references
486+
- Used property tables for enums (Display, Type values)
487+
- Included Microsoft documentation links to original Web Forms classes
488+
- All Blazor code examples shown with EditForm context
489+
490+
**Key Decisions:**
491+
- BaseValidator docs positioned as "framework for all validators" not a user-facing component
492+
- Emphasized ControlRef as Blazor-native approach; ControlToValidate as Web Forms migration bridge
493+
- Type conversion explanation in BaseCompareValidator targets developers migrating numeric/date comparisons
494+
- CultureInvariantValues documentation included practical locale examples (US "." vs European "," decimals)
495+
496+
**Files:**
497+
- Created docs/ValidationControls/BaseValidator.md
498+
- Created docs/ValidationControls/BaseCompareValidator.md
499+
- Updated mkdocs.yml (Validation Controls section)
500+
501+
### Analyzer Architecture & Expansion Documentation (Feature/analyzer-sprint1)
502+
503+
**Delivered:** Comprehensive analyzer contributor guide and expanded rule documentation for BWFC013 and BWFC014 rules.
504+
505+
**Files created/updated:**
506+
1. **dev-docs/ANALYZER-ARCHITECTURE.md** (18.7 KB, new) Contributor guide for developing new Roslyn analyzers
507+
2. **docs/Migration/Analyzers.md** (updated) Added BWFC013 (Response Object Usage) and BWFC014 (Request Object Usage) rule documentation
508+
509+
**ANALYZER-ARCHITECTURE.md content:**
510+
- **Project Layout** File naming convention, rule ID assignment, directory structure (Analyzers/ and Analyzers.Test/)
511+
- **DiagnosticAnalyzer anatomy** Minimum viable structure with DiagnosticDescriptor, Initialize(), SyntaxKind callbacks, SeverityLevels (Hidden/Info/Warning/Error)
512+
- **CodeFixProvider anatomy** BatchFixer pattern, RegisterCodeFixesAsync, trivia preservation, async best practices
513+
- **Testing strategy** CSharpAnalyzerTest/CSharpCodeFixTest patterns, stub types for external dependencies ({|#N:code|} markers), positive/negative/edge cases
514+
- **Common pitfalls** Trivia handling (EndOfLine between comment/semicolon), null guards on ancestor traversal, SyntaxKind selection mistakes, string comparisons vs syntax API, message format arguments
515+
- **PR checklist** Analyzer implementation (7 items), CodeFixProvider (8 items), Testing (6 items), Documentation (5 items), Integration (3 items)
516+
- **Reference implementation** Points to ResponseRedirectAnalyzer as working example
517+
- **Build/test commands** dotnet build, test, pack workflows
518+
519+
**Analyzers.md updates:**
520+
- **Updated summary table** Added BWFC013 and BWFC014 to rule matrix
521+
- **BWFC013: Response Object Usage** Detects Response.Write(), WriteFile(), Clear(), Flush(), End()
522+
- Mapping table: Web Forms method Blazor equivalent (markup rendering, FileResult, not needed, not needed, early return)
523+
- Before/after example: HTML export page markup-based rendering
524+
- Recommended patterns: component state + markup for write, minimal API endpoint with FileResult for writeFile
525+
- **BWFC014: Request Object Usage** Detects Request.Form[], Cookies[], Headers[], Files, QueryString[], ServerVariables[]
526+
- Mapping table: Request collection Blazor equivalent (form binding, HttpContextAccessor, InputFile, nav params, etc.)
527+
- Before/after example: Page_Load with multiple Request accesses component with recommended patterns
528+
- Recommended patterns: route parameters (QueryString), @bind (Form), HttpContextAccessor (Cookies/Headers for Blazor Server), InputFile (Files)
529+
- **"Using Analyzers in CI/CD" section** (new) .editorconfig per-rule severity settings, dotnet build integration, grep for violations in CI scripts
530+
- **"Prioritization Guide: Which Rules to Fix First"** (new) Phase 1 (Blocking: BWFC001, BWFC003, BWFC004, BWFC011), Phase 2 (Data: BWFC002, BWFC005, BWFC014), Phase 3 (Output: BWFC013, BWFC012, BWFC010)
531+
532+
**Format & style:**
533+
- Analyzer guide written for experienced C# developers contributing new rules (Cyclops' audience)
534+
- Analyzers.md entries written for Web Forms developers learning to interpret/fix violations
535+
- All code examples are complete and compilable (test-driven)
536+
- Admonitions (!!! note, !!! warning, !!! tip) for actionable insights
537+
- Before/After pairs show real Web Forms patterns and Blazor migrations
538+
- Tables for quick reference (SyntaxKind callbacks, mapping tables, phase priorities)
539+
- Consistent with existing BWFC doc style (Deprecation Guidance, MigratingAshxHandlers)
540+
541+
**MkDocs verification:**
542+
- Ran python -m mkdocs build --strict 0 errors, 54.08s build time
543+
- Unshipped analyzer notes already present in AnalyzerReleases.Unshipped.md (BWFC013, BWFC014 added by Cyclops in advance)
544+
- No documentation links or cross-references broken
545+
546+
**Design decisions:**
547+
- ANALYZER-ARCHITECTURE.md placed in dev-docs/ (developer-only, not end-user docs) vs docs/ (migration user-facing)
548+
- Prioritization guide ordered by business impact (blocking patterns first) vs alphabetical, with rationale for each phase
549+
- CI/CD section emphasizes dotnet build + .editorconfig as the primary integration point, with note that detailed CI templates are "available separately"
550+
- Request.Form[] @bind example is the most direct mapping; QueryString examples show both route parameters and NavigationManager.Uri approaches
551+
552+
**Audience understanding:**
553+
- Analyzer rules address code-behind patterns (BWFC001BWFC005: property/state/event patterns; BWFC010BWFC014: specific object usage)
554+
- Developers see these rules in Visual Studio's Error List after L1 migration script + L2 Copilot transforms
555+
- Rules guide developers from "code compiles but behaves wrong" (blindspots) to "code compiles and works correctly" (full migration)
556+
- Prioritization guide helps developers allocate effort, fixing high-impact rules first to unblock testing/UAT
557+
558+
**Branch:** eature/analyzer-sprint1
559+
**Tests:** All analyzer tests in Analyzers.Test/ pass (no new analyzer implementations in this doc-only sprint)
560+
**Verified:** MkDocs build passes strict mode, no broken links or syntax errors in markdown
561+
562+
563+
564+
**Team update (2026-03-20):** Analyzer architecture guide (579 lines) + expanded Analyzers.md (+363 lines). Deprecation Guidance docs (#438, 32 KB). BaseValidator/BaseCompareValidator base class docs. MkDocs strict build clean. PR #487 opened on upstream. decided by Beast
565+

0 commit comments

Comments
 (0)