rewire daemon services on project open
test / unit + widget + golden + a11y (push) Failing after 27s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped

The daemon dispatcher (pql, git, files, editor) was built once at
boot against cwd and never updated. Opening a project from the
welcome screen or directory picker had no effect on the daemon
services — pql couldn't find its index, git operated on the wrong
repo.

Now onProjectOpen rebuilds the full dispatcher against the new
workspace root and swaps it into the InProcessClient. The IPC
client's dispatcher field is no longer final.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-05-03 22:29:03 +02:00
co-authored by Claude
parent a5221792ba
commit 7b30748bf5
3 changed files with 138 additions and 118 deletions
+100 -100
View File
@@ -1,5 +1,5 @@
{ {
"exported_at": "2026-05-03T20:22:23Z", "exported_at": "2026-05-03T20:29:03Z",
"decisions": [ "decisions": [
{ {
"id": "D-1", "id": "D-1",
@@ -9,7 +9,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-3", "id": "D-3",
@@ -19,7 +19,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-4", "id": "D-4",
@@ -29,7 +29,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-5", "id": "D-5",
@@ -39,7 +39,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-6", "id": "D-6",
@@ -49,7 +49,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-7", "id": "D-7",
@@ -59,7 +59,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-8", "id": "D-8",
@@ -69,7 +69,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-9", "id": "D-9",
@@ -79,7 +79,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-10", "id": "D-10",
@@ -89,7 +89,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-11", "id": "D-11",
@@ -99,7 +99,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-12", "id": "D-12",
@@ -109,7 +109,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-13", "id": "D-13",
@@ -119,7 +119,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-14", "id": "D-14",
@@ -129,7 +129,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-15", "id": "D-15",
@@ -139,7 +139,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-16", "id": "D-16",
@@ -149,7 +149,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-17", "id": "D-17",
@@ -159,7 +159,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-18", "id": "D-18",
@@ -169,7 +169,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-19", "id": "D-19",
@@ -179,7 +179,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-20", "id": "D-20",
@@ -189,7 +189,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/accessibility.md", "file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-21", "id": "D-21",
@@ -199,7 +199,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/accessibility.md", "file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-22", "id": "D-22",
@@ -209,7 +209,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/accessibility.md", "file_path": "decisions/accessibility.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-23", "id": "D-23",
@@ -219,7 +219,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-24", "id": "D-24",
@@ -229,7 +229,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-25", "id": "D-25",
@@ -239,7 +239,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-26", "id": "D-26",
@@ -249,7 +249,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-27", "id": "D-27",
@@ -259,7 +259,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-28", "id": "D-28",
@@ -269,7 +269,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-29", "id": "D-29",
@@ -279,7 +279,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-30", "id": "D-30",
@@ -289,7 +289,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/testing.md", "file_path": "decisions/testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-31", "id": "D-31",
@@ -299,7 +299,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-32", "id": "D-32",
@@ -309,7 +309,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-33", "id": "D-33",
@@ -319,7 +319,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-34", "id": "D-34",
@@ -329,7 +329,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-35", "id": "D-35",
@@ -339,7 +339,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-36", "id": "D-36",
@@ -349,7 +349,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-37", "id": "D-37",
@@ -359,7 +359,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-38", "id": "D-38",
@@ -369,7 +369,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-39", "id": "D-39",
@@ -379,7 +379,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-40", "id": "D-40",
@@ -389,7 +389,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/process.md", "file_path": "decisions/process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-41", "id": "D-41",
@@ -399,7 +399,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-42", "id": "D-42",
@@ -409,7 +409,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-43", "id": "D-43",
@@ -419,7 +419,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-44", "id": "D-44",
@@ -429,7 +429,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-45", "id": "D-45",
@@ -439,7 +439,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-46", "id": "D-46",
@@ -449,7 +449,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/extensions.md", "file_path": "decisions/extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-47", "id": "D-47",
@@ -459,7 +459,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-48", "id": "D-48",
@@ -469,7 +469,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-49", "id": "D-49",
@@ -479,7 +479,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-50", "id": "D-50",
@@ -489,7 +489,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-51", "id": "D-51",
@@ -499,7 +499,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-52", "id": "D-52",
@@ -509,7 +509,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-53", "id": "D-53",
@@ -519,7 +519,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-54", "id": "D-54",
@@ -529,7 +529,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-55", "id": "D-55",
@@ -539,7 +539,7 @@
"status": "active", "status": "active",
"date": "2026-04-23", "date": "2026-04-23",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-56", "id": "D-56",
@@ -549,7 +549,7 @@
"status": "active", "status": "active",
"date": "2026-04-23", "date": "2026-04-23",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-57", "id": "D-57",
@@ -559,7 +559,7 @@
"status": "active", "status": "active",
"date": "2026-04-23", "date": "2026-04-23",
"file_path": "decisions/architecture.md", "file_path": "decisions/architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-58", "id": "D-58",
@@ -569,7 +569,7 @@
"status": "active", "status": "active",
"date": "2026-04-23", "date": "2026-04-23",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "D-59", "id": "D-59",
@@ -579,7 +579,7 @@
"status": "active", "status": "active",
"date": "2026-04-25", "date": "2026-04-25",
"file_path": "decisions/tooling.md", "file_path": "decisions/tooling.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-1", "id": "Q-1",
@@ -588,7 +588,7 @@
"title": "Authorisation granularity on the IPC socket", "title": "Authorisation granularity on the IPC socket",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-2", "id": "Q-2",
@@ -597,7 +597,7 @@
"title": "Back-pressure on event streams", "title": "Back-pressure on event streams",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-3", "id": "Q-3",
@@ -606,7 +606,7 @@
"title": "Event persistence + audit/undo", "title": "Event persistence + audit/undo",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-4", "id": "Q-4",
@@ -615,7 +615,7 @@
"title": "`.canvas` schema compatibility with Obsidian", "title": "`.canvas` schema compatibility with Obsidian",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-5", "id": "Q-5",
@@ -624,7 +624,7 @@
"title": "IPC wire-format stability + `schema_version:`", "title": "IPC wire-format stability + `schema_version:`",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-6", "id": "Q-6",
@@ -633,7 +633,7 @@
"title": "Window chrome — native frame vs frameless custom", "title": "Window chrome — native frame vs frameless custom",
"status": "resolved", "status": "resolved",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-7", "id": "Q-7",
@@ -642,7 +642,7 @@
"title": "macOS app bundle signing / notarisation", "title": "macOS app bundle signing / notarisation",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-8", "id": "Q-8",
@@ -651,7 +651,7 @@
"title": "Extension API shape — widgets, subcommands, both?", "title": "Extension API shape — widgets, subcommands, both?",
"status": "open", "status": "open",
"file_path": "decisions/questions-extensions.md", "file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-9", "id": "Q-9",
@@ -660,7 +660,7 @@
"title": "Lua runtime vendoring", "title": "Lua runtime vendoring",
"status": "open", "status": "open",
"file_path": "decisions/questions-extensions.md", "file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-10", "id": "Q-10",
@@ -669,7 +669,7 @@
"title": "Extension manifest `schema_version:`", "title": "Extension manifest `schema_version:`",
"status": "open", "status": "open",
"file_path": "decisions/questions-extensions.md", "file_path": "decisions/questions-extensions.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-11", "id": "Q-11",
@@ -678,7 +678,7 @@
"title": "Coverage gates — hard thresholds vs soft reporting", "title": "Coverage gates — hard thresholds vs soft reporting",
"status": "open", "status": "open",
"file_path": "decisions/questions-testing.md", "file_path": "decisions/questions-testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-12", "id": "Q-12",
@@ -687,7 +687,7 @@
"title": "Screen-reader automation (axe-core via Playwright)", "title": "Screen-reader automation (axe-core via Playwright)",
"status": "open", "status": "open",
"file_path": "decisions/questions-testing.md", "file_path": "decisions/questions-testing.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-13", "id": "Q-13",
@@ -696,7 +696,7 @@
"title": "Web production-mode a11y", "title": "Web production-mode a11y",
"status": "open", "status": "open",
"file_path": "decisions/questions-accessibility.md", "file_path": "decisions/questions-accessibility.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-14", "id": "Q-14",
@@ -705,7 +705,7 @@
"title": "i18n plurals / gender / date-format tooling", "title": "i18n plurals / gender / date-format tooling",
"status": "open", "status": "open",
"file_path": "decisions/questions-accessibility.md", "file_path": "decisions/questions-accessibility.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-15", "id": "Q-15",
@@ -714,7 +714,7 @@
"title": "Editor tab — full LSP vs tree-sitter-only highlight", "title": "Editor tab — full LSP vs tree-sitter-only highlight",
"status": "open", "status": "open",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-16", "id": "Q-16",
@@ -723,7 +723,7 @@
"title": "`tree-sitter-dart` grammar maintenance", "title": "`tree-sitter-dart` grammar maintenance",
"status": "open", "status": "open",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-17", "id": "Q-17",
@@ -732,7 +732,7 @@
"title": "Icon set growth", "title": "Icon set growth",
"status": "open", "status": "open",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-18", "id": "Q-18",
@@ -741,7 +741,7 @@
"title": "Theme hot-reload in release builds", "title": "Theme hot-reload in release builds",
"status": "open", "status": "open",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-19", "id": "Q-19",
@@ -750,7 +750,7 @@
"title": "(withdrawn)", "title": "(withdrawn)",
"status": "resolved", "status": "resolved",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-20", "id": "Q-20",
@@ -759,7 +759,7 @@
"title": "Kernel DB service — namespaced SQL access?", "title": "Kernel DB service — namespaced SQL access?",
"status": "open", "status": "open",
"file_path": "decisions/questions-process.md", "file_path": "decisions/questions-process.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-21", "id": "Q-21",
@@ -768,7 +768,7 @@
"title": "Pql absorbs planning vs keeps separate", "title": "Pql absorbs planning vs keeps separate",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-22", "id": "Q-22",
@@ -777,7 +777,7 @@
"title": "Ticket persistence strategy", "title": "Ticket persistence strategy",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-23", "id": "Q-23",
@@ -786,7 +786,7 @@
"title": "SSH-remote development — run clide against a remote workspace", "title": "SSH-remote development — run clide against a remote workspace",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-25", "id": "Q-25",
@@ -795,7 +795,7 @@
"title": "Body text face — mono everywhere vs Josefin Sans UI + mono code", "title": "Body text face — mono everywhere vs Josefin Sans UI + mono code",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-26", "id": "Q-26",
@@ -804,7 +804,7 @@
"title": "Small screen layout (\u003c 1000px)", "title": "Small screen layout (\u003c 1000px)",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-27", "id": "Q-27",
@@ -813,7 +813,7 @@
"title": "Two-editor split", "title": "Two-editor split",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-28", "id": "Q-28",
@@ -822,7 +822,7 @@
"title": "Terminal strip scope — shell only or logs/errors/tests", "title": "Terminal strip scope — shell only or logs/errors/tests",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-29", "id": "Q-29",
@@ -831,7 +831,7 @@
"title": "Branch picker location", "title": "Branch picker location",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-30", "id": "Q-30",
@@ -840,7 +840,7 @@
"title": "Focus behavior when editor is dirty and viewer is peeked", "title": "Focus behavior when editor is dirty and viewer is peeked",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "Q-31", "id": "Q-31",
@@ -849,7 +849,7 @@
"title": "XWayland fallback for frameless — proper Wayland protocol needed", "title": "XWayland fallback for frameless — proper Wayland protocol needed",
"status": "open", "status": "open",
"file_path": "decisions/questions-architecture.md", "file_path": "decisions/questions-architecture.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-2", "id": "R-2",
@@ -859,7 +859,7 @@
"status": "active", "status": "active",
"date": "2026-04-20", "date": "2026-04-20",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-3", "id": "R-3",
@@ -869,7 +869,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-4", "id": "R-4",
@@ -879,7 +879,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-5", "id": "R-5",
@@ -889,7 +889,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-6", "id": "R-6",
@@ -899,7 +899,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-7", "id": "R-7",
@@ -909,7 +909,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-8", "id": "R-8",
@@ -919,7 +919,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-9", "id": "R-9",
@@ -929,7 +929,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-10", "id": "R-10",
@@ -939,7 +939,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-11", "id": "R-11",
@@ -949,7 +949,7 @@
"status": "active", "status": "active",
"date": "2026-04-21", "date": "2026-04-21",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
}, },
{ {
"id": "R-12", "id": "R-12",
@@ -959,7 +959,7 @@
"status": "active", "status": "active",
"date": "2026-04-22", "date": "2026-04-22",
"file_path": "decisions/rejected.md", "file_path": "decisions/rejected.md",
"synced_at": "2026-05-03 20:21:27" "synced_at": "2026-05-03 20:28:13"
} }
], ],
"decision_refs": [ "decision_refs": [
+8 -4
View File
@@ -8,10 +8,14 @@ class InProcessClient extends DaemonClient {
InProcessClient({ InProcessClient({
required Logger log, required Logger log,
required DaemonBus events, required DaemonBus events,
required this.dispatcher, required DaemonDispatcher dispatcher,
}) : super(socketPath: '', log: log, events: events); }) : _dispatcher = dispatcher,
super(socketPath: '', log: log, events: events);
final DaemonDispatcher dispatcher; DaemonDispatcher _dispatcher;
DaemonDispatcher get dispatcher => _dispatcher;
set dispatcher(DaemonDispatcher d) => _dispatcher = d;
int _nextReqId = 0; int _nextReqId = 0;
@override @override
@@ -27,6 +31,6 @@ class InProcessClient extends DaemonClient {
Future<IpcResponse> request(String cmd, {Map<String, Object?> args = const {}}) { Future<IpcResponse> request(String cmd, {Map<String, Object?> args = const {}}) {
final id = '${_nextReqId++}'; final id = '${_nextReqId++}';
final req = IpcRequest(id: id, cmd: cmd, args: args); final req = IpcRequest(id: id, cmd: cmd, args: args);
return dispatcher.dispatch(req); return _dispatcher.dispatch(req);
} }
} }
+30 -14
View File
@@ -71,6 +71,25 @@ Future<void> main() async {
toolchain.applyResolved(resolveToolchainPaths(root)); toolchain.applyResolved(resolveToolchainPaths(root));
} }
InProcessClient? ipcClient;
DaemonBus? daemonBus;
DaemonDispatcher _buildDispatcher(DaemonBus events, Toolchain tc, Directory workRoot) {
final dispatcher = DaemonDispatcher();
final eventSink = _BusEventSink(events);
final paneRegistry = PaneRegistry(events: eventSink);
registerPaneCommands(dispatcher, paneRegistry);
final filesService = FilesService(root: workRoot, events: eventSink);
registerFilesCommands(dispatcher, filesService);
final editorRegistry = EditorRegistry(events: eventSink, workspaceRoot: workRoot);
registerEditorCommands(dispatcher, editorRegistry);
final gitClient = GitClient(toolchain: tc, workDir: workRoot);
registerGitCommands(dispatcher, gitClient, eventSink);
final pql = PqlClient(workDir: workRoot, toolchain: tc);
registerPqlCommands(dispatcher, pql);
return dispatcher;
}
final services = await KernelServices.boot( final services = await KernelServices.boot(
appDir: appDir, appDir: appDir,
bundledThemes: themes, bundledThemes: themes,
@@ -81,20 +100,17 @@ Future<void> main() async {
daemonClientFactory: kIsWeb daemonClientFactory: kIsWeb
? null ? null
: (log, events) { : (log, events) {
final dispatcher = DaemonDispatcher(); daemonBus = events;
final eventSink = _BusEventSink(events); final workRoot = FilesService.atCwd(events: _BusEventSink(events)).root;
final filesService = FilesService.atCwd(events: eventSink); final dispatcher = _buildDispatcher(events, toolchain, workRoot);
final workRoot = filesService.root; ipcClient = InProcessClient(log: log, events: events, dispatcher: dispatcher);
final paneRegistry = PaneRegistry(events: eventSink); return ipcClient!;
registerPaneCommands(dispatcher, paneRegistry); },
registerFilesCommands(dispatcher, filesService); onProjectOpen: kIsWeb
final editorRegistry = EditorRegistry(events: eventSink, workspaceRoot: workRoot); ? null
registerEditorCommands(dispatcher, editorRegistry); : (path) async {
final gitClient = GitClient(toolchain: toolchain, workDir: workRoot); if (ipcClient == null || daemonBus == null) return;
registerGitCommands(dispatcher, gitClient, eventSink); ipcClient!.dispatcher = _buildDispatcher(daemonBus!, toolchain, Directory(path));
final pql = PqlClient(workDir: workRoot, toolchain: toolchain);
registerPqlCommands(dispatcher, pql);
return InProcessClient(log: log, events: events, dispatcher: dispatcher);
}, },
); );