@shivaedev/work-board 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +70 -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 +6 -1
  17. package/dist/board.js.map +1 -1
  18. package/dist/cli.js +1 -1
  19. package/dist/files/changes.d.ts.map +1 -1
  20. package/dist/files/changes.js +4 -9
  21. package/dist/files/changes.js.map +1 -1
  22. package/dist/files/home.d.ts.map +1 -1
  23. package/dist/files/home.js +4 -0
  24. package/dist/files/home.js.map +1 -1
  25. package/dist/files/list.d.ts +7 -0
  26. package/dist/files/list.d.ts.map +1 -1
  27. package/dist/files/list.js +23 -13
  28. package/dist/files/list.js.map +1 -1
  29. package/dist/files/markdownPath.d.ts +3 -0
  30. package/dist/files/markdownPath.d.ts.map +1 -0
  31. package/dist/files/markdownPath.js +31 -0
  32. package/dist/files/markdownPath.js.map +1 -0
  33. package/dist/files/watchDirectories.d.ts +9 -0
  34. package/dist/files/watchDirectories.d.ts.map +1 -0
  35. package/dist/files/watchDirectories.js +33 -0
  36. package/dist/files/watchDirectories.js.map +1 -0
  37. package/dist/history/baseline.d.ts +19 -0
  38. package/dist/history/baseline.d.ts.map +1 -0
  39. package/dist/history/baseline.js +40 -0
  40. package/dist/history/baseline.js.map +1 -0
  41. package/dist/history/compare.d.ts +14 -0
  42. package/dist/history/compare.d.ts.map +1 -0
  43. package/dist/history/compare.js +47 -0
  44. package/dist/history/compare.js.map +1 -0
  45. package/dist/history/documents.d.ts +10 -0
  46. package/dist/history/documents.d.ts.map +1 -0
  47. package/dist/history/documents.js +15 -0
  48. package/dist/history/documents.js.map +1 -0
  49. package/dist/history/fields.d.ts +3 -0
  50. package/dist/history/fields.d.ts.map +1 -0
  51. package/dist/history/fields.js +27 -0
  52. package/dist/history/fields.js.map +1 -0
  53. package/dist/history/html.d.ts +4 -0
  54. package/dist/history/html.d.ts.map +1 -0
  55. package/dist/history/html.js +22 -0
  56. package/dist/history/html.js.map +1 -0
  57. package/dist/history/limits.d.ts +3 -0
  58. package/dist/history/limits.d.ts.map +1 -0
  59. package/dist/history/limits.js +3 -0
  60. package/dist/history/limits.js.map +1 -0
  61. package/dist/history/response.d.ts +4 -0
  62. package/dist/history/response.d.ts.map +1 -0
  63. package/dist/history/response.js +20 -0
  64. package/dist/history/response.js.map +1 -0
  65. package/dist/history/schema.d.ts +24 -0
  66. package/dist/history/schema.d.ts.map +1 -0
  67. package/dist/history/schema.js +19 -0
  68. package/dist/history/schema.js.map +1 -0
  69. package/dist/history/script.d.ts +2 -0
  70. package/dist/history/script.d.ts.map +1 -0
  71. package/dist/history/script.js +125 -0
  72. package/dist/history/script.js.map +1 -0
  73. package/dist/http/assets.d.ts.map +1 -1
  74. package/dist/http/assets.js +2 -0
  75. package/dist/http/assets.js.map +1 -1
  76. package/dist/http/history.d.ts +7 -0
  77. package/dist/http/history.d.ts.map +1 -0
  78. package/dist/http/history.js +45 -0
  79. package/dist/http/history.js.map +1 -0
  80. package/dist/http/overview.d.ts +5 -0
  81. package/dist/http/overview.d.ts.map +1 -0
  82. package/dist/http/overview.js +13 -0
  83. package/dist/http/overview.js.map +1 -0
  84. package/dist/http/page.d.ts +2 -2
  85. package/dist/http/page.d.ts.map +1 -1
  86. package/dist/http/page.js +5 -6
  87. package/dist/http/page.js.map +1 -1
  88. package/dist/metadata/attentionProblems.d.ts +4 -0
  89. package/dist/metadata/attentionProblems.d.ts.map +1 -0
  90. package/dist/metadata/attentionProblems.js +16 -0
  91. package/dist/metadata/attentionProblems.js.map +1 -0
  92. package/dist/metadata/backlinks.d.ts.map +1 -1
  93. package/dist/metadata/backlinks.js +5 -0
  94. package/dist/metadata/backlinks.js.map +1 -1
  95. package/dist/metadata/fields.d.ts +8 -0
  96. package/dist/metadata/fields.d.ts.map +1 -1
  97. package/dist/metadata/problems.d.ts.map +1 -1
  98. package/dist/metadata/problems.js +3 -1
  99. package/dist/metadata/problems.js.map +1 -1
  100. package/dist/metadata/relationshipLabel.d.ts.map +1 -1
  101. package/dist/metadata/relationshipLabel.js +1 -0
  102. package/dist/metadata/relationshipLabel.js.map +1 -1
  103. package/dist/metadata/schema.d.ts +10 -0
  104. package/dist/metadata/schema.d.ts.map +1 -1
  105. package/dist/metadata/schema.js +9 -0
  106. package/dist/metadata/schema.js.map +1 -1
  107. package/dist/page/attentionDetails.d.ts +4 -0
  108. package/dist/page/attentionDetails.d.ts.map +1 -0
  109. package/dist/page/attentionDetails.js +13 -0
  110. package/dist/page/attentionDetails.js.map +1 -0
  111. package/dist/page/client.d.ts +1 -1
  112. package/dist/page/client.d.ts.map +1 -1
  113. package/dist/page/client.js +1 -0
  114. package/dist/page/client.js.map +1 -1
  115. package/dist/page/metadataDetails.d.ts.map +1 -1
  116. package/dist/page/metadataDetails.js +2 -0
  117. package/dist/page/metadataDetails.js.map +1 -1
  118. package/dist/page/navigationScript.js +1 -1
  119. package/dist/page/shell.d.ts +1 -1
  120. package/dist/page/shell.d.ts.map +1 -1
  121. package/dist/page/shell.js +2 -2
  122. package/dist/page/shell.js.map +1 -1
  123. package/dist/page/stateScript.d.ts.map +1 -1
  124. package/dist/page/stateScript.js +6 -0
  125. package/dist/page/stateScript.js.map +1 -1
  126. package/dist/page/style.d.ts.map +1 -1
  127. package/dist/page/style.js +2 -1
  128. package/dist/page/style.js.map +1 -1
  129. package/dist/search/attentionEntries.d.ts +4 -0
  130. package/dist/search/attentionEntries.d.ts.map +1 -0
  131. package/dist/search/attentionEntries.js +20 -0
  132. package/dist/search/attentionEntries.js.map +1 -0
  133. package/dist/search/metadataEntries.d.ts.map +1 -1
  134. package/dist/search/metadataEntries.js +2 -0
  135. package/dist/search/metadataEntries.js.map +1 -1
  136. package/dist/search/snapshot.d.ts +2 -2
  137. package/dist/search/snapshot.d.ts.map +1 -1
  138. package/dist/search/snapshot.js +4 -5
  139. package/dist/search/snapshot.js.map +1 -1
  140. package/package.json +5 -4
  141. package/src/attention/overviewHtml.ts +44 -0
  142. package/src/attention/requests.ts +64 -0
  143. package/src/attention/style.ts +9 -0
  144. package/src/board.ts +7 -2
  145. package/src/cli.ts +1 -1
  146. package/src/files/changes.ts +4 -16
  147. package/src/files/home.ts +4 -0
  148. package/src/files/list.ts +25 -14
  149. package/src/files/markdownPath.ts +31 -0
  150. package/src/files/watchDirectories.ts +60 -0
  151. package/src/history/baseline.ts +43 -0
  152. package/src/history/compare.ts +54 -0
  153. package/src/history/documents.ts +21 -0
  154. package/src/history/fields.ts +32 -0
  155. package/src/history/html.ts +23 -0
  156. package/src/history/limits.ts +2 -0
  157. package/src/history/response.ts +23 -0
  158. package/src/history/schema.ts +36 -0
  159. package/src/history/script.ts +124 -0
  160. package/src/http/assets.ts +2 -0
  161. package/src/http/history.ts +50 -0
  162. package/src/http/overview.ts +19 -0
  163. package/src/http/page.ts +6 -6
  164. package/src/metadata/attentionProblems.ts +18 -0
  165. package/src/metadata/backlinks.ts +7 -0
  166. package/src/metadata/problems.ts +5 -1
  167. package/src/metadata/relationshipLabel.ts +1 -0
  168. package/src/metadata/schema.ts +9 -0
  169. package/src/page/attentionDetails.ts +18 -0
  170. package/src/page/client.ts +1 -0
  171. package/src/page/metadataDetails.ts +2 -0
  172. package/src/page/navigationScript.ts +1 -1
  173. package/src/page/shell.ts +11 -3
  174. package/src/page/stateScript.ts +6 -0
  175. package/src/page/style.ts +2 -1
  176. package/src/search/attentionEntries.ts +22 -0
  177. package/src/search/metadataEntries.ts +2 -0
  178. package/src/search/snapshot.ts +4 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.1 - 2026-10-05
