qualia-framework 2.1.0 → 2.1.3
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/framework/hooks/session-context-loader.sh +61 -12
- package/framework/hooks/skill-announce.sh +18 -0
- package/framework/hooks/tool-error-announce.sh +18 -0
- package/framework/skills/qualia-help/SKILL.md +2 -1
- package/framework/skills/qualia-production-check/SKILL.md +314 -0
- package/package.json +7 -2
|
@@ -1,28 +1,77 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# SessionStart hook —
|
|
3
|
-
#
|
|
4
|
-
# This hook just passes along any resume hints
|
|
5
|
-
|
|
2
|
+
# SessionStart hook — teal-branded session context
|
|
3
|
+
# Shows resume hints to user via stderr, passes context to Claude via JSON stdout
|
|
6
4
|
source "$(dirname "$0")/qualia-colors.sh"
|
|
7
5
|
|
|
8
6
|
CWD=$(pwd)
|
|
9
7
|
SESSION_DIR="$HOME/.claude/session-env"
|
|
10
8
|
COMPACT_FILE="$SESSION_DIR/pre-compact.json"
|
|
11
|
-
|
|
9
|
+
PROJECT=$(basename "$CWD")
|
|
12
10
|
|
|
13
|
-
#
|
|
14
|
-
|
|
11
|
+
# ─── Visual output (stderr → user sees this) ───
|
|
12
|
+
q_header "SESSION START"
|
|
15
13
|
|
|
16
|
-
#
|
|
14
|
+
# Last session info
|
|
17
15
|
if [ -f "$COMPACT_FILE" ]; then
|
|
18
16
|
LAST_PROJECT=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('$COMPACT_FILE','utf8'));process.stdout.write(d.project_name||'')}catch(e){}" 2>/dev/null)
|
|
19
|
-
|
|
17
|
+
LAST_BRANCH=$(node -e "try{const d=JSON.parse(require('fs').readFileSync('$COMPACT_FILE','utf8'));process.stdout.write(d.git_branch||'')}catch(e){}" 2>/dev/null)
|
|
18
|
+
if [ -n "$LAST_PROJECT" ] && [ "$LAST_PROJECT" != ".claude" ]; then
|
|
19
|
+
q_info "Last session: ${LAST_PROJECT} (${LAST_BRANCH:-no branch})"
|
|
20
|
+
fi
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Current project
|
|
24
|
+
q_pass "Project: ${PROJECT}"
|
|
25
|
+
|
|
26
|
+
# Handoff file
|
|
27
|
+
if [ -f "$CWD/.continue-here.md" ]; then
|
|
28
|
+
q_warn "Handoff file found — .continue-here.md"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Errors / warnings
|
|
32
|
+
ERRORS=0
|
|
33
|
+
|
|
34
|
+
# Check hooks health
|
|
35
|
+
HOOKS_OK=0
|
|
36
|
+
HOOKS_TOTAL=0
|
|
37
|
+
for h in branch-guard pre-commit confirm-delete migration-validate pre-deploy-gate block-env-edit auto-format session-context-loader retention-cleanup pre-compact save-session-state session-learn notification-speak qualia-colors; do
|
|
38
|
+
HOOKS_TOTAL=$((HOOKS_TOTAL + 1))
|
|
39
|
+
[ -f "$HOME/.claude/hooks/${h}.sh" ] && HOOKS_OK=$((HOOKS_OK + 1))
|
|
40
|
+
done
|
|
41
|
+
|
|
42
|
+
if [ "$HOOKS_OK" -eq "$HOOKS_TOTAL" ]; then
|
|
43
|
+
q_pass "Hooks: ${HOOKS_OK}/${HOOKS_TOTAL}"
|
|
44
|
+
else
|
|
45
|
+
q_fail "Hooks: ${HOOKS_OK}/${HOOKS_TOTAL} — $(( HOOKS_TOTAL - HOOKS_OK )) missing"
|
|
46
|
+
ERRORS=$((ERRORS + 1))
|
|
20
47
|
fi
|
|
21
48
|
|
|
22
|
-
|
|
23
|
-
|
|
49
|
+
# Check CLAUDE.md exists
|
|
50
|
+
if [ -f "$HOME/.claude/CLAUDE.md" ]; then
|
|
51
|
+
ROLE=$(grep -m1 "^## Role:" "$HOME/.claude/CLAUDE.md" 2>/dev/null | sed 's/^## Role: *//')
|
|
52
|
+
q_pass "Role: ${ROLE:-unknown}"
|
|
24
53
|
else
|
|
25
|
-
|
|
54
|
+
q_fail "CLAUDE.md missing — run npx qualia-framework"
|
|
55
|
+
ERRORS=$((ERRORS + 1))
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# Check settings.json valid
|
|
59
|
+
if [ -f "$HOME/.claude/settings.json" ]; then
|
|
60
|
+
node -e "JSON.parse(require('fs').readFileSync('$HOME/.claude/settings.json','utf8'))" 2>/dev/null
|
|
61
|
+
if [ $? -eq 0 ]; then
|
|
62
|
+
q_pass "Settings: valid"
|
|
63
|
+
else
|
|
64
|
+
q_fail "Settings: invalid JSON!"
|
|
65
|
+
ERRORS=$((ERRORS + 1))
|
|
66
|
+
fi
|
|
26
67
|
fi
|
|
27
68
|
|
|
69
|
+
if [ "$ERRORS" -gt 0 ]; then
|
|
70
|
+
q_warn "${ERRORS} issue(s) — check above"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
q_info "Activating Qualia mode..."
|
|
74
|
+
|
|
75
|
+
# ─── JSON output (stdout → Claude reads this) ───
|
|
76
|
+
printf '{"continue":true}'
|
|
28
77
|
exit 0
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Announce skill activation in teal — fires on every Skill() invocation
|
|
3
|
+
source "$(dirname "$0")/qualia-colors.sh"
|
|
4
|
+
|
|
5
|
+
if [ ! -t 0 ]; then
|
|
6
|
+
INPUT=$(cat)
|
|
7
|
+
SKILL_NAME=$(echo "$INPUT" | node -e "try{const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));process.stdout.write(d.tool_input?.skill||d.tool_input?.name||'')}catch(e){}" 2>/dev/null)
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
[ -z "$SKILL_NAME" ] && exit 0
|
|
11
|
+
|
|
12
|
+
# Clean up skill name for display
|
|
13
|
+
DISPLAY_NAME=$(echo "$SKILL_NAME" | sed 's/-/ /g' | sed 's/qualia //g')
|
|
14
|
+
|
|
15
|
+
q_header "${DISPLAY_NAME^^} activated"
|
|
16
|
+
|
|
17
|
+
printf '{"continue":true}'
|
|
18
|
+
exit 0
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Announce tool failures in teal+red — fires on PostToolUseFailure
|
|
3
|
+
source "$(dirname "$0")/qualia-colors.sh"
|
|
4
|
+
|
|
5
|
+
if [ ! -t 0 ]; then
|
|
6
|
+
INPUT=$(cat)
|
|
7
|
+
TOOL_NAME=$(echo "$INPUT" | node -e "try{const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));process.stdout.write(d.tool_name||'')}catch(e){}" 2>/dev/null)
|
|
8
|
+
ERROR=$(echo "$INPUT" | node -e "try{const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));process.stdout.write(d.error||d.tool_output?.stderr||'')}catch(e){}" 2>/dev/null)
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
[ -z "$TOOL_NAME" ] && exit 0
|
|
12
|
+
|
|
13
|
+
q_header "ERROR"
|
|
14
|
+
q_fail "${TOOL_NAME} failed"
|
|
15
|
+
[ -n "$ERROR" ] && q_info "$(echo "$ERROR" | head -3)"
|
|
16
|
+
|
|
17
|
+
printf '{"continue":true}'
|
|
18
|
+
exit 0
|
|
@@ -60,8 +60,9 @@ Display the command reference. Output only — no analysis, no suggestions, just
|
|
|
60
60
|
### Quality & Deployment
|
|
61
61
|
| Skill | Description |
|
|
62
62
|
|-------|-------------|
|
|
63
|
+
| `qualia-production-check` | Final client-handoff audit — 5 agents check UX, auth, backend, perf, completeness |
|
|
63
64
|
| `qualia-audit-milestone` | Verify milestone definition of done |
|
|
64
65
|
| `qualia-plan-milestone-gaps` | Create fix phases from audit gaps |
|
|
65
|
-
| `qualia-review` |
|
|
66
|
+
| `qualia-review` | Code review (security, quality, architecture) |
|
|
66
67
|
| `ship` | Full production deployment pipeline |
|
|
67
68
|
| `team` | Agent team orchestration |
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-production-check
|
|
3
|
+
description: "Final client-handoff production audit — spawns 5+ specialist agents to check EVERYTHING before handing a project to a client. Frontend, backend, auth, UX, Supabase, silent errors, misconfigs, SEO, performance, accessibility, legal pages, error handling — the works. Use this skill whenever the user says 'production check', 'client ready', 'is it ready', 'final check', 'handoff check', 'production audit', 'ready for client', 'qualia-production-check', 'final audit', 'pre-handoff', or wants to verify a project is truly ready to give to a client."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Qualia Production Check — Client-Handoff Audit
|
|
7
|
+
|
|
8
|
+
This is THE final check before handing a project to a client. Not a code review — a **production readiness audit** that checks everything a real user will experience.
|
|
9
|
+
|
|
10
|
+
Spawns 5 specialist agents in parallel, each checking a different dimension. Then synthesizes into a structured verdict with actionable next steps.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
- `/qualia-production-check` — Full audit (all 5 dimensions)
|
|
15
|
+
|
|
16
|
+
## Process
|
|
17
|
+
|
|
18
|
+
### Step 1: Load Context
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
cat .planning/PROJECT.md 2>/dev/null || echo "NO_PROJECT"
|
|
22
|
+
cat .planning/REQUIREMENTS.md 2>/dev/null || echo "NO_REQUIREMENTS"
|
|
23
|
+
cat .planning/ROADMAP.md 2>/dev/null || echo "NO_ROADMAP"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
node -e "try{const p=require('./package.json');console.log(JSON.stringify({name:p.name,deps:Object.keys(p.dependencies||{}),devDeps:Object.keys(p.devDependencies||{})}))}catch(e){console.log('{}')}" 2>/dev/null
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ls -d app/ src/ pages/ components/ lib/ supabase/ public/ 2>/dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Read `~/.claude/rules/security.md` and `~/.claude/rules/frontend.md`.
|
|
35
|
+
|
|
36
|
+
Detect project type: website, AI agent, voice agent, web app, mobile.
|
|
37
|
+
|
|
38
|
+
Store all content — inline into agent prompts.
|
|
39
|
+
|
|
40
|
+
### Step 2: Spawn 5 Agents (parallel, single message)
|
|
41
|
+
|
|
42
|
+
All agents get PROJECT.md + REQUIREMENTS.md inlined. Every finding must include: **What** | **Where** (file:line) | **Impact on client/users** | **Fix** | **Severity** (BLOCKER / WARNING / INFO).
|
|
43
|
+
|
|
44
|
+
BLOCKER = client will see this and it's bad. WARNING = should fix but won't break. INFO = nice to have.
|
|
45
|
+
|
|
46
|
+
#### Agent 1: User Experience & Frontend
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Task(
|
|
50
|
+
prompt="You are auditing the user experience of a production web app that will be handed to a client.
|
|
51
|
+
|
|
52
|
+
<planning>{PROJECT.md + REQUIREMENTS.md}</planning>
|
|
53
|
+
<rules>{frontend.md}</rules>
|
|
54
|
+
|
|
55
|
+
Check EVERY page in app/ — open each page.tsx and layout.tsx:
|
|
56
|
+
|
|
57
|
+
1. **First impression** — Does the homepage look professional? Distinctive design or generic AI slop?
|
|
58
|
+
2. **Navigation** — Can users find everything? Are all nav links working? No dead links?
|
|
59
|
+
3. **Loading states** — Every async operation shows feedback (skeleton, spinner, progress)
|
|
60
|
+
4. **Error states** — What happens when API fails? Network disconnects? Wrong URL?
|
|
61
|
+
5. **Empty states** — What do lists/tables show when empty? Helpful message or just blank?
|
|
62
|
+
6. **Forms** — Validation on submit? Clear error messages? Success feedback? Disabled state while submitting?
|
|
63
|
+
7. **Mobile responsive** — Check for fixed widths, overflow, touch targets too small, text readable
|
|
64
|
+
8. **Typography** — Consistent fonts, readable sizes, proper hierarchy, no tiny gray text
|
|
65
|
+
9. **Images** — Using next/image? Alt text? Proper sizing? Not stretched or pixelated?
|
|
66
|
+
10. **404 page** — Does app/not-found.tsx exist? Is it styled? Does it help the user?
|
|
67
|
+
11. **Favicon & metadata** — Title, description, OG tags, favicon all set?
|
|
68
|
+
12. **Console errors** — Grep for console.log/console.error left in production code
|
|
69
|
+
13. **Accessibility** — Alt text, ARIA labels, keyboard navigation, color contrast
|
|
70
|
+
|
|
71
|
+
For EVERY finding: What | Where (file:line) | Impact on client | Fix | Severity (BLOCKER/WARNING/INFO)",
|
|
72
|
+
subagent_type="frontend-agent",
|
|
73
|
+
description="UX & frontend production audit"
|
|
74
|
+
)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### Agent 2: Auth, Security & Data Protection
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Task(
|
|
81
|
+
prompt="You are auditing authentication and security for client handoff.
|
|
82
|
+
|
|
83
|
+
<planning>{PROJECT.md + REQUIREMENTS.md}</planning>
|
|
84
|
+
<rules>{security.md}</rules>
|
|
85
|
+
|
|
86
|
+
Check:
|
|
87
|
+
|
|
88
|
+
1. **Auth flow completeness** — Login, signup, logout, password reset ALL work? Email verification?
|
|
89
|
+
2. **Protected routes** — Every dashboard/admin/settings page checks auth? What happens if unauthenticated user visits?
|
|
90
|
+
3. **RLS policies** — EVERY Supabase table has Row Level Security enabled WITH policies. No table left unprotected.
|
|
91
|
+
4. **Service role exposure** — Grep for service_role or SUPABASE_SERVICE_ROLE_KEY in ANY client-side file (app/, components/, src/). Must be ZERO.
|
|
92
|
+
5. **Server-side auth** — All mutations use supabase.auth.getUser() server-side. No client-side mutations with user-supplied IDs.
|
|
93
|
+
6. **Input validation** — All user inputs validated with Zod or equivalent. No raw req.body usage.
|
|
94
|
+
7. **XSS prevention** — No dangerouslySetInnerHTML. No eval(). No user content rendered unsanitized.
|
|
95
|
+
8. **CORS** — Properly restricted, not wildcard '*' in production.
|
|
96
|
+
9. **Rate limiting** — Auth endpoints (login, signup, reset) have rate limiting.
|
|
97
|
+
10. **Secrets in code** — No hardcoded API keys, passwords, tokens in source files.
|
|
98
|
+
11. **Environment variables** — All secrets in env vars. NEXT_PUBLIC_ only for client-safe values.
|
|
99
|
+
12. **Session management** — Tokens expire and refresh properly. Logout clears session.
|
|
100
|
+
|
|
101
|
+
For EVERY finding: What | Where (file:line) | Impact | Fix | Severity (BLOCKER/WARNING/INFO)",
|
|
102
|
+
subagent_type="backend-agent",
|
|
103
|
+
description="Auth & security production audit"
|
|
104
|
+
)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Agent 3: Backend, Database & API
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
Task(
|
|
111
|
+
prompt="You are auditing the backend and database for production readiness.
|
|
112
|
+
|
|
113
|
+
<planning>{PROJECT.md + REQUIREMENTS.md}</planning>
|
|
114
|
+
|
|
115
|
+
Check:
|
|
116
|
+
|
|
117
|
+
1. **API error handling** — Every API route/server action has try/catch. Errors return proper HTTP status codes with meaningful messages. No stack traces exposed to client.
|
|
118
|
+
2. **Database queries** — N+1 queries (Supabase calls in loops)? Missing indexes on filtered columns? Sequential queries that could be parallel?
|
|
119
|
+
3. **Server actions** — All data mutations use 'use server' actions, not client-side Supabase calls? Each checks auth first?
|
|
120
|
+
4. **Supabase connection** — Using server.ts for mutations, client.ts for reads? Connection pooling configured?
|
|
121
|
+
5. **Migrations** — All migrations applied? Types generated and up to date? Schema matches what code expects?
|
|
122
|
+
6. **Edge functions** — If supabase/functions/ exists: error handling, CORS, timeout protection, proper responses.
|
|
123
|
+
7. **Caching** — revalidatePath/revalidateTag after mutations? SWR/React Query configured with sensible stale times?
|
|
124
|
+
8. **Pagination** — Large data sets paginated? Not loading 10,000 rows into memory?
|
|
125
|
+
9. **File uploads** — If any: size limits, type validation, virus scanning, proper storage?
|
|
126
|
+
10. **Webhooks** — If any: signature verification, idempotency, error handling, retry logic?
|
|
127
|
+
11. **Background jobs** — Long-running operations handled async? Not blocking API responses?
|
|
128
|
+
12. **Monitoring** — Error tracking configured (Sentry or similar)? Logging meaningful events?
|
|
129
|
+
|
|
130
|
+
For EVERY finding: What | Where (file:line) | Impact | Fix | Severity (BLOCKER/WARNING/INFO)",
|
|
131
|
+
subagent_type="backend-agent",
|
|
132
|
+
description="Backend & database production audit"
|
|
133
|
+
)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### Agent 4: Performance & SEO
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Task(
|
|
140
|
+
prompt="You are auditing performance and SEO for a client-facing production site.
|
|
141
|
+
|
|
142
|
+
Check:
|
|
143
|
+
|
|
144
|
+
1. **Build succeeds** — Run npm run build mentally (check for obvious build errors in imports, missing modules)
|
|
145
|
+
2. **Bundle size** — Large library imports without tree-shaking? Barrel exports? Missing dynamic imports for heavy components (charts, editors, maps)?
|
|
146
|
+
3. **Images** — All using next/image? WebP/AVIF format? Proper width/height? Lazy loading below fold?
|
|
147
|
+
4. **Fonts** — Using next/font? No render-blocking external font loads?
|
|
148
|
+
5. **Core Web Vitals** — Largest Contentful Paint risks? Cumulative Layout Shift risks? Large unoptimized images above fold?
|
|
149
|
+
6. **SEO metadata** — Every page has title, description. Root layout has proper metadata. Open Graph tags for social sharing?
|
|
150
|
+
7. **Sitemap** — public/sitemap.xml exists? Lists all public pages?
|
|
151
|
+
8. **Robots.txt** — public/robots.txt exists? Not blocking important pages?
|
|
152
|
+
9. **Structured data** — JSON-LD for business info, breadcrumbs, or relevant schema?
|
|
153
|
+
10. **Canonical URLs** — Proper canonical tags to avoid duplicate content?
|
|
154
|
+
11. **Lighthouse hints** — Server components used where possible? No unnecessary 'use client' directives?
|
|
155
|
+
12. **API latency** — Any obvious slow queries or waterfalls in the data fetching pattern?
|
|
156
|
+
|
|
157
|
+
For EVERY finding: What | Where (file:line) | Impact | Fix | Severity (BLOCKER/WARNING/INFO)",
|
|
158
|
+
subagent_type="performance-oracle",
|
|
159
|
+
description="Performance & SEO production audit"
|
|
160
|
+
)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### Agent 5: Completeness & Missing Features
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
Task(
|
|
167
|
+
prompt="You are checking if a project is COMPLETE — nothing missing that a client would expect.
|
|
168
|
+
|
|
169
|
+
<planning>{PROJECT.md + REQUIREMENTS.md + ROADMAP.md}</planning>
|
|
170
|
+
|
|
171
|
+
Check against requirements AND common expectations:
|
|
172
|
+
|
|
173
|
+
1. **Requirements coverage** — Every requirement in REQUIREMENTS.md marked complete: does the feature ACTUALLY work in code? Grep for routes, components, API endpoints that implement each requirement.
|
|
174
|
+
2. **Missing pages** — Common pages that clients expect: About, Contact, Privacy Policy, Terms of Service, 404, 500 error page. Which are missing?
|
|
175
|
+
3. **Missing functionality** — Based on project type:
|
|
176
|
+
- Website: contact form works? Newsletter signup? Social links?
|
|
177
|
+
- Web app: settings page? Profile management? Change password? Delete account?
|
|
178
|
+
- AI agent: fallback responses? Rate limiting? Usage tracking?
|
|
179
|
+
4. **Email** — If the app sends emails: are they configured? Working? Proper templates? Not going to spam?
|
|
180
|
+
5. **Analytics** — Tracking configured? Google Analytics / Plausible / PostHog?
|
|
181
|
+
6. **Error boundaries** — app/error.tsx exists? Styled? Provides recovery action?
|
|
182
|
+
7. **Loading** — app/loading.tsx or Suspense boundaries on data-fetching pages?
|
|
183
|
+
8. **Favicon & branding** — Custom favicon (not Next.js default)? Proper app title? OG image?
|
|
184
|
+
9. **Legal compliance** — Cookie consent if in EU? Privacy policy if collecting data? Terms if SaaS?
|
|
185
|
+
10. **Mobile** — Site works on mobile? No horizontal scroll? Touch targets adequate?
|
|
186
|
+
11. **Cross-browser** — Any IE/Safari-specific CSS issues? Webkit prefixes needed?
|
|
187
|
+
12. **Deployment config** — Vercel configured? Environment variables set? Domain connected?
|
|
188
|
+
|
|
189
|
+
For EVERY finding: What | Where | Impact on client | Fix | Severity (BLOCKER/WARNING/INFO)",
|
|
190
|
+
subagent_type="general-purpose",
|
|
191
|
+
description="Completeness & missing features audit"
|
|
192
|
+
)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Step 3: Collect & Score
|
|
196
|
+
|
|
197
|
+
After all 5 agents return:
|
|
198
|
+
|
|
199
|
+
1. Deduplicate (same file:line from multiple agents)
|
|
200
|
+
2. Group by severity: BLOCKER → WARNING → INFO
|
|
201
|
+
3. Count totals
|
|
202
|
+
4. Determine verdict:
|
|
203
|
+
- **READY** — 0 blockers, 0 warnings (or all warnings are cosmetic)
|
|
204
|
+
- **ALMOST** — 0 blockers, some warnings
|
|
205
|
+
- **NOT READY** — has blockers
|
|
206
|
+
|
|
207
|
+
### Step 4: Present Report
|
|
208
|
+
|
|
209
|
+
Output as direct text (NOT via Bash):
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
◆ PRODUCTION CHECK — CLIENT HANDOFF AUDIT
|
|
213
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
214
|
+
|
|
215
|
+
Project: {name}
|
|
216
|
+
Date: {date}
|
|
217
|
+
Verdict: {READY / ALMOST / NOT READY}
|
|
218
|
+
|
|
219
|
+
BLOCKERS: {N} WARNINGS: {N} INFO: {N}
|
|
220
|
+
|
|
221
|
+
── BLOCKERS (must fix before handoff) ────────
|
|
222
|
+
{If none: "None — no blockers found"}
|
|
223
|
+
|
|
224
|
+
1. [{dimension}] {finding}
|
|
225
|
+
Location: {file:line}
|
|
226
|
+
Client impact: {what the client/user will experience}
|
|
227
|
+
Fix: {how to fix}
|
|
228
|
+
|
|
229
|
+
2. ...
|
|
230
|
+
|
|
231
|
+
── WARNINGS (should fix) ────────────────────
|
|
232
|
+
{findings}
|
|
233
|
+
|
|
234
|
+
── INFO (nice to have) ──────────────────────
|
|
235
|
+
{findings}
|
|
236
|
+
|
|
237
|
+
── DIMENSION SCORES ─────────────────────────
|
|
238
|
+
|
|
239
|
+
UX & Frontend {PASS/ISSUES} ({N} findings)
|
|
240
|
+
Auth & Security {PASS/ISSUES} ({N} findings)
|
|
241
|
+
Backend & Data {PASS/ISSUES} ({N} findings)
|
|
242
|
+
Performance & SEO {PASS/ISSUES} ({N} findings)
|
|
243
|
+
Completeness {PASS/ISSUES} ({N} findings)
|
|
244
|
+
|
|
245
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Step 5: Save Report
|
|
249
|
+
|
|
250
|
+
Write to `.planning/PRODUCTION-CHECK.md`:
|
|
251
|
+
|
|
252
|
+
```markdown
|
|
253
|
+
---
|
|
254
|
+
date: YYYY-MM-DD HH:MM
|
|
255
|
+
verdict: ready|almost|not_ready
|
|
256
|
+
blockers: N
|
|
257
|
+
warnings: N
|
|
258
|
+
info: N
|
|
259
|
+
dimensions:
|
|
260
|
+
ux: {pass|issues}
|
|
261
|
+
security: {pass|issues}
|
|
262
|
+
backend: {pass|issues}
|
|
263
|
+
performance: {pass|issues}
|
|
264
|
+
completeness: {pass|issues}
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
# Production Check — YYYY-MM-DD
|
|
268
|
+
|
|
269
|
+
{Full report content}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Commit:
|
|
273
|
+
```bash
|
|
274
|
+
git add .planning/PRODUCTION-CHECK.md && git commit -m "docs: production check ({verdict}, {blockers} blockers)"
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Step 6: Actionable Next Steps
|
|
278
|
+
|
|
279
|
+
Based on verdict:
|
|
280
|
+
|
|
281
|
+
**If NOT READY (has blockers):**
|
|
282
|
+
```
|
|
283
|
+
## What's Next?
|
|
284
|
+
|
|
285
|
+
This project has {N} blockers that clients WILL notice.
|
|
286
|
+
|
|
287
|
+
1. Fix blockers now — I'll fix them one by one with /qualia-quick
|
|
288
|
+
2. Create a fix milestone — /qualia-new-milestone to plan systematic fixes
|
|
289
|
+
3. See specific blocker — tell me which number to investigate
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**If ALMOST (warnings only):**
|
|
293
|
+
```
|
|
294
|
+
## What's Next?
|
|
295
|
+
|
|
296
|
+
No blockers — the project works. {N} warnings to consider.
|
|
297
|
+
|
|
298
|
+
1. Fix warnings — I'll handle the quick ones now
|
|
299
|
+
2. Ship as-is — warnings won't break anything for the client
|
|
300
|
+
3. Run /qualia-design — polish the visual design before handoff
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**If READY:**
|
|
304
|
+
```
|
|
305
|
+
## What's Next?
|
|
306
|
+
|
|
307
|
+
✓ Production ready. No blockers, no warnings worth fixing.
|
|
308
|
+
|
|
309
|
+
1. Ship it — /ship
|
|
310
|
+
2. Run /qualia-design — final visual polish (optional)
|
|
311
|
+
3. Generate handoff docs — project summary for the client
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Wait for user to select. Act on their choice.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qualia-framework",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"description": "Qualia Solutions — Claude Code Framework",
|
|
5
5
|
"bin": {
|
|
6
6
|
"qualia-framework": "./bin/cli.js"
|
|
@@ -18,7 +18,12 @@
|
|
|
18
18
|
"type": "git",
|
|
19
19
|
"url": "git+https://github.com/Qualiasolutions/qualia-framework.git"
|
|
20
20
|
},
|
|
21
|
-
"keywords": [
|
|
21
|
+
"keywords": [
|
|
22
|
+
"claude-code",
|
|
23
|
+
"qualia",
|
|
24
|
+
"framework",
|
|
25
|
+
"ai-dev"
|
|
26
|
+
],
|
|
22
27
|
"author": "Qualia Solutions",
|
|
23
28
|
"license": "UNLICENSED"
|
|
24
29
|
}
|