* fix(workflows): agent-skills query keys must match subagent_type Eight workflow files called `gsd-sdk query agent-skills <KEY>` with a key that did not match any `subagent_type` Task() spawns in the same workflow (or any existing `agents/<KEY>.md`): - research-phase.md:45 — gsd-researcher → gsd-phase-researcher - plan-phase.md:36 — gsd-researcher → gsd-phase-researcher - plan-phase.md:38 — gsd-checker → gsd-plan-checker - quick.md:145 — gsd-checker → gsd-plan-checker - verify-work.md:36 — gsd-checker → gsd-plan-checker - new-milestone.md:207 — gsd-synthesizer → gsd-research-synthesizer - new-project.md:63 — gsd-synthesizer → gsd-research-synthesizer - ui-review.md:21 — gsd-ui-reviewer → gsd-ui-auditor - discuss-phase.md:114 — gsd-advisor → gsd-advisor-researcher Effect before this fix: users configuring `agent_skills.<correct-type>` in .planning/config.json got no injection on these paths because the workflow asked the SDK for a different (non-existent) key. The SDK correctly returned "" for the unknown key, which then interpolated as an empty string into the Task() prompt. Silent no-op. The discuss-phase advisor case is a subtle variant — the spawn site uses `subagent_type="general-purpose"` and loads the agent role via `Read(~/.claude/agents/gsd-advisor-researcher.md)`. The injection key must follow the agent identity (gsd-advisor-researcher), not the technical spawn type. This is a follow-up to #2555 — the SDK-side fix in that PR (#2587) only becomes fully effective once the call sites use the right keys. Adds `sdk/src/workflow-agent-skills-consistency.test.ts` as a contract test: every `agent-skills <slug>` invocation in `get-shit-done/workflows/**/*.md` must reference an existing `agents/<slug>.md`. Fails loudly on future key typos. Closes #2615 * test: harden workflow agent-skills regex per review feedback Review (#2616): CodeRabbit flagged the `agent-skills <slug>` pattern as too permissive (can match prose mentions of the string) and the per-line scan as brittle (misses commands wrapped across lines). - Require full `gsd-sdk query agent-skills` prefix before capture + `\b` around the pattern so prose references no longer match. - Scan each file's full content (not line-by-line) so `\s+` can span newlines; resolve 1-based line number from match index. - Add JSDoc on helpers and on QUERY_KEY_PATTERN. Verified: RED against base (`f30da83`) produces the same 9 violations as before; GREEN on fixed tree. --------- Co-authored-by: forfrossen <forfrossensvart@gmail.com>
191 lines
6.2 KiB
Markdown
191 lines
6.2 KiB
Markdown
<purpose>
|
|
Retroactive 6-pillar visual audit of implemented frontend code. Standalone command that works on any project — GSD-managed or not. Produces scored UI-REVIEW.md with actionable findings.
|
|
</purpose>
|
|
|
|
<required_reading>
|
|
@~/.claude/get-shit-done/references/ui-brand.md
|
|
</required_reading>
|
|
|
|
<available_agent_types>
|
|
Valid GSD subagent types (use exact names — do not fall back to 'general-purpose'):
|
|
- gsd-ui-auditor — Audits UI against design requirements
|
|
</available_agent_types>
|
|
|
|
<process>
|
|
|
|
## 0. Initialize
|
|
|
|
```bash
|
|
INIT=$(gsd-sdk query init.phase-op "${PHASE_ARG}")
|
|
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
AGENT_SKILLS_UI_REVIEWER=$(gsd-sdk query agent-skills gsd-ui-auditor 2>/dev/null)
|
|
```
|
|
|
|
Parse: `phase_dir`, `phase_number`, `phase_name`, `phase_slug`, `padded_phase`, `commit_docs`.
|
|
|
|
```bash
|
|
UI_AUDITOR_MODEL=$(gsd-sdk query resolve-model gsd-ui-auditor --raw)
|
|
```
|
|
|
|
Display banner:
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► UI AUDIT — PHASE {N}: {name}
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
```
|
|
|
|
## 1. Detect Input State
|
|
|
|
```bash
|
|
SUMMARY_FILES=$(ls "${PHASE_DIR}"/*-SUMMARY.md 2>/dev/null)
|
|
UI_SPEC_FILE=$(ls "${PHASE_DIR}"/*-UI-SPEC.md 2>/dev/null | head -1)
|
|
UI_REVIEW_FILE=$(ls "${PHASE_DIR}"/*-UI-REVIEW.md 2>/dev/null | head -1)
|
|
```
|
|
|
|
**If `SUMMARY_FILES` empty:** Exit — "Phase {N} not executed. Run /gsd:execute-phase {N} first."
|
|
|
|
|
|
**Text mode (`workflow.text_mode: true` in config or `--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS` OR `text_mode` from init JSON is `true`. When TEXT_MODE is active, replace every `AskUserQuestion` call with a plain-text numbered list and ask the user to type their choice number. This is required for non-Claude runtimes (OpenAI Codex, Gemini CLI, etc.) where `AskUserQuestion` is not available.
|
|
**If `UI_REVIEW_FILE` non-empty:** Use AskUserQuestion:
|
|
- header: "Existing UI Review"
|
|
- question: "UI-REVIEW.md already exists for Phase {N}."
|
|
- options:
|
|
- "Re-audit — run fresh audit"
|
|
- "View — display current review and exit"
|
|
|
|
If "View": display file, exit.
|
|
If "Re-audit": continue.
|
|
|
|
## 2. Gather Context Paths
|
|
|
|
Build file list for auditor:
|
|
- All SUMMARY.md files in phase dir
|
|
- All PLAN.md files in phase dir
|
|
- UI-SPEC.md (if exists — audit baseline)
|
|
- CONTEXT.md (if exists — locked decisions)
|
|
|
|
## 3. Spawn gsd-ui-auditor
|
|
|
|
```
|
|
◆ Spawning UI auditor...
|
|
```
|
|
|
|
Build prompt:
|
|
|
|
```markdown
|
|
Read ~/.claude/agents/gsd-ui-auditor.md for instructions.
|
|
|
|
<objective>
|
|
Conduct 6-pillar visual audit of Phase {phase_number}: {phase_name}
|
|
{If UI-SPEC exists: "Audit against UI-SPEC.md design contract."}
|
|
{If no UI-SPEC: "Audit against abstract 6-pillar standards."}
|
|
</objective>
|
|
|
|
<files_to_read>
|
|
- {summary_paths} (Execution summaries)
|
|
- {plan_paths} (Execution plans — what was intended)
|
|
- {ui_spec_path} (UI Design Contract — audit baseline, if exists)
|
|
- {context_path} (User decisions, if exists)
|
|
</files_to_read>
|
|
|
|
${AGENT_SKILLS_UI_REVIEWER}
|
|
|
|
<config>
|
|
phase_dir: {phase_dir}
|
|
padded_phase: {padded_phase}
|
|
</config>
|
|
```
|
|
|
|
Omit null file paths.
|
|
|
|
```
|
|
Task(
|
|
prompt=ui_audit_prompt,
|
|
subagent_type="gsd-ui-auditor",
|
|
model="{UI_AUDITOR_MODEL}",
|
|
description="UI Audit Phase {N}"
|
|
)
|
|
```
|
|
|
|
## 4. Handle Return
|
|
|
|
**If `## UI REVIEW COMPLETE`:**
|
|
|
|
Display score summary:
|
|
|
|
```
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
GSD ► UI AUDIT COMPLETE ✓
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
**Phase {N}: {Name}** — Overall: {score}/24
|
|
|
|
| Pillar | Score |
|
|
|--------|-------|
|
|
| Copywriting | {N}/4 |
|
|
| Visuals | {N}/4 |
|
|
| Color | {N}/4 |
|
|
| Typography | {N}/4 |
|
|
| Spacing | {N}/4 |
|
|
| Experience Design | {N}/4 |
|
|
|
|
Top fixes:
|
|
1. {fix}
|
|
2. {fix}
|
|
3. {fix}
|
|
|
|
Full review: {path to UI-REVIEW.md}
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
|
|
## ▶ Next
|
|
|
|
`/clear` then one of:
|
|
|
|
- `/gsd:verify-work {N}` — UAT testing
|
|
- `/gsd:plan-phase {N+1}` — plan next phase
|
|
|
|
- `/gsd:verify-work {N}` — UAT testing
|
|
- `/gsd:plan-phase {N+1}` — plan next phase
|
|
|
|
───────────────────────────────────────────────────────────────
|
|
```
|
|
|
|
## Automated UI Verification (when Playwright-MCP is available)
|
|
|
|
If `mcp__playwright__*` tools are accessible in this session:
|
|
|
|
1. Navigate to each UI component described in the phase's UI-SPEC.md using
|
|
`mcp__playwright__navigate` (or equivalent Playwright-MCP tool).
|
|
2. Take a screenshot of each component using `mcp__playwright__screenshot`.
|
|
3. Compare against the spec's visual requirements — dimensions, color palette,
|
|
layout, spacing scale, and typography.
|
|
4. Report any dimension, color, or layout discrepancies automatically as
|
|
additional findings within the relevant pillar section of UI-REVIEW.md.
|
|
5. Flag items that require human judgment (brand feel, content tone) as
|
|
`needs_human_review: true` in the findings — these are surfaced to the user
|
|
separately after the automated pass completes.
|
|
|
|
If Playwright-MCP is not available in this session, this section is skipped
|
|
entirely. The audit falls back to the standard code-only review described above.
|
|
No configuration change is required — the availability of `mcp__playwright__*`
|
|
tools is detected at runtime.
|
|
|
|
## 5. Commit (if configured)
|
|
|
|
```bash
|
|
gsd-sdk query commit "docs(${padded_phase}): UI audit review" "${PHASE_DIR}/${PADDED_PHASE}-UI-REVIEW.md"
|
|
```
|
|
|
|
</process>
|
|
|
|
<success_criteria>
|
|
- [ ] Phase validated
|
|
- [ ] SUMMARY.md files found (execution completed)
|
|
- [ ] Existing review handled (re-audit/view)
|
|
- [ ] gsd-ui-auditor spawned with correct context
|
|
- [ ] UI-REVIEW.md created in phase directory
|
|
- [ ] Score summary displayed to user
|
|
- [ ] Next steps presented
|
|
</success_criteria>
|