Initial commit
This commit is contained in:
244
commands/ship.md
Normal file
244
commands/ship.md
Normal file
@@ -0,0 +1,244 @@
|
||||
---
|
||||
description: Quality-gated merge to parent branch - validates code quality before allowing merge
|
||||
args:
|
||||
- name: --force-quality
|
||||
description: Override quality threshold (e.g., --force-quality 70)
|
||||
required: false
|
||||
- name: --skip-tests
|
||||
description: Skip test validation (not recommended)
|
||||
required: false
|
||||
---
|
||||
|
||||
## User Input
|
||||
|
||||
```text
|
||||
$ARGUMENTS
|
||||
```
|
||||
|
||||
You **MUST** consider the user input before proceeding (if not empty).
|
||||
|
||||
## Goal
|
||||
|
||||
Execute final quality gate validation and merge to parent branch.
|
||||
|
||||
**Purpose**: Enforce quality standards before merging features/bugfixes, preventing low-quality code from entering the codebase.
|
||||
|
||||
**Workflow**: Quality Analysis → Threshold Check → Merge (if passing)
|
||||
|
||||
**Quality Gates**:
|
||||
- Default threshold: 80% quality score
|
||||
- Configurable via `--force-quality` flag
|
||||
- Reads `.specswarm/quality-standards.md` for project-specific thresholds
|
||||
|
||||
---
|
||||
|
||||
## Pre-Flight Checks
|
||||
|
||||
```bash
|
||||
# Ensure we're in a git repository
|
||||
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
echo "❌ Error: Not in a git repository"
|
||||
echo ""
|
||||
echo "This command must be run from within a git repository."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get repository root
|
||||
REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
# Parse arguments
|
||||
FORCE_QUALITY=""
|
||||
SKIP_TESTS=false
|
||||
|
||||
for arg in $ARGUMENTS; do
|
||||
case "$arg" in
|
||||
--force-quality)
|
||||
shift
|
||||
FORCE_QUALITY="$1"
|
||||
;;
|
||||
--skip-tests)
|
||||
SKIP_TESTS=true
|
||||
;;
|
||||
esac
|
||||
done
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Execution Steps
|
||||
|
||||
### Step 1: Display Banner
|
||||
|
||||
```bash
|
||||
echo "🚢 SpecSwarm Ship - Quality-Gated Merge"
|
||||
echo "══════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "This command enforces quality standards before merge:"
|
||||
echo " 1. Runs comprehensive quality analysis"
|
||||
echo " 2. Checks quality score meets threshold"
|
||||
echo " 3. If passing: merges to parent branch"
|
||||
echo " 4. If failing: reports issues and blocks merge"
|
||||
echo ""
|
||||
|
||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||
echo "📍 Current branch: $CURRENT_BRANCH"
|
||||
echo ""
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 2: Run Quality Analysis
|
||||
|
||||
**YOU MUST NOW run the quality analysis using the SlashCommand tool:**
|
||||
|
||||
```
|
||||
Use the SlashCommand tool to execute: /specswarm:analyze-quality
|
||||
```
|
||||
|
||||
Wait for the quality analysis to complete and extract the quality score from the output.
|
||||
|
||||
**Expected Output Pattern**: Look for quality score in output (e.g., "Overall Quality: 85%")
|
||||
|
||||
Store the quality score as QUALITY_SCORE.
|
||||
|
||||
---
|
||||
|
||||
### Step 3: Check Quality Threshold
|
||||
|
||||
**YOU MUST NOW check if quality meets threshold:**
|
||||
|
||||
```bash
|
||||
# Determine threshold
|
||||
DEFAULT_THRESHOLD=80
|
||||
|
||||
# Check for project-specific threshold in .specswarm/quality-standards.md
|
||||
THRESHOLD=$DEFAULT_THRESHOLD
|
||||
|
||||
if [ -f ".specswarm/quality-standards.md" ]; then
|
||||
# Try to extract threshold from quality standards file
|
||||
PROJECT_THRESHOLD=$(grep -i "^quality_threshold:" .specswarm/quality-standards.md | grep -oE '[0-9]+' || echo "")
|
||||
if [ -n "$PROJECT_THRESHOLD" ]; then
|
||||
THRESHOLD=$PROJECT_THRESHOLD
|
||||
echo "📋 Using project quality threshold: ${THRESHOLD}%"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Override with --force-quality if provided
|
||||
if [ -n "$FORCE_QUALITY" ]; then
|
||||
THRESHOLD=$FORCE_QUALITY
|
||||
echo "⚠️ Quality threshold overridden: ${THRESHOLD}%"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🎯 Quality Threshold: ${THRESHOLD}%"
|
||||
echo "📊 Actual Quality Score: ${QUALITY_SCORE}%"
|
||||
echo ""
|
||||
```
|
||||
|
||||
**Decision Logic**:
|
||||
|
||||
IF QUALITY_SCORE >= THRESHOLD:
|
||||
- ✅ Quality gate PASSED
|
||||
- Proceed to Step 4 (Merge)
|
||||
ELSE:
|
||||
- ❌ Quality gate FAILED
|
||||
- Display failure message
|
||||
- List top issues from analysis
|
||||
- Suggest fixes
|
||||
- EXIT without merging
|
||||
|
||||
```bash
|
||||
if [ "$QUALITY_SCORE" -ge "$THRESHOLD" ]; then
|
||||
echo "✅ Quality gate PASSED (${QUALITY_SCORE}% >= ${THRESHOLD}%)"
|
||||
echo ""
|
||||
else
|
||||
echo "❌ Quality gate FAILED (${QUALITY_SCORE}% < ${THRESHOLD}%)"
|
||||
echo ""
|
||||
echo "The code quality does not meet the required threshold."
|
||||
echo ""
|
||||
echo "🔧 Recommended Actions:"
|
||||
echo " 1. Review the quality analysis output above"
|
||||
echo " 2. Address critical and high-priority issues"
|
||||
echo " 3. Run /specswarm:analyze-quality again to verify improvements"
|
||||
echo " 4. Run /specswarm:ship again when quality improves"
|
||||
echo ""
|
||||
echo "💡 Alternatively:"
|
||||
echo " - Override threshold: /specswarm:ship --force-quality 70"
|
||||
echo " - Note: Overriding quality gates is not recommended for production code"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Step 4: Merge to Parent Branch
|
||||
|
||||
**Quality gate passed! YOU MUST NOW merge using the SlashCommand tool:**
|
||||
|
||||
```
|
||||
Use the SlashCommand tool to execute: /specswarm:complete
|
||||
```
|
||||
|
||||
Wait for the merge to complete.
|
||||
|
||||
---
|
||||
|
||||
### Step 5: Success Report
|
||||
|
||||
**After successful merge, display:**
|
||||
|
||||
```bash
|
||||
echo ""
|
||||
echo "══════════════════════════════════════════"
|
||||
echo "🎉 SHIP SUCCESSFUL"
|
||||
echo "══════════════════════════════════════════"
|
||||
echo ""
|
||||
echo "✅ Quality gate passed (${QUALITY_SCORE}%)"
|
||||
echo "✅ Merged to parent branch"
|
||||
echo "✅ Feature/bugfix complete"
|
||||
echo ""
|
||||
echo "📝 Next Steps:"
|
||||
echo " - Pull latest changes in other branches"
|
||||
echo " - Consider creating a release tag if ready"
|
||||
echo " - Update project documentation if needed"
|
||||
echo ""
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling
|
||||
|
||||
If any step fails:
|
||||
|
||||
1. **Quality analysis fails**: Report error and suggest checking logs
|
||||
2. **Quality threshold not met**: Display issues and exit (see Step 3)
|
||||
3. **Merge fails**: Report git errors and suggest manual resolution
|
||||
|
||||
**All errors should EXIT with clear remediation steps.**
|
||||
|
||||
---
|
||||
|
||||
## Notes
|
||||
|
||||
**Design Philosophy**:
|
||||
- Quality gates prevent technical debt accumulation
|
||||
- Encourages addressing issues before merge (not after)
|
||||
- Configurable thresholds balance strictness with pragmatism
|
||||
- Override flag available but discouraged for production code
|
||||
|
||||
**Quality Standards File** (`.specswarm/quality-standards.md`):
|
||||
```yaml
|
||||
---
|
||||
quality_threshold: 85
|
||||
enforce_gates: true
|
||||
---
|
||||
|
||||
# Project Quality Standards
|
||||
|
||||
Minimum quality threshold: 85%
|
||||
...
|
||||
```
|
||||
|
||||
If `enforce_gates: false`, ship will warn but not block merge.
|
||||
Reference in New Issue
Block a user