Description
install.js currently hardcodes 10 CLIs, auto-registers them without checking if they're installed, and floods ~/.claude.json with 6 unwanted CCR presets. There's no way for users to control what gets registered. We need to replace the hardcoded list with a detection manifest that defines what to look for and how to detect it, and wire up install.js to scan, show, and ask before registering.
User Story
As someone running install.js, I want it to discover what CLIs are installed, show me what's available, and let me confirm what gets registered — so I never get tooling I didn't ask for and no CCR presets ever appear.
Acceptance Criteria
Decomposition
- Open question: confirm manifest filename and path (proposed:
nf/bin/providers.json)
- Create manifest with detect+install entries for claude, opencode, gemini, codex
- Refactor install.js: replace hardcoded selectedRuntimes with manifest reader
- Add detectRunner() that runs
command -v per manifest entry and returns found/not-found
- Add confirmation prompt per found CLI (y/N), skip if --auto or explicit flags set
- Remove all ccr references from install.js (runtime detection, MCP server, everything)
- Test: run install.js with no flags — should prompt, not auto-register
- Test: run install.js --auto — should register detected without prompting
- Test: run install.js --claude — should register only claude without prompting
Difficulty
M — Medium. The logic is straightforward (read manifest, run detect, prompt, register), but it touches multiple sections of install.js and introduces a new file. The CCR removal is clean and isolated. Main risk is the prompt UX interaction with the existing flag parsing — keep it simple.
Routing
Claude — Complex refactor of a large, stateful script with branching logic and UX interaction — needs careful reading of the existing code to avoid regressions.
Labels
install feature priority:P2 refactor
Description
install.js currently hardcodes 10 CLIs, auto-registers them without checking if they're installed, and floods ~/.claude.json with 6 unwanted CCR presets. There's no way for users to control what gets registered. We need to replace the hardcoded list with a detection manifest that defines what to look for and how to detect it, and wire up install.js to scan, show, and ask before registering.
User Story
As someone running install.js, I want it to discover what CLIs are installed, show me what's available, and let me confirm what gets registered — so I never get tooling I didn't ask for and no CCR presets ever appear.
Acceptance Criteria
nf/bin/providers.json) exists as a read-only file defining each CLI's install command and detect commandDecomposition
nf/bin/providers.json)command -vper manifest entry and returns found/not-foundDifficulty
M — Medium. The logic is straightforward (read manifest, run detect, prompt, register), but it touches multiple sections of install.js and introduces a new file. The CCR removal is clean and isolated. Main risk is the prompt UX interaction with the existing flag parsing — keep it simple.
Routing
Claude — Complex refactor of a large, stateful script with branching logic and UX interaction — needs careful reading of the existing code to avoid regressions.
Labels
installfeaturepriority:P2refactor