npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@conformetry/cli

v0.0.33

Published

Command-line toolchain for scaffolding code from templates and holding implementations to them

Readme

👔 Conformetry

npm

Scaffold from a template, then hold the result to it.

Conformetry is a code generation toolchain whose templates keep working after generation. The same template folder that produces a new module is the specification that module is later checked against, so scaffolding conventions and enforcing them are one artifact instead of two that drift apart.

npm install --save-dev @conformetry/cli
# Scaffold a new module from the `nestjs-service-module` template
conformetry generate --config projects/configuration/conformetry.config.ts --template nestjs-service-module --name billing

# Check every existing instance still matches the template it came from
conformetry validate --config projects/configuration/conformetry.config.ts

Why

Scaffolding tools stop caring the moment the files are written. A month later a module has lost its constants.ts, a service dropped its section comments, and nobody notices until someone reads it. Linters can't help — the convention isn't a rule about syntax, it's a rule about the shape of a template that only exists in a generator's output directory.

Conformetry closes the loop. Templates are rendered twice: once to create files, and again — with the same substitutions, by the same renderer — to compare against the files that already exist. A file that would not be regenerated the way it is written today is a finding.

Comparison is structural, not textual. A TypeScript instance is compared as a syntax tree, markdown as an mdast tree, Python through Python's own ast module. Reformatting a file, renaming a local, or adding a method does not fail validation; deleting a required export, dropping a declared file, or losing a section comment does.

Install

| Package | Install when | | ------- | ------------ | | @conformetry/cli | You want the conformetry command | | @conformetry/nx | Your workspace is an Nx monorepo | | @conformetry/generation + @conformetry/validation | You are embedding conformetry in your own tool |

npm install --save-dev @conformetry/cli
# or
pnpm add --save-dev @conformetry/cli

Node.js 20 or newer. Validating Python or Jupyter instances additionally needs python3 on PATH — the Python validator compares through the interpreter's own ast module rather than reimplementing a parser.

Commands

conformetry generate

Renders one template folder into a target directory.

| Flag | Purpose | | ---- | ------- | | --template [name] | Which template from the registry to render. Asked for when omitted | | --config <path> | Configuration file to read. Required: the run is refused without it, and no filename is searched for | | --directory [path] | Where to write the rendered files. Required: the run is refused without it |

A blank --config is refused by @conformetry/configuration with a ConfigurationPathRequiredError naming the --config flag; commander refuses a missing one before that.

A template's own inputs are passed as flags alongside these:

conformetry generate --config projects/configuration/conformetry.config.ts --template react-component --name search-bar

Omitting --template at a terminal offers a picker — an autocomplete over every configured template, each shown with its description, filtering as you type. A name like nestjs-service-module is long by design, and typing service is what makes it cheap to reach; nobody has to break off and run conformetry templates to look one up. Passing --template skips the picker entirely, because supplying a value is itself how a caller opts out of being asked.

With no terminal, a missing template is refused — listing every available name — rather than waited on, so a CI job fails immediately instead of hanging until it times out.

--generator was removed rather than kept as an alias, and passing it is refused by name. Unknown flags are accepted here so a template's own inputs can be passed as flags, which means commander would otherwise read --generator as an input nothing declares and drop it silently — the "appears to work" the rename set out to avoid.

Unknown flags are accepted deliberately. Which inputs exist is not known until the template is chosen, so they are matched against that template's schema rather than declared ahead of time. This is also why the template is selected with --template and not --name: almost every template takes a name, and reserving that flag would leave no way to supply it.

Missing inputs are prompted for whenever stdin is a terminal, and there is no flag to turn that off — an attached terminal is the whole condition, so a script, a hook, or a CI job is never prompted.

Every input a template declares is required. A template substitutes each of its placeholders, and mustache renders a missing one as an empty string rather than failing, so an optional input would quietly produce a hole in the generated file. nx g conformetry:<template> has always taken that line; this command now does too, so the same template asks for the same values whichever way it is run.

With no terminal, a missing input is therefore refused — naming the flag to pass — and the run exits non-zero. That refusal is the load-bearing half. prompts does not fail on a non-terminal stdin: it draws its menu, never resolves, and lets the process exit 0 having generated nothing, which is how this command used to hang in CI. It now asserts a terminal before prompting at all and reports a rejected command line instead.

conformetry templates

Names every template the loaded configuration declares, with its description and folder. generate and validate both offer that list as a picker now, so this command is for reading it rather than for looking a name up before typing one.

| Flag | Purpose | | ---- | ------- | | --config <path> | Configuration file to read. Required | | --instances [globs] | Comma-separated paths or globs; report only the templates that explain them | | --json | Write the listing as JSON |

With --instances it answers the other direction — which templates explain a given path:

conformetry templates --config projects/configuration/conformetry.config.ts --instances packages/billing/src/modules/billing
  nestjs-service-module (nsm)
    Generate a NestJS service module
    Template: projects/configuration/conformetry-templates/nestjs-service-module
    Instances:
      packages/billing/src/modules/billing 5/5 files 100%
  nestjs-command-module (ncm)
    Generate a NestJS command module
    Template: projects/configuration/conformetry-templates/nestjs-command-module
    Instances:
      packages/billing/src/modules/billing 3/5 files 60%

Every template that explains the path is listed, because a path can belong to more than one. Nothing records where an instance came from — attribution is inferred from how much of a template's structure the path already has — so a single verdict would hide the tie that makes an ambiguous instance ambiguous.

A bare listing omits the instances; they appear only when you narrow by path, so the registry stays readable.

conformetry instances

