Files
2025-11-30 08:44:27 +08:00

614 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# /sdd:story-save
## Meta
- Version: 2.0
- Category: workflow
- Complexity: comprehensive
- Purpose: Commit current work with properly formatted commit message and story file update
## Definition
**Purpose**: Save current progress by creating a properly formatted git commit with automatic commit type detection, story context integration, and story file progress logging.
**Syntax**: `/sdd:story-save [message]`
## Parameters
| Parameter | Type | Required | Default | Description | Validation |
|-----------|------|----------|---------|-------------|------------|
| message | string | No | auto-generated | Custom commit message or description | Max 500 chars |
## INSTRUCTION: Save Story Progress
### INPUTS
- Current git working directory changes
- Story ID from branch name or active story
- Story file from `/docs/stories/development/`, `/docs/stories/review/`, or `/docs/stories/qa/`
- Optional: User-provided commit message
- Project context from `/docs/project-context/` (optional for enhanced commit messages)
### PROCESS
#### Phase 1: Git Status Analysis
1. **CHECK** git repository status:
- RUN: `git status --porcelain`
- IF no changes exist:
* SHOW: "✅ Working tree clean - nothing to commit"
* SUGGEST: Continue working or use /sdd:story-review
* EXIT gracefully
2. **CATEGORIZE** changes:
- MODIFIED files: List files with 'M' status
- UNTRACKED files: List files with '??' status
- DELETED files: List files with 'D' status
- RENAMED files: List files with 'R' status
3. **ANALYZE** file sizes:
- CHECK for large files (> 5MB)
- WARN about potentially sensitive files (.env, credentials.json, etc.)
- FLAG binary files that might bloat repository
4. **DISPLAY** changes summary:
```
📝 CHANGES TO COMMIT
════════════════════════════════════
Modified: [count] files
- [file1]
- [file2]
Untracked: [count] files
- [file3]
- [file4]
[If warnings exist:]
⚠️ WARNINGS:
- Large file detected: [file] ([size]MB)
- Potential secret: [file]
```
#### Phase 2: Story Context Discovery
1. **IDENTIFY** current story:
- ATTEMPT 1: Extract from current git branch name
* PATTERN: feature/[story-id]-[description]
* EXAMPLE: feature/STORY-AUTH-001-login-form → STORY-AUTH-001
- ATTEMPT 2: Find most recently modified story in /docs/stories/development/
- ATTEMPT 3: Check /docs/stories/review/ and /docs/stories/qa/
- IF no story found: PROCEED without story context
2. **READ** story file (if found):
- EXTRACT story title
- EXTRACT current status
- EXTRACT branch name
- EXTRACT last progress log entry
- EXTRACT implementation checklist status
3. **VALIDATE** story alignment:
- IF story branch doesn't match current branch:
* WARN: "Current branch doesn't match story branch"
* ASK: Continue with commit anyway? (y/n)
#### Phase 3: Commit Type Detection
1. **ANALYZE** changed files to determine commit type:
**Detection Rules:**
- `feat`: New feature files, new components, new functionality
* New files in app/, src/, lib/
* New Livewire components, React components, Vue components
* New controllers, models, services
- `fix`: Bug fixes, error corrections
* Modifications to fix issues
* Changes to error handling
* Corrections to logic
- `refactor`: Code restructuring without behavior change
* File moves, renames
* Code organization changes
* Performance improvements without new features
- `test`: Test additions or modifications
* New or modified files in tests/, __tests__/
* Test files (.test.js, .spec.js, Test.php)
- `docs`: Documentation only
* Changes to .md files only
* README updates
* Comment updates only
- `style`: Formatting, whitespace, linting
* Style files only (.css, .scss, .sass)
* Formatting changes (after running Pint, Prettier)
- `perf`: Performance improvements
* Optimization changes
* Database query improvements
* Caching additions
- `chore`: Maintenance, dependencies, configuration
* package.json, composer.json updates
* Config file changes
* Build script updates
2. **SELECT** primary commit type:
- IF multiple types apply: SELECT most significant
- PRIORITY ORDER: feat > fix > refactor > test > perf > docs > style > chore
3. **DETERMINE** scope from changes:
- IF story exists: USE story context (e.g., "auth", "profile", "cart")
- ELSE: USE directory/module name
- EXAMPLES: "auth", "api", "ui", "database", "tests"
#### Phase 4: Commit Message Generation
1. **IF** user provided message:
- USE provided message as description
- FORMAT: `[type]([scope]): [user message]`
- EXAMPLE: "feat(auth): add two-factor authentication"
2. **ELSE** auto-generate message:
- ANALYZE changes to create descriptive message
- USE story title if available
- INCLUDE key changes summary
- FORMAT: `[type]([scope]): [auto-generated description]`
3. **CREATE** full commit message:
```
[type]([scope]): [description]
[If story exists:]
Story: [STORY-ID] - [Story Title]
Changes:
- [Change 1]
- [Change 2]
- [Change 3]
[If applicable:]
Files: [count] modified, [count] added, [count] deleted
```
4. **VALIDATE** commit message format:
- TYPE must be valid conventional commit type
- SCOPE should be lowercase, hyphen-separated
- DESCRIPTION should be lowercase, imperative mood
- LENGTH should be under 72 chars for first line
#### Phase 5: Story File Update
1. **IF** story file exists:
- **ADD** progress log entry:
```markdown
- [YYYY-MM-DD HH:MM]: [commit description]
* Files: [list key files]
* Type: [commit type]
* [Additional context if significant changes]
```
2. **UPDATE** checklist items (if applicable):
- DETECT completed work from commit type
- IF commit type is "test": Mark "Unit tests" or "Integration tests" as complete
- IF commit type is "feat": Check if feature implementation complete
- IF commit type is "docs": Mark "Documentation" as complete
3. **NOTE** implementation decisions (if significant):
- ADD to Technical Notes section if architectural changes
- DOCUMENT trade-offs or important decisions
- REFERENCE commit hash (will be added after commit)
#### Phase 6: Staging and Commit
1. **STAGE** changes:
- IF story file was updated: INCLUDE story file in commit
- ADD all relevant modified files
- ADD all relevant untracked files
- EXCLUDE files from .gitignore
- SKIP large files or sensitive files (with warning)
2. **CREATE** commit:
- RUN: `git add [files]`
- RUN: `git commit -m "[commit message]"`
- CAPTURE commit hash
- CAPTURE commit timestamp
3. **UPDATE** story file with commit hash:
- ADD commit hash to latest progress log entry
- FORMAT: `Commit: [hash]`
4. **VERIFY** commit succeeded:
- RUN: `git log -1 --oneline`
- CONFIRM commit appears in history
#### Phase 7: Commit Summary Display
1. **DISPLAY** comprehensive commit summary:
```
✅ CHANGES COMMITTED
════════════════════════════════════
Commit: [hash]
Type: [type]
Scope: [scope]
Message: [description]
[If story exists:]
Story: [STORY-ID] - [Story Title]
Files Changed: [count]
📄 Modified: [count]
- [file1] ([+X/-Y lines])
- [file2] ([+X/-Y lines])
Added: [count]
- [file3] ([+X lines])
Deleted: [count]
- [file4] ([X lines])
Statistics:
Lines Added: [count]
Lines Removed: [count]
💡 NEXT STEPS:
1. /sdd:story-implement [story-id] - Continue development
2. /sdd:story-review - Move to code review when ready
3. git push - Push to remote when ready to share
```
### OUTPUTS
- Git commit with formatted conventional commit message
- Updated story file with progress log entry
- Commit statistics and file change summary
- Next action suggestions based on story status
### RULES
- MUST check for uncommitted changes before proceeding
- MUST determine appropriate commit type from changes
- MUST create properly formatted conventional commit message
- MUST update story file before committing (include in same commit)
- MUST warn about large files or potential secrets
- SHOULD auto-detect story context from branch name
- SHOULD provide meaningful auto-generated messages
- SHOULD include story context in commit body
- MUST NOT commit files that likely contain secrets
- MUST NOT proceed if no changes exist
- NEVER force push or amend commits without confirmation
## Examples
### Example 1: Feature Implementation Commit
```bash
INPUT:
/sdd:story-save
PROCESS:
→ Checking git status...
→ Found 5 modified files, 2 new files
→ Detecting story context...
→ Current branch: feature/STORY-AUTH-001-login-form
→ Story: STORY-AUTH-001 - Implement Login Form
→ Analyzing changes...
→ Detected commit type: feat
→ Generating commit message...
→ Updating story file...
→ Staging changes...
→ Creating commit...
OUTPUT:
✅ CHANGES COMMITTED
════════════════════════════════════
Commit: abc1234
Type: feat
Scope: auth
Message: implement login form with validation
Story: STORY-AUTH-001 - Implement Login Form
Files Changed: 7
📄 Modified: 5
- app/Livewire/Auth/LoginForm.php (+145/-0 lines)
- resources/views/livewire/auth/login-form.blade.php (+67/-0 lines)
- routes/web.php (+5/-0 lines)
- tests/Feature/Auth/LoginTest.php (+89/-0 lines)
- stories/development/STORY-AUTH-001.md (+8/-1 lines)
Added: 2
- app/Http/Controllers/Auth/LoginController.php (+52 lines)
- tests/Browser/Auth/LoginFormTest.php (+43 lines)
Statistics:
Lines Added: 409
Lines Removed: 1
💡 NEXT STEPS:
1. /sdd:story-implement STORY-AUTH-001 - Continue development
2. /sdd:story-review - Move to code review when ready
3. git push - Push to remote when ready to share
```
### Example 2: Custom Commit Message
```bash
INPUT:
/sdd:story-save "add rate limiting to login endpoint"
PROCESS:
→ Checking git status...
→ Found 2 modified files
→ Using custom message: "add rate limiting to login endpoint"
→ Detecting story context...
→ Story: STORY-AUTH-001 - Implement Login Form
→ Analyzing changes...
→ Detected commit type: feat
→ Generating commit message...
→ Updating story file...
→ Creating commit...
OUTPUT:
✅ CHANGES COMMITTED
════════════════════════════════════
Commit: def5678
Type: feat
Scope: auth
Message: add rate limiting to login endpoint
Story: STORY-AUTH-001 - Implement Login Form
Changes:
- Added rate limiting middleware (5 attempts per minute)
- Updated login controller to use rate limiter
- Added rate limit exceeded error message
Files Changed: 2
📄 Modified: 2
- app/Http/Middleware/RateLimitLogin.php (+28/-0 lines)
- app/Livewire/Auth/LoginForm.php (+12/-3 lines)
Statistics:
Lines Added: 40
Lines Removed: 3
💡 NEXT STEPS:
1. /sdd:story-implement STORY-AUTH-001 - Continue development
2. /sdd:story-review - Move to code review when ready
3. git push - Push to remote when ready to share
```
### Example 3: Test Addition Commit
```bash
INPUT:
/sdd:story-save
PROCESS:
→ Checking git status...
→ Found 3 new files (all tests)
→ Detecting story context...
→ Story: STORY-PROFILE-002 - User Profile Settings
→ Analyzing changes...
→ Detected commit type: test
→ Generating commit message...
→ Updating story file (marking test checklist items complete)...
→ Creating commit...
OUTPUT:
✅ CHANGES COMMITTED
════════════════════════════════════
Commit: ghi9012
Type: test
Scope: profile
Message: add comprehensive unit and browser tests
Story: STORY-PROFILE-002 - User Profile Settings
Files Changed: 4
Added: 3
- tests/Unit/ProfileSettingsTest.php (+76 lines)
- tests/Feature/ProfileUpdateTest.php (+92 lines)
- tests/Browser/ProfileSettingsTest.php (+58 lines)
📄 Modified: 1
- stories/development/STORY-PROFILE-002.md (+3/-3 lines)
* Marked "Unit tests" as complete
* Marked "Browser tests" as complete
Statistics:
Lines Added: 229
Lines Removed: 3
💡 NEXT STEPS:
1. /sdd:story-implement STORY-PROFILE-002 - Continue development
2. /sdd:story-review - Move to code review when ready
3. git push - Push to remote when ready to share
```
### Example 4: No Changes to Commit
```bash
INPUT:
/sdd:story-save
PROCESS:
→ Checking git status...
→ No uncommitted changes found
OUTPUT:
✅ WORKING TREE CLEAN
════════════════════════════════════
No changes to commit.
Current Status:
Branch: feature/STORY-AUTH-001-login-form
Story: STORY-AUTH-001 - Implement Login Form
Last Commit: abc1234 (2 hours ago)
💡 NEXT STEPS:
1. /sdd:story-implement STORY-AUTH-001 - Continue implementation
2. /sdd:story-review - Move to code review if complete
3. /sdd:story-continue - Resume work on story
```
### Example 5: Warning About Large Files
```bash
INPUT:
/sdd:story-save
PROCESS:
→ Checking git status...
→ Found 3 modified files, 1 large file
→ Warning: Large file detected
OUTPUT:
⚠️ LARGE FILE DETECTED
════════════════════════════════════
Found large file that may bloat repository:
- public/videos/demo.mp4 (12.5 MB)
Changes to commit:
📄 Modified: 2
- app/Livewire/VideoPlayer.php
- resources/views/livewire/video-player.blade.php
Added: 1
- public/videos/demo.mp4 (12.5 MB) ⚠️
Recommendation:
Large files should be stored externally (S3, CDN) or
use Git LFS for version control.
Continue with commit? [y/n]
> n
Commit cancelled.
💡 SUGGESTIONS:
1. Move large files to external storage
2. Add to .gitignore if not needed in repository
3. Use Git LFS for large binary files
4. /sdd:story-save (retry after removing large files)
```
### Example 6: Fix Commit with Auto-Detection
```bash
INPUT:
/sdd:story-save
PROCESS:
→ Checking git status...
→ Found 2 modified files
→ Detecting story context...
→ Story: STORY-CART-003 - Shopping Cart Checkout
→ Analyzing changes...
→ Detected commit type: fix (error handling changes detected)
→ Generating commit message...
→ Creating commit...
OUTPUT:
✅ CHANGES COMMITTED
════════════════════════════════════
Commit: jkl3456
Type: fix
Scope: cart
Message: fix cart total calculation rounding error
Story: STORY-CART-003 - Shopping Cart Checkout
Changes:
- Fixed rounding error in cart total calculation
- Changed to use Decimal for currency calculations
- Updated tests to verify correct rounding
Files Changed: 2
📄 Modified: 2
- app/Services/CartService.php (+8/-4 lines)
- tests/Unit/CartServiceTest.php (+15/-2 lines)
Statistics:
Lines Added: 23
Lines Removed: 6
💡 NEXT STEPS:
1. /sdd:story-implement STORY-CART-003 - Continue development
2. /sdd:story-review - Move to code review when ready
3. git push - Push to remote when ready to share
```
## Edge Cases
### No Story Context Available
```
IF no story can be determined from branch or files:
- PROCEED with commit using generic scope
- USE directory name or "app" as scope
- SKIP story file update
- WARN: "No story context found - commit without story reference"
```
### Multiple Stories Detected
```
IF branch name doesn't match active story:
- WARN: "Branch name suggests [STORY-A] but active story is [STORY-B]"
- ASK: Which story should this commit be associated with?
- USE selected story for commit message and file update
```
### Untracked Story File
```
IF story file exists but is untracked:
- INCLUDE story file in commit
- NOTE: "Adding story file to repository"
- PROCEED with normal commit flow
```
### Commit Message Too Long
```
IF generated message exceeds 72 characters:
- TRUNCATE first line to 72 chars
- MOVE details to commit body
- ENSURE proper formatting
```
### Detached HEAD State
```
IF in detached HEAD state:
- WARN: "Currently in detached HEAD state"
- SHOW current commit
- SUGGEST: Create branch or checkout existing branch
- OFFER: Continue commit anyway? (y/n)
```
### Merge Conflicts Present
```
IF merge conflicts detected:
- HALT: "Cannot commit with unresolved merge conflicts"
- LIST conflicted files
- SUGGEST: Resolve conflicts first using git mergetool
- EXIT with error
```
## Error Handling
- **Not in git repository**: Return "Error: Not in a git repository. Run 'git init' first"
- **No changes to commit**: Show "Working tree clean" and exit gracefully
- **Git command fails**: Show git error and suggest manual resolution
- **Story file read error**: Warn and proceed without story context
- **Story file write error**: Show error but continue with commit (story update optional)
- **Large file detected**: Warn and ask for confirmation before proceeding
- **Sensitive file detected**: Warn strongly and require explicit confirmation
## Performance Considerations
- Use `git status --porcelain` for fast, parseable output
- Read only necessary parts of story file (don't parse everything)
- Cache story context within command execution
- Run git commands in sequence (they're fast enough)
- Skip expensive diff calculations for very large commits
- Use `git diff --stat` instead of full diff for summary
## Related Commands
- `/sdd:story-implement` - Generate implementation before saving
- `/sdd:story-continue` - Resume work before saving
- `/sdd:story-review` - Move to review after saving
- `/sdd:story-start` - Begin development before implementation
- `/sdd:project-status` - View all stories and their status
## Constraints
- ✅ MUST check for uncommitted changes
- ✅ MUST generate proper conventional commit message
- ✅ MUST update story file before committing
- ✅ MUST include story file in commit
- ⚠️ NEVER commit secrets or sensitive files without warning
- ⚠️ NEVER commit large files without confirmation
- 📋 SHOULD auto-detect commit type from changes
- 💡 SHOULD provide meaningful commit messages
- 🔧 SHOULD include story context in commit
- 💾 MUST verify commit succeeded before reporting success