@ecoma-io/archkeep 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/cli.mjs +166 -506
  2. package/commands.mjs +7 -1
  3. package/package.json +1 -1
  4. package/src/architecture-intent/judge.mjs +1 -1
  5. package/src/architecture-intent/model.mjs +34 -0
  6. package/src/canonical.mjs +2 -1
  7. package/src/commands/adr-for-workspace.mjs +63 -0
  8. package/src/commands/analyze-capability.mjs +13 -0
  9. package/src/commands/change-intent.mjs +11 -0
  10. package/src/commands/change.mjs +247 -34
  11. package/src/commands/check-capability.mjs +13 -0
  12. package/src/commands/check.mjs +13 -3
  13. package/src/commands/compare-capability.mjs +20 -0
  14. package/src/commands/completeness.mjs +12 -0
  15. package/src/commands/context-command.mjs +31 -0
  16. package/src/commands/coverage-verdict.mjs +15 -2
  17. package/src/commands/debt.mjs +30 -0
  18. package/src/commands/decisions.mjs +59 -10
  19. package/src/commands/delta.mjs +263 -49
  20. package/src/commands/diff.mjs +45 -0
  21. package/src/commands/discover.mjs +37 -0
  22. package/src/commands/drift.mjs +45 -0
  23. package/src/commands/evolution.mjs +22 -2
  24. package/src/commands/explain-capability.mjs +11 -0
  25. package/src/commands/explain.mjs +24 -0
  26. package/src/commands/fitness.mjs +119 -10
  27. package/src/commands/govern-capability.mjs +16 -0
  28. package/src/commands/graph.mjs +39 -0
  29. package/src/commands/health.mjs +34 -0
  30. package/src/commands/history.mjs +85 -2
  31. package/src/commands/impact.mjs +23 -0
  32. package/src/commands/inspect-capability.mjs +16 -0
  33. package/src/commands/plan-context-command.mjs +35 -0
  34. package/src/commands/policy.mjs +42 -4
  35. package/src/commands/provenance-command.mjs +15 -24
  36. package/src/commands/report.mjs +38 -0
  37. package/src/commands/rules-capability.mjs +16 -0
  38. package/src/commands/rules.mjs +3 -1
  39. package/src/commands/scenario.mjs +23 -0
  40. package/src/commands/trajectory.mjs +35 -0
  41. package/src/commands/waivers.mjs +30 -0
  42. package/src/corpus/goldens/.gitkeep +0 -0
  43. package/src/corpus/goldens/adr.json +62 -0
  44. package/src/corpus/goldens/adr.text +6 -0
  45. package/src/corpus/goldens/change.json +98 -0
  46. package/src/corpus/goldens/change.text +6 -0
  47. package/src/corpus/goldens/check.json +90 -0
  48. package/src/corpus/goldens/check.sarif +479 -0
  49. package/src/corpus/goldens/check.text +9 -0
  50. package/src/corpus/goldens/context.json +47 -0
  51. package/src/corpus/goldens/context.text +6 -0
  52. package/src/corpus/goldens/debt.json +59 -0
  53. package/src/corpus/goldens/debt.text +7 -0
  54. package/src/corpus/goldens/decisions.json +74 -0
  55. package/src/corpus/goldens/decisions.text +7 -0
  56. package/src/corpus/goldens/delta.json +94 -0
  57. package/src/corpus/goldens/delta.sarif +472 -0
  58. package/src/corpus/goldens/delta.text +5 -0
  59. package/src/corpus/goldens/diff.json +58 -0
  60. package/src/corpus/goldens/diff.text +4 -0
  61. package/src/corpus/goldens/discover.json +77 -0
  62. package/src/corpus/goldens/discover.text +10 -0
  63. package/src/corpus/goldens/drift.json +43 -0
  64. package/src/corpus/goldens/drift.text +3 -0
  65. package/src/corpus/goldens/evolution.json +328 -0
  66. package/src/corpus/goldens/evolution.text +32 -0
  67. package/src/corpus/goldens/explain.json +60 -0
  68. package/src/corpus/goldens/explain.text +7 -0
  69. package/src/corpus/goldens/fitness.json +45 -0
  70. package/src/corpus/goldens/fitness.text +3 -0
  71. package/src/corpus/goldens/graph.json +78 -0
  72. package/src/corpus/goldens/graph.text +10 -0
  73. package/src/corpus/goldens/health.json +72 -0
  74. package/src/corpus/goldens/health.text +10 -0
  75. package/src/corpus/goldens/help.text +104 -0
  76. package/src/corpus/goldens/history.json +43 -0
  77. package/src/corpus/goldens/history.text +4 -0
  78. package/src/corpus/goldens/impact.json +327 -0
  79. package/src/corpus/goldens/impact.text +10 -0
  80. package/src/corpus/goldens/provenance.json +453 -0
  81. package/src/corpus/goldens/provenance.text +14 -0
  82. package/src/corpus/goldens/reconcile.json +168 -0
  83. package/src/corpus/goldens/reconcile.text +3 -0
  84. package/src/corpus/goldens/report.json +168 -0
  85. package/src/corpus/goldens/report.text +42 -0
  86. package/src/corpus/goldens/rules verify.json +0 -0
  87. package/src/corpus/goldens/rules verify.text +0 -0
  88. package/src/corpus/goldens/scenario.json +441 -0
  89. package/src/corpus/goldens/scenario.text +28 -0
  90. package/src/corpus/goldens/trajectory.json +83 -0
  91. package/src/corpus/goldens/trajectory.text +10 -0
  92. package/src/corpus/goldens/usage-error.text +105 -0
  93. package/src/corpus/goldens/waivers.json +40 -0
  94. package/src/corpus/goldens/waivers.text +1 -0
  95. package/src/corpus/goldens-lsp/initialize.result.json +15 -0
  96. package/src/corpus/goldens-lsp/publish-cleared-empty.json +4 -0
  97. package/src/corpus/goldens-lsp/publish-fixed-empty.json +5 -0
  98. package/src/corpus/goldens-lsp/publish-unparseable.json +54 -0
  99. package/src/corpus/goldens-lsp/publish-violation.json +22 -0
  100. package/src/corpus/goldens-lsp/register-watched-files.json +72 -0
  101. package/src/go-work.mjs +8 -23
  102. package/src/governance/evolution-event.mjs +15 -0
  103. package/src/governance/evolution-store.mjs +59 -31
  104. package/src/governance/provenance-record.mjs +0 -152
  105. package/src/governance/verdict.mjs +26 -3
  106. package/src/intent/intent-manifest.json +14 -14
  107. package/src/lsp/server.mjs +5 -8
  108. package/src/lsp/workspace-index.mjs +55 -220
  109. package/src/options.mjs +10 -0
  110. package/src/providers/native/discover.mjs +13 -12
  111. package/src/providers/native/model.mjs +8 -3
  112. package/src/providers/nx-static.mjs +231 -0
  113. package/src/report/json.mjs +3 -2
  114. package/src/report/sarif.mjs +8 -3
  115. package/src/rules/edge-constraints.mjs +9 -0
  116. package/src/rules/index.mjs +26 -10
  117. package/src/rules/messages.mjs +64 -14
  118. package/src/rules/specifiers.mjs +21 -20
  119. package/src/tsconfig-paths.mjs +8 -14
  120. package/src/verdict.mjs +127 -16
