Skip to content

Instantly share code, notes, and snippets.

@thibaudcolas
Created March 9, 2026 15:47
Show Gist options
  • Select an option

  • Save thibaudcolas/9f33c84541934f6cea41642ba9d4193c to your computer and use it in GitHub Desktop.

Select an option

Save thibaudcolas/9f33c84541934f6cea41642ba9d4193c to your computer and use it in GitHub Desktop.
Skill session log - upgrading-stylelint, OpenCode Kimi K2.5, django-pattern-library

Upgrade Stylelint from 16 to 17 with torchbox config 5.0.0 and deps

Session ID: ses_32ccd5862ffeWW0rHHZp4sxZ95 Created: 3/9/2026, 3:23:58 PM Updated: 3/9/2026, 3:24:49 PM


User

Use the upgrading-stylelint skill to upgrade this project from Stylelint 16 to 17 including updating to the compatible stylelint-config-torchbox 5.0.0. Update dependencies and config as needed, update as much of the styles as you can if safe.


Assistant (Build · moonshotai/Kimi-K2.5 · 2.0s)

Thinking:

The user wants me to use the upgrading-stylelint skill to upgrade from Stylelint 16 to 17, and also update stylelint-config-torchbox to 5.0.0. Let me first load the skill to understand what steps I need to take.

Tool: skill

Input:

{
  "name": "upgrading-stylelint"
}

Output:

<skill_content name="upgrading-stylelint">
[… skill contents, cropped …]

Base directory for this skill: file://./.agents/skills/upgrading-stylelint
Relative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.
Note: file list is sampled.

<skill_files>

</skill_files>
</skill_content>

Assistant (Build · moonshotai/Kimi-K2.5 · 3.1s)

Thinking:

Now let me follow the methodology from the skill. First, I need to understand the current state of the project:

  1. Check current Node version
  2. Check current Stylelint version and related packages
  3. Check how to run linting
  4. Check the project's Stylelint config

Let me gather this information.

Tool: bash

Input:

{
  "command": "node --version",
  "description": "Check current Node version"
}

Output:

v24.3.0

Tool: bash

Input:

{
  "command": "npm info . devDependencies 2>/dev/null || cat package.json | grep -A 20 '\"devDependencies\"'",
  "description": "Check current devDependencies"
}

Output:

  "devDependencies": {
    "@babel/core": "^7.26.10",
    "@babel/preset-env": "^7.26.9",
    "babel-loader": "^10.0.0",
    "css-loader": "^7.1.2",
    "prettier": "^3.7.3",
    "sass": "^1.86.3",
    "sass-loader": "^16.0.5",
    "style-loader": "^4.0.0",
    "stylelint": "^16.26.1",
    "stylelint-config-torchbox": "^4.0.0",
    "webpack": "^5.99.2",
    "webpack-cli": "^6.0.1"
  },
  "dependencies": {
    "highlight.js": "^11.11.1"
  }
}

Tool: bash

Input:

{
  "command": "npm run 2>/dev/null | grep -i lint || echo \"No lint scripts found\"",
  "description": "Check available lint scripts"
}

Output:

  lint
    npm run lint:format && npm run lint:css
  lint:format
  lint:css
    stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'

Tool: glob

Input:

{
  "pattern": "*stylelint*"
}

Output:

./stylelint.config.js

Assistant (Build · moonshotai/Kimi-K2.5 · 1.4s)

Tool: webfetch

Input:

{
  "url": "https://raw.githubusercontent.com/stylelint/stylelint/refs/heads/main/CHANGELOG.md",
  "format": "text"
}

Output:

[… CHANGELOG contents manually truncated …]

...208258 bytes truncated...

The tool call succeeded but the output was truncated. Full output saved to: ~/.local/share/opencode/tool-output/tool_cd332bf650014B4JQt1nmd7k8t
Use the Task tool to have explore agent process this file with Grep and Read (with offset/limit). Do NOT read the full file yourself - delegate to save context.

Tool: read

Input:

{
  "filePath": "./stylelint.config.js"
}

Output:

<path>./stylelint.config.js</path>
<type>file</type>
<content>1: /** @type {import('stylelint').Config} */
2: export default {
3:     // See https://github.com/torchbox/stylelint-config-torchbox for rules.
4:     extends: 'stylelint-config-torchbox',
5: };

(End of file - total 5 lines)
</content>

Tool: bash

Input:

{
  "command": "cat package.json",
  "description": "Read full package.json"
}

Output:

{
  "name": "django-pattern-library",
  "version": "0.1.0",
  "private": true,
  "license": "BSD-3-Clause",
  "browserslist": [
    "> 1% and last 2 versions",
    "Firefox ESR",
    "ios_saf 14",
    "safari 14",
    "not ie 11",
    "not ie_mob 11",
    "not android 4.4.3-4.4.4",
    "not OperaMini all"
  ],
  "type": "module",
  "scripts": {
    "start": "webpack --mode development --watch",
    "build": "webpack --mode production",
    "lint": "npm run lint:format && npm run lint:css",
    "lint:format": "prettier --check '**/?(.)*.{md,css,scss,js,json,yaml,yml}'",
    "lint:css": "stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'",
    "format": "prettier --write '**/?(.)*.{md,css,scss,js,json,yaml,yml}'"
  },
  "devDependencies": {
    "@babel/core": "^7.26.10",
    "@babel/preset-env": "^7.26.9",
    "babel-loader": "^10.0.0",
    "css-loader": "^7.1.2",
    "prettier": "^3.7.3",
    "sass": "^1.86.3",
    "sass-loader": "^16.0.5",
    "style-loader": "^4.0.0",
    "stylelint": "^16.26.1",
    "stylelint-config-torchbox": "^4.0.0",
    "webpack": "^5.99.2",
    "webpack-cli": "^6.0.1"
  },
  "dependencies": {
    "highlight.js": "^11.11.1"
  }
}


Assistant (Build · moonshotai/Kimi-K2.5 · 2.3s)

Thinking:

Now I have a good understanding of the project. Let me also fetch the Stylelint 17 migration guide and check the stylelint-config-torchbox changelog for version 5.0.0.

Tool: webfetch

Input:

{
  "url": "https://raw.githubusercontent.com/stylelint/stylelint/refs/heads/main/docs/migration-guide/to-17.md",
  "format": "text"
}

Output:

[… Migration guide contents, manually truncated …]

Tool: webfetch

Input:

