@callidescope/configuration 0.0.0-stage → 0.0.4

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 CHANGED
@@ -1,3 +1,1069 @@
1
- # Temporary Holding Version
1
+ # 🔭 Callidescope Configuration
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Reads `callidescope.config.ts` and resolves the limits callidescope enforces.**
4
+
5
+ This package is the configuration reader for
6
+ [`@callidescope/cli`](../callidescope-cli/README.md). It finds a configuration
7
+ file, validates it, and fills in every field the file left out, so that no
8
+ analyzer has to know which options are optional.
9
+
10
+ It knows nothing about call graphs. What a threshold means, and which decorator
11
+ marks a stack root, live in the CLI. This package only answers "what did the repository ask for".
12
+
13
+ ```bash
14
+ npm install --save-dev @callidescope/configuration
15
+ ```
16
+
17
+ ## Configuration File
18
+
19
+ Any of `callidescope.config.{ts,mts,cts,js,mjs,cjs,json,jsonc}`, searched for
20
+ upward from the working directory. TypeScript is tried first, because that is
21
+ the form that gets type checking. A repository with no configuration file is
22
+ traced with the defaults rather than told to write one.
23
+
24
+ ```ts
25
+ import { type CallidescopeConfiguration } from "@callidescope/configuration";
26
+
27
+ const callidescopeConfiguration: CallidescopeConfiguration = {
28
+ excludeFrom: ["configuration/.callidescopeignore"],
29
+ limits: { maximumBreadth: 5, maximumDepth: 6 },
30
+ };
31
+
32
+ export default callidescopeConfiguration;
33
+ ```
34
+
35
+ That file is the **workspace** configuration, and every section below describes
36
+ it. A project may also configure itself, from a much smaller surface —
37
+ see [Project Configuration](#project-configuration).
38
+
39
+ ## Limits
40
+
41
+ There are two, both per project, both gated. A limit the schema does not name is
42
+ refused rather than ignored, so a number nothing reads cannot sit in a file
43
+ looking as though it were in force.
44
+
45
+ | Limit | Default | Meaning |
46
+ | ----- | ------- | ------- |
47
+ | `maximumDepth` | `6` | Frames a call stack may hold, entry point inclusive |
48
+ | `maximumBreadth` | **none** | Callables one callable may call directly |
49
+
50
+ `maximumBreadth` is the one limit with no default — a project that wants it
51
+ gated has to declare its own measured number, since a workspace-wide guess
52
+ would either gate nothing or fail on the first callable that happens to be
53
+ widest. Every traced project now does: see
54
+ [Project Configuration](#project-configuration).
55
+
56
+ The **implementation-candidate cap** is deliberately not here. It decides where
57
+ structural interface resolution stops guessing rather than what a run judges, so
58
+ it is a constant in [`@callidescope/graph`](../callidescope-graph/README.md)
59
+ instead — see [the decision record](../../../../docs/adr/0006-narrow-callidescope-to-depth-and-breadth.md).
60
+
61
+ ## Entry Points
62
+
63
+ A depth measurement is only as meaningful as its roots, so which callables count
64
+ as roots is configurable.
65
+
66
+ | Option | Default | Meaning |
67
+ | ------ | ------- | ------- |
68
+ | `addresses` | none | Callables named outright as roots, each `<file>#<qualified-name>` |
69
+ | `decorators` | 13 framework decorators | Decorators whose methods a framework invokes |
70
+ | `includeExportedFunctions` | `true` | Treat every `src/index.ts` export as a root |
71
+ | `includeOrphans` | `true` | Promote callables nothing in the repository calls |
72
+ | `includeTests` | `false` | Trace test files too |
73
+
74
+ `addresses` takes the same `<file>#<qualified-name>` form the `depth` and
75
+ `breadth` commands accept and every stack frame prints, so an address can be
76
+ copied out of a report straight into a configuration. A trailing `:<line>`
77
+ disambiguates a file holding two declarations under one qualified name.
78
+ Declared addresses are **additive**: the rules below keep running, orphan
79
+ promotion still catches whatever nobody named, and an address landing on a
80
+ callable a rule already rooted is one root rather than two. An address that
81
+ resolves to nothing, to more than one declaration, or to nothing parseable
82
+ fails the run — see [Refusals](#refusals).
83
+
84
+ `includeOrphans` is a safety net rather than a feature. Without it, a missing
85
+ entry-point rule silently removes whole subtrees from every measurement; with
86
+ it, they surface as orphan roots — which is itself worth knowing, since an
87
+ orphan is either dead code or a rule that needs adding.
88
+
89
+ ## Exclusions
90
+
91
+ `exclude` globs are **additive** to the built-in defaults (`node_modules`,
92
+ `dist`, `coverage`, `output`, `.nx`, `.conformetry`), so a configuration naming
93
+ its own noise does not have to restate them.
94
+
95
+ `excludeFrom` names gitignore-syntax files, which is how a long exclusion list
96
+ stays out of the configuration file itself.
97
+
98
+ ### An exclusion drops the callables, not the file
99
+
100
+ `exclude` decides what is **collected**, and nothing else. The file is still in
101
+ the `ts.Program`, so it is still compiled and still type-checked — what changes
102
+ is that its callables are never collected, and a call reaching into it becomes
103
+ an unfollowable call rather than disappearing. A stack therefore stops at the
104
+ excluded boundary instead of routing around it.
105
+
106
+ Two consequences worth knowing before reaching for `exclude`:
107
+
108
+ - **It cannot un-project a directory.** A project is the directory holding a
109
+ `tsconfig.json`, and discovery has already happened by the time collection is
110
+ filtered — so a project cannot exclude its own `tsconfig.json`, and excluding
111
+ every file it holds leaves it a project that traced nothing rather than no
112
+ project at all.
113
+ - **A `tsconfig.json` that will not parse still ends the run**, because it is
114
+ opened before any of this. Use the run's `exclude` to drop such a project,
115
+ which is settled early enough to keep discovery from opening it at all.
116
+
117
+ ### Excluding callees
118
+
119
+ `excludeCallees` is a different filter from `exclude`: it names globs matched
120
+ against a callable's display name (`Type.member`) rather than against a file
121
+ path. A call landing on a match is dropped from the graph entirely, counting
122
+ toward neither the caller's depth nor its breadth — the shape a cross-cutting
123
+ callable like a logger needs, since every call site into it is a fact about
124
+ instrumentation rather than about how deep or wide the code around it is.
125
+
126
+ ## Write
127
+
128
+ Every destination is optional, and unconfigured is the normal case: a run that
129
+ names no destination reports to the console and exits non-zero on violations, so
130
+ nothing it writes can go stale.
131
+
132
+ | Destination | Purpose |
133
+ | ----------- | ------- |
134
+ | `write.json` | A machine-readable report at `path`, indented by `indentation` |
135
+ | `write.markdown` | A marker-delimited block spliced into `path` |
136
+ | `write.mermaid` | The same block with its call stacks drawn as one mermaid flowchart |
137
+
138
+ `write.mermaid` takes the same keys as `write.markdown` — they differ in what
139
+ goes between the anchors, not in how a block is placed or overridden — and is a
140
+ separate destination so a repository can publish the printed trees and the
141
+ diagram from one run.
142
+
143
+ The console format — `markdown`, `mermaid`, or `json`, defaulting to `markdown`
144
+ — is a command-line concern rather than a configuration field: it decides what
145
+ one invocation prints, never what a run writes to a file, so it is selected
146
+ only by the CLI's own `--format` flag. Writing to a file and printing to a
147
+ terminal are independent, so both can be on at once.
148
+
149
+ `write.markdown` and `write.mermaid` each take a `description`, placed under
150
+ the heading, and a `heading`, which defaults to `# 🔭 Callidescope`. Set it
151
+ whenever the block is spliced into a file that already has a title: a second
152
+ first-level heading is something most markdown linters reject. The block's
153
+ subsections follow the level down on their own, so an `##` heading writes
154
+ `###` subsections.
155
+
156
+ Each also takes `previewCount`, how many stacks are shown before the rest go
157
+ behind a disclosure. It belongs to the destination rather than to the run
158
+ because it is a fact about the document the block lands in: a project's README
159
+ wants three and a whole-workspace report file wants all of them, and one number
160
+ for both could only ever be wrong for one of them. A run that only prints to a
161
+ terminal uses the tool's own default of three, that being nobody's document.
162
+
163
+ **There is no fan-out that writes a section into every project's readme.** Each
164
+ project declares its own `write.markdown` in its own file, so a project decides
165
+ where its section lands, whether it publishes one at all, and whether it wants
166
+ a diagram beside it — see [What a project may set](#what-a-project-may-set).
167
+ The workspace's own `write.markdown` is the block that really is about the
168
+ workspace: it carries the summary counts, one row per project against that
169
+ project's own depth limit, and a scoreboard of how many sit over, on, or clear
170
+ of theirs.
171
+
172
+ A markdown destination may supply `render` to replace the built-in tables, or
173
+ `writeBlock` to place the block itself. A `writeBlock` function is handed
174
+ `syncAnchoredBlock` and `wrapInAnchors`, so a custom writer reuses the same
175
+ splice rather than reimplementing it. Returning `false` reports the destination
176
+ as stale; anything else, `undefined` included, counts as current.
177
+
178
+ ## Flags and Precedence
179
+
180
+ Every combination of a command-line value with a configured one happens in this
181
+ package, in `FlagResolutionService`, under one rule:
182
+
183
+ > A flag that changes **what a run judges or writes** may only override a value
184
+ > the configuration already declares. A flag that selects **mode or
185
+ > presentation** is command-line only, because neither can make an
186
+ > under-configured run legal.
187
+
188
+ | Flag | Role | What resolution does with it |
189
+ | ---- | ---- | ---------------------------- |
190
+ | `--check` | Mode | Command-line only. Nothing in the configuration corresponds to it |
191
+ | `--write` | Mode | Command-line only, for the same reason |
192
+ | `--format` | Presentation | Command-line only, and validated. It is returned beside the configuration rather than written into it |
193
+ | `--directories` | Override | Replaces `directories` when it named any. An empty value is absent, not a scope |
194
+ | `--entry-point-addresses` | Override | Replaces `entryPoints.addresses` when it named any |
195
+ | `--entry-point-decorators` | Override | Replaces `entryPoints.decorators` when it named any |
196
+ | `--exclude` | Override | Replaces the **authored** `exclude` when it named any, and the default globs are folded back in — resolution adds them to a configured `exclude` too, so a flag that dropped them would start tracing `node_modules` |
197
+ | `--exclude-callees` | Override | Replaces `excludeCallees` when it named any |
198
+ | `--include-exported-functions` | Override | Replaces `entryPoints.includeExportedFunctions`. Takes `true` or `false`, or the flag alone for `true` |
199
+ | `--include-orphans` | Override | Replaces `entryPoints.includeOrphans`, the same way |
200
+ | `--include-tests` | Override | Replaces `entryPoints.includeTests`, the same way |
201
+ | `--maximum-depth` | Override | Replaces `limits.maximumDepth`, in the run's own configuration and in every project's. A value that is not a positive whole number is refused |
202
+ | `--maximum-breadth` | Override | Replaces `limits.maximumBreadth` the same way — and is refused when the run's configuration declares none, there being nothing to override |
203
+ | `--json` | Override | Replaces `write.json.path`, and no other property of that destination |
204
+ | `--markdown` | Override | Replaces `write.markdown.path`, and no other property of that destination |
205
+ | `--mermaid` | Override | Replaces `write.mermaid.path`, and no other property of that destination |
206
+ | `--config` | Neither | It chooses the file everything else is resolved against, so it has already done its whole job by the time resolution runs |
207
+
208
+ **Every configured field has an overriding flag, save one.** `excludeFrom`
209
+ names the ignore files a run reads, which is what the run _is_ rather than a
210
+ value it judges by — and it is workspace-only for that same reason, a project
211
+ being no more able to redirect it than a command line is.
212
+
213
+ **A limit override reaches the number each project is really gated by.** A
214
+ limit is enforced per project, out of that project's own file, so an override
215
+ left in the run's copy alone would be a flag no gate ever looks at — the
216
+ `--format mermiad` failure in a different costume. It is applied to every
217
+ project that declared the limit being overridden, and to no project that
218
+ declared none: `--maximum-breadth` cannot gate a project that wrote
219
+ `maximumBreadth: undefined`, because overriding a decision and reversing one
220
+ are not the same act. The file each project's row names is still that project's
221
+ own — an override changes a number for one invocation, not where it was
222
+ written.
223
+
224
+ Which flags a command accepts follows from what that command does.
225
+ `callidescope` accepts every row above. `depth` and `breadth` accept the ones
226
+ that shape the graph — the scope, the entry-point rules, and the two exclusion
227
+ lists — and none of the limits or destinations, because a lookup gates nothing
228
+ and writes nothing, so there is no number it reads and no file it touches for
229
+ one of those to change.
230
+
231
+ Four consequences are worth stating outright, because each replaced an
232
+ ad-hoc merge that got them wrong:
233
+
234
+ - **An empty `--directories` is absent.** `--directories ""` and a
235
+ `--directories` nobody typed are the same value, and reading either as
236
+ "every project" silently overrode a configured scope.
237
+ - **A path override keeps its siblings.** A destination carries a heading, a
238
+ description, its anchors, its indentation, and its render and write hooks;
239
+ re-resolving it from a path alone replaced every one of them with a default.
240
+ - **A path override cannot invent a destination.** `--json` against a
241
+ configuration declaring no `write.json` is refused, because a flag that could
242
+ conjure one would let any command line write a report the configuration never
243
+ asked for. `--maximum-breadth` is refused the same way and for the same
244
+ reason: it is the one judged value resolution supplies no default for, so a
245
+ flag that could supply one would gate a workspace on a number no
246
+ configuration ever chose — which is exactly what `--check breadth` refuses to
247
+ do.
248
+ - **An unrecognized `--format` is refused.** A run that quietly printed
249
+ markdown for `--format mermiad` exited 0 having taught its reader that the
250
+ flag does nothing.
251
+
252
+ Every complaint is collected rather than thrown at the first one, so a command
253
+ line with two mistakes in it is two mistakes to fix rather than two runs.
254
+ Nothing has been traced or written by the time resolution returns.
255
+
256
+ ## Project Configuration
257
+
258
+ Everything above describes the file a run is pointed at — the **workspace**
259
+ configuration. A second `callidescope.config.ts` may also sit at any traced
260
+ project's own root, the directory holding the `tsconfig.json` that makes it a
261
+ project. It is found by name in that directory alone, with no upward walk, and
262
+ may use any of the same eight extensions.
263
+
264
+ **Every traced project has one, and every one of them is complete.** A traced
265
+ project with no file at all is refused by name, and so is a file that leaves a
266
+ field out. A project's file is meant to be readable as the whole statement of
267
+ how that project is traced and judged, which a shape with optional fields
268
+ cannot be: an absent field and a field set to the value it would have defaulted
269
+ to look identical in a diff, and only one of them was a decision. Completeness
270
+ costs one line rather than twenty, because a project spreads the workspace's
271
+ `projectDefaults` and overrides what it means to — see
272
+ [Spread the defaults, then override](#spread-the-defaults-then-override) and
273
+ [ADR 0007](../../../../docs/adr/0007-complete-project-configurations.md).
274
+
275
+ One file, one role per run: the file a run was pointed at is never also read as
276
+ a project's. A package whose task names its own configuration and then traces
277
+ itself would otherwise have that file judged as a project's — a refusal for the
278
+ workspace-only fields it legitimately sets.
279
+
280
+ ### What a project may set
281
+
282
+ | Field | What it does |
283
+ | ----- | ------------ |
284
+ | `entryPoints` | Which of that project's callables root a stack, `addresses` included |
285
+ | `limits.maximumDepth` | The depth every stack rooted in that project is judged against |
286
+ | `limits.maximumBreadth` | The breadth every callable that project declares is judged against |
287
+ | `exclude` | Globs naming that project's own files to leave untraced |
288
+ | `write.markdown` | Where that project's own published section goes |
289
+ | `write.mermaid` | Where that project's own diagram goes, when it wants one |
290
+
291
+ **A project's written destinations are anchored to its root** the same way its
292
+ `exclude` globs are: `write: { markdown: { path: "docs/CALLS.md" } }` in
293
+ `packages/thing`'s own file writes `packages/thing/docs/CALLS.md`, and there is
294
+ no spelling of it that reaches a sibling. A destination left `undefined`
295
+ publishes nothing.
296
+
297
+ Nothing else writes into a project's documents. There is no workspace-level
298
+ fan-out to be left out of or reached by: a project publishes what its own file
299
+ says it publishes, and `undefined` is how it says nothing.
300
+
301
+ `write.json` stays workspace-only: it is the run's single report, not a
302
+ project's to redirect.
303
+
304
+ **A project's `exclude` globs are anchored to that project's root**, never to
305
+ the workspace: `exclude: ["src/generated/**"]` in `packages/thing`'s own file
306
+ names `packages/thing/src/generated/**`, and there is no spelling of it that
307
+ reaches a sibling. Write the path as the project sees it — a workspace-relative
308
+ glob here matches nothing, and the files it meant to drop stay traced.
309
+
310
+ The run's own `exclude` keeps its workspace-relative meaning and is layered
311
+ underneath, so a project can leave more out and can never put back what the run
312
+ left out. Noise spanning several projects still belongs in the workspace file.
313
+
314
+ It also filters **collection** and nothing else, exactly as the run's own does —
315
+ see [An exclusion drops the callables, not the file](#an-exclusion-drops-the-callables-not-the-file).
316
+ A project cannot exclude its own `tsconfig.json`, and a call into a file it
317
+ excluded becomes an unfollowable call rather than vanishing.
318
+
319
+ Every other field is refused by name before anything is traced.
320
+
321
+ ### Spread the defaults, then override
322
+
323
+ A workspace configuration exports `projectDefaults` beside its default export.
324
+ A project spreads it and overrides what it means to, which is what makes a
325
+ complete file cost one line:
326
+
327
+ ```ts
328
+ import { projectDefaults } from "../../configuration/callidescope.config.js";
329
+
330
+ export default {
331
+ ...projectDefaults,
332
+ limits: { maximumBreadth: undefined, maximumDepth: 10 },
333
+ };
334
+ ```
335
+
336
+ Both limits are named even though only one is a real number. `maximumBreadth:
337
+ undefined` is this project saying outright that it gates depth and not breadth
338
+ — the one statement an absent field could never distinguish from a project that
339
+ forgot. The same holds for `write.mermaid: undefined` and publishing no
340
+ diagram.
341
+
342
+ **Spread `projectDefaults`, never the workspace's default export.** The two are
343
+ different objects on purpose: the default export carries `directories`,
344
+ `excludeFrom`, `write.json`, and the rest of what only a run may set, so
345
+ spreading it earns a refusal naming the first such field. `projectDefaults`
346
+ holds exactly the surface a project is entitled to, so a project spreading it
347
+ cannot adopt an output destination or an ignore file by accident, because none
348
+ of them is in there to adopt.
349
+
350
+ Nothing is resolved across two files. Every number a project is judged by is
351
+ written in that project's own file — there is no per-field fallback to the
352
+ workspace, and no record of whether a limit was declared here or handed down,
353
+ because the spread already put it here where a reader can see it.
354
+
355
+ The workspace number is a **default rather than a ceiling**. A project declaring
356
+ a higher limit than the workspace keeps its own — a workspace number pinned by
357
+ the single worst stack anywhere in it gates nothing for the projects nowhere
358
+ near it, which is the whole reason a project gets to say.
359
+
360
+ `entryPoints` is replaced whole rather than merged member by member: a project
361
+ writing an `entryPoints` object of its own replaces the spread one outright, so
362
+ a project that declares `addresses` and wants the workspace's decorator list has
363
+ to carry it across — `...projectDefaults.entryPoints` inside its own object is
364
+ the one line that does it.
365
+
366
+ `includeTests` is the one field in that set that decides which of a project's
367
+ files are **collected** rather than which of its callables root a stack, so it
368
+ takes effect at the same layer `exclude` does: a project that asks for its test
369
+ files gets them walked in a run that left every other project's out, and a
370
+ project that refuses them keeps them out of a run that asked for everyone's.
371
+
372
+ ### Why the workspace-only fields cannot vary per project
373
+
374
+ `maximumDepth` and `maximumBreadth` **judge** a call graph: the graph is built
375
+ once, and each project asks a different question of the same edges. Two answers
376
+ are two opinions about one artifact, which is coherent.
377
+
378
+ `excludeCallees`, `directories`, `excludeFrom`, and `write.json` are
379
+ different. They name what a run reads, where the
380
+ run's own report lands, or how it partitions the workspace, and a project
381
+ cannot answer those differently from the run tracing it — so they stay in the
382
+ workspace file. `<field>` in the refusal above is the name as it has to be
383
+ typed to fix the file, dot path and all, so a project setting `write.json`
384
+ alongside a destination it is entitled to keep is told which half to move.
385
+
386
+ ### Reading the resolved set
387
+
388
+ A ratchet written one file per project is no longer reviewable in the single
389
+ file it used to live in. `@callidescope/cli`'s `limits` command is where it is
390
+ reviewable as a set instead — every project in scope, the number it is judged
391
+ against, and the file that number is written in. There is nothing to say
392
+ beyond that: every traced project's configuration is complete, so a limit has
393
+ exactly one reachable value rather than a declared-or-inherited pair, and the
394
+ listing names only the file it came from. It resolves configuration and
395
+ measures nothing, so it costs milliseconds rather than a trace.
396
+
397
+ It is also the answer to a limit that seems not to have taken effect. A
398
+ misspelled `limits.maxDepth` is refused outright — the schema is strict, so an
399
+ unrecognized field never loads cleanly in the first place — and the listing's
400
+ `Value` column is where a number that took hold but reads wrong shows itself.
401
+
402
+ ### Refusals
403
+
404
+ Each of these ends the run before anything is printed or written, so a checkout
405
+ is left exactly as the run found it. `<project>` is the workspace-relative
406
+ project root; the workspace configuration's own declared addresses are labelled
407
+ `the workspace configuration` instead.
408
+
409
+ Five of them. Each is shown under the headline it is logged with — four of the
410
+ five share one — and quoted as the tool writes it.
411
+
412
+ **`🔭 Rejected a project configuration` — the file could not be read.**
413
+
414
+ ```text
415
+ Failed to read the callidescope configuration for <project> at <path>: <reason>
416
+ ```
417
+
418
+ The read failed or the shape did not pass the schema. `<reason>` is the
419
+ underlying failure, which is also kept as the error's `cause`. Fix the named
420
+ file; nothing else was traced.
421
+
422
+ **`🔭 Rejected a project configuration` — a workspace-only field.**
423
+
424
+ ```text
425
+ <project> sets <field>, which only the workspace configuration may set. A project configuration may set entryPoints, exclude, limits, write.markdown, and write.mermaid.
426
+ ```
427
+
428
+ Move that field to the workspace file. A retired limit is a different refusal:
429
+ the schema names it, because `limits` accepts `maximumDepth` and
430
+ `maximumBreadth` and nothing else.
431
+
432
+ **`🔭 Rejected a project configuration` — a declared address resolved to
433
+ nothing.**
434
+
435
+ ```text
436
+ <project> declares an entryPoints.addresses entry that resolves to nothing: "<address>". Check the file path and the qualified name callidescope prints for it in a stack.
437
+ ```
438
+
439
+ The callable was renamed, moved, or excluded from the run. Correct the address
440
+ or drop it. This refusal is the point of the field rather than an
441
+ inconvenience: a rename that silently dropped a declared root would lower the
442
+ project's measured depth with nothing in the output to say so, and loosen a gate
443
+ in the one commit nobody would think to check it in.
444
+
445
+ **`🔭 Rejected a project configuration` — a declared address was ambiguous.**
446
+
447
+ ```text
448
+ <project> declares an entryPoints.addresses entry that matches more than one declaration: "<address>". Candidates: <address>:<line>, <address>:<line>. Add ":<line>" to the address to pick one.
449
+ ```
450
+
451
+ Every candidate is rendered as an address that would have picked it, so the fix
452
+ is a copy rather than a file location to translate back. Two declarations on one
453
+ line are the case no address can separate; those name their column instead and
454
+ the advice changes to `Two declarations on one line cannot be told apart by
455
+ ":<line>" — rename one, or name a different callable.`
456
+
457
+ **`🔭 Rejected a project configuration` — a declared address was malformed.**
458
+
459
+ ```text
460
+ <project> declares an invalid entryPoints.addresses entry. "<address>" is not a callable address. It needs a file path and a qualified name joined by "#", as in "src/foo.service.ts#FooService.bar", optionally followed by ":<line>" to disambiguate.
461
+ ```
462
+
463
+ A run collects **every** unresolved address before it refuses, so several
464
+ mistakes are fixed from one message rather than one refusal at a time. More
465
+ than one arrives numbered, behind
466
+ `<count> declared entry points did not resolve.`
467
+
468
+ The headlines belong to the command rather than to the message. The first two
469
+ reach the `limits` command as well, where they are printed under
470
+ `🔭 Rejected a configuration`; a listing that quietly skipped the one project
471
+ whose configuration is wrong would be at its least trustworthy exactly when it
472
+ is most wanted. The three address refusals need a resolved call graph, so only
473
+ a trace raises those.
474
+
475
+ ### Worked examples
476
+
477
+ Three runnable examples in
478
+ [`@callidescope/examples`](../callidescope-examples/README.md) demonstrate the
479
+ whole of this, each against real traced code:
480
+
481
+ | Example | What it shows |
482
+ | ------- | ------------- |
483
+ | [`declared-entry-points`](../callidescope-examples/examples/declared-entry-points/README.md) | `entryPoints.addresses`, what declaring adds, and the refusals |
484
+ | [`project-depth-limit`](../callidescope-examples/examples/project-depth-limit/README.md) | One run, two depth limits, and why the two files at that package's root are separate |
485
+ | [`gated-leaf`](../callidescope-examples/examples/gated-leaf/README.md) | A leaf gated at three, and both halves of the `--check breadth` rule side by side |
486
+
487
+ ## Call Graph Types
488
+
489
+ The result types define the JSON report's shape, so a consumer types against
490
+ this package rather than reverse-engineering the output. Each reported
491
+ `StackFrame` carries a `CallableSignature` (parameter names, types, optional and
492
+ rest flags, return type, and the one-line rendering) and a
493
+ `CallableDocumentation` (the whole comment as its summary, tag names, and a
494
+ deprecation flag — shortening belongs to whatever renders it). Both are
495
+ `undefined` when the callable has neither — and `undefined` fields are absent
496
+ from the JSON entirely rather than present and null.
497
+
498
+ ## Exports
499
+
500
+ `ConfigurationModule` and `ConfigurationService` for NestJS consumers, the zod
501
+ schema and every default constant, and the type surface — both the configuration
502
+ types and the `CallGraphResult` types that define the JSON report's shape.
503
+
504
+ `loadConfiguration` does the file I/O; `resolveConfiguration` is pure
505
+ defaulting. They are split so that a host embedding callidescope can hand over a
506
+ configuration object it assembled itself and get the same resolved shape a file
507
+ produces, without touching the disk.
508
+
509
+ `ProjectConfigurationService` is the second service, and the only place a
510
+ per-project refusal is raised: `loadProjectConfigurations` reads the file beside
511
+ each traced project and rejects the ones setting a workspace-only field, and
512
+ `resolveLimits` says what every project is judged against, each number carrying
513
+ the file it was written in. One resolver rather than one per reader — a gate
514
+ and a listing that each read a flag override its own way could disagree about
515
+ the same number, and a limit two answers can be given for is worse than no
516
+ limit.
517
+
518
+ ## Test
519
+
520
+ ```bash
521
+ nx run callidescope-configuration:vitest
522
+ ```
523
+
524
+ ## License
525
+
526
+ MIT — see [LICENSE](../../../../LICENSE).
527
+
528
+ ## 👔 Conformetry
529
+
530
+ This project was generated from the [nestjs-service-project](../../../../configuration/conformetry-templates/nestjs-service-project) conformetry template.
531
+
532
+ <!-- callidescope:start -->
533
+
534
+ ## 🔭 Callidescope
535
+
536
+ Call stacks traced through `packages/ic-suite/callidescope/callidescope-configuration`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
537
+
538
+ | Measure | Value |
539
+ | --- | --- |
540
+ | Callables | 112 |
541
+ | Files | 27 |
542
+ | Calls traced | 112 |
543
+ | Call stacks | 6 |
544
+ | Deepest stack | 5 |
545
+ | Stacks through recursion | 0 |
546
+ | Unfollowable calls | 11 |
547
+
548
+ ### Limits
549
+
550
+ What this project is judged against, as declared in its own `callidescope.config.ts`.
551
+
552
+ | Limit | Value |
553
+ | --- | --- |
554
+ | `maximumDepth` | 8 |
555
+ | `maximumBreadth` | 8 |
556
+
557
+ ### Call stacks (depth)
558
+
559
+ **1. `ConfigurationFileService.loadConfiguration`** — depth ≥ 5 · orphan-root
560
+
561
+ ```text
562
+ 🚀 ConfigurationFileService.loadConfiguration(args?: LoadConfigurationArguments): Promise<ResolvedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:298]
563
+ ↳ Loads and validates a callidescope configuration file.
564
+ └─> ConfigurationFileService.loadConfigurationFile(args?: LoadConfigurationArguments): Promise<LoadedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:326]
565
+ ↳ Loads a configuration, and says what the file itself declared and which file answered.
566
+ └─> ConfigurationFileService.resolveConfigurationPath(configurationPath: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:158]
567
+ ↳ Resolves a configuration path against the cwd, then the repository root.
568
+ └─> ConfigurationFileService.findRepositoryRoot(): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:97]
569
+ ↳ Walks upward from the process cwd looking for the repository root.
570
+ └─> ConfigurationFileService.some(…)(marker: ".git" | "pnpm-workspace.yaml"): boolean [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:102]
571
+ ```
572
+
573
+ **2. `flatMap(…)`** — depth 3 · orphan-root
574
+
575
+ ```text
576
+ 🚀 flatMap(…)(…): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:227]
577
+ └─> readPermittedNames(…): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:146]
578
+ ↳ Reads the names one classified field contributes to the permitted set.
579
+ └─> map(…)([member]: [string, ProjectFieldPermission]): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:156]
580
+ ```
581
+
582
+ **3. `InputService.suggest`** — depth 3 · orphan-root
583
+
584
+ ```text
585
+ 🚀 InputService.suggest(input: string): Promise<{ title: string; value: string; }[]> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:137]
586
+ └─> InputService.completeSuggestions(args: { input: string; suggestions: readonly string[]; }): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:55]
587
+ ↳ Narrows a suggestion list to what has been typed so far.
588
+ └─> InputService.filter(…)(suggestion: string): boolean [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:60]
589
+ ```
590
+
591
+ <details>
592
+ <summary>3 more call stacks</summary>
593
+
594
+ **4. `ConfigurationService.resolveConfiguration`** — depth 3 · orphan-root
595
+
596
+ ```text
597
+ 🚀 ConfigurationService.resolveConfiguration(configuration: CallidescopeConfiguration): ResolvedCallidescopeConfiguration [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:146]
598
+ ↳ Fills in every field a configuration file may leave out.
599
+ └─> ConfigurationFileService.resolveConfiguration(configuration: CallidescopeConfiguration): ResolvedCallidescopeConfiguration [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:369]
600
+ ↳ Fills in every field a configuration file may leave out.
601
+ └─> ConfigurationFileService.resolveEntryPoints(…): ResolvedCallidescopeEntryPoints [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:190]
602
+ ↳ Applies defaults to the entry-point rules.
603
+ ```
604
+
605
+ **5. `callbackSchema`** — depth 2 · orphan-root
606
+
607
+ ```text
608
+ 🚀 callbackSchema<TCallback>(): z.ZodType<TCallback> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:296]
609
+ ↳ Accepts a function-valued option without inspecting its signature.
610
+ └─> custom(…)(value: unknown): value is Function [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:297]
611
+ ```
612
+
613
+ **6. `ConfigurationService.findConfigurationFileAt`** — depth 2 · orphan-root
614
+
615
+ ```text
616
+ 🚀 ConfigurationService.findConfigurationFileAt(directory: string): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:73]
617
+ ↳ Finds a configuration file sitting directly at one directory.
618
+ └─> ConfigurationFileService.findConfigurationFileAt(directory: string): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:278]
619
+ ↳ Finds a configuration file sitting directly at one directory.
620
+ ```
621
+
622
+ </details>
623
+
624
+ ### Breadth
625
+
626
+ | Callable | Breadth | Calls directly | Location |
627
+ | --- | --- | --- | --- |
628
+ | `FlagResolutionService.resolveRunFlags` | 7 | `FlagResolutionService.resolveFormat`, `FlagResolutionService.resolveLimitOverrides`, `FlagResolutionService.resolveList`, `FlagResolutionService.resolveEntryPoints`, `FlagResolutionService.resolveExclude`, `FlagResolutionService.resolveLimits`, `FlagResolutionService.resolveWrite` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:426` |
629
+ | `ConfigurationFileService.loadConfigurationFile` | 5 | `ConfigurationFileService.findConfigurationFile`, `ConfigurationFileService.resolveConfigurationPath`, `ConfigurationFileService.resolveConfiguration`, `UnknownConfigurationFileTypeError.constructor`, `ConfigurationFileService.loadConfigurationModule` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:326` |
630
+ | `ConfigurationFileService.resolveConfiguration` | 5 | `ConfigurationFileService.resolveEntryPoints`, `ConfigurationFileService.resolveExclude`, `ConfigurationFileService.resolveLimits`, `ConfigurationFileService.resolveJsonOutput`, `ConfigurationFileService.resolveMarkdownDestination` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:369` |
631
+
632
+ <details>
633
+ <summary>53 more callables</summary>
634
+
635
+ | Callable | Breadth | Calls directly | Location |
636
+ | --- | --- | --- | --- |
637
+ | `InputService.promptForAutocompleteMultiselect` | 4 | `InputService.assertCanPrompt`, `InputService.map(…)`, `promptCancelledError`, `InputService.filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:126` |
638
+ | `InputService.promptForSelect` | 4 | `InputService.assertCanPrompt`, `InputService.map(…)`, `promptCancelledError`, `InputService.find(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:175` |
639
+ | `RunPlanService.readCheckNames` | 4 | `RunPlanService.describeAcceptedCheckNames`, `RunPlanService.filter(…)`, `RunPlanService.map(…)`, `RunPlanService.validateCheckNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:68` |
640
+ | `ProjectConfigurationService.loadProjectConfigurations` | 4 | `ProjectConfigurationMissingError.constructor`, `ProjectConfigurationService.loadProjectConfiguration`, `ProjectConfigurationService.assertNoForbiddenFields`, `ProjectConfigurationService.assertComplete` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:362` |
641
+ | `RunPlanService.selectMode` | 3 | `RunPlanService.readCheckNames`, `RunPlanService.filter(…)`, `RunPlanService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:271` |
642
+ | `ProjectConfigurationService.resolveLimits` | 3 | `ProjectConfigurationService.buildWorkspaceLimits`, `ProjectConfigurationService.map(…)`, `ProjectConfigurationService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:417` |
643
+ | `readPermittedNames` | 2 | `map(…)`, `filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:146` |
644
+ | `InputService.assertCanPrompt` | 2 | `InputService.isAtTerminal`, `missingInputError` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:38` |
645
+ | `InputService.suggest` | 2 | `InputService.map(…)`, `InputService.completeSuggestions` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:137` |
646
+ | `FlagResolutionService.resolveCount` | 2 | `buildUndeclaredValueMessage`, `buildUnreadableCountMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:93` |
647
+ | `FlagResolutionService.resolveEntryPoints` | 2 | `FlagResolutionService.resolveList`, `FlagResolutionService.resolveSwitch` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:168` |
648
+ | `FlagResolutionService.resolveFormat` | 2 | `FlagResolutionService.find(…)`, `buildUnknownFormatMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:240` |
649
+ | `RunPlanService.prepareLookup` | 2 | `FlagResolutionService.resolveRunFlags`, `flagResolutionError` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:133` |
650
+ | `RunPlanService.prepareRun` | 2 | `RunPlanService.selectMode`, `FlagResolutionService.resolveRunFlags` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:194` |
651
+ | `ConfigurationFileService.resolveConfigurationPath` | 2 | `ConfigurationFileService.findRepositoryRoot`, `ConfigurationFileNotFoundError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:158` |
652
+ | `ProjectConfigurationService.assertComplete` | 2 | `ProjectConfigurationService.findMissingField`, `ProjectConfigurationIncompleteError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:55` |
653
+ | `ProjectConfigurationService.assertNoForbiddenFields` | 2 | `ProjectConfigurationService.findForbiddenField`, `ProjectConfigurationFieldNotPermittedError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:74` |
654
+ | `ProjectConfigurationService.findForbiddenField` | 2 | `ProjectConfigurationService.findForbiddenMember`, `ProjectConfigurationService.readForbiddenField` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:163` |
655
+ | `ConfigurationService.resolveFormatOption` | 2 | `InputService.isAtTerminal`, `ConfigurationService.promptForSelect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:165` |
656
+ | `flatMap(…)` | 1 | `readPermittedNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:227` |
657
+ | `callbackSchema` | 1 | `custom(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:296` |
658
+ | `missingInputError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.constants.ts:27` |
659
+ | `promptCancelledError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.constants.ts:39` |
660
+ | `InputService.completeSuggestions` | 1 | `InputService.filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:55` |
661
+ | `InputService.parseCommaDelimitedOption` | 1 | `InputService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98` |
662
+ | `buildUnknownFormatMessage` | 1 | `map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.constants.ts:19` |
663
+ | `flagResolutionError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.constants.ts:87` |
664
+ | `FlagResolutionService.resolveDestination` | 1 | `buildUndeclaredDestinationMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:137` |
665
+ | `FlagResolutionService.resolveLimitOverrides` | 1 | `FlagResolutionService.resolveCount` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:271` |
666
+ | `FlagResolutionService.resolveSwitch` | 1 | `buildUnknownSwitchMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:354` |
667
+ | `FlagResolutionService.resolveWrite` | 1 | `FlagResolutionService.resolveDestination` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:383` |
668
+ | `RunPlanService.describeAcceptedCheckNames` | 1 | `RunPlanService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:56` |
669
+ | `RunPlanService.validateCheckNames` | 1 | `RunPlanService.describeAcceptedCheckNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:100` |
670
+ | `ConfigurationFileService.findConfigurationFile` | 1 | `ConfigurationFileService.findConfigurationFileAt` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:70` |
671
+ | `ConfigurationFileService.findRepositoryRoot` | 1 | `ConfigurationFileService.some(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:97` |
672
+ | `ConfigurationFileService.loadConfigurationModule` | 1 | `ConfigurationFileService.loadJsonConfiguration` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:121` |
673
+ | `ConfigurationFileService.loadConfiguration` | 1 | `ConfigurationFileService.loadConfigurationFile` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:298` |
674
+ | `ProjectConfigurationService.buildProjectLimits` | 1 | `ProjectConfigurationService.overrideLimit` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:97` |
675
+ | `ProjectConfigurationService.findMissingField` | 1 | `ProjectConfigurationService.find(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:239` |
676
+ | `ProjectConfigurationService.loadProjectConfiguration` | 1 | `ProjectConfigurationError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:281` |
677
+ | `ProjectConfigurationService.map(…)` | 1 | `ProjectConfigurationService.buildProjectLimits` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:422` |
678
+ | `ConfigurationService.findConfigurationFileAt` | 1 | `ConfigurationFileService.findConfigurationFileAt` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:73` |
679
+ | `ConfigurationService.loadConfigurationFile` | 1 | `ConfigurationFileService.loadConfigurationFile` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:87` |
680
+ | `ConfigurationService.loadProjectConfigurations` | 1 | `ProjectConfigurationService.loadProjectConfigurations` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:94` |
681
+ | `ConfigurationService.parseCommaDelimitedOption` | 1 | `InputService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104` |
682
+ | `ConfigurationService.parseOptionalOption` | 1 | `InputService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109` |
683
+ | `ConfigurationService.prepareLookup` | 1 | `RunPlanService.prepareLookup` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:114` |
684
+ | `ConfigurationService.prepareRun` | 1 | `RunPlanService.prepareRun` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:121` |
685
+ | `ConfigurationService.promptForAutocompleteMultiselect` | 1 | `InputService.promptForAutocompleteMultiselect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:128` |
686
+ | `ConfigurationService.promptForSelect` | 1 | `InputService.promptForSelect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:137` |
687
+ | `ConfigurationService.resolveConfiguration` | 1 | `ConfigurationFileService.resolveConfiguration` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:146` |
688
+ | `ConfigurationService.resolveLimits` | 1 | `ProjectConfigurationService.resolveLimits` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:182` |
689
+ | `ConfigurationService.touchesFiles` | 1 | `RunPlanService.touchesFiles` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:189` |
690
+
691
+ </details>
692
+ <!-- callidescope:end -->
693
+
694
+ ## 🕸️ Codependix
695
+
696
+ 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`.
697
+
698
+ ### Nx Neighborhood
699
+
700
+ <!-- codependix:start name="codependix-nx-projects" -->
701
+ ```mermaid
702
+ graph LR
703
+ callidescope_cli["callidescope-cli"]
704
+ callidescope_configuration["callidescope-configuration"]
705
+ callidescope_core["callidescope-core"]
706
+ callidescope_examples["callidescope-examples"]
707
+ callidescope_graph["callidescope-graph"]
708
+ callidescope_nx["callidescope-nx"]
709
+ callidescope_output["callidescope-output"]
710
+ callidescope_cli --> callidescope_configuration
711
+ callidescope_configuration --> callidescope_core
712
+ callidescope_examples --> callidescope_configuration
713
+ callidescope_graph --> callidescope_configuration
714
+ callidescope_nx --> callidescope_configuration
715
+ callidescope_output --> callidescope_configuration
716
+ classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
717
+ class callidescope_configuration subject
718
+ ```
719
+ <!-- codependix:end name="codependix-nx-projects" -->
720
+
721
+ ### NestJS Module Graph
722
+
723
+ <!-- codependix:start name="codependix-nestjs-modules" -->
724
+ ```mermaid
725
+ flowchart LR
726
+ ConfigurationFileModule
727
+ ConfigurationModule
728
+ FlagResolutionModule
729
+ InputModule
730
+ RunPlanModule
731
+ ConfigurationModule --> ConfigurationFileModule
732
+ ConfigurationModule --> InputModule
733
+ ConfigurationModule --> RunPlanModule
734
+ RunPlanModule --> FlagResolutionModule
735
+ ```
736
+ <!-- codependix:end name="codependix-nestjs-modules" -->
737
+
738
+ ### File Imports
739
+
740
+ <!-- codependix:start name="codependix-file-imports" -->
741
+ ```mermaid
742
+ graph LR
743
+ file_callidescope_config_ts["callidescope.config.ts"]
744
+ file_codependix_config_ts["codependix.config.ts"]
745
+ file_codometer_config_ts["codometer.config.ts"]
746
+ file_eslint_config_ts["eslint.config.ts"]
747
+ file_src_index_ts["src/index.ts"]
748
+ file_src_index_unit_test_ts["src/index.unit.test.ts"]
749
+ file_src_modules_configuration_configuration_file_module_ts["src/modules/configuration/configuration-file.module.ts"]
750
+ file_src_modules_configuration_configuration_file_service_ts["src/modules/configuration/configuration-file.service.ts"]
751
+ file_src_modules_configuration_configuration_file_service_unit_test_ts["src/modules/configuration/configuration-file.service.unit.test.ts"]
752
+ file_src_modules_configuration_configuration_file_types_ts["src/modules/configuration/configuration-file.types.ts"]
753
+ file_src_modules_configuration_configuration_constants_ts["src/modules/configuration/configuration.constants.ts"]
754
+ file_src_modules_configuration_configuration_module_ts["src/modules/configuration/configuration.module.ts"]
755
+ file_src_modules_configuration_configuration_module_unit_test_ts["src/modules/configuration/configuration.module.unit.test.ts"]
756
+ file_src_modules_configuration_configuration_service_ts["src/modules/configuration/configuration.service.ts"]
757
+ file_src_modules_configuration_configuration_service_unit_test_ts["src/modules/configuration/configuration.service.unit.test.ts"]
758
+ file_src_modules_configuration_configuration_types_ts["src/modules/configuration/configuration.types.ts"]
759
+ file_src_modules_configuration_project_configuration_service_ts["src/modules/configuration/project-configuration.service.ts"]
760
+ file_src_modules_configuration_project_configuration_service_unit_test_ts["src/modules/configuration/project-configuration.service.unit.test.ts"]
761
+ file_src_modules_flag_resolution_flag_resolution_constants_ts["src/modules/flag-resolution/flag-resolution.constants.ts"]
762
+ file_src_modules_flag_resolution_flag_resolution_module_ts["src/modules/flag-resolution/flag-resolution.module.ts"]
763
+ file_src_modules_flag_resolution_flag_resolution_service_ts["src/modules/flag-resolution/flag-resolution.service.ts"]
764
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts["src/modules/flag-resolution/flag-resolution.service.unit.test.ts"]
765
+ file_src_modules_flag_resolution_flag_resolution_types_ts["src/modules/flag-resolution/flag-resolution.types.ts"]
766
+ file_src_modules_input_input_constants_ts["src/modules/input/input.constants.ts"]
767
+ file_src_modules_input_input_module_ts["src/modules/input/input.module.ts"]
768
+ file_src_modules_input_input_service_ts["src/modules/input/input.service.ts"]
769
+ file_src_modules_input_input_service_unit_test_ts["src/modules/input/input.service.unit.test.ts"]
770
+ file_src_modules_input_input_types_ts["src/modules/input/input.types.ts"]
771
+ file_src_modules_run_plan_run_plan_constants_ts["src/modules/run-plan/run-plan.constants.ts"]
772
+ file_src_modules_run_plan_run_plan_module_ts["src/modules/run-plan/run-plan.module.ts"]
773
+ file_src_modules_run_plan_run_plan_service_ts["src/modules/run-plan/run-plan.service.ts"]
774
+ file_src_modules_run_plan_run_plan_service_unit_test_ts["src/modules/run-plan/run-plan.service.unit.test.ts"]
775
+ file_src_modules_run_plan_run_plan_types_ts["src/modules/run-plan/run-plan.types.ts"]
776
+ file_testing_mocks_ts["testing/mocks.ts"]
777
+ file_testing_setup_ts["testing/setup.ts"]
778
+ file_vite_config_ts["vite.config.ts"]
779
+ file_vitest_config_ts["vitest.config.ts"]
780
+ file_src_index_unit_test_ts --> file_src_index_ts
781
+ file_src_modules_configuration_configuration_file_module_ts --> file_src_modules_configuration_configuration_file_service_ts
782
+ file_src_modules_configuration_configuration_file_service_ts --> file_src_modules_configuration_configuration_constants_ts
783
+ file_src_modules_configuration_configuration_file_service_ts --> file_src_modules_configuration_configuration_types_ts
784
+ file_src_modules_configuration_configuration_file_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
785
+ file_src_modules_configuration_configuration_file_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
786
+ file_src_modules_configuration_configuration_file_types_ts --> file_src_modules_configuration_configuration_types_ts
787
+ file_src_modules_configuration_configuration_constants_ts --> file_src_modules_configuration_configuration_types_ts
788
+ file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_file_module_ts
789
+ file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_service_ts
790
+ file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_project_configuration_service_ts
791
+ file_src_modules_configuration_configuration_module_ts --> file_src_modules_input_input_module_ts
792
+ file_src_modules_configuration_configuration_module_ts --> file_src_modules_run_plan_run_plan_module_ts
793
+ file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_module_ts
794
+ file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
795
+ file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
796
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_file_service_ts
797
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_file_types_ts
798
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_constants_ts
799
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_types_ts
800
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_project_configuration_service_ts
801
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_input_input_service_ts
802
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_input_input_types_ts
803
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_run_plan_run_plan_service_ts
804
+ file_src_modules_configuration_configuration_service_ts --> file_src_modules_run_plan_run_plan_types_ts
805
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
806
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
807
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
808
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
809
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_input_input_service_ts
810
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_input_input_types_ts
811
+ file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_run_plan_run_plan_service_ts
812
+ file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_file_types_ts
813
+ file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_constants_ts
814
+ file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_types_ts
815
+ file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
816
+ file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
817
+ file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
818
+ file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
819
+ file_src_modules_flag_resolution_flag_resolution_constants_ts --> file_src_modules_configuration_configuration_constants_ts
820
+ file_src_modules_flag_resolution_flag_resolution_constants_ts --> file_src_modules_input_input_constants_ts
821
+ file_src_modules_flag_resolution_flag_resolution_module_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
822
+ file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_configuration_configuration_constants_ts
823
+ file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_configuration_configuration_types_ts
824
+ file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_flag_resolution_flag_resolution_constants_ts
825
+ file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_flag_resolution_flag_resolution_types_ts
826
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
827
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
828
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
829
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
830
+ file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_types_ts
831
+ file_src_modules_flag_resolution_flag_resolution_types_ts --> file_src_modules_configuration_configuration_types_ts
832
+ file_src_modules_input_input_module_ts --> file_src_modules_input_input_service_ts
833
+ file_src_modules_input_input_service_ts --> file_src_modules_input_input_constants_ts
834
+ file_src_modules_input_input_service_ts --> file_src_modules_input_input_types_ts
835
+ file_src_modules_input_input_service_unit_test_ts --> file_src_modules_input_input_service_ts
836
+ file_src_modules_run_plan_run_plan_module_ts --> file_src_modules_flag_resolution_flag_resolution_module_ts
837
+ file_src_modules_run_plan_run_plan_module_ts --> file_src_modules_run_plan_run_plan_service_ts
838
+ file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_configuration_configuration_file_types_ts
839
+ file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_flag_resolution_flag_resolution_constants_ts
840
+ file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
841
+ file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_run_plan_run_plan_constants_ts
842
+ file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_run_plan_run_plan_types_ts
843
+ file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
844
+ file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
845
+ file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
846
+ file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_run_plan_run_plan_service_ts
847
+ file_src_modules_run_plan_run_plan_types_ts --> file_src_modules_configuration_configuration_types_ts
848
+ ```
849
+ <!-- codependix:end name="codependix-file-imports" -->
850
+
851
+ <!-- codometer:start -->
852
+
853
+ ## ⏲️ Codometer
854
+
855
+ ### Project
856
+
857
+ ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-7019-22c55e?style=flat-square)
858
+ ![Repository Size](https://img.shields.io/badge/Repository_Size-253.16_kB-6b7280?style=flat-square)
859
+ ![Folders](https://img.shields.io/badge/Folders-7-4a4a4a?style=flat-square)
860
+ ![Source Files](https://img.shields.io/badge/Source_Files-37-3178c6?style=flat-square)
861
+
862
+ ### Measured Targets
863
+
864
+ ![Compiled JavaScript Size](https://img.shields.io/badge/Compiled_JavaScript_Size-7.24_kB_gzip-6b7280?style=flat-square)
865
+
866
+ ### TypeScript
867
+
868
+ ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-37-3178c6?style=flat-square)
869
+ ![Interfaces](https://img.shields.io/badge/Interfaces-41-0ea5e9?style=flat-square)
870
+ ![Generic Declarations](https://img.shields.io/badge/Generic_Declarations-1-0369a1?style=flat-square)
871
+ ![Enums](https://img.shields.io/badge/Enums-0-f97316?style=flat-square)
872
+ ![Decorators](https://img.shields.io/badge/Decorators-11-db2777?style=flat-square)
873
+ ![Doc Comments](https://img.shields.io/badge/Doc_Comments-243-6366f1?style=flat-square)
874
+ ![Static Methods](https://img.shields.io/badge/Static_Methods-0-166534?style=flat-square)
875
+
876
+ ### JavaScript
877
+
878
+ ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-0-f7df1e?style=flat-square)
879
+ ![Test Files](https://img.shields.io/badge/Test_Files-8-10b981?style=flat-square)
880
+ ![External Packages](https://img.shields.io/badge/External_Packages-14-8b5cf6?style=flat-square)
881
+ ![Classes](https://img.shields.io/badge/Classes-18-7c3aed?style=flat-square)
882
+ ![Functions](https://img.shields.io/badge/Functions-272-16a34a?style=flat-square)
883
+ ![Methods](https://img.shields.io/badge/Methods-86-15803d?style=flat-square)
884
+ ![Sync Functions](https://img.shields.io/badge/Sync_Functions-249-4ade80?style=flat-square)
885
+ ![Async Functions](https://img.shields.io/badge/Async_Functions-109-059669?style=flat-square)
886
+ ![Constants](https://img.shields.io/badge/Constants-338-dc2626?style=flat-square)
887
+ ![Imports](https://img.shields.io/badge/Imports-131-0284c7?style=flat-square)
888
+ ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-98-ea580c?style=flat-square)
889
+ ![Comments](https://img.shields.io/badge/Comments-445-64748b?style=flat-square)
890
+ ![Comment Lines](https://img.shields.io/badge/Comment_Lines-1274-475569?style=flat-square)
891
+ ![TODO Comments](https://img.shields.io/badge/TODO_Comments-0-ca8a04?style=flat-square)
892
+
893
+ ### Python
894
+
895
+ ![Python Files](https://img.shields.io/badge/Python_Files-0-3776ab?style=flat-square)
896
+ ![Python Lines](https://img.shields.io/badge/Python_Lines-0-4b8bbe?style=flat-square)
897
+ ![Python Classes](https://img.shields.io/badge/Python_Classes-0-7c3aed?style=flat-square)
898
+ ![Python Functions](https://img.shields.io/badge/Python_Functions-0-16a34a?style=flat-square)
899
+ ![Python Protocols](https://img.shields.io/badge/Python_Protocols-0-0ea5e9?style=flat-square)
900
+ ![Python Constants](https://img.shields.io/badge/Python_Constants-0-dc2626?style=flat-square)
901
+ ![Python Imports](https://img.shields.io/badge/Python_Imports-0-0284c7?style=flat-square)
902
+ ![Python Decorators](https://img.shields.io/badge/Python_Decorators-0-db2777?style=flat-square)
903
+ ![Docstrings](https://img.shields.io/badge/Docstrings-0-6366f1?style=flat-square)
904
+ ![Docstring Lines](https://img.shields.io/badge/Docstring_Lines-0-818cf8?style=flat-square)
905
+ ![Python Comments](https://img.shields.io/badge/Python_Comments-0-64748b?style=flat-square)
906
+ ![Python Comment Lines](https://img.shields.io/badge/Python_Comment_Lines-0-475569?style=flat-square)
907
+
908
+ ### JSON
909
+
910
+ ![JSON Files](https://img.shields.io/badge/JSON_Files-4-a16207?style=flat-square)
911
+ ![JSON Lines](https://img.shields.io/badge/JSON_Lines-167-ca8a04?style=flat-square)
912
+ ![JSON Objects](https://img.shields.io/badge/JSON_Objects-38-7c3aed?style=flat-square)
913
+ ![JSON Arrays](https://img.shields.io/badge/JSON_Arrays-13-8b5cf6?style=flat-square)
914
+ ![JSON Properties](https://img.shields.io/badge/JSON_Properties-105-0284c7?style=flat-square)
915
+ ![JSON Strings](https://img.shields.io/badge/JSON_Strings-92-16a34a?style=flat-square)
916
+ ![JSON Numbers](https://img.shields.io/badge/JSON_Numbers-1-059669?style=flat-square)
917
+ ![JSON Booleans](https://img.shields.io/badge/JSON_Booleans-7-0ea5e9?style=flat-square)
918
+ ![JSON Nulls](https://img.shields.io/badge/JSON_Nulls-0-64748b?style=flat-square)
919
+ ![JSON Items](https://img.shields.io/badge/JSON_Items-42-475569?style=flat-square)
920
+ ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-151-dc2626?style=flat-square)
921
+ ![JSON Max Depth](https://img.shields.io/badge/JSON_Max_Depth-5-ea580c?style=flat-square)
922
+
923
+ ### YAML
924
+
925
+ ![YAML Files](https://img.shields.io/badge/YAML_Files-0-cb171e?style=flat-square)
926
+ ![YAML Lines](https://img.shields.io/badge/YAML_Lines-0-e34c26?style=flat-square)
927
+ ![YAML Documents](https://img.shields.io/badge/YAML_Documents-0-f97316?style=flat-square)
928
+ ![YAML Mappings](https://img.shields.io/badge/YAML_Mappings-0-7c3aed?style=flat-square)
929
+ ![YAML Sequences](https://img.shields.io/badge/YAML_Sequences-0-8b5cf6?style=flat-square)
930
+ ![YAML Keys](https://img.shields.io/badge/YAML_Keys-0-0284c7?style=flat-square)
931
+ ![YAML Scalars](https://img.shields.io/badge/YAML_Scalars-0-16a34a?style=flat-square)
932
+ ![YAML Anchors](https://img.shields.io/badge/YAML_Anchors-0-059669?style=flat-square)
933
+ ![YAML Aliases](https://img.shields.io/badge/YAML_Aliases-0-10b981?style=flat-square)
934
+ ![YAML Comments](https://img.shields.io/badge/YAML_Comments-0-64748b?style=flat-square)
935
+ ![YAML Max Depth](https://img.shields.io/badge/YAML_Max_Depth-0-ea580c?style=flat-square)
936
+
937
+ ### TOML
938
+
939
+ ![TOML Files](https://img.shields.io/badge/TOML_Files-0-9c4221?style=flat-square)
940
+ ![TOML Lines](https://img.shields.io/badge/TOML_Lines-0-b45309?style=flat-square)
941
+ ![TOML Tables](https://img.shields.io/badge/TOML_Tables-0-7c3aed?style=flat-square)
942
+ ![TOML Array Tables](https://img.shields.io/badge/TOML_Array_Tables-0-8b5cf6?style=flat-square)
943
+ ![TOML Keys](https://img.shields.io/badge/TOML_Keys-0-0284c7?style=flat-square)
944
+ ![TOML Arrays](https://img.shields.io/badge/TOML_Arrays-0-16a34a?style=flat-square)
945
+ ![TOML Comments](https://img.shields.io/badge/TOML_Comments-0-64748b?style=flat-square)
946
+
947
+ ### Shell
948
+
949
+ ![Shell Files](https://img.shields.io/badge/Shell_Files-0-89e051?style=flat-square)
950
+ ![Shell Lines](https://img.shields.io/badge/Shell_Lines-0-4eaa25?style=flat-square)
951
+ ![Shell Functions](https://img.shields.io/badge/Shell_Functions-0-16a34a?style=flat-square)
952
+ ![Shell Variables](https://img.shields.io/badge/Shell_Variables-0-0284c7?style=flat-square)
953
+ ![Shell Exports](https://img.shields.io/badge/Shell_Exports-0-ea580c?style=flat-square)
954
+ ![Shell Conditionals](https://img.shields.io/badge/Shell_Conditionals-0-7c3aed?style=flat-square)
955
+ ![Shell Loops](https://img.shields.io/badge/Shell_Loops-0-8b5cf6?style=flat-square)
956
+ ![Shell Pipelines](https://img.shields.io/badge/Shell_Pipelines-0-059669?style=flat-square)
957
+ ![Shebangs](https://img.shields.io/badge/Shebangs-0-6b7280?style=flat-square)
958
+ ![Shell Comments](https://img.shields.io/badge/Shell_Comments-0-64748b?style=flat-square)
959
+ ![Shell Comment Lines](https://img.shields.io/badge/Shell_Comment_Lines-0-475569?style=flat-square)
960
+
961
+ ### SQL
962
+
963
+ ![SQL Files](https://img.shields.io/badge/SQL_Files-0-e38c00?style=flat-square)
964
+ ![SQL Lines](https://img.shields.io/badge/SQL_Lines-0-f29111?style=flat-square)
965
+ ![SQL Statements](https://img.shields.io/badge/SQL_Statements-0-7c3aed?style=flat-square)
966
+ ![SQL Selects](https://img.shields.io/badge/SQL_Selects-0-16a34a?style=flat-square)
967
+ ![SQL Inserts](https://img.shields.io/badge/SQL_Inserts-0-22c55e?style=flat-square)
968
+ ![SQL Updates](https://img.shields.io/badge/SQL_Updates-0-0ea5e9?style=flat-square)
969
+ ![SQL Deletes](https://img.shields.io/badge/SQL_Deletes-0-dc2626?style=flat-square)
970
+ ![SQL Creates](https://img.shields.io/badge/SQL_Creates-0-0284c7?style=flat-square)
971
+ ![SQL Joins](https://img.shields.io/badge/SQL_Joins-0-8b5cf6?style=flat-square)
972
+ ![SQL CTEs](https://img.shields.io/badge/SQL_CTEs-0-059669?style=flat-square)
973
+ ![SQL Comments](https://img.shields.io/badge/SQL_Comments-0-64748b?style=flat-square)
974
+
975
+ ### HCL
976
+
977
+ ![HCL Files](https://img.shields.io/badge/HCL_Files-0-844fba?style=flat-square)
978
+ ![HCL Lines](https://img.shields.io/badge/HCL_Lines-0-a78bfa?style=flat-square)
979
+ ![HCL Blocks](https://img.shields.io/badge/HCL_Blocks-0-7c3aed?style=flat-square)
980
+ ![HCL Resources](https://img.shields.io/badge/HCL_Resources-0-0284c7?style=flat-square)
981
+ ![HCL Variables](https://img.shields.io/badge/HCL_Variables-0-16a34a?style=flat-square)
982
+ ![HCL Outputs](https://img.shields.io/badge/HCL_Outputs-0-059669?style=flat-square)
983
+ ![HCL Attributes](https://img.shields.io/badge/HCL_Attributes-0-0ea5e9?style=flat-square)
984
+ ![HCL Interpolations](https://img.shields.io/badge/HCL_Interpolations-0-db2777?style=flat-square)
985
+ ![HCL Comments](https://img.shields.io/badge/HCL_Comments-0-64748b?style=flat-square)
986
+
987
+ ### CSS
988
+
989
+ ![CSS Files](https://img.shields.io/badge/CSS_Files-0-264de4?style=flat-square)
990
+ ![CSS Lines](https://img.shields.io/badge/CSS_Lines-0-2965f1?style=flat-square)
991
+ ![CSS Rules](https://img.shields.io/badge/CSS_Rules-0-7c3aed?style=flat-square)
992
+ ![CSS Selectors](https://img.shields.io/badge/CSS_Selectors-0-8b5cf6?style=flat-square)
993
+ ![CSS Declarations](https://img.shields.io/badge/CSS_Declarations-0-0284c7?style=flat-square)
994
+ ![CSS At Rules](https://img.shields.io/badge/CSS_At_Rules-0-f97316?style=flat-square)
995
+ ![CSS Media Queries](https://img.shields.io/badge/CSS_Media_Queries-0-ea580c?style=flat-square)
996
+ ![CSS Custom Properties](https://img.shields.io/badge/CSS_Custom_Properties-0-16a34a?style=flat-square)
997
+ ![CSS Comments](https://img.shields.io/badge/CSS_Comments-0-64748b?style=flat-square)
998
+
999
+ ### Conventions
1000
+
1001
+ ![Module Files](https://img.shields.io/badge/Module_Files-5-7c3aed?style=flat-square)
1002
+ ![Service Files](https://img.shields.io/badge/Service_Files-6-0284c7?style=flat-square)
1003
+ ![Command Files](https://img.shields.io/badge/Command_Files-0-16a34a?style=flat-square)
1004
+ ![Constants Files](https://img.shields.io/badge/Constants_Files-4-ea580c?style=flat-square)
1005
+ ![Types Files](https://img.shields.io/badge/Types_Files-5-db2777?style=flat-square)
1006
+ ![Utilities Files](https://img.shields.io/badge/Utilities_Files-0-0ea5e9?style=flat-square)
1007
+ ![TypeORM Entities](https://img.shields.io/badge/TypeORM_Entities-0-059669?style=flat-square)
1008
+ ![Unit Tests](https://img.shields.io/badge/Unit_Tests-8-ca8a04?style=flat-square)
1009
+ ![Integration Tests](https://img.shields.io/badge/Integration_Tests-0-7c3aed?style=flat-square)
1010
+ ![End To End Tests](https://img.shields.io/badge/End_To_End_Tests-0-0284c7?style=flat-square)
1011
+ ![CSS Comment Budget](https://img.shields.io/badge/CSS_Comment_Budget-0-16a34a?style=flat-square)
1012
+ ![HCL Comment Budget](https://img.shields.io/badge/HCL_Comment_Budget-0-ea580c?style=flat-square)
1013
+ ![Python Comment Budget](https://img.shields.io/badge/Python_Comment_Budget-0-db2777?style=flat-square)
1014
+ ![SQL Comment Budget](https://img.shields.io/badge/SQL_Comment_Budget-0-0ea5e9?style=flat-square)
1015
+ ![TOML Comment Budget](https://img.shields.io/badge/TOML_Comment_Budget-0-059669?style=flat-square)
1016
+ ![TypeScript Comment Budget](https://img.shields.io/badge/TypeScript_Comment_Budget-0-ca8a04?style=flat-square)
1017
+ ![YAML Comment Budget](https://img.shields.io/badge/YAML_Comment_Budget-0-7c3aed?style=flat-square)
1018
+ ![Shell Comment Budget](https://img.shields.io/badge/Shell_Comment_Budget-0-0284c7?style=flat-square)
1019
+
1020
+ ### Jupyter
1021
+
1022
+ ![Notebooks](https://img.shields.io/badge/Notebooks-0-f37626?style=flat-square)
1023
+ ![Notebook Cells](https://img.shields.io/badge/Notebook_Cells-0-e8a33d?style=flat-square)
1024
+ ![Code Cells](https://img.shields.io/badge/Code_Cells-0-3776ab?style=flat-square)
1025
+ ![Markdown Cells](https://img.shields.io/badge/Markdown_Cells-0-083fa1?style=flat-square)
1026
+ ![Raw Cells](https://img.shields.io/badge/Raw_Cells-0-9ca3af?style=flat-square)
1027
+ ![Executed Cells](https://img.shields.io/badge/Executed_Cells-0-16a34a?style=flat-square)
1028
+ ![Cell Outputs](https://img.shields.io/badge/Cell_Outputs-0-059669?style=flat-square)
1029
+ ![Notebook Code Lines](https://img.shields.io/badge/Notebook_Code_Lines-0-4b8bbe?style=flat-square)
1030
+ ![Notebook Classes](https://img.shields.io/badge/Notebook_Classes-0-7c3aed?style=flat-square)
1031
+ ![Notebook Functions](https://img.shields.io/badge/Notebook_Functions-0-22c55e?style=flat-square)
1032
+ ![Notebook Imports](https://img.shields.io/badge/Notebook_Imports-0-0284c7?style=flat-square)
1033
+ ![Notebook Decorators](https://img.shields.io/badge/Notebook_Decorators-0-db2777?style=flat-square)
1034
+ ![Notebook Prose Lines](https://img.shields.io/badge/Notebook_Prose_Lines-0-1f6feb?style=flat-square)
1035
+ ![Notebook Headings](https://img.shields.io/badge/Notebook_Headings-0-a78bfa?style=flat-square)
1036
+ ![Notebook Links](https://img.shields.io/badge/Notebook_Links-0-10b981?style=flat-square)
1037
+ ![Notebook Images](https://img.shields.io/badge/Notebook_Images-0-34d399?style=flat-square)
1038
+ ![Notebook Code Blocks](https://img.shields.io/badge/Notebook_Code_Blocks-0-dc2626?style=flat-square)
1039
+ ![Notebook Properties](https://img.shields.io/badge/Notebook_Properties-0-ca8a04?style=flat-square)
1040
+ ![Notebook Nodes](https://img.shields.io/badge/Notebook_Nodes-0-a16207?style=flat-square)
1041
+ ![Notebook Max Depth](https://img.shields.io/badge/Notebook_Max_Depth-0-ea580c?style=flat-square)
1042
+
1043
+ ### Markdown
1044
+
1045
+ ![Markdown Files](https://img.shields.io/badge/Markdown_Files-1-083fa1?style=flat-square)
1046
+ ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-222-1f6feb?style=flat-square)
1047
+ ![H1](https://img.shields.io/badge/H1-1-7c3aed?style=flat-square)
1048
+ ![H2](https://img.shields.io/badge/H2-7-8b5cf6?style=flat-square)
1049
+ ![H3](https://img.shields.io/badge/H3-12-a78bfa?style=flat-square)
1050
+ ![H4](https://img.shields.io/badge/H4-0-c4b5fd?style=flat-square)
1051
+ ![H5](https://img.shields.io/badge/H5-0-ddd6fe?style=flat-square)
1052
+ ![H6](https://img.shields.io/badge/H6-0-ede9fe?style=flat-square)
1053
+ ![Paragraphs](https://img.shields.io/badge/Paragraphs-45-64748b?style=flat-square)
1054
+ ![Lists](https://img.shields.io/badge/Lists-6-16a34a?style=flat-square)
1055
+ ![List Items](https://img.shields.io/badge/List_Items-25-22c55e?style=flat-square)
1056
+ ![Task List Items](https://img.shields.io/badge/Task_List_Items-0-4ade80?style=flat-square)
1057
+ ![Tables](https://img.shields.io/badge/Tables-2-0284c7?style=flat-square)
1058
+ ![Table Rows](https://img.shields.io/badge/Table_Rows-10-0ea5e9?style=flat-square)
1059
+ ![Links](https://img.shields.io/badge/Links-9-059669?style=flat-square)
1060
+ ![Images](https://img.shields.io/badge/Images-0-10b981?style=flat-square)
1061
+ ![Code Blocks](https://img.shields.io/badge/Code_Blocks-11-dc2626?style=flat-square)
1062
+ ![Inline Code](https://img.shields.io/badge/Inline_Code-73-ef4444?style=flat-square)
1063
+ ![Block Quotes](https://img.shields.io/badge/Block_Quotes-0-ca8a04?style=flat-square)
1064
+ ![Thematic Breaks](https://img.shields.io/badge/Thematic_Breaks-0-a16207?style=flat-square)
1065
+ <!-- codometer:end -->
1066
+
1067
+ <!-- A deliberate misspelling: the example of a `--format` value nobody
1068
+ recognizes, which is exactly what this refusal is about.
1069
+ cspell:ignore mermiad -->