@@ -0,0 +1,472 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
3
+ "version": "2.1.0",
4
+ "runs": [
5
+ {
6
+ "tool": {
7
+ "driver": {
8
+ "name": "archkeep",
9
+ "rules": [
10
+ {
11
+ "id": "noRelativeOrAbsoluteImportsAcrossLibraries",
12
+ "name": "noRelativeOrAbsoluteImportsAcrossLibraries",
13
+ "shortDescription": {
14
+ "text": "Projects cannot be imported by a relative or absolute path, and must begin with a npm scope"
15
+ },
16
+ "fullDescription": {
17
+ "text": "Projects cannot be imported by a relative or absolute path, and must begin with a npm scope"
18
+ },
19
+ "defaultConfiguration": {
20
+ "level": "error"
21
+ },
22
+ "properties": {
23
+ "upstreamRule": "@nx/enforce-module-boundaries"
24
+ }
25
+ },
26
+ {
27
+ "id": "noRelativeOrAbsoluteExternals",
28
+ "name": "noRelativeOrAbsoluteExternals",
29
+ "shortDescription": {
30
+ "text": "External resources cannot be imported using a relative or absolute path"
31
+ },
32
+ "fullDescription": {
33
+ "text": "External resources cannot be imported using a relative or absolute path"
34
+ },
35
+ "defaultConfiguration": {
36
+ "level": "error"
37
+ },
38
+ "properties": {
39
+ "upstreamRule": "@nx/enforce-module-boundaries"
40
+ }
41
+ },
42
+ {
43
+ "id": "noCircularDependencies",
44
+ "name": "noCircularDependencies",
45
+ "shortDescription": {
46
+ "text": "Circular dependency between \"{{sourceProjectName}}\" and \"{{targetProjectName}}\" detected: {{path}}"
47
+ },
48
+ "fullDescription": {
49
+ "text": "Circular dependency between \"{{sourceProjectName}}\" and \"{{targetProjectName}}\" detected: {{path}}\n\nCircular file chain:\n{{filePaths}}"
50
+ },
51
+ "defaultConfiguration": {
52
+ "level": "error"
53
+ },
54
+ "properties": {
55
+ "upstreamRule": "@nx/enforce-module-boundaries"
56
+ }
57
+ },
58
+ {
59
+ "id": "noSelfCircularDependencies",
60
+ "name": "noSelfCircularDependencies",
61
+ "shortDescription": {
62
+ "text": "Projects should use relative imports to import from other files within the same project. Use \"./path/to/file\" instead of import from \"{{imp}}\""
63
+ },
64
+ "fullDescription": {
65
+ "text": "Projects should use relative imports to import from other files within the same project. Use \"./path/to/file\" instead of import from \"{{imp}}\""
66
+ },
67
+ "defaultConfiguration": {
68
+ "level": "error"
69
+ },
70
+ "properties": {
71
+ "upstreamRule": "@nx/enforce-module-boundaries"
72
+ }
73
+ },
74
+ {
75
+ "id": "noImportsOfApps",
76
+ "name": "noImportsOfApps",
77
+ "shortDescription": {
78
+ "text": "Imports of apps are forbidden"
79
+ },
80
+ "fullDescription": {
81
+ "text": "Imports of apps are forbidden"
82
+ },
83
+ "defaultConfiguration": {
84
+ "level": "error"
85
+ },
86
+ "properties": {
87
+ "upstreamRule": "@nx/enforce-module-boundaries"
88
+ }
89
+ },
90
+ {
91
+ "id": "noImportsOfE2e",
92
+ "name": "noImportsOfE2e",
93
+ "shortDescription": {
94
+ "text": "Imports of e2e projects are forbidden"
95
+ },
96
+ "fullDescription": {
97
+ "text": "Imports of e2e projects are forbidden"
98
+ },
99
+ "defaultConfiguration": {
100
+ "level": "error"
101
+ },
102
+ "properties": {
103
+ "upstreamRule": "@nx/enforce-module-boundaries"
104
+ }
105
+ },
106
+ {
107
+ "id": "noImportOfNonBuildableLibraries",
108
+ "name": "noImportOfNonBuildableLibraries",
109
+ "shortDescription": {
110
+ "text": "Buildable libraries cannot import or export from non-buildable libraries"
111
+ },
112
+ "fullDescription": {
113
+ "text": "Buildable libraries cannot import or export from non-buildable libraries"
114
+ },
115
+ "defaultConfiguration": {
116
+ "level": "error"
117
+ },
118
+ "properties": {
119
+ "upstreamRule": "@nx/enforce-module-boundaries"
120
+ }
121
+ },
122
+ {
123
+ "id": "noImportsOfLazyLoadedLibraries",
124
+ "name": "noImportsOfLazyLoadedLibraries",
125
+ "shortDescription": {
126
+ "text": "Static imports of lazy-loaded libraries are forbidden."
127
+ },
128
+ "fullDescription": {
129
+ "text": "Static imports of lazy-loaded libraries are forbidden.\n\nLibrary \"{{targetProjectName}}\" is lazy-loaded in these files:\n{{filePaths}}"
130
+ },
131
+ "defaultConfiguration": {
132
+ "level": "error"
133
+ },
134
+ "properties": {
135
+ "upstreamRule": "@nx/enforce-module-boundaries"
136
+ }
137
+ },
138
+ {
139
+ "id": "projectWithoutTagsCannotHaveDependencies",
140
+ "name": "projectWithoutTagsCannotHaveDependencies",
141
+ "shortDescription": {
142
+ "text": "A project without tags matching at least one constraint cannot depend on any libraries"
143
+ },
144
+ "fullDescription": {
145
+ "text": "A project without tags matching at least one constraint cannot depend on any libraries"
146
+ },
147
+ "defaultConfiguration": {
148
+ "level": "error"
149
+ },
150
+ "properties": {
151
+ "upstreamRule": "@nx/enforce-module-boundaries"
152
+ }
153
+ },
154
+ {
155
+ "id": "bannedExternalImportsViolation",
156
+ "name": "bannedExternalImportsViolation",
157
+ "shortDescription": {
158
+ "text": "A project tagged with \"{{sourceTag}}\" is not allowed to import \"{{imp}}\""
159
+ },
160
+ "fullDescription": {
161
+ "text": "A project tagged with \"{{sourceTag}}\" is not allowed to import \"{{imp}}\""
162
+ },
163
+ "defaultConfiguration": {
164
+ "level": "error"
165
+ },
166
+ "properties": {
167
+ "upstreamRule": "@nx/enforce-module-boundaries"
168
+ }
169
+ },
170
+ {
171
+ "id": "nestedBannedExternalImportsViolation",
172
+ "name": "nestedBannedExternalImportsViolation",
173
+ "shortDescription": {
174
+ "text": "A project tagged with \"{{sourceTag}}\" is not allowed to import \"{{imp}}\". Nested import of \"{{packageName}}\" found at {{childProjectName}}"
175
+ },
176
+ "fullDescription": {
177
+ "text": "A project tagged with \"{{sourceTag}}\" is not allowed to import \"{{imp}}\". Nested import of \"{{packageName}}\" found at {{childProjectName}}"
178
+ },
179
+ "defaultConfiguration": {
180
+ "level": "error"
181
+ },
182
+ "properties": {
183
+ "upstreamRule": "@nx/enforce-module-boundaries"
184
+ }
185
+ },
186
+ {
187
+ "id": "noTransitiveDependencies",
188
+ "name": "noTransitiveDependencies",
189
+ "shortDescription": {
190
+ "text": "Only packages defined in the \"package.json\" can be imported. Transitive or unresolvable dependencies are not allowed."
191
+ },
192
+ "fullDescription": {
193
+ "text": "Only packages defined in the \"package.json\" can be imported. Transitive or unresolvable dependencies are not allowed."
194
+ },
195
+ "defaultConfiguration": {
196
+ "level": "error"
197
+ },
198
+ "properties": {
199
+ "upstreamRule": "@nx/enforce-module-boundaries"
200
+ }
201
+ },
202
+ {
203
+ "id": "onlyTagsConstraintViolation",
204
+ "name": "onlyTagsConstraintViolation",
205
+ "shortDescription": {
206
+ "text": "A project tagged with \"{{sourceTag}}\" can only depend on libs tagged with {{tags}}"
207
+ },
208
+ "fullDescription": {
209
+ "text": "A project tagged with \"{{sourceTag}}\" can only depend on libs tagged with {{tags}}"
210
+ },
211
+ "defaultConfiguration": {
212
+ "level": "error"
213
+ },
214
+ "properties": {
215
+ "upstreamRule": "@nx/enforce-module-boundaries"
216
+ }
217
+ },
218
+ {
219
+ "id": "emptyOnlyTagsConstraintViolation",
220
+ "name": "emptyOnlyTagsConstraintViolation",
221
+ "shortDescription": {
222
+ "text": "A project tagged with \"{{sourceTag}}\" cannot depend on any libs with tags"
223
+ },
224
+ "fullDescription": {
225
+ "text": "A project tagged with \"{{sourceTag}}\" cannot depend on any libs with tags"
226
+ },
227
+ "defaultConfiguration": {
228
+ "level": "error"
229
+ },
230
+ "properties": {
231
+ "upstreamRule": "@nx/enforce-module-boundaries"
232
+ }
233
+ },
234
+ {
235
+ "id": "notTagsConstraintViolation",
236
+ "name": "notTagsConstraintViolation",
237
+ "shortDescription": {
238
+ "text": "A project tagged with \"{{sourceTag}}\" can not depend on libs tagged with {{tags}}"
239
+ },
240
+ "fullDescription": {
241
+ "text": "A project tagged with \"{{sourceTag}}\" can not depend on libs tagged with {{tags}}\n\nViolation detected in:\n{{projects}}"
242
+ },
243
+ "defaultConfiguration": {
244
+ "level": "error"
245
+ },
246
+ "properties": {
247
+ "upstreamRule": "@nx/enforce-module-boundaries"
248
+ }
249
+ },
250
+ {
251
+ "id": "goWorkMissingUse",
252
+ "name": "goWorkMissingUse",
253
+ "shortDescription": {
254
+ "text": "A project's go.mod is not in go.work's use list: a developer's go build and gopls skip a module the Nx graph covers, so dev machines and CI select different module sets."
255
+ },
256
+ "fullDescription": {
257
+ "text": "A project's go.mod is not in go.work's use list: a developer's go build and gopls skip a module the Nx graph covers, so dev machines and CI select different module sets."
258
+ },
259
+ "defaultConfiguration": {
260
+ "level": "error"
261
+ }
262
+ },
263
+ {
264
+ "id": "goWorkStaleUse",
265
+ "name": "goWorkStaleUse",
266
+ "shortDescription": {
267
+ "text": "A go.work use entry names a directory with no tracked go.mod: go commands fail on developer machines while CI, which never reads go.work, stays green."
268
+ },
269
+ "fullDescription": {
270
+ "text": "A go.work use entry names a directory with no tracked go.mod: go commands fail on developer machines while CI, which never reads go.work, stays green."
271
+ },
272
+ "defaultConfiguration": {
273
+ "level": "error"
274
+ }
275
+ },
276
+ {
277
+ "id": "goWorkUnmodeledUse",
278
+ "name": "goWorkUnmodeledUse",
279
+ "shortDescription": {
280
+ "text": "A go.work use entry names a module the Nx graph does not model: it builds on developer machines while nx affected and the boundary check never see it."
281
+ },
282
+ "fullDescription": {
283
+ "text": "A go.work use entry names a module the Nx graph does not model: it builds on developer machines while nx affected and the boundary check never see it."
284
+ },
285
+ "defaultConfiguration": {
286
+ "level": "error"
287
+ }
288
+ },
289
+ {
290
+ "id": "goWorkOutsideUse",
291
+ "name": "goWorkOutsideUse",
292
+ "shortDescription": {
293
+ "text": "A go.work use entry points outside the workspace: developer builds include a module no run over this workspace can cover."
294
+ },
295
+ "fullDescription": {
296
+ "text": "A go.work use entry points outside the workspace: developer builds include a module no run over this workspace can cover."
297
+ },
298
+ "defaultConfiguration": {
299
+ "level": "error"
300
+ }
301
+ },
302
+ {
303
+ "id": "tsconfigDeadPathAlias",
304
+ "name": "tsconfigDeadPathAlias",
305
+ "shortDescription": {
306
+ "text": "A tsconfig paths alias maps only to targets whose directories do not exist: no import of it can resolve through the alias table, so the build breaks — or silently resolves to an installed package of the same name instead of the workspace source the alias promised."
307
+ },
308
+ "fullDescription": {
309
+ "text": "A tsconfig paths alias maps only to targets whose directories do not exist: no import of it can resolve through the alias table, so the build breaks — or silently resolves to an installed package of the same name instead of the workspace source the alias promised."
310
+ },
311
+ "defaultConfiguration": {
312
+ "level": "error"
313
+ }
314
+ },
315
+ {
316
+ "id": "intentForbiddenEdge",
317
+ "name": "intentForbiddenEdge",
318
+ "shortDescription": {
319
+ "text": "A dependency this workspace's architecture-intent.json forbids appears in the observed project graph — the architecture that is being built contradicts the one that was intended."
320
+ },
321
+ "fullDescription": {
322
+ "text": "A dependency this workspace's architecture-intent.json forbids appears in the observed project graph — the architecture that is being built contradicts the one that was intended."
323
+ },
324
+ "defaultConfiguration": {
325
+ "level": "error"
326
+ }
327
+ },
328
+ {
329
+ "id": "intentAllowedMissing",
330
+ "name": "intentAllowedMissing",
331
+ "shortDescription": {
332
+ "text": "A dependency this workspace's architecture-intent.json allows is not observed — the intended architecture is not being built."
333
+ },
334
+ "fullDescription": {
335
+ "text": "A dependency this workspace's architecture-intent.json allows is not observed — the intended architecture is not being built."
336
+ },
337
+ "defaultConfiguration": {
338
+ "level": "error"
339
+ }
340
+ },
341
+ {
342
+ "id": "projectMissing",
343
+ "name": "projectMissing",
344
+ "shortDescription": {
345
+ "text": "the intent requires a project to exist, but the observed architecture has no project of that name"
346
+ },
347
+ "fullDescription": {
348
+ "text": "the intent requires a project to exist, but the observed architecture has no project of that name"
349
+ },
350
+ "defaultConfiguration": {
351
+ "level": "error"
352
+ }
353
+ },
354
+ {
355
+ "id": "projectPresent",
356
+ "name": "projectPresent",
357
+ "shortDescription": {
358
+ "text": "the intent forbids a project, but the observed architecture contains it"
359
+ },
360
+ "fullDescription": {
361
+ "text": "the intent forbids a project, but the observed architecture contains it"
362
+ },
363
+ "defaultConfiguration": {
364
+ "level": "error"
365
+ }
366
+ },
367
+ {
368
+ "id": "projectTagMissing",
369
+ "name": "projectTagMissing",
370
+ "shortDescription": {
371
+ "text": "a required project lacks a required tag"
372
+ },
373
+ "fullDescription": {
374
+ "text": "a required project lacks a required tag"
375
+ },
376
+ "defaultConfiguration": {
377
+ "level": "error"
378
+ }
379
+ },
380
+ {
381
+ "id": "dependencyForbidden",
382
+ "name": "dependencyForbidden",
383
+ "shortDescription": {
384
+ "text": "a dependency the intent forbids exists in the observed architecture"
385
+ },
386
+ "fullDescription": {
387
+ "text": "a dependency the intent forbids exists in the observed architecture"
388
+ },
389
+ "defaultConfiguration": {
390
+ "level": "error"
391
+ }
392
+ },
393
+ {
394
+ "id": "dependencyNotAllowed",
395
+ "name": "dependencyNotAllowed",
396
+ "shortDescription": {
397
+ "text": "an observed dependency is not among the dependencies the intent allows"
398
+ },
399
+ "fullDescription": {
400
+ "text": "an observed dependency is not among the dependencies the intent allows"
401
+ },
402
+ "defaultConfiguration": {
403
+ "level": "error"
404
+ }
405
+ },
406
+ {
407
+ "id": "tagDependencyForbidden",
408
+ "name": "tagDependencyForbidden",
409
+ "shortDescription": {
410
+ "text": "a dependency the intent forbids between two tags exists in the observed architecture"
411
+ },
412
+ "fullDescription": {
413
+ "text": "a dependency the intent forbids between two tags exists in the observed architecture"
414
+ },
415
+ "defaultConfiguration": {
416
+ "level": "error"
417
+ }
418
+ },
419
+ {
420
+ "id": "intentUnknownProject",
421
+ "name": "intentUnknownProject",
422
+ "shortDescription": {
423
+ "text": "an intent row names a project the observed architecture does not have"
424
+ },
425
+ "fullDescription": {
426
+ "text": "an intent row names a project the observed architecture does not have"
427
+ },
428
+ "defaultConfiguration": {
429
+ "level": "error"
430
+ }
431
+ },
432
+ {
433
+ "id": "intentUnknownTag",
434
+ "name": "intentUnknownTag",
435
+ "shortDescription": {
436
+ "text": "a tag rule names a tag no observed project carries"
437
+ },
438
+ "fullDescription": {
439
+ "text": "a tag rule names a tag no observed project carries"
440
+ },
441
+ "defaultConfiguration": {
442
+ "level": "error"
443
+ }
444
+ },
445
+ {
446
+ "id": "fitnessFunctionFailed",
447
+ "name": "fitnessFunctionFailed",
448
+ "shortDescription": {
449
+ "text": "A declared fitness function failed its verdict."
450
+ },
451
+ "fullDescription": {
452
+ "text": "A fitness function declared in the boundary policy's `fitness` list judged its matched projects and returned `fail` — the function name and reason are in the result message and the `name` property."
453
+ },
454
+ "defaultConfiguration": {
455
+ "level": "error"
456
+ }
457
+ }
458
+ ]
459
+ }
460
+ },
461
+ "columnKind": "utf16CodeUnits",
462
+ "results": [],
463
+ "invocations": [
464
+ {
465
+ "executionSuccessful": true,
466
+ "toolExecutionNotifications": []
467
+ }
468
+ ]
469
+ }
470
+ ]
471
+ }
472
+
@@ -0,0 +1,5 @@
1
+ baseline /tmp/archkeep-golden-fixture/.archkeep-delta.json — 1fd51709, 2 records, 3 projects
2
+ head 1fd51709, 2 records, 3 projects
3
+ ✔ no introduced violations — compared baseline 1fd51709 (2 records) against head 1fd51709 (2 records, 3 analyzed files, 3 projects)
4
+ classifications none
5
+ affected none
@@ -0,0 +1,58 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "tool": {
4
+ "name": "@ecoma-io/archkeep",
5
+ "version": "0.26.0"
6
+ },
7
+ "command": "diff",
8
+ "workspace": {
9
+ "root": "/tmp/archkeep-golden-fixture",
10
+ "provider": "native",
11
+ "marker": "archkeep.json",
12
+ "provenance": {
13
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
14
+ "remote": null,
15
+ "dirty": false
16
+ }
17
+ },
18
+ "status": "ok",
19
+ "exitCode": 0,
20
+ "coverage": {
21
+ "complete": true,
22
+ "projects": 3,
23
+ "analyzedFiles": 3,
24
+ "imports": 2,
25
+ "notAnalyzed": [],
26
+ "blindSpots": [],
27
+ "notes": [
28
+ "per-edge rule-impact covers only depConstraints (3 of 15 violation types; standing edges adjacent to a tags-changed project are re-judged under both sides' tags). A dependency with no rule-impact may still violate npm-ban, circular-dependency, lazy-load, or other rules that require import-site details. Run check for the complete verdict."
29
+ ]
30
+ },
31
+ "result": {
32
+ "baseline": {
33
+ "path": "/tmp/archkeep-golden-fixture/.archkeep-graph.json",
34
+ "projects": 3,
35
+ "edges": 2,
36
+ "toolVersion": "0.26.0",
37
+ "provenance": {
38
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
39
+ "remote": null,
40
+ "dirty": false
41
+ }
42
+ },
43
+ "head": {
44
+ "projects": 3,
45
+ "edges": 2
46
+ },
47
+ "addedProjects": [],
48
+ "removedProjects": [],
49
+ "changedProjects": [],
50
+ "addedEdges": [],
51
+ "removedEdges": [],
52
+ "ruleImpact": {
53
+ "introduced": [],
54
+ "resolved": []
55
+ }
56
+ }
57
+ }
58
+
@@ -0,0 +1,4 @@
1
+ baseline /tmp/archkeep-golden-fixture/.archkeep-graph.json — 3 projects, 2 edges
2
+ head 3 projects, 2 edges
3
+ ✔ no boundary-rule impact
4
+ ✔ no changes between baseline and head (2 imports in 3 files across 3 projects; per-edge rule-impact covers only depConstraints (3 of 15 violation types; standing edges adjacent to a tags-changed project are re-judged under both sides' tags). A dependency with no rule-impact may still violate npm-ban, circular-dependency, lazy-load, or other rules that require import-site details. Run check for the complete verdict.)
@@ -0,0 +1,77 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "tool": {
4
+ "name": "@ecoma-io/archkeep",
5
+ "version": "0.26.0"
6
+ },
7
+ "command": "discover",
8
+ "workspace": {
9
+ "root": "/tmp/archkeep-golden-fixture",
10
+ "provider": "native",
11
+ "marker": "archkeep.json",
12
+ "provenance": {
13
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
14
+ "remote": null,
15
+ "dirty": false
16
+ }
17
+ },
18
+ "status": "ok",
19
+ "exitCode": 0,
20
+ "coverage": {
21
+ "complete": true,
22
+ "projects": 3,
23
+ "analyzedFiles": 3,
24
+ "imports": 2,
25
+ "notAnalyzed": [],
26
+ "blindSpots": [],
27
+ "notes": []
28
+ },
29
+ "result": {
30
+ "discovery": {
31
+ "projects": [
32
+ {
33
+ "name": "api",
34
+ "root": "libs/api",
35
+ "type": "lib",
36
+ "tags": [
37
+ "layer:api"
38
+ ]
39
+ },
40
+ {
41
+ "name": "app",
42
+ "root": "libs/app",
43
+ "type": "lib",
44
+ "tags": [
45
+ "layer:app"
46
+ ]
47
+ },
48
+ {
49
+ "name": "core",
50
+ "root": "libs/core",
51
+ "type": "lib",
52
+ "tags": [
53
+ "layer:core"
54
+ ]
55
+ }
56
+ ],
57
+ "edges": [
58
+ {
59
+ "source": "api",
60
+ "target": "core",
61
+ "type": "static"
62
+ },
63
+ {
64
+ "source": "app",
65
+ "target": "api",
66
+ "type": "static"
67
+ }
68
+ ],
69
+ "tags": [
70
+ "layer:api",
71
+ "layer:app",
72
+ "layer:core"
73
+ ]
74
+ }
75
+ }
76
+ }
77
+
@@ -0,0 +1,10 @@
1
+ ✔ discovery complete (2 imports in 3 files across 3 projects)
2
+ 3 projects
3
+ api libs/api lib [layer:api]
4
+ → core (static)
5
+ app libs/app lib [layer:app]
6
+ → api (static)
7
+ core libs/core lib [layer:core]
8
+ (no dependencies)
9
+ 2 edges
10
+ tags layer:api, layer:app, layer:core
@@ -0,0 +1,43 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "tool": {
4
+ "name": "@ecoma-io/archkeep",
5
+ "version": "0.26.0"
6
+ },
7
+ "command": "drift",
8
+ "workspace": {
9
+ "root": "/tmp/archkeep-golden-fixture",
10
+ "provider": "native",
11
+ "marker": "archkeep.json",
12
+ "provenance": {
13
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
14
+ "remote": null,
15
+ "dirty": false
16
+ }
17
+ },
18
+ "status": "ok",
19
+ "exitCode": 0,
20
+ "coverage": {
21
+ "complete": true,
22
+ "projects": 3,
23
+ "analyzedFiles": 3,
24
+ "imports": 2,
25
+ "notAnalyzed": [],
26
+ "blindSpots": [],
27
+ "notes": []
28
+ },
29
+ "result": {
30
+ "intent": {
31
+ "file": "architecture-intent.json",
32
+ "fingerprint": "ce10167aef69f6282985e218a59fe5bb88bd232cb221bc8b1ee8fefbe458b4bc",
33
+ "rows": 6
34
+ },
35
+ "observed": {
36
+ "projects": 3,
37
+ "edges": 2,
38
+ "implicitEdges": 0
39
+ },
40
+ "findings": []
41
+ }
42
+ }
43
+
@@ -0,0 +1,3 @@
1
+ intent ce10167aef69f6282985e218a59fe5bb88bd232cb221bc8b1ee8fefbe458b4bc — 6 rows
2
+ observed 3 projects, 2 edges
3
+ ✔ no drift — the observed architecture matches the intended one (3 projects and 2 edges)