{
  "url": "https://www.npmjs.com/package/stylelint-config-torchbox",
  "format": "text"
}

Error:

Error: Request failed with status code: 403

Assistant (Build · moonshotai/Kimi-K2.5 · 2.3s)

Thinking:

Now I have a good understanding of the upgrade path. Let me check the stylelint-config-torchbox package for version compatibility:

Tool: bash

Input:

{
  "command": "npm view stylelint-config-torchbox versions --json | tail -20",
  "description": "Check available stylelint-config-torchbox versions"
}

Output:

[
  "0.1.0",
  "0.2.0",
  "0.3.0",
  "0.4.0",
  "0.5.0",
  "1.0.0",
  "1.1.0",
  "1.1.1",
  "2.0.0",
  "2.0.1",
  "2.0.2",
  "2.0.3",
  "3.0.0",
  "3.1.0",
  "4.0.0",
  "5.0.0"
]

Tool: bash

Input:

{
  "command": "npm view stylelint-config-torchbox@5.0.0 peerDependencies 2>/dev/null || echo \"No peerDependencies found\"",
  "description": "Check stylelint-config-torchbox 5.0.0 peer dependencies"
}

Output:

{ stylelint: '^17.0.0' }


Assistant (Build · moonshotai/Kimi-K2.5 · 4.3s)

Thinking:

Now I have all the information I need. Let me summarize the upgrade path:

Current state:

  • Node.js: v24.3.0 (meets requirement of >= 20.19.0)
  • Stylelint: 16.26.1
  • stylelint-config-torchbox: 4.0.0

Target state:

  • Stylelint: 17.4.0 (latest)
  • stylelint-config-torchbox: 5.0.0 (compatible with Stylelint 17)

Key changes in Stylelint 17:

  1. ESM only (already using ESM with "type": "module")
  2. Node.js >= 20.19.0 required (we have v24.3.0)
  3. Default fix mode changed to strict
  4. Various rule changes for CSS nesting
  5. Removed resolveNestedSelectors option from selector-class-pattern
  6. Removed checkContextFunctionalPseudoClasses option from selector-max-id
  7. Removed GitHub formatter
  8. Removed CommonJS Node.js API

The project is already using ESM and Node v24, so it should be compatible. Let me start the upgrade process.

Let me create a todo list and start the upgrade:

Tool: todowrite

Input:

{
  "todos": [
    {
      "content": "Create upgrade branch and baseline QA",
      "status": "in_progress",
      "priority": "high"
    },
    {
      "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Run linting and fix any new issues",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Verify QA checks pass",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Produce upgrade report",
      "status": "pending",
      "priority": "medium"
    }
  ]
}

Output:

[
  {
    "content": "Create upgrade branch and baseline QA",
    "status": "in_progress",
    "priority": "high"
  },
  {
    "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Run linting and fix any new issues",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Verify QA checks pass",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Produce upgrade report",
    "status": "pending",
    "priority": "medium"
  }
]

Assistant (Build · moonshotai/Kimi-K2.5 · 3.3s)

Thinking:

Now let me create a branch and run the baseline QA checks. Let me check the current git status and run linting to establish a baseline.

Tool: bash

Input:

{
  "command": "git status",
  "description": "Check git status"
}

Output:

On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.agents/
	skills-lock.json
	tests/templates/patterns/atoms/sprites/sprites.yaml

nothing added to commit but untracked files present (use "git add" to track)

Tool: bash

Input:

{
  "command": "npm run lint:css 2>&1",
  "description": "Run baseline CSS linting"
}

Output:


> django-pattern-library@0.1.0 lint:css
> stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'



Assistant (Build · moonshotai/Kimi-K2.5 · 1.3s)

Thinking:

Good - the baseline linting passes with no errors. Now let me create a branch and upgrade the dependencies.

Tool: bash

Input:

{
  "command": "git checkout -b upgrade-stylelint-17",
  "description": "Create upgrade branch"
}

Output:

Switched to a new branch 'upgrade-stylelint-17'


Assistant (Build · moonshotai/Kimi-K2.5 · 2.1s)

Tool: todowrite

Input:

{
  "todos": [
    {
      "content": "Create upgrade branch and baseline QA",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
      "status": "in_progress",
      "priority": "high"
    },
    {
      "content": "Run linting and fix any new issues",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Verify QA checks pass",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Produce upgrade report",
      "status": "pending",
      "priority": "medium"
    }
  ]
}

Output:

[
  {
    "content": "Create upgrade branch and baseline QA",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
    "status": "in_progress",
    "priority": "high"
  },
  {
    "content": "Run linting and fix any new issues",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Verify QA checks pass",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Produce upgrade report",
    "status": "pending",
    "priority": "medium"
  }
]

Assistant (Build · moonshotai/Kimi-K2.5 · 4.6s)

Tool: bash

Input:

{
  "command": "npm install --save-dev stylelint@^17.0.0 stylelint-config-torchbox@^5.0.0 2>&1",
  "description": "Upgrade stylelint and config",
  "timeout": 120000
}

Output:


added 11 packages, removed 7 packages, changed 37 packages, and audited 379 packages in 3s

