boxglow 0.5.2 → 0.6.1

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.
@@ -39,7 +39,10 @@
39
39
  "collapsed": false,
40
40
  "artifacts": [],
41
41
  "activity": null,
42
- "decisions": []
42
+ "decisions": [],
43
+ "scope": {
44
+ "acceptance": "The released URL works end to end (B5)"
45
+ }
43
46
  },
44
47
  "ZMFSNdn0cY": {
45
48
  "id": "ZMFSNdn0cY",
@@ -68,14 +71,17 @@
68
71
  "status": "gray",
69
72
  "assigneeIds": [],
70
73
  "position": {
71
- "x": 667.1999999999998,
74
+ "x": 624,
72
75
  "y": 76
73
76
  },
74
77
  "collapsed": true,
75
78
  "artifacts": [],
76
79
  "activity": null,
77
80
  "decisions": [],
78
- "category": "build"
81
+ "category": "build",
82
+ "scope": {
83
+ "acceptance": "All API boxes done and the deployed URL answers (B14)"
84
+ }
79
85
  },
80
86
  "3u5hKihF4D": {
81
87
  "id": "3u5hKihF4D",
@@ -86,14 +92,17 @@
86
92
  "status": "gray",
87
93
  "assigneeIds": [],
88
94
  "position": {
89
- "x": 1201.1999999999996,
95
+ "x": 1128,
90
96
  "y": 76
91
97
  },
92
98
  "collapsed": true,
93
99
  "artifacts": [],
94
100
  "activity": null,
95
101
  "decisions": [],
96
- "category": "ui"
102
+ "category": "ui",
103
+ "scope": {
104
+ "acceptance": "All screens done and bundled (B18)"
105
+ }
97
106
  },
98
107
  "0fkP95FsUN": {
99
108
  "id": "0fkP95FsUN",
@@ -104,14 +113,17 @@
104
113
  "status": "gray",
105
114
  "assigneeIds": [],
106
115
  "position": {
107
- "x": 1741.7999999999993,
116
+ "x": 1632,
108
117
  "y": 76
109
118
  },
110
119
  "collapsed": true,
111
120
  "artifacts": [],
112
121
  "activity": null,
113
122
  "decisions": [],
114
- "category": "ops"
123
+ "category": "ops",
124
+ "scope": {
125
+ "acceptance": "E2E report green, guide written, production deployed (B19-B21)"
126
+ }
115
127
  },
116
128
  "LYc11K8ruJ": {
117
129
  "id": "LYc11K8ruJ",
@@ -139,7 +151,7 @@
139
151
  "status": "white",
140
152
  "assigneeIds": [],
141
153
  "position": {
142
- "x": 719.9999999999998,
154
+ "x": 624,
143
155
  "y": 76
144
156
  },
145
157
  "collapsed": false,
@@ -156,8 +168,8 @@
156
168
  "status": "white",
157
169
  "assigneeIds": [],
158
170
  "position": {
159
- "x": 719.9999999999998,
160
- "y": 270
171
+ "x": 624,
172
+ "y": 460
161
173
  },
162
174
  "collapsed": false,
163
175
  "artifacts": [],
@@ -173,7 +185,7 @@
173
185
  "status": "white",
174
186
  "assigneeIds": [],
175
187
  "position": {
176
- "x": 1372.7999999999995,
188
+ "x": 1128,
177
189
  "y": 76
178
190
  },
179
191
  "collapsed": false,
@@ -207,7 +219,7 @@
207
219
  "status": "white",
208
220
  "assigneeIds": [],
209
221
  "position": {
210
- "x": 713.3999999999997,
222
+ "x": 624,
211
223
  "y": 76
212
224
  },
213
225
  "collapsed": false,
@@ -224,7 +236,7 @@
224
236
  "status": "gray",
225
237
  "assigneeIds": [],
226
238
  "position": {
227
- "x": 1306.7999999999995,
239
+ "x": 1128,
228
240
  "y": 76
229
241
  },
230
242
  "collapsed": false,
@@ -235,7 +247,10 @@
235
247
  "note": "Indexing titles and bodies with SQLite FTS5",
236
248
  "since": "2026-10-03T14:45:46.115Z"
237
249
  },
