fix(ci): quote stylelint globs — the shell was capping the linter at one directory level - #783
Merged
Merged
Conversation
…ix the 203 violations it exposed The stylelint scripts passed their globs UNQUOTED, so bash expanded them before stylelint ever saw them. Bash without `globstar` treats `**` as a single `*`, so `src/**/*.vue` expanded to `src/*/*.vue` — exactly one directory level. Measured on this tree: 48 files matched, out of 233 stylable files under src/. The npm stylelint job has therefore never looked deeper than one level and has always been green. Quoting the globs hands them to stylelint, which does its own recursive globbing. - before (quoted): 233 files linted, 203 violations (202 rule-empty-line-before + 1 no-duplicate-selectors) - after: 233 files linted, 0 violations, exit 0 The 202 rule-empty-line-before were fixed with stylelint's own --fix. The no-duplicate-selectors in CaseCard.vue was merged by hand: two .case-card__header blocks with no overlapping declarations, merged into one, keeping padding-left.
Contributor
Quality Report — ConductionNL/procest @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 552/552 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ✅ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-11 05:39 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect: the shell ate the glob
package.jsonpassed the stylelint globs unquoted:Unquoted, the shell expands the pattern before stylelint is executed — stylelint receives a finished list of file paths and never does any globbing of its own. And bash without
shopt -s globstar(npm scripts run under plainsh/bash, which does not set it) treats**as an ordinary*. Sosrc/**/*.vueexpands tosrc/*/*.vue: exactly one directory level belowsrc/.Measured on this tree:
src/**/*.vue …(unquoted, as shipped)'src/**/*.vue' …(quoted)There are 231
.vuefiles and 2.cssfiles undersrc/. The npmstylelintjob has therefore never looked below one directory level, and has been green for that reason — not because the styles were clean.Quoting the globs hands the pattern through to stylelint, which does its own recursive globbing and actually walks
src/.What changed
Quoting the glob without fixing what it finds would just turn CI red, so both halves are in this one branch:
stylelintandstylelint-fixscripts now single-quote their globs.rule-empty-line-before— fixed with stylelint's own--fix(26 files, blank-line insertions only).no-duplicate-selectors—src/views/workflow-board/CaseCard.vuehad two separate.case-card__headerblocks (lines 220 and 243). Fixed by hand: the two blocks declared no overlapping properties, so they were merged into one, keepingpadding-left: 26px(with a comment noting it reserves room for the absolutely-positioned.case-card__selectcheckbox). No declaration was dropped.Nothing was weakened to get green: no
.stylelintignore, nostylelint-disablecomments, no.stylelintrcrelaxation, no narrowed glob. The glob got wider.After
-f jsonreports 233 file entries (231.vue+ 2.css), 0 warnings — proving the wider scope really is being walked, not just passing quietly.Planted true positive
A green check that has never failed proves nothing, so the new glob was tested against a deliberate defect placed deeper than one directory level — somewhere the old glob could not physically reach.
Removed one blank line in
src/views/voorstellen/components/AuditTrail.vue(path depth 4; confirmed absent from the old glob's 48-file expansion). Then ran both commands against the identical working tree:New (quoted) glob — catches it:
Old (unquoted) glob — blind to it:
The plant was then reverted; the tree is clean and
exit 0restored.🤖 Generated with Claude Code