Split config defaults, option metadata, runtime-option registry, and template sections into domain modules while preserving the composed public API in definitions.ts. This keeps ConfigService behavior stable and makes future config extensions easier to add with focused regression coverage.
3.7 KiB
id, title, status, assignee, created_date, updated_date, labels, dependencies, priority
| id | title | status | assignee | created_date | updated_date | labels | dependencies | priority | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TASK-78 | Modularize config definitions and validation by domain | Done | 2026-02-18 11:43 | 2026-02-22 00:06 |
|
|
high |
Description
Config defaults and resolution are still concentrated in large files (src/config/definitions.ts, src/config/service.ts). This task splits config schema/defaults/validation into domain modules while preserving a single composed public config API.
Suggestions
- Organize by domain (
anki,subtitle,jellyfin,anilist,launcher,runtime). - Keep one composition root that merges domain validators and defaults.
- Prefer small reusable validator helpers over per-field inline logic.
Action Steps
- Define domain module boundaries for defaults + validation rules.
- Extract domain validators with shared primitives and warning builder.
- Compose resolved config in a central aggregator module.
- Keep
ConfigServiceexternal API stable. - Expand tests for domain-level validation and composed config output.
- Update config docs to reflect module ownership and extension workflow.
Acceptance Criteria
- #1 Config definitions/validation are split by domain with clear ownership
- #2
ConfigServiceAPI remains backward-compatible - #3 Validation behavior remains stable under existing tests
- #4 New domain-level tests prevent regression in future config additions
Implementation Notes
2026-02-21: Started execution via writing-plans/executing-plans workflow in opencode session opencode-task78-config-domain-20260221T235604Z-p9x2.
2026-02-22: Refactored src/config/definitions.ts into a composed facade over domain modules under src/config/definitions/ (defaults-*.ts, options-*.ts, runtime-options.ts, template-sections.ts, shared.ts) while preserving exported API names and ConfigService behavior.
Added domain-level regression tests in src/config/definitions/domain-registry.test.ts for critical registry paths, duplicate-path guard, template section key uniqueness, and per-domain contributor coverage.
Updated contributor docs (docs/development.md) with config extension workflow by domain ownership and composition entrypoint guidance.
Verification: bun test src/config/definitions/domain-registry.test.ts (3 pass), bun run test:config:src (49 pass), bun run test:core:src (219 pass, 6 skip).
make generate-config currently blocked by pre-existing TypeScript errors in src/main/state.test.ts missing exports from src/main/state (outside TASK-78 scope).
Follow-up: wired src/config/definitions/domain-registry.test.ts into package.json config test lanes (test:config:src + test:config:dist). Re-ran bun run test:config:src => 52 pass.
Final Summary
Modularized config definition ownership by introducing domain-specific defaults, option registry builders, runtime-option metadata, and template-section modules under src/config/definitions/, with src/config/definitions.ts preserved as the single composed public API. Added domain-level registry tests and updated contributor docs for the new config extension workflow; config/core source test lanes pass.
Definition of Done
- #1 Config and core tests pass
- #2 Documentation updated for config extension workflow