238
- "decisions": []
250
+ "decisions": [],
251
+ "scope": {
252
+ "acceptance": "Searching a word in a title or body returns the note; the FTS index is rebuilt on write (unit tests in src/api/search.test.ts)"
253
+ }
239
254
  },
240
255
  "TH10H5-u24": {
241
256
  "id": "TH10H5-u24",
@@ -246,8 +261,8 @@
246
261
  "status": "black",
247
262
  "assigneeIds": [],
248
263
  "position": {
249
- "x": 713.3999999999997,
250
- "y": 270
264
+ "x": 624,
265
+ "y": 476
251
266
  },
252
267
  "collapsed": false,
253
268
  "artifacts": [],
@@ -270,7 +285,10 @@
270
285
  "askedAt": "2026-10-03T14:45:46.216Z",
271
286
  "context": "Magic link: no password to store, needs an email sender (about 2 days). GitHub OAuth: fastest for developers, excludes non-developers (about 1 day). Both: covers everyone, about 4 days and two flows to test. The choice decides what the sign-in screen looks like."
272
287
  }
273
- ]
288
+ ],
289
+ "scope": {
290
+ "acceptance": "A user can sign in with the chosen method and the session survives a reload; unauthenticated requests get 401"
291
+ }
274
292
  },
275
293
  "22rKT8w03M": {
276
294
  "id": "22rKT8w03M",
@@ -281,13 +299,16 @@
281
299
  "status": "black",
282
300
  "assigneeIds": [],
283
301
  "position": {
284
- "x": 1886.9999999999993,
302
+ "x": 1632,
285
303
  "y": 76
286
304
  },
287
305
  "collapsed": false,
288
306
  "artifacts": [],
289
307
  "activity": null,
290
- "decisions": []
308
+ "decisions": [],
309
+ "scope": {
310
+ "acceptance": "GET /notes on the deployed URL returns 200 with the seed data; the deploy is repeatable from CI"
311
+ }
291
312
  },
292
313
  "YidubvffQz": {
293
314
  "id": "YidubvffQz",
@@ -305,7 +326,10 @@
305
326
  "artifacts": [],
306
327
  "activity": null,
307
328
  "decisions": [],
308
- "dueDate": "2026-10-20"
329
+ "dueDate": "2026-10-20",
330
+ "scope": {
331
+ "acceptance": "A note can be created, edited and saved through the API; autosave within 2 s of the last keystroke"
332
+ }
309
333
  },
310
334
  "XDtu3zwWAn": {
311
335
  "id": "XDtu3zwWAn",
@@ -317,12 +341,15 @@
317
341
  "assigneeIds": [],
318
342
  "position": {
319
343
  "x": 120,
320
- "y": 296
344
+ "y": 524
321
345
  },
322
346
  "collapsed": false,
323
347
  "artifacts": [],
324
348
  "activity": null,
325
- "decisions": []
349
+ "decisions": [],
350
+ "scope": {
351
+ "acceptance": "The list shows the latest notes first and the search box filters through the Search API"
352
+ }
326
353
  },
327
354
  "xYvOHBC1DN": {
328
355
  "id": "xYvOHBC1DN",
@@ -334,12 +361,15 @@
334
361
  "assigneeIds": [],
335
362
  "position": {
336
363
  "x": 120,
337
- "y": 516
364
+ "y": 956
338
365
  },
339
366
  "collapsed": false,
340
367
  "artifacts": [],
341
368
  "activity": null,
342
- "decisions": []
369
+ "decisions": [],
370
+ "scope": {
371
+ "acceptance": "Sign-in works with the method chosen in B13 and redirects back to the list"
372
+ }
343
373
  },
344
374
  "uZTNlTes5s": {
345
375
  "id": "uZTNlTes5s",
@@ -350,13 +380,16 @@
350
380
  "status": "black",
351
381
  "assigneeIds": [],
352
382
  "position": {
353
- "x": 680.3999999999999,
383
+ "x": 624,
354
384
  "y": 76
355
385
  },
356
386
  "collapsed": false,
357
387
  "artifacts": [],
358
388
  "activity": null,
359
- "decisions": []
389
+ "decisions": [],
390
+ "scope": {
391
+ "acceptance": "npm run build produces dist/web under 500 KB gzipped and the app loads from it"
392
+ }
360
393
  },
