@wolfstar/cli 0.2.0-next-20260905171401 → 0.3.0

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.
Files changed (46) hide show
  1. package/README.md +45 -15
  2. package/dist/{build-CvSvbsYN.js → build-DbGs9-s8.js} +4 -4
  3. package/dist/{build-CvSvbsYN.js.map → build-DbGs9-s8.js.map} +1 -1
  4. package/dist/{build-B6xw00Ee.js → build-DkMulM4f.js} +2 -2
  5. package/dist/{build-B6xw00Ee.js.map → build-DkMulM4f.js.map} +1 -1
  6. package/dist/{builders-D97Uqjwg.js → builders-NkAoPRdw.js} +2 -2
  7. package/dist/{builders-D97Uqjwg.js.map → builders-NkAoPRdw.js.map} +1 -1
  8. package/dist/cli.js +6 -6
  9. package/dist/{codegen-mYkL-GBf.js → codegen-1kW_OnrL.js} +2 -2
  10. package/dist/{codegen-mYkL-GBf.js.map → codegen-1kW_OnrL.js.map} +1 -1
  11. package/dist/{codegen-DjPOn7cp.js → codegen-DHQH83M3.js} +2 -2
  12. package/dist/{codegen-DjPOn7cp.js.map → codegen-DHQH83M3.js.map} +1 -1
  13. package/dist/{commands-Dw2LFWV-.js → commands-BkZNThm8.js} +2 -2
  14. package/dist/{commands-Dw2LFWV-.js.map → commands-BkZNThm8.js.map} +1 -1
  15. package/dist/{commands-BkGKs_Bg.js → commands-DwqViJ2V.js} +4 -4
  16. package/dist/{commands-BkGKs_Bg.js.map → commands-DwqViJ2V.js.map} +1 -1
  17. package/dist/{dev-BCgaVd0m.js → dev-BazJrPZ3.js} +2 -2
  18. package/dist/{dev-BCgaVd0m.js.map → dev-BazJrPZ3.js.map} +1 -1
  19. package/dist/{dev-CWA_JVTb.js → dev-C6HogNjR.js} +80 -65
  20. package/dist/dev-C6HogNjR.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/{info-Czh4LUsD.js → info-BrxKCcUW.js} +2 -2
  25. package/dist/{info-Czh4LUsD.js.map → info-BrxKCcUW.js.map} +1 -1
  26. package/dist/{info-BqxpktLG.js → info-rYRLITnv.js} +2 -2
  27. package/dist/{info-BqxpktLG.js.map → info-rYRLITnv.js.map} +1 -1
  28. package/dist/log-buffer-D-nj2ZEU.js +72 -0
  29. package/dist/log-buffer-D-nj2ZEU.js.map +1 -0
  30. package/dist/{output-mode-ChrOf0LO.js → output-mode-Cxes6YUW.js} +4 -2
  31. package/dist/output-mode-Cxes6YUW.js.map +1 -0
  32. package/dist/{prepare-BXcm2Ukp.js → prepare-90XQCoak.js} +1 -1
  33. package/dist/{prepare-D5NZ0w4t.js → prepare-CHLrneYU.js} +2 -2
  34. package/dist/{prepare-D5NZ0w4t.js.map → prepare-CHLrneYU.js.map} +1 -1
  35. package/dist/{prepare-CVf88_Or.js → prepare-hOwjyelr.js} +2 -2
  36. package/dist/{prepare-CVf88_Or.js.map → prepare-hOwjyelr.js.map} +1 -1
  37. package/dist/{tsdown-BEFq2API.js → tsdown-Do8vjnIK.js} +23 -6
  38. package/dist/tsdown-Do8vjnIK.js.map +1 -0
  39. package/dist/tui-C2P91TgW.js +938 -0
  40. package/dist/tui-C2P91TgW.js.map +1 -0
  41. package/package.json +7 -6
  42. package/dist/dev-CWA_JVTb.js.map +0 -1
  43. package/dist/output-mode-ChrOf0LO.js.map +0 -1
  44. package/dist/tsdown-BEFq2API.js.map +0 -1
  45. package/dist/tui-BTRFsLQR.js +0 -770
  46. package/dist/tui-BTRFsLQR.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tui-BTRFsLQR.js","names":[],"sources":["../src/renderers/ink/theme.tsx","../src/renderers/ink/components/HelpOverlay.tsx","../src/renderers/ink/hooks/useLogVersion.ts","../src/renderers/ink/components/LogLine.tsx","../src/renderers/ink/components/LogBrowser.tsx","../src/renderers/panel-logic.ts","../src/renderers/ink/components/Panel.tsx","../src/renderers/ink/hooks/useDevStatus.ts","../src/renderers/ink/hooks/useLogCounters.ts","../src/renderers/ink/hooks/useSpinner.ts","../src/renderers/ink/hooks/useStaticLog.ts","../src/renderers/ink/hooks/useUptime.ts","../src/renderers/ink/DevApp.tsx","../src/renderers/tui.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\n\n/**\n * Whether the UI may use colour. `stars dev` decides this once (`NO_COLOR`, `FORCE_COLOR`, TTY detection) and every\n * component reads it from here instead of re-deriving it.\n */\nconst ColorContext = createContext(true);\n\nexport function ColorProvider({ color, children }: { color: boolean; children: ReactNode }) {\n\treturn <ColorContext value={color}>{children}</ColorContext>;\n}\n\n/**\n * Returns a colour name only when colour is enabled, so `<Text color={useColor()('green')}>` degrades to plain text.\n */\nexport function useColor(): (name: string) => string | undefined {\n\tconst enabled = useContext(ColorContext);\n\treturn (name) => (enabled ? name : undefined);\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useColor } from '../theme.js';\n\nconst KEYS: [string, string][] = [\n\t['r', 'restart the bot now'],\n\t['l', 'open the logs (scroll, filter by source or level)'],\n\t['q / Ctrl+C', 'stop the bot and quit'],\n\t['?', 'toggle this help']\n];\n\nexport interface HelpOverlayProps {\n\theight: number;\n\tonClose: () => void;\n}\n\n/** The static keys reference, opened with `?` from the pinned panel. */\nexport function HelpOverlay({ height, onClose }: HelpOverlayProps) {\n\tconst paint = useColor();\n\tuseInput(() => onClose());\n\n\treturn (\n\t\t<Box flexDirection=\"column\" height={height}>\n\t\t\t<Text bold>Keys</Text>\n\t\t\t<Text dimColor>{'─'.repeat(60)}</Text>\n\t\t\t{KEYS.map(([key, description]) => (\n\t\t\t\t<Box key={key} gap={1}>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\t{key.padEnd(14)}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text dimColor>{description}</Text>\n\t\t\t\t</Box>\n\t\t\t))}\n\t\t\t<Box flexGrow={1} />\n\t\t\t<Text dimColor>press any key to close</Text>\n\t\t</Box>\n\t);\n}\n","import { useEffect, useState } from 'react';\nimport type { LogBuffer } from '../../../lib/log-buffer.js';\n\n/** Bumps whenever the buffer changes, so a consumer can re-derive a filtered view without re-filtering on every render. */\nexport function useLogVersion(logs: LogBuffer): number {\n\tconst [version, setVersion] = useState(0);\n\n\tuseEffect(() => {\n\t\tconst bump = () => setVersion((current) => current + 1);\n\t\tlogs.on('entry', bump);\n\t\tlogs.on('clear', bump);\n\t\treturn () => {\n\t\t\tlogs.off('entry', bump);\n\t\t\tlogs.off('clear', bump);\n\t\t};\n\t}, [logs]);\n\n\treturn version;\n}\n","import { Text } from 'ink';\nimport type { LogEntry, LogSource } from '../../../lib/log-buffer.js';\nimport { useColor } from '../theme.js';\n\nconst SOURCE_COLORS: Partial<Record<LogSource, string>> = { stars: 'cyan', build: 'magenta', tsc: 'cyan', tunnel: 'yellow' };\n\n/** One committed log line, formatted the same way plain mode prints it, so scrollback reads identically either way. */\nexport function LogLine({ entry }: { entry: LogEntry }) {\n\tconst paint = useColor();\n\tconst source = SOURCE_COLORS[entry.source];\n\tconst level = entry.level === 'error' ? 'red' : entry.level === 'warn' ? 'yellow' : entry.level === 'success' ? 'green' : undefined;\n\n\tif (!source) return <Text color={level ? paint(level) : undefined}>{entry.text}</Text>;\n\n\treturn (\n\t\t<Text>\n\t\t\t<Text color={paint(source)}>{entry.source}</Text> <Text color={level ? paint(level) : undefined}>{entry.text}</Text>\n\t\t</Text>\n\t);\n}\n","import { Box, Text, useInput } from 'ink';\nimport { useMemo, useState } from 'react';\nimport type { DevService } from '../../../lib/dev-service.js';\nimport type { LogEntry, LogLevel, LogSource } from '../../../lib/log-buffer.js';\nimport { useLogVersion } from '../hooks/useLogVersion.js';\nimport { useColor } from '../theme.js';\nimport { LogLine } from './LogLine.js';\n\nconst SOURCE_FILTERS: (LogSource | null)[] = [null, 'app', 'build', 'tsc', 'tunnel', 'stars'];\nconst LEVEL_FILTERS: (LogLevel | null)[] = [null, 'warn', 'error'];\n\nexport interface LogBrowserProps {\n\tservice: DevService;\n\theight: number;\n\tonClose: () => void;\n}\n\n/**\n * The full, filterable log history, opened with `l` from the panel. The pinned panel only ever shows a live count\n * of warnings/errors (Nuxt CLI v4's own dev panel does the same); browsing what actually happened lives here.\n */\nexport function LogBrowser({ service, height, onClose }: LogBrowserProps) {\n\tconst paint = useColor();\n\tconst [sourceIndex, setSourceIndex] = useState(0);\n\tconst [levelIndex, setLevelIndex] = useState(0);\n\tconst [scroll, setScroll] = useState(0);\n\n\tconst source = SOURCE_FILTERS[sourceIndex] ?? null;\n\tconst level = LEVEL_FILTERS[levelIndex] ?? null;\n\tconst version = useLogVersion(service.logs);\n\tconst entries = useMemo(() => service.logs.filter({ source, level }), [service, source, level, version]);\n\n\tconst bodyHeight = Math.max(1, height - 3);\n\tconst maxScroll = Math.max(0, entries.length - bodyHeight);\n\tconst clamped = Math.min(scroll, maxScroll);\n\tconst end = entries.length - clamped;\n\tconst visible = entries.slice(Math.max(0, end - bodyHeight), end);\n\n\tuseInput((input, key) => {\n\t\tif (key.escape || input === 'l' || input === 'q') return onClose();\n\t\tif (key.ctrl && input === 'c') return onClose();\n\n\t\tswitch (input) {\n\t\t\tcase 'f':\n\t\t\t\tsetSourceIndex((current) => (current + 1) % SOURCE_FILTERS.length);\n\t\t\t\treturn setScroll(0);\n\t\t\tcase 'e':\n\t\t\t\tsetLevelIndex((current) => (current + 1) % LEVEL_FILTERS.length);\n\t\t\t\treturn setScroll(0);\n\t\t\tcase 'c':\n\t\t\t\treturn service.logs.clear();\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (key.downArrow || input === 'j') return setScroll((current) => Math.max(0, current - 1));\n\t\tif (key.upArrow || input === 'k') return setScroll((current) => Math.min(maxScroll, current + 1));\n\t\tif (key.pageDown) return setScroll((current) => Math.max(0, current - bodyHeight));\n\t\tif (key.pageUp) return setScroll((current) => Math.min(maxScroll, current + bodyHeight));\n\t\tif (key.end) return setScroll(0);\n\t});\n\n\treturn (\n\t\t<Box flexDirection=\"column\" height={height}>\n\t\t\t<Box gap={1}>\n\t\t\t\t<Text bold>stars dev logs</Text>\n\t\t\t\t<Text dimColor>{`filter ${source ?? 'all'}${level ? `, level ≥ ${level}` : ''}`}</Text>\n\t\t\t</Box>\n\t\t\t<Text dimColor>{'─'.repeat(60)}</Text>\n\t\t\t<Box flexDirection=\"column\" height={bodyHeight}>\n\t\t\t\t{visible.length === 0 ? (\n\t\t\t\t\t<Text dimColor>no logs yet</Text>\n\t\t\t\t) : (\n\t\t\t\t\tvisible.map((entry: LogEntry) => <LogLine key={entry.id} entry={entry} />)\n\t\t\t\t)}\n\t\t\t</Box>\n\t\t\t<Box gap={2}>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\tf\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>source</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\te\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>errors</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\tc\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>clear</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\t↑↓\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>scroll</Text>\n\t\t\t\t</Text>\n\t\t\t\t<Text>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\tq / esc / l\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>close</Text>\n\t\t\t\t</Text>\n\t\t\t</Box>\n\t\t</Box>\n\t);\n}\n","import type { DevStatus } from '../lib/dev-service.js';\n\nexport type Badge = 'starting' | 'building' | 'restarting' | 'ready' | 'error';\n\n/**\n * The badge and standing description for the panel's status row, mirroring the states Nuxt CLI v4's own dev panel\n * cycles through (`STARTING`/`BUILDING`/`RESTART`/`READY`/`ERROR`).\n */\nexport function describeBadge(status: DevStatus): { badge: Badge; note: string } {\n\tif (status.build === 'building') return { badge: 'building', note: 'compiling changes' };\n\tif (status.process === 'starting') return { badge: 'starting', note: 'starting the bot' };\n\tif (status.process === 'stopping') return { badge: 'restarting', note: 'restarting the bot' };\n\tif (status.build === 'failed') return { badge: 'error', note: 'build failed, waiting for changes' };\n\tif (status.process === 'crashed') return { badge: 'error', note: 'the bot crashed, press r to restart' };\n\tif (status.process === 'running') return { badge: 'ready', note: 'watching for changes' };\n\treturn { badge: 'starting', note: 'waiting for the first build' };\n}\n\n/** Formats a duration the way a dev session reads it: `mm:ss` under an hour, `h:mm:ss` above. */\nexport function formatDuration(milliseconds: number): string {\n\tconst total = Math.max(0, Math.floor(milliseconds / 1000));\n\tconst seconds = total % 60;\n\tconst minutes = Math.floor(total / 60) % 60;\n\tconst hours = Math.floor(total / 3600);\n\tconst pad = (value: number) => value.toString().padStart(2, '0');\n\n\treturn hours > 0 ? `${hours}:${pad(minutes)}:${pad(seconds)}` : `${pad(minutes)}:${pad(seconds)}`;\n}\n","import { Box, Text } from 'ink';\nimport type { ResolvedStarsConfig } from '@wolfstar/http-framework/config';\nimport type { DevStatus } from '../../../lib/dev-service.js';\nimport type { LogCounters } from '../hooks/useLogCounters.js';\nimport { describeBadge, formatDuration, type Badge } from '../../panel-logic.js';\nimport { useColor } from '../theme.js';\n\nconst BADGE_COLOR: Record<Badge, string> = { starting: 'yellow', building: 'yellow', restarting: 'yellow', ready: 'green', error: 'red' };\n\nexport interface PanelHint {\n\tkey: string;\n\tlabel: string;\n}\n\nexport const DEFAULT_HINTS: PanelHint[] = [\n\t{ key: 'r', label: 'restart' },\n\t{ key: 'l', label: 'logs' },\n\t{ key: '?', label: 'help' },\n\t{ key: 'q', label: 'quit' }\n];\n\nexport interface PanelProps {\n\tname: string;\n\tstatus: DevStatus;\n\tconfig: ResolvedStarsConfig;\n\tuptimeMs: number | null;\n\tcounters: LogCounters;\n\tspinner: string;\n\tnarrow: boolean;\n}\n\n/**\n * The pinned dev panel: a handful of lines below the log stream, redrawn as state changes. Mirrors the blocks\n * Nuxt CLI v4's own dev panel shows — a wordmark, the URL with its live checks, a warning/error summary, a status\n * badge and the shortcut hints — kept to a fixed, small height instead of growing with the session.\n */\nexport function Panel({ name, status, config, uptimeMs, counters, spinner, narrow }: PanelProps) {\n\tconst { badge, note } = describeBadge(status);\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t<Wordmark name={name} status={status} uptimeMs={uptimeMs} narrow={narrow} />\n\t\t\t{status.url && <UrlRow status={status} config={config} spinner={spinner} narrow={narrow} />}\n\t\t\t<Summary counters={counters} />\n\t\t\t<StatusRow badge={badge} note={note} />\n\t\t\t<Hints errors={counters.errors} narrow={narrow} />\n\t\t</Box>\n\t);\n}\n\nfunction Wordmark({ name, status, uptimeMs, narrow }: { name: string; status: DevStatus; uptimeMs: number | null; narrow: boolean }) {\n\tconst paint = useColor();\n\treturn (\n\t\t<Box gap={narrow ? 1 : 2}>\n\t\t\t<Text bold color={paint('yellow')}>\n\t\t\t\t★ stars dev\n\t\t\t</Text>\n\t\t\t<Text dimColor>{name}</Text>\n\t\t\t{!narrow && uptimeMs !== null && <Text dimColor>{`up ${formatDuration(uptimeMs)}`}</Text>}\n\t\t\t{!narrow && status.restarts > 0 && <Text dimColor>{`restarts ${status.restarts}`}</Text>}\n\t\t</Box>\n\t);\n}\n\nfunction UrlRow({ status, config, spinner, narrow }: { status: DevStatus; config: ResolvedStarsConfig; spinner: string; narrow: boolean }) {\n\tconst paint = useColor();\n\treturn (\n\t\t<Box gap={narrow ? 1 : 2}>\n\t\t\t<Text color={paint('cyan')}>{status.url}</Text>\n\t\t\t{!narrow && config.dev.health !== null && <Health status={status} />}\n\t\t\t{!narrow && config.dev.typecheck.enabled && <Typecheck status={status} spinner={spinner} />}\n\t\t\t{!narrow && status.tunnel !== 'off' && <Tunnel status={status} spinner={spinner} />}\n\t\t</Box>\n\t);\n}\n\nfunction Health({ status }: { status: DevStatus }) {\n\tconst paint = useColor();\n\tswitch (status.health) {\n\t\tcase 'ok':\n\t\t\treturn <Text color={paint('green')}>health ok</Text>;\n\t\tcase 'down':\n\t\t\treturn <Text color={paint('red')}>health down</Text>;\n\t\tdefault:\n\t\t\treturn <Text dimColor>health unknown</Text>;\n\t}\n}\n\nfunction Typecheck({ status, spinner }: { status: DevStatus; spinner: string }) {\n\tconst paint = useColor();\n\tswitch (status.typecheck) {\n\t\tcase 'checking':\n\t\t\treturn <Text dimColor>{`${spinner} types`}</Text>;\n\t\tcase 'ok':\n\t\t\treturn <Text color={paint('green')}>types ok</Text>;\n\t\tcase 'failed':\n\t\t\treturn <Text color={paint('red')}>{`types ${status.typeErrors}`}</Text>;\n\t\tdefault:\n\t\t\treturn <Text dimColor>types idle</Text>;\n\t}\n}\n\nfunction Tunnel({ status, spinner }: { status: DevStatus; spinner: string }) {\n\tconst paint = useColor();\n\tswitch (status.tunnel) {\n\t\tcase 'starting':\n\t\t\treturn <Text dimColor>{`${spinner} tunnel`}</Text>;\n\t\tcase 'up':\n\t\t\treturn <Text color={paint('green')}>{status.tunnelUrl ?? 'tunnel up'}</Text>;\n\t\tcase 'failed':\n\t\t\treturn <Text color={paint('red')}>tunnel failed</Text>;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nfunction Summary({ counters }: { counters: LogCounters }) {\n\tconst paint = useColor();\n\tif (counters.warnings === 0 && counters.errors === 0) return null;\n\n\treturn (\n\t\t<Box gap={2}>\n\t\t\t{counters.warnings > 0 && <Text color={paint('yellow')}>{`⚠ ${counters.warnings} ${plural(counters.warnings, 'warning')}`}</Text>}\n\t\t\t{counters.errors > 0 && <Text bold color={paint('red')}>{`✖ ${counters.errors} ${plural(counters.errors, 'error')}`}</Text>}\n\t\t</Box>\n\t);\n}\n\nfunction StatusRow({ badge, note }: { badge: Badge; note: string }) {\n\tconst paint = useColor();\n\treturn (\n\t\t<Box gap={1}>\n\t\t\t<Text backgroundColor={paint(BADGE_COLOR[badge])} color={paint('black')} bold>\n\t\t\t\t{` ${badge.toUpperCase()} `}\n\t\t\t</Text>\n\t\t\t<Text dimColor>{note}</Text>\n\t\t</Box>\n\t);\n}\n\nfunction Hints({ errors, narrow }: { errors: number; narrow: boolean }) {\n\tconst paint = useColor();\n\tconst hints = [...(errors > 0 ? [{ key: 'e', label: 'last error' }] : []), ...DEFAULT_HINTS];\n\tconst shown = narrow ? hints.slice(0, 2) : hints;\n\n\treturn (\n\t\t<Box gap={narrow ? 1 : 2}>\n\t\t\t{shown.map(({ key, label }) => (\n\t\t\t\t<Text key={key}>\n\t\t\t\t\t<Text bold color={paint('white')}>\n\t\t\t\t\t\t{key}\n\t\t\t\t\t</Text>{' '}\n\t\t\t\t\t<Text dimColor>{label}</Text>\n\t\t\t\t</Text>\n\t\t\t))}\n\t\t</Box>\n\t);\n}\n\nfunction plural(count: number, word: string): string {\n\treturn count === 1 ? word : `${word}s`;\n}\n","import { useEffect, useState } from 'react';\nimport type { DevService, DevStatus } from '../../../lib/dev-service.js';\n\n/**\n * Mirrors the service's status into React state. The service stays the single source of truth: the UI only\n * subscribes to it, exactly like the plain renderer does.\n */\nexport function useDevStatus(service: DevService): DevStatus {\n\tconst [status, setStatus] = useState<DevStatus>(() => service.status);\n\n\tuseEffect(() => {\n\t\tconst onStatus = (next: DevStatus) => setStatus(next);\n\t\tservice.on('status', onStatus);\n\t\tsetStatus(service.status);\n\t\treturn () => {\n\t\t\tservice.off('status', onStatus);\n\t\t};\n\t}, [service]);\n\n\treturn status;\n}\n","import { useEffect, useState } from 'react';\nimport type { DevService, DevStatus } from '../../../lib/dev-service.js';\nimport type { LogEntry } from '../../../lib/log-buffer.js';\n\nexport interface LogCounters {\n\twarnings: number;\n\terrors: number;\n}\n\n/**\n * Warnings and errors logged since the last successful build, the way Nuxt CLI v4's own panel counts them: the\n * badge's job is the current state, this line is what happened getting there.\n */\nexport function useLogCounters(service: DevService): LogCounters {\n\tconst [counters, setCounters] = useState<LogCounters>({ warnings: 0, errors: 0 });\n\n\tuseEffect(() => {\n\t\tlet previousBuild: DevStatus['build'] = service.status.build;\n\n\t\tconst onEntry = (entry: LogEntry) => {\n\t\t\tif (entry.level === 'warn') setCounters((current) => ({ ...current, warnings: current.warnings + 1 }));\n\t\t\telse if (entry.level === 'error') setCounters((current) => ({ ...current, errors: current.errors + 1 }));\n\t\t};\n\n\t\tconst onStatus = (status: DevStatus) => {\n\t\t\tif (status.build === 'ok' && previousBuild !== 'ok') setCounters({ warnings: 0, errors: 0 });\n\t\t\tpreviousBuild = status.build;\n\t\t};\n\n\t\tservice.logs.on('entry', onEntry);\n\t\tservice.on('status', onStatus);\n\t\treturn () => {\n\t\t\tservice.logs.off('entry', onEntry);\n\t\t\tservice.off('status', onStatus);\n\t\t};\n\t}, [service]);\n\n\treturn counters;\n}\n","import { useEffect, useState } from 'react';\n\nconst FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] as const;\nconst STILL = '•';\n\n/**\n * A spinner frame for whatever is in flight (a build, a tunnel coming up). `STARS_REDUCED_MOTION=1` and non-TTY\n * output freeze it on a static character instead.\n */\nexport function useSpinner(active: boolean, reducedMotion: boolean): string {\n\tconst [frame, setFrame] = useState(0);\n\n\tuseEffect(() => {\n\t\tif (!active || reducedMotion) return;\n\n\t\tconst timer = setInterval(() => setFrame((current) => (current + 1) % FRAMES.length), 80);\n\t\treturn () => clearInterval(timer);\n\t}, [active, reducedMotion]);\n\n\tif (!active) return ' ';\n\treturn reducedMotion ? STILL : FRAMES[frame % FRAMES.length]!;\n}\n","import { useEffect, useState } from 'react';\nimport type { DevService } from '../../../lib/dev-service.js';\nimport type { LogEntry } from '../../../lib/log-buffer.js';\n\n/**\n * The append-only stream `<Static>` prints once and never revisits, so a session's output becomes real terminal\n * scrollback exactly like plain mode's — the panel below stays a handful of lines, the way Nuxt CLI v4's own dev\n * server never mixes its log stream into the panel it pins.\n */\nexport function useStaticLog(service: DevService): LogEntry[] {\n\tconst [entries, setEntries] = useState<LogEntry[]>(() => service.logs.entries().slice());\n\n\tuseEffect(() => {\n\t\tconst onEntry = (entry: LogEntry) => setEntries((current) => [...current, entry]);\n\t\tservice.logs.on('entry', onEntry);\n\t\treturn () => {\n\t\t\tservice.logs.off('entry', onEntry);\n\t\t};\n\t}, [service]);\n\n\treturn entries;\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Re-renders once a second while the bot is up, so the uptime in the header keeps counting.\n */\nexport function useUptime(startedAt: number | null): number | null {\n\tconst [now, setNow] = useState(() => Date.now());\n\n\tuseEffect(() => {\n\t\tif (startedAt === null) return;\n\n\t\tsetNow(Date.now());\n\t\tconst timer = setInterval(() => setNow(Date.now()), 1000);\n\t\treturn () => clearInterval(timer);\n\t}, [startedAt]);\n\n\treturn startedAt === null ? null : now - startedAt;\n}\n","import { Box, Static, useApp, useInput, useWindowSize } from 'ink';\nimport { useState } from 'react';\nimport type { DevService } from '../../lib/dev-service.js';\nimport { HelpOverlay } from './components/HelpOverlay.js';\nimport { LogBrowser } from './components/LogBrowser.js';\nimport { LogLine } from './components/LogLine.js';\nimport { Panel } from './components/Panel.js';\nimport { useDevStatus } from './hooks/useDevStatus.js';\nimport { useLogCounters } from './hooks/useLogCounters.js';\nimport { useSpinner } from './hooks/useSpinner.js';\nimport { useStaticLog } from './hooks/useStaticLog.js';\nimport { useUptime } from './hooks/useUptime.js';\nimport { ColorProvider } from './theme.js';\n\nexport interface DevAppProps {\n\tservice: DevService;\n\tcolor: boolean;\n\treducedMotion: boolean;\n\t/** Called when the user asks to quit, so the CLI can stop the bot and exit. */\n\tonQuit: () => void;\n}\n\ntype View = 'panel' | 'logs' | 'help';\n\n/**\n * The interactive `stars dev` UI, in the style of Nuxt CLI v4's own dev server: log output streams into the\n * terminal's real scrollback through `<Static>` (never re-rendered, never reformatted), and a compact panel below\n * it — a handful of lines, redrawn as state changes — carries the status Nuxt's own summary/hints blocks show.\n * `l` opens the full, filterable log history and `?` the key reference, both replacing the panel until closed.\n */\nexport function DevApp({ service, color, reducedMotion, onQuit }: DevAppProps) {\n\tconst { exit } = useApp();\n\tconst { columns, rows } = useWindowSize();\n\tconst [view, setView] = useState<View>('panel');\n\n\tconst status = useDevStatus(service);\n\tconst uptime = useUptime(status.startedAt);\n\tconst counters = useLogCounters(service);\n\tconst entries = useStaticLog(service);\n\tconst spinning = status.build === 'building' || status.process === 'starting' || status.tunnel === 'starting' || status.typecheck === 'checking';\n\tconst spinner = useSpinner(spinning, reducedMotion);\n\n\tconst width = Math.max(20, columns);\n\tconst height = Math.max(6, rows);\n\tconst narrow = width < 60;\n\n\tconst quit = () => {\n\t\tonQuit();\n\t\texit();\n\t};\n\n\tuseInput((input, key) => {\n\t\tif (view !== 'panel') return;\n\t\tif (key.ctrl && input === 'c') return quit();\n\n\t\tswitch (input) {\n\t\t\tcase 'q':\n\t\t\t\treturn quit();\n\t\t\tcase 'r':\n\t\t\t\treturn void service.restart('manual');\n\t\t\tcase 'l':\n\t\t\t\treturn setView('logs');\n\t\t\tcase '?':\n\t\t\t\treturn setView('help');\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\treturn (\n\t\t<ColorProvider color={color}>\n\t\t\t<Static items={entries}>{(entry) => <LogLine key={entry.id} entry={entry} />}</Static>\n\t\t\t<Box width={width} flexDirection=\"column\">\n\t\t\t\t{view === 'logs' && <LogBrowser service={service} height={height} onClose={() => setView('panel')} />}\n\t\t\t\t{view === 'help' && <HelpOverlay height={height} onClose={() => setView('panel')} />}\n\t\t\t\t{view === 'panel' && (\n\t\t\t\t\t<Panel\n\t\t\t\t\t\tname={service.config.packageJson?.name ?? 'stars project'}\n\t\t\t\t\t\tstatus={status}\n\t\t\t\t\t\tconfig={service.config}\n\t\t\t\t\t\tuptimeMs={uptime}\n\t\t\t\t\t\tcounters={counters}\n\t\t\t\t\t\tspinner={spinner}\n\t\t\t\t\t\tnarrow={narrow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Box>\n\t\t</ColorProvider>\n\t);\n}\n","import { render } from 'ink';\nimport type { DevService } from '../lib/dev-service.js';\nimport { DevApp } from './ink/DevApp.js';\nimport type { Renderer } from './plain.js';\n\nexport interface TuiRendererOptions {\n\tstdout?: NodeJS.WriteStream;\n\tstdin?: NodeJS.ReadStream;\n\tcolor?: boolean;\n\t/** Freezes spinners, for `STARS_REDUCED_MOTION=1`. */\n\treducedMotion?: boolean;\n\t/** Caps how often Ink repaints; the default is Ink's own. */\n\tfps?: number;\n}\n\n/**\n * The interactive renderer: an Ink (React) application whose log stream commits straight to the terminal's normal\n * scrollback (see `DevApp`'s use of `<Static>`), with a small pinned panel below it. Unlike a full-screen app, it\n * never touches the alternate screen buffer, so the session's output survives in the user's own terminal history.\n *\n * `start()` resolves when the user quits, which is what `stars dev` waits on before shutting the bot down.\n */\nexport function createTuiRenderer(service: DevService, options: TuiRendererOptions = {}): Renderer {\n\tconst stdout = options.stdout ?? process.stdout;\n\tconst stdin = options.stdin ?? process.stdin;\n\n\tlet quit!: () => void;\n\tconst quitting = new Promise<void>((resolve) => {\n\t\tquit = resolve;\n\t});\n\n\tconst instance = render(\n\t\t<DevApp service={service} color={options.color ?? false} reducedMotion={options.reducedMotion ?? false} onQuit={quit} />,\n\t\t{\n\t\t\tstdout,\n\t\t\tstdin,\n\t\t\t// `stars dev` owns the shutdown: it stops the bot, then exits with the right code.\n\t\t\texitOnCtrlC: false,\n\t\t\tpatchConsole: false,\n\t\t\t// `createTuiRenderer` only runs once `resolveOutputMode()` already picked 'tui' (never in CI or on a\n\t\t\t// non-TTY stdout), so Ink is told to trust that instead of re-deriving it from `process.env.CI`: on a\n\t\t\t// CI runner that env var is set even for this package's own test process, which would otherwise force\n\t\t\t// Ink's non-interactive mode (no repaint until unmount) despite the fake stdin/stdout looking like a\n\t\t\t// real TTY.\n\t\t\tinteractive: true,\n\t\t\t...(options.fps === undefined ? {} : { maxFps: options.fps })\n\t\t}\n\t);\n\n\treturn {\n\t\tasync start() {\n\t\t\tawait Promise.race([quitting, instance.waitUntilExit()]);\n\t\t},\n\t\tstop() {\n\t\t\tinstance.unmount();\n\t\t}\n\t};\n}\n\nexport { formatDuration } from './panel-logic.js';\n"],"mappings":"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"}