Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.6.3 - 2026-07-08
Fixed
UnusedCustomPropertiesRuleno longer flags properties bound by binding types without dedicated model nodes (query, expr-struct, http, tag-history). Binding-owner crediting previously ran only from the modeled binding visitors (expression, property, tag), so a property populated by e.g. a query binding was reported as "never referenced" — and would have been deleted by the new auto-fix. Owners are now credited by scanning flattened-JSON keys, covering every binding shape at both view and component level. As a backstop, the fixer withholds any fix whosepropConfigentry still contains abindingkey.UnusedCustomPropertiesRulenow detects (and--fixdeletes) object-valued custom properties, including empty ones. Previously an empty dict/array custom property ("custom": {"key_1": {}}) vanished during JSON flattening and was invisible to the whole pipeline, and a populated object custom only surfaced as its nested children — so the top-level property was never flagged or removed, at both view and component level. Flattening now preserves empty containers as{}/[]leaves, and the rule registers the top-level property from its nested leaves. When an object property's child is referenced or bound, the parent is still credited as used.UnusedCustomPropertiesRuleno longer flags component custom properties that are read through expressions itsself.*patterns could not see: navigation calls (self.getSibling('Btn').custom.data), variables holding a component (comp.custom.data), quoted subscripts (self.custom['data'], including non-identifier names likecustom['my prop']), and dynamic subscripts (self.custom[key], which conservatively credits every component custom). Each of these was a false positive that the new auto-fix would have turned into deletion of a live property.UnusedCustomPropertiesRuleno longer flags view parameters that are forwarded wholesale to an embedded view. A binding of{view.params}(expression) or a property binding on the pathview.paramspasses the entire params object to the next view, so every parameter in that scope is now credited as used — matching the existing whole-object handling of bareself.view.paramsin scripts. Same for{view.custom}/view.custom.
Added
UnusedCustomPropertiesRulenow supports auto-fix:--fixdeletes unused custom properties (the value entry plus every matchingpropConfigentry, including nested-children entries of object properties), for both view-level and component-level definitions. The rule emits only safe fixes — view parameters are never auto-deleted, not even under--fix-unsafe, because the callers that pass them (parent views, page config, navigation actions) are outside the analyzed file and removal cannot be verified; the same no-fix policy applies to properties carrying anonChangeproperty-change script. Backed by a newDELETE_KEYfix operation in the fix framework (FixOperation/FixEngine/PathTranslator.delete_value), which deletes dict keys only and refuses list elements to avoid index-shift hazards.
0.6.2 - 2026-07-07
Fixed
- The component-rename auto-fixer no longer silently breaks bindings it cannot see (#114). Its reference detection previously required two or more leading dots, so a component referenced only via single-dot
./Childor absolute/root/Container/Componentpaths was misclassified as safe to rename — plain--fixrenamed it and left every such binding dangling (hit in production: 9 broken bindings across 5 views). Detection and rewriting now share one reference-grammar parser with the validation rules, covering./,../,.../, and/root/...forms in expressions, property-binding paths, and expression-struct values. - Rename reference rewriting no longer corrupts unrelated text (#115). Rewrites previously used a whole-value
str.replace()of the bare component name, which mangled overlapping sibling names (renamingdata labelrewrote part of{../data label 2...}, leaving a dangling reference), mutated display literals ('pump status: 'became'PumpStatus: '), and edited comments andsendMessage()payloads inside scripts. Operations now replace the full reference text only — scripts are tokenized so realgetSibling/getChildcalls are distinguished from the same text in comments or unrelated string literals — and fix-conflict detection is operation-aware, so two components referenced in one expression both rename cleanly. - The rename fixer no longer creates duplicate sibling names (#116). A suggestion that collides with an existing sibling (e.g.
My Button→MyButtonbeside an existingMyButton), or with another pending rename converging on the same name, is skipped and the violation message says why (suggestion 'MyButton' already in use by a sibling; rename manually). Previously plain--fixproduced two identically-named siblings — invalid in the Designer and ambiguous for references. ComponentReferenceValidationRulenow validates absolute/root/...references in expressions, property bindings, and expression-struct bindings (#114). Previously these were silently skipped, so a broken absolute reference was never reported.ComponentReferenceValidationRuleno longer false-positives on view-scoped navigation chains. On a view property/paramonChangeor view event script,selfis the view, soself.getChild("root")validly resolves to the root container — the rule previously flaggedComponent 'root' not found as childon every such chain, and mis-attributed genuinely broken chains to the first link instead of the actually missing one. Scope is inferred from the flattened-JSON location (top-levelpropConfig.*/events.*keys), the same inferenceUnusedCustomPropertiesRuleuses; view-scopedgetSibling/self.parentchains are skipped rather than guessed at.- Defense in depth for renames: a component name found in a context the fixer cannot safely rewrite (an untokenizable script, a
runScript()expression payload, or a navigation-call pattern in a non-script value) now blocks fix generation entirely instead of being renamed around — under both--fixand--fix-unsafe.
Added
common/reference_parser.py— single shared owner of Ignition's component-reference grammar (relative/absolute binding paths, brace-wrapped expression references, tokenize-based script navigation calls), consumed by both the validation rules and the rename fixer so the two can no longer drift apart.tests/cases/ExtensionFunctions— real Designer export of an Alarm Status Table with populatedfilterAlarm/filterShelvedAlarmextension functions, capturing the baseline for modeling them as first-class script nodes (#117).references/perspective-view-schema.unofficial.json— Paul Griffith's unofficial Perspective view.json schema with provenance notes and a gap analysis against the current object model.
Changed
- Renamed the Docusaurus documentation source directory from
documentation/todocs/, updating the docs deploy workflow,docusaurus.config.ts, andCLAUDE.mdreferences accordingly. [dc216c9] - Added an explicit
.poetry/entry to the root.gitignoreto keep Poetry's project-local runtime state (auto-installed plugins, per-machine config) out of version control. [c3cc77d]
Removed
- Removed the legacy flat-file
docs/folder (PRD notes, standalone rule/tutorial guides, whitelist and troubleshooting docs) superseded by the Docusaurus documentation site. [2ef6a30] - Removed the orphaned
images/test-failure.pngasset that was no longer referenced. [ab94b9b]
0.6.1 - 2026-06-22
Changed
- The two complementary component-reference rules —
BadComponentReferenceRule("you are doing a bad practice": brittle traversal) andComponentReferenceValidationRule("something is broken": reference does not resolve) — now inspect the same expanded set of nodes so neither has a blind spot the other silently covers. A new sharedCOMPONENT_REFERENCE_NODESconstant defines that set: expression bindings, expression-struct bindings, property bindings, and all script types (message handler, custom method, transform, event handler, andonChangeproperty-change). PreviouslyBadComponentReferenceRuleonly visited scripts and plain expression bindings (it ignored property bindings and expression-struct bindings entirely),ComponentReferenceValidationRuleskipped expression-struct bindings, and neither rule actually scannedonChangeproperty-change scripts even though they were nominally in scope. [94def42][2bcc0d1][e2d470e]
Fixed
BadComponentReferenceRulenow flags brittle relative traversal (./Foo,../Bar) in property binding paths and expression-struct bindings, not just in scripts and plain expression bindings. A broken/brittle reference written as a property binding path previously sailed through this rule completely. [94def42]ComponentReferenceValidationRulenow validates single-dot relative references (./Child— the current-container "drill into a child" idiom) in both expressions and property bindings. Previously the rule required two or more leading dots, so a broken./MissingChildreference (common in pipe/coordinate-container bindings) resolved to nothing and was never reported. The rule also now validates references inside expression-struct bindings. [2bcc0d1]- Both reference rules now actually scan
onChangeproperty-change scripts. The shared node set already targeted them, but neither rule implemented the visitor, so a brittle or brokengetSibling/getChild/relative reference inside anonChangescript was silently skipped. [e2d470e]
0.6.0 - 2026-06-05
Fixed
--filesno longer silently drops the first file when two or more paths are passed (e.g.--files A B C, exactly how pre-commit invoked the bundled hook).--filesis a single-value option, so argparse bound the first path to it and the rest to the variadic positionalfilenames;collect_filesthen treated the two sources as mutually exclusive (if filenames: ... elif files: ...) and discarded the path bound to--files. The two sources are now merged and de-duplicated, so every supplied file is linted.UnusedCustomPropertiesRuleno longer reports a false positive on a view-level custom property or parameter that is read via the bareself.custom.X/self.params.Xidiom from a view-scoped script. Scope is now inferred from the flattened-JSON location: scripts on the view's own custom properties/params (top-levelpropConfig.*) or the view's event handlers (top-levelevents.*) run withself== the view, so a bareself.custom.Xthere is credited toview.custom.X. Component-scoped scripts (anything underroot.*) keep the strict behavior — a bareself.custom.Xrefers to that component's own custom and does not credit a view-level property of the same name.
Changed
- The space-separated multi-file form after
--files(e.g.--files A B C) is deprecated. It is still linted, but ignition-lint now prints a deprecation warning pointing at the supported invocations: an explicit list as positional arguments, or a single comma-separated/glob value for--files. - The bundled pre-commit hook (
.pre-commit-hooks.yaml) no longer appends--files; it relies onpass_filenamesto pass staged files as positional arguments. The pre-commit, whitelist, and CLI docs are updated to document the two distinct file-selection modes (explicit positional list vs single--filesglob) and to stop recommending the deprecated--files-last pattern.
0.5.3 - 2026-06-04
Added
- Property-change (
onChange) scripts defined underpropConfig.<property>.onChange.script(view-level and component-level) are now modeled as first-classPropertyChangeScriptnodes. Previously they were not built into any script node, so script-oriented rules such asPylintScriptRulesilently skipped their bodies; those scripts are now linted and counted in model statistics. NewNodeType.PROPERTY_CHANGE_SCRIPTandproperty_change_scriptsmodel collection. (#99)
Fixed
--fix-unsafenow enables fix mode on its own instead of being a silent no-op unless--fixwas also passed. The three fix flags are now mutually exclusive choices:--fix(safe fixes only),--fix-unsafe(also rewrite references), and--fix-dry-run(preview). Help text for--fix-unsafeno longer says "use with --fix". (#93)- When fixes are applied, ignition-lint now re-evaluates the rules once on the fixed view and reports those post-fix results, instead of printing (and counting in the exit status) the pre-fix violations it just resolved. The re-evaluation collects no fixes and never re-applies, so there is no multi-pass fix loop;
--fix-dry-runmutates nothing and still reports the pre-fix state. (#94) UnusedCustomPropertiesRuleno longer reports a false positive on a parent object/container custom property (e.g.custom.network) when only its nested children (custom.network.nat1/nat2) are bound or referenced. A property is now credited as used when any descendant path is bound or referenced. Reference detection is also made location-independent — references in scripts that are not modeled as their own nodes (e.g. property-changeonChangescripts) are now detected the same as in transforms/event handlers — while preserving the component-vs-view namespace distinction (a bareself.custom.Xdoes not credit a view-level property; only a nestedself.custom.X.childdoes). [063379e]- Documentation site now publishes a working
llms.txt/llms-full.txtindex for LLM consumption. Links inllms.txtwere previously root-rooted (e.g./getting-started/installation.md) and 404'd under the/ignition-lint/GitHub Pages base path; they are now emitted as fully-qualified URLs via the plugin'srelativePaths: falseoption. The search page is also excluded from the index. [33d2524]
0.5.2 - 2026-06-02
Fixed
ViewModelBuildernow collects view-level custom and param properties that are defined only via apropConfigbinding (e.g. non-persistent bound props, or persistent props whose parent object in the custom tree is empty). Previously these properties were silently invisible to property-scoped rules;NamePatternRuleandUnusedCustomPropertiesRulenow see them. [ef24bf6][05b558c]
0.5.1 - 2026-05-12
Added
- Docusaurus 3 documentation site under
documentation/, published to GitHub Pages at https://bw-design-group.github.io/ignition-lint on push tomain. Covers tutorial, per-rule user guides, full per-rule technical references with per-option breakdowns, usage (CLI, pre-commit, GitHub Actions, whitelist, debug output), developer guide (architecture, creating rules, API reference, testing, troubleshooting), and a changelog mirror auto-copied from this file. [094f971] .github/workflows/deploy-docs.yml— builds the docs site and deploys to GitHub Pages on push tomain(path-filtered todocumentation/**andCHANGELOG.md) or viaworkflow_dispatch. [094f971]
Changed
- README rewritten as a 53-line landing page that hands off to the published docs (was a 1170-line monolithic doc that duplicated content now living in the docs site). [094f971]
[0.5.0] - 2026-05-10
Added
- Auto-fix for trailing whitespace (C0303) in PylintScriptRule via
--fixflag [d775d45] - PylintScriptRule now uses FixableMixin so the existing fix infrastructure discovers it automatically [d775d45]
- Unit tests covering the registry contract: every registered rule must instantiate from
{}, registration is idempotent, metadata is computed lazily [9342e8d] --verbosenow prints a per-rule breakdown showing each rule's source (config path or "defaults") plus disabled / errored rules [9342e8d]
Changed
- Opinionated by default: every registered rule now runs unless explicitly disabled. Previously the user's config acted as an allowlist (only listed rules ran); now the config is an override layer — rules absent from the config run with default kwargs, and
enabled: falseis the way to opt out. Configs that already list every rule (including the bundledrule_config.json) behave identically. Configs that listed only a subset of rules will start producing additional violations from the rules they previously omitted. [9342e8d] - Registry no longer instantiates rules at registration time. Validation is now static-only (
issubclass(LintingRule), haserror_message, hascreate_from_config); the empty-config smoke test moved to the test suite. [9342e8d] - Registering the same rule class under the same name is now a silent no-op. The misleading
"Skipped invalid rule … is already registered"warnings at startup are gone. [9342e8d] - Rule metadata (
error_message, source file, etc.) is computed lazily on firstget_rule_metadata()call instead of at registration time. [9342e8d] RULES_MAPis now a live read-only Mapping view backed by the registry, so test code that explicitly imports a private rule module (e.g.rules/_examples/…) sees that rule via the same lookup API. [9342e8d]rules/examples/renamed torules/_examples/. The_prefix excludes the directory from auto-discovery — example rules stay available for documentation and tests but are no longer registered or run by default. Test code that needs them imports the module directly. [9342e8d]- Gitignore jython cache directories [67e8ede]
- Each pre-commit batch invocation now reports its own honest totals; removed the terminal-summary override that aggregated escalating totals across batches (the
_AGGREGATED_SUMMARY.txtfile is still written when batch files exist) [dacf480]
Fixed
- Stale
_AGGREGATED_SUMMARY.txtfrom a previous run no longer pollutes a later passing run's reported totals; cleanup now removes stale summary files (≥5s old) and the aggregator no longer reads existing summaries on non-batch paths [dacf480] - Empty-but-valid config (
{}) no longer aborts with "No valid configuration found"; it now means "run every rule with defaults". [9342e8d]
0.4.1 - 2026-02-20
Changed
- Rename PyPI package from
ignition-linttoign-lint(CLI command is nowign-lint) [fef2808] - Switch PyPI publishing to OIDC trusted publisher (no API tokens needed) [47ce126]
- Split publish workflow into build and publish jobs with GitHub environment approval gates [47ce126]
- Trigger publish workflow from tag push; derive package version from git tag [d284d2d]
- Gate Test PyPI publishing on RC tags and Prod PyPI on stable tags [d284d2d]
- Use
pipx install poetryfor GitHub runner compatibility [7c71154]
0.4.0 - 2026-02-15
Added
- Auto-fix framework with
--fix,--fix-unsafe,--fix-dry-run, and--fix-rulesCLI flags [fd17cbf] - NamePatternRule generates auto-fix suggestions to rename components to match naming conventions [fd17cbf]
- Safety tiers: safe fixes (unreferenced renames) vs unsafe fixes (reference updates,
this.meta.namebindings) [fd17cbf] - FixableMixin for rules to opt into providing auto-fixes [fd17cbf]
Fixed
- Preserve Ignition unicode escapes (
\u0027,\u003c, etc.) when writing view.json files after fixes [3dc40cb]
0.3.6 - 2026-02-15
Added
- Whitelist feature for managing technical debt by ignoring specific views [dbe1363]
- CLI helper functions to generate whitelist from glob patterns [dbe1363]
- ComponentReferenceValidationRule to validate that component references resolve to actual components [057d0f2]
- BadComponentReference test case with property, expression, and script getChild references [eb08041]
- Mixed tabs/spaces detection with clear error messages [369173a]
- Tests for script indentation with comments [e85b26f]
- Implement feature for custom formatting output by rule and configured pylint category mapping[c7c1402]
- Support for BadComponentReferenceRule severity to be defined by user in rule config [ce39662]
Changed
- Optimize script error messages in non-batch mode of pylint rule [11a7683]
- ComponentReferenceValidationRule added to default rule_config.json [c63f540]
- Disabled duplicate-code check in pylint config for test files [88b68f5]
- Enforce yapf style file usage in all CLAUDE.md commands [7b5be3a]
Fixed
- Handle custom property references (.custom.) in ComponentReferenceValidationRule [dd10a0f]
- Skip comment lines when checking script indentation [b2788e7]
0.3.5 - 2026-02-13
Added
- Automatic aggregation of batch results with cleanup for pre-commit workflows [e59d6d1]
Fixed
- Resolve race conditions and file conflicts when running in parallel execution (e.g., pre-commit hooks) [82f6f21] [bbbda21]
- Add script indentation validation and smart auto-correction for view.json files [3e116b1]
- Improve debug file management with automatic cleanup and source file tracking [3e116b1]
0.3.4 - 2026-02-12
Fixed
- Handle view.params with bindings in UnusedCustomPropertiesRule [536319b]
0.3.3 - 2026-02-07
Fixed
- Upgrade Python to 3.13.1 and remove pre-commit version constraint [71ba2a5]
0.3.2 - 2026-02-06
Added
- Comprehensive tests for mixed naming patterns (PascalCase/SCREAMING_SNAKE_CASE) [b19a336]
Changed
- Simplify NamePatternRule pattern configuration from 'custom_pattern' to 'pattern' [27dc03f]
Fixed
- Add common Ignition event handlers to default pylintrc exemptions [16d8c30]
0.3.1 - 2026-02-05
Added
- A suggestion_convention parameter in NamePatternRule to support a default naming convention suggestion when using custom regex pattern [40641c1]
0.3.0 - 2026-02-03
Added
- Prep package to be available on PyPI - install with
pip install ignition-lint[02ad134] - Python 3.13 support [02ad134]
- PyPI metadata: keywords and classifiers for better package discoverability [02ad134]
- Automated release preparation workflow triggered by RC tags [41d9491]
- PyPI publishing workflow for automated package publishing [2430eb1]
- Comprehensive release process documentation in RELEASING.md [d189aa1]
- CLI
--versionflag to display package version [69310f9] - v0.3.0 implementation documentation [2ccb2b6]
Changed
- Moved
pre-commitfrom runtime dependencies to dev dependencies (cleaner installation) [02ad134] - Updated Python version constraint to
>=3.10,<3.14(was>=3.10,<3.13) [02ad134] - Optimized CI pipeline to run only on PRs with smart Python version matrix [bde11a4]
- Renamed ci.yml to ci-pipeline.yml for clarity [bde11a4]
- Updated CLAUDE.md with release process section [5d990bc]
- Moved bundled pylintrc from root to
src/ignition_lint/.config/.pylintrc[69310f9] - Updated author order to reflect primary contributor [9e16825]
Fixed
- NamePatternRule now correctly expects snake_case for custom methods (was incorrectly expecting camelCase) [56669ad]
- Bundled pylintrc now properly included in wheel package for pip installations [69310f9]
Removed
ignition-api-stubsdependency (not used at runtime, was blocking Python 3.13 support) [02ad134]- Redundant unittest.yml and integration-test.yml workflows that are covered by the ci-pipeline.yaml [bde11a4]
- Temporary v0.3.0 implementation guide (archived implementation notes kept) [436451d]
0.2.10 - 2026-01-29
Added
- NamePatternRule now skips props.aspectRatio properties to prevent false positives on coordinate containers [eabbb41]
0.2.9 - 2026-01-27
Added
- UnusedCustomPropertiesRule now detects self.params references in script transforms [5cf928d]
- Test coverage expanded for UnusedCustomPropertiesRule with 8 new test cases covering script transforms, tag bindings, message handlers, custom methods, property bindings, and expression patterns [5599aad]
Fixed
- UnusedCustomPropertiesRule now correctly recognizes view parameters used as self.params in script transforms, preventing false positives [5cf928d]
- Pattern matching in script reference detection now properly handles escaped regex patterns for .params. and .custom. patterns [5cf928d]
0.2.8 - 2026-01-26
Added
- BadComponentReferenceRule added to default rule_config.json to detect brittle component traversal patterns (.getSibling, .getParent, .getChild)
- NamePatternRule now validates message_handler nodes (kebab-case convention)
- NamePatternRule now validates custom_method nodes (snake_case convention)
Changed
- NamePatternRule no longer validates event_handler nodes as event handler names (onActionPerformed, onClick, etc.) are framework-defined by Ignition components
- rule_config.json updated with comprehensive naming conventions for all user-controllable node types:
- component: PascalCase (min 3 chars)
- property: camelCase (min 2 chars)
- message_handler: kebab-case (min 2 chars)
- custom_method: snake_case (min 2 chars)
- Add docker/.gitignore and remove tracked files matching ignore patterns [9ce499a]
0.2.7 - 2026-01-15
Security
- Updated Python requirement from >=3.9 to >=3.10 (Python 3.9 reached EOL October 2025)
- Updated filelock from 3.18.0 to 3.20.3 to fix CVE-2025-68146 (TOCTOU race condition vulnerabilities)
- Updated virtualenv from 20.31.2 to 20.36.1 to fix CVE-2026-22702 (TOCTOU vulnerabilities in directory creation)
- Added explicit
permissions: contents: readto all GitHub Actions workflows following principle of least privilege
Changed
- NamePatternRule now skips position properties (x, y coordinates) to prevent false positives on coordinate container properties [5e1b209]
- NamePatternRule now skips SVG path properties (d property in props.elements) to prevent false positives on SVG shape components [70b6329]
Fixed
- UnusedCustomPropertiesRule now properly resets state between files to prevent false positives [30a440b]
- Resolved Pylance type errors in unit test base classes and test files [64afcf9]
0.2.6 - 2026-01-09
Added
- Performance profiling with
--timing-outputand--results-outputflags [b66e88b] - Batch processing mode for PylintScriptRule to process all files together [95b81fa]
- ExcessiveContextDataRule to detect large arrays and excessive nesting in custom properties [9d76661]
- Four detection methods for excessive context data: array size, sibling properties, nesting depth, total data points [41e3c95]
- Detailed warnings and errors in results report output [3da2a29]
- Timestamp to timing reports for tracking report generation time [cc3eb3b]
- Auto-save debug files when PylintScriptRule finds errors [0ce3555]
- Configurable debug directory for PylintScriptRule via
debug_dirparameter [43fa11f] - File path header display at top of output before violations [ee1cb1f]
Changed
- Disabled batch mode by default for clearer per-file output [28ac26e]
--warnings-onlyflag replaced with--ignore-warningsfor clearer intent [e81c1c1]- Removed confusing "additional" wording from batch results output [20a8956]
- File path now shown once at top instead of repeated in each violation header [ee1cb1f]
Fixed
- Pre-commit compatibility and configuration simplification [942cc7f]
- CSS property detection now includes all style containers [8c2d21f]
- Deprecated stage names in pre-commit configuration [cdc1bc0]
- Duplicate model building in LintEngine [7f0c84b]
- Duplicate violation output in non-batch mode [52295bb]
- Duplicate warning statements in output [d667c78]
- Report styling improvements [f83ea8a]
- Strip array indices from script function names for valid Python [33271a6]
- Warn when specified pylintrc file is not found [c1b904f]
- Always show pylintrc resolution in debug mode [5936f59]
- Create parent directories for timing and results output files [bf1a9bd]
- Suppress pylint module name errors for temporary files with timestamps [cf7ba13]
- Rule name spacing in output [8ac97c1]
Performance
- Optimized
_is_property_persistentwith propConfig caching (30s → <1s for large files) [a618dda] - PylintScriptRule quick optimization wins [dbb00e5]
Documentation
- Added ExcessiveContextDataRule documentation [5ffa23d]
- Corrected pre-commit workflow documentation (incremental checks vs full scans) [795d9a1]
0.2.5 - 2026-01-09
Added
- Pre-push hooks for comprehensive validation (full pylint + full test suite)
- yapf format check to pre-commit stage
- Clear section comments distinguishing pre-commit vs pre-push hook stages
- Changelog skills for automated changelog management
- .lfsconfig to skip LFS downloads during pre-commit installation
Changed
- Reorganized pre-commit hooks into fast pre-commit stage (5-10s) and comprehensive pre-push stage (1-2min)
- Pre-commit pylint now only runs on changed files for faster feedback
- Migrated deprecated stage names (
commit→pre-commit,push→pre-push) - Updated PR template with breaking change section and type of change checklist
- Bundle .config/ directory with package for default pylintrc access
- Pylintrc resolution order now: rule_config.json → repo .config → package .config → pylint defaults
- Use Pythonic any() approach for CSS property detection
Fixed
- Pre-commit installation failing due to LFS 404 errors
- CSS property detection now includes all style containers (.textStyle., .elementStyle., .instanceStyle.)
- CSS properties (kebab-case) no longer incorrectly flagged as naming violations
- Deprecated stage name warnings in pre-commit configuration
Removed
- Redundant .ignition-lint-precommit.json file
- --pylintrc CLI argument (all configuration now via rule_config.json)
- Unnecessary target_node_types from rule_config.json (auto-derived)
0.2.4 - 2024-12-XX
Added
- Configurable pylintrc parameter for PylintScriptRule
- Improved output capture for pylint script linting
- Makefile for convenience commands
- Support for CSS properties in style and elementStyle properties
Fixed
- Model builder now properly handles arrays
- Event handler domain and event type extraction
- Transform script key now correctly uses "code"
- CSS property detection includes all style containers
- Pre-commit compatibility and configuration simplification
- View script linting issues
Changed
- Debug files regenerated with corrected event handler extraction
- Rule coverage target types now sorted alphabetically
Removed
- .DS_Store files from repository
0.2.3 - 2024-XX-XX
Changed
- Reworked name rule to not require node_types list in arguments
- Updated pre-commit configuration
0.2.2 - 2024-XX-XX
Fixed
- Severity levels on name patterns for different node types