ADR-0002: Consumer rails and workspace extensions
- Status: Accepted
- Date: 2026-09-26
- Deciders: Michel Gillet
Context
Greenfield (eai-supinit) and migration (eai-supmig) workspaces must converge on the
same language-agnostic hygiene: pre-commit, gitlint, .gitignore, root CHANGELOG.md,
ADR pack + AGENTS.md + README.md, and a basic
.esysrepo.manifest.xml. Stack-specific tooling (cmake-format, Ruff, clang-format) must
not bloat bootstrap defaults for a multi-repo that is language-independent at the root.
Decision
eai-supcore.scaffold_consumer_dev_railsowns baseline consumer rails. Both CLIs call it frombootstrap(defaults: hooks + manifest on).- Templates live under method-tree
templates/consumer/(andtemplates/extensions/<id>/), with identical copies bundled ineai_supcore.datafor installs without atools/ai-rulesmount. Resolution prefers the mount. scripts/setup-dev.pyis the single cross-platform setup entry (no.sh/.ps1pair for consumers). Optional--install-hooksruns it during bootstrap.- Extensions are post-bootstrap and composable. CLI surface:
extension list|add|status(docs / beginners)ext list|add|status(short alias; same handlers)
- Applied extensions are recorded in shared
.tools/esys/eai-supcore/extensions.yaml(eai-supcore tool-state root; visible to both CLIs). - First extensions:
cmake(cmake-format + cmake-lint);license(rootLICENSE.txtfrom an indexed SPDX menu — MIT default).
Consequences
- Bootstrap stays language-agnostic; operators opt into stack hooks via
extension add. - Doctor reports rails presence and extension drift.
- Future ids (
python,cpp, …) plug into the same registry without new bootstrap flags. extension add licenseshows a numbered SPDX menu (or--index/--spdx);extension licenseslists the catalog without applying.