gitea_workflow_sync_board
Sync Gitea project boards with workflow status labels to create columns for Backlog, In Progress, Review, Testing, and Done.
Instructions
Create or update project board with columns mapped to status labels. Columns: Backlog, In Progress, Review, Testing, Done.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| owner | No | Repository owner. Uses context if not provided | |
| repo | No | Repository name. Uses context if not provided | |
| board_name | No | Project board name (default: from config) |
Implementation Reference
- src/tools/workflow.ts:261-363 (handler)Core handler function for gitea_workflow_sync_board tool. Loads workflow config, creates/updates Gitea project board and columns matching config.board definition./** * 同步项目看板 */ export async function workflowSyncBoard( ctx: WorkflowToolsContext, args: { owner?: string; repo?: string; config?: WorkflowConfig; board_name?: string; } ): Promise<{ success: boolean; project_id?: number; project_name?: string; columns_created: string[]; columns_existing: string[]; error?: string; }> { logger.debug({ args: { ...args, config: args.config ? '[provided]' : undefined } }, 'Syncing board'); const { owner, repo } = ctx.contextManager.resolveOwnerRepo(args.owner, args.repo); // 获取配置 let config = args.config; if (!config) { const loadResult = await workflowLoadConfig(ctx, { owner, repo }); if (!loadResult.success || !loadResult.config) { return { success: false, columns_created: [], columns_existing: [], error: loadResult.error || '无法加载配置', }; } config = loadResult.config; } const boardName = args.board_name || config.board.name; const columnsCreated: string[] = []; const columnsExisting: string[] = []; try { // 获取现有项目 const projects = await ctx.client.get<Array<{ id: number; title: string }>>( `/repos/${owner}/${repo}/projects` ); let project = projects.find((p) => p.title === boardName); // 创建项目(如果不存在) if (!project) { project = await ctx.client.post<{ id: number; title: string }>( `/repos/${owner}/${repo}/projects`, { title: boardName, } ); logger.info({ owner, repo, project_id: project.id }, 'Project created'); } // 获取现有列 const existingColumns = await ctx.client.get<Array<{ id: number; title: string }>>( `/projects/${project.id}/columns` ); const existingColumnNames = new Set(existingColumns.map((c) => c.title)); // 创建缺失的列 for (const column of config.board.columns) { if (existingColumnNames.has(column.name)) { columnsExisting.push(column.name); } else { await ctx.client.post(`/projects/${project.id}/columns`, { title: column.name, }); columnsCreated.push(column.name); } } logger.info( { owner, repo, project_id: project.id, created: columnsCreated.length }, 'Board synced' ); return { success: true, project_id: project.id, project_name: boardName, columns_created: columnsCreated, columns_existing: columnsExisting, }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); logger.error({ owner, repo, error: errorMessage }, 'Failed to sync board'); return { success: false, columns_created: columnsCreated, columns_existing: columnsExisting, error: errorMessage, }; } }
- src/tools-registry/workflow-registry.ts:119-150 (registration)MCP tool registration for gitea_workflow_sync_board, including input schema (Zod), description, and wrapper handler invoking the core workflowSyncBoard implementation.// 4. gitea_workflow_sync_board - 同步项目看板 mcpServer.registerTool( 'gitea_workflow_sync_board', { title: '同步项目看板', description: 'Create or update project board with columns mapped to status labels. Columns: Backlog, In Progress, Review, Testing, Done.', inputSchema: z.object({ owner: z.string().optional().describe('Repository owner. Uses context if not provided'), repo: z.string().optional().describe('Repository name. Uses context if not provided'), board_name: z.string().optional().describe('Project board name (default: from config)'), }), }, async (args) => { try { const result = await WorkflowTools.workflowSyncBoard( { client: ctx.client, contextManager: ctx.contextManager }, args ); return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }], isError: !result.success, }; } catch (error: unknown) { const errorMessage = error instanceof Error ? error.message : String(error); return { content: [{ type: 'text' as const, text: `Error: ${errorMessage}` }], isError: true, }; } } );
- Zod input schema defining parameters for the gitea_workflow_sync_board tool: owner, repo (optional), board_name (optional).inputSchema: z.object({ owner: z.string().optional().describe('Repository owner. Uses context if not provided'), repo: z.string().optional().describe('Repository name. Uses context if not provided'), board_name: z.string().optional().describe('Project board name (default: from config)'), }), },