@shivaedev/work-board 0.2.1 → 0.4.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 (420) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +208 -11
  3. package/dist/attention/overviewHtml.d.ts +3 -0
  4. package/dist/attention/overviewHtml.d.ts.map +1 -0
  5. package/dist/attention/overviewHtml.js +41 -0
  6. package/dist/attention/overviewHtml.js.map +1 -0
  7. package/dist/attention/requests.d.ts +24 -0
  8. package/dist/attention/requests.d.ts.map +1 -0
  9. package/dist/attention/requests.js +40 -0
  10. package/dist/attention/requests.js.map +1 -0
  11. package/dist/attention/style.d.ts +2 -0
  12. package/dist/attention/style.d.ts.map +1 -0
  13. package/dist/attention/style.js +10 -0
  14. package/dist/attention/style.js.map +1 -0
  15. package/dist/board.d.ts.map +1 -1
  16. package/dist/board.js +15 -2
  17. package/dist/board.js.map +1 -1
  18. package/dist/cli.js +1 -1
  19. package/dist/files/changes.d.ts +1 -0
  20. package/dist/files/changes.d.ts.map +1 -1
  21. package/dist/files/changes.js +5 -10
  22. package/dist/files/changes.js.map +1 -1
  23. package/dist/files/home.d.ts.map +1 -1
  24. package/dist/files/home.js +4 -0
  25. package/dist/files/home.js.map +1 -1
  26. package/dist/files/list.d.ts +7 -0
  27. package/dist/files/list.d.ts.map +1 -1
  28. package/dist/files/list.js +23 -13
  29. package/dist/files/list.js.map +1 -1
  30. package/dist/files/markdownPath.d.ts +3 -0
  31. package/dist/files/markdownPath.d.ts.map +1 -0
  32. package/dist/files/markdownPath.js +31 -0
  33. package/dist/files/markdownPath.js.map +1 -0
  34. package/dist/files/url.d.ts +2 -0
  35. package/dist/files/url.d.ts.map +1 -0
  36. package/dist/files/url.js +4 -0
  37. package/dist/files/url.js.map +1 -0
  38. package/dist/files/watchDirectories.d.ts +9 -0
  39. package/dist/files/watchDirectories.d.ts.map +1 -0
  40. package/dist/files/watchDirectories.js +33 -0
  41. package/dist/files/watchDirectories.js.map +1 -0
  42. package/dist/history/baseline.d.ts +19 -0
  43. package/dist/history/baseline.d.ts.map +1 -0
  44. package/dist/history/baseline.js +40 -0
  45. package/dist/history/baseline.js.map +1 -0
  46. package/dist/history/compare.d.ts +14 -0
  47. package/dist/history/compare.d.ts.map +1 -0
  48. package/dist/history/compare.js +47 -0
  49. package/dist/history/compare.js.map +1 -0
  50. package/dist/history/documents.d.ts +10 -0
  51. package/dist/history/documents.d.ts.map +1 -0
  52. package/dist/history/documents.js +15 -0
  53. package/dist/history/documents.js.map +1 -0
  54. package/dist/history/fields.d.ts +3 -0
  55. package/dist/history/fields.d.ts.map +1 -0
  56. package/dist/history/fields.js +27 -0
  57. package/dist/history/fields.js.map +1 -0
  58. package/dist/history/html.d.ts +4 -0
  59. package/dist/history/html.d.ts.map +1 -0
  60. package/dist/history/html.js +22 -0
  61. package/dist/history/html.js.map +1 -0
  62. package/dist/history/limits.d.ts +3 -0
  63. package/dist/history/limits.d.ts.map +1 -0
  64. package/dist/history/limits.js +3 -0
  65. package/dist/history/limits.js.map +1 -0
  66. package/dist/history/response.d.ts +4 -0
  67. package/dist/history/response.d.ts.map +1 -0
  68. package/dist/history/response.js +20 -0
  69. package/dist/history/response.js.map +1 -0
  70. package/dist/history/schema.d.ts +24 -0
  71. package/dist/history/schema.d.ts.map +1 -0
  72. package/dist/history/schema.js +19 -0
  73. package/dist/history/schema.js.map +1 -0
  74. package/dist/history/script.d.ts +2 -0
  75. package/dist/history/script.d.ts.map +1 -0
  76. package/dist/history/script.js +113 -0
  77. package/dist/history/script.js.map +1 -0
  78. package/dist/http/assets.d.ts.map +1 -1
  79. package/dist/http/assets.js +18 -1
  80. package/dist/http/assets.js.map +1 -1
  81. package/dist/http/history.d.ts +7 -0
  82. package/dist/http/history.d.ts.map +1 -0
  83. package/dist/http/history.js +45 -0
  84. package/dist/http/history.js.map +1 -0
  85. package/dist/http/identity.d.ts +7 -0
  86. package/dist/http/identity.d.ts.map +1 -0
  87. package/dist/http/identity.js +38 -0
  88. package/dist/http/identity.js.map +1 -0
  89. package/dist/http/overview.d.ts +5 -0
  90. package/dist/http/overview.d.ts.map +1 -0
  91. package/dist/http/overview.js +13 -0
  92. package/dist/http/overview.js.map +1 -0
  93. package/dist/http/page.d.ts +3 -2
  94. package/dist/http/page.d.ts.map +1 -1
  95. package/dist/http/page.js +34 -13
  96. package/dist/http/page.js.map +1 -1
  97. package/dist/http/search.d.ts +5 -0
  98. package/dist/http/search.d.ts.map +1 -0
  99. package/dist/http/search.js +11 -0
  100. package/dist/http/search.js.map +1 -0
  101. package/dist/http/work.d.ts +6 -0
  102. package/dist/http/work.d.ts.map +1 -0
  103. package/dist/http/work.js +22 -0
  104. package/dist/http/work.js.map +1 -0
  105. package/dist/metadata/attentionProblems.d.ts +4 -0
  106. package/dist/metadata/attentionProblems.d.ts.map +1 -0
  107. package/dist/metadata/attentionProblems.js +16 -0
  108. package/dist/metadata/attentionProblems.js.map +1 -0
  109. package/dist/metadata/backlinks.d.ts +8 -0
  110. package/dist/metadata/backlinks.d.ts.map +1 -0
  111. package/dist/metadata/backlinks.js +34 -0
  112. package/dist/metadata/backlinks.js.map +1 -0
  113. package/dist/metadata/fields.d.ts +37 -0
  114. package/dist/metadata/fields.d.ts.map +1 -0
  115. package/dist/metadata/fields.js +25 -0
  116. package/dist/metadata/fields.js.map +1 -0
  117. package/dist/metadata/links.d.ts +4 -0
  118. package/dist/metadata/links.d.ts.map +1 -0
  119. package/dist/metadata/links.js +18 -0
  120. package/dist/metadata/links.js.map +1 -0
  121. package/dist/metadata/locations.d.ts +3 -0
  122. package/dist/metadata/locations.d.ts.map +1 -0
  123. package/dist/metadata/locations.js +35 -0
  124. package/dist/metadata/locations.js.map +1 -0
  125. package/dist/metadata/model.d.ts +15 -0
  126. package/dist/metadata/model.d.ts.map +1 -0
  127. package/dist/metadata/model.js +13 -0
  128. package/dist/metadata/model.js.map +1 -0
  129. package/dist/metadata/parse.d.ts +16 -0
  130. package/dist/metadata/parse.d.ts.map +1 -0
  131. package/dist/metadata/parse.js +48 -0
  132. package/dist/metadata/parse.js.map +1 -0
  133. package/dist/metadata/problems.d.ts +4 -0
  134. package/dist/metadata/problems.d.ts.map +1 -0
  135. package/dist/metadata/problems.js +59 -0
  136. package/dist/metadata/problems.js.map +1 -0
  137. package/dist/metadata/relationshipLabel.d.ts +2 -0
  138. package/dist/metadata/relationshipLabel.d.ts.map +1 -0
  139. package/dist/metadata/relationshipLabel.js +14 -0
  140. package/dist/metadata/relationshipLabel.js.map +1 -0
  141. package/dist/metadata/schema.d.ts +44 -0
  142. package/dist/metadata/schema.d.ts.map +1 -0
  143. package/dist/metadata/schema.js +36 -0
  144. package/dist/metadata/schema.js.map +1 -0
  145. package/dist/metadata/sourceLinks.d.ts +5 -0
  146. package/dist/metadata/sourceLinks.d.ts.map +1 -0
  147. package/dist/metadata/sourceLinks.js +44 -0
  148. package/dist/metadata/sourceLinks.js.map +1 -0
  149. package/dist/page/attentionDetails.d.ts +4 -0
  150. package/dist/page/attentionDetails.d.ts.map +1 -0
  151. package/dist/page/attentionDetails.js +13 -0
  152. package/dist/page/attentionDetails.js.map +1 -0
  153. package/dist/page/backlinksHtml.d.ts +3 -0
  154. package/dist/page/backlinksHtml.d.ts.map +1 -0
  155. package/dist/page/backlinksHtml.js +16 -0
  156. package/dist/page/backlinksHtml.js.map +1 -0
  157. package/dist/page/board.d.ts +1 -1
  158. package/dist/page/board.d.ts.map +1 -1
  159. package/dist/page/board.js +14 -4
  160. package/dist/page/board.js.map +1 -1
  161. package/dist/page/client.d.ts +2 -1
  162. package/dist/page/client.d.ts.map +1 -1
  163. package/dist/page/client.js +66 -7
  164. package/dist/page/client.js.map +1 -1
  165. package/dist/page/criteriaEvidence.d.ts +4 -0
  166. package/dist/page/criteriaEvidence.d.ts.map +1 -0
  167. package/dist/page/criteriaEvidence.js +27 -0
  168. package/dist/page/criteriaEvidence.js.map +1 -0
  169. package/dist/page/diagrams.d.ts +1 -1
  170. package/dist/page/diagrams.d.ts.map +1 -1
  171. package/dist/page/diagrams.js +12 -4
  172. package/dist/page/diagrams.js.map +1 -1
  173. package/dist/page/document.d.ts +1 -1
  174. package/dist/page/document.d.ts.map +1 -1
  175. package/dist/page/document.js +6 -3
  176. package/dist/page/document.js.map +1 -1
  177. package/dist/page/libraryScript.d.ts +2 -0
  178. package/dist/page/libraryScript.d.ts.map +1 -0
  179. package/dist/page/libraryScript.js +73 -0
  180. package/dist/page/libraryScript.js.map +1 -0
  181. package/dist/page/metadata.d.ts +5 -0
  182. package/dist/page/metadata.d.ts.map +1 -0
  183. package/dist/page/metadata.js +34 -0
  184. package/dist/page/metadata.js.map +1 -0
  185. package/dist/page/metadataDetails.d.ts +4 -0
  186. package/dist/page/metadataDetails.d.ts.map +1 -0
  187. package/dist/page/metadataDetails.js +23 -0
  188. package/dist/page/metadataDetails.js.map +1 -0
  189. package/dist/page/metadataLinks.d.ts +6 -0
  190. package/dist/page/metadataLinks.d.ts.map +1 -0
  191. package/dist/page/metadataLinks.js +31 -0
  192. package/dist/page/metadataLinks.js.map +1 -0
  193. package/dist/page/nav.d.ts.map +1 -1
  194. package/dist/page/nav.js +3 -3
  195. package/dist/page/nav.js.map +1 -1
  196. package/dist/page/navigationScript.d.ts +2 -0
  197. package/dist/page/navigationScript.d.ts.map +1 -0
  198. package/dist/page/navigationScript.js +104 -0
  199. package/dist/page/navigationScript.js.map +1 -0
  200. package/dist/page/readingStateScript.d.ts +2 -0
  201. package/dist/page/readingStateScript.d.ts.map +1 -0
  202. package/dist/page/readingStateScript.js +62 -0
  203. package/dist/page/readingStateScript.js.map +1 -0
  204. package/dist/page/readingStyles.d.ts +2 -0
  205. package/dist/page/readingStyles.d.ts.map +1 -0
  206. package/dist/page/readingStyles.js +29 -0
  207. package/dist/page/readingStyles.js.map +1 -0
  208. package/dist/page/readingTools.d.ts +3 -0
  209. package/dist/page/readingTools.d.ts.map +1 -0
  210. package/dist/page/readingTools.js +10 -0
  211. package/dist/page/readingTools.js.map +1 -0
  212. package/dist/page/recordedEvidence.d.ts +4 -0
  213. package/dist/page/recordedEvidence.d.ts.map +1 -0
  214. package/dist/page/recordedEvidence.js +10 -0
  215. package/dist/page/recordedEvidence.js.map +1 -0
  216. package/dist/page/searchDialog.d.ts +3 -0
  217. package/dist/page/searchDialog.d.ts.map +1 -0
  218. package/dist/page/searchDialog.js +16 -0
  219. package/dist/page/searchDialog.js.map +1 -0
  220. package/dist/page/searchResultsScript.d.ts +2 -0
  221. package/dist/page/searchResultsScript.d.ts.map +1 -0
  222. package/dist/page/searchResultsScript.js +64 -0
  223. package/dist/page/searchResultsScript.js.map +1 -0
  224. package/dist/page/searchScript.d.ts +2 -0
  225. package/dist/page/searchScript.d.ts.map +1 -0
  226. package/dist/page/searchScript.js +73 -0
  227. package/dist/page/searchScript.js.map +1 -0
  228. package/dist/page/shell.d.ts +1 -1
  229. package/dist/page/shell.d.ts.map +1 -1
  230. package/dist/page/shell.js +23 -5
  231. package/dist/page/shell.js.map +1 -1
  232. package/dist/page/stateScript.d.ts +2 -0
  233. package/dist/page/stateScript.d.ts.map +1 -0
  234. package/dist/page/stateScript.js +55 -0
  235. package/dist/page/stateScript.js.map +1 -0
  236. package/dist/page/style.d.ts.map +1 -1
  237. package/dist/page/style.js +15 -34
  238. package/dist/page/style.js.map +1 -1
  239. package/dist/page/swap.d.ts +1 -1
  240. package/dist/page/swap.d.ts.map +1 -1
  241. package/dist/page/swap.js +4 -1
  242. package/dist/page/swap.js.map +1 -1
  243. package/dist/page/workspaceStyles.d.ts +3 -0
  244. package/dist/page/workspaceStyles.d.ts.map +1 -0
  245. package/dist/page/workspaceStyles.js +79 -0
  246. package/dist/page/workspaceStyles.js.map +1 -0
  247. package/dist/render/documentHeadings.d.ts +667 -0
  248. package/dist/render/documentHeadings.d.ts.map +1 -0
  249. package/dist/render/documentHeadings.js +45 -0
  250. package/dist/render/documentHeadings.js.map +1 -0
  251. package/dist/render/documentLinks.d.ts +659 -0
  252. package/dist/render/documentLinks.d.ts.map +1 -0
  253. package/dist/render/documentLinks.js +19 -0
  254. package/dist/render/documentLinks.js.map +1 -0
  255. package/dist/render/markdown.d.ts +7 -1
  256. package/dist/render/markdown.d.ts.map +1 -1
  257. package/dist/render/markdown.js +13 -2
  258. package/dist/render/markdown.js.map +1 -1
  259. package/dist/search/attentionEntries.d.ts +4 -0
  260. package/dist/search/attentionEntries.d.ts.map +1 -0
  261. package/dist/search/attentionEntries.js +20 -0
  262. package/dist/search/attentionEntries.js.map +1 -0
  263. package/dist/search/collector.d.ts +13 -0
  264. package/dist/search/collector.d.ts.map +1 -0
  265. package/dist/search/collector.js +40 -0
  266. package/dist/search/collector.js.map +1 -0
  267. package/dist/search/entries.d.ts +10 -0
  268. package/dist/search/entries.d.ts.map +1 -0
  269. package/dist/search/entries.js +37 -0
  270. package/dist/search/entries.js.map +1 -0
  271. package/dist/search/linkCollector.d.ts +8 -0
  272. package/dist/search/linkCollector.d.ts.map +1 -0
  273. package/dist/search/linkCollector.js +16 -0
  274. package/dist/search/linkCollector.js.map +1 -0
  275. package/dist/search/match.d.ts +14 -0
  276. package/dist/search/match.d.ts.map +1 -0
  277. package/dist/search/match.js +26 -0
  278. package/dist/search/match.js.map +1 -0
  279. package/dist/search/metadataEntries.d.ts +4 -0
  280. package/dist/search/metadataEntries.d.ts.map +1 -0
  281. package/dist/search/metadataEntries.js +42 -0
  282. package/dist/search/metadataEntries.js.map +1 -0
  283. package/dist/search/snapshot.d.ts +13 -0
  284. package/dist/search/snapshot.d.ts.map +1 -0
  285. package/dist/search/snapshot.js +49 -0
  286. package/dist/search/snapshot.js.map +1 -0
  287. package/dist/views/items.d.ts +11 -0
  288. package/dist/views/items.d.ts.map +1 -0
  289. package/dist/views/items.js +48 -0
  290. package/dist/views/items.js.map +1 -0
  291. package/dist/views/projection.d.ts +15 -0
  292. package/dist/views/projection.d.ts.map +1 -0
  293. package/dist/views/projection.js +47 -0
  294. package/dist/views/projection.js.map +1 -0
  295. package/dist/views/savedScript.d.ts +2 -0
  296. package/dist/views/savedScript.d.ts.map +1 -0
  297. package/dist/views/savedScript.js +89 -0
  298. package/dist/views/savedScript.js.map +1 -0
  299. package/dist/views/state.d.ts +15 -0
  300. package/dist/views/state.d.ts.map +1 -0
  301. package/dist/views/state.js +45 -0
  302. package/dist/views/state.js.map +1 -0
  303. package/dist/views/tools.d.ts +3 -0
  304. package/dist/views/tools.d.ts.map +1 -0
  305. package/dist/views/tools.js +11 -0
  306. package/dist/views/tools.js.map +1 -0
  307. package/dist/views/workCards.d.ts +4 -0
  308. package/dist/views/workCards.d.ts.map +1 -0
  309. package/dist/views/workCards.js +23 -0
  310. package/dist/views/workCards.js.map +1 -0
  311. package/dist/views/workControls.d.ts +4 -0
  312. package/dist/views/workControls.d.ts.map +1 -0
  313. package/dist/views/workControls.js +32 -0
  314. package/dist/views/workControls.js.map +1 -0
  315. package/dist/views/workDetail.d.ts +13 -0
  316. package/dist/views/workDetail.d.ts.map +1 -0
  317. package/dist/views/workDetail.js +26 -0
  318. package/dist/views/workDetail.js.map +1 -0
  319. package/dist/views/workHtml.d.ts +15 -0
  320. package/dist/views/workHtml.d.ts.map +1 -0
  321. package/dist/views/workHtml.js +35 -0
  322. package/dist/views/workHtml.js.map +1 -0
  323. package/dist/views/workStyle.d.ts +2 -0
  324. package/dist/views/workStyle.d.ts.map +1 -0
  325. package/dist/views/workStyle.js +18 -0
  326. package/dist/views/workStyle.js.map +1 -0
  327. package/dist/views/workTable.d.ts +4 -0
  328. package/dist/views/workTable.d.ts.map +1 -0
  329. package/dist/views/workTable.js +19 -0
  330. package/dist/views/workTable.js.map +1 -0
  331. package/package.json +14 -10
  332. package/src/attention/overviewHtml.ts +44 -0
  333. package/src/attention/requests.ts +64 -0
  334. package/src/attention/style.ts +9 -0
  335. package/src/board.ts +16 -3
  336. package/src/cli.ts +1 -1
  337. package/src/files/changes.ts +6 -17
  338. package/src/files/home.ts +4 -0
  339. package/src/files/list.ts +25 -14
  340. package/src/files/markdownPath.ts +31 -0
  341. package/src/files/url.ts +3 -0
  342. package/src/files/watchDirectories.ts +60 -0
  343. package/src/history/baseline.ts +43 -0
  344. package/src/history/compare.ts +54 -0
  345. package/src/history/documents.ts +21 -0
  346. package/src/history/fields.ts +32 -0
  347. package/src/history/html.ts +23 -0
  348. package/src/history/limits.ts +2 -0
  349. package/src/history/response.ts +23 -0
  350. package/src/history/schema.ts +36 -0
  351. package/src/history/script.ts +112 -0
  352. package/src/http/assets.ts +18 -1
  353. package/src/http/history.ts +50 -0
  354. package/src/http/identity.ts +62 -0
  355. package/src/http/overview.ts +19 -0
  356. package/src/http/page.ts +52 -15
  357. package/src/http/search.ts +13 -0
  358. package/src/http/work.ts +41 -0
  359. package/src/metadata/attentionProblems.ts +18 -0
  360. package/src/metadata/backlinks.ts +46 -0
  361. package/src/metadata/fields.ts +26 -0
  362. package/src/metadata/links.ts +19 -0
  363. package/src/metadata/locations.ts +34 -0
  364. package/src/metadata/model.ts +27 -0
  365. package/src/metadata/parse.ts +62 -0
  366. package/src/metadata/problems.ts +66 -0
  367. package/src/metadata/relationshipLabel.ts +14 -0
  368. package/src/metadata/schema.ts +45 -0
  369. package/src/metadata/sourceLinks.ts +46 -0
  370. package/src/page/attentionDetails.ts +18 -0
  371. package/src/page/backlinksHtml.ts +18 -0
  372. package/src/page/board.ts +14 -4
  373. package/src/page/client.ts +66 -7
  374. package/src/page/criteriaEvidence.ts +36 -0
  375. package/src/page/diagrams.ts +12 -4
  376. package/src/page/document.ts +6 -3
  377. package/src/page/libraryScript.ts +72 -0
  378. package/src/page/metadata.ts +40 -0
  379. package/src/page/metadataDetails.ts +26 -0
  380. package/src/page/metadataLinks.ts +35 -0
  381. package/src/page/nav.ts +5 -4
  382. package/src/page/navigationScript.ts +103 -0
  383. package/src/page/readingStateScript.ts +61 -0
  384. package/src/page/readingStyles.ts +28 -0
  385. package/src/page/readingTools.ts +12 -0
  386. package/src/page/recordedEvidence.ts +12 -0
  387. package/src/page/searchDialog.ts +16 -0
  388. package/src/page/searchResultsScript.ts +63 -0
  389. package/src/page/searchScript.ts +72 -0
  390. package/src/page/shell.ts +32 -5
  391. package/src/page/stateScript.ts +54 -0
  392. package/src/page/style.ts +15 -35
  393. package/src/page/swap.ts +4 -1
  394. package/src/page/workspaceStyles.ts +79 -0
  395. package/src/render/documentHeadings.ts +52 -0
  396. package/src/render/documentLinks.ts +19 -0
  397. package/src/render/markdown.ts +21 -4
  398. package/src/search/attentionEntries.ts +22 -0
  399. package/src/search/collector.ts +44 -0
  400. package/src/search/entries.ts +51 -0
  401. package/src/search/linkCollector.ts +16 -0
  402. package/src/search/match.ts +28 -0
  403. package/src/search/metadataEntries.ts +44 -0
  404. package/src/search/snapshot.ts +59 -0
  405. package/src/views/items.ts +55 -0
  406. package/src/views/projection.ts +59 -0
  407. package/src/views/savedScript.ts +88 -0
  408. package/src/views/state.ts +47 -0
  409. package/src/views/tools.ts +11 -0
  410. package/src/views/workCards.ts +26 -0
  411. package/src/views/workControls.ts +38 -0
  412. package/src/views/workDetail.ts +28 -0
  413. package/src/views/workHtml.ts +39 -0
  414. package/src/views/workStyle.ts +17 -0
  415. package/src/views/workTable.ts +21 -0
  416. package/dist/index.d.ts +0 -2
  417. package/dist/index.d.ts.map +0 -1
  418. package/dist/index.js +0 -2
  419. package/dist/index.js.map +0 -1
  420. package/src/index.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,98 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 - 2026-10-05
