mirror of
https://github.com/garrytan/gstack.git
synced 2026-05-07 05:56:41 +02:00
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:
@@ -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');
|
||||
});
|
||||
|
||||
|
||||
@@ -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=.+/);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user