361
394
  "yxW1zNrZz8": {
362
395
  "id": "yxW1zNrZz8",
@@ -373,7 +406,10 @@
373
406
  "collapsed": false,
374
407
  "artifacts": [],
375
408
  "activity": null,
376
- "decisions": []
409
+ "decisions": [],
410
+ "scope": {
411
+ "acceptance": "Create, search, edit and sign-in flows pass in Chromium; the report is attached to the release"
412
+ }
377
413
  },
378
414
  "lBs6ymPFkU": {
379
415
  "id": "lBs6ymPFkU",
@@ -385,12 +421,15 @@
385
421
  "assigneeIds": [],
386
422
  "position": {
387
423
  "x": 120,
388
- "y": 296
424
+ "y": 508
389
425
  },
390
426
  "collapsed": false,
391
427
  "artifacts": [],
392
428
  "activity": null,
393
- "decisions": []
429
+ "decisions": [],
430
+ "scope": {
431
+ "acceptance": "A new user can create a note and find it again by following the guide only"
432
+ }
394
433
  },
395
434
  "w5GL5rLmcl": {
396
435
  "id": "w5GL5rLmcl",
@@ -401,13 +440,16 @@
401
440
  "status": "black",
402
441
  "assigneeIds": [],
403
442
  "position": {
404
- "x": 673.7999999999998,
443
+ "x": 624,
405
444
  "y": 76
406
445
  },
407
446
  "collapsed": false,
408
447
  "artifacts": [],
409
448
  "activity": null,
410
- "decisions": []
449
+ "decisions": [],
450
+ "scope": {
451
+ "acceptance": "The production URL serves the built app against the deployed API; rollback is documented"
452
+ }
411
453
  }
412
454
  },
413
455
  "ports": {
@@ -427,7 +469,11 @@
427
469
  "name": "Released notes app (URL)",
428
470
  "description": "",
429
471
  "required": true,
430
- "artifacts": []
472
+ "artifacts": [],
473
+ "expect": {
474
+ "kind": "url",
475
+ "hint": "https://notes.example.com"
476
+ }
431
477
  },
432
478
  "PSs2GnRQRn": {
433
479
  "id": "PSs2GnRQRn",
@@ -491,7 +537,11 @@
491
537
  "name": "API (src/api, deployed)",
492
538
  "description": "",
493
539
  "required": true,
494
- "artifacts": []
540
+ "artifacts": [],
541
+ "expect": {
542
+ "kind": "url",
543
+ "hint": "https://notes-api.example.workers.dev"
544
+ }
495
545
  },
496
546
  "LZ1_Z0bw-y": {
497
547
  "id": "LZ1_Z0bw-y",
@@ -500,7 +550,11 @@
500
550
  "name": "Web app (src/web, built)",
501
551
  "description": "",
502
552
  "required": true,
503
- "artifacts": []
553
+ "artifacts": [],
554
+ "expect": {
555
+ "kind": "dir",
556
+ "hint": "dist/web"
557
+ }
504
558
  },
505
559
  "tUS4gnPoks": {
506
560
  "id": "tUS4gnPoks",
@@ -509,7 +563,11 @@
509
563
  "name": "Released notes app (URL)",
510
564
  "description": "",
511
565
  "required": true,
512
- "artifacts": []
566
+ "artifacts": [],
567
+ "expect": {
568
+ "kind": "url",
569
+ "hint": "https://notes.example.com"
570
+ }
513
571
  },
514
572
  "kRGZ8bJsm_": {
515
573
  "id": "kRGZ8bJsm_",
@@ -746,7 +804,11 @@
746
804
  "name": "Search API (src/api/search.ts)",
747
805
  "description": "",
748
806
  "required": true,
749
- "artifacts": []
807
+ "artifacts": [],
808
+ "expect": {
809
+ "kind": "file",
810
+ "hint": "src/api/search.ts"
811
+ }
750
812
  },
751
813
  "sbj2_geCFp": {
752
814
  "id": "sbj2_geCFp",
@@ -764,7 +826,11 @@
764
826
  "name": "Auth (src/api/auth.ts)",
765
827
  "description": "",
766
828
  "required": true,
767
- "artifacts": []
829
+ "artifacts": [],
830
+ "expect": {
831
+ "kind": "file",
832
+ "hint": "src/api/auth.ts"
833
+ }
768
834
  },
