hae-vault 0.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/.env.example +7 -0
- package/CLAUDE.md +220 -0
- package/README.md +206 -0
- package/SKILL.md +60 -0
- package/dist/cli/dashboard.d.ts +3 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +206 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/import.d.ts +3 -0
- package/dist/cli/import.d.ts.map +1 -0
- package/dist/cli/import.js +78 -0
- package/dist/cli/import.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +31 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/info.d.ts +5 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +34 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/metrics.d.ts +3 -0
- package/dist/cli/metrics.d.ts.map +1 -0
- package/dist/cli/metrics.js +20 -0
- package/dist/cli/metrics.js.map +1 -0
- package/dist/cli/query.d.ts +3 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +18 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/serve.d.ts +3 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +19 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/sleep.d.ts +3 -0
- package/dist/cli/sleep.d.ts.map +1 -0
- package/dist/cli/sleep.js +19 -0
- package/dist/cli/sleep.js.map +1 -0
- package/dist/cli/summary.d.ts +3 -0
- package/dist/cli/summary.d.ts.map +1 -0
- package/dist/cli/summary.js +53 -0
- package/dist/cli/summary.js.map +1 -0
- package/dist/cli/trends.d.ts +3 -0
- package/dist/cli/trends.d.ts.map +1 -0
- package/dist/cli/trends.js +77 -0
- package/dist/cli/trends.js.map +1 -0
- package/dist/cli/watch.d.ts +12 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +89 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/cli/workouts.d.ts +3 -0
- package/dist/cli/workouts.d.ts.map +1 -0
- package/dist/cli/workouts.js +19 -0
- package/dist/cli/workouts.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/db/importLog.d.ts +5 -0
- package/dist/db/importLog.d.ts.map +1 -0
- package/dist/db/importLog.js +10 -0
- package/dist/db/importLog.js.map +1 -0
- package/dist/db/metrics.d.ts +4 -0
- package/dist/db/metrics.d.ts.map +1 -0
- package/dist/db/metrics.js +14 -0
- package/dist/db/metrics.js.map +1 -0
- package/dist/db/schema.d.ts +5 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +100 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sleep.d.ts +4 -0
- package/dist/db/sleep.d.ts.map +1 -0
- package/dist/db/sleep.js +13 -0
- package/dist/db/sleep.js.map +1 -0
- package/dist/db/workouts.d.ts +4 -0
- package/dist/db/workouts.d.ts.map +1 -0
- package/dist/db/workouts.js +11 -0
- package/dist/db/workouts.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parse/metrics.d.ts +17 -0
- package/dist/parse/metrics.d.ts.map +1 -0
- package/dist/parse/metrics.js +33 -0
- package/dist/parse/metrics.js.map +1 -0
- package/dist/parse/sleep.d.ts +23 -0
- package/dist/parse/sleep.d.ts.map +1 -0
- package/dist/parse/sleep.js +58 -0
- package/dist/parse/sleep.js.map +1 -0
- package/dist/parse/time.d.ts +4 -0
- package/dist/parse/time.d.ts.map +1 -0
- package/dist/parse/time.js +41 -0
- package/dist/parse/time.js.map +1 -0
- package/dist/parse/workouts.d.ts +17 -0
- package/dist/parse/workouts.d.ts.map +1 -0
- package/dist/parse/workouts.js +24 -0
- package/dist/parse/workouts.js.map +1 -0
- package/dist/server/app.d.ts +5 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +39 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/ingest.d.ts +15 -0
- package/dist/server/ingest.d.ts.map +1 -0
- package/dist/server/ingest.js +41 -0
- package/dist/server/ingest.js.map +1 -0
- package/dist/types/hae.d.ts +103 -0
- package/dist/types/hae.d.ts.map +1 -0
- package/dist/types/hae.js +2 -0
- package/dist/types/hae.js.map +1 -0
- package/dist/util/zip.d.ts +3 -0
- package/dist/util/zip.d.ts.map +1 -0
- package/dist/util/zip.js +24 -0
- package/dist/util/zip.js.map +1 -0
- package/docs/COMMANDS.md +315 -0
- package/docs/plans/2026-02-18-hae-vault-initial-implementation.md +2015 -0
- package/docs/plans/2026-02-18-readme-dashboard-design.md +213 -0
- package/docs/plans/2026-02-18-readme-dashboard-plan.md +1306 -0
- package/docs/plans/2026-02-18-zip-env-watch-design.md +213 -0
- package/docs/plans/2026-02-18-zip-env-watch.md +966 -0
- package/package.json +57 -0
- package/src/cli/dashboard.ts +242 -0
- package/src/cli/import.ts +85 -0
- package/src/cli/index.ts +32 -0
- package/src/cli/info.ts +36 -0
- package/src/cli/metrics.ts +20 -0
- package/src/cli/query.ts +17 -0
- package/src/cli/serve.ts +18 -0
- package/src/cli/sleep.ts +19 -0
- package/src/cli/summary.ts +58 -0
- package/src/cli/trends.ts +103 -0
- package/src/cli/watch.ts +111 -0
- package/src/cli/workouts.ts +19 -0
- package/src/config.ts +28 -0
- package/src/db/importLog.ts +18 -0
- package/src/db/metrics.ts +15 -0
- package/src/db/schema.ts +105 -0
- package/src/db/sleep.ts +15 -0
- package/src/db/workouts.ts +13 -0
- package/src/index.ts +4 -0
- package/src/parse/metrics.ts +50 -0
- package/src/parse/sleep.ts +82 -0
- package/src/parse/time.ts +43 -0
- package/src/parse/workouts.ts +42 -0
- package/src/server/app.ts +46 -0
- package/src/server/ingest.ts +68 -0
- package/src/types/hae.ts +94 -0
- package/src/util/zip.ts +24 -0
- package/tests/cli-watch.test.ts +64 -0
- package/tests/db-import-log.test.ts +40 -0
- package/tests/db-metrics.test.ts +44 -0
- package/tests/db-schema.test.ts +55 -0
- package/tests/db-sleep.test.ts +36 -0
- package/tests/db-workouts.test.ts +34 -0
- package/tests/ingest.test.ts +99 -0
- package/tests/parse-metrics.test.ts +55 -0
- package/tests/parse-sleep.test.ts +65 -0
- package/tests/parse-time.test.ts +48 -0
- package/tests/parse-workouts.test.ts +43 -0
- package/tests/types.test.ts +27 -0
- package/tests/util-zip.test.ts +46 -0
- package/tsconfig.json +19 -0
package/docs/COMMANDS.md
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# hae-vault — Full Command Reference
|
|
2
|
+
|
|
3
|
+
← [Back to README](../README.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Ingest commands
|
|
8
|
+
|
|
9
|
+
### `serve`
|
|
10
|
+
|
|
11
|
+
Start an HTTP server that receives Health Auto Export REST API pushes.
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
hvault serve
|
|
15
|
+
hvault serve --port 4242 --token mysecret
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Flag | Description |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `--port <n>` | HTTP port (default: 4242) |
|
|
21
|
+
| `--token <secret>` | Require `Authorization: Bearer <secret>` header |
|
|
22
|
+
|
|
23
|
+
Configure HAE: Settings → REST API → URL: `http://your-server:4242/api/ingest`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
### `import`
|
|
28
|
+
|
|
29
|
+
Bulk import from a HAE JSON or ZIP export file. Idempotent — skips already-imported files via SHA-256 hash.
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
hvault import export.json
|
|
33
|
+
hvault import export.zip
|
|
34
|
+
hvault import export.zip --target me
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Flag | Description |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| `--target <name>` | Tag imported data with device/person name |
|
|
40
|
+
|
|
41
|
+
Output:
|
|
42
|
+
```json
|
|
43
|
+
{"metrics":1234,"sleep":7,"workouts":3,"skipped":false}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### `watch`
|
|
49
|
+
|
|
50
|
+
Poll a directory for new HAE export files and auto-import on schedule.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
hvault watch
|
|
54
|
+
hvault watch --dir ~/Downloads
|
|
55
|
+
hvault watch --dir ~/Downloads --interval 60
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
| Flag | Description |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| `--dir <path>` | Directory to watch (default: `HVAULT_WATCH_DIR`) |
|
|
61
|
+
| `--interval <s>` | Poll interval in seconds (default: 60) |
|
|
62
|
+
| `--target <name>` | Tag imported data with device/person name |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Query commands
|
|
67
|
+
|
|
68
|
+
All query commands output JSON by default. Add `--pretty` for formatted JSON.
|
|
69
|
+
|
|
70
|
+
### Shared flags
|
|
71
|
+
|
|
72
|
+
| Flag | Description |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| `--days <n>` | Days of history |
|
|
75
|
+
| `--pretty` | Pretty-print JSON output |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### `metrics`
|
|
80
|
+
|
|
81
|
+
Time series for a specific health metric.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
hvault metrics --metric step_count --days 30
|
|
85
|
+
hvault metrics --metric heart_rate --days 7 --pretty
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Flag | Description |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| `--metric <name>` | **Required.** Metric name (e.g. `step_count`, `resting_heart_rate`) |
|
|
91
|
+
| `--days <n>` | Last N days (default: 30) |
|
|
92
|
+
|
|
93
|
+
Output (default JSON):
|
|
94
|
+
```json
|
|
95
|
+
[{"ts":"2026-02-18T00:00:00Z","date":"2026-02-18","qty":8432,"min":null,"avg":null,"max":null,"units":"count","source":"iPhone","target":"default"}]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
To discover available metric names: `hvault sources`
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### `sleep`
|
|
103
|
+
|
|
104
|
+
Sleep records with stage breakdown.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
hvault sleep --days 14
|
|
108
|
+
hvault sleep --days 7 --pretty
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Output:
|
|
112
|
+
```json
|
|
113
|
+
[{"date":"2026-02-17","sleep_start":"2026-02-17T22:45:00Z","sleep_end":"2026-02-18T06:00:00Z","core_h":null,"deep_h":1.5,"rem_h":2.1,"awake_h":0.3,"asleep_h":7.2,"in_bed_h":7.5,"schema_ver":"aggregated_v2","source":"Apple Watch"}]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
### `workouts`
|
|
119
|
+
|
|
120
|
+
Workout sessions with duration, calories, and heart rate.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
hvault workouts --days 30
|
|
124
|
+
hvault workouts --days 7 --pretty
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Output:
|
|
128
|
+
```json
|
|
129
|
+
[{"ts":"2026-02-17T18:30:00Z","date":"2026-02-17","name":"Walking","duration_s":2700,"calories_kj":1172,"distance":3.2,"distance_unit":"km","avg_hr":98,"max_hr":121,"target":"default"}]
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Note: `calories_kj` is kilojoules. Divide by 4.184 for kcal.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### `summary`
|
|
137
|
+
|
|
138
|
+
Per-metric averages over N days. JSON output by default.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
hvault summary --days 90
|
|
142
|
+
hvault summary --days 30 --pretty
|
|
143
|
+
hvault summary --color --days 30
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
| Flag | Description |
|
|
147
|
+
| --- | --- |
|
|
148
|
+
| `--days <n>` | Last N days (default: 90) |
|
|
149
|
+
| `--pretty` | Pretty-print JSON |
|
|
150
|
+
| `-c, --color` | Pretty terminal output with emoji indicators |
|
|
151
|
+
|
|
152
|
+
JSON output:
|
|
153
|
+
```json
|
|
154
|
+
[{"metric":"step_count","units":"count","avg_qty":8432,"min_qty":3200,"max_qty":14100,"count":87,"first_date":"2025-11-20","last_date":"2026-02-18"}]
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
With `--color`:
|
|
158
|
+
```
|
|
159
|
+
📊 30-Day Summary
|
|
160
|
+
|
|
161
|
+
👟 Avg Steps: 8,432
|
|
162
|
+
💓 Avg Resting HR: 58bpm
|
|
163
|
+
🧠 Avg HRV: 44ms
|
|
164
|
+
😴 Avg Sleep: 7.2h
|
|
165
|
+
🔥 Avg Active Cal: 420 kcal
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
### `query`
|
|
171
|
+
|
|
172
|
+
Raw SQL query against the SQLite database.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
hvault query "SELECT date, AVG(qty) FROM metrics WHERE metric='step_count' GROUP BY date ORDER BY date DESC LIMIT 7"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Returns JSON array of row objects. Use `--pretty` for formatted output.
|
|
179
|
+
|
|
180
|
+
**Tables:** `metrics`, `sleep`, `workouts`, `sync_log`, `import_log`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Analysis commands
|
|
185
|
+
|
|
186
|
+
### `dashboard`
|
|
187
|
+
|
|
188
|
+
Full terminal dashboard: sleep, activity, heart health, recent workouts, N-day trends, vault stats.
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
hvault dashboard
|
|
192
|
+
hvault dashboard --days 14
|
|
193
|
+
hvault dashboard --json
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
| Flag | Description |
|
|
197
|
+
| --- | --- |
|
|
198
|
+
| `--days <n>` | Trend window in days (default: 7) |
|
|
199
|
+
| `--json` | Output raw JSON (for AI agent use) |
|
|
200
|
+
|
|
201
|
+
Output:
|
|
202
|
+
```
|
|
203
|
+
📅 2026-02-18 | Apple Health Vault
|
|
204
|
+
|
|
205
|
+
── Sleep (last night) ────────────────
|
|
206
|
+
😴 7.2h | Efficiency: 94%
|
|
207
|
+
Deep: 1.5h (21%) | REM: 2.1h (29%) | Light: 3.6h (50%)
|
|
208
|
+
Awake: 0.3h | Source: Apple Watch
|
|
209
|
+
|
|
210
|
+
── Activity (recent) ─────────────────
|
|
211
|
+
👟 8,432 steps | 🔥 420 kcal active
|
|
212
|
+
Stand hours: 10
|
|
213
|
+
|
|
214
|
+
── Heart Health ──────────────────────
|
|
215
|
+
💓 Resting HR: 58bpm | HRV: 44ms
|
|
216
|
+
|
|
217
|
+
── Recent Workouts ───────────────────
|
|
218
|
+
🚶 2026-02-17 Walking 45min 280 kcal
|
|
219
|
+
🚴 2026-02-15 Cycling 62min 420 kcal
|
|
220
|
+
|
|
221
|
+
── 7-Day Trends ──────────────────────
|
|
222
|
+
Steps: 7,200 → 8,432 ↑ (avg 7,840)
|
|
223
|
+
Sleep: 6.8h → 7.2h ↑ (avg 7.1h)
|
|
224
|
+
Resting HR: 60 → 58bpm ↓ (avg 59)
|
|
225
|
+
HRV: 42 → 44ms ↑ (avg 43)
|
|
226
|
+
|
|
227
|
+
── Vault Stats ───────────────────────
|
|
228
|
+
Metrics: 570,432 | Sleep: 365 | Workouts: 248
|
|
229
|
+
Last sync: 2026-02-18 09:23 UTC
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### `trends`
|
|
235
|
+
|
|
236
|
+
Multi-metric trend analysis with averages, ranges, and direction arrows.
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
hvault trends
|
|
240
|
+
hvault trends --days 30
|
|
241
|
+
hvault trends --json
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
| Flag | Description |
|
|
245
|
+
| --- | --- |
|
|
246
|
+
| `--days <n>` | Days of history (default: 7) |
|
|
247
|
+
| `--json` | Raw JSON output |
|
|
248
|
+
|
|
249
|
+
Output:
|
|
250
|
+
```
|
|
251
|
+
📊 7-Day Trends
|
|
252
|
+
|
|
253
|
+
👟 Steps: 8,432 avg (6,100–11,200) ↑
|
|
254
|
+
💓 Resting HR: 58bpm avg (55–62) ↓
|
|
255
|
+
🧠 HRV: 44ms avg (38–52) ↑
|
|
256
|
+
😴 Sleep: 7.2h avg (5.5–8.9h) ↑
|
|
257
|
+
🔥 Active Cal: 420 kcal avg (280–620) →
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Direction logic: compares first-half average vs second-half average of the period.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Info commands
|
|
265
|
+
|
|
266
|
+
### `sources`
|
|
267
|
+
|
|
268
|
+
Show which metrics are in the DB and their date coverage.
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
hvault sources
|
|
272
|
+
hvault sources --pretty
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Output:
|
|
276
|
+
```json
|
|
277
|
+
[{"metric":"active_energy_burned","units":"kcal","count":365,"first_date":"2025-02-18","last_date":"2026-02-18"}]
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
### `last-sync`
|
|
283
|
+
|
|
284
|
+
Show when the last HAE REST API push was received.
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
hvault last-sync
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Output:
|
|
291
|
+
```json
|
|
292
|
+
{"id":42,"received_at":"2026-02-18T09:23:11.000Z","target":"default","metrics_count":247,"workouts_count":0}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Returns `null` if no pushes have been received.
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
### `stats`
|
|
300
|
+
|
|
301
|
+
Row counts per table.
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
hvault stats
|
|
305
|
+
hvault stats --pretty
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Output:
|
|
309
|
+
```json
|
|
310
|
+
{"metrics":570432,"sleep":365,"workouts":248,"syncs":12}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
← [Back to README](../README.md)
|