diff --git a/lib/projects.ts b/lib/projects.ts index da2f687..1158147 100644 --- a/lib/projects.ts +++ b/lib/projects.ts @@ -22,6 +22,8 @@ export type Project = { deployBranch: string; /** Messaging channel for this project's group (e.g. "telegram", "whatsapp", "discord", "slack"). Stored at registration time. */ channel?: string; + /** Issue tracker provider type (github or gitlab). Auto-detected at registration, stored for reuse. */ + provider?: "github" | "gitlab"; /** Project-level role execution: parallel (DEV+QA can run simultaneously) or sequential (only one role at a time). Default: parallel */ roleExecution?: "parallel" | "sequential"; maxDevWorkers?: number; diff --git a/lib/services/heartbeat.ts b/lib/services/heartbeat.ts index 17302b0..f4ff19f 100644 --- a/lib/services/heartbeat.ts +++ b/lib/services/heartbeat.ts @@ -304,7 +304,7 @@ async function performHealthPass( project: any, sessions: SessionLookup | null, ): Promise { - const { provider } = await createProvider({ repo: project.repo }); + const { provider } = await createProvider({ repo: project.repo, provider: project.provider }); let fixedCount = 0; for (const role of getAllRoleIds()) { diff --git a/lib/services/queue.ts b/lib/services/queue.ts index f5f1455..51f013c 100644 --- a/lib/services/queue.ts +++ b/lib/services/queue.ts @@ -110,7 +110,7 @@ export async function fetchProjectQueues( project: Project, workflow: WorkflowConfig = DEFAULT_WORKFLOW, ): Promise> { - const { provider } = await createProvider({ repo: project.repo }); + const { provider } = await createProvider({ repo: project.repo, provider: project.provider }); const queueLabels = getQueueLabelsWithPriority(workflow); const queues: Record = {}; diff --git a/lib/services/tick.ts b/lib/services/tick.ts index 077688a..97a54e3 100644 --- a/lib/services/tick.ts +++ b/lib/services/tick.ts @@ -162,7 +162,7 @@ export async function projectTick(opts: { const project = (await readProjects(workspaceDir)).projects[groupId]; if (!project) return { pickups: [], skipped: [{ reason: `Project not found: ${groupId}` }] }; - const provider = opts.provider ?? (await createProvider({ repo: project.repo })).provider; + const provider = opts.provider ?? (await createProvider({ repo: project.repo, provider: project.provider })).provider; const roleExecution = project.roleExecution ?? "parallel"; const roles: Role[] = targetRole ? [targetRole] : getAllRoleIds() as Role[]; diff --git a/lib/tool-helpers.ts b/lib/tool-helpers.ts index 54bea0d..22584f9 100644 --- a/lib/tool-helpers.ts +++ b/lib/tool-helpers.ts @@ -36,9 +36,10 @@ export async function resolveProject( /** * Create an issue provider for a project. + * Uses stored provider type from project config if available, otherwise auto-detects. */ export async function resolveProvider(project: Project): Promise { - return createProvider({ repo: project.repo }); + return createProvider({ repo: project.repo, provider: project.provider }); } /** diff --git a/lib/tools/project-register.ts b/lib/tools/project-register.ts index f3135dd..90f85a2 100644 --- a/lib/tools/project-register.ts +++ b/lib/tools/project-register.ts @@ -161,6 +161,7 @@ export function createProjectRegisterTool() { baseBranch, deployBranch, channel, + provider: providerType, roleExecution, dev: emptyWorkerState([...getLevelsForRole("dev")]), qa: emptyWorkerState([...getLevelsForRole("qa")]),