Lists every instance the configured globs find, and which templates explain each one. The complement of the command above: that one asks what standard a path answers to, this one asks what generated code exists.

conformetry instances --config projects/configuration/conformetry.config.ts --templates nestjs-service-module
  packages/billing/src/modules/billing
    Templates:
      nestjs-service-module 5/5 files 100%

| Flag | Purpose | | ---- | ------- | | --config <path> | Configuration file to read. Required | | --json | Write the listing as JSON | | --templates [names] | Comma-separated template names; report only the instances they explain |

Each path printed is usable as the --instances argument above, so the two compose without reformatting. --templates is how you find every instance a template change would affect.

Note that instances located by project tags rather than globs are invisible here: tag resolution belongs to the Nx plugin, and the command-line host locates instances by glob alone.

conformetry validate

Expands the configured instance globs and compares everything it finds against the template it was generated from.

| Flag | Purpose | | ---- | ------- | | --config <path> | Configuration file to read. Required | | --instances [globs] | Comma-separated globs to validate, overriding the configuration | | --languages [names] | Comma-separated languages to run — typescript, markdown, python, json, jupyter, text | | --templates [names] | Comma-separated template names to narrow the run to, or all for every one | | --threshold [ratio] | Lowest conformance score an instance may have, 0 to 1. The weakest of the three threshold levels |

Every flag but --config is optional; an absent filter means "everything". The command exits non-zero when any instance scores below its threshold, which is what makes it usable as a pre-merge gate.

--templates and --instances are two independent filters, and a run is their intersection — each removes candidates from one side before templates and instances are paired:

| --instances | --templates | What is validated | | ------------- | ------------- | ----------------- | | absent | all, or absent with no terminal | Every template against every configured instance | | present | all, or absent with no terminal | The globbed instances against every applicable template | | absent | named | Every instance belonging to those templates, against them | | present | named | The globbed instances narrowed to those templates' instances |

Omitting --templates at a terminal offers the same picker generate does, ticking more than one, with all offered alongside the names. With no terminal it falls back to every template rather than asking — which is exactly what an invocation predating this flag already did, so scripts and CI jobs are unaffected. all is reserved: a configuration cannot declare a template of that name.

