tdecollab 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../tools/tui/index.tsx","../../tools/tui/App.tsx","../../tools/tui/command-def.ts","../../tools/tui/menu-def.ts","../../tools/tui/screens/ErrorScreen.tsx","../../tools/tui/components/AppShell.tsx","../../tools/tui/theme.ts","../../tools/tui/components/HeaderBar.tsx","../../tools/tui/components/Keymap.tsx","../../tools/tui/components/LogPane.tsx","../../tools/tui/components/MenuTree.tsx","../../tools/tui/components/Panel.tsx","../../tools/tui/screens/FormScreen.tsx","../../tools/tui/components/FilePicker.tsx","../../tools/tui/components/FormField.tsx","../../tools/tui/url-parser.ts","../../tools/tui/screens/HistoryScreen.tsx","../../tools/tui/screens/ListScreen.tsx","../../tools/tui/screens/MenuScreen.tsx","../../tools/tui/screens/RunningScreen.tsx","../../tools/tui/components/Spinner.tsx","../../tools/tui/screens/TextView.tsx","../../tools/tui/state.ts","../../tools/tui/tuiconfig.ts","../../tools/tui/history.ts","../../tools/tui/executor/confluence.ts","../../tools/tui/executor/jira.ts","../../tools/tui/executor/gitlab.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { render } from 'ink';\nimport { App } from './App.js';\nimport { loadTuiConfig } from './tuiconfig.js';\n\n// 터미널 alternate screen buffer 진입/복귀 (vim/less 방식)\nconst ENTER_ALT_SCREEN = '\\x1b[?1049h\\x1b[H';\nconst LEAVE_ALT_SCREEN = '\\x1b[?1049l';\nconst HIDE_CURSOR = '\\x1b[?25l';\nconst SHOW_CURSOR = '\\x1b[?25h';\n\nlet cleanedUp = false;\nfunction cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n process.stdout.write(SHOW_CURSOR + LEAVE_ALT_SCREEN);\n}\n\nasync function main() {\n const config = await loadTuiConfig();\n\n // alternate screen 진입 (전체 화면 모드)\n process.stdout.write(ENTER_ALT_SCREEN + HIDE_CURSOR);\n\n // 비정상 종료 대비\n process.on('exit', cleanup);\n process.on('SIGINT', () => { cleanup(); process.exit(130); });\n process.on('SIGTERM', () => { cleanup(); process.exit(143); });\n process.on('uncaughtException', (err) => {\n cleanup();\n console.error(err);\n process.exit(1);\n });\n\n const { waitUntilExit } = render(<App config={config} />, {\n exitOnCtrlC: true,\n });\n\n await waitUntilExit();\n cleanup();\n}\n\n// top-level await 로 main() 을 끝까지 대기한다.\n// 이렇게 해야 cli.ts 에서 `await import('./tui/index.js')` 가 main() 완료 시점까지 블로킹된다.\ntry {\n await main();\n} catch (err) {\n cleanup();\n console.error('TUI 시작 실패:', err);\n process.exit(1);\n}\n","import { Box, useApp, useStdout } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { COMMANDS } from './command-def.js';\nimport { DEFAULT_EXPANDED, getParentMenuKeys } from './menu-def.js';\nimport { ErrorScreen } from './screens/ErrorScreen.js';\nimport { FormScreen } from './screens/FormScreen.js';\nimport { HistoryScreen } from './screens/HistoryScreen.js';\nimport { ListScreen } from './screens/ListScreen.js';\nimport { MenuScreen } from './screens/MenuScreen.js';\nimport { RunningScreen } from './screens/RunningScreen.js';\nimport { TextView } from './screens/TextView.js';\nimport type { AppState, HistoryEntry, LogEntry, StepEntry } from './state.js';\nimport { makeLog } from './state.js';\nimport { DEFAULT_ACCENT } from './theme.js';\nimport { loadTuiConfig, saveLastUsed, type TuiConfig } from './tuiconfig.js';\nimport { appendHistory, loadHistory } from './history.js';\n\n// Executor imports\nimport { executePageGet, executePageCreate, executeSpaceList, executeSearch, executePageUpdate } from './executor/confluence.js';\nimport { executeIssueGet, executeIssueCreate, executeIssueTransition, executeJiraSearch } from './executor/jira.js';\nimport { executeMrList, executeMrGet, executeMrCreate, executePipelineGet } from './executor/gitlab.js';\n\nconst EXECUTOR_MAP: Record<string, (\n values: Record<string, string | boolean>,\n onSteps: (s: StepEntry[]) => void,\n onLog: (l: LogEntry) => void,\n) => Promise<{ type: 'text' | 'list'; content?: string; list?: Array<Record<string, string>>; cols?: string[]; logs: LogEntry[] }>> = {\n 'confluence:page:get': executePageGet,\n 'confluence:page:create': executePageCreate,\n 'confluence:page:update': executePageUpdate,\n 'confluence:space:list': executeSpaceList,\n 'confluence:search': executeSearch,\n 'jira:issue:get': executeIssueGet,\n 'jira:issue:create': executeIssueCreate,\n 'jira:issue:transition': executeIssueTransition,\n 'jira:search': executeJiraSearch,\n 'gitlab:mr:list': executeMrList,\n 'gitlab:mr:get': executeMrGet,\n 'gitlab:mr:create': executeMrCreate,\n 'gitlab:pipeline:get': executePipelineGet,\n};\n\ninterface AppProps {\n config: TuiConfig;\n}\n\nconst INITIAL_STATE: AppState = {\n screen: 'menu',\n activePath: 'confluence:page:get',\n expandedKeys: DEFAULT_EXPANDED,\n commandKey: '',\n formValues: {},\n formErrors: {},\n focusedField: 0,\n steps: [],\n progress: 0,\n resultText: '',\n resultList: [],\n resultListCols: [],\n resultListSelected: 0,\n logs: [makeLog('info', 'session 시작 · tdecollab TUI v0.2.3')],\n history: loadHistory(),\n historySelected: 0,\n};\n\nexport function App({ config }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const accent = config.accent ?? DEFAULT_ACCENT;\n const [state, setState] = useState<AppState>(INITIAL_STATE);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // 터미널 크기 추적 (resize 대응)\n const [size, setSize] = useState({\n cols: stdout?.columns ?? 120,\n rows: stdout?.rows ?? 40,\n });\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setSize({ cols: stdout.columns, rows: stdout.rows });\n stdout.on('resize', onResize);\n return () => { stdout.off('resize', onResize); };\n }, [stdout]);\n\n const addLog = useCallback((log: LogEntry) => {\n setState((s) => ({ ...s, logs: [...s.logs, log] }));\n }, []);\n\n // 메뉴에서 커맨드 선택\n const handleSelectCommand = useCallback((commandKey: string) => {\n const def = COMMANDS[commandKey];\n if (!def) return;\n\n // cosmiconfig에서 마지막 사용값 로드\n const lastUsed = config.lastUsed?.[commandKey] ?? {};\n const initValues: Record<string, string | boolean> = {};\n for (const f of def.fields) {\n initValues[f.key] = f.key in lastUsed ? lastUsed[f.key] : (f.defaultValue ?? '');\n }\n\n // 선택된 커맨드의 부모 메뉴들을 자동으로 확장 상태에 포함시킨다\n const parents = getParentMenuKeys(commandKey);\n\n setState((s) => ({\n ...s,\n screen: 'form',\n commandKey,\n formValues: initValues,\n formErrors: {},\n focusedField: 0,\n activePath: commandKey,\n expandedKeys: Array.from(new Set([...s.expandedKeys, ...parents])),\n }));\n addLog(makeLog('dim', `폼 열기: ${commandKey}`));\n }, [config.lastUsed, addLog]);\n\n // 메뉴 확장/축소 토글\n const handleToggleExpanded = useCallback((key: string) => {\n setState((s) => ({\n ...s,\n expandedKeys: s.expandedKeys.includes(key)\n ? s.expandedKeys.filter((k) => k !== key)\n : [...s.expandedKeys, key],\n }));\n }, []);\n\n // 폼에서 실행\n const handleRun = useCallback(async (values: Record<string, string | boolean>) => {\n const commandKey = stateRef.current.commandKey;\n const executor = EXECUTOR_MAP[commandKey];\n if (!executor) {\n addLog(makeLog('err', `실행기를 찾을 수 없습니다: ${commandKey}`));\n return;\n }\n\n const startTime = Date.now();\n\n // 실행 화면으로 전환\n setState((s) => ({\n ...s,\n screen: 'running',\n formValues: values,\n steps: [],\n progress: 0,\n }));\n addLog(makeLog('run', `tdecollab ${commandKey.split(':').join(' ')}`));\n\n // executor 는 imageDir 을 자동으로 output 디렉토리 기준으로 resolve 하므로\n // 사용자 입력 원본을 그대로 전달한다 (preview 만 결합된 경로로 표시).\n try {\n const result = await executor(\n values,\n (steps) => setState((s) => ({ ...s, steps })),\n (log) => setState((s) => ({ ...s, logs: [...s.logs, log] })),\n );\n\n const dur = `${((Date.now() - startTime) / 1000).toFixed(1)}s`;\n const def = COMMANDS[commandKey];\n const svc = def?.svc === 'confluence' ? 'cf' : def?.svc === 'jira' ? 'jr' : 'gl';\n\n // 히스토리에 저장\n const histEntry: HistoryEntry = {\n when: new Date().toTimeString().slice(0, 5),\n svc,\n cmd: commandKey.split(':').join(' '),\n state: 'ok',\n dur,\n result: result.type === 'list' ? `${result.list?.length ?? 0} items` : 'done',\n };\n appendHistory(histEntry);\n saveLastUsed(commandKey, values);\n\n // 결과 화면으로 전환\n if (result.type === 'list') {\n setState((s) => ({\n ...s,\n screen: 'result-list',\n resultList: result.list ?? [],\n resultListCols: result.cols ?? [],\n resultListSelected: 0,\n logs: [...s.logs, makeLog('ok', `완료 (${dur})`)],\n history: [histEntry, ...s.history],\n }));\n } else {\n setState((s) => ({\n ...s,\n screen: 'result-text',\n resultText: result.content ?? '',\n logs: [...s.logs, makeLog('ok', `완료 (${dur})`)],\n history: [histEntry, ...s.history],\n }));\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const dur = `${((Date.now() - startTime) / 1000).toFixed(1)}s`;\n const def = COMMANDS[commandKey];\n const svc = def?.svc === 'confluence' ? 'cf' : def?.svc === 'jira' ? 'jr' : 'gl';\n\n const histEntry: HistoryEntry = {\n when: new Date().toTimeString().slice(0, 5),\n svc,\n cmd: commandKey.split(':').join(' '),\n state: 'err',\n dur,\n result: msg.slice(0, 40),\n };\n appendHistory(histEntry);\n\n setState((s) => ({\n ...s,\n screen: 'error',\n formErrors: { error: msg },\n logs: [...s.logs, makeLog('err', msg)],\n history: [histEntry, ...s.history],\n }));\n }\n }, [addLog]);\n\n const handleBack = useCallback(() => {\n setState((s) => ({ ...s, screen: 'menu' }));\n }, []);\n\n const handleOpenHistory = useCallback(() => {\n setState((s) => ({ ...s, screen: 'history', history: loadHistory() }));\n }, []);\n\n const handleReplay = useCallback((entry: HistoryEntry) => {\n // 커맨드 키로 변환\n const commandKey = entry.cmd.replace(/\\s+/g, ':');\n handleSelectCommand(commandKey);\n }, [handleSelectCommand]);\n\n const handleSavePreset = useCallback((values: Record<string, string | boolean>) => {\n const commandKey = stateRef.current.commandKey;\n saveLastUsed(commandKey, values);\n addLog(makeLog('ok', `프리셋 저장: ${commandKey}`));\n }, [addLog]);\n\n const handleQuit = useCallback(() => exit(), [exit]);\n\n let screen;\n switch (state.screen) {\n case 'menu':\n screen = (\n <MenuScreen\n state={state}\n onSelectCommand={handleSelectCommand}\n onToggleExpanded={handleToggleExpanded}\n onOpenHistory={handleOpenHistory}\n onQuit={handleQuit}\n accent={accent}\n />\n );\n break;\n case 'form':\n screen = (\n <FormScreen\n state={state}\n onRun={handleRun}\n onBack={handleBack}\n onSavePreset={handleSavePreset}\n accent={accent}\n />\n );\n break;\n case 'running':\n screen = <RunningScreen state={state} onCancel={handleBack} accent={accent} />;\n break;\n case 'result-list':\n screen = <ListScreen state={state} onBack={handleBack} accent={accent} />;\n break;\n case 'result-text':\n screen = <TextView state={state} onBack={handleBack} accent={accent} />;\n break;\n case 'error':\n screen = (\n <ErrorScreen\n state={state}\n onBack={() => setState((s) => ({ ...s, screen: 'form' }))}\n onRetry={() => handleRun(state.formValues)}\n accent={accent}\n />\n );\n break;\n case 'history':\n screen = <HistoryScreen state={state} onBack={handleBack} onReplay={handleReplay} accent={accent} />;\n break;\n default:\n screen = (\n <MenuScreen\n state={state}\n onSelectCommand={handleSelectCommand}\n onToggleExpanded={handleToggleExpanded}\n onOpenHistory={handleOpenHistory}\n onQuit={handleQuit}\n accent={accent}\n />\n );\n }\n\n // 터미널 전체 화면을 채우는 루트 컨테이너\n return (\n <Box width={size.cols} height={size.rows} flexDirection=\"column\">\n {screen}\n </Box>\n );\n}\n","export type FieldType = 'text' | 'bool' | 'select';\n\nexport interface FieldDef {\n key: string;\n label: string;\n type: FieldType;\n required?: boolean;\n hint?: string;\n defaultValue?: string | boolean;\n prefix?: string;\n options?: string[]; // select 타입용\n pathType?: 'file' | 'dir'; // 경로 타입: Enter 시 디렉토리 선택창 오픈\n}\n\nexport interface CommandDef {\n key: string;\n label: string;\n description: string;\n synopsis: string;\n svc: 'confluence' | 'jira' | 'gitlab';\n fields: FieldDef[];\n}\n\nexport const COMMANDS: Record<string, CommandDef> = {\n 'confluence:page:get': {\n key: 'confluence:page:get',\n label: 'confluence page get',\n description: 'Confluence 페이지를 조회하고 Markdown으로 변환하여 출력하거나 파일로 저장합니다. 이미지를 함께 다운로드할 수 있습니다.',\n synopsis: 'tdecollab confluence page get <pageId> [options]',\n svc: 'confluence',\n fields: [\n { key: 'pageId', label: 'pageId', type: 'text', required: true, hint: '페이지 ID (숫자)', prefix: '#' },\n { key: 'output', label: '--output', type: 'text', hint: '저장할 Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n { key: 'downloadImages', label: '-d --download-images', type: 'bool', defaultValue: false },\n { key: 'imageDir', label: '--image-dir', type: 'text', defaultValue: 'images', hint: '이미지 디렉토리 이름 (output 파일 위치 하위에 생성됨)', prefix: '📁' },\n { key: 'quiet', label: '-q --quiet', type: 'bool', defaultValue: false },\n { key: 'raw', label: '-r --raw', type: 'bool', defaultValue: false },\n ],\n },\n\n 'confluence:page:create': {\n key: 'confluence:page:create',\n label: 'confluence page create',\n description: 'Markdown 파일 또는 텍스트로 Confluence 페이지를 생성합니다.',\n synopsis: 'tdecollab confluence page create -s <space> -t <title> [options]',\n svc: 'confluence',\n fields: [\n { key: 'space', label: '--space', type: 'text', required: true, hint: 'Confluence 스페이스 키 (예: TDE)', prefix: '🔑' },\n { key: 'title', label: '--title', type: 'text', required: true, hint: '페이지 제목', prefix: '✎' },\n { key: 'file', label: '--file', type: 'text', hint: 'Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n { key: 'parent', label: '--parent', type: 'text', hint: '부모 페이지 ID', prefix: '#' },\n ],\n },\n\n 'confluence:page:update': {\n key: 'confluence:page:update',\n label: 'confluence page update',\n description: '기존 Confluence 페이지를 업데이트합니다.',\n synopsis: 'tdecollab confluence page update <pageId> [options]',\n svc: 'confluence',\n fields: [\n { key: 'pageId', label: 'pageId', type: 'text', required: true, hint: '업데이트할 페이지 ID', prefix: '#' },\n { key: 'title', label: '--title', type: 'text', hint: '새 제목 (생략 시 기존 제목 유지)' },\n { key: 'file', label: '--file', type: 'text', hint: 'Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n ],\n },\n\n 'confluence:space:list': {\n key: 'confluence:space:list',\n label: 'confluence space list',\n description: 'Confluence 스페이스 목록을 조회합니다.',\n synopsis: 'tdecollab confluence space list [options]',\n svc: 'confluence',\n fields: [\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '50', hint: '최대 조회 수' },\n ],\n },\n\n 'confluence:search': {\n key: 'confluence:search',\n label: 'confluence search',\n description: 'CQL(Confluence Query Language)로 페이지를 검색합니다.',\n synopsis: 'tdecollab confluence search <cql> [options]',\n svc: 'confluence',\n fields: [\n { key: 'cql', label: 'cql', type: 'text', required: true, hint: 'CQL 검색 쿼리 (예: title ~ \"가이드\" AND space = TDE)', prefix: 'cql›' },\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '10', hint: '최대 결과 수' },\n ],\n },\n\n 'jira:issue:get': {\n key: 'jira:issue:get',\n label: 'jira issue get',\n description: 'JIRA 이슈를 조회합니다.',\n synopsis: 'tdecollab jira issue get <issueId>',\n svc: 'jira',\n fields: [\n { key: 'issueId', label: 'issueId', type: 'text', required: true, hint: '이슈 키 (예: PROJ-1234)', prefix: '🎫' },\n ],\n },\n\n 'jira:issue:create': {\n key: 'jira:issue:create',\n label: 'jira issue create',\n description: 'JIRA 이슈를 생성합니다.',\n synopsis: 'tdecollab jira issue create -p <project> -s <summary> [options]',\n svc: 'jira',\n fields: [\n { key: 'project', label: '--project (-p)', type: 'text', required: true, hint: '프로젝트 키 (예: PROJ)' },\n { key: 'summary', label: '--summary (-s)', type: 'text', required: true, hint: '이슈 제목' },\n { key: 'type', label: '--type (-t)', type: 'select', defaultValue: 'Task', options: ['Task', 'Bug', 'Story', 'Epic', 'Sub-task'] },\n { key: 'assignee', label: '--assignee (-a)', type: 'text', hint: '담당자 사용자명' },\n { key: 'labels', label: '--labels (-l)', type: 'text', hint: '레이블 (쉼표 구분)' },\n ],\n },\n\n 'jira:issue:transition': {\n key: 'jira:issue:transition',\n label: 'jira issue transition',\n description: 'JIRA 이슈 상태를 전환합니다.',\n synopsis: 'tdecollab jira issue transition <issueId> -t <transitionId>',\n svc: 'jira',\n fields: [\n { key: 'issueId', label: 'issueId', type: 'text', required: true, hint: '이슈 키', prefix: '🎫' },\n { key: 'transitionId', label: '--transition (-t)', type: 'text', required: true, hint: 'Transition ID' },\n ],\n },\n\n 'jira:search': {\n key: 'jira:search',\n label: 'jira search',\n description: 'JQL로 JIRA 이슈를 검색합니다.',\n synopsis: 'tdecollab jira search <jql> [options]',\n svc: 'jira',\n fields: [\n { key: 'jql', label: 'jql', type: 'text', required: true, hint: 'JQL 쿼리 (예: assignee = currentUser())', prefix: 'jql›' },\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '20', hint: '최대 결과 수' },\n ],\n },\n\n 'gitlab:mr:list': {\n key: 'gitlab:mr:list',\n label: 'gitlab mr list',\n description: 'GitLab 프로젝트의 Merge Request 목록을 조회합니다.',\n synopsis: 'tdecollab gitlab mr list <projectId> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID (숫자)', prefix: '#' },\n { key: 'state', label: '--state (-s)', type: 'select', defaultValue: 'opened', options: ['opened', 'closed', 'merged', 'all'] },\n ],\n },\n\n 'gitlab:mr:get': {\n key: 'gitlab:mr:get',\n label: 'gitlab mr get',\n description: 'GitLab Merge Request 상세 정보를 조회합니다.',\n synopsis: 'tdecollab gitlab mr get <projectId> <mrId>',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'mrId', label: 'mrId', type: 'text', required: true, hint: 'MR 번호', prefix: '!' },\n ],\n },\n\n 'gitlab:mr:create': {\n key: 'gitlab:mr:create',\n label: 'gitlab mr create',\n description: 'GitLab Merge Request를 생성합니다.',\n synopsis: 'tdecollab gitlab mr create <projectId> --source <branch> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'sourceBranch', label: '--source', type: 'text', required: true, hint: '소스 브랜치명' },\n { key: 'targetBranch', label: '--target', type: 'text', defaultValue: 'main', hint: '타겟 브랜치명' },\n { key: 'title', label: '--title', type: 'text', hint: 'MR 제목 (기본: 브랜치명)' },\n ],\n },\n\n 'gitlab:pipeline:get': {\n key: 'gitlab:pipeline:get',\n label: 'gitlab pipeline get',\n description: 'GitLab 파이프라인 정보를 조회합니다.',\n synopsis: 'tdecollab gitlab pipeline get <projectId> <pipelineId> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'pipelineId', label: 'pipelineId', type: 'text', required: true, hint: '파이프라인 ID', prefix: '#' },\n { key: 'jobs', label: '--jobs', type: 'bool', defaultValue: false },\n ],\n },\n};\n\n// 커맨드 실행/미리보기 직전에 값을 가공한다.\n// confluence:page:get 의 imageDir 은 사용자가 디렉토리 이름만 입력하지만,\n// 실제 cli 파라미터로는 output 파일 디렉토리 하위 경로로 결합되어 전달되어야 한다.\nexport function applyValueTransform(\n commandKey: string,\n values: Record<string, string | boolean>,\n): Record<string, string | boolean> {\n if (commandKey === 'confluence:page:get') {\n const result = { ...values };\n const imageDir = String(result['imageDir'] ?? '').trim();\n const output = String(result['output'] ?? '').trim();\n if (imageDir && output) {\n // 이미 / 가 포함된 경로면(사용자가 직접 경로 입력) 그대로 둔다\n if (!imageDir.includes('/')) {\n const lastSlash = output.lastIndexOf('/');\n const outputDir = lastSlash >= 0 ? output.substring(0, lastSlash) : '.';\n result['imageDir'] = `${outputDir}/${imageDir}`.replace(/\\/+/g, '/');\n }\n }\n return result;\n }\n return values;\n}\n\n// 커맨드 preview 문자열 생성\nexport function buildPreview(def: CommandDef, values: Record<string, string | boolean>): string {\n const transformed = applyValueTransform(def.key, values);\n const parts: string[] = ['tdecollab', ...def.key.split(':')];\n\n for (const field of def.fields) {\n const val = transformed[field.key] ?? field.defaultValue;\n if (!val && val !== false) continue;\n\n if (field.type === 'bool') {\n if (val === true) parts.push(`-${field.key.charAt(0)}`);\n } else if (field.type === 'text') {\n const isPositional = !field.label.startsWith('-');\n if (isPositional) {\n if (val) parts.push(String(val));\n } else {\n const flag = field.label.split(' ')[0];\n if (val) parts.push(flag, String(val));\n }\n }\n }\n return parts.join(' ');\n}\n","export interface MenuItem {\n key: string;\n label: string;\n icon?: string;\n badge?: string;\n badgeColor?: string;\n dim?: boolean;\n children?: MenuItem[];\n commandKey?: string; // 선택 시 실행할 커맨드\n}\n\nexport const MENU: MenuItem[] = [\n {\n key: 'confluence',\n label: 'Confluence',\n icon: '◆',\n badge: '9',\n badgeColor: '#7DD3FC',\n children: [\n {\n key: 'confluence/page',\n label: 'page',\n icon: '▸',\n children: [\n { key: 'confluence/page/get', label: 'get', icon: '·', commandKey: 'confluence:page:get' },\n { key: 'confluence/page/create', label: 'create', icon: '·', commandKey: 'confluence:page:create' },\n { key: 'confluence/page/update', label: 'update', icon: '·', commandKey: 'confluence:page:update' },\n ],\n },\n {\n key: 'confluence/space',\n label: 'space',\n icon: '▸',\n children: [\n { key: 'confluence/space/list', label: 'list', icon: '·', commandKey: 'confluence:space:list' },\n ],\n },\n {\n key: 'confluence/search',\n label: 'search',\n icon: '▸',\n commandKey: 'confluence:search',\n },\n ],\n },\n {\n key: 'jira',\n label: 'JIRA',\n icon: '◆',\n badge: '7',\n badgeColor: '#86EFAC',\n children: [\n {\n key: 'jira/issue',\n label: 'issue',\n icon: '▸',\n children: [\n { key: 'jira/issue/get', label: 'get', icon: '·', commandKey: 'jira:issue:get' },\n { key: 'jira/issue/create', label: 'create', icon: '·', commandKey: 'jira:issue:create' },\n { key: 'jira/issue/transition', label: 'transition', icon: '·', commandKey: 'jira:issue:transition' },\n ],\n },\n {\n key: 'jira/search',\n label: 'search',\n icon: '▸',\n commandKey: 'jira:search',\n },\n ],\n },\n {\n key: 'gitlab',\n label: 'GitLab',\n icon: '◆',\n badge: '7',\n badgeColor: '#FBBF24',\n children: [\n {\n key: 'gitlab/mr',\n label: 'mr',\n icon: '▸',\n children: [\n { key: 'gitlab/mr/list', label: 'list', icon: '·', commandKey: 'gitlab:mr:list' },\n { key: 'gitlab/mr/get', label: 'get', icon: '·', commandKey: 'gitlab:mr:get' },\n { key: 'gitlab/mr/create', label: 'create', icon: '·', commandKey: 'gitlab:mr:create' },\n ],\n },\n {\n key: 'gitlab/pipeline',\n label: 'pipeline',\n icon: '▸',\n children: [\n { key: 'gitlab/pipeline/get', label: 'get', icon: '·', commandKey: 'gitlab:pipeline:get' },\n ],\n },\n ],\n },\n];\n\nexport const META_ITEMS: MenuItem[] = [\n { key: 'history', label: 'History', icon: '⏱' },\n { key: 'settings', label: 'Settings', icon: '⚙', dim: true },\n];\n\n// 메뉴 트리를 평탄화하여 탐색 가능한 배열로 변환\nexport interface FlatItem {\n item: MenuItem;\n depth: number;\n parentKey?: string;\n}\n\nexport function flattenMenu(\n items: MenuItem[],\n expanded: string[],\n depth = 0,\n parentKey?: string,\n): FlatItem[] {\n const result: FlatItem[] = [];\n for (const item of items) {\n result.push({ item, depth, parentKey });\n if (item.children && expanded.includes(item.key)) {\n result.push(...flattenMenu(item.children, expanded, depth + 1, item.key));\n }\n }\n return result;\n}\n\n// 기본 확장 상태\nexport const DEFAULT_EXPANDED = ['confluence', 'confluence/page'];\n\n// commandKey로 breadcrumb 경로 추출\nexport function pathFromCommandKey(commandKey: string): string[] {\n return commandKey.split(':');\n}\n\n// commandKey 의 모든 상위 메뉴 키를 계산 (자동 확장용)\n// 'confluence:page:get' → ['confluence', 'confluence/page']\nexport function getParentMenuKeys(commandKey: string): string[] {\n const menuKey = commandKey.replace(/:/g, '/');\n const parts = menuKey.split('/');\n const parents: string[] = [];\n for (let i = 1; i < parts.length; i++) {\n parents.push(parts.slice(0, i).join('/'));\n }\n return parents;\n}\n","import { Box, Text, useInput } from 'ink';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface ErrorScreenProps {\n state: AppState;\n onBack: () => void;\n onRetry: () => void;\n accent?: string;\n}\n\nexport function ErrorScreen({ state, onBack, onRetry, accent = DEFAULT_ACCENT }: ErrorScreenProps) {\n const crumbs = pathFromCommandKey(state.commandKey);\n const errors = Object.entries(state.formErrors);\n\n useInput((input, key) => {\n if (key.escape) onBack();\n else if (input === 'r' || input === 'R') onRetry();\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.red}>●</Text>\n <Text color={T.red}>{errors.length} errors</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title={crumbs.join(' ')} badge=\"ERROR\" accent={T.red} focused>\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n {/* 에러 배너 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.red}\n paddingX={1}\n flexDirection=\"column\"\n gap={0}\n >\n <Text color={T.red} bold>✕ 유효성 검증에 실패했습니다 (E_VALIDATION)</Text>\n <Text color={T.fgDim}>\n {errors.length}개 오류를 수정한 뒤 다시 시도하세요.\n </Text>\n </Box>\n\n {/* 에러 항목 */}\n {errors.map(([key, msg]) => (\n <Box key={key} flexDirection=\"column\" gap={0}>\n <Box gap={2}>\n <Text color={T.red} bold>{key.padEnd(20)}</Text>\n <Text color={T.red}>{msg}</Text>\n </Box>\n </Box>\n ))}\n\n {/* 로그에서 온 에러 (state.logs 중 err 레벨) */}\n {state.logs.filter((l) => l.level === 'err' || l.level === 'warn').map((l, i) => (\n <Box key={i} gap={2}>\n <Text color={l.level === 'err' ? T.red : T.amber}>\n {l.level === 'err' ? '✕' : '⚠'}\n </Text>\n <Text color={l.level === 'err' ? T.red : T.amber}>{l.text}</Text>\n </Box>\n ))}\n\n {/* 액션 버튼 힌트 */}\n <Box gap={3} marginTop={1}>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.fg}> ↵ Back to form </Text>\n </Box>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.amber}> R Retry </Text>\n </Box>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.fgDim}> Esc Menu </Text>\n </Box>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} title=\"Diagnostics\" />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↵', label: 'back to form' },\n { key: 'R', label: 'retry' },\n { key: 'Esc', label: 'menu' },\n ]} />\n }\n />\n );\n}\n","import { Box } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface AppShellProps {\n header: React.ReactNode;\n menu: React.ReactNode;\n body: React.ReactNode;\n log: React.ReactNode;\n footer?: React.ReactNode;\n menuWidth?: number;\n}\n\nexport function AppShell({\n header,\n menu,\n body,\n log,\n footer,\n menuWidth = 32,\n}: AppShellProps) {\n return (\n <Box flexDirection=\"column\" flexGrow={1} height=\"100%\" width=\"100%\">\n {/* 헤더 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n flexShrink={0}\n >\n {header}\n </Box>\n\n {/* 3-pane 메인 영역 — 남은 공간 모두 차지 */}\n <Box flexGrow={1} gap={1} minHeight={0}>\n {/* 좌측 메뉴 */}\n <Box width={menuWidth} flexShrink={0}>\n {menu}\n </Box>\n {/* 우측 본문 */}\n <Box flexGrow={1} minWidth={0}>\n {body}\n </Box>\n </Box>\n\n {/* 하단 로그 */}\n <Box height={10} flexShrink={0}>\n {log}\n </Box>\n\n {/* 키맵 */}\n {footer && (\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n flexShrink={0}\n >\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n","// 디자인 시스템 색상 토큰 — k9s/charm.sh 분위기의 다크 모던 TUI\nexport const T = {\n bg: '#08090C',\n termBg: '#0E1014',\n panelBg: '#13161C',\n panelHi: '#181C24',\n border: '#2A2F3A',\n borderDim: '#1E222B',\n borderHi: '#3D4452',\n\n fg: '#E6E8EC',\n fgDim: '#9CA3AF',\n fgMute: '#6B7280',\n fgFaint: '#4B5563',\n\n pink: '#FF7BAC',\n cyan: '#7DD3FC',\n mint: '#86EFAC',\n amber: '#FBBF24',\n violet: '#C4B5FD',\n red: '#F87171',\n blue: '#60A5FA',\n};\n\n// 서비스별 브랜드 색상 (히스토리 svc 코드 포함)\nexport const SVC_COLOR: Record<string, string> = {\n confluence: T.cyan,\n jira: T.mint,\n gitlab: T.amber,\n cf: T.cyan,\n jr: T.mint,\n gl: T.amber,\n};\n\n// 기본 accent 색상\nexport const DEFAULT_ACCENT = T.pink;\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface HeaderBarProps {\n crumbs?: string[];\n status?: React.ReactNode;\n accent?: string;\n}\n\nexport function HeaderBar({ crumbs = [], status, accent = T.pink }: HeaderBarProps) {\n return (\n <Box paddingX={1} gap={1}>\n <Text color={accent} bold>tdecollab</Text>\n <Text color={T.fgFaint}>v0.2.3</Text>\n <Text color={T.fgFaint}>│</Text>\n {crumbs.map((c, i) => (\n <React.Fragment key={i}>\n {i > 0 && <Text color={T.fgFaint}>›</Text>}\n <Text color={i === crumbs.length - 1 ? T.fg : T.fgDim}>{c}</Text>\n </React.Fragment>\n ))}\n <Box flexGrow={1} />\n {status && <Box>{status}</Box>}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { T } from '../theme.js';\n\ninterface KeyBinding {\n key: string;\n label: string;\n}\n\ninterface KeymapProps {\n keys: KeyBinding[];\n accent?: string;\n hidden?: boolean;\n}\n\nexport function Keymap({ keys, accent = T.pink, hidden = false }: KeymapProps) {\n if (hidden) return null;\n return (\n <Box paddingX={1} gap={2} flexWrap=\"wrap\">\n {keys.map((k, i) => (\n <Box key={i} gap={1}>\n <Text backgroundColor={T.panelHi} color={accent}> {k.key} </Text>\n <Text color={T.fgDim}>{k.label}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { LogEntry } from '../state.js';\nimport { T } from '../theme.js';\n\nconst LEVEL_COLOR: Record<string, string> = {\n info: T.fgDim,\n ok: T.mint,\n warn: T.amber,\n err: T.red,\n run: T.cyan,\n dim: T.fgMute,\n};\nconst LEVEL_LABEL: Record<string, string> = {\n info: 'INFO',\n ok: ' OK ',\n warn: 'WARN',\n err: ' ERR',\n run: 'RUN ',\n dim: '... ',\n};\n\ninterface LogPaneProps {\n lines: LogEntry[];\n accent?: string;\n title?: string;\n maxLines?: number;\n}\n\nexport function LogPane({ lines, accent = T.pink, title = 'Log', maxLines = 8 }: LogPaneProps) {\n const visible = lines.slice(-maxLines);\n return (\n <Box\n borderStyle=\"round\"\n borderColor={T.borderDim}\n flexDirection=\"column\"\n flexGrow={1}\n >\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n paddingX={1}\n >\n <Text color={T.fgFaint} bold>{title.toUpperCase()}</Text>\n <Box flexGrow={1} />\n <Text color={T.fgFaint}>{lines.length} lines</Text>\n </Box>\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1}>\n {visible.map((l, i) => (\n <Box key={i} gap={2}>\n <Text color={T.fgFaint}>{l.ts}</Text>\n <Text color={LEVEL_COLOR[l.level] ?? T.fgDim} bold>\n {LEVEL_LABEL[l.level] ?? l.level.toUpperCase()}\n </Text>\n <Text\n color={\n l.level === 'err' ? T.red :\n l.level === 'warn' ? T.amber :\n T.fg\n }\n >\n {l.text}\n </Text>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { FlatItem } from '../menu-def.js';\nimport { T } from '../theme.js';\n\ninterface MenuTreeProps {\n items: FlatItem[];\n cursor: number;\n accent?: string;\n maxVisible?: number;\n scrollOffset?: number;\n}\n\nexport function MenuTree({\n items,\n cursor,\n accent = T.pink,\n maxVisible = 30,\n scrollOffset = 0,\n}: MenuTreeProps) {\n const visible = items.slice(scrollOffset, scrollOffset + maxVisible);\n\n return (\n <Box flexDirection=\"column\">\n {visible.map((flat, visIdx) => {\n const idx = visIdx + scrollOffset;\n const { item, depth } = flat;\n const isActive = idx === cursor;\n const indent = depth * 2;\n const isSeparator = item.label.startsWith('─');\n\n if (isSeparator) {\n return (\n <Box key={item.key}>\n <Text color={T.fgFaint}>{item.label}</Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.key} gap={0}>\n {/* 들여쓰기 */}\n <Text>{' '.repeat(indent)}</Text>\n {/* 커서 */}\n <Text color={isActive ? accent : 'transparent'}>{isActive ? '▶' : ' '}</Text>\n {/* 아이콘 */}\n {item.icon && (\n <Text color={isActive ? accent : (item.dim ? T.fgFaint : T.fgDim)}>\n {item.icon}{' '}\n </Text>\n )}\n {/* 레이블 */}\n <Text\n color={isActive ? accent : (item.dim ? T.fgMute : T.fg)}\n bold={isActive}\n >\n {item.label}\n </Text>\n {/* 뱃지 */}\n {item.badge && (\n <Text color={item.badgeColor ?? T.fgDim}> {item.badge}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface PanelProps {\n title?: string;\n badge?: string;\n accent?: string;\n focused?: boolean;\n children: React.ReactNode;\n headerRight?: React.ReactNode;\n width?: number;\n flexGrow?: number;\n}\n\nexport function Panel({\n title,\n badge,\n accent = T.pink,\n focused = false,\n children,\n headerRight,\n width,\n flexGrow,\n}: PanelProps) {\n const borderColor = focused ? accent : T.border;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={borderColor}\n flexDirection=\"column\"\n width={width}\n flexGrow={flexGrow ?? (width ? 0 : 1)}\n >\n {(title || badge) && (\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n paddingX={1}\n paddingY={0}\n >\n {badge && (\n <Text\n backgroundColor={focused ? accent : T.panelHi}\n color={focused ? T.bg : T.fgDim}\n bold\n >\n {' '}{badge}{' '}\n </Text>\n )}\n {title && (\n <Text color={focused ? accent : T.fgDim}>\n {badge ? ' ' : ''}{title}\n </Text>\n )}\n {headerRight && (\n <>\n <Text> </Text>\n {headerRight}\n </>\n )}\n </Box>\n )}\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {children}\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { COMMANDS, buildPreview, type CommandDef, type FieldDef } from '../command-def.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { FilePicker } from '../components/FilePicker.js';\nimport { FormField } from '../components/FormField.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\nimport { applyUrlFill, getUrlFillTargets, parseConfluenceUrl, supportsUrlFill } from '../url-parser.js';\n\ninterface FormScreenProps {\n state: AppState;\n onRun: (values: Record<string, string | boolean>) => void;\n onBack: () => void;\n onSavePreset: (values: Record<string, string | boolean>) => void;\n accent?: string;\n}\n\n// URL 빠른 입력 필드 색상 — 다른 강조색(pink/red/amber)과 hue 차이가 큰 친근한 파랑\nconst URL_FILL_COLOR = T.blue; // '#60A5FA'\n\nexport function FormScreen({ state, onRun, onBack, onSavePreset, accent = DEFAULT_ACCENT }: FormScreenProps) {\n const def: CommandDef | undefined = COMMANDS[state.commandKey];\n const [values, setValues] = useState<Record<string, string | boolean>>(state.formValues);\n const [errors, setErrors] = useState<Record<string, string>>(state.formErrors);\n // URL Quick-fill 필드는 focusIdx = -1 로 표현 (regular 필드는 0~n-1)\n const [focusIdx, setFocusIdx] = useState(state.focusedField);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [urlValue, setUrlValue] = useState('');\n\n if (!def) return <Text color={T.red}>커맨드를 찾을 수 없습니다: {state.commandKey}</Text>;\n\n const fields = def.fields;\n const hasUrlFill = supportsUrlFill(state.commandKey);\n const fillTargets = hasUrlFill ? getUrlFillTargets(state.commandKey) : [];\n const onUrlField = hasUrlFill && focusIdx === -1;\n const currentField: FieldDef | undefined = onUrlField ? undefined : fields[focusIdx];\n const preview = buildPreview(def, values);\n\n // URL 변경 시 자동으로 관련 필드 채우기\n function updateUrl(next: string) {\n setUrlValue(next);\n const parsed = parseConfluenceUrl(next);\n if (parsed.space || parsed.pageId) {\n setValues((v) => applyUrlFill(state.commandKey, parsed, v));\n setErrors({});\n }\n }\n\n // 필드 인덱스 이동 (URL 필드 -1 포함 가능)\n function nextField() {\n setFocusIdx((i) => {\n const min = hasUrlFill ? -1 : 0;\n const next = i + 1;\n return next > fields.length - 1 ? min : next;\n });\n }\n function prevField() {\n setFocusIdx((i) => {\n const min = hasUrlFill ? -1 : 0;\n const prev = i - 1;\n return prev < min ? fields.length - 1 : prev;\n });\n }\n\n function validate(): Record<string, string> {\n const errs: Record<string, string> = {};\n for (const f of fields) {\n if (f.required && !values[f.key]) {\n errs[f.key] = `필수 옵션입니다. ${f.hint ?? ''}`;\n }\n }\n return errs;\n }\n\n function tryRun() {\n const errs = validate();\n if (Object.keys(errs).length > 0) {\n setErrors(errs);\n const firstErrIdx = fields.findIndex((f) => errs[f.key]);\n if (firstErrIdx >= 0) setFocusIdx(firstErrIdx);\n } else {\n setErrors({});\n onRun(values);\n }\n }\n\n useInput((input, key) => {\n if (pickerOpen) return; // Picker가 자체적으로 입력 처리\n\n // === 글로벌 단축키 ===\n // Ctrl+R: Run\n if (key.ctrl && input === 'r') {\n tryRun();\n return;\n }\n\n // Ctrl+S: Save preset\n if (key.ctrl && input === 's') {\n onSavePreset(values);\n return;\n }\n\n // Esc: 취소\n if (key.escape) {\n onBack();\n return;\n }\n\n // === 필드 간 이동 (URL 필드 -1 포함) ===\n if (key.tab && key.shift) {\n prevField();\n return;\n }\n if (key.tab) {\n nextField();\n return;\n }\n if (key.upArrow) {\n prevField();\n return;\n }\n if (key.downArrow) {\n nextField();\n return;\n }\n\n // === URL Quick-fill 필드 처리 ===\n if (onUrlField) {\n if (key.backspace || key.delete) {\n updateUrl(urlValue.slice(0, -1));\n return;\n }\n if (key.return) return; // Enter 무시\n if (input && !key.ctrl && !key.meta) {\n updateUrl(urlValue + input);\n }\n return;\n }\n\n if (!currentField) return;\n\n // === 현재 필드 타입에 따른 처리 ===\n if (currentField.type === 'bool') {\n if (input === ' ' || key.return) {\n setValues((v) => ({ ...v, [currentField.key]: !v[currentField.key] }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n }\n return;\n }\n\n if (currentField.type === 'select') {\n if (input === ' ' || key.return) {\n const opts = currentField.options ?? [];\n const cur = String(values[currentField.key] ?? opts[0]);\n const nextIdx = (opts.indexOf(cur) + 1) % opts.length;\n setValues((v) => ({ ...v, [currentField.key]: opts[nextIdx] }));\n }\n return;\n }\n\n // text / path 필드\n if (key.return) {\n // path 필드: 디렉토리 선택창 열기\n if (currentField.pathType) {\n setPickerOpen(true);\n return;\n }\n // 일반 text: Enter는 무시 (필요 시 다음 필드로)\n return;\n }\n\n // 직접 타이핑: 백스페이스\n if (key.backspace || key.delete) {\n setValues((v) => ({\n ...v,\n [currentField.key]: String(v[currentField.key] ?? '').slice(0, -1),\n }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n return;\n }\n\n // 일반 문자 입력 (제어키 제외)\n if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({\n ...v,\n [currentField.key]: String(v[currentField.key] ?? '') + input,\n }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n const crumbs = pathFromCommandKey(state.commandKey);\n const filledCount = fields.filter((f) => values[f.key] !== '' && values[f.key] !== undefined && values[f.key] !== false).length;\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={Object.keys(errors).length > 0 ? T.red : T.mint}>●</Text>\n <Text color={T.fgDim}>\n {Object.keys(errors).length > 0\n ? `${Object.keys(errors).length} errors`\n : `${filledCount} / ${fields.length} fields`}\n </Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n pickerOpen && currentField?.pathType ? (\n <Panel title={`${currentField.label} — 경로 선택`} badge=\"PICKER\" accent={accent} focused>\n <FilePicker\n initialPath={String(values[currentField.key] ?? '')}\n pathType={currentField.pathType}\n accent={accent}\n onSelect={(selected) => {\n setValues((v) => ({ ...v, [currentField.key]: selected }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n setPickerOpen(false);\n }}\n onCancel={() => setPickerOpen(false)}\n />\n </Panel>\n ) : (\n <Panel\n title={def.label}\n badge=\"FORM\"\n accent={accent}\n focused\n headerRight={<Text color={T.amber}>* required</Text>}\n >\n <Box flexDirection=\"column\" paddingY={1}>\n {/* URL Quick-fill (Confluence page 관련 커맨드만) */}\n {hasUrlFill && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={onUrlField ? URL_FILL_COLOR : T.borderDim}\n paddingX={1}\n marginBottom={1}\n >\n <Box>\n <Text color={URL_FILL_COLOR} bold>\n 🔗 빠른 입력\n </Text>\n <Text color={T.fgFaint}>\n {' '}— Confluence 페이지 URL을 붙여넣으면{' '}\n </Text>\n <Text color={URL_FILL_COLOR} bold>\n {fillTargets.join(', ')}\n </Text>\n <Text color={T.fgFaint}>\n {' '}필드가 자동 입력됩니다\n </Text>\n </Box>\n <Box marginTop={1}>\n {urlValue ? (\n <Text color={T.fg}>{urlValue}</Text>\n ) : (\n <Text color={T.fgFaint}>\n https://confluence.tde.sktelecom.com/spaces/TDE/pages/123456/...\n </Text>\n )}\n {onUrlField && <Text backgroundColor={URL_FILL_COLOR} color={T.bg}> </Text>}\n </Box>\n </Box>\n )}\n\n {fields.map((f, i) => (\n <FormField\n key={f.key}\n field={f}\n value={values[f.key] ?? ''}\n focused={i === focusIdx}\n error={errors[f.key]}\n accent={accent}\n />\n ))}\n\n {/* Preview */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n marginTop={1}\n flexDirection=\"column\"\n >\n <Text color={T.fgFaint} bold>PREVIEW</Text>\n <Text>\n <Text color={T.fgFaint}>$ </Text>\n <Text color={accent}>tdecollab </Text>\n <Text color={T.cyan}>{def.key.split(':').join(' ')} </Text>\n <Text color={T.fg}>{preview.replace(/^tdecollab\\s+\\S+(?:\\s+\\S+){0,2}\\s*/, '')}</Text>\n </Text>\n </Box>\n\n {/* 액션 힌트 */}\n <Box gap={3} marginTop={1}>\n <Text backgroundColor={accent} color={T.bg} bold> Ctrl+R Run </Text>\n <Text backgroundColor={T.panelHi} color={T.fg}> Ctrl+S Save preset </Text>\n <Text backgroundColor={T.panelHi} color={T.fgDim}> Esc Back </Text>\n </Box>\n </Box>\n </Panel>\n )\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n pickerOpen ? (\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'open / select' },\n { key: 'Tab/Spc', label: 'select dir' },\n { key: 'Esc', label: 'cancel' },\n ]} />\n ) : (\n <Keymap accent={accent} keys={[\n { key: 'Tab', label: 'next field' },\n { key: '⇧Tab', label: 'prev' },\n { key: 'A-Z', label: '바로 입력' },\n { key: '↵', label: currentField?.pathType ? '경로 선택창' : currentField?.type === 'bool' ? 'toggle' : '—' },\n { key: 'Ctrl+R', label: 'Run' },\n { key: 'Ctrl+S', label: 'Save' },\n { key: 'Esc', label: 'Back' },\n ]} />\n )\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { useMemo, useState } from 'react';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface FilePickerProps {\n initialPath: string;\n pathType: 'file' | 'dir';\n onSelect: (selectedPath: string) => void;\n onCancel: () => void;\n accent?: string;\n maxVisible?: number;\n}\n\ninterface Entry {\n name: string;\n isDir: boolean;\n isCurrent?: boolean; // \".\" — 현재 디렉토리 선택용\n}\n\nfunction resolveStartDir(initialPath: string): string {\n if (!initialPath) return process.cwd();\n const expanded = initialPath.replace(/^~/, os.homedir());\n const abs = path.isAbsolute(expanded) ? expanded : path.resolve(process.cwd(), expanded);\n try {\n const stat = fs.statSync(abs);\n return stat.isDirectory() ? abs : path.dirname(abs);\n } catch {\n // 존재하지 않는 경우 디렉토리 부분까지만 사용\n let dir = path.dirname(abs);\n while (dir && dir !== '/' && !fs.existsSync(dir)) {\n dir = path.dirname(dir);\n }\n return dir || process.cwd();\n }\n}\n\nexport function FilePicker({\n initialPath,\n pathType,\n onSelect,\n onCancel,\n accent = DEFAULT_ACCENT,\n maxVisible = 14,\n}: FilePickerProps) {\n const [currentDir, setCurrentDir] = useState(() => resolveStartDir(initialPath));\n const [cursor, setCursor] = useState(0);\n const [scroll, setScroll] = useState(0);\n\n const entries: Entry[] = useMemo(() => {\n try {\n const items = fs.readdirSync(currentDir, { withFileTypes: true })\n .filter((d) => !d.name.startsWith('.'));\n const dirs: Entry[] = items\n .filter((i) => i.isDirectory())\n .map((i) => ({ name: i.name, isDir: true }));\n const files: Entry[] = pathType === 'file'\n ? items.filter((i) => i.isFile()).map((i) => ({ name: i.name, isDir: false }))\n : [];\n return [\n { name: '.', isDir: true, isCurrent: true },\n { name: '..', isDir: true },\n ...dirs.sort((a, b) => a.name.localeCompare(b.name)),\n ...files.sort((a, b) => a.name.localeCompare(b.name)),\n ];\n } catch {\n return [\n { name: '.', isDir: true, isCurrent: true },\n { name: '..', isDir: true },\n ];\n }\n }, [currentDir, pathType]);\n\n function move(delta: number) {\n const next = Math.max(0, Math.min(entries.length - 1, cursor + delta));\n setCursor(next);\n if (next < scroll) setScroll(next);\n else if (next >= scroll + maxVisible) setScroll(next - maxVisible + 1);\n }\n\n function selectEntry(entry: Entry) {\n // \".\" — 현재 디렉토리 자체 선택 (말미에 / 포함하여 이어쓰기 용이)\n if (entry.isCurrent) {\n onSelect(toRelativeIfPossible(currentDir) + path.sep);\n return;\n }\n const fullPath = entry.name === '..'\n ? path.dirname(currentDir)\n : path.join(currentDir, entry.name);\n if (entry.isDir) {\n // 디렉토리는 진입\n setCurrentDir(fullPath);\n setCursor(0);\n setScroll(0);\n } else {\n // 파일 선택\n onSelect(toRelativeIfPossible(fullPath));\n }\n }\n\n function selectCurrentDir() {\n // 디렉토리 모드: 현재 디렉토리 자체를 선택\n onSelect(toRelativeIfPossible(currentDir) + path.sep);\n }\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (key.upArrow) {\n move(-1);\n } else if (key.downArrow) {\n move(1);\n } else if (key.pageUp) {\n move(-maxVisible);\n } else if (key.pageDown) {\n move(maxVisible);\n } else if (key.return) {\n const entry = entries[cursor];\n if (entry) selectEntry(entry);\n } else if (input === ' ' || key.tab) {\n // Space/Tab: 현재 디렉토리 선택 (특히 dir 모드에서 유용)\n if (pathType === 'dir') {\n selectCurrentDir();\n } else {\n const entry = entries[cursor];\n if (entry && !entry.isDir) selectEntry(entry);\n }\n }\n });\n\n const visible = entries.slice(scroll, scroll + maxVisible);\n const displayPath = currentDir.replace(os.homedir(), '~');\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={accent}\n flexDirection=\"column\"\n paddingX={1}\n >\n {/* 헤더 */}\n <Box>\n <Text color={accent} bold>\n {pathType === 'file' ? '📄 파일 선택' : '📁 디렉토리 선택'}\n </Text>\n <Text color={T.fgFaint}> {displayPath}</Text>\n </Box>\n\n {/* 엔트리 목록 */}\n <Box flexDirection=\"column\" marginTop={1}>\n {visible.map((entry, vi) => {\n const idx = vi + scroll;\n const isActive = idx === cursor;\n return (\n <Box key={`${entry.name}-${idx}`}>\n <Text color={isActive ? accent : 'transparent'}>\n {isActive ? '▶ ' : ' '}\n </Text>\n <Text\n color={\n isActive ? accent :\n entry.isCurrent ? T.amber :\n entry.isDir ? T.cyan :\n T.fg\n }\n bold={isActive}\n >\n {entry.isCurrent ? '✓ ' : entry.isDir ? '📁 ' : '📄 '}\n {entry.name}\n {entry.isCurrent ? ' (현재 디렉토리 선택)' : entry.isDir && entry.name !== '..' ? '/' : ''}\n </Text>\n </Box>\n );\n })}\n {entries.length > maxVisible && (\n <Text color={T.fgFaint}>\n {scroll + 1}–{Math.min(scroll + maxVisible, entries.length)} / {entries.length}\n </Text>\n )}\n </Box>\n\n {/* 푸터 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n ↑↓ navigate · ↵ on \".\" select current · ↵ on dir = open · ↵ on file = select · Esc cancel\n </Text>\n </Box>\n </Box>\n );\n}\n\n// 가능하면 cwd 기준 상대경로로 변환 (그렇지 않으면 절대경로 유지)\nfunction toRelativeIfPossible(absPath: string): string {\n const cwd = process.cwd();\n const rel = path.relative(cwd, absPath);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n return './' + rel;\n }\n return absPath;\n}\n","import { Box, Text } from 'ink';\nimport type { FieldDef } from '../command-def.js';\nimport { T } from '../theme.js';\n\ninterface FormFieldProps {\n field: FieldDef;\n value: string | boolean;\n focused: boolean;\n error?: string;\n accent?: string;\n}\n\nexport function FormField({ field, value, focused, error, accent = T.pink }: FormFieldProps) {\n const labelText = field.label.padEnd(28);\n\n if (field.type === 'bool') {\n const checked = value === true;\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n <Text color={checked ? accent : T.fgFaint} bold={focused}>\n {checked ? '▣' : '▢'}\n </Text>\n <Text color={focused ? T.fg : T.fgDim}>\n {checked ? 'enabled' : 'disabled'}\n </Text>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n <Text color={T.fgFaint}>Space로 토글</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n if (field.type === 'select') {\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n <Box\n borderStyle=\"single\"\n borderColor={focused ? accent : T.border}\n paddingX={1}\n >\n <Text color={T.fg}>{String(value)}</Text>\n <Text color={T.fgFaint}> ▼</Text>\n </Box>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n <Text color={T.fgFaint}>\n Space로 다음 옵션 ({field.options?.join(' · ')})\n </Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // text / path\n const borderColor = error ? T.red : (focused ? accent : T.border);\n const valStr = String(value ?? '');\n const isPath = !!field.pathType;\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n {field.required && <Text color={T.amber}>*</Text>}\n <Box\n borderStyle=\"single\"\n borderColor={borderColor}\n paddingX={1}\n flexGrow={1}\n >\n {field.prefix && <Text color={T.fgFaint}>{field.prefix} </Text>}\n {valStr ? (\n <Text color={T.fg}>{valStr}</Text>\n ) : (\n <Text color={T.fgFaint}>{field.hint ?? ''}</Text>\n )}\n {focused && <Text backgroundColor={accent} color={T.bg}> </Text>}\n </Box>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n {error ? (\n <Text color={T.red}>{error}</Text>\n ) : isPath ? (\n <Text color={T.fgFaint}>\n <Text color={T.amber}>↵</Text> {field.pathType === 'file' ? '파일' : '디렉토리'} 선택창 열기\n {field.hint ? ` · ${field.hint}` : ''}\n </Text>\n ) : field.hint ? (\n <Text color={T.fgFaint}>{field.hint}</Text>\n ) : null}\n </Box>\n )}\n </Box>\n );\n}\n","// Confluence URL → 폼 필드 자동 채우기 파서\n//\n// 지원 URL 형식:\n// - /spaces/<SPACE>/pages/<pageId>/<title> (modern)\n// - /display/<SPACE>/<title> (legacy)\n// - /pages/viewpage.action?pageId=<pageId> (legacy query)\n// - /pages/createpage.action?spaceKey=<SPACE>...\n\nexport interface ParsedConfluenceUrl {\n space?: string;\n pageId?: string;\n}\n\nexport function parseConfluenceUrl(input: string): ParsedConfluenceUrl {\n const url = input.trim();\n if (!url) return {};\n\n const result: ParsedConfluenceUrl = {};\n\n // /spaces/<SPACE>/pages/<pageId>\n const spacesMatch = url.match(/\\/spaces\\/([^/]+)\\/pages\\/(\\d+)/);\n if (spacesMatch) {\n result.space = decodeURIComponent(spacesMatch[1]);\n result.pageId = spacesMatch[2];\n return result;\n }\n\n // pageId=<id>\n const pageIdQuery = url.match(/[?&]pageId=(\\d+)/);\n if (pageIdQuery) {\n result.pageId = pageIdQuery[1];\n }\n\n // spaceKey=<SPACE>\n const spaceQuery = url.match(/[?&]spaceKey=([^&]+)/);\n if (spaceQuery) {\n result.space = decodeURIComponent(spaceQuery[1]);\n }\n\n // /display/<SPACE>\n if (!result.space) {\n const displayMatch = url.match(/\\/display\\/([^/?#]+)/);\n if (displayMatch) result.space = decodeURIComponent(displayMatch[1]);\n }\n\n return result;\n}\n\n// 커맨드별로 URL 파싱 결과를 어느 필드에 채울지 결정\nexport function applyUrlFill(\n commandKey: string,\n parsed: ParsedConfluenceUrl,\n current: Record<string, string | boolean>,\n): Record<string, string | boolean> {\n const result = { ...current };\n\n if (commandKey === 'confluence:page:get' || commandKey === 'confluence:page:update') {\n // 대상 페이지 본인의 URL → pageId, space 채움\n if (parsed.space) result['space'] = parsed.space;\n if (parsed.pageId) result['pageId'] = parsed.pageId;\n } else if (commandKey === 'confluence:page:create') {\n // 부모 페이지의 URL → parent, space 채움\n if (parsed.space) result['space'] = parsed.space;\n if (parsed.pageId) result['parent'] = parsed.pageId;\n }\n\n return result;\n}\n\n// URL Quick-fill 기능을 지원하는 커맨드 여부\nexport function supportsUrlFill(commandKey: string): boolean {\n return [\n 'confluence:page:get',\n 'confluence:page:update',\n 'confluence:page:create',\n ].includes(commandKey);\n}\n\n// 자동 채워질 필드 키 목록 (UI 표시용)\nexport function getUrlFillTargets(commandKey: string): string[] {\n if (commandKey === 'confluence:page:create') return ['space', 'parent'];\n if (commandKey === 'confluence:page:get' || commandKey === 'confluence:page:update') return ['space', 'pageId'];\n return [];\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, type MenuItem } from '../menu-def.js';\nimport type { AppState, HistoryEntry } from '../state.js';\nimport { T, SVC_COLOR, DEFAULT_ACCENT } from '../theme.js';\n\ninterface HistoryScreenProps {\n state: AppState;\n onBack: () => void;\n onReplay: (entry: HistoryEntry) => void;\n accent?: string;\n}\n\nconst SVC_LABEL: Record<string, string> = { cf: 'CF', jr: 'JR', gl: 'GL' };\nconst STATE_COLOR: Record<string, string> = { ok: T.mint, warn: T.amber, err: T.red };\n\nexport function HistoryScreen({ state, onBack, onReplay, accent = DEFAULT_ACCENT }: HistoryScreenProps) {\n const [selected, setSelected] = useState(state.historySelected);\n const history = state.history;\n const okCount = history.filter((h) => h.state === 'ok').length;\n const warnCount = history.filter((h) => h.state === 'warn').length;\n const errCount = history.filter((h) => h.state === 'err').length;\n\n useInput((input, key) => {\n if (key.escape) onBack();\n else if (key.upArrow) setSelected((s) => Math.max(0, s - 1));\n else if (key.downArrow) setSelected((s) => Math.min(history.length - 1, s + 1));\n else if (key.return) {\n if (history[selected]) onReplay(history[selected]);\n } else if (input === 'x' || input === 'X') {\n // clearHistory는 App 레벨에서 처리\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.key === 'history');\n\n const selectedEntry = history[selected];\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={['history']}\n status={\n <Box gap={1}>\n <Text color={T.fg}>{history.length}</Text>\n <Text color={T.fgDim}>commands ·</Text>\n <Text color={T.mint}>{okCount} ok</Text>\n <Text color={T.fgDim}>/</Text>\n <Text color={T.amber}>{warnCount} warn</Text>\n <Text color={T.fgDim}>/</Text>\n <Text color={T.red}>{errCount} err</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"History\" badge=\"LOG\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 테이블 헤더 */}\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n <Text color={T.fgFaint} bold>{'TIME '.padEnd(7)}</Text>\n <Text color={T.fgFaint} bold>{'SVC '.padEnd(5)}</Text>\n <Text color={T.fgFaint} bold>{'COMMAND'.padEnd(55)}</Text>\n <Text color={T.fgFaint} bold>{'TOOK'.padEnd(9)}</Text>\n <Text color={T.fgFaint} bold>RESULT</Text>\n </Box>\n\n {history.length === 0 ? (\n <Box marginTop={2}>\n <Text color={T.fgFaint}>히스토리가 없습니다. 명령을 실행하면 여기에 기록됩니다.</Text>\n </Box>\n ) : (\n history.map((h, i) => (\n <Box\n key={i}\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n <Text color={i === selected ? accent : T.fgDim}>\n {h.when.padEnd(7)}\n </Text>\n <Text\n backgroundColor={`${(SVC_COLOR[h.svc] ?? T.fgDim)}22`}\n color={SVC_COLOR[h.svc] ?? T.fgDim}\n bold\n >\n {` ${SVC_LABEL[h.svc] ?? h.svc} `}\n </Text>\n <Text> </Text>\n <Text color={i === selected ? accent : T.fg}>\n {`tdecollab ${h.cmd}`.slice(0, 54).padEnd(55)}\n </Text>\n <Text color={T.fgDim}>{h.dur.padEnd(9)}</Text>\n <Text color={STATE_COLOR[h.state] ?? T.fg}>\n {'● '}{h.result}\n </Text>\n </Box>\n ))\n )}\n\n {/* 선택된 항목 상세 */}\n {selectedEntry && (\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n <Text color={T.fgFaint}>─── 선택된 항목 ───</Text>\n <Box gap={1}>\n <Text color={T.fgDim}>명령:</Text>\n <Text color={accent}>tdecollab {selectedEntry.cmd}</Text>\n </Box>\n <Box gap={1}>\n <Text color={T.fgDim}>결과:</Text>\n <Text color={STATE_COLOR[selectedEntry.state]}>{selectedEntry.result}</Text>\n <Text color={T.fgDim}>· {selectedEntry.dur}</Text>\n </Box>\n </Box>\n )}\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'replay' },\n { key: 'x', label: 'clear' },\n { key: 'Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface ListScreenProps {\n state: AppState;\n onBack: () => void;\n onDrillIn?: (row: Record<string, string>) => void;\n accent?: string;\n}\n\nexport function ListScreen({ state, onBack, onDrillIn, accent = DEFAULT_ACCENT }: ListScreenProps) {\n const [selected, setSelected] = useState(state.resultListSelected);\n const crumbs = pathFromCommandKey(state.commandKey);\n const rows = state.resultList;\n const cols = state.resultListCols;\n\n useInput((_input, key) => {\n if (key.escape) onBack();\n else if (key.upArrow) setSelected((s) => Math.max(0, s - 1));\n else if (key.downArrow) setSelected((s) => Math.min(rows.length - 1, s + 1));\n else if (key.return) {\n if (rows[selected] && onDrillIn) onDrillIn(rows[selected]);\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n // 컬럼 너비 계산 (균등 분배)\n const colWidth = cols.length > 0 ? Math.floor(60 / cols.length) : 20;\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.mint}>●</Text>\n <Text color={T.fgDim}>{rows.length} results</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title={crumbs.join(' ')} badge=\"LIST\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 헤더 행 */}\n <Box borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={T.borderDim}>\n {cols.map((c) => (\n <Text key={c} color={T.fgFaint} bold>\n {c.toUpperCase().padEnd(colWidth)}\n </Text>\n ))}\n </Box>\n {/* 데이터 행 */}\n {rows.map((row, i) => (\n <Box\n key={i}\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n {cols.map((c) => (\n <Text\n key={c}\n color={i === selected ? accent : T.fg}\n bold={i === selected}\n >\n {String(row[c] ?? '').slice(0, colWidth - 1).padEnd(colWidth)}\n </Text>\n ))}\n </Box>\n ))}\n {/* 푸터 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n showing 1–{rows.length} · row{' '}\n </Text>\n <Text color={accent}>{selected + 1}</Text>\n <Text color={T.fgFaint}> selected · ↵ to drill in</Text>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'view' },\n { key: 'Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useState } from 'react';\nimport { COMMANDS } from '../command-def.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport {\n MENU,\n META_ITEMS,\n flattenMenu,\n pathFromCommandKey,\n type MenuItem,\n} from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface MenuScreenProps {\n state: AppState;\n onSelectCommand: (commandKey: string) => void;\n onToggleExpanded: (key: string) => void;\n onOpenHistory: () => void;\n onQuit: () => void;\n accent?: string;\n}\n\nexport function MenuScreen({\n state,\n onSelectCommand,\n onToggleExpanded,\n onOpenHistory,\n onQuit,\n accent = DEFAULT_ACCENT,\n}: MenuScreenProps) {\n const expanded = state.expandedKeys;\n const allItems = [\n ...flattenMenu(MENU, expanded),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n\n // 마지막으로 선택했던 위치를 초기 커서로 사용\n const initialCursor = (() => {\n if (!state.activePath) return 0;\n const idx = allItems.findIndex(\n (f) => f.item.commandKey === state.activePath || f.item.key === state.activePath,\n );\n return idx >= 0 ? idx : 0;\n })();\n\n const [cursor, setCursor] = useState(initialCursor);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n // 현재 커서 아이템\n const currentFlat = allItems[cursor];\n const currentItem = currentFlat?.item;\n const commandKey = currentItem?.commandKey;\n const commandDef = commandKey ? COMMANDS[commandKey] : null;\n\n // 화면에 맞게 스크롤 조정\n const adjustScroll = useCallback((newCursor: number) => {\n const maxVisible = 24;\n if (newCursor < scrollOffset) setScrollOffset(newCursor);\n else if (newCursor >= scrollOffset + maxVisible) setScrollOffset(newCursor - maxVisible + 1);\n }, [scrollOffset]);\n\n useInput((input, key) => {\n if (key.upArrow) {\n const next = Math.max(0, cursor - 1);\n setCursor(next);\n adjustScroll(next);\n } else if (key.downArrow) {\n const next = Math.min(allItems.length - 1, cursor + 1);\n setCursor(next);\n adjustScroll(next);\n } else if (key.rightArrow || key.return) {\n if (currentItem?.children) {\n onToggleExpanded(currentItem.key);\n } else if (currentItem?.commandKey) {\n onSelectCommand(currentItem.commandKey);\n } else if (currentItem?.key === 'history') {\n onOpenHistory();\n }\n } else if (key.leftArrow) {\n if (currentFlat?.parentKey && expanded.includes(currentFlat.parentKey)) {\n onToggleExpanded(currentFlat.parentKey);\n }\n } else if (input === 'h') {\n onOpenHistory();\n } else if (input === 'q' || (key.ctrl && input === 'c')) {\n onQuit();\n }\n });\n\n // 초기 마운트 시 스크롤을 커서 위치로 맞춤\n useEffect(() => {\n if (initialCursor > 0) adjustScroll(initialCursor);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const crumbs = commandKey\n ? pathFromCommandKey(commandKey)\n : currentItem?.key === 'history'\n ? ['history']\n : ['menu'];\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.mint}>●</Text>\n <Text color={T.fgDim}>ready</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent} focused>\n <MenuTree items={allItems} cursor={cursor} accent={accent} scrollOffset={scrollOffset} />\n </Panel>\n }\n body={\n <Panel\n title={commandDef?.label ?? currentItem?.label ?? 'tdecollab'}\n badge=\"DETAILS\"\n accent={accent}\n >\n {commandDef ? (\n <CommandDetails def={commandDef} accent={accent} />\n ) : (\n <WelcomeView accent={accent} />\n )}\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '→/↵', label: 'select / expand' },\n { key: '←', label: 'collapse' },\n { key: 'h', label: 'history' },\n { key: 'q', label: 'quit' },\n ]} />\n }\n />\n );\n}\n\nfunction WelcomeView({ accent }: { accent: string }) {\n return (\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Text color={accent} bold>tdecollab TUI</Text>\n <Text color={T.fgDim}>좌측 메뉴에서 명령을 선택하세요.</Text>\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n <Text color={T.fgFaint}> Confluence ◆ 페이지/스페이스/검색</Text>\n <Text color={T.fgFaint}> JIRA ◆ 이슈/검색</Text>\n <Text color={T.fgFaint}> GitLab ◆ MR/파이프라인</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={T.amber}>↵</Text>\n <Text color={T.fgDim}> 를 눌러 명령 폼으로 진입합니다.</Text>\n </Box>\n </Box>\n );\n}\n\nfunction CommandDetails({ def, accent }: { def: import('../command-def.js').CommandDef; accent: string }) {\n return (\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>DESCRIPTION</Text>\n <Text color={T.fg}>{def.description}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>SYNOPSIS</Text>\n <Box borderStyle=\"single\" borderColor={T.borderDim} paddingX={1} marginTop={0}>\n <Text color={T.cyan}>$ {def.synopsis}</Text>\n </Box>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>OPTIONS</Text>\n {def.fields.map((f: import('../command-def.js').FieldDef) => (\n <Box key={f.key} gap={2}>\n <Text color={accent}>{f.label.padEnd(28)}</Text>\n <Text color={T.fgDim}>{f.hint ?? (f.type === 'bool' ? 'flag' : f.type)}</Text>\n {f.required && <Text color={T.amber}> *required</Text>}\n </Box>\n ))}\n </Box>\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n marginTop={1}\n >\n <Text color={T.amber}>↵</Text>\n <Text color={T.fgDim}> Enter를 눌러 입력 폼으로 진입합니다.</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { Spinner } from '../components/Spinner.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface RunningScreenProps {\n state: AppState;\n onCancel: () => void;\n accent?: string;\n}\n\nexport function RunningScreen({ state, onCancel, accent = DEFAULT_ACCENT }: RunningScreenProps) {\n const crumbs = pathFromCommandKey(state.commandKey);\n const doneCount = state.steps.filter((s) => s.state === 'done').length;\n const total = state.steps.length;\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n const progressPct = total > 0 ? Math.round((doneCount / total) * 100) : 0;\n const barWidth = 40;\n const filled = Math.round((progressPct / 100) * barWidth);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Spinner color={T.cyan} />\n <Text color={T.cyan} bold>RUNNING</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"Pipeline\" badge=\"EXEC\" accent={T.cyan} focused>\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Text color={T.fgDim} bold>STEPS</Text>\n {state.steps.map((step) => (\n <Box key={step.id} gap={2}>\n {step.state === 'done' && <Text color={T.mint}>✓</Text>}\n {step.state === 'running' && <Spinner color={T.cyan} />}\n {step.state === 'pending' && <Text color={T.fgFaint}>○</Text>}\n {step.state === 'err' && <Text color={T.red}>✕</Text>}\n <Box flexDirection=\"column\">\n <Text\n color={\n step.state === 'pending' ? T.fgMute :\n step.state === 'running' ? T.fg :\n step.state === 'err' ? T.red :\n T.fg\n }\n bold={step.state === 'running'}\n >\n {step.title}\n </Text>\n <Text color={T.fgFaint}>{step.detail}</Text>\n </Box>\n {step.state === 'running' && (\n <Text backgroundColor={T.cyan} color={T.bg} bold> IN PROGRESS </Text>\n )}\n {step.state === 'done' && <Text color={T.fgFaint}>done</Text>}\n </Box>\n ))}\n\n {/* 진행바 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n flexDirection=\"column\"\n marginTop={1}\n >\n <Box gap={2}>\n <Text color={T.fgDim}>Overall progress</Text>\n <Text color={T.cyan}>{doneCount} / {total} · {progressPct}%</Text>\n </Box>\n <Box>\n <Text color={T.mint}>{'█'.repeat(filled)}</Text>\n <Text color={T.borderDim}>{'░'.repeat(barWidth - filled)}</Text>\n </Box>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} title=\"Stream\" maxLines={6} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: 'Ctrl-C', label: 'cancel' },\n ]} />\n }\n />\n );\n}\n","import { Text } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { T } from '../theme.js';\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\ninterface SpinnerProps {\n color?: string;\n}\n\nexport function Spinner({ color = T.cyan }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n useEffect(() => {\n const id = setInterval(() => setFrame((f) => (f + 1) % FRAMES.length), 80);\n return () => clearInterval(id);\n }, []);\n return <Text color={color}>{FRAMES[frame]}</Text>;\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface TextViewProps {\n state: AppState;\n onBack: () => void;\n accent?: string;\n}\n\nexport function TextView({ state, onBack, accent = DEFAULT_ACCENT }: TextViewProps) {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const visibleLines = Math.max(8, termHeight - 18);\n const lines = state.resultText.split('\\n');\n const [scrollTop, setScrollTop] = useState(0);\n const crumbs = pathFromCommandKey(state.commandKey);\n\n const maxScroll = Math.max(0, lines.length - visibleLines);\n const halfPage = Math.max(1, Math.floor(visibleLines / 2));\n\n useInput((input, key) => {\n if (key.escape || input === 'q') onBack();\n // 한 줄 단위\n else if (key.downArrow || input === 'j') setScrollTop((s) => Math.min(maxScroll, s + 1));\n else if (key.upArrow || input === 'k') setScrollTop((s) => Math.max(0, s - 1));\n // 페이지 끝\n else if (input === 'g') setScrollTop(0);\n else if (input === 'G') setScrollTop(maxScroll);\n // 한 페이지 단위 (vim: Ctrl+F / Ctrl+B, PageDown / PageUp)\n else if ((key.ctrl && input === 'f') || key.pageDown) {\n setScrollTop((s) => Math.min(maxScroll, s + visibleLines));\n }\n else if ((key.ctrl && input === 'b') || key.pageUp) {\n setScrollTop((s) => Math.max(0, s - visibleLines));\n }\n // 반 페이지 단위 (vim: Ctrl+D / Ctrl+U)\n else if (key.ctrl && input === 'd') {\n setScrollTop((s) => Math.min(maxScroll, s + halfPage));\n }\n else if (key.ctrl && input === 'u') {\n setScrollTop((s) => Math.max(0, s - halfPage));\n }\n });\n\n const visible = lines.slice(scrollTop, scrollTop + visibleLines);\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={[...crumbs, 'result']}\n status={\n <Box gap={1}>\n <Text color={T.cyan}>VIEW</Text>\n <Text color={T.fgDim}>· {lines.length} lines</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"Result\" badge=\"MARKDOWN\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 줄 번호 + 내용 */}\n {visible.map((line, i) => {\n const lineNo = scrollTop + i + 1;\n const isH1 = line.startsWith('# ');\n const isH2 = line.startsWith('## ');\n const isH3 = line.startsWith('### ');\n const isCode = line.startsWith('```') || line.startsWith(' ');\n const isListItem = /^[*\\-+] /.test(line) || /^\\d+\\. /.test(line);\n return (\n <Box key={lineNo} gap={1}>\n <Text color={T.fgFaint}>{String(lineNo).padStart(4)}</Text>\n <Text\n color={\n isH1 ? accent :\n isH2 ? accent :\n isH3 ? T.cyan :\n isCode ? T.mint :\n isListItem ? T.fg :\n T.fg\n }\n bold={isH1 || isH2}\n >\n {line}\n </Text>\n </Box>\n );\n })}\n {/* 스크롤 힌트 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n {scrollTop + 1}–{Math.min(scrollTop + visibleLines, lines.length)} / {lines.length} lines\n </Text>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: 'j/k', label: 'line' },\n { key: 'Ctrl+D/U', label: 'half page' },\n { key: 'Ctrl+F/B', label: 'full page' },\n { key: 'g/G', label: 'top/end' },\n { key: 'q/Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","export type LogLevel = 'info' | 'ok' | 'warn' | 'err' | 'run' | 'dim';\n\nexport interface LogEntry {\n ts: string;\n level: LogLevel;\n text: string;\n}\n\nexport interface StepEntry {\n id: string;\n title: string;\n detail: string;\n state: 'pending' | 'running' | 'done' | 'err';\n}\n\nexport interface HistoryEntry {\n when: string;\n svc: 'cf' | 'jr' | 'gl';\n cmd: string;\n state: 'ok' | 'warn' | 'err';\n dur: string;\n result: string;\n}\n\nexport type ScreenType =\n | 'menu'\n | 'form'\n | 'running'\n | 'result-list'\n | 'result-text'\n | 'error'\n | 'history';\n\nexport interface AppState {\n screen: ScreenType;\n // 메뉴 탐색\n activePath: string;\n expandedKeys: string[];\n // 폼\n commandKey: string;\n formValues: Record<string, string | boolean>;\n formErrors: Record<string, string>;\n focusedField: number;\n // 실행\n steps: StepEntry[];\n progress: number;\n // 결과\n resultText: string;\n resultList: Array<Record<string, string>>;\n resultListCols: string[];\n resultListSelected: number;\n // 로그\n logs: LogEntry[];\n // 히스토리\n history: HistoryEntry[];\n historySelected: number;\n}\n\nexport function makeLog(level: LogLevel, text: string): LogEntry {\n const now = new Date();\n const ts = `${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}:${String(now.getSeconds()).padStart(2,'0')}`;\n return { ts, level, text };\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface TuiConfig {\n accent?: string;\n menuWidth?: number;\n logHeight?: number;\n showKeys?: boolean;\n presets?: Record<string, Record<string, string | boolean>>;\n lastUsed?: Record<string, Record<string, string | boolean>>;\n}\n\nconst explorer = cosmiconfig('tdecollab', {\n searchPlaces: [\n '.tdecollab.json',\n '.tdecollab.yaml',\n '.tdecollab.yml',\n 'tdecollab.config.json',\n path.join(os.homedir(), '.tdecollab.json'),\n ],\n});\n\nlet _config: TuiConfig | null = null;\nlet _configPath: string | null = null;\n\nexport async function loadTuiConfig(): Promise<TuiConfig> {\n if (_config) return _config;\n try {\n const result = await explorer.search();\n if (result) {\n _config = result.config as TuiConfig;\n _configPath = result.filepath;\n } else {\n _config = {};\n }\n } catch {\n _config = {};\n }\n return _config!;\n}\n\nexport function getDefaultConfigPath(): string {\n return path.join(process.cwd(), '.tdecollab.json');\n}\n\n// 설정 저장 (lastUsed / presets 갱신)\nexport function saveTuiConfig(updates: Partial<TuiConfig>): void {\n const configPath = _configPath ?? getDefaultConfigPath();\n let existing: TuiConfig = {};\n if (fs.existsSync(configPath)) {\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n } catch {\n existing = {};\n }\n }\n const merged = {\n ...existing,\n ...updates,\n presets: { ...(existing.presets ?? {}), ...(updates.presets ?? {}) },\n lastUsed: { ...(existing.lastUsed ?? {}), ...(updates.lastUsed ?? {}) },\n };\n fs.writeFileSync(configPath, JSON.stringify(merged, null, 2), 'utf-8');\n _config = merged;\n}\n\n// 특정 커맨드의 마지막 사용 값 저장\nexport function saveLastUsed(commandKey: string, values: Record<string, string | boolean>): void {\n saveTuiConfig({ lastUsed: { [commandKey]: values } });\n}\n\n// 폼 초기값: lastUsed 우선, 없으면 field.defaultValue\nexport function getInitialValues(\n commandKey: string,\n fields: Array<{ key: string; defaultValue?: string | boolean }>,\n config: TuiConfig,\n): Record<string, string | boolean> {\n const last = config.lastUsed?.[commandKey] ?? {};\n const result: Record<string, string | boolean> = {};\n for (const f of fields) {\n if (f.key in last) {\n result[f.key] = last[f.key];\n } else if (f.defaultValue !== undefined) {\n result[f.key] = f.defaultValue;\n } else {\n result[f.key] = '';\n }\n }\n return result;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { HistoryEntry } from './state.js';\n\nconst HISTORY_FILE = path.join(os.homedir(), '.tdecollab_history.json');\nconst MAX_HISTORY = 100;\n\nexport function loadHistory(): HistoryEntry[] {\n try {\n if (fs.existsSync(HISTORY_FILE)) {\n return JSON.parse(fs.readFileSync(HISTORY_FILE, 'utf-8')) as HistoryEntry[];\n }\n } catch {\n // 무시\n }\n return [];\n}\n\nexport function appendHistory(entry: HistoryEntry): void {\n const history = loadHistory();\n history.unshift(entry);\n if (history.length > MAX_HISTORY) history.splice(MAX_HISTORY);\n try {\n fs.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2), 'utf-8');\n } catch {\n // 무시\n }\n}\n\nexport function clearHistory(): void {\n try {\n if (fs.existsSync(HISTORY_FILE)) fs.unlinkSync(HISTORY_FILE);\n } catch {\n // 무시\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { ConfluenceContentApi } from '../../confluence/api/content.js';\nimport { ConfluenceSpaceApi } from '../../confluence/api/space.js';\nimport { ConfluenceSearchApi } from '../../confluence/api/search.js';\nimport { createConfluenceClient } from '../../confluence/api/client.js';\nimport { MarkdownToStorageConverter } from '../../confluence/converters/md-to-storage.js';\nimport { StorageToMarkdownConverter } from '../../confluence/converters/storage-to-md.js';\nimport { ImageDownloader } from '../../confluence/utils/image-downloader.js';\nimport { loadConfluenceConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\n\nexport interface ExecuteResult {\n type: 'text' | 'list';\n content?: string;\n list?: Array<Record<string, string>>;\n cols?: string[];\n logs: LogEntry[];\n}\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\n// 단계 헬퍼\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\n// page get 실행\nexport async function executePageGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('fetch', 'Fetch page from Confluence'),\n makeStep('convert', 'Convert to Markdown'),\n makeStep('images', 'Download images', values['downloadImages'] ? 'enabled' : 'skipped'),\n makeStep('output', 'Write output'),\n ];\n onSteps([...steps]);\n\n // Step 1: validate\n steps[0] = { ...steps[0], state: 'running', detail: `pageId=${values['pageId']}` };\n onSteps([...steps]);\n if (!values['pageId']) throw new Error('pageId is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n // Step 2: fetch\n steps[1] = { ...steps[1], state: 'running', detail: `GET /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/${values['pageId']}?expand=body.storage,version`));\n\n const page = await api.getPage(String(values['pageId']));\n addLog(makeLog('ok', `200 OK · \"${page.title}\" · ${page.space?.key}`));\n steps[1] = { ...steps[1], state: 'done', detail: `\"${page.title}\"` };\n onSteps([...steps]);\n\n // Step 3: convert\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n let imageUrlMap: Map<string, string> | undefined;\n\n if (values['downloadImages'] && page.body?.storage?.value) {\n steps[3] = { ...steps[3], state: 'running', detail: 'downloading...' };\n onSteps([...steps]);\n\n let baseDir = process.cwd();\n if (values['output']) baseDir = path.dirname(path.resolve(process.cwd(), String(values['output'])));\n const imgDir = path.resolve(baseDir, String(values['imageDir'] || './images'));\n const downloader = new ImageDownloader(api, { outputDir: imgDir, pageId: page.id, baseUrl: config.baseUrl });\n imageUrlMap = await downloader.downloadAllImages(page.body.storage.value);\n\n // 절대경로 → 상대경로 변환\n for (const [key, abs] of imageUrlMap.entries()) {\n imageUrlMap.set(key, path.relative(baseDir, abs).split(path.sep).join('/'));\n }\n addLog(makeLog('ok', `이미지 다운로드 완료 (${imageUrlMap.size}개) → ${imgDir}`));\n steps[3] = { ...steps[3], state: 'done', detail: `${imageUrlMap.size} files` };\n onSteps([...steps]);\n } else {\n steps[3] = { ...steps[3], state: 'done', detail: 'skipped' };\n onSteps([...steps]);\n }\n\n const converter = new StorageToMarkdownConverter();\n const markdown = page.body?.storage?.value\n ? converter.convert(page.body.storage.value, imageUrlMap)\n : '(No content)';\n addLog(makeLog('ok', `Markdown 변환 완료 (${markdown.split('\\n').length} lines)`));\n steps[2] = { ...steps[2], state: 'done', detail: `${markdown.split('\\n').length} lines` };\n onSteps([...steps]);\n\n // Step 5: output\n steps[4] = { ...steps[4], state: 'running' };\n onSteps([...steps]);\n if (values['output']) {\n const outputPath = path.resolve(process.cwd(), String(values['output']));\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, markdown, 'utf-8');\n addLog(makeLog('ok', `파일 저장: ${outputPath}`));\n steps[4] = { ...steps[4], state: 'done', detail: outputPath };\n } else {\n steps[4] = { ...steps[4], state: 'done', detail: 'console output' };\n }\n onSteps([...steps]);\n\n return { type: 'text', content: markdown, logs };\n}\n\n// page create 실행\nexport async function executePageCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('read', 'Read Markdown file'),\n makeStep('convert', 'Convert Markdown → Storage'),\n makeStep('create', 'Create Confluence page'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['space']) throw new Error('--space is required');\n if (!values['title']) throw new Error('--title is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n let content = '';\n if (values['file']) {\n steps[1] = { ...steps[1], state: 'running', detail: String(values['file']) };\n onSteps([...steps]);\n const filePath = path.resolve(process.cwd(), String(values['file']));\n if (!fs.existsSync(filePath)) throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);\n content = fs.readFileSync(filePath, 'utf-8');\n addLog(makeLog('ok', `파일 읽기 완료: ${filePath} (${content.split('\\n').length} lines)`));\n steps[1] = { ...steps[1], state: 'done', detail: `${content.split('\\n').length} lines` };\n onSteps([...steps]);\n } else {\n steps[1] = { ...steps[1], state: 'done', detail: 'no file (empty page)' };\n onSteps([...steps]);\n }\n\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n const converter = new MarkdownToStorageConverter();\n const storageXml = converter.convert(content);\n addLog(makeLog('ok', 'Markdown → Storage XML 변환 완료'));\n steps[2] = { ...steps[2], state: 'done' };\n onSteps([...steps]);\n\n steps[3] = { ...steps[3], state: 'running', detail: `POST /rest/api/content · space=${values['space']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/content space=${values['space']} title=\"${values['title']}\"`));\n\n const page = await api.createPage({\n title: String(values['title']),\n spaceKey: String(values['space']),\n body: storageXml,\n parentId: values['parent'] ? String(values['parent']) : undefined,\n });\n addLog(makeLog('ok', `페이지 생성 완료: \"${page.title}\" (ID: ${page.id})`));\n steps[3] = { ...steps[3], state: 'done', detail: `ID: ${page.id}` };\n onSteps([...steps]);\n\n const resultText = [\n `# 페이지 생성 완료`,\n ``,\n `- **제목**: ${page.title}`,\n `- **ID**: ${page.id}`,\n `- **스페이스**: ${page.space?.key}`,\n `- **URL**: ${config.baseUrl}${page._links?.webui ?? ''}`,\n ].join('\\n');\n\n return { type: 'text', content: resultText, logs };\n}\n\n// space list 실행\nexport async function executeSpaceList(\n _values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [makeStep('fetch', 'Fetch space list')];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running', detail: 'GET /rest/api/space' };\n onSteps([...steps]);\n addLog(makeLog('run', 'GET /rest/api/space?limit=50'));\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceSpaceApi(client);\n const spaces = await api.getSpaces();\n\n addLog(makeLog('ok', `${spaces.length}개 스페이스 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${spaces.length} spaces` };\n onSteps([...steps]);\n\n const list = spaces.map((s) => ({\n key: s.key ?? '',\n name: s.name ?? '',\n type: s.type ?? '',\n id: String(s.id ?? ''),\n }));\n\n return { type: 'list', list, cols: ['key', 'name', 'type', 'id'], logs };\n}\n\n// search 실행\nexport async function executeSearch(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [makeStep('search', 'Search Confluence pages')];\n onSteps([...steps]);\n\n if (!values['cql']) throw new Error('cql is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['cql']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/search?cql=${encodeURIComponent(String(values['cql']))}`));\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceSearchApi(client);\n const searchResult = await api.searchByCql(String(values['cql']), 0, Number(values['limit'] ?? 10));\n const results = searchResult.results ?? [];\n\n addLog(makeLog('ok', `${results.length}개 결과`));\n steps[0] = { ...steps[0], state: 'done', detail: `${results.length} results` };\n onSteps([...steps]);\n\n const list = results.map((r) => ({\n id: String(r.id ?? ''),\n title: r.title ?? '',\n space: r.space?.key ?? '',\n type: r.type ?? '',\n }));\n\n return { type: 'list', list, cols: ['id', 'title', 'space', 'type'], logs };\n}\n\n// page update 실행\nexport async function executePageUpdate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('fetch', 'Fetch current page'),\n makeStep('convert', 'Convert Markdown'),\n makeStep('update', 'Update page'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['pageId']) throw new Error('pageId is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `GET /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/${values['pageId']}`));\n const current = await api.getPage(String(values['pageId']));\n addLog(makeLog('ok', `현재 페이지: \"${current.title}\" v${current.version?.number}`));\n steps[1] = { ...steps[1], state: 'done', detail: `v${current.version?.number}` };\n onSteps([...steps]);\n\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n let storageXml = current.body?.storage?.value ?? '';\n if (values['file']) {\n const filePath = path.resolve(process.cwd(), String(values['file']));\n const markdown = fs.readFileSync(filePath, 'utf-8');\n const converter = new MarkdownToStorageConverter();\n storageXml = converter.convert(markdown);\n addLog(makeLog('ok', `Markdown 변환 완료: ${filePath}`));\n }\n steps[2] = { ...steps[2], state: 'done' };\n onSteps([...steps]);\n\n steps[3] = { ...steps[3], state: 'running', detail: `PUT /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `PUT /rest/api/content/${values['pageId']}`));\n const updated = await api.updatePage({\n id: String(values['pageId']),\n title: values['title'] ? String(values['title']) : current.title!,\n body: storageXml,\n version: (current.version?.number ?? 1) + 1,\n });\n addLog(makeLog('ok', `업데이트 완료: \"${updated.title}\" v${updated.version?.number}`));\n steps[3] = { ...steps[3], state: 'done', detail: `v${updated.version?.number}` };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# 페이지 업데이트 완료\\n\\n- **제목**: ${updated.title}\\n- **ID**: ${updated.id}\\n- **버전**: v${updated.version?.number}`,\n logs,\n };\n}\n","import { createJiraClient } from '../../jira/api/client.js';\nimport { JiraIssueApi } from '../../jira/api/issue.js';\nimport { JiraSearchApi } from '../../jira/api/search.js';\nimport { loadJiraConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\nimport type { ExecuteResult } from './confluence.js';\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\nexport async function executeIssueGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch JIRA issue')];\n onSteps([...steps]);\n\n if (!values['issueId']) throw new Error('issueId is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['issueId']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/2/issue/${values['issueId']}`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraIssueApi(client);\n const issue = await api.getIssue(String(values['issueId']));\n addLog(makeLog('ok', `200 OK · \"${issue.fields?.summary}\"`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const lines = [\n `# ${issue.key}: ${issue.fields?.summary ?? ''}`,\n '',\n `- **상태**: ${issue.fields?.status?.name ?? ''}`,\n `- **담당자**: ${issue.fields?.assignee?.displayName ?? '미지정'}`,\n `- **우선순위**: ${issue.fields?.priority?.name ?? ''}`,\n `- **이슈 유형**: ${issue.fields?.issuetype?.name ?? ''}`,\n '',\n `## 설명`,\n issue.fields?.description ?? '(없음)',\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n\nexport async function executeIssueCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [\n makeStep('validate', 'Validate arguments'),\n makeStep('create', 'Create JIRA issue'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['project']) throw new Error('--project is required');\n if (!values['summary']) throw new Error('--summary is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraIssueApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `POST /rest/api/2/issue` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/2/issue project=${values['project']}`));\n\n const issue = await api.createIssue({\n projectKey: String(values['project']),\n summary: String(values['summary']),\n issueType: String(values['type'] ?? 'Task'),\n ...(values['assignee'] ? { assignee: String(values['assignee']) } : {}),\n ...(values['labels'] ? { labels: String(values['labels']).split(',').map((l) => l.trim()) } : {}),\n });\n addLog(makeLog('ok', `이슈 생성 완료: ${issue.key}`));\n steps[1] = { ...steps[1], state: 'done', detail: issue.key };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# 이슈 생성 완료\\n\\n- **키**: ${issue.key}\\n- **제목**: ${values['summary']}`,\n logs,\n };\n}\n\nexport async function executeIssueTransition(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('transition', 'Transition JIRA issue')];\n onSteps([...steps]);\n\n if (!values['issueId'] || !values['transitionId']) throw new Error('issueId and transitionId are required');\n\n steps[0] = { ...steps[0], state: 'running', detail: `${values['issueId']} → ${values['transitionId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/2/issue/${values['issueId']}/transitions`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n await client.post(`/rest/api/2/issue/${values['issueId']}/transitions`, {\n transition: { id: String(values['transitionId']) },\n });\n addLog(makeLog('ok', `전환 완료: ${values['issueId']}`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n return { type: 'text', content: `# 이슈 전환 완료\\n\\n- **이슈**: ${values['issueId']}\\n- **Transition ID**: ${values['transitionId']}`, logs };\n}\n\nexport async function executeJiraSearch(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('search', 'Search JIRA issues')];\n onSteps([...steps]);\n\n if (!values['jql']) throw new Error('jql is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['jql']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/2/search?jql=${encodeURIComponent(String(values['jql']))}`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraSearchApi(client);\n const result = await api.searchByJql(String(values['jql']), 0, Number(values['limit'] ?? 20));\n\n addLog(makeLog('ok', `${result.issues?.length ?? 0}개 이슈 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${result.issues?.length ?? 0} issues` };\n onSteps([...steps]);\n\n const list = (result.issues ?? []).map((i) => ({\n key: i.key ?? '',\n summary: (i.fields?.summary ?? '').slice(0, 50),\n status: i.fields?.status?.name ?? '',\n assignee: i.fields?.assignee?.displayName ?? '',\n }));\n\n return { type: 'list', list, cols: ['key', 'summary', 'status', 'assignee'], logs };\n}\n","import { createGitlabClient } from '../../gitlab/api/client.js';\nimport { GitlabMergeRequestApi } from '../../gitlab/api/merge-request.js';\nimport { GitlabPipelineApi } from '../../gitlab/api/pipeline.js';\nimport { loadGitlabConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\nimport type { ExecuteResult } from './confluence.js';\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\nexport async function executeMrList(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch MR list')];\n onSteps([...steps]);\n\n if (!values['projectId']) throw new Error('projectId is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: `project=${values['projectId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/merge_requests?state=${values['state'] ?? 'opened'}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n const mrs = await api.getMergeRequests(Number(values['projectId']), {\n state: String(values['state'] ?? 'opened') as 'opened' | 'closed' | 'merged' | 'all',\n });\n\n addLog(makeLog('ok', `${mrs.length}개 MR 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${mrs.length} MRs` };\n onSteps([...steps]);\n\n const list = mrs.map((mr) => ({\n iid: String(mr.iid ?? ''),\n title: (mr.title ?? '').slice(0, 50),\n state: mr.state ?? '',\n author: mr.author?.name ?? '',\n target: mr.target_branch ?? '',\n }));\n\n return { type: 'list', list, cols: ['iid', 'title', 'state', 'author', 'target'], logs };\n}\n\nexport async function executeMrGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch MR detail')];\n onSteps([...steps]);\n\n if (!values['projectId'] || !values['mrId']) throw new Error('projectId and mrId are required');\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/merge_requests/${values['mrId']}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n const mr = await api.getMergeRequest(Number(values['projectId']), Number(values['mrId']));\n\n addLog(makeLog('ok', `200 OK · !${mr.iid} \"${mr.title}\"`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const lines = [\n `# MR !${mr.iid}: ${mr.title}`,\n '',\n `- **상태**: ${mr.state}`,\n `- **작성자**: ${mr.author?.name ?? ''}`,\n `- **브랜치**: \\`${mr.source_branch}\\` → \\`${mr.target_branch}\\``,\n `- **생성일**: ${mr.created_at ?? ''}`,\n '',\n `## 설명`,\n mr.description ?? '(없음)',\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n\nexport async function executeMrCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [\n makeStep('validate', 'Validate arguments'),\n makeStep('create', 'Create MR'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['projectId'] || !values['sourceBranch']) throw new Error('projectId and sourceBranch are required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `POST /api/v4/projects/${values['projectId']}/merge_requests` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /api/v4/projects/${values['projectId']}/merge_requests`));\n\n const mr = await api.createMergeRequest(Number(values['projectId']), {\n source_branch: String(values['sourceBranch']),\n target_branch: String(values['targetBranch'] ?? 'main'),\n title: values['title'] ? String(values['title']) : `Merge ${values['sourceBranch']} → ${values['targetBranch'] ?? 'main'}`,\n });\n\n addLog(makeLog('ok', `MR 생성 완료: !${mr.iid}`));\n steps[1] = { ...steps[1], state: 'done', detail: `!${mr.iid}` };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# MR 생성 완료\\n\\n- **번호**: !${mr.iid}\\n- **제목**: ${mr.title}\\n- **브랜치**: \\`${mr.source_branch}\\` → \\`${mr.target_branch}\\``,\n logs,\n };\n}\n\nexport async function executePipelineGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch pipeline')];\n onSteps([...steps]);\n\n if (!values['projectId'] || !values['pipelineId']) throw new Error('projectId and pipelineId are required');\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/pipelines/${values['pipelineId']}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabPipelineApi(client);\n const pipeline = await api.getPipeline(Number(values['projectId']), Number(values['pipelineId']));\n\n addLog(makeLog('ok', `200 OK · pipeline #${pipeline.id} · ${pipeline.status}`));\n\n let jobsText = '';\n if (values['jobs']) {\n const jobs = await api.getPipelineJobs(Number(values['projectId']), Number(values['pipelineId']));\n addLog(makeLog('ok', `${jobs.length}개 job 조회 완료`));\n jobsText = '\\n\\n## Jobs\\n\\n' + jobs.map((j) => `- **${j.name}**: ${j.status}`).join('\\n');\n }\n\n steps[0] = { ...steps[0], state: 'done', detail: pipeline.status };\n onSteps([...steps]);\n\n const lines = [\n `# Pipeline #${pipeline.id}`,\n '',\n `- **상태**: ${pipeline.status}`,\n `- **브랜치**: ${pipeline.ref ?? ''}`,\n `- **SHA**: ${(pipeline.sha ?? '').slice(0, 8)}`,\n `- **생성일**: ${pipeline.created_at ?? ''}`,\n jobsText,\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n"],"mappings":"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","names":["Box","useStdout","useCallback","useEffect","useState","Box","Text","Box","jsx","jsxs","Box","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Box","Text","useInput","useState","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","Text","useInput","Box","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","Text","useEffect","useState","jsx","useState","useEffect","Text","jsx","jsxs","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","fs","path","os","fs","path","os","fs","path","path","fs","makeStep","makeStep","jsx","useStdout","useState","useEffect","useCallback","Box","jsx"]}
1
+ {"version":3,"sources":["../../tools/tui/index.tsx","../../tools/tui/App.tsx","../../tools/tui/command-def.ts","../../tools/tui/menu-def.ts","../../tools/tui/screens/ErrorScreen.tsx","../../tools/tui/components/AppShell.tsx","../../tools/tui/theme.ts","../../tools/tui/components/HeaderBar.tsx","../../tools/tui/components/Keymap.tsx","../../tools/tui/components/LogPane.tsx","../../tools/tui/components/MenuTree.tsx","../../tools/tui/components/Panel.tsx","../../tools/tui/screens/FormScreen.tsx","../../tools/tui/components/FilePicker.tsx","../../tools/tui/components/FormField.tsx","../../tools/tui/url-parser.ts","../../tools/tui/screens/HistoryScreen.tsx","../../tools/tui/screens/ListScreen.tsx","../../tools/tui/screens/MenuScreen.tsx","../../tools/tui/screens/RunningScreen.tsx","../../tools/tui/components/Spinner.tsx","../../tools/tui/screens/TextView.tsx","../../tools/tui/state.ts","../../tools/tui/tuiconfig.ts","../../tools/tui/history.ts","../../tools/tui/executor/confluence.ts","../../tools/tui/executor/jira.ts","../../tools/tui/executor/gitlab.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { render } from 'ink';\nimport { App } from './App.js';\nimport { loadTuiConfig } from './tuiconfig.js';\n\n// 터미널 alternate screen buffer 진입/복귀 (vim/less 방식)\nconst ENTER_ALT_SCREEN = '\\x1b[?1049h\\x1b[H';\nconst LEAVE_ALT_SCREEN = '\\x1b[?1049l';\nconst HIDE_CURSOR = '\\x1b[?25l';\nconst SHOW_CURSOR = '\\x1b[?25h';\n\nlet cleanedUp = false;\nfunction cleanup() {\n if (cleanedUp) return;\n cleanedUp = true;\n process.stdout.write(SHOW_CURSOR + LEAVE_ALT_SCREEN);\n}\n\nasync function main() {\n const config = await loadTuiConfig();\n\n // alternate screen 진입 (전체 화면 모드)\n process.stdout.write(ENTER_ALT_SCREEN + HIDE_CURSOR);\n\n // 비정상 종료 대비\n process.on('exit', cleanup);\n process.on('SIGINT', () => { cleanup(); process.exit(130); });\n process.on('SIGTERM', () => { cleanup(); process.exit(143); });\n process.on('uncaughtException', (err) => {\n cleanup();\n console.error(err);\n process.exit(1);\n });\n\n const { waitUntilExit } = render(<App config={config} />, {\n exitOnCtrlC: true,\n });\n\n await waitUntilExit();\n cleanup();\n}\n\n// top-level await 로 main() 을 끝까지 대기한다.\n// 이렇게 해야 cli.ts 에서 `await import('./tui/index.js')` 가 main() 완료 시점까지 블로킹된다.\ntry {\n await main();\n} catch (err) {\n cleanup();\n console.error('TUI 시작 실패:', err);\n process.exit(1);\n}\n","import { Box, useApp, useStdout } from 'ink';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { COMMANDS } from './command-def.js';\nimport { DEFAULT_EXPANDED, getParentMenuKeys } from './menu-def.js';\nimport { ErrorScreen } from './screens/ErrorScreen.js';\nimport { FormScreen } from './screens/FormScreen.js';\nimport { HistoryScreen } from './screens/HistoryScreen.js';\nimport { ListScreen } from './screens/ListScreen.js';\nimport { MenuScreen } from './screens/MenuScreen.js';\nimport { RunningScreen } from './screens/RunningScreen.js';\nimport { TextView } from './screens/TextView.js';\nimport type { AppState, HistoryEntry, LogEntry, StepEntry } from './state.js';\nimport { makeLog } from './state.js';\nimport { DEFAULT_ACCENT } from './theme.js';\nimport { loadTuiConfig, saveLastUsed, type TuiConfig } from './tuiconfig.js';\nimport { appendHistory, loadHistory } from './history.js';\n\n// Executor imports\nimport { executePageGet, executePageCreate, executeSpaceList, executeSearch, executePageUpdate } from './executor/confluence.js';\nimport { executeIssueGet, executeIssueCreate, executeIssueTransition, executeJiraSearch } from './executor/jira.js';\nimport { executeMrList, executeMrGet, executeMrCreate, executePipelineGet } from './executor/gitlab.js';\n\nconst EXECUTOR_MAP: Record<string, (\n values: Record<string, string | boolean>,\n onSteps: (s: StepEntry[]) => void,\n onLog: (l: LogEntry) => void,\n) => Promise<{ type: 'text' | 'list'; content?: string; list?: Array<Record<string, string>>; cols?: string[]; logs: LogEntry[] }>> = {\n 'confluence:page:get': executePageGet,\n 'confluence:page:create': executePageCreate,\n 'confluence:page:update': executePageUpdate,\n 'confluence:space:list': executeSpaceList,\n 'confluence:search': executeSearch,\n 'jira:issue:get': executeIssueGet,\n 'jira:issue:create': executeIssueCreate,\n 'jira:issue:transition': executeIssueTransition,\n 'jira:search': executeJiraSearch,\n 'gitlab:mr:list': executeMrList,\n 'gitlab:mr:get': executeMrGet,\n 'gitlab:mr:create': executeMrCreate,\n 'gitlab:pipeline:get': executePipelineGet,\n};\n\ninterface AppProps {\n config: TuiConfig;\n}\n\nconst INITIAL_STATE: AppState = {\n screen: 'menu',\n activePath: 'confluence:page:get',\n expandedKeys: DEFAULT_EXPANDED,\n commandKey: '',\n formValues: {},\n formErrors: {},\n focusedField: 0,\n steps: [],\n progress: 0,\n resultText: '',\n resultList: [],\n resultListCols: [],\n resultListSelected: 0,\n logs: [makeLog('info', 'session 시작 · tdecollab TUI v0.2.3')],\n history: loadHistory(),\n historySelected: 0,\n};\n\nexport function App({ config }: AppProps) {\n const { exit } = useApp();\n const { stdout } = useStdout();\n const accent = config.accent ?? DEFAULT_ACCENT;\n const [state, setState] = useState<AppState>(INITIAL_STATE);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // 터미널 크기 추적 (resize 대응)\n const [size, setSize] = useState({\n cols: stdout?.columns ?? 120,\n rows: stdout?.rows ?? 40,\n });\n useEffect(() => {\n if (!stdout) return;\n const onResize = () => setSize({ cols: stdout.columns, rows: stdout.rows });\n stdout.on('resize', onResize);\n return () => { stdout.off('resize', onResize); };\n }, [stdout]);\n\n const addLog = useCallback((log: LogEntry) => {\n setState((s) => ({ ...s, logs: [...s.logs, log] }));\n }, []);\n\n // 메뉴에서 커맨드 선택\n const handleSelectCommand = useCallback((commandKey: string) => {\n const def = COMMANDS[commandKey];\n if (!def) return;\n\n // cosmiconfig에서 마지막 사용값 로드\n const lastUsed = config.lastUsed?.[commandKey] ?? {};\n const initValues: Record<string, string | boolean> = {};\n for (const f of def.fields) {\n initValues[f.key] = f.key in lastUsed ? lastUsed[f.key] : (f.defaultValue ?? '');\n }\n\n // 선택된 커맨드의 부모 메뉴들을 자동으로 확장 상태에 포함시킨다\n const parents = getParentMenuKeys(commandKey);\n\n setState((s) => ({\n ...s,\n screen: 'form',\n commandKey,\n formValues: initValues,\n formErrors: {},\n focusedField: 0,\n activePath: commandKey,\n expandedKeys: Array.from(new Set([...s.expandedKeys, ...parents])),\n }));\n addLog(makeLog('dim', `폼 열기: ${commandKey}`));\n }, [config.lastUsed, addLog]);\n\n // 메뉴 확장/축소 토글\n const handleToggleExpanded = useCallback((key: string) => {\n setState((s) => ({\n ...s,\n expandedKeys: s.expandedKeys.includes(key)\n ? s.expandedKeys.filter((k) => k !== key)\n : [...s.expandedKeys, key],\n }));\n }, []);\n\n // 폼에서 실행\n const handleRun = useCallback(async (values: Record<string, string | boolean>) => {\n const commandKey = stateRef.current.commandKey;\n const executor = EXECUTOR_MAP[commandKey];\n if (!executor) {\n addLog(makeLog('err', `실행기를 찾을 수 없습니다: ${commandKey}`));\n return;\n }\n\n const startTime = Date.now();\n\n // 실행 화면으로 전환\n setState((s) => ({\n ...s,\n screen: 'running',\n formValues: values,\n steps: [],\n progress: 0,\n }));\n addLog(makeLog('run', `tdecollab ${commandKey.split(':').join(' ')}`));\n\n // executor 는 imageDir 을 자동으로 output 디렉토리 기준으로 resolve 하므로\n // 사용자 입력 원본을 그대로 전달한다 (preview 만 결합된 경로로 표시).\n try {\n const result = await executor(\n values,\n (steps) => setState((s) => ({ ...s, steps })),\n (log) => setState((s) => ({ ...s, logs: [...s.logs, log] })),\n );\n\n const dur = `${((Date.now() - startTime) / 1000).toFixed(1)}s`;\n const def = COMMANDS[commandKey];\n const svc = def?.svc === 'confluence' ? 'cf' : def?.svc === 'jira' ? 'jr' : 'gl';\n\n // 히스토리에 저장\n const histEntry: HistoryEntry = {\n when: new Date().toTimeString().slice(0, 5),\n svc,\n cmd: commandKey.split(':').join(' '),\n state: 'ok',\n dur,\n result: result.type === 'list' ? `${result.list?.length ?? 0} items` : 'done',\n };\n appendHistory(histEntry);\n saveLastUsed(commandKey, values);\n\n // 결과 화면으로 전환\n if (result.type === 'list') {\n setState((s) => ({\n ...s,\n screen: 'result-list',\n resultList: result.list ?? [],\n resultListCols: result.cols ?? [],\n resultListSelected: 0,\n logs: [...s.logs, makeLog('ok', `완료 (${dur})`)],\n history: [histEntry, ...s.history],\n }));\n } else {\n setState((s) => ({\n ...s,\n screen: 'result-text',\n resultText: result.content ?? '',\n logs: [...s.logs, makeLog('ok', `완료 (${dur})`)],\n history: [histEntry, ...s.history],\n }));\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n const dur = `${((Date.now() - startTime) / 1000).toFixed(1)}s`;\n const def = COMMANDS[commandKey];\n const svc = def?.svc === 'confluence' ? 'cf' : def?.svc === 'jira' ? 'jr' : 'gl';\n\n const histEntry: HistoryEntry = {\n when: new Date().toTimeString().slice(0, 5),\n svc,\n cmd: commandKey.split(':').join(' '),\n state: 'err',\n dur,\n result: msg.slice(0, 40),\n };\n appendHistory(histEntry);\n\n setState((s) => ({\n ...s,\n screen: 'error',\n formErrors: { error: msg },\n logs: [...s.logs, makeLog('err', msg)],\n history: [histEntry, ...s.history],\n }));\n }\n }, [addLog]);\n\n const handleBack = useCallback(() => {\n setState((s) => ({ ...s, screen: 'menu' }));\n }, []);\n\n const handleOpenHistory = useCallback(() => {\n setState((s) => ({ ...s, screen: 'history', history: loadHistory() }));\n }, []);\n\n const handleReplay = useCallback((entry: HistoryEntry) => {\n // 커맨드 키로 변환\n const commandKey = entry.cmd.replace(/\\s+/g, ':');\n handleSelectCommand(commandKey);\n }, [handleSelectCommand]);\n\n const handleSavePreset = useCallback((values: Record<string, string | boolean>) => {\n const commandKey = stateRef.current.commandKey;\n saveLastUsed(commandKey, values);\n addLog(makeLog('ok', `프리셋 저장: ${commandKey}`));\n }, [addLog]);\n\n const handleQuit = useCallback(() => exit(), [exit]);\n\n let screen;\n switch (state.screen) {\n case 'menu':\n screen = (\n <MenuScreen\n state={state}\n onSelectCommand={handleSelectCommand}\n onToggleExpanded={handleToggleExpanded}\n onOpenHistory={handleOpenHistory}\n onQuit={handleQuit}\n accent={accent}\n />\n );\n break;\n case 'form':\n screen = (\n <FormScreen\n state={state}\n onRun={handleRun}\n onBack={handleBack}\n onSavePreset={handleSavePreset}\n accent={accent}\n />\n );\n break;\n case 'running':\n screen = <RunningScreen state={state} onCancel={handleBack} accent={accent} />;\n break;\n case 'result-list':\n screen = <ListScreen state={state} onBack={handleBack} accent={accent} />;\n break;\n case 'result-text':\n screen = <TextView state={state} onBack={handleBack} accent={accent} />;\n break;\n case 'error':\n screen = (\n <ErrorScreen\n state={state}\n onBack={() => setState((s) => ({ ...s, screen: 'form' }))}\n onRetry={() => handleRun(state.formValues)}\n accent={accent}\n />\n );\n break;\n case 'history':\n screen = <HistoryScreen state={state} onBack={handleBack} onReplay={handleReplay} accent={accent} />;\n break;\n default:\n screen = (\n <MenuScreen\n state={state}\n onSelectCommand={handleSelectCommand}\n onToggleExpanded={handleToggleExpanded}\n onOpenHistory={handleOpenHistory}\n onQuit={handleQuit}\n accent={accent}\n />\n );\n }\n\n // 터미널 전체 화면을 채우는 루트 컨테이너\n return (\n <Box width={size.cols} height={size.rows} flexDirection=\"column\">\n {screen}\n </Box>\n );\n}\n","export type FieldType = 'text' | 'bool' | 'select';\n\nexport interface FieldDef {\n key: string;\n label: string;\n type: FieldType;\n required?: boolean;\n hint?: string;\n defaultValue?: string | boolean;\n prefix?: string;\n options?: string[]; // select 타입용\n pathType?: 'file' | 'dir'; // 경로 타입: Enter 시 디렉토리 선택창 오픈\n}\n\nexport interface CommandDef {\n key: string;\n label: string;\n description: string;\n synopsis: string;\n svc: 'confluence' | 'jira' | 'gitlab';\n fields: FieldDef[];\n}\n\nexport const COMMANDS: Record<string, CommandDef> = {\n 'confluence:page:get': {\n key: 'confluence:page:get',\n label: 'confluence page get',\n description: 'Confluence 페이지를 조회하고 Markdown으로 변환하여 출력하거나 파일로 저장합니다. 이미지를 함께 다운로드할 수 있습니다.',\n synopsis: 'tdecollab confluence page get <pageId> [options]',\n svc: 'confluence',\n fields: [\n { key: 'pageId', label: 'pageId', type: 'text', required: true, hint: '페이지 ID (숫자)', prefix: '#' },\n { key: 'output', label: '--output', type: 'text', hint: '저장할 Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n { key: 'downloadImages', label: '-d --download-images', type: 'bool', defaultValue: false },\n { key: 'imageDir', label: '--image-dir', type: 'text', defaultValue: 'images', hint: '이미지 디렉토리 이름 (output 파일 위치 하위에 생성됨)', prefix: '📁' },\n { key: 'quiet', label: '-q --quiet', type: 'bool', defaultValue: false },\n { key: 'raw', label: '-r --raw', type: 'bool', defaultValue: false },\n ],\n },\n\n 'confluence:page:create': {\n key: 'confluence:page:create',\n label: 'confluence page create',\n description: 'Markdown 파일 또는 텍스트로 Confluence 페이지를 생성합니다.',\n synopsis: 'tdecollab confluence page create -s <space> -t <title> [options]',\n svc: 'confluence',\n fields: [\n { key: 'space', label: '--space', type: 'text', required: true, hint: 'Confluence 스페이스 키 (예: TDE)', prefix: '🔑' },\n { key: 'title', label: '--title', type: 'text', required: true, hint: '페이지 제목', prefix: '✎' },\n { key: 'file', label: '--file', type: 'text', hint: 'Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n { key: 'parent', label: '--parent', type: 'text', hint: '부모 페이지 ID', prefix: '#' },\n ],\n },\n\n 'confluence:page:update': {\n key: 'confluence:page:update',\n label: 'confluence page update',\n description: '기존 Confluence 페이지를 업데이트합니다.',\n synopsis: 'tdecollab confluence page update <pageId> [options]',\n svc: 'confluence',\n fields: [\n { key: 'pageId', label: 'pageId', type: 'text', required: true, hint: '업데이트할 페이지 ID', prefix: '#' },\n { key: 'title', label: '--title', type: 'text', hint: '새 제목 (생략 시 기존 제목 유지)' },\n { key: 'file', label: '--file', type: 'text', hint: 'Markdown 파일 경로', prefix: '📄', pathType: 'file' },\n ],\n },\n\n 'confluence:space:list': {\n key: 'confluence:space:list',\n label: 'confluence space list',\n description: 'Confluence 스페이스 목록을 조회합니다.',\n synopsis: 'tdecollab confluence space list [options]',\n svc: 'confluence',\n fields: [\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '50', hint: '최대 조회 수' },\n ],\n },\n\n 'confluence:search': {\n key: 'confluence:search',\n label: 'confluence search',\n description: 'CQL(Confluence Query Language)로 페이지를 검색합니다.',\n synopsis: 'tdecollab confluence search <cql> [options]',\n svc: 'confluence',\n fields: [\n { key: 'cql', label: 'cql', type: 'text', required: true, hint: 'CQL 검색 쿼리 (예: title ~ \"가이드\" AND space = TDE)', prefix: 'cql›' },\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '10', hint: '최대 결과 수' },\n ],\n },\n\n 'jira:issue:get': {\n key: 'jira:issue:get',\n label: 'jira issue get',\n description: 'JIRA 이슈를 조회합니다.',\n synopsis: 'tdecollab jira issue get <issueId>',\n svc: 'jira',\n fields: [\n { key: 'issueId', label: 'issueId', type: 'text', required: true, hint: '이슈 키 (예: PROJ-1234)', prefix: '🎫' },\n ],\n },\n\n 'jira:issue:create': {\n key: 'jira:issue:create',\n label: 'jira issue create',\n description: 'JIRA 이슈를 생성합니다.',\n synopsis: 'tdecollab jira issue create -p <project> -s <summary> [options]',\n svc: 'jira',\n fields: [\n { key: 'project', label: '--project (-p)', type: 'text', required: true, hint: '프로젝트 키 (예: PROJ)' },\n { key: 'summary', label: '--summary (-s)', type: 'text', required: true, hint: '이슈 제목' },\n { key: 'type', label: '--type (-t)', type: 'select', defaultValue: 'Task', options: ['Task', 'Bug', 'Story', 'Epic', 'Sub-task'] },\n { key: 'assignee', label: '--assignee (-a)', type: 'text', hint: '담당자 사용자명' },\n { key: 'labels', label: '--labels (-l)', type: 'text', hint: '레이블 (쉼표 구분)' },\n ],\n },\n\n 'jira:issue:transition': {\n key: 'jira:issue:transition',\n label: 'jira issue transition',\n description: 'JIRA 이슈 상태를 전환합니다.',\n synopsis: 'tdecollab jira issue transition <issueId> -t <transitionId>',\n svc: 'jira',\n fields: [\n { key: 'issueId', label: 'issueId', type: 'text', required: true, hint: '이슈 키', prefix: '🎫' },\n { key: 'transitionId', label: '--transition (-t)', type: 'text', required: true, hint: 'Transition ID' },\n ],\n },\n\n 'jira:search': {\n key: 'jira:search',\n label: 'jira search',\n description: 'JQL로 JIRA 이슈를 검색합니다.',\n synopsis: 'tdecollab jira search <jql> [options]',\n svc: 'jira',\n fields: [\n { key: 'jql', label: 'jql', type: 'text', required: true, hint: 'JQL 쿼리 (예: assignee = currentUser())', prefix: 'jql›' },\n { key: 'limit', label: '--limit', type: 'text', defaultValue: '20', hint: '최대 결과 수' },\n ],\n },\n\n 'gitlab:mr:list': {\n key: 'gitlab:mr:list',\n label: 'gitlab mr list',\n description: 'GitLab 프로젝트의 Merge Request 목록을 조회합니다.',\n synopsis: 'tdecollab gitlab mr list <projectId> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID (숫자)', prefix: '#' },\n { key: 'state', label: '--state (-s)', type: 'select', defaultValue: 'opened', options: ['opened', 'closed', 'merged', 'all'] },\n ],\n },\n\n 'gitlab:mr:get': {\n key: 'gitlab:mr:get',\n label: 'gitlab mr get',\n description: 'GitLab Merge Request 상세 정보를 조회합니다.',\n synopsis: 'tdecollab gitlab mr get <projectId> <mrId>',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'mrId', label: 'mrId', type: 'text', required: true, hint: 'MR 번호', prefix: '!' },\n ],\n },\n\n 'gitlab:mr:create': {\n key: 'gitlab:mr:create',\n label: 'gitlab mr create',\n description: 'GitLab Merge Request를 생성합니다.',\n synopsis: 'tdecollab gitlab mr create <projectId> --source <branch> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'sourceBranch', label: '--source', type: 'text', required: true, hint: '소스 브랜치명' },\n { key: 'targetBranch', label: '--target', type: 'text', defaultValue: 'main', hint: '타겟 브랜치명' },\n { key: 'title', label: '--title', type: 'text', hint: 'MR 제목 (기본: 브랜치명)' },\n ],\n },\n\n 'gitlab:pipeline:get': {\n key: 'gitlab:pipeline:get',\n label: 'gitlab pipeline get',\n description: 'GitLab 파이프라인 정보를 조회합니다.',\n synopsis: 'tdecollab gitlab pipeline get <projectId> <pipelineId> [options]',\n svc: 'gitlab',\n fields: [\n { key: 'projectId', label: 'projectId', type: 'text', required: true, hint: '프로젝트 ID', prefix: '#' },\n { key: 'pipelineId', label: 'pipelineId', type: 'text', required: true, hint: '파이프라인 ID', prefix: '#' },\n { key: 'jobs', label: '--jobs', type: 'bool', defaultValue: false },\n ],\n },\n};\n\n// 커맨드 실행/미리보기 직전에 값을 가공한다.\n// confluence:page:get 의 imageDir 은 사용자가 디렉토리 이름만 입력하지만,\n// 실제 cli 파라미터로는 output 파일 디렉토리 하위 경로로 결합되어 전달되어야 한다.\nexport function applyValueTransform(\n commandKey: string,\n values: Record<string, string | boolean>,\n): Record<string, string | boolean> {\n if (commandKey === 'confluence:page:get') {\n const result = { ...values };\n const imageDir = String(result['imageDir'] ?? '').trim();\n const output = String(result['output'] ?? '').trim();\n if (imageDir && output) {\n // 이미 / 가 포함된 경로면(사용자가 직접 경로 입력) 그대로 둔다\n if (!imageDir.includes('/')) {\n const lastSlash = output.lastIndexOf('/');\n const outputDir = lastSlash >= 0 ? output.substring(0, lastSlash) : '.';\n result['imageDir'] = `${outputDir}/${imageDir}`.replace(/\\/+/g, '/');\n }\n }\n return result;\n }\n return values;\n}\n\n// 커맨드 preview 문자열 생성\nexport function buildPreview(def: CommandDef, values: Record<string, string | boolean>): string {\n const transformed = applyValueTransform(def.key, values);\n const parts: string[] = ['tdecollab', ...def.key.split(':')];\n\n for (const field of def.fields) {\n const val = transformed[field.key] ?? field.defaultValue;\n if (!val && val !== false) continue;\n\n if (field.type === 'bool') {\n if (val === true) parts.push(`-${field.key.charAt(0)}`);\n } else if (field.type === 'text') {\n const isPositional = !field.label.startsWith('-');\n if (isPositional) {\n if (val) parts.push(String(val));\n } else {\n const flag = field.label.split(' ')[0];\n if (val) parts.push(flag, String(val));\n }\n }\n }\n return parts.join(' ');\n}\n","export interface MenuItem {\n key: string;\n label: string;\n icon?: string;\n badge?: string;\n badgeColor?: string;\n dim?: boolean;\n children?: MenuItem[];\n commandKey?: string; // 선택 시 실행할 커맨드\n}\n\nexport const MENU: MenuItem[] = [\n {\n key: 'confluence',\n label: 'Confluence',\n icon: '◆',\n badge: '9',\n badgeColor: '#7DD3FC',\n children: [\n {\n key: 'confluence/page',\n label: 'page',\n icon: '▸',\n children: [\n { key: 'confluence/page/get', label: 'get', icon: '·', commandKey: 'confluence:page:get' },\n { key: 'confluence/page/create', label: 'create', icon: '·', commandKey: 'confluence:page:create' },\n { key: 'confluence/page/update', label: 'update', icon: '·', commandKey: 'confluence:page:update' },\n ],\n },\n {\n key: 'confluence/space',\n label: 'space',\n icon: '▸',\n children: [\n { key: 'confluence/space/list', label: 'list', icon: '·', commandKey: 'confluence:space:list' },\n ],\n },\n {\n key: 'confluence/search',\n label: 'search',\n icon: '▸',\n commandKey: 'confluence:search',\n },\n ],\n },\n {\n key: 'jira',\n label: 'JIRA',\n icon: '◆',\n badge: '7',\n badgeColor: '#86EFAC',\n children: [\n {\n key: 'jira/issue',\n label: 'issue',\n icon: '▸',\n children: [\n { key: 'jira/issue/get', label: 'get', icon: '·', commandKey: 'jira:issue:get' },\n { key: 'jira/issue/create', label: 'create', icon: '·', commandKey: 'jira:issue:create' },\n { key: 'jira/issue/transition', label: 'transition', icon: '·', commandKey: 'jira:issue:transition' },\n ],\n },\n {\n key: 'jira/search',\n label: 'search',\n icon: '▸',\n commandKey: 'jira:search',\n },\n ],\n },\n {\n key: 'gitlab',\n label: 'GitLab',\n icon: '◆',\n badge: '7',\n badgeColor: '#FBBF24',\n children: [\n {\n key: 'gitlab/mr',\n label: 'mr',\n icon: '▸',\n children: [\n { key: 'gitlab/mr/list', label: 'list', icon: '·', commandKey: 'gitlab:mr:list' },\n { key: 'gitlab/mr/get', label: 'get', icon: '·', commandKey: 'gitlab:mr:get' },\n { key: 'gitlab/mr/create', label: 'create', icon: '·', commandKey: 'gitlab:mr:create' },\n ],\n },\n {\n key: 'gitlab/pipeline',\n label: 'pipeline',\n icon: '▸',\n children: [\n { key: 'gitlab/pipeline/get', label: 'get', icon: '·', commandKey: 'gitlab:pipeline:get' },\n ],\n },\n ],\n },\n];\n\nexport const META_ITEMS: MenuItem[] = [\n { key: 'history', label: 'History', icon: '⏱' },\n { key: 'settings', label: 'Settings', icon: '⚙', dim: true },\n];\n\n// 메뉴 트리를 평탄화하여 탐색 가능한 배열로 변환\nexport interface FlatItem {\n item: MenuItem;\n depth: number;\n parentKey?: string;\n}\n\nexport function flattenMenu(\n items: MenuItem[],\n expanded: string[],\n depth = 0,\n parentKey?: string,\n): FlatItem[] {\n const result: FlatItem[] = [];\n for (const item of items) {\n result.push({ item, depth, parentKey });\n if (item.children && expanded.includes(item.key)) {\n result.push(...flattenMenu(item.children, expanded, depth + 1, item.key));\n }\n }\n return result;\n}\n\n// 기본 확장 상태\nexport const DEFAULT_EXPANDED = ['confluence', 'confluence/page'];\n\n// commandKey로 breadcrumb 경로 추출\nexport function pathFromCommandKey(commandKey: string): string[] {\n return commandKey.split(':');\n}\n\n// commandKey 의 모든 상위 메뉴 키를 계산 (자동 확장용)\n// 'confluence:page:get' → ['confluence', 'confluence/page']\nexport function getParentMenuKeys(commandKey: string): string[] {\n const menuKey = commandKey.replace(/:/g, '/');\n const parts = menuKey.split('/');\n const parents: string[] = [];\n for (let i = 1; i < parts.length; i++) {\n parents.push(parts.slice(0, i).join('/'));\n }\n return parents;\n}\n","import { Box, Text, useInput } from 'ink';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface ErrorScreenProps {\n state: AppState;\n onBack: () => void;\n onRetry: () => void;\n accent?: string;\n}\n\nexport function ErrorScreen({ state, onBack, onRetry, accent = DEFAULT_ACCENT }: ErrorScreenProps) {\n const crumbs = pathFromCommandKey(state.commandKey);\n const errors = Object.entries(state.formErrors);\n\n useInput((input, key) => {\n if (key.escape) onBack();\n else if (input === 'r' || input === 'R') onRetry();\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.red}>●</Text>\n <Text color={T.red}>{errors.length} errors</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title={crumbs.join(' ')} badge=\"ERROR\" accent={T.red} focused>\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n {/* 에러 배너 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.red}\n paddingX={1}\n flexDirection=\"column\"\n gap={0}\n >\n <Text color={T.red} bold>✕ 유효성 검증에 실패했습니다 (E_VALIDATION)</Text>\n <Text color={T.fgDim}>\n {errors.length}개 오류를 수정한 뒤 다시 시도하세요.\n </Text>\n </Box>\n\n {/* 에러 항목 */}\n {errors.map(([key, msg]) => (\n <Box key={key} flexDirection=\"column\" gap={0}>\n <Box gap={2}>\n <Text color={T.red} bold>{key.padEnd(20)}</Text>\n <Text color={T.red}>{msg}</Text>\n </Box>\n </Box>\n ))}\n\n {/* 로그에서 온 에러 (state.logs 중 err 레벨) */}\n {state.logs.filter((l) => l.level === 'err' || l.level === 'warn').map((l, i) => (\n <Box key={i} gap={2}>\n <Text color={l.level === 'err' ? T.red : T.amber}>\n {l.level === 'err' ? '✕' : '⚠'}\n </Text>\n <Text color={l.level === 'err' ? T.red : T.amber}>{l.text}</Text>\n </Box>\n ))}\n\n {/* 액션 버튼 힌트 */}\n <Box gap={3} marginTop={1}>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.fg}> ↵ Back to form </Text>\n </Box>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.amber}> R Retry </Text>\n </Box>\n <Box gap={1}>\n <Text backgroundColor={T.panelHi} color={T.fgDim}> Esc Menu </Text>\n </Box>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} title=\"Diagnostics\" />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↵', label: 'back to form' },\n { key: 'R', label: 'retry' },\n { key: 'Esc', label: 'menu' },\n ]} />\n }\n />\n );\n}\n","import { Box } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface AppShellProps {\n header: React.ReactNode;\n menu: React.ReactNode;\n body: React.ReactNode;\n log: React.ReactNode;\n footer?: React.ReactNode;\n menuWidth?: number;\n}\n\nexport function AppShell({\n header,\n menu,\n body,\n log,\n footer,\n menuWidth = 32,\n}: AppShellProps) {\n return (\n <Box flexDirection=\"column\" flexGrow={1} height=\"100%\" width=\"100%\">\n {/* 헤더 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n flexShrink={0}\n >\n {header}\n </Box>\n\n {/* 3-pane 메인 영역 — 남은 공간 모두 차지 */}\n <Box flexGrow={1} gap={1} minHeight={0}>\n {/* 좌측 메뉴 */}\n <Box width={menuWidth} flexShrink={0}>\n {menu}\n </Box>\n {/* 우측 본문 */}\n <Box flexGrow={1} minWidth={0}>\n {body}\n </Box>\n </Box>\n\n {/* 하단 로그 */}\n <Box height={10} flexShrink={0}>\n {log}\n </Box>\n\n {/* 키맵 */}\n {footer && (\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n flexShrink={0}\n >\n {footer}\n </Box>\n )}\n </Box>\n );\n}\n","// 디자인 시스템 색상 토큰 — k9s/charm.sh 분위기의 다크 모던 TUI\nexport const T = {\n bg: '#08090C',\n termBg: '#0E1014',\n panelBg: '#13161C',\n panelHi: '#181C24',\n border: '#2A2F3A',\n borderDim: '#1E222B',\n borderHi: '#3D4452',\n\n fg: '#E6E8EC',\n fgDim: '#9CA3AF',\n fgMute: '#6B7280',\n fgFaint: '#4B5563',\n\n pink: '#FF7BAC',\n cyan: '#7DD3FC',\n mint: '#86EFAC',\n amber: '#FBBF24',\n violet: '#C4B5FD',\n red: '#F87171',\n blue: '#60A5FA',\n};\n\n// 서비스별 브랜드 색상 (히스토리 svc 코드 포함)\nexport const SVC_COLOR: Record<string, string> = {\n confluence: T.cyan,\n jira: T.mint,\n gitlab: T.amber,\n cf: T.cyan,\n jr: T.mint,\n gl: T.amber,\n};\n\n// 기본 accent 색상\nexport const DEFAULT_ACCENT = T.pink;\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface HeaderBarProps {\n crumbs?: string[];\n status?: React.ReactNode;\n accent?: string;\n}\n\nexport function HeaderBar({ crumbs = [], status, accent = T.pink }: HeaderBarProps) {\n return (\n <Box paddingX={1} gap={1}>\n <Text color={accent} bold>tdecollab</Text>\n <Text color={T.fgFaint}>v0.2.3</Text>\n <Text color={T.fgFaint}>│</Text>\n {crumbs.map((c, i) => (\n <React.Fragment key={i}>\n {i > 0 && <Text color={T.fgFaint}>›</Text>}\n <Text color={i === crumbs.length - 1 ? T.fg : T.fgDim}>{c}</Text>\n </React.Fragment>\n ))}\n <Box flexGrow={1} />\n {status && <Box>{status}</Box>}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { T } from '../theme.js';\n\ninterface KeyBinding {\n key: string;\n label: string;\n}\n\ninterface KeymapProps {\n keys: KeyBinding[];\n accent?: string;\n hidden?: boolean;\n}\n\nexport function Keymap({ keys, accent = T.pink, hidden = false }: KeymapProps) {\n if (hidden) return null;\n return (\n <Box paddingX={1} gap={2} flexWrap=\"wrap\">\n {keys.map((k, i) => (\n <Box key={i} gap={1}>\n <Text backgroundColor={T.panelHi} color={accent}> {k.key} </Text>\n <Text color={T.fgDim}>{k.label}</Text>\n </Box>\n ))}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { LogEntry } from '../state.js';\nimport { T } from '../theme.js';\n\nconst LEVEL_COLOR: Record<string, string> = {\n info: T.fgDim,\n ok: T.mint,\n warn: T.amber,\n err: T.red,\n run: T.cyan,\n dim: T.fgMute,\n};\nconst LEVEL_LABEL: Record<string, string> = {\n info: 'INFO',\n ok: ' OK ',\n warn: 'WARN',\n err: ' ERR',\n run: 'RUN ',\n dim: '... ',\n};\n\ninterface LogPaneProps {\n lines: LogEntry[];\n accent?: string;\n title?: string;\n maxLines?: number;\n}\n\nexport function LogPane({ lines, accent = T.pink, title = 'Log', maxLines = 8 }: LogPaneProps) {\n const visible = lines.slice(-maxLines);\n return (\n <Box\n borderStyle=\"round\"\n borderColor={T.borderDim}\n flexDirection=\"column\"\n flexGrow={1}\n >\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n paddingX={1}\n >\n <Text color={T.fgFaint} bold>{title.toUpperCase()}</Text>\n <Box flexGrow={1} />\n <Text color={T.fgFaint}>{lines.length} lines</Text>\n </Box>\n <Box flexDirection=\"column\" paddingX={1} flexGrow={1}>\n {visible.map((l, i) => (\n <Box key={i} gap={2}>\n <Text color={T.fgFaint}>{l.ts}</Text>\n <Text color={LEVEL_COLOR[l.level] ?? T.fgDim} bold>\n {LEVEL_LABEL[l.level] ?? l.level.toUpperCase()}\n </Text>\n <Text\n color={\n l.level === 'err' ? T.red :\n l.level === 'warn' ? T.amber :\n T.fg\n }\n >\n {l.text}\n </Text>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport type { FlatItem } from '../menu-def.js';\nimport { T } from '../theme.js';\n\ninterface MenuTreeProps {\n items: FlatItem[];\n cursor: number;\n accent?: string;\n maxVisible?: number;\n scrollOffset?: number;\n}\n\nexport function MenuTree({\n items,\n cursor,\n accent = T.pink,\n maxVisible = 30,\n scrollOffset = 0,\n}: MenuTreeProps) {\n const visible = items.slice(scrollOffset, scrollOffset + maxVisible);\n\n return (\n <Box flexDirection=\"column\">\n {visible.map((flat, visIdx) => {\n const idx = visIdx + scrollOffset;\n const { item, depth } = flat;\n const isActive = idx === cursor;\n const indent = depth * 2;\n const isSeparator = item.label.startsWith('─');\n\n if (isSeparator) {\n return (\n <Box key={item.key}>\n <Text color={T.fgFaint}>{item.label}</Text>\n </Box>\n );\n }\n\n return (\n <Box key={item.key} gap={0}>\n {/* 들여쓰기 */}\n <Text>{' '.repeat(indent)}</Text>\n {/* 커서 */}\n <Text color={isActive ? accent : 'transparent'}>{isActive ? '▶' : ' '}</Text>\n {/* 아이콘 */}\n {item.icon && (\n <Text color={isActive ? accent : (item.dim ? T.fgFaint : T.fgDim)}>\n {item.icon}{' '}\n </Text>\n )}\n {/* 레이블 */}\n <Text\n color={isActive ? accent : (item.dim ? T.fgMute : T.fg)}\n bold={isActive}\n >\n {item.label}\n </Text>\n {/* 뱃지 */}\n {item.badge && (\n <Text color={item.badgeColor ?? T.fgDim}> {item.badge}</Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport React from 'react';\nimport { T } from '../theme.js';\n\ninterface PanelProps {\n title?: string;\n badge?: string;\n accent?: string;\n focused?: boolean;\n children: React.ReactNode;\n headerRight?: React.ReactNode;\n width?: number;\n flexGrow?: number;\n}\n\nexport function Panel({\n title,\n badge,\n accent = T.pink,\n focused = false,\n children,\n headerRight,\n width,\n flexGrow,\n}: PanelProps) {\n const borderColor = focused ? accent : T.border;\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={borderColor}\n flexDirection=\"column\"\n width={width}\n flexGrow={flexGrow ?? (width ? 0 : 1)}\n >\n {(title || badge) && (\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n paddingX={1}\n paddingY={0}\n >\n {badge && (\n <Text\n backgroundColor={focused ? accent : T.panelHi}\n color={focused ? T.bg : T.fgDim}\n bold\n >\n {' '}{badge}{' '}\n </Text>\n )}\n {title && (\n <Text color={focused ? accent : T.fgDim}>\n {badge ? ' ' : ''}{title}\n </Text>\n )}\n {headerRight && (\n <>\n <Text> </Text>\n {headerRight}\n </>\n )}\n </Box>\n )}\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\n {children}\n </Box>\n </Box>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { COMMANDS, buildPreview, type CommandDef, type FieldDef } from '../command-def.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { FilePicker } from '../components/FilePicker.js';\nimport { FormField } from '../components/FormField.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\nimport { applyUrlFill, getUrlFillTargets, parseConfluenceUrl, supportsUrlFill } from '../url-parser.js';\n\ninterface FormScreenProps {\n state: AppState;\n onRun: (values: Record<string, string | boolean>) => void;\n onBack: () => void;\n onSavePreset: (values: Record<string, string | boolean>) => void;\n accent?: string;\n}\n\n// URL 빠른 입력 필드 색상 — 다른 강조색(pink/red/amber)과 hue 차이가 큰 친근한 파랑\nconst URL_FILL_COLOR = T.blue; // '#60A5FA'\n\nexport function FormScreen({ state, onRun, onBack, onSavePreset, accent = DEFAULT_ACCENT }: FormScreenProps) {\n const def: CommandDef | undefined = COMMANDS[state.commandKey];\n const [values, setValues] = useState<Record<string, string | boolean>>(state.formValues);\n const [errors, setErrors] = useState<Record<string, string>>(state.formErrors);\n // URL Quick-fill 필드는 focusIdx = -1 로 표현 (regular 필드는 0~n-1)\n const [focusIdx, setFocusIdx] = useState(state.focusedField);\n const [pickerOpen, setPickerOpen] = useState(false);\n const [urlValue, setUrlValue] = useState('');\n\n if (!def) return <Text color={T.red}>커맨드를 찾을 수 없습니다: {state.commandKey}</Text>;\n\n const fields = def.fields;\n const hasUrlFill = supportsUrlFill(state.commandKey);\n const fillTargets = hasUrlFill ? getUrlFillTargets(state.commandKey) : [];\n const onUrlField = hasUrlFill && focusIdx === -1;\n const currentField: FieldDef | undefined = onUrlField ? undefined : fields[focusIdx];\n const preview = buildPreview(def, values);\n\n // URL 변경 시 자동으로 관련 필드 채우기\n function updateUrl(next: string) {\n setUrlValue(next);\n const parsed = parseConfluenceUrl(next);\n if (parsed.space || parsed.pageId) {\n setValues((v) => applyUrlFill(state.commandKey, parsed, v));\n setErrors({});\n }\n }\n\n // 필드 인덱스 이동 (URL 필드 -1 포함 가능)\n function nextField() {\n setFocusIdx((i) => {\n const min = hasUrlFill ? -1 : 0;\n const next = i + 1;\n return next > fields.length - 1 ? min : next;\n });\n }\n function prevField() {\n setFocusIdx((i) => {\n const min = hasUrlFill ? -1 : 0;\n const prev = i - 1;\n return prev < min ? fields.length - 1 : prev;\n });\n }\n\n function validate(): Record<string, string> {\n const errs: Record<string, string> = {};\n for (const f of fields) {\n if (f.required && !values[f.key]) {\n errs[f.key] = `필수 옵션입니다. ${f.hint ?? ''}`;\n }\n }\n return errs;\n }\n\n function tryRun() {\n const errs = validate();\n if (Object.keys(errs).length > 0) {\n setErrors(errs);\n const firstErrIdx = fields.findIndex((f) => errs[f.key]);\n if (firstErrIdx >= 0) setFocusIdx(firstErrIdx);\n } else {\n setErrors({});\n onRun(values);\n }\n }\n\n useInput((input, key) => {\n if (pickerOpen) return; // Picker가 자체적으로 입력 처리\n\n // === 글로벌 단축키 ===\n // Ctrl+R: Run\n if (key.ctrl && input === 'r') {\n tryRun();\n return;\n }\n\n // Ctrl+S: Save preset\n if (key.ctrl && input === 's') {\n onSavePreset(values);\n return;\n }\n\n // Esc: 취소\n if (key.escape) {\n onBack();\n return;\n }\n\n // === 필드 간 이동 (URL 필드 -1 포함) ===\n if (key.tab && key.shift) {\n prevField();\n return;\n }\n if (key.tab) {\n nextField();\n return;\n }\n if (key.upArrow) {\n prevField();\n return;\n }\n if (key.downArrow) {\n nextField();\n return;\n }\n\n // === URL Quick-fill 필드 처리 ===\n if (onUrlField) {\n if (key.backspace || key.delete) {\n updateUrl(urlValue.slice(0, -1));\n return;\n }\n if (key.return) return; // Enter 무시\n if (input && !key.ctrl && !key.meta) {\n updateUrl(urlValue + input);\n }\n return;\n }\n\n if (!currentField) return;\n\n // === 현재 필드 타입에 따른 처리 ===\n if (currentField.type === 'bool') {\n if (input === ' ' || key.return) {\n setValues((v) => ({ ...v, [currentField.key]: !v[currentField.key] }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n }\n return;\n }\n\n if (currentField.type === 'select') {\n if (input === ' ' || key.return) {\n const opts = currentField.options ?? [];\n const cur = String(values[currentField.key] ?? opts[0]);\n const nextIdx = (opts.indexOf(cur) + 1) % opts.length;\n setValues((v) => ({ ...v, [currentField.key]: opts[nextIdx] }));\n }\n return;\n }\n\n // text / path 필드\n if (key.return) {\n // path 필드: 디렉토리 선택창 열기\n if (currentField.pathType) {\n setPickerOpen(true);\n return;\n }\n // 일반 text: Enter는 무시 (필요 시 다음 필드로)\n return;\n }\n\n // 직접 타이핑: 백스페이스\n if (key.backspace || key.delete) {\n setValues((v) => ({\n ...v,\n [currentField.key]: String(v[currentField.key] ?? '').slice(0, -1),\n }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n return;\n }\n\n // 일반 문자 입력 (제어키 제외)\n if (input && !key.ctrl && !key.meta) {\n setValues((v) => ({\n ...v,\n [currentField.key]: String(v[currentField.key] ?? '') + input,\n }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n const crumbs = pathFromCommandKey(state.commandKey);\n const filledCount = fields.filter((f) => values[f.key] !== '' && values[f.key] !== undefined && values[f.key] !== false).length;\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={Object.keys(errors).length > 0 ? T.red : T.mint}>●</Text>\n <Text color={T.fgDim}>\n {Object.keys(errors).length > 0\n ? `${Object.keys(errors).length} errors`\n : `${filledCount} / ${fields.length} fields`}\n </Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n pickerOpen && currentField?.pathType ? (\n <Panel title={`${currentField.label} — 경로 선택`} badge=\"PICKER\" accent={accent} focused>\n <FilePicker\n initialPath={String(values[currentField.key] ?? '')}\n pathType={currentField.pathType}\n accent={accent}\n onSelect={(selected) => {\n setValues((v) => ({ ...v, [currentField.key]: selected }));\n setErrors((e) => { const n = { ...e }; delete n[currentField.key]; return n; });\n setPickerOpen(false);\n }}\n onCancel={() => setPickerOpen(false)}\n />\n </Panel>\n ) : (\n <Panel\n title={def.label}\n badge=\"FORM\"\n accent={accent}\n focused\n headerRight={<Text color={T.amber}>* required</Text>}\n >\n <Box flexDirection=\"column\" paddingY={1}>\n {/* URL Quick-fill (Confluence page 관련 커맨드만) */}\n {hasUrlFill && (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={onUrlField ? URL_FILL_COLOR : T.borderDim}\n paddingX={1}\n marginBottom={1}\n >\n <Box>\n <Text color={URL_FILL_COLOR} bold>\n 🔗 빠른 입력\n </Text>\n <Text color={T.fgFaint}>\n {' '}— Confluence 페이지 URL을 붙여넣으면{' '}\n </Text>\n <Text color={URL_FILL_COLOR} bold>\n {fillTargets.join(', ')}\n </Text>\n <Text color={T.fgFaint}>\n {' '}필드가 자동 입력됩니다\n </Text>\n </Box>\n <Box marginTop={1}>\n {urlValue ? (\n <Text color={T.fg}>{urlValue}</Text>\n ) : (\n <Text color={T.fgFaint}>\n https://confluence.tde.sktelecom.com/spaces/TDE/pages/123456/...\n </Text>\n )}\n {onUrlField && <Text backgroundColor={URL_FILL_COLOR} color={T.bg}> </Text>}\n </Box>\n </Box>\n )}\n\n {fields.map((f, i) => (\n <FormField\n key={f.key}\n field={f}\n value={values[f.key] ?? ''}\n focused={i === focusIdx}\n error={errors[f.key]}\n accent={accent}\n />\n ))}\n\n {/* Preview */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n marginTop={1}\n flexDirection=\"column\"\n >\n <Text color={T.fgFaint} bold>PREVIEW</Text>\n <Text>\n <Text color={T.fgFaint}>$ </Text>\n <Text color={accent}>tdecollab </Text>\n <Text color={T.cyan}>{def.key.split(':').join(' ')} </Text>\n <Text color={T.fg}>{preview.replace(/^tdecollab\\s+\\S+(?:\\s+\\S+){0,2}\\s*/, '')}</Text>\n </Text>\n </Box>\n\n {/* 액션 힌트 */}\n <Box gap={3} marginTop={1}>\n <Text backgroundColor={accent} color={T.bg} bold> Ctrl+R Run </Text>\n <Text backgroundColor={T.panelHi} color={T.fg}> Ctrl+S Save preset </Text>\n <Text backgroundColor={T.panelHi} color={T.fgDim}> Esc Back </Text>\n </Box>\n </Box>\n </Panel>\n )\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n pickerOpen ? (\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'open / select' },\n { key: 'Tab/Spc', label: 'select dir' },\n { key: 'Esc', label: 'cancel' },\n ]} />\n ) : (\n <Keymap accent={accent} keys={[\n { key: 'Tab', label: 'next field' },\n { key: '⇧Tab', label: 'prev' },\n { key: 'A-Z', label: '바로 입력' },\n { key: '↵', label: currentField?.pathType ? '경로 선택창' : currentField?.type === 'bool' ? 'toggle' : '—' },\n { key: 'Ctrl+R', label: 'Run' },\n { key: 'Ctrl+S', label: 'Save' },\n { key: 'Esc', label: 'Back' },\n ]} />\n )\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { useMemo, useState } from 'react';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface FilePickerProps {\n initialPath: string;\n pathType: 'file' | 'dir';\n onSelect: (selectedPath: string) => void;\n onCancel: () => void;\n accent?: string;\n maxVisible?: number;\n}\n\ninterface Entry {\n name: string;\n isDir: boolean;\n isCurrent?: boolean; // \".\" — 현재 디렉토리 선택용\n}\n\nfunction resolveStartDir(initialPath: string): string {\n if (!initialPath) return process.cwd();\n const expanded = initialPath.replace(/^~/, os.homedir());\n const abs = path.isAbsolute(expanded) ? expanded : path.resolve(process.cwd(), expanded);\n try {\n const stat = fs.statSync(abs);\n return stat.isDirectory() ? abs : path.dirname(abs);\n } catch {\n // 존재하지 않는 경우 디렉토리 부분까지만 사용\n let dir = path.dirname(abs);\n while (dir && dir !== '/' && !fs.existsSync(dir)) {\n dir = path.dirname(dir);\n }\n return dir || process.cwd();\n }\n}\n\nexport function FilePicker({\n initialPath,\n pathType,\n onSelect,\n onCancel,\n accent = DEFAULT_ACCENT,\n maxVisible = 14,\n}: FilePickerProps) {\n const [currentDir, setCurrentDir] = useState(() => resolveStartDir(initialPath));\n const [cursor, setCursor] = useState(0);\n const [scroll, setScroll] = useState(0);\n\n const entries: Entry[] = useMemo(() => {\n try {\n const items = fs.readdirSync(currentDir, { withFileTypes: true })\n .filter((d) => !d.name.startsWith('.'));\n const dirs: Entry[] = items\n .filter((i) => i.isDirectory())\n .map((i) => ({ name: i.name, isDir: true }));\n const files: Entry[] = pathType === 'file'\n ? items.filter((i) => i.isFile()).map((i) => ({ name: i.name, isDir: false }))\n : [];\n return [\n { name: '.', isDir: true, isCurrent: true },\n { name: '..', isDir: true },\n ...dirs.sort((a, b) => a.name.localeCompare(b.name)),\n ...files.sort((a, b) => a.name.localeCompare(b.name)),\n ];\n } catch {\n return [\n { name: '.', isDir: true, isCurrent: true },\n { name: '..', isDir: true },\n ];\n }\n }, [currentDir, pathType]);\n\n function move(delta: number) {\n const next = Math.max(0, Math.min(entries.length - 1, cursor + delta));\n setCursor(next);\n if (next < scroll) setScroll(next);\n else if (next >= scroll + maxVisible) setScroll(next - maxVisible + 1);\n }\n\n function selectEntry(entry: Entry) {\n // \".\" — 현재 디렉토리 자체 선택 (말미에 / 포함하여 이어쓰기 용이)\n if (entry.isCurrent) {\n onSelect(toRelativeIfPossible(currentDir) + path.sep);\n return;\n }\n const fullPath = entry.name === '..'\n ? path.dirname(currentDir)\n : path.join(currentDir, entry.name);\n if (entry.isDir) {\n // 디렉토리는 진입\n setCurrentDir(fullPath);\n setCursor(0);\n setScroll(0);\n } else {\n // 파일 선택\n onSelect(toRelativeIfPossible(fullPath));\n }\n }\n\n function selectCurrentDir() {\n // 디렉토리 모드: 현재 디렉토리 자체를 선택\n onSelect(toRelativeIfPossible(currentDir) + path.sep);\n }\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n } else if (key.upArrow) {\n move(-1);\n } else if (key.downArrow) {\n move(1);\n } else if (key.pageUp) {\n move(-maxVisible);\n } else if (key.pageDown) {\n move(maxVisible);\n } else if (key.return) {\n const entry = entries[cursor];\n if (entry) selectEntry(entry);\n } else if (input === ' ' || key.tab) {\n // Space/Tab: 현재 디렉토리 선택 (특히 dir 모드에서 유용)\n if (pathType === 'dir') {\n selectCurrentDir();\n } else {\n const entry = entries[cursor];\n if (entry && !entry.isDir) selectEntry(entry);\n }\n }\n });\n\n const visible = entries.slice(scroll, scroll + maxVisible);\n const displayPath = currentDir.replace(os.homedir(), '~');\n\n return (\n <Box\n borderStyle=\"round\"\n borderColor={accent}\n flexDirection=\"column\"\n paddingX={1}\n >\n {/* 헤더 */}\n <Box>\n <Text color={accent} bold>\n {pathType === 'file' ? '📄 파일 선택' : '📁 디렉토리 선택'}\n </Text>\n <Text color={T.fgFaint}> {displayPath}</Text>\n </Box>\n\n {/* 엔트리 목록 */}\n <Box flexDirection=\"column\" marginTop={1}>\n {visible.map((entry, vi) => {\n const idx = vi + scroll;\n const isActive = idx === cursor;\n return (\n <Box key={`${entry.name}-${idx}`}>\n <Text color={isActive ? accent : 'transparent'}>\n {isActive ? '▶ ' : ' '}\n </Text>\n <Text\n color={\n isActive ? accent :\n entry.isCurrent ? T.amber :\n entry.isDir ? T.cyan :\n T.fg\n }\n bold={isActive}\n >\n {entry.isCurrent ? '✓ ' : entry.isDir ? '📁 ' : '📄 '}\n {entry.name}\n {entry.isCurrent ? ' (현재 디렉토리 선택)' : entry.isDir && entry.name !== '..' ? '/' : ''}\n </Text>\n </Box>\n );\n })}\n {entries.length > maxVisible && (\n <Text color={T.fgFaint}>\n {scroll + 1}–{Math.min(scroll + maxVisible, entries.length)} / {entries.length}\n </Text>\n )}\n </Box>\n\n {/* 푸터 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n ↑↓ navigate · ↵ on \".\" select current · ↵ on dir = open · ↵ on file = select · Esc cancel\n </Text>\n </Box>\n </Box>\n );\n}\n\n// 가능하면 cwd 기준 상대경로로 변환 (그렇지 않으면 절대경로 유지)\nfunction toRelativeIfPossible(absPath: string): string {\n const cwd = process.cwd();\n const rel = path.relative(cwd, absPath);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n return './' + rel;\n }\n return absPath;\n}\n","import { Box, Text } from 'ink';\nimport type { FieldDef } from '../command-def.js';\nimport { T } from '../theme.js';\n\ninterface FormFieldProps {\n field: FieldDef;\n value: string | boolean;\n focused: boolean;\n error?: string;\n accent?: string;\n}\n\nexport function FormField({ field, value, focused, error, accent = T.pink }: FormFieldProps) {\n const labelText = field.label.padEnd(28);\n\n if (field.type === 'bool') {\n const checked = value === true;\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n <Text color={checked ? accent : T.fgFaint} bold={focused}>\n {checked ? '▣' : '▢'}\n </Text>\n <Text color={focused ? T.fg : T.fgDim}>\n {checked ? 'enabled' : 'disabled'}\n </Text>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n <Text color={T.fgFaint}>Space로 토글</Text>\n </Box>\n )}\n </Box>\n );\n }\n\n if (field.type === 'select') {\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n <Box\n borderStyle=\"single\"\n borderColor={focused ? accent : T.border}\n paddingX={1}\n >\n <Text color={T.fg}>{String(value)}</Text>\n <Text color={T.fgFaint}> ▼</Text>\n </Box>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n <Text color={T.fgFaint}>\n Space로 다음 옵션 ({field.options?.join(' · ')})\n </Text>\n </Box>\n )}\n </Box>\n );\n }\n\n // text / path\n const borderColor = error ? T.red : (focused ? accent : T.border);\n const valStr = String(value ?? '');\n const isPath = !!field.pathType;\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box gap={1}>\n <Text color={focused ? accent : T.fgDim} bold={focused}>\n {labelText}\n </Text>\n {field.required && <Text color={T.amber}>*</Text>}\n <Box\n borderStyle=\"single\"\n borderColor={borderColor}\n paddingX={1}\n flexGrow={1}\n >\n {field.prefix && <Text color={T.fgFaint}>{field.prefix} </Text>}\n {valStr ? (\n <Text color={T.fg}>{valStr}</Text>\n ) : (\n <Text color={T.fgFaint}>{field.hint ?? ''}</Text>\n )}\n {focused && <Text backgroundColor={accent} color={T.bg}> </Text>}\n </Box>\n </Box>\n {focused && (\n <Box marginLeft={30}>\n {error ? (\n <Text color={T.red}>{error}</Text>\n ) : isPath ? (\n <Text color={T.fgFaint}>\n <Text color={T.amber}>↵</Text> {field.pathType === 'file' ? '파일' : '디렉토리'} 선택창 열기\n {field.hint ? ` · ${field.hint}` : ''}\n </Text>\n ) : field.hint ? (\n <Text color={T.fgFaint}>{field.hint}</Text>\n ) : null}\n </Box>\n )}\n </Box>\n );\n}\n","// Confluence URL → 폼 필드 자동 채우기 파서\n//\n// 지원 URL 형식:\n// - /spaces/<SPACE>/pages/<pageId>/<title> (modern)\n// - /display/<SPACE>/<title> (legacy)\n// - /pages/viewpage.action?pageId=<pageId> (legacy query)\n// - /pages/createpage.action?spaceKey=<SPACE>...\n\nexport interface ParsedConfluenceUrl {\n space?: string;\n pageId?: string;\n}\n\nexport function parseConfluenceUrl(input: string): ParsedConfluenceUrl {\n const url = input.trim();\n if (!url) return {};\n\n const result: ParsedConfluenceUrl = {};\n\n // /spaces/<SPACE>/pages/<pageId>\n const spacesMatch = url.match(/\\/spaces\\/([^/]+)\\/pages\\/(\\d+)/);\n if (spacesMatch) {\n result.space = decodeURIComponent(spacesMatch[1]);\n result.pageId = spacesMatch[2];\n return result;\n }\n\n // pageId=<id>\n const pageIdQuery = url.match(/[?&]pageId=(\\d+)/);\n if (pageIdQuery) {\n result.pageId = pageIdQuery[1];\n }\n\n // spaceKey=<SPACE>\n const spaceQuery = url.match(/[?&]spaceKey=([^&]+)/);\n if (spaceQuery) {\n result.space = decodeURIComponent(spaceQuery[1]);\n }\n\n // /display/<SPACE>\n if (!result.space) {\n const displayMatch = url.match(/\\/display\\/([^/?#]+)/);\n if (displayMatch) result.space = decodeURIComponent(displayMatch[1]);\n }\n\n return result;\n}\n\n// 커맨드별로 URL 파싱 결과를 어느 필드에 채울지 결정\nexport function applyUrlFill(\n commandKey: string,\n parsed: ParsedConfluenceUrl,\n current: Record<string, string | boolean>,\n): Record<string, string | boolean> {\n const result = { ...current };\n\n if (commandKey === 'confluence:page:get' || commandKey === 'confluence:page:update') {\n // 대상 페이지 본인의 URL → pageId, space 채움\n if (parsed.space) result['space'] = parsed.space;\n if (parsed.pageId) result['pageId'] = parsed.pageId;\n } else if (commandKey === 'confluence:page:create') {\n // 부모 페이지의 URL → parent, space 채움\n if (parsed.space) result['space'] = parsed.space;\n if (parsed.pageId) result['parent'] = parsed.pageId;\n }\n\n return result;\n}\n\n// URL Quick-fill 기능을 지원하는 커맨드 여부\nexport function supportsUrlFill(commandKey: string): boolean {\n return [\n 'confluence:page:get',\n 'confluence:page:update',\n 'confluence:page:create',\n ].includes(commandKey);\n}\n\n// 자동 채워질 필드 키 목록 (UI 표시용)\nexport function getUrlFillTargets(commandKey: string): string[] {\n if (commandKey === 'confluence:page:create') return ['space', 'parent'];\n if (commandKey === 'confluence:page:get' || commandKey === 'confluence:page:update') return ['space', 'pageId'];\n return [];\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, type MenuItem } from '../menu-def.js';\nimport type { AppState, HistoryEntry } from '../state.js';\nimport { T, SVC_COLOR, DEFAULT_ACCENT } from '../theme.js';\n\ninterface HistoryScreenProps {\n state: AppState;\n onBack: () => void;\n onReplay: (entry: HistoryEntry) => void;\n accent?: string;\n}\n\nconst SVC_LABEL: Record<string, string> = { cf: 'CF', jr: 'JR', gl: 'GL' };\nconst STATE_COLOR: Record<string, string> = { ok: T.mint, warn: T.amber, err: T.red };\n\nexport function HistoryScreen({ state, onBack, onReplay, accent = DEFAULT_ACCENT }: HistoryScreenProps) {\n const [selected, setSelected] = useState(state.historySelected);\n const history = state.history;\n const okCount = history.filter((h) => h.state === 'ok').length;\n const warnCount = history.filter((h) => h.state === 'warn').length;\n const errCount = history.filter((h) => h.state === 'err').length;\n\n useInput((input, key) => {\n if (key.escape) onBack();\n else if (key.upArrow) setSelected((s) => Math.max(0, s - 1));\n else if (key.downArrow) setSelected((s) => Math.min(history.length - 1, s + 1));\n else if (key.return) {\n if (history[selected]) onReplay(history[selected]);\n } else if (input === 'x' || input === 'X') {\n // clearHistory는 App 레벨에서 처리\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.key === 'history');\n\n const selectedEntry = history[selected];\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={['history']}\n status={\n <Box gap={1}>\n <Text color={T.fg}>{history.length}</Text>\n <Text color={T.fgDim}>commands ·</Text>\n <Text color={T.mint}>{okCount} ok</Text>\n <Text color={T.fgDim}>/</Text>\n <Text color={T.amber}>{warnCount} warn</Text>\n <Text color={T.fgDim}>/</Text>\n <Text color={T.red}>{errCount} err</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"History\" badge=\"LOG\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 테이블 헤더 */}\n <Box\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n <Text color={T.fgFaint} bold>{'TIME '.padEnd(7)}</Text>\n <Text color={T.fgFaint} bold>{'SVC '.padEnd(5)}</Text>\n <Text color={T.fgFaint} bold>{'COMMAND'.padEnd(55)}</Text>\n <Text color={T.fgFaint} bold>{'TOOK'.padEnd(9)}</Text>\n <Text color={T.fgFaint} bold>RESULT</Text>\n </Box>\n\n {history.length === 0 ? (\n <Box marginTop={2}>\n <Text color={T.fgFaint}>히스토리가 없습니다. 명령을 실행하면 여기에 기록됩니다.</Text>\n </Box>\n ) : (\n history.map((h, i) => (\n <Box\n key={i}\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n <Text color={i === selected ? accent : T.fgDim}>\n {h.when.padEnd(7)}\n </Text>\n <Text\n backgroundColor={`${(SVC_COLOR[h.svc] ?? T.fgDim)}22`}\n color={SVC_COLOR[h.svc] ?? T.fgDim}\n bold\n >\n {` ${SVC_LABEL[h.svc] ?? h.svc} `}\n </Text>\n <Text> </Text>\n <Text color={i === selected ? accent : T.fg}>\n {`tdecollab ${h.cmd}`.slice(0, 54).padEnd(55)}\n </Text>\n <Text color={T.fgDim}>{h.dur.padEnd(9)}</Text>\n <Text color={STATE_COLOR[h.state] ?? T.fg}>\n {'● '}{h.result}\n </Text>\n </Box>\n ))\n )}\n\n {/* 선택된 항목 상세 */}\n {selectedEntry && (\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n <Text color={T.fgFaint}>─── 선택된 항목 ───</Text>\n <Box gap={1}>\n <Text color={T.fgDim}>명령:</Text>\n <Text color={accent}>tdecollab {selectedEntry.cmd}</Text>\n </Box>\n <Box gap={1}>\n <Text color={T.fgDim}>결과:</Text>\n <Text color={STATE_COLOR[selectedEntry.state]}>{selectedEntry.result}</Text>\n <Text color={T.fgDim}>· {selectedEntry.dur}</Text>\n </Box>\n </Box>\n )}\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'replay' },\n { key: 'x', label: 'clear' },\n { key: 'Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface ListScreenProps {\n state: AppState;\n onBack: () => void;\n onDrillIn?: (row: Record<string, string>) => void;\n accent?: string;\n}\n\nexport function ListScreen({ state, onBack, onDrillIn, accent = DEFAULT_ACCENT }: ListScreenProps) {\n const [selected, setSelected] = useState(state.resultListSelected);\n const crumbs = pathFromCommandKey(state.commandKey);\n const rows = state.resultList;\n const cols = state.resultListCols;\n\n useInput((_input, key) => {\n if (key.escape) onBack();\n else if (key.upArrow) setSelected((s) => Math.max(0, s - 1));\n else if (key.downArrow) setSelected((s) => Math.min(rows.length - 1, s + 1));\n else if (key.return) {\n if (rows[selected] && onDrillIn) onDrillIn(rows[selected]);\n }\n });\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n // 컬럼 너비 계산 (균등 분배)\n const colWidth = cols.length > 0 ? Math.floor(60 / cols.length) : 20;\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.mint}>●</Text>\n <Text color={T.fgDim}>{rows.length} results</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title={crumbs.join(' ')} badge=\"LIST\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 헤더 행 */}\n <Box borderStyle=\"single\" borderBottom borderTop={false} borderLeft={false} borderRight={false} borderColor={T.borderDim}>\n {cols.map((c) => (\n <Text key={c} color={T.fgFaint} bold>\n {c.toUpperCase().padEnd(colWidth)}\n </Text>\n ))}\n </Box>\n {/* 데이터 행 */}\n {rows.map((row, i) => (\n <Box\n key={i}\n borderStyle=\"single\"\n borderBottom\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={T.borderDim}\n >\n {cols.map((c) => (\n <Text\n key={c}\n color={i === selected ? accent : T.fg}\n bold={i === selected}\n >\n {String(row[c] ?? '').slice(0, colWidth - 1).padEnd(colWidth)}\n </Text>\n ))}\n </Box>\n ))}\n {/* 푸터 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n showing 1–{rows.length} · row{' '}\n </Text>\n <Text color={accent}>{selected + 1}</Text>\n <Text color={T.fgFaint}> selected · ↵ to drill in</Text>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '↵', label: 'view' },\n { key: 'Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useCallback, useEffect, useState } from 'react';\nimport { COMMANDS } from '../command-def.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport {\n MENU,\n META_ITEMS,\n flattenMenu,\n pathFromCommandKey,\n type MenuItem,\n} from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface MenuScreenProps {\n state: AppState;\n onSelectCommand: (commandKey: string) => void;\n onToggleExpanded: (key: string) => void;\n onOpenHistory: () => void;\n onQuit: () => void;\n accent?: string;\n}\n\nexport function MenuScreen({\n state,\n onSelectCommand,\n onToggleExpanded,\n onOpenHistory,\n onQuit,\n accent = DEFAULT_ACCENT,\n}: MenuScreenProps) {\n const expanded = state.expandedKeys;\n const allItems = [\n ...flattenMenu(MENU, expanded),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n\n // 마지막으로 선택했던 위치를 초기 커서로 사용\n const initialCursor = (() => {\n if (!state.activePath) return 0;\n const idx = allItems.findIndex(\n (f) => f.item.commandKey === state.activePath || f.item.key === state.activePath,\n );\n return idx >= 0 ? idx : 0;\n })();\n\n const [cursor, setCursor] = useState(initialCursor);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n // 현재 커서 아이템\n const currentFlat = allItems[cursor];\n const currentItem = currentFlat?.item;\n const commandKey = currentItem?.commandKey;\n const commandDef = commandKey ? COMMANDS[commandKey] : null;\n\n // 화면에 맞게 스크롤 조정\n const adjustScroll = useCallback((newCursor: number) => {\n const maxVisible = 24;\n if (newCursor < scrollOffset) setScrollOffset(newCursor);\n else if (newCursor >= scrollOffset + maxVisible) setScrollOffset(newCursor - maxVisible + 1);\n }, [scrollOffset]);\n\n useInput((input, key) => {\n if (key.upArrow) {\n const next = Math.max(0, cursor - 1);\n setCursor(next);\n adjustScroll(next);\n } else if (key.downArrow) {\n const next = Math.min(allItems.length - 1, cursor + 1);\n setCursor(next);\n adjustScroll(next);\n } else if (key.rightArrow || key.return) {\n if (currentItem?.children) {\n onToggleExpanded(currentItem.key);\n } else if (currentItem?.commandKey) {\n onSelectCommand(currentItem.commandKey);\n } else if (currentItem?.key === 'history') {\n onOpenHistory();\n }\n } else if (key.leftArrow) {\n if (currentFlat?.parentKey && expanded.includes(currentFlat.parentKey)) {\n onToggleExpanded(currentFlat.parentKey);\n }\n } else if (input === 'h') {\n onOpenHistory();\n } else if (input === 'q' || (key.ctrl && input === 'c')) {\n onQuit();\n }\n });\n\n // 초기 마운트 시 스크롤을 커서 위치로 맞춤\n useEffect(() => {\n if (initialCursor > 0) adjustScroll(initialCursor);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const crumbs = commandKey\n ? pathFromCommandKey(commandKey)\n : currentItem?.key === 'history'\n ? ['history']\n : ['menu'];\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Text color={T.mint}>●</Text>\n <Text color={T.fgDim}>ready</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent} focused>\n <MenuTree items={allItems} cursor={cursor} accent={accent} scrollOffset={scrollOffset} />\n </Panel>\n }\n body={\n <Panel\n title={commandDef?.label ?? currentItem?.label ?? 'tdecollab'}\n badge=\"DETAILS\"\n accent={accent}\n >\n {commandDef ? (\n <CommandDetails def={commandDef} accent={accent} />\n ) : (\n <WelcomeView accent={accent} />\n )}\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: '↑↓', label: 'navigate' },\n { key: '→/↵', label: 'select / expand' },\n { key: '←', label: 'collapse' },\n { key: 'h', label: 'history' },\n { key: 'q', label: 'quit' },\n ]} />\n }\n />\n );\n}\n\nfunction WelcomeView({ accent }: { accent: string }) {\n return (\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Text color={accent} bold>tdecollab TUI</Text>\n <Text color={T.fgDim}>좌측 메뉴에서 명령을 선택하세요.</Text>\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n <Text color={T.fgFaint}> Confluence ◆ 페이지/스페이스/검색</Text>\n <Text color={T.fgFaint}> JIRA ◆ 이슈/검색</Text>\n <Text color={T.fgFaint}> GitLab ◆ MR/파이프라인</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={T.amber}>↵</Text>\n <Text color={T.fgDim}> 를 눌러 명령 폼으로 진입합니다.</Text>\n </Box>\n </Box>\n );\n}\n\nfunction CommandDetails({ def, accent }: { def: import('../command-def.js').CommandDef; accent: string }) {\n return (\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>DESCRIPTION</Text>\n <Text color={T.fg}>{def.description}</Text>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>SYNOPSIS</Text>\n <Box borderStyle=\"single\" borderColor={T.borderDim} paddingX={1} marginTop={0}>\n <Text color={T.cyan}>$ {def.synopsis}</Text>\n </Box>\n </Box>\n <Box flexDirection=\"column\" gap={0}>\n <Text color={T.fgDim} bold>OPTIONS</Text>\n {def.fields.map((f: import('../command-def.js').FieldDef) => (\n <Box key={f.key} gap={2}>\n <Text color={accent}>{f.label.padEnd(28)}</Text>\n <Text color={T.fgDim}>{f.hint ?? (f.type === 'bool' ? 'flag' : f.type)}</Text>\n {f.required && <Text color={T.amber}> *required</Text>}\n </Box>\n ))}\n </Box>\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n marginTop={1}\n >\n <Text color={T.amber}>↵</Text>\n <Text color={T.fgDim}> Enter를 눌러 입력 폼으로 진입합니다.</Text>\n </Box>\n </Box>\n );\n}\n","import { Box, Text } from 'ink';\nimport { Spinner } from '../components/Spinner.js';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface RunningScreenProps {\n state: AppState;\n onCancel: () => void;\n accent?: string;\n}\n\nexport function RunningScreen({ state, onCancel, accent = DEFAULT_ACCENT }: RunningScreenProps) {\n const crumbs = pathFromCommandKey(state.commandKey);\n const doneCount = state.steps.filter((s) => s.state === 'done').length;\n const total = state.steps.length;\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n const progressPct = total > 0 ? Math.round((doneCount / total) * 100) : 0;\n const barWidth = 40;\n const filled = Math.round((progressPct / 100) * barWidth);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={crumbs}\n status={\n <Box gap={1}>\n <Spinner color={T.cyan} />\n <Text color={T.cyan} bold>RUNNING</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"Pipeline\" badge=\"EXEC\" accent={T.cyan} focused>\n <Box flexDirection=\"column\" gap={1} paddingY={1}>\n <Text color={T.fgDim} bold>STEPS</Text>\n {state.steps.map((step) => (\n <Box key={step.id} gap={2}>\n {step.state === 'done' && <Text color={T.mint}>✓</Text>}\n {step.state === 'running' && <Spinner color={T.cyan} />}\n {step.state === 'pending' && <Text color={T.fgFaint}>○</Text>}\n {step.state === 'err' && <Text color={T.red}>✕</Text>}\n <Box flexDirection=\"column\">\n <Text\n color={\n step.state === 'pending' ? T.fgMute :\n step.state === 'running' ? T.fg :\n step.state === 'err' ? T.red :\n T.fg\n }\n bold={step.state === 'running'}\n >\n {step.title}\n </Text>\n <Text color={T.fgFaint}>{step.detail}</Text>\n </Box>\n {step.state === 'running' && (\n <Text backgroundColor={T.cyan} color={T.bg} bold> IN PROGRESS </Text>\n )}\n {step.state === 'done' && <Text color={T.fgFaint}>done</Text>}\n </Box>\n ))}\n\n {/* 진행바 */}\n <Box\n borderStyle=\"single\"\n borderColor={T.borderDim}\n paddingX={1}\n flexDirection=\"column\"\n marginTop={1}\n >\n <Box gap={2}>\n <Text color={T.fgDim}>Overall progress</Text>\n <Text color={T.cyan}>{doneCount} / {total} · {progressPct}%</Text>\n </Box>\n <Box>\n <Text color={T.mint}>{'█'.repeat(filled)}</Text>\n <Text color={T.borderDim}>{'░'.repeat(barWidth - filled)}</Text>\n </Box>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} title=\"Stream\" maxLines={6} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: 'Ctrl-C', label: 'cancel' },\n ]} />\n }\n />\n );\n}\n","import { Text } from 'ink';\nimport { useEffect, useState } from 'react';\nimport { T } from '../theme.js';\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\ninterface SpinnerProps {\n color?: string;\n}\n\nexport function Spinner({ color = T.cyan }: SpinnerProps) {\n const [frame, setFrame] = useState(0);\n useEffect(() => {\n const id = setInterval(() => setFrame((f) => (f + 1) % FRAMES.length), 80);\n return () => clearInterval(id);\n }, []);\n return <Text color={color}>{FRAMES[frame]}</Text>;\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { useState } from 'react';\nimport { AppShell } from '../components/AppShell.js';\nimport { HeaderBar } from '../components/HeaderBar.js';\nimport { Keymap } from '../components/Keymap.js';\nimport { LogPane } from '../components/LogPane.js';\nimport { MenuTree } from '../components/MenuTree.js';\nimport { Panel } from '../components/Panel.js';\nimport { MENU, META_ITEMS, flattenMenu, pathFromCommandKey, type MenuItem } from '../menu-def.js';\nimport type { AppState } from '../state.js';\nimport { T, DEFAULT_ACCENT } from '../theme.js';\n\ninterface TextViewProps {\n state: AppState;\n onBack: () => void;\n accent?: string;\n}\n\nexport function TextView({ state, onBack, accent = DEFAULT_ACCENT }: TextViewProps) {\n const { stdout } = useStdout();\n const termHeight = stdout?.rows ?? 40;\n const visibleLines = Math.max(8, termHeight - 18);\n const lines = state.resultText.split('\\n');\n const [scrollTop, setScrollTop] = useState(0);\n const crumbs = pathFromCommandKey(state.commandKey);\n\n const maxScroll = Math.max(0, lines.length - visibleLines);\n const halfPage = Math.max(1, Math.floor(visibleLines / 2));\n\n useInput((input, key) => {\n if (key.escape || input === 'q') onBack();\n // 한 줄 단위\n else if (key.downArrow || input === 'j') setScrollTop((s) => Math.min(maxScroll, s + 1));\n else if (key.upArrow || input === 'k') setScrollTop((s) => Math.max(0, s - 1));\n // 페이지 끝\n else if (input === 'g') setScrollTop(0);\n else if (input === 'G') setScrollTop(maxScroll);\n // 한 페이지 단위 (vim: Ctrl+F / Ctrl+B, PageDown / PageUp)\n else if ((key.ctrl && input === 'f') || key.pageDown) {\n setScrollTop((s) => Math.min(maxScroll, s + visibleLines));\n }\n else if ((key.ctrl && input === 'b') || key.pageUp) {\n setScrollTop((s) => Math.max(0, s - visibleLines));\n }\n // 반 페이지 단위 (vim: Ctrl+D / Ctrl+U)\n else if (key.ctrl && input === 'd') {\n setScrollTop((s) => Math.min(maxScroll, s + halfPage));\n }\n else if (key.ctrl && input === 'u') {\n setScrollTop((s) => Math.max(0, s - halfPage));\n }\n });\n\n const visible = lines.slice(scrollTop, scrollTop + visibleLines);\n\n const menuItems = [\n ...flattenMenu(MENU, state.expandedKeys),\n { item: { key: '_sep', label: '─────────────────', dim: true } as MenuItem, depth: 0 },\n ...META_ITEMS.map((m) => ({ item: m, depth: 0 })),\n ];\n const menuCursor = menuItems.findIndex((f) => f.item.commandKey === state.commandKey);\n\n return (\n <AppShell\n header={\n <HeaderBar\n accent={accent}\n crumbs={[...crumbs, 'result']}\n status={\n <Box gap={1}>\n <Text color={T.cyan}>VIEW</Text>\n <Text color={T.fgDim}>· {lines.length} lines</Text>\n </Box>\n }\n />\n }\n menu={\n <Panel title=\"Commands\" badge=\"MENU\" accent={accent}>\n <MenuTree items={menuItems} cursor={menuCursor >= 0 ? menuCursor : 0} accent={accent} />\n </Panel>\n }\n body={\n <Panel title=\"Result\" badge=\"MARKDOWN\" accent={accent} focused>\n <Box flexDirection=\"column\">\n {/* 줄 번호 + 내용 */}\n {visible.map((line, i) => {\n const lineNo = scrollTop + i + 1;\n const isH1 = line.startsWith('# ');\n const isH2 = line.startsWith('## ');\n const isH3 = line.startsWith('### ');\n const isCode = line.startsWith('```') || line.startsWith(' ');\n const isListItem = /^[*\\-+] /.test(line) || /^\\d+\\. /.test(line);\n return (\n <Box key={lineNo} gap={1}>\n <Text color={T.fgFaint}>{String(lineNo).padStart(4)}</Text>\n <Text\n color={\n isH1 ? accent :\n isH2 ? accent :\n isH3 ? T.cyan :\n isCode ? T.mint :\n isListItem ? T.fg :\n T.fg\n }\n bold={isH1 || isH2}\n >\n {line}\n </Text>\n </Box>\n );\n })}\n {/* 스크롤 힌트 */}\n <Box marginTop={1}>\n <Text color={T.fgFaint}>\n {scrollTop + 1}–{Math.min(scrollTop + visibleLines, lines.length)} / {lines.length} lines\n </Text>\n </Box>\n </Box>\n </Panel>\n }\n log={<LogPane lines={state.logs} accent={accent} />}\n footer={\n <Keymap accent={accent} keys={[\n { key: 'j/k', label: 'line' },\n { key: 'Ctrl+D/U', label: 'half page' },\n { key: 'Ctrl+F/B', label: 'full page' },\n { key: 'g/G', label: 'top/end' },\n { key: 'q/Esc', label: 'back' },\n ]} />\n }\n />\n );\n}\n","export type LogLevel = 'info' | 'ok' | 'warn' | 'err' | 'run' | 'dim';\n\nexport interface LogEntry {\n ts: string;\n level: LogLevel;\n text: string;\n}\n\nexport interface StepEntry {\n id: string;\n title: string;\n detail: string;\n state: 'pending' | 'running' | 'done' | 'err';\n}\n\nexport interface HistoryEntry {\n when: string;\n svc: 'cf' | 'jr' | 'gl';\n cmd: string;\n state: 'ok' | 'warn' | 'err';\n dur: string;\n result: string;\n}\n\nexport type ScreenType =\n | 'menu'\n | 'form'\n | 'running'\n | 'result-list'\n | 'result-text'\n | 'error'\n | 'history';\n\nexport interface AppState {\n screen: ScreenType;\n // 메뉴 탐색\n activePath: string;\n expandedKeys: string[];\n // 폼\n commandKey: string;\n formValues: Record<string, string | boolean>;\n formErrors: Record<string, string>;\n focusedField: number;\n // 실행\n steps: StepEntry[];\n progress: number;\n // 결과\n resultText: string;\n resultList: Array<Record<string, string>>;\n resultListCols: string[];\n resultListSelected: number;\n // 로그\n logs: LogEntry[];\n // 히스토리\n history: HistoryEntry[];\n historySelected: number;\n}\n\nexport function makeLog(level: LogLevel, text: string): LogEntry {\n const now = new Date();\n const ts = `${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}:${String(now.getSeconds()).padStart(2,'0')}`;\n return { ts, level, text };\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nexport interface TuiConfig {\n accent?: string;\n menuWidth?: number;\n logHeight?: number;\n showKeys?: boolean;\n presets?: Record<string, Record<string, string | boolean>>;\n lastUsed?: Record<string, Record<string, string | boolean>>;\n}\n\nconst explorer = cosmiconfig('tdecollab', {\n searchPlaces: [\n '.tdecollab.json',\n '.tdecollab.yaml',\n '.tdecollab.yml',\n 'tdecollab.config.json',\n path.join(os.homedir(), '.tdecollab.json'),\n ],\n});\n\nlet _config: TuiConfig | null = null;\nlet _configPath: string | null = null;\n\nexport async function loadTuiConfig(): Promise<TuiConfig> {\n if (_config) return _config;\n try {\n const result = await explorer.search();\n if (result) {\n _config = result.config as TuiConfig;\n _configPath = result.filepath;\n } else {\n _config = {};\n }\n } catch {\n _config = {};\n }\n return _config!;\n}\n\nexport function getDefaultConfigPath(): string {\n return path.join(process.cwd(), '.tdecollab.json');\n}\n\n// 설정 저장 (lastUsed / presets 갱신)\nexport function saveTuiConfig(updates: Partial<TuiConfig>): void {\n const configPath = _configPath ?? getDefaultConfigPath();\n let existing: TuiConfig = {};\n if (fs.existsSync(configPath)) {\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n } catch {\n existing = {};\n }\n }\n const merged = {\n ...existing,\n ...updates,\n presets: { ...(existing.presets ?? {}), ...(updates.presets ?? {}) },\n lastUsed: { ...(existing.lastUsed ?? {}), ...(updates.lastUsed ?? {}) },\n };\n fs.writeFileSync(configPath, JSON.stringify(merged, null, 2), 'utf-8');\n _config = merged;\n}\n\n// 특정 커맨드의 마지막 사용 값 저장\nexport function saveLastUsed(commandKey: string, values: Record<string, string | boolean>): void {\n saveTuiConfig({ lastUsed: { [commandKey]: values } });\n}\n\n// 폼 초기값: lastUsed 우선, 없으면 field.defaultValue\nexport function getInitialValues(\n commandKey: string,\n fields: Array<{ key: string; defaultValue?: string | boolean }>,\n config: TuiConfig,\n): Record<string, string | boolean> {\n const last = config.lastUsed?.[commandKey] ?? {};\n const result: Record<string, string | boolean> = {};\n for (const f of fields) {\n if (f.key in last) {\n result[f.key] = last[f.key];\n } else if (f.defaultValue !== undefined) {\n result[f.key] = f.defaultValue;\n } else {\n result[f.key] = '';\n }\n }\n return result;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport type { HistoryEntry } from './state.js';\n\nconst HISTORY_FILE = path.join(os.homedir(), '.tdecollab_history.json');\nconst MAX_HISTORY = 100;\n\nexport function loadHistory(): HistoryEntry[] {\n try {\n if (fs.existsSync(HISTORY_FILE)) {\n return JSON.parse(fs.readFileSync(HISTORY_FILE, 'utf-8')) as HistoryEntry[];\n }\n } catch {\n // 무시\n }\n return [];\n}\n\nexport function appendHistory(entry: HistoryEntry): void {\n const history = loadHistory();\n history.unshift(entry);\n if (history.length > MAX_HISTORY) history.splice(MAX_HISTORY);\n try {\n fs.writeFileSync(HISTORY_FILE, JSON.stringify(history, null, 2), 'utf-8');\n } catch {\n // 무시\n }\n}\n\nexport function clearHistory(): void {\n try {\n if (fs.existsSync(HISTORY_FILE)) fs.unlinkSync(HISTORY_FILE);\n } catch {\n // 무시\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { ConfluenceContentApi } from '../../confluence/api/content.js';\nimport { ConfluenceSpaceApi } from '../../confluence/api/space.js';\nimport { ConfluenceSearchApi } from '../../confluence/api/search.js';\nimport { createConfluenceClient } from '../../confluence/api/client.js';\nimport { MarkdownToStorageConverter } from '../../confluence/converters/md-to-storage.js';\nimport { StorageToMarkdownConverter } from '../../confluence/converters/storage-to-md.js';\nimport { tryBuildJiraIssueMap } from '../../confluence/converters/jira-enricher.js';\nimport { ImageDownloader } from '../../confluence/utils/image-downloader.js';\nimport { loadConfluenceConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\n\nexport interface ExecuteResult {\n type: 'text' | 'list';\n content?: string;\n list?: Array<Record<string, string>>;\n cols?: string[];\n logs: LogEntry[];\n}\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\n// 단계 헬퍼\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\n// page get 실행\nexport async function executePageGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('fetch', 'Fetch page from Confluence'),\n makeStep('convert', 'Convert to Markdown'),\n makeStep('images', 'Download images', values['downloadImages'] ? 'enabled' : 'skipped'),\n makeStep('output', 'Write output'),\n ];\n onSteps([...steps]);\n\n // Step 1: validate\n steps[0] = { ...steps[0], state: 'running', detail: `pageId=${values['pageId']}` };\n onSteps([...steps]);\n if (!values['pageId']) throw new Error('pageId is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n // Step 2: fetch\n steps[1] = { ...steps[1], state: 'running', detail: `GET /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/${values['pageId']}?expand=body.storage,version`));\n\n const page = await api.getPage(String(values['pageId']));\n addLog(makeLog('ok', `200 OK · \"${page.title}\" · ${page.space?.key}`));\n steps[1] = { ...steps[1], state: 'done', detail: `\"${page.title}\"` };\n onSteps([...steps]);\n\n // Step 3: convert\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n let imageUrlMap: Map<string, string> | undefined;\n\n if (values['downloadImages'] && page.body?.storage?.value) {\n steps[3] = { ...steps[3], state: 'running', detail: 'downloading...' };\n onSteps([...steps]);\n\n let baseDir = process.cwd();\n if (values['output']) baseDir = path.dirname(path.resolve(process.cwd(), String(values['output'])));\n const imgDir = path.resolve(baseDir, String(values['imageDir'] || './images'));\n const downloader = new ImageDownloader(api, { outputDir: imgDir, pageId: page.id, baseUrl: config.baseUrl });\n imageUrlMap = await downloader.downloadAllImages(page.body.storage.value);\n\n // 절대경로 → 상대경로 변환\n for (const [key, abs] of imageUrlMap.entries()) {\n imageUrlMap.set(key, path.relative(baseDir, abs).split(path.sep).join('/'));\n }\n addLog(makeLog('ok', `이미지 다운로드 완료 (${imageUrlMap.size}개) → ${imgDir}`));\n steps[3] = { ...steps[3], state: 'done', detail: `${imageUrlMap.size} files` };\n onSteps([...steps]);\n } else {\n steps[3] = { ...steps[3], state: 'done', detail: 'skipped' };\n onSteps([...steps]);\n }\n\n const converter = new StorageToMarkdownConverter();\n const jiraIssueMap = page.body?.storage?.value\n ? await tryBuildJiraIssueMap(page.body.storage.value)\n : undefined;\n const markdown = page.body?.storage?.value\n ? converter.convert(page.body.storage.value, imageUrlMap, jiraIssueMap)\n : '(No content)';\n addLog(makeLog('ok', `Markdown 변환 완료 (${markdown.split('\\n').length} lines)`));\n steps[2] = { ...steps[2], state: 'done', detail: `${markdown.split('\\n').length} lines` };\n onSteps([...steps]);\n\n // Step 5: output\n steps[4] = { ...steps[4], state: 'running' };\n onSteps([...steps]);\n if (values['output']) {\n const outputPath = path.resolve(process.cwd(), String(values['output']));\n fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n fs.writeFileSync(outputPath, markdown, 'utf-8');\n addLog(makeLog('ok', `파일 저장: ${outputPath}`));\n steps[4] = { ...steps[4], state: 'done', detail: outputPath };\n } else {\n steps[4] = { ...steps[4], state: 'done', detail: 'console output' };\n }\n onSteps([...steps]);\n\n return { type: 'text', content: markdown, logs };\n}\n\n// page create 실행\nexport async function executePageCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('read', 'Read Markdown file'),\n makeStep('convert', 'Convert Markdown → Storage'),\n makeStep('create', 'Create Confluence page'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['space']) throw new Error('--space is required');\n if (!values['title']) throw new Error('--title is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n let content = '';\n if (values['file']) {\n steps[1] = { ...steps[1], state: 'running', detail: String(values['file']) };\n onSteps([...steps]);\n const filePath = path.resolve(process.cwd(), String(values['file']));\n if (!fs.existsSync(filePath)) throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);\n content = fs.readFileSync(filePath, 'utf-8');\n addLog(makeLog('ok', `파일 읽기 완료: ${filePath} (${content.split('\\n').length} lines)`));\n steps[1] = { ...steps[1], state: 'done', detail: `${content.split('\\n').length} lines` };\n onSteps([...steps]);\n } else {\n steps[1] = { ...steps[1], state: 'done', detail: 'no file (empty page)' };\n onSteps([...steps]);\n }\n\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n const converter = new MarkdownToStorageConverter();\n const storageXml = converter.convert(content);\n addLog(makeLog('ok', 'Markdown → Storage XML 변환 완료'));\n steps[2] = { ...steps[2], state: 'done' };\n onSteps([...steps]);\n\n steps[3] = { ...steps[3], state: 'running', detail: `POST /rest/api/content · space=${values['space']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/content space=${values['space']} title=\"${values['title']}\"`));\n\n const page = await api.createPage({\n title: String(values['title']),\n spaceKey: String(values['space']),\n body: storageXml,\n parentId: values['parent'] ? String(values['parent']) : undefined,\n });\n addLog(makeLog('ok', `페이지 생성 완료: \"${page.title}\" (ID: ${page.id})`));\n steps[3] = { ...steps[3], state: 'done', detail: `ID: ${page.id}` };\n onSteps([...steps]);\n\n const resultText = [\n `# 페이지 생성 완료`,\n ``,\n `- **제목**: ${page.title}`,\n `- **ID**: ${page.id}`,\n `- **스페이스**: ${page.space?.key}`,\n `- **URL**: ${config.baseUrl}${page._links?.webui ?? ''}`,\n ].join('\\n');\n\n return { type: 'text', content: resultText, logs };\n}\n\n// space list 실행\nexport async function executeSpaceList(\n _values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [makeStep('fetch', 'Fetch space list')];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running', detail: 'GET /rest/api/space' };\n onSteps([...steps]);\n addLog(makeLog('run', 'GET /rest/api/space?limit=50'));\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceSpaceApi(client);\n const spaces = await api.getSpaces();\n\n addLog(makeLog('ok', `${spaces.length}개 스페이스 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${spaces.length} spaces` };\n onSteps([...steps]);\n\n const list = spaces.map((s) => ({\n key: s.key ?? '',\n name: s.name ?? '',\n type: s.type ?? '',\n id: String(s.id ?? ''),\n }));\n\n return { type: 'list', list, cols: ['key', 'name', 'type', 'id'], logs };\n}\n\n// search 실행\nexport async function executeSearch(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [makeStep('search', 'Search Confluence pages')];\n onSteps([...steps]);\n\n if (!values['cql']) throw new Error('cql is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['cql']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/search?cql=${encodeURIComponent(String(values['cql']))}`));\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceSearchApi(client);\n const searchResult = await api.searchByCql(String(values['cql']), 0, Number(values['limit'] ?? 10));\n const results = searchResult.results ?? [];\n\n addLog(makeLog('ok', `${results.length}개 결과`));\n steps[0] = { ...steps[0], state: 'done', detail: `${results.length} results` };\n onSteps([...steps]);\n\n const list = results.map((r) => ({\n id: String(r.id ?? ''),\n title: r.title ?? '',\n space: r.space?.key ?? '',\n type: r.type ?? '',\n }));\n\n return { type: 'list', list, cols: ['id', 'title', 'space', 'type'], logs };\n}\n\n// page update 실행\nexport async function executePageUpdate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps: StepEntry[] = [\n makeStep('validate', 'Validate arguments'),\n makeStep('fetch', 'Fetch current page'),\n makeStep('convert', 'Convert Markdown'),\n makeStep('update', 'Update page'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['pageId']) throw new Error('pageId is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadConfluenceConfig();\n const client = createConfluenceClient(config);\n const api = new ConfluenceContentApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `GET /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/content/${values['pageId']}`));\n const current = await api.getPage(String(values['pageId']));\n addLog(makeLog('ok', `현재 페이지: \"${current.title}\" v${current.version?.number}`));\n steps[1] = { ...steps[1], state: 'done', detail: `v${current.version?.number}` };\n onSteps([...steps]);\n\n steps[2] = { ...steps[2], state: 'running' };\n onSteps([...steps]);\n let storageXml = current.body?.storage?.value ?? '';\n if (values['file']) {\n const filePath = path.resolve(process.cwd(), String(values['file']));\n const markdown = fs.readFileSync(filePath, 'utf-8');\n const converter = new MarkdownToStorageConverter();\n storageXml = converter.convert(markdown);\n addLog(makeLog('ok', `Markdown 변환 완료: ${filePath}`));\n }\n steps[2] = { ...steps[2], state: 'done' };\n onSteps([...steps]);\n\n steps[3] = { ...steps[3], state: 'running', detail: `PUT /rest/api/content/${values['pageId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `PUT /rest/api/content/${values['pageId']}`));\n const updated = await api.updatePage({\n id: String(values['pageId']),\n title: values['title'] ? String(values['title']) : current.title!,\n body: storageXml,\n version: (current.version?.number ?? 1) + 1,\n });\n addLog(makeLog('ok', `업데이트 완료: \"${updated.title}\" v${updated.version?.number}`));\n steps[3] = { ...steps[3], state: 'done', detail: `v${updated.version?.number}` };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# 페이지 업데이트 완료\\n\\n- **제목**: ${updated.title}\\n- **ID**: ${updated.id}\\n- **버전**: v${updated.version?.number}`,\n logs,\n };\n}\n","import { createJiraClient } from '../../jira/api/client.js';\nimport { JiraIssueApi } from '../../jira/api/issue.js';\nimport { JiraSearchApi } from '../../jira/api/search.js';\nimport { loadJiraConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\nimport type { ExecuteResult } from './confluence.js';\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\nexport async function executeIssueGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch JIRA issue')];\n onSteps([...steps]);\n\n if (!values['issueId']) throw new Error('issueId is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['issueId']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/2/issue/${values['issueId']}`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraIssueApi(client);\n const issue = await api.getIssue(String(values['issueId']));\n addLog(makeLog('ok', `200 OK · \"${issue.fields?.summary}\"`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const lines = [\n `# ${issue.key}: ${issue.fields?.summary ?? ''}`,\n '',\n `- **상태**: ${issue.fields?.status?.name ?? ''}`,\n `- **담당자**: ${issue.fields?.assignee?.displayName ?? '미지정'}`,\n `- **우선순위**: ${issue.fields?.priority?.name ?? ''}`,\n `- **이슈 유형**: ${issue.fields?.issuetype?.name ?? ''}`,\n '',\n `## 설명`,\n issue.fields?.description ?? '(없음)',\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n\nexport async function executeIssueCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [\n makeStep('validate', 'Validate arguments'),\n makeStep('create', 'Create JIRA issue'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['project']) throw new Error('--project is required');\n if (!values['summary']) throw new Error('--summary is required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraIssueApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `POST /rest/api/2/issue` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/2/issue project=${values['project']}`));\n\n const issue = await api.createIssue({\n projectKey: String(values['project']),\n summary: String(values['summary']),\n issueType: String(values['type'] ?? 'Task'),\n ...(values['assignee'] ? { assignee: String(values['assignee']) } : {}),\n ...(values['labels'] ? { labels: String(values['labels']).split(',').map((l) => l.trim()) } : {}),\n });\n addLog(makeLog('ok', `이슈 생성 완료: ${issue.key}`));\n steps[1] = { ...steps[1], state: 'done', detail: issue.key };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# 이슈 생성 완료\\n\\n- **키**: ${issue.key}\\n- **제목**: ${values['summary']}`,\n logs,\n };\n}\n\nexport async function executeIssueTransition(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('transition', 'Transition JIRA issue')];\n onSteps([...steps]);\n\n if (!values['issueId'] || !values['transitionId']) throw new Error('issueId and transitionId are required');\n\n steps[0] = { ...steps[0], state: 'running', detail: `${values['issueId']} → ${values['transitionId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /rest/api/2/issue/${values['issueId']}/transitions`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n await client.post(`/rest/api/2/issue/${values['issueId']}/transitions`, {\n transition: { id: String(values['transitionId']) },\n });\n addLog(makeLog('ok', `전환 완료: ${values['issueId']}`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n return { type: 'text', content: `# 이슈 전환 완료\\n\\n- **이슈**: ${values['issueId']}\\n- **Transition ID**: ${values['transitionId']}`, logs };\n}\n\nexport async function executeJiraSearch(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('search', 'Search JIRA issues')];\n onSteps([...steps]);\n\n if (!values['jql']) throw new Error('jql is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: String(values['jql']) };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /rest/api/2/search?jql=${encodeURIComponent(String(values['jql']))}`));\n\n const config = loadJiraConfig();\n const client = createJiraClient(config);\n const api = new JiraSearchApi(client);\n const result = await api.searchByJql(String(values['jql']), 0, Number(values['limit'] ?? 20));\n\n addLog(makeLog('ok', `${result.issues?.length ?? 0}개 이슈 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${result.issues?.length ?? 0} issues` };\n onSteps([...steps]);\n\n const list = (result.issues ?? []).map((i) => ({\n key: i.key ?? '',\n summary: (i.fields?.summary ?? '').slice(0, 50),\n status: i.fields?.status?.name ?? '',\n assignee: i.fields?.assignee?.displayName ?? '',\n }));\n\n return { type: 'list', list, cols: ['key', 'summary', 'status', 'assignee'], logs };\n}\n","import { createGitlabClient } from '../../gitlab/api/client.js';\nimport { GitlabMergeRequestApi } from '../../gitlab/api/merge-request.js';\nimport { GitlabPipelineApi } from '../../gitlab/api/pipeline.js';\nimport { loadGitlabConfig } from '../../common/config.js';\nimport type { StepEntry, LogEntry } from '../state.js';\nimport { makeLog } from '../state.js';\nimport type { ExecuteResult } from './confluence.js';\n\ntype StepCallback = (steps: StepEntry[]) => void;\ntype LogCallback = (log: LogEntry) => void;\n\nfunction makeStep(id: string, title: string, detail = ''): StepEntry {\n return { id, title, detail, state: 'pending' };\n}\n\nexport async function executeMrList(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch MR list')];\n onSteps([...steps]);\n\n if (!values['projectId']) throw new Error('projectId is required');\n\n steps[0] = { ...steps[0], state: 'running', detail: `project=${values['projectId']}` };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/merge_requests?state=${values['state'] ?? 'opened'}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n const mrs = await api.getMergeRequests(Number(values['projectId']), {\n state: String(values['state'] ?? 'opened') as 'opened' | 'closed' | 'merged' | 'all',\n });\n\n addLog(makeLog('ok', `${mrs.length}개 MR 조회 완료`));\n steps[0] = { ...steps[0], state: 'done', detail: `${mrs.length} MRs` };\n onSteps([...steps]);\n\n const list = mrs.map((mr) => ({\n iid: String(mr.iid ?? ''),\n title: (mr.title ?? '').slice(0, 50),\n state: mr.state ?? '',\n author: mr.author?.name ?? '',\n target: mr.target_branch ?? '',\n }));\n\n return { type: 'list', list, cols: ['iid', 'title', 'state', 'author', 'target'], logs };\n}\n\nexport async function executeMrGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch MR detail')];\n onSteps([...steps]);\n\n if (!values['projectId'] || !values['mrId']) throw new Error('projectId and mrId are required');\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/merge_requests/${values['mrId']}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n const mr = await api.getMergeRequest(Number(values['projectId']), Number(values['mrId']));\n\n addLog(makeLog('ok', `200 OK · !${mr.iid} \"${mr.title}\"`));\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const lines = [\n `# MR !${mr.iid}: ${mr.title}`,\n '',\n `- **상태**: ${mr.state}`,\n `- **작성자**: ${mr.author?.name ?? ''}`,\n `- **브랜치**: \\`${mr.source_branch}\\` → \\`${mr.target_branch}\\``,\n `- **생성일**: ${mr.created_at ?? ''}`,\n '',\n `## 설명`,\n mr.description ?? '(없음)',\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n\nexport async function executeMrCreate(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [\n makeStep('validate', 'Validate arguments'),\n makeStep('create', 'Create MR'),\n ];\n onSteps([...steps]);\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n if (!values['projectId'] || !values['sourceBranch']) throw new Error('projectId and sourceBranch are required');\n steps[0] = { ...steps[0], state: 'done' };\n onSteps([...steps]);\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabMergeRequestApi(client);\n\n steps[1] = { ...steps[1], state: 'running', detail: `POST /api/v4/projects/${values['projectId']}/merge_requests` };\n onSteps([...steps]);\n addLog(makeLog('run', `POST /api/v4/projects/${values['projectId']}/merge_requests`));\n\n const mr = await api.createMergeRequest(Number(values['projectId']), {\n source_branch: String(values['sourceBranch']),\n target_branch: String(values['targetBranch'] ?? 'main'),\n title: values['title'] ? String(values['title']) : `Merge ${values['sourceBranch']} → ${values['targetBranch'] ?? 'main'}`,\n });\n\n addLog(makeLog('ok', `MR 생성 완료: !${mr.iid}`));\n steps[1] = { ...steps[1], state: 'done', detail: `!${mr.iid}` };\n onSteps([...steps]);\n\n return {\n type: 'text',\n content: `# MR 생성 완료\\n\\n- **번호**: !${mr.iid}\\n- **제목**: ${mr.title}\\n- **브랜치**: \\`${mr.source_branch}\\` → \\`${mr.target_branch}\\``,\n logs,\n };\n}\n\nexport async function executePipelineGet(\n values: Record<string, string | boolean>,\n onSteps: StepCallback,\n onLog: LogCallback,\n): Promise<ExecuteResult> {\n const logs: LogEntry[] = [];\n const addLog = (l: LogEntry) => { logs.push(l); onLog(l); };\n const steps = [makeStep('fetch', 'Fetch pipeline')];\n onSteps([...steps]);\n\n if (!values['projectId'] || !values['pipelineId']) throw new Error('projectId and pipelineId are required');\n\n steps[0] = { ...steps[0], state: 'running' };\n onSteps([...steps]);\n addLog(makeLog('run', `GET /api/v4/projects/${values['projectId']}/pipelines/${values['pipelineId']}`));\n\n const config = loadGitlabConfig();\n const client = createGitlabClient(config);\n const api = new GitlabPipelineApi(client);\n const pipeline = await api.getPipeline(Number(values['projectId']), Number(values['pipelineId']));\n\n addLog(makeLog('ok', `200 OK · pipeline #${pipeline.id} · ${pipeline.status}`));\n\n let jobsText = '';\n if (values['jobs']) {\n const jobs = await api.getPipelineJobs(Number(values['projectId']), Number(values['pipelineId']));\n addLog(makeLog('ok', `${jobs.length}개 job 조회 완료`));\n jobsText = '\\n\\n## Jobs\\n\\n' + jobs.map((j) => `- **${j.name}**: ${j.status}`).join('\\n');\n }\n\n steps[0] = { ...steps[0], state: 'done', detail: pipeline.status };\n onSteps([...steps]);\n\n const lines = [\n `# Pipeline #${pipeline.id}`,\n '',\n `- **상태**: ${pipeline.status}`,\n `- **브랜치**: ${pipeline.ref ?? ''}`,\n `- **SHA**: ${(pipeline.sha ?? '').slice(0, 8)}`,\n `- **생성일**: ${pipeline.created_at ?? ''}`,\n jobsText,\n ];\n\n return { type: 'text', content: lines.join('\\n'), logs };\n}\n"],"mappings":"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","names":["Box","useStdout","useCallback","useEffect","useState","Box","Text","Box","jsx","jsxs","Box","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","Box","Text","useInput","useState","Box","Text","useInput","jsx","jsxs","useInput","Box","Text","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","Text","useInput","Box","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","Box","Text","Text","useEffect","useState","jsx","useState","useEffect","Text","jsx","jsxs","Box","Text","Box","Text","useInput","useState","jsx","jsxs","useState","useInput","Box","Text","fs","path","os","fs","path","os","fs","path","path","fs","makeStep","makeStep","jsx","useStdout","useState","useEffect","useCallback","Box","jsx"]}