Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ Works with **any CLI agent** — if it runs in a terminal, it runs in Orca.
<a href="https://openclaude.gitlawb.com/"><kbd><img src="resources/openclaude-logo.png" alt="OpenClaude logo" width="16" valign="middle" /> OpenClaude</kbd></a> &nbsp;
<a href="https://antigravity.google/docs/cli-overview"><kbd><img src="https://www.google.com/s2/favicons?domain=antigravity.google&sz=64" alt="Antigravity logo" width="16" valign="middle" /> Antigravity</kbd></a> &nbsp;
<a href="https://pi.dev"><kbd><img src="https://pi.dev/favicon.svg" alt="Pi logo" width="16" valign="middle" /> Pi</kbd></a> &nbsp;
<a href="https://gajae-code.com"><kbd><img src="https://www.google.com/s2/favicons?domain=gajae-code.com&sz=64" alt="Gajae Code logo" width="16" valign="middle" /> Gajae Code</kbd></a> &nbsp;
<a href="https://omp.sh"><kbd><img src="https://omp.sh/favicon.svg" alt="oh-my-pi logo" width="16" valign="middle" /> oh-my-pi</kbd></a> &nbsp;
<a href="https://hermes-agent.nousresearch.com/docs/"><kbd><img src="https://www.google.com/s2/favicons?domain=nousresearch.com&sz=64" alt="Hermes Agent logo" width="16" valign="middle" /> Hermes Agent</kbd></a> &nbsp;
<a href="https://devin.ai/cli"><kbd><img src="https://www.google.com/s2/favicons?domain=devin.ai&sz=64" alt="Devin logo" width="16" valign="middle" /> Devin</kbd></a> &nbsp;
Expand Down
1 change: 1 addition & 0 deletions config/scripts/locale-translation-policy.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export const NEVER_TRANSLATE_VALUES = new Set([
'Cursor',
'Droid',
'Devin',
'Gajae Code',
'Gemini',
'Git',
'Git Bash',
Expand Down
3 changes: 2 additions & 1 deletion mobile/src/components/mobile-agent-icon-assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@ export const MOBILE_AGENT_ICON_ASSETS: Partial<Record<TuiAgent, ImageSourcePropT
rovo: require('../../../src/shared/agent-icons/rovo.png'),
hermes: require('../../../src/shared/agent-icons/hermes.png'),
devin: require('../../../src/shared/agent-icons/devin.png'),
openclaw: require('../../../src/shared/agent-icons/openclaw.png')
openclaw: require('../../../src/shared/agent-icons/openclaw.png'),
gjc: require('../../../src/shared/agent-icons/gjc.png')
}
1 change: 1 addition & 0 deletions src/renderer/src/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@
"8a9ba743cc": "Hermes",
"4e63c7b956": "Rovo Dev",
"bee242fe3d": "Qwen Code",
"c851f042e2": "Gajae Code",
"ca73055bd0": "Mistral Vibe",
"28810273af": "Kimi",
"739a930554": "Droid",
Expand Down
1 change: 1 addition & 0 deletions src/renderer/src/i18n/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@
"8a9ba743cc": "Hermes",
"4e63c7b956": "Rovo Dev",
"bee242fe3d": "Qwen Code",
"c851f042e2": "Gajae Code",
"ca73055bd0": "Mistral Vibe",
"28810273af": "Kimi",
"739a930554": "Droid",
Expand Down
1 change: 1 addition & 0 deletions src/renderer/src/i18n/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@
"8a9ba743cc": "Hermes",
"4e63c7b956": "Rovo Dev",
"bee242fe3d": "Qwen Code",
"c851f042e2": "Gajae Code",
"ca73055bd0": "Mistral Vibe",
"28810273af": "Kimi",
"739a930554": "Droid",
Expand Down
1 change: 1 addition & 0 deletions src/renderer/src/i18n/locales/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@
"8a9ba743cc": "Hermes",
"4e63c7b956": "Rovo Dev",
"bee242fe3d": "Qwen Code",
"c851f042e2": "Gajae Code",
"ca73055bd0": "Mistral Vibe",
"28810273af": "Kimi",
"739a930554": "Droid",
Expand Down
1 change: 1 addition & 0 deletions src/renderer/src/i18n/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@
"8a9ba743cc": "Hermes",
"4e63c7b956": "Rovo Dev",
"bee242fe3d": "Qwen Code",
"c851f042e2": "Gajae Code",
"ca73055bd0": "Mistral Vibe",
"28810273af": "Kimi",
"739a930554": "Droid",
Expand Down
7 changes: 7 additions & 0 deletions src/renderer/src/lib/agent-catalog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,13 @@ export const getAgentCatalog = createLocalizedCatalog((): AgentCatalogEntry[] =>
faviconDomain: 'primeintellect.ai',
homepageUrl: 'https://github.com/PrimeIntellect-ai/prime-agent'
},
{
id: 'gjc',
label: translate('auto.lib.agent.catalog.c851f042e2', 'Gajae Code'),
cmd: 'gjc',
faviconDomain: 'gajae-code.com',
homepageUrl: 'https://gajae-code.com'
},
{
id: 'gemini',
label: translate('auto.lib.agent.catalog.12e6baa4f7', 'Gemini'),
Expand Down
4 changes: 3 additions & 1 deletion src/renderer/src/lib/agent-favicon-assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import rovoUrl from '../../../shared/agent-icons/rovo.png?url'
import hermesUrl from '../../../shared/agent-icons/hermes.png?url'
import devinUrl from '../../../shared/agent-icons/devin.png?url'
import openclawUrl from '../../../shared/agent-icons/openclaw.png?url'
import gjcUrl from '../../../shared/agent-icons/gjc.png?url'

// Why: these agents have no hand-authored SVG glyph, so previously their icons
// loaded live from Google's favicon service. That service is unreachable in some
Expand Down Expand Up @@ -57,5 +58,6 @@ export const AGENT_FAVICON_ASSETS: Partial<Record<TuiAgent, string>> = {
rovo: rovoUrl,
hermes: hermesUrl,
devin: devinUrl,
openclaw: openclawUrl
openclaw: openclawUrl,
gjc: gjcUrl
}
1 change: 1 addition & 0 deletions src/renderer/src/lib/agent-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ const ICONABLE_AGENT_TYPES: Record<TuiAgent, true> = {
pi: true,
omp: true,
'prime-agent': true,
gjc: true,
gemini: true,
antigravity: true,
aider: true,
Expand Down
Binary file added src/shared/agent-icons/gjc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions src/shared/agent-kind.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ const TUI_AGENT_KIND_BY_AGENT = {
pi: 'pi',
omp: 'omp',
'prime-agent': 'prime-agent',
gjc: 'gjc',
gemini: 'gemini',
antigravity: 'antigravity',
aider: 'aider',
Expand Down
39 changes: 39 additions & 0 deletions src/shared/gjc-agent-registration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { describe, expect, it } from 'vitest'
import { tuiAgentToAgentKind } from './agent-kind'
import { SKILLS_CLI_AGENT_KEY_BY_TUI_AGENT } from './skills-cli-agent-keys'
import { TUI_AGENT_DISPLAY_NAMES } from './tui-agent-display-names'
import { getTuiAgentLaunchCommand, isTuiAgent, TUI_AGENT_CONFIG } from './tui-agent-config'
import { TUI_AGENT_AUTO_PICK_ORDER } from './tui-agent-selection'

// Why: Gajae Code launches as a plain interactive TUI on `gjc`, so the only thing
// that can silently break it is a half-finished registration (union member with no
// config, or a config the auto-pick order never reaches).
describe('Gajae Code agent registration', () => {
it('detects and launches the published `gjc` binary', () => {
expect(isTuiAgent('gjc')).toBe(true)
const config = TUI_AGENT_CONFIG.gjc
expect(config.detectCmd).toBe('gjc')
expect(getTuiAgentLaunchCommand(config, 'darwin')).toBe('gjc')
expect(config.expectedProcess).toBe('gjc')
})

it('injects the launch prompt after startup instead of as argv', () => {
// Why: `gjc -p <prompt>` is its non-interactive print mode, and it exposes no
// prefill flag or env var, so argv/flag injection would exit the hosted session.
expect(TUI_AGENT_CONFIG.gjc.promptInjectionMode).toBe('stdin-after-start')
expect(TUI_AGENT_CONFIG.gjc.draftPromptFlag).toBeUndefined()
expect(TUI_AGENT_CONFIG.gjc.draftPromptEnvVar).toBeUndefined()
})

it('is selectable, labelled, and telemetry-mapped', () => {
expect(TUI_AGENT_DISPLAY_NAMES.gjc).toBe('Gajae Code')
expect(TUI_AGENT_AUTO_PICK_ORDER).toContain('gjc')
expect(tuiAgentToAgentKind('gjc')).toBe('gjc')
})

it('claims no skills CLI agent key', () => {
// Why: the community skills CLI exits 1 on an unknown --agent value, and it has
// no gjc key; Gajae Code reads its own .gjc roots plus shared .agents/skills.
expect(SKILLS_CLI_AGENT_KEY_BY_TUI_AGENT.gjc).toBeNull()
})
})
2 changes: 2 additions & 0 deletions src/shared/skills-cli-agent-keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ export const SKILLS_CLI_AGENT_KEY_BY_TUI_AGENT = {
pi: 'pi',
omp: null,
'prime-agent': null,
// Why: the skills CLI has no gjc key; Gajae Code reads its own .gjc roots plus shared .agents/skills.
gjc: null,
gemini: 'gemini-cli',
antigravity: 'antigravity',
aider: null,
Expand Down
1 change: 1 addition & 0 deletions src/shared/telemetry-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ export const AGENT_KIND_VALUES = [
'devin',
'ante',
'trae',
'gjc',
'other'
] as const
export const agentKindSchema = z.enum(AGENT_KIND_VALUES)
Expand Down
Loading
Loading