create_project_field
Add custom fields to GitHub projects to organize tasks, track progress, and manage data effectively. Supports text, numbers, dates, select options, iterations, milestones, assignees, and labels.
Instructions
Create a custom field for a GitHub project
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| description | No | ||
| name | Yes | ||
| options | No | ||
| projectId | Yes | ||
| required | No | ||
| type | Yes |
Implementation Reference
- Handler function that executes the GitHub GraphQL mutation to create a project V2 field, matching the tool parameters exactly.async createField(projectId: ProjectId, field: Omit<CustomField, "id">): Promise<CustomField> { const mutation = ` mutation($input: CreateProjectV2FieldInput!) { createProjectV2Field(input: $input) { projectV2Field { id name dataType } } } `; try { const githubFieldType = mapToGraphQLFieldType(field.type); const variables: any = { input: { projectId, dataType: githubFieldType, name: field.name, } }; if (field.type === 'single_select' && field.options && field.options.length > 0) { variables.input.singleSelectOptions = field.options.map(option => ({ name: option.name, description: option.description || null, color: option.color || null })); } if (field.type === 'iteration' && field.config) { if (field.config.iterationDuration) { variables.input.iterationDuration = field.config.iterationDuration; } if (field.config.iterationStart) { variables.input.iterationStartDate = field.config.iterationStart; } } const response = await this.graphql<CreateProjectV2FieldResponse>(mutation, variables); const createdField = response.createProjectV2Field.projectV2Field; // Since the createdField object doesn't have a dataType property, we need to fetch it const fieldDetails = await this.getField(projectId, createdField.id); return { id: createdField.id, name: createdField.name, type: fieldDetails?.type || field.type, // Use fetched type or fallback to original options: field.options || [], description: field.description, required: field.required || false, defaultValue: field.defaultValue, validation: field.validation, config: field.config }; } catch (error) { this.logger.error(`Failed to create field ${field.name} for project ${projectId}`, error); throw this.handleGraphQLError(error); } }
- Zod schema defining input parameters for create_project_field tool, used for validation.// Schema for create_project_field tool export const createProjectFieldSchema = z.object({ projectId: z.string().min(1, "Project ID is required"), name: z.string().min(1, "Field name is required"), type: z.enum([ "text", "number", "date", "single_select", "iteration", "milestone", "assignees", "labels" ]), options: z.array( z.object({ name: z.string().min(1), description: z.string().optional(), color: z.string().optional(), }) ).optional(), description: z.string().optional(), required: z.boolean().optional(), }); export type CreateProjectFieldArgs = z.infer<typeof createProjectFieldSchema>;
- ToolDefinition object for create_project_field including name, description, schema reference, and usage examples.export const createProjectFieldTool: ToolDefinition<CreateProjectFieldArgs> = { name: "create_project_field", description: "Create a custom field for a GitHub project", schema: createProjectFieldSchema as unknown as ToolSchema<CreateProjectFieldArgs>, examples: [ { name: "Create status field", description: "Create a status dropdown field for a project", args: { projectId: "PVT_kwDOLhQ7gc4AOEbH", name: "Status", type: "single_select", options: [ { name: "To Do", color: "red" }, { name: "In Progress", color: "yellow" }, { name: "Done", color: "green" } ], description: "Current status of the task", required: true } } ] };
- src/infrastructure/tools/ToolRegistry.ts:242-242 (registration)Registration of the createProjectFieldTool in the central ToolRegistry singleton.this.registerTool(createProjectFieldTool);