feat: wire team sync push into ship, retro, qa, and greptile skills

Add non-fatal sync steps to all 4 skill templates:
- /ship Step 8.5: write ship log JSON + push after PR creation
- /retro Step 13: push snapshot after JSON save
- /qa Phase 6.7: write qa-sync.json + push after health score
- greptile-triage: push each triage entry after history file writes

All calls use || true for zero disruption. Silent when sync not
configured.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-03-15 19:42:54 -05:00
parent dc3fcc8611
commit 06f2da2019
7 changed files with 113 additions and 0 deletions
+15
View File
@@ -259,6 +259,21 @@ $B snapshot -i -a -o "$REPORT_DIR/screenshots/issue-002.png"
}
```
7. **Sync to team** (non-fatal, silent if not configured):
```bash
cat > .gstack/qa-reports/qa-sync.json << 'QAEOF'
{
"url": "<target URL>",
"mode": "<full|quick|diff-aware|regression>",
"health_score": <N>,
"issues": [<issues array from step 6 above>],
"category_scores": {<category scores object>}
}
QAEOF
~/.claude/skills/gstack/bin/gstack-sync push-qa .gstack/qa-reports/qa-sync.json 2>/dev/null && echo "Synced to team ✓" || true
```
Substitute actual values. Uses snake_case keys matching the Supabase schema.
**Regression mode:** After writing the report, load the baseline file. Compare:
- Health score delta
- Issues fixed (in baseline but not current)
+15
View File
@@ -233,6 +233,21 @@ $B snapshot -i -a -o "$REPORT_DIR/screenshots/issue-002.png"
}
```
7. **Sync to team** (non-fatal, silent if not configured):
```bash
cat > .gstack/qa-reports/qa-sync.json << 'QAEOF'
{
"url": "<target URL>",
"mode": "<full|quick|diff-aware|regression>",
"health_score": <N>,
"issues": [<issues array from step 6 above>],
"category_scores": {<category scores object>}
}
QAEOF
~/.claude/skills/gstack/bin/gstack-sync push-qa .gstack/qa-reports/qa-sync.json 2>/dev/null && echo "Synced to team ✓" || true
```
Substitute actual values. Uses snake_case keys matching the Supabase schema.
**Regression mode:** After writing the report, load the baseline file. Compare:
- Health score delta
- Issues fixed (in baseline but not current)
+5
View File
@@ -355,6 +355,11 @@ Include backlog data in the JSON when TODOS.md exists:
}
```
After writing the JSON snapshot, sync to the team store (non-fatal, silent if not configured):
```bash
~/.claude/skills/gstack/bin/gstack-sync push-retro ".context/retros/${today}-${next}.json" 2>/dev/null && echo "Synced to team ✓" || true
```
### Step 14: Write the Narrative
Structure the output as:
+5
View File
@@ -346,6 +346,11 @@ Include backlog data in the JSON when TODOS.md exists:
}
```
After writing the JSON snapshot, sync to the team store (non-fatal, silent if not configured):
```bash
~/.claude/skills/gstack/bin/gstack-sync push-retro ".context/retros/${today}-${next}.json" 2>/dev/null && echo "Synced to team ✓" || true
```
### Step 14: Write the Narrative
Structure the output as:
+19
View File
@@ -204,6 +204,25 @@ Example entries:
2026-03-13 | garrytan/myapp | already-fixed | lib/payments.rb | error-handling
```
## Team Sync (non-fatal)
After appending to both history files, sync each triage entry to the team store. For each triaged comment, write a JSON entry and push:
```bash
cat > /tmp/gstack-greptile-entry.json << 'GEOF'
{
"date": "<YYYY-MM-DD>",
"repo": "<owner/repo from REMOTE_SLUG>",
"triage_type": "<fp|fix|already-fixed>",
"file_pattern": "<file-pattern>",
"category": "<category>"
}
GEOF
~/.claude/skills/gstack/bin/gstack-sync push-greptile /tmp/gstack-greptile-entry.json 2>/dev/null || true
```
If multiple comments were triaged, push each one individually (overwrite the temp file each time). Non-fatal — failures are queued for retry. Silent if sync is not configured.
---
## Output Format
+27
View File
@@ -408,6 +408,33 @@ EOF
---
## Step 8.5: Sync to Team (non-fatal)
After the PR is created, write a ship log and sync to the team store. This step is entirely silent if sync is not configured.
1. Write ship metadata to a temp file:
```bash
cat > /tmp/gstack-ship-log.json << 'SHIPEOF'
{
"version": "<new version from Step 4>",
"branch": "<current branch>",
"pr_url": "<PR URL from Step 8>",
"review_findings": { "critical": 0, "informational": 0 },
"greptile_stats": { "total": 0, "valid": 0, "fixed": 0, "fp": 0 },
"todos_completed": [],
"test_results": { "pass": true, "test_count": 0 }
}
SHIPEOF
```
Substitute actual values from the preceding steps. Use `0` for Greptile fields if no Greptile comments were found.
2. Push (non-fatal):
```bash
~/.claude/skills/gstack/bin/gstack-sync push-ship /tmp/gstack-ship-log.json 2>/dev/null && echo "Synced to team ✓" || true
```
---
## Important Rules
- **Never skip tests.** If tests fail, stop.
+27
View File
@@ -399,6 +399,33 @@ EOF
---
## Step 8.5: Sync to Team (non-fatal)
After the PR is created, write a ship log and sync to the team store. This step is entirely silent if sync is not configured.
1. Write ship metadata to a temp file:
```bash
cat > /tmp/gstack-ship-log.json << 'SHIPEOF'
{
"version": "<new version from Step 4>",
"branch": "<current branch>",
"pr_url": "<PR URL from Step 8>",
"review_findings": { "critical": 0, "informational": 0 },
"greptile_stats": { "total": 0, "valid": 0, "fixed": 0, "fp": 0 },
"todos_completed": [],
"test_results": { "pass": true, "test_count": 0 }
}
SHIPEOF
```
Substitute actual values from the preceding steps. Use `0` for Greptile fields if no Greptile comments were found.
2. Push (non-fatal):
```bash
~/.claude/skills/gstack/bin/gstack-sync push-ship /tmp/gstack-ship-log.json 2>/dev/null && echo "Synced to team ✓" || true
```
---
## Important Rules
- **Never skip tests.** If tests fail, stop.