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.
Files changed (328) hide show
  1. package/CLAUDE.md +63 -0
  2. package/README.md +108 -30
  3. package/agents/builder.md +110 -0
  4. package/agents/planner.md +186 -0
  5. package/agents/qa-browser.md +186 -0
  6. package/agents/verifier.md +369 -0
  7. package/bin/cli.js +691 -492
  8. package/bin/install.js +622 -0
  9. package/bin/qualia-ui.js +284 -0
  10. package/bin/state.js +824 -0
  11. package/bin/statusline.js +252 -0
  12. package/docs/erp-contract.md +161 -0
  13. package/guide.md +63 -0
  14. package/hooks/auto-update.js +117 -0
  15. package/hooks/block-env-edit.js +52 -0
  16. package/hooks/branch-guard.js +68 -0
  17. package/hooks/migration-guard.js +83 -0
  18. package/hooks/pre-compact.js +52 -0
  19. package/hooks/pre-deploy-gate.js +149 -0
  20. package/hooks/pre-push.js +53 -0
  21. package/hooks/session-start.js +126 -0
  22. package/package.json +30 -20
  23. package/rules/design-reference.md +179 -0
  24. package/rules/frontend.md +126 -0
  25. package/rules/infrastructure.md +87 -0
  26. package/skills/qualia/SKILL.md +88 -0
  27. package/skills/qualia-build/SKILL.md +115 -0
  28. package/skills/qualia-debug/SKILL.md +87 -0
  29. package/skills/qualia-design/SKILL.md +99 -0
  30. package/skills/qualia-handoff/SKILL.md +66 -0
  31. package/skills/qualia-help/SKILL.md +60 -0
  32. package/skills/qualia-idk/SKILL.md +8 -0
  33. package/skills/qualia-learn/SKILL.md +111 -0
  34. package/skills/qualia-new/SKILL.md +323 -0
  35. package/skills/qualia-pause/SKILL.md +63 -0
  36. package/skills/qualia-plan/SKILL.md +101 -0
  37. package/skills/qualia-polish/SKILL.md +207 -0
  38. package/skills/qualia-quick/SKILL.md +37 -0
  39. package/skills/qualia-report/SKILL.md +114 -0
  40. package/skills/qualia-resume/SKILL.md +49 -0
  41. package/skills/qualia-review/SKILL.md +161 -0
  42. package/skills/qualia-ship/SKILL.md +90 -0
  43. package/skills/qualia-skill-new/SKILL.md +167 -0
  44. package/skills/qualia-task/SKILL.md +91 -0
  45. package/skills/qualia-test/SKILL.md +134 -0
  46. package/skills/qualia-verify/SKILL.md +113 -0
  47. package/templates/DESIGN.md +475 -0
  48. package/templates/help.html +476 -0
  49. package/templates/plan.md +42 -0
  50. package/templates/project.md +22 -0
  51. package/templates/state.md +27 -0
  52. package/templates/tracking.json +20 -0
  53. package/tests/bin.test.sh +687 -0
  54. package/tests/hooks.test.sh +384 -0
  55. package/tests/runner.js +1956 -0
  56. package/tests/state.test.sh +713 -0
  57. package/tests/statusline.test.sh +243 -0
  58. package/bin/collect-metrics.sh +0 -62
  59. package/framework/.claudeignore +0 -51
  60. package/framework/CLAUDE.md +0 -51
  61. package/framework/MCP_SETUP.md +0 -229
  62. package/framework/agents/architecture-strategist.md +0 -53
  63. package/framework/agents/backend-agent.md +0 -150
  64. package/framework/agents/code-simplicity-reviewer.md +0 -86
  65. package/framework/agents/frontend-agent.md +0 -111
  66. package/framework/agents/kieran-typescript-reviewer.md +0 -96
  67. package/framework/agents/performance-oracle.md +0 -111
  68. package/framework/agents/qualia-codebase-mapper.md +0 -761
  69. package/framework/agents/qualia-debugger.md +0 -1204
  70. package/framework/agents/qualia-executor.md +0 -882
  71. package/framework/agents/qualia-integration-checker.md +0 -424
  72. package/framework/agents/qualia-phase-researcher.md +0 -457
  73. package/framework/agents/qualia-plan-checker.md +0 -700
  74. package/framework/agents/qualia-planner.md +0 -1245
  75. package/framework/agents/qualia-project-researcher.md +0 -603
  76. package/framework/agents/qualia-research-synthesizer.md +0 -200
  77. package/framework/agents/qualia-roadmapper.md +0 -606
  78. package/framework/agents/qualia-verifier.md +0 -686
  79. package/framework/agents/red-team-qa.md +0 -130
  80. package/framework/agents/security-auditor.md +0 -72
  81. package/framework/agents/team-orchestrator.md +0 -229
  82. package/framework/agents/teams/framework-audit-team.md +0 -66
  83. package/framework/agents/teams/full-stack-team.md +0 -48
  84. package/framework/agents/teams/optimize-team.md +0 -53
  85. package/framework/agents/teams/review-team.md +0 -70
  86. package/framework/agents/teams/ship-team.md +0 -86
  87. package/framework/agents/test-agent.md +0 -182
  88. package/framework/hooks/auto-format.sh +0 -54
  89. package/framework/hooks/block-env-edit.sh +0 -42
  90. package/framework/hooks/branch-guard.sh +0 -43
  91. package/framework/hooks/confirm-delete.sh +0 -59
  92. package/framework/hooks/migration-validate.sh +0 -77
  93. package/framework/hooks/notification-speak.sh +0 -16
  94. package/framework/hooks/pre-commit.sh +0 -100
  95. package/framework/hooks/pre-compact.sh +0 -56
  96. package/framework/hooks/pre-deploy-gate.sh +0 -160
  97. package/framework/hooks/qualia-colors.sh +0 -32
  98. package/framework/hooks/retention-cleanup.sh +0 -62
  99. package/framework/hooks/save-session-state.sh +0 -185
  100. package/framework/hooks/session-context-loader.sh +0 -96
  101. package/framework/hooks/session-learn.sh +0 -32
  102. package/framework/hooks/skill-announce.sh +0 -123
  103. package/framework/hooks/tool-error-announce.sh +0 -27
  104. package/framework/install.ps1 +0 -323
  105. package/framework/install.sh +0 -313
  106. package/framework/qualia-framework/VERSION +0 -1
  107. package/framework/qualia-framework/assets/qualia-logo.png +0 -0
  108. package/framework/qualia-framework/bin/collect-metrics.sh +0 -67
  109. package/framework/qualia-framework/bin/generate-report-docx.py +0 -429
  110. package/framework/qualia-framework/bin/qualia-tools.js +0 -2201
  111. package/framework/qualia-framework/bin/qualia-tools.test.js +0 -1054
  112. package/framework/qualia-framework/references/checkpoints.md +0 -775
  113. package/framework/qualia-framework/references/completion-checklists.md +0 -359
  114. package/framework/qualia-framework/references/continuation-format.md +0 -249
  115. package/framework/qualia-framework/references/continuation-prompt.md +0 -97
  116. package/framework/qualia-framework/references/decimal-phase-calculation.md +0 -65
  117. package/framework/qualia-framework/references/design-quality.md +0 -56
  118. package/framework/qualia-framework/references/employee-guide.md +0 -167
  119. package/framework/qualia-framework/references/git-integration.md +0 -254
  120. package/framework/qualia-framework/references/git-planning-commit.md +0 -50
  121. package/framework/qualia-framework/references/model-profile-resolution.md +0 -32
  122. package/framework/qualia-framework/references/model-profiles.md +0 -73
  123. package/framework/qualia-framework/references/phase-argument-parsing.md +0 -61
  124. package/framework/qualia-framework/references/planning-config.md +0 -195
  125. package/framework/qualia-framework/references/questioning.md +0 -141
  126. package/framework/qualia-framework/references/tdd.md +0 -263
  127. package/framework/qualia-framework/references/ui-brand.md +0 -160
  128. package/framework/qualia-framework/references/verification-patterns.md +0 -612
  129. package/framework/qualia-framework/templates/DEBUG.md +0 -159
  130. package/framework/qualia-framework/templates/DESIGN.md +0 -81
  131. package/framework/qualia-framework/templates/UAT.md +0 -247
  132. package/framework/qualia-framework/templates/codebase/architecture.md +0 -255
  133. package/framework/qualia-framework/templates/codebase/concerns.md +0 -310
  134. package/framework/qualia-framework/templates/codebase/conventions.md +0 -307
  135. package/framework/qualia-framework/templates/codebase/integrations.md +0 -280
  136. package/framework/qualia-framework/templates/codebase/stack.md +0 -186
  137. package/framework/qualia-framework/templates/codebase/structure.md +0 -285
  138. package/framework/qualia-framework/templates/codebase/testing.md +0 -480
  139. package/framework/qualia-framework/templates/config.json +0 -35
  140. package/framework/qualia-framework/templates/context.md +0 -283
  141. package/framework/qualia-framework/templates/continue-here.md +0 -78
  142. package/framework/qualia-framework/templates/debug-subagent-prompt.md +0 -91
  143. package/framework/qualia-framework/templates/discovery.md +0 -146
  144. package/framework/qualia-framework/templates/lab-notes.md +0 -16
  145. package/framework/qualia-framework/templates/milestone-archive.md +0 -123
  146. package/framework/qualia-framework/templates/milestone.md +0 -115
  147. package/framework/qualia-framework/templates/phase-prompt.md +0 -567
  148. package/framework/qualia-framework/templates/planner-subagent-prompt.md +0 -117
  149. package/framework/qualia-framework/templates/project.md +0 -184
  150. package/framework/qualia-framework/templates/projects/ai-agent.md +0 -156
  151. package/framework/qualia-framework/templates/projects/mobile-app.md +0 -181
  152. package/framework/qualia-framework/templates/projects/voice-agent.md +0 -134
  153. package/framework/qualia-framework/templates/projects/website.md +0 -137
  154. package/framework/qualia-framework/templates/requirements.md +0 -231
  155. package/framework/qualia-framework/templates/research-project/ARCHITECTURE.md +0 -204
  156. package/framework/qualia-framework/templates/research-project/FEATURES.md +0 -147
  157. package/framework/qualia-framework/templates/research-project/PITFALLS.md +0 -200
  158. package/framework/qualia-framework/templates/research-project/STACK.md +0 -120
  159. package/framework/qualia-framework/templates/research-project/SUMMARY.md +0 -170
  160. package/framework/qualia-framework/templates/research.md +0 -552
  161. package/framework/qualia-framework/templates/roadmap.md +0 -206
  162. package/framework/qualia-framework/templates/state.md +0 -179
  163. package/framework/qualia-framework/templates/summary-complex.md +0 -59
  164. package/framework/qualia-framework/templates/summary-minimal.md +0 -41
  165. package/framework/qualia-framework/templates/summary-standard.md +0 -48
  166. package/framework/qualia-framework/templates/summary.md +0 -246
  167. package/framework/qualia-framework/templates/user-setup.md +0 -311
  168. package/framework/qualia-framework/templates/verification-report.md +0 -322
  169. package/framework/qualia-framework/workflows/add-phase.md +0 -179
  170. package/framework/qualia-framework/workflows/add-todo.md +0 -157
  171. package/framework/qualia-framework/workflows/audit-milestone.md +0 -241
  172. package/framework/qualia-framework/workflows/check-todos.md +0 -176
  173. package/framework/qualia-framework/workflows/complete-milestone.md +0 -858
  174. package/framework/qualia-framework/workflows/diagnose-issues.md +0 -219
  175. package/framework/qualia-framework/workflows/discovery-phase.md +0 -289
  176. package/framework/qualia-framework/workflows/discuss-phase.md +0 -534
  177. package/framework/qualia-framework/workflows/execute-phase.md +0 -559
  178. package/framework/qualia-framework/workflows/execute-plan.md +0 -438
  179. package/framework/qualia-framework/workflows/help.md +0 -470
  180. package/framework/qualia-framework/workflows/insert-phase.md +0 -220
  181. package/framework/qualia-framework/workflows/list-phase-assumptions.md +0 -178
  182. package/framework/qualia-framework/workflows/map-codebase.md +0 -327
  183. package/framework/qualia-framework/workflows/new-milestone.md +0 -363
  184. package/framework/qualia-framework/workflows/new-project.md +0 -982
  185. package/framework/qualia-framework/workflows/pause-work.md +0 -122
  186. package/framework/qualia-framework/workflows/plan-milestone-gaps.md +0 -256
  187. package/framework/qualia-framework/workflows/plan-phase.md +0 -422
  188. package/framework/qualia-framework/workflows/progress.md +0 -389
  189. package/framework/qualia-framework/workflows/quick.md +0 -252
  190. package/framework/qualia-framework/workflows/remove-phase.md +0 -326
  191. package/framework/qualia-framework/workflows/research-phase.md +0 -74
  192. package/framework/qualia-framework/workflows/resume-project.md +0 -306
  193. package/framework/qualia-framework/workflows/set-profile.md +0 -80
  194. package/framework/qualia-framework/workflows/settings.md +0 -145
  195. package/framework/qualia-framework/workflows/transition.md +0 -556
  196. package/framework/qualia-framework/workflows/update.md +0 -197
  197. package/framework/qualia-framework/workflows/verify-phase.md +0 -195
  198. package/framework/qualia-framework/workflows/verify-work.md +0 -625
  199. package/framework/rules/context7.md +0 -14
  200. package/framework/rules/frontend.md +0 -33
  201. package/framework/rules/speed.md +0 -23
  202. package/framework/scripts/__pycache__/say.cpython-314.pyc +0 -0
  203. package/framework/scripts/apply-retention.sh +0 -120
  204. package/framework/scripts/bootstrap-pop-os.sh +0 -354
  205. package/framework/scripts/claude-voice +0 -13
  206. package/framework/scripts/cleanup.sh +0 -131
  207. package/framework/scripts/cowork-mode.sh +0 -141
  208. package/framework/scripts/generate-project-claude-md.sh +0 -153
  209. package/framework/scripts/load-test-webhook.js +0 -172
  210. package/framework/scripts/say.py +0 -236
  211. package/framework/scripts/showcase-video-recorder/ffmpeg-builder.js +0 -167
  212. package/framework/scripts/showcase-video-recorder/playwright-helpers.js +0 -216
  213. package/framework/scripts/speak.py +0 -55
  214. package/framework/scripts/speak.sh +0 -18
  215. package/framework/scripts/status.sh +0 -138
  216. package/framework/scripts/sync-to-framework.sh +0 -65
  217. package/framework/scripts/voice-hotkey.py +0 -227
  218. package/framework/scripts/voice-input.sh +0 -51
  219. package/framework/skills/animate/SKILL.md +0 -202
  220. package/framework/skills/bolder/SKILL.md +0 -144
  221. package/framework/skills/browser-qa/SKILL.md +0 -536
  222. package/framework/skills/clarify/SKILL.md +0 -179
  223. package/framework/skills/client-handoff/SKILL.md +0 -135
  224. package/framework/skills/collab-onboard/SKILL.md +0 -111
  225. package/framework/skills/colorize/SKILL.md +0 -170
  226. package/framework/skills/critique/SKILL.md +0 -126
  227. package/framework/skills/deep-research/SKILL.md +0 -240
  228. package/framework/skills/delight/SKILL.md +0 -329
  229. package/framework/skills/deploy/SKILL.md +0 -261
  230. package/framework/skills/deploy-verify/SKILL.md +0 -377
  231. package/framework/skills/deploy-verify/scripts/canary-check.sh +0 -206
  232. package/framework/skills/deploy-verify/scripts/check-console-errors.js +0 -147
  233. package/framework/skills/deploy-verify/scripts/check-cwv.js +0 -139
  234. package/framework/skills/deploy-verify/scripts/project-detect.sh +0 -84
  235. package/framework/skills/deploy-verify/scripts/verify.sh +0 -548
  236. package/framework/skills/design-quieter/SKILL.md +0 -130
  237. package/framework/skills/distill/SKILL.md +0 -149
  238. package/framework/skills/docs-lookup/SKILL.md +0 -79
  239. package/framework/skills/fcm-notifications/SKILL.md +0 -125
  240. package/framework/skills/financial-ledger/SKILL.md +0 -1039
  241. package/framework/skills/frontend-master/NOTICE.md +0 -4
  242. package/framework/skills/frontend-master/SKILL.md +0 -127
  243. package/framework/skills/frontend-master/reference/color-and-contrast.md +0 -132
  244. package/framework/skills/frontend-master/reference/interaction-design.md +0 -123
  245. package/framework/skills/frontend-master/reference/motion-design.md +0 -99
  246. package/framework/skills/frontend-master/reference/responsive-design.md +0 -114
  247. package/framework/skills/frontend-master/reference/spatial-design.md +0 -100
  248. package/framework/skills/frontend-master/reference/typography.md +0 -131
  249. package/framework/skills/frontend-master/reference/ux-writing.md +0 -107
  250. package/framework/skills/harden/SKILL.md +0 -357
  251. package/framework/skills/i18n-rtl/SKILL.md +0 -752
  252. package/framework/skills/learn/SKILL.md +0 -95
  253. package/framework/skills/memory/SKILL.md +0 -50
  254. package/framework/skills/mobile-expo/SKILL.md +0 -977
  255. package/framework/skills/mobile-expo/references/store-checklist.md +0 -550
  256. package/framework/skills/nestjs-backend/README.md +0 -73
  257. package/framework/skills/nestjs-backend/SKILL.md +0 -446
  258. package/framework/skills/nestjs-backend/references/templates.md +0 -1173
  259. package/framework/skills/normalize/SKILL.md +0 -79
  260. package/framework/skills/onboard/SKILL.md +0 -242
  261. package/framework/skills/openrouter-agent/SKILL.md +0 -922
  262. package/framework/skills/polish/SKILL.md +0 -209
  263. package/framework/skills/pr/SKILL.md +0 -66
  264. package/framework/skills/qualia/SKILL.md +0 -199
  265. package/framework/skills/qualia-add-todo/SKILL.md +0 -68
  266. package/framework/skills/qualia-audit-milestone/SKILL.md +0 -95
  267. package/framework/skills/qualia-check-todos/SKILL.md +0 -55
  268. package/framework/skills/qualia-complete-milestone/SKILL.md +0 -134
  269. package/framework/skills/qualia-debug/SKILL.md +0 -149
  270. package/framework/skills/qualia-design/SKILL.md +0 -203
  271. package/framework/skills/qualia-discuss-phase/SKILL.md +0 -72
  272. package/framework/skills/qualia-evolve/SKILL.md +0 -200
  273. package/framework/skills/qualia-execute-phase/SKILL.md +0 -89
  274. package/framework/skills/qualia-framework-audit/SKILL.md +0 -604
  275. package/framework/skills/qualia-guide/SKILL.md +0 -32
  276. package/framework/skills/qualia-help/SKILL.md +0 -114
  277. package/framework/skills/qualia-idk/SKILL.md +0 -352
  278. package/framework/skills/qualia-list-phase-assumptions/SKILL.md +0 -67
  279. package/framework/skills/qualia-new-milestone/SKILL.md +0 -72
  280. package/framework/skills/qualia-new-project/SKILL.md +0 -232
  281. package/framework/skills/qualia-optimize/SKILL.md +0 -417
  282. package/framework/skills/qualia-pause-work/SKILL.md +0 -96
  283. package/framework/skills/qualia-plan-milestone-gaps/SKILL.md +0 -57
  284. package/framework/skills/qualia-plan-phase/SKILL.md +0 -104
  285. package/framework/skills/qualia-production-check/SKILL.md +0 -0
  286. package/framework/skills/qualia-progress/SKILL.md +0 -53
  287. package/framework/skills/qualia-quick/SKILL.md +0 -89
  288. package/framework/skills/qualia-report/SKILL.md +0 -166
  289. package/framework/skills/qualia-research-phase/SKILL.md +0 -88
  290. package/framework/skills/qualia-resume-work/SKILL.md +0 -62
  291. package/framework/skills/qualia-review/SKILL.md +0 -263
  292. package/framework/skills/qualia-start/SKILL.md +0 -161
  293. package/framework/skills/qualia-verify-work/SKILL.md +0 -132
  294. package/framework/skills/rag/SKILL.md +0 -750
  295. package/framework/skills/responsive/SKILL.md +0 -231
  296. package/framework/skills/retro/SKILL.md +0 -284
  297. package/framework/skills/sakani-conventions/SKILL.md +0 -136
  298. package/framework/skills/sakani-conventions/evals/evals.json +0 -23
  299. package/framework/skills/sakani-conventions/references/entities.md +0 -365
  300. package/framework/skills/sakani-conventions/references/error-codes.md +0 -95
  301. package/framework/skills/seo-master/SKILL.md +0 -490
  302. package/framework/skills/seo-master/references/checklist.md +0 -199
  303. package/framework/skills/seo-master/references/structured-data.md +0 -609
  304. package/framework/skills/ship/SKILL.md +0 -239
  305. package/framework/skills/stack-researcher/SKILL.md +0 -215
  306. package/framework/skills/status/SKILL.md +0 -154
  307. package/framework/skills/status/scripts/health-check.sh +0 -562
  308. package/framework/skills/subscription-payments/SKILL.md +0 -250
  309. package/framework/skills/supabase/SKILL.md +0 -973
  310. package/framework/skills/supabase/references/templates.md +0 -159
  311. package/framework/skills/team/SKILL.md +0 -67
  312. package/framework/skills/test-runner/SKILL.md +0 -202
  313. package/framework/skills/voice-agent/SKILL.md +0 -1312
  314. package/framework/skills/zoho-workflow/SKILL.md +0 -51
  315. package/framework/statusline-command.sh +0 -117
  316. package/framework/teams/default/inboxes/plan-04.json +0 -9
  317. package/framework/teams/review-team.md +0 -75
  318. package/framework/teams/ship-team.md +0 -86
  319. package/profiles/fawzi.json +0 -16
  320. package/profiles/hasan.json +0 -16
  321. package/profiles/moayad.json +0 -16
  322. package/templates/CLAUDE-owner.md +0 -52
  323. package/templates/CLAUDE.md.hbs +0 -58
  324. package/templates/env.claude.template +0 -12
  325. package/templates/settings.json +0 -172
  326. package/uninstall.sh +0 -90
  327. /package/{framework/rules → rules}/deployment.md +0 -0
  328. /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")`.