2.4 KiB
2.4 KiB
Architecture
The codebase is split so the implementation reads through file boundaries and names, not through large explanatory docs.
Design goals
- thin pi-specific wiring
- pure, testable state transitions
- rendering separated from decision logic
- a small stable tool contract
Module map
Tool surface
src/index.ts— extension entrypointsrc/ask-tool.ts— tool registration, non-interactive fallback, transcript renderingsrc/schema.ts— TypeBox schemasrc/types.ts— shared types
State
src/state/normalize.ts— normalize incoming questionssrc/state/answers.ts— mutate and serialize answerssrc/state/selectors.ts— read-only selectorssrc/state/transitions.ts— navigation, selection, notes, input, submit, cancelsrc/state/result.ts— convert UI state toAskResultsrc/state/view.ts— view-mode helperssrc/state.ts— state barrel used by UI and tests
UI
src/ui/controller.ts— connects key input, editor lifecycle, and pure state transitionssrc/ui/input.ts— raw input to commandssrc/ui/render.tsandsrc/ui/render-*.ts— screen renderingsrc/ui/constants.tsandsrc/ui/render-types.ts— rendering constants/contractssrc/ask-component.ts— thin custom UI export
Result formatting
src/result-format.ts— shared summary/result line formattingsrc/result.ts— final result renderingsrc/text.ts/src/constants.ts— shared display strings
Tests
tests/state.test.ts— state transitions and serializationtests/input.test.ts— editing/navigation key behaviortests/result.test.ts— summaries and transcript outputtests/render-*.test.ts/tests/text.test.ts— rendering helpers
Invariants worth preserving
- submit is never blocked by unanswered questions
- single-select answers serialize as arrays
- single-select free-form answers replace selected options for that question
- multi-select free-form answers augment selected options instead of clearing them
- preview questions do not get the synthetic custom-answer option
- deselected option notes stay in UI state
- only selected option notes are emitted in the final result
- editor lifecycle stays in the controller, not in the reducers
Documentation rule
Docs should explain contracts, responsibilities, and invariants. Code and tests should explain the rest.