Files
gstack/hosts/factory.ts
T
Garry TanandClaude Fable 5 408ee77cde refactor(hosts): defineHost() factory — 10 copy-paste host files become declarations
hosts/*.ts were ten copies of one file: runtimeRoot byte-identical in 9/10,
pathRewrites mechanically derivable from the host name for 7/10, the 11-entry
toolRewrites map byte-identical between openclaw and gbrain, and every asset
change a 10-file edit (cursor and slate had already fallen out of three other
hand-maintained lists). defineHost() owns the defaults; each host file now
declares only what makes it different (slate/cursor: 8 lines each). Shared
constants: CROSS_MODEL_RESOLVERS, GBRAIN_RESOLVERS, EXEC_STYLE_TOOL_REWRITES.
Genuinely-different things stayed explicit: codex/factory $GSTACK_ROOT
rewrites, hermes's tool vocabulary, claude's denylist+prefixable install,
opencode's wider runtimeRoot.

Proof: JSON.stringify(ALL_HOST_CONFIGS) dump-diff before/after EMPTY (and a
runtime walk confirmed no function-valued or undefined-keyed fields, so the
JSON diff is complete); gen:skill-docs --host all zero-diff; host-config +
gen-skill-docs + idempotency suites 485/485. Host files 595 -> 285 lines.
docs/ADDING_A_HOST.md teaches the factory pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 21:12:21 -07:00

44 lines
1.3 KiB
TypeScript

import { defineHost } from './define-host';
const factory = defineHost({
name: 'factory',
displayName: 'Factory Droid',
cliCommand: 'droid',
cliAliases: ['droid'],
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description', 'user-invocable'],
descriptionLimit: null,
extraFields: {
'user-invocable': true,
},
conditionalFields: [
{ if: { sensitive: true }, add: { 'disable-model-invocation': true } },
],
},
// Non-mechanical rewrites: the global path becomes $GSTACK_ROOT (resolved by
// the preamble env vars), plus an extra review-path rewrite the derived trio
// doesn't cover.
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '$GSTACK_ROOT' },
{ from: '.claude/skills/gstack', to: '.factory/skills/gstack' },
{ from: '.claude/skills/review', to: '.factory/skills/gstack/review' },
{ from: '.claude/skills', to: '.factory/skills' },
],
toolRewrites: {
'use the Bash tool': 'run this command',
'use the Write tool': 'create this file',
'use the Read tool': 'read the file',
'use the Agent tool': 'dispatch a subagent',
'use the Grep tool': 'search for',
'use the Glob tool': 'find files matching',
},
coAuthorTrailer: 'Co-Authored-By: Factory Droid <droid@users.noreply.github.com>',
learningsMode: 'full',
});
export default factory;