open source is social v-it.org
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 sol pbc
3
4import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
5import { detectCodingAgent, requireAgent, requireNotAgent } from '../src/lib/agent.js';
6
7describe('agent', () => {
8 let originalClaudeCode;
9 let originalGeminiCli;
10 let originalCodexCi;
11
12 beforeEach(() => {
13 originalClaudeCode = process.env.CLAUDECODE;
14 originalGeminiCli = process.env.GEMINI_CLI;
15 originalCodexCi = process.env.CODEX_CI;
16 delete process.env.CLAUDECODE;
17 delete process.env.GEMINI_CLI;
18 delete process.env.CODEX_CI;
19 });
20
21 afterEach(() => {
22 if (originalClaudeCode === undefined) delete process.env.CLAUDECODE;
23 else process.env.CLAUDECODE = originalClaudeCode;
24
25 if (originalGeminiCli === undefined) delete process.env.GEMINI_CLI;
26 else process.env.GEMINI_CLI = originalGeminiCli;
27
28 if (originalCodexCi === undefined) delete process.env.CODEX_CI;
29 else process.env.CODEX_CI = originalCodexCi;
30 });
31
32 describe('detectCodingAgent', () => {
33 test('returns null when no agent env vars are set', () => {
34 expect(detectCodingAgent()).toBe(null);
35 });
36
37 test('returns claude code when CLAUDECODE=1', () => {
38 process.env.CLAUDECODE = '1';
39 expect(detectCodingAgent()).toEqual({ name: 'claude code', envVar: 'CLAUDECODE' });
40 });
41
42 test('returns gemini cli when GEMINI_CLI=1', () => {
43 process.env.GEMINI_CLI = '1';
44 expect(detectCodingAgent()).toEqual({ name: 'gemini cli', envVar: 'GEMINI_CLI' });
45 });
46
47 test('returns codex when CODEX_CI=1', () => {
48 process.env.CODEX_CI = '1';
49 expect(detectCodingAgent()).toEqual({ name: 'codex', envVar: 'CODEX_CI' });
50 });
51
52 test('returns null when env var is 0', () => {
53 process.env.CLAUDECODE = '0';
54 expect(detectCodingAgent()).toBe(null);
55 });
56
57 test('returns null when env var is empty', () => {
58 process.env.CLAUDECODE = '';
59 expect(detectCodingAgent()).toBe(null);
60 });
61 });
62
63 describe('requireAgent', () => {
64 test('returns ok true when agent detected', () => {
65 process.env.CLAUDECODE = '1';
66 expect(requireAgent()).toEqual({ ok: true, name: 'claude code', envVar: 'CLAUDECODE' });
67 });
68
69 test('returns ok false when no agent detected', () => {
70 expect(requireAgent()).toEqual({ ok: false });
71 });
72 });
73
74 describe('requireNotAgent', () => {
75 test('returns ok true when no agent detected', () => {
76 expect(requireNotAgent()).toEqual({ ok: true });
77 });
78
79 test('returns ok false when agent detected', () => {
80 process.env.CLAUDECODE = '1';
81 expect(requireNotAgent()).toEqual({ ok: false, name: 'claude code', envVar: 'CLAUDECODE' });
82 });
83 });
84});