mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-11 07:29:00 +02:00
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>
This commit is contained in:
co-authored by
Claude Fable 5
parent
7c309f7817
commit
408ee77cde
+5
-38
@@ -1,21 +1,8 @@
|
||||
import type { HostConfig } from '../scripts/host-config';
|
||||
import { defineHost, CROSS_MODEL_RESOLVERS } from './define-host';
|
||||
|
||||
const hermes: HostConfig = {
|
||||
const hermes = defineHost({
|
||||
name: 'hermes',
|
||||
displayName: 'Hermes',
|
||||
cliCommand: 'hermes',
|
||||
cliAliases: [],
|
||||
|
||||
globalRoot: '.hermes/skills/gstack',
|
||||
localSkillRoot: '.hermes/skills/gstack',
|
||||
hostSubdir: '.hermes',
|
||||
usesEnvVars: true,
|
||||
|
||||
frontmatter: {
|
||||
mode: 'allowlist',
|
||||
keepFields: ['name', 'description'],
|
||||
descriptionLimit: null,
|
||||
},
|
||||
|
||||
generation: {
|
||||
generateMetadata: false,
|
||||
@@ -23,10 +10,7 @@ const hermes: HostConfig = {
|
||||
includeSkills: [],
|
||||
},
|
||||
|
||||
pathRewrites: [
|
||||
{ from: '~/.claude/skills/gstack', to: '~/.hermes/skills/gstack' },
|
||||
{ from: '.claude/skills/gstack', to: '.hermes/skills/gstack' },
|
||||
{ from: '.claude/skills', to: '.hermes/skills' },
|
||||
extraPathRewrites: [
|
||||
{ from: 'CLAUDE.md', to: 'AGENTS.md' },
|
||||
],
|
||||
toolRewrites: {
|
||||
@@ -44,30 +28,13 @@ const hermes: HostConfig = {
|
||||
},
|
||||
|
||||
suppressedResolvers: [
|
||||
'DESIGN_OUTSIDE_VOICES',
|
||||
'ADVERSARIAL_STEP',
|
||||
'CODEX_SECOND_OPINION',
|
||||
'CODEX_PLAN_REVIEW',
|
||||
'REVIEW_ARMY',
|
||||
...CROSS_MODEL_RESOLVERS,
|
||||
// GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS are NOT suppressed.
|
||||
// The resolvers handle GBrain-not-installed gracefully ("proceed without brain context").
|
||||
// If Hermes has GBrain as a mod, brain features activate automatically.
|
||||
],
|
||||
|
||||
runtimeRoot: {
|
||||
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
|
||||
globalFiles: {
|
||||
'review': ['checklist.md', 'TODOS-format.md'],
|
||||
},
|
||||
},
|
||||
|
||||
install: {
|
||||
prefixable: false,
|
||||
linkingStrategy: 'symlink-generated',
|
||||
},
|
||||
|
||||
coAuthorTrailer: 'Co-Authored-By: Hermes Agent <agent@nousresearch.com>',
|
||||
learningsMode: 'basic',
|
||||
};
|
||||
});
|
||||
|
||||
export default hermes;
|
||||
|
||||
Reference in New Issue
Block a user