5 vulnerabilities (1 low, 1 moderate, 3 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.


Assistant (Build · moonshotai/Kimi-K2.5 · 2.2s)

Thinking:

Dependencies upgraded. Now let me run linting to check for any issues.

Tool: todowrite

Input:

{
  "todos": [
    {
      "content": "Create upgrade branch and baseline QA",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Run linting and fix any new issues",
      "status": "in_progress",
      "priority": "high"
    },
    {
      "content": "Verify QA checks pass",
      "status": "pending",
      "priority": "high"
    },
    {
      "content": "Produce upgrade report",
      "status": "pending",
      "priority": "medium"
    }
  ]
}

Output:

[
  {
    "content": "Create upgrade branch and baseline QA",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Run linting and fix any new issues",
    "status": "in_progress",
    "priority": "high"
  },
  {
    "content": "Verify QA checks pass",
    "status": "pending",
    "priority": "high"
  },
  {
    "content": "Produce upgrade report",
    "status": "pending",
    "priority": "medium"
  }
]

Assistant (Build · moonshotai/Kimi-K2.5 · 2.2s)

Tool: bash

Input:

{
  "command": "npm run lint:css 2>&1",
  "description": "Run CSS linting after upgrade"
}

Output:


> django-pattern-library@0.1.0 lint:css
> stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'


pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss
   5:1  ✖  Needless disable for "selector-class-pattern"                                                                               --report-needless-disables
  27:1  ✖  Expected ".hljs-built_in" to match pattern "/^[a-z]+(-[a-z0-9]+)*(__[a-z0-9]+(-[a-z0-9]+)*)?(--[a-z0-9]+(-[a-z0-9]+)*)?$/"  scss/selector-class-pattern
  81:5  ✖  Expected ".hljs-built_in" to match pattern "/^[a-z]+(-[a-z0-9]+)*(__[a-z0-9]+(-[a-z0-9]+)*)?(--[a-z0-9]+(-[a-z0-9]+)*)?$/"  scss/selector-class-pattern

pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss
   5:1  ✖  Needless disable for "selector-class-pattern"                                                                               --report-needless-disables
  27:1  ✖  Expected ".hljs-built_in" to match pattern "/^[a-z]+(-[a-z0-9]+)*(__[a-z0-9]+(-[a-z0-9]+)*)?(--[a-z0-9]+(-[a-z0-9]+)*)?$/"  scss/selector-class-pattern
  81:5  ✖  Expected ".hljs-built_in" to match pattern "/^[a-z]+(-[a-z0-9]+)*(__[a-z0-9]+(-[a-z0-9]+)*)?(--[a-z0-9]+(-[a-z0-9]+)*)?$/"  scss/selector-class-pattern

✖ 6 problems (6 errors, 0 warnings)



Assistant (Build · moonshotai/Kimi-K2.5 · 2.9s)

Thinking:

The linting revealed 6 new errors in the hljs theme files. The issues are:

  1. Needless disable for "selector-class-pattern" - This is because the disable comment is no longer needed
  2. Two errors about .hljs-built_in not matching the BEM pattern

These are third-party hljs theme files that use non-BEM class naming (.hljs-built_in has an underscore which isn't valid BEM). The files already have stylelint-disable comments at the top, but one is needless and the pattern is now being enforced with scss/selector-class-pattern instead of the standard selector-class-pattern.

Let me read these files to understand the disable comments better and fix them.

Tool: read

Input:

{
  "filePath": "./pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss"
}

Output:

<path>./pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss</path>
<type>file</type>
<content>1: // a11y-dark theme
2: // Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
3: // @author: ericwbailey
4: 
5: // stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value
6: 
7: /* Comment */
8: .hljs-comment,
9: .hljs-quote {
10:     color: #d4d0ab;
11: }
12: 
13: /* Red */
14: .hljs-variable,
15: .hljs-template-variable,
16: .hljs-tag,
17: .hljs-name,
18: .hljs-selector-id,
19: .hljs-selector-class,
20: .hljs-regexp,
21: .hljs-deletion {
22:     color: #ffa07a;
23: }
24: 
25: /* Orange */
26: .hljs-number,
27: .hljs-built_in,
28: .hljs-builtin-name,
29: .hljs-literal,
30: .hljs-type,
31: .hljs-params,
32: .hljs-meta,
33: .hljs-link {
34:     color: #f5ab35;
35: }
36: 
37: /* Yellow */
38: .hljs-attribute {
39:     color: #ffd700;
40: }
41: 
42: /* Green */
43: .hljs-string,
44: .hljs-symbol,
45: .hljs-bullet,
46: .hljs-addition {
47:     color: #abe338;
48: }
49: 
50: /* Blue */
51: .hljs-title,
52: .hljs-section {
53:     color: #00e0e0;
54: }
55: 
56: /* Purple */
57: .hljs-keyword,
58: .hljs-selector-tag {
59:     color: #dcc6e0;
60: }
61: 
62: .hljs {
63:     display: block;
64:     overflow-x: auto;
65:     background: #2b2b2b;
66:     color: #f8f8f2;
67:     padding: 0.5em;
68: }
69: 
70: .hljs-emphasis {
71:     font-style: italic;
72: }
73: 
74: .hljs-strong {
75:     font-weight: bold;
76: }
77: 
78: @media screen and (-ms-high-contrast: active) {
79:     .hljs-addition,
80:     .hljs-attribute,
81:     .hljs-built_in,
82:     .hljs-builtin-name,
83:     .hljs-bullet,
84:     .hljs-comment,
85:     .hljs-link,
86:     .hljs-literal,
87:     .hljs-meta,
88:     .hljs-number,
89:     .hljs-params,
90:     .hljs-string,
91:     .hljs-symbol,
92:     .hljs-type,
93:     .hljs-quote {
94:         color: highlight;
95:     }
96: 
97:     .hljs-keyword,
98:     .hljs-selector-tag {
99:         font-weight: bold;
100:     }
101: }

(End of file - total 101 lines)
</content>

Tool: read

Input:

{
  "filePath": "./pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss"
}

Output:

<path>./pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss</path>
<type>file</type>
<content>1: // a11y-light theme
2: // Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
3: // @author: ericwbailey
4: 
5: // stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value
6: 
7: /* Comment */
8: .hljs-comment,
9: .hljs-quote {
10:     color: #696969;
11: }
12: 
13: /* Red */
14: .hljs-variable,
15: .hljs-template-variable,
16: .hljs-tag,
17: .hljs-name,
18: .hljs-selector-id,
19: .hljs-selector-class,
20: .hljs-regexp,
21: .hljs-deletion {
22:     color: #d91e18;
23: }
24: 
25: /* Orange */
26: .hljs-number,
27: .hljs-built_in,
28: .hljs-builtin-name,
29: .hljs-literal,
30: .hljs-type,
31: .hljs-params,
32: .hljs-meta,
33: .hljs-link {
34:     color: #aa5d00;
35: }
36: 
37: /* Yellow */
38: .hljs-attribute {
39:     color: #aa5d00;
40: }
41: 
42: /* Green */
43: .hljs-string,
44: .hljs-symbol,
45: .hljs-bullet,
46: .hljs-addition {
47:     color: #008000;
48: }
49: 
50: /* Blue */
51: .hljs-title,
52: .hljs-section {
53:     color: #007faa;
54: }
55: 
56: /* Purple */
57: .hljs-keyword,
58: .hljs-selector-tag {
59:     color: #7928a1;
60: }
61: 
62: .hljs {
63:     display: block;
64:     overflow-x: auto;
65:     background: #fefefe;
66:     color: #545454;
67:     padding: 0.5em;
68: }
69: 
70: .hljs-emphasis {
71:     font-style: italic;
72: }
73: 
74: .hljs-strong {
75:     font-weight: bold;
76: }
77: 
78: @media screen and (-ms-high-contrast: active) {
79:     .hljs-addition,
80:     .hljs-attribute,
81:     .hljs-built_in,
82:     .hljs-builtin-name,
83:     .hljs-bullet,
84:     .hljs-comment,
85:     .hljs-link,
86:     .hljs-literal,
87:     .hljs-meta,
88:     .hljs-number,
89:     .hljs-params,
90:     .hljs-string,
91:     .hljs-symbol,
92:     .hljs-type,
93:     .hljs-quote {
94:         color: highlight;
95:     }
96: 
97:     .hljs-keyword,
98:     .hljs-selector-tag {
99:         font-weight: bold;
100:     }
101: }

(End of file - total 101 lines)
</content>

Assistant (Build · moonshotai/Kimi-K2.5 · 4.7s)

Thinking:

The issues are:

  1. Needless disable for "selector-class-pattern" - The stylelint-disable comment on line 5 is now considered needless because the file has disabled the rule but the rule is now scss/selector-class-pattern not selector-class-pattern.

  2. .hljs-built_in doesn't match the pattern - The class .hljs-built_in contains an underscore which doesn't match the BEM-like pattern expected by the config.

The first issue is because the stylelint-disable comment references selector-class-pattern but the actual rule being applied is scss/selector-class-pattern (from the SCSS config). I need to update the disable comments to reference the correct rule name.

The second issue is that .hljs-built_in uses underscores which are not allowed by the selector pattern. This is third-party code from highlight.js themes, so we should either:

  • Keep the disable comments but fix the rule name
  • Or add the specific classes to ignore

Let me fix both files by updating the disable comments to use scss/selector-class-pattern instead of selector-class-pattern.

Tool: edit

Input:

{
  "filePath": "./pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss",
  "oldString": "// stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value",
  "newString": "// stylelint-disable scss/selector-class-pattern, scale-unlimited/declaration-strict-value"
}

Output:

Edit applied successfully.

Tool: edit

Input:

{
  "filePath": "./pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss",
  "oldString": "// stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value",
  "newString": "// stylelint-disable scss/selector-class-pattern, scale-unlimited/declaration-strict-value"
}

Output:

Edit applied successfully.

Assistant (Build · moonshotai/Kimi-K2.5 · 2.3s)

Thinking:

The issue is that the disable comment was using selector-class-pattern but the actual rule being triggered is scss/selector-class-pattern (from the SCSS plugin). This is because stylelint-config-torchbox uses the SCSS plugin. Let me verify by running linting again.

Tool: bash

Input:

{
  "command": "npm run lint:css 2>&1",
  "description": "Run CSS linting after fixes"
}

Output:


> django-pattern-library@0.1.0 lint:css
> stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'



Assistant (Build · moonshotai/Kimi-K2.5 · 2.2s)

Thinking:

Linting passes now. Let me verify all QA checks.

Tool: todowrite

Input:

{
  "todos": [
    {
      "content": "Create upgrade branch and baseline QA",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Run linting and fix any new issues",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Verify QA checks pass",
      "status": "in_progress",
      "priority": "high"
    },
    {
      "content": "Produce upgrade report",
      "status": "pending",
      "priority": "medium"
    }
  ]
}

Output:

[
  {
    "content": "Create upgrade branch and baseline QA",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Run linting and fix any new issues",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Verify QA checks pass",
    "status": "in_progress",
    "priority": "high"
  },
  {
    "content": "Produce upgrade report",
    "status": "pending",
    "priority": "medium"
  }
]

Assistant (Build · moonshotai/Kimi-K2.5 · 2.8s)

Tool: bash

Input:

{
  "command": "npm run lint 2>&1",
  "description": "Run full linting suite"
}

Output:


> django-pattern-library@0.1.0 lint
> npm run lint:format && npm run lint:css


> django-pattern-library@0.1.0 lint:format
> prettier --check '**/?(.)*.{md,css,scss,js,json,yaml,yml}'

Checking formatting...
All matched files use Prettier code style!

> django-pattern-library@0.1.0 lint:css
> stylelint --report-needless-disables --report-unscoped-disables 'pattern_library/static/pattern_library/src/scss/'



Assistant (Build · moonshotai/Kimi-K2.5 · 1.2s)

Thinking:

All QA checks pass. Let me now commit the changes and produce the upgrade report.

Tool: bash

Input:

{
  "command": "git diff package.json",
  "description": "Show package.json changes"
}

Output:

diff --git i/package.json w/package.json
index 794d92a..e64c96b 100644
--- i/package.json
+++ w/package.json
@@ -31,8 +31,8 @@
     "sass": "^1.86.3",
     "sass-loader": "^16.0.5",
     "style-loader": "^4.0.0",
-    "stylelint": "^16.26.1",
-    "stylelint-config-torchbox": "^4.0.0",
+    "stylelint": "^17.4.0",
+    "stylelint-config-torchbox": "^5.0.0",
     "webpack": "^5.99.2",
     "webpack-cli": "^6.0.1"
   },


Assistant (Build · moonshotai/Kimi-K2.5 · 1.0s)

Tool: bash

Input:

{
  "command": "git diff",
  "description": "Show all changes"
}

Output:

diff --git i/package-lock.json w/package-lock.json
index 02f1dc3..72b979a 100644
--- i/package-lock.json
+++ w/package-lock.json
@@ -20,8 +20,8 @@
         "sass": "^1.86.3",
         "sass-loader": "^16.0.5",
         "style-loader": "^4.0.0",
-        "stylelint": "^16.26.1",
-        "stylelint-config-torchbox": "^4.0.0",
+        "stylelint": "^17.4.0",
+        "stylelint-config-torchbox": "^5.0.0",
         "webpack": "^5.99.2",
         "webpack-cli": "^6.0.1"
       }
