@callidescope/cli 0.0.1

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,1763 @@
1
+ # 🔭 Callidescope
2
+
3
+ **Traces call stacks across a TypeScript monorepo and flags the ones that got too deep.**
4
+
5
+ Callidescope builds one call graph for the whole workspace, measures how deep a
6
+ stack can get below each entry point, and reports the paths that exceed a limit
7
+ you set — with every frame's file and line, so the next step is opening one.
8
+
9
+ It follows calls through **NestJS injected dependencies**. When a command calls
10
+ `this.someService.load()`, the hop into `SomeService.load` is the whole point:
11
+ that edge is invisible to anything reading one file at a time, and it is where
12
+ most of this kind of codebase's control flow actually lives.
13
+
14
+ ```bash
15
+ npm install --save-dev @callidescope/cli
16
+ ```
17
+
18
+ ```bash
19
+ callidescope --config configuration/callidescope.config.ts
20
+ ```
21
+
22
+ ```text
23
+ Stack #1 | 🚨 [DEPTH ≥ 10 > 6] (decorated-method)
24
+ 🚀 CodometerCommand.run(_passedParameters: string[], options: CodometerCommandOptions): Promise<void> [.../codometer.command.ts:220]
25
+ ↳ Measure the repository and write every configured output.
26
+ └─> CodometerService.measure(args: MeasureArguments): CodeStatisticsResult [.../codometer.service.ts:115]
27
+ ↳ Measure aggregated repository statistics for the provided directory.
28
+ └─> LanguagesService.analyze(args: AnalyzeLanguagesArguments): LanguageResults [.../languages.service.ts:54]
29
+ ↳ Analyze every language present in the discovered files.
30
+ └─> JsonService.countArrayNode(node: unknown[], stats: JsonResult, depth: number): void (cycle) [.../json.service.ts:89]
31
+ ↳ Count array nodes and their child values.
32
+ ```
33
+
34
+ ## Why
35
+
36
+ A deep call stack is not automatically wrong, but it is always worth looking at.
37
+ Ten frames between a command and the work it does usually means a layer that
38
+ exists only to forward arguments, and the tools that would tell you are the ones
39
+ that read a file at a time — so they see the forwarding and never the depth.
40
+
41
+ Two questions this answers that reading code does not:
42
+
43
+ - **How deep does this actually get?** Following an injected dependency by hand
44
+ means opening the module, finding the provider, and opening that — for every
45
+ hop. The tool does it with the type checker, which is what makes it exact.
46
+ - **How much does this one callable reach?** Breadth counts the distinct
47
+ callables a function calls directly, which no file-at-a-time reader can
48
+ resolve through an injected dependency or a structurally satisfied
49
+ interface.
50
+
51
+ ## Usage
52
+
53
+ Tracing the workspace is the **default command**, so the flags below sit
54
+ directly on `callidescope`:
55
+
56
+ ```bash
57
+ npx callidescope --check depth
58
+ ```
59
+
60
+ `callidescope callidescope --check depth` is the same run written out, which is
61
+ what a task runner that always names a command spells. `depth`, `breadth`, and
62
+ `limits` are matched by name before anything falls through to the default, so
63
+ they are unaffected — and a word that names none of them is refused rather than
64
+ quietly traced.
65
+
66
+ | Flag | Meaning |
67
+ | ---- | ------- |
68
+ | `--config` | Path to a `callidescope.config.ts`. Searched for when omitted |
69
+ | `-d, --directories` | Comma-separated project directories to trace, each holding its own `tsconfig.json`. The projects their imports reach are traced too. Every such directory under the working directory when omitted |
70
+ | `--entry-point-addresses` | Comma-separated `path#name` roots, overriding `entryPoints.addresses` |
71
+ | `--entry-point-decorators` | Comma-separated decorator names, overriding `entryPoints.decorators` |
72
+ | `--exclude` | Comma-separated globs, overriding an authored `exclude`. The tool's own default globs are kept, exactly as they are under a configured `exclude` |
73
+ | `--exclude-callees` | Comma-separated callee patterns, overriding `excludeCallees` |
74
+ | `-f, --format` | `markdown`, `mermaid`, or `json`, for what it prints. Markdown by default. Anything else is refused rather than rewritten |
75
+ | `--include-exported-functions` | `true` or `false`, overriding `entryPoints.includeExportedFunctions`. The bare flag means `true` |
76
+ | `--include-orphans` | `true` or `false`, overriding `entryPoints.includeOrphans`. The bare flag means `true` |
77
+ | `--include-tests` | `true` or `false`, overriding `entryPoints.includeTests`. The bare flag means `true` |
78
+ | `--json` | Where the machine-readable report goes. Overrides the path of a declared `write.json`, and nothing else about it. Needs `--write` or `--check reports` |
79
+ | `-m, --markdown` | Where the markdown block goes. Overrides the path of a declared `write.markdown`, and nothing else about it. Needs `--write` or `--check reports` |
80
+ | `--maximum-breadth` | A number, overriding `limits.maximumBreadth` wherever a project declared one. Refused against a configuration declaring none, because breadth has no default to override |
81
+ | `--maximum-depth` | A number, overriding `limits.maximumDepth` wherever a project declared one |
82
+ | `--mermaid` | Where the diagram goes. Overrides the path of a declared `write.mermaid`, and nothing else about it. Needs `--write` or `--check reports` |
83
+ | `--check` | Fail on a comma-separated set drawn from `breadth`, `depth`, and `reports` |
84
+ | `--write` | Write every configured destination |
85
+
86
+ Every flag but `--check`, `--write`, `--format`, and `--config` is an
87
+ **override**: it may change a value the configuration already declares and may
88
+ not supply one it does not, so no flag can make an under-configured run legal.
89
+ `excludeFrom` is the one configured field with no flag — it names the ignore
90
+ files a run _reads_, which is what the run is rather than a value it judges by.
91
+ A list flag written empty reads as absent, so a configured list cannot be
92
+ cleared from the command line.
93
+
94
+ ### Three findings, named separately
95
+
96
+ A stack that runs deeper than the configured limit, a callable that calls more
97
+ others directly than its project allows, and a report that no longer matches the
98
+ code are separate findings, and `--check` names them separately. `depth` is
99
+ callidescope's own word for the magnitude it measures — `limit` belongs to
100
+ codometer, and blurring the two makes the messages unreadable.
101
+
102
+ | `--check` value | What fails the run |
103
+ | --------------- | ------------------ |
104
+ | `breadth` | A callable calling more callables directly than `limits.maximumBreadth` |
105
+ | `depth` | A call stack deeper than `limits.maximumDepth` |
106
+ | `reports` | A configured destination no longer holding what a fresh run would write |
107
+
108
+ `--check` refuses a value it does not recognize, and refuses a flag carrying no
109
+ value at all. A set with nothing in it looks exactly like the flag having been
110
+ left off, so it is a mistake rather than a shorthand: read as "gate nothing" it
111
+ would be a gate that cannot fail. Every traced project's own configuration is
112
+ complete, so `limits.maximumBreadth` is always there to judge `--check
113
+ breadth` against — there is no project left to leave it undeclared, and so
114
+ nothing left for `--check breadth` to be refused over.
115
+
116
+ `depth` and `reports` are separate because they belong on opposite sides of a
117
+ pull request. Depth is the gate — a stack got longer in this change, and this
118
+ change is what fixes it. In this workspace neither flag is invoked directly
119
+ for that: the callidescope Nx plugin infers a `gate` target onto every project
120
+ it does not exclude, judging depth always and breadth wherever a project
121
+ declares `limits.maximumBreadth` — the same rules `--check depth` and
122
+ `--check breadth` apply, reached through the plugin's own executor rather than
123
+ a subprocess — scoped to just the projects a change touched:
124
+
125
+ ```bash
126
+ nx affected --target=gate
127
+ ```
128
+
129
+ Staleness is not, because a report goes stale whenever the call graph moves
130
+ anywhere, which is nearly every change. The report is published on the default
131
+ branch instead, where nothing else is competing to rewrite the same block:
132
+
133
+ ```bash
134
+ nx run codebase:callidescope:write
135
+ ```
136
+
137
+ Nothing writes unless it is asked to. A run given neither `--write` nor
138
+ `--check reports` reads no destination and rewrites none, so a gate on a pull
139
+ request leaves every committed report exactly as it found it.
140
+ `--write --check reports` is refused outright: a report cannot be stale in the
141
+ run that just wrote it.
142
+
143
+ Those two configurations are the whole target — there is no third one for the
144
+ release, because nothing forwards a configuration to it. `lint-code` does
145
+ not depend on `callidescope`: Nx forwards an explicit configuration down
146
+ `dependsOn`, so if it did, `lint-code --configuration=write` would publish
147
+ the report from a branch. `codebase:codometer` sits outside that list for the
148
+ same reason. The depth gate is therefore named directly, alongside
149
+ `lint-code` and inside the same `nx affected` invocation, in both places
150
+ that gate: the
151
+ [🧑‍🔧 Lint Codebase](../../../../.github/workflows/lint-code.yml) workflow, so it
152
+ runs on every pull request, and
153
+ [`configuration/lint-staged.config.ts`](../../../../configuration/lint-staged.config.ts),
154
+ so it runs on every commit. Depth reads source and needs no build, which is
155
+ what keeps it in the commit path where codometer's limits — read from compiled
156
+ output — cannot go.
157
+
158
+ ### Two failures no flag turns off
159
+
160
+ `--check` chooses which findings about the code fail the run. Two failures are
161
+ not findings about the code at all, and neither waits to be asked:
162
+
163
+ | Failure | What it means |
164
+ | ------- | ------------- |
165
+ | `🔭 Rejected a project it could not read` | A project's `tsconfig.json` could not be parsed, or a named directory holds none |
166
+ | `🔭 Traced nothing` | The run collected no callables at all |
167
+
168
+ Both exist because the alternative is a green gate over a workspace nobody
169
+ looked at. A run reports what it found, so a run that found nothing reports
170
+ nothing — which reads exactly like a clean workspace.
171
+
172
+ A `tsconfig.json` that will not parse **ends the run where it happens**, before
173
+ anything is printed and before any destination is touched. It is tempting to
174
+ step over the project and trace the rest, and that is wrong here: destinations
175
+ are written before findings are weighed, so a partial graph would publish
176
+ depths measured through a workspace that was missing a project, and only then
177
+ fail. On the default branch that means committing wrong numbers into every
178
+ project README, which exiting non-zero afterwards does not take back. Ending
179
+ the trace leaves the checkout exactly as the run found it.
180
+
181
+ A directory named on `--directories` that holds no `tsconfig.json` at all ends
182
+ the run the same way, and for the same reason. Naming a directory is the caller
183
+ saying it should be traced, so quietly tracing one fewer project than was asked
184
+ for reports depths for a workspace nobody described — and a typo in the list
185
+ passes every gate for having looked at less. The whole-workspace walk cannot
186
+ reach this, since it only ever yields directories a `tsconfig.json` was found
187
+ in.
188
+
189
+ A project that should not be read at all is a different question, and
190
+ exclusions answer it. They are applied to the `tsconfig.json` itself, before it
191
+ is opened — excluding a project's _files_ is too late, because opening its
192
+ configuration is the step that fails. This repository's own
193
+ [`.callidescopeignore`](../../../../configuration/.callidescopeignore) names one such
194
+ project: a fixture in `codependix-examples` written not to parse.
195
+
196
+ ### Where the report goes
197
+
198
+ Printing and writing are separate. `--format` decides what reaches the terminal;
199
+ the destinations under `output` in the config decide what reaches a file, and
200
+ both can be on at once.
201
+
202
+ Markdown is the console default because it is the one rendering that reads in a
203
+ terminal, pastes into an issue, and is already what the files hold. `--format
204
+ json` is for a machine reading standard output, and `--format mermaid` prints
205
+ diagram source to paste somewhere that draws it.
206
+
207
+ Three destinations, each independent:
208
+
209
+ | `write` key | What it writes |
210
+ | ----------- | -------------- |
211
+ | `json` | The whole run as JSON, at one path |
212
+ | `markdown` | The whole run, spliced between anchors in one file |
213
+ | `mermaid` | The same report with its stacks drawn instead of printed |
214
+
215
+ A project's own section is not among them. Each project declares its own
216
+ `write.markdown` in its own `callidescope.config.ts`, so where a section lands
217
+ is that project's to say — see
218
+ [Project Configuration](../callidescope-configuration/README.md#project-configuration).
219
+
220
+ ### The diagram
221
+
222
+ `mermaid` is its own destination rather than a mode on `markdown`, so a
223
+ repository can publish both. They answer different questions: the tree says
224
+ what each frame takes, returns, and documents; the diagram says what shape they
225
+ make together.
226
+
227
+ Both anchored destinations render the same report, so a diagram draws exactly
228
+ what the markdown one prints: the run's call stacks over the depth limit. The
229
+ committed example of one is
230
+ [`packages/ic-suite/callidescope/callidescope-examples/output/diagram.md`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-examples/output/diagram.md),
231
+ where five stacks over that package's limit are drawn as 38 callables and 34
232
+ arrows. This repository publishes no diagram at all — its deepest stack sits
233
+ exactly at the limit, so there is nothing over it to draw, and a `--format
234
+ mermaid` run here prints `None.` under that heading.
235
+
236
+ All the stacks are drawn as **one** flowchart, not one apiece. A single stack is
237
+ a straight line, and a straight line is a list with extra steps. Drawn together
238
+ the shared tails converge — every command reaching the same repository, every
239
+ resolver ending in the same service — and that convergence is the thing a
240
+ picture shows and an indented tree cannot.
241
+
242
+ Entry points are drawn as stadiums and everything below them as boxes. Shape
243
+ rather than color, because the diagram is read in whichever theme the reader
244
+ has and only one of those is the one it was authored in. Labels carry the
245
+ callable's name alone: a diagram trying to also carry signatures is unreadable
246
+ at any size, and the tree already has room for them.
247
+
248
+ A diagram stops at 300 callables — GitHub refuses a mermaid block past 50,000
249
+ characters. Whole stacks are dropped rather than trimmed, so the diagram never
250
+ contains an edge into something it did not draw, and it says how many it left
251
+ out. The cap is generous against one project's worth of stacks and tight against
252
+ a workspace's: this repository's widest project, `caelundas`, has 96 call stacks
253
+ spanning 263 distinct callables, 27 of them called from more than one place, so
254
+ a set that size fits whole; the 554 stacks its 53 projects hold between them
255
+ would reach the 300 and leave 451 out. Neither set is drawn here — nothing in
256
+ this workspace is over the depth limit — but they are the scale the cap is set
257
+ against.
258
+
259
+ The `## 🔭 Callidescope` section at the bottom of every package in this
260
+ repository is that package's own declaration rather than anything the run fans
261
+ out. Each project's file names the document its section lands in, and the run
262
+ publishes what it finds declared:
263
+
264
+ ```ts
265
+ write: { markdown: { heading: "## 🔭 Callidescope", path: "README.md" } }
266
+ ```
267
+
268
+ Each section carries that project's stacks and findings rather than the
269
+ workspace's, the first three stacks openly and the rest behind a disclosure —
270
+ `previewCount` on the destination is what decides how many, because it is a
271
+ fact about the document rather than about the run.
272
+
273
+ Under `--check reports` a stale section fails and names every file that drifted,
274
+ rather than stopping at the first. This repository does not run that on a pull
275
+ request: `nx run codebase:callidescope:write` writes the sections on the
276
+ default branch, and the release commits them.
277
+
278
+ Narrowing with `--directories` is the difference between a whole-workspace
279
+ analysis and a check that finishes in seconds, because each project needs its
280
+ own TypeScript program. What such a run measures — and what it deliberately
281
+ leaves out — is [its own section below](#what-a-scoped-run-measures).
282
+
283
+ ## Depth and breadth for named callables
284
+
285
+ `callidescope` reports the whole workspace; `depth` and `breadth` answer a
286
+ narrower question about callables you name, addressed the way a Python
287
+ traceback or an ESLint rule id points at a symbol — the file path and the
288
+ qualified name callidescope already prints in every stack, joined by `#`:
289
+
290
+ ```bash
291
+ callidescope depth --addresses src/foo.service.ts#FooService.bar
292
+ callidescope breadth --addresses src/foo.service.ts#FooService.bar
293
+ ```
294
+
295
+ `--addresses` is comma-separated, so one run can report on several callables —
296
+ which is what a rename spanning a handful of them actually needs:
297
+
298
+ ```bash
299
+ callidescope depth --addresses src/foo.service.ts#FooService.bar,src/bar.service.ts#BarService.baz
300
+ ```
301
+
302
+ **Every address has to resolve, or the run prints nothing.** A report covering
303
+ the addresses that were understood, under an exit code claiming success, is
304
+ worse than no report; a run naming an address it cannot match reports each
305
+ failure and exits non-zero.
306
+
307
+ A file holding more than one declaration under the same qualified name — two
308
+ overloads, two callbacks bound to the same property — is disambiguated with a
309
+ trailing `:<line>`, and both commands print every candidate's line when they
310
+ cannot tell which one was meant.
311
+
312
+ **`--addresses` is prompted for when omitted.** At a terminal, both commands
313
+ offer every callable the trace found as an autocompleting multiselect, so the
314
+ flag is something to skip rather than something to look up. With no terminal
315
+ there is nobody to ask, so the run is refused by name and exits non-zero
316
+ rather than drawing a menu nothing can answer.
317
+
318
+ Both accept every graph-shaping flag `callidescope` itself does, since
319
+ resolving an address still means tracing the workspace first:
320
+ `--directories`, `--entry-point-addresses`, `--entry-point-decorators`,
321
+ `--exclude`, `--exclude-callees`, `--include-exported-functions`,
322
+ `--include-orphans`, and `--include-tests`, plus `--config` and `--format`.
323
+ Each means exactly what it means above.
324
+
325
+ Neither takes `--check`, `--write`, `--json`, `--markdown`, `--mermaid`,
326
+ `--maximum-breadth`, or `--maximum-depth`: a lookup gates nothing and writes
327
+ nothing, so a limit or a destination has no value here to override. It only
328
+ ever prints, to whichever format `--format` names.
329
+
330
+ Under `--format json` both print **an array**, whatever the address count, so
331
+ one run is one document `JSON.parse` accepts without first counting how many
332
+ addresses were asked about.
333
+
334
+ **`depth`** prints every path above the callable and every path below it —
335
+ every caller chain up to a root, every callee chain down to a leaf — rather
336
+ than folding each direction into the single deepest one `callidescope`'s own
337
+ report keeps. A callable reached from a dozen places, or reaching a dozen
338
+ leaves, is exactly the shape this is asked to show in full, capped at 200
339
+ paths per direction so a widely-called utility cannot make the walk run away;
340
+ a capped run says so.
341
+
342
+ **`breadth`** prints the callable's direct callees and direct callers side by
343
+ side — what it calls, and what calls it — the two questions a refactor or a
344
+ rename needs answered together before either one is safe.
345
+
346
+ ## What a scoped run measures
347
+
348
+ `--directories` narrows a run to the project directories it names. The trace
349
+ still follows calls out of them: a scoped run builds a TypeScript program for
350
+ each named project **and for every project those projects' imports transitively
351
+ reach** — the named projects' **dependency closure**.
352
+
353
+ That closure is what makes a scoped depth a measurement rather than an
354
+ approximation. A project's own `tsconfig.json` never lists the packages it
355
+ imports, so without it a call leaving the named directory landed in code no
356
+ traced project owned — and a call into unowned code is treated as external, a
357
+ leaf, exactly like a call into an installed package. The stack ended at the
358
+ package boundary and reported a plain number, with nothing in the report saying
359
+ it had stopped early.
360
+
361
+ Scoped to `packages/ic-suite/codometer/codometer-changes`, this repository traces 3 projects, 33
362
+ files, and 102 callables, in about 1.7 seconds. The same command before the
363
+ closure traced 1 project, 8 files, and 31 callables.
364
+
365
+ A closure is derived from what the compiler really read — every file in a
366
+ project's program — rather than from the dependency list a `package.json`
367
+ declares. A manifest says what a package may import; the program says what it
368
+ did. So a type-only import widens a closure, and a declared dependency nothing
369
+ imports does not.
370
+
371
+ ### What a closure does not reach
372
+
373
+ **Dependents, deliberately.** The walk runs downward only: a project that
374
+ imports a scoped one is not built, and its stacks do not appear. A call stack
375
+ runs downward too, so a dependent contributes no frames below anything the run
376
+ measures — and leaving it out is what stops an edit in a dependent from moving
377
+ the scoped project's numbers.
378
+
379
+ **A project root holding no `package.json`.** A manifest is what makes a
380
+ directory something another project can depend _on_. A root holding only a
381
+ `tsconfig.json` is where a repository keeps shared settings, and shared settings
382
+ are read by every project rather than depended on by any. Without this rule one
383
+ such directory drags the whole workspace in: each package's `tsconfig.json`
384
+ includes its own tooling configuration files, each of those imports out of the
385
+ shared directory, and that directory's program then reaches every toolchain the
386
+ repository configures.
387
+
388
+ **The workspace root.** A project whose root contains every other project cannot
389
+ be a meaningful dependency of any of them, whatever else it holds.
390
+
391
+ Both rules refuse a _destination_ only. Naming a directory is the caller saying
392
+ it should be traced, and a run naming no directory names every project — so
393
+ either kind is still traced in full when asked for directly, and a
394
+ whole-workspace run's findings are exactly what they were. What the rules cost
395
+ is that a call into a refused directory resolves to no frame, the way every call
396
+ out of a package did before closures existed.
397
+
398
+ ### Numbers that do not move with the scope
399
+
400
+ A file is owned by the **deepest project root containing it**, whichever program
401
+ pulled it in — not by whichever program happened to read it first. That is what
402
+ makes two runs agree: the same callable measures the same depth whether the run
403
+ was scoped to its own project, scoped to something that depends on it, or scoped
404
+ to nothing at all — provided each of those runs builds the project declaring it,
405
+ which a refused destination's is not.
406
+
407
+ Both findings survive a downward-only scope, which is worth saying because it is
408
+ not obvious: depth and breadth both fold over a callable's **callees**, which
409
+ run downward — precisely what a closure holds in full. Neither needs the
410
+ dependents a scoped run leaves out.
411
+
412
+ **Publishing does not widen with measurement.** A run publishes a section only
413
+ for the projects it was scoped to, so a scoped run never rewrites a section in a
414
+ dependency it merely measured — and a whole-workspace run still publishes every
415
+ project's, because a run naming no directory has every project as a scoped one.
416
+
417
+ [`dependency-closure`](../callidescope-examples/examples/dependency-closure/README.md)
418
+ works all of this through on a real call that leaves its package, with the
419
+ projects it reaches and why listed one by one.
420
+
421
+ ## Scoping by Nx project name
422
+
423
+ `--directories` takes paths, because callidescope has no idea what workspace
424
+ tool you use — a directory holding a `tsconfig.json` is the whole contract, and
425
+ it holds in a monorepo, a single package, or neither.
426
+
427
+ An Nx workspace can hand the selecting to Nx instead, through
428
+ [`@callidescope/nx`](../callidescope-nx/README.md) — a plugin that infers a
429
+ trace target onto every project:
430
+
431
+ ```bash
432
+ nx run-many -t trace --projects=tag:type:package
433
+ nx affected -t trace
434
+ nx run callidescope-graph:depth --addresses="src/foo.service.ts#FooService.bar"
435
+ ```
436
+
437
+ It infers a `trace`, a `depth`, and a `breadth` target onto every project, so
438
+ `callidescope`, `depth`, and `breadth` all become tasks — with Nx's own project
439
+ selection, caching, and affected-detection for free, none of which a flag here
440
+ could offer. It also resolves each project's **Nx dependencies** into
441
+ directories of their own, which makes them projects the run is _scoped_ to
442
+ rather than ones it merely measures — so their sections are published too, and
443
+ the selection comes from the declared graph rather than from whatever the
444
+ compiler happened to read. A stack is not truncated at a package boundary either
445
+ way: the dependency closure above is what stops that, and it needs no Nx graph.
446
+
447
+ It is a separate package rather than a flag here on purpose: this CLI depends
448
+ on nothing Nx-shaped, and a flag that only worked when an optional package
449
+ happened to be installed would advertise in `--help` something that silently
450
+ did nothing without it.
451
+
452
+ ## What it reports
453
+
454
+ **Deep call stacks.** The single deepest path below each entry point, when it
455
+ exceeds `maximumDepth`. Only one path per entry point is ever built — the deepest —
456
+ so a wide graph costs no more than a narrow one.
457
+
458
+ **Wide callables.** A callable calling more distinct callables directly than
459
+ `maximumBreadth` allows, reported per project the same way depth is.
460
+
461
+ A depth printed as `≥ 10` is a floor rather than a measurement: something on
462
+ that path could not be followed — a callback invoked through a parameter, a
463
+ computed member name — and the run says so rather than quietly under-reporting.
464
+ Narrowing a run is never what causes one: a scoped run builds its dependencies'
465
+ programs too, so a stack leaving the named package keeps going and reports a
466
+ plain number like any other.
467
+
468
+ ## What a frame carries
469
+
470
+ Every frame is annotated from the type checker, because a stack of bare names
471
+ is a list of places to go look rather than something you can read:
472
+
473
+ - **The signature** — parameter names and types, and the return type. On this
474
+ repository that is all 1,338 reported frames.
475
+ - **The documentation summary** — the JSDoc prose, collapsed to one line. 801
476
+ of those 1,338 have one.
477
+ - **Tags**, including `@deprecated`, which marks the frame inline.
478
+
479
+ Both come from the checker rather than the comment trivia, which is what makes
480
+ them right on the shapes this repository writes. An overload's documentation
481
+ lives on the signature rather than the implementation the graph points at; an
482
+ arrow-typed property's lives on the property rather than the arrow; a
483
+ destructured parameter has no name at all in the syntax. The checker resolves
484
+ all three.
485
+
486
+ A signature longer than 80 characters collapses to `(…): ReturnType`. That is
487
+ almost always a NestJS constructor taking a dozen injected services — which
488
+ services those are is noise at the point where you are reading a stack, and a
489
+ 440-character line destroys the indentation that makes the stack legible.
490
+
491
+ A summary longer than 120 characters prints only its opening sentence. Comments
492
+ here state what a callable does and then explain why, and the first half is the
493
+ half that orients someone reading a stack. It prints unmarked, because a whole
494
+ sentence is a complete thought rather than an elision and the frame's
495
+ `file:line` already points at the rest. Only a single sentence with no boundary
496
+ to find is cut on a word and marked `…`, which across this repository is 51 of
497
+ those 801 summaries.
498
+
499
+ **Shortening applies to the printed tree only.** The JSON report carries every
500
+ comment in full, because a machine reading it has no line width to respect —
501
+ the longest in the workspace runs 1,507 characters.
502
+
503
+ Annotations are read only for the frames a report actually prints, not for all
504
+ 4,727 callables. Rendering a type is the one genuinely costly thing the checker
505
+ does, and reports touch a few hundred frames.
506
+
507
+ ## How it follows a call
508
+
509
+ The TypeScript type checker resolves each call site. A call on a
510
+ constructor-injected property needs no special handling: the parameter property
511
+ carries the service's type, and the checker follows it.
512
+
513
+ | Written as | Resolved by |
514
+ | ---------- | ----------- |
515
+ | `helper()` | The symbol at the callee, unwrapped through import aliases |
516
+ | `this.service.load()` | The symbol at the member name — the injected-dependency case |
517
+ | `provider.ingest()` | Every class structurally satisfying the interface, capped by the implementation-candidate cap |
518
+ | `super.run()` | The base declaration the checker resolves to |
519
+ | `new Thing()` | The constructor, when it has a body |
520
+ | `list.map(callback)` | The callback, as its own frame — `map` itself is external |
521
+ | `target[key]()` | Nothing. Recorded as unfollowable rather than guessed |
522
+
523
+ Calls into **installed** dependencies are leaves. Whether `Array.prototype.map`
524
+ is deeply implemented says nothing about whether _your_ layering is too deep,
525
+ and counting it would make every number move on an unrelated upgrade. A call
526
+ into another project of the same workspace is not one of these: it resolves to a
527
+ real frame, because a scoped run builds that project's program too — see
528
+ [what a scoped run measures](#what-a-scoped-run-measures).
529
+
530
+ Structural matching is not optional: classes here routinely satisfy an interface
531
+ without writing `implements`, and its members are usually arrow-typed properties
532
+ rather than method signatures. A nominal-only index finds none of them.
533
+
534
+ ## Recursion
535
+
536
+ Cycles are collapsed before depth is measured, so a mutually recursive cluster
537
+ of three contributes three frames once — an honest floor on a stack that has no
538
+ ceiling. The alternative, detecting a repeat visit mid-walk, makes the answer
539
+ depend on which path arrived first, so the same function reports different
540
+ depths from different entry points and between runs. A linter whose numbers move
541
+ on their own is not usable as a gate.
542
+
543
+ ## Entry points
544
+
545
+ Depth is only meaningful relative to a root, and most code here is called by a
546
+ framework rather than by the repository. Roots are therefore configurable:
547
+ decorated methods, lifecycle hooks, `main.ts` bootstraps, and every `src/index.ts`
548
+ export.
549
+
550
+ Anything left with no caller is promoted to an **orphan root**. That is the
551
+ safety net: without it, a missing rule silently removes a whole subtree from
552
+ every measurement instead of showing up.
553
+
554
+ ## Agent skills
555
+
556
+ Agent skills for coding agents working with callidescope are published in
557
+ [`@callidescope/agents`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-agents):
558
+
559
+ | Skill | Description |
560
+ | ----- | ----------- |
561
+ | [`callidescope-trace`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-agents/skills/callidescope-trace) | Trace the workspace or inspect depth and breadth for named callables |
562
+ | [`callidescope-configure`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-agents/skills/callidescope-configure) | Configure callidescope flags, rules, and `callidescope.config.ts` |
563
+ | [`callidescope-triage`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-agents/skills/callidescope-triage) | Triage and resolve depth limit breaches and gate failures |
564
+
565
+ ## Examples
566
+
567
+ Every rule, finding, and output on this page has a worked example in
568
+ [`@callidescope/examples`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-examples) — a small
569
+ codebase written to be traced, with its rendered reports committed. Its
570
+ [`AGENTS.md`](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/callidescope/callidescope-examples/AGENTS.md) is a "callidescope reported X
571
+ → open this example" table, so a failing `gate` has somewhere to go.
572
+
573
+ ## Non-goals
574
+
575
+ **Control flow graphs.** Intra-procedural branching is already capped by this
576
+ repository's ESLint rules (`complexity`, `max-depth`, `max-statements`), and a
577
+ CFG is not what call-stack depth needs. Building one would duplicate ESLint at
578
+ much higher cost.
579
+
580
+ **Clone detection.** Repeated call-stack shapes are not a useful signal in a
581
+ dependency-injected codebase — the shared suffix _is_ the service layer, so
582
+ every resolver ends the same way. `jscpd` already covers real duplication.
583
+
584
+ ## Packages
585
+
586
+ | Package | Role |
587
+ | ------- | ---- |
588
+ | [`@callidescope/cli`](.) | Orchestrates a run: traces the workspace, plans what to check, and reports |
589
+ | [`@callidescope/configuration`](../callidescope-configuration/README.md) | Reads `callidescope.config.ts` and resolves the limits |
590
+ | [`@callidescope/graph`](../callidescope-graph/README.md) | Builds the call graph from traced source and measures depth and breadth |
591
+ | [`@callidescope/nx`](../callidescope-nx/README.md) | Nx plugin: per-project `trace`/`depth`/`breadth` targets, scoped through the Nx dependency graph |
592
+ | [`@callidescope/output`](../callidescope-output/README.md) | Renders findings into markdown, mermaid, and JSON |
593
+ | [`@callidescope/examples`](../callidescope-examples/README.md) | A traced fixture codebase carrying one worked example of everything above |
594
+
595
+ ## Start
596
+
597
+ ```bash
598
+ nx run callidescope-cli:start
599
+ ```
600
+
601
+ ## Test
602
+
603
+ ```bash
604
+ nx run callidescope-cli:vitest
605
+ ```
606
+
607
+ ## Contributing
608
+
609
+ ```bash
610
+ nx run callidescope-cli:lint-code --configuration=check
611
+ ```
612
+
613
+ ## License
614
+
615
+ MIT — see [LICENSE](../../../../LICENSE).
616
+
617
+ ## 👔 Conformetry
618
+
619
+ This project was generated from the [nestjs-command-project](../../../../configuration/conformetry-templates/nestjs-command-project) conformetry template.
620
+
621
+ <!-- callidescope:start -->
622
+
623
+ ## 🔭 Callidescope
624
+
625
+ Call stacks traced through `packages/ic-suite/callidescope/callidescope-cli`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
626
+
627
+ | Measure | Value |
628
+ | --- | --- |
629
+ | Callables | 113 |
630
+ | Files | 34 |
631
+ | Calls traced | 153 |
632
+ | Call stacks | 42 |
633
+ | Deepest stack | 15 |
634
+ | Stacks through recursion | 0 |
635
+ | Unfollowable calls | 5 |
636
+
637
+ ### Limits
638
+
639
+ What this project is judged against, as declared in its own `callidescope.config.ts`.
640
+
641
+ | Limit | Value |
642
+ | --- | --- |
643
+ | `maximumDepth` | 15 |
644
+ | `maximumBreadth` | 11 |
645
+
646
+ ### Call stacks (depth)
647
+
648
+ **1. `CallidescopeCommand.run`** — depth ≥ 15 · decorated-method
649
+
650
+ ```text
651
+ 🚀 CallidescopeCommand.run(passedParameters: string[], options: CallidescopeCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:469]
652
+ ↳ Traces the workspace, reports, and sets the exit code.
653
+ └─> CallidescopeCommand.traceWorkspace(options: CallidescopeCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:174]
654
+ ↳ Traces the workspace, reports, and sets the exit code.
655
+ └─> CallidescopeService.trace(args: TraceArguments): Promise<TraceOutcome> [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:408]
656
+ ↳ Traces a workspace and returns everything the run found.
657
+ └─> CallidescopeService.analyze(…): AnalyzeOutcome [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:295]
658
+ ↳ Derives every finding from the collected callables.
659
+ └─> GraphAssemblyService.assemble(args: AssembleGraphArguments): AssembledGraph [packages/ic-suite/callidescope/callidescope-graph/src/modules/graph/graph-assembly.service.ts:43]
660
+ ↳ Builds the call graph and everything derived from it.
661
+ └─> EdgesService.build(args: BuildEdgesArguments): EdgeCollection [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:251]
662
+ ↳ Builds every edge in the graph, and records the calls it could not.
663
+ └─> EdgesService.buildSiteEdges(…): { edges: CallEdge[]; unresolved: UnresolvedCall[]; } [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:59]
664
+ ↳ Turns one call site into the edges and non-resolutions it produced.
665
+ └─> EdgesService.resolveSite(…): ResolvedCallSite | undefined [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:226]
666
+ ↳ Resolves one call site, choosing the right strategy for its shape.
667
+ └─> SymbolResolutionService.resolve(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:267]
668
+ ↳ Resolves a call expression to every declaration it can reach.
669
+ └─> SymbolResolutionService.resolveSymbol(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:165]
670
+ ↳ Resolves an already-identified callee symbol to its declarations.
671
+ └─> SymbolResolutionService.resolveThroughHierarchy(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:217]
672
+ ↳ Expands an interface or abstract member to its implementations.
673
+ └─> ClassesService.resolveImplementations(…): ImplementationLookup [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:204]
674
+ ↳ Finds the concrete declarations one interface member resolves to.
675
+ └─> ClassesService.flatMap(…)(this: undefined, candidate: ts.ClassDeclaration): ts.Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:232]
676
+ └─> ClassesService.readMemberDeclarations(…): Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:148]
677
+ ↳ Reads one member's concrete declarations off a candidate class.
678
+ └─> ClassesService.filter(…)(member: ts.PropertyDeclaration | ts.MethodDeclaration): boolean [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:162]
679
+ ```
680
+
681
+ **2. `BreadthCommand.run`** — depth ≥ 15 · decorated-method
682
+
683
+ ```text
684
+ 🚀 BreadthCommand.run(_passedParameters: string[], options: AddressCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:315]
685
+ ↳ Prints each named callable's direct callers and callees.
686
+ └─> BreadthCommand.printBreadth(options: AddressCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:127]
687
+ ↳ Resolves the addresses and prints their direct callers and callees.
688
+ └─> AddressLookupService.locate(options: AddressCommandOptions): Promise<LocatedWorkspace> [packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:87]
689
+ ↳ Loads the configuration and traces the workspace, matching nothing yet.
690
+ └─> CallidescopeService.locate(args: TraceArguments): Promise<LocateOutcome> [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:394]
691
+ ↳ Collects every callable and assembles the graph over them, without running the analysis a full trace does.
692
+ └─> GraphAssemblyService.assemble(args: AssembleGraphArguments): AssembledGraph [packages/ic-suite/callidescope/callidescope-graph/src/modules/graph/graph-assembly.service.ts:43]
693
+ ↳ Builds the call graph and everything derived from it.
694
+ └─> EdgesService.build(args: BuildEdgesArguments): EdgeCollection [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:251]
695
+ ↳ Builds every edge in the graph, and records the calls it could not.
696
+ └─> EdgesService.buildSiteEdges(…): { edges: CallEdge[]; unresolved: UnresolvedCall[]; } [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:59]
697
+ ↳ Turns one call site into the edges and non-resolutions it produced.
698
+ └─> EdgesService.resolveSite(…): ResolvedCallSite | undefined [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:226]
699
+ ↳ Resolves one call site, choosing the right strategy for its shape.
700
+ └─> SymbolResolutionService.resolve(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:267]
701
+ ↳ Resolves a call expression to every declaration it can reach.
702
+ └─> SymbolResolutionService.resolveSymbol(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:165]
703
+ ↳ Resolves an already-identified callee symbol to its declarations.
704
+ └─> SymbolResolutionService.resolveThroughHierarchy(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:217]
705
+ ↳ Expands an interface or abstract member to its implementations.
706
+ └─> ClassesService.resolveImplementations(…): ImplementationLookup [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:204]
707
+ ↳ Finds the concrete declarations one interface member resolves to.
708
+ └─> ClassesService.flatMap(…)(this: undefined, candidate: ts.ClassDeclaration): ts.Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:232]
709
+ └─> ClassesService.readMemberDeclarations(…): Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:148]
710
+ ↳ Reads one member's concrete declarations off a candidate class.
711
+ └─> ClassesService.filter(…)(member: ts.PropertyDeclaration | ts.MethodDeclaration): boolean [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:162]
712
+ ```
713
+
714
+ **3. `DepthCommand.run`** — depth ≥ 15 · decorated-method
715
+
716
+ ```text
717
+ 🚀 DepthCommand.run(_passedParameters: string[], options: AddressCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:290]
718
+ ↳ Resolves the addresses, traces every path above and below each, and prints them.
719
+ └─> DepthCommand.printDepth(options: AddressCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:89]
720
+ ↳ Traces every path above and below each resolved address, and prints them.
721
+ └─> AddressLookupService.locate(options: AddressCommandOptions): Promise<LocatedWorkspace> [packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:87]
722
+ ↳ Loads the configuration and traces the workspace, matching nothing yet.
723
+ └─> CallidescopeService.locate(args: TraceArguments): Promise<LocateOutcome> [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:394]
724
+ ↳ Collects every callable and assembles the graph over them, without running the analysis a full trace does.
725
+ └─> GraphAssemblyService.assemble(args: AssembleGraphArguments): AssembledGraph [packages/ic-suite/callidescope/callidescope-graph/src/modules/graph/graph-assembly.service.ts:43]
726
+ ↳ Builds the call graph and everything derived from it.
727
+ └─> EdgesService.build(args: BuildEdgesArguments): EdgeCollection [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:251]
728
+ ↳ Builds every edge in the graph, and records the calls it could not.
729
+ └─> EdgesService.buildSiteEdges(…): { edges: CallEdge[]; unresolved: UnresolvedCall[]; } [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:59]
730
+ ↳ Turns one call site into the edges and non-resolutions it produced.
731
+ └─> EdgesService.resolveSite(…): ResolvedCallSite | undefined [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/edges.service.ts:226]
732
+ ↳ Resolves one call site, choosing the right strategy for its shape.
733
+ └─> SymbolResolutionService.resolve(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:267]
734
+ ↳ Resolves a call expression to every declaration it can reach.
735
+ └─> SymbolResolutionService.resolveSymbol(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:165]
736
+ ↳ Resolves an already-identified callee symbol to its declarations.
737
+ └─> SymbolResolutionService.resolveThroughHierarchy(…): ResolvedCallSite [packages/ic-suite/callidescope/callidescope-graph/src/modules/edges/symbol-resolution.service.ts:217]
738
+ ↳ Expands an interface or abstract member to its implementations.
739
+ └─> ClassesService.resolveImplementations(…): ImplementationLookup [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:204]
740
+ ↳ Finds the concrete declarations one interface member resolves to.
741
+ └─> ClassesService.flatMap(…)(this: undefined, candidate: ts.ClassDeclaration): ts.Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:232]
742
+ └─> ClassesService.readMemberDeclarations(…): Declaration[] [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:148]
743
+ ↳ Reads one member's concrete declarations off a candidate class.
744
+ └─> ClassesService.filter(…)(member: ts.PropertyDeclaration | ts.MethodDeclaration): boolean [packages/ic-suite/callidescope/callidescope-graph/src/modules/classes/classes.service.ts:162]
745
+ ```
746
+
747
+ <details>
748
+ <summary>39 more call stacks</summary>
749
+
750
+ **4. `LimitsCommand.run`** — depth ≥ 7 · decorated-method
751
+
752
+ ```text
753
+ 🚀 LimitsCommand.run(_passedParameters: string[], options?: LimitsCommandOptions): Promise<void> [packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.command.ts:85]
754
+ ↳ Prints every project's resolved limits.
755
+ └─> LimitsService.list(options: LimitsCommandOptions): Promise<ProjectLimitRow[]> [packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:150]
756
+ ↳ Resolves every project's limits, workspace default first.
757
+ └─> ConfigurationService.loadConfigurationFile(args?: LoadConfigurationArguments): Promise<LoadedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:87]
758
+ ↳ Loads a configuration, and says what the file itself declared and which file answered.
759
+ └─> ConfigurationFileService.loadConfigurationFile(args?: LoadConfigurationArguments): Promise<LoadedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:326]
760
+ ↳ Loads a configuration, and says what the file itself declared and which file answered.
761
+ └─> ConfigurationFileService.resolveConfigurationPath(configurationPath: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:158]
762
+ ↳ Resolves a configuration path against the cwd, then the repository root.
763
+ └─> ConfigurationFileService.findRepositoryRoot(): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:97]
764
+ ↳ Walks upward from the process cwd looking for the repository root.
765
+ └─> ConfigurationFileService.some(…)(marker: ".git" | "pnpm-workspace.yaml"): boolean [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:102]
766
+ ```
767
+
768
+ **5. `CallidescopeCommand.parseDirectories`** — depth 4 · decorated-method
769
+
770
+ ```text
771
+ 🚀 CallidescopeCommand.parseDirectories(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:292]
772
+ ↳ Parses `--directories`, a comma-separated list of project directories.
773
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
774
+ ↳ Splits a comma-separated flag value into its parts.
775
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
776
+ ↳ Splits `--directories`, a comma-separated list of project directories.
777
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
778
+ ```
779
+
780
+ **6. `CallidescopeCommand.parseEntryPointAddresses`** — depth 4 · decorated-method
781
+
782
+ ```text
783
+ 🚀 CallidescopeCommand.parseEntryPointAddresses(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:301]
784
+ ↳ Parses `--entry-point-addresses`, overriding `entryPoints.addresses`.
785
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
786
+ ↳ Splits a comma-separated flag value into its parts.
787
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
788
+ ↳ Splits `--directories`, a comma-separated list of project directories.
789
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
790
+ ```
791
+
792
+ **7. `CallidescopeCommand.parseEntryPointDecorators`** — depth 4 · decorated-method
793
+
794
+ ```text
795
+ 🚀 CallidescopeCommand.parseEntryPointDecorators(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:310]
796
+ ↳ Parses `--entry-point-decorators`, overriding `entryPoints.decorators`.
797
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
798
+ ↳ Splits a comma-separated flag value into its parts.
799
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
800
+ ↳ Splits `--directories`, a comma-separated list of project directories.
801
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
802
+ ```
803
+
804
+ **8. `CallidescopeCommand.parseExclude`** — depth 4 · decorated-method
805
+
806
+ ```text
807
+ 🚀 CallidescopeCommand.parseExclude(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:319]
808
+ ↳ Parses `--exclude`, overriding `exclude`.
809
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
810
+ ↳ Splits a comma-separated flag value into its parts.
811
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
812
+ ↳ Splits `--directories`, a comma-separated list of project directories.
813
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
814
+ ```
815
+
816
+ **9. `CallidescopeCommand.parseExcludeCallees`** — depth 4 · decorated-method
817
+
818
+ ```text
819
+ 🚀 CallidescopeCommand.parseExcludeCallees(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:328]
820
+ ↳ Parses `--exclude-callees`, overriding `excludeCallees`.
821
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
822
+ ↳ Splits a comma-separated flag value into its parts.
823
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
824
+ ↳ Splits `--directories`, a comma-separated list of project directories.
825
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
826
+ ```
827
+
828
+ **10. `BreadthCommand.parseAddresses`** — depth 4 · decorated-method
829
+
830
+ ```text
831
+ 🚀 BreadthCommand.parseAddresses(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:194]
832
+ ↳ Parses `--addresses`, a comma-separated list of callable addresses.
833
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
834
+ ↳ Splits a comma-separated flag value into its parts.
835
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
836
+ ↳ Splits `--directories`, a comma-separated list of project directories.
837
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
838
+ ```
839
+
840
+ **11. `BreadthCommand.parseDirectories`** — depth 4 · decorated-method
841
+
842
+ ```text
843
+ 🚀 BreadthCommand.parseDirectories(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:213]
844
+ ↳ Parses `--directories`, a comma-separated list of project directories.
845
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
846
+ ↳ Splits a comma-separated flag value into its parts.
847
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
848
+ ↳ Splits `--directories`, a comma-separated list of project directories.
849
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
850
+ ```
851
+
852
+ **12. `BreadthCommand.parseEntryPointAddresses`** — depth 4 · decorated-method
853
+
854
+ ```text
855
+ 🚀 BreadthCommand.parseEntryPointAddresses(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:222]
856
+ ↳ Parses `--entry-point-addresses`, overriding `entryPoints.addresses`.
857
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
858
+ ↳ Splits a comma-separated flag value into its parts.
859
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
860
+ ↳ Splits `--directories`, a comma-separated list of project directories.
861
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
862
+ ```
863
+
864
+ **13. `BreadthCommand.parseEntryPointDecorators`** — depth 4 · decorated-method
865
+
866
+ ```text
867
+ 🚀 BreadthCommand.parseEntryPointDecorators(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:231]
868
+ ↳ Parses `--entry-point-decorators`, overriding `entryPoints.decorators`.
869
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
870
+ ↳ Splits a comma-separated flag value into its parts.
871
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
872
+ ↳ Splits `--directories`, a comma-separated list of project directories.
873
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
874
+ ```
875
+
876
+ **14. `BreadthCommand.parseExclude`** — depth 4 · decorated-method
877
+
878
+ ```text
879
+ 🚀 BreadthCommand.parseExclude(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:240]
880
+ ↳ Parses `--exclude`, overriding `exclude`.
881
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
882
+ ↳ Splits a comma-separated flag value into its parts.
883
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
884
+ ↳ Splits `--directories`, a comma-separated list of project directories.
885
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
886
+ ```
887
+
888
+ **15. `BreadthCommand.parseExcludeCallees`** — depth 4 · decorated-method
889
+
890
+ ```text
891
+ 🚀 BreadthCommand.parseExcludeCallees(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:249]
892
+ ↳ Parses `--exclude-callees`, overriding `excludeCallees`.
893
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
894
+ ↳ Splits a comma-separated flag value into its parts.
895
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
896
+ ↳ Splits `--directories`, a comma-separated list of project directories.
897
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
898
+ ```
899
+
900
+ **16. `DepthCommand.parseAddresses`** — depth 4 · decorated-method
901
+
902
+ ```text
903
+ 🚀 DepthCommand.parseAddresses(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:168]
904
+ ↳ Parses `--addresses`, a comma-separated list of callable addresses.
905
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
906
+ ↳ Splits a comma-separated flag value into its parts.
907
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
908
+ ↳ Splits `--directories`, a comma-separated list of project directories.
909
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
910
+ ```
911
+
912
+ **17. `DepthCommand.parseDirectories`** — depth 4 · decorated-method
913
+
914
+ ```text
915
+ 🚀 DepthCommand.parseDirectories(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:187]
916
+ ↳ Parses `--directories`, a comma-separated list of project directories.
917
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
918
+ ↳ Splits a comma-separated flag value into its parts.
919
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
920
+ ↳ Splits `--directories`, a comma-separated list of project directories.
921
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
922
+ ```
923
+
924
+ **18. `DepthCommand.parseEntryPointAddresses`** — depth 4 · decorated-method
925
+
926
+ ```text
927
+ 🚀 DepthCommand.parseEntryPointAddresses(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:196]
928
+ ↳ Parses `--entry-point-addresses`, overriding `entryPoints.addresses`.
929
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
930
+ ↳ Splits a comma-separated flag value into its parts.
931
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
932
+ ↳ Splits `--directories`, a comma-separated list of project directories.
933
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
934
+ ```
935
+
936
+ **19. `DepthCommand.parseEntryPointDecorators`** — depth 4 · decorated-method
937
+
938
+ ```text
939
+ 🚀 DepthCommand.parseEntryPointDecorators(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:205]
940
+ ↳ Parses `--entry-point-decorators`, overriding `entryPoints.decorators`.
941
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
942
+ ↳ Splits a comma-separated flag value into its parts.
943
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
944
+ ↳ Splits `--directories`, a comma-separated list of project directories.
945
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
946
+ ```
947
+
948
+ **20. `DepthCommand.parseExclude`** — depth 4 · decorated-method
949
+
950
+ ```text
951
+ 🚀 DepthCommand.parseExclude(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:214]
952
+ ↳ Parses `--exclude`, overriding `exclude`.
953
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
954
+ ↳ Splits a comma-separated flag value into its parts.
955
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
956
+ ↳ Splits `--directories`, a comma-separated list of project directories.
957
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
958
+ ```
959
+
960
+ **21. `DepthCommand.parseExcludeCallees`** — depth 4 · decorated-method
961
+
962
+ ```text
963
+ 🚀 DepthCommand.parseExcludeCallees(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:223]
964
+ ↳ Parses `--exclude-callees`, overriding `excludeCallees`.
965
+ └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104]
966
+ ↳ Splits a comma-separated flag value into its parts.
967
+ └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98]
968
+ ↳ Splits `--directories`, a comma-separated list of project directories.
969
+ └─> InputService.map(…)(entry: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:103]
970
+ ```
971
+
972
+ **22. `CallidescopeCommand.parseConfig`** — depth 3 · decorated-method
973
+
974
+ ```text
975
+ 🚀 CallidescopeCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:283]
976
+ ↳ Parses `--config`.
977
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
978
+ ↳ Reads a flag that may have been written without a value.
979
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
980
+ ↳ Trims an optional string option, treating blank as absent.
981
+ ```
982
+
983
+ **23. `CallidescopeCommand.parseFormat`** — depth 3 · decorated-method
984
+
985
+ ```text
986
+ 🚀 CallidescopeCommand.parseFormat(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:343]
987
+ ↳ Parses `--format`, which decides what the run prints.
988
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
989
+ ↳ Reads a flag that may have been written without a value.
990
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
991
+ ↳ Trims an optional string option, treating blank as absent.
992
+ ```
993
+
994
+ **24. `CallidescopeCommand.parseIncludeExportedFunctions`** — depth 3 · decorated-method
995
+
996
+ ```text
997
+ 🚀 CallidescopeCommand.parseIncludeExportedFunctions(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:357]
998
+ ↳ Parses `--include-exported-functions`, overriding the entry-point rule.
999
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1000
+ ↳ Reads a flag that may have been written without a value.
1001
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1002
+ ↳ Trims an optional string option, treating blank as absent.
1003
+ ```
1004
+
1005
+ **25. `CallidescopeCommand.parseIncludeOrphans`** — depth 3 · decorated-method
1006
+
1007
+ ```text
1008
+ 🚀 CallidescopeCommand.parseIncludeOrphans(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:368]
1009
+ ↳ Parses `--include-orphans`, overriding the entry-point rule.
1010
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1011
+ ↳ Reads a flag that may have been written without a value.
1012
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1013
+ ↳ Trims an optional string option, treating blank as absent.
1014
+ ```
1015
+
1016
+ **26. `CallidescopeCommand.parseIncludeTests`** — depth 3 · decorated-method
1017
+
1018
+ ```text
1019
+ 🚀 CallidescopeCommand.parseIncludeTests(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:377]
1020
+ ↳ Parses `--include-tests`, overriding the entry-point rule.
1021
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1022
+ ↳ Reads a flag that may have been written without a value.
1023
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1024
+ ↳ Trims an optional string option, treating blank as absent.
1025
+ ```
1026
+
1027
+ **27. `CallidescopeCommand.parseJson`** — depth 3 · decorated-method
1028
+
1029
+ ```text
1030
+ 🚀 CallidescopeCommand.parseJson(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:386]
1031
+ ↳ Parses `--json`.
1032
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1033
+ ↳ Reads a flag that may have been written without a value.
1034
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1035
+ ↳ Trims an optional string option, treating blank as absent.
1036
+ ```
1037
+
1038
+ **28. `CallidescopeCommand.parseMarkdown`** — depth 3 · decorated-method
1039
+
1040
+ ```text
1041
+ 🚀 CallidescopeCommand.parseMarkdown(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:396]
1042
+ ↳ Parses `--markdown`.
1043
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1044
+ ↳ Reads a flag that may have been written without a value.
1045
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1046
+ ↳ Trims an optional string option, treating blank as absent.
1047
+ ```
1048
+
1049
+ **29. `CallidescopeCommand.parseMaximumBreadth`** — depth 3 · decorated-method
1050
+
1051
+ ```text
1052
+ 🚀 CallidescopeCommand.parseMaximumBreadth(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:412]
1053
+ ↳ Parses `--maximum-breadth`, overriding `limits.maximumBreadth`.
1054
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1055
+ ↳ Reads a flag that may have been written without a value.
1056
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1057
+ ↳ Trims an optional string option, treating blank as absent.
1058
+ ```
1059
+
1060
+ **30. `CallidescopeCommand.parseMaximumDepth`** — depth 3 · decorated-method
1061
+
1062
+ ```text
1063
+ 🚀 CallidescopeCommand.parseMaximumDepth(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:421]
1064
+ ↳ Parses `--maximum-depth`, overriding `limits.maximumDepth`.
1065
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1066
+ ↳ Reads a flag that may have been written without a value.
1067
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1068
+ ↳ Trims an optional string option, treating blank as absent.
1069
+ ```
1070
+
1071
+ **31. `CallidescopeCommand.parseMermaid`** — depth 3 · decorated-method
1072
+
1073
+ ```text
1074
+ 🚀 CallidescopeCommand.parseMermaid(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:430]
1075
+ ↳ Parses `--mermaid`.
1076
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1077
+ ↳ Reads a flag that may have been written without a value.
1078
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1079
+ ↳ Trims an optional string option, treating blank as absent.
1080
+ ```
1081
+
1082
+ **32. `BreadthCommand.parseConfig`** — depth 3 · decorated-method
1083
+
1084
+ ```text
1085
+ 🚀 BreadthCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:204]
1086
+ ↳ Parses `--config`.
1087
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1088
+ ↳ Reads a flag that may have been written without a value.
1089
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1090
+ ↳ Trims an optional string option, treating blank as absent.
1091
+ ```
1092
+
1093
+ **33. `BreadthCommand.parseFormat`** — depth 3 · decorated-method
1094
+
1095
+ ```text
1096
+ 🚀 BreadthCommand.parseFormat(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:264]
1097
+ ↳ Parses `--format`.
1098
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1099
+ ↳ Reads a flag that may have been written without a value.
1100
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1101
+ ↳ Trims an optional string option, treating blank as absent.
1102
+ ```
1103
+
1104
+ **34. `BreadthCommand.parseIncludeExportedFunctions`** — depth 3 · decorated-method
1105
+
1106
+ ```text
1107
+ 🚀 BreadthCommand.parseIncludeExportedFunctions(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:278]
1108
+ ↳ Parses `--include-exported-functions`, overriding the entry-point rule.
1109
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1110
+ ↳ Reads a flag that may have been written without a value.
1111
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1112
+ ↳ Trims an optional string option, treating blank as absent.
1113
+ ```
1114
+
1115
+ **35. `BreadthCommand.parseIncludeOrphans`** — depth 3 · decorated-method
1116
+
1117
+ ```text
1118
+ 🚀 BreadthCommand.parseIncludeOrphans(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:289]
1119
+ ↳ Parses `--include-orphans`, overriding the entry-point rule.
1120
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1121
+ ↳ Reads a flag that may have been written without a value.
1122
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1123
+ ↳ Trims an optional string option, treating blank as absent.
1124
+ ```
1125
+
1126
+ **36. `BreadthCommand.parseIncludeTests`** — depth 3 · decorated-method
1127
+
1128
+ ```text
1129
+ 🚀 BreadthCommand.parseIncludeTests(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:298]
1130
+ ↳ Parses `--include-tests`, overriding the entry-point rule.
1131
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1132
+ ↳ Reads a flag that may have been written without a value.
1133
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1134
+ ↳ Trims an optional string option, treating blank as absent.
1135
+ ```
1136
+
1137
+ **37. `DepthCommand.parseConfig`** — depth 3 · decorated-method
1138
+
1139
+ ```text
1140
+ 🚀 DepthCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:178]
1141
+ ↳ Parses `--config`.
1142
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1143
+ ↳ Reads a flag that may have been written without a value.
1144
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1145
+ ↳ Trims an optional string option, treating blank as absent.
1146
+ ```
1147
+
1148
+ **38. `DepthCommand.parseFormat`** — depth 3 · decorated-method
1149
+
1150
+ ```text
1151
+ 🚀 DepthCommand.parseFormat(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:238]
1152
+ ↳ Parses `--format`.
1153
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1154
+ ↳ Reads a flag that may have been written without a value.
1155
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1156
+ ↳ Trims an optional string option, treating blank as absent.
1157
+ ```
1158
+
1159
+ **39. `DepthCommand.parseIncludeExportedFunctions`** — depth 3 · decorated-method
1160
+
1161
+ ```text
1162
+ 🚀 DepthCommand.parseIncludeExportedFunctions(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:252]
1163
+ ↳ Parses `--include-exported-functions`, overriding the entry-point rule.
1164
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1165
+ ↳ Reads a flag that may have been written without a value.
1166
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1167
+ ↳ Trims an optional string option, treating blank as absent.
1168
+ ```
1169
+
1170
+ **40. `DepthCommand.parseIncludeOrphans`** — depth 3 · decorated-method
1171
+
1172
+ ```text
1173
+ 🚀 DepthCommand.parseIncludeOrphans(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:263]
1174
+ ↳ Parses `--include-orphans`, overriding the entry-point rule.
1175
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1176
+ ↳ Reads a flag that may have been written without a value.
1177
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1178
+ ↳ Trims an optional string option, treating blank as absent.
1179
+ ```
1180
+
1181
+ **41. `DepthCommand.parseIncludeTests`** — depth 3 · decorated-method
1182
+
1183
+ ```text
1184
+ 🚀 DepthCommand.parseIncludeTests(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:272]
1185
+ ↳ Parses `--include-tests`, overriding the entry-point rule.
1186
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1187
+ ↳ Reads a flag that may have been written without a value.
1188
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1189
+ ↳ Trims an optional string option, treating blank as absent.
1190
+ ```
1191
+
1192
+ **42. `LimitsCommand.parseConfig`** — depth 3 · decorated-method
1193
+
1194
+ ```text
1195
+ 🚀 LimitsCommand.parseConfig(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.command.ts:70]
1196
+ ↳ Parses `--config`.
1197
+ └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109]
1198
+ ↳ Reads a flag that may have been written without a value.
1199
+ └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:108]
1200
+ ↳ Trims an optional string option, treating blank as absent.
1201
+ ```
1202
+
1203
+ </details>
1204
+
1205
+ ### Breadth
1206
+
1207
+ | Callable | Breadth | Calls directly | Location |
1208
+ | --- | --- | --- | --- |
1209
+ | `CallidescopeCommand.traceWorkspace` | 10 | `ConfigurationService.resolveFormatOption`, `ConfigurationService.prepareRun`, `CallidescopeCommand.reject`, `CallidescopeService.trace`, `UnresolvedEntryPointAddressError.constructor`, `CallidescopeCommand.map(…)`, `CallidescopeCommand.report`, `ConfigurationService.touchesFiles`, `WriteDestinationsService.syncDestinations`, `ReportFindingsService.reportFindings` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:174` |
1210
+ | `CallidescopeService.discoverCallables` | 9 | `CallidescopeService.discoverPrograms`, `CallidescopeService.map(…)`, `CallidescopeService.loadProjectDeclarations`, `ExternalService.configure`, `ClassesService.build`, `CallablesService.collect`, `FileFilterService.buildProjectFileFilter`, `CallidescopeService.map(…)`, `CallidescopeService.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:83` |
1211
+ | `CallidescopeService.analyze` | 7 | `GraphAssemblyService.assemble`, `EntriesService.resolve`, `ProjectReportsService.build`, `CallidescopeService.filter(…)`, `CallidescopeService.readMaximumDepth`, `ProjectReportsService.findDeepStacks`, `ProjectReportsService.findWideCallables` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:295` |
1212
+
1213
+ <details>
1214
+ <summary>73 more callables</summary>
1215
+
1216
+ | Callable | Breadth | Calls directly | Location |
1217
+ | --- | --- | --- | --- |
1218
+ | `CallidescopeService.loadProjectDeclarations` | 6 | `ConfigurationService.loadProjectConfigurations`, `CallidescopeService.map(…)`, `CallidescopeService.map(…)`, `CallidescopeService.filter(…)`, `ConfigurationService.resolveLimits`, `CallidescopeService.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:224` |
1219
+ | `DepthCommand.printDepth` | 6 | `ConfigurationService.resolveFormatOption`, `AddressLookupService.locate`, `DepthCommand.resolveAddresses`, `DepthCommand.identifyAddresses`, `AddressReportService.renderDepthReports`, `DepthCommand.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:89` |
1220
+ | `LimitsService.list` | 6 | `ConfigurationService.loadConfigurationFile`, `LimitsService.discoverProjects`, `ConfigurationService.loadProjectConfigurations`, `ConfigurationService.resolveLimits`, `LimitsService.toWorkspaceRows`, `LimitsService.flatMap(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:150` |
1221
+ | `BreadthCommand.printBreadth` | 5 | `ConfigurationService.resolveFormatOption`, `AddressLookupService.locate`, `BreadthCommand.resolveAddresses`, `BreadthCommand.buildReports`, `AddressReportService.renderBreadthReports` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:127` |
1222
+ | `CallidescopeService.discoverPrograms` | 4 | `FileFilterService.buildFileFilter`, `WorkspaceService.discoverProjects`, `ProgramService.buildPrograms`, `CallidescopeService.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:150` |
1223
+ | `CallidescopeCommand.run` | 4 | `CallidescopeCommand.reject`, `buildUnknownCommandMessage`, `CallidescopeCommand.traceWorkspace`, `readRefusalHeadline` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:469` |
1224
+ | `LimitsCommand.run` | 4 | `LimitsService.list`, `RenderLimitsService.render`, `readRefusalHeadline`, `LimitsCommand.reject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.command.ts:85` |
1225
+ | `BreadthCommand.describeAddress` | 3 | `AddressLookupService.resolve`, `AddressLookupService.describeProblem`, `BreadthService.describeDirectCalls` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:91` |
1226
+ | `BreadthCommand.run` | 3 | `BreadthCommand.printBreadth`, `readRefusalHeadline`, `BreadthCommand.reject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:315` |
1227
+ | `DepthCommand.identifyAddresses` | 3 | `AddressLookupService.resolve`, `AddressLookupService.describeProblem`, `DepthCommand.reject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:55` |
1228
+ | `DepthCommand.run` | 3 | `DepthCommand.printDepth`, `readRefusalHeadline`, `DepthCommand.reject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:290` |
1229
+ | `LimitsService.discoverProjects` | 3 | `FileFilterService.buildFileFilter`, `LimitsService.map(…)`, `WorkspaceService.discoverProjects` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:68` |
1230
+ | `RenderLimitsService.renderTable` | 3 | `RenderLimitsService.renderRow`, `RenderLimitsService.map(…)`, `RenderLimitsService.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/render-limits.service.ts:57` |
1231
+ | `CallidescopeService.locate` | 2 | `CallidescopeService.discoverCallables`, `GraphAssemblyService.assemble` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:394` |
1232
+ | `CallidescopeService.trace` | 2 | `CallidescopeService.discoverCallables`, `CallidescopeService.analyze` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:408` |
1233
+ | `CallidescopeCommand.report` | 2 | `OutputJsonService.buildReport`, `MarkdownReportService.renderRun` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:135` |
1234
+ | `AddressLookupService.locate` | 2 | `ConfigurationService.prepareLookup`, `CallidescopeService.locate` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:87` |
1235
+ | `BreadthCommand.buildReports` | 2 | `BreadthCommand.describeAddress`, `BreadthCommand.reject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:55` |
1236
+ | `BreadthCommand.resolveAddresses` | 2 | `ConfigurationService.promptForAutocompleteMultiselect`, `AddressLookupService.listAddresses` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:173` |
1237
+ | `DepthCommand.map(…)` | 2 | `AddressDepthService.buildDownwardStacks`, `AddressDepthService.buildUpwardStacks` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:109` |
1238
+ | `DepthCommand.resolveAddresses` | 2 | `ConfigurationService.promptForAutocompleteMultiselect`, `AddressLookupService.listAddresses` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:147` |
1239
+ | `RenderLimitsService.map(…)` | 2 | `RenderLimitsService.renderRow`, `RenderLimitsService.renderProject` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/render-limits.service.ts:61` |
1240
+ | `readRefusalHeadline` | 1 | `isRefusedProjectConfiguration` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.constants.ts:58` |
1241
+ | `UnresolvedEntryPointAddressError.constructor` | 1 | `UnresolvedEntryPointAddressError.joinDescriptions` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.constants.ts:93` |
1242
+ | `UnresolvedEntryPointAddressError.joinDescriptions` | 1 | `UnresolvedEntryPointAddressError.map(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.constants.ts:107` |
1243
+ | `CallidescopeService.readMaximumDepth` | 1 | `CallidescopeService.reduce(…)` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.service.ts:285` |
1244
+ | `CallidescopeCommand.describeUnresolvedAddress` | 1 | `AddressService.describeCandidates` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:92` |
1245
+ | `CallidescopeCommand.map(…)` | 1 | `CallidescopeCommand.describeUnresolvedAddress` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:225` |
1246
+ | `CallidescopeCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:283` |
1247
+ | `CallidescopeCommand.parseDirectories` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:292` |
1248
+ | `CallidescopeCommand.parseEntryPointAddresses` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:301` |
1249
+ | `CallidescopeCommand.parseEntryPointDecorators` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:310` |
1250
+ | `CallidescopeCommand.parseExclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:319` |
1251
+ | `CallidescopeCommand.parseExcludeCallees` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:328` |
1252
+ | `CallidescopeCommand.parseFormat` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:343` |
1253
+ | `CallidescopeCommand.parseIncludeExportedFunctions` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:357` |
1254
+ | `CallidescopeCommand.parseIncludeOrphans` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:368` |
1255
+ | `CallidescopeCommand.parseIncludeTests` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:377` |
1256
+ | `CallidescopeCommand.parseJson` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:386` |
1257
+ | `CallidescopeCommand.parseMarkdown` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:396` |
1258
+ | `CallidescopeCommand.parseMaximumBreadth` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:412` |
1259
+ | `CallidescopeCommand.parseMaximumDepth` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:421` |
1260
+ | `CallidescopeCommand.parseMermaid` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/callidescope/callidescope.command.ts:430` |
1261
+ | `AddressLookupService.describeProblem` | 1 | `AddressService.describeCandidates` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:53` |
1262
+ | `AddressLookupService.listAddresses` | 1 | `AddressService.listAddresses` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:82` |
1263
+ | `AddressLookupService.resolve` | 1 | `AddressService.resolve` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/address-lookup/address-lookup.service.ts:112` |
1264
+ | `BreadthCommand.parseAddresses` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:194` |
1265
+ | `BreadthCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:204` |
1266
+ | `BreadthCommand.parseDirectories` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:213` |
1267
+ | `BreadthCommand.parseEntryPointAddresses` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:222` |
1268
+ | `BreadthCommand.parseEntryPointDecorators` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:231` |
1269
+ | `BreadthCommand.parseExclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:240` |
1270
+ | `BreadthCommand.parseExcludeCallees` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:249` |
1271
+ | `BreadthCommand.parseFormat` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:264` |
1272
+ | `BreadthCommand.parseIncludeExportedFunctions` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:278` |
1273
+ | `BreadthCommand.parseIncludeOrphans` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:289` |
1274
+ | `BreadthCommand.parseIncludeTests` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/breadth/breadth.command.ts:298` |
1275
+ | `DepthCommand.parseAddresses` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:168` |
1276
+ | `DepthCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:178` |
1277
+ | `DepthCommand.parseDirectories` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:187` |
1278
+ | `DepthCommand.parseEntryPointAddresses` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:196` |
1279
+ | `DepthCommand.parseEntryPointDecorators` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:205` |
1280
+ | `DepthCommand.parseExclude` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:214` |
1281
+ | `DepthCommand.parseExcludeCallees` | 1 | `ConfigurationService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:223` |
1282
+ | `DepthCommand.parseFormat` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:238` |
1283
+ | `DepthCommand.parseIncludeExportedFunctions` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:252` |
1284
+ | `DepthCommand.parseIncludeOrphans` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:263` |
1285
+ | `DepthCommand.parseIncludeTests` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/depth/depth.command.ts:272` |
1286
+ | `LimitsService.toProjectRows` | 1 | `LimitsService.toRow` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:88` |
1287
+ | `LimitsService.toWorkspaceRows` | 1 | `LimitsService.toRow` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:128` |
1288
+ | `LimitsService.flatMap(…)` | 1 | `LimitsService.toProjectRows` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.service.ts:187` |
1289
+ | `RenderLimitsService.render` | 1 | `RenderLimitsService.renderTable` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/render-limits.service.ts:75` |
1290
+ | `LimitsCommand.parseConfig` | 1 | `ConfigurationService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-cli/src/modules/limits/limits.command.ts:70` |
1291
+
1292
+ </details>
1293
+ <!-- callidescope:end -->
1294
+
1295
+ ## 🕸️ Codependix
1296
+
1297
+ 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`.
1298
+
1299
+ ### Nx Neighborhood
1300
+
1301
+ <!-- codependix:start name="codependix-nx-projects" -->
1302
+ ```mermaid
1303
+ graph LR
1304
+ callidescope_cli["callidescope-cli"]
1305
+ callidescope_configuration["callidescope-configuration"]
1306
+ callidescope_core["callidescope-core"]
1307
+ callidescope_examples["callidescope-examples"]
1308
+ callidescope_graph["callidescope-graph"]
1309
+ callidescope_nx["callidescope-nx"]
1310
+ callidescope_output["callidescope-output"]
1311
+ logger["logger"]
1312
+ callidescope_cli --> callidescope_configuration
1313
+ callidescope_cli --> callidescope_core
1314
+ callidescope_cli --> callidescope_graph
1315
+ callidescope_cli --> callidescope_output
1316
+ callidescope_cli --> logger
1317
+ callidescope_examples -.-> callidescope_cli
1318
+ callidescope_nx --> callidescope_cli
1319
+ classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
1320
+ class callidescope_cli subject
1321
+ ```
1322
+
1323
+ _Dashed edges are dependencies Nx inferred from configuration rather than from code._
1324
+ <!-- codependix:end name="codependix-nx-projects" -->
1325
+
1326
+ ### NestJS Module Graph
1327
+
1328
+ <!-- codependix:start name="codependix-nestjs-modules" -->
1329
+ ```mermaid
1330
+ flowchart LR
1331
+ AddressLookupModule
1332
+ AddressReportModule
1333
+ BreadthModule
1334
+ CallablesModule
1335
+ CallidescopeModule
1336
+ ClassesModule
1337
+ ConfigModule([ConfigModule])
1338
+ ConfigurationFileModule
1339
+ ConfigurationModule
1340
+ DepthModule
1341
+ DiscoveryModule
1342
+ DocumentationModule
1343
+ EdgesModule
1344
+ EntriesModule
1345
+ FlagResolutionModule
1346
+ GraphModule
1347
+ InputModule
1348
+ LimitsModule
1349
+ LoggerModule([LoggerModule])
1350
+ MainModule
1351
+ OutputJsonModule
1352
+ OutputMarkdownModule
1353
+ ProgramModule
1354
+ ProjectReportsModule
1355
+ ReportFindingsModule
1356
+ ReportModule
1357
+ RunPlanModule
1358
+ SignaturesModule
1359
+ WorkspaceModule
1360
+ WriteDestinationsModule
1361
+ AddressLookupModule --> CallablesModule
1362
+ AddressLookupModule --> CallidescopeModule
1363
+ AddressLookupModule --> ConfigurationModule
1364
+ AddressReportModule --> ReportModule
1365
+ BreadthModule --> AddressLookupModule
1366
+ BreadthModule --> AddressReportModule
1367
+ BreadthModule --> ConfigurationModule
1368
+ BreadthModule --> GraphModule
1369
+ CallablesModule --> ProgramModule
1370
+ CallablesModule --> WorkspaceModule
1371
+ CallidescopeModule --> CallablesModule
1372
+ CallidescopeModule --> ClassesModule
1373
+ CallidescopeModule --> ConfigurationModule
1374
+ CallidescopeModule --> EdgesModule
1375
+ CallidescopeModule --> EntriesModule
1376
+ CallidescopeModule --> GraphModule
1377
+ CallidescopeModule --> OutputJsonModule
1378
+ CallidescopeModule --> OutputMarkdownModule
1379
+ CallidescopeModule --> ProgramModule
1380
+ CallidescopeModule --> ProjectReportsModule
1381
+ CallidescopeModule --> ReportFindingsModule
1382
+ CallidescopeModule --> ReportModule
1383
+ CallidescopeModule --> WorkspaceModule
1384
+ CallidescopeModule --> WriteDestinationsModule
1385
+ ConfigurationModule --> ConfigurationFileModule
1386
+ ConfigurationModule --> InputModule
1387
+ ConfigurationModule --> RunPlanModule
1388
+ DepthModule --> AddressLookupModule
1389
+ DepthModule --> AddressReportModule
1390
+ DepthModule --> ConfigurationModule
1391
+ DepthModule --> GraphModule
1392
+ EdgesModule --> CallablesModule
1393
+ EdgesModule --> ClassesModule
1394
+ EdgesModule --> ProgramModule
1395
+ EdgesModule --> WorkspaceModule
1396
+ EntriesModule --> CallablesModule
1397
+ GraphModule --> DocumentationModule
1398
+ GraphModule --> EdgesModule
1399
+ GraphModule --> SignaturesModule
1400
+ LimitsModule --> ConfigurationModule
1401
+ LimitsModule --> WorkspaceModule
1402
+ MainModule --> BreadthModule
1403
+ MainModule --> CallidescopeModule
1404
+ MainModule --> ConfigurationModule
1405
+ MainModule --> DepthModule
1406
+ MainModule --> DiscoveryModule
1407
+ MainModule --> LimitsModule
1408
+ ProgramModule --> WorkspaceModule
1409
+ ProjectReportsModule --> GraphModule
1410
+ ProjectReportsModule --> SignaturesModule
1411
+ RunPlanModule --> FlagResolutionModule
1412
+ WriteDestinationsModule --> OutputJsonModule
1413
+ WriteDestinationsModule --> OutputMarkdownModule
1414
+ WriteDestinationsModule --> ReportModule
1415
+ ```
1416
+
1417
+ _Rounded modules are global: every module can inject them, so their edges are left out._
1418
+ <!-- codependix:end name="codependix-nestjs-modules" -->
1419
+
1420
+ ### File Imports
1421
+
1422
+ <!-- codependix:start name="codependix-file-imports" -->
1423
+ ```mermaid
1424
+ graph LR
1425
+ file_callidescope_config_ts["callidescope.config.ts"]
1426
+ file_codependix_config_ts["codependix.config.ts"]
1427
+ file_codometer_config_ts["codometer.config.ts"]
1428
+ file_eslint_config_ts["eslint.config.ts"]
1429
+ file_src_constants_ts["src/constants.ts"]
1430
+ file_src_index_ts["src/index.ts"]
1431
+ file_src_main_end_to_end_test_ts["src/main.end-to-end.test.ts"]
1432
+ file_src_main_module_ts["src/main.module.ts"]
1433
+ file_src_main_ts["src/main.ts"]
1434
+ file_src_modules_address_lookup_address_lookup_constants_ts["src/modules/address-lookup/address-lookup.constants.ts"]
1435
+ file_src_modules_address_lookup_address_lookup_constants_unit_test_ts["src/modules/address-lookup/address-lookup.constants.unit.test.ts"]
1436
+ file_src_modules_address_lookup_address_lookup_module_ts["src/modules/address-lookup/address-lookup.module.ts"]
1437
+ file_src_modules_address_lookup_address_lookup_service_ts["src/modules/address-lookup/address-lookup.service.ts"]
1438
+ file_src_modules_address_lookup_address_lookup_service_unit_test_ts["src/modules/address-lookup/address-lookup.service.unit.test.ts"]
1439
+ file_src_modules_address_lookup_address_lookup_types_ts["src/modules/address-lookup/address-lookup.types.ts"]
1440
+ file_src_modules_breadth_breadth_command_ts["src/modules/breadth/breadth.command.ts"]
1441
+ file_src_modules_breadth_breadth_command_unit_test_ts["src/modules/breadth/breadth.command.unit.test.ts"]
1442
+ file_src_modules_breadth_breadth_constants_ts["src/modules/breadth/breadth.constants.ts"]
1443
+ file_src_modules_breadth_breadth_module_ts["src/modules/breadth/breadth.module.ts"]
1444
+ file_src_modules_breadth_breadth_types_ts["src/modules/breadth/breadth.types.ts"]
1445
+ file_src_modules_callidescope_callidescope_command_ts["src/modules/callidescope/callidescope.command.ts"]
1446
+ file_src_modules_callidescope_callidescope_command_unit_test_ts["src/modules/callidescope/callidescope.command.unit.test.ts"]
1447
+ file_src_modules_callidescope_callidescope_constants_ts["src/modules/callidescope/callidescope.constants.ts"]
1448
+ file_src_modules_callidescope_callidescope_module_ts["src/modules/callidescope/callidescope.module.ts"]
1449
+ file_src_modules_callidescope_callidescope_service_integration_test_ts["src/modules/callidescope/callidescope.service.integration.test.ts"]
1450
+ file_src_modules_callidescope_callidescope_service_ts["src/modules/callidescope/callidescope.service.ts"]
1451
+ file_src_modules_callidescope_callidescope_service_unit_test_ts["src/modules/callidescope/callidescope.service.unit.test.ts"]
1452
+ file_src_modules_callidescope_callidescope_types_ts["src/modules/callidescope/callidescope.types.ts"]
1453
+ file_src_modules_depth_depth_command_ts["src/modules/depth/depth.command.ts"]
1454
+ file_src_modules_depth_depth_command_unit_test_ts["src/modules/depth/depth.command.unit.test.ts"]
1455
+ file_src_modules_depth_depth_constants_ts["src/modules/depth/depth.constants.ts"]
1456
+ file_src_modules_depth_depth_module_ts["src/modules/depth/depth.module.ts"]
1457
+ file_src_modules_depth_depth_types_ts["src/modules/depth/depth.types.ts"]
1458
+ file_src_modules_limits_limits_command_ts["src/modules/limits/limits.command.ts"]
1459
+ file_src_modules_limits_limits_command_unit_test_ts["src/modules/limits/limits.command.unit.test.ts"]
1460
+ file_src_modules_limits_limits_constants_ts["src/modules/limits/limits.constants.ts"]
1461
+ file_src_modules_limits_limits_module_ts["src/modules/limits/limits.module.ts"]
1462
+ file_src_modules_limits_limits_service_ts["src/modules/limits/limits.service.ts"]
1463
+ file_src_modules_limits_limits_service_unit_test_ts["src/modules/limits/limits.service.unit.test.ts"]
1464
+ file_src_modules_limits_limits_types_ts["src/modules/limits/limits.types.ts"]
1465
+ file_src_modules_limits_render_limits_service_ts["src/modules/limits/render-limits.service.ts"]
1466
+ file_src_modules_limits_render_limits_service_unit_test_ts["src/modules/limits/render-limits.service.unit.test.ts"]
1467
+ file_src_repl_ts["src/repl.ts"]
1468
+ file_src_repl_unit_test_ts["src/repl.unit.test.ts"]
1469
+ file_testing_mocks_ts["testing/mocks.ts"]
1470
+ file_testing_modules_ts["testing/modules.ts"]
1471
+ file_testing_programs_ts["testing/programs.ts"]
1472
+ file_testing_setup_ts["testing/setup.ts"]
1473
+ file_vite_config_ts["vite.config.ts"]
1474
+ file_vitest_config_ts["vitest.config.ts"]
1475
+ file_src_main_end_to_end_test_ts --> file_src_constants_ts
1476
+ file_src_main_module_ts --> file_src_constants_ts
1477
+ file_src_main_module_ts --> file_src_modules_breadth_breadth_module_ts
1478
+ file_src_main_module_ts --> file_src_modules_callidescope_callidescope_module_ts
1479
+ file_src_main_module_ts --> file_src_modules_depth_depth_module_ts
1480
+ file_src_main_module_ts --> file_src_modules_limits_limits_module_ts
1481
+ file_src_main_ts --> file_src_main_module_ts
1482
+ file_src_modules_address_lookup_address_lookup_constants_unit_test_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1483
+ file_src_modules_address_lookup_address_lookup_module_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1484
+ file_src_modules_address_lookup_address_lookup_module_ts --> file_src_modules_callidescope_callidescope_module_ts
1485
+ file_src_modules_address_lookup_address_lookup_service_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1486
+ file_src_modules_address_lookup_address_lookup_service_ts --> file_src_modules_address_lookup_address_lookup_types_ts
1487
+ file_src_modules_address_lookup_address_lookup_service_ts --> file_src_modules_callidescope_callidescope_service_ts
1488
+ file_src_modules_address_lookup_address_lookup_service_unit_test_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1489
+ file_src_modules_address_lookup_address_lookup_service_unit_test_ts --> file_src_modules_callidescope_callidescope_service_ts
1490
+ file_src_modules_address_lookup_address_lookup_service_unit_test_ts --> file_src_modules_callidescope_callidescope_types_ts
1491
+ file_src_modules_address_lookup_address_lookup_types_ts --> file_src_modules_callidescope_callidescope_types_ts
1492
+ file_src_modules_breadth_breadth_command_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1493
+ file_src_modules_breadth_breadth_command_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1494
+ file_src_modules_breadth_breadth_command_ts --> file_src_modules_address_lookup_address_lookup_types_ts
1495
+ file_src_modules_breadth_breadth_command_ts --> file_src_modules_callidescope_callidescope_constants_ts
1496
+ file_src_modules_breadth_breadth_command_unit_test_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1497
+ file_src_modules_breadth_breadth_command_unit_test_ts --> file_src_modules_address_lookup_address_lookup_types_ts
1498
+ file_src_modules_breadth_breadth_command_unit_test_ts --> file_src_modules_breadth_breadth_command_ts
1499
+ file_src_modules_breadth_breadth_command_unit_test_ts --> file_testing_mocks_ts
1500
+ file_src_modules_breadth_breadth_module_ts --> file_src_modules_address_lookup_address_lookup_module_ts
1501
+ file_src_modules_breadth_breadth_module_ts --> file_src_modules_breadth_breadth_command_ts
1502
+ file_src_modules_callidescope_callidescope_command_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1503
+ file_src_modules_callidescope_callidescope_command_ts --> file_src_modules_callidescope_callidescope_constants_ts
1504
+ file_src_modules_callidescope_callidescope_command_ts --> file_src_modules_callidescope_callidescope_service_ts
1505
+ file_src_modules_callidescope_callidescope_command_unit_test_ts --> file_src_modules_callidescope_callidescope_command_ts
1506
+ file_src_modules_callidescope_callidescope_command_unit_test_ts --> file_src_modules_callidescope_callidescope_constants_ts
1507
+ file_src_modules_callidescope_callidescope_command_unit_test_ts --> file_src_modules_callidescope_callidescope_service_ts
1508
+ file_src_modules_callidescope_callidescope_command_unit_test_ts --> file_testing_mocks_ts
1509
+ file_src_modules_callidescope_callidescope_constants_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1510
+ file_src_modules_callidescope_callidescope_module_ts --> file_src_modules_callidescope_callidescope_command_ts
1511
+ file_src_modules_callidescope_callidescope_module_ts --> file_src_modules_callidescope_callidescope_service_ts
1512
+ file_src_modules_callidescope_callidescope_service_integration_test_ts --> file_src_modules_callidescope_callidescope_service_ts
1513
+ file_src_modules_callidescope_callidescope_service_integration_test_ts --> file_testing_modules_ts
1514
+ file_src_modules_callidescope_callidescope_service_ts --> file_src_modules_callidescope_callidescope_constants_ts
1515
+ file_src_modules_callidescope_callidescope_service_ts --> file_src_modules_callidescope_callidescope_types_ts
1516
+ file_src_modules_callidescope_callidescope_service_unit_test_ts --> file_src_modules_callidescope_callidescope_service_ts
1517
+ file_src_modules_callidescope_callidescope_service_unit_test_ts --> file_testing_modules_ts
1518
+ file_src_modules_callidescope_callidescope_service_unit_test_ts --> file_testing_programs_ts
1519
+ file_src_modules_depth_depth_command_ts --> file_src_modules_address_lookup_address_lookup_constants_ts
1520
+ file_src_modules_depth_depth_command_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1521
+ file_src_modules_depth_depth_command_ts --> file_src_modules_address_lookup_address_lookup_types_ts
1522
+ file_src_modules_depth_depth_command_ts --> file_src_modules_callidescope_callidescope_constants_ts
1523
+ file_src_modules_depth_depth_command_unit_test_ts --> file_src_modules_address_lookup_address_lookup_service_ts
1524
+ file_src_modules_depth_depth_command_unit_test_ts --> file_src_modules_address_lookup_address_lookup_types_ts
1525
+ file_src_modules_depth_depth_command_unit_test_ts --> file_src_modules_callidescope_callidescope_types_ts
1526
+ file_src_modules_depth_depth_command_unit_test_ts --> file_src_modules_depth_depth_command_ts
1527
+ file_src_modules_depth_depth_module_ts --> file_src_modules_address_lookup_address_lookup_module_ts
1528
+ file_src_modules_depth_depth_module_ts --> file_src_modules_depth_depth_command_ts
1529
+ file_src_modules_limits_limits_command_ts --> file_src_modules_callidescope_callidescope_constants_ts
1530
+ file_src_modules_limits_limits_command_ts --> file_src_modules_limits_limits_service_ts
1531
+ file_src_modules_limits_limits_command_ts --> file_src_modules_limits_limits_types_ts
1532
+ file_src_modules_limits_limits_command_ts --> file_src_modules_limits_render_limits_service_ts
1533
+ file_src_modules_limits_limits_command_unit_test_ts --> file_src_modules_limits_limits_command_ts
1534
+ file_src_modules_limits_limits_command_unit_test_ts --> file_src_modules_limits_limits_service_ts
1535
+ file_src_modules_limits_limits_command_unit_test_ts --> file_src_modules_limits_render_limits_service_ts
1536
+ file_src_modules_limits_limits_module_ts --> file_src_modules_limits_limits_command_ts
1537
+ file_src_modules_limits_limits_module_ts --> file_src_modules_limits_limits_service_ts
1538
+ file_src_modules_limits_limits_module_ts --> file_src_modules_limits_render_limits_service_ts
1539
+ file_src_modules_limits_limits_service_ts --> file_src_modules_limits_limits_types_ts
1540
+ file_src_modules_limits_limits_service_unit_test_ts --> file_src_modules_limits_limits_service_ts
1541
+ file_src_modules_limits_render_limits_service_ts --> file_src_modules_limits_limits_constants_ts
1542
+ file_src_modules_limits_render_limits_service_ts --> file_src_modules_limits_limits_types_ts
1543
+ file_src_modules_limits_render_limits_service_unit_test_ts --> file_src_modules_limits_limits_types_ts
1544
+ file_src_modules_limits_render_limits_service_unit_test_ts --> file_src_modules_limits_render_limits_service_ts
1545
+ file_src_repl_ts --> file_src_main_module_ts
1546
+ ```
1547
+ <!-- codependix:end name="codependix-file-imports" -->
1548
+
1549
+ <!-- codometer:start -->
1550
+
1551
+ ## ⏲️ Codometer
1552
+
1553
+ ### Project
1554
+
1555
+ ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-8844-22c55e?style=flat-square)
1556
+ ![Repository Size](https://img.shields.io/badge/Repository_Size-303.60_kB-6b7280?style=flat-square)
1557
+ ![Folders](https://img.shields.io/badge/Folders-8-4a4a4a?style=flat-square)
1558
+ ![Source Files](https://img.shields.io/badge/Source_Files-50-3178c6?style=flat-square)
1559
+
1560
+ ### Measured Targets
1561
+
1562
+ ![Compiled JavaScript Size](https://img.shields.io/badge/Compiled_JavaScript_Size-9.59_kB_gzip-6b7280?style=flat-square)
1563
+
1564
+ ### TypeScript
1565
+
1566
+ ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-50-3178c6?style=flat-square)
1567
+ ![Interfaces](https://img.shields.io/badge/Interfaces-11-0ea5e9?style=flat-square)
1568
+ ![Generic Declarations](https://img.shields.io/badge/Generic_Declarations-0-0369a1?style=flat-square)
1569
+ ![Enums](https://img.shields.io/badge/Enums-0-f97316?style=flat-square)
1570
+ ![Decorators](https://img.shields.io/badge/Decorators-58-db2777?style=flat-square)
1571
+ ![Doc Comments](https://img.shields.io/badge/Doc_Comments-196-6366f1?style=flat-square)
1572
+ ![Static Methods](https://img.shields.io/badge/Static_Methods-1-166534?style=flat-square)
1573
+
1574
+ ### JavaScript
1575
+
1576
+ ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-0-f7df1e?style=flat-square)
1577
+ ![Test Files](https://img.shields.io/badge/Test_Files-12-10b981?style=flat-square)
1578
+ ![External Packages](https://img.shields.io/badge/External_Packages-20-8b5cf6?style=flat-square)
1579
+ ![Classes](https://img.shields.io/badge/Classes-15-7c3aed?style=flat-square)
1580
+ ![Functions](https://img.shields.io/badge/Functions-362-16a34a?style=flat-square)
1581
+ ![Methods](https://img.shields.io/badge/Methods-98-15803d?style=flat-square)
1582
+ ![Sync Functions](https://img.shields.io/badge/Sync_Functions-284-4ade80?style=flat-square)
1583
+ ![Async Functions](https://img.shields.io/badge/Async_Functions-176-059669?style=flat-square)
1584
+ ![Constants](https://img.shields.io/badge/Constants-272-dc2626?style=flat-square)
1585
+ ![Imports](https://img.shields.io/badge/Imports-269-0284c7?style=flat-square)
1586
+ ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-58-ea580c?style=flat-square)
1587
+ ![Comments](https://img.shields.io/badge/Comments-482-64748b?style=flat-square)
1588
+ ![Comment Lines](https://img.shields.io/badge/Comment_Lines-1017-475569?style=flat-square)
1589
+ ![TODO Comments](https://img.shields.io/badge/TODO_Comments-0-ca8a04?style=flat-square)
1590
+
1591
+ ### Python
1592
+
1593
+ ![Python Files](https://img.shields.io/badge/Python_Files-0-3776ab?style=flat-square)
1594
+ ![Python Lines](https://img.shields.io/badge/Python_Lines-0-4b8bbe?style=flat-square)
1595
+ ![Python Classes](https://img.shields.io/badge/Python_Classes-0-7c3aed?style=flat-square)
1596
+ ![Python Functions](https://img.shields.io/badge/Python_Functions-0-16a34a?style=flat-square)
1597
+ ![Python Protocols](https://img.shields.io/badge/Python_Protocols-0-0ea5e9?style=flat-square)
1598
+ ![Python Constants](https://img.shields.io/badge/Python_Constants-0-dc2626?style=flat-square)
1599
+ ![Python Imports](https://img.shields.io/badge/Python_Imports-0-0284c7?style=flat-square)
1600
+ ![Python Decorators](https://img.shields.io/badge/Python_Decorators-0-db2777?style=flat-square)
1601
+ ![Docstrings](https://img.shields.io/badge/Docstrings-0-6366f1?style=flat-square)
1602
+ ![Docstring Lines](https://img.shields.io/badge/Docstring_Lines-0-818cf8?style=flat-square)
1603
+ ![Python Comments](https://img.shields.io/badge/Python_Comments-0-64748b?style=flat-square)
1604
+ ![Python Comment Lines](https://img.shields.io/badge/Python_Comment_Lines-0-475569?style=flat-square)
1605
+
1606
+ ### JSON
1607
+
1608
+ ![JSON Files](https://img.shields.io/badge/JSON_Files-4-a16207?style=flat-square)
1609
+ ![JSON Lines](https://img.shields.io/badge/JSON_Lines-196-ca8a04?style=flat-square)
1610
+ ![JSON Objects](https://img.shields.io/badge/JSON_Objects-44-7c3aed?style=flat-square)
1611
+ ![JSON Arrays](https://img.shields.io/badge/JSON_Arrays-13-8b5cf6?style=flat-square)
1612
+ ![JSON Properties](https://img.shields.io/badge/JSON_Properties-126-0284c7?style=flat-square)
1613
+ ![JSON Strings](https://img.shields.io/badge/JSON_Strings-108-16a34a?style=flat-square)
1614
+ ![JSON Numbers](https://img.shields.io/badge/JSON_Numbers-1-059669?style=flat-square)
1615
+ ![JSON Booleans](https://img.shields.io/badge/JSON_Booleans-8-0ea5e9?style=flat-square)
1616
+ ![JSON Nulls](https://img.shields.io/badge/JSON_Nulls-0-64748b?style=flat-square)
1617
+ ![JSON Items](https://img.shields.io/badge/JSON_Items-44-475569?style=flat-square)
1618
+ ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-174-dc2626?style=flat-square)
1619
+ ![JSON Max Depth](https://img.shields.io/badge/JSON_Max_Depth-6-ea580c?style=flat-square)
1620
+
1621
+ ### YAML
1622
+
1623
+ ![YAML Files](https://img.shields.io/badge/YAML_Files-0-cb171e?style=flat-square)
1624
+ ![YAML Lines](https://img.shields.io/badge/YAML_Lines-0-e34c26?style=flat-square)
1625
+ ![YAML Documents](https://img.shields.io/badge/YAML_Documents-0-f97316?style=flat-square)
1626
+ ![YAML Mappings](https://img.shields.io/badge/YAML_Mappings-0-7c3aed?style=flat-square)
1627
+ ![YAML Sequences](https://img.shields.io/badge/YAML_Sequences-0-8b5cf6?style=flat-square)
1628
+ ![YAML Keys](https://img.shields.io/badge/YAML_Keys-0-0284c7?style=flat-square)
1629
+ ![YAML Scalars](https://img.shields.io/badge/YAML_Scalars-0-16a34a?style=flat-square)
1630
+ ![YAML Anchors](https://img.shields.io/badge/YAML_Anchors-0-059669?style=flat-square)
1631
+ ![YAML Aliases](https://img.shields.io/badge/YAML_Aliases-0-10b981?style=flat-square)
1632
+ ![YAML Comments](https://img.shields.io/badge/YAML_Comments-0-64748b?style=flat-square)
1633
+ ![YAML Max Depth](https://img.shields.io/badge/YAML_Max_Depth-0-ea580c?style=flat-square)
1634
+
1635
+ ### TOML
1636
+
1637
+ ![TOML Files](https://img.shields.io/badge/TOML_Files-0-9c4221?style=flat-square)
1638
+ ![TOML Lines](https://img.shields.io/badge/TOML_Lines-0-b45309?style=flat-square)
1639
+ ![TOML Tables](https://img.shields.io/badge/TOML_Tables-0-7c3aed?style=flat-square)
1640
+ ![TOML Array Tables](https://img.shields.io/badge/TOML_Array_Tables-0-8b5cf6?style=flat-square)
1641
+ ![TOML Keys](https://img.shields.io/badge/TOML_Keys-0-0284c7?style=flat-square)
1642
+ ![TOML Arrays](https://img.shields.io/badge/TOML_Arrays-0-16a34a?style=flat-square)
1643
+ ![TOML Comments](https://img.shields.io/badge/TOML_Comments-0-64748b?style=flat-square)
1644
+
1645
+ ### Shell
1646
+
1647
+ ![Shell Files](https://img.shields.io/badge/Shell_Files-0-89e051?style=flat-square)
1648
+ ![Shell Lines](https://img.shields.io/badge/Shell_Lines-0-4eaa25?style=flat-square)
1649
+ ![Shell Functions](https://img.shields.io/badge/Shell_Functions-0-16a34a?style=flat-square)
1650
+ ![Shell Variables](https://img.shields.io/badge/Shell_Variables-0-0284c7?style=flat-square)
1651
+ ![Shell Exports](https://img.shields.io/badge/Shell_Exports-0-ea580c?style=flat-square)
1652
+ ![Shell Conditionals](https://img.shields.io/badge/Shell_Conditionals-0-7c3aed?style=flat-square)
1653
+ ![Shell Loops](https://img.shields.io/badge/Shell_Loops-0-8b5cf6?style=flat-square)
1654
+ ![Shell Pipelines](https://img.shields.io/badge/Shell_Pipelines-0-059669?style=flat-square)
1655
+ ![Shebangs](https://img.shields.io/badge/Shebangs-0-6b7280?style=flat-square)
1656
+ ![Shell Comments](https://img.shields.io/badge/Shell_Comments-0-64748b?style=flat-square)
1657
+ ![Shell Comment Lines](https://img.shields.io/badge/Shell_Comment_Lines-0-475569?style=flat-square)
1658
+
1659
+ ### SQL
1660
+
1661
+ ![SQL Files](https://img.shields.io/badge/SQL_Files-0-e38c00?style=flat-square)
1662
+ ![SQL Lines](https://img.shields.io/badge/SQL_Lines-0-f29111?style=flat-square)
1663
+ ![SQL Statements](https://img.shields.io/badge/SQL_Statements-0-7c3aed?style=flat-square)
1664
+ ![SQL Selects](https://img.shields.io/badge/SQL_Selects-0-16a34a?style=flat-square)
1665
+ ![SQL Inserts](https://img.shields.io/badge/SQL_Inserts-0-22c55e?style=flat-square)
1666
+ ![SQL Updates](https://img.shields.io/badge/SQL_Updates-0-0ea5e9?style=flat-square)
1667
+ ![SQL Deletes](https://img.shields.io/badge/SQL_Deletes-0-dc2626?style=flat-square)
1668
+ ![SQL Creates](https://img.shields.io/badge/SQL_Creates-0-0284c7?style=flat-square)
1669
+ ![SQL Joins](https://img.shields.io/badge/SQL_Joins-0-8b5cf6?style=flat-square)
1670
+ ![SQL CTEs](https://img.shields.io/badge/SQL_CTEs-0-059669?style=flat-square)
1671
+ ![SQL Comments](https://img.shields.io/badge/SQL_Comments-0-64748b?style=flat-square)
1672
+
1673
+ ### HCL
1674
+
1675
+ ![HCL Files](https://img.shields.io/badge/HCL_Files-0-844fba?style=flat-square)
1676
+ ![HCL Lines](https://img.shields.io/badge/HCL_Lines-0-a78bfa?style=flat-square)
1677
+ ![HCL Blocks](https://img.shields.io/badge/HCL_Blocks-0-7c3aed?style=flat-square)
1678
+ ![HCL Resources](https://img.shields.io/badge/HCL_Resources-0-0284c7?style=flat-square)
1679
+ ![HCL Variables](https://img.shields.io/badge/HCL_Variables-0-16a34a?style=flat-square)
1680
+ ![HCL Outputs](https://img.shields.io/badge/HCL_Outputs-0-059669?style=flat-square)
1681
+ ![HCL Attributes](https://img.shields.io/badge/HCL_Attributes-0-0ea5e9?style=flat-square)
1682
+ ![HCL Interpolations](https://img.shields.io/badge/HCL_Interpolations-0-db2777?style=flat-square)
1683
+ ![HCL Comments](https://img.shields.io/badge/HCL_Comments-0-64748b?style=flat-square)
1684
+
1685
+ ### CSS
1686
+
1687
+ ![CSS Files](https://img.shields.io/badge/CSS_Files-0-264de4?style=flat-square)
1688
+ ![CSS Lines](https://img.shields.io/badge/CSS_Lines-0-2965f1?style=flat-square)
1689
+ ![CSS Rules](https://img.shields.io/badge/CSS_Rules-0-7c3aed?style=flat-square)
1690
+ ![CSS Selectors](https://img.shields.io/badge/CSS_Selectors-0-8b5cf6?style=flat-square)
1691
+ ![CSS Declarations](https://img.shields.io/badge/CSS_Declarations-0-0284c7?style=flat-square)
1692
+ ![CSS At Rules](https://img.shields.io/badge/CSS_At_Rules-0-f97316?style=flat-square)
1693
+ ![CSS Media Queries](https://img.shields.io/badge/CSS_Media_Queries-0-ea580c?style=flat-square)
1694
+ ![CSS Custom Properties](https://img.shields.io/badge/CSS_Custom_Properties-0-16a34a?style=flat-square)
1695
+ ![CSS Comments](https://img.shields.io/badge/CSS_Comments-0-64748b?style=flat-square)
1696
+
1697
+ ### Conventions
1698
+
1699
+ ![Module Files](https://img.shields.io/badge/Module_Files-6-7c3aed?style=flat-square)
1700
+ ![Service Files](https://img.shields.io/badge/Service_Files-4-0284c7?style=flat-square)
1701
+ ![Command Files](https://img.shields.io/badge/Command_Files-4-16a34a?style=flat-square)
1702
+ ![Constants Files](https://img.shields.io/badge/Constants_Files-5-ea580c?style=flat-square)
1703
+ ![Types Files](https://img.shields.io/badge/Types_Files-5-db2777?style=flat-square)
1704
+ ![Utilities Files](https://img.shields.io/badge/Utilities_Files-0-0ea5e9?style=flat-square)
1705
+ ![TypeORM Entities](https://img.shields.io/badge/TypeORM_Entities-0-059669?style=flat-square)
1706
+ ![Unit Tests](https://img.shields.io/badge/Unit_Tests-10-ca8a04?style=flat-square)
1707
+ ![Integration Tests](https://img.shields.io/badge/Integration_Tests-1-7c3aed?style=flat-square)
1708
+ ![End To End Tests](https://img.shields.io/badge/End_To_End_Tests-1-0284c7?style=flat-square)
1709
+ ![CSS Comment Budget](https://img.shields.io/badge/CSS_Comment_Budget-0-16a34a?style=flat-square)
1710
+ ![HCL Comment Budget](https://img.shields.io/badge/HCL_Comment_Budget-0-ea580c?style=flat-square)
1711
+ ![Python Comment Budget](https://img.shields.io/badge/Python_Comment_Budget-0-db2777?style=flat-square)
1712
+ ![SQL Comment Budget](https://img.shields.io/badge/SQL_Comment_Budget-0-0ea5e9?style=flat-square)
1713
+ ![TOML Comment Budget](https://img.shields.io/badge/TOML_Comment_Budget-0-059669?style=flat-square)
1714
+ ![TypeScript Comment Budget](https://img.shields.io/badge/TypeScript_Comment_Budget-0-ca8a04?style=flat-square)
1715
+ ![YAML Comment Budget](https://img.shields.io/badge/YAML_Comment_Budget-0-7c3aed?style=flat-square)
1716
+ ![Shell Comment Budget](https://img.shields.io/badge/Shell_Comment_Budget-0-0284c7?style=flat-square)
1717
+
1718
+ ### Jupyter
1719
+
1720
+ ![Notebooks](https://img.shields.io/badge/Notebooks-0-f37626?style=flat-square)
1721
+ ![Notebook Cells](https://img.shields.io/badge/Notebook_Cells-0-e8a33d?style=flat-square)
1722
+ ![Code Cells](https://img.shields.io/badge/Code_Cells-0-3776ab?style=flat-square)
1723
+ ![Markdown Cells](https://img.shields.io/badge/Markdown_Cells-0-083fa1?style=flat-square)
1724
+ ![Raw Cells](https://img.shields.io/badge/Raw_Cells-0-9ca3af?style=flat-square)
1725
+ ![Executed Cells](https://img.shields.io/badge/Executed_Cells-0-16a34a?style=flat-square)
1726
+ ![Cell Outputs](https://img.shields.io/badge/Cell_Outputs-0-059669?style=flat-square)
1727
+ ![Notebook Code Lines](https://img.shields.io/badge/Notebook_Code_Lines-0-4b8bbe?style=flat-square)
1728
+ ![Notebook Classes](https://img.shields.io/badge/Notebook_Classes-0-7c3aed?style=flat-square)
1729
+ ![Notebook Functions](https://img.shields.io/badge/Notebook_Functions-0-22c55e?style=flat-square)
1730
+ ![Notebook Imports](https://img.shields.io/badge/Notebook_Imports-0-0284c7?style=flat-square)
1731
+ ![Notebook Decorators](https://img.shields.io/badge/Notebook_Decorators-0-db2777?style=flat-square)
1732
+ ![Notebook Prose Lines](https://img.shields.io/badge/Notebook_Prose_Lines-0-1f6feb?style=flat-square)
1733
+ ![Notebook Headings](https://img.shields.io/badge/Notebook_Headings-0-a78bfa?style=flat-square)
1734
+ ![Notebook Links](https://img.shields.io/badge/Notebook_Links-0-10b981?style=flat-square)
1735
+ ![Notebook Images](https://img.shields.io/badge/Notebook_Images-0-34d399?style=flat-square)
1736
+ ![Notebook Code Blocks](https://img.shields.io/badge/Notebook_Code_Blocks-0-dc2626?style=flat-square)
1737
+ ![Notebook Properties](https://img.shields.io/badge/Notebook_Properties-0-ca8a04?style=flat-square)
1738
+ ![Notebook Nodes](https://img.shields.io/badge/Notebook_Nodes-0-a16207?style=flat-square)
1739
+ ![Notebook Max Depth](https://img.shields.io/badge/Notebook_Max_Depth-0-ea580c?style=flat-square)
1740
+
1741
+ ### Markdown
1742
+
1743
+ ![Markdown Files](https://img.shields.io/badge/Markdown_Files-1-083fa1?style=flat-square)
1744
+ ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-251-1f6feb?style=flat-square)
1745
+ ![H1](https://img.shields.io/badge/H1-1-7c3aed?style=flat-square)
1746
+ ![H2](https://img.shields.io/badge/H2-7-8b5cf6?style=flat-square)
1747
+ ![H3](https://img.shields.io/badge/H3-14-a78bfa?style=flat-square)
1748
+ ![H4](https://img.shields.io/badge/H4-0-c4b5fd?style=flat-square)
1749
+ ![H5](https://img.shields.io/badge/H5-0-ddd6fe?style=flat-square)
1750
+ ![H6](https://img.shields.io/badge/H6-0-ede9fe?style=flat-square)
1751
+ ![Paragraphs](https://img.shields.io/badge/Paragraphs-50-64748b?style=flat-square)
1752
+ ![Lists](https://img.shields.io/badge/Lists-6-16a34a?style=flat-square)
1753
+ ![List Items](https://img.shields.io/badge/List_Items-28-22c55e?style=flat-square)
1754
+ ![Task List Items](https://img.shields.io/badge/Task_List_Items-0-4ade80?style=flat-square)
1755
+ ![Tables](https://img.shields.io/badge/Tables-2-0284c7?style=flat-square)
1756
+ ![Table Rows](https://img.shields.io/badge/Table_Rows-10-0ea5e9?style=flat-square)
1757
+ ![Links](https://img.shields.io/badge/Links-9-059669?style=flat-square)
1758
+ ![Images](https://img.shields.io/badge/Images-0-10b981?style=flat-square)
1759
+ ![Code Blocks](https://img.shields.io/badge/Code_Blocks-13-dc2626?style=flat-square)
1760
+ ![Inline Code](https://img.shields.io/badge/Inline_Code-80-ef4444?style=flat-square)
1761
+ ![Block Quotes](https://img.shields.io/badge/Block_Quotes-0-ca8a04?style=flat-square)
1762
+ ![Thematic Breaks](https://img.shields.io/badge/Thematic_Breaks-0-a16207?style=flat-square)
1763
+ <!-- codometer:end -->