mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-09-30 20:49:41 +02:00
Gemini (PR #134) blockers: - runGemini() now unwraps the {success,data} envelope: status check reads .data.available, quick-start reads data.data.sessionId (was reading the raw shape, so the Run-Gemini button could never start a session). - setGeminiEnvVars() now uses the socket-scoped ${this.tmux()} setenv instead of bare tmux — Gemini/Google auth env vars were targeting the wrong tmux server and silently failing on every install. Gemini parity polish: - gemini tab-mode badge ('gm') + .tab-mode.gemini CSS; kill-dialog label 'Kill Tmux & Gemini'; codeman doctor dependency-registry entry; export isGeminiAvailable from utils barrel; COLORTERM=truecolor + unset NO_COLOR; add gemini to isAltScreenStripMode (Ink TUI, repaints inline like Codex/Claude). - Revert 4 system-routes.test.ts envelope assertions weakened to (body.message ?? body.error) back to (body.success === false). - Add a runGemini() vm-sandbox test that drives the envelope path end-to-end. Ralph todo-config (PR #135): maxTodos/todoExpirationMinutes are now persisted and read back — surfaced via the loopState getter (RalphTrackerState) into toState()/SSE broadcast and restored in restoreState(), mirroring maxIterations. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
149 lines
4.6 KiB
TypeScript
149 lines
4.6 KiB
TypeScript
/**
|
|
* @fileoverview Static registry of downstream tool dependencies probed by
|
|
* `codeman doctor`. Each entry declares per-environment resolvers and the
|
|
* skills that use it. EXTENSION POINT: skill-manifest-driven discovery
|
|
* (COD follow-up) will merge dynamically-found entries into this list.
|
|
*
|
|
* @module config/dependency-registry
|
|
*/
|
|
|
|
export type ProbeEnvironment = 'linux' | 'darwin' | 'win32' | 'wsl';
|
|
|
|
/** The valid `--category` filter values; single source of truth for the type, the CLI
|
|
* help text, and CLI input validation. */
|
|
export const TOOL_CATEGORIES = ['core', 'office', 'other'] as const;
|
|
export type ToolCategory = (typeof TOOL_CATEGORIES)[number];
|
|
|
|
/** Resolve a binary on the PATH and read its version. */
|
|
export interface PathResolver {
|
|
kind: 'path';
|
|
bins: string[];
|
|
versionArg?: string; // default '--version'
|
|
versionRegex?: RegExp; // default matches first \d+.\d+(.\d+)?
|
|
}
|
|
|
|
/** Resolve a Windows-installed app reachable from win32 or WSL. */
|
|
export interface WindowsSideResolver {
|
|
kind: 'windows-side';
|
|
appDirs: string[]; // relative to a Program Files root
|
|
exes: string[]; // candidate executables; first found wins
|
|
}
|
|
|
|
export interface ResolverSpec {
|
|
match: ProbeEnvironment[];
|
|
resolver: PathResolver | WindowsSideResolver;
|
|
}
|
|
|
|
export interface ToolDependency {
|
|
id: string;
|
|
label: string;
|
|
category: ToolCategory;
|
|
required: boolean;
|
|
usedBy?: string[];
|
|
minVersion?: string;
|
|
resolvers: ResolverSpec[];
|
|
installHint?: Partial<Record<ProbeEnvironment, string>>;
|
|
}
|
|
|
|
const ALL: ProbeEnvironment[] = ['linux', 'darwin', 'wsl', 'win32'];
|
|
|
|
export const DEPENDENCY_REGISTRY: ToolDependency[] = [
|
|
{
|
|
id: 'node',
|
|
label: 'Node.js',
|
|
category: 'core',
|
|
required: true,
|
|
minVersion: '22.0.0',
|
|
resolvers: [{ match: ALL, resolver: { kind: 'path', bins: ['node'], versionArg: '--version' } }],
|
|
installHint: { linux: 'https://nodejs.org', darwin: 'brew install node', wsl: 'https://nodejs.org' },
|
|
},
|
|
{
|
|
id: 'claude',
|
|
label: 'Claude CLI',
|
|
category: 'core',
|
|
required: false,
|
|
usedBy: ['Claude Code sessions (default backend)'],
|
|
resolvers: [{ match: ALL, resolver: { kind: 'path', bins: ['claude'], versionArg: '--version' } }],
|
|
installHint: { linux: 'https://docs.claude.com/claude-code', darwin: 'https://docs.claude.com/claude-code' },
|
|
},
|
|
{
|
|
id: 'tmux',
|
|
label: 'tmux',
|
|
category: 'core',
|
|
required: true,
|
|
resolvers: [{ match: ['linux', 'darwin', 'wsl'], resolver: { kind: 'path', bins: ['tmux'], versionArg: '-V' } }],
|
|
installHint: { linux: 'sudo apt install tmux', darwin: 'brew install tmux', wsl: 'sudo apt install tmux' },
|
|
},
|
|
{
|
|
id: 'opencode',
|
|
label: 'OpenCode CLI',
|
|
category: 'core',
|
|
required: false,
|
|
usedBy: ['OpenCode sessions'],
|
|
resolvers: [{ match: ALL, resolver: { kind: 'path', bins: ['opencode'], versionArg: '--version' } }],
|
|
},
|
|
{
|
|
id: 'codex',
|
|
label: 'Codex CLI',
|
|
category: 'core',
|
|
required: false,
|
|
usedBy: ['Codex sessions'],
|
|
resolvers: [{ match: ALL, resolver: { kind: 'path', bins: ['codex'], versionArg: '--version' } }],
|
|
},
|
|
{
|
|
id: 'gemini',
|
|
label: 'Gemini CLI',
|
|
category: 'core',
|
|
required: false,
|
|
usedBy: ['Gemini sessions'],
|
|
resolvers: [{ match: ALL, resolver: { kind: 'path', bins: ['gemini'], versionArg: '--version' } }],
|
|
},
|
|
{
|
|
id: 'libreoffice',
|
|
label: 'LibreOffice',
|
|
category: 'office',
|
|
required: false,
|
|
usedBy: ['document preview', 'thumbnails'],
|
|
resolvers: [
|
|
{
|
|
match: ['linux', 'darwin', 'wsl'],
|
|
resolver: { kind: 'path', bins: ['libreoffice', 'soffice'], versionArg: '--version' },
|
|
},
|
|
],
|
|
installHint: { linux: 'sudo apt install libreoffice', darwin: 'brew install --cask libreoffice' },
|
|
},
|
|
{
|
|
id: 'pdftoppm',
|
|
label: 'pdftoppm',
|
|
category: 'office',
|
|
required: false,
|
|
usedBy: ['document preview', 'PDF/Office first-page thumbnails'],
|
|
// poppler's pdftoppm prints its version to stderr; presence is what matters here.
|
|
resolvers: [
|
|
{ match: ['linux', 'darwin', 'wsl'], resolver: { kind: 'path', bins: ['pdftoppm'], versionArg: '-v' } },
|
|
],
|
|
installHint: {
|
|
linux: 'sudo apt install poppler-utils',
|
|
darwin: 'brew install poppler',
|
|
wsl: 'sudo apt install poppler-utils',
|
|
},
|
|
},
|
|
{
|
|
id: 'msoffice',
|
|
label: 'MS Office',
|
|
category: 'office',
|
|
required: false,
|
|
usedBy: ['document preview', 'thumbnails'],
|
|
resolvers: [
|
|
{
|
|
match: ['wsl', 'win32'],
|
|
resolver: {
|
|
kind: 'windows-side',
|
|
appDirs: ['Microsoft Office/root/Office16'],
|
|
exes: ['WINWORD.EXE', 'POWERPNT.EXE', 'EXCEL.EXE'],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
];
|