@@ -1449,33 +1449,57 @@
       }
     },
     "node_modules/@cacheable/memory": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.6.tgz",
-      "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==",
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz",
+      "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@cacheable/utils": "^2.3.2",
-        "@keyv/bigmap": "^1.3.0",
-        "hookified": "^1.13.0",
-        "keyv": "^5.5.4"
+        "@cacheable/utils": "^2.4.0",
+        "@keyv/bigmap": "^1.3.1",
+        "hookified": "^1.15.1",
+        "keyv": "^5.6.0"
       }
     },
     "node_modules/@cacheable/utils": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.2.tgz",
-      "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.4.0.tgz",
+      "integrity": "sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "hashery": "^1.2.0",
-        "keyv": "^5.5.4"
+        "hashery": "^1.5.0",
+        "keyv": "^5.6.0"
+      }
+    },
+    "node_modules/@csstools/css-calc": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz",
+      "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=20.19.0"
+      },
+      "peerDependencies": {
+        "@csstools/css-parser-algorithms": "^4.0.0",
+        "@csstools/css-tokenizer": "^4.0.0"
       }
     },
     "node_modules/@csstools/css-parser-algorithms": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
-      "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz",
+      "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==",
       "dev": true,
       "funding": [
         {
@@ -1489,16 +1513,16 @@
       ],
       "license": "MIT",
       "engines": {
-        "node": ">=18"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "@csstools/css-tokenizer": "^3.0.4"
+        "@csstools/css-tokenizer": "^4.0.0"
       }
     },
     "node_modules/@csstools/css-syntax-patches-for-csstree": {
-      "version": "1.0.20",
-      "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz",
-      "integrity": "sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz",
+      "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==",
       "dev": true,
       "funding": [
         {
@@ -1510,15 +1534,12 @@
           "url": "https://opencollective.com/csstools"
         }
       ],
-      "license": "MIT-0",
-      "engines": {
-        "node": ">=18"
-      }
+      "license": "MIT-0"
     },
     "node_modules/@csstools/css-tokenizer": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
