Fix: Correctly detect agent platform for locks

- Updated `src/utils.mjs` to detect 'claude' platform via `CLAUDE_API_KEY`, `ANTHROPIC_API_KEY`, or `CLAUDE_SESSION_ID`.
- Updated `scripts/agent/scheduler-utils.mjs` `getSafeEnv` to preserve `JULES_`, `CODEX_`, `CLAUDE_`, `ANTHROPIC_`, and `GOOSE_` environment variables when spawning child processes.
- Updated `scripts/agent/run-scheduler-cycle.mjs` to use `detectPlatform()` as a fallback for `AGENT_PLATFORM` instead of hardcoding `'codex'`, ensuring the correct platform is used for lock creation.
- Added unit tests for `detectPlatform` in `test/utils.test.mjs`.

This resolves the issue where lock cards displayed "Unknown" or incorrect platforms.

Co-authored-by: PR0M3TH3AN <[email protected]>
This commit is contained in:
google-labs-jules[bot]andPR0M3TH3AN committed 2026-02-18 21:42:56 +00:00
1 parent a5c8912487
commit ae2e382bfd
4 files changed
+69 -3

No files matched your search

+3 -1
View File
@@ -25,6 +25,8 @@ import {
summarizeLockFailureReasons,
} from './scheduler-lock.mjs';
import { detectPlatform } from '../../src/utils.mjs';
const VALID_CADENCES = new Set(['daily', 'weekly']);
const ALL_EXCLUDED_REASON = 'All roster tasks currently claimed by other agents';
const FAILURE_CATEGORY = {
@@ -35,7 +37,7 @@ const FAILURE_CATEGORY = {
};
function parseArgs(argv) {
const args = { cadence: null, platform: process.env.AGENT_PLATFORM || 'codex', model: process.env.AGENT_MODEL || null };
const args = { cadence: null, platform: process.env.AGENT_PLATFORM || detectPlatform() || 'unknown', model: process.env.AGENT_MODEL || null };
for (let i = 0; i < argv.length; i += 1) {
const value = argv[i];
if (!value.startsWith('--') && !args.cadence) {
+6 -1
View File
@@ -20,7 +20,12 @@ export function getSafeEnv() {
key.startsWith('NOSTR_') ||
key.startsWith('TORCH_') ||
key.startsWith('SCHEDULER_') ||
key.startsWith('AGENT_')) {
key.startsWith('AGENT_') ||
key.startsWith('JULES_') ||
key.startsWith('CODEX_') ||
key.startsWith('CLAUDE_') ||
key.startsWith('ANTHROPIC_') ||
key.startsWith('GOOSE_')) {
safeEnv[key] = process.env[key];
}
}
+1
View File
@@ -34,6 +34,7 @@ export function detectPlatform() {
if (process.env.JULES_API_KEY || process.env.JULES_SESSION_ID) return 'jules';
if (process.env.CODEX_API_KEY || process.env.CODEX_SESSION_ID) return 'codex';
if (process.env.GOOSE_API_KEY || process.env.GOOSE_SESSION_ID) return 'goose';
if (process.env.CLAUDE_API_KEY || process.env.ANTHROPIC_API_KEY || process.env.CLAUDE_SESSION_ID) return 'claude';
return null;
}
+59 -1
View File
@@ -2,7 +2,7 @@ import { describe, it, after } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';
import path from 'node:path';
import { getIsoWeekStr, todayDateStr, nowUnix, ensureDir } from '../src/utils.mjs';
import { getIsoWeekStr, todayDateStr, nowUnix, ensureDir, detectPlatform } from '../src/utils.mjs';
describe('Date Utilities', () => {
describe('todayDateStr', () => {
@@ -59,6 +59,64 @@ describe('Date Utilities', () => {
});
});
describe('Platform Utilities', () => {
describe('detectPlatform', () => {
const originalEnv = { ...process.env };
// Helper to clear relevant env vars
const clearEnv = () => {
delete process.env.JULES_SESSION_ID;
delete process.env.JULES_API_KEY;
delete process.env.CODEX_SESSION_ID;
delete process.env.CODEX_API_KEY;
delete process.env.GOOSE_SESSION_ID;
delete process.env.GOOSE_API_KEY;
delete process.env.CLAUDE_SESSION_ID;
delete process.env.CLAUDE_API_KEY;
delete process.env.ANTHROPIC_API_KEY;
};
after(() => {
process.env = originalEnv;
});
it('detects jules', () => {
clearEnv();
process.env.JULES_SESSION_ID = 'test';
assert.strictEqual(detectPlatform(), 'jules');
});
it('detects codex', () => {
clearEnv();
process.env.CODEX_API_KEY = 'test';
assert.strictEqual(detectPlatform(), 'codex');
});
it('detects goose', () => {
clearEnv();
process.env.GOOSE_SESSION_ID = 'test';
assert.strictEqual(detectPlatform(), 'goose');
});
it('detects claude via CLAUDE_API_KEY', () => {
clearEnv();
process.env.CLAUDE_API_KEY = 'test';
assert.strictEqual(detectPlatform(), 'claude');
});
it('detects claude via ANTHROPIC_API_KEY', () => {
clearEnv();
process.env.ANTHROPIC_API_KEY = 'test';
assert.strictEqual(detectPlatform(), 'claude');
});
it('returns null if no platform detected', () => {
clearEnv();
assert.strictEqual(detectPlatform(), null);
});
});
});
describe('File Utilities', () => {
describe('ensureDir', () => {
const tempBase = fs.mkdtempSync(path.join(process.cwd(), 'test-utils-'));