name: formax-config-settings-workflow description: Use when implementing or extending /config (storage, prompt injection, request params, UI-only toggles) with tests and strict UI parity.
formax-config-settings-workflow
Goal
Use this skill when changing runtime config merge semantics, /config persistence, or the current settings exposed by the config dialog.
Read First
docs/contracts/config-settings-contract.mddocs/environment-variables.mddocs/contracts/prompt-tool-exposure-contract.mdwhen a setting affects prompt injection or request composition
These docs are canonical. If stable behavior changes, update them before or with code.
Code Map
- Config schema + merge semantics
packages/core/src/config/settings/schema.ts(add fields + defaults; validate values)packages/core/src/config/settings/resolve.ts(merge precedence +sourcesmapping)packages/core/src/config/settings/persist.ts(patch read/write +stripDefaultsFromPatch)
- Disk locations
packages/core/src/adapters/fs/configPaths.ts(project/global config dirs)packages/core/src/adapters/fs/configFiles.ts(loadconfig.jsonpatches)packages/core/src/config/config.ts(finalRuntimeConfigshape used by UI/runtime)
- /config UI overlay
packages/core/src/tui/config/ConfigDialog.tsx(reads effective config + writes patches)packages/core/src/tui/config/constants.ts/packages/core/src/tui/config/reducer.ts/packages/core/src/tui/config/ui.tsxpackages/core/src/screens/REPL.tsx(mount overlay + reload runtime config on exit)
- Runtime wiring (effects)
- Prompt injection:
packages/core/src/features/repl/controller/send/sendMainTurn.ts+packages/core/src/features/repl/controller/session/localCommandInjection.ts+packages/core/src/prompts/reminders/* - Request parameters:
packages/core/src/chat/engine.ts→packages/core/src/streaming/** - UI-only flags:
packages/core/src/screens/REPL.tsxand small helpers underpackages/core/src/screens/repl/*
- Prompt injection:
- Current
/configsubsetpackages/core/src/features/commands/configDialogService.tscurrently ownsoutputStyle,thinkingMode,verboseOutput
Current Behavior Checkpoints
- Classify each setting before coding:
- prompt-affecting
- request-parameter
- UI-only
- Storage rule:
- User scope ->
$FORMAX_CONFIG_DIR/config.json - Project scope ->
<repo>/.formax/config.json - Prefer sparse writes; do not persist defaults just because a dialog touched them
- User scope ->
- Immediate effect:
/configsaves are expected to reload effective runtime config in-process- avoid "restart required" behavior unless that is an explicit change
- Exit-message contract:
- unchanged dialog ->
Status dialog dismissed - changed setting ->
Set <field> to <value>style subline
- unchanged dialog ->
Minimal Workflow
- Classify the setting first: prompt-affecting, request-parameter, or UI-only.
- Update the config settings contract first; if env names or classification changed, also update
docs/environment-variables.md. - Change schema / resolve / persist before changing dialog wiring or runtime effects.
- Preserve sparse writes and immediate in-process reload behavior.
- Only output-style style changes may inject next-turn local command blocks; non prompt-affecting settings must stay out of model context.
- Run the minimum regression set below before review.
Minimum Regression
bun run test -- packages/core/src/config/settings/schema.test.ts packages/core/src/config/settings/resolve.test.ts packages/core/src/config/settings/persist.test.tsbun run test -- packages/core/src/features/commands/configDialogService.test.tsbun run test -- packages/core/src/tui/config/ConfigDialog.test.tsxwhen dialog UI changesbun run test -- packages/core/src/features/repl/controller/session/localCommandInjection.test.ts packages/core/src/features/repl/controller/send/sendMainTurn.test.tswhen prompt-affecting config changesbun run test -- packages/core/src/screens/repl/thinkingBlock.test.tsxwhen UI-only thinking visibility changesbun run type-checkwhen config shape or runtime wiring changes
Guardrails
- Do not add new config scopes or extra config files (
cache.json,runtime.json, etc.) without an explicit decision. - Do not inject next-turn prompt blocks for UI-only or request-only settings.
- Do not let
docs/environment-variables.mdand config behavior drift into two separate truths; names live there, merge/persist semantics live in the contract. - Do not change dialog copy/spacing/colors unless explicitly requested.
- Add/extend targeted tests before refactoring config wiring; tests are not the whole spec, but they should lock current persistence semantics first.