pickety 0.1.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.
- package/.vscodeignore +22 -0
- package/LICENSE +21 -0
- package/README.md +406 -0
- package/ThirdPartyNotices.txt +154 -0
- package/out/cli.js +18 -0
- package/out/extension.js +153 -0
- package/package.json +144 -0
- package/resources/pickety.schema.json +160 -0
package/.vscodeignore
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
.vscode/**
|
|
2
|
+
.vscode-test/**
|
|
3
|
+
.claude/**
|
|
4
|
+
src/**
|
|
5
|
+
.gitignore
|
|
6
|
+
.yarnrc
|
|
7
|
+
vsc-extension-quickstart.md
|
|
8
|
+
GEMINI.md
|
|
9
|
+
pickety.json
|
|
10
|
+
node_modules/**
|
|
11
|
+
out/**
|
|
12
|
+
!out/extension.js
|
|
13
|
+
!out/cli.js
|
|
14
|
+
scripts/**
|
|
15
|
+
.github/**
|
|
16
|
+
fix-paths.js
|
|
17
|
+
**/tsconfig.json
|
|
18
|
+
**/eslint.config.mjs
|
|
19
|
+
**/*.map
|
|
20
|
+
**/*.ts
|
|
21
|
+
**/.vscode-test.*
|
|
22
|
+
picket-boundaries.mermaid
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Dan Serio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# Pickety
|
|
2
|
+
|
|
3
|
+
**Architectural guardrails for TypeScript projects.**
|
|
4
|
+
|
|
5
|
+
<p align="left">
|
|
6
|
+
<a href="https://github.com/DanielSerio/pickety/blob/main/LICENSE">
|
|
7
|
+
<img src="https://img.shields.io/github/license/DanielSerio/pickety?style=for-the-badge" alt="License">
|
|
8
|
+
</a>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
Pickety is a VS Code extension that stops architecture erosion before it starts. Define your module boundaries once in a simple JSON file, and every illegal import lights up instantly -- right in your editor, as you type. No more "we don't import that here" comments in code review. No more accidental coupling that quietly rots your codebase over months.
|
|
14
|
+
|
|
15
|
+
Zero runtime dependencies. Zero build steps. Just drop in a config and your entire team — and your AI coding agents — get a **real-time Senior Architect** sitting on their shoulder, enforcing the rules that actually matter.
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Why Pickety?
|
|
22
|
+
|
|
23
|
+
Every growing TypeScript codebase develops architectural rules:
|
|
24
|
+
|
|
25
|
+
- Features shouldn't import other features
|
|
26
|
+
- Shared components can't reach into the app layer
|
|
27
|
+
- Utilities must remain dependency-free
|
|
28
|
+
- Routes should only access their own feature's pages
|
|
29
|
+
|
|
30
|
+
These rules live in developers' heads and break silently. Pickety makes them **explicit, enforceable, and visible**.
|
|
31
|
+
|
|
32
|
+
### Built for the AI Era
|
|
33
|
+
|
|
34
|
+
AI coding agents are incredibly fast, but they don't have "Senior Engineer intuition" — they haven't lived through your project's history and don't know your unwritten architectural rules. Pickety bridges this gap by turning tribal knowledge into hard, machine-readable constraints.
|
|
35
|
+
|
|
36
|
+
- **Tribal Knowledge → Hard Constraints:** Don't hope an agent "figures out" your architecture. A single `pickety.json` tells every agent exactly which boundaries are sacred.
|
|
37
|
+
- **Zero-Latency Feedback Loops:** In-editor diagnostics (squiggles) provide instant course-correction. Agents see violations as they write code, fixing architectural errors before you even open a PR.
|
|
38
|
+
- **Machine-Readable Health:** The CLI provides ASCII-formatted health reports (stability, coupling, depth) that agents can ingest to make informed refactoring decisions.
|
|
39
|
+
- **Impact Analysis for Reasoning:** "Show Impact" gives agents a transitive dependency chain, preventing them from making a "simple" change that breaks a dozen distant modules.
|
|
40
|
+
|
|
41
|
+
Whether you're using **Claude Code**, **Cursor**, **GitHub Copilot**, or **Windsurf**, Pickety acts as an automated Senior Architect sitting on the agent's shoulder, keeping it on the rails.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Why not just use ESLint?
|
|
46
|
+
|
|
47
|
+
ESLint is great at code-level rules -- naming conventions, unused variables, consistent syntax. Pickety solves a different problem: **architecture-level rules** that ESLint was never designed for.
|
|
48
|
+
|
|
49
|
+
| | ESLint | Pickety |
|
|
50
|
+
| ---------------------------- | ------------------------------------------------------ | ------------------------------------------------------------ |
|
|
51
|
+
| **Scope** | Single-file lint rules | Cross-module boundary enforcement |
|
|
52
|
+
| **Setup** | Plugin ecosystem, parser config, flat config migration | One `pickety.json` file |
|
|
53
|
+
| **Boundary logic** | `no-restricted-imports` with manual regex per path | Declarative module map + glob-based rules |
|
|
54
|
+
| **Interpolation** | Not supported | `$name` variables enforce scoped relationships automatically |
|
|
55
|
+
| **Strict containment** | Not supported | `only` and `containedTo` whitelist who can import a target |
|
|
56
|
+
| **Architectural visibility** | None | Auto-generated Mermaid boundary diagrams |
|
|
57
|
+
| **Health metrics** | None | Coupling, instability, and dependency depth per module |
|
|
58
|
+
| **Impact analysis** | None | Transitive dependent graph before you refactor |
|
|
59
|
+
| **Gradual adoption** | All-or-nothing per rule | `maxViolations` lets you ratchet down tech debt over time |
|
|
60
|
+
| **Dependencies** | Dozens of transitive deps | Zero (Self-contained) |
|
|
61
|
+
|
|
62
|
+
ESLint's `no-restricted-imports` can block a handful of hard-coded paths. But the moment you need "features can't cross-import each other" or "route X can only touch feature X's pages", you're writing fragile regex that nobody maintains. Pickety expresses those constraints in a few readable lines and enforces them in real time.
|
|
63
|
+
|
|
64
|
+
**Use both.** Let ESLint handle code style and correctness. Let Pickety handle the architectural rules that keep your codebase from quietly rotting.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Features
|
|
69
|
+
|
|
70
|
+
- **Real-time enforcement** -- violations appear as you type, not just on save
|
|
71
|
+
- **Glob patterns** -- flexible module definitions using [minimatch](https://github.com/isaacs/minimatch) syntax
|
|
72
|
+
- **Interpolation variables** -- enforce scoped relationships like "route X can only import from feature X"
|
|
73
|
+
- **Strict enforcement** -- use `only` and `containedTo` to restrict modules to specific consumers
|
|
74
|
+
- **Per-rule severity** -- mark some boundaries as hard errors and others as soft warnings
|
|
75
|
+
- **Debt tracking** -- set a `maxViolations` threshold per rule to adopt boundaries gradually in legacy codebases
|
|
76
|
+
- **Named rules** -- identify exactly which rule triggered a violation
|
|
77
|
+
- **tsconfig.json alias support** -- automatically resolves `@/*` and other path aliases
|
|
78
|
+
- **Boundary diagrams** -- auto-generate Mermaid diagrams of your architecture
|
|
79
|
+
- **Impact Analysis** -- see exactly who depends on a file (transitively) before refactoring
|
|
80
|
+
- **Module Health** -- track coupling, instability, and dependency depth across your project
|
|
81
|
+
- **Circular dependencies** -- auto-detect feedback loops between your modules
|
|
82
|
+
- **Quick fixes** -- jump directly to the rule in `pickety.json` from any violation
|
|
83
|
+
- **Status bar** -- always know whether Pickety is active and how many violations exist
|
|
84
|
+
- **CLI** -- `pickety check` for CI/CD pipelines, matching IDE behavior exactly
|
|
85
|
+
- **JSON Schema** -- autocomplete and inline validation for `pickety.json`
|
|
86
|
+
- **No external dependencies** -- self-contained bundle requires zero `npm install` at runtime
|
|
87
|
+
- **Zero config beyond `pickety.json`** -- no build plugins, no complex environment to set up
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Quick Start
|
|
92
|
+
|
|
93
|
+
**1. Install** the Pickety extension from the VS Code Marketplace.
|
|
94
|
+
|
|
95
|
+
**2. Create `pickety.json`** in your workspace root:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"modules": {
|
|
100
|
+
"features": "src/features/*",
|
|
101
|
+
"components": "src/components/**/*",
|
|
102
|
+
"utils": "src/utils/**/*"
|
|
103
|
+
},
|
|
104
|
+
"rules": {
|
|
105
|
+
"module-boundaries": {
|
|
106
|
+
"severity": "error",
|
|
107
|
+
"rules": [
|
|
108
|
+
{
|
|
109
|
+
"importer": "features",
|
|
110
|
+
"imports": "features",
|
|
111
|
+
"name": "no-cross-feature",
|
|
112
|
+
"message": "Features should not import other features directly"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**3. Done.** Pickety activates automatically. Violations appear as red/yellow squiggles in the editor, in the Problems panel, and in the status bar.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Configuration
|
|
125
|
+
|
|
126
|
+
### Modules
|
|
127
|
+
|
|
128
|
+
Map logical module names to file glob patterns. Each file belongs to the **first** module whose pattern matches.
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"modules": {
|
|
133
|
+
"features": "src/features/*",
|
|
134
|
+
"components": "src/components/**/*",
|
|
135
|
+
"hooks": "src/hooks/**/*",
|
|
136
|
+
"utils": "src/utils/**/*"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
> Patterns ending with `/*` are automatically expanded to `/**/*` for deep matching.
|
|
142
|
+
|
|
143
|
+
### Rules
|
|
144
|
+
|
|
145
|
+
Each rule defines an import boundary between modules.
|
|
146
|
+
|
|
147
|
+
| Field | Type | Required | Description |
|
|
148
|
+
| ------------- | --------- | ----------- | ------------------------------------------------------------------------ |
|
|
149
|
+
| `imports` | `string` | Yes | Target module name, glob, or file path pattern |
|
|
150
|
+
| `importer` | `string` | Conditional | Source module name or glob pattern. Required unless using `containedTo`. |
|
|
151
|
+
| `allow` | `boolean` | No | `true` = permit, `false` = forbid. Default: `false` |
|
|
152
|
+
| `only` | `boolean` | No | `true` = the `imports` target can ONLY be used by this `importer`. |
|
|
153
|
+
| `containedTo` | `string` | No | Shortcut for `only: true`. Restricts `imports` to this path pattern. |
|
|
154
|
+
| `message` | `string` | No | Custom diagnostic message shown in the editor |
|
|
155
|
+
| `severity` | `string` | No | `"error"` or `"warn"`. Overrides the global severity |
|
|
156
|
+
| `name` | `string` | No | Rule identifier. Shown in diagnostics and quick fix labels |
|
|
157
|
+
|
|
158
|
+
### Glob Patterns
|
|
159
|
+
|
|
160
|
+
Both `importer` and `imports` support glob syntax. Use `*` to match all modules:
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"importer": "utils",
|
|
165
|
+
"imports": "*",
|
|
166
|
+
"message": "Utils must remain dependency-free"
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
When `imports` contains a `/`, it matches against the resolved file's relative path, letting you target subdirectories:
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"importer": "routes",
|
|
175
|
+
"imports": "features/**/components",
|
|
176
|
+
"message": "Routes cannot import feature components"
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Strict Enforcement (`only` & `containedTo`)
|
|
181
|
+
|
|
182
|
+
Standard rules are "blacklist" style: they forbid specific connections. `only` and `containedTo` are "whitelist" style: they forbid **everyone else** from importing a target.
|
|
183
|
+
|
|
184
|
+
#### `only`
|
|
185
|
+
|
|
186
|
+
Use `only` to ensure a module is only consumed by a specific layer:
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"importer": "services",
|
|
191
|
+
"imports": "repositories",
|
|
192
|
+
"only": true,
|
|
193
|
+
"message": "Repositories can only be used by the Service layer"
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### `containedTo`
|
|
198
|
+
|
|
199
|
+
Use `containedTo` for "private" file patterns that should never leak outside their owner. It is a shortcut for `only: true` where the `importer` is the allowed scope.
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"imports": "src/features/$name/internal/*",
|
|
204
|
+
"containedTo": "src/features/$name/**/*",
|
|
205
|
+
"message": "Internal files cannot be imported outside their feature"
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Interpolation Variables
|
|
210
|
+
|
|
211
|
+
Use `$variable` placeholders to enforce that path segments match between the importer and the target:
|
|
212
|
+
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"importer": "routes/$name/*",
|
|
216
|
+
"imports": "features/$name/pages/*",
|
|
217
|
+
"allow": true,
|
|
218
|
+
"message": "Routes must import pages from their matching feature"
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
With this rule, `routes/auth/index.ts` can import from `features/auth/pages/` but **not** from `features/billing/pages/`.
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Boundary Diagrams
|
|
227
|
+
|
|
228
|
+
Pickety can auto-generate a [Mermaid](https://mermaid.js.org/) diagram of your module boundaries. Each rule appears as its own section with clear ALLOW/DENY labeling.
|
|
229
|
+
|
|
230
|
+
Add this to your `pickety.json`:
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"boundary-diagrams": true
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Or specify a custom output path:
|
|
239
|
+
|
|
240
|
+
```json
|
|
241
|
+
{
|
|
242
|
+
"boundary-diagrams": "docs/architecture.mermaid"
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
You can also generate diagrams on demand via the command palette: **Pickety: Generate Boundary Diagram**.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Impact Analysis
|
|
251
|
+
|
|
252
|
+
Before refactoring a file, you need to know who depends on it. Pickety's Impact Analysis shows you the transitive dependency chain — every file that might be affected by your change, grouped by the module they belong to.
|
|
253
|
+
|
|
254
|
+
Run **Pickety: Show Impact** from the command palette to see a searchable list of all files that import the current file (directly or indirectly).
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Module Health Metrics
|
|
259
|
+
|
|
260
|
+
Quantify the quality of your architecture with industry-standard coupling metrics. Pickety analyzes your entire project to compute stability and complexity scores for every module.
|
|
261
|
+
|
|
262
|
+
- **Afferent Coupling (Ca)**: How many modules depend on this one? (Responsibility)
|
|
263
|
+
- **Efferent Coupling (Ce)**: How many modules does this one depend on? (Dependency)
|
|
264
|
+
- **Instability (I)**: The ratio `Ce / (Ca + Ce)`. Measures how resilient a module is to external changes.
|
|
265
|
+
- **Dependency Depth**: The length of the longest dependency chain starting from this module.
|
|
266
|
+
|
|
267
|
+
View these metrics anytime using **Pickety: Show Module Health**, or enforce project-wide quality standards in `pickety.json`:
|
|
268
|
+
|
|
269
|
+

|
|
270
|
+
|
|
271
|
+
### Built for Humans and Agents
|
|
272
|
+
|
|
273
|
+
The Module Health feature provides two interfaces depending on who is using it:
|
|
274
|
+
|
|
275
|
+
- **For Humans:** Running the VS Code command opens a clean, color-coded HTML Webview panel. The table highlights healthy modules in green and unstable or problematic modules in red, making it easy to spot architectural issues at a glance.
|
|
276
|
+
- **For AI Agents:** Running the `pickety check` CLI with the `health` argument outputs a clean, ASCII-formatted table directly to stdout. This allows agents to ingest the current state of your architecture and make informed decisions about where to place new code or when refactoring is needed.
|
|
277
|
+
|
|
278
|
+
```json
|
|
279
|
+
{
|
|
280
|
+
"health": {
|
|
281
|
+
"maxInstability": 0.8,
|
|
282
|
+
"maxDepth": 5,
|
|
283
|
+
"maxAfferentCoupling": 20
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Threshold violations appear as diagnostics directly on your `pickety.json` file.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Commands
|
|
293
|
+
|
|
294
|
+
| Command | Description |
|
|
295
|
+
| ------------------------------------ | ----------------------------------------------- |
|
|
296
|
+
| `Pickety: Refresh Configuration` | Reload `pickety.json`, aliases, and file index |
|
|
297
|
+
| `Pickety: Generate Boundary Diagram` | Generate a Mermaid diagram of your boundaries |
|
|
298
|
+
| `Pickety: Show Impact` | See transitive dependents of the active file |
|
|
299
|
+
| `Pickety: Show Module Health` | View coupling and stability metrics for modules |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Example
|
|
304
|
+
|
|
305
|
+
A complete configuration enforcing feature isolation, dependency direction, utility purity, and scoped routing:
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"modules": {
|
|
310
|
+
"app": "src/app/**/*",
|
|
311
|
+
"features": "src/features/*",
|
|
312
|
+
"components": "src/components/**/*",
|
|
313
|
+
"hooks": "src/hooks/**/*",
|
|
314
|
+
"utils": "src/utils/**/*"
|
|
315
|
+
},
|
|
316
|
+
"rules": {
|
|
317
|
+
"module-boundaries": {
|
|
318
|
+
"severity": "error",
|
|
319
|
+
"rules": [
|
|
320
|
+
{
|
|
321
|
+
"importer": "features",
|
|
322
|
+
"imports": "features",
|
|
323
|
+
"name": "no-cross-feature",
|
|
324
|
+
"message": "Features should not import other features directly"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"importer": "components",
|
|
328
|
+
"imports": "features",
|
|
329
|
+
"name": "no-component-to-feature",
|
|
330
|
+
"message": "Shared components should not depend on features"
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"importer": "utils",
|
|
334
|
+
"imports": "*",
|
|
335
|
+
"name": "utility-purity",
|
|
336
|
+
"message": "Utils must remain dependency-free"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"importer": "routes/$name/*",
|
|
340
|
+
"imports": "features/$name/pages/*",
|
|
341
|
+
"allow": true,
|
|
342
|
+
"name": "scoped-routing",
|
|
343
|
+
"message": "Routes must use pages from their matching feature"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"imports": "src/features/$name/internal/*",
|
|
347
|
+
"containedTo": "src/features/$name/**/*",
|
|
348
|
+
"name": "internal-isolation",
|
|
349
|
+
"message": "Internal feature logic cannot leak outside its feature"
|
|
350
|
+
}
|
|
351
|
+
]
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"boundary-diagrams": true,
|
|
355
|
+
"health": {
|
|
356
|
+
"maxInstability": 0.7,
|
|
357
|
+
"maxDepth": 4
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
For more patterns -- Feature-Sliced Design, Onion Architecture, scoped utilities -- see the [Rule Recipes](https://github.com/DanielSerio/pickety/blob/main/docs/recipes.md).
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Performance & Limits
|
|
367
|
+
|
|
368
|
+
Pickety is designed for speed, using optimized regex for import extraction and caching dependency graphs in memory. For most projects, analysis is near-instant.
|
|
369
|
+
|
|
370
|
+
### Large Workspaces
|
|
371
|
+
|
|
372
|
+
To prevent IDE hangs on massive codebases, Pickety applies certain limits in the VS Code extension:
|
|
373
|
+
|
|
374
|
+
- **File Limit:** If your workspace contains more than **5,000** TypeScript/JavaScript source files, Pickety will disable background features (Circular Dependency Detection and Module Health Metrics) for performance.
|
|
375
|
+
- **Real-time Boundary Checks:** Standard boundary enforcement on the active file always remains active, regardless of project size.
|
|
376
|
+
|
|
377
|
+
If these limits are reached, a warning will appear in the **Pickety** output channel. You can still run full project analysis via the CLI: `pickety check`.
|
|
378
|
+
|
|
379
|
+
### Benchmarks
|
|
380
|
+
|
|
381
|
+
In a synthetic project with 500 files and 10 modules, a full project analysis (`pickety check`) completes in under **600ms** on a standard developer machine.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Documentation
|
|
386
|
+
|
|
387
|
+
| Resource | Description |
|
|
388
|
+
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------ |
|
|
389
|
+
| [Setup Guide](https://github.com/DanielSerio/pickety/blob/main/docs/setup.md) | Get running in under 3 minutes |
|
|
390
|
+
| [Configuration Reference](https://github.com/DanielSerio/pickety/blob/main/docs/pickety-json.md) | Full `pickety.json` specification |
|
|
391
|
+
| [Rule Recipes](https://github.com/DanielSerio/pickety/blob/main/docs/recipes.md) | Common architectural patterns (FSD, Onion, etc.) |
|
|
392
|
+
| [Wishlist](https://github.com/DanielSerio/pickety/blob/main/docs/WISHLIST.md) | Proposed features and future roadmap |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Contributing
|
|
397
|
+
|
|
398
|
+
We welcome contributions! See [CONTRIBUTING.md](https://github.com/DanielSerio/pickety/blob/main/CONTRIBUTING.md) for development setup, workflow, and guidelines.
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## License
|
|
403
|
+
|
|
404
|
+
[MIT](https://github.com/DanielSerio/pickety/blob/main/LICENSE)
|
|
405
|
+
|
|
406
|
+
This project bundles and distributes code from open-source projects. See [ThirdPartyNotices.txt](https://github.com/DanielSerio/pickety/blob/main/ThirdPartyNotices.txt) for a complete list of licenses and attributions.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
|
|
2
|
+
|
|
3
|
+
This project uses the following third-party software:
|
|
4
|
+
|
|
5
|
+
========================================================================
|
|
6
|
+
balanced-match@4.0.3
|
|
7
|
+
License: MIT
|
|
8
|
+
Repository: https://github.com/juliangruber/balanced-match
|
|
9
|
+
|
|
10
|
+
(MIT)
|
|
11
|
+
|
|
12
|
+
Original code Copyright Julian Gruber <julian@juliangruber.com>
|
|
13
|
+
|
|
14
|
+
Port to TypeScript Copyright Isaac Z. Schlueter <i@izs.me>
|
|
15
|
+
|
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
17
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
18
|
+
the Software without restriction, including without limitation the rights to
|
|
19
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
20
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
21
|
+
so, subject to the following conditions:
|
|
22
|
+
|
|
23
|
+
The above copyright notice and this permission notice shall be included in all
|
|
24
|
+
copies or substantial portions of the Software.
|
|
25
|
+
|
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
+
SOFTWARE.
|
|
33
|
+
========================================================================
|
|
34
|
+
|
|
35
|
+
========================================================================
|
|
36
|
+
brace-expansion@5.0.2
|
|
37
|
+
License: MIT
|
|
38
|
+
Repository: https://github.com/juliangruber/brace-expansion
|
|
39
|
+
|
|
40
|
+
MIT License
|
|
41
|
+
|
|
42
|
+
Copyright Julian Gruber <julian@juliangruber.com>
|
|
43
|
+
|
|
44
|
+
TypeScript port Copyright Isaac Z. Schlueter <i@izs.me>
|
|
45
|
+
|
|
46
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
47
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
48
|
+
in the Software without restriction, including without limitation the rights
|
|
49
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
50
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
51
|
+
furnished to do so, subject to the following conditions:
|
|
52
|
+
|
|
53
|
+
The above copyright notice and this permission notice shall be included in all
|
|
54
|
+
copies or substantial portions of the Software.
|
|
55
|
+
|
|
56
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
57
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
58
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
59
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
60
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
61
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
62
|
+
SOFTWARE.
|
|
63
|
+
========================================================================
|
|
64
|
+
|
|
65
|
+
========================================================================
|
|
66
|
+
jsonc-parser@3.3.1
|
|
67
|
+
License: MIT
|
|
68
|
+
Repository: https://github.com/microsoft/node-jsonc-parser
|
|
69
|
+
|
|
70
|
+
The MIT License (MIT)
|
|
71
|
+
|
|
72
|
+
Copyright (c) Microsoft
|
|
73
|
+
|
|
74
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
75
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
76
|
+
in the Software without restriction, including without limitation the rights
|
|
77
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
78
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
79
|
+
furnished to do so, subject to the following conditions:
|
|
80
|
+
|
|
81
|
+
The above copyright notice and this permission notice shall be included in all
|
|
82
|
+
copies or substantial portions of the Software.
|
|
83
|
+
|
|
84
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
85
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
86
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
87
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
88
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
89
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
90
|
+
SOFTWARE.
|
|
91
|
+
========================================================================
|
|
92
|
+
|
|
93
|
+
========================================================================
|
|
94
|
+
minimatch@10.2.2
|
|
95
|
+
License: BlueOak-1.0.0
|
|
96
|
+
Repository: https://github.com/isaacs/minimatch
|
|
97
|
+
|
|
98
|
+
# Blue Oak Model License
|
|
99
|
+
|
|
100
|
+
Version 1.0.0
|
|
101
|
+
|
|
102
|
+
## Purpose
|
|
103
|
+
|
|
104
|
+
This license gives everyone as much permission to work with
|
|
105
|
+
this software as possible, while protecting contributors
|
|
106
|
+
from liability.
|
|
107
|
+
|
|
108
|
+
## Acceptance
|
|
109
|
+
|
|
110
|
+
In order to receive this license, you must agree to its
|
|
111
|
+
rules. The rules of this license are both obligations
|
|
112
|
+
under that agreement and conditions to your license.
|
|
113
|
+
You must not do anything with this software that triggers
|
|
114
|
+
a rule that you cannot or will not follow.
|
|
115
|
+
|
|
116
|
+
## Copyright
|
|
117
|
+
|
|
118
|
+
Each contributor licenses you to do everything with this
|
|
119
|
+
software that would otherwise infringe that contributor's
|
|
120
|
+
copyright in it.
|
|
121
|
+
|
|
122
|
+
## Notices
|
|
123
|
+
|
|
124
|
+
You must ensure that everyone who gets a copy of
|
|
125
|
+
any part of this software from you, with or without
|
|
126
|
+
changes, also gets the text of this license or a link to
|
|
127
|
+
<https://blueoakcouncil.org/license/1.0.0>.
|
|
128
|
+
|
|
129
|
+
## Excuse
|
|
130
|
+
|
|
131
|
+
If anyone notifies you in writing that you have not
|
|
132
|
+
complied with [Notices](#notices), you can keep your
|
|
133
|
+
license by taking all practical steps to comply within 30
|
|
134
|
+
days after the notice. If you do not do so, your license
|
|
135
|
+
ends immediately.
|
|
136
|
+
|
|
137
|
+
## Patent
|
|
138
|
+
|
|
139
|
+
Each contributor licenses you to do everything with this
|
|
140
|
+
software that would otherwise infringe any patent claims
|
|
141
|
+
they can license or become able to license.
|
|
142
|
+
|
|
143
|
+
## Reliability
|
|
144
|
+
|
|
145
|
+
No contributor can revoke this license.
|
|
146
|
+
|
|
147
|
+
## No Liability
|
|
148
|
+
|
|
149
|
+
**_As far as the law allows, this software comes as is,
|
|
150
|
+
without any warranty or condition, and no contributor
|
|
151
|
+
will be liable to anyone for any damages related to this
|
|
152
|
+
software or this license, under any kind of legal claim._**
|
|
153
|
+
========================================================================
|
|
154
|
+
|