-      "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz",
+      "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==",
       "dev": true,
       "funding": [
         {
@@ -1532,13 +1553,13 @@
       ],
       "license": "MIT",
       "engines": {
-        "node": ">=18"
+        "node": ">=20.19.0"
       }
     },
     "node_modules/@csstools/media-query-list-parser": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz",
-      "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz",
+      "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==",
       "dev": true,
       "funding": [
         {
@@ -1552,17 +1573,17 @@
       ],
       "license": "MIT",
       "engines": {
-        "node": ">=18"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "@csstools/css-parser-algorithms": "^3.0.5",
-        "@csstools/css-tokenizer": "^3.0.4"
+        "@csstools/css-parser-algorithms": "^4.0.0",
+        "@csstools/css-tokenizer": "^4.0.0"
       }
     },
-    "node_modules/@csstools/selector-specificity": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
-      "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+    "node_modules/@csstools/selector-resolve-nested": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz",
+      "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==",
       "dev": true,
       "funding": [
         {
@@ -1576,10 +1597,33 @@
       ],
       "license": "MIT-0",
       "engines": {
-        "node": ">=18"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "postcss-selector-parser": "^7.0.0"
+        "postcss-selector-parser": "^7.1.1"
+      }
+    },
+    "node_modules/@csstools/selector-specificity": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz",
+      "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/csstools"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/csstools"
+        }
+      ],
+      "license": "MIT-0",
+      "engines": {
+        "node": ">=20.19.0"
+      },
+      "peerDependencies": {
+        "postcss-selector-parser": "^7.1.1"
       }
     },
     "node_modules/@discoveryjs/json-ext": {
@@ -1591,17 +1635,6 @@
         "node": ">=14.17.0"
       }
     },
-    "node_modules/@dual-bundle/import-meta-resolve": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz",
-      "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==",
-      "dev": true,
-      "license": "MIT",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/JounQin"
-      }
-    },
     "node_modules/@jridgewell/gen-mapping": {
       "version": "0.3.8",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -1661,20 +1694,20 @@
       }
     },
     "node_modules/@keyv/bigmap": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz",
-      "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz",
+      "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "hashery": "^1.2.0",
-        "hookified": "^1.13.0"
+        "hashery": "^1.4.0",
+        "hookified": "^1.15.0"
       },
       "engines": {
         "node": ">= 18"
       },
       "peerDependencies": {
-        "keyv": "^5.5.4"
+        "keyv": "^5.6.0"
       }
     },
     "node_modules/@keyv/serialize": {
@@ -2018,6 +2051,19 @@
         "url": "https://opencollective.com/parcel"
       }
     },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+      "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@types/eslint": {
       "version": "9.6.1",
       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
@@ -2351,16 +2397,6 @@
       "dev": true,
       "license": "Python-2.0"
     },
-    "node_modules/array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -2426,13 +2462,6 @@
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
       }
     },
-    "node_modules/balanced-match": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
-      "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/braces": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
@@ -2484,17 +2513,17 @@
       "dev": true
     },
     "node_modules/cacheable": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.0.tgz",
-      "integrity": "sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.3.tgz",
+      "integrity": "sha512-iffYMX4zxKp54evOH27fm92hs+DeC1DhXmNVN8Tr94M/iZIV42dqTHSR2Ik4TOSPyOAwKr7Yu3rN9ALoLkbWyQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@cacheable/memory": "^2.0.6",
-        "@cacheable/utils": "^2.3.2",
-        "hookified": "^1.13.0",
-        "keyv": "^5.5.4",
-        "qified": "^0.5.2"
+        "@cacheable/memory": "^2.0.8",
+        "@cacheable/utils": "^2.4.0",
+        "hookified": "^1.15.0",
+        "keyv": "^5.6.0",
+        "qified": "^0.6.0"
       }
     },
     "node_modules/callsites": {
@@ -2665,13 +2694,13 @@
       }
     },
     "node_modules/css-functions-list": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
-      "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz",
+      "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=12 || >=16"
+        "node": ">=12"
       }
     },
     "node_modules/css-loader": {
@@ -2778,19 +2807,6 @@
         "node": ">=0.10"
       }
     },
-    "node_modules/dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-type": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/electron-to-chromium": {
       "version": "1.5.134",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz",
@@ -2974,9 +2990,9 @@
       }
     },
     "node_modules/fastq": {
-      "version": "1.19.1",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
-      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+      "version": "1.20.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+      "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -2984,13 +3000,13 @@
       }
     },
     "node_modules/file-entry-cache": {
-      "version": "11.1.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz",
-      "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==",
+      "version": "11.1.2",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.2.tgz",
+      "integrity": "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "flat-cache": "^6.1.19"
+        "flat-cache": "^6.1.20"
       }
     },
     "node_modules/fill-range": {
@@ -3031,21 +3047,21 @@
       }
     },
     "node_modules/flat-cache": {
-      "version": "6.1.19",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz",
-      "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==",
+      "version": "6.1.20",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.20.tgz",
+      "integrity": "sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "cacheable": "^2.2.0",
+        "cacheable": "^2.3.2",
         "flatted": "^3.3.3",
-        "hookified": "^1.13.0"
+        "hookified": "^1.15.0"
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
-      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz",
+      "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==",
       "dev": true,
       "license": "ISC"
     },