4
+
5
+ ### Fixed
6
+
7
+ - Let an explicit Mark seen observation finish through background/live refresh
8
+ and then reconcile current source. Keep newer clearing or another tab's
9
+ storage changes authoritative so a cancelled observation cannot restore
10
+ discarded history. Preserve the existing browser-local retention limits.
11
+
12
+ ## 0.4.0 - 2026-10-05
13
+
14
+ ### Added
15
+
16
+ - Add explicit Changes since seen comparisons with one browser-local baseline
17
+ per workspace, 30-day expiry, a 2 MiB serialized limit and clearing. Compare
18
+ source additions/removals, unique-ID moves and recorded field/content changes
19
+ with escaped old/current source. Keep incomplete, corrupt, expired and oversized
20
+ history explicit; live updates never silently acknowledge changes. No source
21
+ writes, server history, cloud sync, inferred authorship or verified acceptance.
22
+
23
+ - Read explicit per-item attention request lists and expose a local overview for
24
+ decisions, reviews and blockers with reason, response labels, target links and
25
+ source provenance. Preserve exact request navigation, search/backlink context,
26
+ native links and live updates. Keep invalid/ambiguous requests unclassified and
27
+ incomplete indexes uncounted; closed requests do not imply acceptance. Existing
28
+ Markdown and arbitrary status/owner fields remain unchanged.
29
+
30
+ ### Fixed
31
+
32
+ - Include symlinked reference directories outside the workspace in document
33
+ reading, logical relative links, home selection and search. Watch linked
34
+ directory edits and rediscover added/retargeted links. Skip broken links,
35
+ ancestor/cycle traversal, hidden entries and dependencies; standalone file
36
+ symlinks still cannot escape their containing workspace/reference directory.
37
+ Reference files are read only.
38
+
3
39
  ## 0.3.0 - 2026-10-04