4
+
5
+ ### Added
6
+
7
+ - Add explicit Changes since seen comparisons with one browser-local baseline
8
+ per workspace, 30-day expiry, a 2 MiB serialized limit and clearing. Compare
9
+ source additions/removals, unique-ID moves and recorded field/content changes
10
+ with escaped old/current source. Keep incomplete, corrupt, expired and oversized
11
+ history explicit; live updates never silently acknowledge changes. No source
12
+ writes, server history, cloud sync, inferred authorship or verified acceptance.
13
+
14
+ - Read explicit per-item attention request lists and expose a local overview for
15
+ decisions, reviews and blockers with reason, response labels, target links and
16
+ source provenance. Preserve exact request navigation, search/backlink context,
17
+ native links and live updates. Keep invalid/ambiguous requests unclassified and
18
+ incomplete indexes uncounted; closed requests do not imply acceptance. Existing
19
+ Markdown and arbitrary status/owner fields remain unchanged.
20
+
21
+ ### Fixed
22
+
23
+ - Include symlinked reference directories outside the workspace in document
24
+ reading, logical relative links, home selection and search. Watch linked
25
+ directory edits and rediscover added/retargeted links. Skip broken links,
26
+ ancestor/cycle traversal, hidden entries and dependencies; standalone file
27
+ symlinks still cannot escape their containing workspace/reference directory.
28
+ Reference files are read only.
29
+
30
+ ## 0.3.0 - 2026-10-04
31
+
32
+ ### Changed
33
+
34
+ - Breaking: no root entry and no module that re-exports another. `exports` maps one `"./*.ts"` pattern to every module (`src` under the `source` condition, `dist` otherwise), so you import the module that defines a name, and a bundler sees only the modules you use. Where each name now lives:
35
+ - `@shivaedev/work-board`: `@shivaedev/work-board/board.ts` (`BoardOptions`, `boardLayer`)
36
+
37
+ ### Added
38
+
39
+ - Add source backlinks for explicit relationships, board membership, criterion
40
+ evidence, local evidence sources, and Markdown hyperlinks, including plain
41
+ files. Reuse the existing parse/index and disclose incomplete references.
42
+ Associate criterion claims across files and link directly to their records;
43
+ show missing claims, origin lines, retained old revisions, and missing local
44
+ Markdown sources without implying verified acceptance. Decision options and
45
+ rationale stay ordinary Markdown; source files remain unchanged.
46
+
47
+ - Add a table layout sharing board projections, filters, sorting, and selected
48
+ source detail. Switch layouts without losing URL context and read/filter tables
49
+ without JavaScript. Save, update, reopen, remove, or clear up to 10 local named
50
+ views per workspace; reject unsafe destinations and disclose unavailable
51
+ storage. Keep saved filters separate from URL item selection and never silently
52
+ evict a saved view at capacity. Source Markdown stays unchanged.
53
+
54
+ - Add Work board selection and explicit shared-item projections, exact status/
55
+ owner filters, text matching, and sorting. URL state restores board/filter/
56
+ selected detail context; source Markdown stays readable in a side pane.
57
+ Disclose missing/ambiguous memberships and selections, retain filters and
58
+ focused unsent search through live updates, and keep native links/GET filters
59
+ usable without JavaScript. Existing heading boards remain unchanged.
60
+
61
+ - Read optional YAML frontmatter for stable item identity, explicit work fields,
62
+ relationships, board membership, criteria, and recorded evidence provenance.
63
+ Keep ordinary Markdown/heading boards valid, retain unknown source metadata,
64
+ and disclose malformed fields, duplicate IDs, and unresolved references.
65
+ Rebuild identities from the existing local index; identity links survive file
66
+ and heading renames, and criterion search opens its source context. Recorded
67
+ outcomes remain distinct from independently verified acceptance.
68
+ - Show source lines in search results and preserve reading state when an item
69
+ moves. Keep passage focus when a search result targets the active document.
70
+
71
+ - Add local workspace search with document, heading, and passage results, snippets,
72
+ keyboard navigation, and a command dialog for existing view controls. Rebuild
73
+ the in-memory index after file changes, disclose unreadable files, and prevent
74
+ older search responses from replacing newer queries.
75
+
76
+ - Add heading passage links and an outline, in-place document navigation with
77
+ back/forward reading-state restoration, workspace-scoped favorites and recents,
78
+ active document titles, and readable missing-document/passage states.
79
+ - Resolve Markdown links relative to the source file, including nested home
80
+ files served at `/`. Ignore stale page responses after navigation and render
81
+ cached diagrams using the current theme.
82
+ - Add the first workspace shell: a collapsible file sidebar, file location,
83
+ responsive board columns, readable documents, and keyboard skip navigation.
84
+ Remember theme, density, and sidebar choices per folder and server origin;
85
+ code highlighting and diagrams follow the selected theme. Controls remain
86
+ usable when browser storage is unavailable.
87
+
88
+ - Add a step-by-step delivery plan for the vision, with 26 bounded implementation
89
+ steps, dependencies, acceptance evidence, and explicit design gates before
90
+ richer source formats, mutations, agent handoffs, and external integrations.
91
+
92
+ - Document the local Work Board north star, three-wave roadmap, experience design,
93
+ and interactive vision mockups with desktop and mobile captures. The package
94
+ README links to the proposed direction separately from its current behavior.
95
+
3
96
  ## 0.2.1 - 2026-10-04