@@ -3067,6 +3083,19 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/get-east-asian-width": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+      "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/glob-parent": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -3137,36 +3166,26 @@
       }
     },
     "node_modules/globby": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+      "version": "16.1.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.1.tgz",
+      "integrity": "sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.2.9",
-        "ignore": "^5.2.0",
-        "merge2": "^1.4.1",
-        "slash": "^3.0.0"
+        "@sindresorhus/merge-streams": "^4.0.0",
+        "fast-glob": "^3.3.3",
+        "ignore": "^7.0.5",
+        "is-path-inside": "^4.0.0",
+        "slash": "^5.1.0",
+        "unicorn-magic": "^0.4.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=20"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/globby/node_modules/ignore": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
-      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
     "node_modules/globjoin": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
@@ -3190,13 +3209,13 @@
       }
     },
     "node_modules/hashery": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.3.0.tgz",
-      "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.0.tgz",
+      "integrity": "sha512-nhQ6ExaOIqti2FDWoEMWARUqIKyjr2VcZzXShrI+A3zpeiuPWzx6iPftt44LhP74E5sW36B75N6VHbvRtpvO6Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "hookified": "^1.13.0"
+        "hookified": "^1.14.0"
       },
       "engines": {
         "node": ">=20"
@@ -3223,20 +3242,20 @@
       }
     },
     "node_modules/hookified": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz",
-      "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==",
+      "version": "1.15.1",
+      "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
+      "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/html-tags": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
-      "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz",
+      "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=20.10"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -3316,6 +3335,17 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/import-meta-resolve": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+      "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
     "node_modules/imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -3404,6 +3434,19 @@
         "node": ">=0.12.0"
       }
     },
+    "node_modules/is-path-inside": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
+      "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -3501,9 +3544,9 @@
       }
     },
     "node_modules/keyv": {
-      "version": "5.5.4",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz",
-      "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==",
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz",
+      "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3580,9 +3623,9 @@
       }
     },
     "node_modules/mathml-tag-names": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
-      "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz",
+      "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==",
       "dev": true,
       "license": "MIT",
       "funding": {
@@ -3598,13 +3641,13 @@
       "license": "CC0-1.0"
     },
     "node_modules/meow": {
-      "version": "13.2.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
-      "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz",
+      "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=18"
+        "node": ">=20"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -3808,16 +3851,6 @@
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/picocolors": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4057,10 +4090,11 @@
       }
     },
     "node_modules/postcss-selector-parser": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
-      "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
+      "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -4102,13 +4136,13 @@
       }
     },
     "node_modules/qified": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz",
