UNPKG

@nanocollective/nanocoder

Version:

A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter

76 lines 4.15 kB
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime"; import { existsSync } from 'node:fs'; import { join } from 'node:path'; import { Box, Text, useInput } from 'ink'; import SelectInput from 'ink-select-input'; import { useState } from 'react'; import { colors } from '../../config/index.js'; import { getConfigPath } from '../../config/paths.js'; import { useResponsiveTerminal } from '../../hooks/useTerminalWidth.js'; export function LocationStep({ onComplete, onBack, projectDir, configFileName = 'agents.config.json', }) { const { isNarrow, truncatePath } = useResponsiveTerminal(); const projectPath = join(projectDir, configFileName); const globalPath = join(getConfigPath(), configFileName); const projectExists = existsSync(projectPath); const globalExists = existsSync(globalPath); const [mode, setMode] = useState(() => { // If project config exists, show existing config menu if (projectExists) { return 'existing-config'; } // If global exists but project doesn't, still show location selection // but we'll note the global config exists return 'select-location'; }); const existingPath = projectExists ? projectPath : globalPath; const locationOptions = [ { label: `Current project directory`, value: 'project', }, { label: `Global user config`, value: 'global', }, ]; const existingConfigOptions = [ { label: 'Edit this configuration', value: 'edit' }, { label: 'Create new config in different location', value: 'new' }, ]; const handleLocationSelect = (item) => { onComplete(item.value); }; const handleExistingConfigSelect = (item) => { if (item.value === 'edit') { const location = projectExists ? 'project' : 'global'; onComplete(location); } else if (item.value === 'new') { setMode('select-location'); } else { // Cancel onBack?.(); } }; // Handle Shift+Tab to go back from select-location to existing-config useInput((_input, key) => { if (key.shift && key.tab) { // If we're in select-location mode and came from existing-config, go back if (mode === 'select-location' && (projectExists || globalExists)) { setMode('existing-config'); } // Otherwise, do nothing - this is the first screen of the wizard // The user should use Esc to exit the wizard completely } }); if (mode === 'existing-config') { return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { bold: true, color: colors.primary, children: ["Configuration found at:", ' '] }), _jsx(Text, { color: colors.secondary, children: isNarrow ? truncatePath(existingPath, 40) : existingPath })] }), _jsx(SelectInput, { items: existingConfigOptions, onSelect: (item) => handleExistingConfigSelect(item) })] })); } return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: colors.primary, children: isNarrow ? 'Where to create config?' : 'Where would you like to create your configuration?' }) }), globalExists && !projectExists && (_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.warning, children: isNarrow ? 'Note: Global config exists' : 'Note: Global config exists at' }), !isNarrow && _jsx(Text, { color: colors.secondary, children: globalPath })] })), _jsx(SelectInput, { items: locationOptions, onSelect: (item) => handleLocationSelect(item) }), !isNarrow && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.secondary, children: "Tip: Project configs are useful for team settings. Global configs work across all projects." }) }))] })); } //# sourceMappingURL=location-step.js.map