pasika 0.3.2 → 0.3.3
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/README.md +61 -5
- package/dist/cli/index.js +2 -2
- package/dist/enforcement/coverage.d.ts +5 -1
- package/dist/enforcement/coverage.js +43 -10
- package/dist/enforcement/parse-docs.js +5 -1
- package/package.json +4 -5
- package/enforcement/registry.json +0 -1145
|
@@ -1,1145 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"requirements": [
|
|
3
|
-
{
|
|
4
|
-
"doc": "agent-policy.md",
|
|
5
|
-
"text": "A change MUST NOT introduce a finding that the repository's lint command (mechanical rules) or npx pasika doctor (environment checks) did not already report.",
|
|
6
|
-
"hash": "f8d1db6aaf",
|
|
7
|
-
"kind": "judgment",
|
|
8
|
-
"note": "deciding a finding is new requires the previous state, which neither command carries"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"doc": "agent-policy.md",
|
|
12
|
-
"text": "A change MUST update every in-repo call site rather than preserve backward compatibility, unless the user asks for compatibility.",
|
|
13
|
-
"hash": "e765276ded",
|
|
14
|
-
"kind": "judgment",
|
|
15
|
-
"note": "recognizing a compatibility shim requires knowing the change's intent"
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"doc": "agent-policy.md",
|
|
19
|
-
"text": "A change to the Vulyk registry MUST use Vulyk commands rather than edits to generated files.",
|
|
20
|
-
"hash": "27247db8eb",
|
|
21
|
-
"kind": "doctor",
|
|
22
|
-
"ref": "pasika/managed-file-edit"
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"doc": "agent-policy.md",
|
|
26
|
-
"text": "A commit MUST NOT use the --no-verify flag.",
|
|
27
|
-
"hash": "e1c615452f",
|
|
28
|
-
"kind": "judgment",
|
|
29
|
-
"note": "how git was invoked is not observable from the repository"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"doc": "agent-policy.md",
|
|
33
|
-
"text": "A data contract's fields MUST be required unless runtime evidence shows they are optional or nullable.",
|
|
34
|
-
"hash": "b404251c21",
|
|
35
|
-
"kind": "judgment",
|
|
36
|
-
"note": "deciding a field is genuinely optional requires evidence about runtime data"
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"doc": "agent-policy.md",
|
|
40
|
-
"text": "A file listed in a .vulyk manifest MUST NOT be edited by hand.",
|
|
41
|
-
"hash": "2390e57f4f",
|
|
42
|
-
"kind": "doctor",
|
|
43
|
-
"ref": "pasika/managed-file-edit"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"doc": "agent-policy.md",
|
|
47
|
-
"text": "A lint command MUST NOT pass ESLint's --cache flag, because rules that compare a file against the rest of the tree need every file in the run.",
|
|
48
|
-
"hash": "2b3f806581",
|
|
49
|
-
"kind": "eslint",
|
|
50
|
-
"ref": "pasika/no-cache-flag"
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"doc": "agent-policy.md",
|
|
54
|
-
"text": "A repository MUST take its lint, format, and TypeScript configuration from pasika and zirka rather than restating it locally.",
|
|
55
|
-
"hash": "12553abd17",
|
|
56
|
-
"kind": "doctor",
|
|
57
|
-
"ref": "pasika/config-baseline"
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"doc": "agent-policy.md",
|
|
61
|
-
"text": "An agent MAY discover available commands with agent-browser --help and command-specific usage with agent-browser <command> --help.",
|
|
62
|
-
"hash": "8370ec5f41",
|
|
63
|
-
"kind": "permission"
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"doc": "agent-policy.md",
|
|
67
|
-
"text": "Browser behavior a task depends on MUST be verified with agent-browser.",
|
|
68
|
-
"hash": "034197e9d7",
|
|
69
|
-
"kind": "judgment",
|
|
70
|
-
"note": "whether a task depends on browser behavior is not observable"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"doc": "agent-policy.md",
|
|
74
|
-
"text": "Code MUST NOT use eslint-disable directives, and a reported violation MUST be fixed instead.",
|
|
75
|
-
"hash": "628ab4f6a6",
|
|
76
|
-
"kind": "eslint",
|
|
77
|
-
"ref": "pasika/no-eslint-disable"
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"doc": "agent-policy.md",
|
|
81
|
-
"text": "Documentation written outside this repository MUST be consumed through Vulyk rather than copied in.",
|
|
82
|
-
"hash": "8177201b42",
|
|
83
|
-
"kind": "judgment",
|
|
84
|
-
"note": "recognizing a document as copied from elsewhere is not decidable from the repository"
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"doc": "agent-policy.md",
|
|
88
|
-
"text": "Runtime validation MUST use Zod schemas rather than ad hoc type guards.",
|
|
89
|
-
"hash": "b5facfa0c0",
|
|
90
|
-
"kind": "judgment",
|
|
91
|
-
"note": "whether a value crosses a runtime boundary and needs validation is not decidable from source"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"doc": "agent-policy.md",
|
|
95
|
-
"text": "Vulyk MUST NOT be added to package.json in order to run its CLI.",
|
|
96
|
-
"hash": "1061447825",
|
|
97
|
-
"kind": "eslint",
|
|
98
|
-
"ref": "pasika/no-vulyk-dependency"
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"doc": "agent-policy.md",
|
|
102
|
-
"text": "Vulyk MUST run as an ephemeral command such as npx vulyk@latest.",
|
|
103
|
-
"hash": "c8aaf8ce02",
|
|
104
|
-
"kind": "eslint",
|
|
105
|
-
"ref": "pasika/no-vulyk-dependency"
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
"doc": "agent-policy.md",
|
|
109
|
-
"text": "agent-browser upgrade MUST run before agent-browser is used in a task.",
|
|
110
|
-
"hash": "aea9247939",
|
|
111
|
-
"kind": "judgment",
|
|
112
|
-
"note": "tool invocation order within a task is not observable"
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
116
|
-
"text": "A feature folder, src/compositions/, src/shared/, and a nested component folder MAY each contain support folders.",
|
|
117
|
-
"hash": "5cc68d9d44",
|
|
118
|
-
"kind": "permission",
|
|
119
|
-
"note": "the application-structure check must allow support folders in these scopes"
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
123
|
-
"text": "A file that does not define a component MUST have a kebab-case name.",
|
|
124
|
-
"hash": "19eb3df87a",
|
|
125
|
-
"kind": "eslint",
|
|
126
|
-
"ref": "pasika/filename-case",
|
|
127
|
-
"note": "a .tsx file that defines no component is treated as a component file"
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
131
|
-
"text": "A folder holding support files MUST be named hooks/, types/, schemas/, constants/, or utils/, matching the kind of file it holds.",
|
|
132
|
-
"hash": "1ea6de0cbf",
|
|
133
|
-
"kind": "eslint",
|
|
134
|
-
"ref": "pasika/application-structure"
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
138
|
-
"text": "A support folder MUST NOT contain a component.",
|
|
139
|
-
"hash": "25be7e89ec",
|
|
140
|
-
"kind": "eslint",
|
|
141
|
-
"ref": "pasika/application-structure"
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
145
|
-
"text": "Application source MUST live under src/.",
|
|
146
|
-
"hash": "0a5c03a95d",
|
|
147
|
-
"kind": "doctor",
|
|
148
|
-
"ref": "pasika/source-under-src"
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
152
|
-
"text": "src/ MUST contain only the app/, compositions/, features/, and shared/ folders, the root support folders, config/, locales/, and the files a framework requires at the src root.",
|
|
153
|
-
"hash": "dd84e5498f",
|
|
154
|
-
"kind": "eslint",
|
|
155
|
-
"ref": "pasika/application-structure"
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
"doc": "code-organization-guide/rules/application-structure-rule.md",
|
|
159
|
-
"text": "src/features/ MUST contain only feature folders.",
|
|
160
|
-
"hash": "8e68eeb8c4",
|
|
161
|
-
"kind": "eslint",
|
|
162
|
-
"ref": "pasika/application-structure"
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
166
|
-
"text": "A component that imports from two or more feature folders MUST live in src/compositions/.",
|
|
167
|
-
"hash": "a00c621fbe",
|
|
168
|
-
"kind": "eslint",
|
|
169
|
-
"ref": "pasika/cross-feature-import"
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
173
|
-
"text": "A component whose CCF is src/features/ MUST live in src/shared/.",
|
|
174
|
-
"hash": "b1a3a85205",
|
|
175
|
-
"kind": "eslint",
|
|
176
|
-
"ref": "pasika/component-placement"
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
180
|
-
"text": "A component with at least one consumer outside src/app/ and configuration modules MUST live in its CCF, calculated without imports from src/app/ or configuration modules.",
|
|
181
|
-
"hash": "ace1e1e4e0",
|
|
182
|
-
"kind": "eslint",
|
|
183
|
-
"ref": "pasika/component-placement"
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
187
|
-
"text": "A component with no consumers outside src/app/ or configuration modules, and that does not import from two or more feature folders, MUST live in the feature folder it represents or supports. If no existing feature applies, it MUST introduce a new feature folder.",
|
|
188
|
-
"hash": "b3d12b8551",
|
|
189
|
-
"kind": "eslint",
|
|
190
|
-
"ref": "pasika/component-placement",
|
|
191
|
-
"note": "checks the component sits under a feature folder; which feature represents it stays judgment"
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
195
|
-
"text": "When calculating a component's CCF, consumers under src/compositions/ MUST count only when no consumer is outside src/compositions/.",
|
|
196
|
-
"hash": "861dd64bfa",
|
|
197
|
-
"kind": "eslint",
|
|
198
|
-
"ref": "pasika/component-placement"
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
"doc": "code-organization-guide/rules/component-placement-rule.md",
|
|
202
|
-
"text": "src/app/ MUST contain Next.js App Router framework-convention files and assets, plus styles required by routing files, but MUST NOT contain ordinary components or support folders.",
|
|
203
|
-
"hash": "6a1d1f370e",
|
|
204
|
-
"kind": "eslint",
|
|
205
|
-
"ref": "pasika/application-structure"
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
"doc": "code-organization-guide/rules/configuration-rule.md",
|
|
209
|
-
"text": "A configuration module MUST be one src/config/<config-name>/ folder with index.ts as its entry point.",
|
|
210
|
-
"hash": "2f17655f6f",
|
|
211
|
-
"kind": "eslint",
|
|
212
|
-
"ref": "pasika/application-structure"
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"doc": "code-organization-guide/rules/configuration-rule.md",
|
|
216
|
-
"text": "A type, schema, or utility used only to implement one configuration module MUST be extracted even with one consumer.",
|
|
217
|
-
"hash": "9e5da88f2e",
|
|
218
|
-
"kind": "eslint",
|
|
219
|
-
"ref": "pasika/config-extraction"
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
"doc": "code-organization-guide/rules/configuration-rule.md",
|
|
223
|
-
"text": "All configuration modules MUST live in src/config/.",
|
|
224
|
-
"hash": "068f9a0a91",
|
|
225
|
-
"kind": "eslint",
|
|
226
|
-
"ref": "pasika/application-structure"
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
"doc": "code-organization-guide/rules/configuration-rule.md",
|
|
230
|
-
"text": "An extracted configuration schema or utility MUST move to its matching root support folder when a consumer outside its configuration module imports it.",
|
|
231
|
-
"hash": "c9a8b972f2",
|
|
232
|
-
"kind": "eslint",
|
|
233
|
-
"ref": "pasika/support-file-placement"
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
"doc": "code-organization-guide/rules/configuration-rule.md",
|
|
237
|
-
"text": "An extracted configuration type, schema, or utility MUST live in its matching dedicated folder under src/config/<config-name>/.",
|
|
238
|
-
"hash": "d931ef91df",
|
|
239
|
-
"kind": "eslint",
|
|
240
|
-
"ref": "pasika/application-structure"
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
244
|
-
"text": "A constant MAY live in src/config/<module>/ instead of a constants/ folder when a developer determines that it configures application behavior and is best understood alongside the configuration that parameterizes it, even when consumers exist outside the config module.",
|
|
245
|
-
"hash": "57f90aa714",
|
|
246
|
-
"kind": "permission",
|
|
247
|
-
"note": "pasika/support-file-placement skips the constants/ folder of a configuration module"
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
251
|
-
"text": "A constants/ folder MUST either define its constants directly in index.ts or group related constants in files that index.ts named-re-exports.",
|
|
252
|
-
"hash": "2d1591194c",
|
|
253
|
-
"kind": "eslint",
|
|
254
|
-
"ref": "pasika/support-folder-shape"
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
258
|
-
"text": "A value MUST remain in its declaring component or file until another file imports it independently; it MUST then be extracted as a constant.",
|
|
259
|
-
"hash": "e779f5ec6f",
|
|
260
|
-
"kind": "eslint",
|
|
261
|
-
"ref": "pasika/value-extraction"
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
265
|
-
"text": "Consumers MUST import an extracted constant through the index.ts in that constant's constants/ folder.",
|
|
266
|
-
"hash": "0a7bdc1dfe",
|
|
267
|
-
"kind": "eslint",
|
|
268
|
-
"ref": "pasika/import-through-index"
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
272
|
-
"text": "Extracted constants MUST live in a constants/ folder at the CCF of their consumers.",
|
|
273
|
-
"hash": "34022a9e2b",
|
|
274
|
-
"kind": "eslint",
|
|
275
|
-
"ref": "pasika/support-file-placement"
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"doc": "code-organization-guide/rules/constants-rule.md",
|
|
279
|
-
"text": "When a constant's CCF is src/features/, it MUST move to src/constants/.",
|
|
280
|
-
"hash": "2b137b9350",
|
|
281
|
-
"kind": "eslint",
|
|
282
|
-
"ref": "pasika/support-file-placement"
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
286
|
-
"text": "A configuration module MUST import only from root support folders and its own files.",
|
|
287
|
-
"hash": "1ef619154c",
|
|
288
|
-
"kind": "eslint",
|
|
289
|
-
"ref": "pasika/import-boundaries"
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
293
|
-
"text": "A file in a feature folder MUST NOT import from another feature folder, src/compositions/, or src/app/.",
|
|
294
|
-
"hash": "e91ffc37d1",
|
|
295
|
-
"kind": "eslint",
|
|
296
|
-
"ref": "pasika/import-boundaries"
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
300
|
-
"text": "A file in the root layer MUST NOT import from src/app/, src/compositions/, a feature folder, or src/shared/.",
|
|
301
|
-
"hash": "a73db9af2e",
|
|
302
|
-
"kind": "eslint",
|
|
303
|
-
"ref": "pasika/import-boundaries"
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
307
|
-
"text": "A file that exports values MUST use named exports unless a framework or third-party package requires a different export style for that file.",
|
|
308
|
-
"hash": "b330b4c859",
|
|
309
|
-
"kind": "eslint",
|
|
310
|
-
"ref": "pasika/named-exports"
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
314
|
-
"text": "A file under src/compositions/ MUST NOT import from src/app/.",
|
|
315
|
-
"hash": "591ad01f1d",
|
|
316
|
-
"kind": "eslint",
|
|
317
|
-
"ref": "pasika/import-boundaries"
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
321
|
-
"text": "A file under src/shared/ MUST NOT import from src/app/, src/compositions/, or a feature folder.",
|
|
322
|
-
"hash": "901b928be3",
|
|
323
|
-
"kind": "eslint",
|
|
324
|
-
"ref": "pasika/import-boundaries"
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
328
|
-
"text": "Imports MUST use the relative path when the relative path and the @/* alias have the same number of segments.",
|
|
329
|
-
"hash": "2e467d4659",
|
|
330
|
-
"kind": "eslint",
|
|
331
|
-
"ref": "pasika/import-boundaries"
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
"doc": "code-organization-guide/rules/exports-and-imports-rule.md",
|
|
335
|
-
"text": "Imports MUST use whichever of the relative path and the @/* alias has fewer segments, counting each ../ step and each name in the path as one segment.",
|
|
336
|
-
"hash": "47c4ccc7fd",
|
|
337
|
-
"kind": "eslint",
|
|
338
|
-
"ref": "pasika/import-boundaries"
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
"doc": "code-organization-guide/rules/folder-nesting-rule.md",
|
|
342
|
-
"text": "A component MUST NOT be nested only because it has support files.",
|
|
343
|
-
"hash": "bd8c041512",
|
|
344
|
-
"kind": "eslint",
|
|
345
|
-
"ref": "pasika/component-nesting"
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
"doc": "code-organization-guide/rules/folder-nesting-rule.md",
|
|
349
|
-
"text": "A component MUST stay flat until it has one or more exclusive child components, then MUST be nested in a folder with the same name.",
|
|
350
|
-
"hash": "6adf7c4309",
|
|
351
|
-
"kind": "eslint",
|
|
352
|
-
"ref": "pasika/stay-flat"
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
"doc": "code-organization-guide/rules/folder-nesting-rule.md",
|
|
356
|
-
"text": "A nested component's support files MUST live in its folder.",
|
|
357
|
-
"hash": "73ae41cdfe",
|
|
358
|
-
"kind": "eslint",
|
|
359
|
-
"ref": "pasika/support-file-placement"
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
"doc": "code-organization-guide/rules/folder-nesting-rule.md",
|
|
363
|
-
"text": "The nested folder's index.ts MUST named-re-export the nested component and MUST NOT re-export its exclusive children.",
|
|
364
|
-
"hash": "d3fba850df",
|
|
365
|
-
"kind": "eslint",
|
|
366
|
-
"ref": "pasika/enforce-barrel-exports"
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
"doc": "code-organization-guide/rules/hook-extraction-rule.md",
|
|
370
|
-
"text": "A custom hook MUST be extracted to its own file when two or more consumers use it.",
|
|
371
|
-
"hash": "f7a5d6663d",
|
|
372
|
-
"kind": "eslint",
|
|
373
|
-
"ref": "pasika/hook-extraction"
|
|
374
|
-
},
|
|
375
|
-
{
|
|
376
|
-
"doc": "code-organization-guide/rules/hook-extraction-rule.md",
|
|
377
|
-
"text": "A custom hook with exactly one consumer MUST be extracted when it contains two or more imperative categories and can be described as one coherent behavior.",
|
|
378
|
-
"hash": "b057015bf3",
|
|
379
|
-
"kind": "eslint",
|
|
380
|
-
"ref": "pasika/hook-complexity"
|
|
381
|
-
},
|
|
382
|
-
{
|
|
383
|
-
"doc": "code-organization-guide/rules/hook-extraction-rule.md",
|
|
384
|
-
"text": "A custom hook with one consumer that contains fewer than two imperative categories MUST stay inline in its consumer file.",
|
|
385
|
-
"hash": "fb12bb6002",
|
|
386
|
-
"kind": "eslint",
|
|
387
|
-
"ref": "pasika/hook-complexity"
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
"doc": "code-organization-guide/rules/hook-extraction-rule.md",
|
|
391
|
-
"text": "An extracted custom hook MUST live in a hooks/ folder at the CCF of its consumers.",
|
|
392
|
-
"hash": "9b975cbb62",
|
|
393
|
-
"kind": "eslint",
|
|
394
|
-
"ref": "pasika/support-file-placement"
|
|
395
|
-
},
|
|
396
|
-
{
|
|
397
|
-
"doc": "code-organization-guide/rules/hook-extraction-rule.md",
|
|
398
|
-
"text": "When a custom hook's CCF is src/features/, it MUST move to src/hooks/.",
|
|
399
|
-
"hash": "afef325493",
|
|
400
|
-
"kind": "eslint",
|
|
401
|
-
"ref": "pasika/support-file-placement"
|
|
402
|
-
},
|
|
403
|
-
{
|
|
404
|
-
"doc": "code-organization-guide/rules/interactive-component-rule.md",
|
|
405
|
-
"text": "An interactive HTML element MUST be extracted to a component with a descriptive name.",
|
|
406
|
-
"hash": "56a186c55b",
|
|
407
|
-
"kind": "eslint",
|
|
408
|
-
"ref": "pasika/interactive-component"
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
"doc": "code-organization-guide/rules/jsx-hygiene-rule.md",
|
|
412
|
-
"text": "An inline expression MAY contain one condition with up to one logical operator, one ternary, or one built-in method call. cn() MAY be called inline. An event handler MAY make one call inline.",
|
|
413
|
-
"hash": "d8f4ceb822",
|
|
414
|
-
"kind": "permission",
|
|
415
|
-
"note": "the jsx-hygiene check must treat exactly these as the permitted inline set"
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
"doc": "code-organization-guide/rules/jsx-hygiene-rule.md",
|
|
419
|
-
"text": "Arithmetic, chained built-in method calls, calls to functions declared outside the component, nested ternaries, and conditions containing two or more logical operators MUST be extracted before return, including in JSX attributes.",
|
|
420
|
-
"hash": "979a3e96c3",
|
|
421
|
-
"kind": "eslint",
|
|
422
|
-
"ref": "pasika/jsx-hygiene"
|
|
423
|
-
},
|
|
424
|
-
{
|
|
425
|
-
"doc": "code-organization-guide/rules/locales-rule.md",
|
|
426
|
-
"text": "A locale key MUST be camelCase English based on the text, unless a direct translation would be unclear or unwieldy. In that case, it MAY describe the message's purpose instead.",
|
|
427
|
-
"hash": "94ea814921",
|
|
428
|
-
"kind": "judgment",
|
|
429
|
-
"note": "whether a key reads as its text or its purpose depends on the language"
|
|
430
|
-
},
|
|
431
|
-
{
|
|
432
|
-
"doc": "code-organization-guide/rules/locales-rule.md",
|
|
433
|
-
"text": "A namespaced locale MUST be read through its full dotted path (locales.stream.watchLiveStream).",
|
|
434
|
-
"hash": "3c10684240",
|
|
435
|
-
"kind": "eslint",
|
|
436
|
-
"ref": "pasika/locale-dotted-path"
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
"doc": "code-organization-guide/rules/locales-rule.md",
|
|
440
|
-
"text": "All locales MUST live in the named locales object exported from src/locales/index.ts.",
|
|
441
|
-
"hash": "2469d743da",
|
|
442
|
-
"kind": "eslint",
|
|
443
|
-
"ref": "pasika/locales-location"
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
"doc": "code-organization-guide/rules/locales-rule.md",
|
|
447
|
-
"text": "Locales read by files in more than one feature folder or by src/shared/, src/compositions/, src/app/, or root support folders MUST live at the top level of locales.",
|
|
448
|
-
"hash": "4f947bf362",
|
|
449
|
-
"kind": "eslint",
|
|
450
|
-
"ref": "pasika/locale-placement"
|
|
451
|
-
},
|
|
452
|
-
{
|
|
453
|
-
"doc": "code-organization-guide/rules/locales-rule.md",
|
|
454
|
-
"text": "Locales read only by files in one feature folder MUST live in an object with the camelCase form of its feature folder name (for example, user-settings becomes userSettings).",
|
|
455
|
-
"hash": "66addb15b3",
|
|
456
|
-
"kind": "eslint",
|
|
457
|
-
"ref": "pasika/locale-placement"
|
|
458
|
-
},
|
|
459
|
-
{
|
|
460
|
-
"doc": "code-organization-guide/rules/nameable-visual-concept-rule.md",
|
|
461
|
-
"text": "A block of elements SHOULD be extracted to a component when one clear name describes the whole block.",
|
|
462
|
-
"hash": "ca77bfffc0",
|
|
463
|
-
"kind": "judgment",
|
|
464
|
-
"note": "deciding one clear name describes a block is a naming judgment"
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
"doc": "code-organization-guide/rules/no-mixed-concerns-rule.md",
|
|
468
|
-
"text": "A .tsx file that defines a component MUST contain exactly one component.",
|
|
469
|
-
"hash": "b19fe3bd34",
|
|
470
|
-
"kind": "eslint",
|
|
471
|
-
"ref": "pasika/no-mixed-concerns",
|
|
472
|
-
"note": "counts exported components; a second component that is not exported is not detected"
|
|
473
|
-
},
|
|
474
|
-
{
|
|
475
|
-
"doc": "code-organization-guide/rules/repeated-structure-rule.md",
|
|
476
|
-
"text": "A block of elements MUST be extracted as a named component when two or more places use the same arrangement of elements for the same purpose. Different data or labels do not prevent extraction.",
|
|
477
|
-
"hash": "3c1b9c7807",
|
|
478
|
-
"kind": "judgment",
|
|
479
|
-
"note": "recognizing the same arrangement used for the same purpose needs structural comparison"
|
|
480
|
-
},
|
|
481
|
-
{
|
|
482
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
483
|
-
"text": "A dumb component MAY set data-testid on its root element, and the value MUST be kebab-case.",
|
|
484
|
-
"hash": "4c78863697",
|
|
485
|
-
"kind": "eslint",
|
|
486
|
-
"ref": "pasika/data-testid-case"
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
490
|
-
"text": "A dumb component file name MUST be kebab-case.tsx.",
|
|
491
|
-
"hash": "7639f7df0b",
|
|
492
|
-
"kind": "eslint",
|
|
493
|
-
"ref": "pasika/filename-case"
|
|
494
|
-
},
|
|
495
|
-
{
|
|
496
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
497
|
-
"text": "A smart component file name MUST be PascalCase.tsx.",
|
|
498
|
-
"hash": "1ece393f32",
|
|
499
|
-
"kind": "eslint",
|
|
500
|
-
"ref": "pasika/filename-case"
|
|
501
|
-
},
|
|
502
|
-
{
|
|
503
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
504
|
-
"text": "A smart component with one outer DOM element in every rendered result MUST set data-testid on that element, and its value MUST match the component name in PascalCase.",
|
|
505
|
-
"hash": "31dc8b3188",
|
|
506
|
-
"kind": "eslint",
|
|
507
|
-
"ref": "pasika/data-testid-case"
|
|
508
|
-
},
|
|
509
|
-
{
|
|
510
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
511
|
-
"text": "A smart component without one outer DOM element in every rendered result MAY omit data-testid.",
|
|
512
|
-
"hash": "b0dc309f05",
|
|
513
|
-
"kind": "permission",
|
|
514
|
-
"note": "the data-testid check must exempt a component with no single outer element"
|
|
515
|
-
},
|
|
516
|
-
{
|
|
517
|
-
"doc": "code-organization-guide/rules/smart-vs-dumb-component-rule.md",
|
|
518
|
-
"text": "Next.js App Router routing files MUST use their required kebab-case names and are exempt from smart/dumb file-name and data-testid requirements.",
|
|
519
|
-
"hash": "fb2c9ab370",
|
|
520
|
-
"kind": "eslint",
|
|
521
|
-
"ref": "pasika/data-testid-case"
|
|
522
|
-
},
|
|
523
|
-
{
|
|
524
|
-
"doc": "code-organization-guide/rules/sole-state-owner-rule.md",
|
|
525
|
-
"text": "A component MUST extract a named component when one part of its JSX contains every JSX expression, callback, and effect that reads one state hook's value or calls its updater.",
|
|
526
|
-
"hash": "22a896ea5f",
|
|
527
|
-
"kind": "judgment",
|
|
528
|
-
"note": "deciding one JSX part owns every read of a state hook needs subtree analysis a rule cannot ground"
|
|
529
|
-
},
|
|
530
|
-
{
|
|
531
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
532
|
-
"text": "A type MAY stay in src/config/<module>/ when its meaning is derived from the configuration that it parameterizes, even when consumers exist outside the config module.",
|
|
533
|
-
"hash": "091724ed27",
|
|
534
|
-
"kind": "permission",
|
|
535
|
-
"note": "pasika/support-file-placement skips the types/ folder of a configuration module"
|
|
536
|
-
},
|
|
537
|
-
{
|
|
538
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
539
|
-
"text": "A type or schema declared in a component MUST stay in that component file until another file imports it without the component where it is defined.",
|
|
540
|
-
"hash": "165d0c0cad",
|
|
541
|
-
"kind": "eslint",
|
|
542
|
-
"ref": "pasika/type-extraction"
|
|
543
|
-
},
|
|
544
|
-
{
|
|
545
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
546
|
-
"text": "A type or schema declared outside a component MUST stay in its file until another file needs it without using the code in that file.",
|
|
547
|
-
"hash": "e63d1fbcb8",
|
|
548
|
-
"kind": "eslint",
|
|
549
|
-
"ref": "pasika/type-extraction"
|
|
550
|
-
},
|
|
551
|
-
{
|
|
552
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
553
|
-
"text": "A type or schema used only to implement one configuration module MUST live in that module's types/ or schemas/ folder.",
|
|
554
|
-
"hash": "7a5f58f278",
|
|
555
|
-
"kind": "eslint",
|
|
556
|
-
"ref": "pasika/support-file-placement"
|
|
557
|
-
},
|
|
558
|
-
{
|
|
559
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
560
|
-
"text": "A types/ or schemas/ folder MUST either define its exports directly in index.ts or group related types and schemas in files that index.ts named-re-exports.",
|
|
561
|
-
"hash": "b13a973306",
|
|
562
|
-
"kind": "eslint",
|
|
563
|
-
"ref": "pasika/support-folder-shape"
|
|
564
|
-
},
|
|
565
|
-
{
|
|
566
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
567
|
-
"text": "Consumers MUST import an extracted type or schema through the index.ts in that type or schema's types/ or schemas/ folder.",
|
|
568
|
-
"hash": "24fb9c0774",
|
|
569
|
-
"kind": "eslint",
|
|
570
|
-
"ref": "pasika/import-through-index"
|
|
571
|
-
},
|
|
572
|
-
{
|
|
573
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
574
|
-
"text": "Extracted types and schemas MUST live in their matching types/ or schemas/ folder at the CCF of their consumers.",
|
|
575
|
-
"hash": "d8f89cd54a",
|
|
576
|
-
"kind": "eslint",
|
|
577
|
-
"ref": "pasika/support-file-placement"
|
|
578
|
-
},
|
|
579
|
-
{
|
|
580
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
581
|
-
"text": "Importing a type or schema alongside the component that defines it MUST NOT require extraction.",
|
|
582
|
-
"hash": "061a5c0936",
|
|
583
|
-
"kind": "permission",
|
|
584
|
-
"note": "the extraction check must not fire when the consumer also imports the component from that file"
|
|
585
|
-
},
|
|
586
|
-
{
|
|
587
|
-
"doc": "code-organization-guide/rules/types-and-schemas-rule.md",
|
|
588
|
-
"text": "When a type or schema's CCF is src/features/, it MUST move to src/types/ or src/schemas/.",
|
|
589
|
-
"hash": "c8fc7e7374",
|
|
590
|
-
"kind": "eslint",
|
|
591
|
-
"ref": "pasika/support-file-placement"
|
|
592
|
-
},
|
|
593
|
-
{
|
|
594
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
595
|
-
"text": "A pure function MUST be extracted to utils/, even when it has one consumer.",
|
|
596
|
-
"hash": "d49b4ce49a",
|
|
597
|
-
"kind": "eslint",
|
|
598
|
-
"ref": "pasika/pure-function-extract"
|
|
599
|
-
},
|
|
600
|
-
{
|
|
601
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
602
|
-
"text": "A utility MUST be imported directly without a barrel.",
|
|
603
|
-
"hash": "a3bd205f5c",
|
|
604
|
-
"kind": "eslint",
|
|
605
|
-
"ref": "pasika/no-util-barrel"
|
|
606
|
-
},
|
|
607
|
-
{
|
|
608
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
609
|
-
"text": "A utility file that exports one function MUST have a name in that function's kebab-case form.",
|
|
610
|
-
"hash": "9b82ca27ee",
|
|
611
|
-
"kind": "eslint",
|
|
612
|
-
"ref": "pasika/util-file-name"
|
|
613
|
-
},
|
|
614
|
-
{
|
|
615
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
616
|
-
"text": "A utility used only to implement one configuration module MUST live in that module's utils/ folder.",
|
|
617
|
-
"hash": "c9d890d2d7",
|
|
618
|
-
"kind": "eslint",
|
|
619
|
-
"ref": "pasika/support-file-placement"
|
|
620
|
-
},
|
|
621
|
-
{
|
|
622
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
623
|
-
"text": "An extracted utility MUST live in the utils/ folder at the CCF of its consumers.",
|
|
624
|
-
"hash": "bb1130ed9d",
|
|
625
|
-
"kind": "eslint",
|
|
626
|
-
"ref": "pasika/support-file-placement"
|
|
627
|
-
},
|
|
628
|
-
{
|
|
629
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
630
|
-
"text": "Utilities that are used together MAY be grouped in one file.",
|
|
631
|
-
"hash": "23f36f077b",
|
|
632
|
-
"kind": "permission"
|
|
633
|
-
},
|
|
634
|
-
{
|
|
635
|
-
"doc": "code-organization-guide/rules/utilities-rule.md",
|
|
636
|
-
"text": "When a utility's CCF is src/features/, it MUST move to src/utils/.",
|
|
637
|
-
"hash": "ff2b2398f3",
|
|
638
|
-
"kind": "eslint",
|
|
639
|
-
"ref": "pasika/support-file-placement"
|
|
640
|
-
},
|
|
641
|
-
{
|
|
642
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
643
|
-
"text": "A Guide MAY link Rules, References, Policy documents, and other Guides.",
|
|
644
|
-
"hash": "254850923a",
|
|
645
|
-
"kind": "permission",
|
|
646
|
-
"note": "docs-check no-cross-document-link exempts guides"
|
|
647
|
-
},
|
|
648
|
-
{
|
|
649
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
650
|
-
"text": "A Guide overview MUST contain one or two short descriptive sentences about the guide's scope and purpose, and MUST NOT contain instructions or links to other documentation.",
|
|
651
|
-
"hash": "694bfba1ab",
|
|
652
|
-
"kind": "eslint",
|
|
653
|
-
"ref": "pasika/overview-length, pasika/guide-overview-no-links"
|
|
654
|
-
},
|
|
655
|
-
{
|
|
656
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
657
|
-
"text": "A Guide whose steps use terms that a glossary Reference defines MUST link that Reference from its first step.",
|
|
658
|
-
"hash": "caef1018c4",
|
|
659
|
-
"kind": "eslint",
|
|
660
|
-
"ref": "pasika/glossary-term-linking",
|
|
661
|
-
"note": "docs-check: compare glossary terms against the guide's steps"
|
|
662
|
-
},
|
|
663
|
-
{
|
|
664
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
665
|
-
"text": "A Guide with support files MUST become a folder named the same as its entry-point file, without the .md extension.",
|
|
666
|
-
"hash": "26a4eb93d4",
|
|
667
|
-
"kind": "eslint",
|
|
668
|
-
"ref": "pasika/guide-folder-entry-point"
|
|
669
|
-
},
|
|
670
|
-
{
|
|
671
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
672
|
-
"text": "A Reference file that a Guide owns MUST live in a references/ subfolder inside the Guide's folder.",
|
|
673
|
-
"hash": "4efb50f75f",
|
|
674
|
-
"kind": "eslint",
|
|
675
|
-
"ref": "pasika/support-document-placement"
|
|
676
|
-
},
|
|
677
|
-
{
|
|
678
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
679
|
-
"text": "A Rule file that a Guide owns MUST live in a rules/ subfolder inside the Guide's folder.",
|
|
680
|
-
"hash": "73d2f1cc23",
|
|
681
|
-
"kind": "eslint",
|
|
682
|
-
"ref": "pasika/support-document-placement"
|
|
683
|
-
},
|
|
684
|
-
{
|
|
685
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
686
|
-
"text": "A step that links another Guide MUST link directly to the relevant How To section.",
|
|
687
|
-
"hash": "eade3a0166",
|
|
688
|
-
"kind": "eslint",
|
|
689
|
-
"ref": "pasika/guide-link-anchors",
|
|
690
|
-
"note": "docs-check: a guide link carries a How To anchor"
|
|
691
|
-
},
|
|
692
|
-
{
|
|
693
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
694
|
-
"text": "Each How To step MUST be concise and use one sentence.",
|
|
695
|
-
"hash": "5992821880",
|
|
696
|
-
"kind": "eslint",
|
|
697
|
-
"ref": "pasika/guide-step-single-sentence",
|
|
698
|
-
"note": "one sentence is checked; whether it is concise is judgment"
|
|
699
|
-
},
|
|
700
|
-
{
|
|
701
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
702
|
-
"text": "Each How To step MUST link at most one documentation file total, whatever kind that file is.",
|
|
703
|
-
"hash": "12585da0c8",
|
|
704
|
-
"kind": "eslint",
|
|
705
|
-
"ref": "pasika/guide-step-single-link"
|
|
706
|
-
},
|
|
707
|
-
{
|
|
708
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
709
|
-
"text": "Guide file names MUST match the document title in kebab-case and use the -guide suffix (e.g., foo-guide.md).",
|
|
710
|
-
"hash": "e820de2429",
|
|
711
|
-
"kind": "eslint",
|
|
712
|
-
"ref": "pasika/title-matches-file-name, pasika/doc-kind-suffix"
|
|
713
|
-
},
|
|
714
|
-
{
|
|
715
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
716
|
-
"text": "How To sections MUST NOT nest inside other How To sections.",
|
|
717
|
-
"hash": "23415cb949",
|
|
718
|
-
"kind": "eslint",
|
|
719
|
-
"ref": "pasika/no-nested-how-to",
|
|
720
|
-
"note": "docs-check: no heading nests inside a How To section"
|
|
721
|
-
},
|
|
722
|
-
{
|
|
723
|
-
"doc": "documentation-guide/rules/guide-creation-rule.md",
|
|
724
|
-
"text": "When a step links another document, the step MUST name the concrete decision or result the reader will have after reading it.",
|
|
725
|
-
"hash": "b38e3ef9c9",
|
|
726
|
-
"kind": "judgment",
|
|
727
|
-
"note": "whether a step names a concrete result is a reading judgment"
|
|
728
|
-
},
|
|
729
|
-
{
|
|
730
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
731
|
-
"text": "A Policy document MUST NOT contain Incorrect/Correct examples, and a requirement that a reader cannot apply without one MUST live in a Rule instead.",
|
|
732
|
-
"hash": "c1e046ec18",
|
|
733
|
-
"kind": "eslint",
|
|
734
|
-
"ref": "pasika/policy-no-examples"
|
|
735
|
-
},
|
|
736
|
-
{
|
|
737
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
738
|
-
"text": "A Policy document MUST NOT link to Rules, References, Guides, or other Policy documents.",
|
|
739
|
-
"hash": "483c98a275",
|
|
740
|
-
"kind": "eslint",
|
|
741
|
-
"ref": "pasika/no-cross-document-link"
|
|
742
|
-
},
|
|
743
|
-
{
|
|
744
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
745
|
-
"text": "A Policy document MUST group its bullets under a heading per subject.",
|
|
746
|
-
"hash": "fa77621dda",
|
|
747
|
-
"kind": "eslint",
|
|
748
|
-
"ref": "pasika/policy-subject-headings",
|
|
749
|
-
"note": "docs-check: every bullet sits under a subject heading"
|
|
750
|
-
},
|
|
751
|
-
{
|
|
752
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
753
|
-
"text": "A Policy document MUST state every requirement as a bullet that uses RFC 2119 vocabulary.",
|
|
754
|
-
"hash": "eff345fe21",
|
|
755
|
-
"kind": "eslint",
|
|
756
|
-
"ref": "pasika/requirement-present"
|
|
757
|
-
},
|
|
758
|
-
{
|
|
759
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
760
|
-
"text": "A Policy document MUST state requirements that apply to the whole repository and span two or more unrelated subjects.",
|
|
761
|
-
"hash": "689de34a0a",
|
|
762
|
-
"kind": "judgment",
|
|
763
|
-
"note": "deciding subjects are unrelated enough to share one document is an editorial call"
|
|
764
|
-
},
|
|
765
|
-
{
|
|
766
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
767
|
-
"text": "A Policy overview MUST contain one or two short sentences naming the scope the requirements apply to.",
|
|
768
|
-
"hash": "cd5ad978b1",
|
|
769
|
-
"kind": "eslint",
|
|
770
|
-
"ref": "pasika/overview-length"
|
|
771
|
-
},
|
|
772
|
-
{
|
|
773
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
774
|
-
"text": "A repository MUST NOT have more than one Policy document per audience.",
|
|
775
|
-
"hash": "74dd5ffc9e",
|
|
776
|
-
"kind": "eslint",
|
|
777
|
-
"ref": "pasika/policy-single-document"
|
|
778
|
-
},
|
|
779
|
-
{
|
|
780
|
-
"doc": "documentation-guide/rules/policy-creation-rule.md",
|
|
781
|
-
"text": "Policy file names MUST match the document title in kebab-case and use the -policy suffix (e.g., foo-policy.md).",
|
|
782
|
-
"hash": "e83fddcd78",
|
|
783
|
-
"kind": "eslint",
|
|
784
|
-
"ref": "pasika/title-matches-file-name, pasika/doc-kind-suffix"
|
|
785
|
-
},
|
|
786
|
-
{
|
|
787
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
788
|
-
"text": "A Reference MAY define terms that Rules, Guides, and Policy documents use.",
|
|
789
|
-
"hash": "0286f4b092",
|
|
790
|
-
"kind": "permission"
|
|
791
|
-
},
|
|
792
|
-
{
|
|
793
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
794
|
-
"text": "A Reference MAY name an RFC 2119 keyword as lookup content, because naming a keyword does not impose a requirement.",
|
|
795
|
-
"hash": "5e3305d40a",
|
|
796
|
-
"kind": "permission",
|
|
797
|
-
"note": "docs-check reference-no-rfc-vocabulary ignores code spans"
|
|
798
|
-
},
|
|
799
|
-
{
|
|
800
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
801
|
-
"text": "A Reference MUST NOT link to Rules, Guides, Policy documents, or other References.",
|
|
802
|
-
"hash": "50070e301c",
|
|
803
|
-
"kind": "eslint",
|
|
804
|
-
"ref": "pasika/no-cross-document-link"
|
|
805
|
-
},
|
|
806
|
-
{
|
|
807
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
808
|
-
"text": "A Reference MUST NOT state a constraint the reader has to satisfy, even in plain declarative wording, and a constraint the reader has to satisfy MUST live in a Rule.",
|
|
809
|
-
"hash": "36dfefa25c",
|
|
810
|
-
"kind": "judgment",
|
|
811
|
-
"note": "recognizing a constraint stated as description requires reading it as a reader would"
|
|
812
|
-
},
|
|
813
|
-
{
|
|
814
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
815
|
-
"text": "A Reference MUST NOT use RFC 2119 vocabulary (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY), because lookup material describes what exists rather than imposing requirements.",
|
|
816
|
-
"hash": "b06563ebdb",
|
|
817
|
-
"kind": "eslint",
|
|
818
|
-
"ref": "pasika/reference-no-rfc-vocabulary"
|
|
819
|
-
},
|
|
820
|
-
{
|
|
821
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
822
|
-
"text": "A Reference overview and the overview of each headed lookup block MUST contain one or two short sentences.",
|
|
823
|
-
"hash": "829df330c7",
|
|
824
|
-
"kind": "eslint",
|
|
825
|
-
"ref": "pasika/overview-length"
|
|
826
|
-
},
|
|
827
|
-
{
|
|
828
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
829
|
-
"text": "A Reference with a single lookup block MUST NOT add a section heading for it.",
|
|
830
|
-
"hash": "a599ad8306",
|
|
831
|
-
"kind": "eslint",
|
|
832
|
-
"ref": "pasika/reference-block-headings"
|
|
833
|
-
},
|
|
834
|
-
{
|
|
835
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
836
|
-
"text": "A Reference with two or more lookup blocks MUST add a section heading for every block, including the first.",
|
|
837
|
-
"hash": "8c8152f907",
|
|
838
|
-
"kind": "eslint",
|
|
839
|
-
"ref": "pasika/reference-block-headings"
|
|
840
|
-
},
|
|
841
|
-
{
|
|
842
|
-
"doc": "documentation-guide/rules/reference-creation-rule.md",
|
|
843
|
-
"text": "Reference file names MUST match the document title in kebab-case and use the -reference suffix (e.g., foo-reference.md).",
|
|
844
|
-
"hash": "8aae1d6156",
|
|
845
|
-
"kind": "eslint",
|
|
846
|
-
"ref": "pasika/title-matches-file-name, pasika/doc-kind-suffix"
|
|
847
|
-
},
|
|
848
|
-
{
|
|
849
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
850
|
-
"text": "A Rule MAY contain multiple Incorrect/Correct pairs.",
|
|
851
|
-
"hash": "f6d4ce8fa7",
|
|
852
|
-
"kind": "permission"
|
|
853
|
-
},
|
|
854
|
-
{
|
|
855
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
856
|
-
"text": "A Rule MUST NOT link to References, Guides, or other Rules.",
|
|
857
|
-
"hash": "bda91d953c",
|
|
858
|
-
"kind": "eslint",
|
|
859
|
-
"ref": "pasika/no-cross-document-link"
|
|
860
|
-
},
|
|
861
|
-
{
|
|
862
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
863
|
-
"text": "A Rule MUST contain at least one Incorrect/Correct pair.",
|
|
864
|
-
"hash": "099da63c35",
|
|
865
|
-
"kind": "eslint",
|
|
866
|
-
"ref": "pasika/rule-paired-examples"
|
|
867
|
-
},
|
|
868
|
-
{
|
|
869
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
870
|
-
"text": "A Rule MUST contain at least one bullet point that uses RFC 2119 vocabulary (MUST, MUST NOT, SHOULD, SHOULD NOT, MAY).",
|
|
871
|
-
"hash": "2cfcc88337",
|
|
872
|
-
"kind": "eslint",
|
|
873
|
-
"ref": "pasika/requirement-present"
|
|
874
|
-
},
|
|
875
|
-
{
|
|
876
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
877
|
-
"text": "A Rule MUST state requirements about one subject.",
|
|
878
|
-
"hash": "5385606287",
|
|
879
|
-
"kind": "judgment",
|
|
880
|
-
"note": "deciding requirements share one subject is an editorial call"
|
|
881
|
-
},
|
|
882
|
-
{
|
|
883
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
884
|
-
"text": "A Rule overview MUST contain one or two short sentences naming the problem the rule solves.",
|
|
885
|
-
"hash": "ab67bac18e",
|
|
886
|
-
"kind": "eslint",
|
|
887
|
-
"ref": "pasika/overview-length"
|
|
888
|
-
},
|
|
889
|
-
{
|
|
890
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
891
|
-
"text": "A bullet MUST NOT define a term, and a term a reader needs in order to apply the Rule MUST be defined in a Reference instead.",
|
|
892
|
-
"hash": "26f85889e2",
|
|
893
|
-
"kind": "judgment",
|
|
894
|
-
"note": "recognizing a bullet as a definition rather than a demand is a reading judgment"
|
|
895
|
-
},
|
|
896
|
-
{
|
|
897
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
898
|
-
"text": "A bullet MUST use MUST or MUST NOT only when the requirement admits no exception, and SHOULD or SHOULD NOT only when exceptions are possible.",
|
|
899
|
-
"hash": "67e994bec5",
|
|
900
|
-
"kind": "judgment",
|
|
901
|
-
"note": "matching a keyword's strength to the requirement's intent is a reading judgment"
|
|
902
|
-
},
|
|
903
|
-
{
|
|
904
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
905
|
-
"text": "An Incorrect/Correct pair MUST add a concise description after an em dash in both headings, so readers can scan the examples by decision.",
|
|
906
|
-
"hash": "001ce1c18c",
|
|
907
|
-
"kind": "eslint",
|
|
908
|
-
"ref": "pasika/example-heading-description"
|
|
909
|
-
},
|
|
910
|
-
{
|
|
911
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
912
|
-
"text": "Prose outside bullet points — intros, Why: explanations, table cells, and code comments — MUST restate a requirement in plain language instead of repeating RFC 2119 vocabulary.",
|
|
913
|
-
"hash": "961d7db3b9",
|
|
914
|
-
"kind": "eslint",
|
|
915
|
-
"ref": "pasika/rfc-only-in-bullets",
|
|
916
|
-
"note": "docs-check: RFC 2119 vocabulary appears only in bullets"
|
|
917
|
-
},
|
|
918
|
-
{
|
|
919
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
920
|
-
"text": "RFC 2119 vocabulary MUST appear only in bullet points, so the bullet list is the single place a requirement is stated.",
|
|
921
|
-
"hash": "e68233ce8b",
|
|
922
|
-
"kind": "eslint",
|
|
923
|
-
"ref": "pasika/rfc-only-in-bullets",
|
|
924
|
-
"note": "docs-check: RFC 2119 vocabulary appears only in bullets"
|
|
925
|
-
},
|
|
926
|
-
{
|
|
927
|
-
"doc": "documentation-guide/rules/rule-creation-rule.md",
|
|
928
|
-
"text": "Rule file names MUST match the document title in kebab-case and use the -rule suffix (e.g., foo-rule.md).",
|
|
929
|
-
"hash": "58b18e4f61",
|
|
930
|
-
"kind": "eslint",
|
|
931
|
-
"ref": "pasika/title-matches-file-name, pasika/doc-kind-suffix"
|
|
932
|
-
},
|
|
933
|
-
{
|
|
934
|
-
"doc": "documentation-guide/rules/template-usage-rule.md",
|
|
935
|
-
"text": "Authors MUST delete template branches that do not apply to the document being written.",
|
|
936
|
-
"hash": "dbe2070bf9",
|
|
937
|
-
"kind": "judgment",
|
|
938
|
-
"note": "an unused branch is only recognizable by comparing against the template"
|
|
939
|
-
},
|
|
940
|
-
{
|
|
941
|
-
"doc": "documentation-guide/rules/template-usage-rule.md",
|
|
942
|
-
"text": "Authors MUST replace each bracketed prompt with the final title, explanation, step, or lookup content it asks for.",
|
|
943
|
-
"hash": "7e7db98db0",
|
|
944
|
-
"kind": "eslint",
|
|
945
|
-
"ref": "pasika/no-template-prompt"
|
|
946
|
-
},
|
|
947
|
-
{
|
|
948
|
-
"doc": "documentation-guide/rules/template-usage-rule.md",
|
|
949
|
-
"text": "Authors MUST start from the template that matches the chosen document kind and structure.",
|
|
950
|
-
"hash": "08faa3cb70",
|
|
951
|
-
"kind": "judgment",
|
|
952
|
-
"note": "which template an author started from is not recorded in the result"
|
|
953
|
-
},
|
|
954
|
-
{
|
|
955
|
-
"doc": "documentation-guide/rules/template-usage-rule.md",
|
|
956
|
-
"text": "Documentation support assets MAY live in folders whose names start with an underscore.",
|
|
957
|
-
"hash": "faeb62c465",
|
|
958
|
-
"kind": "permission",
|
|
959
|
-
"note": "the documentation parser skips folders whose names start with an underscore"
|
|
960
|
-
},
|
|
961
|
-
{
|
|
962
|
-
"doc": "styling-guide/rules/arbitrary-value-rule.md",
|
|
963
|
-
"text": "Components MUST NOT use arbitrary-value classes for project styling. They MUST use an existing Tailwind or project utility, or define a project token or custom utility first.",
|
|
964
|
-
"hash": "426116116d",
|
|
965
|
-
"kind": "eslint",
|
|
966
|
-
"ref": "pasika/no-arbitrary-tailwind"
|
|
967
|
-
},
|
|
968
|
-
{
|
|
969
|
-
"doc": "styling-guide/rules/class-composition-rule.md",
|
|
970
|
-
"text": "A className passed to a component MUST contain only outer-layout utilities: margins, sizing, flex or grid item placement, and z-index.",
|
|
971
|
-
"hash": "a84eca1927",
|
|
972
|
-
"kind": "eslint",
|
|
973
|
-
"ref": "pasika/enforce-cn-merge"
|
|
974
|
-
},
|
|
975
|
-
{
|
|
976
|
-
"doc": "styling-guide/rules/class-composition-rule.md",
|
|
977
|
-
"text": "A component MUST expose its supported appearance and size variants through typed props, not through a passed className or separate class-name props for internal elements.",
|
|
978
|
-
"hash": "294fb0dbae",
|
|
979
|
-
"kind": "eslint",
|
|
980
|
-
"ref": "pasika/enforce-cn-merge"
|
|
981
|
-
},
|
|
982
|
-
{
|
|
983
|
-
"doc": "styling-guide/rules/class-composition-rule.md",
|
|
984
|
-
"text": "A static class list with more than five class names MUST use cn with multiple string literals, each grouped by styling concern and containing no more than five class names.",
|
|
985
|
-
"hash": "2c58fa578d",
|
|
986
|
-
"kind": "eslint",
|
|
987
|
-
"ref": "pasika/enforce-cn-merge"
|
|
988
|
-
},
|
|
989
|
-
{
|
|
990
|
-
"doc": "styling-guide/rules/class-composition-rule.md",
|
|
991
|
-
"text": "Components MUST NOT concatenate class strings with template literals or + when any part is conditional.",
|
|
992
|
-
"hash": "3afbe2697b",
|
|
993
|
-
"kind": "eslint",
|
|
994
|
-
"ref": "pasika/enforce-cn-merge"
|
|
995
|
-
},
|
|
996
|
-
{
|
|
997
|
-
"doc": "styling-guide/rules/class-composition-rule.md",
|
|
998
|
-
"text": "Components MUST use cn or the project's equivalent class-merging helper for conditional classes and a className passed to the component.",
|
|
999
|
-
"hash": "ecc15933e6",
|
|
1000
|
-
"kind": "eslint",
|
|
1001
|
-
"ref": "pasika/enforce-cn-merge",
|
|
1002
|
-
"note": "detects + and template literals; a conditional expression without cn is not detected"
|
|
1003
|
-
},
|
|
1004
|
-
{
|
|
1005
|
-
"doc": "styling-guide/rules/component-ui-state-rule.md",
|
|
1006
|
-
"text": "A component MUST express a UI state through the native element, attribute, or ARIA state for it and MUST NOT use a custom equivalent.",
|
|
1007
|
-
"hash": "bb3c5b82cd",
|
|
1008
|
-
"kind": "eslint",
|
|
1009
|
-
"ref": "pasika/ui-state"
|
|
1010
|
-
},
|
|
1011
|
-
{
|
|
1012
|
-
"doc": "styling-guide/rules/component-ui-state-rule.md",
|
|
1013
|
-
"text": "A component MUST own a distinguishable appearance for every UI state it supports.",
|
|
1014
|
-
"hash": "fae776da92",
|
|
1015
|
-
"kind": "judgment",
|
|
1016
|
-
"note": "whether every supported state looks distinguishable is a visual judgment"
|
|
1017
|
-
},
|
|
1018
|
-
{
|
|
1019
|
-
"doc": "styling-guide/rules/component-ui-state-rule.md",
|
|
1020
|
-
"text": "A component MUST use Tailwind \"state variants\" when they can express a supported UI state.",
|
|
1021
|
-
"hash": "0f6c3bb7ed",
|
|
1022
|
-
"kind": "eslint",
|
|
1023
|
-
"ref": "pasika/ui-state"
|
|
1024
|
-
},
|
|
1025
|
-
{
|
|
1026
|
-
"doc": "styling-guide/rules/component-variant-rule.md",
|
|
1027
|
-
"text": "A boolean prop that changes appearance MUST use a CVA variant when both boolean values have explicit treatments or when the boolean participates in a compound variant.",
|
|
1028
|
-
"hash": "3393d959ca",
|
|
1029
|
-
"kind": "eslint",
|
|
1030
|
-
"ref": "pasika/cva-boolean-variants"
|
|
1031
|
-
},
|
|
1032
|
-
{
|
|
1033
|
-
"doc": "styling-guide/rules/component-variant-rule.md",
|
|
1034
|
-
"text": "A boolean prop that changes appearance MUST use conditional cn() when it only adds or removes one standalone class treatment.",
|
|
1035
|
-
"hash": "c1fc4dacbd",
|
|
1036
|
-
"kind": "eslint",
|
|
1037
|
-
"ref": "pasika/cva-boolean-variants"
|
|
1038
|
-
},
|
|
1039
|
-
{
|
|
1040
|
-
"doc": "styling-guide/rules/component-variant-rule.md",
|
|
1041
|
-
"text": "A component that lets callers choose visual options MUST define them with cva.",
|
|
1042
|
-
"hash": "8162f16933",
|
|
1043
|
-
"kind": "eslint",
|
|
1044
|
-
"ref": "pasika/cva-appearance-props"
|
|
1045
|
-
},
|
|
1046
|
-
{
|
|
1047
|
-
"doc": "styling-guide/rules/component-variant-rule.md",
|
|
1048
|
-
"text": "A component's variant prop types MUST be derived from its cva definition with VariantProps rather than manually duplicated unions.",
|
|
1049
|
-
"hash": "c9d1cf136c",
|
|
1050
|
-
"kind": "eslint",
|
|
1051
|
-
"ref": "pasika/enforce-cva-variant-props"
|
|
1052
|
-
},
|
|
1053
|
-
{
|
|
1054
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1055
|
-
"text": "A repository MUST have one global stylesheet entry point that registers Tailwind.",
|
|
1056
|
-
"hash": "4f548b26c4",
|
|
1057
|
-
"kind": "doctor",
|
|
1058
|
-
"ref": "pasika/global-stylesheet"
|
|
1059
|
-
},
|
|
1060
|
-
{
|
|
1061
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1062
|
-
"text": "Every value used for the project's styling MUST be defined as a CSS variable in :root, even when no theme selector overrides it. A Tailwind theme variable MUST reference that CSS variable through @theme inline.",
|
|
1063
|
-
"hash": "d89d54996c",
|
|
1064
|
-
"kind": "eslint",
|
|
1065
|
-
"ref": "pasika/root-variables"
|
|
1066
|
-
},
|
|
1067
|
-
{
|
|
1068
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1069
|
-
"text": "Style declarations added by the project inside global selectors MUST use @apply.",
|
|
1070
|
-
"hash": "9799ce3761",
|
|
1071
|
-
"kind": "eslint",
|
|
1072
|
-
"ref": "pasika/apply-usage"
|
|
1073
|
-
},
|
|
1074
|
-
{
|
|
1075
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1076
|
-
"text": "The global base layer MUST apply base-canvas and base-ink to the document body as the default page pair.",
|
|
1077
|
-
"hash": "a3b7faf6da",
|
|
1078
|
-
"kind": "eslint",
|
|
1079
|
-
"ref": "pasika/base-layer-pair"
|
|
1080
|
-
},
|
|
1081
|
-
{
|
|
1082
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1083
|
-
"text": "The global stylesheet MUST order imports, @custom-variant definitions, :root variables and the selectors that override them, @theme definitions, custom utilities, base styles, and keyframes in that order.",
|
|
1084
|
-
"hash": "d483eb365b",
|
|
1085
|
-
"kind": "eslint",
|
|
1086
|
-
"ref": "pasika/stylesheet-ordering"
|
|
1087
|
-
},
|
|
1088
|
-
{
|
|
1089
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1090
|
-
"text": "The global stylesheet MUST reset Tailwind's default theme with --*: initial.",
|
|
1091
|
-
"hash": "d28608a7a3",
|
|
1092
|
-
"kind": "eslint",
|
|
1093
|
-
"ref": "pasika/theme-reset"
|
|
1094
|
-
},
|
|
1095
|
-
{
|
|
1096
|
-
"doc": "styling-guide/rules/global-stylesheet-rule.md",
|
|
1097
|
-
"text": "The project's global CSS MUST live in the global stylesheet entry point and MUST NOT be imported from another file.",
|
|
1098
|
-
"hash": "dce78502d3",
|
|
1099
|
-
"kind": "eslint",
|
|
1100
|
-
"ref": "pasika/global-css-location"
|
|
1101
|
-
},
|
|
1102
|
-
{
|
|
1103
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1104
|
-
"text": "A CSS variable intended only for a background MUST be named --<role>-canvas, and one intended only for readable text MUST be named --<role>-ink. When a named custom utility exposes one of those values by itself, it MUST use bg-<role>-canvas or text-<role>-ink.",
|
|
1105
|
-
"hash": "0fb98de16d",
|
|
1106
|
-
"kind": "eslint",
|
|
1107
|
-
"ref": "pasika/css-variable-naming"
|
|
1108
|
-
},
|
|
1109
|
-
{
|
|
1110
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1111
|
-
"text": "A custom utility MUST use @apply for every styling declaration added by the project. When no named built-in utility represents a property value, it MUST apply the Tailwind custom-property or arbitrary-property utility instead.",
|
|
1112
|
-
"hash": "a61de0650b",
|
|
1113
|
-
"kind": "eslint",
|
|
1114
|
-
"ref": "pasika/custom-utility-apply"
|
|
1115
|
-
},
|
|
1116
|
-
{
|
|
1117
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1118
|
-
"text": "A repeated combination of canvas, ink, and related styles MUST become a *-surface custom Tailwind utility that owns the combination.",
|
|
1119
|
-
"hash": "0d965db624",
|
|
1120
|
-
"kind": "eslint",
|
|
1121
|
-
"ref": "pasika/surface-utility"
|
|
1122
|
-
},
|
|
1123
|
-
{
|
|
1124
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1125
|
-
"text": "A style or group of styles that two or more components use together and should change together MUST become one named custom utility. The group MAY include utilities generated by theme variables, built-in utilities, other custom utilities, and interaction styles.",
|
|
1126
|
-
"hash": "9cf4c454fb",
|
|
1127
|
-
"kind": "eslint",
|
|
1128
|
-
"ref": "pasika/shared-style-dedup"
|
|
1129
|
-
},
|
|
1130
|
-
{
|
|
1131
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1132
|
-
"text": "A value that needs at least two utility classes from the same Tailwind theme-variable namespace MUST use that namespace and have the same name in :root.",
|
|
1133
|
-
"hash": "d9b8eeb83d",
|
|
1134
|
-
"kind": "eslint",
|
|
1135
|
-
"ref": "pasika/theme-variable-namespace"
|
|
1136
|
-
},
|
|
1137
|
-
{
|
|
1138
|
-
"doc": "styling-guide/rules/theme-and-utility-definition-rule.md",
|
|
1139
|
-
"text": "Styling used by only one component MUST stay in that component file as static Tailwind utility classes and MUST NOT be moved to the global stylesheet.",
|
|
1140
|
-
"hash": "50f1692be2",
|
|
1141
|
-
"kind": "eslint",
|
|
1142
|
-
"ref": "pasika/shared-style-dedup"
|
|
1143
|
-
}
|
|
1144
|
-
]
|
|
1145
|
-
}
|