-      "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==",
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/qified/-/qified-0.6.0.tgz",
+      "integrity": "sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "hookified": "^1.13.0"
+        "hookified": "^1.14.0"
       },
       "engines": {
         "node": ">=20"
@@ -4498,13 +4532,16 @@
       }
     },
     "node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/slice-ansi": {
@@ -4598,9 +4635,9 @@
       }
     },
     "node_modules/stylelint": {
-      "version": "16.26.1",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz",
-      "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==",
+      "version": "17.4.0",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.4.0.tgz",
+      "integrity": "sha512-3kQ2/cHv3Zt8OBg+h2B8XCx9evEABQIrv4hh3uXahGz/ZEHrTR80zxBiK2NfXNaSoyBzxO1pjsz1Vhdzwn5XSw==",
       "dev": true,
       "funding": [
         {
@@ -4614,57 +4651,55 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@csstools/css-parser-algorithms": "^3.0.5",
-        "@csstools/css-syntax-patches-for-csstree": "^1.0.19",
-        "@csstools/css-tokenizer": "^3.0.4",
-        "@csstools/media-query-list-parser": "^4.0.3",
-        "@csstools/selector-specificity": "^5.0.0",
-        "@dual-bundle/import-meta-resolve": "^4.2.1",
-        "balanced-match": "^2.0.0",
+        "@csstools/css-calc": "^3.1.1",
+        "@csstools/css-parser-algorithms": "^4.0.0",
+        "@csstools/css-syntax-patches-for-csstree": "^1.0.27",
+        "@csstools/css-tokenizer": "^4.0.0",
+        "@csstools/media-query-list-parser": "^5.0.0",
+        "@csstools/selector-resolve-nested": "^4.0.0",
+        "@csstools/selector-specificity": "^6.0.0",
         "colord": "^2.9.3",
         "cosmiconfig": "^9.0.0",
-        "css-functions-list": "^3.2.3",
+        "css-functions-list": "^3.3.3",
         "css-tree": "^3.1.0",
         "debug": "^4.4.3",
         "fast-glob": "^3.3.3",
         "fastest-levenshtein": "^1.0.16",
-        "file-entry-cache": "^11.1.1",
+        "file-entry-cache": "^11.1.2",
         "global-modules": "^2.0.0",
-        "globby": "^11.1.0",
+        "globby": "^16.1.0",
         "globjoin": "^0.1.4",
-        "html-tags": "^3.3.1",
+        "html-tags": "^5.1.0",
         "ignore": "^7.0.5",
+        "import-meta-resolve": "^4.2.0",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
-        "known-css-properties": "^0.37.0",
-        "mathml-tag-names": "^2.1.3",
-        "meow": "^13.2.0",
+        "mathml-tag-names": "^4.0.0",
+        "meow": "^14.0.0",
         "micromatch": "^4.0.8",
         "normalize-path": "^3.0.0",
         "picocolors": "^1.1.1",
         "postcss": "^8.5.6",
-        "postcss-resolve-nested-selector": "^0.1.6",
         "postcss-safe-parser": "^7.0.1",
-        "postcss-selector-parser": "^7.1.0",
+        "postcss-selector-parser": "^7.1.1",
         "postcss-value-parser": "^4.2.0",
-        "resolve-from": "^5.0.0",
-        "string-width": "^4.2.3",
-        "supports-hyperlinks": "^3.2.0",
+        "string-width": "^8.1.1",
+        "supports-hyperlinks": "^4.4.0",
         "svg-tags": "^1.0.0",
         "table": "^6.9.0",
-        "write-file-atomic": "^5.0.1"
+        "write-file-atomic": "^7.0.0"
       },
       "bin": {
         "stylelint": "bin/stylelint.mjs"
       },
       "engines": {
-        "node": ">=18.12.0"
+        "node": ">=20.19.0"
       }
     },
     "node_modules/stylelint-config-recommended": {
-      "version": "17.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz",
-      "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==",
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz",
+      "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==",
       "dev": true,
       "funding": [
         {
@@ -4678,29 +4713,29 @@
       ],
       "license": "MIT",
       "engines": {
-        "node": ">=18.12.0"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "stylelint": "^16.23.0"
+        "stylelint": "^17.0.0"
       }
     },
     "node_modules/stylelint-config-recommended-scss": {
-      "version": "16.0.2",
-      "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.2.tgz",
-      "integrity": "sha512-aUTHhPPWCvFyWaxtckJlCPaXTDFsp4pKO8evXNCsW9OwsaUWyMd6jvcUhSmfGWPrTddvzNqK4rS/UuSLcbVGdQ==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.0.tgz",
+      "integrity": "sha512-VkVD9r7jfUT/dq3mA3/I1WXXk2U71rO5wvU2yIil9PW5o1g3UM7Xc82vHmuVJHV7Y8ok5K137fmW5u3HbhtTOA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "postcss-scss": "^4.0.9",
-        "stylelint-config-recommended": "^17.0.0",
-        "stylelint-scss": "^6.12.1"
+        "stylelint-config-recommended": "^18.0.0",
+        "stylelint-scss": "^7.0.0"
       },
       "engines": {
         "node": ">=20"
       },
       "peerDependencies": {
         "postcss": "^8.3.3",
-        "stylelint": "^16.24.0"
+        "stylelint": "^17.0.0"
       },
       "peerDependenciesMeta": {
         "postcss": {
@@ -4709,9 +4744,9 @@
       }
     },
     "node_modules/stylelint-config-standard": {
-      "version": "39.0.1",
-      "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz",
-      "integrity": "sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==",
+      "version": "40.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz",
+      "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==",
       "dev": true,
       "funding": [
         {
@@ -4725,31 +4760,31 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "stylelint-config-recommended": "^17.0.0"
+        "stylelint-config-recommended": "^18.0.0"
       },
       "engines": {
-        "node": ">=18.12.0"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "stylelint": "^16.23.0"
+        "stylelint": "^17.0.0"
       }
     },
     "node_modules/stylelint-config-standard-scss": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-16.0.0.tgz",
-      "integrity": "sha512-/FHECLUu+med/e6OaPFpprG86ShC4SYT7Tzb2PTVdDjJsehhFBOioSlWqYFqJxmGPIwO3AMBxNo+kY3dxrbczA==",
+      "version": "17.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-17.0.0.tgz",
+      "integrity": "sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "stylelint-config-recommended-scss": "^16.0.1",
-        "stylelint-config-standard": "^39.0.0"
+        "stylelint-config-recommended-scss": "^17.0.0",
+        "stylelint-config-standard": "^40.0.0"
       },
       "engines": {
         "node": ">=20"
       },
       "peerDependencies": {
         "postcss": "^8.3.3",
-        "stylelint": "^16.23.1"
+        "stylelint": "^17.0.0"
       },
       "peerDependenciesMeta": {
         "postcss": {
@@ -4758,71 +4793,71 @@
       }
     },
     "node_modules/stylelint-config-torchbox": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-torchbox/-/stylelint-config-torchbox-4.0.0.tgz",
-      "integrity": "sha512-2F5gCxtCWmw3lmf09s/I7Fz5ybJKY2U699qcaML8cWm5F+ME/GuM6rU8DZnravSDRgqVXi7+jFV3ubt7UA2ggw==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-torchbox/-/stylelint-config-torchbox-5.0.0.tgz",
+      "integrity": "sha512-+xb84riylAmTxLlKmlkA5Pa7oRaKOjQVhnqca6ygaMmsrW/h/nWOdsVSu0QnYiU5M7uGL1Owc+vgoZiAEclAGg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "stylelint-config-standard-scss": "^16.0.0",
-        "stylelint-declaration-strict-value": "^1.10.11",
-        "stylelint-order": "^7.0.0"
+        "stylelint-config-standard-scss": "^17.0.0",
+        "stylelint-declaration-strict-value": "^1.11.1",
+        "stylelint-order": "^7.0.1"
       },
       "peerDependencies": {
-        "stylelint": "^16.23.1"
+        "stylelint": "^17.0.0"
       }
     },
     "node_modules/stylelint-declaration-strict-value": {
-      "version": "1.10.11",
-      "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.10.11.tgz",
-      "integrity": "sha512-oVQvhZlFZAiDz9r2BPFZLtTGm1A2JVhdKObKAJoTjFfR4F/NpApC4bMBTxf4sZS76Na3njYKVOaAaKSZ4+FU+g==",
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/stylelint-declaration-strict-value/-/stylelint-declaration-strict-value-1.11.1.tgz",
+      "integrity": "sha512-DYihiMuKGk9AeCYp+c3PMy6Z+Qu6yb6wRLeXQJZVMdXV+QOqs7P+Xj6jt8RVTgFJfII+cEQaFI5uWu08WwlkOA==",
       "dev": true,
       "license": "MIT",
       "engines": {
-        "node": ">=18.12.0"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "stylelint": ">=7 <=16"
+        "stylelint": ">=16 <=17"
       }
     },
     "node_modules/stylelint-order": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz",
