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.
Files changed (160) hide show
  1. package/.env.example +7 -0
  2. package/CLAUDE.md +220 -0
  3. package/README.md +206 -0
  4. package/SKILL.md +60 -0
  5. package/dist/cli/dashboard.d.ts +3 -0
  6. package/dist/cli/dashboard.d.ts.map +1 -0
  7. package/dist/cli/dashboard.js +206 -0
  8. package/dist/cli/dashboard.js.map +1 -0
  9. package/dist/cli/import.d.ts +3 -0
  10. package/dist/cli/import.d.ts.map +1 -0
  11. package/dist/cli/import.js +78 -0
  12. package/dist/cli/import.js.map +1 -0
  13. package/dist/cli/index.d.ts +3 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +31 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/cli/info.d.ts +5 -0
  18. package/dist/cli/info.d.ts.map +1 -0
  19. package/dist/cli/info.js +34 -0
  20. package/dist/cli/info.js.map +1 -0
  21. package/dist/cli/metrics.d.ts +3 -0
  22. package/dist/cli/metrics.d.ts.map +1 -0
  23. package/dist/cli/metrics.js +20 -0
  24. package/dist/cli/metrics.js.map +1 -0
  25. package/dist/cli/query.d.ts +3 -0
  26. package/dist/cli/query.d.ts.map +1 -0
  27. package/dist/cli/query.js +18 -0
  28. package/dist/cli/query.js.map +1 -0
  29. package/dist/cli/serve.d.ts +3 -0
  30. package/dist/cli/serve.d.ts.map +1 -0
  31. package/dist/cli/serve.js +19 -0
  32. package/dist/cli/serve.js.map +1 -0
  33. package/dist/cli/sleep.d.ts +3 -0
  34. package/dist/cli/sleep.d.ts.map +1 -0
  35. package/dist/cli/sleep.js +19 -0
  36. package/dist/cli/sleep.js.map +1 -0
  37. package/dist/cli/summary.d.ts +3 -0
  38. package/dist/cli/summary.d.ts.map +1 -0
  39. package/dist/cli/summary.js +53 -0
  40. package/dist/cli/summary.js.map +1 -0
  41. package/dist/cli/trends.d.ts +3 -0
  42. package/dist/cli/trends.d.ts.map +1 -0
  43. package/dist/cli/trends.js +77 -0
  44. package/dist/cli/trends.js.map +1 -0
  45. package/dist/cli/watch.d.ts +12 -0
  46. package/dist/cli/watch.d.ts.map +1 -0
  47. package/dist/cli/watch.js +89 -0
  48. package/dist/cli/watch.js.map +1 -0
  49. package/dist/cli/workouts.d.ts +3 -0
  50. package/dist/cli/workouts.d.ts.map +1 -0
  51. package/dist/cli/workouts.js +19 -0
  52. package/dist/cli/workouts.js.map +1 -0
  53. package/dist/config.d.ts +9 -0
  54. package/dist/config.d.ts.map +1 -0
  55. package/dist/config.js +25 -0
  56. package/dist/config.js.map +1 -0
  57. package/dist/db/importLog.d.ts +5 -0
  58. package/dist/db/importLog.d.ts.map +1 -0
  59. package/dist/db/importLog.js +10 -0
  60. package/dist/db/importLog.js.map +1 -0
  61. package/dist/db/metrics.d.ts +4 -0
  62. package/dist/db/metrics.d.ts.map +1 -0
  63. package/dist/db/metrics.js +14 -0
  64. package/dist/db/metrics.js.map +1 -0
  65. package/dist/db/schema.d.ts +5 -0
  66. package/dist/db/schema.d.ts.map +1 -0
  67. package/dist/db/schema.js +100 -0
  68. package/dist/db/schema.js.map +1 -0
  69. package/dist/db/sleep.d.ts +4 -0
  70. package/dist/db/sleep.d.ts.map +1 -0
  71. package/dist/db/sleep.js +13 -0
  72. package/dist/db/sleep.js.map +1 -0
  73. package/dist/db/workouts.d.ts +4 -0
  74. package/dist/db/workouts.d.ts.map +1 -0
  75. package/dist/db/workouts.js +11 -0
  76. package/dist/db/workouts.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +5 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/parse/metrics.d.ts +17 -0
  82. package/dist/parse/metrics.d.ts.map +1 -0
  83. package/dist/parse/metrics.js +33 -0
  84. package/dist/parse/metrics.js.map +1 -0
  85. package/dist/parse/sleep.d.ts +23 -0
  86. package/dist/parse/sleep.d.ts.map +1 -0
  87. package/dist/parse/sleep.js +58 -0
  88. package/dist/parse/sleep.js.map +1 -0
  89. package/dist/parse/time.d.ts +4 -0
  90. package/dist/parse/time.d.ts.map +1 -0
  91. package/dist/parse/time.js +41 -0
  92. package/dist/parse/time.js.map +1 -0
  93. package/dist/parse/workouts.d.ts +17 -0
  94. package/dist/parse/workouts.d.ts.map +1 -0
  95. package/dist/parse/workouts.js +24 -0
  96. package/dist/parse/workouts.js.map +1 -0
  97. package/dist/server/app.d.ts +5 -0
  98. package/dist/server/app.d.ts.map +1 -0
  99. package/dist/server/app.js +39 -0
  100. package/dist/server/app.js.map +1 -0
  101. package/dist/server/ingest.d.ts +15 -0
  102. package/dist/server/ingest.d.ts.map +1 -0
  103. package/dist/server/ingest.js +41 -0
  104. package/dist/server/ingest.js.map +1 -0
  105. package/dist/types/hae.d.ts +103 -0
  106. package/dist/types/hae.d.ts.map +1 -0
  107. package/dist/types/hae.js +2 -0
  108. package/dist/types/hae.js.map +1 -0
  109. package/dist/util/zip.d.ts +3 -0
  110. package/dist/util/zip.d.ts.map +1 -0
  111. package/dist/util/zip.js +24 -0
  112. package/dist/util/zip.js.map +1 -0
  113. package/docs/COMMANDS.md +315 -0
  114. package/docs/plans/2026-02-18-hae-vault-initial-implementation.md +2015 -0
  115. package/docs/plans/2026-02-18-readme-dashboard-design.md +213 -0
  116. package/docs/plans/2026-02-18-readme-dashboard-plan.md +1306 -0
  117. package/docs/plans/2026-02-18-zip-env-watch-design.md +213 -0
  118. package/docs/plans/2026-02-18-zip-env-watch.md +966 -0
  119. package/package.json +57 -0
  120. package/src/cli/dashboard.ts +242 -0
  121. package/src/cli/import.ts +85 -0
  122. package/src/cli/index.ts +32 -0
  123. package/src/cli/info.ts +36 -0
  124. package/src/cli/metrics.ts +20 -0
  125. package/src/cli/query.ts +17 -0
  126. package/src/cli/serve.ts +18 -0
  127. package/src/cli/sleep.ts +19 -0
  128. package/src/cli/summary.ts +58 -0
  129. package/src/cli/trends.ts +103 -0
  130. package/src/cli/watch.ts +111 -0
  131. package/src/cli/workouts.ts +19 -0
  132. package/src/config.ts +28 -0
  133. package/src/db/importLog.ts +18 -0
  134. package/src/db/metrics.ts +15 -0
  135. package/src/db/schema.ts +105 -0
  136. package/src/db/sleep.ts +15 -0
  137. package/src/db/workouts.ts +13 -0
  138. package/src/index.ts +4 -0
  139. package/src/parse/metrics.ts +50 -0
  140. package/src/parse/sleep.ts +82 -0
  141. package/src/parse/time.ts +43 -0
  142. package/src/parse/workouts.ts +42 -0
  143. package/src/server/app.ts +46 -0
  144. package/src/server/ingest.ts +68 -0
  145. package/src/types/hae.ts +94 -0
  146. package/src/util/zip.ts +24 -0
  147. package/tests/cli-watch.test.ts +64 -0
  148. package/tests/db-import-log.test.ts +40 -0
  149. package/tests/db-metrics.test.ts +44 -0
  150. package/tests/db-schema.test.ts +55 -0
  151. package/tests/db-sleep.test.ts +36 -0
  152. package/tests/db-workouts.test.ts +34 -0
  153. package/tests/ingest.test.ts +99 -0
  154. package/tests/parse-metrics.test.ts +55 -0
  155. package/tests/parse-sleep.test.ts +65 -0
  156. package/tests/parse-time.test.ts +48 -0
  157. package/tests/parse-workouts.test.ts +43 -0
  158. package/tests/types.test.ts +27 -0
  159. package/tests/util-zip.test.ts +46 -0
  160. package/tsconfig.json +19 -0
@@ -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)