@codependix/cli
v0.0.42
Published
Command-line tool for exporting and validating Nx, NestJS, and file-level dependency graphs and boundaries
Maintainers
Readme
🕸️ Codependix CLI
Exports a project's dependency graphs — Nx, NestJS, and file-level imports — as JSON and Markdown diagrams, and gates the rules those graphs are judged against.
Codependix reads what each project depends on and renders it four ways: the
Nx project graph, a NestJS project's module graph, a TypeScript project's own
file-level import graph, and a Python project's own file-level import graph.
Each graph is delivered to whichever destinations
codependix.config.ts names for that project — a JSON file, a Markdown anchor
block spliced into an existing file such as a README.md, or both. The same
built graphs are then judged against whatever rules the configuration
declares — see @codependix/boundaries.
pnpm add --filter <project> --save-dev @codependix/clicodependix map --write --config projects/configuration/codependix.config.tsUsage
One command, map, and no per-graph-type subcommand. Which graphs run for a
project, where its export lands, and which rules judge it is entirely a
function of the configuration file, which every run names with --config
because nothing searches for it and there is no default; see
projects/configuration/codependix.config.ts
for this repository's own.
| Flag | Meaning |
| ---- | ------- |
| --check [check] | Fail on a comma-separated set drawn from boundaries and reports |
| --config <config> | Required. Path to the codependix configuration file. Omitting it fails the run, naming the flag; nothing is searched for |
| --dependencies | Build --check boundaries over the dependencies of the projects --projects or --tags named, reporting their findings as notes (default). No effect without --projects or --tags |
| --no-dependencies | Build --check boundaries over only the projects --projects or --tags named, not their dependencies. No effect without --projects or --tags |
| -d, --directory [directory] | Workspace root whose Nx project graph this run reads. Defaults to the working directory |
| --exclude [exclude] | Comma-separated globs overriding the configured exclude. Refused when exclude was never configured |
| --file-imports | Build, check, and write the fileImports graph type for this run |
| --no-file-imports | Skip the fileImports graph type for this run |
| -f, --format [format] | What to print to standard output, one of json and markdown (default: markdown). A graph type prints only when the run also configured a workspace destination for it, even if its own toggle flag enabled it. A --check boundaries run adds its findings, under a boundaries key in json and a Boundaries section in markdown |
| --include [include] | Comma-separated globs overriding the configured include. Refused when include was never configured |
| --json-output [jsonOutput] | Write every active graph type's data, combined into one JSON file at this path, keyed by graph type name. A type appears only when the run also configured a workspace destination for it. A --check boundaries run adds its findings under a boundaries key |
| --markdown-output [markdownOutput] | Write every active graph type's rendered diagram, combined into one Markdown file at this path. A type appears only when the run also configured a workspace destination for it. A --check boundaries run adds its findings as a Boundaries section |
| --nestjs-modules | Build, check, and write the nestjsModules graph type for this run |
| --no-nestjs-modules | Skip the nestjsModules graph type for this run |
| --nx-projects | Build, check, and write the nxProjects graph type for this run |
| --no-nx-projects | Skip the nxProjects graph type for this run |
| --projects [projects] | Comma-separated project names or roots to export for, as globs, beyond those include already selects. Also narrows the Workspace Graph to the named set, and --check boundaries to failing only on findings charged to it |
| --tags [tags] | Comma-separated Nx tags to export for, beyond what include already selects. Narrows the Workspace Graph and --check boundaries to the tagged projects, as --projects does |
| --write | Writes every configured export |
The two --check names
--check names which finding fails the run, because the two findings belong
on opposite sides of a pull request.
| --check value | What fails the run |
| --------------- | ------------------ |
| boundaries | An edge, or a cycle, breaking a declared rule |
| reports | A configured destination no longer holding what a fresh run would write |
A boundary violation is caused by the branch and fixed by the branch, so it
gates every pull request, one project at a time — see
The per-project gate. A stale export moves with the
workspace it describes and would fail every branch that changed a project
graph rather than anything the branch itself did, so it is published on the
default branch and gated nowhere. That is the same split
callidescope makes between --check depth
and --check reports, and reports is deliberately spelled the same in both:
it is the same finding, and two names for it would make the two reports
unreadable together.
--check boundariesreads no destination and writes nothing, so it leaves every committed export exactly as it found it.--write --check boundariesis legal — a boundary has no destination to be stale.--write --check reportsis refused: an export cannot be stale in the run that just wrote it.- A bare
--check, or one whose value is only separators, is refused. Read as "gate nothing" it would be a gate that cannot fail, which is worse than no gate at all because it looks like protection.
Which project a boundary finding fails
Every finding is charged to the project or projects it belongs to: a cycle to every project owning a node on it, a forbidden edge to the project owning its source, a file- or NestJS-level finding to the project whose graph it was found in, and a container that cannot boot to that container's project — its message naming the project that owns the class it failed on, when the stack shows another one.
--projects and --tags name the projects a run judges. Graphs are built
over those projects and everything they transitively depend on, and a finding
fails the run only when it is charged to a named project. One charged only to
a dependency is logged as a note, "in dependency", without failing:
the named project is built on it, but it is not that project's to fix.
--no-dependencies builds over the named projects alone. With neither flag
every project is judged. A --projects/--tags selection that matches no
project at all — a misspelled name, a tag nobody carries, or the workspace
root — is refused as a rejected command line rather than run as a gate that
judges nothing.
When no mode is named
Naming neither --check nor --write is asked about, as a three-item menu —
boundaries, reports, write.
There is no flag that turns the prompt off, because there is nothing to turn
off where it cannot be answered: a run whose stdin is not a terminal fails
immediately, naming the flag it wanted, rather than drawing a menu. That
refusal is load-bearing rather than defensive — prompts does not fail on a
non-terminal stdin. It renders the menu, never resolves, and lets the process
exit 0, which would turn a scripted run that forgot its mode flag into a
silent success that wrote nothing. Dismissing the menu at a terminal is
reported the same way, as a rejected command line rather than a crash.
No mode is ever inferred, which is the rule codometer's and
callidescope's flags follow too.
In an Nx workspace the gate is a per-project codependix-gate target, and
publishing is the one workspace-wide write run. This repository's guard-code
reaches the first on every pull request, and its release workflow runs the
second on the default branch:
nx run <project>:codependix-gate
nx run configuration:codependix:writeOne project failing — a missing anchor, or a NestJS project that fails to
boot its container — is reported and does not stop the rest: --write either
fully succeeds or names exactly which projects failed while still completing
every other one.
The per-project gate
--check boundaries --projects <name> is a gate for one project, and needs no
task runner. @codependix/nx infers it for an
Nx workspace as a cached codependix-gate target on every project but the
workspace root, so nx affected -t codependix-gate selects the projects a
change touched and a failure names the project it is charged to rather than
one workspace-wide task. The target declares no configurations, so
guard-code --configuration=check falls through to its defaults, as
callidescope-gate does.
Publishing stays workspace-wide: one --write run produces every project's
anchor blocks, which must reflect one commit, so configuration:codependix is
write-only and is not part of guard-code.
Where the output goes
Printing and delivering are separate. --format decides what reaches standard
output; the destinations under workspace in the configuration and
--json-output/--markdown-output decide what reaches a file.
Markdown is the console default because it is the one rendering that reads in a
terminal and pastes into an issue. --format json is for a machine reading
standard output, so every diagnostic goes to standard error — keeping standard
output clean and parseable as data.
The boundary report
--check boundaries logs its findings to standard error and, given
--format, --json-output, or --markdown-output, also prints them as a
report: under a boundaries key in JSON, and as a ### Boundaries section in
Markdown. A --check boundaries-only run, which exports nothing, prints just
that report; a run that also exports carries both in one document. Without one
of those flags a boundaries-only run prints nothing, and a run that also
exports prints its graphs exactly as it did before.
The JSON holds judgedProjects (the projects whose findings fail the run),
violations (level, rule, message, source, target, cycle, the
charged projects, and a verdict of fail or note) and failures
(level, error, the charged projects, an ownerProject when the failing
code belongs to another project, and a verdict). A note is a finding that
lives in a dependency of a judged project and does not fail the run. The
Markdown lists the same findings under each project they are charged to, a
note marked as not failing.
Who a finding is charged to is worked through, with the report each case prints, in four examples: a cycle, a forbidden edge, a dependent of either, and a container that cannot boot.
Packages
| Package | Role |
| ------- | ---- |
| @codependix/cli | Orchestrates the four graph builders and delivers their exports |
| @codependix/boundaries | Builds each level's graph for a workspace, judges it against the declared rules, and reports what breaks them. --check boundaries delegates to it wholesale |
| @codependix/configuration | Reads codependix.config.ts and resolves per-project export destinations and boundary rules |
| @codependix/examples | Twenty-one subjects built to be graphed, each with the guide codependix renders from it |
| @codependix/nx | Nx plugin: infers a per-project codependix-gate target that runs --check boundaries over the project and its Nx dependencies |
| @codependix/nx-projects | Builds a project's Nx Neighborhood and the whole-workspace Workspace Graph |
| @codependix/nestjs-modules | Explores a NestJS project's container and builds its module graph |
| @codependix/file-imports | Builds a project's file-level import graph — a typescript module walking its own ts.Program, and a python module parsing import/from ... import statements |
Agent skills
Agent skills for coding agents working with codependix are published in
@codependix/agents:
| Skill | Description |
| ----- | ----------- |
| codependix-export | Export dependency graphs and run boundary checks |
| codependix-configure | Configure graph types, export destinations, and boundary rules in codependix.config.ts |
| codependix-navigate | Query dependency paths and navigate package relationships |
| codependix-triage | Triage boundary violations and report drift |
Examples
Every behavior described above — and every one that is not, because it lived
only in a JSDoc comment until now — has a worked example rendered by the real
tool in
@codependix/examples:
- README — one directory per example, each readable on its own, plus configuring a first export destination and adopting codependix in a workspace with no anchor blocks anywhere yet
- AGENTS.md — a "codependix said X → open
this example" table, weighted toward the refusals and toward
--checkstaleness
Start
nx run codependix-cli:startTest
nx run codependix-cli:vitest👔 Conformetry
This project was generated from the nestjs-command-project conformetry template.
🕸️ Codependix
Dependency graphs exported by codependix, regenerated by nx run configuration:codependix:write.
Nx Neighborhood
graph LR
codependix_boundaries["codependix-boundaries"]
codependix_cli["codependix-cli"]
codependix_configuration["codependix-configuration"]
codependix_core["codependix-core"]
codependix_examples["codependix-examples"]
codependix_nx["codependix-nx"]
codependix_output["codependix-output"]
logging["logging"]
codependix_cli --> codependix_boundaries
codependix_cli --> codependix_configuration
codependix_cli --> codependix_core
codependix_cli --> codependix_output
codependix_cli --> logging
codependix_examples -.-> codependix_cli
codependix_nx --> codependix_cli
classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
class codependix_cli subjectDashed edges are dependencies Nx inferred from configuration rather than from code.
NestJS Module Graph
flowchart LR
AnchorsModule
BoundariesModule
BoundaryCheckModule
CombinedOutputModule
ConfigModule([ConfigModule])
ConfigurationModule
DeliveryModule
DiscoveryModule
FileImportsWorkspaceGraphModule
GraphRunModule
InputModule
LoggerModule([LoggerModule])
MainModule
MapModule
ModuleGraphModule
NeighborhoodModule
NestjsModulesWorkspaceGraphModule
NestjsProjectModule
OverrideResolutionModule
PathModule
PathQueryModule
ProjectGraphsModule
PythonImportsModule
PythonModule
ReportingModule
RunContextModule
TypescriptModule
WorkspaceGraphModule
WorkspaceGraphsModule
BoundaryCheckModule --> BoundariesModule
BoundaryCheckModule --> ModuleGraphModule
BoundaryCheckModule --> NeighborhoodModule
BoundaryCheckModule --> NestjsProjectModule
BoundaryCheckModule --> PythonModule
BoundaryCheckModule --> TypescriptModule
BoundaryCheckModule --> WorkspaceGraphModule
CombinedOutputModule --> AnchorsModule
CombinedOutputModule --> BoundaryCheckModule
ConfigurationModule --> InputModule
ConfigurationModule --> OverrideResolutionModule
DeliveryModule --> AnchorsModule
GraphRunModule --> NeighborhoodModule
GraphRunModule --> ProjectGraphsModule
GraphRunModule --> PythonImportsModule
GraphRunModule --> WorkspaceGraphsModule
MainModule --> DiscoveryModule
MainModule --> MapModule
MainModule --> PathModule
MapModule --> BoundaryCheckModule
MapModule --> CombinedOutputModule
MapModule --> ConfigurationModule
MapModule --> GraphRunModule
MapModule --> ReportingModule
MapModule --> RunContextModule
PathModule --> ConfigurationModule
PathModule --> PathQueryModule
PathModule --> ReportingModule
PathModule --> RunContextModule
PathQueryModule --> FileImportsWorkspaceGraphModule
PathQueryModule --> ModuleGraphModule
PathQueryModule --> NestjsModulesWorkspaceGraphModule
PathQueryModule --> NestjsProjectModule
PathQueryModule --> PythonModule
PathQueryModule --> TypescriptModule
PathQueryModule --> WorkspaceGraphModule
ProjectGraphsModule --> ConfigurationModule
ProjectGraphsModule --> DeliveryModule
ProjectGraphsModule --> ModuleGraphModule
ProjectGraphsModule --> NeighborhoodModule
ProjectGraphsModule --> NestjsProjectModule
ProjectGraphsModule --> TypescriptModule
PythonImportsModule --> ConfigurationModule
PythonImportsModule --> DeliveryModule
PythonImportsModule --> PythonModule
ReportingModule --> BoundaryCheckModule
RunContextModule --> ConfigurationModule
RunContextModule --> NeighborhoodModule
WorkspaceGraphModule --> NeighborhoodModule
WorkspaceGraphsModule --> ConfigurationModule
WorkspaceGraphsModule --> DeliveryModule
WorkspaceGraphsModule --> FileImportsWorkspaceGraphModule
WorkspaceGraphsModule --> ModuleGraphModule
WorkspaceGraphsModule --> NestjsModulesWorkspaceGraphModule
WorkspaceGraphsModule --> NestjsProjectModule
WorkspaceGraphsModule --> PythonModule
WorkspaceGraphsModule --> TypescriptModule
WorkspaceGraphsModule --> WorkspaceGraphModuleRounded modules are global: every module can inject them, so their edges are left out.
File Imports
graph LR
file_callidescope_config_ts["callidescope.config.ts"]
file_codependix_config_ts["codependix.config.ts"]
file_codometer_config_ts["codometer.config.ts"]
file_eslint_config_ts["eslint.config.ts"]
file_src_codependix_cli_constants_ts["src/codependix-cli.constants.ts"]
file_src_codependix_cli_main_end_to_end_test_ts["src/codependix-cli.main.end-to-end.test.ts"]
file_src_codependix_cli_main_ts["src/codependix-cli.main.ts"]
file_src_codependix_cli_main_unit_test_ts["src/codependix-cli.main.unit.test.ts"]
file_src_codependix_cli_module_ts["src/codependix-cli.module.ts"]
file_src_codependix_cli_repl_ts["src/codependix-cli.repl.ts"]
file_src_codependix_cli_repl_unit_test_ts["src/codependix-cli.repl.unit.test.ts"]
file_src_index_ts["src/index.ts"]
file_src_index_unit_test_ts["src/index.unit.test.ts"]
file_src_modules_map_map_command_integration_test_ts["src/modules/map/map.command.integration.test.ts"]
file_src_modules_map_map_command_ts["src/modules/map/map.command.ts"]
file_src_modules_map_map_command_unit_test_ts["src/modules/map/map.command.unit.test.ts"]
file_src_modules_map_map_constants_ts["src/modules/map/map.constants.ts"]
file_src_modules_map_map_module_ts["src/modules/map/map.module.ts"]
file_src_modules_map_map_module_unit_test_ts["src/modules/map/map.module.unit.test.ts"]
file_src_modules_map_map_types_ts["src/modules/map/map.types.ts"]
file_src_modules_path_path_command_integration_test_ts["src/modules/path/path.command.integration.test.ts"]
file_src_modules_path_path_command_ts["src/modules/path/path.command.ts"]
file_src_modules_path_path_command_unit_test_ts["src/modules/path/path.command.unit.test.ts"]
file_src_modules_path_path_constants_ts["src/modules/path/path.constants.ts"]
file_src_modules_path_path_module_ts["src/modules/path/path.module.ts"]
file_src_modules_path_path_module_unit_test_ts["src/modules/path/path.module.unit.test.ts"]
file_src_modules_path_path_types_ts["src/modules/path/path.types.ts"]
file_testing_mocks_ts["testing/mocks.ts"]
file_testing_setup_ts["testing/setup.ts"]
file_vite_config_ts["vite.config.ts"]
file_vitest_config_ts["vitest.config.ts"]
file_src_codependix_cli_main_end_to_end_test_ts --> file_src_codependix_cli_constants_ts
file_src_codependix_cli_main_ts --> file_src_codependix_cli_module_ts
file_src_codependix_cli_module_ts --> file_src_codependix_cli_constants_ts
file_src_codependix_cli_module_ts --> file_src_modules_map_map_module_ts
file_src_codependix_cli_module_ts --> file_src_modules_path_path_module_ts
file_src_codependix_cli_repl_ts --> file_src_codependix_cli_module_ts
file_src_index_unit_test_ts --> file_src_index_ts
file_src_modules_map_map_command_integration_test_ts --> file_src_codependix_cli_module_ts
file_src_modules_map_map_command_integration_test_ts --> file_src_modules_map_map_command_ts
file_src_modules_map_map_command_ts --> file_src_modules_map_map_constants_ts
file_src_modules_map_map_command_unit_test_ts --> file_src_modules_map_map_command_ts
file_src_modules_map_map_module_ts --> file_src_modules_map_map_command_ts
file_src_modules_map_map_module_unit_test_ts --> file_src_modules_map_map_command_ts
file_src_modules_map_map_module_unit_test_ts --> file_src_modules_map_map_module_ts
file_src_modules_path_path_command_integration_test_ts --> file_src_codependix_cli_module_ts
file_src_modules_path_path_command_integration_test_ts --> file_src_modules_path_path_command_ts
file_src_modules_path_path_command_integration_test_ts --> file_src_modules_path_path_types_ts
file_src_modules_path_path_command_ts --> file_src_modules_path_path_constants_ts
file_src_modules_path_path_command_ts --> file_src_modules_path_path_types_ts
file_src_modules_path_path_command_unit_test_ts --> file_src_modules_path_path_command_ts
file_src_modules_path_path_command_unit_test_ts --> file_src_modules_path_path_constants_ts
file_src_modules_path_path_module_ts --> file_src_modules_path_path_command_ts
file_src_modules_path_path_module_unit_test_ts --> file_src_modules_path_path_command_ts
file_src_modules_path_path_module_unit_test_ts --> file_src_modules_path_path_module_ts🔭 Callidescope
Call stacks traced through projects/ic-suite/codependix/codependix-cli, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
| Measure | Value | | --- | --- | | Callables | 48 | | Files | 19 | | Calls traced | 44 | | Call stacks | 19 | | Deepest stack | 15 | | Stacks through recursion | 0 | | Unfollowable calls | 2 |
Limits
What this project is judged against, as declared in its own callidescope.config.ts.
| Limit | Value |
| --- | --- |
| maximumDepth | 15 |
| maximumBreadth | 7 |
Call stacks (depth)
1. MapCommand.run — depth ≥ 15 · decorated-method
🚀 MapCommand.run(_passedParameters: string[], options?: MapCommandOptions): Promise<void> [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:479]
↳ Runs whatever the command line asked for: exports, boundaries, or both.
└─> MapCommand.runMode(…): Promise<void> [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:193]
↳ Runs the passes a resolved mode selected, and reports what they found.
└─> MapCommand.runExports(context: GraphRunContext): Promise<MapRunResult> [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:174]
↳ Runs the export pass, warning when nothing was selected.
└─> GraphRunService.run(context: GraphRunContext): Promise<MapRunResult> [projects/ic-suite/codependix/codependix-output/src/modules/graph-run/graph-run.service.ts:144]
↳ Runs every configured graph export against an already-resolved context.
└─> GraphRunService.runPythonImportGraphs(context: GraphRunContext): GraphRunOutcome [projects/ic-suite/codependix/codependix-output/src/modules/graph-run/graph-run.service.ts:266]
↳ Builds and delivers every configured Python file-level import graph export.
└─> PythonImportsService.runGraphs(context: GraphRunContext): GraphRunOutcome [projects/ic-suite/codependix/codependix-output/src/modules/python-imports/python-imports.service.ts:135]
↳ Builds and delivers every configured Python file-level import graph export.
└─> PythonImportsService.runProject(…): ProjectRunResult [projects/ic-suite/codependix/codependix-output/src/modules/python-imports/python-imports.service.ts:99]
↳ Builds, renders, and delivers one project's Python import graph.
└─> PythonService.buildGraph(project: PythonProject): PythonImportGraph [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
↳ Builds a Python project's internal file-level import Graph.
└─> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
↳ Builds a Python project's internal file-level import Graph.
└─> PythonImportGraphService.flatMap(…)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
└─> PythonImportGraphService.collectEdgesForFile(…): PythonImportGraphEdge[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
↳ Collects every internal import edge one source file declares.
└─> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
↳ Parses every module-level import statement in a Python source file.
└─> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
↳ Parses one joined statement into the module(s) it names.
└─> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
↳ Parses a joined `import <specifiers>` statement.
└─> PythonImportParserService.map(…)(modulePath: string): { level: number; modulePath: string; } [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]2. PathCommand.run — depth ≥ 12 · decorated-method
🚀 PathCommand.run(passedParameters: string[], options?: PathCommandOptions): Promise<void> [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:218]
↳ Runs the path query between two nodes across active graph levels.
└─> PathQueryService.query(args: PathQueryArguments): Promise<CombinedPathResults> [projects/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:300]
↳ Queries every enabled graph type for a connecting path between two nodes.
└─> PathQueryService.queryFileImports(args: PathQueryArguments): null | string[] [projects/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:118]
↳ Queries the file-imports workspace graph for a path between two files.
└─> PathQueryService.map(…)(project: PythonProject): PythonImportGraph [projects/ic-suite/codependix/codependix-output/src/modules/path-query/path-query.service.ts:121]
└─> PythonService.buildGraph(project: PythonProject): PythonImportGraph [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
↳ Builds a Python project's internal file-level import Graph.
└─> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
↳ Builds a Python project's internal file-level import Graph.
└─> PythonImportGraphService.flatMap(…)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
└─> PythonImportGraphService.collectEdgesForFile(…): PythonImportGraphEdge[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
↳ Collects every internal import edge one source file declares.
└─> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
↳ Parses every module-level import statement in a Python source file.
└─> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
↳ Parses one joined statement into the module(s) it names.
└─> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
↳ Parses a joined `import <specifiers>` statement.
└─> PythonImportParserService.map(…)(modulePath: string): { level: number; modulePath: string; } [projects/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]3. MapCommand.parseDirectory — depth 4 · decorated-method
🚀 MapCommand.parseDirectory(value: string | undefined): string [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:278]
↳ Parses the directory whose Nx workspace this run reads.
└─> ConfigurationService.parsePathOption(value: string | undefined): string [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:297]
↳ Parses a path option that falls back to the working directory.
└─> InputService.parsePathOption(value: string | undefined): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:87]
↳ Parses a path option that falls back to the working directory.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.4. MapCommand.parseExclude — depth 4 · decorated-method
🚀 MapCommand.parseExclude(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:294]
↳ Parses `--exclude`, a comma-separated list of globs overriding the configured `exclude`.
└─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:282]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.map(…)(entry: string): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]5. MapCommand.parseInclude — depth 4 · decorated-method
🚀 MapCommand.parseInclude(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:333]
↳ Parses `--include`, a comma-separated list of globs overriding the configured `include`.
└─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:282]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.map(…)(entry: string): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]6. PathCommand.parseDirectory — depth 4 · decorated-method
🚀 PathCommand.parseDirectory(value: string | undefined): string [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:102]
↳ Parses the directory whose Nx workspace this run reads.
└─> ConfigurationService.parsePathOption(value: string | undefined): string [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:297]
↳ Parses a path option that falls back to the working directory.
└─> InputService.parsePathOption(value: string | undefined): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:87]
↳ Parses a path option that falls back to the working directory.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.7. PathCommand.parseExclude — depth 4 · decorated-method
🚀 PathCommand.parseExclude(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:111]
↳ Parses `--exclude`, a comma-separated list of globs overriding the configured `exclude`.
└─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:282]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.map(…)(entry: string): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]8. PathCommand.parseInclude — depth 4 · decorated-method
🚀 PathCommand.parseInclude(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:143]
↳ Parses `--include`, a comma-separated list of globs overriding the configured `include`.
└─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:282]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:54]
↳ Parses a comma-separated list option, dropping blank entries.
└─> InputService.map(…)(entry: string): string [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:59]9. MapCommand.parseConfig — depth 3 · decorated-method
🚀 MapCommand.parseConfig(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:254]
↳ Parses the required configuration path from command-line input.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.10. MapCommand.parseFormat — depth 3 · decorated-method
🚀 MapCommand.parseFormat(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:318]
↳ Parses what `--format` prints to standard output.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.11. MapCommand.parseJsonOutput — depth 3 · decorated-method
🚀 MapCommand.parseJsonOutput(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:346]
↳ Parses `--json-output`, the path to write every active graph type's combined JSON data to, keyed by graph type name.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.12. MapCommand.parseMarkdownOutput — depth 3 · decorated-method
🚀 MapCommand.parseMarkdownOutput(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:359]
↳ Parses `--markdown-output`, the path to write every active graph type's combined, anchor-spliced Markdown diagram to.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.13. MapCommand.parseProjects — depth 3 · decorated-method
🚀 MapCommand.parseProjects(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:438]
↳ Parses the projects a run exports for beyond `include`. **Widening, and narrowing.** A named project is added to…
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.14. MapCommand.parseTags — depth 3 · decorated-method
🚀 MapCommand.parseTags(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:451]
↳ Parses the Nx tags a run exports for, matched exactly against a project's own tags.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.15. MapCommand.parseWrite — depth 3 · decorated-method
🚀 MapCommand.parseWrite(value: boolean | undefined): boolean [projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:461]
↳ Parses the `--write` flag from command-line input.
└─> ConfigurationService.parseFlagOption(value: boolean | undefined): boolean [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:287]
↳ Parses a valueless boolean flag, which is present or it is not.
└─> InputService.parseFlagOption(value: boolean | undefined): boolean [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:70]
↳ Parses a valueless boolean flag, which is present or it is not.16. PathCommand.parseConfig — depth 3 · decorated-method
🚀 PathCommand.parseConfig(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:92]
↳ Parses the required configuration path from command-line input.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.17. PathCommand.parseFormat — depth 3 · decorated-method
🚀 PathCommand.parseFormat(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:134]
↳ Parses what `--format` prints to standard output. Defaults to Markdown when the flag was left off entirely.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.18. PathCommand.parseProjects — depth 3 · decorated-method
🚀 PathCommand.parseProjects(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:198]
↳ Parses the projects a query searches across beyond `include`.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.19. PathCommand.parseTags — depth 3 · decorated-method
🚀 PathCommand.parseTags(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:208]
↳ Parses the Nx tags a query searches across, matched exactly against project tags.
└─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/configuration/configuration.service.ts:292]
↳ Trims an optional string option, treating blank as absent.
└─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/codependix/codependix-configuration/src/modules/input/input.service.ts:75]
↳ Trims an optional string option, treating blank as absent.Breadth
| Callable | Breadth | Calls directly | Location |
| --- | --- | --- | --- |
| MapCommand.runMode | 7 | MapCommand.resolveContext, ConfigurationService.touchesFiles, MapCommand.runExports, BoundaryCheckService.run, MapCommand.runCombinedOutput, ReportingService.reportPassOutcomes, ReportingService.reportSuccess | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:193 |
| PathCommand.run | 6 | PathCommand.validateInputs, RunContextService.build, ConfigurationService.requireConfigurationPath, PathQueryService.query, PathQueryService.render, ReportingService.reportFailure | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:218 |
| MapCommand.resolveContext | 4 | RunContextService.build, ConfigurationService.requireConfigurationPath, ReportingService.reportUnmatchedSelection, RunContextService.findUnmatchedSelection | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:116 |
| Callable | Breadth | Calls directly | Location |
| --- | --- | --- | --- |
| MapCommand.run | 4 | ConfigurationService.selectMode, CombinedOutputService.resolveFormat, MapCommand.runMode, ReportingService.reportFailure | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:479 |
| MapCommand.runCombinedOutput | 2 | MapCommand.buildBoundaryReport, CombinedOutputService.run | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:141 |
| MapCommand.runExports | 2 | GraphRunService.run, ReportingService.reportEmptySelection | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:174 |
| MapCommand.buildBoundaryReport | 1 | MapCommand.map(…) | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:89 |
| MapCommand.parseConfig | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:254 |
| MapCommand.parseDirectory | 1 | ConfigurationService.parsePathOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:278 |
| MapCommand.parseExclude | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:294 |
| MapCommand.parseFormat | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:318 |
| MapCommand.parseInclude | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:333 |
| MapCommand.parseJsonOutput | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:346 |
| MapCommand.parseMarkdownOutput | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:359 |
| MapCommand.parseProjects | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:438 |
| MapCommand.parseTags | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:451 |
| MapCommand.parseWrite | 1 | ConfigurationService.parseFlagOption | projects/ic-suite/codependix/codependix-cli/src/modules/map/map.command.ts:461 |
| PathCommand.validateInputs | 1 | PathQueryService.resolveFormat | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:56 |
| PathCommand.parseConfig | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:92 |
| PathCommand.parseDirectory | 1 | ConfigurationService.parsePathOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:102 |
| PathCommand.parseExclude | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:111 |
| PathCommand.parseFormat | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:134 |
| PathCommand.parseInclude | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:143 |
| PathCommand.parseProjects | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:198 |
| PathCommand.parseTags | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/codependix/codependix-cli/src/modules/path/path.command.ts:208 |
⏲️ Codometer
Project
Measured Targets
TypeScript
JavaScript
Python
JSON
YAML
TOML
Shell
SQL
HCL
CSS
Conventions
Jupyter
Markdown