4
40
 
5
41
  ### Changed
package/README.md CHANGED
@@ -9,14 +9,30 @@ 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 collapsible sidebar 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,
@@ -80,8 +96,9 @@ the workspace or change the existing sidebar, density, and theme controls.
80
96
 
81
97
  The server keeps a rebuildable index in memory and invalidates it when the file
82
98
  watcher changes. An open dialog refreshes on edits and reconnects; older requests
83
- cannot replace a newer query. Hidden files, `node_modules`, and symlinks outside
84
- the workspace are excluded. Unreadable files produce an incomplete-results notice.
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.
85
102
  All indexing and requests stay local. Search needs JavaScript; document reading
86
103
  does not. Source-in-editor links await an agreed local editor mechanism.
87
104
 
@@ -136,6 +153,44 @@ from the view picker. Unsafe stored destinations are ignored. If storage is
136
153
  unavailable, named views work for the current page only; source files are unchanged.
137
154
  Saving requires JavaScript; board/table reading does not.
138
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
+
139
194
  ## Reasoning and evidence context
140
195
 
141
196
  Follow explicit relationships from a result to its plan and decision. Decisions
@@ -227,7 +282,11 @@ Finished work moves to the changelog.
227
282
 
228
283
  ## Live updates
229
284
 
230
- 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
231
290
  `/events` sends one server-sent event naming the markdown files that changed:
