From 13f702ed003ed1c48f383af6c0161d4936af7365 Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:51:59 +0700 Subject: [PATCH 1/9] chore(kanban): open task 021 for multi-dot TW0001 kebab pattern Architecture cannot enable FileNameRuleAnalyzer until multi-dot partial basenames (e.g. application-state.close-modal.cs) are accepted. --- .../task.md | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md diff --git a/kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md new file mode 100644 index 0000000..849e2c7 --- /dev/null +++ b/kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md @@ -0,0 +1,89 @@ +# Extend TW0001 kebab pattern to multi-dot partial cs filenames + +## Description + +`FileNameRuleAnalyzer` (**TW0001**) currently matches only a **single** kebab stem: + +```text +^[a-z][a-z0-9]*(?:-[a-z0-9]+)*\.cs$ +``` + +That rejects legitimate **multi-dot partial** basenames used heavily by TimeWarp templates +(TimeWarp.State actions), e.g.: + +```text +application-state.cs ✓ already +application-state.close-modal.cs ✗ fails today +counter-state.increment-counter.cs ✗ fails today +``` + +Each **segment** is already kebab-case; extra dots mark secondary partial files for one type. +Architecture’s partial-class analyzer (TWA0001) already accepts this shape. TW0001 should +**not** false-fail it. + +Until this ships, consumer monorepos (e.g. timewarp-architecture task **133**) **cannot enable** +`dotnet_diagnostic.TW0001.severity = warning|error` without mass false positives (~40+ SPA +state partials alone). + +### In scope + +- Update `KebabCasePattern` (or equivalent validation) so multi-dot basenames pass when **every** + segment is kebab: + `^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*)*\.cs$` + (or equivalent; exact regex is implementer’s choice if tests lock behavior). +- Keep rejecting PascalCase / snake_case / mixed invalid stems (`UserService.cs`, + `application_state.cs`, `Application-state.close-modal.cs`). +- Preserve existing default exceptions (`*.razor.cs`, `*.g.cs`, …). +- Tests: valid multi-dot kebab; invalid multi-dot (one Pascal segment); still valid single-stem. +- Docs: `file-name-rule-analyzer.md`, how-to-configure, overview — examples of multi-dot partials. +- Bump package version + release notes so architecture can pin and enable TW0001. + +### Out of scope + +- Renaming Architecture product files +- Folder / non-`.cs` checks (Ganda task **188** `kebab-path-names`) +- Changing diagnostic id (**TW0001** stays; task **020** locked `TW*`) + +## Requirements + +- Multi-dot kebab `.cs` basenames are TW0001-clean. +- No regression on single-stem kebab or default exceptions. +- Documented; package published or at least version bumped for consumers to reference. +- Call out in release notes: architecture/template consumers can enable TW0001 after upgrade. + +## Checklist + +- [ ] Implement multi-dot kebab validation in `file-name-rule-analyzer.cs` +- [ ] Unit / console tests for pass and fail cases +- [ ] Update analyzer docs + configure how-to examples +- [ ] AnalyzerReleases if required by Roslyn release tracking +- [ ] Version bump + release notes +- [ ] Note consumers: timewarp-architecture can enable `dotnet_diagnostic.TW0001` after pin bump + +## Notes + +### Origin + +- timewarp-architecture task **133** (kebab gaps): remediations done; **TW0001 enable blocked** + on this pattern gap. +- Pattern SSOT today: `source/timewarp-source-generators/file-name-rule-analyzer.cs` +- Related: task **020** (TW* prefix SSOT — done, no id rename) + +### Consumer example (must pass after fix) + +``` +application-state.close-modal.cs +weather-forecasts-state.fetch-weather-forecasts.cs +``` + +### Consumer example (must still fail) + +``` +ApplicationState.CloseModal.cs +application-state.CloseModal.cs +application_state.close_modal.cs +``` + +## Session + +- Created: 2026-07-29 — follow-up after architecture task 133 deferred TW0001 enable From 02e645ee83cc759b89f048736330235929276e4f Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:53:21 +0700 Subject: [PATCH 2/9] chore(kanban): move task 021 to in-progress --- .../task.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename kanban/{to-do => in-progress}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md (100%) diff --git a/kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md similarity index 100% rename from kanban/to-do/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md rename to kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md From 30a51add01325977de019bbf45bf785add7ff497 Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:56:03 +0700 Subject: [PATCH 3/9] docs(kanban): add implementation plan for task 021 --- .../task.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md index 849e2c7..89267fd 100644 --- a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md @@ -84,6 +84,71 @@ application-state.CloseModal.cs application_state.close_modal.cs ``` +### Implementation plan (2026-07-29) + +**Goal:** Accept basenames where every dot-separated segment is kebab-case, then `.cs`. +No change to diagnostic id, default severity, or exception list semantics. + +#### 1. Pattern change + +**File:** `source/timewarp-source-generators/file-name-rule-analyzer.cs` + +```csharp +private static readonly Regex KebabCasePattern = new( + @"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*)*\.cs$", + RegexOptions.Compiled); +``` + +- Optional: tweak diagnostic message/description to mention multi-dot partials. +- Exceptions already run **before** pattern — multi-dot does not break `*.razor.cs` / `*.g.cs`. +- Leave `MarkdownDocsGenerator` kebab stem alone (out of scope). + +#### 2. Tests + +No unit-test project. Console smoke with TW0001=error: + +- Add pass fixtures under `tests/timewarp-source-generators-test-console/`: + - `application-state.close-modal.cs` + - `weather-forecasts-state.fetch-weather-forecasts.cs` +- Keep single-stem regression files. +- Fail matrix (document + manual one-shot): Pascal/snake/mixed multi-dot must still fail; + empty segments (`a..b.cs`) fail. + +#### 3. Docs + +- `documentation/developer/reference/analyzers/file-name-rule-analyzer.md` — multi-dot pattern + examples +- `documentation/developer/how-to-guides/configure-file-name-analyzer.md` — examples +- `documentation/developer/reference/analyzers/overview.md` — one-line TW0001 note +- Light touch: `documentation/overview.md` / `readme.md` if useful + +#### 4. AnalyzerReleases + +Optional Notes line on TW0001 only; stay Unshipped; no new rule id. + +#### 5. Version + release notes + +- `source/Directory.Build.props`: `1.0.0-beta.8` → `1.0.0-beta.9` +- Create `documentation/releases.md` with beta.9 notes + consumer enablement callout + (architecture/templates can enable TW0001 after pin ≥ beta.9) + +#### 6. Sequence + +1. Regex (+ optional message) +2. Test-console multi-dot pass files; build green +3. Manual fail spot-check then remove temp invalid file +4. Docs +5. Optional Unshipped note +6. Version + releases.md +7. Checklist + session + +#### Acceptance + +- Multi-dot kebab clean; single-stem still passes; invalid multi-dot fails +- Default exceptions preserved; id stays TW0001; version ≥ beta.9 with notes + +**No blocking ambiguities** — proceed with defaults above. + ## Session - Created: 2026-07-29 — follow-up after architecture task 133 deferred TW0001 enable +- Orchestration: Grok Build session (2026-07-29) — plan finalized, implementing From 4d44d334c7c0548671ed9b403ab8814608b154a0 Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:57:58 +0700 Subject: [PATCH 4/9] feat(TW0001): accept multi-dot kebab partial cs basenames Every segment between dots must be kebab-case so TimeWarp.State-style action partials pass when TW0001 is enabled. Bump package to 1.0.0-beta.9. --- .../configure-file-name-analyzer.md | 14 +++++++++++++ .../analyzers/file-name-rule-analyzer.md | 16 ++++++++++++++- .../developer/reference/analyzers/overview.md | 2 +- documentation/overview.md | 2 +- documentation/releases.md | 15 ++++++++++++++ .../task.md | 20 +++++++++++++------ readme.md | 2 +- source/Directory.Build.props | 2 +- .../AnalyzerReleases.Unshipped.md | 2 +- .../file-name-rule-analyzer.cs | 10 ++++++---- .../application-state.close-modal.cs | 9 +++++++++ .../program.cs | 4 ++++ ...forecasts-state.fetch-weather-forecasts.cs | 9 +++++++++ 13 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 documentation/releases.md create mode 100644 tests/timewarp-source-generators-test-console/application-state.close-modal.cs create mode 100644 tests/timewarp-source-generators-test-console/weather-forecasts-state.fetch-weather-forecasts.cs diff --git a/documentation/developer/how-to-guides/configure-file-name-analyzer.md b/documentation/developer/how-to-guides/configure-file-name-analyzer.md index e29a9fb..d7160df 100644 --- a/documentation/developer/how-to-guides/configure-file-name-analyzer.md +++ b/documentation/developer/how-to-guides/configure-file-name-analyzer.md @@ -58,6 +58,20 @@ Rename files to kebab-case: - `UserService.cs` → `user-service.cs` - `IDataProcessor.cs` → `i-data-processor.cs` +**Multi-dot partials** (e.g. state/action files) are valid when **every** segment is kebab-case. +Only rename non-kebab segments; do not collapse multi-dot names into a single stem: + +| Invalid | Valid | +|---------|--------| +| `ApplicationState.CloseModal.cs` | `application-state.close-modal.cs` | +| `application-state.CloseModal.cs` | `application-state.close-modal.cs` | +| `application_state.close_modal.cs` | `application-state.close-modal.cs` | + +Valid multi-dot examples (no rename needed): +- `application-state.close-modal.cs` +- `counter-state.increment-counter.cs` +- `weather-forecasts-state.fetch-weather-forecasts.cs` + ## Troubleshooting ### Too Many Violations diff --git a/documentation/developer/reference/analyzers/file-name-rule-analyzer.md b/documentation/developer/reference/analyzers/file-name-rule-analyzer.md index 062bbd5..6efea65 100644 --- a/documentation/developer/reference/analyzers/file-name-rule-analyzer.md +++ b/documentation/developer/reference/analyzers/file-name-rule-analyzer.md @@ -9,7 +9,7 @@ The FileNameRuleAnalyzer enforces kebab-case naming conventions for C# source fi - **Rule ID**: TW0001 - **Category**: Naming - **Default Severity**: Info (disabled by default) -- **Message**: File '{0}' should use kebab-case naming convention (e.g., 'my-file.cs') +- **Message**: File '{0}' should use kebab-case naming convention (e.g., 'my-file.cs' or 'my-type.my-partial.cs') > **Diagnostic ID (SSOT):** This rule is **TW0001** from TimeWarp.SourceGenerators. It is **not** a TimeWarp Architecture analyzer (`TWA*`). Do **not** enable or suppress it with `TWA001` / `dotnet_diagnostic.TWA001.*` — use `dotnet_diagnostic.TW0001.*` and `#pragma warning disable TW0001`. @@ -21,12 +21,23 @@ Valid kebab-case file names must: - Separate words with hyphens (-) - Not contain consecutive hyphens - End with `.cs` extension +- **Multi-dot basenames** are allowed when **every** segment between dots is itself kebab-case + (common for partials such as state/action files) + +Pattern (conceptual): + +```text +^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*)*\.cs$ +``` ### Valid Examples - `user-service.cs` - `data-processor.cs` - `my-component.cs` - `api-client-v2.cs` +- `application-state.close-modal.cs` (multi-dot partial) +- `counter-state.increment-counter.cs` (multi-dot partial) +- `weather-forecasts-state.fetch-weather-forecasts.cs` (multi-dot partial) ### Invalid Examples - `UserService.cs` (PascalCase) @@ -34,6 +45,9 @@ Valid kebab-case file names must: - `user_service.cs` (snake_case) - `user--service.cs` (consecutive hyphens) - `-user-service.cs` (starts with hyphen) +- `ApplicationState.CloseModal.cs` (Pascal multi-dot) +- `application-state.CloseModal.cs` (mixed multi-dot; one Pascal segment) +- `application_state.close_modal.cs` (snake_case segments) ## Configuration diff --git a/documentation/developer/reference/analyzers/overview.md b/documentation/developer/reference/analyzers/overview.md index 1c95233..de1d5cb 100644 --- a/documentation/developer/reference/analyzers/overview.md +++ b/documentation/developer/reference/analyzers/overview.md @@ -6,7 +6,7 @@ All analyzer diagnostic IDs from this package use the **TW** prefix (e.g. **TW00 ### TW0001 - File Name Rule Analyzer -Enforces kebab-case naming convention for C# source files. +Enforces kebab-case naming convention for C# source files (including multi-segment kebab basenames such as `application-state.close-modal.cs`). - **Rule ID**: TW0001 - **Category**: Naming diff --git a/documentation/overview.md b/documentation/overview.md index 00ceb89..78da115 100644 --- a/documentation/overview.md +++ b/documentation/overview.md @@ -17,7 +17,7 @@ Technical documentation for developers using or contributing to the project. - **MarkdownDocsGenerator** - Generates markdown from XML docs ### Analyzers -- **TW0001** - File name kebab-case enforcement +- **TW0001** - File name kebab-case enforcement (single- and multi-dot basenames) Diagnostic IDs from this package use the **TW** prefix (`TW0001`–`TW0006`). The **TWA** prefix is reserved for TimeWarp Architecture and is not used here. diff --git a/documentation/releases.md b/documentation/releases.md new file mode 100644 index 0000000..1c55caf --- /dev/null +++ b/documentation/releases.md @@ -0,0 +1,15 @@ +# Release Notes + +## 1.0.0-beta.9 + +### TW0001 (FileNameRuleAnalyzer) + +- Accept **multi-dot** kebab-case `.cs` basenames: every segment between dots must be kebab-case + (e.g. `application-state.close-modal.cs`). +- Single-stem kebab and default exceptions (`*.razor.cs`, `*.g.cs`, …) unchanged. + +### Consumers + +- **timewarp-architecture** / TimeWarp.State template consumers can enable + `dotnet_diagnostic.TW0001.severity = warning|error` after pinning to **≥ 1.0.0-beta.9** + without false positives on multi-dot state/action partials. diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md index 89267fd..13afa58 100644 --- a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md @@ -53,12 +53,12 @@ state partials alone). ## Checklist -- [ ] Implement multi-dot kebab validation in `file-name-rule-analyzer.cs` -- [ ] Unit / console tests for pass and fail cases -- [ ] Update analyzer docs + configure how-to examples -- [ ] AnalyzerReleases if required by Roslyn release tracking -- [ ] Version bump + release notes -- [ ] Note consumers: timewarp-architecture can enable `dotnet_diagnostic.TW0001` after pin bump +- [x] Implement multi-dot kebab validation in `file-name-rule-analyzer.cs` +- [x] Unit / console tests for pass and fail cases +- [x] Update analyzer docs + configure how-to examples +- [x] AnalyzerReleases if required by Roslyn release tracking +- [x] Version bump + release notes +- [x] Note consumers: timewarp-architecture can enable `dotnet_diagnostic.TW0001` after pin bump ## Notes @@ -152,3 +152,11 @@ Optional Notes line on TW0001 only; stay Unshipped; no new rule id. - Created: 2026-07-29 — follow-up after architecture task 133 deferred TW0001 enable - Orchestration: Grok Build session (2026-07-29) — plan finalized, implementing +- Implementation (2026-07-29): + - Updated `KebabCasePattern` to multi-dot kebab segments + message/description polish + - Test console fixtures: `application-state.close-modal.cs`, `weather-forecasts-state.fetch-weather-forecasts.cs` (+ program.cs refs) + - Docs: file-name-rule-analyzer, configure how-to, analyzers overview, documentation overview, readme light touch + - AnalyzerReleases.Unshipped notes line for TW0001 multi-dot + - Version `1.0.0-beta.9`; created `documentation/releases.md` with consumer enablement callout + - Build/test green; manual fail spot-check: `application-state.CloseModal.cs` → TW0001 error, then deleted + - Left uncommitted for orchestrator; task not moved diff --git a/readme.md b/readme.md index abd744f..8cc5326 100644 --- a/readme.md +++ b/readme.md @@ -70,7 +70,7 @@ The generator will automatically create forwarding implementations for all inter ### File Name Rule Analyzer -Enforces kebab-case naming convention for C# files. +Enforces kebab-case naming for C# files, including multi-dot partials (e.g. `application-state.close-modal.cs`) when every segment is kebab-case. #### Configuration diff --git a/source/Directory.Build.props b/source/Directory.Build.props index 7c3a2de..1f31ab2 100644 --- a/source/Directory.Build.props +++ b/source/Directory.Build.props @@ -4,7 +4,7 @@ - 1.0.0-beta.8 + 1.0.0-beta.9 Steven T. Cramer TimeWarp.SourceGenerators TimeWarp.SourceGenerators diff --git a/source/timewarp-source-generators/AnalyzerReleases.Unshipped.md b/source/timewarp-source-generators/AnalyzerReleases.Unshipped.md index 67c3fa9..815d4ed 100644 --- a/source/timewarp-source-generators/AnalyzerReleases.Unshipped.md +++ b/source/timewarp-source-generators/AnalyzerReleases.Unshipped.md @@ -2,7 +2,7 @@ Rule ID | Category | Severity | Notes --------|----------|----------|------- -TW0001 | Naming | Info | FileNameRuleAnalyzer, disabled by default +TW0001 | Naming | Info | FileNameRuleAnalyzer, disabled by default; multi-dot kebab basenames accepted (every segment kebab-case) TW0002 | Documentation | Info | XmlDocsToMarkdownAnalyzer TW0003 | SourceGenerator | Info | MarkdownDocsGenerator - Enhanced to support kebab-case file matching TW0004 | InterfaceDelegation | Error | Class must be partial for interface delegation diff --git a/source/timewarp-source-generators/file-name-rule-analyzer.cs b/source/timewarp-source-generators/file-name-rule-analyzer.cs index 79a7eb8..7e24999 100644 --- a/source/timewarp-source-generators/file-name-rule-analyzer.cs +++ b/source/timewarp-source-generators/file-name-rule-analyzer.cs @@ -9,15 +9,17 @@ public class FileNameRuleAnalyzer : IIncrementalGenerator private static readonly DiagnosticDescriptor Rule = new( DiagnosticId, "File name should use kebab-case", - "File '{0}' should use kebab-case naming convention (e.g., 'my-file.cs')", + "File '{0}' should use kebab-case naming convention (e.g., 'my-file.cs' or 'my-type.my-partial.cs')", Category, DiagnosticSeverity.Info, isEnabledByDefault: false, - description: "C# file names should use kebab-case format with hyphens separating words, all lowercase." + description: "C# file names should use kebab-case format with hyphens separating words, all lowercase. Multi-dot basenames are allowed when every segment is kebab-case (e.g., 'my-type.my-partial.cs')." ); - // Regex pattern for valid kebab-case file names - private static readonly Regex KebabCasePattern = new(@"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*\.cs$", RegexOptions.Compiled); + // Regex: single- or multi-dot basenames where every segment is kebab-case, then .cs + private static readonly Regex KebabCasePattern = new( + @"^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*)*\.cs$", + RegexOptions.Compiled); // Default exception patterns private static readonly string[] DefaultExceptions = diff --git a/tests/timewarp-source-generators-test-console/application-state.close-modal.cs b/tests/timewarp-source-generators-test-console/application-state.close-modal.cs new file mode 100644 index 0000000..c6b5c02 --- /dev/null +++ b/tests/timewarp-source-generators-test-console/application-state.close-modal.cs @@ -0,0 +1,9 @@ +namespace TimeWarp.SourceGenerators.TestConsole; + +/// +/// Multi-dot kebab-case partial fixture for TW0001 (application-state.close-modal.cs). +/// +public static class ApplicationStateCloseModal +{ + public static string ActionName => "CloseModal"; +} diff --git a/tests/timewarp-source-generators-test-console/program.cs b/tests/timewarp-source-generators-test-console/program.cs index ed5864c..83616b4 100644 --- a/tests/timewarp-source-generators-test-console/program.cs +++ b/tests/timewarp-source-generators-test-console/program.cs @@ -4,6 +4,10 @@ var kebabTest = new KebabCaseTest(); Console.WriteLine($"Kebab-case test: {kebabTest.GetTestMessage()}"); +// Multi-dot kebab-case partial fixtures (TW0001) +Console.WriteLine($"Multi-dot close-modal: {ApplicationStateCloseModal.ActionName}"); +Console.WriteLine($"Multi-dot fetch-weather: {WeatherForecastsStateFetchWeatherForecasts.ActionName}"); + // Test PascalCase file matching (backward compatibility) var pascalTest = new PascalCaseTest(); Console.WriteLine($"PascalCase test: {pascalTest.GetPascalMessage()}"); diff --git a/tests/timewarp-source-generators-test-console/weather-forecasts-state.fetch-weather-forecasts.cs b/tests/timewarp-source-generators-test-console/weather-forecasts-state.fetch-weather-forecasts.cs new file mode 100644 index 0000000..30d6600 --- /dev/null +++ b/tests/timewarp-source-generators-test-console/weather-forecasts-state.fetch-weather-forecasts.cs @@ -0,0 +1,9 @@ +namespace TimeWarp.SourceGenerators.TestConsole; + +/// +/// Multi-dot kebab-case partial fixture for TW0001 (weather-forecasts-state.fetch-weather-forecasts.cs). +/// +public static class WeatherForecastsStateFetchWeatherForecasts +{ + public static string ActionName => "FetchWeatherForecasts"; +} From 587f520d03510f77d24126c01f06afd335bdb653 Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:59:52 +0700 Subject: [PATCH 5/9] docs(kanban): review disposition and results for task 021 --- .../review/disposition.md | 18 ++++++ .../review/review-framework.md | 17 ++++++ .../review/round-1/general.md | 23 ++++++++ .../review/round-1/merged.md | 19 ++++++ .../task.md | 58 ++++++++++++++++++- 5 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md create mode 100644 kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md create mode 100644 kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md create mode 100644 kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md new file mode 100644 index 0000000..9c022be --- /dev/null +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md @@ -0,0 +1,18 @@ +# Disposition — task 021 + +**Date:** 2026-07-29 +**Outcome:** clean +**Rounds:** 1 +**Final open count:** 0 + +## Summary + +Round 1 general review of commit `4d44d33` found no issues. Multi-dot kebab regex matches the plan, exceptions and diagnostic id/severity are unchanged, version and release notes are consistent, and test-console fixtures lock the pass path under TW0001=error. Disposition is **clean**. + +## Exception log (if accepted-exceptions) + +N/A + +## Escalations + +None diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md new file mode 100644 index 0000000..d78c2fb --- /dev/null +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md @@ -0,0 +1,17 @@ +# Review framework — task 021 + +**Date:** 2026-07-29 +**Host task:** kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/ +**Diff scope:** commit `4d44d33` — feat(TW0001): accept multi-dot kebab partial cs basenames (vs prior branch tip) +**Plan / brief:** Extend TW0001 `KebabCasePattern` so multi-dot basenames pass when every segment is kebab-case; tests, docs, version 1.0.0-beta.9, release notes for architecture consumers. +**Effort:** 1 (general only) +**Reviewer roster:** general +**Session IDs:** Grok Build orchestration session (2026-07-29); implementer subagent 019fad16-c055-78f2-8841-bb7e5c68a6cb + +## Ground rules + +- Reviewers are read-only on product code; they write only under `review/round-N/` +- Severity: bug | suggestion | nit — Status starts as open +- Do not invent issues to fill space; zero issues is a valid outcome +- Address the diff and surrounding call sites; re-verify falsifiable claims against the repo +- Prior rounds are immutable; new work goes in `round-(N+1)/` diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md new file mode 100644 index 0000000..8c3224a --- /dev/null +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md @@ -0,0 +1,23 @@ +# Round 1 — general +**Date:** 2026-07-29 +**Scope reviewed:** commit 4d44d33 (TW0001 multi-dot kebab) + +## Summary + +TW0001’s `KebabCasePattern` was extended to the task-specified multi-segment form so basenames like `application-state.close-modal.cs` pass when every dot-separated segment is kebab-case, while Pascal/snake/mixed and empty segments still fail. Default exceptions, diagnostic id, and disabled-by-default severity are unchanged; message/description, docs, Unshipped notes, version `1.0.0-beta.9`, and `documentation/releases.md` consumer callout are consistent. Risk is low: a pure regex widening with pass fixtures under test-console `TW0001=error` and intentional manual fail spot-check (no permanent negative fixtures). + +## Issues + +No issues found. + +### Verified (falsifiable) + +| Claim | Result | +|-------|--------| +| Pattern equals planned multi-dot kebab regex | Matches `file-name-rule-analyzer.cs:20–22` and docs | +| Consumer must-pass names accepted by pattern | `application-state.close-modal.cs`, `weather-forecasts-state.fetch-weather-forecasts.cs` | +| Must-fail shapes rejected by pattern | Pascal/snake/mixed multi-dot, consecutive hyphens, empty segments (`a..b.cs`) | +| Default exceptions list preserved | Unchanged `*.g.cs`, `*.razor.cs`, etc.; still checked before pattern | +| Version + package | `source/Directory.Build.props` → `1.0.0-beta.9`; nupkg/nuspec present | +| Docs/release consumer enablement | `releases.md`, reference + how-to + overview + readme updated | +| Test console smoke | Multi-dot fixtures + `program.cs` refs; test `.editorconfig` has `TW0001=error` | diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md new file mode 100644 index 0000000..7316be3 --- /dev/null +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md @@ -0,0 +1,19 @@ +# Round 1 — merged findings +**Date:** 2026-07-29 +**Sources:** general + +## Counts + +| Severity | open | fixed | wontfix | +|----------|------|-------|---------| +| bug | 0 | 0 | 0 | +| suggestion | 0 | 0 | 0 | +| nit | 0 | 0 | 0 | + +## Issues + +None raised. + +## Duplicates / conflicts + +N/A — single general reviewer; zero findings. diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md index 13afa58..e7ecd1e 100644 --- a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md +++ b/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md @@ -151,7 +151,7 @@ Optional Notes line on TW0001 only; stay Unshipped; no new rule id. ## Session - Created: 2026-07-29 — follow-up after architecture task 133 deferred TW0001 enable -- Orchestration: Grok Build session (2026-07-29) — plan finalized, implementing +- Orchestration: Grok Build session (2026-07-29) — plan → implement → review → done - Implementation (2026-07-29): - Updated `KebabCasePattern` to multi-dot kebab segments + message/description polish - Test console fixtures: `application-state.close-modal.cs`, `weather-forecasts-state.fetch-weather-forecasts.cs` (+ program.cs refs) @@ -159,4 +159,58 @@ Optional Notes line on TW0001 only; stay Unshipped; no new rule id. - AnalyzerReleases.Unshipped notes line for TW0001 multi-dot - Version `1.0.0-beta.9`; created `documentation/releases.md` with consumer enablement callout - Build/test green; manual fail spot-check: `application-state.CloseModal.cs` → TW0001 error, then deleted - - Left uncommitted for orchestrator; task not moved +- Review (2026-07-29): effort 1 general, round 1, disposition **clean** (0 open) + +## Results + +### What was implemented + +TW0001 `FileNameRuleAnalyzer` now accepts multi-dot kebab-case `.cs` basenames when **every** +dot-separated segment is kebab-case (e.g. `application-state.close-modal.cs`). Single-stem kebab +and default exceptions (`*.razor.cs`, `*.g.cs`, …) are unchanged. Diagnostic id remains **TW0001**. + +### Files changed + +| Path | Role | +|------|------| +| `source/timewarp-source-generators/file-name-rule-analyzer.cs` | Multi-dot `KebabCasePattern` + message/description | +| `source/Directory.Build.props` | Version `1.0.0-beta.8` → `1.0.0-beta.9` | +| `source/timewarp-source-generators/AnalyzerReleases.Unshipped.md` | TW0001 notes | +| `documentation/releases.md` | Created; beta.9 + consumer enablement | +| `documentation/developer/reference/analyzers/file-name-rule-analyzer.md` | Multi-dot docs | +| `documentation/developer/how-to-guides/configure-file-name-analyzer.md` | Examples | +| `documentation/developer/reference/analyzers/overview.md` | TW0001 one-liner | +| `documentation/overview.md`, `readme.md` | Light touch | +| `tests/timewarp-source-generators-test-console/application-state.close-modal.cs` | Pass fixture | +| `tests/timewarp-source-generators-test-console/weather-forecasts-state.fetch-weather-forecasts.cs` | Pass fixture | +| `tests/timewarp-source-generators-test-console/program.cs` | Fixture references | + +### Key decisions / deviations + +- Used task-suggested multi-dot regex as-is; optional diagnostic message polish applied. +- Fail coverage: console pass fixtures + documented matrix + manual one-shot (no permanent invalid fixtures), matching repo culture. +- No new rule id; Unshipped notes only. + +### Test outcomes + +| Check | Result | +|-------|--------| +| `./bin/dev build` | PASS; package `1.0.0-beta.9` | +| `./bin/dev test` | PASS (multi-dot fixtures compile under TW0001=error) | +| Manual fail: `application-state.CloseModal.cs` | TW0001 error, then deleted; rebuild green | + +### Review (Phase 4b) + +| Item | Value | +|------|--------| +| Effort / roster | 1 — general only | +| Rounds | 1 | +| Final counts | bug/suggestion/nit: all 0 open, 0 fixed, 0 wontfix | +| Disposition | **clean** | +| Paths | `review/review-framework.md`, `review/round-1/general.md`, `review/round-1/merged.md`, `review/disposition.md` | + +### Consumers + +timewarp-architecture / TimeWarp.State template consumers can pin **≥ 1.0.0-beta.9** and enable +`dotnet_diagnostic.TW0001.severity = warning|error` without false positives on multi-dot +state/action partials. Actual NuGet publish is a separate release step. From 81228b0c65f10ceefb1ce89799707b241ada601f Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 15:59:53 +0700 Subject: [PATCH 6/9] chore(kanban): mark task 021 done --- .../review/disposition.md | 0 .../review/review-framework.md | 0 .../review/round-1/general.md | 0 .../review/round-1/merged.md | 0 .../task.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename kanban/{in-progress => done}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md (100%) rename kanban/{in-progress => done}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md (100%) rename kanban/{in-progress => done}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md (100%) rename kanban/{in-progress => done}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md (100%) rename kanban/{in-progress => done}/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md (100%) diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md b/kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md similarity index 100% rename from kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md rename to kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/disposition.md diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md b/kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md similarity index 100% rename from kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md rename to kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/review-framework.md diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md b/kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md similarity index 100% rename from kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md rename to kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/general.md diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md b/kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md similarity index 100% rename from kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md rename to kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/review/round-1/merged.md diff --git a/kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md b/kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md similarity index 100% rename from kanban/in-progress/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md rename to kanban/done/021-extend-tw0001-kebab-pattern-to-multi-dot-partial-cs-filenames/task.md From fd1b56c39c9ec9989cf5adfe77341e25910b633c Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 16:30:48 +0700 Subject: [PATCH 7/9] build: drop local RestorePackagesPath nuget cache Use the default global NuGet package cache like other TimeWarp repos. --- Directory.Build.props | 3 --- 1 file changed, 3 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index f200957..cd095f8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -17,9 +17,6 @@ $(PackagesDirectory) - - $(RepositoryRoot).nuget-cache/ - true From b9debc1a92d7509e013c72cbc90af07c641a6acb Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 16:32:15 +0700 Subject: [PATCH 8/9] chore: remove legacy _ai agent notes Superseded by TimeWarp skills and AGENTS.md; no remaining references. --- _ai/Index.md | 11 ----- _ai/ai-instructions.md | 43 -------------------- _ai/csharp-coding-standards.md | 44 -------------------- _ai/dotnet-conventions.md | 13 ------ _ai/environment.md | 9 ----- _ai/nugets.md | 56 -------------------------- _ai/project-structure.md | 27 ------------- _ai/references.md | 73 ---------------------------------- _ai/shell-commands.md | 13 ------ _ai/tools.md | 11 ----- 10 files changed, 300 deletions(-) delete mode 100644 _ai/Index.md delete mode 100644 _ai/ai-instructions.md delete mode 100644 _ai/csharp-coding-standards.md delete mode 100644 _ai/dotnet-conventions.md delete mode 100644 _ai/environment.md delete mode 100644 _ai/nugets.md delete mode 100644 _ai/project-structure.md delete mode 100644 _ai/references.md delete mode 100644 _ai/shell-commands.md delete mode 100644 _ai/tools.md diff --git a/_ai/Index.md b/_ai/Index.md deleted file mode 100644 index b58f4de..0000000 --- a/_ai/Index.md +++ /dev/null @@ -1,11 +0,0 @@ -# Index - -## Purpose of the .ai folder - -The `.ai` folder is specifically designed to contain documents intended for Large Language Model (LLM) consumption. These files provide context, guidelines, and structured information about the project, which helps LLMs like myself to better understand and assist with the project. - -The contents of this folder are not typically used directly by the application or developers during normal development. Instead, they serve as a knowledge base for AI assistants, enabling more accurate and context-aware responses when working on the project. - -## Usage - -When interacting with an AI assistant about this project, you can refer to the contents of the `.ai` folder or ask the AI to consider specific files within this folder for more informed assistance. diff --git a/_ai/ai-instructions.md b/_ai/ai-instructions.md deleted file mode 100644 index 61d0e8c..0000000 --- a/_ai/ai-instructions.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -ai_instructions: - general: - - Don't placate or agree unnecessarily - - Do NOT apologize for your mistakes - - If you don't know something, admit it clearly - - When the user is unsure, offer your own expert opinion rather than assuming their ideas are best - - Be concise in your responses, avoiding unnecessary verbosity - - Always prioritize best practices and established conventions in software development - - coding: - - Follow the C# coding standards as outlined in .ai\csharp-coding-standards.md - - Adhere to the project structure defined in .ai\project-structure.md - - Use the libraries and dependencies listed in .ai\references.md appropriately - - When suggesting changes, use the *SEARCH/REPLACE block* format as specified - - Propose shell commands when appropriate, using the commands listed in .ai\shell-commands.md - - communication: - - Use clear, technical language appropriate for software development - - Provide explanations for your suggestions or decisions - - Ask for clarification if a request is ambiguous or lacks necessary details - - problem_solving: - - Approach problems systematically, breaking them down into manageable steps - - Consider potential edge cases and error scenarios - - Suggest efficient and scalable solutions - - testing: - - Emphasize the importance of writing and maintaining tests - - Suggest running tests after code changes using the specified test command - - version_control: - - Be aware of the git-based workflow and suggest appropriate git commands when necessary - - Remind about committing changes and providing meaningful commit messages - - security: - - Be mindful of security best practices in code suggestions - - Avoid recommending practices that could introduce vulnerabilities - - performance: - - Consider performance implications of code changes and suggestions - - Recommend optimizations when appropriate ---- diff --git a/_ai/csharp-coding-standards.md b/_ai/csharp-coding-standards.md deleted file mode 100644 index 5764964..0000000 --- a/_ai/csharp-coding-standards.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -indentation: - spaces: 2 - eol: LF - align: false - -bracket_alignment: - rule: Align all brackets in the same column if not on the same line - applies_to: ` { }, < >, ( ), [ ] ` - -naming_conventions: - type_names: Explicit unless obvious from context - namespaces: File-scoped - private_fields: No underscore prefix - variables: prefer naming the variable after the type - class_scoped: PascalCase (fields, properties, methods, events) - local_scoped: camelCase (variables inside methods) - -language_features: - - use targeted type new - - use explicit types over var - - prefer global usings (GlobalUsings.cs) ---- - -# C# Coding Standards - -```csharp -namespace ExampleNamespace; - -public class ExampleClass -{ - private readonly HttpClient HttpClient; - private int Count; - public string Name { get; set; } - - public void ExampleMethod() - { - int localVariable = 0; - if (localVariable == 0) - { - // Correct bracket alignment - } - } -} diff --git a/_ai/dotnet-conventions.md b/_ai/dotnet-conventions.md deleted file mode 100644 index 9d64529..0000000 --- a/_ai/dotnet-conventions.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -dotnet: - - target: net9.0 - - Use Directory.Build.props - - Use Directory.Packages.props - - never edit the `.sln` file directly (recommend the `dotnet sln` command) - - use `dotnet new tool-manifest` to create a `.config/dotnet-tools.json` file - - use nullable reference types ---- - -# Dotnet Conventions - -Conventions related to dotnet that are not specific to C#. diff --git a/_ai/environment.md b/_ai/environment.md deleted file mode 100644 index 4b5f49c..0000000 --- a/_ai/environment.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -environment: - - operating_system: Windows - - preferred_shell: pwsh ---- - -# Environment - -The front matter defines key information about the environment in which the project is being developed. diff --git a/_ai/nugets.md b/_ai/nugets.md deleted file mode 100644 index 4875e2a..0000000 --- a/_ai/nugets.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -nuget_categories: - General: - - name: MediatR - for: CQRS and mediator pattern - - name: Riok.Mapperly - for: object-object mapping - - name: System.Text.Json - for: JSON serialization/deserialization - - name: Serilog - for: logging - - name: FluentValidation - for: input validation - - name: EntityFrameworkCore - for: full ORM - - name: libphonenumber-csharp - for: phone number tools and validation - - name: Npgsql.EntityFrameworkCore.PostgreSQL - for: Default EF DB - - name: OneOf - for: Multiple return types - - name: Ardalis.GuardClauses - for: Guard clauses - - Testing: - - name: TimeWarp.Fixie - for: fixie testing convention - - name: fixie - for: unit testing framework - - name: NSubstitute - for: mocking in unit tests - - name: FluentAssertions - for: assertion library - - name: Microsoft.Playwright - for: end to end testing - Blazor: - - name: Microsoft.FluentUI.AspNetCore.Components - for: UI component library - - name: Blazored.LocalStorage - for: local storage in Blazor - - name: Blazored.SessionStorage - for: local storage in Blazor - - name: TimeWarp.State - for: Blazor State Management - - name: TimeWarp.State.Plus - for: extended Features - - name: timewarp-heroicons - for: heroicons as Blazor Components - - name: timewarp-simple-icons - for: simple icons as Blazor Components - ---- -# Preferred NuGet Packages - -This list contains preferred NuGet packages categorized for general .NET development, testing, and Blazor-specific use. -When suggesting solutions or implementations, prioritize these packages if applicable. diff --git a/_ai/project-structure.md b/_ai/project-structure.md deleted file mode 100644 index 30f9e03..0000000 --- a/_ai/project-structure.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -structure: - - .ai/ - - Assets/ - - DevOps/ - - Documentation/ - - C4/ - - Developer/ - - StarUml/ - - User/ - - Kanban/ - - Backlog/ - - Done/ - - InProgress/ - - ToDo/ - - Samples/ - - Scripts/ - - Git/ - - Postgres/ - - Windows/ - - Source/ - - Tests/ - - Tools/ ---- - -# Project Structure -`.ai` folders can be used to store AI-related files, in any directory as needed to give more specific context. diff --git a/_ai/references.md b/_ai/references.md deleted file mode 100644 index 85c864a..0000000 --- a/_ai/references.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -references: - - name: C# - relationship: Main programming language for solution - resources: - - Official Documentation: https://learn.microsoft.com/en-us/dotnet/csharp/ - - - name: TypeScript - relationship: Language used for JavaScript interop - resources: - - Official Documentation: https://www.typescriptlang.org/docs/ - - TypeScript Handbook: https://www.typescriptlang.org/docs/handbook/intro.html - - TypeScript Deep Dive: https://basarat.gitbook.io/typescript/ - - - name: TimeWarp.Fixie - relationship: Use this NuGet for creating a testing convention for integration and unit tests. - resources: - - TimeWarp Fixie testing convention: https://github.com/TimeWarpEngineering/timewarp-fixie - - - name: Fixie - relationship: Testing framework for integration and unit tests - resources: - - Official Documentation: https://github.com/fixie/fixie/wiki - - - name: FluentAssertions - relationship: Assertion library used for tests - resources: - - Official Documentation: https://fluentassertions.com/introduction - - GitHub Repository: https://github.com/fluentassertions/fluentassertions - - - name: Playwright for .NET - relationship: End to end testing framework - resources: - - Official Documentation: https://playwright.dev/dotnet/docs/intro - - - name: MediatR NuGet Library - relationship: Used extensively by TimeWarp.State - resources: - - Official Documentation: https://github.com/jbogard/MediatR/wiki - - Authors Blog: https://www.jimmybogard.com/ - - - name: AnyClone NuGet Library - relationship: Used as the default cloning ability if ICloneable has not been implemented. - resources: - - Official Repository: https://github.com/replaysMike/AnyClone - - - name: YAML - relationship: Used in .yaml and .yml files - resources: - - Official Specification: https://yaml.org/spec/1.2.2/ - - Learn YAML in Y minutes: https://learnxinyminutes.com/docs/yaml/ - - Common YAML Gotchas: https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-over-multiple-lines - - - name: JSON - relationship: Used in .json files - resources: - - Official Specification: https://www.json.org/json-en.html - - JSON Schema: https://json-schema.org/learn/getting-started-step-by-step - - Working with JSON in TypeScript: https://blog.logrocket.com/working-with-json-typescript/ - - - name: Markdown - relationship: Used for documentation and ai.context files - resources: - - Official Guide: https://www.markdownguide.org/ - - GitHub Flavored Markdown Spec: https://github.github.com/gfm/ - - Mastering Markdown: https://guides.github.com/features/mastering-markdown/ ---- - -This file contains a list of external dependencies and libraries. -The YAML front-matter above provides structured data about each dependency, -including its relationship to the project and links to relevant resources. -These resources include official documentation, articles, blogs, and Stack Overflow posts. -This structure allows for easy parsing by automated tools while maintaining readability for developers. diff --git a/_ai/shell-commands.md b/_ai/shell-commands.md deleted file mode 100644 index 9338495..0000000 --- a/_ai/shell-commands.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -shell-commands: - - name: fixie - type: dotnet tool - description: A .NET global tool for running tests with Fixie - command: dotnet fixie - install: dotnet tool install Fixie.Console - - name: timewarp-sync - type: dotnet tool - description: A .NET global tool to synchronize and manage shared files across multiple repositories. ---- -# Shell Commands -Shell commands available that we want AI to be aware of and recommend. Although they may not be in this repo. diff --git a/_ai/tools.md b/_ai/tools.md deleted file mode 100644 index fffd347..0000000 --- a/_ai/tools.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -tools: - - name: Beyond Compare - description: A powerful file and directory comparison tool - - name: PowerGrep - description: A powerful text search tool ---- - -# Tools - -This is a list of tools the user has installed that we want AI to be aware of. From 4bf6452f1632f0c8693d45c19b14ebe31b603530 Mon Sep 17 00:00:00 2001 From: "Steven T. Cramer" Date: Wed, 29 Jul 2026 16:35:34 +0700 Subject: [PATCH 9/9] chore: make remaining paths kebab-case for repo audit Rename legacy underscore kanban tasks, spike project, and test markdown. Emit compiler-generated files under obj/ (pruned by audit) and match PascalCase sources to kebab markdown via class-name conversion. --- .../reference/source-generators/overview.md | 2 +- ...001-create-hello-world-sourcegenerator.md} | 0 ...-project.md => 002-create-test-project.md} | 0 ...-create-markdown-docs-source-generator.md} | 0 ...=> 004-create-xmldoc-markdown-template.md} | 0 ...testclass-with-extensive-documentation.md} | 0 ...te-xmldocs-generation-class-level-only.md} | 0 ...te-xmldocs-generation-add-method-level.md} | 0 ...9.md => 008-update-testconsole-to-net9.md} | 0 ...-xmldocs-generation-add-property-level.md} | 0 ...> 010-enable-analyzer-release-tracking.md} | 0 ...> 011-create-kebab-case-file-name-rule.md} | 0 ...ate-markdown-docs-generator-kebab-case.md} | 0 ...4-create-xml-docs-to-markdown-analyzer.md} | 0 .../task.md | 0 ...generation-add-constructor-event-level.md} | 0 .../file-name-rule-code-fix-provider.cs | 0 .../task.md | 0 .../task.md | 0 .../xml-docs-to-markdown-code-fix-provider.cs | 0 .../task.md | 0 .../markdown-docs-generator.cs | 8 ++ .../Program.cs | 0 .../partial-property-test.csproj} | 0 .../test.cs | 0 .../DataService.implements.g.cs | 37 ------- .../ImplementsAttribute.g.cs | 13 --- .../StringListWrapper.implements.g.cs | 70 ------------- .../KebabCaseTest.docs.g.cs | 26 ----- .../PartialPropertyTest.docs.g.cs | 26 ----- .../PascalCaseTest.docs.g.cs | 26 ----- .../TestClass.docs.g.cs | 99 ------------------- ...{IDataProcessor.md => i-data-processor.md} | 2 +- ...{PascalCaseTest.md => pascal-case-test.md} | 0 .../{TestClass.md => test-class.md} | 2 +- ...warp-source-generators-test-console.csproj | 11 +-- 36 files changed, 15 insertions(+), 307 deletions(-) rename kanban/done/{001_create-hello-world-sourcegenerator.md => 001-create-hello-world-sourcegenerator.md} (100%) rename kanban/done/{002_create-test-project.md => 002-create-test-project.md} (100%) rename kanban/done/{003_create-markdown-docs-source-generator.md => 003-create-markdown-docs-source-generator.md} (100%) rename kanban/done/{004_create-xmldoc-markdown-template.md => 004-create-xmldoc-markdown-template.md} (100%) rename kanban/done/{005_update-testclass-with-extensive-documentation.md => 005-update-testclass-with-extensive-documentation.md} (100%) rename kanban/done/{006_update-xmldocs-generation-class-level-only.md => 006-update-xmldocs-generation-class-level-only.md} (100%) rename kanban/done/{007_update-xmldocs-generation-add-method-level.md => 007-update-xmldocs-generation-add-method-level.md} (100%) rename kanban/done/{008_update-testconsole-to-net9.md => 008-update-testconsole-to-net9.md} (100%) rename kanban/done/{009_update-xmldocs-generation-add-property-level.md => 009-update-xmldocs-generation-add-property-level.md} (100%) rename kanban/done/{010_enable-analyzer-release-tracking.md => 010-enable-analyzer-release-tracking.md} (100%) rename kanban/done/{011_create-kebab-case-file-name-rule.md => 011-create-kebab-case-file-name-rule.md} (100%) rename kanban/done/{012_update-markdown-docs-generator-kebab-case.md => 012-update-markdown-docs-generator-kebab-case.md} (100%) rename kanban/done/{014_create-xml-docs-to-markdown-analyzer.md => 014-create-xml-docs-to-markdown-analyzer.md} (100%) rename kanban/in-progress/{017_fix-tw0003-analyzer-ignoring-generated-files => 017-fix-tw0003-analyzer-ignoring-generated-files}/task.md (100%) rename kanban/to-do/{013_update-xmldocs-generation-add-constructor-event-level.md => 013-update-xmldocs-generation-add-constructor-event-level.md} (100%) rename kanban/to-do/{015_create-kebab-case-file-name-code-fix => 015-create-kebab-case-file-name-code-fix}/file-name-rule-code-fix-provider.cs (100%) rename kanban/to-do/{015_create-kebab-case-file-name-code-fix => 015-create-kebab-case-file-name-code-fix}/task.md (100%) rename kanban/to-do/{016_create-xml-docs-to-markdown-code-fix => 016-create-xml-docs-to-markdown-code-fix}/task.md (100%) rename kanban/to-do/{016_create-xml-docs-to-markdown-code-fix => 016-create-xml-docs-to-markdown-code-fix}/xml-docs-to-markdown-code-fix-provider.cs (100%) rename kanban/to-do/{017_create-interface-delegation-generator => 017-create-interface-delegation-generator}/task.md (100%) rename spikes/partial-properties-csharp13/{PartialPropertyTest => partial-property-test}/Program.cs (100%) rename spikes/partial-properties-csharp13/{PartialPropertyTest/PartialPropertyTest.csproj => partial-property-test/partial-property-test.csproj} (100%) rename spikes/partial-properties-csharp13/{PartialPropertyTest => partial-property-test}/test.cs (100%) delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/DataService.implements.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/ImplementsAttribute.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/StringListWrapper.implements.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/KebabCaseTest.docs.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PartialPropertyTest.docs.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PascalCaseTest.docs.g.cs delete mode 100644 tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/TestClass.docs.g.cs rename tests/timewarp-source-generators-test-console/{IDataProcessor.md => i-data-processor.md} (95%) rename tests/timewarp-source-generators-test-console/{PascalCaseTest.md => pascal-case-test.md} (100%) rename tests/timewarp-source-generators-test-console/{TestClass.md => test-class.md} (95%) diff --git a/documentation/developer/reference/source-generators/overview.md b/documentation/developer/reference/source-generators/overview.md index 51d0956..0f2a39c 100644 --- a/documentation/developer/reference/source-generators/overview.md +++ b/documentation/developer/reference/source-generators/overview.md @@ -11,7 +11,7 @@ Generates XML documentation from markdown files for C# classes. - **File Matching**: - Supports both PascalCase and kebab-case naming conventions - For kebab-case source files (e.g., `test-class.cs`), matches kebab-case markdown files (e.g., `test-class.md`) - - For PascalCase source files (e.g., `TestClass.cs`), matches PascalCase markdown files (e.g., `TestClass.md`) + - For PascalCase source files (e.g., `PascalCaseTest.cs`), matches class-name markdown or kebab-case of the class name (e.g., `pascal-case-test.md`) - Always falls back to class name matching for backward compatibility - **Templates**: See [XMLDoc Templates](#xmldoc-templates) diff --git a/kanban/done/001_create-hello-world-sourcegenerator.md b/kanban/done/001-create-hello-world-sourcegenerator.md similarity index 100% rename from kanban/done/001_create-hello-world-sourcegenerator.md rename to kanban/done/001-create-hello-world-sourcegenerator.md diff --git a/kanban/done/002_create-test-project.md b/kanban/done/002-create-test-project.md similarity index 100% rename from kanban/done/002_create-test-project.md rename to kanban/done/002-create-test-project.md diff --git a/kanban/done/003_create-markdown-docs-source-generator.md b/kanban/done/003-create-markdown-docs-source-generator.md similarity index 100% rename from kanban/done/003_create-markdown-docs-source-generator.md rename to kanban/done/003-create-markdown-docs-source-generator.md diff --git a/kanban/done/004_create-xmldoc-markdown-template.md b/kanban/done/004-create-xmldoc-markdown-template.md similarity index 100% rename from kanban/done/004_create-xmldoc-markdown-template.md rename to kanban/done/004-create-xmldoc-markdown-template.md diff --git a/kanban/done/005_update-testclass-with-extensive-documentation.md b/kanban/done/005-update-testclass-with-extensive-documentation.md similarity index 100% rename from kanban/done/005_update-testclass-with-extensive-documentation.md rename to kanban/done/005-update-testclass-with-extensive-documentation.md diff --git a/kanban/done/006_update-xmldocs-generation-class-level-only.md b/kanban/done/006-update-xmldocs-generation-class-level-only.md similarity index 100% rename from kanban/done/006_update-xmldocs-generation-class-level-only.md rename to kanban/done/006-update-xmldocs-generation-class-level-only.md diff --git a/kanban/done/007_update-xmldocs-generation-add-method-level.md b/kanban/done/007-update-xmldocs-generation-add-method-level.md similarity index 100% rename from kanban/done/007_update-xmldocs-generation-add-method-level.md rename to kanban/done/007-update-xmldocs-generation-add-method-level.md diff --git a/kanban/done/008_update-testconsole-to-net9.md b/kanban/done/008-update-testconsole-to-net9.md similarity index 100% rename from kanban/done/008_update-testconsole-to-net9.md rename to kanban/done/008-update-testconsole-to-net9.md diff --git a/kanban/done/009_update-xmldocs-generation-add-property-level.md b/kanban/done/009-update-xmldocs-generation-add-property-level.md similarity index 100% rename from kanban/done/009_update-xmldocs-generation-add-property-level.md rename to kanban/done/009-update-xmldocs-generation-add-property-level.md diff --git a/kanban/done/010_enable-analyzer-release-tracking.md b/kanban/done/010-enable-analyzer-release-tracking.md similarity index 100% rename from kanban/done/010_enable-analyzer-release-tracking.md rename to kanban/done/010-enable-analyzer-release-tracking.md diff --git a/kanban/done/011_create-kebab-case-file-name-rule.md b/kanban/done/011-create-kebab-case-file-name-rule.md similarity index 100% rename from kanban/done/011_create-kebab-case-file-name-rule.md rename to kanban/done/011-create-kebab-case-file-name-rule.md diff --git a/kanban/done/012_update-markdown-docs-generator-kebab-case.md b/kanban/done/012-update-markdown-docs-generator-kebab-case.md similarity index 100% rename from kanban/done/012_update-markdown-docs-generator-kebab-case.md rename to kanban/done/012-update-markdown-docs-generator-kebab-case.md diff --git a/kanban/done/014_create-xml-docs-to-markdown-analyzer.md b/kanban/done/014-create-xml-docs-to-markdown-analyzer.md similarity index 100% rename from kanban/done/014_create-xml-docs-to-markdown-analyzer.md rename to kanban/done/014-create-xml-docs-to-markdown-analyzer.md diff --git a/kanban/in-progress/017_fix-tw0003-analyzer-ignoring-generated-files/task.md b/kanban/in-progress/017-fix-tw0003-analyzer-ignoring-generated-files/task.md similarity index 100% rename from kanban/in-progress/017_fix-tw0003-analyzer-ignoring-generated-files/task.md rename to kanban/in-progress/017-fix-tw0003-analyzer-ignoring-generated-files/task.md diff --git a/kanban/to-do/013_update-xmldocs-generation-add-constructor-event-level.md b/kanban/to-do/013-update-xmldocs-generation-add-constructor-event-level.md similarity index 100% rename from kanban/to-do/013_update-xmldocs-generation-add-constructor-event-level.md rename to kanban/to-do/013-update-xmldocs-generation-add-constructor-event-level.md diff --git a/kanban/to-do/015_create-kebab-case-file-name-code-fix/file-name-rule-code-fix-provider.cs b/kanban/to-do/015-create-kebab-case-file-name-code-fix/file-name-rule-code-fix-provider.cs similarity index 100% rename from kanban/to-do/015_create-kebab-case-file-name-code-fix/file-name-rule-code-fix-provider.cs rename to kanban/to-do/015-create-kebab-case-file-name-code-fix/file-name-rule-code-fix-provider.cs diff --git a/kanban/to-do/015_create-kebab-case-file-name-code-fix/task.md b/kanban/to-do/015-create-kebab-case-file-name-code-fix/task.md similarity index 100% rename from kanban/to-do/015_create-kebab-case-file-name-code-fix/task.md rename to kanban/to-do/015-create-kebab-case-file-name-code-fix/task.md diff --git a/kanban/to-do/016_create-xml-docs-to-markdown-code-fix/task.md b/kanban/to-do/016-create-xml-docs-to-markdown-code-fix/task.md similarity index 100% rename from kanban/to-do/016_create-xml-docs-to-markdown-code-fix/task.md rename to kanban/to-do/016-create-xml-docs-to-markdown-code-fix/task.md diff --git a/kanban/to-do/016_create-xml-docs-to-markdown-code-fix/xml-docs-to-markdown-code-fix-provider.cs b/kanban/to-do/016-create-xml-docs-to-markdown-code-fix/xml-docs-to-markdown-code-fix-provider.cs similarity index 100% rename from kanban/to-do/016_create-xml-docs-to-markdown-code-fix/xml-docs-to-markdown-code-fix-provider.cs rename to kanban/to-do/016-create-xml-docs-to-markdown-code-fix/xml-docs-to-markdown-code-fix-provider.cs diff --git a/kanban/to-do/017_create-interface-delegation-generator/task.md b/kanban/to-do/017-create-interface-delegation-generator/task.md similarity index 100% rename from kanban/to-do/017_create-interface-delegation-generator/task.md rename to kanban/to-do/017-create-interface-delegation-generator/task.md diff --git a/source/timewarp-source-generators/markdown-docs-generator.cs b/source/timewarp-source-generators/markdown-docs-generator.cs index dcc580f..9573184 100644 --- a/source/timewarp-source-generators/markdown-docs-generator.cs +++ b/source/timewarp-source-generators/markdown-docs-generator.cs @@ -84,6 +84,14 @@ public void Initialize(IncrementalGeneratorInitializationContext context) Path.GetFileNameWithoutExtension(md.Path).Equals(className, StringComparison.OrdinalIgnoreCase)); } + // Also try kebab-case of the class name (PascalCase source + kebab markdown) + if (matchingMd == null) + { + string kebabClassName = ConvertToKebabCase(className); + matchingMd = markdownTexts.FirstOrDefault(md => + Path.GetFileNameWithoutExtension(md.Path).Equals(kebabClassName, StringComparison.OrdinalIgnoreCase)); + } + if (matchingMd != null) { var markdownContent = matchingMd.GetText()?.ToString() ?? string.Empty; diff --git a/spikes/partial-properties-csharp13/PartialPropertyTest/Program.cs b/spikes/partial-properties-csharp13/partial-property-test/Program.cs similarity index 100% rename from spikes/partial-properties-csharp13/PartialPropertyTest/Program.cs rename to spikes/partial-properties-csharp13/partial-property-test/Program.cs diff --git a/spikes/partial-properties-csharp13/PartialPropertyTest/PartialPropertyTest.csproj b/spikes/partial-properties-csharp13/partial-property-test/partial-property-test.csproj similarity index 100% rename from spikes/partial-properties-csharp13/PartialPropertyTest/PartialPropertyTest.csproj rename to spikes/partial-properties-csharp13/partial-property-test/partial-property-test.csproj diff --git a/spikes/partial-properties-csharp13/PartialPropertyTest/test.cs b/spikes/partial-properties-csharp13/partial-property-test/test.cs similarity index 100% rename from spikes/partial-properties-csharp13/PartialPropertyTest/test.cs rename to spikes/partial-properties-csharp13/partial-property-test/test.cs diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/DataService.implements.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/DataService.implements.g.cs deleted file mode 100644 index 1a4e45f..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/DataService.implements.g.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -// Interface delegation for DataService -public partial class DataService -{ - // Delegation to _logger for TimeWarp.SourceGenerators.TestConsole.ILogger - public void Log(string message) - { - _logger.Log(message); - } - - public void LogError(string message, System.Exception exception) - { - _logger.LogError(message, exception); - } - - public TimeWarp.SourceGenerators.TestConsole.LogLevel MinimumLevel - { - get => _logger.MinimumLevel; set => _logger.MinimumLevel = value; - } - - public event System.EventHandler? LogWritten - { - add => _logger.LogWritten += value; - remove => _logger.LogWritten -= value; - } - - // Delegation to _processor for TimeWarp.SourceGenerators.TestConsole.IDataProcessor - public bool Validate(string input) - { - return _processor.Validate(input); - } - -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/ImplementsAttribute.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/ImplementsAttribute.g.cs deleted file mode 100644 index 88a9eb6..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/ImplementsAttribute.g.cs +++ /dev/null @@ -1,13 +0,0 @@ -// -#nullable enable - -namespace TimeWarp.SourceGenerators -{ - /// - /// Marks a field or property as the implementation delegate for an interface. - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = false, Inherited = false)] - internal class ImplementsAttribute : System.Attribute - { - } -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/StringListWrapper.implements.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/StringListWrapper.implements.g.cs deleted file mode 100644 index f09f73f..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.InterfaceDelegationGenerator/StringListWrapper.implements.g.cs +++ /dev/null @@ -1,70 +0,0 @@ -// -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -// Interface delegation for StringListWrapper - YO YO YO MAMA v2 with inherited interfaces! -public partial class StringListWrapper -{ - // Delegation to InnerList for System.Collections.Generic.IList - public void Add(string item) - { - InnerList.Add(item); - } - - public void Clear() - { - InnerList.Clear(); - } - - public bool Contains(string item) - { - return InnerList.Contains(item); - } - - public void CopyTo(string[] array, int arrayIndex) - { - InnerList.CopyTo(array, arrayIndex); - } - - public bool Remove(string item) - { - return InnerList.Remove(item); - } - - public int Count - { - get => InnerList.Count; - } - - public bool IsReadOnly - { - get => InnerList.IsReadOnly; - } - - public System.Collections.Generic.IEnumerator GetEnumerator() - { - return InnerList.GetEnumerator(); - } - - public int IndexOf(string item) - { - return InnerList.IndexOf(item); - } - - public void Insert(int index, string item) - { - InnerList.Insert(index, item); - } - - public void RemoveAt(int index) - { - InnerList.RemoveAt(index); - } - - public string this[int index] - { - get => InnerList[index]; set => InnerList[index] = value; - } - -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/KebabCaseTest.docs.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/KebabCaseTest.docs.g.cs deleted file mode 100644 index 6a08449..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/KebabCaseTest.docs.g.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Auto-generated documentation for KebabCaseTest -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -/// -/// This class tests the kebab-case file name matching functionality. -/// -/// -/// This is a test case to ensure the generator correctly matches kebab-case markdown files with kebab-case source files. -/// - -public partial class KebabCaseTest -{ - - // Documentation for GetTestMessage - /// - /// Gets a test message to verify the generator is working. - /// - /// - /// A test message string. - /// - public partial string GetTestMessage(); - - -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PartialPropertyTest.docs.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PartialPropertyTest.docs.g.cs deleted file mode 100644 index e61ddf0..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PartialPropertyTest.docs.g.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Auto-generated documentation for PartialPropertyTest -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -/// -/// This class demonstrates that partial properties are now supported in .NET 9 and C# 13. -/// -/// -/// This test proves that we can now implement property-level documentation generation in the MarkdownDocsGenerator, as partial properties are fully supported. This was previously not possible in earlier versions of C#. -/// - -public partial class PartialPropertyTest -{ - // Documentation for TestProperty - /// - /// A test property demonstrating partial property support. - /// - /// - /// A string value that can be get and set, implemented using partial property syntax. - /// - public partial string TestProperty { get => field ??= ""; set => field = value; } - - - -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PascalCaseTest.docs.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PascalCaseTest.docs.g.cs deleted file mode 100644 index 39bc48f..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/PascalCaseTest.docs.g.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Auto-generated documentation for PascalCaseTest -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -/// -/// This class tests the PascalCase file name matching functionality. -/// -/// -/// This is a test case to ensure the generator maintains backward compatibility with PascalCase file names. -/// - -public partial class PascalCaseTest -{ - - // Documentation for GetPascalMessage - /// - /// Gets a Pascal case test message. - /// - /// - /// A Pascal case test message string. - /// - public partial string GetPascalMessage(); - - -} diff --git a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/TestClass.docs.g.cs b/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/TestClass.docs.g.cs deleted file mode 100644 index 0901655..0000000 --- a/tests/timewarp-source-generators-test-console/generated/timewarp-source-generators/TimeWarp.SourceGenerators.MarkdownDocsGenerator/TestClass.docs.g.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Auto-generated documentation for TestClass -#nullable enable - -namespace TimeWarp.SourceGenerators.TestConsole; - -/// -/// A test class that demonstrates various documentation features. Implements string processing capabilities. -/// -/// -/// The TestClass provides string processing functionality with configurable validation rules. It can operate in either normal or strict mode, where strict mode enforces additional validation rules such as maximum length constraints. -/// -/// -/// -/// -/// - -public partial class TestClass -{ - // Documentation for MaxLength - /// - /// Gets or sets the maximum length allowed for processing strings. - /// - /// - /// The maximum string length. Default is 100. - /// - public partial int MaxLength { get => field; set => field = value; } - - // Documentation for ProcessedCount - /// - /// Gets the number of strings processed since initialization. - /// - /// - /// The total count of processed strings. - /// - public partial int ProcessedCount { get => field; } - - // Documentation for LastMessage - /// - /// Gets the last processed message. - /// - /// - /// The last message that was successfully processed. - /// - public partial string? LastMessage { get => field; set => field = value; } - - - // Documentation for GetMessage - /// - /// Gets a test message with optional prefix. - /// - /// Optional prefix to add to the message. - /// - /// A formatted test message. - /// - public partial string GetMessage(string? prefix); - - // Documentation for Process - /// - /// Processes the input string according to configured rules. - /// - /// The input string to process. - /// - /// The processed string. - /// - /// Thrown when input is null. - /// Thrown when input exceeds MaxLength in strict mode. - public partial string Process(string input); - - // Documentation for Validate - /// - /// Validates if the input string meets processing requirements. - /// - /// The input string to validate. - /// - /// True if the string is valid for processing; otherwise, false. - /// - public partial bool Validate(string input); - - // Documentation for TryProcessBatch - /// - /// Attempts to process multiple strings in batch mode. - /// - /// Array of strings to process. - /// Array to store processed results. - /// - /// The number of successfully processed strings. - /// - /// Thrown when inputs or results array is null. - /// Thrown when results array is smaller than inputs array. - public partial int TryProcessBatch(string[] inputs, string[] results); - - // Documentation for Reset - /// - /// Resets the processor to its initial state. - /// - public partial void Reset(); - - -} diff --git a/tests/timewarp-source-generators-test-console/IDataProcessor.md b/tests/timewarp-source-generators-test-console/i-data-processor.md similarity index 95% rename from tests/timewarp-source-generators-test-console/IDataProcessor.md rename to tests/timewarp-source-generators-test-console/i-data-processor.md index f0bf912..66d8cb5 100644 --- a/tests/timewarp-source-generators-test-console/IDataProcessor.md +++ b/tests/timewarp-source-generators-test-console/i-data-processor.md @@ -78,7 +78,7 @@ if (processor.Validate("test")) ``` ## See Also -- [TestClass](TestClass.md) +- [TestClass](test-class.md) ## References - See @System.IDisposable for similar interface pattern diff --git a/tests/timewarp-source-generators-test-console/PascalCaseTest.md b/tests/timewarp-source-generators-test-console/pascal-case-test.md similarity index 100% rename from tests/timewarp-source-generators-test-console/PascalCaseTest.md rename to tests/timewarp-source-generators-test-console/pascal-case-test.md diff --git a/tests/timewarp-source-generators-test-console/TestClass.md b/tests/timewarp-source-generators-test-console/test-class.md similarity index 95% rename from tests/timewarp-source-generators-test-console/TestClass.md rename to tests/timewarp-source-generators-test-console/test-class.md index eb32630..afb6441 100644 --- a/tests/timewarp-source-generators-test-console/TestClass.md +++ b/tests/timewarp-source-generators-test-console/test-class.md @@ -159,7 +159,7 @@ int succeeded = processor.TryProcessBatch(inputs, results); ``` ## See Also -- [IDataProcessor](IDataProcessor.md) +- [IDataProcessor](i-data-processor.md) ## Inheritance Implements @IDataProcessor interface. diff --git a/tests/timewarp-source-generators-test-console/timewarp-source-generators-test-console.csproj b/tests/timewarp-source-generators-test-console/timewarp-source-generators-test-console.csproj index b564a05..330dd9d 100644 --- a/tests/timewarp-source-generators-test-console/timewarp-source-generators-test-console.csproj +++ b/tests/timewarp-source-generators-test-console/timewarp-source-generators-test-console.csproj @@ -26,17 +26,14 @@ - + true - - generated - - $(GeneratedFolder) + $(BaseIntermediateOutputPath)generated - - + +