Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
972c8cc
Phase 0: TOM 19.114.0 bump + offline golden-file test harness
marcosqlbi Jun 28, 2026
6b59fe7
Small config changes for Claude plugins
marcosqlbi Jun 28, 2026
f7964e0
Include current state
marcosqlbi Jun 28, 2026
5a22b94
Updated my-claude-teams reference
marcosqlbi Jun 28, 2026
e6db6e9
Updated claude and session_handoff to correctly use agents
marcosqlbi Jun 28, 2026
4bace5e
Bumped to 0.5.1 with tool name
marcosqlbi Jun 28, 2026
eccd783
Bump to 0.5.3
marcosqlbi Jun 28, 2026
921f618
Removed user plugin
marcosqlbi Jun 28, 2026
9510fa0
Added my-claude-teams at project level
marcosqlbi Jun 28, 2026
83bdbcf
Added MCP permissions
marcosqlbi Jul 1, 2026
f235421
Merge branch 'add-calendar' of https://github.com/sql-bi/DaxTemplate …
marcosqlbi Jul 1, 2026
8fc6ad8
Fix AddHierarchies internal Tabular back-references
marcosqlbi Jul 1, 2026
b1d0579
Add CHANGELOG with Unreleased AddHierarchies fix entry
marcosqlbi Jul 1, 2026
1b839b6
Target .NET 10 only with C# 14 and SDK 10
marcosqlbi Jul 1, 2026
43bd0f9
Bump test tooling and config packages to latest stable for net10
marcosqlbi Jul 1, 2026
dead80c
Add AGENTS.md + docs/design architecture docs
marcosqlbi Jul 1, 2026
9e004f2
Allowlist read-only git --no-pager forms
marcosqlbi Jul 1, 2026
3d94e67
Plan Phase M (modernization/refactor) in session handoff
marcosqlbi Jul 1, 2026
30c58af
Integrate dotnet-claude-kit with experiment-team delegation
marcosqlbi Jul 1, 2026
6bbad5d
Align Phase M and feature phases with dotnet-claude-kit tooling
marcosqlbi Jul 1, 2026
8845b73
Flip Phase M to IN PROGRESS (Stage 0 active) in handoff
marcosqlbi Jul 1, 2026
1b6d1f0
Moved from experiment-team to dotnet-team
marcosqlbi Jul 2, 2026
bdcc382
Revert pre stage 0
marcosqlbi Jul 2, 2026
50eb033
test: add public-API baseline change-detector (Phase M Stage 0 P0)
marcosqlbi Jul 2, 2026
c869176
test: add P1 characterization tests (Phase M Stage 0 P1)
marcosqlbi Jul 2, 2026
5d61371
test: add P2 characterization tests (Phase M Stage 0 P2)
marcosqlbi Jul 2, 2026
6f72d07
test: raise Measures + Package coverage to clear 80% (Phase M Stage 0)
marcosqlbi Jul 2, 2026
8a49b46
ci: activate coverage baseline + 80% floor, add Stryker (Phase M Stag…
marcosqlbi Jul 2, 2026
20e57f1
docs: mark Phase M Stage 0 complete, record backlog, tee up Stage 1
marcosqlbi Jul 2, 2026
27a740a
build: add Directory.Build.props + enable analyzers (Phase M Stage 1A)
marcosqlbi Jul 2, 2026
0ff9b3f
style: dotnet format whitespace/imports baseline — Dax.Template (Stag…
marcosqlbi Jul 2, 2026
cf67980
style: dotnet format whitespace/imports baseline — Tests (Stage 1B)
marcosqlbi Jul 2, 2026
07d2b1f
style: dotnet format whitespace/imports baseline — TestUI (Stage 1B)
marcosqlbi Jul 2, 2026
45e2abb
ci: wire format-verify gate + CI-only warnings-as-errors (Phase M Sta…
marcosqlbi Jul 2, 2026
19ece98
docs: mark Phase M Stage 1 complete, tee up Stage 2
marcosqlbi Jul 2, 2026
e2f4028
refactor: modernize leaf subsystems — Constants/Enums/Exceptions (Sta…
marcosqlbi Jul 2, 2026
1eddd5e
refactor: modernize Extensions + tighten WAE allowlist (Stage 2.2)
marcosqlbi Jul 2, 2026
fbb1af1
refactor: modernize Model + tighten WAE allowlist (Stage 2.3)
marcosqlbi Jul 2, 2026
15dd165
refactor: modernize Syntax subsystem (Stage 2.4)
marcosqlbi Jul 2, 2026
1c761a4
refactor: modernize Measures subsystem (Stage 2.5)
marcosqlbi Jul 2, 2026
a9a31bb
refactor: modernize Tables non-date base classes (Stage 2.6a)
marcosqlbi Jul 2, 2026
2eb4562
refactor: modernize Tables date branch + tighten WAE allowlist (Stage…
marcosqlbi Jul 2, 2026
a39687a
refactor: modernize Interfaces subsystem (Stage 2.7a)
marcosqlbi Jul 2, 2026
7801007
refactor: modernize Engine/Package/root + tighten WAE allowlist (Stag…
marcosqlbi Jul 2, 2026
be0b053
refactor: modernize TestUI + tighten WAE allowlist (Stage 2.8)
marcosqlbi Jul 2, 2026
ae96d91
refactor: clear bucket-C analyzer debt + tighten WAE allowlist (Stage 2)
marcosqlbi Jul 2, 2026
52d9676
feat!: required members migration + major version bump to 2.0.0 (Stag…
marcosqlbi Jul 2, 2026
86f2ddb
refactor!: public API naming renames + empty the rename allowlist (St…
marcosqlbi Jul 2, 2026
3536cc0
docs: sync design docs + test comments to 2.10b renames
marcosqlbi Jul 2, 2026
9b78826
docs: mark Phase M Stage 2 complete, tee up Stage 3
marcosqlbi Jul 2, 2026
9ead9ae
refactor!: CA1051 protected fields -> properties + shrink allowlist (…
marcosqlbi Jul 2, 2026
4ab6f99
docs: mark CA1051 follow-up done in handoff (Stage 2 fully closed)
marcosqlbi Jul 2, 2026
1b21352
refactor: dedup annotation upsert into shared extension (Stage 3 item 1)
marcosqlbi Jul 3, 2026
82170e9
refactor!: exceptions naming consistency (Stage 3 item 4)
marcosqlbi Jul 3, 2026
6d6e430
docs: XML summaries for undocumented Syntax types (Stage 3 item 3)
marcosqlbi Jul 3, 2026
3fe232c
refactor!: encapsulate TOM reflection + document fragility (Stage 3 i…
marcosqlbi Jul 3, 2026
f8d0323
fix: harden two template error paths (Stage 3 Group B: B1+B2)
marcosqlbi Jul 3, 2026
2d251b2
fix: copy Hierarchy/Level Description into TOM objects (Stage 3 Group…
marcosqlbi Jul 3, 2026
4bf6020
fix: detect multi-node dependency cycles promptly (Stage 3 Group B: B4)
marcosqlbi Jul 3, 2026
238a9fe
fix: remove CustomDateTable output when disabled (Stage 3 Group B: B5)
marcosqlbi Jul 3, 2026
4637630
fix: invariant-culture DAX formatting; empty WAE allowlist (Stage 3 c…
marcosqlbi Jul 3, 2026
265f207
docs: sync design docs, CHANGELOG, AGENTS for Stage 3 (Phase M Stage …
marcosqlbi Jul 3, 2026
a76042d
docs(handoff): resolve Calendar column-binding open question (public …
marcosqlbi Jul 4, 2026
545d675
docs(handoff): point resume instructions at Phase 1 (Calendars)
marcosqlbi Jul 4, 2026
27a3b10
feat(calendar): add CalendarTemplate for native TOM Calendar attachme…
marcosqlbi Jul 6, 2026
a4596d4
feat(calcgroup): add CalculationGroupTemplate for generic calc-group …
marcosqlbi Jul 6, 2026
dc33b84
feat(functions): add FunctionLibraryTemplate for DAX user-defined fun…
marcosqlbi Jul 6, 2026
301a7a1
docs(handoff): mark Phases 1-3 complete; point resume at live-server …
marcosqlbi Jul 6, 2026
d70fb32
Added PBIX for live tests
marcosqlbi Jul 12, 2026
0edb9b5
docs(handoff): record live-server validation PASS for Phases 1-3; rec…
marcosqlbi Jul 12, 2026
51ade88
Apply suggestion from @albertospelta
marcosqlbi Jul 14, 2026
ec4a695
Apply suggestion from @albertospelta
marcosqlbi Jul 14, 2026
7ffc296
Apply suggestion from @albertospelta
marcosqlbi Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .azure/pipelines/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,6 @@ steps:
inputs:
packageType: sdk
useGlobalJson: true
- task: UseDotNet@2
displayName: 'Install .NET 6.0 runtime'
inputs:
packageType: runtime
version: '6.0.x'
- task: DotNetCoreCLI@2
displayName: '.NET restore'
inputs:
Expand All @@ -57,11 +52,21 @@ steps:
feedsToUse: 'select'
verbosityRestore: '${{ parameters.verbosity }}'
- task: DotNetCoreCLI@2
# Phase M / Stage 1 step 1C: CI-only warnings-as-errors, mirroring .github/workflows/ci.yml.
# The matching WarningsNotAsErrors allowlist (Stage-2 deferred debt) lives in
# src/Directory.Build.props so both pipelines share one source of truth.
displayName: '.NET build'
inputs:
command: 'build'
projects: 'src/**/*.csproj'
arguments: '--configuration "$(configuration)" --no-restore --verbosity ${{ parameters.verbosity }} /p:AssemblyVersion="$(assemblyVersion)" /p:FileVersion="$(semanticVersion)" /p:VersionPrefix="$(semanticVersion)" /p:VersionSuffix="$(versionSuffix)" /p:ContinuousIntegrationBuild="true" /p:AdditionalConstants="SIGNED" /p:SignAssembly="true" /p:AssemblyOriginatorKeyFile="$(signKey.secureFilePath)" /m'
arguments: '--configuration "$(configuration)" --no-restore --verbosity ${{ parameters.verbosity }} /p:AssemblyVersion="$(assemblyVersion)" /p:FileVersion="$(semanticVersion)" /p:VersionPrefix="$(semanticVersion)" /p:VersionSuffix="$(versionSuffix)" /p:ContinuousIntegrationBuild="true" /p:AdditionalConstants="SIGNED" /p:SignAssembly="true" /p:AssemblyOriginatorKeyFile="$(signKey.secureFilePath)" /p:TreatWarningsAsErrors=true /m'
- task: DotNetCoreCLI@2
# Verifies the dotnet-format baseline (clean as of Stage 1B) doesn't drift.
displayName: '.NET format check'
inputs:
command: 'custom'
custom: 'format'
arguments: 'src/Dax.Template.sln --verify-no-changes --no-restore'
- task: DotNetCoreCLI@2
displayName: '.NET test'
inputs:
Expand Down
854 changes: 854 additions & 0 deletions .claude/SESSION_HANDOFF.md

Large diffs are not rendered by default.

54 changes: 54 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"permissions": {
"allow": [
"mcp__serena",
"mcp__cwm-roslyn-navigator",
"Bash(claude mcp *)",
"Bash(git -C \"C:/Users/MarcoRusso/source/repos/sql-bi/DaxTemplate\" log --oneline -10)",
"Bash(dotnet test *)",
"Bash(dotnet restore *)",
"Bash(dotnet pack *)",
"Bash(dotnet list *)",
"Bash(python *)",
"Bash(dir *)",
"Bash(Get-ChildItem *)",
"Bash(curl *)",
"Bash(git *)"
],
"defaultMode": "bypassPermissions"
},
"enabledPlugins": {
"brainstorm@brainstorm-plan": true,
"andrej-karpathy-skills@karpathy-skills": true,
"experiment-team@my-claude-teams": false,
"dotnet-team@my-claude-teams": true,
"dotnet-claude-kit@dotnet-claude-kit": true
},
"extraKnownMarketplaces": {
"brainstorm-plan": {
"source": {
"source": "github",
"repo": "thepushkarp/brainstorm-plan"
}
},
"karpathy-skills": {
"source": {
"source": "github",
"repo": "forrestchang/andrej-karpathy-skills"
}
},
"my-claude-teams": {
"source": {
"source": "github",
"repo": "marcosqlbi/my-claude-teams"
},
"autoUpdate": true
},
"dotnet-claude-kit": {
"source": {
"source": "github",
"repo": "codewithmukesh/dotnet-claude-kit"
}
}
}
}
20 changes: 20 additions & 0 deletions .config/dotnet-tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-reportgenerator-globaltool": {
"version": "5.5.10",
"commands": [
"reportgenerator"
],
"rollForward": false
},
"dotnet-stryker": {
"version": "4.15.0",
"commands": [
"dotnet-stryker"
],
"rollForward": false
}
}
}
14 changes: 13 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,11 @@ csharp_preferred_modifier_order = public,private,protected,internal,static,exter
# Code-block preferences
csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = block_scoped:silent
# House style: file-scoped namespaces are preferred going forward. Kept at :suggestion (not
# :warning) because the existing codebase is block-scoped throughout; the conversion is a
# deliberate Stage 2 mechanical sweep (Phase M), not this pass. Escalating to :warning now would
# add ~61 new build warnings and break the CI warnings-as-errors gate.
csharp_style_namespace_declarations = file_scoped:suggestion

# Expression-level preferences
csharp_prefer_simple_default_expression = true:suggestion
Expand Down Expand Up @@ -264,3 +268,11 @@ dotnet_diagnostic.IDE0046.severity = none

# IDE0045: Convert to conditional expression
dotnet_diagnostic.IDE0045.severity = none

# CA1707 ("identifiers should not contain underscores") is disabled for the test project only
# (see the [src/Dax.Template.Tests/**.cs] section below). The 105 hits there are the idiomatic xUnit
# `Method_Scenario_Expected` naming convention (intentional, not debt). In src/Dax.Template production
# code CA1707 is fully clean: the Stage 2 public-API rename sweep (2.10b) eliminated all 18 hits and
# CA1707 was removed from the WarningsNotAsErrors allowlist. CA1707 is NOT disabled repo-wide.
[src/Dax.Template.Tests/**.cs]
dotnet_diagnostic.CA1707.severity = none
50 changes: 47 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,57 @@ jobs:
- uses: actions/setup-dotnet@v4
with:
dotnet-version: |
6.0.x
10.0.x
global-json-file: global.json
- name: restore
run: dotnet restore ./src
- name: restore dotnet tools
run: dotnet tool restore
- name: build
run: dotnet build ./src/Dax.Template.sln --configuration Release --no-restore
# Phase M / Stage 1 step 1C: CI-only warnings-as-errors. TreatWarningsAsErrors is passed
# here (not in Directory.Build.props) so local dev builds stay lenient. The matching
# WarningsNotAsErrors allowlist (Stage-2 deferred debt) lives in src/Directory.Build.props
# so both this pipeline and .azure/pipelines/ci.yml share one source of truth.
run: dotnet build ./src/Dax.Template.sln --configuration Release --no-restore -p:TreatWarningsAsErrors=true
- name: format check
# Verifies the dotnet-format baseline (clean as of Stage 1B) doesn't drift. Runs against
# the same solution as the build step; --no-restore reuses the restore above.
run: dotnet format ./src/Dax.Template.sln --verify-no-changes --no-restore
- name: test
run: dotnet test ./src/Dax.Template.Tests/Dax.Template.Tests.csproj --configuration Release --no-build --verbosity normal
run: dotnet test ./src/Dax.Template.Tests/Dax.Template.Tests.csproj --configuration Release --no-build --verbosity normal --collect:"XPlat Code Coverage" --settings ./src/Dax.Template.Tests/coverlet.runsettings --results-directory ./artifacts/coverage
- name: coverage report
shell: pwsh
run: |
dotnet tool run reportgenerator "-reports:./artifacts/coverage/*/coverage.cobertura.xml" "-targetdir:./artifacts/coverage/report" "-reporttypes:Cobertura;TextSummary;MarkdownSummaryGithub"
Get-Content ./artifacts/coverage/report/Summary.txt
if (Test-Path ./artifacts/coverage/report/SummaryGithub.md) {
Get-Content ./artifacts/coverage/report/SummaryGithub.md | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append -Encoding utf8
}
- name: coverage threshold gate (Dax.Template core library)
shell: pwsh
# Phase M / Stage 0 / P0-b (see .claude/SESSION_HANDOFF.md, locked decision #5): the CI-enforced
# target is 80% line coverage on Dax.Template only. This is now the enforced LOCKED TARGET, not
# an interim floor: a targeted Measures + Package characterization-test top-up (2026-07-02, 41
# new tests, offline suite grown from 88 to 129 passed + 1 skipped) raised the measured overall
# from 75.2% to 81.1%, clearing 80% with headroom. COVERAGE_LINE_THRESHOLD is set to 80 and the
# gate fails only if line coverage drops below it (a real regression), not as a step toward a
# still-pending target; see docs/design/coverage.md for the measured baseline, the per-subsystem
# breakdown, and the remaining per-subsystem (~90%) gaps.
env:
COVERAGE_LINE_THRESHOLD: "80"
run: |
[xml]$cobertura = Get-Content ./artifacts/coverage/report/Cobertura.xml
$linePct = [math]::Round([double]$cobertura.coverage.'line-rate' * 100, 1)
$thresholdPct = [double]$env:COVERAGE_LINE_THRESHOLD
Write-Host "Dax.Template line coverage: $linePct% (locked target / floor: $thresholdPct%)"
if ($linePct -lt $thresholdPct) {
Write-Error "Dax.Template line coverage $linePct% dropped below the locked target of $thresholdPct%."
exit 1
}
- name: upload coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report-${{ matrix.os-version }}
path: artifacts/coverage/report
- name: pack
run: dotnet pack ./src/Dax.Template/Dax.Template.csproj --configuration Release --no-build --no-restore --verbosity normal
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ project.lock.json
project.fragment.lock.json
artifacts/

# Stryker.NET mutation testing output
StrykerOutput/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

Expand Down Expand Up @@ -361,3 +364,6 @@ MigrationBackup/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# Serena Claude Plugin
.serena/
Loading
Loading