@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.
- package/cli.mjs +166 -506
- package/commands.mjs +7 -1
- package/package.json +1 -1
- package/src/architecture-intent/judge.mjs +1 -1
- package/src/architecture-intent/model.mjs +34 -0
- package/src/canonical.mjs +2 -1
- package/src/commands/adr-for-workspace.mjs +63 -0
- package/src/commands/analyze-capability.mjs +13 -0
- package/src/commands/change-intent.mjs +11 -0
- package/src/commands/change.mjs +247 -34
- package/src/commands/check-capability.mjs +13 -0
- package/src/commands/check.mjs +13 -3
- package/src/commands/compare-capability.mjs +20 -0
- package/src/commands/completeness.mjs +12 -0
- package/src/commands/context-command.mjs +31 -0
- package/src/commands/coverage-verdict.mjs +15 -2
- package/src/commands/debt.mjs +30 -0
- package/src/commands/decisions.mjs +59 -10
- package/src/commands/delta.mjs +263 -49
- package/src/commands/diff.mjs +45 -0
- package/src/commands/discover.mjs +37 -0
- package/src/commands/drift.mjs +45 -0
- package/src/commands/evolution.mjs +22 -2
- package/src/commands/explain-capability.mjs +11 -0
- package/src/commands/explain.mjs +24 -0
- package/src/commands/fitness.mjs +119 -10
- package/src/commands/govern-capability.mjs +16 -0
- package/src/commands/graph.mjs +39 -0
- package/src/commands/health.mjs +34 -0
- package/src/commands/history.mjs +85 -2
- package/src/commands/impact.mjs +23 -0
- package/src/commands/inspect-capability.mjs +16 -0
- package/src/commands/plan-context-command.mjs +35 -0
- package/src/commands/policy.mjs +42 -4
- package/src/commands/provenance-command.mjs +15 -24
- package/src/commands/report.mjs +38 -0
- package/src/commands/rules-capability.mjs +16 -0
- package/src/commands/rules.mjs +3 -1
- package/src/commands/scenario.mjs +23 -0
- package/src/commands/trajectory.mjs +35 -0
- package/src/commands/waivers.mjs +30 -0
- package/src/corpus/goldens/.gitkeep +0 -0
- package/src/corpus/goldens/adr.json +62 -0
- package/src/corpus/goldens/adr.text +6 -0
- package/src/corpus/goldens/change.json +98 -0
- package/src/corpus/goldens/change.text +6 -0
- package/src/corpus/goldens/check.json +90 -0
- package/src/corpus/goldens/check.sarif +479 -0
- package/src/corpus/goldens/check.text +9 -0
- package/src/corpus/goldens/context.json +47 -0
- package/src/corpus/goldens/context.text +6 -0
- package/src/corpus/goldens/debt.json +59 -0
- package/src/corpus/goldens/debt.text +7 -0
- package/src/corpus/goldens/decisions.json +74 -0
- package/src/corpus/goldens/decisions.text +7 -0
- package/src/corpus/goldens/delta.json +94 -0
- package/src/corpus/goldens/delta.sarif +472 -0
- package/src/corpus/goldens/delta.text +5 -0
- package/src/corpus/goldens/diff.json +58 -0
- package/src/corpus/goldens/diff.text +4 -0
- package/src/corpus/goldens/discover.json +77 -0
- package/src/corpus/goldens/discover.text +10 -0
- package/src/corpus/goldens/drift.json +43 -0
- package/src/corpus/goldens/drift.text +3 -0
- package/src/corpus/goldens/evolution.json +328 -0
- package/src/corpus/goldens/evolution.text +32 -0
- package/src/corpus/goldens/explain.json +60 -0
- package/src/corpus/goldens/explain.text +7 -0
- package/src/corpus/goldens/fitness.json +45 -0
- package/src/corpus/goldens/fitness.text +3 -0
- package/src/corpus/goldens/graph.json +78 -0
- package/src/corpus/goldens/graph.text +10 -0
- package/src/corpus/goldens/health.json +72 -0
- package/src/corpus/goldens/health.text +10 -0
- package/src/corpus/goldens/help.text +104 -0
- package/src/corpus/goldens/history.json +43 -0
- package/src/corpus/goldens/history.text +4 -0
- package/src/corpus/goldens/impact.json +327 -0
- package/src/corpus/goldens/impact.text +10 -0
- package/src/corpus/goldens/provenance.json +453 -0
- package/src/corpus/goldens/provenance.text +14 -0
- package/src/corpus/goldens/reconcile.json +168 -0
- package/src/corpus/goldens/reconcile.text +3 -0
- package/src/corpus/goldens/report.json +168 -0
- package/src/corpus/goldens/report.text +42 -0
- package/src/corpus/goldens/rules verify.json +0 -0
- package/src/corpus/goldens/rules verify.text +0 -0
- package/src/corpus/goldens/scenario.json +441 -0
- package/src/corpus/goldens/scenario.text +28 -0
- package/src/corpus/goldens/trajectory.json +83 -0
- package/src/corpus/goldens/trajectory.text +10 -0
- package/src/corpus/goldens/usage-error.text +105 -0
- package/src/corpus/goldens/waivers.json +40 -0
- package/src/corpus/goldens/waivers.text +1 -0
- package/src/corpus/goldens-lsp/initialize.result.json +15 -0
- package/src/corpus/goldens-lsp/publish-cleared-empty.json +4 -0
- package/src/corpus/goldens-lsp/publish-fixed-empty.json +5 -0
- package/src/corpus/goldens-lsp/publish-unparseable.json +54 -0
- package/src/corpus/goldens-lsp/publish-violation.json +22 -0
- package/src/corpus/goldens-lsp/register-watched-files.json +72 -0
- package/src/go-work.mjs +8 -23
- package/src/governance/evolution-event.mjs +15 -0
- package/src/governance/evolution-store.mjs +59 -31
- package/src/governance/provenance-record.mjs +0 -152
- package/src/governance/verdict.mjs +26 -3
- package/src/intent/intent-manifest.json +14 -14
- package/src/lsp/server.mjs +5 -8
- package/src/lsp/workspace-index.mjs +55 -220
- package/src/options.mjs +10 -0
- package/src/providers/native/discover.mjs +13 -12
- package/src/providers/native/model.mjs +8 -3
- package/src/providers/nx-static.mjs +231 -0
- package/src/report/json.mjs +3 -2
- package/src/report/sarif.mjs +8 -3
- package/src/rules/edge-constraints.mjs +9 -0
- package/src/rules/index.mjs +26 -10
- package/src/rules/messages.mjs +64 -14
- package/src/rules/specifiers.mjs +21 -20
- package/src/tsconfig-paths.mjs +8 -14
- package/src/verdict.mjs +127 -16
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"tool": {
|
|
4
|
+
"name": "@ecoma-io/archkeep",
|
|
5
|
+
"version": "0.26.0"
|
|
6
|
+
},
|
|
7
|
+
"command": "check",
|
|
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
|
+
"1 file exempted from coverage by archkeep.json's coverage.exempt"
|
|
29
|
+
],
|
|
30
|
+
"coverageGaps": []
|
|
31
|
+
},
|
|
32
|
+
"result": {
|
|
33
|
+
"policy": {
|
|
34
|
+
"profile": null,
|
|
35
|
+
"source": "module-boundaries.config.mjs",
|
|
36
|
+
"fingerprint": "e18ba4307f6baaaa0d558822327788e8925cb3c52dfac6b170ce4d89b5a728ca"
|
|
37
|
+
},
|
|
38
|
+
"violations": [],
|
|
39
|
+
"goWork": null,
|
|
40
|
+
"tsconfigPaths": null,
|
|
41
|
+
"declaredEdges": null,
|
|
42
|
+
"intent": {
|
|
43
|
+
"checked": true,
|
|
44
|
+
"file": "architecture-intent.json",
|
|
45
|
+
"verdict": "ok",
|
|
46
|
+
"findings": [],
|
|
47
|
+
"unresolved": [],
|
|
48
|
+
"boundaries": [
|
|
49
|
+
{
|
|
50
|
+
"name": "core",
|
|
51
|
+
"projects": [
|
|
52
|
+
"core"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "api",
|
|
57
|
+
"projects": [
|
|
58
|
+
"api"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "app",
|
|
63
|
+
"projects": [
|
|
64
|
+
"app"
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"fitness": {
|
|
70
|
+
"checked": true,
|
|
71
|
+
"verdict": "pass",
|
|
72
|
+
"functions": [
|
|
73
|
+
{
|
|
74
|
+
"verdict": "pass",
|
|
75
|
+
"name": "cycle-free",
|
|
76
|
+
"evidence": {
|
|
77
|
+
"projects": 3,
|
|
78
|
+
"cycles": 0
|
|
79
|
+
},
|
|
80
|
+
"message": "3 matched projects form no dependency cycle",
|
|
81
|
+
"rows": []
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"decision": {
|
|
87
|
+
"verdict": "pass"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
@@ -0,0 +1,479 @@
|
|
|
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
|
+
"properties": {
|
|
463
|
+
"policy": {
|
|
464
|
+
"profile": null,
|
|
465
|
+
"source": "module-boundaries.config.mjs",
|
|
466
|
+
"fingerprint": "e18ba4307f6baaaa0d558822327788e8925cb3c52dfac6b170ce4d89b5a728ca"
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
"results": [],
|
|
470
|
+
"invocations": [
|
|
471
|
+
{
|
|
472
|
+
"executionSuccessful": true,
|
|
473
|
+
"toolExecutionNotifications": []
|
|
474
|
+
}
|
|
475
|
+
]
|
|
476
|
+
}
|
|
477
|
+
]
|
|
478
|
+
}
|
|
479
|
+
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
policy module-boundaries.config.mjs — fingerprint e18ba4307f6baaaa0d558822327788e8925cb3c52dfac6b170ce4d89b5a728ca
|
|
2
|
+
|
|
3
|
+
✔ no boundary violations (2 imports in 3 files across 3 projects; 1 file exempted from coverage by archkeep.json's coverage.exempt)
|
|
4
|
+
|
|
5
|
+
✔ architecture-intent agrees with the observed graph (3 boundaries)
|
|
6
|
+
|
|
7
|
+
✔ cycle-free 3 matched projects form no dependency cycle
|
|
8
|
+
|
|
9
|
+
✔ fitness: 1 function passed
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"tool": {
|
|
4
|
+
"name": "@ecoma-io/archkeep",
|
|
5
|
+
"version": "0.26.0"
|
|
6
|
+
},
|
|
7
|
+
"command": "context",
|
|
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 violations cover only depConstraints (3 of 15 violation types). A dependency with no violations here 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
|
+
"project": "core",
|
|
33
|
+
"tags": [
|
|
34
|
+
"layer:core"
|
|
35
|
+
],
|
|
36
|
+
"constraints": [
|
|
37
|
+
{
|
|
38
|
+
"sourceTag": "layer:core",
|
|
39
|
+
"onlyDependOnLibsWithTags": [
|
|
40
|
+
"layer:core"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"dependencies": []
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|