@codependix/boundaries 0.0.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 ADDED
@@ -0,0 +1,748 @@
1
+ # 🚧 Codependix Boundaries
2
+
3
+ **Evaluates declared rules against a graph codependix already built, and reports the edges and cycles that break them.**
4
+
5
+ Codependix draws graphs at three levels and says nothing about whether their
6
+ shape is allowed. This turns it from a documentation tool into a gate, at all
7
+ three levels β€” Nx project edges, NestJS module edges, and file-level import
8
+ edges, judged separately per language even though TypeScript and Python are
9
+ exported together as one `fileImports` graph type.
10
+
11
+ ```bash
12
+ codependix map --check boundaries
13
+ ```
14
+
15
+ ## Why not an ESLint rule
16
+
17
+ `@nx/enforce-module-boundaries` reads import statements, one file at a time.
18
+ Three facts it structurally cannot see:
19
+
20
+ 1. **Implicit edges.** An Nx `implicitDependencies` entry creates a
21
+ project-graph edge with no import statement to flag. `NeighborhoodEdge`
22
+ already carries `implicit`, so codependix holds a fact the lint rule has no
23
+ way to reach.
24
+ 2. **A NestJS module edge is a container fact, not a source fact.**
25
+ `NestjsProjectService.exploreProject` reports what the container resolved,
26
+ so a dynamic module, a `forRootAsync`, or a conditionally composed import
27
+ produces an edge no `import` statement expresses.
28
+ 3. **A rule can be about the graph rather than the edge.** A cycle, or a
29
+ project's dependents, is a statement about a shape, and a rule that sees
30
+ one file at a time cannot make one.
31
+
32
+ What this deliberately does **not** replace: the layered `depConstraints`
33
+ graph in
34
+ [`configuration/eslint.config.ts`](../../configuration/eslint.config.ts), which
35
+ reports at the import site with a line number, and `dependency-cruiser`'s
36
+ `no-circular`, which is already this repository's file-cycle gate.
37
+
38
+ The two were checked against each other rather than assumed equivalent. All 32
39
+ of this repository's `depConstraints` translate mechanically β€”
40
+ `onlyDependOnLibsWithTags` is an `allow` rule, `notDependOnLibsWithTags` is a
41
+ `forbid` rule, and an empty `onlyDependOnLibsWithTags` is a `forbid` reaching
42
+ everything β€” and with `edges: { implicit: false }` all 32 pass, exactly as
43
+ ESLint reports them. Without that narrowing one more edge is reported:
44
+ `conformetry-examples β†’ conformetry-cli`, declared by an `implicitDependencies`
45
+ entry with no import statement behind it. Its own `depConstraint` comment says
46
+ that dependency should not exist, and ESLint has nothing to flag. Whether that
47
+ is a finding or a false positive is the question `edges` exists to let a rule
48
+ answer.
49
+
50
+ ## The rule model
51
+
52
+ Rules are declared in `codependix.config.ts`, keyed by the graph level that
53
+ judges them β€” `nestjsModules`, `nxProjects`, and `fileImports`, which nests by
54
+ language as `{ typescript, python }` since no edge ever crosses the two. A
55
+ level declaring no rule is never built at all, which is what keeps the gate
56
+ affordable: judging the NestJS level means booting every container in
57
+ preview mode.
58
+
59
+ Two shapes and three kinds β€” an access rule, written as `from`/`to` with the
60
+ verdict running one way or the other, and an `acyclic` rule scoped by `nodes`:
61
+
62
+ | Kind | Reports |
63
+ | ---- | ------- |
64
+ | `forbid` | An edge whose source matches `from` and whose target matches `to` |
65
+ | `allow` | An edge leaving `from` for anywhere `to` does not claim |
66
+ | `acyclic` | A cycle among the nodes `nodes` selects, defaulting to every node |
67
+
68
+ An access rule may also narrow **which edges** it judges, rather than which
69
+ nodes it selects:
70
+
71
+ | `edges` | Judges |
72
+ | ------- | ------ |
73
+ | unset | every edge β€” the stricter reading, and the right default for a rule about what a project may _depend on_ |
74
+ | `{ implicit: false }` | only edges backed by an import statement β€” exactly what an `@nx/enforce-module-boundaries` `depConstraint` sees |
75
+ | `{ implicit: true }` | only edges an `implicitDependencies` entry declares and no import backs |
76
+
77
+ Only the Nx level draws an implicit edge; every other level's edges are read as
78
+ explicit.
79
+
80
+ Each rule carries a `name` and, optionally, a `message` saying why it exists.
81
+ The message is **appended** to the generated sentence rather than replacing
82
+ it, so no wording a configuration chooses can cost a report the rule that
83
+ fired and both ends of what it fired on.
84
+
85
+ ## Selectors
86
+
87
+ One node shape covers three vocabularies, and every field is a list of globs
88
+ matched with `path.matchesGlob`:
89
+
90
+ | Field | Matches | Available at |
91
+ | ----- | ------- | ------------ |
92
+ | `id` | The node's identifier β€” a project name, a file path, or a module class name | every level |
93
+ | `path` | A workspace-relative project root, or a project-relative file path | `nxProjects`, `fileImports.typescript`, `fileImports.python` |
94
+ | `project` | The Nx project a node belongs to | `nxProjects`, `fileImports.typescript`, `fileImports.python` |
95
+ | `tags` | The node's Nx tags; one tag matching is enough | `nxProjects` |
96
+
97
+ Every field a selector states must match β€” the fields narrow each other.
98
+ Within one field, one glob matching is enough. A selector naming a field its
99
+ level does not carry matches **nothing** rather than everything: a `path` rule
100
+ evaluated against a NestJS module graph, which carries no file paths, selects
101
+ no module instead of silently selecting all of them. A selector stating no
102
+ field at all is refused by the configuration schema, since it reads exactly
103
+ like a typo.
104
+
105
+ ## The two halves, and the one seam between them
106
+
107
+ `src/modules/boundaries/` evaluates rules and knows nothing about workspaces: a
108
+ `BoundaryGraph` and a list of rules go in, and violations come out.
109
+ `src/modules/boundary-check/` is what turns a real workspace into those graphs
110
+ β€” one adapter per level, plus the orchestration around them.
111
+
112
+ `BoundaryGraph` is the seam, and it is deliberately not any of the four real
113
+ graph types. Each adapter flattens a `Neighborhood`, a `NestjsModuleGraph`, or
114
+ an import graph into it, so rule evaluation never sees `@nx/devkit`,
115
+ `@nestjs/core`, or `typescript` and could be lifted out again without
116
+ touching a rule.
117
+
118
+ `BoundaryCheckService.run` walks the four levels in `BOUNDARY_LEVEL_ORDER` β€”
119
+ cheapest first β€” and **skips any level with no declared rules before building
120
+ anything**. That is what keeps the gate affordable: judging the NestJS level
121
+ means booting every container in preview mode, and judging the TypeScript level
122
+ means building a `ts.Program` per project. A workspace declaring only Nx rules
123
+ pays for neither. Each level also isolates one project's failure to that
124
+ project, so a container that will not boot is collected as a
125
+ `BoundaryCheckFailure` while every other project is still judged.
126
+
127
+ Nothing here depends on `@codependix/cli` β€” the host calls in, never the
128
+ reverse β€” and a rule in `configuration/codependix.config.ts` says so, so the
129
+ two cannot close a cycle.
130
+
131
+ ## Test
132
+
133
+ ```bash
134
+ nx run codependix-boundaries:vitest
135
+ ```
136
+
137
+ ## πŸ‘” Conformetry
138
+
139
+ This project was generated from the [nestjs-service-project](../../configuration/conformetry-templates/nestjs-service-project) conformetry template.
140
+
141
+ ## πŸ•ΈοΈ Codependix
142
+
143
+ Dependency graphs exported by [codependix](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-cli), regenerated by `nx run codebase:codependix:write`.
144
+
145
+ ### Nx Neighborhood
146
+
147
+ <!-- codependix:start name="codependix-nx-projects" -->
148
+ ```mermaid
149
+ graph LR
150
+ codependix_boundaries["codependix-boundaries"]
151
+ codependix_cli["codependix-cli"]
152
+ codependix_configuration["codependix-configuration"]
153
+ codependix_core["codependix-core"]
154
+ codependix_examples["codependix-examples"]
155
+ codependix_file_imports["codependix-file-imports"]
156
+ codependix_nestjs_modules["codependix-nestjs-modules"]
157
+ codependix_nx_projects["codependix-nx-projects"]
158
+ codependix_output["codependix-output"]
159
+ codependix_boundaries --> codependix_configuration
160
+ codependix_boundaries --> codependix_core
161
+ codependix_boundaries --> codependix_file_imports
162
+ codependix_boundaries --> codependix_nestjs_modules
163
+ codependix_boundaries --> codependix_nx_projects
164
+ codependix_cli --> codependix_boundaries
165
+ codependix_examples --> codependix_boundaries
166
+ codependix_output --> codependix_boundaries
167
+ classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
168
+ class codependix_boundaries subject
169
+ ```
170
+ <!-- codependix:end name="codependix-nx-projects" -->
171
+
172
+ ### NestJS Module Graph
173
+
174
+ <!-- codependix:start name="codependix-nestjs-modules" -->
175
+ ```mermaid
176
+ flowchart LR
177
+ BoundariesModule
178
+ BoundaryCheckModule
179
+ ConfigurationModule
180
+ InputModule
181
+ LoggerModule([LoggerModule])
182
+ ModuleGraphModule
183
+ NeighborhoodModule
184
+ NestjsProjectModule
185
+ OverrideResolutionModule
186
+ PythonModule
187
+ RunContextModule
188
+ TypescriptModule
189
+ WorkspaceGraphModule
190
+ BoundaryCheckModule --> BoundariesModule
191
+ BoundaryCheckModule --> ModuleGraphModule
192
+ BoundaryCheckModule --> NestjsProjectModule
193
+ BoundaryCheckModule --> PythonModule
194
+ BoundaryCheckModule --> TypescriptModule
195
+ BoundaryCheckModule --> WorkspaceGraphModule
196
+ ConfigurationModule --> InputModule
197
+ ConfigurationModule --> OverrideResolutionModule
198
+ RunContextModule --> ConfigurationModule
199
+ RunContextModule --> NeighborhoodModule
200
+ WorkspaceGraphModule --> NeighborhoodModule
201
+ ```
202
+
203
+ _Rounded modules are global: every module can inject them, so their edges are left out._
204
+ <!-- codependix:end name="codependix-nestjs-modules" -->
205
+
206
+ ### File Imports
207
+
208
+ <!-- codependix:start name="codependix-file-imports" -->
209
+ ```mermaid
210
+ graph LR
211
+ file_callidescope_config_ts["callidescope.config.ts"]
212
+ file_codependix_config_ts["codependix.config.ts"]
213
+ file_codometer_config_ts["codometer.config.ts"]
214
+ file_eslint_config_ts["eslint.config.ts"]
215
+ file_src_index_ts["src/index.ts"]
216
+ file_src_modules_boundaries_boundaries_constants_ts["src/modules/boundaries/boundaries.constants.ts"]
217
+ file_src_modules_boundaries_boundaries_module_ts["src/modules/boundaries/boundaries.module.ts"]
218
+ file_src_modules_boundaries_boundaries_module_unit_test_ts["src/modules/boundaries/boundaries.module.unit.test.ts"]
219
+ file_src_modules_boundaries_boundaries_service_ts["src/modules/boundaries/boundaries.service.ts"]
220
+ file_src_modules_boundaries_boundaries_service_unit_test_ts["src/modules/boundaries/boundaries.service.unit.test.ts"]
221
+ file_src_modules_boundaries_boundaries_types_ts["src/modules/boundaries/boundaries.types.ts"]
222
+ file_src_modules_boundaries_boundary_cycles_service_ts["src/modules/boundaries/boundary-cycles.service.ts"]
223
+ file_src_modules_boundaries_boundary_cycles_service_unit_test_ts["src/modules/boundaries/boundary-cycles.service.unit.test.ts"]
224
+ file_src_modules_boundaries_boundary_report_service_ts["src/modules/boundaries/boundary-report.service.ts"]
225
+ file_src_modules_boundaries_boundary_report_service_unit_test_ts["src/modules/boundaries/boundary-report.service.unit.test.ts"]
226
+ file_src_modules_boundaries_boundary_selector_service_ts["src/modules/boundaries/boundary-selector.service.ts"]
227
+ file_src_modules_boundaries_boundary_selector_service_unit_test_ts["src/modules/boundaries/boundary-selector.service.unit.test.ts"]
228
+ file_src_modules_boundary_check_boundary_check_constants_ts["src/modules/boundary-check/boundary-check.constants.ts"]
229
+ file_src_modules_boundary_check_boundary_check_module_ts["src/modules/boundary-check/boundary-check.module.ts"]
230
+ file_src_modules_boundary_check_boundary_check_module_unit_test_ts["src/modules/boundary-check/boundary-check.module.unit.test.ts"]
231
+ file_src_modules_boundary_check_boundary_check_service_ts["src/modules/boundary-check/boundary-check.service.ts"]
232
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts["src/modules/boundary-check/boundary-check.service.unit.test.ts"]
233
+ file_src_modules_boundary_check_boundary_check_types_ts["src/modules/boundary-check/boundary-check.types.ts"]
234
+ file_src_modules_boundary_check_boundary_graph_service_ts["src/modules/boundary-check/boundary-graph.service.ts"]
235
+ file_src_modules_boundary_check_boundary_graph_service_unit_test_ts["src/modules/boundary-check/boundary-graph.service.unit.test.ts"]
236
+ file_src_modules_run_context_run_context_constants_ts["src/modules/run-context/run-context.constants.ts"]
237
+ file_src_modules_run_context_run_context_module_ts["src/modules/run-context/run-context.module.ts"]
238
+ file_src_modules_run_context_run_context_module_unit_test_ts["src/modules/run-context/run-context.module.unit.test.ts"]
239
+ file_src_modules_run_context_run_context_service_ts["src/modules/run-context/run-context.service.ts"]
240
+ file_src_modules_run_context_run_context_service_unit_test_ts["src/modules/run-context/run-context.service.unit.test.ts"]
241
+ file_src_modules_run_context_run_context_types_ts["src/modules/run-context/run-context.types.ts"]
242
+ file_testing_mocks_ts["testing/mocks.ts"]
243
+ file_testing_setup_ts["testing/setup.ts"]
244
+ file_vite_config_ts["vite.config.ts"]
245
+ file_vitest_config_ts["vitest.config.ts"]
246
+ file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundaries_service_ts
247
+ file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
248
+ file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_report_service_ts
249
+ file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_selector_service_ts
250
+ file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundaries_module_ts
251
+ file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
252
+ file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
253
+ file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_report_service_ts
254
+ file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
255
+ file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundaries_constants_ts
256
+ file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundaries_types_ts
257
+ file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
258
+ file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundary_selector_service_ts
259
+ file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
260
+ file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
261
+ file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
262
+ file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
263
+ file_src_modules_boundaries_boundary_cycles_service_ts --> file_src_modules_boundaries_boundaries_types_ts
264
+ file_src_modules_boundaries_boundary_cycles_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
265
+ file_src_modules_boundaries_boundary_cycles_service_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
266
+ file_src_modules_boundaries_boundary_report_service_ts --> file_src_modules_boundaries_boundaries_types_ts
267
+ file_src_modules_boundaries_boundary_report_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
268
+ file_src_modules_boundaries_boundary_report_service_unit_test_ts --> file_src_modules_boundaries_boundary_report_service_ts
269
+ file_src_modules_boundaries_boundary_selector_service_ts --> file_src_modules_boundaries_boundaries_types_ts
270
+ file_src_modules_boundaries_boundary_selector_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
271
+ file_src_modules_boundaries_boundary_selector_service_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
272
+ file_src_modules_boundary_check_boundary_check_constants_ts --> file_src_modules_boundaries_boundaries_types_ts
273
+ file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundaries_boundaries_module_ts
274
+ file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundary_check_boundary_check_service_ts
275
+ file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
276
+ file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_check_module_ts
277
+ file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_check_service_ts
278
+ file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
279
+ file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundaries_boundaries_service_ts
280
+ file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundaries_boundaries_types_ts
281
+ file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_check_constants_ts
282
+ file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_check_types_ts
283
+ file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
284
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
285
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
286
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_check_service_ts
287
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_check_types_ts
288
+ file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
289
+ file_src_modules_boundary_check_boundary_check_types_ts --> file_src_modules_boundaries_boundaries_types_ts
290
+ file_src_modules_boundary_check_boundary_graph_service_ts --> file_src_modules_boundaries_boundaries_types_ts
291
+ file_src_modules_boundary_check_boundary_graph_service_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
292
+ file_src_modules_run_context_run_context_module_ts --> file_src_modules_run_context_run_context_service_ts
293
+ file_src_modules_run_context_run_context_module_unit_test_ts --> file_src_modules_run_context_run_context_module_ts
294
+ file_src_modules_run_context_run_context_module_unit_test_ts --> file_src_modules_run_context_run_context_service_ts
295
+ file_src_modules_run_context_run_context_service_ts --> file_src_modules_run_context_run_context_types_ts
296
+ file_src_modules_run_context_run_context_service_unit_test_ts --> file_src_modules_run_context_run_context_service_ts
297
+ ```
298
+ <!-- codependix:end name="codependix-file-imports" -->
299
+
300
+ <!-- codometer:start -->
301
+
302
+ ## ⏲️ Codometer
303
+
304
+ ### Project
305
+
306
+ ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-3499-22c55e?style=flat-square)
307
+ ![Repository Size](https://img.shields.io/badge/Repository_Size-121.77_kB-6b7280?style=flat-square)
308
+ ![Folders](https://img.shields.io/badge/Folders-6-4a4a4a?style=flat-square)
309
+ ![Source Files](https://img.shields.io/badge/Source_Files-35-3178c6?style=flat-square)
310
+
311
+ ### Measured Targets
312
+
313
+ ![Compiled JavaScript Size](https://img.shields.io/badge/Compiled_JavaScript_Size-4.06_kB_gzip-6b7280?style=flat-square)
314
+
315
+ ### TypeScript
316
+
317
+ ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-35-3178c6?style=flat-square)
318
+ ![Interfaces](https://img.shields.io/badge/Interfaces-13-0ea5e9?style=flat-square)
319
+ ![Generic Declarations](https://img.shields.io/badge/Generic_Declarations-0-0369a1?style=flat-square)
320
+ ![Enums](https://img.shields.io/badge/Enums-0-f97316?style=flat-square)
321
+ ![Decorators](https://img.shields.io/badge/Decorators-10-db2777?style=flat-square)
322
+ ![Doc Comments](https://img.shields.io/badge/Doc_Comments-92-6366f1?style=flat-square)
323
+ ![Static Methods](https://img.shields.io/badge/Static_Methods-0-166534?style=flat-square)
324
+
325
+ ### JavaScript
326
+
327
+ ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-0-f7df1e?style=flat-square)
328
+ ![Test Files](https://img.shields.io/badge/Test_Files-10-10b981?style=flat-square)
329
+ ![External Packages](https://img.shields.io/badge/External_Packages-13-8b5cf6?style=flat-square)
330
+ ![Classes](https://img.shields.io/badge/Classes-10-7c3aed?style=flat-square)
331
+ ![Functions](https://img.shields.io/badge/Functions-137-16a34a?style=flat-square)
332
+ ![Methods](https://img.shields.io/badge/Methods-67-15803d?style=flat-square)
333
+ ![Sync Functions](https://img.shields.io/badge/Sync_Functions-152-4ade80?style=flat-square)
334
+ ![Async Functions](https://img.shields.io/badge/Async_Functions-52-059669?style=flat-square)
335
+ ![Constants](https://img.shields.io/badge/Constants-114-dc2626?style=flat-square)
336
+ ![Imports](https://img.shields.io/badge/Imports-132-0284c7?style=flat-square)
337
+ ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-32-ea580c?style=flat-square)
338
+ ![Comments](https://img.shields.io/badge/Comments-169-64748b?style=flat-square)
339
+ ![Comment Lines](https://img.shields.io/badge/Comment_Lines-534-475569?style=flat-square)
340
+ ![TODO Comments](https://img.shields.io/badge/TODO_Comments-0-ca8a04?style=flat-square)
341
+
342
+ ### Python
343
+
344
+ ![Python Files](https://img.shields.io/badge/Python_Files-0-3776ab?style=flat-square)
345
+ ![Python Lines](https://img.shields.io/badge/Python_Lines-0-4b8bbe?style=flat-square)
346
+ ![Python Classes](https://img.shields.io/badge/Python_Classes-0-7c3aed?style=flat-square)
347
+ ![Python Functions](https://img.shields.io/badge/Python_Functions-0-16a34a?style=flat-square)
348
+ ![Python Protocols](https://img.shields.io/badge/Python_Protocols-0-0ea5e9?style=flat-square)
349
+ ![Python Constants](https://img.shields.io/badge/Python_Constants-0-dc2626?style=flat-square)
350
+ ![Python Imports](https://img.shields.io/badge/Python_Imports-0-0284c7?style=flat-square)
351
+ ![Python Decorators](https://img.shields.io/badge/Python_Decorators-0-db2777?style=flat-square)
352
+ ![Docstrings](https://img.shields.io/badge/Docstrings-0-6366f1?style=flat-square)
353
+ ![Docstring Lines](https://img.shields.io/badge/Docstring_Lines-0-818cf8?style=flat-square)
354
+ ![Python Comments](https://img.shields.io/badge/Python_Comments-0-64748b?style=flat-square)
355
+ ![Python Comment Lines](https://img.shields.io/badge/Python_Comment_Lines-0-475569?style=flat-square)
356
+
357
+ ### JSON
358
+
359
+ ![JSON Files](https://img.shields.io/badge/JSON_Files-4-a16207?style=flat-square)
360
+ ![JSON Lines](https://img.shields.io/badge/JSON_Lines-166-ca8a04?style=flat-square)
361
+ ![JSON Objects](https://img.shields.io/badge/JSON_Objects-38-7c3aed?style=flat-square)
362
+ ![JSON Arrays](https://img.shields.io/badge/JSON_Arrays-13-8b5cf6?style=flat-square)
363
+ ![JSON Properties](https://img.shields.io/badge/JSON_Properties-104-0284c7?style=flat-square)
364
+ ![JSON Strings](https://img.shields.io/badge/JSON_Strings-91-16a34a?style=flat-square)
365
+ ![JSON Numbers](https://img.shields.io/badge/JSON_Numbers-1-059669?style=flat-square)
366
+ ![JSON Booleans](https://img.shields.io/badge/JSON_Booleans-7-0ea5e9?style=flat-square)
367
+ ![JSON Nulls](https://img.shields.io/badge/JSON_Nulls-0-64748b?style=flat-square)
368
+ ![JSON Items](https://img.shields.io/badge/JSON_Items-42-475569?style=flat-square)
369
+ ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-150-dc2626?style=flat-square)
370
+ ![JSON Max Depth](https://img.shields.io/badge/JSON_Max_Depth-5-ea580c?style=flat-square)
371
+
372
+ ### YAML
373
+
374
+ ![YAML Files](https://img.shields.io/badge/YAML_Files-0-cb171e?style=flat-square)
375
+ ![YAML Lines](https://img.shields.io/badge/YAML_Lines-0-e34c26?style=flat-square)
376
+ ![YAML Documents](https://img.shields.io/badge/YAML_Documents-0-f97316?style=flat-square)
377
+ ![YAML Mappings](https://img.shields.io/badge/YAML_Mappings-0-7c3aed?style=flat-square)
378
+ ![YAML Sequences](https://img.shields.io/badge/YAML_Sequences-0-8b5cf6?style=flat-square)
379
+ ![YAML Keys](https://img.shields.io/badge/YAML_Keys-0-0284c7?style=flat-square)
380
+ ![YAML Scalars](https://img.shields.io/badge/YAML_Scalars-0-16a34a?style=flat-square)
381
+ ![YAML Anchors](https://img.shields.io/badge/YAML_Anchors-0-059669?style=flat-square)
382
+ ![YAML Aliases](https://img.shields.io/badge/YAML_Aliases-0-10b981?style=flat-square)
383
+ ![YAML Comments](https://img.shields.io/badge/YAML_Comments-0-64748b?style=flat-square)
384
+ ![YAML Max Depth](https://img.shields.io/badge/YAML_Max_Depth-0-ea580c?style=flat-square)
385
+
386
+ ### TOML
387
+
388
+ ![TOML Files](https://img.shields.io/badge/TOML_Files-0-9c4221?style=flat-square)
389
+ ![TOML Lines](https://img.shields.io/badge/TOML_Lines-0-b45309?style=flat-square)
390
+ ![TOML Tables](https://img.shields.io/badge/TOML_Tables-0-7c3aed?style=flat-square)
391
+ ![TOML Array Tables](https://img.shields.io/badge/TOML_Array_Tables-0-8b5cf6?style=flat-square)
392
+ ![TOML Keys](https://img.shields.io/badge/TOML_Keys-0-0284c7?style=flat-square)
393
+ ![TOML Arrays](https://img.shields.io/badge/TOML_Arrays-0-16a34a?style=flat-square)
394
+ ![TOML Comments](https://img.shields.io/badge/TOML_Comments-0-64748b?style=flat-square)
395
+
396
+ ### Shell
397
+
398
+ ![Shell Files](https://img.shields.io/badge/Shell_Files-0-89e051?style=flat-square)
399
+ ![Shell Lines](https://img.shields.io/badge/Shell_Lines-0-4eaa25?style=flat-square)
400
+ ![Shell Functions](https://img.shields.io/badge/Shell_Functions-0-16a34a?style=flat-square)
401
+ ![Shell Variables](https://img.shields.io/badge/Shell_Variables-0-0284c7?style=flat-square)
402
+ ![Shell Exports](https://img.shields.io/badge/Shell_Exports-0-ea580c?style=flat-square)
403
+ ![Shell Conditionals](https://img.shields.io/badge/Shell_Conditionals-0-7c3aed?style=flat-square)
404
+ ![Shell Loops](https://img.shields.io/badge/Shell_Loops-0-8b5cf6?style=flat-square)
405
+ ![Shell Pipelines](https://img.shields.io/badge/Shell_Pipelines-0-059669?style=flat-square)
406
+ ![Shebangs](https://img.shields.io/badge/Shebangs-0-6b7280?style=flat-square)
407
+ ![Shell Comments](https://img.shields.io/badge/Shell_Comments-0-64748b?style=flat-square)
408
+ ![Shell Comment Lines](https://img.shields.io/badge/Shell_Comment_Lines-0-475569?style=flat-square)
409
+
410
+ ### SQL
411
+
412
+ ![SQL Files](https://img.shields.io/badge/SQL_Files-0-e38c00?style=flat-square)
413
+ ![SQL Lines](https://img.shields.io/badge/SQL_Lines-0-f29111?style=flat-square)
414
+ ![SQL Statements](https://img.shields.io/badge/SQL_Statements-0-7c3aed?style=flat-square)
415
+ ![SQL Selects](https://img.shields.io/badge/SQL_Selects-0-16a34a?style=flat-square)
416
+ ![SQL Inserts](https://img.shields.io/badge/SQL_Inserts-0-22c55e?style=flat-square)
417
+ ![SQL Updates](https://img.shields.io/badge/SQL_Updates-0-0ea5e9?style=flat-square)
418
+ ![SQL Deletes](https://img.shields.io/badge/SQL_Deletes-0-dc2626?style=flat-square)
419
+ ![SQL Creates](https://img.shields.io/badge/SQL_Creates-0-0284c7?style=flat-square)
420
+ ![SQL Joins](https://img.shields.io/badge/SQL_Joins-0-8b5cf6?style=flat-square)
421
+ ![SQL CTEs](https://img.shields.io/badge/SQL_CTEs-0-059669?style=flat-square)
422
+ ![SQL Comments](https://img.shields.io/badge/SQL_Comments-0-64748b?style=flat-square)
423
+
424
+ ### HCL
425
+
426
+ ![HCL Files](https://img.shields.io/badge/HCL_Files-0-844fba?style=flat-square)
427
+ ![HCL Lines](https://img.shields.io/badge/HCL_Lines-0-a78bfa?style=flat-square)
428
+ ![HCL Blocks](https://img.shields.io/badge/HCL_Blocks-0-7c3aed?style=flat-square)
429
+ ![HCL Resources](https://img.shields.io/badge/HCL_Resources-0-0284c7?style=flat-square)
430
+ ![HCL Variables](https://img.shields.io/badge/HCL_Variables-0-16a34a?style=flat-square)
431
+ ![HCL Outputs](https://img.shields.io/badge/HCL_Outputs-0-059669?style=flat-square)
432
+ ![HCL Attributes](https://img.shields.io/badge/HCL_Attributes-0-0ea5e9?style=flat-square)
433
+ ![HCL Interpolations](https://img.shields.io/badge/HCL_Interpolations-0-db2777?style=flat-square)
434
+ ![HCL Comments](https://img.shields.io/badge/HCL_Comments-0-64748b?style=flat-square)
435
+
436
+ ### CSS
437
+
438
+ ![CSS Files](https://img.shields.io/badge/CSS_Files-0-264de4?style=flat-square)
439
+ ![CSS Lines](https://img.shields.io/badge/CSS_Lines-0-2965f1?style=flat-square)
440
+ ![CSS Rules](https://img.shields.io/badge/CSS_Rules-0-7c3aed?style=flat-square)
441
+ ![CSS Selectors](https://img.shields.io/badge/CSS_Selectors-0-8b5cf6?style=flat-square)
442
+ ![CSS Declarations](https://img.shields.io/badge/CSS_Declarations-0-0284c7?style=flat-square)
443
+ ![CSS At Rules](https://img.shields.io/badge/CSS_At_Rules-0-f97316?style=flat-square)
444
+ ![CSS Media Queries](https://img.shields.io/badge/CSS_Media_Queries-0-ea580c?style=flat-square)
445
+ ![CSS Custom Properties](https://img.shields.io/badge/CSS_Custom_Properties-0-16a34a?style=flat-square)
446
+ ![CSS Comments](https://img.shields.io/badge/CSS_Comments-0-64748b?style=flat-square)
447
+
448
+ ### Conventions
449
+
450
+ ![Module Files](https://img.shields.io/badge/Module_Files-3-7c3aed?style=flat-square)
451
+ ![Service Files](https://img.shields.io/badge/Service_Files-7-0284c7?style=flat-square)
452
+ ![Command Files](https://img.shields.io/badge/Command_Files-0-16a34a?style=flat-square)
453
+ ![Constants Files](https://img.shields.io/badge/Constants_Files-3-ea580c?style=flat-square)
454
+ ![Types Files](https://img.shields.io/badge/Types_Files-3-db2777?style=flat-square)
455
+ ![Utilities Files](https://img.shields.io/badge/Utilities_Files-0-0ea5e9?style=flat-square)
456
+ ![TypeORM Entities](https://img.shields.io/badge/TypeORM_Entities-0-059669?style=flat-square)
457
+ ![Unit Tests](https://img.shields.io/badge/Unit_Tests-10-ca8a04?style=flat-square)
458
+ ![Integration Tests](https://img.shields.io/badge/Integration_Tests-0-7c3aed?style=flat-square)
459
+ ![End To End Tests](https://img.shields.io/badge/End_To_End_Tests-0-0284c7?style=flat-square)
460
+ ![CSS Comment Budget](https://img.shields.io/badge/CSS_Comment_Budget-0-16a34a?style=flat-square)
461
+ ![HCL Comment Budget](https://img.shields.io/badge/HCL_Comment_Budget-0-ea580c?style=flat-square)
462
+ ![Python Comment Budget](https://img.shields.io/badge/Python_Comment_Budget-0-db2777?style=flat-square)
463
+ ![SQL Comment Budget](https://img.shields.io/badge/SQL_Comment_Budget-0-0ea5e9?style=flat-square)
464
+ ![TOML Comment Budget](https://img.shields.io/badge/TOML_Comment_Budget-0-059669?style=flat-square)
465
+ ![TypeScript Comment Budget](https://img.shields.io/badge/TypeScript_Comment_Budget-0-ca8a04?style=flat-square)
466
+ ![YAML Comment Budget](https://img.shields.io/badge/YAML_Comment_Budget-0-7c3aed?style=flat-square)
467
+ ![Shell Comment Budget](https://img.shields.io/badge/Shell_Comment_Budget-0-0284c7?style=flat-square)
468
+
469
+ ### Jupyter
470
+
471
+ ![Notebooks](https://img.shields.io/badge/Notebooks-0-f37626?style=flat-square)
472
+ ![Notebook Cells](https://img.shields.io/badge/Notebook_Cells-0-e8a33d?style=flat-square)
473
+ ![Code Cells](https://img.shields.io/badge/Code_Cells-0-3776ab?style=flat-square)
474
+ ![Markdown Cells](https://img.shields.io/badge/Markdown_Cells-0-083fa1?style=flat-square)
475
+ ![Raw Cells](https://img.shields.io/badge/Raw_Cells-0-9ca3af?style=flat-square)
476
+ ![Executed Cells](https://img.shields.io/badge/Executed_Cells-0-16a34a?style=flat-square)
477
+ ![Cell Outputs](https://img.shields.io/badge/Cell_Outputs-0-059669?style=flat-square)
478
+ ![Notebook Code Lines](https://img.shields.io/badge/Notebook_Code_Lines-0-4b8bbe?style=flat-square)
479
+ ![Notebook Classes](https://img.shields.io/badge/Notebook_Classes-0-7c3aed?style=flat-square)
480
+ ![Notebook Functions](https://img.shields.io/badge/Notebook_Functions-0-22c55e?style=flat-square)
481
+ ![Notebook Imports](https://img.shields.io/badge/Notebook_Imports-0-0284c7?style=flat-square)
482
+ ![Notebook Decorators](https://img.shields.io/badge/Notebook_Decorators-0-db2777?style=flat-square)
483
+ ![Notebook Prose Lines](https://img.shields.io/badge/Notebook_Prose_Lines-0-1f6feb?style=flat-square)
484
+ ![Notebook Headings](https://img.shields.io/badge/Notebook_Headings-0-a78bfa?style=flat-square)
485
+ ![Notebook Links](https://img.shields.io/badge/Notebook_Links-0-10b981?style=flat-square)
486
+ ![Notebook Images](https://img.shields.io/badge/Notebook_Images-0-34d399?style=flat-square)
487
+ ![Notebook Code Blocks](https://img.shields.io/badge/Notebook_Code_Blocks-0-dc2626?style=flat-square)
488
+ ![Notebook Properties](https://img.shields.io/badge/Notebook_Properties-0-ca8a04?style=flat-square)
489
+ ![Notebook Nodes](https://img.shields.io/badge/Notebook_Nodes-0-a16207?style=flat-square)
490
+ ![Notebook Max Depth](https://img.shields.io/badge/Notebook_Max_Depth-0-ea580c?style=flat-square)
491
+
492
+ ### Markdown
493
+
494
+ ![Markdown Files](https://img.shields.io/badge/Markdown_Files-1-083fa1?style=flat-square)
495
+ ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-222-1f6feb?style=flat-square)
496
+ ![H1](https://img.shields.io/badge/H1-1-7c3aed?style=flat-square)
497
+ ![H2](https://img.shields.io/badge/H2-7-8b5cf6?style=flat-square)
498
+ ![H3](https://img.shields.io/badge/H3-12-a78bfa?style=flat-square)
499
+ ![H4](https://img.shields.io/badge/H4-0-c4b5fd?style=flat-square)
500
+ ![H5](https://img.shields.io/badge/H5-0-ddd6fe?style=flat-square)
501
+ ![H6](https://img.shields.io/badge/H6-0-ede9fe?style=flat-square)
502
+ ![Paragraphs](https://img.shields.io/badge/Paragraphs-45-64748b?style=flat-square)
503
+ ![Lists](https://img.shields.io/badge/Lists-6-16a34a?style=flat-square)
504
+ ![List Items](https://img.shields.io/badge/List_Items-25-22c55e?style=flat-square)
505
+ ![Task List Items](https://img.shields.io/badge/Task_List_Items-0-4ade80?style=flat-square)
506
+ ![Tables](https://img.shields.io/badge/Tables-2-0284c7?style=flat-square)
507
+ ![Table Rows](https://img.shields.io/badge/Table_Rows-10-0ea5e9?style=flat-square)
508
+ ![Links](https://img.shields.io/badge/Links-9-059669?style=flat-square)
509
+ ![Images](https://img.shields.io/badge/Images-0-10b981?style=flat-square)
510
+ ![Code Blocks](https://img.shields.io/badge/Code_Blocks-11-dc2626?style=flat-square)
511
+ ![Inline Code](https://img.shields.io/badge/Inline_Code-73-ef4444?style=flat-square)
512
+ ![Block Quotes](https://img.shields.io/badge/Block_Quotes-0-ca8a04?style=flat-square)
513
+ ![Thematic Breaks](https://img.shields.io/badge/Thematic_Breaks-0-a16207?style=flat-square)
514
+ <!-- codometer:end -->
515
+
516
+ <!-- callidescope:start -->
517
+
518
+ ## πŸ”­ Callidescope
519
+
520
+ Call stacks traced through `packages/ic-suite/codependix/codependix-boundaries`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
521
+
522
+ | Measure | Value |
523
+ | --- | --- |
524
+ | Callables | 77 |
525
+ | Files | 23 |
526
+ | Calls traced | 83 |
527
+ | Call stacks | 7 |
528
+ | Deepest stack | 12 |
529
+ | Stacks through recursion | 0 |
530
+ | Unfollowable calls | 2 |
531
+
532
+ ### Limits
533
+
534
+ What this project is judged against, as declared in its own `callidescope.config.ts`.
535
+
536
+ | Limit | Value |
537
+ | --- | --- |
538
+ | `maximumDepth` | 12 |
539
+ | `maximumBreadth` | 7 |
540
+
541
+ ### Call stacks (depth)
542
+
543
+ **1. `BoundaryCheckService.nestjsModules`** β€” depth β‰₯ 12 Β· orphan-root
544
+
545
+ ```text
546
+ πŸš€ BoundaryCheckService.nestjsModules(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:145]
547
+ └─> BoundaryCheckService.runNestjsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:158]
548
+ ↳ Judges every `framework:nestjs` project's module graph.
549
+ └─> BoundaryCheckService.runProjectLevel(…): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
550
+ ↳ Judges every project at one level, isolating each project's failure.
551
+ └─> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
552
+ ↳ Every violation one graph's rules report, in the order the rules were declared.
553
+ └─> BoundariesService.flatMap(…)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
554
+ └─> BoundariesService.evaluateAcyclicRule(…): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
555
+ ↳ Reports every cycle an `acyclic` rule's selected nodes still form.
556
+ └─> BoundarySelectorService.selectIds(…): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
557
+ ↳ The ids of every node a selector claims.
558
+ └─> BoundarySelectorService.filter(…)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
559
+ └─> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
560
+ ↳ Whether a selector claims a node.
561
+ └─> BoundarySelectorService.matchesTags(…): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
562
+ ↳ Whether a node carries a tag matching one of a list of globs.
563
+ └─> BoundarySelectorService.some(…)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
564
+ └─> BoundarySelectorService.some(…)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
565
+ ```
566
+
567
+ **2. `BoundaryCheckService.python`** β€” depth β‰₯ 12 Β· orphan-root
568
+
569
+ ```text
570
+ πŸš€ BoundaryCheckService.python(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:148]
571
+ └─> BoundaryCheckService.runPythonImportsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:237]
572
+ ↳ Judges every `language:python` project's file-level import graph.
573
+ └─> BoundaryCheckService.runProjectLevel(…): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
574
+ ↳ Judges every project at one level, isolating each project's failure.
575
+ └─> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
576
+ ↳ Every violation one graph's rules report, in the order the rules were declared.
577
+ └─> BoundariesService.flatMap(…)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
578
+ └─> BoundariesService.evaluateAcyclicRule(…): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
579
+ ↳ Reports every cycle an `acyclic` rule's selected nodes still form.
580
+ └─> BoundarySelectorService.selectIds(…): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
581
+ ↳ The ids of every node a selector claims.
582
+ └─> BoundarySelectorService.filter(…)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
583
+ └─> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
584
+ ↳ Whether a selector claims a node.
585
+ └─> BoundarySelectorService.matchesTags(…): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
586
+ ↳ Whether a node carries a tag matching one of a list of globs.
587
+ └─> BoundarySelectorService.some(…)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
588
+ └─> BoundarySelectorService.some(…)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
589
+ ```
590
+
591
+ **3. `BoundaryCheckService.typescript`** β€” depth β‰₯ 12 Β· orphan-root
592
+
593
+ ```text
594
+ πŸš€ BoundaryCheckService.typescript(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:150]
595
+ └─> BoundaryCheckService.runTypescriptImportsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:253]
596
+ ↳ Judges every TypeScript project's file-level import graph.
597
+ └─> BoundaryCheckService.runProjectLevel(…): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
598
+ ↳ Judges every project at one level, isolating each project's failure.
599
+ └─> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
600
+ ↳ Every violation one graph's rules report, in the order the rules were declared.
601
+ └─> BoundariesService.flatMap(…)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
602
+ └─> BoundariesService.evaluateAcyclicRule(…): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
603
+ ↳ Reports every cycle an `acyclic` rule's selected nodes still form.
604
+ └─> BoundarySelectorService.selectIds(…): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
605
+ ↳ The ids of every node a selector claims.
606
+ └─> BoundarySelectorService.filter(…)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
607
+ └─> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
608
+ ↳ Whether a selector claims a node.
609
+ └─> BoundarySelectorService.matchesTags(…): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
610
+ ↳ Whether a node carries a tag matching one of a list of globs.
611
+ └─> BoundarySelectorService.some(…)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
612
+ └─> BoundarySelectorService.some(…)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
613
+ ```
614
+
615
+ <details>
616
+ <summary>4 more call stacks</summary>
617
+
618
+ **4. `BoundaryCheckService.nxProjects`** β€” depth 11 Β· orphan-root
619
+
620
+ ```text
621
+ πŸš€ BoundaryCheckService.nxProjects(levelArguments: LevelCheckArguments): BoundaryCheckOutcome [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:147]
622
+ └─> BoundaryCheckService.runNxLevel(args: LevelCheckArguments): BoundaryCheckOutcome [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:177]
623
+ ↳ Judges the whole-workspace Nx project graph.
624
+ └─> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
625
+ ↳ Every violation one graph's rules report, in the order the rules were declared.
626
+ └─> BoundariesService.flatMap(…)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
627
+ └─> BoundariesService.evaluateAcyclicRule(…): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
628
+ ↳ Reports every cycle an `acyclic` rule's selected nodes still form.
629
+ └─> BoundarySelectorService.selectIds(…): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
630
+ ↳ The ids of every node a selector claims.
631
+ └─> BoundarySelectorService.filter(…)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
632
+ └─> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
633
+ ↳ Whether a selector claims a node.
634
+ └─> BoundarySelectorService.matchesTags(…): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
635
+ ↳ Whether a node carries a tag matching one of a list of globs.
636
+ └─> BoundarySelectorService.some(…)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
637
+ └─> BoundarySelectorService.some(…)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
638
+ ```
639
+
640
+ **5. `BoundaryCheckService.buildGraph`** β€” depth 9 Β· orphan-root
641
+
642
+ ```text
643
+ πŸš€ BoundaryCheckService.buildGraph(project: PythonProject): BoundaryGraph [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:241]
644
+ └─> PythonService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
645
+ ↳ Builds a Python project's internal file-level import Graph.
646
+ └─> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
647
+ ↳ Builds a Python project's internal file-level import Graph.
648
+ └─> PythonImportGraphService.flatMap(…)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
649
+ └─> PythonImportGraphService.collectEdgesForFile(…): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
650
+ ↳ Collects every internal import edge one source file declares.
651
+ └─> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
652
+ ↳ Parses every module-level import statement in a Python source file.
653
+ └─> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
654
+ ↳ Parses one joined statement into the module(s) it names.
655
+ └─> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
656
+ ↳ Parses a joined `import <specifiers>` statement.
657
+ └─> PythonImportParserService.map(…)(modulePath: string): { level: number; modulePath: string; } [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]
658
+ ```
659
+
660
+ **6. `BoundaryCheckService.buildGraph`** β€” depth β‰₯ 7 Β· orphan-root
661
+
662
+ ```text
663
+ πŸš€ BoundaryCheckService.buildGraph(project: TypescriptProject): BoundaryGraph [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:257]
664
+ └─> TypescriptService.buildGraph(projectProgram: TypescriptProjectProgram): TypescriptImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript.service.ts:44]
665
+ ↳ Builds a project's internal file-level import Graph from its program.
666
+ └─> TypescriptImportGraphService.buildGraph(projectProgram: TypescriptProjectProgram): TypescriptImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:185]
667
+ ↳ Builds a project's internal file-level import Graph from its program.
668
+ └─> TypescriptImportGraphService.listOwnedSourceFileNames(projectProgram: TypescriptProjectProgram): string[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:122]
669
+ ↳ Lists a program's own source files, excluding declaration files. `program.getRootFileNames()` is the same file list…
670
+ └─> TypescriptImportGraphService.resolveOwnedFileNames(projectProgram: TypescriptProjectProgram): Set<string> [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:156]
671
+ ↳ Resolves the real, absolute file names a program owns.
672
+ └─> TypescriptImportGraphService.map(…)(fileName: string): string [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:162]
673
+ └─> TypescriptProjectService.toRealPath(filePath: string): string [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-project.service.ts:122]
674
+ ↳ Resolves a path through symlinks, which is how pnpm workspaces link.
675
+ ```
676
+
677
+ **7. `BoundaryCheckService.buildGraph`** β€” depth β‰₯ 6 Β· orphan-root
678
+
679
+ ```text
680
+ πŸš€ BoundaryCheckService.buildGraph(project: NestjsProject): Promise<BoundaryGraph> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:162]
681
+ └─> NestjsProjectService.exploreProject(project: NestjsProject): Promise<NestjsExploredModule[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:232]
682
+ ↳ Explores a project's container in preview mode and returns its tree.
683
+ └─> NestjsProjectService.buildSyntheticRootModule(project: NestjsProject): Promise<DynamicModule> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:59]
684
+ ↳ Roots a package that bootstraps nothing in every module it defines.
685
+ └─> NestjsProjectService.map(…)(file: string): Promise<Type<unknown>[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:66]
686
+ └─> NestjsProjectService.loadModuleClasses(file: string): Promise<Type<unknown>[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:166]
687
+ ↳ Imports a module file and returns every module class it exports.
688
+ └─> NestjsProjectService.map(…)([, moduleClass]: [string, Type<unknown>]): Type<unknown> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:177]
689
+ ```
690
+
691
+ </details>
692
+
693
+ ### Breadth
694
+
695
+ | Callable | Breadth | Calls directly | Location |
696
+ | --- | --- | --- | --- |
697
+ | `RunContextService.build` | 7 | `ConfigurationService.loadConfiguration`, `NeighborhoodService.readProjectGraph`, `RunContextService.resolveProjectGraphPath`, `NeighborhoodService.readProjects`, `RunContextService.loadProjectConfigurations`, `RunContextService.resolveEnabledGraphTypes`, `RunContextService.selectProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:139` |
698
+ | `BoundariesService.evaluateAccessRule` | 5 | `BoundariesService.indexNodes`, `BoundariesService.judgesEdge`, `BoundariesService.resolveNode`, `BoundarySelectorService.matches`, `BoundariesService.buildAccessViolation` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:107` |
699
+ | `BoundaryCheckService.run` | 5 | `BoundaryCheckService.graphTypeForLevel`, `BoundaryCheckService.rulesForLevel`, `BoundaryCheckService.runLevel`, `BoundaryCheckService.flatMap(…)`, `BoundaryCheckService.flatMap(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:284` |
700
+
701
+ <details>
702
+ <summary>40 more callables</summary>
703
+
704
+ | Callable | Breadth | Calls directly | Location |
705
+ | --- | --- | --- | --- |
706
+ | `BoundaryCheckService.runNxLevel` | 4 | `BoundaryGraphService.buildNxGraph`, `WorkspaceGraphService.buildWorkspaceGraph`, `BoundariesService.evaluate`, `BoundaryCheckService.collectProjectFailure` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:177` |
707
+ | `BoundarySelectorService.selectIds` | 3 | `BoundarySelectorService.map(…)`, `BoundarySelectorService.map(…)`, `BoundarySelectorService.filter(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106` |
708
+ | `BoundariesService.evaluateAcyclicRule` | 3 | `BoundarySelectorService.selectIds`, `BoundaryCyclesService.findCycles`, `BoundariesService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140` |
709
+ | `BoundaryCheckService.buildGraph` | 3 | `BoundaryGraphService.buildNestjsGraph`, `ModuleGraphService.buildGraph`, `NestjsProjectService.exploreProject` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:162` |
710
+ | `BoundaryCheckService.buildGraph` | 3 | `BoundaryGraphService.buildTypescriptImportGraph`, `TypescriptService.buildGraph`, `TypescriptService.buildProgram` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:257` |
711
+ | `BoundaryCyclesService.findCycles` | 2 | `BoundaryCyclesService.buildAdjacency`, `BoundaryCyclesService.walk` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:127` |
712
+ | `BoundarySelectorService.matches` | 2 | `BoundarySelectorService.matchesGlobs`, `BoundarySelectorService.matchesTags` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86` |
713
+ | `BoundariesService.map(…)` | 2 | `BoundariesService.buildMessage`, `describeCycle` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:151` |
714
+ | `BoundariesService.flatMap(…)` | 2 | `BoundariesService.evaluateAcyclicRule`, `BoundariesService.evaluateAccessRule` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223` |
715
+ | `BoundaryGraphService.buildNxGraph` | 2 | `BoundaryGraphService.map(…)`, `BoundaryGraphService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:101` |
716
+ | `BoundaryCheckService.runNestjsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `NestjsProjectService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:158` |
717
+ | `BoundaryCheckService.runProjectLevel` | 2 | `BoundariesService.evaluate`, `BoundaryCheckService.collectProjectFailure` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213` |
718
+ | `BoundaryCheckService.runPythonImportsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `PythonService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:237` |
719
+ | `BoundaryCheckService.buildGraph` | 2 | `BoundaryGraphService.buildPythonImportGraph`, `PythonService.buildGraph` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:241` |
720
+ | `BoundaryCheckService.runTypescriptImportsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `TypescriptService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:253` |
721
+ | `BoundaryCyclesService.recordCycle` | 1 | `BoundaryCyclesService.buildCycleKey` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:73` |
722
+ | `BoundaryCyclesService.walk` | 1 | `BoundaryCyclesService.recordCycle` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:91` |
723
+ | `BoundarySelectorService.matchesGlobs` | 1 | `BoundarySelectorService.some(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:37` |
724
+ | `BoundarySelectorService.matchesTags` | 1 | `BoundarySelectorService.some(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59` |
725
+ | `BoundarySelectorService.some(…)` | 1 | `BoundarySelectorService.some(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71` |
726
+ | `BoundarySelectorService.filter(…)` | 1 | `BoundarySelectorService.matches` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116` |
727
+ | `BoundariesService.buildAccessViolation` | 1 | `BoundariesService.buildMessage` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:54` |
728
+ | `BoundariesService.indexNodes` | 1 | `BoundariesService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:166` |
729
+ | `BoundariesService.evaluate` | 1 | `BoundariesService.flatMap(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222` |
730
+ | `BoundaryReportService.renderSummary` | 1 | `BoundaryReportService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-report.service.ts:36` |
731
+ | `BoundaryReportService.renderViolations` | 1 | `BoundaryReportService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-report.service.ts:56` |
732
+ | `BoundaryGraphService.buildFileNodes` | 1 | `BoundaryGraphService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:45` |
733
+ | `BoundaryGraphService.buildNestjsGraph` | 1 | `BoundaryGraphService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:77` |
734
+ | `BoundaryGraphService.map(…)` | 1 | `BoundaryGraphService.resolveProjectRoot` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:114` |
735
+ | `BoundaryGraphService.buildPythonImportGraph` | 1 | `BoundaryGraphService.buildFileNodes` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:128` |
736
+ | `BoundaryGraphService.buildTypescriptImportGraph` | 1 | `BoundaryGraphService.buildFileNodes` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:141` |
737
+ | `BoundaryCheckService.nestjsModules` | 1 | `BoundaryCheckService.runNestjsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:145` |
738
+ | `BoundaryCheckService.nxProjects` | 1 | `BoundaryCheckService.runNxLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:147` |
739
+ | `BoundaryCheckService.python` | 1 | `BoundaryCheckService.runPythonImportsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:148` |
740
+ | `BoundaryCheckService.typescript` | 1 | `BoundaryCheckService.runTypescriptImportsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:150` |
741
+ | `RunContextService.loadProjectConfigurations` | 1 | `RunContextService.map(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:52` |
742
+ | `RunContextService.map(…)` | 1 | `ConfigurationService.loadProjectConfiguration` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:57` |
743
+ | `RunContextService.resolveEnabledGraphTypes` | 1 | `RunContextService.filter(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:79` |
744
+ | `RunContextService.selectProjects` | 1 | `RunContextService.filter(…)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:114` |
745
+ | `RunContextService.filter(…)` | 1 | `ConfigurationService.isProjectSelected` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:119` |
746
+
747
+ </details>
748
+ <!-- callidescope:end -->