A template whose instances are scoped by project tags cannot be located by this host, and a narrowed run says so rather than reporting nothing found. A group carrying tags reads its globs inside each project the tags select, so src/modules/* has no meaning until a project root is joined to it — which only a host with a project graph can do. Such a group is left out rather than expanded from the working directory, where it would match whatever happened to sit at the same relative path and measure it against a template scoped to other projects. Run those through @conformetry/nx, or pass --instances with the paths to check.

Naming a template that does not exist is refused, listing the real names, rather than silently narrowing to nothing. A selection that matches no instances is reported as "no instances belong to …" rather than as a clean report, so "nothing to check" can be told apart from "everything checks out".

Scoring

Validation reports how much of its template an instance honours, not just whether it does. Every template element the comparison weighs is one requirement, and a missing element costs the whole subtree it stood for — so deleting a class costs far more than dropping an import, without anyone maintaining a table of weights.

The same three numbers — met, total, percentage — are reported at every level:

Conformance scores:
  ✗ projects/logging/src/modules/logger (nestjs-service-module) — 149/151 requirements met (98.7%), below threshold 100.0%
  ✗ projects/logging/src/modules/logger/logger (nestjs-service-file) — 108/109 requirements met (99.1%), below threshold 100.0%
  Total — 257/260 requirements met (98.8%) across 2 instance(s), 2 below threshold

  1. file: logger.types.ts — 1/2 requirements met (50.0%)
     Instance: projects/logging/src/modules/logger/logger.types.ts
     Template: projects/configuration/conformetry-templates/nestjs-service-module/{{nameKebabCase}}/{{nameKebabCase}}.types.ts

     1. Missing comment // 🏷️ Types
        Template: Line 1, Column 1
        Expected: `// 🏷️ Types`
        Weight  : 1 of the 2 requirements in this file
        Fix     : Add the comment // 🏷️ Types to the instance file.

| Level | Answers | | ----- | ------- | | File | How much of this file drifted — a small file can lose half of itself to one finding | | Instance | Whether this instance clears its threshold; this is the level thresholds apply to | | Total | How the whole run did, across every instance/template pair |

The fraction is printed alongside the percentage because a percentage hides its own scale: 99.3% reads the same whether one requirement of 151 went missing or thirty of four thousand did, and only the first is a five-minute fix.

The total is counted in instance/template pairs rather than files. A file governed by two templates owes both of them, so its requirements genuinely count once per template.

A finding that stands in for more than itself says so, which is what tells the expensive drift from the trivial — a missing class carries the weight of every member it held.

An instance must score at or above its threshold to pass. The default is 1 — a perfect match, which is what conformetry has always demanded — so adding scoring changes nothing until a threshold is lowered deliberately.

Three levels set it, narrowest first:

| Level | Where | Applies to | | ----- | ----- | ---------- | | Instance group | instances[].threshold | Only the paths that group's globs locate | | Generator | threshold on the generator | Every instance of that template | | Run | --threshold | Every instance the run touches |

That is what makes introducing a template bearable. A new template can be adopted with the directory still being migrated held to 0.75 while every other instance of it stays strict, instead of having to bring the whole workspace over in one change.

Findings print either way. A lowered threshold is permission to ship the drift, not a reason to stop showing it.

Differences are grouped by file and each one carries the location on both sides — where the instance is wrong and where the template says so — plus the expected value and a concrete fix:

1. file: billing.service.ts
   Instance: packages/billing/src/modules/billing/billing.service.ts
   Template: projects/configuration/conformetry-templates/nestjs-service-module/…

   1. Missing required comment
      Instance: line 24
      Template: line 31
      Expected: `// 🌎 Public Methods`
      Fix     : Add the `// 🌎 Public Methods` section comment above the first public method.

The fix field is the point of the format: reports are meant to be actionable by whoever — or whatever — has to make the file conform.

Configuration

A single conformetry.config.ts declares every generator: the template folder it renders, the inputs it takes, and the paths its output already occupies.

import { type ConformetryConfiguration } from "@conformetry/configuration";

const conformetryConfiguration: ConformetryConfiguration = [
  {
    description: "Generate a NestJS service module",
    inputs: {
      name: { description: "Module name in kebab-case", type: "string" },
    },
    instances: [{ patterns: ["packages/*/src/modules/*"] }],
    name: "nestjs-service-module",
    templatePath: "templates/nestjs-service-module",
  },
];

export default conformetryConfiguration;

instances is what makes validation possible: it says where this generator's output already lives, so validation knows what to check without being told twice. The full field reference — instance groups, tag selectors, input schemas, discovery, and the supported file formats — is in @conformetry/configuration.

Templates

A template is an ordinary folder of ordinary files. Both file contents and file paths are rendered with mustache, so a folder named {{nameKebabCase}} becomes billing and a file named {{namePascalCase}}.tsx becomes SearchBar.tsx:

templates/nestjs-service-module/
└── {{nameKebabCase}}/
    ├── {{nameKebabCase}}.constants.ts
    ├── {{nameKebabCase}}.module.ts
    ├── {{nameKebabCase}}.service.ts
    ├── {{nameKebabCase}}.service.unit.test.ts
    └── {{nameKebabCase}}.types.ts

Every generator's name input is expanded into four case variants automatically, so a template never has to case-convert by hand:

| Placeholder | search bar becomes | | ----------- | -------------------- | | {{nameCamelCase}} | searchBar | | {{nameKebabCase}} | search-bar | | {{namePascalCase}} | SearchBar | | {{nameSnakeCase}} | search_bar |

An explicit input of the same name always wins over the derived variant. Full mustache is available — sections, inverted sections, partials — with HTML escaping disabled so substituted values cannot corrupt source code.

Supply every placeholder a template uses when generating. An interpolated placeholder nobody supplied fails generate with MissingSubstitutionError, naming the placeholder and the template file. Mustache would otherwise render it as an empty string. validate instead reads the value from the instance — the text where the template first uses the placeholder — and reports Could not infer {{…}} when nothing there reveals it.

Sections are the exception, and are how a template asks for something optional: {{#owner}}Owner: {{owner}}{{/owner}} renders nothing when owner is absent, rather than refusing.

Validators

Which validator handles a file is decided by its extension, and only the packages a run actually needs are loaded.

| Validator | Extensions | Compares | | --------- | ---------- | -------- | | typescript | .ts, .tsx | Syntax tree structure and required section comments | | markdown | .md | mdast structure — headings, lists, tables — rather than prose | | python | .py | Structure via Python's own ast module | | json | .json, .jsonc | Key structure and values | | jupyter | .ipynb | Notebook envelope, delegating cells to the markdown and Python validators | | text | everything else | Duplicate-aware line conformance — the floor, so no extension goes unchecked |

Before any of them runs, every file the template declares is checked to exist. That pass covers extensions no validator claims — .gitignore, .env.default, pyproject.toml — which would otherwise be deletable without failing anything. A missing directory is reported once rather than as twenty missing files.

A template comment containing TODO is treated as a prompt rather than text to copy, so any instance comment satisfies it.

Nx workspaces

@conformetry/nx is a second host over the same runtime. It adds two things the standalone CLI cannot offer:

  • A conformetry-validate target inferred onto every project that holds instances, so validation is cached and participates in nx affected.
  • Generators addressed by name — nx g conformetry:nestjs-service-module — with Nx prompting for inputs and writing through its virtual Tree.

Because which generators exist is a property of your configuration rather than of the package, the plugin exposing them is emitted at install time rather than shipped:

{ "scripts": { "postinstall": "conformetry-nx-bootstrap-generators" } }

Instance groups may additionally select projects by Nx tag, with their globs read inside each matching project:

instances: [{ patterns: ["src/modules/*"], tags: ["framework:nestjs"] }];

Packages

Conformetry is deliberately split so that embedding it does not mean depending on a CLI. @conformetry/core is the leaf — it depends on nothing else in the graph — and every other package declares exactly which siblings it may import.

Hosts

| Package | Role | | ------- | ---- | | @conformetry/cli | The conformetry command: expands globs, prompts for inputs, prints reports | | @conformetry/nx | Nx plugin: inferred validation targets, tag-scoped instances, emitted generators |

Runtime

| Package | Role | | ------- | ---- | | @conformetry/core | Contracts leaf: the structured difference shape, the score, the inventory, and the language validator contract | | @conformetry/configuration | Config loading, template discovery, instance matching, input resolution, placeholder rendering | | @conformetry/generation | The generator lifecycle, rendering each template through the configuration layer | | @conformetry/validation | Validation orchestration, language routing, finding deduplication | | @conformetry/languages | Every Language module, the facade that resolves extensions to them, the existence check for every declared file, and the difference and scoring primitives they share | | @conformetry/output | Every render target: the validation report and the template and instance inventory |

Languages

@conformetry/languages holds one module per Language, all reached through its single LanguagesModule facade rather than as separate packages.

| Module | Extensions | | ------ | ---------- | | typescript | .ts, .tsx | | markdown | .md | | python | .py | | json | .json, .jsonc | | jupyter | .ipynb | | text | the fallback for everything else |

Nothing depends on @conformetry/cli. Embedding conformetry means depending on the runtime packages directly — the CLI is one host among others, and holds no logic of its own.

Embedding

Both runtimes are NestJS providers, so a host wires them the way it wires anything else:

import { GenerationService } from "@conformetry/generation";

const result = await generationService.runGenerator({
  definition: {
    name: "nestjs-service-module",
    templateDirectoryPath: "templates/nestjs-service-module",
  },
  inputs: { name: "billing" },
  instancePath: "packages/billing/src/modules",
});

Filesystem and formatter access go through adapters, which is how @conformetry/nx reuses this runtime unchanged against a virtual Tree. Rendering deliberately is not an adapter: validation must substitute exactly as generation does, or validation would flag the files the generator itself produced.

Agent skills

Agent skills for coding agents working with conformetry are published in @conformetry/agents:

| Skill | Description | | ----- | ----------- | | conformetry-generate | Scaffold code from templates using conformetry generators | | conformetry-configure | Configure generators, templates, and validation rules in conformetry.config.ts | | conformetry-validate | Run structural conformance checks against templates |

Examples

Worked examples and sandboxes are in @conformetry/examples — eleven self-contained examples covering template authoring, case variants, structural comparison, drift detection, and Nx integration. An agent arriving from a conformance report can use AGENTS.md to find the example that explains each finding.

Start

Run the CLI from source:

nx run conformetry-cli:start

Pass a subcommand and its flags after --:

nx run conformetry-cli:start -- validate --config projects/configuration/conformetry.config.ts --languages typescript

Test

nx run conformetry-cli:vitest

Build

nx run conformetry-cli:build

License

MIT — see LICENSE.

👔 Conformetry

This project was generated from the nestjs-command-project conformetry template.

🔭 Callidescope

Call stacks traced through projects/ic-suite/conformetry/conformetry-cli, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.

| Measure | Value | | --- | --- | | Callables | 61 | | Files | 27 | | Calls traced | 75 | | Call stacks | 16 | | Deepest stack | 15 | | Stacks through recursion | 0 | | Unfollowable calls | 4 |

Limits

What this project is judged against, as declared in its own callidescope.config.ts.

| Limit | Value | | --- | --- | | maximumDepth | 15 | | maximumBreadth | 9 |

Call stacks (depth)

1. InstancesCommand.run — depth ≥ 15 · decorated-method

🚀 InstancesCommand.run(_passedParameters: string[], options: InstancesCommandOptions): Promise<void> [projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:91]
   ↳ Writes every instance found, filtered to the given templates.
  └─> ConfigurationService.resolveInventoriedInstances(…): InventoriedInstance[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:368]
     ↳ Lists every instance found, paired with the templates that explain it.
    └─> InstanceDiscoveryService.resolveInventoriedInstances(args: ResolveInventoryArguments): InventoriedInstance[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:219]
       ↳ Lists every instance found, paired with the templates that explain it. `templateNames` narrows the pairing rather than…
      └─> InstanceDiscoveryService.takeInventory(…): { templates: TemplateDefinition[]; weighed: { instance: Instance; pairings: InventoriedPairing[]; }[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:283]
         ↳ Weighs every instance the globs find against every declared template.
        └─> InstanceDiscoveryService.map(…)(instance: Instance): { instance: Instance; pairings: InventoriedPairing[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:295]
          └─> InstanceDiscoveryService.weighInstance(…): { instance: Instance; pairings: InventoriedPairing[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:84]
             ↳ Weighs one instance against every template, best fit first.
            └─> InstanceDiscoveryMatchingService.matchTemplates(…): TemplateMatch[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:180]
               ↳ Weighs every template that shares at least one file with the instance, best-first.
              └─> InstanceDiscoveryMatchingService.map(…)(…): { matchedFileCount: number; matchRatio: number; template: TemplateDefinition; placeholderValues: Substitutions; substitutions: Substitutions; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:186]
                └─> TemplateDiscoveryService.countMatchingFiles(…): number [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:146]
                   ↳ Counts how many of a template's files the instance path already has.
                  └─> TemplateDiscoveryService.filter(…)(templateFilePath: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:155]
                    └─> TemplateDiscoveryService.resolveInstanceFilePath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:204]
                       ↳ Maps a template file path to the instance file path it governs.
                      └─> RenderingService.renderPath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:142]
                         ↳ Renders a template path with mustache, the same way contents are rendered.
                        └─> RenderingService.assertEverySubstitutionSupplied(…): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:35]
                           ↳ Refuses to render a template asking for a value nobody supplied.
                          └─> RenderingService.collectInterpolatedNames(template: string): string[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:80]
                             ↳ Every placeholder a template interpolates, deduplicated.
                            └─> RenderingService.walk(spans: TemplateSpans): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:82]

2. TemplatesCommand.run — depth ≥ 15 · decorated-method

🚀 TemplatesCommand.run(_passedParameters: string[], options: TemplatesCommandOptions): Promise<void> [projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:92]
   ↳ Writes every declared template, filtered to the given instances.
  └─> ConfigurationService.resolveInventoriedTemplates(…): InventoriedTemplate[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:375]
     ↳ Lists every template declared, paired with the instances it explains.
    └─> InstanceDiscoveryService.resolveInventoriedTemplates(args: ResolveInventoryArguments): InventoriedTemplate[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:244]
       ↳ Lists every template declared, paired with the instances it explains. `instancePatterns` narrows which instances are…
      └─> InstanceDiscoveryService.takeInventory(…): { templates: TemplateDefinition[]; weighed: { instance: Instance; pairings: InventoriedPairing[]; }[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:283]
         ↳ Weighs every instance the globs find against every declared template.
        └─> InstanceDiscoveryService.map(…)(instance: Instance): { instance: Instance; pairings: InventoriedPairing[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:295]
          └─> InstanceDiscoveryService.weighInstance(…): { instance: Instance; pairings: InventoriedPairing[]; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:84]
             ↳ Weighs one instance against every template, best fit first.
            └─> InstanceDiscoveryMatchingService.matchTemplates(…): TemplateMatch[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:180]
               ↳ Weighs every template that shares at least one file with the instance, best-first.
              └─> InstanceDiscoveryMatchingService.map(…)(…): { matchedFileCount: number; matchRatio: number; template: TemplateDefinition; placeholderValues: Substitutions; substitutions: Substitutions; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:186]
                └─> TemplateDiscoveryService.countMatchingFiles(…): number [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:146]
                   ↳ Counts how many of a template's files the instance path already has.
                  └─> TemplateDiscoveryService.filter(…)(templateFilePath: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:155]
                    └─> TemplateDiscoveryService.resolveInstanceFilePath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:204]
                       ↳ Maps a template file path to the instance file path it governs.
                      └─> RenderingService.renderPath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:142]
                         ↳ Renders a template path with mustache, the same way contents are rendered.
                        └─> RenderingService.assertEverySubstitutionSupplied(…): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:35]
                           ↳ Refuses to render a template asking for a value nobody supplied.
                          └─> RenderingService.collectInterpolatedNames(template: string): string[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:80]
                             ↳ Every placeholder a template interpolates, deduplicated.
                            └─> RenderingService.walk(spans: TemplateSpans): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:82]

3. ValidateCommand.run — depth ≥ 14 · decorated-method

🚀 ValidateCommand.run(_passedParameters: string[], options: ValidateCommandOptions): Promise<void> [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:369]
   ↳ Runs validation and reports every difference found.
  └─> ValidationService.validate(args: RunValidationArguments): RunValidationResult [projects/ic-suite/conformetry/conformetry-validation/src/modules/validation/validation.service.ts:194]
     ↳ Validates every instance and returns the differences found.
    └─> ConfigurationService.matchInstances(…): ResolvedInstances [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:264]
       ↳ Resolves every instance to the template, or templates, that explain it.
      └─> InstanceDiscoveryService.matchInstances(…): ResolvedInstances [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery.service.ts:123]
         ↳ Resolves every instance to the template, or templates, that explain it.
        └─> InstanceDiscoveryMatchingService.matchInstances(…): ResolvedInstances [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:118]
           ↳ Resolves every instance to the template — or templates — that explain it.
          └─> InstanceDiscoveryMatchingService.matchTemplates(…): TemplateMatch[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:180]
             ↳ Weighs every template that shares at least one file with the instance, best-first.
            └─> InstanceDiscoveryMatchingService.map(…)(…): { matchedFileCount: number; matchRatio: number; template: TemplateDefinition; placeholderValues: Substitutions; substitutions: Substitutions; } [projects/ic-suite/conformetry/conformetry-configuration/src/modules/instance-discovery/instance-discovery-matching.service.ts:186]
              └─> TemplateDiscoveryService.countMatchingFiles(…): number [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:146]
                 ↳ Counts how many of a template's files the instance path already has.
                └─> TemplateDiscoveryService.filter(…)(templateFilePath: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:155]
                  └─> TemplateDiscoveryService.resolveInstanceFilePath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/template-discovery/template-discovery.service.ts:204]
                     ↳ Maps a template file path to the instance file path it governs.
                    └─> RenderingService.renderPath(…): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:142]
                       ↳ Renders a template path with mustache, the same way contents are rendered.
                      └─> RenderingService.assertEverySubstitutionSupplied(…): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:35]
                         ↳ Refuses to render a template asking for a value nobody supplied.
                        └─> RenderingService.collectInterpolatedNames(template: string): string[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:80]
                           ↳ Every placeholder a template interpolates, deduplicated.
                          └─> RenderingService.walk(spans: TemplateSpans): void [projects/ic-suite/conformetry/conformetry-configuration/src/modules/rendering/rendering.service.ts:82]

4. GenerateCommand.run — depth ≥ 11 · decorated-method

🚀 GenerateCommand.run(passedParameters: string[], options: GenerateCommandOptions): Promise<void> [projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:292]
   ↳ Renders the template, reporting a refused command line as one.
  └─> GenerateCommand.generate(…): Promise<void> [projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:65]
     ↳ Resolves the template's inputs and writes its files.
    └─> ConfigurationService.resolveGeneratorInputs(args: ResolveGeneratorInputsArguments): Promise<Record<string, string>> [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:356]
       ↳ Resolves generator inputs from raw command-line arguments.
      └─> InputService.resolveGeneratorInputs(args: ResolveGeneratorInputsArguments): Promise<Record<string, string>> [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:180]
         ↳ Resolves generator inputs from raw command-line arguments.
        └─> InputService.resolveInputs(…): Promise<Record<string, string>> [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:53]
           ↳ Walks a schema, taking each value from the resolver or a prompt.
          └─> InputService.acceptProvidedValue(args: { input: SchemaInput; value: string; }): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:39]
             ↳ Validates a value the caller already had, throwing if it is invalid.
            └─> InputSchemaService.validateValue(args: { input: SchemaInput; value: unknown; }): string | true [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input-schema.service.ts:158]
               ↳ Validates a value, returning `true` or the reason it failed.
              └─> InputSchemaService.validateEnum(args: { input: SchemaInput; value: string; }): string | true [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input-schema.service.ts:39]
                 ↳ Validates a value against a schema `enum`, when one is declared.
                └─> InputSchemaService.readEnumValues(propertySchema: unknown): string[] [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input-schema.service.ts:123]
                   ↳ Reads the string members of a schema `enum`.
                  └─> InputSchemaService.readSchemaProperty(propertySchema: unknown, key: string): unknown [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input-schema.service.ts:26]
                     ↳ Reads one property off a schema fragment when it is an object.
                    └─> InputSchemaService.find(…)([entryKey]: [string, any]): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input-schema.service.ts:31]

5. InstancesCommand.parseTemplates — depth 4 · decorated-method

🚀 InstancesCommand.parseTemplates(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:81]
   ↳ Parses the optional template filter.
  └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:272]
     ↳ Splits a comma-delimited filter option into its values.
    └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:118]
       ↳ Splits a comma-delimited filter option into its values.
      └─> InputService.filter(…)(item: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:128]

6. TemplatesCommand.parseInstances — depth 4 · decorated-method

🚀 TemplatesCommand.parseInstances(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:73]
   ↳ Parses the optional instance filter.
  └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:272]
     ↳ Splits a comma-delimited filter option into its values.
    └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:118]
       ↳ Splits a comma-delimited filter option into its values.
      └─> InputService.filter(…)(item: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:128]

7. ValidateCommand.parseInstances — depth 4 · decorated-method

🚀 ValidateCommand.parseInstances(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:326]
   ↳ Parses the optional instance glob override.
  └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:272]
     ↳ Splits a comma-delimited filter option into its values.
    └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:118]
       ↳ Splits a comma-delimited filter option into its values.
      └─> InputService.filter(…)(item: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:128]

8. ValidateCommand.parseLanguages — depth 4 · decorated-method

🚀 ValidateCommand.parseLanguages(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:336]
   ↳ Parses the optional language filter.
  └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:272]
     ↳ Splits a comma-delimited filter option into its values.
    └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:118]
       ↳ Splits a comma-delimited filter option into its values.
      └─> InputService.filter(…)(item: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:128]

9. ValidateCommand.parseTemplates — depth 4 · decorated-method

🚀 ValidateCommand.parseTemplates(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:350]
   ↳ Parses the optional template filter.
  └─> ConfigurationService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:272]
     ↳ Splits a comma-delimited filter option into its values.
    └─> InputService.parseCommaDelimitedOption(value: string | undefined): string[] | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:118]
       ↳ Splits a comma-delimited filter option into its values.
      └─> InputService.filter(…)(item: string): boolean [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:128]

10. ValidateCommand.parseThreshold — depth 4 · decorated-method

🚀 ValidateCommand.parseThreshold(value: string | undefined): number | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:359]
   ↳ Parses the optional run-level conformance threshold.
  └─> ConfigurationService.parseThresholdOption(value: string | undefined): number | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:284]
     ↳ Parses a threshold option as a ratio from 0 to 1.
    └─> InputService.parseThresholdOption(value: string | undefined): number | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:161]
       ↳ Parses a threshold option as a ratio from 0 to 1.
      └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:134]
         ↳ Trims an optional string option, treating blank as absent.

11. GenerateCommand.parseConfig — depth ≥ 3 · decorated-method

🚀 GenerateCommand.parseConfig(value: string | undefined): string [projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:250]
   ↳ Parses the required configuration path.
  └─> ConfigurationService.requireConfigurationPath(value: string | undefined, surface: string): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:342]
     ↳ Returns the configuration path a run was given, or refuses.
    └─> ConfigurationPathRequiredError.constructor(surface: string): ConfigurationPathRequiredError [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.constants.ts:16]

12. GenerateCommand.parseDirectory — depth 3 · decorated-method

🚀 GenerateCommand.parseDirectory(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:263]
   ↳ Parses the output directory override.
  └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:279]
     ↳ Trims an optional string option, treating blank as absent.
    └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:134]
       ↳ Trims an optional string option, treating blank as absent.

13. GenerateCommand.parseTemplate — depth 3 · decorated-method

🚀 GenerateCommand.parseTemplate(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:277]
   ↳ Parses the name of the template to render.
  └─> ConfigurationService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:279]
     ↳ Trims an optional string option, treating blank as absent.
    └─> InputService.parseOptionalOption(value: string | undefined): string | undefined [projects/ic-suite/conformetry/conformetry-configuration/src/modules/input/input.service.ts:134]
       ↳ Trims an optional string option, treating blank as absent.

14. InstancesCommand.parseConfig — depth ≥ 3 · decorated-method

🚀 InstancesCommand.parseConfig(value: string | undefined): string [projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:59]
   ↳ Parses the required configuration path.
  └─> ConfigurationService.requireConfigurationPath(value: string | undefined, surface: string): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:342]
     ↳ Returns the configuration path a run was given, or refuses.
    └─> ConfigurationPathRequiredError.constructor(surface: string): ConfigurationPathRequiredError [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.constants.ts:16]

15. TemplatesCommand.parseConfig — depth ≥ 3 · decorated-method

🚀 TemplatesCommand.parseConfig(value: string | undefined): string [projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:60]
   ↳ Parses the required configuration path.
  └─> ConfigurationService.requireConfigurationPath(value: string | undefined, surface: string): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:342]
     ↳ Returns the configuration path a run was given, or refuses.
    └─> ConfigurationPathRequiredError.constructor(surface: string): ConfigurationPathRequiredError [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.constants.ts:16]

16. ValidateCommand.parseConfig — depth ≥ 3 · decorated-method

🚀 ValidateCommand.parseConfig(value: string | undefined): string [projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:313]
   ↳ Parses the required configuration path.
  └─> ConfigurationService.requireConfigurationPath(value: string | undefined, surface: string): string [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.service.ts:342]
     ↳ Returns the configuration path a run was given, or refuses.
    └─> ConfigurationPathRequiredError.constructor(surface: string): ConfigurationPathRequiredError [projects/ic-suite/conformetry/conformetry-configuration/src/modules/configuration/configuration.constants.ts:16]

Breadth

| Callable | Breadth | Calls directly | Location | | --- | --- | --- | --- | | GenerateCommand.generate | 8 | GenerateCommand.rejectRemovedGeneratorOption, ConfigurationService.loadConformetryConfiguration, GenerateCommand.resolveTemplateName, GenerateCommand.requireDefinition, GenerateCommand.requireDirectory, ConfigurationService.resolveGeneratorInputs, GenerationService.runGenerator, GenerateCommand.map(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:65 | | ValidateCommand.run | 7 | ConfigurationService.loadConformetryConfiguration, ValidateCommand.selectTemplates, ValidateCommand.selectInstances, ValidateCommand.reportEmptySelection, ValidationService.validate, ConfigurationService.collectTemplates, ValidateCommand.reportResult | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:369 | | GenerateCommand.resolveTemplateName | 4 | GenerateCommand.map(…), ConfigurationService.isAtTerminal, missingTemplateError, ConfigurationService.promptForTemplate | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:217 |

| Callable | Breadth | Calls directly | Location | | --- | --- | --- | --- | | InstancesCommand.run | 4 | ConfigurationService.loadConformetryConfiguration, InventoryService.shortenInstancePaths, ConfigurationService.resolveInventoriedInstances, InventoryService.describeInstances | projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:91 | | TemplatesCommand.run | 4 | ConfigurationService.loadConformetryConfiguration, InventoryService.shortenTemplatePairings, ConfigurationService.resolveInventoriedTemplates, InventoryService.describeTemplates | projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:92 | | ValidateCommand.selectInstances | 4 | ValidateCommand.findInstances, ValidateCommand.flatMap(…), ValidateCommand.map(…), ValidateCommand.filter(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:231 | | GenerateCommand.requireDefinition | 3 | GenerateCommand.find(…), unknownTemplateError, GenerateCommand.map(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:163 | | ValidateCommand.reportEmptySelection | 3 | ValidateCommand.map(…), ValidateCommand.map(…), ValidateCommand.filter(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:152 | | ValidateCommand.reportResult | 3 | ReportingService.formatReport, ValidateCommand.filter(…), ValidateCommand.describeFailure | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:193 | | ValidateCommand.map(…) | 3 | ValidateCommand.find(…), unknownTemplateError, ValidateCommand.map(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:289 | | GenerateCommand.rejectRemovedGeneratorOption | 2 | GenerateCommand.some(…), removedGeneratorOptionError | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:149 | | GenerateCommand.run | 2 | GenerateCommand.generate, GenerateCommand.rejectCommandLine | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:292 | | ValidateCommand.describeFailure | 2 | ValidateCommand.filter(…), ValidateCommand.map(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:73 | | ValidateCommand.findInstances | 2 | ValidateCommand.flatMap(…), ConfigurationService.readWorkspaceGroups | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:97 | | ValidateCommand.promptForTemplateNames | 2 | ConfigurationService.isAtTerminal, ConfigurationService.promptForTemplates | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:134 | | ValidateCommand.selectTemplates | 2 | ValidateCommand.promptForTemplateNames, ValidateCommand.map(…) | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:274 | | missingTemplateError | 1 | InputError.constructor | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.constants.ts:12 | | GenerateCommand.requireDirectory | 1 | missingDirectoryError | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:194 | | GenerateCommand.parseConfig | 1 | ConfigurationService.requireConfigurationPath | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:250 | | GenerateCommand.parseDirectory | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:263 | | GenerateCommand.parseTemplate | 1 | ConfigurationService.parseOptionalOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/generate/generate.command.ts:277 | | InstancesCommand.parseConfig | 1 | ConfigurationService.requireConfigurationPath | projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:59 | | InstancesCommand.parseTemplates | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/instances/instances.command.ts:81 | | TemplatesCommand.parseConfig | 1 | ConfigurationService.requireConfigurationPath | projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:60 | | TemplatesCommand.parseInstances | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/templates/templates.command.ts:73 | | ValidateCommand.map(…) | 1 | ReportingService.formatPercentage | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:76 | | ValidateCommand.flatMap(…) | 1 | ConfigurationService.findInstances | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:105 | | ValidateCommand.filter(…) | 1 | ConfigurationService.readWorkspaceGroups | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:160 | | ValidateCommand.parseConfig | 1 | ConfigurationService.requireConfigurationPath | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:313 | | ValidateCommand.parseInstances | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:326 | | ValidateCommand.parseLanguages | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:336 | | ValidateCommand.parseTemplates | 1 | ConfigurationService.parseCommaDelimitedOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:350 | | ValidateCommand.parseThreshold | 1 | ConfigurationService.parseThresholdOption | projects/ic-suite/conformetry/conformetry-cli/src/modules/validate/validate.command.ts:359 |

🕸️ Codependix

Dependency graphs exported by codependix, regenerated by nx run configuration:codependix:write.

Nx Neighborhood

graph LR
  conformetry_cli["conformetry-cli"]
  conformetry_configuration["conformetry-configuration"]
  conformetry_core["conformetry-core"]
  conformetry_examples["conformetry-examples"]
  conformetry_generation["conformetry-generation"]
  conformetry_output["conformetry-output"]
  conformetry_validation["conformetry-validation"]
  logging["logging"]
  conformetry_cli --> conformetry_configuration
  conformetry_cli --> conformetry_core
  conformetry_cli --> conformetry_generation
  conformetry_cli --> conformetry_output
  conformetry_cli --> conformetry_validation
  conformetry_cli --> logging
  conformetry_examples -.-> conformetry_cli
  classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
  class conformetry_cli subject

Dashed edges are dependencies Nx inferred from configuration rather than from code.

NestJS Module Graph

flowchart LR
  ConfigModule([ConfigModule])
  ConfigurationModule
  DifferencesModule
  DiscoveryModule
  FilesModule
  GenerateModule
  GenerationModule
  InputModule
  InstanceDiscoveryModule
  InstanceGroupModule
  InstancesModule
  InventoryModule
  JsonModule
  JupyterModule
  LanguagesModule
  LoggerModule([LoggerModule])
  MainModule
  MarkdownModule
  PythonModule
  RenderingModule
  ReportingModule
  RunnerModule
  ScoringModule
  TemplateDiscoveryModule
  TemplatesModule
  TextModule
  TypescriptModule
  ValidateModule
  ValidationModule
  ConfigurationModule --> InputModule
  ConfigurationModule --> InstanceDiscoveryModule
  ConfigurationModule --> InstanceGroupModule
  ConfigurationModule --> RenderingModule
  ConfigurationModule --> TemplateDiscoveryModule
  FilesModule --> ConfigurationModule
  FilesModule --> DifferencesModule
  GenerateModule --> ConfigurationModule
  GenerateModule --> GenerationModule
  GenerationModule --> ConfigurationModule
  InstanceDiscoveryModule --> InstanceGroupModule
  InstanceDiscoveryModule --> RenderingModule
  InstanceDiscoveryModule --> TemplateDiscoveryModule
  InstancesModule --> ConfigurationModule
  InstancesModule --> InventoryModule
  JsonModule --> ScoringModule
  JupyterModule --> JsonModule
  JupyterModule --> MarkdownModule
  JupyterModule --> PythonModule
  LanguagesModule --> JsonModule
  LanguagesModule --> JupyterModule
  LanguagesModule --> MarkdownModule
  LanguagesModule --> PythonModule
  LanguagesModule --> TextModule
  LanguagesModule --> TypescriptModule
  MainModule --> DiscoveryModule
  MainModule --> GenerateModule
  MainModule --> InstancesModule
  MainModule --> TemplatesModule
  MainModule --> ValidateModule
  MarkdownModule --> ScoringModule
  PythonModule --> DifferencesModule
  PythonModule --> ScoringModule
  ReportingModule --> ScoringModule
  TemplateDiscoveryModule --> RenderingModule
  TemplatesModule --> ConfigurationModule
  TemplatesModule --> InventoryModule
  TypescriptModule --> ScoringModule
  ValidateModule --> ConfigurationModule
  ValidateModule --> ReportingModule
  ValidateModule --> ValidationModule
  ValidationModule --> ConfigurationModule
  ValidationModule --> FilesModule
  ValidationModule --> LanguagesModule
  ValidationModule --> RunnerModule
  ValidationModule --> ScoringModule

Rounded 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_conformetry_cli_constants_ts["src/conformetry-cli.constants.ts"]
  file_src_conformetry_cli_main_end_to_end_test_ts["src/conformetry-cli.main.end-to-end.test.ts"]
  file_src_conformetry_cli_main_integration_test_ts["src/conformetry-cli.main.integration.test.ts"]
  file_src_conformetry_cli_main_ts["src/conformetry-cli.main.ts"]
  file_src_conformetry_cli_main_unit_test_ts["src/conformetry-cli.main.unit.test.ts"]
  file_src_conformetry_cli_module_ts["src/conformetry-cli.module.ts"]
  file_src_conformetry_cli_repl_ts["src/conformetry-cli.repl.ts"]
  file_src_conformetry_cli_repl_unit_test_ts["src/conformetry-cli.repl.unit.test.ts"]
  file_src_index_ts["src/index.ts"]
  file_src_modules_generate_generate_command_ts["src/modules/generate/generate.command.ts"]
  file_src_modules_generate_generate_command_unit_test_ts["src/modules/generate/generate.command.unit.test.ts"]
  file_src_modules_generate_generate_constants_ts["src/modules/generate/generate.constants.ts"]
  file_src_modules_generate_generate_module_ts["src/modules/generate/generate.module.ts"]
  file_src_modules_generate_generate_types_ts["src/modules/generate/generate.types.ts"]
  file_src_modules_instances_instances_command_ts["src/modules/instances/instances.command.ts"]
  file_src_modules_instances_instances_command_unit_test_ts["src/modules/instances/instances.command.unit.test.ts"]
  file_src_modules_instances_instances_constants_ts["src/modules/instances/instances.constants.ts"]
  file_src_modules_instances_instances_module_ts["src/modules/instances/instances.module.ts"]
  file_src_modules_instances_instances_types_ts["src/modules/instances/instances.types.ts"]
  file_src_modules_templates_templates_command_ts["src/modules/templates/templates.command.ts"]
  file_src_modules_templates_templates_command_unit_test_ts["src/modules/templates/templates.command.unit.test.ts"]
  file_src_modules_templates_templa