weifuwu 0.89.1 → 0.90.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 (83) hide show
  1. package/README.md +99 -461
  2. package/dist/client/components/AlertGroup/AlertGroup.d.ts +1 -1
  3. package/dist/client/components/Anchor/Anchor.d.ts +1 -1
  4. package/dist/client/components/AutoComplete/AutoComplete.d.ts +1 -1
  5. package/dist/client/components/AvatarGroup/AvatarGroup.d.ts +1 -1
  6. package/dist/client/components/BackTop/BackTop.d.ts +12 -5
  7. package/dist/client/components/Button/Button.d.ts +2 -0
  8. package/dist/client/components/Calendar/Calendar.d.ts +1 -1
  9. package/dist/client/components/Carousel/Carousel.d.ts +1 -1
  10. package/dist/client/components/Cascader/Cascader.d.ts +1 -1
  11. package/dist/client/components/CodeEditor/CodeEditor.d.ts +1 -1
  12. package/dist/client/components/ColorPicker/ColorPicker.d.ts +1 -1
  13. package/dist/client/components/DropZone/DropZone.d.ts +27 -0
  14. package/dist/client/components/Editor/Editor.d.ts +1 -1
  15. package/dist/client/components/Editor/edit-events.d.ts +1 -1
  16. package/dist/client/components/Editor/model/types.d.ts +1 -1
  17. package/dist/client/components/Editor/tools/table.d.ts +1 -1
  18. package/dist/client/components/Editor/tools/types.d.ts +1 -1
  19. package/dist/client/components/FilePreview/FilePreview.d.ts +1 -1
  20. package/dist/client/components/FloatButton/FloatButton.d.ts +1 -1
  21. package/dist/client/components/Grid/Grid.d.ts +1 -1
  22. package/dist/client/components/Img/Img.d.ts +7 -0
  23. package/dist/client/components/InputNumber/InputNumber.d.ts +1 -1
  24. package/dist/client/components/JSONViewer/JSONViewer.d.ts +1 -1
  25. package/dist/client/components/Link/Link.d.ts +1 -1
  26. package/dist/client/components/LogViewer/LogViewer.d.ts +1 -1
  27. package/dist/client/components/Markdown/parser.d.ts +1 -1
  28. package/dist/client/components/Math/Math.d.ts +1 -1
  29. package/dist/client/components/Mentions/Mentions.d.ts +1 -1
  30. package/dist/client/components/Menu/Menu.d.ts +1 -1
  31. package/dist/client/components/Menubar/Menubar.d.ts +1 -1
  32. package/dist/client/components/MessageBubble/MessageBubble.d.ts +1 -1
  33. package/dist/client/components/NavBar/NavBar.d.ts +32 -0
  34. package/dist/client/components/NavMenu/NavMenu.d.ts +1 -1
  35. package/dist/client/components/OfficeEditor/ai/ai-bridge.d.ts +1 -1
  36. package/dist/client/components/OfficeEditor/model/types.d.ts +1 -1
  37. package/dist/client/components/Popconfirm/Popconfirm.d.ts +1 -1
  38. package/dist/client/components/Result/Result.d.ts +1 -1
  39. package/dist/client/components/Scrollbar/Scrollbar.d.ts +1 -1
  40. package/dist/client/components/SheetGrid/SheetGrid.d.ts +1 -1
  41. package/dist/client/components/SlideCanvas/SlideCanvas.d.ts +1 -1
  42. package/dist/client/components/TagsInput/TagsInput.d.ts +1 -1
  43. package/dist/client/components/Timeline/Timeline.d.ts +1 -1
  44. package/dist/client/components/Transfer/Transfer.d.ts +1 -1
  45. package/dist/client/components/VirtualList/VirtualList.d.ts +1 -1
  46. package/dist/client/components/VirtualTable/VirtualTable.d.ts +1 -1
  47. package/dist/client/components/Watermark/Watermark.d.ts +1 -1
  48. package/dist/client/components/index.d.ts +4 -0
  49. package/dist/client/components/index.js +39 -39
  50. package/dist/client/components/style.css +238 -18
  51. package/dist/client/layout/weifuwu-layout.css +35 -16
  52. package/dist/client/office/docx.d.ts +1 -1
  53. package/dist/client/office/xlsx.d.ts +1 -1
  54. package/dist/client/vdom/core/async-guard.d.ts +1 -1
  55. package/dist/client/vdom/core/patch/state-machine.d.ts +1 -1
  56. package/dist/client/vdom/core/router.d.ts +1 -1
  57. package/dist/client/vdom/core/ssr/html.d.ts +1 -1
  58. package/dist/client/vdom/core/v2/cycle.d.ts +4 -2
  59. package/dist/client/vdom/core/v2/diff.d.ts +9 -0
  60. package/dist/client/vdom/core/v2/integrate.d.ts +1 -1
  61. package/dist/client/vdom/core/v2/schedule.d.ts +1 -1
  62. package/dist/client/vdom/core/vnode.d.ts +1 -1
  63. package/dist/client/vdom/hooks/drag-media.d.ts +4 -1
  64. package/dist/client/vdom/hooks/popup-manager.d.ts +1 -1
  65. package/dist/client/vdom/hooks/stable.d.ts +1 -1
  66. package/dist/client/vdom/index.js +3 -3
  67. package/dist/client/vdom/testing.js +2 -2
  68. package/dist/server/ai/client.d.ts +1 -1
  69. package/dist/server/ai/sse.d.ts +1 -1
  70. package/dist/server/ai/types.d.ts +2 -2
  71. package/dist/server/db/contracts.d.ts +5 -0
  72. package/dist/server/db/postgres/connection.d.ts +6 -0
  73. package/dist/server/index.js +32 -2
  74. package/dist/server/postgres/types.d.ts +3 -0
  75. package/docs/client.md +170 -0
  76. package/docs/server.md +112 -0
  77. package/package.json +1 -3
  78. package/docs/ai-contract.md +0 -418
  79. package/docs/compat-three-library.md +0 -290
  80. package/docs/components-map.md +0 -227
  81. package/docs/environment.md +0 -50
  82. package/docs/examples.md +0 -121
  83. package/docs/style-guide.md +0 -248
