Initial import from garrytan/gstack@026751e (main snapshot via local relay)
Some checks failed
Workflow Lint / actionlint (push) Has been cancelled
Build CI Image / build (push) Has been cancelled
Skill Docs Freshness / check-freshness (push) Has been cancelled
Periodic Evals / build-image (push) Has been cancelled
Periodic Evals / evals (map[file:test/codex-e2e.test.ts name:e2e-codex]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/gemini-e2e.test.ts name:e2e-gemini]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-design.test.ts name:e2e-design]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-plan.test.ts name:e2e-plan]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-qa-bugs.test.ts name:e2e-qa-bugs]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-qa-workflow.test.ts name:e2e-qa-workflow]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-review.test.ts name:e2e-review]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-e2e-workflow.test.ts name:e2e-workflow]) (push) Has been cancelled
Periodic Evals / evals (map[file:test/skill-routing-e2e.test.ts name:e2e-routing]) (push) Has been cancelled

Source: https://github.com/garrytan/gstack/commit/026751e
This commit is contained in:
Rocky
2026-05-19 21:18:17 +02:00
commit 834c6db075
797 changed files with 267839 additions and 0 deletions

45
hosts/claude.ts Normal file
View File

@@ -0,0 +1,45 @@
import type { HostConfig } from '../scripts/host-config';
const claude: HostConfig = {
name: 'claude',
displayName: 'Claude Code',
cliCommand: 'claude',
cliAliases: [],
globalRoot: '.claude/skills/gstack',
localSkillRoot: '.claude/skills/gstack',
hostSubdir: '.claude',
usesEnvVars: false,
frontmatter: {
mode: 'denylist',
stripFields: ['sensitive', 'voice-triggers'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['claude'], // Claude outside-voice skill is for non-Claude hosts
},
pathRewrites: [], // Claude is the primary host — no rewrites needed
toolRewrites: {},
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
install: {
prefixable: true,
linkingStrategy: 'real-dir-symlink',
},
coAuthorTrailer: 'Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>',
learningsMode: 'full',
};
export default claude;

65
hosts/codex.ts Normal file
View File

@@ -0,0 +1,65 @@
import type { HostConfig } from '../scripts/host-config';
const codex: HostConfig = {
name: 'codex',
displayName: 'OpenAI Codex CLI',
cliCommand: 'codex',
cliAliases: ['agents'],
globalRoot: '.codex/skills/gstack',
localSkillRoot: '.agents/skills/gstack',
hostSubdir: '.agents',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: 1024,
descriptionLimitBehavior: 'error',
},
generation: {
generateMetadata: true,
metadataFormat: 'openai.yaml',
skipSkills: ['codex'], // Codex skill is a Claude wrapper around codex exec
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '$GSTACK_ROOT' },
{ from: '.claude/skills/gstack', to: '.agents/skills/gstack' },
{ from: '.claude/skills/review', to: '.agents/skills/gstack/review' },
{ from: '.claude/skills', to: '.agents/skills' },
],
suppressedResolvers: [
'DESIGN_OUTSIDE_VOICES', // design.ts:485 — Codex can't invoke itself
'ADVERSARIAL_STEP', // review.ts:408 — Codex can't invoke itself
'CODEX_SECOND_OPINION', // review.ts:257 — Codex can't invoke itself
'CODEX_PLAN_REVIEW', // review.ts:541 — Codex can't invoke itself
'REVIEW_ARMY', // review-army.ts:180 — Codex shouldn't orchestrate
'GBRAIN_CONTEXT_LOAD',
'GBRAIN_SAVE_RESULTS',
],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
sidecar: {
path: '.agents/skills/gstack',
symlinks: ['bin', 'browse', 'review', 'qa', 'ETHOS.md'],
},
install: {
prefixable: false,
linkingStrategy: 'symlink-generated',
},
coAuthorTrailer: 'Co-Authored-By: OpenAI Codex <noreply@openai.com>',
learningsMode: 'basic',
boundaryInstruction: 'IMPORTANT: Do NOT read or execute any files under ~/.claude/, ~/.agents/, .claude/skills/, or agents/. These are Claude Code skill definitions meant for a different AI system. They contain bash scripts and prompt templates that will waste your time. Ignore them completely. Do NOT modify agents/openai.yaml. Stay focused on the repository code only.',
};
export default codex;

