Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 35 additions & 25 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,47 +38,57 @@ npm run release:dry-run # Preview what release would do without writing

JS source is plain JavaScript (ES modules) in `src/`. No transpilation step. The Rust native engine lives in `crates/codegraph-core/`.

| File | Role |
| Path | Role |
|------|------|
| `cli.js` | Commander CLI entry point (`bin.codegraph`) |
| `index.js` | Programmatic API exports |
| `builder.js` | Graph building: file collection, parsing, import resolution, incremental hashing |
| `parser.js` | tree-sitter WASM wrapper; `LANGUAGE_REGISTRY` + per-language extractors for functions, classes, methods, imports, exports, call sites |
| `queries.js` | Query functions: symbol search, file deps, impact analysis, diff-impact; `SYMBOL_KINDS` constant defines all node kinds |
| `embeddings/` | Embedding subsystem: model management, vector generation, semantic/keyword/hybrid search, CLI formatting |
| `db.js` | SQLite schema and operations (`better-sqlite3`) |
| `mcp.js` | MCP server exposing graph queries to AI agents; single-repo by default, `--multi-repo` to enable cross-repo access |
| `graph/` | Unified graph model: `CodeGraph` class (`model.js`), algorithms (Tarjan SCC, Louvain, BFS, shortest path, centrality), classifiers (role, risk), builders (dependency, structure, temporal) |
| `cycles.js` | Circular dependency detection (delegates to `graph/` subsystem) |
| `export.js` | Graph export orchestration: loads data from DB, delegates to `presentation/export.js` serializers |
| `presentation/` | Pure output formatting: `viewer.js` (HTML renderer), `export.js` (DOT/Mermaid/GraphML/Neo4j serializers), `sequence-renderer.js` (Mermaid sequence diagrams), `table.js` (CLI table formatting), `result-formatter.js` (JSON/NDJSON output) |
| `watcher.js` | Watch mode for incremental rebuilds |
| `config.js` | `.codegraphrc.json` loading, env overrides, `apiKeyCommand` secret resolution |
| `constants.js` | `EXTENSIONS` (derived from parser registry) and `IGNORE_DIRS` constants |
| `native.js` | Native napi-rs addon loader with WASM fallback |
| `registry.js` | Global repo registry (`~/.codegraph/registry.json`) for multi-repo MCP |
| `resolve.js` | Import resolution (supports native batch mode) |
| `ast-analysis/` | Unified AST analysis framework: shared DFS walker (`visitor.js`), engine orchestrator (`engine.js`), extracted metrics (`metrics.js`), and pluggable visitors for complexity, dataflow, and AST-store |
| `complexity.js` | Cognitive, cyclomatic, Halstead, MI computation from AST; `complexity` CLI command |
| `communities.js` | Louvain community detection, drift analysis (delegates to `graph/` subsystem) |
| `manifesto.js` | Configurable rule engine with warn/fail thresholds; CI gate |
| `audit.js` | Composite audit command: explain + impact + health in one call |
| `batch.js` | Batch querying for multi-agent dispatch |
| `triage.js` | Risk-ranked audit priority queue (delegates scoring to `graph/classifiers/`) |
| `check.js` | CI validation predicates (cycles, complexity, blast radius, boundaries) |
| `boundaries.js` | Architecture boundary rules with onion architecture preset |
| `owners.js` | CODEOWNERS integration for ownership queries |
| `snapshot.js` | SQLite DB backup and restore |
| `sequence.js` | Sequence diagram data generation (BFS traversal); Mermaid rendering delegated to `presentation/sequence-renderer.js` |
| `paginate.js` | Pagination helpers for bounded query results |
| `logger.js` | Structured logging (`warn`, `debug`, `info`, `error`) |
| **`db/`** | **Database layer** |
| `db/index.js` | SQLite schema and operations (`better-sqlite3`) |
| **`domain/`** | **Core domain logic** |
| `domain/queries.js` | Query functions: symbol search, file deps, impact analysis, diff-impact; `SYMBOL_KINDS` constant defines all node kinds |
| `domain/graph/builder.js` | Graph building: file collection, parsing, import resolution, incremental hashing |
| `domain/graph/cycles.js` | Circular dependency detection (delegates to `graph/` subsystem) |
| `domain/graph/resolve.js` | Import resolution (supports native batch mode) |
| `domain/graph/watcher.js` | Watch mode for incremental rebuilds |
| `domain/analysis/` | Query-layer analysis: context, dependencies, exports, impact, module-map, roles, symbol-lookup |
| `domain/search/` | Embedding subsystem: model management, vector generation, semantic/keyword/hybrid search, CLI formatting |
| **`features/`** | **Composable feature modules** |
| `features/audit.js` | Composite audit command: explain + impact + health in one call |
| `features/batch.js` | Batch querying for multi-agent dispatch |
| `features/boundaries.js` | Architecture boundary rules with onion architecture preset |
| `features/cfg.js` | Control-flow graph generation |
| `features/check.js` | CI validation predicates (cycles, complexity, blast radius, boundaries) |
| `features/communities.js` | Louvain community detection, drift analysis (delegates to `graph/` subsystem) |
| `features/complexity.js` | Cognitive, cyclomatic, Halstead, MI computation from AST |
| `features/dataflow.js` | Dataflow analysis |
| `features/export.js` | Graph export orchestration: loads data from DB, delegates to `presentation/` serializers |
| `features/manifesto.js` | Configurable rule engine with warn/fail thresholds; CI gate |
| `features/owners.js` | CODEOWNERS integration for ownership queries |
| `features/sequence.js` | Sequence diagram data generation (BFS traversal) |
| `features/snapshot.js` | SQLite DB backup and restore |
| `features/structure.js` | Codebase structure analysis |
| `features/triage.js` | Risk-ranked audit priority queue (delegates scoring to `graph/classifiers/`) |
| **`presentation/`** | **Pure output formatting** |
| `presentation/` | `viewer.js` (HTML renderer), `export.js` (DOT/Mermaid/GraphML/Neo4j serializers), `sequence-renderer.js` (Mermaid sequence diagrams), `table.js` (CLI table formatting), `result-formatter.js` (JSON/NDJSON output) |
| **`graph/`** | **Unified graph model** |
| `graph/` | `CodeGraph` class (`model.js`), algorithms (Tarjan SCC, Louvain, BFS, shortest path, centrality), classifiers (role, risk), builders (dependency, structure, temporal) |
| **`mcp/`** | **MCP server** |
| `mcp/` | MCP server exposing graph queries to AI agents; single-repo by default, `--multi-repo` to enable cross-repo access |
| `ast-analysis/` | Unified AST analysis framework: shared DFS walker (`visitor.js`), engine orchestrator (`engine.js`), extracted metrics (`metrics.js`), and pluggable visitors for complexity, dataflow, and AST-store |