769
835
  "icdYMYD9rs": {
770
836
  "id": "icdYMYD9rs",
@@ -782,7 +848,11 @@
782
848
  "name": "API (src/api, deployed)",
783
849
  "description": "",
784
850
  "required": true,
785
- "artifacts": []
851
+ "artifacts": [],
852
+ "expect": {
853
+ "kind": "url",
854
+ "hint": "https://notes-api.example.workers.dev"
855
+ }
786
856
  },
787
857
  "i_49kXPJfx": {
788
858
  "id": "i_49kXPJfx",
@@ -809,7 +879,11 @@
809
879
  "name": "Editor (src/web/Editor.tsx)",
810
880
  "description": "",
811
881
  "required": true,
812
- "artifacts": []
882
+ "artifacts": [],
883
+ "expect": {
884
+ "kind": "file",
885
+ "hint": "src/web/Editor.tsx"
886
+ }
813
887
  },
814
888
  "h-iarMzqdp": {
815
889
  "id": "h-iarMzqdp",
@@ -836,7 +910,11 @@
836
910
  "name": "List (src/web/List.tsx)",
837
911
  "description": "",
838
912
  "required": true,
839
- "artifacts": []
913
+ "artifacts": [],
914
+ "expect": {
915
+ "kind": "file",
916
+ "hint": "src/web/List.tsx"
917
+ }
840
918
  },
841
919
  "LpjkcfJmGt": {
842
920
  "id": "LpjkcfJmGt",
@@ -863,7 +941,11 @@
863
941
  "name": "Sign-in (src/web/SignIn.tsx)",
864
942
  "description": "",
865
943
  "required": true,
866
- "artifacts": []
944
+ "artifacts": [],
945
+ "expect": {
946
+ "kind": "file",
947
+ "hint": "src/web/SignIn.tsx"
948
+ }
867
949
  },
868
950
  "YS3uMOQeJ9": {
869
951
  "id": "YS3uMOQeJ9",
@@ -881,7 +963,11 @@
881
963
  "name": "Web app (src/web, built)",
882
964
  "description": "",
883
965
  "required": true,
884
- "artifacts": []
966
+ "artifacts": [],
967
+ "expect": {
968
+ "kind": "dir",
969
+ "hint": "dist/web"
970
+ }
885
971
  },
886
972
  "XW_sE-OnYM": {
887
973
  "id": "XW_sE-OnYM",
@@ -917,7 +1003,11 @@
917
1003
  "name": "Test report (e2e/report.html)",
918
1004
  "description": "",
919
1005
  "required": true,
920
- "artifacts": []
1006
+ "artifacts": [],
1007
+ "expect": {
1008
+ "kind": "file",
1009
+ "hint": "e2e/report.html"
1010
+ }
921
1011
  },
922
1012
  "SgY1T3yM5i": {
923
1013
  "id": "SgY1T3yM5i",
@@ -944,7 +1034,11 @@
944
1034
  "name": "Guide (docs/guide.md)",
945
1035
  "description": "",
946
1036
  "required": true,
947
- "artifacts": []
1037
+ "artifacts": [],
1038
+ "expect": {
1039
+ "kind": "doc",
1040
+ "hint": "docs/guide.md"
1041
+ }
948
1042
  },
949
1043
  "o5XAY1mhi6": {
950
1044
  "id": "o5XAY1mhi6",
@@ -962,7 +1056,11 @@
962
1056
  "name": "Released notes app (URL)",
963
1057
  "description": "",
964
1058
  "required": true,
965
- "artifacts": []
1059
+ "artifacts": [],
1060
+ "expect": {
1061
+ "kind": "url",
1062
+ "hint": "https://notes.example.com"
1063
+ }
966
1064
  },
