pbiplint 0.2.3 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/NOTICE CHANGED
@@ -2,6 +2,12 @@ pbiplint itself is licensed under the GNU Affero General Public License,
2
2
  version 3 or later; see LICENSE. The MIT license text below applies only
3
3
  to the third-party material described here, not to pbiplint.
4
4
 
5
+ One file of pbiplint's own is MIT-licensed instead: the skill for AI
6
+ assistants (packages/cli/skill/SKILL.md, skill/SKILL.md in the npm
7
+ package), which pbiplint skill prints and installs, so it can be
8
+ committed to any repository. Its license notice is at the end of the
9
+ file.
10
+
5
11
  pbiplint bundles rule definitions derived from BPARules.json in the
6
12
  microsoft/Analysis-Services repository (https://github.com/microsoft/Analysis-Services),
7
13
  which is licensed under the MIT License:
package/README.md CHANGED
@@ -4,8 +4,10 @@ Best-practice linter for Power BI projects. Point it at a PBIP folder, a `.pbip`
4
4
  `.SemanticModel` folder, a `.Report` folder, a `definition` folder, or one `.tmdl` file and get
5
5
  ranked findings with a link to a fix page for each rule, and, when the input has a report, a
6
6
  "Report at a glance" block that says what the report will do when someone opens it. Nothing is
7
- uploaded: it reads the files you name and writes to your terminal. Node 20.19 or later (or 22.12
8
- or later).
7
+ uploaded: it reads the files you name and writes to your terminal, and
8
+ [the pbiplint Privacy Promise](https://pbiplint.com/privacy/) says what that covers. Node 20.19 or a
9
+ later 20 release, or 22.12 or later. [The pbiplint CLI](https://pbiplint.com/cli/) page on the site has more:
10
+ where to get it, what it reads, and how to check that it sends nothing.
9
11
 
10
12
  ```bash
11
13
  npx pbiplint path/to/Model.SemanticModel
@@ -13,15 +15,48 @@ npx pbiplint --sample # a bundled project,
13
15
  npx pbiplint path/to/model --format sarif --output pbiplint.sarif
14
16
  npx pbiplint path/to/model --format markdown
15
17
  npx pbiplint rules # every rule with status and severity
18
+ npx pbiplint explain HIDE_FOREIGN_KEYS # one rule's guidance, offline (--format json too)
19
+ npx pbiplint path/to/model --quiet # the counts, one line per rule
20
+ npx pbiplint path/to/model --rule HIDE_FOREIGN_KEYS # one rule's findings (repeatable)
21
+ npx pbiplint skill --install claude # the skill for AI assistants (--install copilot, codex, gemini; --show)
22
+ npx pbiplint mcp # a local MCP server for an AI assistant to start
16
23
  npx pbiplint --help # every option, in one screen
17
24
  npx pbiplint --version
18
25
  ```
19
26
 
27
+ An AI assistant that edits a project can keep its context small: `--quiet` for the counts, one line
28
+ per rule; `--rule <RULE_ID>`, repeatable, for those rules' findings (every rule still runs, the
29
+ summary says how many are shown of how many, and `--fail-on` counts only those); and
30
+ `pbiplint explain <RULE_ID>` for the rule's guidance, from this version, with no network. When there
31
+ are findings, the quiet output's last line names the other two.
32
+
33
+ `pbiplint skill` prints a skill, in the [Agent Skills](https://agentskills.io/home) format, that tells
34
+ a coding assistant how to use pbiplint. `--install claude`, `copilot`, `codex`, or `gemini` writes it
35
+ where that assistant reads a project's skills, below the current folder; it never replaces a copy
36
+ that differs unless given `--force`, and `--dry-run` writes nothing. `--show` lists where it is and
37
+ whether each copy matches this version.
38
+
39
+ `pbiplint mcp` is a local MCP server over stdin and stdout, for an assistant that runs local
40
+ servers (Claude Desktop, Claude Code, VS Code, Cursor) to start. Its three tools only read: `lint`
41
+ (what `--format json` prints, or with `quiet` the short summary), `explain_rule`, and `list_rules`.
42
+ It opens no port. See [the CLI page](https://pbiplint.com/cli/#mcp) for each app's setup.
43
+
20
44
  Formats: `text` (default), `json`, `sarif` (for GitHub code scanning and editors), `markdown`.
45
+ The Markdown export writes an email address, an `@name`, a `#123` or `GH-123`, and text
46
+ holding two or more `$` as code, so pasted into a GitHub issue or comment it links no one,
47
+ notifies no one, and renders no math.
21
48
 
22
- Exit codes: `0` no findings at or above `--fail-on`, `1` findings, `2` usage or input error.
49
+ Exit codes: `0` no findings at or above `--fail-on`, `1` findings, `2` a usage error, an input it
50
+ cannot read, or nothing to lint. [What a script can rely on](https://pbiplint.com/cli/#contract)
51
+ states what stdout carries, every exit code, and the JSON documents' fields.
23
52
  `--fail-on error` is the default; `--fail-on warning` and `--fail-on info` tighten the gate;
24
- `--fail-on none` always exits 0.
53
+ `--fail-on none` exits 0 on any run that lints something. A run that can read nothing in the input,
54
+ such as a report saved as a single `report.json` (PBIR-Legacy) with no model beside it, exits `2`
55
+ and says why, rather than passing with no findings.
56
+
57
+ Pointed at a folder that is not a project but holds one in a folder below it, as a repository
58
+ often does, pbiplint lints that project and names it in a notice. A folder that holds several exits
59
+ `2` and lists them, each with the command that lints it.
25
60
 
26
61
  ## Configuration
27
62
 
@@ -70,8 +105,10 @@ community's published rule files, and are checked against Tabular Editor on the
70
105
  the Microsoft rules need statistics only a live model has; they are listed but not run. A column
71
106
  whose TMDL names no type, as Power BI Desktop saves most calculated columns, is left out of the
72
107
  thirteen ported rules that test a column's type, where Tabular Editor reads the type from the
73
- column's DAX. Each rule has a page at https://pbiplint.com/rules with what it checks, why, how to
74
- fix it, and quirks.
108
+ column's DAX. A TMDL line the parser cannot place gets a `PARSE_ISSUE` error on that line rather
109
+ than being dropped silently; that includes a declaration its object does not hold, such as a
110
+ misspelt `columm` under a table or a hierarchy's `level` that lost its tab. Each rule has a page at
111
+ https://pbiplint.com/rules with what it checks, why, how to fix it, and quirks.
75
112
 
76
113
  The report layer (PBIR) is read beside the model: a `.Report` folder alone is valid input, and with
77
114
  the model beside it the two are paired through `definition.pbir` and checked together. The report
@@ -90,4 +127,6 @@ https://github.com/pbiplint/pbiplint.
90
127
 
91
128
  Copyright (C) 2026 McKinley Consulting. GNU Affero General Public License, version 3 or later; see
92
129
  LICENSE. The vendored Microsoft ruleset and PBI Inspector rule metadata are MIT-licensed; see
93
- NOTICE. The name pbiplint and its logo are trademarks of McKinley Consulting.
130
+ NOTICE. The skill for AI assistants (`skill/SKILL.md`, which `pbiplint skill` prints and installs) is
131
+ MIT-licensed, so it can be committed to any repository; its notice is at the end of the file. The
132
+ name pbiplint and its logo are trademarks of McKinley Consulting.