-      "integrity": "sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.1.tgz",
+      "integrity": "sha512-GWPei1zBVDDjxM+/BmcSCiOcHNd8rSqW6FUZtqQGlTRpD0Z5nSzspzWD8rtKif5KPdzUG68DApKEV/y/I9VbTw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "postcss": "^8.5.3",
+        "postcss": "^8.5.6",
         "postcss-sorting": "^9.1.0"
       },
       "engines": {
         "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "stylelint": "^16.18.0"
+        "stylelint": "^16.18.0 || ^17.0.0"
       }
     },
     "node_modules/stylelint-scss": {
-      "version": "6.12.1",
-      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz",
-      "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-7.0.0.tgz",
+      "integrity": "sha512-H88kCC+6Vtzj76NsC8rv6x/LW8slBzIbyeSjsKVlS+4qaEJoDrcJR4L+8JdrR2ORdTscrBzYWiiT2jq6leYR1Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "css-tree": "^3.0.1",
         "is-plain-object": "^5.0.0",
-        "known-css-properties": "^0.36.0",
-        "mdn-data": "^2.21.0",
+        "known-css-properties": "^0.37.0",
+        "mdn-data": "^2.25.0",
         "postcss-media-query-parser": "^0.2.3",
         "postcss-resolve-nested-selector": "^0.1.6",
-        "postcss-selector-parser": "^7.1.0",
+        "postcss-selector-parser": "^7.1.1",
         "postcss-value-parser": "^4.2.0"
       },
       "engines": {
-        "node": ">=18.12.0"
+        "node": ">=20.19.0"
       },
       "peerDependencies": {
-        "stylelint": "^16.0.2"
+        "stylelint": "^16.8.2 || ^17.0.0"
       }
     },
     "node_modules/stylelint-scss/node_modules/is-plain-object": {
@@ -4835,20 +4870,26 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/stylelint-scss/node_modules/known-css-properties": {
-      "version": "0.36.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz",
-      "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/stylelint-scss/node_modules/mdn-data": {
-      "version": "2.25.0",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.25.0.tgz",
-      "integrity": "sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw==",
+      "version": "2.27.1",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
+      "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
       "dev": true,
       "license": "CC0-1.0"
     },
+    "node_modules/stylelint/node_modules/ansi-regex": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+      "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
     "node_modules/stylelint/node_modules/is-plain-object": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -4859,6 +4900,39 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/stylelint/node_modules/string-width": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+      "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "get-east-asian-width": "^1.5.0",
+        "strip-ansi": "^7.1.2"
+      },
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/stylelint/node_modules/strip-ansi": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+      "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^6.2.2"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
     "node_modules/supports-color": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -4875,33 +4949,46 @@
       }
     },
     "node_modules/supports-hyperlinks": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz",
-      "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz",
+      "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
+        "has-flag": "^5.0.1",
+        "supports-color": "^10.2.2"
       },
       "engines": {
-        "node": ">=14.18"
+        "node": ">=20"
       },
       "funding": {
         "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1"
       }
     },
-    "node_modules/supports-hyperlinks/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+    "node_modules/supports-hyperlinks/node_modules/has-flag": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz",
+      "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==",
       "dev": true,
       "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/supports-hyperlinks/node_modules/supports-color": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+      "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
     "node_modules/supports-preserve-symlinks-flag": {
@@ -5058,6 +5145,19 @@
         "node": ">=4"
       }
     },
+    "node_modules/unicorn-magic": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz",
+      "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=20"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/update-browserslist-db": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -5249,17 +5349,16 @@
       "dev": true
     },
     "node_modules/write-file-atomic": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
-      "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz",
+      "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
-        "imurmurhash": "^0.1.4",
         "signal-exit": "^4.0.1"
       },
       "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+        "node": "^20.17.0 || >=22.9.0"
       }
     },
     "node_modules/yallist": {
diff --git i/package.json w/package.json
index 794d92a..e64c96b 100644
--- i/package.json
+++ w/package.json
@@ -31,8 +31,8 @@
     "sass": "^1.86.3",
     "sass-loader": "^16.0.5",
     "style-loader": "^4.0.0",
-    "stylelint": "^16.26.1",
-    "stylelint-config-torchbox": "^4.0.0",
+    "stylelint": "^17.4.0",
+    "stylelint-config-torchbox": "^5.0.0",
     "webpack": "^5.99.2",
     "webpack-cli": "^6.0.1"
   },
diff --git i/pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss w/pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss
index 20bf2f4..0242cb0 100644
--- i/pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss
+++ w/pattern_library/static/pattern_library/src/scss/hljs/_a11y-dark.scss
@@ -2,7 +2,7 @@
 // Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
 // @author: ericwbailey
 
-// stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value
+// stylelint-disable scss/selector-class-pattern, scale-unlimited/declaration-strict-value
 
 /* Comment */
 .hljs-comment,
diff --git i/pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss w/pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss
index 73616b9..d781942 100644
--- i/pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss
+++ w/pattern_library/static/pattern_library/src/scss/hljs/_a11y-light.scss
@@ -2,7 +2,7 @@
 // Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css
 // @author: ericwbailey
 
-// stylelint-disable selector-class-pattern, scale-unlimited/declaration-strict-value
+// stylelint-disable scss/selector-class-pattern, scale-unlimited/declaration-strict-value
 
 /* Comment */
 .hljs-comment,


Assistant (Build · moonshotai/Kimi-K2.5 · 3.1s)

Thinking:

The changes look good. Let me commit them.

Tool: todowrite

Input:

{
  "todos": [
    {
      "content": "Create upgrade branch and baseline QA",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Run linting and fix any new issues",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Verify QA checks pass",
      "status": "completed",
      "priority": "high"
    },
    {
      "content": "Produce upgrade report",
      "status": "completed",
      "priority": "medium"
    }
  ]
}

Output:

[
  {
    "content": "Create upgrade branch and baseline QA",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Upgrade dependencies (stylelint 17, stylelint-config-torchbox 5.0.0)",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Run linting and fix any new issues",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Verify QA checks pass",
    "status": "completed",
    "priority": "high"
  },
  {
    "content": "Produce upgrade report",
    "status": "completed",
    "priority": "medium"
  }
]

Assistant (Build · moonshotai/Kimi-K2.5 · 3.9s)

Thinking:

The upgrade is complete. Let me provide a summary report.

Upgrade Complete

Successfully upgraded from Stylelint 16 to 17 with stylelint-config-torchbox 5.0.0.

Changes Made

Dependencies:

  • stylelint: ^16.26.1 → ^17.4.0
  • stylelint-config-torchbox: ^4.0.0 → ^5.0.0

Stylesheet fixes:

  • Updated disable comments in hljs/_a11y-dark.scss and hljs/_a11y-light.scss to use scss/selector-class-pattern instead of selector-class-pattern (stylelint-scss 7.x rule rename)

Key Breaking Changes in Stylelint 17

  • Node.js requirement: Now requires Node.js ≥20.19.0 (you have v24.3.0)
  • ESM only: CommonJS API removed (your config already uses ESM)
  • Fix mode: Default changed to strict (use --fix=lax for previous behavior)
  • CSS nesting: Rules now follow standard CSS nesting spec
  • Removed: GitHub formatter, resolveNestedSelectors option, checkContextFunctionalPseudoClasses option

Verification

All QA checks pass:

  • npm run lint:format
  • npm run lint:css
  • No deprecation warnings

Branch: upgrade-stylelint-17 is ready for review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment