@codependix/nx 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 0.0.3 (2026-10-13)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - **callidescope,codependix,configuration:** 🐛 harden the codependix nx plugin for consumers outside this workspace ([#1444](https://github.com/organizzolini/codebase/pull/1444), [#1433](https://github.com/organizzolini/codebase/issues/1433))
6
+
7
+ ### 🧱 Updated Dependencies
8
+
9
+ - Updated codependix-cli to 0.0.18
10
+
1
11
  ## 0.0.2 (2026-10-13)
2
12
 
3
13
  ### 🧱 Updated Dependencies
package/README.md CHANGED
@@ -44,16 +44,19 @@ Register it in `nx.json`:
44
44
  | `configurationPath` | Where the codependix configuration lives. `codependix.config.ts`, then `configuration/codependix.config.ts`, are searched when omitted |
45
45
  | `gateTargetName` | Name of the inferred gate target. `codependix-gate` when omitted |
46
46
 
47
- The gate runs the command line under `node --import
48
- @swc-node/register/esm-register` from the workspace root, so the root must
49
- resolve `@swc-node/register` and carry a `tsconfig.json` that emits decorator
50
- metadata — the boundary check boots NestJS containers from their TypeScript
51
- sources, and constructor injection reads that metadata.
47
+ The gate runs the command line under the `@swc-node/register` hooks, which
48
+ this plugin depends on and registers itself — the workspace does not need to
49
+ install them. The workspace root does need a `tsconfig.json` that emits
50
+ decorator metadata: the hooks read it from the working directory, the
51
+ boundary check boots NestJS containers from their TypeScript sources, and
52
+ constructor injection reads that metadata.
52
53
 
53
54
  ## Usage
54
55
 
55
- The gate is inferred onto every project except the workspace root, whose
56
- dependency closure is the whole workspace:
56
+ The gate is inferred onto every project described by a `project.json`,
57
+ except the workspace root, whose dependency closure is the whole workspace. A
58
+ project Nx infers from a `package.json` alone gets no gate until it is given
59
+ a `project.json` as well.
57
60
 
58
61
  ```bash
59
62
  nx run lexico-entities:codependix-gate # one project
@@ -66,15 +69,20 @@ nx affected -t codependix-gate # only what changed
66
69
  Each gate runs, from the workspace root:
67
70
 
68
71
  ```bash
69
- node --import @swc-node/register/esm-register <@codependix/cli/main> \
72
+ node --import <file URL of @codependix/nx/loader> <@codependix/cli/main> \
70
73
  map --directory <workspaceRoot> --config <configurationPath> \
71
74
  --check boundaries --projects <project>
72
75
  ```
73
76
 
74
- The command line's entry is resolved through `@codependix/cli`'s package
75
- exports, so the same gate runs the TypeScript source inside this workspace and
76
- the built `dist/src/main.js` from an installed copy. Its output is streamed to
77
- the task as it arrives, and the task passes only when it exits zero.
77
+ `@codependix/nx/loader` registers the `@swc-node/register` hooks resolved from
78
+ this plugin's own location. The hook's own `@swc-node/register/esm-register`
79
+ would resolve them from the working directory instead — the consumer's root,
80
+ where a package manager such as pnpm does not expose this plugin's
81
+ dependencies. The loader and the command line's entry are both resolved
82
+ through package exports, so the same gate runs the TypeScript sources inside
83
+ this workspace and the built `dist/` files from an installed copy. Its output
84
+ is streamed to the task as it arrives, and the task passes only when it exits
85
+ zero.
78
86
 
79
87
  **A dependency's broken boundary is that dependency's gate's business.** The
80
88
  graphs are built over the project and everything it depends on, so a cycle
@@ -88,21 +96,76 @@ live in, the project's own `codependix.config.*`, and the codependix command
88
96
  line itself — because no judged project depends on the code that decides its
89
97
  verdict, a change to that code would otherwise replay every cached pass:
90
98
 
91
- - When `@codependix/cli` is a package of the same workspace, a
92
- `{workspaceRoot}/<package>/src/**/*` and `{workspaceRoot}/<package>/package.json`
93
- input for it and for every workspace package it reaches through
94
- `workspace:` dependencies. File globs rather than `{ "input", "projects" }`
95
- inputs, because Nx's affected computation follows `{workspaceRoot}` globs
96
- and ignores the latter — so a branch that changes the command line selects
97
- every gate.
99
+ - When `@codependix/cli` is a package of the same workspace, two
100
+ `{workspaceRoot}` inputs for it and for every workspace package it reaches
101
+ through `workspace:` dependencies: `<package>/package.json` and
102
+ `<package>/src/**/!(*.test.*|*.spec.*)` — the sources without their tests,
103
+ so a test-only edit to the command line invalidates no gate beyond that
104
+ package's own and its dependents'. File globs
105
+ rather than `{ "input", "projects" }` inputs, because Nx's affected
106
+ computation follows `{workspaceRoot}` globs and ignores the latter — so a
107
+ branch that changes the command line's sources selects every gate, and one
108
+ that changes only its tests does not. The tests are excluded inside the
109
+ glob rather than by a `!`-prefixed input, which the affected computation
110
+ ignores.
98
111
  - When it is installed from a registry, an `externalDependencies` input naming
99
112
  it and the `@codependix/*` packages it depends on, so a version bump
100
- invalidates the cache.
101
-
102
- If the command line cannot be resolved while the graph is built, those inputs
103
- are left out rather than failing the graph. The target declares no
104
- `configurations`, so an aggregator run with `--configuration=check` falls
105
- through to the defaults.
113
+ invalidates the cache. Nx hashes an external dependency together with
114
+ everything it depends on, so the `@codependix/*` packages beneath those are
115
+ covered too.
116
+ - In either case, `{workspaceRoot}/tsconfig.json` and every tsconfig it
117
+ `extends`. The loader (`@swc-node/register`) takes its compiler options —
118
+ `emitDecoratorMetadata` among them, which decides how NestJS sources
119
+ compile — from `SWC_NODE_PROJECT` or `TS_NODE_PROJECT`, else from the
120
+ `tsconfig.json` in the gate's working directory, the workspace root, and
121
+ never from a package's own. That file reaches its bases through `extends`,
122
+ so inference follows the chain much as TypeScript resolves it — a string
123
+ or an array, through every level, comments and trailing commas allowed,
124
+ `.json` appended to a path naming no file, and a bare package name taken
125
+ to its `tsconfig.json` or its `exports` (not to a `tsconfig` field in its
126
+ manifest, which is rare):
127
+ - A base in the workspace, by relative path or through a package of the
128
+ same workspace, is another `{workspaceRoot}` input. So is one that is
129
+ missing or cannot be parsed — the edit that fixes it invalidates the
130
+ gate — though what it would extend cannot be followed, and Nx's logger
131
+ warns naming it.
132
+ - A base an installed package provides, such as `@tsconfig/node24` —
133
+ named by package or by a path into `node_modules` — is named in an
134
+ `externalDependencies` input, so a version bump invalidates the cache,
135
+ but only when the root `package.json` declares the package from a
136
+ registry. Nx fails every task whose `externalDependencies` names a
137
+ package missing from its graph, so one declared only by another package,
138
+ or through `workspace:`, `file:`, `link:`, or `portal:`, is skipped with
139
+ a warning instead: declare it in the root `package.json` to have it
140
+ hashed.
141
+ - A base outside the workspace, or a package base that resolves to no file,
142
+ cannot be named by any input, and is skipped with a warning.
143
+
144
+ A `SWC_NODE_PROJECT` or `TS_NODE_PROJECT` pointing elsewhere is not
145
+ followed: add that file to the target's inputs yourself. Nor does a
146
+ gitignored base, such as a generated framework tsconfig, invalidate
147
+ anything: it is named, but Nx's file map leaves ignored files out.
148
+
149
+ Each workspace package is resolved on its own, through its entry rather than
150
+ its manifest, so one that cannot be resolved costs only its own inputs: Nx's
151
+ logger warns naming it, and every other package keeps its inputs. If the
152
+ command line itself cannot be resolved while the graph is built, the tool
153
+ inputs are left out and the warning names it — never failing the graph. The
154
+ tsconfig chain is resolved apart from the command line, so either failing
155
+ keeps the other's inputs. The
156
+ target declares no `configurations`, so an aggregator run with
157
+ `--configuration=check` falls through to the defaults.
158
+
159
+ **A gate whose `projects` or `tags` select anything other than its own project
160
+ is never replayed from the cache.** Its inputs cover its own project and that project's dependencies,
161
+ not the projects such a run judges, so a hash built from them could replay a
162
+ pass after an edit to the very project that now fails. The executor's hasher
163
+ gives such a run a hash no other run shares, whether the selection came from
164
+ the command line, the target's options, or a configuration; a gate judging
165
+ only its own project — including one whose `projects` names exactly that
166
+ project — is hashed from its inputs exactly as Nx would hash it. Because
167
+ the target has a hasher, `nx show target inputs` prints a custom-hasher
168
+ warning instead of a file list — the inputs above still decide the hash.
106
169
 
107
170
  ### Executor options
108
171
 
@@ -196,6 +259,9 @@ graph LR
196
259
  file_src_executors_gate_executor_ts["src/executors/gate/executor.ts"]
197
260
  file_src_executors_gate_executor_types_ts["src/executors/gate/executor.types.ts"]
198
261
  file_src_executors_gate_executor_unit_test_ts["src/executors/gate/executor.unit.test.ts"]
262
+ file_src_executors_gate_hasher_ts["src/executors/gate/hasher.ts"]
263
+ file_src_executors_gate_hasher_unit_test_ts["src/executors/gate/hasher.unit.test.ts"]
264
+ file_src_executors_gate_loader_unit_test_ts["src/executors/gate/loader.unit.test.ts"]
199
265
  file_src_index_ts["src/index.ts"]
200
266
  file_src_index_unit_test_ts["src/index.unit.test.ts"]
201
267
  file_src_main_module_ts["src/main.module.ts"]
@@ -208,6 +274,8 @@ graph LR
208
274
  file_src_modules_plugin_plugin_context_utilities_unit_test_ts["src/modules/plugin/plugin-context.utilities.unit.test.ts"]
209
275
  file_src_modules_plugin_plugin_inputs_utilities_ts["src/modules/plugin/plugin-inputs.utilities.ts"]
210
276
  file_src_modules_plugin_plugin_inputs_utilities_unit_test_ts["src/modules/plugin/plugin-inputs.utilities.unit.test.ts"]
277
+ file_src_modules_plugin_plugin_tsconfig_utilities_ts["src/modules/plugin/plugin-tsconfig.utilities.ts"]
278
+ file_src_modules_plugin_plugin_tsconfig_utilities_unit_test_ts["src/modules/plugin/plugin-tsconfig.utilities.unit.test.ts"]
211
279
  file_src_modules_plugin_plugin_constants_ts["src/modules/plugin/plugin.constants.ts"]
212
280
  file_src_modules_plugin_plugin_module_ts["src/modules/plugin/plugin.module.ts"]
213
281
  file_src_modules_plugin_plugin_service_ts["src/modules/plugin/plugin.service.ts"]
@@ -224,8 +292,14 @@ graph LR
224
292
  file_src_executors_gate_executor_types_ts --> file_src_modules_gate_gate_types_ts
225
293
  file_src_executors_gate_executor_unit_test_ts --> file_src_executors_gate_executor_ts
226
294
  file_src_executors_gate_executor_unit_test_ts --> file_src_modules_gate_gate_service_ts
295
+ file_src_executors_gate_hasher_ts --> file_src_modules_gate_gate_types_ts
296
+ file_src_executors_gate_hasher_ts --> file_src_modules_plugin_plugin_context_utilities_ts
297
+ file_src_executors_gate_hasher_unit_test_ts --> file_src_executors_gate_hasher_ts
298
+ file_src_executors_gate_hasher_unit_test_ts --> file_src_modules_gate_gate_service_ts
299
+ file_src_executors_gate_hasher_unit_test_ts --> file_src_modules_gate_gate_types_ts
227
300
  file_src_index_ts --> file_src_modules_plugin_plugin_context_utilities_ts
228
301
  file_src_index_ts --> file_src_modules_plugin_plugin_inputs_utilities_ts
302
+ file_src_index_ts --> file_src_modules_plugin_plugin_tsconfig_utilities_ts
229
303
  file_src_index_ts --> file_src_modules_plugin_plugin_constants_ts
230
304
  file_src_index_unit_test_ts --> file_src_index_ts
231
305
  file_src_index_unit_test_ts --> file_src_modules_plugin_plugin_service_ts
@@ -238,6 +312,7 @@ graph LR
238
312
  file_src_modules_gate_gate_service_ts --> file_src_modules_gate_gate_types_ts
239
313
  file_src_modules_gate_gate_service_ts --> file_src_modules_plugin_plugin_service_ts
240
314
  file_src_modules_gate_gate_service_unit_test_ts --> file_src_modules_gate_gate_service_ts
315
+ file_src_modules_gate_gate_service_unit_test_ts --> file_src_modules_gate_gate_types_ts
241
316
  file_src_modules_gate_gate_service_unit_test_ts --> file_src_modules_plugin_plugin_service_ts
242
317
  file_src_modules_plugin_plugin_context_utilities_ts --> file_src_main_module_ts
243
318
  file_src_modules_plugin_plugin_context_utilities_ts --> file_src_modules_gate_gate_service_ts
@@ -250,6 +325,12 @@ graph LR
250
325
  file_src_modules_plugin_plugin_inputs_utilities_ts --> file_src_modules_plugin_plugin_constants_ts
251
326
  file_src_modules_plugin_plugin_inputs_utilities_ts --> file_src_modules_plugin_plugin_types_ts
252
327
  file_src_modules_plugin_plugin_inputs_utilities_unit_test_ts --> file_src_modules_plugin_plugin_inputs_utilities_ts
328
+ file_src_modules_plugin_plugin_inputs_utilities_unit_test_ts --> file_src_modules_plugin_plugin_types_ts
329
+ file_src_modules_plugin_plugin_tsconfig_utilities_ts --> file_src_modules_plugin_plugin_inputs_utilities_ts
330
+ file_src_modules_plugin_plugin_tsconfig_utilities_ts --> file_src_modules_plugin_plugin_constants_ts
331
+ file_src_modules_plugin_plugin_tsconfig_utilities_ts --> file_src_modules_plugin_plugin_types_ts
332
+ file_src_modules_plugin_plugin_tsconfig_utilities_unit_test_ts --> file_src_modules_plugin_plugin_tsconfig_utilities_ts
333
+ file_src_modules_plugin_plugin_tsconfig_utilities_unit_test_ts --> file_src_modules_plugin_plugin_types_ts
253
334
  file_src_modules_plugin_plugin_module_ts --> file_src_modules_plugin_plugin_service_ts
254
335
  file_src_modules_plugin_plugin_service_ts --> file_src_modules_plugin_plugin_constants_ts
255
336
  file_src_modules_plugin_plugin_service_ts --> file_src_modules_plugin_plugin_types_ts
@@ -266,13 +347,13 @@ Call stacks traced through `packages/ic-suite/codependix/codependix-nx`, deepest
266
347
 
267
348
  | Measure | Value |
268
349
  | --- | --- |
269
- | Callables | 55 |
270
- | Files | 20 |
271
- | Calls traced | 59 |
272
- | Call stacks | 2 |
350
+ | Callables | 77 |
351
+ | Files | 22 |
352
+ | Calls traced | 89 |
353
+ | Call stacks | 3 |
273
354
  | Deepest stack | 6 |
274
355
  | Stacks through recursion | 0 |
275
- | Unfollowable calls | 2 |
356
+ | Unfollowable calls | 7 |
276
357
 
277
358
  ### Limits
278
359
 
@@ -288,16 +369,17 @@ What this project is judged against, as declared in its own `callidescope.config
288
369
  **1. `anonymous`** — depth ≥ 6 · orphan-root
289
370
 
290
371
  ```text
291
- 🚀 anonymous(…): Promise<CreateNodesResultArray> [packages/ic-suite/codependix/codependix-nx/src/index.ts:38]
292
- └─> resolveToolInputs(workspaceRoot: string): InferredInput[] [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:30]
372
+ 🚀 anonymous(…): Promise<CreateNodesResultArray> [packages/ic-suite/codependix/codependix-nx/src/index.ts:45]
373
+ └─> resolveToolInputs(args: ResolveToolInputsArguments): InferredInput[] [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:65]
293
374
  ↳ The cache inputs that tie a gate to the codependix command line it runs.
294
- └─> resolveWorkspaceInputs(args: { cliDirectory: string; workspaceRoot: string; }): InferredInput[] [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:130]
375
+ └─> resolveWorkspaceInputs(…): InferredInput[] [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:209]
295
376
  ↳ Globs over the sources and manifest of the command line and of every workspace package it reaches, sorted so the cache…
296
- └─> collectWorkspacePackages(args: { packageDirectory: string; visited: Set<string>; }): Set<string> [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:48]
297
- ↳ Collects a workspace package and every workspace package it depends on, development dependencies included: a package…
298
- └─> map(…)([name]: [string, unknown]): string [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:56]
299
- └─> locateDependency(args: { fromDirectory: string; name: string; }): string [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:87]
300
- ↳ Finds the real directory a package directory's dependency is linked from, through Node's own resolver — which is why…
377
+ └─> collectWorkspacePackages(cliDirectory: string): WorkspacePackages [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:103]
378
+ ↳ Collects a workspace package and every workspace package it reaches, development dependencies included: a package this…
379
+ └─> readDependencies(directory: string): [string, unknown][] [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:41]
380
+ ↳ Every dependency a package's manifest declares, in either map.
381
+ └─> readManifest(directory: string): Record<string, unknown> [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:173]
382
+ ↳ Reads a package directory's manifest, or an empty one when there is none or it cannot be parsed — which leaves that…
301
383
  ```
302
384
 
303
385
  **2. `gateExecutor`** — depth ≥ 6 · orphan-root
@@ -305,49 +387,78 @@ What this project is judged against, as declared in its own `callidescope.config
305
387
  ```text
306
388
  🚀 gateExecutor(…): Promise<{ success: boolean; }> [packages/ic-suite/codependix/codependix-nx/src/executors/gate/executor.ts:21]
307
389
  ↳ Fails one project's task when a codependix boundary finding is charged to it.
308
- └─> GateService.run(args: RunGateArguments): Promise<boolean> [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:189]
390
+ └─> GateService.run(args: RunGateArguments): Promise<boolean> [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:287]
309
391
  ↳ Runs one gate, and settles on whether it passed.
310
- └─> GateService.resolveConfigurationPath(…): string [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:143]
392
+ └─> GateService.resolveConfigurationPath(…): string [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:241]
311
393
  ↳ Resolves the configuration path one gate runs with.
312
- └─> PluginService.readRegisteredOptions(nxConfiguration: unknown): unknown [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:135]
394
+ └─> PluginService.readRegisteredOptions(nxConfiguration: unknown): unknown [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:136]
313
395
  ↳ Finds this plugin's own entry in an `nx.json` and returns its options.
314
- └─> PluginService.map(…)(entry: unknown): Record<string, unknown> [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:143]
396
+ └─> PluginService.map(…)(entry: unknown): Record<string, unknown> [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:144]
315
397
  └─> PluginService.toRecord(value: unknown): Record<string, unknown> [packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:79]
316
398
  ↳ Copies an untrusted value into a record, or an empty one.
317
399
  ```
318
400
 
401
+ **3. `gateHasher`** — depth 6 · orphan-root
402
+
403
+ ```text
404
+ 🚀 gateHasher(task: Task, context: GateHasherContext): Promise<Hash> [packages/ic-suite/codependix/codependix-nx/src/executors/gate/hasher.ts:17]
405
+ ↳ Hashes one gate task for Nx's cache.
406
+ └─> GateService.hashTask(args: HashGateTaskArguments): Promise<Hash> [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:215]
407
+ ↳ Hashes one gate task for Nx's cache — or, when it judges any project but its own, gives it a hash no run shares, so its…
408
+ └─> GateService.judgesOwnProject(args: HashGateTaskArguments): boolean [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:55]
409
+ ↳ Whether a gate task judges exactly the project it belongs to.
410
+ └─> GateService.resolveSelection(…): GateSelection [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:266]
411
+ ↳ Resolves which projects one gate judges.
412
+ └─> GateService.readNameList(value: readonly string[] | undefined): string[] [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:81]
413
+ ↳ Reads a list of names out of an executor's options.
414
+ └─> GateService.filter(…)(entry: string): boolean [packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:85]
415
+ ```
416
+
319
417
  ### Breadth
320
418
 
321
419
  | Callable | Breadth | Calls directly | Location |
322
420
  | --- | --- | --- | --- |
323
- | `anonymous` | 5 | `resolvePluginService`, `PluginService.inferTargets`, `resolveToolInputs`, `filter(…)`, `map(…)` | `packages/ic-suite/codependix/codependix-nx/src/index.ts:38` |
324
- | `PluginService.readRegisteredOptions` | 4 | `PluginService.toRecord`, `PluginService.isUnknownArray`, `PluginService.find(…)`, `PluginService.map(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:135` |
325
- | `GateService.run` | 4 | `GateService.buildCommandArguments`, `GateService.resolveSelection`, `GateService.resolveConfigurationPath`, `GateService.spawnCommandLine` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:189` |
421
+ | `resolveToolInputs` | 5 | `locatePackage`, `warnUnresolved`, `isInsideWorkspace`, `resolveWorkspaceInputs`, `resolveExternalInputs` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:65` |
422
+ | `anonymous` | 5 | `resolvePluginService`, `PluginService.inferTargets`, `resolveToolInputs`, `resolveTsconfigInputs`, `flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/index.ts:45` |
423
+ | `PluginService.readRegisteredOptions` | 4 | `PluginService.toRecord`, `PluginService.isUnknownArray`, `PluginService.find(…)`, `PluginService.map(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:136` |
326
424
 
327
425
  <details>
328
- <summary>19 more callables</summary>
426
+ <summary>32 more callables</summary>
329
427
 
330
428
  | Callable | Breadth | Calls directly | Location |
331
429
  | --- | --- | --- | --- |
332
- | `resolveToolInputs` | 4 | `locateCommandLine`, `toWorkspacePath`, `resolveExternalInputs`, `resolveWorkspaceInputs` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:30` |
333
- | `collectWorkspacePackages` | 4 | `filter(…)`, `map(…)`, `filter(…)`, `readDependencies` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:48` |
430
+ | `GateService.run` | 4 | `GateService.buildCommandArguments`, `GateService.resolveSelection`, `GateService.resolveConfigurationPath`, `GateService.spawnCommandLine` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:287` |
431
+ | `collectWorkspacePackages` | 4 | `map(…)`, `filter(…)`, `readDependencies`, `locatePackage` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:103` |
432
+ | `followExtendsChain` | 4 | `readRegistryDependencies`, `readExtends`, `resolveExtendedBase`, `warnSkipped` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:89` |
433
+ | `resolveExtendedBase` | 4 | `resolvePathBase`, `resolvePackageBase`, `isInsideWorkspace`, `readInstalledPackageName` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:204` |
334
434
  | `PluginService.selectProjectRoots` | 3 | `PluginService.filter(…)`, `PluginService.map(…)`, `PluginService.filter(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:65` |
335
- | `PluginService.inferTargets` | 3 | `PluginService.resolvePluginOptions`, `PluginService.map(…)`, `PluginService.selectProjectRoots` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:98` |
336
- | `PluginService.resolvePluginOptions` | 3 | `PluginService.toRecord`, `PluginService.readString`, `PluginService.find(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:157` |
337
- | `GateService.readNameList` | 3 | `GateService.filter(…)`, `GateService.map(…)`, `GateService.flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:52` |
338
- | `GateService.anonymous` | 3 | `GateService.on(…)`, `GateService.on(…)`, `GateService.on(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:90` |
339
- | `GateService.resolveConfigurationPath` | 3 | `PluginService.resolvePluginOptions`, `PluginService.readRegisteredOptions`, `GateService.readNxConfiguration` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:143` |
340
- | `resolveExternalInputs` | 3 | `filter(…)`, `map(…)`, `readDependencies` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:118` |
341
- | `resolveWorkspaceInputs` | 2 | `collectWorkspacePackages`, `flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:130` |
435
+ | `PluginService.inferTargets` | 3 | `PluginService.resolvePluginOptions`, `PluginService.map(…)`, `PluginService.selectProjectRoots` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:99` |
436
+ | `PluginService.resolvePluginOptions` | 3 | `PluginService.toRecord`, `PluginService.readString`, `PluginService.find(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:158` |
437
+ | `GateService.judgesOwnProject` | 3 | `GateService.readTaskOptions`, `GateService.resolveSelection`, `GateService.toNameList` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:55` |
438
+ | `GateService.readNameList` | 3 | `GateService.filter(…)`, `GateService.map(…)`, `GateService.flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:81` |
439
+ | `GateService.anonymous` | 3 | `GateService.on(…)`, `GateService.on(…)`, `GateService.on(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:143` |
440
+ | `GateService.resolveConfigurationPath` | 3 | `PluginService.resolvePluginOptions`, `PluginService.readRegisteredOptions`, `GateService.readNxConfiguration` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:241` |
441
+ | `resolveExternalInputs` | 3 | `filter(…)`, `map(…)`, `readDependencies` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:197` |
442
+ | `resolveWorkspaceInputs` | 3 | `collectWorkspacePackages`, `warnUnresolved`, `flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:209` |
443
+ | `readRegistryDependencies` | 3 | `map(…)`, `filter(…)`, `readDependencies` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:180` |
444
+ | `readDependencies` | 2 | `readManifest`, `toRecord` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:41` |
445
+ | `resolveTsconfigInputs` | 2 | `followExtendsChain`, `map(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:42` |
342
446
  | `gateExecutor` | 2 | `resolveGateService`, `GateService.run` | `packages/ic-suite/codependix/codependix-nx/src/executors/gate/executor.ts:21` |
343
- | `PluginService.map(…)` | 1 | `PluginService.toRecord` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:143` |
344
- | `GateService.spawnCommandLine` | 1 | `GateService.anonymous` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:86` |
345
- | `GateService.resolveSelection` | 1 | `GateService.readNameList` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:168` |
447
+ | `gateHasher` | 2 | `resolveGateService`, `GateService.hashTask` | `packages/ic-suite/codependix/codependix-nx/src/executors/gate/hasher.ts:17` |
448
+ | `PluginService.map(…)` | 1 | `PluginService.toRecord` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin.service.ts:144` |
449
+ | `GateService.readTaskOptions` | 1 | `GateService.toRecord` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:111` |
450
+ | `GateService.spawnCommandLine` | 1 | `GateService.anonymous` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:139` |
451
+ | `GateService.toNameList` | 1 | `GateService.filter(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:162` |
452
+ | `GateService.hashTask` | 1 | `GateService.judgesOwnProject` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:215` |
453
+ | `GateService.resolveSelection` | 1 | `GateService.readNameList` | `packages/ic-suite/codependix/codependix-nx/src/modules/gate/gate.service.ts:266` |
346
454
  | `resolveGateService` | 1 | `resolvePluginContext` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-context.utilities.ts:16` |
347
455
  | `resolvePluginService` | 1 | `resolvePluginContext` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-context.utilities.ts:23` |
348
- | `map(…)` | 1 | `locateDependency` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:56` |
349
- | `readDependencies` | 1 | `toRecord` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:101` |
350
- | `flatMap(…)` | 1 | `map(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:141` |
456
+ | `locatePackage` | 1 | `readManifest` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:145` |
457
+ | `flatMap(…)` | 1 | `map(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-inputs.utilities.ts:224` |
458
+ | `readExtends` | 1 | `filter(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:133` |
459
+ | `filter(…)` | 1 | `some(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:184` |
460
+ | `resolvePackageBase` | 1 | `flatMap(…)` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:247` |
461
+ | `warnSkipped` | 1 | `describeSkippedBase` | `packages/ic-suite/codependix/codependix-nx/src/modules/plugin/plugin-tsconfig.utilities.ts:291` |
351
462
 
352
463
  </details>
353
464
  <!-- callidescope:end -->
@@ -358,36 +469,36 @@ What this project is judged against, as declared in its own `callidescope.config
358
469
 
359
470
  ### Project
360
471
 
361
- ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-2323-22c55e?style=flat-square)
362
- ![Repository Size](https://img.shields.io/badge/Repository_Size-87.74_kB-6b7280?style=flat-square)
472
+ ![Lines of Code](https://img.shields.io/badge/Lines_of_Code-3917-22c55e?style=flat-square)
473
+ ![Repository Size](https://img.shields.io/badge/Repository_Size-140.31_kB-6b7280?style=flat-square)
363
474
  ![Folders](https://img.shields.io/badge/Folders-7-4a4a4a?style=flat-square)
364
- ![Source Files](https://img.shields.io/badge/Source_Files-29-3178c6?style=flat-square)
475
+ ![Source Files](https://img.shields.io/badge/Source_Files-35-3178c6?style=flat-square)
365
476
 
366
477
  ### TypeScript
367
478
 
368
- ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-29-3178c6?style=flat-square)
369
- ![Interfaces](https://img.shields.io/badge/Interfaces-8-0ea5e9?style=flat-square)
479
+ ![TypeScript Files](https://img.shields.io/badge/TypeScript_Files-34-3178c6?style=flat-square)
480
+ ![Interfaces](https://img.shields.io/badge/Interfaces-14-0ea5e9?style=flat-square)
370
481
  ![Generic Declarations](https://img.shields.io/badge/Generic_Declarations-0-0369a1?style=flat-square)
371
482
  ![Enums](https://img.shields.io/badge/Enums-0-f97316?style=flat-square)
372
483
  ![Decorators](https://img.shields.io/badge/Decorators-5-db2777?style=flat-square)
373
- ![Doc Comments](https://img.shields.io/badge/Doc_Comments-80-6366f1?style=flat-square)
484
+ ![Doc Comments](https://img.shields.io/badge/Doc_Comments-119-6366f1?style=flat-square)
374
485
  ![Static Methods](https://img.shields.io/badge/Static_Methods-0-166534?style=flat-square)
375
486
 
376
487
  ### JavaScript
377
488
 
378
- ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-0-f7df1e?style=flat-square)
379
- ![Test Files](https://img.shields.io/badge/Test_Files-7-10b981?style=flat-square)
380
- ![External Packages](https://img.shields.io/badge/External_Packages-13-8b5cf6?style=flat-square)
489
+ ![JavaScript Files](https://img.shields.io/badge/JavaScript_Files-1-f7df1e?style=flat-square)
490
+ ![Test Files](https://img.shields.io/badge/Test_Files-10-10b981?style=flat-square)
491
+ ![External Packages](https://img.shields.io/badge/External_Packages-14-8b5cf6?style=flat-square)
381
492
  ![Classes](https://img.shields.io/badge/Classes-5-7c3aed?style=flat-square)
382
- ![Functions](https://img.shields.io/badge/Functions-138-16a34a?style=flat-square)
383
- ![Methods](https://img.shields.io/badge/Methods-30-15803d?style=flat-square)
384
- ![Sync Functions](https://img.shields.io/badge/Sync_Functions-132-4ade80?style=flat-square)
385
- ![Async Functions](https://img.shields.io/badge/Async_Functions-36-059669?style=flat-square)
386
- ![Constants](https://img.shields.io/badge/Constants-75-dc2626?style=flat-square)
387
- ![Imports](https://img.shields.io/badge/Imports-96-0284c7?style=flat-square)
388
- ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-37-ea580c?style=flat-square)
389
- ![Comments](https://img.shields.io/badge/Comments-125-64748b?style=flat-square)
390
- ![Comment Lines](https://img.shields.io/badge/Comment_Lines-342-475569?style=flat-square)
493
+ ![Functions](https://img.shields.io/badge/Functions-208-16a34a?style=flat-square)
494
+ ![Methods](https://img.shields.io/badge/Methods-36-15803d?style=flat-square)
495
+ ![Sync Functions](https://img.shields.io/badge/Sync_Functions-199-4ade80?style=flat-square)
496
+ ![Async Functions](https://img.shields.io/badge/Async_Functions-45-059669?style=flat-square)
497
+ ![Constants](https://img.shields.io/badge/Constants-163-dc2626?style=flat-square)
498
+ ![Imports](https://img.shields.io/badge/Imports-132-0284c7?style=flat-square)
499
+ ![Exported Symbols](https://img.shields.io/badge/Exported_Symbols-53-ea580c?style=flat-square)
500
+ ![Comments](https://img.shields.io/badge/Comments-211-64748b?style=flat-square)
501
+ ![Comment Lines](https://img.shields.io/badge/Comment_Lines-511-475569?style=flat-square)
391
502
  ![TODO Comments](https://img.shields.io/badge/TODO_Comments-0-ca8a04?style=flat-square)
392
503
 
393
504
  ### Python
@@ -408,16 +519,16 @@ What this project is judged against, as declared in its own `callidescope.config
408
519
  ### JSON
409
520
 
410
521
  ![JSON Files](https://img.shields.io/badge/JSON_Files-6-a16207?style=flat-square)
411
- ![JSON Lines](https://img.shields.io/badge/JSON_Lines-219-ca8a04?style=flat-square)
412
- ![JSON Objects](https://img.shields.io/badge/JSON_Objects-51-7c3aed?style=flat-square)
522
+ ![JSON Lines](https://img.shields.io/badge/JSON_Lines-227-ca8a04?style=flat-square)
523
+ ![JSON Objects](https://img.shields.io/badge/JSON_Objects-52-7c3aed?style=flat-square)
413
524
  ![JSON Arrays](https://img.shields.io/badge/JSON_Arrays-15-8b5cf6?style=flat-square)
414
- ![JSON Properties](https://img.shields.io/badge/JSON_Properties-143-0284c7?style=flat-square)
415
- ![JSON Strings](https://img.shields.io/badge/JSON_Strings-120-16a34a?style=flat-square)
525
+ ![JSON Properties](https://img.shields.io/badge/JSON_Properties-148-0284c7?style=flat-square)
526
+ ![JSON Strings](https://img.shields.io/badge/JSON_Strings-126-16a34a?style=flat-square)
416
527
  ![JSON Numbers](https://img.shields.io/badge/JSON_Numbers-1-059669?style=flat-square)
417
528
  ![JSON Booleans](https://img.shields.io/badge/JSON_Booleans-8-0ea5e9?style=flat-square)
418
529
  ![JSON Nulls](https://img.shields.io/badge/JSON_Nulls-0-64748b?style=flat-square)
419
- ![JSON Items](https://img.shields.io/badge/JSON_Items-46-475569?style=flat-square)
420
- ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-195-dc2626?style=flat-square)
530
+ ![JSON Items](https://img.shields.io/badge/JSON_Items-48-475569?style=flat-square)
531
+ ![JSON Nodes](https://img.shields.io/badge/JSON_Nodes-202-dc2626?style=flat-square)
421
532
  ![JSON Max Depth](https://img.shields.io/badge/JSON_Max_Depth-5-ea580c?style=flat-square)
422
533
 
423
534
  ### YAML
@@ -503,9 +614,9 @@ What this project is judged against, as declared in its own `callidescope.config
503
614
  ![Command Files](https://img.shields.io/badge/Command_Files-0-16a34a?style=flat-square)
504
615
  ![Constants Files](https://img.shields.io/badge/Constants_Files-2-ea580c?style=flat-square)
505
616
  ![Types Files](https://img.shields.io/badge/Types_Files-3-db2777?style=flat-square)
506
- ![Utilities Files](https://img.shields.io/badge/Utilities_Files-2-0ea5e9?style=flat-square)
617
+ ![Utilities Files](https://img.shields.io/badge/Utilities_Files-3-0ea5e9?style=flat-square)
507
618
  ![TypeORM Entities](https://img.shields.io/badge/TypeORM_Entities-0-059669?style=flat-square)
508
- ![Unit Tests](https://img.shields.io/badge/Unit_Tests-6-ca8a04?style=flat-square)
619
+ ![Unit Tests](https://img.shields.io/badge/Unit_Tests-9-ca8a04?style=flat-square)
509
620
  ![Integration Tests](https://img.shields.io/badge/Integration_Tests-1-7c3aed?style=flat-square)
510
621
  ![End To End Tests](https://img.shields.io/badge/End_To_End_Tests-0-0284c7?style=flat-square)
511
622
  ![CSS Comment Budget](https://img.shields.io/badge/CSS_Comment_Budget-0-16a34a?style=flat-square)
@@ -543,23 +654,23 @@ What this project is judged against, as declared in its own `callidescope.config
543
654
  ### Markdown
544
655
 
545
656
  ![Markdown Files](https://img.shields.io/badge/Markdown_Files-2-083fa1?style=flat-square)
546
- ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-260-1f6feb?style=flat-square)
657
+ ![Markdown Lines](https://img.shields.io/badge/Markdown_Lines-178-1f6feb?style=flat-square)
547
658
  ![H1](https://img.shields.io/badge/H1-1-7c3aed?style=flat-square)
548
- ![H2](https://img.shields.io/badge/H2-9-8b5cf6?style=flat-square)
549
- ![H3](https://img.shields.io/badge/H3-15-a78bfa?style=flat-square)
659
+ ![H2](https://img.shields.io/badge/H2-7-8b5cf6?style=flat-square)
660
+ ![H3](https://img.shields.io/badge/H3-11-a78bfa?style=flat-square)
550
661
  ![H4](https://img.shields.io/badge/H4-0-c4b5fd?style=flat-square)
551
662
  ![H5](https://img.shields.io/badge/H5-0-ddd6fe?style=flat-square)
552
663
  ![H6](https://img.shields.io/badge/H6-0-ede9fe?style=flat-square)
553
- ![Paragraphs](https://img.shields.io/badge/Paragraphs-51-64748b?style=flat-square)
554
- ![Lists](https://img.shields.io/badge/Lists-9-16a34a?style=flat-square)
555
- ![List Items](https://img.shields.io/badge/List_Items-28-22c55e?style=flat-square)
664
+ ![Paragraphs](https://img.shields.io/badge/Paragraphs-31-64748b?style=flat-square)
665
+ ![Lists](https://img.shields.io/badge/Lists-8-16a34a?style=flat-square)
666
+ ![List Items](https://img.shields.io/badge/List_Items-20-22c55e?style=flat-square)
556
667
  ![Task List Items](https://img.shields.io/badge/Task_List_Items-0-4ade80?style=flat-square)
557
- ![Tables](https://img.shields.io/badge/Tables-2-0284c7?style=flat-square)
558
- ![Table Rows](https://img.shields.io/badge/Table_Rows-10-0ea5e9?style=flat-square)
559
- ![Links](https://img.shields.io/badge/Links-11-059669?style=flat-square)
668
+ ![Tables](https://img.shields.io/badge/Tables-0-0284c7?style=flat-square)
669
+ ![Table Rows](https://img.shields.io/badge/Table_Rows-0-0ea5e9?style=flat-square)
670
+ ![Links](https://img.shields.io/badge/Links-14-059669?style=flat-square)
560
671
  ![Images](https://img.shields.io/badge/Images-0-10b981?style=flat-square)
561
- ![Code Blocks](https://img.shields.io/badge/Code_Blocks-11-dc2626?style=flat-square)
562
- ![Inline Code](https://img.shields.io/badge/Inline_Code-89-ef4444?style=flat-square)
672
+ ![Code Blocks](https://img.shields.io/badge/Code_Blocks-4-dc2626?style=flat-square)
673
+ ![Inline Code](https://img.shields.io/badge/Inline_Code-51-ef4444?style=flat-square)
563
674
  ![Block Quotes](https://img.shields.io/badge/Block_Quotes-0-ca8a04?style=flat-square)
564
675
  ![Thematic Breaks](https://img.shields.io/badge/Thematic_Breaks-0-a16207?style=flat-square)
565
676
  <!-- codometer:end -->