4
97
 
5
98
  ### Changed
package/README.md CHANGED
@@ -9,21 +9,45 @@ pnpm add --global @shivaedev/work-board
9
9
  work-board ./project-notes --port 4747 --home plan.md
10
10
  ```
11
11
 
12
- It listens on `127.0.0.1` only and answers only requests addressed to a
13
- loopback host. Every `.md` file under the folder appears in the top bar with how
14
- long ago it changed. Below the folder, files and folders starting with a dot and
15
- `node_modules` are never entered, and anything that is not markdown is skipped;
16
- the folder itself may be a dot folder such as `.notes`. No path outside the
17
- folder is served, and a symlink is followed only when it leads to a place
18
- inside the folder. One long-lived process picks up new files and edits without
19
- a restart.
12
+ It listens on `127.0.0.1` only and answers only requests addressed to a loopback
13
+ host. Every `.md` file under the folder appears in the collapsible sidebar with
14
+ how long ago it changed. Below the folder, files and folders starting with a dot
15
+ and `node_modules` are never entered, and anything that is not Markdown is
16
+ skipped; the folder itself may be a dot folder such as `.notes`.
17
+
18
+ Directory symlinks explicitly include reference folders, including ones outside
19
+ the workspace. Their Markdown keeps the link's workspace-relative URLs. Broken
20
+ links, ancestor links and directory cycles are skipped. File symlinks stay inside
21
+ the workspace or the reference directory containing them. Unlisted paths and URL
22
+ traversal are never served. One long-lived process picks up new files and edits
23
+ without a restart.
24
+
25
+ For example, include the main checkout's documentation without copying it:
26
+
27
+ ```sh
28
+ ln -s /path/to/platform/docs ./project-notes/reference
29
+ work-board ./project-notes --home plan.md
30
+ ```
31
+
32
+ Read `/reference/framework/README.md` and follow its relative Markdown links.
33
+ Only link directories you intend to expose locally. Multiple aliases remain
34
+ separate source paths; if they repeat an explicit item ID, existing ambiguity
35
+ rules apply rather than choosing an identity winner.
20
36
 
21
37
  Pages render GitHub Flavored Markdown on the server: tables, task lists,
22
38
  footnotes, raw HTML (including `<details>` with markdown inside) and fenced code,
23
39
  highlighted with Shiki's GitHub light and dark themes. Raw HTML is not
24
40
  sanitized, so serve only folders you trust. Pages send a content security
25
41
  policy that allows only the board's own scripts, and `Cache-Control: no-store`.
26
- The page uses system fonts and follows the light or dark colour scheme.
42
+ The page uses system fonts. Theme can follow the system or stay light or dark.
43
+ Theme, compact/comfortable density, and sidebar visibility are remembered in
44
+ browser storage for this folder and server origin. When storage is unavailable,
45
+ controls still work for the current page and show a notice.
46
+
47
+ The file location appears above the content. Documents use a readable line
48
+ length; boards use a wider grid that stacks on narrow screens. The sidebar has
49
+ its own scroll area and starts collapsed on narrow screens unless a saved
50
+ preference says otherwise. A keyboard skip link moves directly to the content.
27
51
 
28
52
  | Option | Default | Meaning |
29
53
  | --- | --- | --- |
@@ -31,6 +55,164 @@ The page uses system fonts and follows the light or dark colour scheme.
31
55
  | `--port` | `4747` | The port on `127.0.0.1`. `0` picks a free one. |
32
56
  | `--home` | none | The file shown at `/` as a board, relative to the folder. The command stops with an error unless it leads to one of the markdown files listed from the folder. Without it, `/` shows the first file as a document. |
33
57
 
58
+ ## Document navigation
59
+
60
+ Markdown headings have passage links and an **On this page** outline, including separate
61
+ anchors for duplicate headings. Use the heading's `#` link to copy a passage URL.
62
+ Generated anchors use the heading text and duplicate order; changing either can
63
+ change the anchor. Renaming a file changes its document URL. Authored HTML IDs
64
+ and footnote links remain intact. Richer files can declare stable work-item IDs.
65
+
66
+ Markdown links resolve from their source file, including a nested `--home` file
67
+ served at `/`. Links within the workspace open in place; modified clicks and
68
+ links targeting another window keep their normal browser behavior. The browser
69
+ title and active file tooltip follow the document's main heading.
70
+
71
+ Back and forward restore the previous scroll, selected text, and open details.
72
+ The client keeps up to 30 page snapshots and tab-scoped reading records; it
73
+ fetches the current file again on return so changes and deletions are visible.
74
+ A missing document explains what happened, and a missing passage shows a notice.
75
+
76
+ **Save favorite** pins a document to the sidebar. Recent documents are deduplicated
77
+ and limited to the last ten. Favorites and recents use browser storage scoped to
78
+ the folder and server origin. Deleted favorites remain visible with a missing
79
+ label. If storage is unavailable, favorites and recents work on the current page;
80
+ reading navigation still works in the open tab. Content and the outline remain
81
+ readable with JavaScript disabled.
82
+
83
+ ## Workspace search
84
+
85
+ Use **Search** or Ctrl/Cmd+K to find document titles/paths, Markdown headings, and
86
+ passage text. Results identify their type and source file/line where known, include text snippets,
87
+ and open the corresponding heading when available. Matching is case-insensitive
88
+ with Unicode normalization; all query terms must occur in a block. Titles rank
89
+ before headings, then passages, with stable source order within each group.
90
+ Results are limited to 40 and report the full match count. This is deterministic
91
+ text search, without fuzzy matching or semantic inference.
92
+
93
+ Arrow keys choose a result while the search field is focused; Enter opens it.
94
+ Escape closes the dialog and restores focus. With an empty query, commands open
95
+ the workspace or change the existing sidebar, density, and theme controls.
96
+
97
+ The server keeps a rebuildable index in memory and invalidates it when the file
98
+ watcher changes. An open dialog refreshes on edits and reconnects; older requests
99
+ cannot replace a newer query. Hidden entries, `node_modules`, and escaping standalone file
100
+ symlinks are excluded; linked reference directories are included. Unreadable
101
+ files produce an incomplete-results notice.
102
+ All indexing and requests stay local. Search needs JavaScript; document reading
103
+ does not. Source-in-editor links await an agreed local editor mechanism.
104
+
105
+ ## Optional work identity
106
+
107
+ A Markdown file can begin with YAML frontmatter declaring an explicit `id`,
108
+ `kind`, `status`, `owner`, `next_action`, relationships, criteria, board membership,
109
+ and evidence. Every field is optional; ordinary Markdown and heading boards need
110
+ no migration. [Source examples and shapes](./docs/vision/delivery/source-examples.md)
111
+ describe the convention. No section name becomes a status or workflow rule.
112
+
113
+ Work details show recorded fields, source locations, and the original header.
114
+ Malformed/unknown fields, duplicate IDs, and unresolved references remain visible
115
+ with diagnostics while prose stays readable. A unique ID has a shareable
116
+ `/_board/item/<id>/` link that survives file/heading renames; criterion links open
117
+ and focus their context. Search also finds explicit work fields and criteria.
118
+ An incomplete index cannot assert unique identity. The index rebuilds from files
119
+ without persistent storage; the UI never writes project content.
120
+
121
+ Evidence records show their source, criterion, checked revision, observed time,
122
+ method, and recorded outcome when provided. They are source claims, not
123
+ independently verified acceptance; missing provenance stays **Not recorded**.
124
+
125
+ ## Work views
126
+
127
+ Open **Work** to read identified items as a board or table. A `kind: board` file with a
128
+ unique ID and an explicit `items` list defines a selectable view; the same item
129
+ can appear in several boards. Board definitions are excluded from All work.
130
+ Missing/ambiguous members and repeated membership are disclosed without choosing
131
+ a duplicate source or counting repeated items twice. Legacy heading cards remain
132
+ on their original pages and do not become inferred identified work.
133
+
134
+ Columns use the exact recorded status, including a **Status not recorded** column.
135
+ Filter by status, owner, or work text and sort by title, owner, or status. Missing
136
+ values differ from literal text and sort last. Cards open a source detail pane;
137
+ its Markdown links resolve relative to its file. The URL records the board,
138
+ filters, sort, and selected ID, so reload and Back/Forward restore that context.
139
+ A selected item outside the filters stays visible with a notice; deletion or
140
+ ambiguous identity is explained. Live changes retain applied filters, including
141
+ filters with no current matches. Compact density applies to these cards too.
142
+ Board and table use the same projection and selection; switching layouts keeps
143
+ that URL context. Table rows show kind, status, owner, and next action, with
144
+ missing fields disclosed and the same source detail pane. Narrow tables scroll
145
+ inside their own container; compact density reduces row/card spacing.
146
+ Native links and GET filters remain usable without JavaScript.
147
+
148
+ Save up to 10 named views in browser storage scoped to the workspace and server
149
+ origin. A view retains the applied board, filters, sort, and layout; item selection
150
+ stays in its shareable URL. Saving the same name updates it. At capacity, remove
151
+ one or update a name; views are never silently evicted. Remove one or clear all
152
+ from the view picker. Unsafe stored destinations are ignored. If storage is
153
+ unavailable, named views work for the current page only; source files are unchanged.
154
+ Saving requires JavaScript; board/table reading does not.
155
+
156
+ ## Attention overview
157
+
158
+ Open **Overview** to read explicit decision, review and blocker requests grouped
159
+ by kind and ordered by source title, item ID and request ID. Each entry shows the
160
+ recorded reason, response labels, target links and origin file/line. Opening it
161
+ focuses its source request, beside ordinary Markdown reasoning and evidence.
162
+ Source edits refresh the queues; native links also work without JavaScript.
163
+
164
+ Add optional [attention records](./docs/vision/delivery/attention-examples.md) to
165
+ item frontmatter. Status, owner, next action, file activity and finished runs do
166
+ not imply requests. Closed requests remain readable/searchable without implying
167
+ an answer or acceptance. Duplicate IDs, invalid records and unresolved targets
168
+ stay outside the queues with source diagnostics. An incomplete index withholds
169
+ counts rather than presenting a quiet workspace. The viewer never writes source
170
+ files or interrupts/starts agents; recipients are authored local labels.
171
+
172
+ ## Changes since seen
173
+
174
+ Open **Changes**, then **Start remembering changes** to record one explicit
175
+ browser-local workspace baseline. Live updates and opening the view never mark
176
+ changes seen. After review, **Mark current workspace seen** replaces it;
177
+ **Clear remembered history** removes it and stays off until you start again.
178
+
179
+ Compare additions, removals, explicit field changes, decision Markdown and
180
+ recorded evidence with current source links and escaped before/after source text.
181
+ Unique explicit item IDs can match moved files; ordinary renames show removed
182
+ and added paths. Duplicate IDs have no winner. Content comparison ignores mtime
183
+ and does not establish authorship, decision acceptance or verified evidence.
184
+
185
+ Each origin/workspace retains at most one 2 MiB serialized snapshot for 30 days.
186
+ Old/deleted source may remain until replacement, clearing or expiry; expired data
187
+ is removed on the next workspace visit or an open-page check. Invalid/unsupported
188
+ history, incomplete reads and oversized workspaces are explained without invented
189
+ removals or truncated history. Blocked storage allows a disclosed page-only
190
+ baseline. The local server validates and compares observations without retaining
191
+ history, modifying Markdown or contacting a cloud service. Without JavaScript,
192
+ Changes explains the limitation while source reading, Overview and Work remain usable.
193
+
194
+ ## Reasoning and evidence context
195
+
196
+ Follow explicit relationships from a result to its plan and decision. Decisions
197
+ keep options, comparisons, and rationale in ordinary Markdown; no new decision
198
+ fields are required. **Referenced by** lists incoming relationships, board
199
+ membership, criterion claims, evidence-source links, and local Markdown hyperlinks,
200
+ including plain files without frontmatter. Relative/encoded paths and root home
201
+ links use the source file's location. Repeated prose links from one file count
202
+ once; code examples do not become links. External URLs are not local backlinks.
203
+ Incomplete workspaces disclose partial references and do not select ambiguous IDs.
204
+
205
+ Each uniquely identified criterion lists claims recorded across the readable
206
+ workspace, with links to their source records. Missing claims say that acceptance
207
+ is not established. A record shows origin file/line, checked revision, observed
208
+ time, method, and outcome; missing provenance stays **Not recorded**. Old recorded
209
+ revisions remain visible, and Work Board does not compare them to a current Git
210
+ revision or infer human acceptance. Missing local Markdown evidence sources remain
211
+ linked with a notice. Generated `recorded-evidence-<index>` anchors follow source
212
+ array order and may change after insertion/reordering; item and criterion IDs are
213
+ the explicit stable references. Backlinks/claim associations rebuild on file
214
+ changes and after restart, without writing an event history.
215
+
34
216
  ## Diagrams