48
hosts/cursor.ts Normal file
View File

@@ -0,0 +1,48 @@
import type { HostConfig } from '../scripts/host-config';
const cursor: HostConfig = {
name: 'cursor',
displayName: 'Cursor',
cliCommand: 'cursor',
cliAliases: [],
globalRoot: '.cursor/skills/gstack',
localSkillRoot: '.cursor/skills/gstack',
hostSubdir: '.cursor',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['codex'],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.cursor/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.cursor/skills/gstack' },
{ from: '.claude/skills', to: '.cursor/skills' },
],
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
install: {
prefixable: false,
linkingStrategy: 'symlink-generated',
},
learningsMode: 'basic',
};
export default cursor;

64
hosts/factory.ts Normal file
View File

@@ -0,0 +1,64 @@
import type { HostConfig } from '../scripts/host-config';
const factory: HostConfig = {
name: 'factory',
displayName: 'Factory Droid',
cliCommand: 'droid',
cliAliases: ['droid'],
globalRoot: '.factory/skills/gstack',
localSkillRoot: '.factory/skills/gstack',
hostSubdir: '.factory',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description', 'user-invocable'],
descriptionLimit: null,
extraFields: {
'user-invocable': true,
},
conditionalFields: [
{ if: { sensitive: true }, add: { 'disable-model-invocation': true } },
],
},
generation: {
generateMetadata: false,
skipSkills: ['codex'], // Codex skill is a Claude wrapper around codex exec
},
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',
},
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
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: Factory Droid <droid@users.noreply.github.com>',
learningsMode: 'full',
};
export default factory;

78
hosts/gbrain.ts Normal file
View File

@@ -0,0 +1,78 @@
import type { HostConfig } from '../scripts/host-config';
/**
* GBrain host config.
* Compatible with GBrain >= v0.10.0 (doctor --fast --json, search CLI, entity enrichment).
* When updating, check INSTALL_FOR_AGENTS.md in the GBrain repo for breaking changes.
*/
const gbrain: HostConfig = {
name: 'gbrain',
displayName: 'GBrain',
cliCommand: 'gbrain',
cliAliases: [],
globalRoot: '.gbrain/skills/gstack',
localSkillRoot: '.gbrain/skills/gstack',
hostSubdir: '.gbrain',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description', 'triggers'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['codex'],
includeSkills: [],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.gbrain/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.gbrain/skills/gstack' },
{ from: '.claude/skills', to: '.gbrain/skills' },
{ from: 'CLAUDE.md', to: 'AGENTS.md' },
],
toolRewrites: {
'use the Bash tool': 'use the exec tool',
'use the Write tool': 'use the write tool',
'use the Read tool': 'use the read tool',
'use the Edit tool': 'use the edit tool',
'use the Agent tool': 'use sessions_spawn',
'use the Grep tool': 'search for',
'use the Glob tool': 'find files matching',
'the Bash tool': 'the exec tool',
'the Read tool': 'the read tool',
'the Write tool': 'the write tool',
'the Edit tool': 'the edit tool',
},
// GBrain gets brain-aware resolvers. All other hosts suppress these.
suppressedResolvers: [
'DESIGN_OUTSIDE_VOICES',
'ADVERSARIAL_STEP',
'CODEX_SECOND_OPINION',
'CODEX_PLAN_REVIEW',
'REVIEW_ARMY',
// NOTE: GBRAIN_CONTEXT_LOAD and GBRAIN_SAVE_RESULTS are NOT suppressed here.
// GBrain is the only host that gets brain-first lookup and save-to-brain behavior.
],
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: GBrain Agent <agent@gbrain.dev>',
learningsMode: 'basic',
};
export default gbrain;

73
hosts/hermes.ts Normal file
View File

