91 lines
3.2 KiB
Markdown
91 lines
3.2 KiB
Markdown
---
|
|
allowed-tools: Bash(jj log:*), Bash(jj diff:*), Bash(jj status:*), Bash(jj new:*), Bash(jj move:*), Bash(jj describe:*), Bash(~/bin/jj-ai-desc.py:*)
|
|
argument-hint: <pattern>
|
|
description: Split unwanted changes into new child commit with AI description
|
|
model: claude-haiku-4-5
|
|
---
|
|
|
|
!# Validate pattern argument
|
|
|
|
if [ -z "$ARGUMENTS" ]; then
|
|
echo "❌ **Error: Pattern required**"
|
|
echo ""
|
|
echo "**Usage:** \`/jj:split <pattern>\`"
|
|
echo ""
|
|
echo "**Common patterns:**"
|
|
echo "- \`test\` - Test and spec files"
|
|
echo "- \`docs\` - Documentation (*.md, README, CHANGELOG)"
|
|
echo "- \`config\` - Config files (*.json, *.yaml, *.toml)"
|
|
echo "- Custom glob patterns (e.g., \`*.md\`, \`src/**/*.test.ts\`)"
|
|
echo ""
|
|
echo "**What it does:**"
|
|
echo "1. Keeps wanted changes in current commit (@)"
|
|
echo "2. Moves unwanted (matching pattern) changes to new child commit"
|
|
echo "3. Auto-generates description for child commit"
|
|
echo ""
|
|
echo "**Example:** \`/jj:split test\` - splits test files into new child commit"
|
|
exit 0
|
|
fi
|
|
|
|
## Context
|
|
|
|
- Current status: !`jj status`
|
|
- Current commit: !`jj log -r @ --no-graph -T 'concat(change_id.short(), ": ", description)'`
|
|
- Changed files: !`jj diff -r @ --summary`
|
|
|
|
## Your Task
|
|
|
|
Split unwanted changes matching pattern "$ARGUMENTS" from current commit (@) into a new child commit with an AI-generated description.
|
|
|
|
**Pattern Expansion:**
|
|
|
|
- `test` → Match test files: `*test*.{py,js,ts,jsx,tsx,java,go,rs,cpp,c,h}`, `*spec*.{py,js,ts,jsx,tsx}`, `test_*.py`, `*_test.go`, `*Test.java`
|
|
- `docs` → Match documentation: `*.md`, `README*`, `CHANGELOG*`, `LICENSE*`, `docs/**/*`
|
|
- `config` → Match config files: `*.json`, `*.yaml`, `*.yml`, `*.toml`, `*.ini`, `*.conf`, `.*.rc`, `.*ignore`
|
|
- Custom patterns → Use as-is (glob syntax)
|
|
|
|
**Workflow:**
|
|
|
|
1. **Identify matching files** - Show which files in current commit match the pattern
|
|
2. **Create child commit** - `jj new @` to create empty child where split changes will go
|
|
3. **Move matching changes** - `jj move --from @- -p 'glob:pattern'` to move unwanted files from parent to child
|
|
4. **Generate description** - Use `~/bin/jj-ai-desc.py @` to analyze split changes and generate commit message
|
|
5. **Show result** - Display final commit structure
|
|
|
|
**Result structure:**
|
|
```
|
|
@ (new child): unwanted changes with AI description
|
|
@- (original): wanted changes, original description preserved
|
|
```
|
|
|
|
**Important notes:**
|
|
|
|
- Use multiple `-p` flags for multiple patterns: `jj move --from @- -p 'glob:*.md' -p 'glob:README*'`
|
|
- Always quote glob patterns: `'glob:pattern'`
|
|
- The original commit description stays intact, only the unwanted changes move
|
|
- If no files match, inform user and suggest alternatives
|
|
- After moving, the AI will analyze what was split and generate an appropriate description
|
|
|
|
**Example execution:**
|
|
|
|
```bash
|
|
# Split test files
|
|
jj new @
|
|
jj move --from @- -p 'glob:**/*test*.py' -p 'glob:**/*_test.py'
|
|
~/bin/jj-ai-desc.py @
|
|
|
|
# Split documentation
|
|
jj new @
|
|
jj move --from @- -p 'glob:*.md' -p 'glob:README*' -p 'glob:docs/**'
|
|
~/bin/jj-ai-desc.py @
|
|
|
|
# Split config files
|
|
jj new @
|
|
jj move --from @- -p 'glob:*.json' -p 'glob:*.yaml' -p 'glob:*.toml'
|
|
~/bin/jj-ai-desc.py @
|
|
```
|
|
|
|
**Final verification:**
|
|
|
|
Show the result: !`jj log -r '@|@-' -T 'concat(change_id.short(), ": ", description)'`
|