package/docs/client.md ADDED
@@ -0,0 +1,170 @@
1
+ # weifuwu 客户端文档(client)
2
+
3
+ > 前端开发者入口。**代码即文档**:本文件只写「地图 + 规则要点」——
4
+ > 细节全部指向源码/测试(源码就是最高保真文档)。
5
+ > 组件编写规范入口在本文件 §5(新增/修改组件必读)。
6
+
7
+ ## 目录
8
+
9
+ - [1. 快速上手](#1-快速上手)
10
+ - [2. 组件清单](#2-组件清单)
11
+ - [3. 设计语言](#3-设计语言)
12
+ - [4. 布局系统](#4-布局系统)
13
+ - [5. 组件编写规范(唯一入口)](#5-组件编写规范唯一入口)
14
+ - [6. 前端架构导论](#6-前端架构导论)
15
+ - [7. 关键范式](#7-关键范式)
16
+
17
+ ---
18
+
19
+ ## 1. 快速上手
20
+
21
+ ```tsx
22
+ import { createApp, Router, Button, Modal } from 'weifuwu'
23
+
24
+ const app = createApp({ mount: '#root' })
25
+ app.router(Router())
26
+ // 组件 = 工厂同步 + 渲染纯同步——见 §5.1
27
+ ```
28
+
29
+ 前端三层:`uiServe`(应用引导)/ `uiSsr`(服务端渲染)/ `components`(UI 组件库)。
30
+ 入口实现:`src/client/index.ts` · 中间件:`src/client/middleware/`。
31
+
32
+ ## 2. 组件清单
33
+
34
+ **134 个组件**——源码目录即清单:`src/client/components/<Comp>/<Comp>.ts`(每个含
35
+ `<Comp>.css` + 契约测试)。展示与使用示例:`apps/showcase/`(localhost:3200——
36
+ `/components/<id>` 每组件一页 + demo 源码即用法)。
37
+
38
+ 组件分类速查(详见 `apps/showcase/src/demos/` 与 registry):
39
+
40
+ | 类 | 代表组件 |
41
+ | --- | --- |
42
+ | 通用基础 | Button / Card / Badge / Avatar / Alert / EmptyState / Loading / Modal / Drawer |
43
+ | 表单 | Input / Textarea / Select / DatePicker / Upload / Form / Checkbox / Switch / Slider |
44
+ | 数据展示 | Table / VirtualTable / Chart / Tree / CodeBlock / DiffView / Kanban |
45
+ | 导航 | NavBar / TabBar / Breadcrumb / Pagination / Menu / NavMenu / Anchor |
46
+ | 反馈 | Toast / Confirm / Notification / Popconfirm / ProgressBar / Skeleton |
47
+ | AI 特色 | AiChat / ChatInput / ToolCallCard / ApprovalCard / CitationCard / StreamingText |
48
+ | 命令式 | `toast()` / `confirm()` / `ui.openPopup()` / `ui.render()` |
49
+
50
+ 移动端适配:断点 768px · 44px 命中区 · safe-area 常量——组件与布局内建。
51
+
52
+ **三库对照**(antd / Element Plus / shadcn-ui 映射)——表格历史长度大,按需查:
53
+ 源码键 `apps/showcase/src/registry/components.ts`(每组件 `meta: { antd, ep, shadcn }`
54
+ 字段)是**机制化事实源**——查询即 grep,不再维护纸质映射表。
55
+
56
+ ## 3. 设计语言
57
+
58
+ 微流明(Whisper Luminance):中性色主导、品牌色点睛、动效短促有目的(120–300ms)、
59
+ 1px 边界即结构。**Token 即规范**——`src/client/layout/style.css`(183 双层 token:
60
+ 色阶/排版/动效/圆角/阴影/z-index)——组件只引用 token、零硬编码(audit 强制)。
61
+
62
+ 品牌换色 = 改 seed 一个值;预设主题 = `data-theme` 一个属性(minimal/dark)。
63
+
64
+ ## 4. 布局系统
65
+
66
+ `src/client/layout/`——49 原语(`_*.css`)+ 92 工具 + 2 内部,全部 `wf-` 前缀:
67
+
68
+ - **原语**:`wf-stack` / `wf-row` / `wf-grid` / `wf-center` / `wf-card-surface` / `wf-divider`
69
+ - **工具**:`wf-padding` / `wf-margin` / `wf-text-*` / `wf-bg-*` / `wf-hidden`
70
+ - **命名规则**:三类词根 + 三后缀(完整词根表见 `apps/showcase/src/demos/layout.tsx`
71
+ 与 `src/test/contract/layout-inventory.test.ts` L1 计数断言——**测试即登记表**)
72
+
73
+ 零值形态唯一(`none` 归一)· 对齐域禁方向词 · 双名歼灭——layout-inventory 8 断言锁定。
74
+
75
+ ## 5. 组件编写规范(唯一入口)
76
+
77
+ > 新建/修改组件前读本节——其余 § 按需。
78
+ > 规则可执行、检查可机制化:**红线写错即响**(§5.6),作者只需记住清单。
79
+
80
+ ### 5.1 作者契约
81
+
82
+ - 工厂**同步**(类型层强制)· 渲染**纯同步** · 异步全在 hooks/事件回调
83
+ - 状态闭包 mount 作用域 · 稳定回调/ref 定义 mount 层
84
+ - 资源清理 `ctx.ui.hold(fn)` · 浏览器环境经 `ctx.browser`(**零全局 window/document**
85
+ ——SSR 崩溃铁律,BackTop 实证)
86
+
87
+ ### 5.2 三件套
88
+
89
+ ```
90
+ src/client/components/<Comp>/
91
+ <Comp>.ts # 组件
92
+ <Comp>.css # 样式(必有——style-audit 文件数基线 +1)
93
+ <Comp>.test.ts # 契约 harness(命令流断言——零浏览器)
94
+ ```
95
+
96
+ ### 5.3 API 形状
97
+
98
+ props camelCase · **`className=`(组件 props)`class=`(DOM 元素)** ·
99
+ 受控三件套(value/onChange + 缺回调 warn)· 事件经事件表(函数 props 不写 attribute)·
100
+ 受控回流门控(引用比较 + live 门控)· value 走 property · aria 布尔归一 ·
101
+ 可交互 div 三件套:role + tabindex + onKeyDown
102
+
103
+ ### 5.4 CSS 纪律
104
+
105
+ 全部 `--wf-*` token 化(零硬编码色/字号)· 类名 `wf-` 前缀 ·
106
+ **状态变体类必须有规则或 `:where(.wf-x) {}` 显式声明**(L3 已扩围组件源码——未定义立即红)·
107
+ 动效 `--wf-dur-*`/`--wf-ease-*` · transition 含 visibility(隐藏不可 Tab 聚焦)
108
+
109
+ ### 5.5 测试二层(覆盖哨兵 ≥2 层)
110
+
111
+ 1. **契约 harness**(`<Comp>.test.ts`——mount/render/createTable 命令流断言)
112
+ 2. **showcase comp**(`apps/showcase/test/comp-<id>.test.ts`——真实 DOM:
113
+ 浮层断言「在哪」(assertPopupGeometry)· 表单断言值回流 · 交互断言操作→状态)
114
+
115
+ ### 5.6 红线(机制化——写错即响)
116
+
117
+ | 红线 | 机制 |
118
+ | --- | --- |
119
+ | 空串=空洞 · isHoleKind/isTextKind 单源 | audit:semantics |
120
+ | 硬编码色/字号 | audit:theme + style-audit S1/S6 |
121
+ | 状态变体类未定义 | layout-inventory L3 |
122
+ | 受控回流未门控 · 死变量/死函数 | audit:interactivity |
123
+ | renderFn 同步段 timer · 全局 window | effect-guard + audit:vdom |
124
+ | 交互面无测试断言 | audit:interactivity L2 |
125
+ | 事件进 attrs / value 走 attribute | 契约 7/8 |
126
+
127
+ ### 5.7 注册与文档
128
+
129
+ `src/client/components/index.ts` 导出 · `apps/showcase/src/registry/components.ts`
130
+ **追加不替换**(四字段 + gotchas)· demos 注册(组件名=demo 键)·
131
+ style-audit 文件数基线 +1 · 覆盖哨兵跑绿(`scripts/audit-component-coverage.mjs`)
132
+
133
+ ### 5.8 修改纪律
134
+
135
+ 范围:应用层修用例 · 组件层修组件 · **核心层修核心**(引擎 bug 透过组件暴露)·
136
+ R-03:类名/结构变更**反查测试选择器**(`[class*="..."]` 定位器)·
137
+ 行为变化**必带契约测试** · 机制化优先(能进审计不靠记忆)
138
+
139
+ ## 6. 前端架构导论
140
+
141
+ ```
142
+ 浏览器导航/URL ──► UIRouter(共享 trie 内核 src/shared/router/)
143
+ │
144
+ uiServe ──► 渲染周期(src/client/vdom/core/v2/cycle.ts)
145
+ │ build/diff → 命令流(13 种 NDJSON)
146
+ │ → apply(DOM)→ cleanup(卸载)
147
+ └──► ctx 中间件(router/api/auth/ws/i18n/confirm/toast)
148
+ ```
149
+
150
+ - **命令流即文档**:13 种命令(create/insert/remove/setProp/…)序列化可回放——
151
+ `src/client/vdom/core/patch/types.ts` 类型定义就是协议
152
+ - **状态机**:NodeState/CompState/IntervalState——`patch/state-machine.ts` 单一实现源
153
+ - **SSR ≡ SPA 首帧**:uiSsr 同路由器同 bundle——吸收零差异
154
+ - hooks 面:`src/client/vdom/hooks/`(useAsyncData/useObservable/signal——getter 纪律)
155
+ - 全链路 Observable(cycle/observable.ts)——组合/取消/回放四优势
156
+
157
+ ## 7. 关键范式
158
+
159
+ - **命令式弹窗唯一形态**:`ctx.ui.openPopup(opts)` → PopupHandle——`src/client/vdom/hooks/popup-manager.ts`
160
+ ——**anchor 必传**(无 anchor 触发按钮被当外部点击 + toggle 死循环)
161
+ - **焦点管理三范式**:`src/client/components/` 内实现 + `src/test/scenario/e2e-focus*.test.ts`
162
+ 场景断言(Trap 浮层 / 可交互 div 键盘可达 / 列表 roving focus)
163
+ - **受控输入纪律**:onInput 逐键 + onChange 失焦——ChatInput 实现即示例
164
+ - **getter 纪律**:一切会变化的值 = `() => T`——任意位置调用取最新
165
+ - **组件定时器**:工厂期创建 + `ctx.ui.hold` 注册清理(renderFn 窗口内建 timer = dev warn)
166
+
167
+ ---
168
+
169
+ > **运行**:`npm run test:client`(428 契约)· `npm run test:scenario`(123 场景)·
170
+ > `npm run test:showcase`(324 组件测试)——全量防线见 AGENTS.md §1。
package/docs/server.md ADDED
@@ -0,0 +1,112 @@
1
+ # weifuwu 服务端文档(server)
2
+
3
+ > 后端开发者入口。**代码即文档**:本文件只写「地图 + 协议概要」——
4
+ > 细节全部指向源码/测试(协议类型定义就是规范本体)。
5
+
6
+ ## 目录
7
+
8
+ - [1. 快速上手](#1-快速上手)
9
+ - [2. 中间件清单](#2-中间件清单)
10
+ - [3. 环境变量](#3-环境变量)
11
+ - [4. AI Stream Protocol](#4-ai-stream-protocol)
12
+ - [5. 数据层](#5-数据层)
13
+ - [6. 实时与渲染](#6-实时与渲染)
14
+
15
+ ---
16
+
17
+ ## 1. 快速上手
18
+
19
+ ```ts
20
+ import { createServer, Router } from 'weifuwu'
21
+
22
+ const server = createServer()
23
+ server.route(Router()
24
+ .get('/api/hello', (req, ctx) => ctx.json({ ok: true })))
25
+ server.listen(3000)
26
+ ```
27
+
28
+ 入口:`src/server/index.ts` · 路由内核:`src/server/core/`(Router/serve/WS hub——
29
+ 与前端 UIRouter 共享 `src/shared/router/` trie/pipeline 五层单源)。
30
+
31
+ ## 2. 中间件清单
32
+
33
+ `src/server/middleware/`——按 `ctx` 注入能力,Handler 从 ctx 读取:
34
+
35
+ | 中间件 | ctx 面 | 说明 |
36
+ | --- | --- | --- |
37
+ | `postgres()` | `ctx.sql` | PG v3 自研协议(无 pg 依赖) |
38
+ | `redis()` | `ctx.redis` | RESP2 自研协议 |
39
+ | `scheduler()` | `ctx.schedule` | 任务调度(持久化/恢复) |
40
+ | `queue()` | `ctx.queue` | 任务队列(worker/retry/backoff) |
41
+ | `messager()` | `ctx.msg` | 部门内部消息(面向 agent) |
42
+ | `userSystem()` | `ctx.auth`/`ctx.user` | 注册/登录/token/角色/租户 |
43
+ | `rateLimit()` | — | 令牌桶(per-key/per-user) |
44
+ | `email()` | `ctx.email` | resend/smtp 双 adapter |
45
+ | `ai()` | `ctx.ai` | LLM/embedding adapter(OpenAI 兼容) |
46
+ | `ui()` | `ctx.ui` | SSR + JS/CSS 编译(`html/js/css/ssr`) |
47
+ | `graphql()` | `ctx.gql` | GraphQL 层(Schema/Resolver) |
48
+ | `ws()` | `ctx.ws` | WebSocket hub(订阅/广播) |
49
+
50
+ 依赖注入声明:`injects/depends`——`src/shared/router/ctx-fields.ts`(未注册依赖
51
+ 抛错——类型/运行时双层)。
52
+
53
+ ## 3. 环境变量
54
+
55
+ > 均可经中间件 options 显式传入(env 为默认来源)。默认值与代码对齐
56
+ > (`src/server/middleware/*.ts` 构造处)。
57
+
58
+ | 变量 | 用途 | 模块 | 默认 |
59
+ | --- | --- | --- | --- |
60
+ | `DATABASE_URL` | PostgreSQL 连接串 | `postgres()` | —(必填) |
61
+ | `REDIS_URL` | Redis 连接串 | `redis()` | —(必填) |
62
+ | `AUTH_SECRET` | userSystem HMAC 密钥(≥16 字符) | `userSystem()` | — |
63
+ | `DEEPSEEK_API_KEY` | LLM provider key | `ai()` | — |
64
+ | `DEEPSEEK_BASE_URL` / `MODEL` | LLM 端点/模型 | `ai()` | `api.deepseek.com/v1` / `deepseek-v4-flash` |
65
+ | `DASHSCOPE_*` | embedding provider | `ai({ embedding })` | `deepseek` 同域 |
66
+ | `RESEND_API_KEY` / `SMTP_*` | 邮件 adapter | `email()` | `localhost:3025` |
67
+ | `PORT` | 服务端口 | `serve()` | `3000` |
68
+
69
+ ## 4. AI Stream Protocol
70
+
71
+ **协议即类型**(单源):`src/server/ai/types.ts`——修改协议先改此处,两侧实现对齐。
72
+
73
+ ```
74
+ 后端 → 前端(SSE 下行,wf: 事件——见 src/server/ai/sse.ts)
75
+ wf:message_start / wf:token / wf:tool_call / wf:tool_progress
76
+ wf:step / wf:approval_request / wf:usage / wf:done / wf:error
77
+ 前端 → 后端(POST 上行——src/client/vdom/hooks/chat.ts 编码同构)
78
+ provider 请求体 + 会话/工具调用回执
79
+ ```
80
+
81
+ 语义要点(实现于 `src/server/ai/*.ts` 与客户端解析器——**代码即规范**):
82
+
83
+ - 错误即值(`wf:error` 事件——非 HTTP 异常通道)
84
+ - 未知事件透传(`x:*` 自定义扩展)
85
+ - HITL 审批:`wf:approval_request` → 拒绝≠终止 · modified 改参 · 超时兜底
86
+ - 追踪关联:`traceId` 全链路透传
87
+
88
+ 消费端:`ctx.ai.chat()`(服务端流式)与 `useChat`(客户端会话语义层)。
89
+
90
+ ## 5. 数据层
91
+
92
+ - **postgres**:`src/server/middleware/postgres.ts`——自研 PG v3 wire protocol
93
+ (无第三方客户端依赖)——`ctx.sql.query/transaction`
94
+ - **redis**:`src/server/middleware/redis.ts`——自研 RESP2——`ctx.redis.get/set/pub`
95
+ - **Query Language**:`src/server/core/query-lang*`——AST 双后端(pg/内存——
96
+ 测试零外部依赖)——`Memory` 实现零数据库跑测试
97
+ - schema 迁移:`src/server/core/migrate*`
98
+
99
+ ## 6. 实时与渲染
100
+
101
+ - **scheduler**:`src/server/middleware/scheduler.ts`——`ctx.schedule.cron/once` +
102
+ 持久化恢复(重启续跑)
103
+ - **ui**:`ctx.ui.html/js/css/ssr`——TSX 动态编译(esbuild 同步)+ 组件 SSR
104
+ (`src/ssr.ts`——SSR ≡ SPA 首帧纪律)
105
+ - **graphql**:`src/server/middleware/graphql.ts`——Schema-first
106
+ - **WebSocket**:`src/server/core/ws-hub.ts`——连接/房间/广播 + 心跳
107
+
108
+ ---
109
+
110
+ > **运行**:`npm run test:server`(163 契约)· 直跑
111
+ > `node --env-file=.env --test src/server/core/*.test.ts src/shared/router/*.test.ts`
112
+ > —— db 真库依赖 docker(无 docker 跑 `src/server/core/*.test.ts` 子集)。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "weifuwu",
3
3
  "type": "module",
4
- "version": "0.89.1",
4
+ "version": "0.90.0",
5
5
  "description": "AI SaaS full-stack framework — backend HTTP + frontend VDOM + 129 components + CSS design system + SaaS foundation (auth/queue/AI). Zero-build, zero-dependency.",
6
6
  "exports": {
7
7
  ".": {
@@ -49,8 +49,6 @@
49
49
  "audit:semantics": "node scripts/audit-core-semantics.mjs",
50
50
  "audit:showcase": "node scripts/audit-showcase-dev.mjs",
51
51
  "audit:all": "npm run audit:semantics && npm run audit:interactivity && npm run audit:vdom && npm run audit:theme && npm run audit:api && npm run audit:bundle && npm run audit:showcase",
52
- "bench:server": "node bench/server-bench.ts",
53
- "bench:db": "node bench/db-bench.ts",
54
52
  "test:contract-components": "node --env-file=.env --test 'src/client/components/**/*.test.ts'",
55
53
  "audit:interactivity": "node scripts/audit-interactivity.mjs",
56
54
  "audit:theme": "node scripts/audit-theme.mjs",