boxglow 0.6.0 → 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.
- package/README.md +40 -4
- package/bin/boxglow.js +4244 -957
- package/dist/assets/index-BpZb2sGB.css +1 -0
- package/dist/assets/index-ujaBGwdT.js +3604 -0
- package/dist/icon-180.png +0 -0
- package/dist/icon-192.png +0 -0
- package/dist/icon-512-maskable.png +0 -0
- package/dist/icon-512.png +0 -0
- package/dist/index.html +7 -2
- package/docs/AGENTS_SNIPPET.md +7 -5
- package/examples/notes-app/boxglow.json +126 -28
- package/package.json +18 -4
- package/dist/assets/index-DSK28cPU.js +0 -3479
- package/dist/assets/index-T2Nrf6LN.css +0 -1
package/dist/icon-180.png
CHANGED
|
Binary file
|
package/dist/icon-192.png
CHANGED
|
Binary file
|
|
Binary file
|
package/dist/icon-512.png
CHANGED
|
Binary file
|
package/dist/index.html
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
<meta property="og:type" content="website" />
|
|
11
11
|
<meta property="og:site_name" content="すきま研究所日誌" />
|
|
12
12
|
<meta name="theme-color" content="#eceef0" />
|
|
13
|
+
<!-- PWA: ホーム画面に追加できるようにする (マニフェスト。Service Worker は src/main.tsx が boxglow.app でだけ登録する) -->
|
|
14
|
+
<link rel="manifest" href="manifest.webmanifest" />
|
|
15
|
+
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
16
|
+
<meta name="apple-mobile-web-app-title" content="Boxglow" />
|
|
17
|
+
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
|
13
18
|
<!-- アプリのアイコン (public/ の自前のロゴ。SVG を優先し、古い環境は ico) -->
|
|
14
19
|
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
|
15
20
|
<link rel="icon" type="image/x-icon" href="favicon.ico" />
|
|
@@ -27,8 +32,8 @@
|
|
|
27
32
|
} catch (e) {}
|
|
28
33
|
})();
|
|
29
34
|
</script>
|
|
30
|
-
<script type="module" crossorigin src="./assets/index-
|
|
31
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
35
|
+
<script type="module" crossorigin src="./assets/index-ujaBGwdT.js"></script>
|
|
36
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BpZb2sGB.css">
|
|
32
37
|
</head>
|
|
33
38
|
<body>
|
|
34
39
|
<div id="root"></div>
|
package/docs/AGENTS_SNIPPET.md
CHANGED
|
@@ -19,10 +19,11 @@ boxglow.json はリポジトリ直下に置く (`npx boxglow init --name "<プ
|
|
|
19
19
|
2. **準備を確認**: 取りかかる前に `npx boxglow context <block>` を読む。出力の `readiness` が準備の状態: `state` が `ready` なら着手できる。`unprepared` (要具体化) なら `unprepared` の理由と `next` の次の一手に従って先に具体化する。`waiting` は必須の入力か分岐の答えを待っている
|
|
20
20
|
3. **受け持ち、具体化**: 具体化や分解の前に `npx boxglow claim <block>` で受け持ちだけを取る (実行中にはならない。受け持ち制御が無効な計画では「取得不要」で正常終了する)。そのうえで不足を埋める:
|
|
21
21
|
- 出力の予定成果物: `npx boxglow port <block> --expect "<出力名>=file:src/x.ts"` (kind は file / dir / url / doc / note / decision / result。hint はパスの見当や題名。まだ作っていないファイルでよい)
|
|
22
|
-
- 完了条件: `npx boxglow scope <block> --acceptance "<完了と判断する条件>"`。処理の範囲は `--goal`
|
|
22
|
+
- 完了条件: `npx boxglow scope <block> --acceptance "<完了と判断する条件>"`。処理の範囲は `--goal`。出力を作るうえで守る条件 (性能・品質・サイズ・寸法・消費電力など) は `--constraints`
|
|
23
23
|
- 1 つのボックスで出力を作る見通しが立たないなら `npx boxglow split <block> --spec '<JSON>'` で中に小さなボックスを置く。今回着手する子だけ expect / acceptance を書き、先の子は題名と出力だけでよい (要具体化として残る)。入力は不明なら省略してよい (自動で上の階層の入力になる)
|
|
24
24
|
- 対象のファイルが分からないときは、架空のファイルを書かず「対象を特定する調査」のボックスを出力 `note` で作って始める
|
|
25
25
|
4. **着手を記録**: 準備ができたら `npx boxglow context <block>` を読み直してから `npx boxglow start <block> --note "<何をするか>"`。同時に進めるボックスは 1〜2 個まで。
|
|
26
|
+
start したボックスに「今ここ」(本当にいま作業しているボックス。複数の AI や人がいれば、いくつでも) が付き、画面で太い枠と NOW の札が付く。別のボックスにも付けるときは `npx boxglow now <block>` (外すときは `--off`、全部消すときは `now none`)。done / leave でそのボックスの分が外れる。人も画面の状態タブの NOW で付け外しする
|
|
26
27
|
確認トークンの要求 (guard) が有効な計画では、出力の `contextToken` (確認トークン) を付ける:
|
|
27
28
|
`npx boxglow start <block> --note "<何をするか>" --context-token <確認トークン>` (下の「確認トークンと引き継ぎ」を参照)
|
|
28
29
|
要具体化のボックスへの start は既定では警告 (理由と次の一手が出る)。`policy --unprepared reject` の計画では開始できない (`--reason` では通れない。人の操作は通る)。出力を子に任せきりの親も実行するものが無いので、子を start する
|
|
@@ -33,8 +34,9 @@ boxglow.json はリポジトリ直下に置く (`npx boxglow init --name "<プ
|
|
|
33
34
|
6. **人間の判断が要る**: `npx boxglow ask <block> "<質問>" --options "A|B"`。回答があるまでそのボックスは進めず、他のボックスへ移る。人の回答は `status` の「回答あり」に出る。読んだら `npx boxglow ack <block>` で引き取る (そのボックスの `start` / `done` / `set` などでも自動で引き取られる)。引き取るまで人の画面には「AI 未確認」として残り、人が答えを直せる。回答の中に問い返しがあれば、`ask` と `answer --by <自分>` で自分の答えも記録する
|
|
34
35
|
7. **詰まったら**: 入力 (前のボックスの成果物・資料) が足りないことが原因なら、詰まりにしない。`npx boxglow show <block>` で入力の配線を確かめ、足りないものを作るボックスが無ければ `npx boxglow add` で外 (上流) に作り、`npx boxglow connect` でこのボックスの入力につなぐ (配線が「待ち」の色で残り、何を待っているかが図で見える)。選択肢から選んでもらえば進めるなら `ask`。それ以外の、計画の外にある障害 (環境が動かない、権限やキーが無い、外部の返事待ち、原因の分からない失敗) だけを `npx boxglow blocked <block> --note "<困っていること>"` で記録する
|
|
35
36
|
8. **成果物の確認**: ファイルを移動・改名したら `npx boxglow check` を実行する (移動を検出してパスを付け替える。見つからなければ印が付く)
|
|
36
|
-
9.
|
|
37
|
-
10.
|
|
37
|
+
9. **進捗や気づきを残す**: `npx boxglow log <block> "<本文>"` で、日付と書き手つきの作業記録をボックスに足す (Markdown 可。人は画面の「記録」タブで同じものを見て書く)。引き継ぎメモ (checkpoint) は 1 つを上書きするが、記録は積み上がる
|
|
38
|
+
10. **中断・引き継ぎの前に**: セッションの終わり・コンテキストの圧縮・他の AI や人への引き継ぎの前に、`npx boxglow checkpoint <block> --note "分かったこと; 次にすること; 未解決のこと"` で引き継ぎメモを残す (guard が有効なら `--context-token <確認トークン>` を付ける)。会話の履歴が消えても計画の中に残り、次のセッションが `resume` と `context` で読む
|
|
39
|
+
11. **報告**: 作業の最後に `npx boxglow status --brief` の内容を要約して報告する
|
|
38
40
|
|
|
39
41
|
### 構造の約束
|
|
40
42
|
|
|
@@ -120,7 +122,7 @@ npx boxglow done B12 --artifact "<名前>=<パス>" --context-token <新しい
|
|
|
120
122
|
- **自分で更新できる場合**: 自分の `ask` / `artifact` / `done` / `set` / `split` / `checkpoint` などでコンテキストが変わったときは、その出力の最後の行に「新しい確認トークン: <token>」が出る。自分で変えた内容は分かっているので、読み直さずに次の操作へ使う。`ask` / `decision` / `answer` / `reopen` は確認トークン無しでも実行できるが、新しい確認トークンが出るのは最新の確認トークンを付けたときだけ
|
|
121
123
|
- **最初は短い形で読む**: `npx boxglow context <block> --brief` は、対象のボックスの情報 (説明・範囲・判断・引き継ぎ・入出力・成果物) は全部、計画全体の説明、親と入力元の題名・状態・判断 (材料と選択肢つき。前の回答の履歴は省く)・対象につながる出力を出す。確認トークンは `--brief` なしと同じなので、そのまま `--context-token` に使える。`target.missingInputs` (不足している必須の入力) と `target.inputs[].sources` (どのボックスのどの出力か・成果物の参照) を先に見る。`omitted` に省いた件数が出る。省かれた説明・入出力の条件・引き継ぎが作業に関わりそうなら、`--brief` なしで読むか、そのボックスの `context` を読む
|
|
122
124
|
- **短い形で始める前提**: 範囲 (scope) を 1 項目でも設定した親・入力元のボックスの説明は、短い形では省かれる (`omitted.descriptions` に件数)。範囲を設定するときは、説明に書いた制約 (互換性・禁止事項・期限など) を範囲へ写し終えてからにする。写したか分からない計画・`omitted.descriptions` が 0 でない計画では、着手前に `--brief` なしで 1 度読む。短い形は調査の出発点で、それだけ読めば十分という保証ではない
|
|
123
|
-
- 短い形でも用が足りるように書く: 作業を縛る条件は説明の中に埋めずに scope (non-goals / acceptance / consult) に書く。引き継ぎメモは最新の 1 件だけが残るので、未解決の点・注意点・次の手順を毎回書き直して持ち越す。調べ始める場所は、対象のボックスの説明に次の形で書く (出発点であり、そのファイルだけ読めば足りるという意味ではない):
|
|
125
|
+
- 短い形でも用が足りるように書く: 作業を縛る条件は説明の中に埋めずに scope (non-goals / constraints / acceptance / consult) に書く。引き継ぎメモは最新の 1 件だけが残るので、未解決の点・注意点・次の手順を毎回書き直して持ち越す。調べ始める場所は、対象のボックスの説明に次の形で書く (出発点であり、そのファイルだけ読めば足りるという意味ではない):
|
|
124
126
|
`変更候補: <パス> — <調べ始める理由>` / `関連検査: <パスまたはコマンド> — <確かめること>`
|
|
125
127
|
- 古い確認トークンを通すために guard を無効にしない (AI が `guard off` するには最新の確認トークンが要る)
|
|
126
128
|
- MCP では `boxglow_context` と、各ツールの `contextToken` 引数を使う (新しい確認トークンはツールの結果の最後の行に出る)
|
|
@@ -131,7 +133,7 @@ npx boxglow done B12 --artifact "<名前>=<パス>" --context-token <新しい
|
|
|
131
133
|
- 最初に resume の現況 (活動・判断待ち・未確認回答) を読む。候補は「今回の範囲 / その他」の各組で「着手できる / 要具体化 / 入力待ち」に分かれ、要具体化の理由と不足する入力名が出る。要具体化や入力待ちを、準備済みと取り違えない。
|
|
132
134
|
- 「着手できる」(Ready) は、自身が作る出力があり、その予定成果物 (expect) と完了条件 (acceptance) が書かれ、必須の入力がそろっている、という機械検査の結果。内容が具体的かどうかまでは保証しない (`expect = src/`、`acceptance = 動作する` でも通る)。対象・処理・成果・確認方法を第三者が追えるように書く。
|
|
133
135
|
- ボックスの任意4項目を scope で設定する。goal = 今回達成すること、non-goals = 今回は扱わないこと、acceptance = 完了と判断する条件、consult = 範囲を広げる前に相談する条件。context の先頭で対象と親の範囲を読み、着手前と完了前に照合する。完了条件の本文をAIが満たしたかは自動判定しない。
|
|
134
|
-
- scope B12 --goal "達成すること" --non-goals "今回扱わないこと" --acceptance "確認する条件" --consult "相談する条件" で設定する。scope B12 は表示だけ。各項目に none
|
|
136
|
+
- scope B12 --goal "達成すること" --non-goals "今回扱わないこと" --acceptance "確認する条件" --consult "相談する条件" で設定する。scope B12 は表示だけ。各項目に none または空文字を渡すと消す。画面では詳細パネルの「その他」タブ →「作業範囲を編集」。記入済みの項目だけが「今回の範囲」に出る。
|
|
135
137
|
- focus B12 でこのボックスと配下を次候補の先頭にする。focus は現在の対象の表示、focus none は解除。対象外も別の組に残る。候補に出ること自体は作業範囲の拡大や公開を許可しない。
|
|
136
138
|
- start の必須入力不足は既定で警告するが、従来どおり開始できる。先行作業が必要なら --reason "先に行う理由" を付ける。警告は出ず、理由は活動とログに残る。done の出力成果物なしも既定で警告のみ。既存の出力成果物または --artifact を数え、ボックスの参考資料は数えない。
|
|
137
139
|
- 計画で選ぶ場合だけ policy --start reject --done reject --unprepared reject にする。それぞれ warn に戻せる。入力待ちの拒否でも理由付きの開始は可能だが、要具体化の拒否は理由では通れない (先に具体化する)。成果物なしの拒否は set --status white にも効く。人の操作 (画面 / --actor human) は拒否しない。AIが拒否を避けるために人を名乗ったり、設定を弱めたりしない。
|
|
@@ -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",
|
|
@@ -75,7 +78,10 @@
|
|
|
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",
|
|
@@ -93,7 +99,10 @@
|
|
|
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",
|
|
@@ -111,7 +120,10 @@
|
|
|
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",
|
|
@@ -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",
|
|
@@ -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",
|
|
@@ -287,7 +305,10 @@
|
|
|
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",
|
|
@@ -322,7 +346,10 @@
|
|
|
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",
|
|
@@ -339,7 +366,10 @@
|
|
|
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",
|
|
@@ -356,7 +386,10 @@
|
|
|
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",
|
|
@@ -390,7 +426,10 @@
|
|
|
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",
|
|
@@ -407,7 +446,10 @@
|
|
|
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",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "boxglow",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.6.
|
|
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/
|
|
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",
|