@codyswann/lisa 2.166.3 → 2.166.4
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/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/skills/harper-config-yaml/SKILL.md +172 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/skills/harper-config-yaml/SKILL.md +172 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/skills/harper-config-yaml/SKILL.md +172 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/skills/harper-config-yaml/SKILL.md +172 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/harper-fabric/skills/harper-config-yaml/SKILL.md +172 -1
package/package.json
CHANGED
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"lodash": ">=4.18.1"
|
|
86
86
|
},
|
|
87
87
|
"name": "@codyswann/lisa",
|
|
88
|
-
"version": "2.166.
|
|
88
|
+
"version": "2.166.4",
|
|
89
89
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
90
90
|
"main": "dist/index.js",
|
|
91
91
|
"exports": {
|
|
@@ -66,6 +66,175 @@ For real-time work, component `config.yaml` keeps `rest`, `graphqlSchema`, and
|
|
|
66
66
|
MQTT topic paths. Broker ports and MQTT authentication live in the root
|
|
67
67
|
`harper-config.yaml`, not the component file. See [[harper-realtime]].
|
|
68
68
|
|
|
69
|
+
## `dataLoader`: seed data
|
|
70
|
+
|
|
71
|
+
Use `dataLoader` for versioned seed/reference records that should exist whenever
|
|
72
|
+
the component is deployed. Define table shape first with `graphqlSchema`, then
|
|
73
|
+
point `dataLoader.files` at one or more JSON/YAML files:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
graphqlSchema:
|
|
77
|
+
files: 'schema.graphql'
|
|
78
|
+
dataLoader:
|
|
79
|
+
files:
|
|
80
|
+
- 'data/roles.yaml'
|
|
81
|
+
- 'data/reference/*.json'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Each data file targets exactly one table and has `database`, `table`, and
|
|
85
|
+
`records` keys:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
database: app
|
|
89
|
+
table: Role
|
|
90
|
+
records:
|
|
91
|
+
- id: admin
|
|
92
|
+
name: Administrator
|
|
93
|
+
permissions:
|
|
94
|
+
- users:read
|
|
95
|
+
- users:write
|
|
96
|
+
- id: viewer
|
|
97
|
+
name: Viewer
|
|
98
|
+
permissions:
|
|
99
|
+
- users:read
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Harper runs the loader on full system starts and component deployments. It is
|
|
103
|
+
safe to re-run when files are idempotent: new records are inserted, unchanged
|
|
104
|
+
records are skipped, and records are updated from the file only when the tracked
|
|
105
|
+
file content changed. User-created records and user edits made after an initial
|
|
106
|
+
load are preserved; changed data-loaded records are patched instead of blindly
|
|
107
|
+
replaced.
|
|
108
|
+
|
|
109
|
+
Choose `dataLoader` for small, source-controlled reference/configuration data
|
|
110
|
+
that should ship with the component. Use a REST/Operations API script or job for
|
|
111
|
+
large imports, environment-specific backfills, or one-off migrations where retry
|
|
112
|
+
scope and operator approval matter.
|
|
113
|
+
|
|
114
|
+
Verify locally:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
harper dev harper-app
|
|
118
|
+
curl -s http://localhost:9926/app/Role/admin
|
|
119
|
+
harper dev harper-app # restart/redeploy and confirm the seed did not duplicate
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## `fastifyRoutes`: custom HTTP routes
|
|
123
|
+
|
|
124
|
+
Prefer `jsResource` plus `rest` for normal CRUD/action APIs. Use `fastifyRoutes`
|
|
125
|
+
only when the route shape does not fit the Resource model: webhooks, custom
|
|
126
|
+
serialization, unusual path matching, or a compatibility endpoint.
|
|
127
|
+
|
|
128
|
+
```yaml
|
|
129
|
+
rest: true
|
|
130
|
+
graphqlSchema:
|
|
131
|
+
files: 'schema.graphql'
|
|
132
|
+
jsResource:
|
|
133
|
+
files: 'resources.js'
|
|
134
|
+
fastifyRoutes:
|
|
135
|
+
files: 'routes/*.js'
|
|
136
|
+
urlPath: 'hooks'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Route modules default-export an async function that receives the Fastify server
|
|
140
|
+
and Harper helpers:
|
|
141
|
+
|
|
142
|
+
```js
|
|
143
|
+
export default async (server, { hdbCore, logger }) => {
|
|
144
|
+
server.route({
|
|
145
|
+
method: 'POST',
|
|
146
|
+
url: '/payment/:provider',
|
|
147
|
+
preValidation: hdbCore.preValidation,
|
|
148
|
+
handler: async (request, reply) => {
|
|
149
|
+
logger.debug(`payment webhook ${request.params.provider}`);
|
|
150
|
+
request.body = {
|
|
151
|
+
operation: 'insert',
|
|
152
|
+
schema: 'app',
|
|
153
|
+
table: 'WebhookEvent',
|
|
154
|
+
records: [
|
|
155
|
+
{
|
|
156
|
+
id: request.headers['x-event-id'],
|
|
157
|
+
provider: request.params.provider,
|
|
158
|
+
payload: request.body,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
const result = await hdbCore.request(request);
|
|
163
|
+
return { ok: true, result };
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Use Fastify's `request.params`, `request.query`, `request.body`, and `request.headers`
|
|
170
|
+
for route inputs. Keep auth explicit: `hdbCore.request` should be paired with
|
|
171
|
+
`hdbCore.preValidation` so Harper authenticates the request. Avoid
|
|
172
|
+
`requestWithoutAuthentication` unless the route has its own signature/JWT check
|
|
173
|
+
and all user-provided values are bound or escaped; never build SQL strings by
|
|
174
|
+
interpolating params/body values.
|
|
175
|
+
|
|
176
|
+
Verify locally:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
harper dev harper-app
|
|
180
|
+
curl -i -X POST http://localhost:9926/app/hooks/payment/stripe \
|
|
181
|
+
-H 'Authorization: Basic ...' \
|
|
182
|
+
-H 'Content-Type: application/json' \
|
|
183
|
+
-H 'x-event-id: evt_123' \
|
|
184
|
+
--data '{"status":"paid"}'
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## `static`: serve web assets and SPAs
|
|
188
|
+
|
|
189
|
+
Use `static` to serve generated browser output or other immutable assets from
|
|
190
|
+
the component. In Lisa Harper Fabric projects, `harper-app/web/**` is generated
|
|
191
|
+
by the project build; edit the source UI under `src/`, not the deployed files.
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
static:
|
|
195
|
+
files: 'web/**'
|
|
196
|
+
urlPath: '.'
|
|
197
|
+
index: true
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`files` selects what is served. `urlPath` mounts those files under a URL prefix:
|
|
201
|
+
`urlPath: 'app'` makes `web/index.html` available at `/app/index.html`; the
|
|
202
|
+
default application path still includes the Harper project/component prefix. Use
|
|
203
|
+
`index: true` to serve `index.html` for directory requests, and `extensions:
|
|
204
|
+
['html']` when clean URLs should resolve to `.html` files.
|
|
205
|
+
|
|
206
|
+
For client-side-routed SPAs, return the app shell for unmatched asset paths:
|
|
207
|
+
|
|
208
|
+
```yaml
|
|
209
|
+
static:
|
|
210
|
+
files: 'web/**'
|
|
211
|
+
urlPath: '.'
|
|
212
|
+
index: true
|
|
213
|
+
fallthrough: false
|
|
214
|
+
notFound:
|
|
215
|
+
file: 'web/index.html'
|
|
216
|
+
statusCode: 200
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
That fallback is for browser routes such as `/reports/weekly`; it should not hide
|
|
220
|
+
missing API endpoints or broken asset names. Keep API routes under a clear
|
|
221
|
+
prefix, and check that hashed JS/CSS assets still return their actual files.
|
|
222
|
+
|
|
223
|
+
Harper's documented `static` config controls path matching and not-found
|
|
224
|
+
behavior, not custom cache policy. Treat MIME type and cache headers as runtime
|
|
225
|
+
behavior to verify with `curl -I`; if the app needs precise cache headers,
|
|
226
|
+
front it with an edge/proxy policy or a custom route designed for that asset
|
|
227
|
+
surface.
|
|
228
|
+
|
|
229
|
+
Verify locally:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
harper dev harper-app
|
|
233
|
+
curl -I http://localhost:9926/app/
|
|
234
|
+
curl -I http://localhost:9926/app/assets/index.js
|
|
235
|
+
curl -I http://localhost:9926/app/client-side-route
|
|
236
|
+
```
|
|
237
|
+
|
|
69
238
|
## External components and custom plugins
|
|
70
239
|
|
|
71
240
|
A component you depend on from npm needs a `package:` directive matching a
|
|
@@ -109,4 +278,6 @@ dropped an extension often fails only at runtime, not at build time.
|
|
|
109
278
|
## Sources
|
|
110
279
|
|
|
111
280
|
- [Components overview](https://docs.harperdb.io/reference/v5/components/overview)
|
|
112
|
-
- [
|
|
281
|
+
- [Data Loader](https://docs.harperdb.io/reference/v5/database/data-loader)
|
|
282
|
+
- [Fastify Routes](https://docs.harperdb.io/reference/v5/fastify-routes/overview)
|
|
283
|
+
- [Static Files](https://docs.harperdb.io/reference/v5/static-files/overview)
|
|
@@ -66,6 +66,175 @@ For real-time work, component `config.yaml` keeps `rest`, `graphqlSchema`, and
|
|
|
66
66
|
MQTT topic paths. Broker ports and MQTT authentication live in the root
|
|
67
67
|
`harper-config.yaml`, not the component file. See [[harper-realtime]].
|
|
68
68
|
|
|
69
|
+
## `dataLoader`: seed data
|
|
70
|
+
|
|
71
|
+
Use `dataLoader` for versioned seed/reference records that should exist whenever
|
|
72
|
+
the component is deployed. Define table shape first with `graphqlSchema`, then
|
|
73
|
+
point `dataLoader.files` at one or more JSON/YAML files:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
graphqlSchema:
|
|
77
|
+
files: 'schema.graphql'
|
|
78
|
+
dataLoader:
|
|
79
|
+
files:
|
|
80
|
+
- 'data/roles.yaml'
|
|
81
|
+
- 'data/reference/*.json'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Each data file targets exactly one table and has `database`, `table`, and
|
|
85
|
+
`records` keys:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
database: app
|
|
89
|
+
table: Role
|
|
90
|
+
records:
|
|
91
|
+
- id: admin
|
|
92
|
+
name: Administrator
|
|
93
|
+
permissions:
|
|
94
|
+
- users:read
|
|
95
|
+
- users:write
|
|
96
|
+
- id: viewer
|
|
97
|
+
name: Viewer
|
|
98
|
+
permissions:
|
|
99
|
+
- users:read
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Harper runs the loader on full system starts and component deployments. It is
|
|
103
|
+
safe to re-run when files are idempotent: new records are inserted, unchanged
|
|
104
|
+
records are skipped, and records are updated from the file only when the tracked
|
|
105
|
+
file content changed. User-created records and user edits made after an initial
|
|
106
|
+
load are preserved; changed data-loaded records are patched instead of blindly
|
|
107
|
+
replaced.
|
|
108
|
+
|
|
109
|
+
Choose `dataLoader` for small, source-controlled reference/configuration data
|
|
110
|
+
that should ship with the component. Use a REST/Operations API script or job for
|
|
111
|
+
large imports, environment-specific backfills, or one-off migrations where retry
|
|
112
|
+
scope and operator approval matter.
|
|
113
|
+
|
|
114
|
+
Verify locally:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
harper dev harper-app
|
|
118
|
+
curl -s http://localhost:9926/app/Role/admin
|
|
119
|
+
harper dev harper-app # restart/redeploy and confirm the seed did not duplicate
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## `fastifyRoutes`: custom HTTP routes
|
|
123
|
+
|
|
124
|
+
Prefer `jsResource` plus `rest` for normal CRUD/action APIs. Use `fastifyRoutes`
|
|
125
|
+
only when the route shape does not fit the Resource model: webhooks, custom
|
|
126
|
+
serialization, unusual path matching, or a compatibility endpoint.
|
|
127
|
+
|
|
128
|
+
```yaml
|
|
129
|
+
rest: true
|
|
130
|
+
graphqlSchema:
|
|
131
|
+
files: 'schema.graphql'
|
|
132
|
+
jsResource:
|
|
133
|
+
files: 'resources.js'
|
|
134
|
+
fastifyRoutes:
|
|
135
|
+
files: 'routes/*.js'
|
|
136
|
+
urlPath: 'hooks'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Route modules default-export an async function that receives the Fastify server
|
|
140
|
+
and Harper helpers:
|
|
141
|
+
|
|
142
|
+
```js
|
|
143
|
+
export default async (server, { hdbCore, logger }) => {
|
|
144
|
+
server.route({
|
|
145
|
+
method: 'POST',
|
|
146
|
+
url: '/payment/:provider',
|
|
147
|
+
preValidation: hdbCore.preValidation,
|
|
148
|
+
handler: async (request, reply) => {
|
|
149
|
+
logger.debug(`payment webhook ${request.params.provider}`);
|
|
150
|
+
request.body = {
|
|
151
|
+
operation: 'insert',
|
|
152
|
+
schema: 'app',
|
|
153
|
+
table: 'WebhookEvent',
|
|
154
|
+
records: [
|
|
155
|
+
{
|
|
156
|
+
id: request.headers['x-event-id'],
|
|
157
|
+
provider: request.params.provider,
|
|
158
|
+
payload: request.body,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
const result = await hdbCore.request(request);
|
|
163
|
+
return { ok: true, result };
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Use Fastify's `request.params`, `request.query`, `request.body`, and `request.headers`
|
|
170
|
+
for route inputs. Keep auth explicit: `hdbCore.request` should be paired with
|
|
171
|
+
`hdbCore.preValidation` so Harper authenticates the request. Avoid
|
|
172
|
+
`requestWithoutAuthentication` unless the route has its own signature/JWT check
|
|
173
|
+
and all user-provided values are bound or escaped; never build SQL strings by
|
|
174
|
+
interpolating params/body values.
|
|
175
|
+
|
|
176
|
+
Verify locally:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
harper dev harper-app
|
|
180
|
+
curl -i -X POST http://localhost:9926/app/hooks/payment/stripe \
|
|
181
|
+
-H 'Authorization: Basic ...' \
|
|
182
|
+
-H 'Content-Type: application/json' \
|
|
183
|
+
-H 'x-event-id: evt_123' \
|
|
184
|
+
--data '{"status":"paid"}'
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## `static`: serve web assets and SPAs
|
|
188
|
+
|
|
189
|
+
Use `static` to serve generated browser output or other immutable assets from
|
|
190
|
+
the component. In Lisa Harper Fabric projects, `harper-app/web/**` is generated
|
|
191
|
+
by the project build; edit the source UI under `src/`, not the deployed files.
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
static:
|
|
195
|
+
files: 'web/**'
|
|
196
|
+
urlPath: '.'
|
|
197
|
+
index: true
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`files` selects what is served. `urlPath` mounts those files under a URL prefix:
|
|
201
|
+
`urlPath: 'app'` makes `web/index.html` available at `/app/index.html`; the
|
|
202
|
+
default application path still includes the Harper project/component prefix. Use
|
|
203
|
+
`index: true` to serve `index.html` for directory requests, and `extensions:
|
|
204
|
+
['html']` when clean URLs should resolve to `.html` files.
|
|
205
|
+
|
|
206
|
+
For client-side-routed SPAs, return the app shell for unmatched asset paths:
|
|
207
|
+
|
|
208
|
+
```yaml
|
|
209
|
+
static:
|
|
210
|
+
files: 'web/**'
|
|
211
|
+
urlPath: '.'
|
|
212
|
+
index: true
|
|
213
|
+
fallthrough: false
|
|
214
|
+
notFound:
|
|
215
|
+
file: 'web/index.html'
|
|
216
|
+
statusCode: 200
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
That fallback is for browser routes such as `/reports/weekly`; it should not hide
|
|
220
|
+
missing API endpoints or broken asset names. Keep API routes under a clear
|
|
221
|
+
prefix, and check that hashed JS/CSS assets still return their actual files.
|
|
222
|
+
|
|
223
|
+
Harper's documented `static` config controls path matching and not-found
|
|
224
|
+
behavior, not custom cache policy. Treat MIME type and cache headers as runtime
|
|
225
|
+
behavior to verify with `curl -I`; if the app needs precise cache headers,
|
|
226
|
+
front it with an edge/proxy policy or a custom route designed for that asset
|
|
227
|
+
surface.
|
|
228
|
+
|
|
229
|
+
Verify locally:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
harper dev harper-app
|
|
233
|
+
curl -I http://localhost:9926/app/
|
|
234
|
+
curl -I http://localhost:9926/app/assets/index.js
|
|
235
|
+
curl -I http://localhost:9926/app/client-side-route
|
|
236
|
+
```
|
|
237
|
+
|
|
69
238
|
## External components and custom plugins
|
|
70
239
|
|
|
71
240
|
A component you depend on from npm needs a `package:` directive matching a
|
|
@@ -109,4 +278,6 @@ dropped an extension often fails only at runtime, not at build time.
|
|
|
109
278
|
## Sources
|
|
110
279
|
|
|
111
280
|
- [Components overview](https://docs.harperdb.io/reference/v5/components/overview)
|
|
112
|
-
- [
|
|
281
|
+
- [Data Loader](https://docs.harperdb.io/reference/v5/database/data-loader)
|
|
282
|
+
- [Fastify Routes](https://docs.harperdb.io/reference/v5/fastify-routes/overview)
|
|
283
|
+
- [Static Files](https://docs.harperdb.io/reference/v5/static-files/overview)
|