232
291
 
233
292
  ```text
@@ -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;AAQvG,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;AAiCD,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,8 +4,10 @@ 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";
7
8
  import { identity } from "#http/identity.ts";
8
9
  import { loopbackOnly } from "#http/loopback.ts";
10
+ import { overview } from "#http/overview.ts";
9
11
  import { page } from "#http/page.ts";
10
12
  import { respond } from "#http/respond.ts";
11
13
  import { search } from "#http/search.ts";
@@ -17,11 +19,14 @@ const routes = (options) => HttpRouter.use((router) => Effect.gen(function* () {
17
19
  const mermaid = yield* mermaidRoot();
18
20
  const changes = yield* watchChanges(options.root);
19
21
  const context = yield* Effect.context();
20
- 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)));
21
23
  yield* serve("/events", events(changes));
22
24
  const index = yield* searchSnapshot(options.root, home, changes);
23
25
  yield* serve("/_board/search", search(index));
24
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");
25
30
  for (const [route, body, contentType] of ASSETS) {
26
31
  yield* serve(route, () => Effect.succeed(respond(body, contentType)));
27
32
  }
package/dist/board.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"board.js","sourceRoot":"","sources":["../src/board.ts"],"names":[],"mappings":"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"}
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.3.0";
6
+ const VERSION = "0.4.1";
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) }));
@@ -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,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,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"}
@@ -1,9 +1,6 @@
1
- import { Data, Deferred, Effect, FileSystem, Option, Path, PubSub, Ref, Schedule, Stream } from "effect";
2
- import { isMarkdown, listMarkdown } from "./list.js";
3
- class WatchEnded extends Data.TaggedError("WatchEnded") {
4
- }
5
- const SETTLE = "100 millis";
6
- const BATCH = 256;
1
+ import { Deferred, Effect, FileSystem, Option, Path, PubSub, Ref, Schedule } from "effect";
2
+ import { listMarkdown } from "./list.js";
3
+ import { watchDirectories } from "./watchDirectories.js";
7
4
  const BACKLOG = 16;
8
5
  const RETRY = Schedule.min([Schedule.exponential("100 millis"), Schedule.spaced("5 seconds")]);
9
6
  export const watchChanges = Effect.fn("WorkBoard.watchChanges")(function* (root) {
@@ -16,10 +13,8 @@ export const watchChanges = Effect.fn("WorkBoard.watchChanges")(function* (root)
16
13
  const cached = yield* Ref.make(Option.none());
17
14
  const settled = yield* Deferred.make();
18
15
  const stale = Ref.update(generation, (count) => count + 1);
19
- const relative = (changed) => (path.isAbsolute(changed) ? path.relative(root, changed) : changed).split(path.sep).join("/");
20
16
  const setWatching = (now) => Effect.andThen(Effect.flatMap(Ref.getAndSet(watching, now), (was) => was === now ? Effect.void : Effect.andThen(stale, PubSub.publish(events, { _tag: "Watching", watching: now }))), Deferred.succeed(settled, undefined));
21
- const watchOnce = fs.watch(root, { recursive: true }).pipe(Stream.tap(() => stale), Stream.map((event) => relative(event.path)), Stream.filter(isMarkdown), Stream.groupedWithin(BATCH, SETTLE), Stream.runForEach((paths) => PubSub.publish(events, { _tag: "Changed", paths: [...new Set(paths)] })), Effect.andThen(Effect.fail(new WatchEnded())));
22
- const attempt = Effect.scoped(Effect.andThen(Effect.forkScoped(Effect.delay(setWatching(true), SETTLE)), watchOnce));
17
+ const attempt = watchDirectories(root, realRoot, stale, setWatching, (paths) => PubSub.publish(events, { _tag: "Changed", paths }));
23
18
  yield* attempt.pipe(Effect.sandbox, Effect.tapError((cause) => Effect.andThen(setWatching(false), Effect.logWarning("Watching the folder failed; retrying", cause))), Effect.retry(RETRY), Effect.forkScoped);
24
19
  yield* Deferred.await(settled);
25
20
  const files = Effect.gen(function* () {
@@ -1 +1 @@
1
- {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/files/changes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/files/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;;;;AAGhE,qBAAa,WAAY,SAAQ,iBAAgC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAEjG,eAAO,MAAM,MAAM,8KA+BjB,CAAC"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/files/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;;;;AAGhE,qBAAa,WAAY,SAAQ,iBAAgC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAEjG,eAAO,MAAM,MAAM,8KAmCjB,CAAC"}
@@ -19,6 +19,10 @@ export const homeIn = Effect.fn("WorkBoard.homeIn")(function* (root, home) {
19
19
  return yield* missing;
20
20
  }
21
21
  const files = yield* listMarkdown(root, realRoot);
22
+ const logical = path.relative(root, path.resolve(root, home)).split(path.sep).join("/");
23
+ if (files.some((file) => file.path === logical)) {
24
+ return logical;
25
+ }
22
26
  const relative = path.relative(realRoot, real.value).split(path.sep).join("/");
23
27
  if (files.some((file) => file.path === relative)) {
24
28
  return relative;
@@ -1 +1 @@
1
- {"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/files/home.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/files/home.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,12 @@ export interface MarkdownFile {
5
5
  }
6
6
  export declare const isMarkdown: (path: string) => boolean;
7
7
  export declare const within: (realRoot: string, separator: string, real: string) => boolean;
8
+ export declare const scanMarkdown: (root: string, realRoot: string) => Effect.Effect<{
9
+ files: MarkdownFile[];
10
+ roots: {
11
+ readonly real: string;
12
+ readonly relative: string;
13
+ }[];
14
+ }, PlatformError.PlatformError, FileSystem.FileSystem | Path.Path>;
8
15
  export declare const listMarkdown: (root: string, realRoot: string) => Effect.Effect<MarkdownFile[], PlatformError.PlatformError, FileSystem.FileSystem | Path.Path>;
9
16
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/files/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,OAAiE,CAAC;AAE5G,eAAO,MAAM,MAAM,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,OAA0E,CAAC;AAQtJ,eAAO,MAAM,YAAY,mIAmCvB,CAAC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/files/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,OAAiE,CAAC;AAE5G,eAAO,MAAM,MAAM,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,KAAG,OAA0E,CAAC;AAQtJ,eAAO,MAAM,YAAY;;;uBAGY,MAAM;2BAAqB,MAAM;;kEAuCpE,CAAC;AAEH,eAAO,MAAM,YAAY,mIAEvB,CAAC"}
@@ -4,13 +4,13 @@ export const isMarkdown = (path) => path.endsWith(".md") && !path.split("/").som
4
4
  export const within = (realRoot, separator, real) => real === realRoot || real.startsWith(`${realRoot}${separator}`);
5
5
  const folderOf = (path) => path.slice(0, Math.max(0, path.lastIndexOf("/")));
6
6
  const byFolder = (left, right) => folderOf(left).localeCompare(folderOf(right)) || left.localeCompare(right);
7
- export const listMarkdown = Effect.fn("WorkBoard.listMarkdown")(function* (root, realRoot) {
7
+ export const scanMarkdown = Effect.fn("WorkBoard.scanMarkdown")(function* (root, realRoot) {
8
8
  const fs = yield* FileSystem.FileSystem;
9
9
  const path = yield* Path.Path;
10
- const visited = new Set();
11
- const entry = (relative) => Effect.gen(function* () {
10
+ const roots = [{ real: realRoot, relative: "" }];
11
+ const entry = (relative, boundary, ancestors, parent) => Effect.gen(function* () {
12
12
  const real = yield* Effect.option(fs.realPath(path.join(root, relative)));
13
- if (Option.isNone(real) || !within(realRoot, path.sep, real.value)) {
13
+ if (Option.isNone(real)) {
14
14
  return [];
15
15
  }
16
16
  const info = yield* Effect.option(fs.stat(real.value));
@@ -18,21 +18,31 @@ export const listMarkdown = Effect.fn("WorkBoard.listMarkdown")(function* (root,
18
18
  return [];
19
19
  }
20
20
  if (info.value.type === "Directory") {
21
- return yield* Effect.orElseSucceed(folder(relative, real.value), () => []);
21
+ return yield* directory(relative, real.value, boundary, ancestors, real.value !== path.join(parent, path.basename(relative)));
22
22
  }
23
23
  const modified = Option.match(info.value.mtime, { onNone: () => 0, onSome: (date) => date.getTime() });
24
- return info.value.type === "File" && relative.endsWith(".md") ? [{ modified, path: relative }] : [];
24
+ return info.value.type === "File" && relative.endsWith(".md") && within(boundary, path.sep, real.value) ? [{ modified, path: relative }] : [];
25
25
  });
26
- const folder = (relative, real) => Effect.gen(function* () {
27
- if (visited.has(real)) {
28
- return [];
26
+ function directory(relative, real, boundary, ancestors, alias) {
27
+ if (ancestors.has(real) || within(real, path.sep, realRoot)) {
28
+ return Effect.succeed([]);
29
+ }
30
+ const linked = !within(boundary, path.sep, real);
31
+ if (alias) {
32
+ roots.push({ real, relative });
29
33
  }
30
- visited.add(real);
34
+ return Effect.orElseSucceed(folder(relative, real, linked ? real : boundary, ancestors), () => []);
35
+ }
36
+ const folder = (relative, real, boundary, ancestors) => Effect.gen(function* () {
37
+ const branch = new Set([...ancestors, real]);
31
38
  const names = yield* fs.readDirectory(real);
32
- const found = yield* Effect.forEach(names.filter((name) => !skipped(name)), (name) => entry(relative === "" ? name : `${relative}/${name}`));
39
+ const found = yield* Effect.forEach(names.filter((name) => !skipped(name)), (name) => entry(relative === "" ? name : `${relative}/${name}`, boundary, branch, real));
33
40
  return found.flat();
34
41
  });
35
- const files = yield* folder("", realRoot);
36
- return files.toSorted((left, right) => byFolder(left.path, right.path));
42
+ const files = yield* folder("", realRoot, realRoot, new Set());
43
+ return { files: files.toSorted((left, right) => byFolder(left.path, right.path)), roots };
44
+ });
45
+ export const listMarkdown = Effect.fn("WorkBoard.listMarkdown")(function* (root, realRoot) {
46
+ return (yield* scanMarkdown(root, realRoot)).files;
37
47
  });
38
48
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/files/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/files/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Effect, FileSystem, Path } from "effect";
2
+ export declare const markdownPath: (root: string, realRoot: string, relative: string) => Effect.Effect<string | undefined, never, FileSystem.FileSystem | Path.Path>;
3
+ //# sourceMappingURL=markdownPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownPath.d.ts","sourceRoot":"","sources":["../../src/files/markdownPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG1D,eAAO,MAAM,YAAY,mIA2BvB,CAAC"}