en un clic
commit
commit
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
commit
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
Canonical turn protocol for agents writing to Neotoma. Bounded retrieval on the user message, store user message PART_OF conversation with REFERS_TO edges to retrieved entities, store assistant reply the same way. Use this skill in any agent loop that should persist conversation state to Neotoma.
Session-end audit. Files remaining work as task entities and lists them as bullets, verifies all data intended for Neotoma storage from this session is actually stored, and persists what's missing. Invoke at the natural close of a working session, before context is lost.
Mid-session status report. Summarizes what's been achieved so far this session and what work remains, in succinct qualitative prose and bullets with only light technical detail. Read-only — stores nothing, files nothing. Invoke any time to take stock without closing the session.
Close a Neotoma working session — store the assistant reply and a session-close summary.
Retrieve the bounded context for the current session — recent interactions and relevant entities.
Begin a Neotoma working session — open a conversation and record the opening interaction.
| name | commit |
| description | commit |
name: commit description: Commit submodules and/or main repo with structured messages; supports /commit repo, /commit . triggers:
CRITICAL REQUIREMENT: All submodule commits MUST use the same comprehensive change analysis and detailed commit message format as the main repository. Generic commit messages like "Update submodule changes" are FORBIDDEN. Each submodule commit must analyze changes, categorize by type/area, and generate structured commit messages with detailed sections.
PARAMETER MODES:
/commit repo): Commit ONLY the main repository, skip all submodules/commit foundation): Commit ONLY that specific submodule, skip main repositoryPUSH RECONCILIATION: Whenever a push is rejected because the remote has commits you do not have, always: (1) pull to reconcile: git pull --rebase origin <branch> or git pull origin <branch> --no-rebase --no-edit, (2) resolve any merge/rebase conflicts, (3) push again: git push origin HEAD. Do not report push failure without attempting reconciliation.
STEP 1: Detect parameter and route to appropriate workflow:
# Check if parameter provided
if [ -n "$1" ]; then
PARAM="$1"
# Case 1: "repo" parameter - commit main repository only
if [ "$PARAM" = "repo" ]; then
echo "📦 REPO-ONLY MODE: Committing main repository only (skipping submodules)"
# Proceed to main repository commit workflow (skip to line after submodule processing)
# Case 2: Submodule name parameter - commit that submodule only
else
echo "📦 SUBMODULE MODE: Checking for submodule '$PARAM'"
# Verify submodule exists
if ! git submodule status "$PARAM" >/dev/null 2>&1; then
echo "❌ Submodule not found: $PARAM"
exit 1
fi
# Proceed to single submodule commit workflow (see "Single Submodule Commit" section)
fi
else
# Case 3: No parameter - commit all submodules then main repository
echo "📦 ALL MODE: Committing all submodules and main repository"
# Proceed to all submodules commit workflow (see "All Submodules Commit" section)
fi
When a specific submodule name is provided (e.g., /commit foundation):
Change to submodule directory:
cd "$PARAM" || {
echo "❌ Failed to change to submodule directory: $PARAM"
exit 1
}
Run security audit in submodule:
echo "🔒 Running security audit in submodule..."
if [ -f "foundation/security/pre-commit-audit.sh" ]; then
./foundation/security/pre-commit-audit.sh
elif [ -f "../foundation/security/pre-commit-audit.sh" ]; then
../foundation/security/pre-commit-audit.sh
fi
Check if there are changes:
if ! git status --porcelain | grep -q .; then
echo "✓ No changes in submodule $PARAM"
exit 0
fi
Stage all changes in submodule:
echo "📝 Staging changes in submodule..."
git add -A
Generate comprehensive commit message - CRITICAL: MUST follow same detailed analysis as main repo:
MANDATORY: Analyze changes using the same comprehensive workflow as main repository:
a. Categorize changes by type:
git diff --cached --name-status to get all changed files with status (A/M/D)b. Categorize changes by functional area:
c. Analyze change magnitude:
git diff --cached --stat to get line countsd. Extract key themes:
e. Generate structured commit message:
f. Validation:
Commit and push submodule:
echo "💾 Committing submodule..."
git commit -m "$COMMIT_MSG"
if git remote | grep -q .; then
echo "📤 Pushing submodule to remote..."
git push origin HEAD || {
echo "📥 Push rejected: reconciling with remote..."
BRANCH=$(git branch --show-current)
git pull --rebase origin "$BRANCH" # resolve conflicts if any, then:
git push origin HEAD
}
fi
Push reconciliation: If push is rejected (remote has commits you do not have), always: (1) pull to reconcile: git pull --rebase origin <branch> or git pull origin <branch> --no-rebase --no-edit, (2) resolve any conflicts, (3) push again. Do not report push failure without attempting reconciliation.
Display commit message:
git log -1 --pretty=format:"%B"
EXIT - Do NOT proceed with main repository commit
When no parameter is provided - commit all submodules first, then main repository:
Initialize and update submodules:
echo "📦 Initializing submodules..."
git submodule update --init --recursive
Get list of all submodules:
SUBMODULES=$(git config --file .gitmodules --get-regexp path | awk '{ print $2 }')
if [ -z "$SUBMODULES" ]; then
echo "ℹ️ No submodules found"
else
echo "📦 Found submodules:"
echo "$SUBMODULES" | while IFS= read -r submodule; do
echo " - $submodule"
done
fi
For each submodule, commit changes:
echo "$SUBMODULES" | while IFS= read -r submodule; do
if [ -n "$submodule" ] && [ -d "$submodule/.git" ]; then
echo ""
echo "🔄 Processing submodule: $submodule"
# Save current directory
ORIGINAL_DIR=$(pwd)
# Change to submodule directory
cd "$submodule" || {
echo " ❌ Failed to change to directory: $submodule"
exit 1
}
# Check if there are changes
if git status --porcelain | grep -q .; then
echo " 📝 Found changes, committing..."
# Run security audit
echo " 🔒 Running security audit..."
if [ -f "foundation/security/pre-commit-audit.sh" ]; then
./foundation/security/pre-commit-audit.sh
elif [ -f "../foundation/security/pre-commit-audit.sh" ]; then
../foundation/security/pre-commit-audit.sh
fi
# Stage all changes
echo " 📝 Staging changes..."
git add -A
# Generate comprehensive commit message - CRITICAL: MUST follow same detailed analysis as main repo
echo " 📝 Generating commit message..."
# MANDATORY: Follow the same comprehensive change analysis workflow as main repository:
# 1. Categorize changes by type (A/M/D) and count files
# 2. Categorize by functional area (docs, code, tests, config, etc.)
# 3. Analyze change magnitude (git diff --cached --stat)
# 4. Extract key themes (features, refactoring, tests, etc.)
# 5. Generate structured commit message with:
# - Summary line (50-72 chars) describing PRIMARY change
# - Detailed sections (New Features, Testing, Code Improvements, Documentation, etc.)
# - List files and key changes for each section
# 6. Validate message covers ALL staged files
# Commit message MUST be as detailed as main repository commits - no generic messages allowed
# Commit submodule
echo " 💾 Committing changes..."
git commit -m "$COMMIT_MSG" || {
echo " ❌ Failed to commit submodule: $submodule"
cd "$ORIGINAL_DIR"
exit 1
}
# Push submodule (if remote exists); reconcile and retry if rejected
if git remote | grep -q .; then
echo " 📤 Pushing to remote..."
git push origin HEAD || {
echo " 📥 Push rejected: reconciling with remote..."
BRANCH=$(git branch --show-current)
git pull --rebase origin "$BRANCH"
git push origin HEAD || echo " ⚠️ Warning: Failed to push submodule: $submodule"
}
fi
echo " ✓ Successfully committed submodule: $submodule"
else
echo " ✓ No changes in $submodule"
fi
# Return to original directory
cd "$ORIGINAL_DIR" || exit 1
fi
done
Update submodule references in main repository:
echo ""
echo "📝 Updating submodule references in main repository..."
git add .gitmodules
echo "$SUBMODULES" | while IFS= read -r submodule; do
if [ -n "$submodule" ]; then
git add "$submodule" 2>/dev/null || true
fi
done
After all submodules committed, proceed to main repository commit workflow below
Run when:
Ensure in root directory:
cd "$(git rev-parse --show-toplevel)"
Run entire test suite and resolve any errors as necessary. Proceed to analyze all uncommitted files for security vulnerabilities and patch as necessary.
CRITICAL: PRE-COMMIT SECURITY AUDIT - MUST RUN BEFORE STAGING:
Execute security audit from foundation/agent_instructions/cursor_rules/security.md (or .claude/rules/foundation_security.md if installed) before staging ANY files:
Run security audit script:
# Use foundation security audit script if available
if [ -f "foundation/security/pre-commit-audit.sh" ]; then
./foundation/security/pre-commit-audit.sh
elif [ -f ".claude/rules/foundation_security.md" ]; then
# Follow security rule checks
# (Implementation depends on how security rules are executed)
fi
If any check fails, ABORT immediately and alert the user. DO NOT proceed with staging or commit.
After security audit passes, proceed with:
NESTED GIT REPOSITORY DETECTION AND COMMIT (Optional, configurable):
Configuration: Enable/disable nested repo handling in foundation-config.yaml:
development:
commit:
handle_nested_repos: false # Set to true to enable nested repo handling
If enabled, before committing the main repository, detect and commit any nested git repositories:
Nested repositories must be committed BEFORE the main repository to maintain consistency.
Detect nested git repositories:
# Find all nested .git directories (excluding the root .git and submodules)
# Store in a temporary file to avoid subshell issues
NESTED_REPOS_FILE=$(mktemp)
find . -name ".git" -type d -not -path "./.git" -not -path "./.git/*" 2>/dev/null | sed 's|/.git$||' | sort > "$NESTED_REPOS_FILE"
if [ -s "$NESTED_REPOS_FILE" ]; then
echo "📦 Found nested git repositories:"
while IFS= read -r repo_path; do
echo " - $repo_path"
done < "$NESTED_REPOS_FILE"
echo ""
fi
For each nested repository, commit changes:
# Process each nested repo
if [ -s "$NESTED_REPOS_FILE" ]; then
while IFS= read -r repo_path; do
if [ -n "$repo_path" ] && [ -d "$repo_path/.git" ]; then
echo "🔄 Processing nested repository: $repo_path"
# Save current directory
ORIGINAL_DIR=$(pwd)
# Change to nested repo directory
cd "$repo_path" || {
echo " ❌ Failed to change to directory: $repo_path"
rm -f "$NESTED_REPOS_FILE"
exit 1
}
# Check if there are any changes
if git status --porcelain | grep -q .; then
echo " 📝 Found changes, committing..."
# Run security audit for nested repo (same checks as main repo)
echo " 🔒 Running security audit..."
# (Run same security audit as main repo)
# Stage all changes
echo " 📝 Staging changes..."
git add -A
# Generate commit message for nested repo
echo " 📝 Generating commit message..."
# (Use configured commit message format)
# Commit nested repo
echo " 💾 Committing changes..."
git commit -m "$COMMIT_MSG" || {
echo " ❌ Failed to commit nested repository: $repo_path"
cd "$ORIGINAL_DIR"
rm -f "$NESTED_REPOS_FILE"
exit 1
}
# Push nested repo (if remote exists); reconcile and retry if rejected
if git remote | grep -q .; then
echo " 📤 Pushing to remote..."
git push || {
echo " 📥 Push rejected: reconciling with remote..."
BRANCH=$(git branch --show-current)
git pull --rebase origin "$BRANCH"
git push || {
echo " ⚠️ Warning: Failed to push nested repository: $repo_path"
echo " Continuing with main repository commit..."
}
}
else
echo " ℹ️ No remote configured, skipping push"
fi
echo " ✓ Successfully committed nested repository: $repo_path"
else
echo " ✓ No changes in $repo_path"
fi
# Return to original directory
cd "$ORIGINAL_DIR" || {
rm -f "$NESTED_REPOS_FILE"
exit 1
}
echo ""
fi
done < "$NESTED_REPOS_FILE"
# Clean up temp file
rm -f "$NESTED_REPOS_FILE"
fi
If any nested repo commit fails, ABORT the entire commit process and return to root directory.
After all nested repos are successfully committed, proceed with main repository commit.
UI TESTING (Optional, configurable):
Configuration: Enable/disable UI testing in foundation-config.yaml:
development:
commit:
ui_testing:
enabled: false
frontend_paths: ["frontend/src/**"] # Paths to check for frontend changes
If enabled, if any frontend files were modified, automatically verify user-facing changes work correctly in the browser before committing. After completing the browser run, rerun the security audit in case new assets or logs were created.
Before committing, ensure all changes are staged:
CRITICAL: Exclude nested repositories from main repo staging (if nested repo handling enabled):
Detect nested repos and build exclusion patterns:
# Detect nested repos first (before staging main repo)
NESTED_REPOS_STAGING_FILE=$(mktemp)
find . -name ".git" -type d -not -path "./.git" -not -path "./.git/*" 2>/dev/null | sed 's|/.git$||' | sort > "$NESTED_REPOS_STAGING_FILE"
# Build exclusion patterns for git add
EXCLUDE_PATTERNS=""
if [ -s "$NESTED_REPOS_STAGING_FILE" ]; then
echo "📦 Excluding nested repositories from main repo staging:"
while IFS= read -r repo_path; do
if [ -n "$repo_path" ]; then
echo " - Excluding $repo_path"
# Escape special characters and add to exclusion
ESCAPED_PATH=$(echo "$repo_path" | sed 's/[[\.*^$()+?{|]/\\&/g')
if [ -z "$EXCLUDE_PATTERNS" ]; then
EXCLUDE_PATTERNS=":!/$ESCAPED_PATH"
else
EXCLUDE_PATTERNS="$EXCLUDE_PATTERNS :!/$ESCAPED_PATH"
fi
fi
done < "$NESTED_REPOS_STAGING_FILE"
fi
Stage changes while excluding nested repositories:
# Stage all changes except nested repos
if [ -n "$EXCLUDE_PATTERNS" ]; then
git add -A $EXCLUDE_PATTERNS
else
git add -A
fi
Re-run security audit on staged files to ensure nothing private or from nested repos was accidentally staged.
Verify staged changes with git status to ensure nothing is missed
If any files were modified after the initial git add, run git add -A again with exclusions right before committing, then re-run the security audit
BRANCH RENAMING (Optional, configurable):
Configuration: Enable/disable branch renaming in foundation-config.yaml:
development:
commit:
branch_renaming:
enabled: false
patterns: ["chat-*"] # Patterns to rename
If enabled, automatically rename branches matching configured patterns before committing.
COMPREHENSIVE CHANGE ANALYSIS: Before generating the commit message, perform comprehensive analysis of all staged changes:
CRITICAL: File Status Categorization (Perform First - REQUIRED):
MANDATORY: Before analyzing content, categorize files by git status to ensure accurate commit message verbs:
Get file status codes:
# Get staged changes with status codes (A/M/D/R/C)
git diff --cached --name-status > /tmp/staged_status.txt
# Get all changes (staged + unstaged) with status codes
git diff HEAD --name-status > /tmp/all_status.txt
# Extract files by status
ADDED_FILES=$(grep "^A" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
MODIFIED_FILES=$(grep "^M" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
DELETED_FILES=$(grep "^D" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
RENAMED_FILES=$(grep "^R" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
Map status codes to commit message verbs:
CRITICAL VALIDATION RULES:
Verify feature claims against file status:
# Example: If analyzing WhatsApp MCP server changes
WHATSAPP_FILES=$(echo "$ADDED_FILES $MODIFIED_FILES" | grep -i whatsapp || true)
if [ -n "$WHATSAPP_FILES" ]; then
# Check status of WhatsApp files
WHATSAPP_STATUS=$(git diff --cached --name-status | grep -i whatsapp | cut -f1 | head -1)
if [ "$WHATSAPP_STATUS" = "M" ]; then
# Files are modified → use "Refactor" or "Modify", NOT "Add"
FEATURE_VERB="Refactor"
elif [ "$WHATSAPP_STATUS" = "A" ]; then
# Files are added → use "Add" or "Implement"
FEATURE_VERB="Add"
fi
fi
CRITICAL: Release-Aware Analysis (Perform After Status Categorization):
Check for Release Status Changes:
# Check if any release status files were modified
git diff --cached --name-only | grep -E "docs/releases/.*/status\.md"
planning → ready_for_deployment, in_progress → deployed)Analyze Release Context:
Understand Implementation vs Documentation:
Standard Change Analysis (After Release Context and Status Categorization):
Categorize Changes by Type (Using Status Codes):
Categorize Changes by Functional Area:
docs/**) - further categorize by subdirectorysrc/**, frontend/src/**, or configured paths)scripts/**)*.json, *.yaml, *.toml, *.config.*)**/*.test.*, **/*.spec.*, or configured test paths)Dockerfile, *.sh, or configured paths)supabase/migrations/**, **/migrations/*.sql) - these indicate release executionAnalyze Change Magnitude:
git diff --cached --stat to get line counts (insertions/deletions)Extract Key Themes:
Generate Structured Commit Message:
The commit message MUST follow the configured format from foundation-config.yaml:
development:
commit_format:
require_id: true # whether ID is required in commit messages
pattern: "{id}: {description}" # or custom pattern
CRITICAL: Use correct verbs based on file status:
Default structure (if no custom format configured):
Validation (REQUIRED):
# Validate message accuracy
if echo "$COMMIT_MSG" | grep -qi "add.*server\|new.*server\|implement.*server"; then
# Check if files are actually added (status A)
if ! echo "$ADDED_FILES" | grep -qi "server"; then
echo "⚠️ WARNING: Commit message claims 'add server' but files show status M (modified)"
echo " Correct to: 'Refactor server' or 'Modify server'"
# If validation_strictness is "error", abort here
fi
fi
git diff --cached --name-only)git diff --cached --stat and git diff --cached <file> for key filesCOMMIT MESSAGE GENERATION PROCESS:
Categorize files by git status FIRST (REQUIRED):
# Get file status codes (A/M/D/R)
git diff --cached --name-status > /tmp/staged_status.txt
git diff HEAD --name-status > /tmp/all_status.txt
# Extract files by status
ADDED_FILES=$(grep "^A" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
MODIFIED_FILES=$(grep "^M" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
DELETED_FILES=$(grep "^D" /tmp/staged_status.txt /tmp/all_status.txt 2>/dev/null | cut -f2 | sort -u)
Check for release status changes:
git diff --cached --name-only | grep -E "docs/releases/.*/status\.md"
Analyze migrations and schema changes:
git diff --cached --name-status | grep -E "migrations|schema\.sql"
Run git diff --cached --stat to get change statistics
Determine primary vs secondary work:
Generate commit message with proper prioritization:
Validate message accuracy:
Verify all files are represented in the message
Proceed with commit
FINAL PRE-COMMIT SECURITY CHECK: Immediately before executing git commit, run one final security audit:
# Final check on staged files for private/sensitive files
# Use foundation security audit script or rules
if [ -f "foundation/security/pre-commit-audit.sh" ]; then
./foundation/security/pre-commit-audit.sh
elif [ -f ".claude/rules/foundation_security.md" ]; then
# Follow security rule checks
fi
# Final check for nested repository files (if nested repo handling enabled)
# (Same check as above if nested repos are configured)
If final security check passes, proceed to git commit with the comprehensive commit message and push to origin. If push is rejected (remote has new commits): run git pull --rebase origin <current_branch> (or git pull origin <current_branch> --no-rebase --no-edit), resolve any conflicts, then git push origin HEAD again. Always reconcile and retry before reporting push failure.
WORKTREE DETECTION: Follow the Worktree Rule (.claude/rules/foundation_worktree_env.md or foundation/agent_instructions/cursor_rules/worktree_env.md) to restrict all commit activity to the current worktree.
COMMIT MESSAGE DISPLAY: After successfully committing and pushing, always display the full commit message to the user by running git log -1 --pretty=format:"%B" and showing the output. This allows the user to review what was committed.
WORKTREE COMPATIBILITY: Per the Worktree Rule, commits made within this worktree remain visible to the shared .git directory.
After committing the main repository, verify no unstaged changes remain with git status. If any files were missed, amend the commit with git add <file> && git commit --amend --no-edit.
NESTED REPOSITORY SUMMARY (if nested repo handling enabled): After committing the main repository, display a summary of nested repository commits.
SUBMODULE SUMMARY (if submodules were committed in all-mode): After committing the main repository, display a summary of submodule commits made during this commit session.
POST-COMMIT VALIDATION: After displaying the commit message, verify it comprehensively covers all changes by:
git show --stat HEAD to see what was committedgit commit --amend to add missing sectionsConfigure commit behavior in foundation-config.yaml:
development:
commit:
handle_nested_repos: false # Enable nested repository handling
ui_testing:
enabled: false
frontend_paths: []
branch_renaming:
enabled: false
patterns: []
validate_message_accuracy: true # Validate commit message verbs match git status codes
require_status_verification: true # Require explicit status check before making claims
validation_strictness: "warn" # "warn" (show warning) or "error" (block commit if invalid)
commit_format:
require_id: false
pattern: "{description}" # or "{id}: {description}"
/commit - Default: Commits all submodules first, then main repository/commit repo - Commits only main repository, skips all submodules/commit <submodule-name> - Commits only the specified submodule, skips main repositoryAll modes follow the same security audit, change analysis, and commit message generation workflows appropriate to their scope.
MANDATORY: Submodule commits MUST use the same comprehensive analysis and detailed commit message format as main repository commits. Generic messages like "Update submodule changes" are FORBIDDEN.