create_commit
Create and execute a commit for a specific file in a Git repository, specifying type, emoji, title, and optional details like body, footer, and GitHub issue number.
Instructions
指定したファイルに対してコミットを作成・実行します。※1度に1ファイルのみコミット可能です
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | コミットの本文(オプション) | |
| emoji | Yes | コミットメッセージに使用する絵文字 | |
| file | Yes | コミット対象のファイルパス(1ファイルのみ指定可能) | |
| footer | No | コミットのフッター(オプション) | |
| issueNumber | No | GitHub Issue番号(オプション) | |
| language | No | コミットメッセージの言語(デフォルト: ja) | |
| path | Yes | Gitリポジトリの絶対パス | |
| title | Yes | コミットのタイトル | |
| type | Yes | コミットの種類 |
Implementation Reference
- src/handlers/tools/createCommit.ts:7-82 (handler)The core handler factory for the 'create_commit' tool. It defines the inputSchema, validates arguments using isCreateCommitArgs, executes gitService.createCommit, and formats the response.export function createCreateCommitHandler(gitService: GitService): ToolHandler { return { name: "create_commit", description: "指定したファイルに対してコミットを作成・実行します。※1度に1ファイルのみコミット可能です", inputSchema: { type: "object", properties: { file: { type: "string", description: "コミット対象のファイルパス(1ファイルのみ指定可能)" }, path: { type: "string", description: "Gitリポジトリの絶対パス" }, type: { type: "string", enum: Object.keys(COMMIT_TYPES), description: "コミットの種類" }, emoji: { type: "string", description: "コミットメッセージに使用する絵文字" }, title: { type: "string", description: "コミットのタイトル" }, body: { type: "string", description: "コミットの本文(オプション)" }, footer: { type: "string", description: "コミットのフッター(オプション)" }, language: { type: "string", enum: ["ja", "en"], description: "コミットメッセージの言語(デフォルト: ja)" }, issueNumber: { type: "number", description: "GitHub Issue番号(オプション)" } }, required: ["file", "path", "type", "emoji", "title"] }, handler: async (args) => { if (!isCreateCommitArgs(args)) { throw new McpError( ErrorCode.InvalidParams, "Invalid arguments: file, path, type, emoji, and title are required" ); } try { const commitMessage = await gitService.createCommit(args); return { content: [{ type: "text", text: `Successfully committed ${args.file} with message:\n${commitMessage}` }] }; } catch (error) { if (error instanceof McpError) { throw error; } throw new McpError( ErrorCode.InternalError, `Failed to create commit: ${error}` ); } } }; }
- src/handlers/toolHandlers.ts:10-13 (registration)Registration of the 'create_commit' handler in the ToolHandlers class's internal map.this.handlers = new Map([ ['get_status', createGetStatusHandler(gitService)], ['create_commit', createCreateCommitHandler(gitService)] ]);
- src/types/git.ts:24-52 (schema)TypeScript interface and type guard for CreateCommitArgs, used for input validation in the handler.export interface CreateCommitArgs { file: string; // 単一ファイルのみを受け付ける path: string; // Gitリポジトリの絶対パス type: CommitType; emoji: string; title: string; body?: string; footer?: string; language?: 'ja' | 'en'; branch?: string; issueNumber?: number; // GitHub Issue番号(オプション) } export function isCreateCommitArgs(obj: unknown): obj is CreateCommitArgs { if (typeof obj !== 'object' || obj === null) return false; const args = obj as Record<string, unknown>; return ( typeof args.file === 'string' && typeof args.path === 'string' && typeof args.type === 'string' && typeof args.emoji === 'string' && typeof args.title === 'string' && (args.body === undefined || typeof args.body === 'string') && (args.footer === undefined || typeof args.footer === 'string') && (args.language === undefined || ['ja', 'en'].includes(args.language as string)) && (args.branch === undefined || typeof args.branch === 'string') && (args.issueNumber === undefined || typeof args.issueNumber === 'number') ); }
- src/index.ts:50-52 (registration)Routing for 'create_commit' tool call in the main MCP server request handler switch statement.case "create_commit": response = await toolHandlers.handleCreateCommit(request.params.arguments); break;
- Core implementation of commit creation: stages file if needed, generates message, executes git commit command.async createCommit(args: CreateCommitArgs & { path?: string }): Promise<string> { try { const targetBranch = args.branch || 'develop'; const workingDir = args.path || process.cwd(); // ファイルのステージング状態を確認し、必要に応じてステージング if (!(await this.statusManager.isFileStaged(args.file, workingDir))) { await this.statusManager.stageFile(args.file, workingDir); console.log(`Automatically staged file: ${args.file}`); } // コミットメッセージの生成とコミット実行 const commitMessage = this.generateCommitMessage(args); await this.gitExecutor.execGitWithError( `commit -m "${commitMessage}" -- "${args.file}"`, workingDir ); return `[${targetBranch}] ${commitMessage}`; } catch (error) { if (error instanceof McpError) throw error; throw new McpError( ErrorCode.InternalError, `Failed to create commit: ${error}` ); } }