Merge pull request #312 from PR0M3TH3AN/fix-platform-detection-unknown-763535823094544277

Fix "Unknown" platform on Nostr task cards
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-02-18 19:12:11 -05:00
commit 2eb6103eab
6 files changed
+73 -4

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;
}
@@ -95,6 +95,7 @@ async function setupFixture({ lockShellBody }) {
await fs.copyFile(SOURCE_SCRIPT, path.join(scriptsDir, 'run-scheduler-cycle.mjs'));
await fs.copyFile(path.resolve('scripts/agent/scheduler-utils.mjs'), path.join(scriptsDir, 'scheduler-utils.mjs'));
await fs.copyFile(path.resolve('scripts/agent/scheduler-lock.mjs'), path.join(scriptsDir, 'scheduler-lock.mjs'));
await fs.copyFile(path.resolve('src/utils.mjs'), path.join(root, 'src', 'utils.mjs'));
await fs.writeFile(path.join(scriptsDir, 'verify-run-artifacts.mjs'), '#!/usr/bin/env node\nprocess.exit(0);\n', 'utf8');
await fs.writeFile(path.join(root, 'src', 'prompts', 'roster.json'), JSON.stringify({ daily: ['agent-a'] }, null, 2), 'utf8');
await fs.writeFile(path.join(root, 'src', 'prompts', 'daily', 'agent-a.md'), '# agent-a\n', 'utf8');
+3 -1
View File
@@ -4,6 +4,7 @@ import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import { spawn } from 'node:child_process';
import { detectPlatform } from '../src/utils.mjs';
const SOURCE_SCRIPT = path.resolve('scripts/agent/run-scheduler-cycle.mjs');
@@ -44,6 +45,7 @@ async function setupFixture({ lockShellBody = ':', schedulerPolicy = {} }) {
await fs.copyFile(SOURCE_SCRIPT, path.join(scriptsDir, 'run-scheduler-cycle.mjs'));
await fs.copyFile(path.resolve('scripts/agent/scheduler-utils.mjs'), path.join(scriptsDir, 'scheduler-utils.mjs'));
await fs.copyFile(path.resolve('scripts/agent/scheduler-lock.mjs'), path.join(scriptsDir, 'scheduler-lock.mjs'));
await fs.copyFile(path.resolve('src/utils.mjs'), path.join(root, 'src', 'utils.mjs'));
await fs.writeFile(
path.join(scriptsDir, 'verify-run-artifacts.mjs'),
'#!/usr/bin/env node\nprocess.exit(0);\n',
@@ -150,7 +152,7 @@ test('lock preflight e2e: successful lock writes completed status snapshot', { c
cadence: 'daily',
agent: 'agent-a',
status: 'completed',
platform: 'codex',
platform: detectPlatform() || 'unknown',
},
);
});
+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-'));