35
217
 
36
218
  A ` ```mermaid ` block is drawn in the browser. Mermaid loads from the installed
@@ -100,7 +282,11 @@ Finished work moves to the changelog.
100
282
 
101
283
  ## Live updates
102
284
 
103
- The server watches the folder recursively. Changes settle for 100 ms, then
285
+ The server watches the workspace and linked reference directories recursively.
286
+ Adding or retargeting a directory link rebuilds the watch and triggers catch-up.
287
+ Broken links are ignored; after restoring a target that was missing when the
288
+ watch was built, restart the server to include it. No reference file is written.
289
+ Changes settle for 100 ms, then
104
290
  `/events` sends one server-sent event naming the markdown files that changed:
105
291
 
106
292
  ```text
@@ -139,7 +325,7 @@ non-loopback address when the server knows the address.
139
325
  import { NodeServices } from "@effect/platform-node"
140
326
  import { Layer } from "effect"
141
327
  import { HttpRouter } from "effect/unstable/http"
142
- import { boardLayer } from "@shivaedev/work-board"
328
+ import { boardLayer } from "@shivaedev/work-board/board.ts"
143
329
 
144
330
  const board = HttpRouter.toWebHandler(
145
331
  Layer.provide(boardLayer({ root: "./project-notes", home: "plan.md" }), NodeServices.layer),
@@ -156,3 +342,14 @@ skips the build. `pnpm dlx` and `pnpm add --global` need no setting.
156
342
  allowBuilds:
157
343
  msgpackr-extract: false
158
344
  ```
345
+
346
+ ## Product vision
347
+
348
+ The [north star and visual direction](https://github.com/ShivaeDev/platform/tree/main/packages/work-board/docs/vision#readme)
349
+ describe the proposed local workspace for a person and their agents: stay
350
+ informed, give direction and coordinate, then collaborate. The
351
+ [roadmap](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/roadmap.md)
352
+ sets the waves, acceptance criteria, and open design decisions.
353
+ [Experience designs and mockups](https://github.com/ShivaeDev/platform/blob/main/packages/work-board/docs/vision/experience.md)
354
+ illustrate the target with fictional data. These are future plans; the sections
355
+ above describe the package's current behavior.
@@ -0,0 +1,3 @@
1
+ import type { Snapshot } from "#search/snapshot.ts";
2
+ export declare function overviewHtml(snapshot: Snapshot): string;
3
+ //# sourceMappingURL=overviewHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overviewHtml.d.ts","sourceRoot":"","sources":["../../src/attention/overviewHtml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAYpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA4BvD"}
@@ -0,0 +1,41 @@
1
+ import { fileUrl } from "#files/url.ts";
2
+ import { escapeHtml } from "#page/escape.ts";
3
+ import { referenceHtml } from "#page/metadataLinks.ts";
4
+ import { attentionRequests } from "./requests.js";
5
+ function card(entry, snapshot) {
6
+ const { request } = entry;
7
+ return `<article class="attention-card" data-key="attention:${escapeHtml(entry.itemId)}:${escapeHtml(request.id)}" data-attention-item="${escapeHtml(entry.itemId)}" data-request="${escapeHtml(request.id)}">
8
+ <p class="work-kind">${escapeHtml(request.kind)} request</p><h3><a href="${escapeHtml(entry.href)}">${escapeHtml(entry.title)}</a></h3>
9
+ <p class="work-id">${escapeHtml(entry.itemId)} / ${escapeHtml(request.id)}</p><p class="attention-reason">${escapeHtml(request.reason)}</p>
10
+ <dl><dt>Response needed from</dt><dd>${request.responseFrom.map(escapeHtml).join(", ")}</dd><dt>Recorded to unblock</dt><dd>${request.unblocks.map((target) => referenceHtml(target, target, snapshot.model)).join(", ")}</dd></dl>
11
+ <a class="attention-source" href="${escapeHtml(fileUrl(entry.document.file))}#attention-request-${encodeURIComponent(request.id)}">Source: ${escapeHtml(entry.document.file)}:${entry.line}</a></article>`;
12
+ }
13
+ export function overviewHtml(snapshot) {
14
+ const projection = attentionRequests(snapshot);
15
+ const header = '<header class="work-head"><p class="work-eyebrow">WORKSPACE · OVERVIEW</p><h1>What needs a response?</h1><p>Choose a recorded request to read its context, reasoning and evidence.</p><a href="/_board/work?view=board">Browse all work</a></header>';
16
+ const issues = projection.issues.length > 0
17
+ ? `<details class="view-issues" data-key="attention-issues"><summary>Unclassified requests and source issues (${projection.issues.length})</summary><p>Ambiguous or invalid requests stay outside the queues. Read their original sources.</p><ul>${projection.issues.map((issue) => `<li><a href="${escapeHtml(fileUrl(issue.file))}">${escapeHtml(issue.file)}:${issue.line}</a> — ${escapeHtml(issue.message)}</li>`).join("")}</ul></details>`
18
+ : "";
19
+ if (!projection.complete) {
20
+ return `${header}<p class="attention-incomplete" role="status">Workspace incomplete. Could not read ${snapshot.unavailable.map(escapeHtml).join(", ")}. Requests are not counted or classified until the index is complete.</p>${issues}`;
21
+ }
22
+ let summary = "All quiet — no explicit open requests recorded.";
23
+ if (projection.entries.length > 0) {
24
+ summary = `${projection.entries.length} validated open request${projection.entries.length === 1 ? "" : "s"}`;
25
+ }
26
+ else if (projection.issues.length > 0) {
27
+ summary = "No validated open requests. Check unresolved source issues before treating this workspace as quiet.";
28
+ }
29
+ const groups = [
30
+ { empty: "No open decision requests.", kind: "decision", title: "Decisions" },
31
+ { empty: "No open review requests.", kind: "review", title: "Reviews" },
32
+ { empty: "No open blocker requests.", kind: "blocker", title: "Blockers" },
33
+ ]
34
+ .map((group) => {
35
+ const entries = projection.entries.filter((entry) => entry.request.kind === group.kind);
36
+ return `<section class="attention-group" aria-labelledby="attention-${group.kind}"><h2 id="attention-${group.kind}" tabindex="-1">${group.title}<span>${entries.length}</span></h2>${entries.length > 0 ? entries.map((entry) => card(entry, snapshot)).join("") : `<p class="empty">${group.empty}</p>`}</section>`;
37
+ })
38
+ .join("");
39
+ return `${header}<p class="attention-total" role="status">${summary}</p><p class="attention-order">Decisions, reviews, then blockers. Within each group: source title, item ID, request ID. Recipients are recorded labels.</p>${issues}<div class="attention-groups">${groups}</div><p class="attention-footnote">These are authored requests. Closing one does not verify evidence or record an answer. Status, owner, file activity and finished runs do not create requests.</p>`;
40
+ }
41
+ //# sourceMappingURL=overviewHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overviewHtml.js","sourceRoot":"","sources":["../../src/attention/overviewHtml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { MetadataDocument } from "#metadata/model.ts";
2
+ import type { Metadata } from "#metadata/schema.ts";
3
+ import type { Snapshot } from "#search/snapshot.ts";
4
+ export type Request = NonNullable<Metadata["attention"]>[number];
5
+ export interface AttentionEntry {
6
+ readonly document: MetadataDocument;
7
+ readonly href: string;
8
+ readonly itemId: string;
9
+ readonly line: number;
10
+ readonly request: Request;
11
+ readonly title: string;
12
+ }
13
+ export interface SourceIssue {
14
+ readonly file: string;
15
+ readonly line: number;
16
+ readonly message: string;
17
+ }
18
+ export declare function attentionRequests(snapshot: Snapshot): {
19
+ complete: boolean;
20
+ entries: AttentionEntry[];
21
+ issues: SourceIssue[];
22
+ };
23
+ export declare function attentionSource(document: MetadataDocument, index: number): string;
24
+ //# sourceMappingURL=requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/attention/requests.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AA8BD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ;;;;EASnD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjF"}
@@ -0,0 +1,40 @@
1
+ import { identityUrl, referenceTarget } from "#metadata/links.ts";
2
+ function requestsFor(document, snapshot, title) {
3
+ const { fields, lines } = document.parsed;
4
+ const itemId = fields.id;
5
+ if (!itemId || snapshot.unavailable.length > 0 || snapshot.model.ids.get(itemId)?.length !== 1) {
6
+ return [];
7
+ }
8
+ const requests = fields.attention ?? [];
9
+ return requests.flatMap((request, index) => {
10
+ if (request.state !== "open"
11
+ || requests.filter((other) => other.id === request.id).length !== 1
12
+ || request.unblocks.some((target) => !referenceTarget(target, snapshot.model))) {
13
+ return [];
14
+ }
15
+ return [
16
+ {
17
+ document,
18
+ href: `${identityUrl(itemId)}#attention-request-${encodeURIComponent(request.id)}`,
19
+ itemId,
20
+ line: lines[`attention.${index}`] ?? lines.attention ?? 2,
21
+ request,
22
+ title,
23
+ },
24
+ ];
25
+ });
26
+ }
27
+ export function attentionRequests(snapshot) {
28
+ const titles = new Map(snapshot.entries.filter((entry) => entry.kind === "document").map((entry) => [entry.file, entry.title]));
29
+ const issues = snapshot.documents.flatMap((source) => (snapshot.model.diagnostics.get(source.file) ?? source.parsed.diagnostics).map((problem) => ({ ...problem, file: source.file })));
30
+ const entries = snapshot.documents.flatMap((source) => requestsFor(source, snapshot, titles.get(source.file) ?? source.file));
31
+ const collator = new Intl.Collator("en", { numeric: true, sensitivity: "base" });
32
+ entries.sort((a, b) => collator.compare(a.title, b.title) || a.itemId.localeCompare(b.itemId) || a.request.id.localeCompare(b.request.id));
33
+ return { complete: snapshot.unavailable.length === 0, entries, issues };
34
+ }
35
+ export function attentionSource(document, index) {
36
+ const requests = document.parsed.fields.attention ?? [];
37
+ const id = requests[index]?.id;
38
+ return id && requests.filter((request) => request.id === id).length === 1 ? `attention-request-${id}` : `attention-record-${index}`;
39
+ }
40
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/attention/requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function attentionStyle(): string;
2
+ //# sourceMappingURL=style.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/attention/style.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,IAAI,MAAM,CAQvC"}
@@ -0,0 +1,10 @@
1
+ export function attentionStyle() {
2
+ return `
3
+ .attention-total{margin:24px 0 8px;font-weight:600}.attention-order,.attention-footnote{font-size:13px;color:var(--muted);margin:0 0 24px;overflow-wrap:anywhere}
4
+ .attention-groups{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;align-items:start}.attention-group{min-width:0}.attention-group>h2{display:flex;justify-content:space-between;gap:12px;font-size:16px;margin:0 0 16px}.attention-group>h2>span{font:12px var(--mono);color:var(--muted)}
5
+ .attention-card{border:1px solid var(--border);border-radius:10px;padding:var(--card-space);background:var(--card);margin:0 0 16px;overflow-wrap:anywhere}.attention-card h3{font-size:1rem;margin:6px 0}.attention-card h3 a{text-decoration:none}.attention-card dl{font-size:13px;margin:16px 0}.attention-card dt{color:var(--muted);margin-top:12px}.attention-card dd{margin:4px 0}.attention-source{font-size:12px}.attention-reason{font-size:14px;margin:0}.attention-footnote{margin-top:24px}.attention-incomplete{padding:16px;border:1px solid var(--danger);border-radius:8px;margin:24px 0;overflow-wrap:anywhere}
6
+ [id^="attention-request-"],[id^="attention-record-"]{scroll-margin-top:20px}
7
+ @media(max-width:1100px){.attention-groups{grid-template-columns:minmax(0,1fr)}}
8
+ `;
9
+ }
10
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/attention/style.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc;IAC7B,OAAO;;;;;;CAMP,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAA4B,MAAM,iBAAiB,CAAC;AAKvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AA6BD,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,KAAK,WAAW,EAAU,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAyB,KAAK,cAAc,EAA4B,MAAM,iBAAiB,CAAC;AAUvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAoCD,KAAK,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,aAAa,GAAG,YAAY,CAAC;AAC5F,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;AAE1I,eAAO,MAAM,UAAU,GAAI,SAAS,YAAY,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CACxC,CAAC"}
package/dist/board.js CHANGED
@@ -4,22 +4,35 @@ import { watchChanges } from "#files/changes.ts";
4
4
  import { homeIn } from "#files/home.ts";
