refactor: domain error hierarchy (ROADMAP 3.8)#431
Merged
carlos-alm merged 5 commits intomainfrom Mar 13, 2026
Merged
Conversation
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
src/errors.jswith structured domain error hierarchy:CodegraphErrorbase class + 7 subclasses (ParseError,DbError,ConfigError,ResolutionError,EngineError,AnalysisError,BoundaryError)process.exit(1)calls in library code (embedder, db/connection, watcher, mcp/server, snapshot) with thrown domain errorsthrow new Error()in library code (ast-analysis/shared, batch, db/query-builder, db/repository/nodes, native, snapshot) with appropriate domain error subclassesCodegraphErrorwith[CODE]: messageprefix; MCP catch returns structured{ isError, code }responsescheck,manifesto) useprocess.exitCode = 1instead ofprocess.exit(1)parseAsync()so async command errors propagate to the top-level handlersrc/index.js)Test plan
tests/unit/errors.test.js— 16 tests covering all classes, instanceof chain, option forwardingtests/unit/db.test.js— assertsDbErrorinstead ofprocess.exitspytests/unit/prompt-install.test.js— assertsEngineErrorinstead ofprocess.exitspyprocess.exit(1)remaining in library code (only in CLI entry point)throw new Errorremaining insrc/