fix(github): qualify dedicated app setup and issue automation

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-10-07 13:04:15 -05:00
1 parent 322fd7de2f
commit 470e66db0d
25 files changed
+945 -93

No files matched your search

+27
View File
@@ -1,6 +1,7 @@
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { createServer } from "node:net";
import { afterEach, describe, expect, it, vi } from "vitest";
import type { Agent, Company, InstanceExperimentalSettings } from "@paperclipai/shared";
import {
@@ -86,6 +87,32 @@ afterEach(() => {
});
describe("test-drive data isolation", () => {
it.each([false, true])("reuses the saved port, with occupied=%s", async (occupied) => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-test-drive-port-"));
cleanupDirectories.push(root);
const listener = createServer();
await new Promise<void>((resolve) => listener.listen(0, "127.0.0.1", resolve));
const savedPort = (listener.address() as { port: number }).port;
const close = () => new Promise<void>((resolve, reject) => listener.close(error => error ? reject(error) : resolve()));
if (!occupied) await close();
const configPath = path.join(root, "instances", "default", "config.json");
fs.mkdirSync(path.dirname(configPath), { recursive: true });
fs.writeFileSync(configPath, JSON.stringify({
$meta: { version: 1, updatedAt: new Date().toISOString(), source: "onboard" },
database: {}, logging: { mode: "file" }, telemetry: { enabled: false },
server: { port: savedPort },
}));
try {
await prepareTestDriveEnvironment({ dataDir: root }, os.tmpdir());
if (occupied) expect(Number(process.env.PORT)).toBeGreaterThan(savedPort);
else expect(Number(process.env.PORT)).toBe(savedPort);
expect(JSON.parse(fs.readFileSync(configPath, "utf8")).server.port).toBe(savedPort);
expect(process.env.HOST).toBe("127.0.0.1");
} finally {
if (occupied) await close();
}
});
it("creates unique retained OS temporary directories and reports absolute paths", () => {
const first = resolveTestDriveDataDir();
const second = resolveTestDriveDataDir();
+9 -1
View File
@@ -194,7 +194,15 @@ export async function prepareTestDriveEnvironment(
process.env.PAPERCLIP_DEPLOYMENT_EXPOSURE = "private";
process.env.PAPERCLIP_BIND = "loopback";
process.env.HOST = "127.0.0.1";
process.env.PORT = String(await resolveTestDriveServerPort());
let preferredPort = 3100;
try {
preferredPort = readConfig(process.env.PAPERCLIP_CONFIG)?.server.port ?? preferredPort;
} catch {
// The normal startup doctor owns invalid-config diagnostics and repair.
}
// Reusing a test drive must preserve callback and enrollment origins when
// its saved port is available. Only move forward if that port is occupied.
process.env.PORT = String(await resolveTestDriveServerPort(preferredPort));
return { dataDir, linkedWorktree };
}