glori-builder 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/CLAUDE.md +66 -0
- package/.claude/agents/architect.md +69 -0
- package/.claude/agents/database-architect.md +36 -0
- package/.claude/agents/designer.md +33 -0
- package/.claude/agents/developer.md +34 -0
- package/.claude/agents/git-workflow.md +60 -0
- package/.claude/agents/nextjs-migrator.md +28 -0
- package/.claude/agents/product-manager.md +44 -0
- package/.claude/agents/qa.md +44 -0
- package/.claude/agents/reviewer.md +55 -0
- package/.claude/agents/security-reviewer.md +34 -0
- package/.claude/agents/test-writer.md +26 -0
- package/.claude/commands/auto-pilot.md +228 -0
- package/.claude/commands/commit.md +7 -0
- package/.claude/commands/create-rules.md +356 -0
- package/.claude/commands/deploy-setup.md +158 -0
- package/.claude/commands/execute.md +101 -0
- package/.claude/commands/issue-prd.md +108 -0
- package/.claude/commands/issue-rework.md +272 -0
- package/.claude/commands/plan-feature.md +433 -0
- package/.claude/commands/plan-project.md +452 -0
- package/.claude/commands/prime.md +100 -0
- package/.claude/commands/project-setup.md +187 -0
- package/.claude/commands/quetrex-docs.md +188 -0
- package/.claude/commands/quetrex-setup.md +159 -0
- package/.claude/commands/quetrex-update.md +59 -0
- package/.claude/commands/secrets.md +122 -0
- package/.claude/commands/update-rules.md +143 -0
- package/.claude/hooks/auto-format.sh +27 -0
- package/.claude/hooks/check-quetrex-update.sh +34 -0
- package/.claude/hooks/enforce-branch.sh +66 -0
- package/.claude/hooks/security-check.sh +39 -0
- package/.claude/settings.json +89 -0
- package/.claude/skills/agent-browser/SKILL.md +251 -0
- package/.claude/skills/domain-capture/SKILL.md +385 -0
- package/.claude/skills/e2e-test/SKILL.md +213 -0
- package/.claude/skills/merge-issue/SKILL.md +126 -0
- package/.claude/skills/qa-verify/SKILL.md +194 -0
- package/.claude/skills/story-builder/SKILL.md +231 -0
- package/.claude/skills/tab-control/SKILL.md +92 -0
- package/.claude/statusline-command.sh +159 -0
- package/.claude/team-protocol.md +28 -0
- package/README.md +86 -0
- package/install.js +102 -0
- package/package.json +34 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e2e-test
|
|
3
|
+
description: Comprehensive end-to-end testing command. Launches parallel sub-agents to research the codebase (structure, database schema, potential bugs), then uses Claude's native MCP browser tools to test every user journey — taking screenshots, validating UI/UX, and querying the database to verify records. Run after implementation to validate everything before code review.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# End-to-End Application Testing
|
|
8
|
+
|
|
9
|
+
## Pre-flight Check
|
|
10
|
+
|
|
11
|
+
### 1. Platform Check
|
|
12
|
+
|
|
13
|
+
MCP browser tools require **Linux, WSL, or macOS**. Check the platform:
|
|
14
|
+
```bash
|
|
15
|
+
uname -s
|
|
16
|
+
```
|
|
17
|
+
- `Linux` or `Darwin` → proceed
|
|
18
|
+
- Anything else (e.g., `MINGW`, `CYGWIN`, or native Windows) → stop with:
|
|
19
|
+
|
|
20
|
+
> "MCP browser tools only support Linux, WSL, and macOS. Please run this command from WSL or a Linux/macOS environment."
|
|
21
|
+
|
|
22
|
+
Stop execution if the platform is unsupported.
|
|
23
|
+
|
|
24
|
+
### 2. Frontend Check
|
|
25
|
+
|
|
26
|
+
Verify the application has a browser-accessible frontend. Check for:
|
|
27
|
+
- A `package.json` with a dev/start script serving a UI
|
|
28
|
+
- Frontend framework files (pages/, app/, src/components/, index.html, etc.)
|
|
29
|
+
- Web server configuration
|
|
30
|
+
|
|
31
|
+
If no frontend is detected:
|
|
32
|
+
> "This application doesn't appear to have a browser-accessible frontend. E2E browser testing requires a UI to visit. For backend-only or API testing, a different approach is needed."
|
|
33
|
+
|
|
34
|
+
Stop execution if no frontend is found.
|
|
35
|
+
|
|
36
|
+
### 3. MCP Browser Tools Setup
|
|
37
|
+
|
|
38
|
+
Load the browser tools with ToolSearch before starting:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
select:mcp__claude-in-chrome__tabs_context_mcp,mcp__claude-in-chrome__navigate,mcp__claude-in-chrome__find,mcp__claude-in-chrome__browser_batch,mcp__claude-in-chrome__read_page,mcp__claude-in-chrome__read_console_messages,mcp__claude-in-chrome__resize_window,mcp__claude-in-chrome__tabs_close_mcp
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Requires Chrome with the Claude Code extension installed.
|
|
45
|
+
|
|
46
|
+
If the MCP tools are not available, stop with:
|
|
47
|
+
> "MCP browser tools are not available. Ensure Chrome is running with the Claude Code extension installed, then re-run this command."
|
|
48
|
+
|
|
49
|
+
## Phase 1: Parallel Research
|
|
50
|
+
|
|
51
|
+
Launch **three sub-agents simultaneously** using the Task tool. All three run in parallel.
|
|
52
|
+
|
|
53
|
+
### Sub-agent 1: Application Structure & User Journeys
|
|
54
|
+
|
|
55
|
+
> Research this codebase thoroughly. Return a structured summary covering:
|
|
56
|
+
>
|
|
57
|
+
> 1. **How to start the application** — exact commands to install dependencies and run the dev server, including the URL and port it serves on
|
|
58
|
+
> 2. **Authentication/login** — if the app has protected routes, how to create a test account or log in (credentials from .env.example, seed data, or sign-up flow)
|
|
59
|
+
> 3. **Every user-facing route/page** — each URL path and what it renders
|
|
60
|
+
> 4. **Every user journey** — complete flows a user can take (e.g., "sign up → create profile → view public page"). For each journey, list the specific steps, interactions (clicks, form fills, navigation), and expected outcomes
|
|
61
|
+
> 5. **Key UI components** — forms, modals, dropdowns, pickers, toggles, and other interactive elements that need testing
|
|
62
|
+
>
|
|
63
|
+
> Be exhaustive. Testing will only cover what you identify here.
|
|
64
|
+
|
|
65
|
+
### Sub-agent 2: Database Schema & Data Flows
|
|
66
|
+
|
|
67
|
+
> Research this codebase's database layer. Read `.env.example` to understand environment variables for database connections. DO NOT read `.env` directly. Return a structured summary covering:
|
|
68
|
+
>
|
|
69
|
+
> 1. **Database type and connection** — what database is used (Postgres, MySQL, SQLite, etc.) and the environment variable name for the connection string (from .env.example)
|
|
70
|
+
> 2. **Full schema** — every table, its columns, types, and relationships
|
|
71
|
+
> 3. **Data flows per user action** — for each user-facing action (form submit, button click, etc.), document exactly what records are created, updated, or deleted and in which tables
|
|
72
|
+
> 4. **Validation queries** — for each data flow, provide the exact query to verify records are correct after the action
|
|
73
|
+
|
|
74
|
+
### Sub-agent 3: Bug Hunting
|
|
75
|
+
|
|
76
|
+
> Analyze this codebase for potential bugs, issues, and code quality problems. Focus on:
|
|
77
|
+
>
|
|
78
|
+
> 1. **Logic errors** — incorrect conditionals, off-by-one errors, missing null checks, race conditions
|
|
79
|
+
> 2. **UI/UX issues** — missing error handling in forms, no loading states, broken responsive layouts, accessibility problems
|
|
80
|
+
> 3. **Data integrity risks** — missing validation, potential orphaned records, incorrect cascade behavior
|
|
81
|
+
> 4. **Security concerns** — SQL injection, XSS, missing auth checks, exposed secrets
|
|
82
|
+
>
|
|
83
|
+
> Return a prioritized list with file paths and line numbers.
|
|
84
|
+
|
|
85
|
+
**Wait for all three sub-agents to complete before proceeding.**
|
|
86
|
+
|
|
87
|
+
## Phase 2: Start the Application
|
|
88
|
+
|
|
89
|
+
Using Sub-agent 1's startup instructions:
|
|
90
|
+
|
|
91
|
+
1. Install dependencies if needed
|
|
92
|
+
2. Start the dev server **in the background** (e.g., `npm run dev &`)
|
|
93
|
+
3. Wait for the server to be ready
|
|
94
|
+
4. Create a new browser tab using `mcp__claude-in-chrome__tabs_create_mcp`
|
|
95
|
+
5. Navigate to the app URL using `mcp__claude-in-chrome__navigate` and confirm it loaded using `mcp__claude-in-chrome__read_page`
|
|
96
|
+
|
|
97
|
+
## Phase 3: Create Task List
|
|
98
|
+
|
|
99
|
+
Using the user journeys from Sub-agent 1 and findings from Sub-agent 3, create a task (using TaskCreate) for each user journey. Each task should include:
|
|
100
|
+
|
|
101
|
+
- **subject:** The journey name (e.g., "Test profile creation flow")
|
|
102
|
+
- **description:** Steps to execute, expected outcomes, database records to verify, and any related bug findings from Sub-agent 3
|
|
103
|
+
- **activeForm:** Present continuous (e.g., "Testing profile creation flow")
|
|
104
|
+
|
|
105
|
+
Also create a final task: "Responsive testing across viewports."
|
|
106
|
+
|
|
107
|
+
## Phase 4: User Journey Testing
|
|
108
|
+
|
|
109
|
+
For each task, mark it `in_progress` with TaskUpdate and execute the following.
|
|
110
|
+
|
|
111
|
+
### 4a. Browser Testing
|
|
112
|
+
|
|
113
|
+
Use the Claude MCP browser tools for all browser interaction:
|
|
114
|
+
|
|
115
|
+
| Action | Tool |
|
|
116
|
+
|---|---|
|
|
117
|
+
| Navigate to page | `mcp__claude-in-chrome__navigate` |
|
|
118
|
+
| Find interactive elements | `mcp__claude-in-chrome__find` |
|
|
119
|
+
| Click element | `mcp__claude-in-chrome__browser_batch` with click action |
|
|
120
|
+
| Fill form field | `mcp__claude-in-chrome__form_input` |
|
|
121
|
+
| Take screenshot | `mcp__claude-in-chrome__computer` (screenshot action) — save description of what you see |
|
|
122
|
+
| Wait for page to settle | `mcp__claude-in-chrome__read_page` |
|
|
123
|
+
| Check console errors | `mcp__claude-in-chrome__read_console_messages` with pattern for errors |
|
|
124
|
+
| Get page text | `mcp__claude-in-chrome__get_page_text` |
|
|
125
|
+
| Set viewport | `mcp__claude-in-chrome__resize_window` |
|
|
126
|
+
|
|
127
|
+
For each step in a user journey:
|
|
128
|
+
|
|
129
|
+
1. Use `mcp__claude-in-chrome__find` to locate current interactive elements
|
|
130
|
+
2. Perform the interaction via the appropriate MCP tool
|
|
131
|
+
3. Wait for the page to settle using `mcp__claude-in-chrome__read_page`
|
|
132
|
+
4. **Take a screenshot** using `mcp__claude-in-chrome__computer` — record a description of what you see, organized by journey (e.g., "profile-creation step 3: form submitted successfully, showing confirmation banner")
|
|
133
|
+
5. **Analyze the screenshot** — check for visual correctness, UX issues, broken layouts, missing content, error states
|
|
134
|
+
6. Check `mcp__claude-in-chrome__read_console_messages` periodically for JavaScript errors
|
|
135
|
+
|
|
136
|
+
Be thorough. Go through EVERY interaction, EVERY form field, EVERY button. The goal is that by the time this finishes, every part of the UI has been exercised.
|
|
137
|
+
|
|
138
|
+
### 4b. Database Validation
|
|
139
|
+
|
|
140
|
+
After any interaction that should modify data (form submits, deletions, updates):
|
|
141
|
+
|
|
142
|
+
1. Query the database to verify records. Use the environment variable from Sub-agent 2's research for the connection string and the schema docs to know what to check.
|
|
143
|
+
- **Postgres:** use `psql` directly — e.g., `psql "$DATABASE_URL" -c "SELECT theme FROM profiles WHERE username = 'testuser'"`
|
|
144
|
+
- **SQLite:** use `sqlite3` directly — e.g., `sqlite3 db.sqlite "SELECT theme FROM profiles WHERE username = 'testuser'"`
|
|
145
|
+
- **Other databases:** write a small ad hoc script in the application's language, run it, then delete it
|
|
146
|
+
2. Verify:
|
|
147
|
+
- Records created/updated/deleted as expected
|
|
148
|
+
- Values match what was entered in the UI
|
|
149
|
+
- Relationships between records are correct
|
|
150
|
+
- No orphaned or duplicate records
|
|
151
|
+
|
|
152
|
+
### 4c. Issue Handling
|
|
153
|
+
|
|
154
|
+
When an issue is found (UI bug, database mismatch, JS error):
|
|
155
|
+
|
|
156
|
+
1. **Document it:** what was expected vs what happened, screenshot description, relevant DB query results
|
|
157
|
+
2. **Fix the code** — make the correction directly
|
|
158
|
+
3. **Re-run the failing step** to verify the fix worked
|
|
159
|
+
4. **Take a new screenshot** confirming the fix
|
|
160
|
+
|
|
161
|
+
### 4d. Responsive Testing
|
|
162
|
+
|
|
163
|
+
For the responsive testing task, revisit key pages at these viewports using `mcp__claude-in-chrome__resize_window`:
|
|
164
|
+
|
|
165
|
+
- **Mobile:** width 375, height 812
|
|
166
|
+
- **Tablet:** width 768, height 1024
|
|
167
|
+
- **Desktop:** width 1440, height 900
|
|
168
|
+
|
|
169
|
+
At each viewport, screenshot every major page. Analyze for layout issues, overflow, broken alignment, and touch target sizes on mobile.
|
|
170
|
+
|
|
171
|
+
After completing each journey, mark its task as `completed` with TaskUpdate.
|
|
172
|
+
|
|
173
|
+
## Phase 5: Cleanup
|
|
174
|
+
|
|
175
|
+
After all testing is complete:
|
|
176
|
+
1. Stop the dev server background process
|
|
177
|
+
2. Close the browser tab using `mcp__claude-in-chrome__tabs_close_mcp`
|
|
178
|
+
|
|
179
|
+
## Phase 6: Report
|
|
180
|
+
|
|
181
|
+
### Text Summary (always output)
|
|
182
|
+
|
|
183
|
+
Present a concise summary:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
## E2E Testing Complete
|
|
187
|
+
|
|
188
|
+
**Journeys Tested:** [count]
|
|
189
|
+
**Screenshots Captured:** [count]
|
|
190
|
+
**Issues Found:** [count] ([count] fixed, [count] remaining)
|
|
191
|
+
|
|
192
|
+
### Issues Fixed During Testing
|
|
193
|
+
- [Description] — [file:line]
|
|
194
|
+
|
|
195
|
+
### Remaining Issues
|
|
196
|
+
- [Description] — [severity: high/medium/low] — [file:line]
|
|
197
|
+
|
|
198
|
+
### Bug Hunt Findings (from code analysis)
|
|
199
|
+
- [Description] — [severity] — [file:line]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Markdown Export (ask first)
|
|
203
|
+
|
|
204
|
+
After the text summary, ask the user:
|
|
205
|
+
|
|
206
|
+
> "Would you like me to export the full testing report to a markdown file? It includes per-journey breakdowns, screenshot descriptions, database validation results, and detailed findings — useful as context for follow-up fixes or GitHub issues."
|
|
207
|
+
|
|
208
|
+
If yes, write a detailed report to `e2e-test-report.md` in the project root containing:
|
|
209
|
+
- Full summary with stats
|
|
210
|
+
- Per-journey breakdown: steps taken, screenshot descriptions, database checks, issues found
|
|
211
|
+
- All issues with full details, fix status, and file references
|
|
212
|
+
- Bug hunt findings from the code analysis sub-agent
|
|
213
|
+
- Recommendations for any unresolved issues
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: merge-issue
|
|
3
|
+
description: Merge a PR and update Linear issue status to Human Review
|
|
4
|
+
argument-hint: <ISSUE-ID e.g. SMA-57>
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Merge Issue PR and Update Linear Status
|
|
9
|
+
|
|
10
|
+
## Input Validation
|
|
11
|
+
|
|
12
|
+
Issue identifier: `$ARGUMENTS`
|
|
13
|
+
|
|
14
|
+
If `$ARGUMENTS` is empty or missing, say: "Usage: `/merge-issue SMA-{N}` — please provide an issue ID." and STOP.
|
|
15
|
+
|
|
16
|
+
Parse the team key and issue number (e.g., "SMA-57" → team key "SMA", number 57). If parsing fails, say: "Could not parse issue ID from `$ARGUMENTS`. Expected format: SMA-57" and STOP.
|
|
17
|
+
|
|
18
|
+
## Step 1: Find the PR
|
|
19
|
+
|
|
20
|
+
Search for an open PR whose branch contains the issue identifier:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
gh pr list --state open --json number,title,headRefName
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Match on the branch name (e.g., `sma-57`). If no open PR is found:
|
|
27
|
+
1. Check if a merged/closed PR exists: `gh pr list --state merged --json number,title,headRefName` and search for the issue.
|
|
28
|
+
2. If found merged, say: "**$ARGUMENTS already merged** (PR #{number}). No action needed." and STOP.
|
|
29
|
+
3. If found closed (not merged), say: "PR #{number} for $ARGUMENTS was closed without merging. Check Linear for status." and STOP.
|
|
30
|
+
4. If no PR exists at all, say: "No PR found for $ARGUMENTS. Has one been created yet?" and STOP.
|
|
31
|
+
|
|
32
|
+
Display:
|
|
33
|
+
- **PR #**: {number}
|
|
34
|
+
- **Title**: {title}
|
|
35
|
+
- **Branch**: {headRefName}
|
|
36
|
+
|
|
37
|
+
## Step 2: Verify CI Status
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
gh pr checks {PR_NUMBER}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If any required check is failing, warn the user and ask whether to proceed.
|
|
44
|
+
|
|
45
|
+
## Step 3: Merge the PR
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
gh pr merge {PR_NUMBER} --merge --delete-branch
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
If merge fails, report the error and STOP.
|
|
52
|
+
|
|
53
|
+
## Step 4: Update Linear Status to "Human: Review"
|
|
54
|
+
|
|
55
|
+
**MANDATORY — this is the entire reason this skill exists. NEVER skip.**
|
|
56
|
+
|
|
57
|
+
Read the `LINEAR_API_KEY` from the environment.
|
|
58
|
+
|
|
59
|
+
**Step 4a** — Look up the team UUID dynamically using the team key parsed from `$ARGUMENTS`:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
63
|
+
-H "Content-Type: application/json" \
|
|
64
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
65
|
+
-d '{"query": "{ teams(filter: { key: { eq: \"TEAM_KEY\" } }) { nodes { id key name } } }"}'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Replace `TEAM_KEY` with the parsed team key (e.g., "SMA"). Extract the `id` field — this is the team UUID.
|
|
69
|
+
|
|
70
|
+
**Step 4b** — Get the issue UUID:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
74
|
+
-H "Content-Type: application/json" \
|
|
75
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
76
|
+
-d '{"query": "{ team(id: \"TEAM_UUID\") { issues(filter: { number: { eq: ISSUE_NUMBER } }) { nodes { id identifier title state { name } } } } }"}'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Step 4c** — Find the "Human: Review" state by name. Query the team's workflow states and find the one whose name contains "review" or "human review" (case-insensitive):
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
83
|
+
-H "Content-Type: application/json" \
|
|
84
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
85
|
+
-d '{"query": "{ team(id: \"TEAM_UUID\") { states { nodes { id name } } } }"}'
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
From the results, select the state whose name matches (case-insensitive) "human: review", "human review", or contains both "human" and "review". If multiple states match and you cannot determine which is correct, list them to the user and ask which to use before proceeding.
|
|
89
|
+
|
|
90
|
+
**Step 4d** — Set the issue status:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
94
|
+
-H "Content-Type: application/json" \
|
|
95
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
96
|
+
-d '{"query": "mutation { issueUpdate(id: \"ISSUE_UUID\", input: { stateId: \"REVIEW_STATE_ID\" }) { success issue { identifier title state { name } } } }"}'
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Verify** the mutation returned `success: true`. If it failed, report the error.
|
|
100
|
+
|
|
101
|
+
## Step 5: Clean Up
|
|
102
|
+
|
|
103
|
+
Delete the local branch if it exists and return to main:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
git branch -D {BRANCH_NAME} 2>/dev/null
|
|
107
|
+
git checkout main && git pull origin main
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Step 6: Confirm
|
|
111
|
+
|
|
112
|
+
Report EXACTLY:
|
|
113
|
+
|
|
114
|
+
> **$ARGUMENTS merged and moved to Human: Review.**
|
|
115
|
+
> - PR #{PR_NUMBER} merged
|
|
116
|
+
> - Linear status: Human: Review
|
|
117
|
+
> - Branch {BRANCH_NAME} deleted
|
|
118
|
+
|
|
119
|
+
Then STOP.
|
|
120
|
+
|
|
121
|
+
## Rules
|
|
122
|
+
|
|
123
|
+
- NEVER set an issue to "Complete" — only the human does that
|
|
124
|
+
- NEVER skip the Linear status update
|
|
125
|
+
- NEVER hardcode team UUIDs or state IDs — always look them up dynamically
|
|
126
|
+
- If any step fails, report clearly what failed and what state things are in
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-verify
|
|
3
|
+
description: >
|
|
4
|
+
Run the pre-merge QA checklist before any PR is considered complete.
|
|
5
|
+
Use when finishing implementation work to verify typecheck, lint, build,
|
|
6
|
+
tests, and — when a rename or removal was involved — prove with unfiltered
|
|
7
|
+
grep output that zero traces of the old term remain. Never mark a task done
|
|
8
|
+
without passing this checklist.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# QA Verify Skill
|
|
12
|
+
|
|
13
|
+
Invoke as `/qa-verify` at the end of any implementation task before marking it done or opening a PR.
|
|
14
|
+
|
|
15
|
+
## Why this skill exists
|
|
16
|
+
|
|
17
|
+
Agents were marking rename/removal tasks complete while references remained in
|
|
18
|
+
shell scripts, config files, and directory names that were invisible to
|
|
19
|
+
file-type-filtered searches. This checklist closes that gap by requiring
|
|
20
|
+
unfiltered, repo-wide grep output as proof of completion.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Pre-Merge Checklist
|
|
25
|
+
|
|
26
|
+
Run every check in order. A single failure means the task is NOT done.
|
|
27
|
+
|
|
28
|
+
### 1. Typecheck
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pnpm run typecheck
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Expected: zero errors. Fix all errors before proceeding.
|
|
35
|
+
|
|
36
|
+
### 2. Lint
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx biome check .
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Expected: zero errors. Run `npx biome check --write .` to auto-fix, then
|
|
43
|
+
re-run the read-only check to confirm.
|
|
44
|
+
|
|
45
|
+
### 3. Build
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pnpm run build
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Expected: exits 0. Key packages must compile successfully.
|
|
52
|
+
|
|
53
|
+
### 4. Tests
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm test
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Expected: all tests pass. Fix or note any pre-existing failures explicitly.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Rename / Removal Verification
|
|
64
|
+
|
|
65
|
+
Run these additional steps whenever the task involved renaming something,
|
|
66
|
+
removing a brand, removing a dependency, or purging any term from the codebase.
|
|
67
|
+
|
|
68
|
+
Replace `TERM` with the word or phrase being removed (case-insensitive).
|
|
69
|
+
|
|
70
|
+
### 5. Unfiltered content search
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
grep -ri "TERM" . \
|
|
74
|
+
| grep -v node_modules \
|
|
75
|
+
| grep -v pnpm-lock \
|
|
76
|
+
| grep -v dist \
|
|
77
|
+
| grep -v ".git/"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**No file-type filters.** This must search `.sh`, `.yml`, `.yaml`, `.json`,
|
|
81
|
+
`.toml`, `.env`, `.md`, `.txt`, Dockerfiles, Makefiles — everything.
|
|
82
|
+
|
|
83
|
+
Expected: zero results (or only intentional/documented exceptions such as
|
|
84
|
+
LICENSE copyright headers, CHANGELOG entries, or external reference docs).
|
|
85
|
+
Every result must be explained in the PR description.
|
|
86
|
+
|
|
87
|
+
### 6. Filename search
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
find . -iname "*TERM*" \
|
|
91
|
+
| grep -v node_modules \
|
|
92
|
+
| grep -v dist \
|
|
93
|
+
| grep -v ".git/"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Expected: zero results. Rename or remove any matching files or directories.
|
|
97
|
+
|
|
98
|
+
### 7. Branch name search
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
git branch -a | grep -i TERM
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Expected: zero results. Delete or rename any matching local or remote branches.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Security Checks
|
|
109
|
+
|
|
110
|
+
### 8. No secrets in committed files
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
grep -ri "api_key\|secret\|password\|token" . \
|
|
114
|
+
| grep -v node_modules \
|
|
115
|
+
| grep -v pnpm-lock \
|
|
116
|
+
| grep -v ".git/" \
|
|
117
|
+
| grep -v ".example\|.sample\|SKILL.md\|README"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Review every result. If a real secret appears outside an `.example` or `.env`
|
|
121
|
+
file that is gitignored, remove it before committing.
|
|
122
|
+
|
|
123
|
+
### 9. No `any` types in TypeScript
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
grep -rn ": any\b\|as any\b" --include="*.ts" --include="*.tsx" . \
|
|
127
|
+
| grep -v node_modules \
|
|
128
|
+
| grep -v dist
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Expected: zero results. The project runs TypeScript strict mode.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## PR Quality
|
|
136
|
+
|
|
137
|
+
### 10. Feature branch
|
|
138
|
+
|
|
139
|
+
Confirm the current branch is NOT `main` or `master`:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git branch --show-current
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 11. Conventional commits
|
|
146
|
+
|
|
147
|
+
All commits on the branch must follow Conventional Commits format:
|
|
148
|
+
`type(scope): description` — e.g. `feat:`, `fix:`, `chore:`, `refactor:`.
|
|
149
|
+
|
|
150
|
+
### 12. PR description includes verification output
|
|
151
|
+
|
|
152
|
+
The PR body must include:
|
|
153
|
+
|
|
154
|
+
- The actual terminal output from the unfiltered grep (step 5), showing zero
|
|
155
|
+
results or explicitly annotated exceptions.
|
|
156
|
+
- The actual output from the filename search (step 6).
|
|
157
|
+
- Confirmation that typecheck, lint, build, and tests all passed.
|
|
158
|
+
|
|
159
|
+
Paste the raw output — do not paraphrase it. Zero-result output is valid proof.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Quick-Run Script
|
|
164
|
+
|
|
165
|
+
A helper script at `scripts/qa-verify.sh` automates steps 1–7 and prints a
|
|
166
|
+
PASS/FAIL summary. Run it as:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# Standard pre-merge check
|
|
170
|
+
bash scripts/qa-verify.sh
|
|
171
|
+
|
|
172
|
+
# With rename/removal verification
|
|
173
|
+
bash scripts/qa-verify.sh --term TERM
|
|
174
|
+
|
|
175
|
+
# Via pnpm
|
|
176
|
+
pnpm qa
|
|
177
|
+
pnpm qa -- --term TERM
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The script exits non-zero if any check fails. Always fix failures before
|
|
181
|
+
marking the task done.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Failure Protocol
|
|
186
|
+
|
|
187
|
+
If any check fails:
|
|
188
|
+
|
|
189
|
+
1. Fix the issue immediately — do not defer it.
|
|
190
|
+
2. Re-run the full checklist from the top.
|
|
191
|
+
3. Do not mark the task `done` or open the PR until the checklist passes clean.
|
|
192
|
+
4. If a check cannot be fixed (e.g., a pre-existing test failure unrelated to
|
|
193
|
+
your change), document it explicitly in the PR description with evidence that
|
|
194
|
+
it pre-exists your change.
|