chore: regenerate SKILL.md files and update tests + TODOS

- Regenerate all SKILL.md from updated templates
- Update skill-validation tests for new gstack-slug output (3 vars)
  and new path patterns (plans/ceo, gstack-slug over REMOTE_SLUG)
- Update gen-skill-docs tests for new review path ($BRANCH.jsonl)
- Mark setup-gstack-upload + gstack-upload helper as superseded
  in TODOS.md (replaced by Supabase Storage)
- Fix last REMOTE_SLUG reference in greptile-triage.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-03-18 23:55:29 -07:00
parent f29232277a
commit d051f84060
15 changed files with 233 additions and 99 deletions
+2 -2
View File
@@ -329,14 +329,14 @@ describe('REVIEW_DASHBOARD resolver', () => {
for (const skill of REVIEW_SKILLS) {
test(`review dashboard appears in ${skill} generated file`, () => {
const content = fs.readFileSync(path.join(ROOT, skill, 'SKILL.md'), 'utf-8');
expect(content).toContain('reviews.jsonl');
expect(content).toContain('$BRANCH.jsonl');
expect(content).toContain('REVIEW READINESS DASHBOARD');
});
}
test('review dashboard appears in ship generated file', () => {
const content = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8');
expect(content).toContain('reviews.jsonl');
expect(content).toContain('$BRANCH.jsonl');
expect(content).toContain('REVIEW READINESS DASHBOARD');
});
+12 -25
View File
@@ -262,26 +262,12 @@ describe('Update check preamble', () => {
// --- Part 7: Cross-skill path consistency (A1) ---
describe('Cross-skill path consistency', () => {
test('REMOTE_SLUG derivation pattern is identical across files that use it', () => {
const patterns = extractRemoteSlugPatterns(ROOT, ['qa', 'review']);
const allPatterns: string[] = [];
for (const [, filePatterns] of patterns) {
allPatterns.push(...filePatterns);
}
// Should find at least 2 occurrences (qa/SKILL.md + review/greptile-triage.md)
expect(allPatterns.length).toBeGreaterThanOrEqual(2);
// All occurrences must be character-for-character identical
const unique = new Set(allPatterns);
if (unique.size > 1) {
const variants = Array.from(unique);
throw new Error(
`REMOTE_SLUG pattern differs across files:\n` +
variants.map((v, i) => ` ${i + 1}: ${v}`).join('\n')
);
}
test('all project-scoped paths use gstack-slug (not REMOTE_SLUG)', () => {
// greptile-triage.md was the last file using REMOTE_SLUG — now uses gstack-slug
const triageContent = fs.readFileSync(path.join(ROOT, 'review', 'greptile-triage.md'), 'utf-8');
expect(triageContent).toContain('gstack-slug');
expect(triageContent).not.toContain('REMOTE_SLUG');
expect(triageContent).toContain('$PROJECTS_DIR/$SLUG');
});
test('all greptile-history write references specify both per-project and global paths', () => {
@@ -297,7 +283,7 @@ describe('Cross-skill path consistency', () => {
const content = fs.readFileSync(filePath, 'utf-8');
const hasBoth = (content.includes('per-project') && content.includes('global')) ||
(content.includes('$REMOTE_SLUG/greptile-history') && content.includes('~/.gstack/greptile-history'));
(content.includes('$SLUG/greptile-history') && content.includes('~/.gstack/greptile-history'));
expect(hasBoth).toBe(true);
}
@@ -305,7 +291,7 @@ describe('Cross-skill path consistency', () => {
test('greptile-triage.md contains both project and global history paths', () => {
const content = fs.readFileSync(path.join(ROOT, 'review', 'greptile-triage.md'), 'utf-8');
expect(content).toContain('$REMOTE_SLUG/greptile-history.md');
expect(content).toContain('$SLUG/greptile-history.md');
expect(content).toContain('~/.gstack/greptile-history.md');
});
@@ -313,7 +299,7 @@ describe('Cross-skill path consistency', () => {
const content = fs.readFileSync(path.join(ROOT, 'retro', 'SKILL.md'), 'utf-8');
expect(content).toContain('~/.gstack/greptile-history.md');
// Should NOT reference per-project path for reads
expect(content).not.toContain('$REMOTE_SLUG/greptile-history.md');
expect(content).not.toContain('$SLUG/greptile-history.md');
});
});
@@ -736,7 +722,7 @@ describe('CEO review mode validation', () => {
});
test('has CEO plan persistence step', () => {
expect(content).toContain('ceo-plans');
expect(content).toContain('plans/ceo');
expect(content).toContain('status: ACTIVE');
});
@@ -789,9 +775,10 @@ describe('gstack-slug', () => {
test('output is eval-compatible (KEY=VALUE format)', () => {
const result = Bun.spawnSync([SLUG_BIN], { cwd: ROOT, stdout: 'pipe', stderr: 'pipe' });
const lines = result.stdout.toString().trim().split('\n');
expect(lines.length).toBe(2);
expect(lines.length).toBe(3);
expect(lines[0]).toMatch(/^SLUG=.+/);
expect(lines[1]).toMatch(/^BRANCH=.+/);
expect(lines[2]).toMatch(/^PROJECTS_DIR=.+/);
});
});