diff --git a/scripts/resolvers/types.ts b/scripts/resolvers/types.ts index 785f5a3a..48204c91 100644 --- a/scripts/resolvers/types.ts +++ b/scripts/resolvers/types.ts @@ -1,4 +1,11 @@ -export type Host = 'claude' | 'codex' | 'factory'; +import { ALL_HOST_CONFIGS } from '../../hosts/index'; + +/** + * Host type — derived from host configs in hosts/*.ts. + * Adding a new host: create hosts/myhost.ts + add to hosts/index.ts. + * Do NOT hardcode host names here. + */ +export type Host = (typeof ALL_HOST_CONFIGS)[number]['name']; export interface HostPaths { skillRoot: string; @@ -8,29 +15,37 @@ export interface HostPaths { designDir: string; } -export const HOST_PATHS: Record = { - claude: { - skillRoot: '~/.claude/skills/gstack', - localSkillRoot: '.claude/skills/gstack', - binDir: '~/.claude/skills/gstack/bin', - browseDir: '~/.claude/skills/gstack/browse/dist', - designDir: '~/.claude/skills/gstack/design/dist', - }, - codex: { - skillRoot: '$GSTACK_ROOT', - localSkillRoot: '.agents/skills/gstack', - binDir: '$GSTACK_BIN', - browseDir: '$GSTACK_BROWSE', - designDir: '$GSTACK_DESIGN', - }, - factory: { - skillRoot: '$GSTACK_ROOT', - localSkillRoot: '.factory/skills/gstack', - binDir: '$GSTACK_BIN', - browseDir: '$GSTACK_BROWSE', - designDir: '$GSTACK_DESIGN', - }, -}; +/** + * HOST_PATHS — derived from host configs. + * Each config's globalRoot/localSkillRoot determines the path structure. + * Non-Claude hosts use $GSTACK_ROOT env vars (set by preamble). + */ +function buildHostPaths(): Record { + const paths: Record = {}; + for (const config of ALL_HOST_CONFIGS) { + if (config.usesEnvVars) { + paths[config.name] = { + skillRoot: '$GSTACK_ROOT', + localSkillRoot: config.localSkillRoot, + binDir: '$GSTACK_BIN', + browseDir: '$GSTACK_BROWSE', + designDir: '$GSTACK_DESIGN', + }; + } else { + const root = `~/${config.globalRoot}`; + paths[config.name] = { + skillRoot: root, + localSkillRoot: config.localSkillRoot, + binDir: `${root}/bin`, + browseDir: `${root}/browse/dist`, + designDir: `${root}/design/dist`, + }; + } + } + return paths; +} + +export const HOST_PATHS: Record = buildHostPaths(); export interface TemplateContext { skillName: string;