mirror of https://github.com/garrytan/gstack.git
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:
parent
dc3fcc8611
commit
06f2da2019
15
qa/SKILL.md
15
qa/SKILL.md
|
|
@ -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:
|
**Regression mode:** After writing the report, load the baseline file. Compare:
|
||||||
- Health score delta
|
- Health score delta
|
||||||
- Issues fixed (in baseline but not current)
|
- Issues fixed (in baseline but not current)
|
||||||
|
|
|
||||||
|
|
@ -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:
|
**Regression mode:** After writing the report, load the baseline file. Compare:
|
||||||
- Health score delta
|
- Health score delta
|
||||||
- Issues fixed (in baseline but not current)
|
- Issues fixed (in baseline but not current)
|
||||||
|
|
|
||||||
|
|
@ -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
|
### Step 14: Write the Narrative
|
||||||
|
|
||||||
Structure the output as:
|
Structure the output as:
|
||||||
|
|
|
||||||
|
|
@ -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
|
### Step 14: Write the Narrative
|
||||||
|
|
||||||
Structure the output as:
|
Structure the output as:
|
||||||
|
|
|
||||||
|
|
@ -204,6 +204,25 @@ Example entries:
|
||||||
2026-03-13 | garrytan/myapp | already-fixed | lib/payments.rb | error-handling
|
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
|
## Output Format
|
||||||
|
|
|
||||||
|
|
@ -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
|
## Important Rules
|
||||||
|
|
||||||
- **Never skip tests.** If tests fail, stop.
|
- **Never skip tests.** If tests fail, stop.
|
||||||
|
|
|
||||||
|
|
@ -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
|
## Important Rules
|
||||||
|
|
||||||
- **Never skip tests.** If tests fail, stop.
|
- **Never skip tests.** If tests fail, stop.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue