You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Workspace configuration keys are documented as narrative sections in docs/configuration/top-level.md and docs/configuration/examples.md. That shape has three costs:
No linkable per-parameter target. Issues, PRs, CHANGES entries, and warnings can't point at "the synchronize reference" — only at a whole page.
No canonical inventory. The set of valid keys lives implicitly across loader.expand(), loader.trickle(), validation.validate_schema(), and the builder. Discovering "what can I put in a workspace file, at which level, with what default?" requires reading source.
Related keys / interactions (e.g. synchronize: after vs shell_command_after ordering)
Plus an index table grouped by level, so the full vocabulary is scannable on one screen.
2. Bonus: make them autodocumentable
The drift problem disappears if docs and validation share one source of truth. Sketch:
Declarative schema registry in code — a dataclass (or table of records) describing every key: name, level, type, default, since-version, help text, example. loader/validation consume it instead of hardcoding key knowledge; validate_schema() becomes data-driven.
Sphinx directive that renders the registry — prior art is exactly this pattern:
myst-parser documents MdParserConfig by introspecting its dataclass fields and field.metadata["help"] via a custom MystConfigDirective, invoked in docs as a {myst-config} fenced directive (myst_parser/_docs.py). tmuxp can do the same with a {tmuxp-config} directive filterable by level.
Sphinx core documents its own options with the confval directive, which yields stable cross-referenceable targets ({confval} role) — adopting confval-style object types gives every parameter a permalink usable from CHANGES and warnings.
The generic directive could live in tmuxp's docs conf.py initially; if it proves reusable, graduating it to the shared docs platform (gp-sphinx) is a natural follow-up.
Phasing
Inventory + anchors — enumerate every key from loader/validation/builder, restructure existing prose under per-key anchors, add the index table. Docs-only, no code changes.
Schema registry — introduce the declarative registry; port validate_schema() and loader key-handling onto it; doctest the registry.
Directive — render per-key reference docs from the registry; delete the now-duplicated hand-written tables; CI ensures a key without registry metadata fails the build.
Acceptance criteria
Every workspace config key has a linkable reference target with level, type, default, and a working example
The key inventory in docs is generated from (or validated against) the same structure the loader/validator uses
Adding a new config key without docs metadata fails loudly (build or test)
Refs #1016 (the parity effort expanding the config surface this would document).
Problem
Workspace configuration keys are documented as narrative sections in
docs/configuration/top-level.mdanddocs/configuration/examples.md. That shape has three costs:synchronizereference" — only at a whole page.loader.expand(),loader.trickle(),validation.validate_schema(), and the builder. Discovering "what can I put in a workspace file, at which level, with what default?" requires reading source.synchronize,shell_command_after,clear, lifecycle hooks), which multiplies both the value of a reference and the surface for drift.Proposal
1. Per-parameter reference pages
One page (or one anchored section) per config parameter, each carrying:
synchronize: aftervsshell_command_afterordering)Plus an index table grouped by level, so the full vocabulary is scannable on one screen.
2. Bonus: make them autodocumentable
The drift problem disappears if docs and validation share one source of truth. Sketch:
loader/validationconsume it instead of hardcoding key knowledge;validate_schema()becomes data-driven.MdParserConfigby introspecting its dataclass fields andfield.metadata["help"]via a customMystConfigDirective, invoked in docs as a{myst-config}fenced directive (myst_parser/_docs.py). tmuxp can do the same with a{tmuxp-config}directive filterable by level.confvaldirective, which yields stable cross-referenceable targets ({confval}role) — adoptingconfval-style object types gives every parameter a permalink usable from CHANGES and warnings.conf.pyinitially; if it proves reusable, graduating it to the shared docs platform (gp-sphinx) is a natural follow-up.Phasing
validate_schema()and loader key-handling onto it; doctest the registry.Acceptance criteria
Refs #1016 (the parity effort expanding the config surface this would document).