@goodbones/core 0.1.0-beta.1 → 0.1.0-beta.10
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/build/dts/core/campaigns.d.ts +141 -0
- package/build/dts/core/campaigns.d.ts.map +1 -0
- package/build/dts/core/coverage.d.ts +20 -0
- package/build/dts/core/coverage.d.ts.map +1 -1
- package/build/dts/core/graph.d.ts +2 -0
- package/build/dts/core/graph.d.ts.map +1 -1
- package/build/dts/core/imports.d.ts +3 -1
- package/build/dts/core/imports.d.ts.map +1 -1
- package/build/dts/core/ledger.d.ts +61 -0
- package/build/dts/core/ledger.d.ts.map +1 -0
- package/build/dts/core/slack.d.ts +22 -0
- package/build/dts/core/slack.d.ts.map +1 -0
- package/build/dts/core/structure.d.ts +1 -0
- package/build/dts/core/structure.d.ts.map +1 -1
- package/build/dts/domain/architecture-config.d.ts +324 -1
- package/build/dts/domain/architecture-config.d.ts.map +1 -1
- package/build/dts/domain/architecture-error.d.ts +8 -0
- package/build/dts/domain/architecture-error.d.ts.map +1 -1
- package/build/dts/domain/facts.d.ts +1 -0
- package/build/dts/domain/facts.d.ts.map +1 -1
- package/build/dts/domain/manifest-location.d.ts +9 -0
- package/build/dts/domain/manifest-location.d.ts.map +1 -0
- package/build/dts/domain/report.d.ts +16 -0
- package/build/dts/domain/report.d.ts.map +1 -0
- package/build/dts/domain/snapshot.d.ts +224 -0
- package/build/dts/domain/snapshot.d.ts.map +1 -0
- package/build/dts/domain/violation.d.ts +1 -1
- package/build/dts/domain/violation.d.ts.map +1 -1
- package/build/dts/index.d.ts +24 -9
- package/build/dts/index.d.ts.map +1 -1
- package/build/dts/infrastructure/campaign-functions.d.ts +7 -0
- package/build/dts/infrastructure/campaign-functions.d.ts.map +1 -0
- package/build/dts/infrastructure/manifest-file.d.ts +11 -2
- package/build/dts/infrastructure/manifest-file.d.ts.map +1 -1
- package/build/dts/infrastructure/manifest-include.d.ts +16 -0
- package/build/dts/infrastructure/manifest-include.d.ts.map +1 -0
- package/build/dts/infrastructure/report-source-fake.d.ts +4 -0
- package/build/dts/infrastructure/report-source-fake.d.ts.map +1 -0
- package/build/dts/infrastructure/report-source-live.d.ts +3 -0
- package/build/dts/infrastructure/report-source-live.d.ts.map +1 -0
- package/build/dts/infrastructure/syntax-matcher-fake.d.ts +10 -0
- package/build/dts/infrastructure/syntax-matcher-fake.d.ts.map +1 -0
- package/build/dts/infrastructure/walk.d.ts +6 -0
- package/build/dts/infrastructure/walk.d.ts.map +1 -1
- package/build/dts/load/policy.d.ts +16 -0
- package/build/dts/load/policy.d.ts.map +1 -1
- package/build/dts/manifest/compile.d.ts +7 -2
- package/build/dts/manifest/compile.d.ts.map +1 -1
- package/build/dts/manifest/expand.d.ts +27 -0
- package/build/dts/manifest/expand.d.ts.map +1 -0
- package/build/dts/manifest/infer.d.ts +55 -0
- package/build/dts/manifest/infer.d.ts.map +1 -0
- package/build/dts/manifest/json-schema.d.ts +10 -0
- package/build/dts/manifest/json-schema.d.ts.map +1 -0
- package/build/dts/manifest/manifest.d.ts +381 -1
- package/build/dts/manifest/manifest.d.ts.map +1 -1
- package/build/dts/ports/campaign-predicate.d.ts +24 -0
- package/build/dts/ports/campaign-predicate.d.ts.map +1 -0
- package/build/dts/ports/language.d.ts +4 -0
- package/build/dts/ports/language.d.ts.map +1 -1
- package/build/dts/ports/report-source.d.ts +14 -0
- package/build/dts/ports/report-source.d.ts.map +1 -0
- package/build/dts/ports/syntax-matcher.d.ts +21 -0
- package/build/dts/ports/syntax-matcher.d.ts.map +1 -0
- package/build/dts/testing.d.ts +2 -0
- package/build/dts/testing.d.ts.map +1 -1
- package/build/esm/core/campaigns.js +778 -0
- package/build/esm/core/campaigns.js.map +1 -0
- package/build/esm/core/coverage.js +107 -32
- package/build/esm/core/coverage.js.map +1 -1
- package/build/esm/core/graph.js +45 -0
- package/build/esm/core/graph.js.map +1 -1
- package/build/esm/core/imports.js +14 -9
- package/build/esm/core/imports.js.map +1 -1
- package/build/esm/core/ledger.js +171 -0
- package/build/esm/core/ledger.js.map +1 -0
- package/build/esm/core/slack.js +76 -0
- package/build/esm/core/slack.js.map +1 -0
- package/build/esm/core/structure.js +5 -2
- package/build/esm/core/structure.js.map +1 -1
- package/build/esm/domain/architecture-config.js +158 -1
- package/build/esm/domain/architecture-config.js.map +1 -1
- package/build/esm/domain/architecture-error.js +27 -0
- package/build/esm/domain/architecture-error.js.map +1 -1
- package/build/esm/domain/manifest-location.js +21 -0
- package/build/esm/domain/manifest-location.js.map +1 -0
- package/build/esm/domain/report.js +168 -0
- package/build/esm/domain/report.js.map +1 -0
- package/build/esm/domain/snapshot.js +141 -0
- package/build/esm/domain/snapshot.js.map +1 -0
- package/build/esm/domain/violation.js.map +1 -1
- package/build/esm/index.js +21 -8
- package/build/esm/index.js.map +1 -1
- package/build/esm/infrastructure/campaign-functions.js +67 -0
- package/build/esm/infrastructure/campaign-functions.js.map +1 -0
- package/build/esm/infrastructure/manifest-file.js +158 -7
- package/build/esm/infrastructure/manifest-file.js.map +1 -1
- package/build/esm/infrastructure/manifest-include.js +187 -0
- package/build/esm/infrastructure/manifest-include.js.map +1 -0
- package/build/esm/infrastructure/report-source-fake.js +6 -0
- package/build/esm/infrastructure/report-source-fake.js.map +1 -0
- package/build/esm/infrastructure/report-source-live.js +165 -0
- package/build/esm/infrastructure/report-source-live.js.map +1 -0
- package/build/esm/infrastructure/syntax-matcher-fake.js +33 -0
- package/build/esm/infrastructure/syntax-matcher-fake.js.map +1 -0
- package/build/esm/infrastructure/walk.js +57 -1
- package/build/esm/infrastructure/walk.js.map +1 -1
- package/build/esm/load/policy.js +123 -3
- package/build/esm/load/policy.js.map +1 -1
- package/build/esm/manifest/compile.js +228 -26
- package/build/esm/manifest/compile.js.map +1 -1
- package/build/esm/manifest/expand.js +116 -0
- package/build/esm/manifest/expand.js.map +1 -0
- package/build/esm/manifest/infer.js +455 -0
- package/build/esm/manifest/infer.js.map +1 -0
- package/build/esm/manifest/json-schema.js +135 -0
- package/build/esm/manifest/json-schema.js.map +1 -0
- package/build/esm/manifest/manifest.js +243 -5
- package/build/esm/manifest/manifest.js.map +1 -1
- package/build/esm/ports/campaign-predicate.js +2 -0
- package/build/esm/ports/campaign-predicate.js.map +1 -0
- package/build/esm/ports/report-source.js +7 -0
- package/build/esm/ports/report-source.js.map +1 -0
- package/build/esm/ports/syntax-matcher.js +12 -0
- package/build/esm/ports/syntax-matcher.js.map +1 -0
- package/build/esm/testing.js +2 -0
- package/build/esm/testing.js.map +1 -1
- package/package.json +9 -3
- package/schema/architecture-node.schema.json +2405 -0
- package/schema/architecture.schema.json +2825 -0
- package/schema/conformance.schema.json +775 -0
- package/src/core/campaigns.ts +1056 -0
- package/src/core/coverage.ts +164 -34
- package/src/core/graph.ts +48 -0
- package/src/core/imports.ts +29 -13
- package/src/core/ledger.ts +242 -0
- package/src/core/slack.ts +135 -0
- package/src/core/structure.ts +10 -5
- package/src/domain/architecture-config.ts +205 -1
- package/src/domain/architecture-error.ts +30 -0
- package/src/domain/facts.ts +9 -4
- package/src/domain/manifest-location.ts +41 -0
- package/src/domain/report.ts +203 -0
- package/src/domain/snapshot.ts +302 -0
- package/src/domain/violation.ts +4 -1
- package/src/index.ts +172 -3
- package/src/infrastructure/campaign-functions.ts +98 -0
- package/src/infrastructure/manifest-file.ts +204 -8
- package/src/infrastructure/manifest-include.ts +318 -0
- package/src/infrastructure/report-source-fake.ts +10 -0
- package/src/infrastructure/report-source-live.ts +192 -0
- package/src/infrastructure/syntax-matcher-fake.ts +51 -0
- package/src/infrastructure/walk.ts +70 -1
- package/src/load/policy.ts +193 -3
- package/src/manifest/compile.ts +290 -28
- package/src/manifest/expand.ts +183 -0
- package/src/manifest/infer.ts +643 -0
- package/src/manifest/json-schema.ts +168 -0
- package/src/manifest/manifest.ts +339 -11
- package/src/ports/campaign-predicate.ts +30 -0
- package/src/ports/language.ts +17 -0
- package/src/ports/report-source.ts +35 -0
- package/src/ports/syntax-matcher.ts +42 -0
- package/src/testing.ts +2 -0
|
@@ -0,0 +1,775 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://dataquail.github.io/goodbones/schema/conformance.schema.json",
|
|
4
|
+
"title": "Conformance snapshot",
|
|
5
|
+
"description": "How far a repository's tree is from its architecture manifest, as `architecture conformance --json` reports it. See https://dataquail.github.io/goodbones/architecture-rules/enforcement/conformance/.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": {
|
|
9
|
+
"type": "number",
|
|
10
|
+
"enum": [
|
|
11
|
+
1
|
|
12
|
+
],
|
|
13
|
+
"description": "The shape of this document."
|
|
14
|
+
},
|
|
15
|
+
"manifest": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"path": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "The file the policy was read from — the root file, when split with `include`."
|
|
21
|
+
},
|
|
22
|
+
"sha256": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "A hash of that file's bytes, so two snapshots can say whether the policy changed between them."
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"required": [
|
|
28
|
+
"path",
|
|
29
|
+
"sha256"
|
|
30
|
+
],
|
|
31
|
+
"additionalProperties": false,
|
|
32
|
+
"description": "The policy this snapshot was taken against — the repository's own, or the one `--against` named."
|
|
33
|
+
},
|
|
34
|
+
"roots": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"description": "Repo-relative, with forward slashes."
|
|
39
|
+
},
|
|
40
|
+
"description": "The directories walked."
|
|
41
|
+
},
|
|
42
|
+
"files": {
|
|
43
|
+
"type": "number",
|
|
44
|
+
"allOf": [
|
|
45
|
+
{
|
|
46
|
+
"description": "Files walked."
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"ok": {
|
|
51
|
+
"type": "boolean",
|
|
52
|
+
"description": "What `check` would exit with: true when no reportable violation, unresolved import, stale baseline entry or coverage shortfall exists."
|
|
53
|
+
},
|
|
54
|
+
"coverage": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"properties": {
|
|
57
|
+
"imports": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"properties": {
|
|
60
|
+
"covered": {
|
|
61
|
+
"type": "number",
|
|
62
|
+
"allOf": [
|
|
63
|
+
{
|
|
64
|
+
"description": "Files this family reaches."
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"total": {
|
|
69
|
+
"type": "number",
|
|
70
|
+
"allOf": [
|
|
71
|
+
{
|
|
72
|
+
"description": "Files walked."
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"floor": {
|
|
77
|
+
"type": "number",
|
|
78
|
+
"allOf": [
|
|
79
|
+
{
|
|
80
|
+
"description": "The fraction the manifest's `limits.coverage` states for this family, when it states one."
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"required": [
|
|
86
|
+
"covered",
|
|
87
|
+
"total"
|
|
88
|
+
],
|
|
89
|
+
"additionalProperties": false
|
|
90
|
+
},
|
|
91
|
+
"structure": {
|
|
92
|
+
"type": "object",
|
|
93
|
+
"properties": {
|
|
94
|
+
"covered": {
|
|
95
|
+
"type": "number",
|
|
96
|
+
"allOf": [
|
|
97
|
+
{
|
|
98
|
+
"description": "Files this family reaches."
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"total": {
|
|
103
|
+
"type": "number",
|
|
104
|
+
"allOf": [
|
|
105
|
+
{
|
|
106
|
+
"description": "Files walked."
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
"floor": {
|
|
111
|
+
"type": "number",
|
|
112
|
+
"allOf": [
|
|
113
|
+
{
|
|
114
|
+
"description": "The fraction the manifest's `limits.coverage` states for this family, when it states one."
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": [
|
|
120
|
+
"covered",
|
|
121
|
+
"total"
|
|
122
|
+
],
|
|
123
|
+
"additionalProperties": false
|
|
124
|
+
},
|
|
125
|
+
"members": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"properties": {
|
|
128
|
+
"covered": {
|
|
129
|
+
"type": "number",
|
|
130
|
+
"allOf": [
|
|
131
|
+
{
|
|
132
|
+
"description": "Files this family reaches."
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"total": {
|
|
137
|
+
"type": "number",
|
|
138
|
+
"allOf": [
|
|
139
|
+
{
|
|
140
|
+
"description": "Files walked."
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
"floor": {
|
|
145
|
+
"type": "number",
|
|
146
|
+
"allOf": [
|
|
147
|
+
{
|
|
148
|
+
"description": "The fraction the manifest's `limits.coverage` states for this family, when it states one."
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"required": [
|
|
154
|
+
"covered",
|
|
155
|
+
"total"
|
|
156
|
+
],
|
|
157
|
+
"additionalProperties": false
|
|
158
|
+
},
|
|
159
|
+
"surface": {
|
|
160
|
+
"type": "object",
|
|
161
|
+
"properties": {
|
|
162
|
+
"covered": {
|
|
163
|
+
"type": "number",
|
|
164
|
+
"allOf": [
|
|
165
|
+
{
|
|
166
|
+
"description": "Files this family reaches."
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"total": {
|
|
171
|
+
"type": "number",
|
|
172
|
+
"allOf": [
|
|
173
|
+
{
|
|
174
|
+
"description": "Files walked."
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
"floor": {
|
|
179
|
+
"type": "number",
|
|
180
|
+
"allOf": [
|
|
181
|
+
{
|
|
182
|
+
"description": "The fraction the manifest's `limits.coverage` states for this family, when it states one."
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"required": [
|
|
188
|
+
"covered",
|
|
189
|
+
"total"
|
|
190
|
+
],
|
|
191
|
+
"additionalProperties": false
|
|
192
|
+
},
|
|
193
|
+
"graph": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"properties": {
|
|
196
|
+
"covered": {
|
|
197
|
+
"type": "number",
|
|
198
|
+
"allOf": [
|
|
199
|
+
{
|
|
200
|
+
"description": "Files this family reaches."
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
},
|
|
204
|
+
"total": {
|
|
205
|
+
"type": "number",
|
|
206
|
+
"allOf": [
|
|
207
|
+
{
|
|
208
|
+
"description": "Files walked."
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
"floor": {
|
|
213
|
+
"type": "number",
|
|
214
|
+
"allOf": [
|
|
215
|
+
{
|
|
216
|
+
"description": "The fraction the manifest's `limits.coverage` states for this family, when it states one."
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"required": [
|
|
222
|
+
"covered",
|
|
223
|
+
"total"
|
|
224
|
+
],
|
|
225
|
+
"additionalProperties": false
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"required": [
|
|
229
|
+
"imports",
|
|
230
|
+
"structure",
|
|
231
|
+
"members",
|
|
232
|
+
"surface",
|
|
233
|
+
"graph"
|
|
234
|
+
],
|
|
235
|
+
"additionalProperties": false,
|
|
236
|
+
"description": "Per family, how many walked files it reaches. Structure counts enumerated folders only."
|
|
237
|
+
},
|
|
238
|
+
"conformance": {
|
|
239
|
+
"type": "object",
|
|
240
|
+
"properties": {
|
|
241
|
+
"residue": {
|
|
242
|
+
"type": "object",
|
|
243
|
+
"properties": {
|
|
244
|
+
"count": {
|
|
245
|
+
"type": "number",
|
|
246
|
+
"allOf": [
|
|
247
|
+
{
|
|
248
|
+
"description": "What the measure counts today."
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
},
|
|
252
|
+
"ceiling": {
|
|
253
|
+
"type": "number",
|
|
254
|
+
"allOf": [
|
|
255
|
+
{
|
|
256
|
+
"description": "The count the manifest's `limits.conformance` states for this measure, when it states one."
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"required": [
|
|
262
|
+
"count"
|
|
263
|
+
],
|
|
264
|
+
"additionalProperties": false
|
|
265
|
+
},
|
|
266
|
+
"vacant": {
|
|
267
|
+
"type": "object",
|
|
268
|
+
"properties": {
|
|
269
|
+
"count": {
|
|
270
|
+
"type": "number",
|
|
271
|
+
"allOf": [
|
|
272
|
+
{
|
|
273
|
+
"description": "What the measure counts today."
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
},
|
|
277
|
+
"ceiling": {
|
|
278
|
+
"type": "number",
|
|
279
|
+
"allOf": [
|
|
280
|
+
{
|
|
281
|
+
"description": "The count the manifest's `limits.conformance` states for this measure, when it states one."
|
|
282
|
+
}
|
|
283
|
+
]
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"required": [
|
|
287
|
+
"count"
|
|
288
|
+
],
|
|
289
|
+
"additionalProperties": false
|
|
290
|
+
},
|
|
291
|
+
"slack": {
|
|
292
|
+
"type": "object",
|
|
293
|
+
"properties": {
|
|
294
|
+
"count": {
|
|
295
|
+
"type": "number",
|
|
296
|
+
"allOf": [
|
|
297
|
+
{
|
|
298
|
+
"description": "What the measure counts today."
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
"ceiling": {
|
|
303
|
+
"type": "number",
|
|
304
|
+
"allOf": [
|
|
305
|
+
{
|
|
306
|
+
"description": "The count the manifest's `limits.conformance` states for this measure, when it states one."
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"required": [
|
|
312
|
+
"count"
|
|
313
|
+
],
|
|
314
|
+
"additionalProperties": false
|
|
315
|
+
},
|
|
316
|
+
"concentration": {
|
|
317
|
+
"type": "object",
|
|
318
|
+
"properties": {
|
|
319
|
+
"count": {
|
|
320
|
+
"type": "number",
|
|
321
|
+
"allOf": [
|
|
322
|
+
{
|
|
323
|
+
"description": "What the measure counts today."
|
|
324
|
+
}
|
|
325
|
+
]
|
|
326
|
+
},
|
|
327
|
+
"ceiling": {
|
|
328
|
+
"type": "number",
|
|
329
|
+
"allOf": [
|
|
330
|
+
{
|
|
331
|
+
"description": "The count the manifest's `limits.conformance` states for this measure, when it states one."
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"required": [
|
|
337
|
+
"count"
|
|
338
|
+
],
|
|
339
|
+
"additionalProperties": false
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"required": [
|
|
343
|
+
"residue",
|
|
344
|
+
"vacant",
|
|
345
|
+
"slack",
|
|
346
|
+
"concentration"
|
|
347
|
+
],
|
|
348
|
+
"additionalProperties": false,
|
|
349
|
+
"description": "Per measure, the count `check` holds to the manifest's `limits.conformance`: residue files, vacant nodes, slack allowances, and fragment entries used at fewer than half the nodes granted them. The lists below name what each counts."
|
|
350
|
+
},
|
|
351
|
+
"residue": {
|
|
352
|
+
"type": "object",
|
|
353
|
+
"properties": {
|
|
354
|
+
"files": {
|
|
355
|
+
"type": "array",
|
|
356
|
+
"items": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"description": "Repo-relative, with forward slashes."
|
|
359
|
+
},
|
|
360
|
+
"description": "Files no family reaches, sorted."
|
|
361
|
+
},
|
|
362
|
+
"folders": {
|
|
363
|
+
"type": "array",
|
|
364
|
+
"items": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"description": "Repo-relative, with forward slashes."
|
|
367
|
+
},
|
|
368
|
+
"description": "Folders every walked file of which is residue, each the topmost such folder."
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
"required": [
|
|
372
|
+
"files",
|
|
373
|
+
"folders"
|
|
374
|
+
],
|
|
375
|
+
"additionalProperties": false,
|
|
376
|
+
"description": "What the policy has nothing to say about. A file in an open folder under no allowlist is claimed, not policed, and counts."
|
|
377
|
+
},
|
|
378
|
+
"vacant": {
|
|
379
|
+
"type": "array",
|
|
380
|
+
"items": {
|
|
381
|
+
"type": "object",
|
|
382
|
+
"properties": {
|
|
383
|
+
"node": {
|
|
384
|
+
"type": "string",
|
|
385
|
+
"description": "The manifest node."
|
|
386
|
+
},
|
|
387
|
+
"allowances": {
|
|
388
|
+
"type": "number",
|
|
389
|
+
"allOf": [
|
|
390
|
+
{
|
|
391
|
+
"description": "Distinct entries the node wrote, `allow` and `external` together."
|
|
392
|
+
}
|
|
393
|
+
]
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
"required": [
|
|
397
|
+
"node",
|
|
398
|
+
"allowances"
|
|
399
|
+
],
|
|
400
|
+
"additionalProperties": false
|
|
401
|
+
},
|
|
402
|
+
"description": "Nodes that state an import allowlist and select no walked file, in manifest order. Every allowance on one is unused by construction, so none is counted as slack; the node is a tier declared ahead of its first file, or a pattern that no longer matches. Residue is files no node reaches; this is nodes no file reaches."
|
|
403
|
+
},
|
|
404
|
+
"violations": {
|
|
405
|
+
"type": "array",
|
|
406
|
+
"items": {
|
|
407
|
+
"type": "object",
|
|
408
|
+
"properties": {
|
|
409
|
+
"fingerprint": {
|
|
410
|
+
"type": "string",
|
|
411
|
+
"description": "kind|rule|file|subject — line-independent, so it survives edits to the file it names; the baseline's key."
|
|
412
|
+
},
|
|
413
|
+
"kind": {
|
|
414
|
+
"type": "string",
|
|
415
|
+
"enum": [
|
|
416
|
+
"import",
|
|
417
|
+
"export",
|
|
418
|
+
"structure",
|
|
419
|
+
"member",
|
|
420
|
+
"surface",
|
|
421
|
+
"graph",
|
|
422
|
+
"campaign"
|
|
423
|
+
]
|
|
424
|
+
},
|
|
425
|
+
"ruleName": {
|
|
426
|
+
"type": "string",
|
|
427
|
+
"description": "The manifest node path the rule was lowered from."
|
|
428
|
+
},
|
|
429
|
+
"file": {
|
|
430
|
+
"type": "string",
|
|
431
|
+
"description": "Repo-relative, with forward slashes."
|
|
432
|
+
},
|
|
433
|
+
"subject": {
|
|
434
|
+
"anyOf": [
|
|
435
|
+
{
|
|
436
|
+
"type": "string"
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"type": "null"
|
|
440
|
+
}
|
|
441
|
+
],
|
|
442
|
+
"description": "The other end of the violated relationship — the resolved target, the restricted symbol, the missing sibling — or null when the file alone is the violation."
|
|
443
|
+
},
|
|
444
|
+
"message": {
|
|
445
|
+
"type": "string"
|
|
446
|
+
},
|
|
447
|
+
"baselined": {
|
|
448
|
+
"type": "boolean",
|
|
449
|
+
"description": "Carried by the baseline, so `check` does not fail on it."
|
|
450
|
+
},
|
|
451
|
+
"ledgered": {
|
|
452
|
+
"type": "boolean",
|
|
453
|
+
"description": "For a campaign hit: carried by the campaign's ledger, so `check` does not fail on it."
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
"required": [
|
|
457
|
+
"fingerprint",
|
|
458
|
+
"kind",
|
|
459
|
+
"ruleName",
|
|
460
|
+
"file",
|
|
461
|
+
"subject",
|
|
462
|
+
"message",
|
|
463
|
+
"baselined",
|
|
464
|
+
"ledgered"
|
|
465
|
+
],
|
|
466
|
+
"additionalProperties": false
|
|
467
|
+
},
|
|
468
|
+
"description": "Every finding, baselined ones included, ordered so the ones cheapest to fix come first: by the height of the violated target in the import graph, leaves first."
|
|
469
|
+
},
|
|
470
|
+
"unresolved": {
|
|
471
|
+
"type": "array",
|
|
472
|
+
"items": {
|
|
473
|
+
"type": "object",
|
|
474
|
+
"properties": {
|
|
475
|
+
"file": {
|
|
476
|
+
"type": "string",
|
|
477
|
+
"description": "Repo-relative, with forward slashes."
|
|
478
|
+
},
|
|
479
|
+
"specifier": {
|
|
480
|
+
"type": "string"
|
|
481
|
+
},
|
|
482
|
+
"detail": {
|
|
483
|
+
"type": "string"
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
"required": [
|
|
487
|
+
"file",
|
|
488
|
+
"specifier",
|
|
489
|
+
"detail"
|
|
490
|
+
],
|
|
491
|
+
"additionalProperties": false
|
|
492
|
+
},
|
|
493
|
+
"description": "Imports the resolver could not turn into a file. Every rule about one enforces nothing."
|
|
494
|
+
},
|
|
495
|
+
"stale": {
|
|
496
|
+
"type": "array",
|
|
497
|
+
"items": {
|
|
498
|
+
"type": "string"
|
|
499
|
+
},
|
|
500
|
+
"description": "Baseline entries the code no longer produces."
|
|
501
|
+
},
|
|
502
|
+
"baseline": {
|
|
503
|
+
"type": "object",
|
|
504
|
+
"properties": {
|
|
505
|
+
"size": {
|
|
506
|
+
"type": "number",
|
|
507
|
+
"allOf": [
|
|
508
|
+
{
|
|
509
|
+
"description": "Entries in the baseline file."
|
|
510
|
+
}
|
|
511
|
+
]
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
"required": [
|
|
515
|
+
"size"
|
|
516
|
+
],
|
|
517
|
+
"additionalProperties": false,
|
|
518
|
+
"description": "The debt the policy is carrying. The ratchet: it may only shrink."
|
|
519
|
+
},
|
|
520
|
+
"cycles": {
|
|
521
|
+
"type": "number",
|
|
522
|
+
"allOf": [
|
|
523
|
+
{
|
|
524
|
+
"description": "Strongly connected components of more than one file, or a file importing itself, anywhere in the walked graph — in a cycles rule's scope or not."
|
|
525
|
+
}
|
|
526
|
+
]
|
|
527
|
+
},
|
|
528
|
+
"slack": {
|
|
529
|
+
"type": "array",
|
|
530
|
+
"items": {
|
|
531
|
+
"type": "object",
|
|
532
|
+
"properties": {
|
|
533
|
+
"node": {
|
|
534
|
+
"type": "string",
|
|
535
|
+
"description": "The manifest node that wrote the entry — or, when `fragment` is set, the `defs` fragment it was written in."
|
|
536
|
+
},
|
|
537
|
+
"kind": {
|
|
538
|
+
"type": "string",
|
|
539
|
+
"enum": [
|
|
540
|
+
"allow",
|
|
541
|
+
"external"
|
|
542
|
+
],
|
|
543
|
+
"description": "`allow` is a path glob under `imports.allow`; `external` a package name under `imports.external`."
|
|
544
|
+
},
|
|
545
|
+
"entry": {
|
|
546
|
+
"type": "string",
|
|
547
|
+
"description": "The entry as written, after alias expansion."
|
|
548
|
+
},
|
|
549
|
+
"fragment": {
|
|
550
|
+
"type": "string",
|
|
551
|
+
"description": "Present when the entry arrived through `use`. The nodes that referenced the fragment wrote one word, so the entry is reported once, against the fragment, rather than once per node."
|
|
552
|
+
},
|
|
553
|
+
"of": {
|
|
554
|
+
"type": "number",
|
|
555
|
+
"allOf": [
|
|
556
|
+
{
|
|
557
|
+
"description": "With `fragment`: how many non-vacant nodes were granted the entry through it. None of them uses it."
|
|
558
|
+
}
|
|
559
|
+
]
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"required": [
|
|
563
|
+
"node",
|
|
564
|
+
"kind",
|
|
565
|
+
"entry"
|
|
566
|
+
],
|
|
567
|
+
"additionalProperties": false
|
|
568
|
+
},
|
|
569
|
+
"description": "Allowances no observed import uses, in manifest order, vacant nodes excluded. A manifest inferred from the tree has none on the day it is written; every entry here is permission nothing needs. An entry that arrived through `use` is reported once, against the fragment, and only when no node granted it uses it."
|
|
570
|
+
},
|
|
571
|
+
"concentration": {
|
|
572
|
+
"type": "array",
|
|
573
|
+
"items": {
|
|
574
|
+
"type": "object",
|
|
575
|
+
"properties": {
|
|
576
|
+
"fragment": {
|
|
577
|
+
"type": "string",
|
|
578
|
+
"description": "The `defs` fragment the entry was written in."
|
|
579
|
+
},
|
|
580
|
+
"kind": {
|
|
581
|
+
"type": "string",
|
|
582
|
+
"enum": [
|
|
583
|
+
"allow",
|
|
584
|
+
"external"
|
|
585
|
+
],
|
|
586
|
+
"description": "`allow` is a path glob under `imports.allow`; `external` a package name under `imports.external`."
|
|
587
|
+
},
|
|
588
|
+
"entry": {
|
|
589
|
+
"type": "string",
|
|
590
|
+
"description": "The entry as written, after alias expansion."
|
|
591
|
+
},
|
|
592
|
+
"usedAt": {
|
|
593
|
+
"type": "number",
|
|
594
|
+
"allOf": [
|
|
595
|
+
{
|
|
596
|
+
"description": "Nodes granted the entry through the fragment that use it."
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
"of": {
|
|
601
|
+
"type": "number",
|
|
602
|
+
"allOf": [
|
|
603
|
+
{
|
|
604
|
+
"description": "Non-vacant nodes granted the entry through the fragment."
|
|
605
|
+
}
|
|
606
|
+
]
|
|
607
|
+
}
|
|
608
|
+
},
|
|
609
|
+
"required": [
|
|
610
|
+
"fragment",
|
|
611
|
+
"kind",
|
|
612
|
+
"entry",
|
|
613
|
+
"usedAt",
|
|
614
|
+
"of"
|
|
615
|
+
],
|
|
616
|
+
"additionalProperties": false
|
|
617
|
+
},
|
|
618
|
+
"description": "Fragment entries used at some of the nodes granted them and not the rest. Not slack — the fragment's line is needed somewhere — but a per-file permission written as a many-node allowance, which is what an allowlist widened to make one build green looks like."
|
|
619
|
+
},
|
|
620
|
+
"adoption": {
|
|
621
|
+
"type": "object",
|
|
622
|
+
"properties": {
|
|
623
|
+
"unrestricted": {
|
|
624
|
+
"type": "array",
|
|
625
|
+
"items": {
|
|
626
|
+
"type": "string"
|
|
627
|
+
},
|
|
628
|
+
"description": "Nodes that say `unrestricted: true`."
|
|
629
|
+
},
|
|
630
|
+
"partial": {
|
|
631
|
+
"type": "array",
|
|
632
|
+
"items": {
|
|
633
|
+
"type": "string"
|
|
634
|
+
},
|
|
635
|
+
"description": "Nodes that say `partial: true`."
|
|
636
|
+
}
|
|
637
|
+
},
|
|
638
|
+
"required": [
|
|
639
|
+
"unrestricted",
|
|
640
|
+
"partial"
|
|
641
|
+
],
|
|
642
|
+
"additionalProperties": false,
|
|
643
|
+
"description": "The tiers that said \"not tightened yet\", by name; `limits` caps how many may."
|
|
644
|
+
},
|
|
645
|
+
"campaigns": {
|
|
646
|
+
"type": "array",
|
|
647
|
+
"items": {
|
|
648
|
+
"type": "object",
|
|
649
|
+
"properties": {
|
|
650
|
+
"id": {
|
|
651
|
+
"type": "string",
|
|
652
|
+
"description": "The campaign's id; its ledger is `<ledger>/<id>.json`."
|
|
653
|
+
},
|
|
654
|
+
"title": {
|
|
655
|
+
"type": "string",
|
|
656
|
+
"description": "The campaign's title, when it states one."
|
|
657
|
+
},
|
|
658
|
+
"owner": {
|
|
659
|
+
"type": "string",
|
|
660
|
+
"description": "Who is running the campaign, as the manifest names them."
|
|
661
|
+
},
|
|
662
|
+
"initial": {
|
|
663
|
+
"type": "number",
|
|
664
|
+
"allOf": [
|
|
665
|
+
{
|
|
666
|
+
"description": "Entries the day the ledger was written."
|
|
667
|
+
}
|
|
668
|
+
]
|
|
669
|
+
},
|
|
670
|
+
"allowed": {
|
|
671
|
+
"type": "number",
|
|
672
|
+
"allOf": [
|
|
673
|
+
{
|
|
674
|
+
"description": "Entries added since by `campaigns allow`, each with a regression record."
|
|
675
|
+
}
|
|
676
|
+
]
|
|
677
|
+
},
|
|
678
|
+
"count": {
|
|
679
|
+
"type": "number",
|
|
680
|
+
"allOf": [
|
|
681
|
+
{
|
|
682
|
+
"description": "Entries in the ledger now."
|
|
683
|
+
}
|
|
684
|
+
]
|
|
685
|
+
},
|
|
686
|
+
"fixed": {
|
|
687
|
+
"type": "number",
|
|
688
|
+
"allOf": [
|
|
689
|
+
{
|
|
690
|
+
"description": "Entries removed by `campaigns prune` since the ledger was written."
|
|
691
|
+
}
|
|
692
|
+
]
|
|
693
|
+
},
|
|
694
|
+
"progress": {
|
|
695
|
+
"type": "number",
|
|
696
|
+
"allOf": [
|
|
697
|
+
{
|
|
698
|
+
"description": "`1 - count / (initial + allowed)`: how much of everything ever ledgered has been paid down."
|
|
699
|
+
}
|
|
700
|
+
]
|
|
701
|
+
},
|
|
702
|
+
"lastProgress": {
|
|
703
|
+
"type": "string",
|
|
704
|
+
"description": "When an entry last left the ledger, ISO 8601 — the stall clock's reading."
|
|
705
|
+
},
|
|
706
|
+
"regressions": {
|
|
707
|
+
"type": "number",
|
|
708
|
+
"allOf": [
|
|
709
|
+
{
|
|
710
|
+
"description": "How many times the count was allowed to go up."
|
|
711
|
+
}
|
|
712
|
+
]
|
|
713
|
+
},
|
|
714
|
+
"stalled": {
|
|
715
|
+
"type": "boolean",
|
|
716
|
+
"description": "Entries remain and `lastProgress` is older than the campaign's `staleAfter`."
|
|
717
|
+
},
|
|
718
|
+
"complete": {
|
|
719
|
+
"type": "boolean",
|
|
720
|
+
"description": "No entries remain."
|
|
721
|
+
},
|
|
722
|
+
"onComplete": {
|
|
723
|
+
"type": "string",
|
|
724
|
+
"enum": [
|
|
725
|
+
"keep",
|
|
726
|
+
"remove"
|
|
727
|
+
],
|
|
728
|
+
"description": "What the manifest asks once complete: keep the campaign as a guard, or remove it."
|
|
729
|
+
},
|
|
730
|
+
"ledgered": {
|
|
731
|
+
"type": "boolean",
|
|
732
|
+
"description": "Whether a ledger exists. A campaign with none has been declared and not yet initialised."
|
|
733
|
+
}
|
|
734
|
+
},
|
|
735
|
+
"required": [
|
|
736
|
+
"id",
|
|
737
|
+
"initial",
|
|
738
|
+
"allowed",
|
|
739
|
+
"count",
|
|
740
|
+
"fixed",
|
|
741
|
+
"progress",
|
|
742
|
+
"lastProgress",
|
|
743
|
+
"regressions",
|
|
744
|
+
"stalled",
|
|
745
|
+
"complete",
|
|
746
|
+
"onComplete",
|
|
747
|
+
"ledgered"
|
|
748
|
+
],
|
|
749
|
+
"additionalProperties": false
|
|
750
|
+
},
|
|
751
|
+
"description": "Every campaign the manifest declares, in manifest order, with its burn-down. Campaign hits are not counted in `coverage` or `residue`: a campaign is scoped by construction."
|
|
752
|
+
}
|
|
753
|
+
},
|
|
754
|
+
"required": [
|
|
755
|
+
"version",
|
|
756
|
+
"manifest",
|
|
757
|
+
"roots",
|
|
758
|
+
"files",
|
|
759
|
+
"ok",
|
|
760
|
+
"coverage",
|
|
761
|
+
"conformance",
|
|
762
|
+
"residue",
|
|
763
|
+
"vacant",
|
|
764
|
+
"violations",
|
|
765
|
+
"unresolved",
|
|
766
|
+
"stale",
|
|
767
|
+
"baseline",
|
|
768
|
+
"cycles",
|
|
769
|
+
"slack",
|
|
770
|
+
"concentration",
|
|
771
|
+
"adoption",
|
|
772
|
+
"campaigns"
|
|
773
|
+
],
|
|
774
|
+
"additionalProperties": false
|
|
775
|
+
}
|