5
5
  import { ASSETS, MERMAID_ROUTE, mermaidFile, mermaidRoot } from "#http/assets.ts";
6
6
  import { events } from "#http/events.ts";
7
+ import { changesPage, history } from "#http/history.ts";
8
+ import { identity } from "#http/identity.ts";
7
9
  import { loopbackOnly } from "#http/loopback.ts";
10
+ import { overview } from "#http/overview.ts";
8
11
  import { page } from "#http/page.ts";
9
12
  import { respond } from "#http/respond.ts";
13
+ import { search } from "#http/search.ts";
14
+ import { work } from "#http/work.ts";
10
15
  import { Highlighter } from "#render/highlighter.ts";
16
+ import { searchSnapshot } from "#search/snapshot.ts";
11
17
  const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
12
18
  const home = yield* homeIn(options.root, options.home);
13
19
  const mermaid = yield* mermaidRoot();
14
20
  const changes = yield* watchChanges(options.root);
15
21
  const context = yield* Effect.context();
16
- const serve = (route, handler) => router.add("GET", route, loopbackOnly((request) => Effect.provideContext(handler(request), context)));
22
+ const serve = (route, handler, method = "GET") => router.add(method, route, loopbackOnly((request) => Effect.provideContext(handler(request), context)));
17
23
  yield* serve("/events", events(changes));