967
1065
  "5wPahGjQb0": {
968
1066
  "id": "5wPahGjQb0",
@@ -1517,11 +1615,11 @@
1517
1615
  "terminals": {
1518
1616
  "in": {
1519
1617
  "x": 0,
1520
- "y": 165
1618
+ "y": 280
1521
1619
  },
1522
1620
  "out": {
1523
- "x": 2728.999999999999,
1524
- "y": 178
1621
+ "x": 2576,
1622
+ "y": 293
1525
1623
  }
1526
1624
  },
1527
1625
  "log": [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "boxglow",
3
3
  "private": false,
4
- "version": "0.5.2",
4
+ "version": "0.6.1",
5
5
  "type": "module",
6
6
  "description": "See at a glance what your AI agents and your team are working on: tasks as input/output boxes that go from BlackBox to WhiteBox. Web app + CLI, one boxglow.json in your repo.",
7
7
  "scripts": {
@@ -12,27 +12,41 @@
12
12
  "e2e": "bash e2e/run.sh",
13
13
  "test:watch": "vitest",
14
14
  "typecheck": "tsc -b",
15
- "build:cli": "esbuild cli/main.ts --bundle --loader:.md=text --platform=node --format=esm --target=node18 --external:@modelcontextprotocol/sdk --external:zod --outfile=bin/boxglow.js --banner:js='#!/usr/bin/env node'",
15
+ "build:cli": "esbuild cli/entry.ts --bundle --loader:.md=text --platform=node --format=esm --target=node18 --external:@modelcontextprotocol/sdk --external:zod --outfile=bin/boxglow.js --banner:js='#!/usr/bin/env node'",
16
16
  "prepare": "npm run build:cli",
17
17
  "prepublishOnly": "npm run build",
18
- "build:pages": "tsc -b && VITE_BASE=/ vite build --outDir dist-pages && npm run build:cli",
18
+ "build:pages": "tsc -b && VITE_BASE=/ vite build --outDir dist-pages && npm run build:cli && npm run build:legal",
19
19
  "deploy:pages": "npm run build:pages && npx --yes wrangler@4 pages deploy dist-pages --project-name=boxglow --commit-dirty=true",
20
20
  "waitlist:list": "npx --yes wrangler@4 kv key list --binding WAITLIST --prefix email: --remote",
21
21
  "waitlist:get": "npx --yes wrangler@4 kv key get --binding WAITLIST --remote",
22
- "build:vscode": "npm run build && rm -rf vscode/media && cp -r dist vscode/media && rm -rf vscode/media/waitlist && cp docs/logo/boxglow-128.png vscode/media/icon-128.png && cd vscode && npm run compile"
22
+ "build:vscode": "npm run build && rm -rf vscode/media && cp -r dist vscode/media && rm -rf vscode/media/waitlist && cp docs/logo/boxglow-128.png vscode/media/icon-128.png && cd vscode && npm run compile",
23
+ "build:legal": "node scripts/build-legal.mjs --out dist-pages",
24
+ "build:hosted": "esbuild cli/hosted.ts --bundle --loader:.md=text --platform=node --format=esm --target=es2022 --alias:node:fs=./cli/shims/node-fs.ts --alias:node:os=./cli/shims/node-os.ts --alias:node:child_process=./cli/shims/node-child_process.ts --alias:node:http=./cli/shims/node-http.ts --outfile=dist/hosted-mcp.mjs"
23
25
  },
24
26
  "dependencies": {
27
+ "@codemirror/commands": "^6.11.1",
28
+ "@codemirror/lang-markdown": "^6.5.2",
29
+ "@codemirror/language": "^6.13.1",
30
+ "@codemirror/state": "^6.7.6",
31
+ "@codemirror/view": "^6.43.14",
32
+ "@lezer/common": "^1.5.3",
33
+ "@lezer/markdown": "^1.8.0",
25
34
  "@modelcontextprotocol/sdk": "^1.32.0",
35
+ "dompurify": "^3.4.17",
36
+ "marked": "^18.1.1",
37
+ "smol-toml": "^1.9.1",
26
38
  "zod": "^4.6.5"
27
39
  },
28
40
  "devDependencies": {
29
41
  "@tailwindcss/vite": "^4.3.3",
42
+ "@types/dompurify": "^3.0.5",
30
43
  "@types/node": "^26.6.3",
31
44
  "@types/react": "^19.3.0",
32
45
  "@types/react-dom": "^19.3.0",
33
46
  "@vitejs/plugin-react": "^6.1.1",
34
47
  "@xyflow/react": "^12.12.0",
35
48
  "esbuild": "^0.28.2",
49
+ "fake-indexeddb": "^6.2.6",
36
50
  "idb-keyval": "^6.3.0",
37
51
  "nanoid": "^6.0.1",
38
52
  "react": "^19.3.0",