Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
1de7437
docs: refine DAX performance reference
DAXNoobJustin Jun 3, 2026
bdec4e4
Feat(te-cli): add Tabular Editor CLI (te) skill and TE2-to-TE3 migrat…
data-goblin Jun 8, 2026
3f6ef07
Docs(te2-cli): note te-cli preview successor and downloads link
data-goblin Jun 8, 2026
a92a8e6
Clean: bump all plugin versions to v26.24
data-goblin Jun 8, 2026
463204f
Clean: bump semantic-models to v26.24 to align with release branch
data-goblin Jun 8, 2026
6014857
Feat(te-cli): replace with official skill, restructure into reference…
data-goblin Jun 8, 2026
318cdc9
Docs(te-cli): add Common operations section; fix relationship discove…
data-goblin Jun 8, 2026
eac1696
Docs(te-cli): CRITICAL note to always use --output-format json (avoid…
data-goblin Jun 8, 2026
e6375b0
Docs(te-cli): replace GitHub callout blocks with plain bold-led lines
data-goblin Jun 8, 2026
55b9dc9
Feat(te-cli): vendor-sync from upstream + local get-te-cli download r…
data-goblin Jun 8, 2026
04fdee4
Feat(useful-stuff): add release-age-bypass hook + non-personal settin…
data-goblin Jun 8, 2026
f2fdfce
Clean(useful-stuff): genericize sound-hook note (drop personal refere…
data-goblin Jun 8, 2026
200fa20
Feat(semantic-models): add consolidated semantic-model skill (modelin…
data-goblin Jun 9, 2026
ac9195b
Feat(pbi-desktop): connect-pbid raw Desktop Bridge (named-pipe JSON-R…
data-goblin Jun 9, 2026
ac2feaa
Feat(reports,pbip): researched additions across report skills; pbir-f…
data-goblin Jun 9, 2026
63269f3
Clean(semantic-models): remove review-semantic-model (superseded by s…
data-goblin Jun 9, 2026
eb77964
Docs(reports,pbip,semantic-models): purge stale dates/preview and sof…
data-goblin Jun 9, 2026
6c66090
Docs(pbi-desktop): connect-pbid Desktop Bridge wording to raw named-p…
data-goblin Jun 9, 2026
bf10eb0
Docs: add v26.24 release notes; README semantic-model (replaces revie…
data-goblin Jun 9, 2026
3cee521
Fix(pbip): PBIR validation hook matches nested and absolute .Report p…
data-goblin Jun 9, 2026
4b3a17b
Feat(pbip): PBIR hook validates page displayOption against the schema…
data-goblin Jun 9, 2026
e0963c2
docs: pbir-cli skill covers Desktop integration and local model queries
data-goblin Jun 10, 2026
1aa2db6
docs: connect-pbid covers bridge correlation, hot reload, and visual …
data-goblin Jun 10, 2026
188b2c6
fix: connect-pbid scripts produce working output and fail loudly
data-goblin Jun 10, 2026
6d070ef
fix: pbi-desktop hooks fire on script-file workflows and skip own scr…
data-goblin Jun 10, 2026
ddb506c
fix: repair K201 example metadata and pbir-format doc contradictions
data-goblin Jun 10, 2026
71fa691
docs: refresh reloads the definition but not theme resources
data-goblin Jun 10, 2026
d7dd007
Release(26.24): bump versions, release notes, README
data-goblin Jun 10, 2026
fa0031b
Merge origin/releases/26.24: combine parallel release prep
data-goblin Jun 10, 2026
db12243
Docs(readme): list the new te-cli skill in the tabular-editor table
data-goblin Jun 10, 2026
9d71942
Merge pull request #28 from DAXNoobJustin/refine-dax-perf-reference
data-goblin Jun 10, 2026
db7fbbd
Docs(release-notes): credit the dax reference refinement in v26.24
data-goblin Jun 10, 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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
},
"metadata": {
"description": "A marketplace for skills and tools for agentic Power BI development.",
"version": "26.20"
"version": "26.24"
},
"plugins": [
{
Expand Down
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</p>

<p align="center">
<img src="https://img.shields.io/badge/version-26.20-blue" alt="Version">
<img src="https://img.shields.io/badge/version-26.24-blue" alt="Version">
<img src="https://img.shields.io/badge/Power_BI-F2C811?logo=powerbi&logoColor=000" alt="Power BI">
<img src="https://img.shields.io/badge/Microsoft_Fabric-008272" alt="Microsoft Fabric">
<img src="https://img.shields.io/badge/Tabular_Editor-2E7D32" alt="Tabular Editor">
Expand Down Expand Up @@ -156,6 +156,7 @@ Hook checks can be individually toggled via config files. Set any check to `fals
|------|------|-------------|
| Skill | [`bpa-rules`](plugins/tabular-editor/skills/bpa-rules/) | Create and improve Best Practice Analyzer rules for models |
| Skill | [`c-sharp-scripting`](plugins/tabular-editor/skills/c-sharp-scripting/) | C# scripting and macros for TE |
| Skill | [`te-cli`](plugins/tabular-editor/skills/te-cli/) | Cross-platform Tabular Editor CLI (`te`, preview) for semantic models from the terminal |
| Skill | [`te2-cli`](plugins/tabular-editor/skills/te2-cli/) | Tabular Editor 2 CLI usage and automation (not TE3) |
| Skill | [`te-docs`](plugins/tabular-editor/skills/te-docs/) | Tabular Editor documentation search, TE3 config files. Uses [`pbi-search`](https://github.com/data-goblin/pbi-search) CLI |
| Command | [`/suggest-rule`](plugins/tabular-editor/commands/suggest-rule.md) | Generate BPA rules from descriptions |
Expand All @@ -168,7 +169,7 @@ Hook checks can be individually toggled via config files. Set any check to `fals

| Type | Name | Description |
|------|------|-------------|
| Skill | [`connect-pbid`](plugins/pbi-desktop/skills/connect-pbid/) | Explore, query, and modify a model in Power BI Desktop |
| Skill | [`connect-pbid`](plugins/pbi-desktop/skills/connect-pbid/) | Explore, query, and modify a model in Power BI Desktop, and reload/screenshot the report canvas via the Desktop Bridge |
| Agent | [`query-listener`](plugins/pbi-desktop/agents/query-listener.agent.md) | Capture DAX queries from Power BI Desktop visuals in real time |
| Hook | DAX reference validation | Validates table, column, and measure references against the connected model; suggests corrections |
| Hook | Measure metadata enforcement | Blocks adding measures without DisplayFolder, Description, and FormatString |
Expand Down Expand Up @@ -205,7 +206,7 @@ Hook checks can be individually toggled via config files. Set any check to `fals
| Skill | [`python-visuals`](plugins/reports/skills/python-visuals/) | Custom Python visuals in Power BI reports |
| Skill | [`svg-visuals`](plugins/reports/skills/svg-visuals/) | SVG visuals via DAX measures in Power BI reports |
| Skill | [`review-report`](plugins/reports/skills/review-report/) (WIP) | Review Power BI reports for usage metrics and best practices |
| Skill | [`pbir-cli`](plugins/reports/skills/pbir-cli/) | Programmatic report manipulation via the [`pbir` CLI](https://github.com/maxanatsko/pbir.tools) |
| Skill | [`pbir-cli`](plugins/reports/skills/pbir-cli/) | Programmatic report manipulation via the [`pbir` CLI](https://github.com/maxanatsko/pbir.tools), including live Power BI Desktop refresh and page screenshots |
| Agent | [`deneb-reviewer`](plugins/reports/agents/deneb-reviewer.agent.md) | Review Deneb visual specs for Vega/Vega-Lite syntax and conventions |
| Agent | [`svg-reviewer`](plugins/reports/agents/svg-reviewer.agent.md) | Review SVG DAX measures for syntax and design quality |
| Agent | [`r-reviewer`](plugins/reports/agents/r-reviewer.agent.md) | Review R visual scripts (ggplot2) for Power BI conventions |
Expand All @@ -218,9 +219,9 @@ Hook checks can be individually toggled via config files. Set any check to `fals

| Type | Name | Description |
|------|------|-------------|
| Skill | [`semantic-model`](plugins/semantic-models/skills/semantic-model/) | Design, build, refresh, and review semantic models through a `te`-first tool cascade |
| Skill | [`standardize-naming-conventions`](plugins/semantic-models/skills/standardize-naming-conventions/) | Audit and standardize naming conventions in semantic models |
| Skill | [`review-semantic-model`](plugins/semantic-models/skills/review-semantic-model/) (Very WIP) | Review semantic models for quality, performance, AI readiness, and best practices |
| Skill | [`refreshing-semantic-model`](plugins/semantic-models/skills/refreshing-semantic-model/) | Trigger or troubleshoot refreshes |
| Skill | [`refresh-semantic-model`](plugins/semantic-models/skills/refresh-semantic-model/) | Trigger or troubleshoot refreshes |
| Skill | [`lineage-analysis`](plugins/semantic-models/skills/lineage-analysis/) | Trace downstream reports from a semantic model across workspaces |
| Skill | [`power-query`](plugins/semantic-models/skills/power-query/) | Write M expressions, debug query folding, execute M locally or via Fabric API |
| Skill | [`dax`](plugins/semantic-models/skills/dax/) | Write, debug, and optimize DAX in semantic models. Contributed by [Justin Martin](https://daxnoob.blog) |
Expand Down
2 changes: 1 addition & 1 deletion plugins/fabric-admin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "fabric-admin",
"version": "26.20",
"version": "26.24",
"description": "Fabric and Power BI administration; tenant settings audits, governance, delegated overrides, and Entra security group investigation. Requires the fabric-cli plugin.",
"author": {
"name": "Kurt Buhler",
Expand Down
2 changes: 1 addition & 1 deletion plugins/fabric-admin/skills/audit-tenant-settings/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: audit-tenant-settings
version: 26.20
version: 26.24
description: Automatically invoke this skill whenever the user asks about Fabric tenant settings or Power BI tenant settings or auditing tenant settings. You can use this skill if the user mentions "Fabric administration".
---

Expand Down
2 changes: 1 addition & 1 deletion plugins/fabric-cli/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "fabric-cli",
"version": "26.20",
"version": "26.24",
"description": "Get this plugin to work with Fabric / Power BI service, by means of the fabric cli.",
"author": {
"name": "Kurt Buhler",
Expand Down
2 changes: 1 addition & 1 deletion plugins/fabric-cli/skills/fabric-cli/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: fabric-cli
version: 26.20
version: 26.24
description: Expert guidance for using the Fabric CLI (`fab`) to fully interact with Fabric workspaces, items, and configuration. Automatically invoke this skill whenever the user mentions "Fabric" or "Power BI Service" or a "Fabric/Power BI workspace".
---

Expand Down
2 changes: 1 addition & 1 deletion plugins/pbi-desktop/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "pbi-desktop",
"version": "26.20",
"version": "26.24",
"description": "Connect to Power BI Desktop's local Analysis Services instance via TOM and ADOMD.NET. No MCP server required.",
"author": {
"name": "Kurt Buhler",
Expand Down
14 changes: 7 additions & 7 deletions plugins/pbi-desktop/hooks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ PreToolUse and PostToolUse hooks that validate DAX references, enforce measure m

| Hook | Event | Trigger (`if`) | Scope |
|---|---|---|---|
| `validate-dax` | PreToolUse | `Bash(*tom_nuget*)` | DAX table/column/measure references in inline PowerShell commands |
| `validate-measure` | PreToolUse | `Bash(*Measures.Add*)` | Measure DisplayFolder, Description, FormatString when adding measures |
| `refresh-cache` | PostToolUse | `Bash(*AnalysisServices*)` | Auto-refresh model metadata cache on TOM connect or modification |
| `check-ri` | PostToolUse | `Bash(*model.SaveChanges*)` | Referential integrity; unmatched keys after relationship/column changes |
| `check-compat` | PostToolUse | `Bash(*AnalysisServices*)` | Compatibility level; lists features available by upgrading |
| `validate-dax` | PreToolUse | `Bash(*tom_nuget*)`, `Bash(* -File *.ps1*)` | DAX table/column/measure references in inline PowerShell commands and executed `.ps1` files |
| `validate-measure` | PreToolUse | `Bash(*Measures.Add*)`, `Bash(* -File *.ps1*)` | Measure DisplayFolder, Description, FormatString when adding measures |
| `refresh-cache` | PostToolUse | `Bash(* -File *.ps1*)` | Auto-refresh model metadata cache on TOM connect or modification |
| `check-ri` | PostToolUse | `Bash(*SaveChanges*)` | Referential integrity; unmatched keys after relationship/column changes |
| `check-compat` | PostToolUse | `Bash(* -File *.ps1*)` | Compatibility level; lists features available by upgrading |

## Checks

Expand Down Expand Up @@ -56,7 +56,7 @@ That disables every hook in this plugin without touching individual check toggle

## Known limitations

- `.ps1` file execution hides content from `if` filters; hooks only validate inline PowerShell commands
- `if` glob patterns match only the raw command line, not `.ps1` file contents; the scripts compensate by reading executed `.ps1` files internally (`resolve_command_text`), gated by the `Bash(* -File *.ps1*)` triggers
- `if` glob patterns are case-sensitive
- UNC path conversion assumes `/Users/<user>/` prefix (macOS Parallels)

Expand All @@ -65,5 +65,5 @@ That disables every hook in this plugin without touching individual check toggle
```bash
echo '{"tool_name":"Bash","tool_input":{"command":"EVALUATE '"'"'FakeTable'"'"'[Col]"}}' | \
CLAUDE_PROJECT_DIR="$(pwd)" CLAUDE_PLUGIN_ROOT="$(pwd)/plugins/pbi-desktop" \
bash plugins/pbi-desktop/hooks/run-pbi-hooks.sh validate-dax
bash plugins/pbi-desktop/hooks/pbi-hooks.sh validate-dax
```
56 changes: 45 additions & 11 deletions plugins/pbi-desktop/hooks/pbi-hooks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -83,17 +83,15 @@ extract_command() {
echo "$STDIN_BUF" | jq -r '.tool_input.command // empty' 2>/dev/null
}

resolve_command_text() {
# If the command is a -File <path>.ps1 invocation, read the .ps1 file contents.
# Otherwise return the command text as-is.
# Handles UNC paths (\\Mac\Home\...) from Parallels by converting to macOS paths.
extract_ps1_path() {
# Extracts the .ps1 path from a -File <path>.ps1 invocation.
# Outputs nothing if the command is not a -File invocation.
local cmd="$1"
local lower
lower="$(echo "$cmd" | tr '[:upper:]' '[:lower:]')"

if [[ "$lower" != *"-file"* ]]; then
echo "$cmd"
return
return 0
fi

# Extract everything after -File, strip quotes and whitespace
Expand All @@ -104,8 +102,32 @@ resolve_command_text() {
after_file=$(printf '%s' "$after_file" | sed 's/^["]*//;s/["]*$//;s/^\\"//;s/\\"$//')

# Trim to just the .ps1 path (stop at first .ps1)
printf '%s' "$after_file" | sed -n 's/\(.*\.ps1\).*/\1/p'
}

is_bundled_connect_pbid_script() {
# Returns 0 if the command runs a .ps1 bundled with the connect-pbid skill.
# These scripts are exempt from content validation: load-tmdl.ps1 calls
# .Measures.Add without metadata by design, and doc strings like
# 'SUM(Sales[Amount])' would otherwise trip the DAX reference checks.
local cmd="$1"
local ps1_path
ps1_path="$(extract_ps1_path "$cmd")"
[[ -n "$ps1_path" ]] || return 1
case "$ps1_path" in
*skills/connect-pbid/scripts*|*skills\\connect-pbid\\scripts*) return 0 ;;
esac
return 1
}

resolve_command_text() {
# If the command is a -File <path>.ps1 invocation, read the .ps1 file contents.
# Otherwise return the command text as-is.
# Handles UNC paths (\\Mac\Home\...) from Parallels by converting to macOS paths.
local cmd="$1"

local ps1_path
ps1_path=$(printf '%s' "$after_file" | sed -n 's/\(.*\.ps1\).*/\1/p')
ps1_path="$(extract_ps1_path "$cmd")"

if [[ -z "$ps1_path" ]]; then
echo "$cmd"
Expand Down Expand Up @@ -283,6 +305,9 @@ cmd_validate_dax() {
raw_command="$(extract_command)"
[[ -n "$raw_command" ]] || exit 0

# Plugin-bundled connect-pbid scripts are exempt from content validation
is_bundled_connect_pbid_script "$raw_command" && exit 0

local command_text
command_text="$(resolve_command_text "$raw_command")"

Expand Down Expand Up @@ -399,6 +424,9 @@ cmd_validate_measure() {
raw_command="$(extract_command)"
[[ -n "$raw_command" ]] || exit 0

# Plugin-bundled connect-pbid scripts are exempt from content validation
is_bundled_connect_pbid_script "$raw_command" && exit 0

local command_text
command_text="$(resolve_command_text "$raw_command")"

Expand Down Expand Up @@ -443,9 +471,12 @@ cmd_refresh_cache() {
tool_name="$(extract_tool_name)"
[[ "$tool_name" == "Bash" ]] || exit 0

local raw_command
raw_command="$(extract_command)"
[[ -n "$raw_command" ]] || exit 0

local command_text
command_text="$(extract_command)"
[[ -n "$command_text" ]] || exit 0
command_text="$(resolve_command_text "$raw_command")"

# Detect trigger
local is_connect=false is_modification=false
Expand Down Expand Up @@ -489,9 +520,12 @@ cmd_check_ri() {
tool_name="$(extract_tool_name)"
[[ "$tool_name" == "Bash" ]] || exit 0

local raw_command
raw_command="$(extract_command)"
[[ -n "$raw_command" ]] || exit 0

local command_text
command_text="$(extract_command)"
[[ -n "$command_text" ]] || exit 0
command_text="$(resolve_command_text "$raw_command")"

# Only run for relationship or column changes
local relevant=false
Expand Down
Loading
Loading