24
+ const index = yield* searchSnapshot(options.root, home, changes);
25
+ yield* serve("/_board/search", search(index));
26
+ yield* serve("/_board/work", work(index, changes, home));
27
+ yield* serve("/_board/overview", overview(index, changes, home));
28
+ yield* serve("/_board/changes", changesPage(changes, home));
29
+ yield* serve("/_board/history", history(index), "POST");
18
30
  for (const [route, body, contentType] of ASSETS) {
19
31
  yield* serve(route, () => Effect.succeed(respond(body, contentType)));
20
32
  }
21
33
  yield* serve(MERMAID_ROUTE, mermaidFile(mermaid));
22
- const pages = page({ home, root: options.root }, changes);
34
+ const pages = page({ home, root: options.root }, changes, index);
35
+ yield* serve("/_board/item/*", identity(index, pages, changes, home));
23
36
  yield* serve("/", pages);
24
37
  yield* serve("/*", pages);
25
38
  }));
package/dist/board.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmB,KAAK,EAAiC,MAAM,QAAQ,CAAC;AACvF,OAAO,EAAE,UAAU,EAAmD,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAoB,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAuB,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAUrD,MAAM,MAAM,GAAG,CAAC,OAAqB,EAAE,EAAE,CACxC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAY,CAAC;IAClD,MAAM,KAAK,GAAG,CAAI,KAA2B,EAAE,OAAmB,EAAE,EAAE,CACrE,MAAM,CAAC,GAAG,CACT,KAAK,EACL,KAAK,EACL,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC;IACH,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;QACjD,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC,CAAC,CACF,CAAC;AAKH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAqB,EAAiD,EAAE,CAClG,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
3
3
  import { Effect, Layer, Option, Path } from "effect";
