@codependix/cli 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,894 @@
1
+ # πŸ•ΈοΈ Codependix CLI
2
+
3
+ **Exports a project's dependency graphs β€” Nx, NestJS, and file-level imports β€” as JSON and Markdown diagrams, and gates the rules those graphs are judged against.**
4
+
5
+ Codependix reads what each project depends on and renders it four ways: the
6
+ Nx project graph, a NestJS project's module graph, a TypeScript project's own
7
+ file-level import graph, and a Python project's own file-level import graph.
8
+ Each graph is delivered to whichever destinations
9
+ `codependix.config.ts` names for that project β€” a JSON file, a Markdown anchor
10
+ block spliced into an existing file such as a `README.md`, or both. The same
11
+ built graphs are then judged against whatever rules the configuration
12
+ declares β€” see [`@codependix/boundaries`](../codependix-boundaries/README.md).
13
+
14
+ ```bash
15
+ pnpm add --filter <project> --save-dev @codependix/cli
16
+ ```
17
+
18
+ ```bash
19
+ codependix map --write
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ One command, `map`, and no per-graph-type subcommand. Which graphs run for a
25
+ project, where its export lands, and which rules judge it is entirely a
26
+ function of the configuration file; see
27
+ [`configuration/codependix.config.ts`](../../configuration/codependix.config.ts)
28
+ for this repository's own.
29
+
30
+ | Flag | Meaning |
31
+ | ---- | ------- |
32
+ | `--check [check]` | Fail on a comma-separated set drawn from `boundaries` and `reports` |
33
+ | `--config [config]` | Path to a `codependix.config.ts`. Searched for upward from `--directory` when omitted |
34
+ | `-d, --directory [directory]` | Workspace root whose Nx project graph this run reads. Defaults to the working directory |
35
+ | `--exclude [exclude]` | Comma-separated globs overriding the configured `exclude`. Refused when `exclude` was never configured |
36
+ | `--file-imports` | Build, check, and write the `fileImports` graph type for this run |
37
+ | `--no-file-imports` | Skip the `fileImports` graph type for this run |
38
+ | `-f, --format [format]` | What to print to standard output, one of `json` and `markdown` (default: `markdown`). A graph type prints only when the run also configured a workspace destination for it, even if its own toggle flag enabled it |
39
+ | `--include [include]` | Comma-separated globs overriding the configured `include`. Refused when `include` was never configured |
40
+ | `--json-output [jsonOutput]` | Write every active graph type's data, combined into one JSON file at this path, keyed by graph type name. A type appears only when the run also configured a workspace destination for it |
41
+ | `--markdown-output [markdownOutput]` | Write every active graph type's rendered diagram, combined into one Markdown file at this path. A type appears only when the run also configured a workspace destination for it |
42
+ | `--nestjs-modules` | Build, check, and write the `nestjsModules` graph type for this run |
43
+ | `--no-nestjs-modules` | Skip the `nestjsModules` graph type for this run |
44
+ | `--nx-projects` | Build, check, and write the `nxProjects` graph type for this run |
45
+ | `--no-nx-projects` | Skip the `nxProjects` graph type for this run |
46
+ | `--projects [projects]` | Comma-separated project names or roots to export for, as globs, beyond those `include` already selects. Also narrows the Workspace Graph and `--check boundaries` to the named set |
47
+ | `--tags [tags]` | Comma-separated Nx tags to export for, beyond what `include` already selects. Also narrows the Workspace Graph and `--check boundaries` to the tagged projects |
48
+ | `--write` | Writes every configured export |
49
+
50
+ ### The two `--check` names
51
+
52
+ `--check` names which finding fails the run, because the two findings belong
53
+ on opposite sides of a pull request.
54
+
55
+ | `--check` value | What fails the run |
56
+ | --------------- | ------------------ |
57
+ | `boundaries` | An edge, or a cycle, breaking a declared rule |
58
+ | `reports` | A configured destination no longer holding what a fresh run would write |
59
+
60
+ A boundary violation is caused by the branch and fixed by the branch, so it
61
+ gates every pull request. A stale export moves with the workspace it
62
+ describes and would fail every branch that changed a project graph rather
63
+ than anything the branch itself did, so it is published on the default branch
64
+ and gated nowhere. That is the same split
65
+ [`callidescope`](../callidescope-cli/README.md) makes between `--check depth`
66
+ and `--check reports`, and `reports` is deliberately spelled the same in both:
67
+ it is the same finding, and two names for it would make the two reports
68
+ unreadable together.
69
+
70
+ - `--check boundaries` reads no destination and writes nothing, so it leaves
71
+ every committed export exactly as it found it.
72
+ - `--write --check boundaries` is legal β€” a boundary has no destination to be
73
+ stale.
74
+ - `--write --check reports` is refused: an export cannot be stale in the run
75
+ that just wrote it.
76
+ - A bare `--check`, or one whose value is only separators, is refused. Read as
77
+ "gate nothing" it would be a gate that cannot fail, which is worse than no
78
+ gate at all because it looks like protection.
79
+
80
+ ### When no mode is named
81
+
82
+ Naming neither `--check` nor `--write` is asked about, as a three-item menu β€”
83
+ `boundaries`, `reports`, `write`.
84
+
85
+ There is no flag that turns the prompt off, because there is nothing to turn
86
+ off where it cannot be answered: a run whose stdin is not a terminal fails
87
+ immediately, naming the flag it wanted, rather than drawing a menu. That
88
+ refusal is load-bearing rather than defensive β€” `prompts` does not fail on a
89
+ non-terminal stdin. It renders the menu, never resolves, and lets the process
90
+ exit 0, which would turn a scripted run that forgot its mode flag into a
91
+ silent success that wrote nothing. Dismissing the menu at a terminal is
92
+ reported the same way, as a rejected command line rather than a crash.
93
+
94
+ No mode is ever inferred, which is the rule `codometer`'s and
95
+ `callidescope`'s flags follow too.
96
+
97
+ ```bash
98
+ nx run codebase:codependix:check
99
+ nx run codebase:codependix:write
100
+ ```
101
+
102
+ One project failing β€” a missing anchor, or a NestJS project that fails to
103
+ boot its container β€” is reported and does not stop the rest: `--write` either
104
+ fully succeeds or names exactly which projects failed while still completing
105
+ every other one.
106
+
107
+ ### Where the output goes
108
+
109
+ Printing and delivering are separate. `--format` decides what reaches standard
110
+ output; the destinations under `workspace` in the configuration and
111
+ `--json-output`/`--markdown-output` decide what reaches a file.
112
+
113
+ Markdown is the console default because it is the one rendering that reads in a
114
+ terminal and pastes into an issue. `--format json` is for a machine reading
115
+ standard output, so every diagnostic goes to standard error β€” keeping standard
116
+ output clean and parseable as data.
117
+
118
+ ## Packages
119
+
120
+ | Package | Role |
121
+ | ------- | ---- |
122
+ | [`@codependix/cli`](.) | Orchestrates the four graph builders and delivers their exports |
123
+ | [`@codependix/boundaries`](../codependix-boundaries/README.md) | Builds each level's graph for a workspace, judges it against the declared rules, and reports what breaks them. `--check boundaries` delegates to it wholesale |
124
+ | [`@codependix/configuration`](../codependix-configuration/README.md) | Reads `codependix.config.ts` and resolves per-project export destinations and boundary rules |
125
+ | [`@codependix/examples`](../codependix-examples/README.md) | Sixteen subjects built to be graphed, each with the guide codependix renders from it |
126
+ | [`@codependix/nx-projects`](../codependix-nx-projects/README.md) | Builds a project's Nx Neighborhood and the whole-workspace Workspace Graph |
127
+ | [`@codependix/nestjs-modules`](../codependix-nestjs-modules/README.md) | Explores a NestJS project's container and builds its module graph |
128
+ | [`@codependix/file-imports`](../codependix-file-imports/README.md) | Builds a project's file-level import graph β€” a `typescript` module walking its own `ts.Program`, and a `python` module parsing `import`/`from ... import` statements |
129
+
130
+ ## Agent skills
131
+
132
+ Agent skills for coding agents working with codependix are published in
133
+ [`@codependix/agents`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-agents):
134
+
135
+ | Skill | Description |
136
+ | ----- | ----------- |
137
+ | [`codependix-export`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-agents/skills/codependix-export) | Export dependency graphs and run boundary checks |
138
+ | [`codependix-configure`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-agents/skills/codependix-configure) | Configure graph types, export destinations, and boundary rules in `codependix.config.ts` |
139
+ | [`codependix-navigate`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-agents/skills/codependix-navigate) | Query dependency paths and navigate package relationships |
140
+ | [`codependix-triage`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-agents/skills/codependix-triage) | Triage boundary violations and report drift |
141
+
142
+ ## Examples
143
+
144
+ Every behavior described above β€” and every one that is not, because it lived
145
+ only in a JSDoc comment until now β€” has a worked example rendered by the real
146
+ tool in
147
+ [`@codependix/examples`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-examples):
148
+
149
+ - [README](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-examples) β€” one directory per example, each
150
+ readable on its own, plus configuring a first export destination and adopting
151
+ codependix in a workspace with no anchor blocks anywhere yet
152
+ - [AGENTS.md](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-examples/AGENTS.md) β€” a "codependix said X β†’ open
153
+ this example" table, weighted toward the refusals and toward `--check`
154
+ staleness
155
+
156
+ ## Start
157
+
158
+ ```bash
159
+ nx run codependix-cli:start
160
+ ```
161
+
162
+ ## Test
163
+
164
+ ```bash
165
+ nx run codependix-cli:vitest
166
+ ```
167
+
168
+ ## πŸ‘” Conformetry
169
+
170
+ This project was generated from the [nestjs-command-project](../../configuration/conformetry-templates/nestjs-command-project) conformetry template.
171
+
172
+ ## πŸ•ΈοΈ Codependix
173
+
174
+ 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`.
175
+
176
+ ### Nx Neighborhood
177
+
178
+ <!-- codependix:start name="codependix-nx-projects" -->
179
+ ```mermaid
180
+ graph LR
181
+ codependix_boundaries["codependix-boundaries"]
182
+ codependix_cli["codependix-cli"]
183
+ codependix_configuration["codependix-configuration"]
184
+ codependix_core["codependix-core"]
185
+ codependix_examples["codependix-examples"]
186
+ codependix_output["codependix-output"]
187
+ logger["logger"]
188
+ codependix_cli --> codependix_boundaries
189
+ codependix_cli --> codependix_configuration
190
+ codependix_cli --> codependix_core
191
+ codependix_cli --> codependix_output
192
+ codependix_cli --> logger
193
+ codependix_examples -.-> codependix_cli
194
+ classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
195
+ class codependix_cli subject
196
+ ```
197
+
198
+ _Dashed edges are dependencies Nx inferred from configuration rather than from code._
199
+ <!-- codependix:end name="codependix-nx-projects" -->
200
+
201
+ ### NestJS Module Graph
202
+
203
+ <!-- codependix:start name="codependix-nestjs-modules" -->
204
+ ```mermaid
205
+ flowchart LR
206
+ AnchorsModule
207
+ BoundariesModule
208
+ BoundaryCheckModule
209
+ CombinedOutputModule
210
+ ConfigModule([ConfigModule])
211
+ ConfigurationModule
212
+ DeliveryModule
213
+ DiscoveryModule
214
+ FileImportsWorkspaceGraphModule
215
+ GraphRunModule
216
+ InputModule
217
+ LoggerModule([LoggerModule])
218
+ MainModule
219
+ MapModule
220
+ ModuleGraphModule
221
+ NeighborhoodModule
222
+ NestjsModulesWorkspaceGraphModule
223
+ NestjsProjectModule
224
+ OverrideResolutionModule
225
+ PathModule
226
+ PathQueryModule
227
+ ProjectGraphsModule
228
+ PythonImportsModule
229
+ PythonModule
230
+ ReportingModule
231
+ RunContextModule
232
+ TypescriptModule
233
+ WorkspaceGraphModule
234
+ WorkspaceGraphsModule
235
+ BoundaryCheckModule --> BoundariesModule
236
+ BoundaryCheckModule --> ModuleGraphModule
237
+ BoundaryCheckModule --> NestjsProjectModule
238
+ BoundaryCheckModule --> PythonModule
239
+ BoundaryCheckModule --> TypescriptModule
240
+ BoundaryCheckModule --> WorkspaceGraphModule
241
+ CombinedOutputModule --> AnchorsModule
242
+ ConfigurationModule --> InputModule
243
+ ConfigurationModule --> OverrideResolutionModule
244
+ DeliveryModule --> AnchorsModule
245
+ GraphRunModule --> NeighborhoodModule
246
+ GraphRunModule --> ProjectGraphsModule
247
+ GraphRunModule --> PythonImportsModule
248
+ GraphRunModule --> WorkspaceGraphsModule
249
+ MainModule --> DiscoveryModule
250
+ MainModule --> MapModule
251
+ MainModule --> PathModule
252
+ MapModule --> BoundaryCheckModule
253
+ MapModule --> CombinedOutputModule
254
+ MapModule --> ConfigurationModule
255
+ MapModule --> GraphRunModule
256
+ MapModule --> ReportingModule
257
+ MapModule --> RunContextModule
258
+ PathModule --> ConfigurationModule
259
+ PathModule --> PathQueryModule
260
+ PathModule --> ReportingModule
261
+ PathModule --> RunContextModule
262
+ PathQueryModule --> FileImportsWorkspaceGraphModule
263
+ PathQueryModule --> ModuleGraphModule
264
+ PathQueryModule --> NestjsModulesWorkspaceGraphModule
265
+ PathQueryModule --> NestjsProjectModule
266
+ PathQueryModule --> PythonModule
267
+ PathQueryModule --> TypescriptModule
268
+ PathQueryModule --> WorkspaceGraphModule
269
+ ProjectGraphsModule --> ConfigurationModule
270
+ ProjectGraphsModule --> DeliveryModule
271
+ ProjectGraphsModule --> ModuleGraphModule
272
+ ProjectGraphsModule --> NeighborhoodModule
273
+ ProjectGraphsModule --> NestjsProjectModule
274
+ ProjectGraphsModule --> TypescriptModule
275
+ PythonImportsModule --> ConfigurationModule
276
+ PythonImportsModule --> DeliveryModule
277
+ PythonImportsModule --> PythonModule
278
+ ReportingModule --> BoundaryCheckModule
279
+ RunContextModule --> ConfigurationModule
280
+ RunContextModule --> NeighborhoodModule
281
+ WorkspaceGraphModule --> NeighborhoodModule
282
+ WorkspaceGraphsModule --> ConfigurationModule
283
+ WorkspaceGraphsModule --> DeliveryModule
284
+ WorkspaceGraphsModule --> FileImportsWorkspaceGraphModule
285
+ WorkspaceGraphsModule --> ModuleGraphModule
286
+ WorkspaceGraphsModule --> NestjsModulesWorkspaceGraphModule
287
+ WorkspaceGraphsModule --> NestjsProjectModule
288
+ WorkspaceGraphsModule --> PythonModule
289
+ WorkspaceGraphsModule --> TypescriptModule
290
+ WorkspaceGraphsModule --> WorkspaceGraphModule
291
+ ```
292
+
293
+ _Rounded modules are global: every module can inject them, so their edges are left out._
294
+ <!-- codependix:end name="codependix-nestjs-modules" -->
295
+
296
+ ### File Imports
297
+
298
+ <!-- codependix:start name="codependix-file-imports" -->
299
+ ```mermaid
300
+ graph LR
301
+ file_callidescope_config_ts["callidescope.config.ts"]
302
+ file_codependix_config_ts["codependix.config.ts"]
303
+ file_codometer_config_ts["codometer.config.ts"]
304
+ file_eslint_config_ts["eslint.config.ts"]
305
+ file_src_constants_ts["src/constants.ts"]
306
+ file_src_index_ts["src/index.ts"]
307
+ file_src_index_unit_test_ts["src/index.unit.test.ts"]
308
+ file_src_main_end_to_end_test_ts["src/main.end-to-end.test.ts"]
309
+ file_src_main_module_ts["src/main.module.ts"]
310
+ file_src_main_ts["src/main.ts"]
311
+ file_src_modules_map_map_command_integration_test_ts["src/modules/map/map.command.integration.test.ts"]
312
+ file_src_modules_map_map_command_ts["src/modules/map/map.command.ts"]
313
+ file_src_modules_map_map_command_unit_test_ts["src/modules/map/map.command.unit.test.ts"]
314
+ file_src_modules_map_map_constants_ts["src/modules/map/map.constants.ts"]
315
+ file_src_modules_map_map_module_ts["src/modules/map/map.module.ts"]
316
+ file_src_modules_map_map_module_unit_test_ts["src/modules/map/map.module.unit.test.ts"]
317
+ file_src_modules_map_map_types_ts["src/modules/map/map.types.ts"]
318
+ file_src_modules_path_path_command_integration_test_ts["src/modules/path/path.command.integration.test.ts"]
319
+ file_src_modules_path_path_command_ts["src/modules/path/path.command.ts"]
320
+ file_src_modules_path_path_command_unit_test_ts["src/modules/path/path.command.unit.test.ts"]
321
+ file_src_modules_path_path_constants_ts["src/modules/path/path.constants.ts"]
322
+ file_src_modules_path_path_module_ts["src/modules/path/path.module.ts"]
323
+ file_src_modules_path_path_module_unit_test_ts["src/modules/path/path.module.unit.test.ts"]
324
+ file_src_modules_path_path_types_ts["src/modules/path/path.types.ts"]
325
+ file_src_repl_ts["src/repl.ts"]
326
+ file_src_repl_unit_test_ts["src/repl.unit.test.ts"]
327
+ file_testing_mocks_ts["testing/mocks.ts"]
328
+ file_testing_setup_ts["testing/setup.ts"]
329
+ file_vite_config_ts["vite.config.ts"]
330
+ file_vitest_config_ts["vitest.config.ts"]
331
+ file_src_index_unit_test_ts --> file_src_index_ts
332
+ file_src_main_end_to_end_test_ts --> file_src_constants_ts
333
+ file_src_main_module_ts --> file_src_constants_ts
334
+ file_src_main_module_ts --> file_src_modules_map_map_module_ts
335
+ file_src_main_module_ts --> file_src_modules_path_path_module_ts
336
+ file_src_main_ts --> file_src_main_module_ts
337
+ file_src_modules_map_map_command_integration_test_ts --> file_src_main_module_ts
338
+ file_src_modules_map_map_command_integration_test_ts --> file_src_modules_map_map_command_ts
339
+ file_src_modules_map_map_command_unit_test_ts --> file_src_modules_map_map_command_ts
340
+ file_src_modules_map_map_module_ts --> file_src_modules_map_map_command_ts
341
+ file_src_modules_map_map_module_unit_test_ts --> file_src_modules_map_map_command_ts
342
+ file_src_modules_map_map_module_unit_test_ts --> file_src_modules_map_map_module_ts
343
+ file_src_modules_path_path_command_integration_test_ts --> file_src_main_module_ts
344
+ file_src_modules_path_path_command_integration_test_ts --> file_src_modules_path_path_command_ts
345
+ file_src_modules_path_path_command_integration_test_ts --> file_src_modules_path_path_types_ts
346
+ file_src_modules_path_path_command_ts --> file_src_modules_path_path_constants_ts
347
+ file_src_modules_path_path_command_ts --> file_src_modules_path_path_types_ts
348
+ file_src_modules_path_path_command_unit_test_ts --> file_src_modules_path_path_command_ts
349
+ file_src_modules_path_path_command_unit_test_ts --> file_src_modules_path_path_constants_ts
350
+ file_src_modules_path_path_module_ts --> file_src_modules_path_path_command_ts
351
+ file_src_modules_path_path_module_unit_test_ts --> file_src_modules_path_path_command_ts
352
+ file_src_modules_path_path_module_unit_test_ts --> file_src_modules_path_path_module_ts
353
+ file_src_repl_ts --> file_src_main_module_ts
354
+ ```
355
+ <!-- codependix:end name="codependix-file-imports" -->
356
+
357
+ <!-- callidescope:start -->
358
+
359
+ ## πŸ”­ Callidescope
360
+
361
+ Call stacks traced through `packages/ic-suite/codependix/codependix-cli`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
362
+
363
+ | Measure | Value |
364
+ | --- | --- |
365
+ | Callables | 42 |
366
+ | Files | 19 |
367
+ | Calls traced | 37 |
368
+ | Call stacks | 19 |
369
+ | Deepest stack | 15 |
370
+ | Stacks through recursion | 0 |
371
+ | Unfollowable calls | 2 |
372
+
373
+ ### Limits
374
+
375
+ What this project is judged against, as declared in its own `callidescope.config.ts`.
376
+
377
+ | Limit | Value |
378
+ | --- | --- |
379
+ | `maximumDepth` | 15 |
380
+ | `maximumBreadth` | 7 |
381
+
382
+ ### Call stacks (depth)
383
+
384
+ **1. `MapCommand.run`** β€” depth β‰₯ 15 Β· decorated-method
385
+
386
+ ```text
387
+ πŸš€ MapCommand.run(_passedParameters: string[], options?: MapCommandOptions): Promise<void> [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:377]
388
+ ↳ Runs whatever the command line asked for: exports, boundaries, or both.
389
+ └─> MapCommand.runMode(…): Promise<void> [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:125]
390
+ ↳ Runs the passes a resolved mode selected, and reports what they found.
391
+ └─> MapCommand.runExports(context: GraphRunContext): Promise<MapRunResult> [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:106]
392
+ ↳ Runs the export pass, warning when nothing was selected.
393
+ └─> GraphRunService.run(context: GraphRunContext): Promise<MapRunResult> [packages/ic-suite/codependix/codependix-output/src/modules/graph-run/graph-run.service.ts:144]
394
+ ↳ Runs every configured graph export against an already-resolved context.
395
+ └─> GraphRunService.runPythonImportGraphs(context: GraphRunContext): GraphRunOutcome [packages/ic-suite/codependix/codependix-output/src/modules/graph-run/graph-run.service.ts:266]
396
+ ↳ Builds and delivers every configured Python file-level import graph export.
397
+ └─> PythonImportsService.runGraphs(context: GraphRunContext): GraphRunOutcome [packages/ic-suite/codependix/codependix-output/src/modules/python-imports/python-imports.service.ts:135]
398
+ ↳ Builds and delivers every configured Python file-level import graph export.
399
+ └─> PythonImportsService.runProject(…): ProjectRunResult [packages/ic-suite/codependix/codependix-output/src/modules/python-imports/python-imports.service.ts:99]
400
+ ↳ Builds, renders, and delivers one project's Python import graph.
401
+ └─> PythonService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
402
+ ↳ Builds a Python project's internal file-level import Graph.
403
+ └─> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
404
+ ↳ Builds a Python project's internal file-level import Graph.
405
+ └─> PythonImportGraphService.flatMap(…)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
406
+ └─> PythonImportGraphService.collectEdgesForFile(…): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
407
+ ↳ Collects every internal import edge one source file declares.
408
+ └─> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
409
+ ↳ Parses every module-level import statement in a Python source file.
410
+ └─> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
411
+ ↳ Parses one joined statement into the module(s) it names.
412
+ └─> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
413
+ ↳ Parses a joined `import <specifiers>` statement.
414
+ └─> PythonImportParserService.map(…)(modulePath: string): { level: number; modulePath: string; } [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]
415
+ ```
416
+
417
+ **2. `PathCommand.run`** β€” depth β‰₯ 12 Β· decorated-method
418
+
419
+ ```text
420
+ πŸš€ PathCommand.run(passedParameters: string[], options?: PathCommandOptions): Promise<void> [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:214]
421
+ ↳ Runs the path query between two nodes across active graph levels.
422
+ └─> PathQueryService.query(args: PathQueryArguments): Promise<CombinedPathResults> [packages/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:296]
423
+ ↳ Queries every enabled graph type for a connecting path between two nodes.
424
+ └─> PathQueryService.queryFileImports(args: PathQueryArguments): null | string[] [packages/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:115]
425
+ ↳ Queries the file-imports workspace graph for a path between two files.
426
+ └─> PathQueryService.map(…)(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:118]
427
+ └─> PythonService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
428
+ ↳ Builds a Python project's internal file-level import Graph.
429
+ └─> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
430
+ ↳ Builds a Python project's internal file-level import Graph.
431
+ └─> PythonImportGraphService.flatMap(…)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
432
+ └─> PythonImportGraphService.collectEdgesForFile(…): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
433
+ ↳ Collects every internal import edge one source file declares.
434
+ └─> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
435
+ ↳ Parses every module-level import statement in a Python source file.
436
+ └─> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
437
+ ↳ Parses one joined statement into the module(s) it names.
438
+ └─> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
439
+ ↳ Parses a joined `import <specifiers>` statement.
440
+ └─> PythonImportParserService.map(…)(modulePath: string): { level: number; modulePath: string; } [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]
441
+ ```
442
+
443
+ **3. `MapCommand.parseDirectory`** β€” depth 4 Β· decorated-method
444
+
445
+ ```text
446
+ πŸš€ MapCommand.parseDirectory(value: string | undefined): string [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:191]
447
+ ↳ Parses the directory whose Nx workspace this run reads.
448
+ └─> ConfigurationService.parsePathOption(value: string | undefined): string [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:294]
449
+ ↳ Parses a path option that falls back to the working directory.
450
+ └─> InputService.parsePathOption(value: string | undefined): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:87]
451
+ ↳ Parses a path option that falls back to the working directory.
452
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
453
+ ↳ Trims an optional string option, treating blank as absent.
454
+ ```
455
+
456
+ <details>
457
+ <summary>16 more call stacks</summary>
458
+
459
+ **4. `MapCommand.parseExclude`** β€” depth 4 Β· decorated-method
460
+
461
+ ```text
462
+ πŸš€ MapCommand.parseExclude(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:207]
463
+ ↳ Parses `--exclude`, a comma-separated list of globs overriding the configured `exclude`.
464
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:279]
465
+ ↳ Parses a comma-separated list option, dropping blank entries.
466
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
467
+ ↳ Parses a comma-separated list option, dropping blank entries.
468
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]
469
+ ```
470
+
471
+ **5. `MapCommand.parseInclude`** β€” depth 4 Β· decorated-method
472
+
473
+ ```text
474
+ πŸš€ MapCommand.parseInclude(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:246]
475
+ ↳ Parses `--include`, a comma-separated list of globs overriding the configured `include`.
476
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:279]
477
+ ↳ Parses a comma-separated list option, dropping blank entries.
478
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
479
+ ↳ Parses a comma-separated list option, dropping blank entries.
480
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]
481
+ ```
482
+
483
+ **6. `PathCommand.parseDirectory`** β€” depth 4 Β· decorated-method
484
+
485
+ ```text
486
+ πŸš€ PathCommand.parseDirectory(value: string | undefined): string [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:98]
487
+ ↳ Parses the directory whose Nx workspace this run reads.
488
+ └─> ConfigurationService.parsePathOption(value: string | undefined): string [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:294]
489
+ ↳ Parses a path option that falls back to the working directory.
490
+ └─> InputService.parsePathOption(value: string | undefined): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:87]
491
+ ↳ Parses a path option that falls back to the working directory.
492
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
493
+ ↳ Trims an optional string option, treating blank as absent.
494
+ ```
495
+
496
+ **7. `PathCommand.parseExclude`** β€” depth 4 Β· decorated-method
497
+
498
+ ```text
499
+ πŸš€ PathCommand.parseExclude(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:107]
500
+ ↳ Parses `--exclude`, a comma-separated list of globs overriding the configured `exclude`.
501
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:279]
502
+ ↳ Parses a comma-separated list option, dropping blank entries.
503
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
504
+ ↳ Parses a comma-separated list option, dropping blank entries.
505
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]
506
+ ```
507
+
508
+ **8. `PathCommand.parseInclude`** β€” depth 4 Β· decorated-method
509
+
510
+ ```text
511
+ πŸš€ PathCommand.parseInclude(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:139]
512
+ ↳ Parses `--include`, a comma-separated list of globs overriding the configured `include`.
513
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:279]
514
+ ↳ Parses a comma-separated list option, dropping blank entries.
515
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
516
+ ↳ Parses a comma-separated list option, dropping blank entries.
517
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]
518
+ ```
519
+
520
+ **9. `MapCommand.parseConfig`** β€” depth 3 Β· decorated-method
521
+
522
+ ```text
523
+ πŸš€ MapCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:182]
524
+ ↳ Parses the optional configuration path from command-line input.
525
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
526
+ ↳ Trims an optional string option, treating blank as absent.
527
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
528
+ ↳ Trims an optional string option, treating blank as absent.
529
+ ```
530
+
531
+ **10. `MapCommand.parseFormat`** β€” depth 3 Β· decorated-method
532
+
533
+ ```text
534
+ πŸš€ MapCommand.parseFormat(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:231]
535
+ ↳ Parses what `--format` prints to standard output.
536
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
537
+ ↳ Trims an optional string option, treating blank as absent.
538
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
539
+ ↳ Trims an optional string option, treating blank as absent.
540
+ ```
541
+
542
+ **11. `MapCommand.parseJsonOutput`** β€” depth 3 Β· decorated-method
543
+
544
+ ```text
545
+ πŸš€ MapCommand.parseJsonOutput(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:259]
546
+ ↳ Parses `--json-output`, the path to write every active graph type's combined JSON data to, keyed by graph type name.
547
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
548
+ ↳ Trims an optional string option, treating blank as absent.
549
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
550
+ ↳ Trims an optional string option, treating blank as absent.
551
+ ```
552
+
553
+ **12. `MapCommand.parseMarkdownOutput`** β€” depth 3 Β· decorated-method
554
+
555
+ ```text
556
+ πŸš€ MapCommand.parseMarkdownOutput(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:272]
557
+ ↳ Parses `--markdown-output`, the path to write every active graph type's combined, anchor-spliced Markdown diagram to.
558
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
559
+ ↳ Trims an optional string option, treating blank as absent.
560
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
561
+ ↳ Trims an optional string option, treating blank as absent.
562
+ ```
563
+
564
+ **13. `MapCommand.parseProjects`** β€” depth 3 Β· decorated-method
565
+
566
+ ```text
567
+ πŸš€ MapCommand.parseProjects(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:336]
568
+ ↳ Parses the projects a run exports for beyond `include`. **Widening, and narrowing.** A named project is added to…
569
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
570
+ ↳ Trims an optional string option, treating blank as absent.
571
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
572
+ ↳ Trims an optional string option, treating blank as absent.
573
+ ```
574
+
575
+ **14. `MapCommand.parseTags`** β€” depth 3 Β· decorated-method
576
+
577
+ ```text
578
+ πŸš€ MapCommand.parseTags(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:349]
579
+ ↳ Parses the Nx tags a run exports for, matched exactly against a project's own tags.
580
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
581
+ ↳ Trims an optional string option, treating blank as absent.
582
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
583
+ ↳ Trims an optional string option, treating blank as absent.
584
+ ```
585
+
586
+ **15. `MapCommand.parseWrite`** β€” depth 3 Β· decorated-method
587
+
588
+ ```text
589
+ πŸš€ MapCommand.parseWrite(value: boolean | undefined): boolean [packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:359]
590
+ ↳ Parses the `--write` flag from command-line input.
591
+ └─> ConfigurationService.parseFlagOption(value: boolean | undefined): boolean [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:284]
592
+ ↳ Parses a valueless boolean flag, which is present or it is not.
593
+ └─> InputService.parseFlagOption(value: boolean | undefined): boolean [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:70]
594
+ ↳ Parses a valueless boolean flag, which is present or it is not.
595
+ ```
596
+
597
+ **16. `PathCommand.parseConfig`** β€” depth 3 Β· decorated-method
598
+
599
+ ```text
600
+ πŸš€ PathCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:89]
601
+ ↳ Parses the optional configuration path from command-line input.
602
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
603
+ ↳ Trims an optional string option, treating blank as absent.
604
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
605
+ ↳ Trims an optional string option, treating blank as absent.
606
+ ```
607
+
608
+ **17. `PathCommand.parseFormat`** β€” depth 3 Β· decorated-method
609
+
610
+ ```text
611
+ πŸš€ PathCommand.parseFormat(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:130]
612
+ ↳ Parses what `--format` prints to standard output. Defaults to Markdown when the flag was left off entirely.
613
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
614
+ ↳ Trims an optional string option, treating blank as absent.
615
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
616
+ ↳ Trims an optional string option, treating blank as absent.
617
+ ```
618
+
619
+ **18. `PathCommand.parseProjects`** β€” depth 3 Β· decorated-method
620
+
621
+ ```text
622
+ πŸš€ PathCommand.parseProjects(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:194]
623
+ ↳ Parses the projects a query searches across beyond `include`.
624
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
625
+ ↳ Trims an optional string option, treating blank as absent.
626
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
627
+ ↳ Trims an optional string option, treating blank as absent.
628
+ ```
629
+
630
+ **19. `PathCommand.parseTags`** β€” depth 3 Β· decorated-method
631
+
632
+ ```text
633
+ πŸš€ PathCommand.parseTags(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:204]
634
+ ↳ Parses the Nx tags a query searches across, matched exactly against project tags.
635
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:289]
636
+ ↳ Trims an optional string option, treating blank as absent.
637
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
638
+ ↳ Trims an optional string option, treating blank as absent.
639
+ ```
640
+
641
+ </details>
642
+
643
+ ### Breadth
644
+
645
+ | Callable | Breadth | Calls directly | Location |
646
+ | --- | --- | --- | --- |
647
+ | `MapCommand.runMode` | 7 | `RunContextService.build`, `ConfigurationService.touchesFiles`, `MapCommand.runExports`, `BoundaryCheckService.run`, `MapCommand.runCombinedOutput`, `ReportingService.reportPassOutcomes`, `ReportingService.reportSuccess` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:125` |
648
+ | `PathCommand.run` | 5 | `PathCommand.validateInputs`, `RunContextService.build`, `PathQueryService.query`, `PathQueryService.render`, `ReportingService.reportFailure` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:214` |
649
+ | `MapCommand.run` | 4 | `ConfigurationService.selectMode`, `CombinedOutputService.resolveFormat`, `MapCommand.runMode`, `ReportingService.reportFailure` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:377` |
650
+
651
+ <details>
652
+ <summary>20 more callables</summary>
653
+
654
+ | Callable | Breadth | Calls directly | Location |
655
+ | --- | --- | --- | --- |
656
+ | `MapCommand.runExports` | 2 | `GraphRunService.run`, `ReportingService.reportEmptySelection` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:106` |
657
+ | `MapCommand.runCombinedOutput` | 1 | `CombinedOutputService.run` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:82` |
658
+ | `MapCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:182` |
659
+ | `MapCommand.parseDirectory` | 1 | `ConfigurationService.parsePathOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:191` |
660
+ | `MapCommand.parseExclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:207` |
661
+ | `MapCommand.parseFormat` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:231` |
662
+ | `MapCommand.parseInclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:246` |
663
+ | `MapCommand.parseJsonOutput` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:259` |
664
+ | `MapCommand.parseMarkdownOutput` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:272` |
665
+ | `MapCommand.parseProjects` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:336` |
666
+ | `MapCommand.parseTags` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:349` |
667
+ | `MapCommand.parseWrite` | 1 | `ConfigurationService.parseFlagOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:359` |
668
+ | `PathCommand.validateInputs` | 1 | `PathQueryService.resolveFormat` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:53` |
669
+ | `PathCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:89` |
670
+ | `PathCommand.parseDirectory` | 1 | `ConfigurationService.parsePathOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:98` |
671
+ | `PathCommand.parseExclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:107` |
672
+ | `PathCommand.parseFormat` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:130` |
673
+ | `PathCommand.parseInclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:139` |
674
+ | `PathCommand.parseProjects` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:194` |
675
+ | `PathCommand.parseTags` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:204` |
676
+
677
+ </details>
678
+ <!-- callidescope:end -->
679
+
680
+ <!-- codometer:start -->
681
+
682
+ ## ⏲️ Codometer
683
+
684
+ ### Project
685
+
686
+ ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-3247-22c55e?style=flat-square)
687
+ ![Repository Size](https://img.shields.io/badge/Repository_Size-112.32_kB-6b7280?style=flat-square)
688
+ ![Folders](https://img.shields.io/badge/Folders-5-4a4a4a?style=flat-square)
689
+ ![Source Files](https://img.shields.io/badge/Source_Files-30-3178c6?style=flat-square)
690
+
691
+ ### Measured Targets
692
+
693
+ ![Compiled JavaScript Size](https://img.shields.io/badge/Compiled_JavaScript_Size-5.32_kB_gzip-6b7280?style=flat-square)
694
+
695
+ ### TypeScript
696
+
697
+ ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-30-3178c6?style=flat-square)
698
+ ![Interfaces](https://img.shields.io/badge/Interfaces-1-0ea5e9?style=flat-square)
699
+ ![Generic Declarations](https://img.shields.io/badge/Generic_Declarations-0-0369a1?style=flat-square)
700
+ ![Enums](https://img.shields.io/badge/Enums-0-f97316?style=flat-square)
701
+ ![Decorators](https://img.shields.io/badge/Decorators-37-db2777?style=flat-square)
702
+ ![Doc Comments](https://img.shields.io/badge/Doc_Comments-37-6366f1?style=flat-square)
703
+ ![Static Methods](https://img.shields.io/badge/Static_Methods-0-166534?style=flat-square)
704
+
705
+ ### JavaScript
706
+
707
+ ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-0-f7df1e?style=flat-square)
708
+ ![Test Files](https://img.shields.io/badge/Test_Files-9-10b981?style=flat-square)
709
+ ![External Packages](https://img.shields.io/badge/External_Packages-19-8b5cf6?style=flat-square)
710
+ ![Classes](https://img.shields.io/badge/Classes-5-7c3aed?style=flat-square)
711
+ ![Functions](https://img.shields.io/badge/Functions-160-16a34a?style=flat-square)
712
+ ![Methods](https://img.shields.io/badge/Methods-38-15803d?style=flat-square)
713
+ ![Sync Functions](https://img.shields.io/badge/Sync_Functions-131-4ade80?style=flat-square)
714
+ ![Async Functions](https://img.shields.io/badge/Async_Functions-67-059669?style=flat-square)
715
+ ![Constants](https://img.shields.io/badge/Constants-99-dc2626?style=flat-square)
716
+ ![Imports](https://img.shields.io/badge/Imports-113-0284c7?style=flat-square)
717
+ ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-10-ea580c?style=flat-square)
718
+ ![Comments](https://img.shields.io/badge/Comments-124-64748b?style=flat-square)
719
+ ![Comment Lines](https://img.shields.io/badge/Comment_Lines-226-475569?style=flat-square)
720
+ ![TODO Comments](https://img.shields.io/badge/TODO_Comments-0-ca8a04?style=flat-square)
721
+
722
+ ### Python
723
+
724
+ ![Python Files](https://img.shields.io/badge/Python_Files-0-3776ab?style=flat-square)
725
+ ![Python Lines](https://img.shields.io/badge/Python_Lines-0-4b8bbe?style=flat-square)
726
+ ![Python Classes](https://img.shields.io/badge/Python_Classes-0-7c3aed?style=flat-square)
727
+ ![Python Functions](https://img.shields.io/badge/Python_Functions-0-16a34a?style=flat-square)
728
+ ![Python Protocols](https://img.shields.io/badge/Python_Protocols-0-0ea5e9?style=flat-square)
729
+ ![Python Constants](https://img.shields.io/badge/Python_Constants-0-dc2626?style=flat-square)
730
+ ![Python Imports](https://img.shields.io/badge/Python_Imports-0-0284c7?style=flat-square)
731
+ ![Python Decorators](https://img.shields.io/badge/Python_Decorators-0-db2777?style=flat-square)
732
+ ![Docstrings](https://img.shields.io/badge/Docstrings-0-6366f1?style=flat-square)
733
+ ![Docstring Lines](https://img.shields.io/badge/Docstring_Lines-0-818cf8?style=flat-square)
734
+ ![Python Comments](https://img.shields.io/badge/Python_Comments-0-64748b?style=flat-square)
735
+ ![Python Comment Lines](https://img.shields.io/badge/Python_Comment_Lines-0-475569?style=flat-square)
736
+
737
+ ### JSON
738
+
739
+ ![JSON Files](https://img.shields.io/badge/JSON_Files-4-a16207?style=flat-square)
740
+ ![JSON Lines](https://img.shields.io/badge/JSON_Lines-190-ca8a04?style=flat-square)
741
+ ![JSON Objects](https://img.shields.io/badge/JSON_Objects-42-7c3aed?style=flat-square)
742
+ ![JSON Arrays](https://img.shields.io/badge/JSON_Arrays-13-8b5cf6?style=flat-square)
743
+ ![JSON Properties](https://img.shields.io/badge/JSON_Properties-122-0284c7?style=flat-square)
744
+ ![JSON Strings](https://img.shields.io/badge/JSON_Strings-106-16a34a?style=flat-square)
745
+ ![JSON Numbers](https://img.shields.io/badge/JSON_Numbers-1-059669?style=flat-square)
746
+ ![JSON Booleans](https://img.shields.io/badge/JSON_Booleans-8-0ea5e9?style=flat-square)
747
+ ![JSON Nulls](https://img.shields.io/badge/JSON_Nulls-0-64748b?style=flat-square)
748
+ ![JSON Items](https://img.shields.io/badge/JSON_Items-44-475569?style=flat-square)
749
+ ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-170-dc2626?style=flat-square)
750
+ ![JSON Max Depth](https://img.shields.io/badge/JSON_Max_Depth-6-ea580c?style=flat-square)
751
+
752
+ ### YAML
753
+
754
+ ![YAML Files](https://img.shields.io/badge/YAML_Files-0-cb171e?style=flat-square)
755
+ ![YAML Lines](https://img.shields.io/badge/YAML_Lines-0-e34c26?style=flat-square)
756
+ ![YAML Documents](https://img.shields.io/badge/YAML_Documents-0-f97316?style=flat-square)
757
+ ![YAML Mappings](https://img.shields.io/badge/YAML_Mappings-0-7c3aed?style=flat-square)
758
+ ![YAML Sequences](https://img.shields.io/badge/YAML_Sequences-0-8b5cf6?style=flat-square)
759
+ ![YAML Keys](https://img.shields.io/badge/YAML_Keys-0-0284c7?style=flat-square)
760
+ ![YAML Scalars](https://img.shields.io/badge/YAML_Scalars-0-16a34a?style=flat-square)
761
+ ![YAML Anchors](https://img.shields.io/badge/YAML_Anchors-0-059669?style=flat-square)
762
+ ![YAML Aliases](https://img.shields.io/badge/YAML_Aliases-0-10b981?style=flat-square)
763
+ ![YAML Comments](https://img.shields.io/badge/YAML_Comments-0-64748b?style=flat-square)
764
+ ![YAML Max Depth](https://img.shields.io/badge/YAML_Max_Depth-0-ea580c?style=flat-square)
765
+
766
+ ### TOML
767
+
768
+ ![TOML Files](https://img.shields.io/badge/TOML_Files-0-9c4221?style=flat-square)
769
+ ![TOML Lines](https://img.shields.io/badge/TOML_Lines-0-b45309?style=flat-square)
770
+ ![TOML Tables](https://img.shields.io/badge/TOML_Tables-0-7c3aed?style=flat-square)
771
+ ![TOML Array Tables](https://img.shields.io/badge/TOML_Array_Tables-0-8b5cf6?style=flat-square)
772
+ ![TOML Keys](https://img.shields.io/badge/TOML_Keys-0-0284c7?style=flat-square)
773
+ ![TOML Arrays](https://img.shields.io/badge/TOML_Arrays-0-16a34a?style=flat-square)
774
+ ![TOML Comments](https://img.shields.io/badge/TOML_Comments-0-64748b?style=flat-square)
775
+
776
+ ### Shell
777
+
778
+ ![Shell Files](https://img.shields.io/badge/Shell_Files-0-89e051?style=flat-square)
779
+ ![Shell Lines](https://img.shields.io/badge/Shell_Lines-0-4eaa25?style=flat-square)
780
+ ![Shell Functions](https://img.shields.io/badge/Shell_Functions-0-16a34a?style=flat-square)
781
+ ![Shell Variables](https://img.shields.io/badge/Shell_Variables-0-0284c7?style=flat-square)
782
+ ![Shell Exports](https://img.shields.io/badge/Shell_Exports-0-ea580c?style=flat-square)
783
+ ![Shell Conditionals](https://img.shields.io/badge/Shell_Conditionals-0-7c3aed?style=flat-square)
784
+ ![Shell Loops](https://img.shields.io/badge/Shell_Loops-0-8b5cf6?style=flat-square)
785
+ ![Shell Pipelines](https://img.shields.io/badge/Shell_Pipelines-0-059669?style=flat-square)
786
+ ![Shebangs](https://img.shields.io/badge/Shebangs-0-6b7280?style=flat-square)
787
+ ![Shell Comments](https://img.shields.io/badge/Shell_Comments-0-64748b?style=flat-square)
788
+ ![Shell Comment Lines](https://img.shields.io/badge/Shell_Comment_Lines-0-475569?style=flat-square)
789
+
790
+ ### SQL
791
+
792
+ ![SQL Files](https://img.shields.io/badge/SQL_Files-0-e38c00?style=flat-square)
793
+ ![SQL Lines](https://img.shields.io/badge/SQL_Lines-0-f29111?style=flat-square)
794
+ ![SQL Statements](https://img.shields.io/badge/SQL_Statements-0-7c3aed?style=flat-square)
795
+ ![SQL Selects](https://img.shields.io/badge/SQL_Selects-0-16a34a?style=flat-square)
796
+ ![SQL Inserts](https://img.shields.io/badge/SQL_Inserts-0-22c55e?style=flat-square)
797
+ ![SQL Updates](https://img.shields.io/badge/SQL_Updates-0-0ea5e9?style=flat-square)
798
+ ![SQL Deletes](https://img.shields.io/badge/SQL_Deletes-0-dc2626?style=flat-square)
799
+ ![SQL Creates](https://img.shields.io/badge/SQL_Creates-0-0284c7?style=flat-square)
800
+ ![SQL Joins](https://img.shields.io/badge/SQL_Joins-0-8b5cf6?style=flat-square)
801
+ ![SQL CTEs](https://img.shields.io/badge/SQL_CTEs-0-059669?style=flat-square)
802
+ ![SQL Comments](https://img.shields.io/badge/SQL_Comments-0-64748b?style=flat-square)
803
+
804
+ ### HCL
805
+
806
+ ![HCL Files](https://img.shields.io/badge/HCL_Files-0-844fba?style=flat-square)
807
+ ![HCL Lines](https://img.shields.io/badge/HCL_Lines-0-a78bfa?style=flat-square)
808
+ ![HCL Blocks](https://img.shields.io/badge/HCL_Blocks-0-7c3aed?style=flat-square)
809
+ ![HCL Resources](https://img.shields.io/badge/HCL_Resources-0-0284c7?style=flat-square)
810
+ ![HCL Variables](https://img.shields.io/badge/HCL_Variables-0-16a34a?style=flat-square)
811
+ ![HCL Outputs](https://img.shields.io/badge/HCL_Outputs-0-059669?style=flat-square)
812
+ ![HCL Attributes](https://img.shields.io/badge/HCL_Attributes-0-0ea5e9?style=flat-square)
813
+ ![HCL Interpolations](https://img.shields.io/badge/HCL_Interpolations-0-db2777?style=flat-square)
814
+ ![HCL Comments](https://img.shields.io/badge/HCL_Comments-0-64748b?style=flat-square)
815
+
816
+ ### CSS
817
+
818
+ ![CSS Files](https://img.shields.io/badge/CSS_Files-0-264de4?style=flat-square)
819
+ ![CSS Lines](https://img.shields.io/badge/CSS_Lines-0-2965f1?style=flat-square)
820
+ ![CSS Rules](https://img.shields.io/badge/CSS_Rules-0-7c3aed?style=flat-square)
821
+ ![CSS Selectors](https://img.shields.io/badge/CSS_Selectors-0-8b5cf6?style=flat-square)
822
+ ![CSS Declarations](https://img.shields.io/badge/CSS_Declarations-0-0284c7?style=flat-square)
823
+ ![CSS At Rules](https://img.shields.io/badge/CSS_At_Rules-0-f97316?style=flat-square)
824
+ ![CSS Media Queries](https://img.shields.io/badge/CSS_Media_Queries-0-ea580c?style=flat-square)
825
+ ![CSS Custom Properties](https://img.shields.io/badge/CSS_Custom_Properties-0-16a34a?style=flat-square)
826
+ ![CSS Comments](https://img.shields.io/badge/CSS_Comments-0-64748b?style=flat-square)
827
+
828
+ ### Conventions
829
+
830
+ ![Module Files](https://img.shields.io/badge/Module_Files-3-7c3aed?style=flat-square)
831
+ ![Service Files](https://img.shields.io/badge/Service_Files-0-0284c7?style=flat-square)
832
+ ![Command Files](https://img.shields.io/badge/Command_Files-2-16a34a?style=flat-square)
833
+ ![Constants Files](https://img.shields.io/badge/Constants_Files-2-ea580c?style=flat-square)
834
+ ![Types Files](https://img.shields.io/badge/Types_Files-2-db2777?style=flat-square)
835
+ ![Utilities Files](https://img.shields.io/badge/Utilities_Files-0-0ea5e9?style=flat-square)
836
+ ![TypeORM Entities](https://img.shields.io/badge/TypeORM_Entities-0-059669?style=flat-square)
837
+ ![Unit Tests](https://img.shields.io/badge/Unit_Tests-6-ca8a04?style=flat-square)
838
+ ![Integration Tests](https://img.shields.io/badge/Integration_Tests-2-7c3aed?style=flat-square)
839
+ ![End To End Tests](https://img.shields.io/badge/End_To_End_Tests-1-0284c7?style=flat-square)
840
+ ![CSS Comment Budget](https://img.shields.io/badge/CSS_Comment_Budget-0-16a34a?style=flat-square)
841
+ ![HCL Comment Budget](https://img.shields.io/badge/HCL_Comment_Budget-0-ea580c?style=flat-square)
842
+ ![Python Comment Budget](https://img.shields.io/badge/Python_Comment_Budget-0-db2777?style=flat-square)
843
+ ![SQL Comment Budget](https://img.shields.io/badge/SQL_Comment_Budget-0-0ea5e9?style=flat-square)
844
+ ![TOML Comment Budget](https://img.shields.io/badge/TOML_Comment_Budget-0-059669?style=flat-square)
845
+ ![TypeScript Comment Budget](https://img.shields.io/badge/TypeScript_Comment_Budget-0-ca8a04?style=flat-square)
846
+ ![YAML Comment Budget](https://img.shields.io/badge/YAML_Comment_Budget-0-7c3aed?style=flat-square)
847
+ ![Shell Comment Budget](https://img.shields.io/badge/Shell_Comment_Budget-0-0284c7?style=flat-square)
848
+
849
+ ### Jupyter
850
+
851
+ ![Notebooks](https://img.shields.io/badge/Notebooks-0-f37626?style=flat-square)
852
+ ![Notebook Cells](https://img.shields.io/badge/Notebook_Cells-0-e8a33d?style=flat-square)
853
+ ![Code Cells](https://img.shields.io/badge/Code_Cells-0-3776ab?style=flat-square)
854
+ ![Markdown Cells](https://img.shields.io/badge/Markdown_Cells-0-083fa1?style=flat-square)
855
+ ![Raw Cells](https://img.shields.io/badge/Raw_Cells-0-9ca3af?style=flat-square)
856
+ ![Executed Cells](https://img.shields.io/badge/Executed_Cells-0-16a34a?style=flat-square)
857
+ ![Cell Outputs](https://img.shields.io/badge/Cell_Outputs-0-059669?style=flat-square)
858
+ ![Notebook Code Lines](https://img.shields.io/badge/Notebook_Code_Lines-0-4b8bbe?style=flat-square)
859
+ ![Notebook Classes](https://img.shields.io/badge/Notebook_Classes-0-7c3aed?style=flat-square)
860
+ ![Notebook Functions](https://img.shields.io/badge/Notebook_Functions-0-22c55e?style=flat-square)
861
+ ![Notebook Imports](https://img.shields.io/badge/Notebook_Imports-0-0284c7?style=flat-square)
862
+ ![Notebook Decorators](https://img.shields.io/badge/Notebook_Decorators-0-db2777?style=flat-square)
863
+ ![Notebook Prose Lines](https://img.shields.io/badge/Notebook_Prose_Lines-0-1f6feb?style=flat-square)
864
+ ![Notebook Headings](https://img.shields.io/badge/Notebook_Headings-0-a78bfa?style=flat-square)
865
+ ![Notebook Links](https://img.shields.io/badge/Notebook_Links-0-10b981?style=flat-square)
866
+ ![Notebook Images](https://img.shields.io/badge/Notebook_Images-0-34d399?style=flat-square)
867
+ ![Notebook Code Blocks](https://img.shields.io/badge/Notebook_Code_Blocks-0-dc2626?style=flat-square)
868
+ ![Notebook Properties](https://img.shields.io/badge/Notebook_Properties-0-ca8a04?style=flat-square)
869
+ ![Notebook Nodes](https://img.shields.io/badge/Notebook_Nodes-0-a16207?style=flat-square)
870
+ ![Notebook Max Depth](https://img.shields.io/badge/Notebook_Max_Depth-0-ea580c?style=flat-square)
871
+
872
+ ### Markdown
873
+
874
+ ![Markdown Files](https://img.shields.io/badge/Markdown_Files-1-083fa1?style=flat-square)
875
+ ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-247-1f6feb?style=flat-square)
876
+ ![H1](https://img.shields.io/badge/H1-1-7c3aed?style=flat-square)
877
+ ![H2](https://img.shields.io/badge/H2-7-8b5cf6?style=flat-square)
878
+ ![H3](https://img.shields.io/badge/H3-14-a78bfa?style=flat-square)
879
+ ![H4](https://img.shields.io/badge/H4-0-c4b5fd?style=flat-square)
880
+ ![H5](https://img.shields.io/badge/H5-0-ddd6fe?style=flat-square)
881
+ ![H6](https://img.shields.io/badge/H6-0-ede9fe?style=flat-square)
882
+ ![Paragraphs](https://img.shields.io/badge/Paragraphs-49-64748b?style=flat-square)
883
+ ![Lists](https://img.shields.io/badge/Lists-6-16a34a?style=flat-square)
884
+ ![List Items](https://img.shields.io/badge/List_Items-28-22c55e?style=flat-square)
885
+ ![Task List Items](https://img.shields.io/badge/Task_List_Items-0-4ade80?style=flat-square)
886
+ ![Tables](https://img.shields.io/badge/Tables-2-0284c7?style=flat-square)
887
+ ![Table Rows](https://img.shields.io/badge/Table_Rows-10-0ea5e9?style=flat-square)
888
+ ![Links](https://img.shields.io/badge/Links-9-059669?style=flat-square)
889
+ ![Images](https://img.shields.io/badge/Images-0-10b981?style=flat-square)
890
+ ![Code Blocks](https://img.shields.io/badge/Code_Blocks-13-dc2626?style=flat-square)
891
+ ![Inline Code](https://img.shields.io/badge/Inline_Code-78-ef4444?style=flat-square)
892
+ ![Block Quotes](https://img.shields.io/badge/Block_Quotes-0-ca8a04?style=flat-square)
893
+ ![Thematic Breaks](https://img.shields.io/badge/Thematic_Breaks-0-a16207?style=flat-square)
894
+ <!-- codometer:end -->