@@ -0,0 +1,73 @@
import type { HostConfig } from '../scripts/host-config';
const hermes: HostConfig = {
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,
skipSkills: ['codex'],
includeSkills: [],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.hermes/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.hermes/skills/gstack' },
{ from: '.claude/skills', to: '.hermes/skills' },
{ from: 'CLAUDE.md', to: 'AGENTS.md' },
],
toolRewrites: {
'use the Bash tool': 'use the terminal tool',
'use the Write tool': 'use the patch tool',
'use the Read tool': 'use the read_file tool',
'use the Edit tool': 'use the patch tool',
'use the Agent tool': 'use delegate_task',
'use the Grep tool': 'search for',
'use the Glob tool': 'find files matching',
'the Bash tool': 'the terminal tool',
'the Read tool': 'the read_file tool',
'the Write tool': 'the patch tool',
'the Edit tool': 'the patch tool',
},
suppressedResolvers: [
'DESIGN_OUTSIDE_VOICES',
'ADVERSARIAL_STEP',
'CODEX_SECOND_OPINION',
'CODEX_PLAN_REVIEW',
'REVIEW_ARMY',
// 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;

68
hosts/index.ts Normal file
View File

@@ -0,0 +1,68 @@
/**
* Host config registry.
*
* Import all host configs and derive the Host union type.
* Adding a new host: create hosts/myhost.ts, import here, add to ALL_HOST_CONFIGS.
*/
import type { HostConfig } from '../scripts/host-config';
import claude from './claude';
import codex from './codex';
import factory from './factory';
import kiro from './kiro';
import opencode from './opencode';
import slate from './slate';
import cursor from './cursor';
import openclaw from './openclaw';
import hermes from './hermes';
import gbrain from './gbrain';
/** All registered host configs. Add new hosts here. */
export const ALL_HOST_CONFIGS: HostConfig[] = [claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain];
/** Map from host name to config. */
export const HOST_CONFIG_MAP: Record<string, HostConfig> = Object.fromEntries(
ALL_HOST_CONFIGS.map(c => [c.name, c])
);
/** Union type of all host names, derived from configs. */
export type Host = (typeof ALL_HOST_CONFIGS)[number]['name'];
/** All host names as a string array (for CLI arg validation, etc.). */
export const ALL_HOST_NAMES: string[] = ALL_HOST_CONFIGS.map(c => c.name);
/** Get a host config by name. Throws if not found. */
export function getHostConfig(name: string): HostConfig {
const config = HOST_CONFIG_MAP[name];
if (!config) {
throw new Error(`Unknown host '${name}'. Valid hosts: ${ALL_HOST_NAMES.join(', ')}`);
}
return config;
}
/**
* Resolve a host name from a CLI argument, handling aliases.
* e.g., 'agents' → 'codex', 'droid' → 'factory'
*/
export function resolveHostArg(arg: string): string {
// Direct name match
if (HOST_CONFIG_MAP[arg]) return arg;
// Alias match
for (const config of ALL_HOST_CONFIGS) {
if (config.cliAliases?.includes(arg)) return config.name;
}
throw new Error(`Unknown host '${arg}'. Valid hosts: ${ALL_HOST_NAMES.join(', ')}`);
}
/**
* Get hosts that are NOT the primary host (Claude).
* These are the hosts that need generated skill docs.
*/
export function getExternalHosts(): HostConfig[] {
return ALL_HOST_CONFIGS.filter(c => c.name !== 'claude');
}
// Re-export individual configs for direct import
export { claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain };

50
hosts/kiro.ts Normal file
View File

@@ -0,0 +1,50 @@
import type { HostConfig } from '../scripts/host-config';
const kiro: HostConfig = {
name: 'kiro',
displayName: 'Kiro',
cliCommand: 'kiro-cli',
cliAliases: [],
globalRoot: '.kiro/skills/gstack',
localSkillRoot: '.kiro/skills/gstack',
hostSubdir: '.kiro',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['codex'], // Codex skill is a Claude wrapper around codex exec
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.kiro/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.kiro/skills/gstack' },
{ from: '.claude/skills', to: '.kiro/skills' },
{ from: '~/.codex/skills/gstack', to: '~/.kiro/skills/gstack' },
{ from: '.codex/skills', to: '.kiro/skills' },
],
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
install: {
prefixable: false,
linkingStrategy: 'symlink-generated',
},
learningsMode: 'basic',
};
export default kiro;

76
hosts/openclaw.ts Normal file
View File