4
4
  import { Argument, Command, Flag } from "effect/unstable/cli";
5
5
  import { HOST, serveBoard } from "./serve.js";
6
- const VERSION = "0.2.1";
6
+ const VERSION = "0.4.0";
7
7
  const serve = Effect.fn("WorkBoard.serve")(function* (input) {
8
8
  const path = yield* Path.Path;
9
9
  return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, root: path.resolve(input.dir) }));
@@ -11,6 +11,7 @@ export interface Changes {
11
11
  readonly events: PubSub.PubSub<Change>;
12
12
  readonly files: Effect.Effect<readonly MarkdownFile[], PlatformError.PlatformError>;
13
13
  readonly realRoot: string;
14
+ readonly revision: Effect.Effect<number>;
14
15
  readonly watching: Ref.Ref<boolean>;
15
16
  }
16
17
  export declare const watchChanges: (root: string) => Effect.Effect<Changes, PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | import("effect/Scope").Scope>;
@@ -1 +1 @@
1
- {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,GAAG,EAAoB,MAAM,QAAQ,CAAC;AAC7H,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAExE,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjJ,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACpC;AAcD,eAAO,MAAM,YAAY,yIA8CvB,CAAC"}
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,EAAE,GAAG,EAAY,MAAM,QAAQ,CAAC;AAC/G,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAG5D,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjJ,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACpC;AAUD,eAAO,MAAM,YAAY,yIAqCvB,CAAC"}