qualia-framework 2.6.0 → 3.1.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.md +63 -0
- package/README.md +108 -30
- package/agents/builder.md +110 -0
- package/agents/planner.md +186 -0
- package/agents/qa-browser.md +186 -0
- package/agents/verifier.md +369 -0
- package/bin/cli.js +691 -492
- package/bin/install.js +622 -0
- package/bin/qualia-ui.js +284 -0
- package/bin/state.js +824 -0
- package/bin/statusline.js +252 -0
- package/docs/erp-contract.md +161 -0
- package/guide.md +63 -0
- package/hooks/auto-update.js +117 -0
- package/hooks/block-env-edit.js +52 -0
- package/hooks/branch-guard.js +68 -0
- package/hooks/migration-guard.js +83 -0
- package/hooks/pre-compact.js +52 -0
- package/hooks/pre-deploy-gate.js +149 -0
- package/hooks/pre-push.js +53 -0
- package/hooks/session-start.js +126 -0
- package/package.json +30 -20
- package/rules/design-reference.md +179 -0
- package/rules/frontend.md +126 -0
- package/rules/infrastructure.md +87 -0
- package/skills/qualia/SKILL.md +88 -0
- package/skills/qualia-build/SKILL.md +115 -0
- package/skills/qualia-debug/SKILL.md +87 -0
- package/skills/qualia-design/SKILL.md +99 -0
- package/skills/qualia-handoff/SKILL.md +66 -0
- package/skills/qualia-help/SKILL.md +60 -0
- package/skills/qualia-idk/SKILL.md +8 -0
- package/skills/qualia-learn/SKILL.md +111 -0
- package/skills/qualia-new/SKILL.md +323 -0
- package/skills/qualia-pause/SKILL.md +63 -0
- package/skills/qualia-plan/SKILL.md +101 -0
- package/skills/qualia-polish/SKILL.md +207 -0
- package/skills/qualia-quick/SKILL.md +37 -0
- package/skills/qualia-report/SKILL.md +114 -0
- package/skills/qualia-resume/SKILL.md +49 -0
- package/skills/qualia-review/SKILL.md +161 -0
- package/skills/qualia-ship/SKILL.md +90 -0
- package/skills/qualia-skill-new/SKILL.md +167 -0
- package/skills/qualia-task/SKILL.md +91 -0
- package/skills/qualia-test/SKILL.md +134 -0
- package/skills/qualia-verify/SKILL.md +113 -0
- package/templates/DESIGN.md +475 -0
- package/templates/help.html +476 -0
- package/templates/plan.md +42 -0
- package/templates/project.md +22 -0
- package/templates/state.md +27 -0
- package/templates/tracking.json +20 -0
- package/tests/bin.test.sh +687 -0
- package/tests/hooks.test.sh +384 -0
- package/tests/runner.js +1956 -0
- package/tests/state.test.sh +713 -0
- package/tests/statusline.test.sh +243 -0
- package/bin/collect-metrics.sh +0 -62
- package/framework/.claudeignore +0 -51
- package/framework/CLAUDE.md +0 -51
- package/framework/MCP_SETUP.md +0 -229
- package/framework/agents/architecture-strategist.md +0 -53
- package/framework/agents/backend-agent.md +0 -150
- package/framework/agents/code-simplicity-reviewer.md +0 -86
- package/framework/agents/frontend-agent.md +0 -111
- package/framework/agents/kieran-typescript-reviewer.md +0 -96
- package/framework/agents/performance-oracle.md +0 -111
- package/framework/agents/qualia-codebase-mapper.md +0 -761
- package/framework/agents/qualia-debugger.md +0 -1204
- package/framework/agents/qualia-executor.md +0 -882
- package/framework/agents/qualia-integration-checker.md +0 -424
- package/framework/agents/qualia-phase-researcher.md +0 -457
- package/framework/agents/qualia-plan-checker.md +0 -700
- package/framework/agents/qualia-planner.md +0 -1245
- package/framework/agents/qualia-project-researcher.md +0 -603
- package/framework/agents/qualia-research-synthesizer.md +0 -200
- package/framework/agents/qualia-roadmapper.md +0 -606
- package/framework/agents/qualia-verifier.md +0 -686
- package/framework/agents/red-team-qa.md +0 -130
- package/framework/agents/security-auditor.md +0 -72
- package/framework/agents/team-orchestrator.md +0 -229
- package/framework/agents/teams/framework-audit-team.md +0 -66
- package/framework/agents/teams/full-stack-team.md +0 -48
- package/framework/agents/teams/optimize-team.md +0 -53
- package/framework/agents/teams/review-team.md +0 -70
- package/framework/agents/teams/ship-team.md +0 -86
- package/framework/agents/test-agent.md +0 -182
- package/framework/hooks/auto-format.sh +0 -54
- package/framework/hooks/block-env-edit.sh +0 -42
- package/framework/hooks/branch-guard.sh +0 -43
- package/framework/hooks/confirm-delete.sh +0 -59
- package/framework/hooks/migration-validate.sh +0 -77
- package/framework/hooks/notification-speak.sh +0 -16
- package/framework/hooks/pre-commit.sh +0 -100
- package/framework/hooks/pre-compact.sh +0 -56
- package/framework/hooks/pre-deploy-gate.sh +0 -160
- package/framework/hooks/qualia-colors.sh +0 -32
- package/framework/hooks/retention-cleanup.sh +0 -62
- package/framework/hooks/save-session-state.sh +0 -185
- package/framework/hooks/session-context-loader.sh +0 -96
- package/framework/hooks/session-learn.sh +0 -32
- package/framework/hooks/skill-announce.sh +0 -123
- package/framework/hooks/tool-error-announce.sh +0 -27
- package/framework/install.ps1 +0 -323
- package/framework/install.sh +0 -313
- package/framework/qualia-framework/VERSION +0 -1
- package/framework/qualia-framework/assets/qualia-logo.png +0 -0
- package/framework/qualia-framework/bin/collect-metrics.sh +0 -67
- package/framework/qualia-framework/bin/generate-report-docx.py +0 -429
- package/framework/qualia-framework/bin/qualia-tools.js +0 -2201
- package/framework/qualia-framework/bin/qualia-tools.test.js +0 -1054
- package/framework/qualia-framework/references/checkpoints.md +0 -775
- package/framework/qualia-framework/references/completion-checklists.md +0 -359
- package/framework/qualia-framework/references/continuation-format.md +0 -249
- package/framework/qualia-framework/references/continuation-prompt.md +0 -97
- package/framework/qualia-framework/references/decimal-phase-calculation.md +0 -65
- package/framework/qualia-framework/references/design-quality.md +0 -56
- package/framework/qualia-framework/references/employee-guide.md +0 -167
- package/framework/qualia-framework/references/git-integration.md +0 -254
- package/framework/qualia-framework/references/git-planning-commit.md +0 -50
- package/framework/qualia-framework/references/model-profile-resolution.md +0 -32
- package/framework/qualia-framework/references/model-profiles.md +0 -73
- package/framework/qualia-framework/references/phase-argument-parsing.md +0 -61
- package/framework/qualia-framework/references/planning-config.md +0 -195
- package/framework/qualia-framework/references/questioning.md +0 -141
- package/framework/qualia-framework/references/tdd.md +0 -263
- package/framework/qualia-framework/references/ui-brand.md +0 -160
- package/framework/qualia-framework/references/verification-patterns.md +0 -612
- package/framework/qualia-framework/templates/DEBUG.md +0 -159
- package/framework/qualia-framework/templates/DESIGN.md +0 -81
- package/framework/qualia-framework/templates/UAT.md +0 -247
- package/framework/qualia-framework/templates/codebase/architecture.md +0 -255
- package/framework/qualia-framework/templates/codebase/concerns.md +0 -310
- package/framework/qualia-framework/templates/codebase/conventions.md +0 -307
- package/framework/qualia-framework/templates/codebase/integrations.md +0 -280
- package/framework/qualia-framework/templates/codebase/stack.md +0 -186
- package/framework/qualia-framework/templates/codebase/structure.md +0 -285
- package/framework/qualia-framework/templates/codebase/testing.md +0 -480
- package/framework/qualia-framework/templates/config.json +0 -35
- package/framework/qualia-framework/templates/context.md +0 -283
- package/framework/qualia-framework/templates/continue-here.md +0 -78
- package/framework/qualia-framework/templates/debug-subagent-prompt.md +0 -91
- package/framework/qualia-framework/templates/discovery.md +0 -146
- package/framework/qualia-framework/templates/lab-notes.md +0 -16
- package/framework/qualia-framework/templates/milestone-archive.md +0 -123
- package/framework/qualia-framework/templates/milestone.md +0 -115
- package/framework/qualia-framework/templates/phase-prompt.md +0 -567
- package/framework/qualia-framework/templates/planner-subagent-prompt.md +0 -117
- package/framework/qualia-framework/templates/project.md +0 -184
- package/framework/qualia-framework/templates/projects/ai-agent.md +0 -156
- package/framework/qualia-framework/templates/projects/mobile-app.md +0 -181
- package/framework/qualia-framework/templates/projects/voice-agent.md +0 -134
- package/framework/qualia-framework/templates/projects/website.md +0 -137
- package/framework/qualia-framework/templates/requirements.md +0 -231
- package/framework/qualia-framework/templates/research-project/ARCHITECTURE.md +0 -204
- package/framework/qualia-framework/templates/research-project/FEATURES.md +0 -147
- package/framework/qualia-framework/templates/research-project/PITFALLS.md +0 -200
- package/framework/qualia-framework/templates/research-project/STACK.md +0 -120
- package/framework/qualia-framework/templates/research-project/SUMMARY.md +0 -170
- package/framework/qualia-framework/templates/research.md +0 -552
- package/framework/qualia-framework/templates/roadmap.md +0 -206
- package/framework/qualia-framework/templates/state.md +0 -179
- package/framework/qualia-framework/templates/summary-complex.md +0 -59
- package/framework/qualia-framework/templates/summary-minimal.md +0 -41
- package/framework/qualia-framework/templates/summary-standard.md +0 -48
- package/framework/qualia-framework/templates/summary.md +0 -246
- package/framework/qualia-framework/templates/user-setup.md +0 -311
- package/framework/qualia-framework/templates/verification-report.md +0 -322
- package/framework/qualia-framework/workflows/add-phase.md +0 -179
- package/framework/qualia-framework/workflows/add-todo.md +0 -157
- package/framework/qualia-framework/workflows/audit-milestone.md +0 -241
- package/framework/qualia-framework/workflows/check-todos.md +0 -176
- package/framework/qualia-framework/workflows/complete-milestone.md +0 -858
- package/framework/qualia-framework/workflows/diagnose-issues.md +0 -219
- package/framework/qualia-framework/workflows/discovery-phase.md +0 -289
- package/framework/qualia-framework/workflows/discuss-phase.md +0 -534
- package/framework/qualia-framework/workflows/execute-phase.md +0 -559
- package/framework/qualia-framework/workflows/execute-plan.md +0 -438
- package/framework/qualia-framework/workflows/help.md +0 -470
- package/framework/qualia-framework/workflows/insert-phase.md +0 -220
- package/framework/qualia-framework/workflows/list-phase-assumptions.md +0 -178
- package/framework/qualia-framework/workflows/map-codebase.md +0 -327
- package/framework/qualia-framework/workflows/new-milestone.md +0 -363
- package/framework/qualia-framework/workflows/new-project.md +0 -982
- package/framework/qualia-framework/workflows/pause-work.md +0 -122
- package/framework/qualia-framework/workflows/plan-milestone-gaps.md +0 -256
- package/framework/qualia-framework/workflows/plan-phase.md +0 -422
- package/framework/qualia-framework/workflows/progress.md +0 -389
- package/framework/qualia-framework/workflows/quick.md +0 -252
- package/framework/qualia-framework/workflows/remove-phase.md +0 -326
- package/framework/qualia-framework/workflows/research-phase.md +0 -74
- package/framework/qualia-framework/workflows/resume-project.md +0 -306
- package/framework/qualia-framework/workflows/set-profile.md +0 -80
- package/framework/qualia-framework/workflows/settings.md +0 -145
- package/framework/qualia-framework/workflows/transition.md +0 -556
- package/framework/qualia-framework/workflows/update.md +0 -197
- package/framework/qualia-framework/workflows/verify-phase.md +0 -195
- package/framework/qualia-framework/workflows/verify-work.md +0 -625
- package/framework/rules/context7.md +0 -14
- package/framework/rules/frontend.md +0 -33
- package/framework/rules/speed.md +0 -23
- package/framework/scripts/__pycache__/say.cpython-314.pyc +0 -0
- package/framework/scripts/apply-retention.sh +0 -120
- package/framework/scripts/bootstrap-pop-os.sh +0 -354
- package/framework/scripts/claude-voice +0 -13
- package/framework/scripts/cleanup.sh +0 -131
- package/framework/scripts/cowork-mode.sh +0 -141
- package/framework/scripts/generate-project-claude-md.sh +0 -153
- package/framework/scripts/load-test-webhook.js +0 -172
- package/framework/scripts/say.py +0 -236
- package/framework/scripts/showcase-video-recorder/ffmpeg-builder.js +0 -167
- package/framework/scripts/showcase-video-recorder/playwright-helpers.js +0 -216
- package/framework/scripts/speak.py +0 -55
- package/framework/scripts/speak.sh +0 -18
- package/framework/scripts/status.sh +0 -138
- package/framework/scripts/sync-to-framework.sh +0 -65
- package/framework/scripts/voice-hotkey.py +0 -227
- package/framework/scripts/voice-input.sh +0 -51
- package/framework/skills/animate/SKILL.md +0 -202
- package/framework/skills/bolder/SKILL.md +0 -144
- package/framework/skills/browser-qa/SKILL.md +0 -536
- package/framework/skills/clarify/SKILL.md +0 -179
- package/framework/skills/client-handoff/SKILL.md +0 -135
- package/framework/skills/collab-onboard/SKILL.md +0 -111
- package/framework/skills/colorize/SKILL.md +0 -170
- package/framework/skills/critique/SKILL.md +0 -126
- package/framework/skills/deep-research/SKILL.md +0 -240
- package/framework/skills/delight/SKILL.md +0 -329
- package/framework/skills/deploy/SKILL.md +0 -261
- package/framework/skills/deploy-verify/SKILL.md +0 -377
- package/framework/skills/deploy-verify/scripts/canary-check.sh +0 -206
- package/framework/skills/deploy-verify/scripts/check-console-errors.js +0 -147
- package/framework/skills/deploy-verify/scripts/check-cwv.js +0 -139
- package/framework/skills/deploy-verify/scripts/project-detect.sh +0 -84
- package/framework/skills/deploy-verify/scripts/verify.sh +0 -548
- package/framework/skills/design-quieter/SKILL.md +0 -130
- package/framework/skills/distill/SKILL.md +0 -149
- package/framework/skills/docs-lookup/SKILL.md +0 -79
- package/framework/skills/fcm-notifications/SKILL.md +0 -125
- package/framework/skills/financial-ledger/SKILL.md +0 -1039
- package/framework/skills/frontend-master/NOTICE.md +0 -4
- package/framework/skills/frontend-master/SKILL.md +0 -127
- package/framework/skills/frontend-master/reference/color-and-contrast.md +0 -132
- package/framework/skills/frontend-master/reference/interaction-design.md +0 -123
- package/framework/skills/frontend-master/reference/motion-design.md +0 -99
- package/framework/skills/frontend-master/reference/responsive-design.md +0 -114
- package/framework/skills/frontend-master/reference/spatial-design.md +0 -100
- package/framework/skills/frontend-master/reference/typography.md +0 -131
- package/framework/skills/frontend-master/reference/ux-writing.md +0 -107
- package/framework/skills/harden/SKILL.md +0 -357
- package/framework/skills/i18n-rtl/SKILL.md +0 -752
- package/framework/skills/learn/SKILL.md +0 -95
- package/framework/skills/memory/SKILL.md +0 -50
- package/framework/skills/mobile-expo/SKILL.md +0 -977
- package/framework/skills/mobile-expo/references/store-checklist.md +0 -550
- package/framework/skills/nestjs-backend/README.md +0 -73
- package/framework/skills/nestjs-backend/SKILL.md +0 -446
- package/framework/skills/nestjs-backend/references/templates.md +0 -1173
- package/framework/skills/normalize/SKILL.md +0 -79
- package/framework/skills/onboard/SKILL.md +0 -242
- package/framework/skills/openrouter-agent/SKILL.md +0 -922
- package/framework/skills/polish/SKILL.md +0 -209
- package/framework/skills/pr/SKILL.md +0 -66
- package/framework/skills/qualia/SKILL.md +0 -199
- package/framework/skills/qualia-add-todo/SKILL.md +0 -68
- package/framework/skills/qualia-audit-milestone/SKILL.md +0 -95
- package/framework/skills/qualia-check-todos/SKILL.md +0 -55
- package/framework/skills/qualia-complete-milestone/SKILL.md +0 -134
- package/framework/skills/qualia-debug/SKILL.md +0 -149
- package/framework/skills/qualia-design/SKILL.md +0 -203
- package/framework/skills/qualia-discuss-phase/SKILL.md +0 -72
- package/framework/skills/qualia-evolve/SKILL.md +0 -200
- package/framework/skills/qualia-execute-phase/SKILL.md +0 -89
- package/framework/skills/qualia-framework-audit/SKILL.md +0 -604
- package/framework/skills/qualia-guide/SKILL.md +0 -32
- package/framework/skills/qualia-help/SKILL.md +0 -114
- package/framework/skills/qualia-idk/SKILL.md +0 -352
- package/framework/skills/qualia-list-phase-assumptions/SKILL.md +0 -67
- package/framework/skills/qualia-new-milestone/SKILL.md +0 -72
- package/framework/skills/qualia-new-project/SKILL.md +0 -232
- package/framework/skills/qualia-optimize/SKILL.md +0 -417
- package/framework/skills/qualia-pause-work/SKILL.md +0 -96
- package/framework/skills/qualia-plan-milestone-gaps/SKILL.md +0 -57
- package/framework/skills/qualia-plan-phase/SKILL.md +0 -104
- package/framework/skills/qualia-production-check/SKILL.md +0 -0
- package/framework/skills/qualia-progress/SKILL.md +0 -53
- package/framework/skills/qualia-quick/SKILL.md +0 -89
- package/framework/skills/qualia-report/SKILL.md +0 -166
- package/framework/skills/qualia-research-phase/SKILL.md +0 -88
- package/framework/skills/qualia-resume-work/SKILL.md +0 -62
- package/framework/skills/qualia-review/SKILL.md +0 -263
- package/framework/skills/qualia-start/SKILL.md +0 -161
- package/framework/skills/qualia-verify-work/SKILL.md +0 -132
- package/framework/skills/rag/SKILL.md +0 -750
- package/framework/skills/responsive/SKILL.md +0 -231
- package/framework/skills/retro/SKILL.md +0 -284
- package/framework/skills/sakani-conventions/SKILL.md +0 -136
- package/framework/skills/sakani-conventions/evals/evals.json +0 -23
- package/framework/skills/sakani-conventions/references/entities.md +0 -365
- package/framework/skills/sakani-conventions/references/error-codes.md +0 -95
- package/framework/skills/seo-master/SKILL.md +0 -490
- package/framework/skills/seo-master/references/checklist.md +0 -199
- package/framework/skills/seo-master/references/structured-data.md +0 -609
- package/framework/skills/ship/SKILL.md +0 -239
- package/framework/skills/stack-researcher/SKILL.md +0 -215
- package/framework/skills/status/SKILL.md +0 -154
- package/framework/skills/status/scripts/health-check.sh +0 -562
- package/framework/skills/subscription-payments/SKILL.md +0 -250
- package/framework/skills/supabase/SKILL.md +0 -973
- package/framework/skills/supabase/references/templates.md +0 -159
- package/framework/skills/team/SKILL.md +0 -67
- package/framework/skills/test-runner/SKILL.md +0 -202
- package/framework/skills/voice-agent/SKILL.md +0 -1312
- package/framework/skills/zoho-workflow/SKILL.md +0 -51
- package/framework/statusline-command.sh +0 -117
- package/framework/teams/default/inboxes/plan-04.json +0 -9
- package/framework/teams/review-team.md +0 -75
- package/framework/teams/ship-team.md +0 -86
- package/profiles/fawzi.json +0 -16
- package/profiles/hasan.json +0 -16
- package/profiles/moayad.json +0 -16
- package/templates/CLAUDE-owner.md +0 -52
- package/templates/CLAUDE.md.hbs +0 -58
- package/templates/env.claude.template +0 -12
- package/templates/settings.json +0 -172
- package/uninstall.sh +0 -90
- /package/{framework/rules → rules}/deployment.md +0 -0
- /package/{framework/rules → rules}/security.md +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-review
|
|
3
|
+
description: "Production audit with scored diagnostics. Runs real commands, scores findings by severity. Trigger on 'review', 'audit', 'code review', 'security check', 'production check'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /qualia-review — Production Audit
|
|
7
|
+
|
|
8
|
+
Runs real diagnostic commands and scores every finding. Not a checklist — an executable audit.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
- `/qualia-review` — Full audit (security + quality + performance)
|
|
13
|
+
- `/qualia-review --web` — Adds web-specific checks (headers, CORS, vitals)
|
|
14
|
+
- `/qualia-review --ai` — Adds AI/voice agent checks (prompt safety, latency)
|
|
15
|
+
|
|
16
|
+
## Process
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
node ~/.claude/bin/qualia-ui.js banner review
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 0. Load Context
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
cat ~/.claude/knowledge/common-fixes.md 2>/dev/null
|
|
26
|
+
cat ~/.claude/knowledge/learned-patterns.md 2>/dev/null
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Detect project shape:
|
|
30
|
+
```bash
|
|
31
|
+
ls package.json next.config.* tsconfig.json supabase/ app/ src/ 2>/dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 1. Security Scan
|
|
35
|
+
|
|
36
|
+
Run every command. Record each finding with severity.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# CRITICAL: service_role in client code
|
|
40
|
+
grep -rn "service_role" --include="*.ts" --include="*.tsx" --include="*.js" app/ components/ src/ lib/ 2>/dev/null | grep -v node_modules | grep -v "\.server\.\|[\\/]server[\\/]\|[\\/]app[\\/]api[\\/]\|route\.\|middleware\."
|
|
41
|
+
|
|
42
|
+
# CRITICAL: hardcoded secrets
|
|
43
|
+
grep -rn "sk_live\|sk_test\|SUPABASE_SERVICE_ROLE\|eyJhbGciOi" --include="*.ts" --include="*.tsx" --include="*.js" app/ components/ src/ lib/ 2>/dev/null | grep -v node_modules | grep -v "\.env"
|
|
44
|
+
|
|
45
|
+
# CRITICAL: dangerous patterns
|
|
46
|
+
grep -rn "dangerouslySetInnerHTML\|eval(" --include="*.ts" --include="*.tsx" --include="*.js" app/ components/ src/ 2>/dev/null | grep -v node_modules
|
|
47
|
+
|
|
48
|
+
# CRITICAL: .env files tracked in git
|
|
49
|
+
git ls-files | grep -i "\.env" | grep -v "\.example\|\.template\|\.sample"
|
|
50
|
+
|
|
51
|
+
# HIGH: API routes without auth
|
|
52
|
+
for f in $(find app/api -name "route.ts" -o -name "route.js" 2>/dev/null); do
|
|
53
|
+
grep -qL "getUser\|getSession\|auth()\|createClient" "$f" && echo "UNPROTECTED: $f"
|
|
54
|
+
done
|
|
55
|
+
|
|
56
|
+
# HIGH: API routes without input validation
|
|
57
|
+
for f in $(find app/api -name "route.ts" -o -name "route.js" 2>/dev/null); do
|
|
58
|
+
grep -L "z\.\|zod\|Zod\|parse\|safeParse" "$f" 2>/dev/null
|
|
59
|
+
done
|
|
60
|
+
|
|
61
|
+
# HIGH: client-side database mutations
|
|
62
|
+
grep -rn "\.insert\|\.update\|\.delete\|\.upsert" --include="*.tsx" --include="*.jsx" app/ components/ 2>/dev/null | grep -v "use server" | grep -v "\.server\."
|
|
63
|
+
|
|
64
|
+
# MEDIUM: npm vulnerabilities
|
|
65
|
+
npm audit --json 2>/dev/null | node -e "try{const d=JSON.parse(require('fs').readFileSync(0,'utf8'));const v=d.metadata?.vulnerabilities||{};console.log('critical:',v.critical||0,'high:',v.high||0,'moderate:',v.moderate||0)}catch{console.log('audit unavailable')}"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 2. Code Quality Scan
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# TypeScript errors (HIGH if >0)
|
|
72
|
+
npx tsc --noEmit 2>&1 | grep -c "error TS"
|
|
73
|
+
|
|
74
|
+
# 'any' type usage (MEDIUM — count)
|
|
75
|
+
grep -rn ": any\| as any" --include="*.ts" --include="*.tsx" app/ components/ src/ lib/ 2>/dev/null | grep -v node_modules | wc -l
|
|
76
|
+
|
|
77
|
+
# Empty catch blocks (HIGH)
|
|
78
|
+
grep -rn "catch\s*{}\|catch\s*(.*)\s*{\s*}" --include="*.ts" --include="*.tsx" app/ components/ src/ lib/ 2>/dev/null | grep -v node_modules | head -10
|
|
79
|
+
|
|
80
|
+
# TODO/FIXME left in code (LOW — count)
|
|
81
|
+
grep -rn "TODO\|FIXME\|HACK\|XXX" --include="*.ts" --include="*.tsx" app/ components/ src/ lib/ 2>/dev/null | grep -v node_modules | wc -l
|
|
82
|
+
|
|
83
|
+
# console.log in production code (LOW — count)
|
|
84
|
+
grep -rn "console\.log" --include="*.ts" --include="*.tsx" app/ components/ src/ 2>/dev/null | grep -v node_modules | wc -l
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 3. Performance Scan
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Build output — route sizes and first load JS
|
|
91
|
+
npx next build 2>&1 | grep -E "Route|First Load|shared by all|○|●|ƒ|λ" | tail -25
|
|
92
|
+
|
|
93
|
+
# Heavy files (>300 lines often means split needed)
|
|
94
|
+
find app/ components/ src/ -name "*.tsx" -o -name "*.ts" 2>/dev/null | xargs wc -l 2>/dev/null | sort -rn | head -10
|
|
95
|
+
|
|
96
|
+
# Missing next/image (MEDIUM)
|
|
97
|
+
grep -rn "<img " --include="*.tsx" --include="*.jsx" app/ components/ src/ 2>/dev/null | grep -v "next/image" | wc -l
|
|
98
|
+
|
|
99
|
+
# Client component ratio
|
|
100
|
+
echo "use client: $(grep -rl "'use client'" --include="*.tsx" app/ components/ src/ 2>/dev/null | wc -l)"
|
|
101
|
+
echo "total tsx: $(find app/ components/ src/ -name '*.tsx' 2>/dev/null | wc -l)"
|
|
102
|
+
|
|
103
|
+
# Sequential data fetching (HIGH)
|
|
104
|
+
grep -rn "const.*=.*await" --include="*.tsx" --include="*.ts" app/ src/ 2>/dev/null | grep -v "Promise.all\|Promise.allSettled" | head -10
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 4. Score and Report
|
|
108
|
+
|
|
109
|
+
Write to `.planning/REVIEW.md`:
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
# Production Review — {YYYY-MM-DD}
|
|
113
|
+
|
|
114
|
+
## Summary
|
|
115
|
+
| Category | Critical | High | Medium | Low | Score |
|
|
116
|
+
|----------|----------|------|--------|-----|-------|
|
|
117
|
+
| Security | {n} | {n} | {n} | {n} | {1-5} |
|
|
118
|
+
| Quality | {n} | {n} | {n} | {n} | {1-5} |
|
|
119
|
+
| Perf | {n} | {n} | {n} | {n} | {1-5} |
|
|
120
|
+
| **Total** | {n} | {n} | {n} | {n} | **{avg}/5** |
|
|
121
|
+
|
|
122
|
+
## Findings
|
|
123
|
+
|
|
124
|
+
### CRITICAL
|
|
125
|
+
- **{title}** — `{file}:{line}` — {what's wrong} — Fix: {how}
|
|
126
|
+
|
|
127
|
+
### HIGH
|
|
128
|
+
- ...
|
|
129
|
+
|
|
130
|
+
### MEDIUM
|
|
131
|
+
- ...
|
|
132
|
+
|
|
133
|
+
### LOW
|
|
134
|
+
- ...
|
|
135
|
+
|
|
136
|
+
## Verdict
|
|
137
|
+
{PASS: no critical/high | FAIL: N blockers — fix before /qualia-ship}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Scoring:**
|
|
141
|
+
- 5 = zero high/critical, fewer than 3 medium
|
|
142
|
+
- 4 = zero critical, 1 high or fewer than 5 medium
|
|
143
|
+
- 3 = zero critical, 2-3 high
|
|
144
|
+
- 2 = 1 critical or 4+ high
|
|
145
|
+
- 1 = multiple critical
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
node ~/.claude/bin/qualia-ui.js divider
|
|
149
|
+
node ~/.claude/bin/qualia-ui.js info "Security: {score}/5 ({n} findings)"
|
|
150
|
+
node ~/.claude/bin/qualia-ui.js info "Quality: {score}/5 ({n} findings)"
|
|
151
|
+
node ~/.claude/bin/qualia-ui.js info "Perf: {score}/5 ({n} findings)"
|
|
152
|
+
node ~/.claude/bin/qualia-ui.js end "REVIEW: {PASS|FAIL}" "{next command}"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Rules
|
|
156
|
+
|
|
157
|
+
1. **Run every command.** Don't skip scans because "the code looks clean."
|
|
158
|
+
2. **Every finding gets a severity.** No prose — CRITICAL/HIGH/MEDIUM/LOW.
|
|
159
|
+
3. **Every finding gets a fix suggestion.** Not just "this is bad" — say what to do.
|
|
160
|
+
4. **Review detects. It does NOT fix.** This is an audit, not a refactor. Tell the user what to fix.
|
|
161
|
+
5. **CRITICAL or HIGH = deploy blocker.** `/qualia-ship` checks for these.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-ship
|
|
3
|
+
description: "Deploy to production — quality gates, commit, push, deploy, verify. Use when ready to go live."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /qualia-ship — Deploy
|
|
7
|
+
|
|
8
|
+
Full deployment pipeline with quality gates.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
node ~/.claude/bin/qualia-ui.js banner ship
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 1. Quality Gates
|
|
17
|
+
|
|
18
|
+
Run in sequence. Auto-fix failures (up to 2 attempts).
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx tsc --noEmit # TypeScript — must pass
|
|
22
|
+
npx eslint . --max-warnings 0 # Lint — auto-fix first
|
|
23
|
+
npm run build # Build — must succeed
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
On failure:
|
|
27
|
+
1. Summarize what failed in plain language
|
|
28
|
+
2. Auto-fix
|
|
29
|
+
3. Re-run the gate
|
|
30
|
+
4. If still failing after 2 attempts: tell the employee, suggest `/qualia-debug`
|
|
31
|
+
|
|
32
|
+
### 2. Security Check
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# service_role in client code?
|
|
36
|
+
grep -r "service_role" app/ components/ src/ 2>/dev/null | grep -v node_modules | grep -v ".server."
|
|
37
|
+
# Should be ZERO matches
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 3. Git
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git add {specific changed files}
|
|
44
|
+
git commit -m "ship: {project name} production deploy"
|
|
45
|
+
git push
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Employee stays on feature branch. Never push to main.
|
|
49
|
+
|
|
50
|
+
### 4. Deploy
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
vercel --prod # Website/AI agent
|
|
54
|
+
# OR
|
|
55
|
+
supabase functions deploy # Edge functions
|
|
56
|
+
# OR
|
|
57
|
+
wrangler deploy # Cloudflare Workers
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 5. Post-Deploy Verification
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# HTTP 200
|
|
64
|
+
curl -s -o /dev/null -w "%{http_code}" {domain}
|
|
65
|
+
|
|
66
|
+
# Latency under 500ms
|
|
67
|
+
curl -s -o /dev/null -w "%{time_total}" {domain}
|
|
68
|
+
|
|
69
|
+
# Auth endpoint responds
|
|
70
|
+
curl -s -o /dev/null -w "%{http_code}" {domain}/api/auth/callback
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 6. Report
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
node ~/.claude/bin/qualia-ui.js divider
|
|
77
|
+
node ~/.claude/bin/qualia-ui.js ok "URL: {production url}"
|
|
78
|
+
node ~/.claude/bin/qualia-ui.js ok "Status: HTTP 200"
|
|
79
|
+
node ~/.claude/bin/qualia-ui.js ok "Latency: {time}ms"
|
|
80
|
+
node ~/.claude/bin/qualia-ui.js ok "Auth endpoint responds"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
node ~/.claude/bin/state.js transition --to shipped --deployed-url {production url}
|
|
85
|
+
```
|
|
86
|
+
Do NOT manually edit STATE.md or tracking.json — state.js handles both.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
node ~/.claude/bin/qualia-ui.js end "SHIPPED" "/qualia-handoff"
|
|
90
|
+
```
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-skill-new
|
|
3
|
+
description: "Author a new Qualia skill or agent. Use when the user says 'create a new skill', 'add a skill', 'I want to build a skill', 'make this a reusable command', 'turn this into a skill'. Generates the SKILL.md, registers it in the right location, and optionally ships to the framework repo."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /qualia-skill-new — Author a New Skill
|
|
7
|
+
|
|
8
|
+
You are about to create a reusable slash command. Skills are the leverage of the Qualia framework — if the team does something twice, it probably belongs here.
|
|
9
|
+
|
|
10
|
+
## Process
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
node ~/.claude/bin/qualia-ui.js banner skill-new
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 1. Scope Decision
|
|
17
|
+
|
|
18
|
+
Ask the user with AskUserQuestion:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
question: "Where should this skill live?"
|
|
22
|
+
header: "Scope"
|
|
23
|
+
options:
|
|
24
|
+
- label: "Framework skill (ships to the team)"
|
|
25
|
+
description: "Edit qualia-framework repo. Everyone gets it on next update."
|
|
26
|
+
- label: "Local skill (just me)"
|
|
27
|
+
description: "Lives only in ~/.claude/skills/. Not shared."
|
|
28
|
+
- label: "Agent instead of a skill"
|
|
29
|
+
description: "This is a subagent role, not a slash command. Creates agents/{name}.md."
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 1a. Resolve framework directory
|
|
33
|
+
|
|
34
|
+
If the user chose **Framework skill** or a framework-scoped **Agent**, resolve `${FRAMEWORK_DIR}` — the checkout path of this user's qualia-framework repo — BEFORE computing any target paths. Never hardcode `/home/<user>/...`; different teammates and operating systems have different paths.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Priority order: env var → git detection → ask user
|
|
38
|
+
FRAMEWORK_DIR="${QUALIA_FRAMEWORK_DIR:-}"
|
|
39
|
+
if [ -z "$FRAMEWORK_DIR" ] && git -C . rev-parse --show-toplevel >/dev/null 2>&1; then
|
|
40
|
+
ORIGIN=$(git -C . config --get remote.origin.url 2>/dev/null)
|
|
41
|
+
case "$ORIGIN" in
|
|
42
|
+
*qualia-framework*) FRAMEWORK_DIR=$(git -C . rev-parse --show-toplevel) ;;
|
|
43
|
+
esac
|
|
44
|
+
fi
|
|
45
|
+
echo "${FRAMEWORK_DIR:-UNRESOLVED}"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
If the command prints `UNRESOLVED`, ask the user: *"Where is your qualia-framework checkout? (absolute path, or type 'local' to save only to ~/.claude/)"*. If they type `local`, downgrade the scope to Local. Otherwise store the answer as `${FRAMEWORK_DIR}` for the rest of the session.
|
|
49
|
+
|
|
50
|
+
**Framework** → target: `${FRAMEWORK_DIR}/skills/{name}/SKILL.md`
|
|
51
|
+
**Local** → target: `~/.claude/skills/{name}/SKILL.md`
|
|
52
|
+
**Agent** → target: `${FRAMEWORK_DIR}/agents/{name}.md` (framework) or `~/.claude/agents/{name}.md` (local)
|
|
53
|
+
|
|
54
|
+
### 2. Gather Requirements
|
|
55
|
+
|
|
56
|
+
Ask the user — one question at a time, natural conversation:
|
|
57
|
+
|
|
58
|
+
1. **"What's the name?"** — kebab-case, prefix with `qualia-` for framework skills. E.g., `qualia-seed-db`.
|
|
59
|
+
2. **"What does it do?"** — one sentence, used as the description.
|
|
60
|
+
3. **"How does the user invoke it?"** — trigger phrases they'd naturally say. E.g., "seed the database", "load test data", "populate dev db".
|
|
61
|
+
4. **"Does it need planning / building / verification?"** — if yes, it probably should spawn an agent. If no, it's a direct-action skill.
|
|
62
|
+
5. **"What files does it read or write?"** — tells you what tools to restrict to.
|
|
63
|
+
|
|
64
|
+
### 3. Read Reference Skills
|
|
65
|
+
|
|
66
|
+
Before writing, read two existing skills that are structurally similar:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Short direct-action skill reference:
|
|
70
|
+
cat ~/.claude/skills/qualia-learn/SKILL.md
|
|
71
|
+
|
|
72
|
+
# Skill-that-spawns-an-agent reference:
|
|
73
|
+
cat ~/.claude/skills/qualia-plan/SKILL.md
|
|
74
|
+
|
|
75
|
+
# Interactive wizard reference:
|
|
76
|
+
cat ~/.claude/skills/qualia-new/SKILL.md
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Pick the closest pattern and copy its structure.
|
|
80
|
+
|
|
81
|
+
### 4. Write the SKILL.md
|
|
82
|
+
|
|
83
|
+
Every SKILL.md MUST have:
|
|
84
|
+
|
|
85
|
+
```markdown
|
|
86
|
+
---
|
|
87
|
+
name: {kebab-case-name}
|
|
88
|
+
description: "{one sentence}. {trigger phrases}"
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
# /{name} — {Human Title}
|
|
92
|
+
|
|
93
|
+
{one-paragraph explanation}
|
|
94
|
+
|
|
95
|
+
## Usage
|
|
96
|
+
|
|
97
|
+
`/{name}` — {default behavior}
|
|
98
|
+
`/{name} {arg}` — {with argument}
|
|
99
|
+
|
|
100
|
+
## Process
|
|
101
|
+
|
|
102
|
+
### 1. {First Step}
|
|
103
|
+
{specifics}
|
|
104
|
+
|
|
105
|
+
### 2. {Second Step}
|
|
106
|
+
{specifics}
|
|
107
|
+
|
|
108
|
+
### N. Update State (only if this skill changes project state)
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
node ~/.claude/bin/state.js transition --to {status} ...
|
|
112
|
+
```
|
|
113
|
+
Do NOT manually edit STATE.md or tracking.json.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Description field rules:**
|
|
117
|
+
- MUST include trigger phrases the user would naturally say
|
|
118
|
+
- The Claude Code router matches user messages against descriptions — if you don't list triggers, the skill never fires
|
|
119
|
+
- Bad: `"Manages database seeding."` (no triggers)
|
|
120
|
+
- Good: `"Seed the database with test data. Trigger on 'seed db', 'load test data', 'populate dev'."`
|
|
121
|
+
|
|
122
|
+
### 5. Test the Skill
|
|
123
|
+
|
|
124
|
+
Spawn a fresh subagent to simulate running the skill — does it make sense without the context you have right now?
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Agent(prompt="
|
|
128
|
+
Read this skill: @~/.claude/skills/{name}/SKILL.md
|
|
129
|
+
|
|
130
|
+
Pretend the user just said '{one of the trigger phrases}'. Walk through what you would do, step by step. Flag anything ambiguous or missing.
|
|
131
|
+
", subagent_type="general-purpose", description="Test skill {name}")
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Fix any ambiguity the test agent found.
|
|
135
|
+
|
|
136
|
+
### 6. Install (if framework skill)
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Framework skill — copy to local .claude for immediate testing
|
|
140
|
+
mkdir -p ~/.claude/skills/{name}
|
|
141
|
+
cp "${FRAMEWORK_DIR}/skills/{name}/SKILL.md" ~/.claude/skills/{name}/SKILL.md
|
|
142
|
+
|
|
143
|
+
# Verify it parses
|
|
144
|
+
node -e "const fs=require('fs');const os=require('os');const path=require('path');const c=fs.readFileSync(path.join(os.homedir(),'.claude/skills/{name}/SKILL.md'),'utf8');if(!c.includes('---'))throw new Error('missing frontmatter');if(!c.match(/^name:\s*\S/m))throw new Error('missing name');if(!c.match(/^description:\s*\S/m))throw new Error('missing description');console.log('OK')"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 7. Commit (framework skills only)
|
|
148
|
+
|
|
149
|
+
Do NOT commit unless the user explicitly says "commit" or "ship it".
|
|
150
|
+
|
|
151
|
+
When they do:
|
|
152
|
+
```bash
|
|
153
|
+
cd "${FRAMEWORK_DIR}"
|
|
154
|
+
git add skills/{name}/
|
|
155
|
+
git commit -m "feat: add /{name} skill"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Remind the user to run `npx qualia-framework update` on their other machines, or bump the version and `npm publish`.
|
|
159
|
+
|
|
160
|
+
## Anti-Patterns
|
|
161
|
+
|
|
162
|
+
- ❌ **Description without triggers** — the skill won't fire
|
|
163
|
+
- ❌ **Multiple commands in one skill** — split into two skills
|
|
164
|
+
- ❌ **Direct file writes instead of state.js** — always use state.js for STATE.md/tracking.json
|
|
165
|
+
- ❌ **Hardcoded project paths** — use `.planning/` relative or `~/.claude/` absolute, never `/home/specific-user/`
|
|
166
|
+
- ❌ **Skills that spawn agents without passing PROJECT.md and STATE.md context** — agents are blind by default
|
|
167
|
+
- ❌ **Skills longer than ~150 lines** — split or move logic to an agent
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-task
|
|
3
|
+
description: "Build a single task — more structured than /qualia-quick, lighter than /qualia-build. Spawns a fresh builder agent for one focused task."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /qualia-task — Single Task Builder
|
|
7
|
+
|
|
8
|
+
Build one thing properly. Fresh builder context, atomic commit, but no phase plan needed.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
`/qualia-task` — describe what to build interactively
|
|
12
|
+
`/qualia-task {description}` — build it directly
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
- One feature, 1-5 files, clear scope, 1-3 hours of work
|
|
16
|
+
- Adding a single feature, component, API route, or integration
|
|
17
|
+
- Refactoring one module
|
|
18
|
+
- Building something specific someone asked for
|
|
19
|
+
|
|
20
|
+
## Process
|
|
21
|
+
|
|
22
|
+
### 1. Clarify
|
|
23
|
+
|
|
24
|
+
If no description provided, ask: **"What do you want to build?"**
|
|
25
|
+
|
|
26
|
+
Then use AskUserQuestion:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
question: "How complex is this task?"
|
|
30
|
+
header: "Scope"
|
|
31
|
+
options:
|
|
32
|
+
- label: "Small (1-2hrs)"
|
|
33
|
+
description: "Single file or component, straightforward implementation"
|
|
34
|
+
- label: "Medium (2-3hrs)"
|
|
35
|
+
description: "Multiple files, some integration work, needs testing"
|
|
36
|
+
- label: "Large (3hrs+)"
|
|
37
|
+
description: "Significant feature, multiple components — use /qualia-plan instead"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If "Large" — suggest `/qualia-plan` instead. Ask if they want to proceed anyway.
|
|
41
|
+
|
|
42
|
+
### 2. Task Spec
|
|
43
|
+
|
|
44
|
+
Write a quick task spec (don't save to file, just confirm with user):
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node ~/.claude/bin/qualia-ui.js banner task
|
|
48
|
+
node ~/.claude/bin/qualia-ui.js info "What: {what to build}"
|
|
49
|
+
node ~/.claude/bin/qualia-ui.js info "Files: {files to create/modify}"
|
|
50
|
+
node ~/.claude/bin/qualia-ui.js info "Done: {what done looks like}"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Ask: **"Good to build?"**
|
|
54
|
+
|
|
55
|
+
### 3. Build
|
|
56
|
+
|
|
57
|
+
Spawn a builder agent with the task:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Agent(subagent_type: "qualia-builder")
|
|
61
|
+
|
|
62
|
+
Task: {task description}
|
|
63
|
+
Files: {files to create/modify}
|
|
64
|
+
Done when: {completion criteria}
|
|
65
|
+
|
|
66
|
+
Context: Read PROJECT.md if it exists. Follow all rules (security, frontend, deployment).
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The builder runs in fresh context — reads before writing, follows rules, commits atomically.
|
|
70
|
+
|
|
71
|
+
### 4. Verify
|
|
72
|
+
|
|
73
|
+
After the builder finishes:
|
|
74
|
+
- Run `npx tsc --noEmit` if TypeScript
|
|
75
|
+
- Quick smoke test if applicable
|
|
76
|
+
- Review what was built
|
|
77
|
+
|
|
78
|
+
### 5. Report
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
node ~/.claude/bin/qualia-ui.js divider
|
|
82
|
+
node ~/.claude/bin/qualia-ui.js ok "Task: {description}"
|
|
83
|
+
node ~/.claude/bin/qualia-ui.js ok "Files: {files changed}"
|
|
84
|
+
node ~/.claude/bin/qualia-ui.js ok "Commit: {commit hash}"
|
|
85
|
+
node ~/.claude/bin/qualia-ui.js end "TASK COMPLETE"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
node ~/.claude/bin/state.js transition --to note --notes "{task description}"
|
|
90
|
+
```
|
|
91
|
+
Do NOT manually edit STATE.md or tracking.json — state.js handles both.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qualia-test
|
|
3
|
+
description: "Generate or run tests for client projects. Trigger on 'write tests', 'add tests', 'test this', 'run tests', 'test coverage', 'need tests for'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /qualia-test — Test Generator
|
|
7
|
+
|
|
8
|
+
Generate tests for client project code. Detect framework, classify targets, write tests, run them.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
- `/qualia-test` — Generate tests for recently changed files
|
|
13
|
+
- `/qualia-test {file}` — Generate tests for a specific file
|
|
14
|
+
- `/qualia-test --run` — Run existing tests and report
|
|
15
|
+
- `/qualia-test --coverage` — Run with coverage report
|
|
16
|
+
|
|
17
|
+
## Process
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
node ~/.claude/bin/qualia-ui.js banner test
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 1. Detect Test Framework
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
node -e "
|
|
27
|
+
const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));
|
|
28
|
+
const d={...p.dependencies,...p.devDependencies};
|
|
29
|
+
console.log(JSON.stringify({
|
|
30
|
+
vitest: !!d.vitest,
|
|
31
|
+
jest: !!d.jest,
|
|
32
|
+
playwright: !!d['@playwright/test'],
|
|
33
|
+
testing_library: !!d['@testing-library/react']
|
|
34
|
+
}))
|
|
35
|
+
"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If no test framework found, install vitest (lighter than jest for Next.js/Vite):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm install -D vitest @testing-library/react @testing-library/jest-dom jsdom
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Add to `vitest.config.ts` if it doesn't exist:
|
|
45
|
+
```typescript
|
|
46
|
+
import { defineConfig } from 'vitest/config'
|
|
47
|
+
import react from '@vitejs/plugin-react'
|
|
48
|
+
|
|
49
|
+
export default defineConfig({
|
|
50
|
+
plugins: [react()],
|
|
51
|
+
test: {
|
|
52
|
+
environment: 'jsdom',
|
|
53
|
+
setupFiles: ['./vitest.setup.ts'],
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 2. Find Targets
|
|
59
|
+
|
|
60
|
+
If specific file given → use that.
|
|
61
|
+
If `--run` → skip to step 4.
|
|
62
|
+
Otherwise find recently changed untested files:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Files changed in last 5 commits that don't have tests
|
|
66
|
+
git diff --name-only HEAD~5 --diff-filter=AM -- '*.ts' '*.tsx' 2>/dev/null | grep -v "test\|spec\|__test__\|\.d\.ts" | head -10
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Generate Tests
|
|
70
|
+
|
|
71
|
+
For each target file, classify it and generate the appropriate test:
|
|
72
|
+
|
|
73
|
+
**API route** (`app/api/**/route.ts`):
|
|
74
|
+
- Test each exported handler (GET, POST, PUT, DELETE)
|
|
75
|
+
- Test with valid input → expected response
|
|
76
|
+
- Test with invalid input → 400 error
|
|
77
|
+
- Test without auth → 401 (if auth is required)
|
|
78
|
+
|
|
79
|
+
**Server action** (has `"use server"`):
|
|
80
|
+
- Test each exported function
|
|
81
|
+
- Test with valid args → expected result
|
|
82
|
+
- Test with invalid args → error handling
|
|
83
|
+
|
|
84
|
+
**React component** (`*.tsx` with JSX):
|
|
85
|
+
- Test rendering without crashing
|
|
86
|
+
- Test interactive elements (clicks, form submissions)
|
|
87
|
+
- Test loading, error, and empty states if they exist
|
|
88
|
+
- Test accessibility (role, aria-label presence)
|
|
89
|
+
|
|
90
|
+
**Utility function** (`lib/*.ts`, `utils/*.ts`):
|
|
91
|
+
- Test each exported function with normal input
|
|
92
|
+
- Test edge cases: empty, null, undefined, boundary values
|
|
93
|
+
- Test error cases: invalid input, missing data
|
|
94
|
+
|
|
95
|
+
Write test file next to the source: `{file}.test.ts` or `{file}.test.tsx`.
|
|
96
|
+
|
|
97
|
+
### 4. Run Tests
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Vitest
|
|
101
|
+
npx vitest run --reporter=verbose 2>&1 | tail -30
|
|
102
|
+
|
|
103
|
+
# Or Jest
|
|
104
|
+
npx jest --verbose 2>&1 | tail -30
|
|
105
|
+
|
|
106
|
+
# Coverage (if --coverage flag)
|
|
107
|
+
npx vitest run --coverage 2>&1 | tail -30
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 5. Report
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
node ~/.claude/bin/qualia-ui.js divider
|
|
114
|
+
node ~/.claude/bin/qualia-ui.js info "Files tested: {N}"
|
|
115
|
+
node ~/.claude/bin/qualia-ui.js ok "Passing: {pass}/{total}"
|
|
116
|
+
node ~/.claude/bin/qualia-ui.js end "TESTS DONE"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If any tests fail, show the failures and offer to fix them.
|
|
120
|
+
|
|
121
|
+
### 6. Commit
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
git add {test files}
|
|
125
|
+
git commit -m "test: add tests for {files}"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Rules
|
|
129
|
+
|
|
130
|
+
1. **Test behavior, not implementation.** Don't test internal state — test what the user/caller sees.
|
|
131
|
+
2. **No snapshot tests.** They're brittle and meaningless.
|
|
132
|
+
3. **No mocking unless necessary.** Test real behavior. Mock only external services (APIs, databases).
|
|
133
|
+
4. **Each test file is self-contained.** No shared mutable state between tests.
|
|
134
|
+
5. **Name tests as sentences.** `it("returns 401 when user is not authenticated")` not `it("test auth")`.
|