@kitschpatrol/shared-config 4.7.12 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/bin/cli.js +7142 -61
  2. package/license.txt +1 -1
  3. package/package.json +36 -33
  4. package/readme.md +231 -49
package/license.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023-2024 Eric Mika
3
+ Copyright (c) 2023-2025 Eric Mika
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/package.json CHANGED
@@ -1,65 +1,68 @@
1
1
  {
2
2
  "name": "@kitschpatrol/shared-config",
3
- "version": "4.7.12",
4
- "type": "module",
3
+ "version": "5.0.1",
5
4
  "description": "A collection of shared configurations for various linters and formatting tools. All managed as a single dependency, and invoked via a single command.",
5
+ "keywords": [
6
+ "shared-config",
7
+ "eslint-config",
8
+ "stylelint-config",
9
+ "prettier-config",
10
+ "remark-config",
11
+ "remark-lint",
12
+ "github-actions",
13
+ "cspell",
14
+ "mdat",
15
+ "cli",
16
+ "kpi"
17
+ ],
18
+ "bugs": "https://github.com/kitschpatrol/shared-config/issues",
6
19
  "repository": {
7
20
  "type": "git",
8
21
  "url": "git+https://github.com/kitschpatrol/shared-config/cli.git",
9
22
  "directory": "packages/shared-config"
10
23
  },
11
- "bugs": "https://github.com/kitschpatrol/shared-config/issues",
24
+ "license": "MIT",
12
25
  "author": {
13
26
  "name": "Eric Mika",
14
27
  "email": "eric@ericmika.com",
15
28
  "url": "https://ericmika.com"
16
29
  },
17
- "license": "MIT",
18
- "engines": {
19
- "node": ">=18.0.0",
20
- "pnpm": ">=8.0.0"
21
- },
30
+ "type": "module",
22
31
  "bin": {
23
- "shared-config": "bin/cli.js"
32
+ "kpi": "bin/cli.js"
24
33
  },
25
34
  "files": [
26
35
  "bin/*"
27
36
  ],
28
- "keywords": [
29
- "shared-config",
30
- "eslint-config",
31
- "stylelint-config",
32
- "prettier-config",
33
- "remark-config",
34
- "remark-lint",
35
- "github-actions",
36
- "cspell",
37
- "mdat",
38
- "cli"
39
- ],
40
37
  "dependencies": {
41
38
  "@pinojs/json-colorizer": "^4.0.0",
42
39
  "cosmiconfig": "^9.0.0",
43
- "execa": "^8.0.1",
44
- "fs-extra": "^11.2.0",
45
- "@kitschpatrol/mdat-config": "4.7.12",
46
- "@kitschpatrol/prettier-config": "4.7.12",
47
- "@kitschpatrol/cspell-config": "4.7.12",
48
- "@kitschpatrol/eslint-config": "4.7.12",
49
- "@kitschpatrol/stylelint-config": "4.7.12",
50
- "@kitschpatrol/repo-config": "4.7.12",
51
- "@kitschpatrol/remark-config": "4.7.12"
40
+ "execa": "^9.5.2",
41
+ "fs-extra": "^11.3.0",
42
+ "prettier": "^3.4.2",
43
+ "@kitschpatrol/cspell-config": "5.0.1",
44
+ "@kitschpatrol/eslint-config": "5.0.1",
45
+ "@kitschpatrol/mdat-config": "5.0.1",
46
+ "@kitschpatrol/prettier-config": "5.0.1",
47
+ "@kitschpatrol/knip-config": "5.0.1",
48
+ "@kitschpatrol/remark-config": "5.0.1",
49
+ "@kitschpatrol/stylelint-config": "5.0.1",
50
+ "@kitschpatrol/repo-config": "5.0.1",
51
+ "@kitschpatrol/typescript-config": "5.0.1"
52
52
  },
53
53
  "devDependencies": {
54
- "camelcase": "^8.0.0",
55
- "chalk": "^5.3.0",
54
+ "chalk": "^5.4.1",
56
55
  "globby": "^14.0.2"
57
56
  },
57
+ "engines": {
58
+ "node": ">=22.0.0",
59
+ "pnpm": ">=10.0.0"
60
+ },
58
61
  "publishConfig": {
59
62
  "access": "public"
60
63
  },
61
64
  "scripts": {
62
- "build": "./scripts/capability-generator.ts && ../../scripts/build.ts && pnpm mdat readme",
65
+ "build": "../../scripts/build.ts",
63
66
  "clean": "pnpm run bin-restore ; git clean -fdX",
64
67
  "cli": "node ./bin/cli.js"
65
68
  }
package/readme.md CHANGED
@@ -35,40 +35,87 @@
35
35
 
36
36
  ## Overview
37
37
 
38
- This project attempts to consolidate most of the configuration and tooling shared by my open-source and internal TypeScript / Node based projects into a single dependency.
38
+ This project attempts to consolidate most of the configuration and tooling shared by my open-source and internal TypeScript / Node based projects into a single dependency with a single CLI meta-command to lint and fix issues.
39
+
40
+ By installing `@kitschpatrol/shared-config` and then running `kpi`, you can run a half-dozen pre-configured code quality and linting tools in one shot. This spares you from cluttering your project's `devDependencies` with packages tangential to the task at hand.
41
+
42
+ If you don't plan to customize tool configurations, `@kitschpatrol/shared-config init` exposes an option to store references to each tool's shared configuration in your `package.json` instead of in files in your project root (at least where permitted by the tool). This can save a bit of file clutter in your project's root directory, at the expense of the immediate discoverability of the tools.
43
+
44
+ In addition, each tool exports a typed configuration factory function to simplify specifying and extending the default configuration.
45
+
46
+ The command name `kpi` might stand for "Kitschpatrol Project Inspector", or the more McKinseyan "Key Performance Indicators".
39
47
 
40
48
  ### Tools
41
49
 
42
- It takes care of dependencies and configurations for the following tools:
50
+ It takes care of dependencies, configuration, invocation, and reporting for the following tools:
43
51
 
44
- - [CSpell](https://cspell.org)
45
- - [ESLint](https://eslint.org) (including Svelte, Astro, and TypeScript support)
46
- - [mdat](https://github.com/kitschpatrol/mdat)
52
+ - [ESLint](https://eslint.org) (including Svelte, Astro, React, and TypeScript support — including type-checked rules)
47
53
  - [Prettier](https://prettier.io) (including a bunch of extra plugins)
48
- - [remarklint](https://github.com/remarkjs/remark-lint)
49
54
  - [Stylelint](https://stylelint.io)
55
+ - [TypeScript](https://www.typescriptlang.org/) (including a shared TSConfig)
56
+ - [CSpell](https://cspell.org) (bundled with a number of custom dictionaries, and a custom unused-word detector)
57
+ - [Case Police](https://github.com/antfu/case-police)
58
+ - [Knip](https://knip.dev/)
50
59
  - [VS Code](https://code.visualstudio.com) (extension recommendations and extension settings)
51
- - Minimal repo boilerplate (`.npmrc`, `.gitignore`, etc.)
60
+ - [Mdat](https://github.com/kitschpatrol/mdat) (my markdown templating and expansion tool)
61
+ - [remarklint](https://github.com/remarkjs/remark-lint)
62
+ - Basic repo boilerplate (`.npmrc`, `.gitignore`, etc.)
52
63
 
53
64
  ### Packages
54
65
 
55
- This readme is for the [`@kitschpatrol/shared-config`](https://www.npmjs.com/package/@kitschpatrol/shared-config) package, which depends on a number of tool-specific packages included in the [`kitschpatrol/shared-config`](https://github.com/kitschpatrol/shared-config) monorepo on GitHub, each of which is documented in its respective readme, linked below:
66
+ This particular readme is for the [`@kitschpatrol/shared-config`](https://www.npmjs.com/package/@kitschpatrol/shared-config) package, which depends on a number of tool-specific packages included in the [`kitschpatrol/shared-config`](https://github.com/kitschpatrol/shared-config) monorepo on GitHub, each of which is documented in additional detail its respective readme.
67
+
68
+ #### Primary package
69
+
70
+ - [`@kitschpatrol/shared-config`](/packages/shared-config/readme.md) (`kpi` command)
71
+
72
+ #### Sub-packages
73
+
74
+ - [`@kitschpatrol/cspell-config`](/packages/cspell-config/readme.md) (`kpi-cspell` command)
75
+ - [`@kitschpatrol/eslint-config`](/packages/eslint-config/readme.md) (`kpi-eslint` command)
76
+ - [`@kitschpatrol/knip-config`](/packages/knip-config/readme.md) (`kpi-knip` command)
77
+ - [`@kitschpatrol/mdat-config`](/packages/mdat-config/readme.md) (`kpi-mdat` command)
78
+ - [`@kitschpatrol/prettier-config`](/packages/prettier-config/readme.md) (`kpi-prettier` command)
79
+ - [`@kitschpatrol/remark-config`](/packages/remark-config/readme.md) (`kpi-remark` command)
80
+ - [`@kitschpatrol/repo-config`](/packages/repo-config/readme.md) (`kpi-repo` command)
81
+ - [`@kitschpatrol/stylelint-config`](/packages/stylelint-config/readme.md) (`kpi-stylelint` command)
82
+ - [`@kitschpatrol/typescript-config`](/packages/typescript-config/readme.md) (`kpi-typescript` command)
83
+
84
+ > [!IMPORTANT]
85
+ >
86
+ > Any of these packages may be installed and run on their own via CLI if desired. However, in general, the idea is to use `@kitschpatrol/shared-config` to easily run them all simultaneously over a repo with a single command with options to either check or (where possible) fix problems, with output aggregated into a single report.
56
87
 
57
- - [`@kitschpatrol/cspell-config`](/packages/cspell-config/readme.md)
58
- - [`@kitschpatrol/eslint-config`](/packages/eslint-config/readme.md)
59
- - [`@kitschpatrol/mdat-config`](/packages/mdat-config/readme.md)
60
- - [`@kitschpatrol/prettier-config`](/packages/prettier-config/readme.md)
61
- - [`@kitschpatrol/remark-config`](/packages/remark-config/readme.md)
62
- - [`@kitschpatrol/repo-config`](/packages/repo-config/readme.md)
63
- - [`@kitschpatrol/stylelint-config`](/packages/stylelint-config/readme.md)
88
+ Running `kpi <command>` calls the same command across the entire collection of sub-packages.
64
89
 
65
- Any of these may be installed and run on their own via CLI if desired. However, in general, the idea is to use `@kitschpatrol/shared-config` to easily run them all simultaneously over a repo with a single command with options to either check or (where possible) fix problems, with output aggregated into a single report.
90
+ So assuming you've installed `@kitschpatrol/shared-config`...
91
+
92
+ Running:
93
+
94
+ ```sh
95
+ kpi init
96
+ ```
97
+
98
+ Is the same as running:
99
+
100
+ ```sh
101
+ kpi-cspell init
102
+ kpi-eslint init
103
+ kpi-knip init
104
+ kpi-mdat init
105
+ kpi-prettier init
106
+ kpi-remark init
107
+ kpi-repo init
108
+ kpi-stylelint init
109
+ kpi-typescript init
110
+ ```
111
+
112
+ The top-level `kpi` command also takes care of some nuances in terms of _which_ sub-packages implement _which_ commands, and which subcommands take arguments.
66
113
 
67
114
  ## Getting started
68
115
 
69
116
  ### Dependencies
70
117
 
71
- Node 18+ and [pnpm](https://pnpm.io) are required. It probably works with NPM and yarn, but I haven't tested it.
118
+ Node 22+ and [pnpm](https://pnpm.io) 10+ are required. It might work with NPM and yarn, but I haven't tested it.
72
119
 
73
120
  ### Installation
74
121
 
@@ -77,15 +124,17 @@ Node 18+ and [pnpm](https://pnpm.io) are required. It probably works with NPM an
77
124
  Bootstrap a new project and open in VS Code:
78
125
 
79
126
  ```sh
80
- git init && pnpm init && pnpm pkg set type="module" && pnpm dlx @kitschpatrol/repo-config --init && pnpm add -D @kitschpatrol/shared-config && pnpm shared-config --init && pnpm i && code .
127
+ git init && pnpm init && pnpm pkg set type="module" && pnpm dlx @kitschpatrol/repo-config init && pnpm add -D @kitschpatrol/shared-config && pnpm kpi init --location package && pnpm i && code .
81
128
  ```
82
129
 
130
+ The `--location package` flag will put as much configuration in your `package.json` as possible instead of in discrete files in your project root. This saves some clutter but can make it clunkier to extend or customize configurations. At any point, you can call `kpi init` with or without a `--location package` or `--location file` flag to reinitialize your configuration files in one place ot he other to.
131
+
83
132
  #### Quick add to an existing project:
84
133
 
85
134
  This might overwrite certain config files, so commit first:
86
135
 
87
136
  ```sh
88
- pnpm dlx @kitschpatrol/repo-config --init && pnpm i && pnpm add -D @kitschpatrol/shared-config && pnpm shared-config --init
137
+ pnpm dlx @kitschpatrol/repo-config init && pnpm i && pnpm add -D @kitschpatrol/shared-config && pnpm kpi init --location package
89
138
  ```
90
139
 
91
140
  #### Step-by-step:
@@ -93,7 +142,7 @@ pnpm dlx @kitschpatrol/repo-config --init && pnpm i && pnpm add -D @kitschpatrol
93
142
  1. Install the requisite `.npmrc`:
94
143
 
95
144
  ```sh
96
- pnpm dlx @kitschpatrol/repo-config --init
145
+ pnpm dlx @kitschpatrol/repo-config init
97
146
  ```
98
147
 
99
148
  2. Install the package:
@@ -105,7 +154,13 @@ pnpm dlx @kitschpatrol/repo-config --init && pnpm i && pnpm add -D @kitschpatrol
105
154
  3. Add default config files for all the tools to your project root:
106
155
 
107
156
  ```sh
108
- pnpm shared-config --init
157
+ pnpm kpi init
158
+ ```
159
+
160
+ Or, if you don't plan to customize tool configurations, you might want to put as much config as possible under tool-specific keys in 'package.json':
161
+
162
+ ```sh
163
+ pnpm kpi init --location package
109
164
  ```
110
165
 
111
166
  4. Add helper scripts to your `package.json`:
@@ -113,20 +168,32 @@ pnpm dlx @kitschpatrol/repo-config --init && pnpm i && pnpm add -D @kitschpatrol
113
168
  These work a bit like [npm-run-all](https://github.com/mysticatea/npm-run-all) to invoke all of the bundled tools.
114
169
 
115
170
  ```json
116
- "scripts": {
117
- "format": "shared-config --fix",
118
- "lint": "shared-config --lint",
171
+ {
172
+ "scripts": {
173
+ "fix": "kpi fix",
174
+ "lint": "kpi lint"
175
+ }
119
176
  }
120
177
  ```
121
178
 
122
- > \[!NOTE]\
179
+ > [!NOTE]
123
180
  > Prettier formatting for Ruby requires some extra legwork to configure, see [`the @kitschpatrol/prettier-config` package readme](https://github.com/kitschpatrol/shared-config/blob/main/packages/prettier-config/readme.md) for more details.
124
181
 
182
+ 5. Set up GitHub action credentials (if desired)
183
+
184
+ The GitHub actions included in @kitschpatrol/repo-config require permissions to create releases and update your repository metadata. You can add these through the GitHub website under the _Settings → Secrets and variables → Actions_ page under the key `PERSONAL_ACCESS_TOKEN`, or with the [GitHub CLI](https://cli.github.com/) and a credential manager like [1Password CLI](https://developer.1password.com/docs/cli/get-started/):
185
+
186
+ ```sh
187
+ gh secret set PERSONAL_ACCESS_TOKEN --app actions --body $(op read 'op://Personal/GitHub Mika/PERSONAL_ACCESS_TOKEN')
188
+ ```
189
+
190
+ See the [@kitschpatrol/repo-config readme](/packages/repo-config/readme.md#github-configuration) for more details.
191
+
125
192
  ## Usage
126
193
 
127
- Various VS Code plugins should "just work".
194
+ Various VS Code plugins for the bundled tools should "just work".
128
195
 
129
- To lint your entire project, after configuring the `package.json` as shown above:
196
+ To check / lint your entire project, after configuring the `package.json` as shown above:
130
197
 
131
198
  ```sh
132
199
  pnpm run lint
@@ -135,38 +202,124 @@ pnpm run lint
135
202
  To run all of the tools in a _potentially destructive_ "fix" capacity:
136
203
 
137
204
  ```sh
138
- pnpm run format
205
+ pnpm run fix
139
206
  ```
140
207
 
141
208
  ### CLI
142
209
 
143
- <!-- cli-help cliCommand: 'shared-config' -->
210
+ <!-- cli-help cliCommand: 'kpi' -->
211
+
212
+ #### Command: `kpi`
213
+
214
+ Run aggregated @kitschpatrol/shared-config commands.
215
+
216
+ This section lists top-level commands for `kpi`.
217
+
218
+ Usage:
219
+
220
+ ```txt
221
+ kpi <command>
222
+ ```
223
+
224
+ | Command | Argument | Description |
225
+ | -------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
226
+ | `init` | | Initialize configuration files for the entire suite of @kitschpatrol/shared-config tools. Will use option flags where possible if provided, but some of the invoked tools will ignore them. |
227
+ | `lint` | `[files..]` | Lint your project with multiple tools in one go. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope. |
228
+ | `fix` | `[files..]` | Fix your project with multiple tools in one go. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope. |
229
+ | `print-config` | `[file]` | Print aggregated tool configuration data. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope. |
230
+
231
+ | Option | Description | Type |
232
+ | ------------------- | ------------------- | --------- |
233
+ | `--help`<br>`-h` | Show help | `boolean` |
234
+ | `--version`<br>`-v` | Show version number | `boolean` |
235
+
236
+ _See the sections below for more information on each subcommand._
144
237
 
145
- #### Command: `shared-config`
238
+ #### Subcommand: `kpi init`
146
239
 
147
- A collection of shared configurations for various linters and formatting tools. All managed as a single dependency, and invoked via a single command.
240
+ Initialize configuration files for the entire suite of @kitschpatrol/shared-config tools. Will use option flags where possible if provided, but some of the invoked tools will ignore them.
148
241
 
149
242
  Usage:
150
243
 
151
244
  ```txt
152
- shared-config [<file|glob> ...]
245
+ kpi init
153
246
  ```
154
247
 
155
- | Option | Argument | Description |
156
- | ------------------------ | -------- | ---------------------------------------------------------------- |
157
- | `--check`<br>`-c` | | Check for and report issues. Same as `shared-config`. |
158
- | `--init`<br>`-i` | | Initialize by copying starter config files to your project root. |
159
- | `--print-config`<br>`-p` | `<path>` | Print the effective configuration at a certain path. |
160
- | `--fix`<br>`-f` | | Fix all auto-fixable issues, and report the un-fixable. |
161
- | `--help`<br>`-h` | | Print this help info. |
162
- | `--version`<br>`-v` | | Print the package version. |
248
+ | Option | Description | Type | Default |
249
+ | ------------------- | ------------------- | -------------------- | -------- |
250
+ | `--location` | TK | `"file"` `"package"` | `"file"` |
251
+ | `--help`<br>`-h` | Show help | `boolean` | |
252
+ | `--version`<br>`-v` | Show version number | `boolean` | |
253
+
254
+ #### Subcommand: `kpi lint`
255
+
256
+ Lint your project with multiple tools in one go. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope.
257
+
258
+ Usage:
259
+
260
+ ```txt
261
+ kpi lint [files..]
262
+ ```
263
+
264
+ | Positional Argument | Description | Type | Default |
265
+ | ------------------- | ------------------------------ | ------- | ------- |
266
+ | `files` | Files or glob pattern to lint. | `array` | `[]` |
267
+
268
+ | Option | Description | Type |
269
+ | ------------------- | ------------------- | --------- |
270
+ | `--help`<br>`-h` | Show help | `boolean` |
271
+ | `--version`<br>`-v` | Show version number | `boolean` |
272
+
273
+ #### Subcommand: `kpi fix`
274
+
275
+ Fix your project with multiple tools in one go. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope.
276
+
277
+ Usage:
278
+
279
+ ```txt
280
+ kpi fix [files..]
281
+ ```
282
+
283
+ | Positional Argument | Description | Type | Default |
284
+ | ------------------- | ----------------------------- | ------- | ------- |
285
+ | `files` | Files or glob pattern to fix. | `array` | `[]` |
286
+
287
+ | Option | Description | Type |
288
+ | ------------------- | ------------------- | --------- |
289
+ | `--help`<br>`-h` | Show help | `boolean` |
290
+ | `--version`<br>`-v` | Show version number | `boolean` |
291
+
292
+ #### Subcommand: `kpi print-config`
293
+
294
+ Print aggregated tool configuration data. Will use file arguments / globs where possible if provided, but some of the invoked tools only operate at the package-scope.
295
+
296
+ Usage:
297
+
298
+ ```txt
299
+ kpi print-config [file]
300
+ ```
301
+
302
+ | Positional Argument | Description | Type |
303
+ | ------------------- | --------------------------- | -------- |
304
+ | `file` | File or glob pattern to TK. | `string` |
305
+
306
+ | Option | Description | Type |
307
+ | ------------------- | ------------------- | --------- |
308
+ | `--help`<br>`-h` | Show help | `boolean` |
309
+ | `--version`<br>`-v` | Show version number | `boolean` |
163
310
 
164
311
  <!-- /cli-help -->
165
312
 
166
- Recall that the `@kitschpatrol/shared-config` package aggregates integration and invocation of the other tool-specific packages in this monorepo. Running a cli command on `shared-config` effectively runs the same command against all the tool-specific packages.
313
+ Recall that the `@kitschpatrol/shared-config` package aggregates integration and invocation of the other tool-specific packages in this monorepo. Running a cli command on `kpi` effectively runs the same command against all the tool-specific packages.
167
314
 
168
315
  ## Implementation notes
169
316
 
317
+ ### `check` vs `lint`
318
+
319
+ This project combines a mix of tools that regard their core task variously as "linting" or "checking" code and prose.
320
+
321
+ Across all the tools, I've chosen to use the term "lint" instead of "check" to refer to the read-only evaluation process.
322
+
170
323
  ### Package architecture
171
324
 
172
325
  Each package has a simple `/src/cli.ts` file which defines the behavior of its eponymous binary. The build step turns these into node "binary" scripts, providing default implementations where feasible.
@@ -175,13 +328,13 @@ The monorepo must be kept intact, as the sub-packages depend on scripts in the p
175
328
 
176
329
  ### Hoisting caveats
177
330
 
178
- Pnpm considers module hoisting harmful, and I tend to agree, but certain exceptions are carved out as necessary:
331
+ The pnpm authors consider module hoisting harmful, and I tend to agree, but certain exceptions are carved out as necessary and accommodated via the `.npmrc` file included in `@kitschpatrol/repo-config`:
179
332
 
180
333
  - CSpell, remark, mdat, ESLint, and Prettier all need to be hoisted via `public-hoist-pattern` to be accessible in `pnpm exec` scripts and to VS Code plugins.
181
334
 
182
335
  - Even basic file-only packages like `repo-config` seem to need to be hoisted via for their bin scripts to be accessible via `pnpm exec`
183
336
 
184
- - `prettier` and `eslint` packages are [hoisted by default](https://pnpm.io/npmrc#public-hoist-pattern) in `pnpm`
337
+ - In earlier version of pnpm, `prettier` and `eslint` packages were hoisted by default, but as of pnpm 10 this is [no longer the case](https://github.com/pnpm/pnpm/releases/tag/v10.0.0).
185
338
 
186
339
  ## Development notes
187
340
 
@@ -191,7 +344,19 @@ To tell git to ignore changes to the placeholders, run `pnpm run bin-ignore`.
191
344
 
192
345
  For local development via `pnpm`, use `file:` dependency protocol instead of `link:`
193
346
 
194
- Something to investigate: An [approach](https://github.com/antfu/eslint-config#vs-code-support-auto-fix) to ignoring style rules in VS Code, and possibly migrate all style to
347
+ Something to investigate: An [approach](https://github.com/antfu/eslint-config#vs-code-support-auto-fix) to ignoring style rules in VS Code, and possibly migrate all style handling to eslint instead of prettier.
348
+
349
+ Serial run order:
350
+
351
+ 1. `kpi-repo`
352
+ 2. `kpi-mdat`
353
+ 3. `kpi-typescript`
354
+ 4. `kpi-eslint`
355
+ 5. `kpi-stylelint`
356
+ 6. `kpi-cspell`
357
+ 7. `kpi-knip`
358
+ 8. `kpi-remark`
359
+ 9. `kpi-prettier`
195
360
 
196
361
  ## Background
197
362
 
@@ -199,21 +364,38 @@ Something to investigate: An [approach](https://github.com/antfu/eslint-config#v
199
364
 
200
365
  [`xo`](https://github.com/xojs/xo) is really, really close to what I'm after here, but I wanted a few extra tools and preferred to use "first party" VS Code plugins where possible.
201
366
 
202
- ### Similar projects
367
+ [`create-typescript-app`](https://github.com/JoshuaKGoldberg/create-typescript-app) is also excellent, and probably the best starting point for most people for most new projects. However, it does not take a "single top-level dependency" / "single unified CLI" approach.
203
368
 
369
+ [`antfu/eslint-config`](https://github.com/antfu/eslint-config) and [`@sxzz/eslint-config`](https://github.com/sxzz/eslint-config) inspired the approach to ESLint integration.
370
+
371
+ ### Adjacent projects
372
+
373
+ - [@voxpelli/eslint-config](https://github.com/voxpelli/eslint-config)
204
374
  - [1stG/configs](https://github.com/1stG/configs)
205
375
  - [antfu/eslint-config](https://github.com/antfu/eslint-config)
206
376
  - [awesome-eslint](https://github.com/dustinspecker/awesome-eslint)
377
+ - [create-typescript-app](https://github.com/JoshuaKGoldberg/create-typescript-app)
378
+ - [envsa/shared-config](https://github.com/envsa/shared-config) (Liam Rella's fork of `@kitschpatrol/shared-config`)
379
+ - [eslint-config-current-thing](https://github.com/GildedPleb/eslint-config-current-thing) _(Smart!)_
380
+ - [eslint-config-hyperse](https://github.com/hyperse-io/eslint-config-hyperse)
207
381
  - [lass](https://lass.js.org) (xo etc.)
382
+ - [megalinter](https://github.com/oxsecurity/megalinter) (Multi-language.)
383
+ - [neostandard](https://github.com/neostandard/neostandard)
384
+ - [NullVoxPopuli/eslint-configs](https://github.com/NullVoxPopuli/eslint-configs)
385
+ - [qlty](https://github.com/qltysh/qlty) (Multi-language.)
208
386
  - [routine-npm-packages](https://github.com/kachkaev/routine-npm-packages) and [example](https://github.com/kachkaev/website)
209
387
  - [sheriff](https://www.eslint-config-sheriff.dev)
210
388
  - [standard](https://standardjs.com)
389
+ - [sxzz/eslint-config](https://github.com/sxzz/eslint-config)
211
390
  - [trunk](https://trunk.io)
212
- - [xo](https://github.com/xojs/xo)
213
- - [vscode-file-nesting-config](https://github.com/antfu/vscode-file-nesting-config)
214
- - [NullVoxPopuli/eslint-configs](https://github.com/NullVoxPopuli/eslint-configs)
391
+ - [ts-reset](https://github.com/mattpocock/ts-reset)
215
392
  - [tsconfig/bases](https://github.com/tsconfig/bases/tree/main)
216
- - [eslint-config-current-thing](https://github.com/GildedPleb/eslint-config-current-thing) _(Smart!)_
393
+ - [vscode-file-nesting-config](https://github.com/antfu/vscode-file-nesting-config)
394
+ - [xo](https://github.com/xojs/xo)
395
+ - [TanStack Config](https://tanstack.com/config/latest)
396
+ - [Complete](https://complete-ts.github.io/)
397
+ - [vercel/style-guide](https://github.com/vercel/style-guide)
398
+ - [ZumerBox](https://github.com/zumerlab/zumerbox)
217
399
 
218
400
  <!-- license -->
219
401