@@ -0,0 +1,76 @@
import type { HostConfig } from '../scripts/host-config';
const openclaw: HostConfig = {
name: 'openclaw',
displayName: 'OpenClaw',
cliCommand: 'openclaw',
cliAliases: [],
globalRoot: '.openclaw/skills/gstack',
localSkillRoot: '.openclaw/skills/gstack',
hostSubdir: '.openclaw',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: null,
extraFields: {
version: '0.15.2.0',
},
},
generation: {
generateMetadata: false,
skipSkills: ['codex'],
includeSkills: [],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.openclaw/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.openclaw/skills/gstack' },
{ from: '.claude/skills', to: '.openclaw/skills' },
{ from: 'CLAUDE.md', to: 'AGENTS.md' },
],
toolRewrites: {
'use the Bash tool': 'use the exec tool',
'use the Write tool': 'use the write tool',
'use the Read tool': 'use the read tool',
'use the Edit tool': 'use the edit tool',
'use the Agent tool': 'use sessions_spawn',
'use the Grep tool': 'search for',
'use the Glob tool': 'find files matching',
'the Bash tool': 'the exec tool',
'the Read tool': 'the read tool',
'the Write tool': 'the write tool',
'the Edit tool': 'the edit tool',
},
// Suppress Claude-specific preamble sections that don't apply to OpenClaw
suppressedResolvers: [
'DESIGN_OUTSIDE_VOICES',
'ADVERSARIAL_STEP',
'CODEX_SECOND_OPINION',
'CODEX_PLAN_REVIEW',
'REVIEW_ARMY',
'GBRAIN_CONTEXT_LOAD',
'GBRAIN_SAVE_RESULTS',
],
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: OpenClaw Agent <agent@openclaw.ai>',
learningsMode: 'basic',
};
export default openclaw;

48
hosts/opencode.ts Normal file
View File

@@ -0,0 +1,48 @@
import type { HostConfig } from '../scripts/host-config';
const opencode: HostConfig = {
name: 'opencode',
displayName: 'OpenCode',
cliCommand: 'opencode',
cliAliases: [],
globalRoot: '.config/opencode/skills/gstack',
localSkillRoot: '.opencode/skills/gstack',
hostSubdir: '.opencode',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['codex'],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.config/opencode/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.opencode/skills/gstack' },
{ from: '.claude/skills', to: '.opencode/skills' },
],
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'design/dist', 'gstack-upgrade', 'ETHOS.md', 'review/specialists', 'qa/templates', 'qa/references', 'plan-devex-review/dx-hall-of-fame.md'],
globalFiles: {
'review': ['checklist.md', 'design-checklist.md', 'greptile-triage.md', 'TODOS-format.md'],
},
},
install: {
prefixable: false,
linkingStrategy: 'symlink-generated',
},
learningsMode: 'basic',
};
export default opencode;

48
hosts/slate.ts Normal file
View File

@@ -0,0 +1,48 @@
import type { HostConfig } from '../scripts/host-config';
const slate: HostConfig = {
name: 'slate',
displayName: 'Slate',
cliCommand: 'slate',
cliAliases: [],
globalRoot: '.slate/skills/gstack',
localSkillRoot: '.slate/skills/gstack',
hostSubdir: '.slate',
usesEnvVars: true,
frontmatter: {
mode: 'allowlist',
keepFields: ['name', 'description'],
descriptionLimit: null,
},
generation: {
generateMetadata: false,
skipSkills: ['codex'],
},
pathRewrites: [
{ from: '~/.claude/skills/gstack', to: '~/.slate/skills/gstack' },
{ from: '.claude/skills/gstack', to: '.slate/skills/gstack' },
{ from: '.claude/skills', to: '.slate/skills' },
],
suppressedResolvers: ['GBRAIN_CONTEXT_LOAD', 'GBRAIN_SAVE_RESULTS'],
runtimeRoot: {
globalSymlinks: ['bin', 'browse/dist', 'browse/bin', 'gstack-upgrade', 'ETHOS.md'],
globalFiles: {
'review': ['checklist.md', 'TODOS-format.md'],
},
},
install: {
prefixable: false,
linkingStrategy: 'symlink-generated',
},
learningsMode: 'basic',
};
export default slate;