**Key design decisions:**
- **Dual-engine architecture:** Native Rust parsing via napi-rs (`crates/codegraph-core/`) with automatic fallback to WASM. Controlled by `--engine native|wasm|auto` (default: `auto`)
- Platform-specific prebuilt binaries published as optional npm packages (`@optave/codegraph-{platform}-{arch}`)
- WASM grammars are built from devDeps on `npm install` (via `prepare` script) and not committed to git — used as fallback when native addon is unavailable
- **Language parser registry:** `LANGUAGE_REGISTRY` in `parser.js` is the single source of truth for all supported languages — maps each language to `{ id, extensions, grammarFile, extractor, required }`. `EXTENSIONS` in `constants.js` is derived from the registry. Adding a new language requires one registry entry + extractor function
- **Node kinds:** `SYMBOL_KINDS` in `queries.js` lists all valid kinds: `function`, `method`, `class`, `interface`, `type`, `struct`, `enum`, `trait`, `record`, `module`. Language-specific types use their native kind (e.g. Go structs → `struct`, Rust traits → `trait`, Ruby modules → `module`) rather than mapping everything to `class`/`interface`
- **Node kinds:** `SYMBOL_KINDS` in `domain/queries.js` lists all valid kinds: `function`, `method`, `class`, `interface`, `type`, `struct`, `enum`, `trait`, `record`, `module`. Language-specific types use their native kind (e.g. Go structs → `struct`, Rust traits → `trait`, Ruby modules → `module`) rather than mapping everything to `class`/`interface`
- `@huggingface/transformers` and `@modelcontextprotocol/sdk` are optional dependencies, lazy-loaded
- Non-required parsers (all except JS/TS/TSX) fail gracefully if their WASM grammar is unavailable
- Import resolution uses a 6-level priority system with confidence scoring (import-aware → same-file → directory → parent → global → method hierarchy)
Expand Down
2 changes: 1 addition & 1 deletion src/ast-analysis/engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import path from 'node:path';
import { performance } from 'node:perf_hooks';
import { bulkNodeIdsByFile } from '../db.js';
import { bulkNodeIdsByFile } from '../db/index.js';
import { debug } from '../logger.js';
import { computeLOCMetrics, computeMaintainabilityIndex } from './metrics.js';
import {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/audit.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { audit } from '../../commands/audit.js';
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { explain } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { explain } from '../../presentation/queries-cli.js';

export const command = {
name: 'audit <target>',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/batch.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import fs from 'node:fs';
import { BATCH_COMMANDS, multiBatchData, splitTargets } from '../../batch.js';
import { batch } from '../../commands/batch.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { ConfigError } from '../../errors.js';
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { BATCH_COMMANDS, multiBatchData, splitTargets } from '../../features/batch.js';

export const command = {
name: 'batch <command> [targets...]',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/build.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import path from 'node:path';
import { buildGraph } from '../../builder.js';
import { buildGraph } from '../../domain/graph/builder.js';

export const command = {
name: 'build [dir]',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/cfg.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';

export const command = {
name: 'cfg <name>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/check.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { ConfigError } from '../../errors.js';
import { EVERY_SYMBOL_KIND } from '../../queries.js';

export const command = {
name: 'check [ref]',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/children.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { children } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { children } from '../../presentation/queries-cli.js';

export const command = {
name: 'children <name>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/complexity.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';

export const command = {
name: 'complexity [target]',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/context.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { context } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { context } from '../../presentation/queries-cli.js';

export const command = {
name: 'context <name>',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/cycles.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { findCycles, formatCycles } from '../../cycles.js';
import { openReadonlyOrFail } from '../../db.js';
import { openReadonlyOrFail } from '../../db/index.js';
import { findCycles, formatCycles } from '../../domain/graph/cycles.js';

export const command = {
name: 'cycles',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/dataflow.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';

export const command = {
name: 'dataflow <name>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/deps.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { fileDeps } from '../../queries-cli.js';
import { fileDeps } from '../../presentation/queries-cli.js';

export const command = {
name: 'deps <file>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/diff-impact.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { diffImpact } from '../../queries-cli.js';
import { diffImpact } from '../../presentation/queries-cli.js';

export const command = {
name: 'diff-impact [ref]',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/embed.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import path from 'node:path';
import { buildEmbeddings, DEFAULT_MODEL, EMBEDDING_STRATEGIES } from '../../embeddings/index.js';
import { buildEmbeddings, DEFAULT_MODEL, EMBEDDING_STRATEGIES } from '../../domain/search/index.js';

export const command = {
name: 'embed [dir]',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/export.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import fs from 'node:fs';
import { openReadonlyOrFail } from '../../db.js';
import { openReadonlyOrFail } from '../../db/index.js';
import {
exportDOT,
exportGraphML,
exportGraphSON,
exportJSON,
exportMermaid,
exportNeo4jCSV,
} from '../../export.js';
} from '../../features/export.js';

export const command = {
name: 'export',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/exports.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { fileExports } from '../../queries-cli.js';
import { fileExports } from '../../presentation/queries-cli.js';

export const command = {
name: 'exports <file>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/flow.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';

export const command = {
name: 'flow [name]',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/fn-impact.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { fnImpact } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { fnImpact } from '../../presentation/queries-cli.js';

export const command = {
name: 'fn-impact <name>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/impact.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { impactAnalysis } from '../../queries-cli.js';
import { impactAnalysis } from '../../presentation/queries-cli.js';

export const command = {
name: 'impact <file>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/map.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { moduleMap } from '../../queries-cli.js';
import { moduleMap } from '../../presentation/queries-cli.js';

export const command = {
name: 'map',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/models.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DEFAULT_MODEL, MODELS } from '../../embeddings/index.js';
import { DEFAULT_MODEL, MODELS } from '../../domain/search/index.js';

export const command = {
name: 'models',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/path.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { symbolPath } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { symbolPath } from '../../presentation/queries-cli.js';

export const command = {
name: 'path <from> <to>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/plot.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fs from 'node:fs';
import path from 'node:path';
import { openReadonlyOrFail } from '../../db.js';
import { openReadonlyOrFail } from '../../db/index.js';

export const command = {
name: 'plot',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/query.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { fnDeps, symbolPath } from '../../queries-cli.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';
import { fnDeps, symbolPath } from '../../presentation/queries-cli.js';

export const command = {
name: 'query <name>',
Expand Down
4 changes: 2 additions & 2 deletions src/cli/commands/roles.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { VALID_ROLES } from '../../queries.js';
import { roles } from '../../queries-cli.js';
import { VALID_ROLES } from '../../domain/queries.js';
import { roles } from '../../presentation/queries-cli.js';

export const command = {
name: 'roles',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/search.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { search } from '../../embeddings/index.js';
import { search } from '../../domain/search/index.js';

export const command = {
name: 'search <query>',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/sequence.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EVERY_SYMBOL_KIND } from '../../queries.js';
import { EVERY_SYMBOL_KIND } from '../../domain/queries.js';

export const command = {
name: 'sequence <name>',
Expand Down
7 changes: 6 additions & 1 deletion src/cli/commands/snapshot.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { snapshotDelete, snapshotList, snapshotRestore, snapshotSave } from '../../snapshot.js';
import {
snapshotDelete,
snapshotList,
snapshotRestore,
snapshotSave,
} from '../../features/snapshot.js';

export const command = {
name: 'snapshot',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/stats.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { stats } from '../../queries-cli.js';
import { stats } from '../../presentation/queries-cli.js';

export const command = {
name: 'stats',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/triage.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EVERY_SYMBOL_KIND, VALID_ROLES } from '../../domain/queries.js';
import { ConfigError } from '../../errors.js';
import { EVERY_SYMBOL_KIND, VALID_ROLES } from '../../queries.js';

export const command = {
name: 'triage',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/watch.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import path from 'node:path';
import { watchProject } from '../../watcher.js';
import { watchProject } from '../../domain/graph/watcher.js';

export const command = {
name: 'watch [dir]',
Expand Down
2 changes: 1 addition & 1 deletion src/cli/commands/where.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { where } from '../../queries-cli.js';
import { where } from '../../presentation/queries-cli.js';

export const command = {
name: 'where [name]',
Expand Down
4 changes: 2 additions & 2 deletions src/commands/audit.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { auditData } from '../audit.js';
import { kindIcon } from '../domain/queries.js';
import { auditData } from '../features/audit.js';
import { outputResult } from '../infrastructure/result-formatter.js';
import { kindIcon } from '../queries.js';

/**
* CLI formatter for the audit command.
Expand Down
2 changes: 1 addition & 1 deletion src/commands/batch.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { batchData, multiBatchData } from '../batch.js';
import { batchData, multiBatchData } from '../features/batch.js';

/**
* CLI wrapper — calls batchData and prints JSON to stdout.
Expand Down
4 changes: 2 additions & 2 deletions src/commands/branch-compare.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { branchCompareData, branchCompareMermaid } from '../branch-compare.js';
import { kindIcon } from '../domain/queries.js';
import { branchCompareData, branchCompareMermaid } from '../features/branch-compare.js';
import { outputResult } from '../infrastructure/result-formatter.js';
import { kindIcon } from '../queries.js';

// ─── Text Formatting ────────────────────────────────────────────────────

Expand Down
2 changes: 1 addition & 1 deletion src/commands/cfg.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { cfgData, cfgToDOT, cfgToMermaid } from '../cfg.js';
import { cfgData, cfgToDOT, cfgToMermaid } from '../features/cfg.js';
import { outputResult } from '../infrastructure/result-formatter.js';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/commands/check.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { checkData } from '../check.js';
import { AnalysisError } from '../errors.js';
import { checkData } from '../features/check.js';
import { outputResult } from '../infrastructure/result-formatter.js';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/commands/communities.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { communitiesData } from '../communities.js';
import { communitiesData } from '../features/communities.js';
import { outputResult } from '../infrastructure/result-formatter.js';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/commands/complexity.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { complexityData } from '../complexity.js';
import { complexityData } from '../features/complexity.js';
import { outputResult } from '../infrastructure/result-formatter.js';

/**
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataflow.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { dataflowData, dataflowImpactData } from '../dataflow.js';
import { dataflowData, dataflowImpactData } from '../features/dataflow.js';
import { outputResult } from '../infrastructure/result-formatter.js';

/**
Expand Down
4 changes: 2 additions & 2 deletions src/commands/flow.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { flowData, listEntryPointsData } from '../flow.js';
import { kindIcon } from '../domain/queries.js';
import { flowData, listEntryPointsData } from '../features/flow.js';
import { outputResult } from '../infrastructure/result-formatter.js';
import { kindIcon } from '../queries.js';

/**
* CLI formatter — text or JSON output.
Expand Down
2 changes: 1 addition & 1 deletion src/commands/manifesto.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { manifestoData } from '../features/manifesto.js';
import { outputResult } from '../infrastructure/result-formatter.js';
import { manifestoData } from '../manifesto.js';

/**
* CLI formatter — prints manifesto results and sets exitCode 1 on failure.
Expand Down
2 changes: 1 addition & 1 deletion src/commands/owners.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { ownersData } from '../features/owners.js';
import { outputResult } from '../infrastructure/result-formatter.js';
import { ownersData } from '../owners.js';

/**
* CLI display function for the `owners` command.
Expand Down
Loading
Loading