@@ -2785,6 +2785,113 @@ Be specific and actionable.`
27852785 return true
27862786}
27872787
2788+ /**
2789+ * Generate a commit message using Claude non-interactively.
2790+ * @param {string } claudeCmd - Path to Claude CLI
2791+ * @param {string } cwd - Working directory
2792+ * @param {object } options - Options from parent command
2793+ * @returns {Promise<string> } Generated commit message
2794+ */
2795+ async function generateCommitMessage ( claudeCmd , cwd , options = { } ) {
2796+ const opts = { __proto__ : null , ...options }
2797+
2798+ // Get git diff of staged changes
2799+ const diffResult = await runCommandWithOutput ( 'git' , [ 'diff' , '--cached' ] , {
2800+ cwd,
2801+ } )
2802+
2803+ // Get git status
2804+ const statusResult = await runCommandWithOutput (
2805+ 'git' ,
2806+ [ 'status' , '--short' ] ,
2807+ { cwd } ,
2808+ )
2809+
2810+ // Get recent commit messages for style consistency
2811+ const logResult = await runCommandWithOutput (
2812+ 'git' ,
2813+ [ 'log' , '--oneline' , '-n' , '5' ] ,
2814+ { cwd } ,
2815+ )
2816+
2817+ const prompt = `Generate a concise commit message for these changes.
2818+
2819+ Git status:
2820+ ${ statusResult . stdout || 'No status output' }
2821+
2822+ Git diff (staged changes):
2823+ ${ diffResult . stdout || 'No diff output' }
2824+
2825+ Recent commits (for style reference):
2826+ ${ logResult . stdout || 'No recent commits' }
2827+
2828+ Requirements:
2829+ 1. Write a clear, concise commit message (1-2 lines preferred)
2830+ 2. Follow the style of recent commits
2831+ 3. Focus on WHY the changes were made, not just WHAT changed
2832+ 4. NO AI attribution (per CLAUDE.md rules)
2833+ 5. NO emojis
2834+ 6. Output ONLY the commit message text, nothing else
2835+
2836+ Commit message:`
2837+
2838+ // Run Claude non-interactively to generate commit message
2839+ const result = await new Promise ( ( resolve , reject ) => {
2840+ let stdout = ''
2841+ let stderr = ''
2842+
2843+ const claudeProcess = spawn ( claudeCmd , prepareClaudeArgs ( [ ] , opts ) , {
2844+ cwd,
2845+ stdio : [ 'pipe' , 'pipe' , 'pipe' ] ,
2846+ } )
2847+
2848+ claudeProcess . stdout . on ( 'data' , data => {
2849+ stdout += data . toString ( )
2850+ } )
2851+
2852+ claudeProcess . stderr . on ( 'data' , data => {
2853+ stderr += data . toString ( )
2854+ } )
2855+
2856+ claudeProcess . on ( 'close' , code => {
2857+ if ( code === 0 ) {
2858+ resolve ( stdout . trim ( ) )
2859+ } else {
2860+ reject (
2861+ new Error (
2862+ `Claude failed to generate commit message: ${ stderr || 'Unknown error' } ` ,
2863+ ) ,
2864+ )
2865+ }
2866+ } )
2867+
2868+ claudeProcess . stdin . write ( prompt )
2869+ claudeProcess . stdin . end ( )
2870+ } )
2871+
2872+ // Extract just the commit message (Claude might add extra text)
2873+ // Look for the actual message after "Commit message:" or just use the whole output
2874+ const lines = result . split ( '\n' ) . filter ( line => line . trim ( ) )
2875+
2876+ // Return the first substantial line that looks like a commit message
2877+ for ( const line of lines ) {
2878+ const trimmed = line . trim ( )
2879+ // Skip common Claude preamble phrases
2880+ if (
2881+ trimmed &&
2882+ ! trimmed . toLowerCase ( ) . startsWith ( 'here' ) &&
2883+ ! trimmed . toLowerCase ( ) . startsWith ( 'commit message:' ) &&
2884+ ! trimmed . startsWith ( '```' ) &&
2885+ trimmed . length > 10
2886+ ) {
2887+ return trimmed
2888+ }
2889+ }
2890+
2891+ // Fallback to first non-empty line
2892+ return lines [ 0 ] || 'Fix local checks and update tests'
2893+ }
2894+
27882895/**
27892896 * Run all checks, push, and monitor CI until green.
27902897 * NOTE: This operates on the current repo by default. Use --cross-repo for all Socket projects.
@@ -3028,8 +3135,15 @@ Let's work through this together to get CI passing.`
30283135 // Stage all changes
30293136 await runCommand ( 'git' , [ 'add' , '.' ] , { cwd : rootPath } )
30303137
3031- // Commit with descriptive message (no AI attribution per CLAUDE.md)
3032- const commitMessage = 'Fix local checks and update tests'
3138+ // Generate commit message using Claude (non-interactive)
3139+ log . progress ( 'Generating commit message with Claude' )
3140+ const commitMessage = await generateCommitMessage (
3141+ claudeCmd ,
3142+ rootPath ,
3143+ opts ,
3144+ )
3145+ log . substep ( `Commit message: ${ commitMessage } ` )
3146+
30333147 const commitArgs = [ 'commit' , '-m' , commitMessage ]
30343148 if ( useNoVerify ) {
30353149 commitArgs . push ( '--no-verify' )
0 commit comments