From 807926b3200a7dd77c1f451143f206d2702344de Mon Sep 17 00:00:00 2001 From: suryakandukuri Date: Tue, 19 May 2026 08:34:53 +0530 Subject: [PATCH 1/3] feat: add Copilot host configuration and update .gitignore --- .gitignore | 1 + hosts/copilot.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 hosts/copilot.ts diff --git a/.gitignore b/.gitignore index 9e413bc56b..6b8d554b19 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ bin/gstack-global-discover .opencode/ .slate/ .cursor/ +.copilot/ .openclaw/ .hermes/ .gbrain/ diff --git a/hosts/copilot.ts b/hosts/copilot.ts new file mode 100644 index 0000000000..3366fb0dbe --- /dev/null +++ b/hosts/copilot.ts @@ -0,0 +1,46 @@ +import type { HostConfig } from '../scripts/host-config'; + +const copilot: HostConfig = { + name: 'copilot', + displayName: 'GitHub Copilot', + cliCommand: 'copilot', + cliAliases: ['gh-copilot', 'copilot-cli'], + + globalRoot: '.copilot/skills/gstack', + localSkillRoot: '.copilot/skills/gstack', + hostSubdir: '.copilot', + usesEnvVars: true, + + frontmatter: { + mode: 'allowlist', + keepFields: ['name', 'description', 'triggers', 'platforms'], + descriptionLimit: 1024, + descriptionLimitBehavior: 'truncate', + }, + + generation: { + generateMetadata: false, + metadataFormat: null, + skipSkills: ['codex'], + }, + + pathRewrites: [ + { from: '~/.claude/skills/gstack', to: '~/.copilot/skills/gstack' }, + { from: '.claude/skills/gstack', to: '.copilot/skills/gstack' }, + { from: '.claude/skills', to: '.copilot/skills' }, + ], + + 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 copilot; From ceb8d1f72851680ba44c119c3f658d165cd811ee Mon Sep 17 00:00:00 2001 From: suryakandukuri Date: Tue, 19 May 2026 08:35:51 +0530 Subject: [PATCH 2/3] feat: add GitHub Copilot support and update related configurations --- .gitignore | 1 + README.md | 3 ++- hosts/index.ts | 5 +++-- test/host-config.test.ts | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 6b8d554b19..ec83ebfe7b 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ extension/lib/xterm-addon-fit.js .env.* !.env.example supabase/.temp/ +.copilot/ # Throughput analysis — local-only, regenerate via scripts/garry-output-comparison.ts docs/throughput-*.json diff --git a/README.md b/README.md index d89b8d9981..30e323ac43 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ These are conversational skills. Your OpenClaw agent runs them directly via chat ### Other AI Agents -gstack works on 10 AI coding agents, not just Claude. Setup auto-detects which +gstack works on 11 AI coding agents, not just Claude. Setup auto-detects which agents you have installed: ```bash @@ -120,6 +120,7 @@ Or target a specific agent with `./setup --host `: | Slate | `--host slate` | `~/.slate/skills/gstack-*/` | | Kiro | `--host kiro` | `~/.kiro/skills/gstack-*/` | | Hermes | `--host hermes` | `~/.hermes/skills/gstack-*/` | +| GitHub Copilot | `--host copilot` | `~/.copilot/skills/gstack-*/` | | GBrain (mod) | `--host gbrain` | `~/.gbrain/skills/gstack-*/` | **Want to add support for another agent?** See [docs/ADDING_A_HOST.md](docs/ADDING_A_HOST.md). diff --git a/hosts/index.ts b/hosts/index.ts index cc1c213b53..0cb763fb20 100644 --- a/hosts/index.ts +++ b/hosts/index.ts @@ -16,9 +16,10 @@ import cursor from './cursor'; import openclaw from './openclaw'; import hermes from './hermes'; import gbrain from './gbrain'; +import copilot from './copilot'; /** All registered host configs. Add new hosts here. */ -export const ALL_HOST_CONFIGS: HostConfig[] = [claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain]; +export const ALL_HOST_CONFIGS: HostConfig[] = [claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain, copilot]; /** Map from host name to config. */ export const HOST_CONFIG_MAP: Record = Object.fromEntries( @@ -65,4 +66,4 @@ export function getExternalHosts(): HostConfig[] { } // Re-export individual configs for direct import -export { claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain }; +export { claude, codex, factory, kiro, opencode, slate, cursor, openclaw, hermes, gbrain, copilot }; diff --git a/test/host-config.test.ts b/test/host-config.test.ts index 5770570332..0a25c0fde3 100644 --- a/test/host-config.test.ts +++ b/test/host-config.test.ts @@ -31,7 +31,7 @@ const ROOT = path.resolve(import.meta.dir, '..'); describe('hosts/index.ts', () => { test('ALL_HOST_CONFIGS has 10 hosts', () => { - expect(ALL_HOST_CONFIGS.length).toBe(10); + expect(ALL_HOST_CONFIGS.length).toBe(11); }); test('ALL_HOST_NAMES matches config names', () => { From 080db22ccf517b583b0d7db46d183e9437e17337 Mon Sep 17 00:00:00 2001 From: suryakandukuri Date: Tue, 19 May 2026 08:37:42 +0530 Subject: [PATCH 3/3] keep .copilot only once --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ec83ebfe7b..31214118d9 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ bin/gstack-global-discover .opencode/ .slate/ .cursor/ -.copilot/ .openclaw/ .hermes/ .gbrain/