ctxr-cli 0.23.0 → 0.25.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 (197) hide show
  1. package/README.md +65 -5
  2. package/dist/commands/graph-diff.d.ts +33 -0
  3. package/dist/commands/graph-diff.d.ts.map +1 -0
  4. package/dist/commands/graph-diff.js +52 -0
  5. package/dist/commands/graph-diff.js.map +1 -0
  6. package/dist/commands/land.d.ts +50 -0
  7. package/dist/commands/land.d.ts.map +1 -0
  8. package/dist/commands/land.js +414 -0
  9. package/dist/commands/land.js.map +1 -0
  10. package/dist/commands/publish-check.d.ts +6 -0
  11. package/dist/commands/publish-check.d.ts.map +1 -1
  12. package/dist/commands/publish-check.js +78 -3
  13. package/dist/commands/publish-check.js.map +1 -1
  14. package/dist/commands/publish-gather.d.ts.map +1 -1
  15. package/dist/commands/publish-gather.js +4 -1
  16. package/dist/commands/publish-gather.js.map +1 -1
  17. package/dist/commands/publish-new.d.ts +5 -0
  18. package/dist/commands/publish-new.d.ts.map +1 -1
  19. package/dist/commands/publish-new.js +30 -10
  20. package/dist/commands/publish-new.js.map +1 -1
  21. package/dist/commands/publish-stamp.d.ts +32 -0
  22. package/dist/commands/publish-stamp.d.ts.map +1 -0
  23. package/dist/commands/publish-stamp.js +78 -0
  24. package/dist/commands/publish-stamp.js.map +1 -0
  25. package/dist/commands/publish-urls.d.ts +13 -0
  26. package/dist/commands/publish-urls.d.ts.map +1 -1
  27. package/dist/commands/publish-urls.js +23 -6
  28. package/dist/commands/publish-urls.js.map +1 -1
  29. package/dist/commands/review-list.d.ts +34 -0
  30. package/dist/commands/review-list.d.ts.map +1 -0
  31. package/dist/commands/review-list.js +49 -0
  32. package/dist/commands/review-list.js.map +1 -0
  33. package/dist/commands/serve.d.ts +3 -6
  34. package/dist/commands/serve.d.ts.map +1 -1
  35. package/dist/commands/serve.js +106 -9
  36. package/dist/commands/serve.js.map +1 -1
  37. package/dist/config/schema.d.ts +40 -0
  38. package/dist/config/schema.d.ts.map +1 -1
  39. package/dist/config/schema.js +39 -0
  40. package/dist/config/schema.js.map +1 -1
  41. package/dist/core/approval/decision.d.ts +73 -0
  42. package/dist/core/approval/decision.d.ts.map +1 -0
  43. package/dist/core/approval/decision.js +166 -0
  44. package/dist/core/approval/decision.js.map +1 -0
  45. package/dist/core/approval/file-diff.d.ts +32 -0
  46. package/dist/core/approval/file-diff.d.ts.map +1 -0
  47. package/dist/core/approval/file-diff.js +83 -0
  48. package/dist/core/approval/file-diff.js.map +1 -0
  49. package/dist/core/approval/identity.d.ts +34 -0
  50. package/dist/core/approval/identity.d.ts.map +1 -0
  51. package/dist/core/approval/identity.js +105 -0
  52. package/dist/core/approval/identity.js.map +1 -0
  53. package/dist/core/approval/landing-record.d.ts +17 -0
  54. package/dist/core/approval/landing-record.d.ts.map +1 -0
  55. package/dist/core/approval/landing-record.js +30 -0
  56. package/dist/core/approval/landing-record.js.map +1 -0
  57. package/dist/core/approval/resolver.d.ts +15 -0
  58. package/dist/core/approval/resolver.d.ts.map +1 -0
  59. package/dist/core/approval/resolver.js +41 -0
  60. package/dist/core/approval/resolver.js.map +1 -0
  61. package/dist/core/approval/sessions.d.ts +36 -0
  62. package/dist/core/approval/sessions.d.ts.map +1 -0
  63. package/dist/core/approval/sessions.js +76 -0
  64. package/dist/core/approval/sessions.js.map +1 -0
  65. package/dist/core/browse/approve.d.ts +45 -0
  66. package/dist/core/browse/approve.d.ts.map +1 -0
  67. package/dist/core/browse/approve.js +239 -0
  68. package/dist/core/browse/approve.js.map +1 -0
  69. package/dist/core/browse/diagram-assets.d.ts +15 -0
  70. package/dist/core/browse/diagram-assets.d.ts.map +1 -0
  71. package/dist/core/browse/diagram-assets.js +35 -0
  72. package/dist/core/browse/diagram-assets.js.map +1 -0
  73. package/dist/core/browse/page-url.d.ts +22 -0
  74. package/dist/core/browse/page-url.d.ts.map +1 -1
  75. package/dist/core/browse/page-url.js +31 -0
  76. package/dist/core/browse/page-url.js.map +1 -1
  77. package/dist/core/browse/render.d.ts +10 -1
  78. package/dist/core/browse/render.d.ts.map +1 -1
  79. package/dist/core/browse/render.js +23 -1
  80. package/dist/core/browse/render.js.map +1 -1
  81. package/dist/core/browse/review.d.ts +21 -0
  82. package/dist/core/browse/review.d.ts.map +1 -0
  83. package/dist/core/browse/review.js +52 -0
  84. package/dist/core/browse/review.js.map +1 -0
  85. package/dist/core/browse/templates.d.ts +4 -1
  86. package/dist/core/browse/templates.d.ts.map +1 -1
  87. package/dist/core/browse/templates.js +18 -2
  88. package/dist/core/browse/templates.js.map +1 -1
  89. package/dist/core/checks/organize-checks.d.ts +17 -0
  90. package/dist/core/checks/organize-checks.d.ts.map +1 -1
  91. package/dist/core/checks/organize-checks.js +116 -0
  92. package/dist/core/checks/organize-checks.js.map +1 -1
  93. package/dist/core/errors.d.ts +67 -0
  94. package/dist/core/errors.d.ts.map +1 -1
  95. package/dist/core/errors.js +160 -0
  96. package/dist/core/errors.js.map +1 -1
  97. package/dist/core/forge/credentials.d.ts +69 -0
  98. package/dist/core/forge/credentials.d.ts.map +1 -0
  99. package/dist/core/forge/credentials.js +197 -0
  100. package/dist/core/forge/credentials.js.map +1 -0
  101. package/dist/core/forge/github.d.ts +73 -0
  102. package/dist/core/forge/github.d.ts.map +1 -0
  103. package/dist/core/forge/github.js +101 -0
  104. package/dist/core/forge/github.js.map +1 -0
  105. package/dist/core/git/exec.d.ts +25 -0
  106. package/dist/core/git/exec.d.ts.map +1 -1
  107. package/dist/core/git/exec.js +100 -2
  108. package/dist/core/git/exec.js.map +1 -1
  109. package/dist/core/graph/diff-block.d.ts +6 -0
  110. package/dist/core/graph/diff-block.d.ts.map +1 -0
  111. package/dist/core/graph/diff-block.js +63 -0
  112. package/dist/core/graph/diff-block.js.map +1 -0
  113. package/dist/core/graph/diff-document.d.ts +38 -0
  114. package/dist/core/graph/diff-document.d.ts.map +1 -0
  115. package/dist/core/graph/diff-document.js +117 -0
  116. package/dist/core/graph/diff-document.js.map +1 -0
  117. package/dist/core/graph/diff.d.ts +123 -0
  118. package/dist/core/graph/diff.d.ts.map +1 -0
  119. package/dist/core/graph/diff.js +253 -0
  120. package/dist/core/graph/diff.js.map +1 -0
  121. package/dist/core/graph/tree.d.ts +24 -0
  122. package/dist/core/graph/tree.d.ts.map +1 -0
  123. package/dist/core/graph/tree.js +45 -0
  124. package/dist/core/graph/tree.js.map +1 -0
  125. package/dist/core/notes/list.d.ts +10 -0
  126. package/dist/core/notes/list.d.ts.map +1 -1
  127. package/dist/core/notes/list.js +35 -12
  128. package/dist/core/notes/list.js.map +1 -1
  129. package/dist/core/publish/filing.d.ts +12 -12
  130. package/dist/core/publish/filing.d.ts.map +1 -1
  131. package/dist/core/publish/filing.js +20 -18
  132. package/dist/core/publish/filing.js.map +1 -1
  133. package/dist/core/publish/lifespan.d.ts +37 -0
  134. package/dist/core/publish/lifespan.d.ts.map +1 -0
  135. package/dist/core/publish/lifespan.js +59 -0
  136. package/dist/core/publish/lifespan.js.map +1 -0
  137. package/dist/core/publish/represents.d.ts +72 -0
  138. package/dist/core/publish/represents.d.ts.map +1 -0
  139. package/dist/core/publish/represents.js +83 -0
  140. package/dist/core/publish/represents.js.map +1 -0
  141. package/dist/run.d.ts.map +1 -1
  142. package/dist/run.js +60 -4
  143. package/dist/run.js.map +1 -1
  144. package/dist/version.d.ts +1 -1
  145. package/dist/version.js +1 -1
  146. package/package.json +2 -1
  147. package/templates/approve/approve-button.md +1 -0
  148. package/templates/approve/author-heading.md +1 -0
  149. package/templates/approve/author-note.md +1 -0
  150. package/templates/approve/comment-label.md +1 -0
  151. package/templates/approve/comment-required.md +1 -0
  152. package/templates/approve/commits-heading.md +1 -0
  153. package/templates/approve/decision-heading.md +1 -0
  154. package/templates/approve/decision-note.md +1 -0
  155. package/templates/approve/diff-binary.md +1 -0
  156. package/templates/approve/diff-empty.md +1 -0
  157. package/templates/approve/diff-heading.md +1 -0
  158. package/templates/approve/facts-heading.md +1 -0
  159. package/templates/approve/forge-unreachable.md +1 -0
  160. package/templates/approve/github-app-manifest.json +15 -0
  161. package/templates/approve/head-missing.md +1 -0
  162. package/templates/approve/index-empty.md +1 -0
  163. package/templates/approve/index-heading.md +1 -0
  164. package/templates/approve/index-intro.md +1 -0
  165. package/templates/approve/landed.md +1 -0
  166. package/templates/approve/moved-head.md +1 -0
  167. package/templates/approve/no-pull.md +1 -0
  168. package/templates/approve/not-open.md +1 -0
  169. package/templates/approve/pages-heading.md +1 -0
  170. package/templates/approve/pages-note.md +1 -0
  171. package/templates/approve/record-failed.md +1 -0
  172. package/templates/approve/request-changes-button.md +1 -0
  173. package/templates/approve/state-line.md +1 -0
  174. package/templates/conventions/baseline-conventions.md +6 -0
  175. package/templates/graph/knowledge-changes/archived-item.md +1 -0
  176. package/templates/graph/knowledge-changes/archived.md +1 -0
  177. package/templates/graph/knowledge-changes/bare-route.md +2 -0
  178. package/templates/graph/knowledge-changes/block.md +10 -0
  179. package/templates/graph/knowledge-changes/counts.md +1 -0
  180. package/templates/graph/knowledge-changes/dangling-item.md +1 -0
  181. package/templates/graph/knowledge-changes/dangling.md +1 -0
  182. package/templates/graph/knowledge-changes/empty.md +1 -0
  183. package/templates/graph/knowledge-changes/reason-ambiguous.md +1 -0
  184. package/templates/graph/knowledge-changes/reason-not_found.md +1 -0
  185. package/templates/graph/knowledge-changes/review.md +4 -0
  186. package/templates/graph/review/moved-head.md +1 -0
  187. package/templates/land/resolver.md +12 -0
  188. package/templates/serve/diagrams.mjs +136 -0
  189. package/templates/serve/shell.html +1 -1
  190. package/templates/serve/style.css +90 -0
  191. package/templates/skills/ctxr-land.md +37 -31
  192. package/templates/skills/ctxr-organize-audit.md +19 -0
  193. package/templates/skills/ctxr-publish.md +100 -45
  194. package/templates/skills/ctxr-second-opinion/run.mjs +28 -17
  195. package/templates/skills/ctxr-second-opinion.md +19 -14
  196. package/templates/skills/ctxr-session-lifecycle.md +9 -0
  197. package/templates/skills/ctxr-submit.md +28 -17
@@ -0,0 +1,123 @@
1
+ import type { StoreConfig } from '../../config/schema.js';
2
+ import type { GitRunner } from '../git/exec.js';
3
+ import { type DanglingLink, type GraphBuildResult, type GraphEdge } from './model.js';
4
+ import { type CommitNote } from './tree.js';
5
+ /**
6
+ * review-the-knowledge-diff: how the store's knowledge changed between two
7
+ * commits — facts only, with no severity, score or ranking (D10). Every list
8
+ * is sorted by path and then by its remaining fields, and nothing here reads
9
+ * the clock, so the same two commits and configuration give the same value.
10
+ */
11
+ export interface NoteRename {
12
+ from: string;
13
+ to: string;
14
+ }
15
+ export interface InboundChange {
16
+ path: string;
17
+ gained: string[];
18
+ lost: string[];
19
+ /** Whether the note carries a rollup region on the head side. */
20
+ rollup: boolean;
21
+ }
22
+ export type RollupChange = 'added' | 'removed' | 'changed';
23
+ export interface RollupTouched {
24
+ path: string;
25
+ change: RollupChange;
26
+ }
27
+ export interface SourcesCited {
28
+ path: string;
29
+ cited: string[];
30
+ }
31
+ export interface GraphDeltaCounts {
32
+ notes_added: number;
33
+ notes_removed: number;
34
+ notes_modified: number;
35
+ notes_moved: number;
36
+ notes_archived: number;
37
+ links_added: number;
38
+ links_removed: number;
39
+ dangling_introduced: number;
40
+ dangling_resolved: number;
41
+ inbound_changed: number;
42
+ rollups_touched: number;
43
+ sources_cited: number;
44
+ }
45
+ export interface GraphDelta {
46
+ /** The full id of the base commit: the merge base of `--since` and the head. */
47
+ base: string;
48
+ /** The full id of the head commit. */
49
+ head: string;
50
+ counts: GraphDeltaCounts;
51
+ notes: {
52
+ added: string[];
53
+ removed: string[];
54
+ modified: string[];
55
+ moved: NoteRename[];
56
+ archived: NoteRename[];
57
+ };
58
+ links: {
59
+ added: GraphEdge[];
60
+ removed: GraphEdge[];
61
+ };
62
+ dangling: {
63
+ introduced: DanglingLink[];
64
+ resolved: DanglingLink[];
65
+ };
66
+ inbound: InboundChange[];
67
+ rollups: RollupTouched[];
68
+ sources: SourcesCited[];
69
+ }
70
+ /** One side of the comparison: a commit, the notes it holds, and the graph built from them. */
71
+ export interface GraphSide {
72
+ commit: string;
73
+ notes: readonly CommitNote[];
74
+ graph: GraphBuildResult;
75
+ }
76
+ /** A rename git's rename detection reported between the two commits, store-relative. */
77
+ export type RenameTable = readonly NoteRename[];
78
+ export declare function isEmptyDelta(delta: GraphDelta): boolean;
79
+ /**
80
+ * review-the-knowledge-diff (D3): the delta between two built sides. Every
81
+ * base-side path is carried through the moves and archives first, so a note
82
+ * that moved with its links still resolving reports no link change, and edges
83
+ * compare as distinct `(src, dst, type)` triples, so a link written twice
84
+ * counts once.
85
+ *
86
+ * A rename into `organize.archive_destination` from outside it is an archive,
87
+ * whether or not the destination is admitted; any other rename between two
88
+ * admitted paths is a move. A rename that leaves the admitted set is a removal
89
+ * and one that enters it is an addition, which is what each side shows.
90
+ */
91
+ export declare function diffGraphs(base: GraphSide, head: GraphSide, renames: RenameTable, config: StoreConfig): GraphDelta;
92
+ /** The full id of the commit `ref` names, or the error naming it. */
93
+ export declare function resolveCommit(git: GitRunner, cwd: string, ref: string, flag: '--since' | '--until'): Promise<string>;
94
+ /**
95
+ * review-the-knowledge-diff (D1): the head is `until` (HEAD when absent) and
96
+ * the base is the merge base of `since` and the head — the `<ref>...HEAD`
97
+ * meaning `publish urls --since` uses, so both pull-request sections describe
98
+ * one change set. A base id and a head id that descends from it resolve back
99
+ * to themselves, which is what makes the reported range re-runnable.
100
+ */
101
+ export declare function resolveRange(git: GitRunner, cwd: string, since: string, until: string | undefined): Promise<{
102
+ base: string;
103
+ head: string;
104
+ }>;
105
+ /**
106
+ * review-the-knowledge-diff (D3): git's renames between the two commits, with
107
+ * every knob that could change them pinned on the command line, so a user's
108
+ * `diff.renames`, `diff.renameLimit`, external diff driver or textconv filter
109
+ * cannot change the report. `--relative` makes the paths store-relative for a
110
+ * store rooted below the repository's top level.
111
+ */
112
+ export declare function readRenames(git: GitRunner, storeRoot: string, base: string, head: string): Promise<NoteRename[]>;
113
+ /**
114
+ * Both sides read from git's object store under the CURRENT configuration
115
+ * (D2), so a path that configuration excludes appears on neither side. No
116
+ * checkout, no stash, and nothing written — the per-checkout graph artifact is
117
+ * neither read nor rebuilt.
118
+ */
119
+ export declare function computeGraphDelta(git: GitRunner, storeRoot: string, range: {
120
+ base: string;
121
+ head: string;
122
+ }, config: StoreConfig): Promise<GraphDelta>;
123
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/core/graph/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAA0C,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9H,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAC;QAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAC/G,KAAK,EAAE;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,OAAO,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IACpD,QAAQ,EAAE;QAAE,UAAU,EAAE,YAAY,EAAE,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;IACnE,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAC7B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,wFAAwF;AACxF,MAAM,MAAM,WAAW,GAAG,SAAS,UAAU,EAAE,CAAC;AAEhD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEvD;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,CAsHlH;AAED,qEAAqE;AACrE,wBAAsB,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1H;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAMzC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBtH;AAOD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CAOrB"}
@@ -0,0 +1,253 @@
1
+ import { GraphDiffNoMergeBaseError, GraphDiffRefNotFoundError } from '../errors.js';
2
+ import { isStrictlyUnderPrefix, isUnderPrefix } from '../fs/prefix.js';
3
+ import { readFencedRegion } from '../fs/fenced-region.js';
4
+ import { SOURCES_FIELD } from '../ingest/identity.js';
5
+ import { hasRollupSection, ROLLUP_FENCE } from '../rollup.js';
6
+ import { buildGraphFromNotes, graphBuildOptions } from './model.js';
7
+ import { listNotesAtCommit } from './tree.js';
8
+ export function isEmptyDelta(delta) {
9
+ return Object.values(delta.counts).every((count) => count === 0);
10
+ }
11
+ function compareStrings(a, b) {
12
+ return a < b ? -1 : a > b ? 1 : 0;
13
+ }
14
+ function compareTuples(a, b) {
15
+ for (let i = 0; i < Math.min(a.length, b.length); i++) {
16
+ const order = compareStrings(a[i], b[i]);
17
+ if (order !== 0)
18
+ return order;
19
+ }
20
+ return a.length - b.length;
21
+ }
22
+ function sortBy(items, key) {
23
+ return items.sort((a, b) => compareTuples(key(a), key(b)));
24
+ }
25
+ const edgeKey = (edge) => [edge.src, edge.dst, edge.type].join('\0');
26
+ const danglingKey = (link) => [link.from, link.target, link.reason].join('\0');
27
+ /** The rollup region's text, or null when the note has none. A malformed fence reads as its whole body, so any edit to it still shows. */
28
+ function rollupRegion(note) {
29
+ if (note === undefined || !hasRollupSection(note))
30
+ return null;
31
+ try {
32
+ return readFencedRegion(note.body, ROLLUP_FENCE).join('\n');
33
+ }
34
+ catch {
35
+ return note.body;
36
+ }
37
+ }
38
+ /** The provenance field's entries; a lone string is one entry, anything else none. */
39
+ function sourcesOf(note) {
40
+ const value = note?.frontmatter?.[SOURCES_FIELD];
41
+ if (Array.isArray(value))
42
+ return value.map((entry) => String(entry));
43
+ if (typeof value === 'string')
44
+ return [value];
45
+ return [];
46
+ }
47
+ function inboundOf(edges) {
48
+ const inbound = new Map();
49
+ for (const edge of edges) {
50
+ const sources = inbound.get(edge.dst) ?? new Set();
51
+ sources.add(edge.src);
52
+ inbound.set(edge.dst, sources);
53
+ }
54
+ return inbound;
55
+ }
56
+ /**
57
+ * review-the-knowledge-diff (D3): the delta between two built sides. Every
58
+ * base-side path is carried through the moves and archives first, so a note
59
+ * that moved with its links still resolving reports no link change, and edges
60
+ * compare as distinct `(src, dst, type)` triples, so a link written twice
61
+ * counts once.
62
+ *
63
+ * A rename into `organize.archive_destination` from outside it is an archive,
64
+ * whether or not the destination is admitted; any other rename between two
65
+ * admitted paths is a move. A rename that leaves the admitted set is a removal
66
+ * and one that enters it is an addition, which is what each side shows.
67
+ */
68
+ export function diffGraphs(base, head, renames, config) {
69
+ const baseNotes = new Map(base.notes.map((note) => [note.path, note]));
70
+ const headNotes = new Map(head.notes.map((note) => [note.path, note]));
71
+ const destination = config.organize.archive_destination;
72
+ const moved = [];
73
+ const archived = [];
74
+ for (const rename of renames) {
75
+ if (!baseNotes.has(rename.from))
76
+ continue;
77
+ if (isStrictlyUnderPrefix(rename.to, destination) && !isUnderPrefix(rename.from, destination))
78
+ archived.push(rename);
79
+ else if (headNotes.has(rename.to))
80
+ moved.push(rename);
81
+ }
82
+ const forward = new Map([...moved, ...archived].map((rename) => [rename.from, rename.to]));
83
+ const backward = new Map([...moved, ...archived].map((rename) => [rename.to, rename.from]));
84
+ const mapPath = (basePath) => forward.get(basePath) ?? basePath;
85
+ const baseOf = (headPath) => baseNotes.get(backward.get(headPath) ?? headPath);
86
+ const mappedBasePaths = new Set(base.notes.map((note) => mapPath(note.path)));
87
+ const added = head.notes.map((note) => note.path).filter((notePath) => !mappedBasePaths.has(notePath));
88
+ const removed = base.notes
89
+ .map((note) => note.path)
90
+ .filter((notePath) => !forward.has(notePath) && !headNotes.has(notePath));
91
+ const modified = head.notes
92
+ .filter((note) => mappedBasePaths.has(note.path) && baseOf(note.path).blob !== note.blob)
93
+ .map((note) => note.path);
94
+ const baseEdges = new Map();
95
+ for (const edge of base.graph.edges) {
96
+ const mapped = { src: mapPath(edge.src), dst: mapPath(edge.dst), type: edge.type };
97
+ baseEdges.set(edgeKey(mapped), mapped);
98
+ }
99
+ const headEdges = new Map(head.graph.edges.map((edge) => [edgeKey(edge), { ...edge }]));
100
+ const linksAdded = [...headEdges].filter(([key]) => !baseEdges.has(key)).map(([, edge]) => edge);
101
+ const linksRemoved = [...baseEdges].filter(([key]) => !headEdges.has(key)).map(([, edge]) => edge);
102
+ const baseDangling = new Map(base.graph.dangling.map((link) => {
103
+ const mapped = { ...link, from: mapPath(link.from) };
104
+ return [danglingKey(mapped), mapped];
105
+ }));
106
+ const headDangling = new Map(head.graph.dangling.map((link) => [danglingKey(link), { ...link }]));
107
+ const introduced = [...headDangling].filter(([key]) => !baseDangling.has(key)).map(([, link]) => link);
108
+ // A dangling link that left with its note was removed, not resolved: only a source still present can resolve one.
109
+ const resolved = [...baseDangling]
110
+ .filter(([key, link]) => !headDangling.has(key) && headNotes.has(link.from))
111
+ .map(([, link]) => link);
112
+ const baseInbound = inboundOf(baseEdges.values());
113
+ const headInbound = inboundOf(headEdges.values());
114
+ const inbound = [];
115
+ for (const target of new Set([...baseInbound.keys(), ...headInbound.keys()])) {
116
+ const before = baseInbound.get(target) ?? new Set();
117
+ const after = headInbound.get(target) ?? new Set();
118
+ const gained = [...after].filter((source) => !before.has(source)).sort(compareStrings);
119
+ const lost = [...before].filter((source) => !after.has(source)).sort(compareStrings);
120
+ if (gained.length === 0 && lost.length === 0)
121
+ continue;
122
+ const headNote = headNotes.get(target);
123
+ inbound.push({ path: target, gained, lost, rollup: headNote !== undefined && hasRollupSection(headNote) });
124
+ }
125
+ const rollups = [];
126
+ for (const note of head.notes) {
127
+ const before = rollupRegion(baseOf(note.path));
128
+ const after = rollupRegion(note);
129
+ if (before === after)
130
+ continue;
131
+ rollups.push({ path: note.path, change: before === null ? 'added' : after === null ? 'removed' : 'changed' });
132
+ }
133
+ for (const note of base.notes) {
134
+ if (headNotes.has(mapPath(note.path)) || rollupRegion(note) === null)
135
+ continue;
136
+ rollups.push({ path: note.path, change: 'removed' });
137
+ }
138
+ const sources = [];
139
+ for (const notePath of [...added, ...modified]) {
140
+ const before = new Set(sourcesOf(baseOf(notePath)));
141
+ const cited = [...new Set(sourcesOf(headNotes.get(notePath)))].filter((entry) => !before.has(entry)).sort(compareStrings);
142
+ if (cited.length > 0)
143
+ sources.push({ path: notePath, cited });
144
+ }
145
+ const delta = {
146
+ base: base.commit,
147
+ head: head.commit,
148
+ counts: {
149
+ notes_added: added.length,
150
+ notes_removed: removed.length,
151
+ notes_modified: modified.length,
152
+ notes_moved: moved.length,
153
+ notes_archived: archived.length,
154
+ links_added: linksAdded.length,
155
+ links_removed: linksRemoved.length,
156
+ dangling_introduced: introduced.length,
157
+ dangling_resolved: resolved.length,
158
+ inbound_changed: inbound.length,
159
+ rollups_touched: rollups.length,
160
+ sources_cited: sources.length,
161
+ },
162
+ notes: {
163
+ added: added.sort(compareStrings),
164
+ removed: removed.sort(compareStrings),
165
+ modified: modified.sort(compareStrings),
166
+ moved: sortBy(moved, (r) => [r.from, r.to]),
167
+ archived: sortBy(archived, (r) => [r.from, r.to]),
168
+ },
169
+ links: {
170
+ added: sortBy(linksAdded, (e) => [e.src, e.dst, e.type]),
171
+ removed: sortBy(linksRemoved, (e) => [e.src, e.dst, e.type]),
172
+ },
173
+ dangling: {
174
+ introduced: sortBy(introduced, (d) => [d.from, d.target, d.reason]),
175
+ resolved: sortBy(resolved, (d) => [d.from, d.target, d.reason]),
176
+ },
177
+ inbound: sortBy(inbound, (i) => [i.path]),
178
+ rollups: sortBy(rollups, (r) => [r.path, r.change]),
179
+ sources: sortBy(sources, (s) => [s.path]),
180
+ };
181
+ return delta;
182
+ }
183
+ /** The full id of the commit `ref` names, or the error naming it. */
184
+ export async function resolveCommit(git, cwd, ref, flag) {
185
+ const result = await git.run(['rev-parse', '--verify', '--quiet', '--end-of-options', `${ref}^{commit}`], { cwd, allowFailure: true });
186
+ if (result.exitCode !== 0)
187
+ throw new GraphDiffRefNotFoundError(flag, ref);
188
+ return result.stdout.trim();
189
+ }
190
+ /**
191
+ * review-the-knowledge-diff (D1): the head is `until` (HEAD when absent) and
192
+ * the base is the merge base of `since` and the head — the `<ref>...HEAD`
193
+ * meaning `publish urls --since` uses, so both pull-request sections describe
194
+ * one change set. A base id and a head id that descends from it resolve back
195
+ * to themselves, which is what makes the reported range re-runnable.
196
+ */
197
+ export async function resolveRange(git, cwd, since, until) {
198
+ const sinceCommit = await resolveCommit(git, cwd, since, '--since');
199
+ const head = await resolveCommit(git, cwd, until ?? 'HEAD', '--until');
200
+ const result = await git.run(['merge-base', sinceCommit, head], { cwd, allowFailure: true });
201
+ if (result.exitCode !== 0)
202
+ throw new GraphDiffNoMergeBaseError(since, until ?? 'HEAD');
203
+ return { base: result.stdout.trim(), head };
204
+ }
205
+ /**
206
+ * review-the-knowledge-diff (D3): git's renames between the two commits, with
207
+ * every knob that could change them pinned on the command line, so a user's
208
+ * `diff.renames`, `diff.renameLimit`, external diff driver or textconv filter
209
+ * cannot change the report. `--relative` makes the paths store-relative for a
210
+ * store rooted below the repository's top level.
211
+ */
212
+ export async function readRenames(git, storeRoot, base, head) {
213
+ const { stdout } = await git.run([
214
+ '-c', 'diff.renameLimit=0',
215
+ '-c', 'diff.renames=true',
216
+ 'diff', '--name-status', '-z', '--relative', '-M50%', '--no-ext-diff', '--no-textconv',
217
+ base, head, '--',
218
+ ], { cwd: storeRoot });
219
+ const fields = stdout.split('\0');
220
+ const renames = [];
221
+ for (let i = 0; i < fields.length; i++) {
222
+ const code = fields[i];
223
+ if (code === '')
224
+ continue;
225
+ if (code.startsWith('R') || code.startsWith('C')) {
226
+ if (code.startsWith('R'))
227
+ renames.push({ from: fields[i + 1], to: fields[i + 2] });
228
+ i += 2;
229
+ continue;
230
+ }
231
+ i += 1;
232
+ }
233
+ return renames;
234
+ }
235
+ async function readSide(git, storeRoot, commit, config) {
236
+ const notes = await listNotesAtCommit(git, storeRoot, commit, config);
237
+ return { commit, notes, graph: buildGraphFromNotes(notes, graphBuildOptions(config)) };
238
+ }
239
+ /**
240
+ * Both sides read from git's object store under the CURRENT configuration
241
+ * (D2), so a path that configuration excludes appears on neither side. No
242
+ * checkout, no stash, and nothing written — the per-checkout graph artifact is
243
+ * neither read nor rebuilt.
244
+ */
245
+ export async function computeGraphDelta(git, storeRoot, range, config) {
246
+ const [base, head, renames] = await Promise.all([
247
+ readSide(git, storeRoot, range.base, config),
248
+ readSide(git, storeRoot, range.head, config),
249
+ readRenames(git, storeRoot, range.base, range.head),
250
+ ]);
251
+ return diffGraphs(base, head, renames, config);
252
+ }
253
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/core/graph/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { StoreConfig } from '../../config/schema.js';
2
+ import { type GitRunner } from '../git/exec.js';
3
+ import { type Note } from '../notes/list.js';
4
+ /** A note read from a commit, with the blob it was read from, so two sides compare by object id rather than by text. */
5
+ export interface CommitNote extends Note {
6
+ blob: string;
7
+ }
8
+ /**
9
+ * The store root's path below the repository's top level, "/"-terminated, or
10
+ * "" when the store is the top level — the prefix every tree path carries and
11
+ * every reported path drops.
12
+ */
13
+ export declare function storePrefix(git: GitRunner, storeRoot: string): Promise<string>;
14
+ /**
15
+ * review-the-knowledge-diff (D2): the notes a commit holds, enumerated by the
16
+ * same admission rule `listNotes` applies to the filesystem and read through
17
+ * git's object store, so neither side of a graph diff needs a checkout, and
18
+ * the working tree's uncommitted or untracked files never enter it.
19
+ *
20
+ * Paths are relative to the store root and sorted, matching `listNotes`.
21
+ * Writes nothing.
22
+ */
23
+ export declare function listNotesAtCommit(git: GitRunner, storeRoot: string, commit: string, config: StoreConfig): Promise<CommitNote[]>;
24
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/core/graph/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG5D,wHAAwH;AACxH,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,MAAM,CAAC;CACd;AAKD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpF;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAmBrI"}
@@ -0,0 +1,45 @@
1
+ import { readBlobs } from '../git/exec.js';
2
+ import { noteAdmission } from '../notes/list.js';
3
+ import { parseNoteText } from '../notes/parse.js';
4
+ /** A regular-file or executable blob; a symlink (`120000`) is skipped, as the filesystem walk's `isFile()` skips one. */
5
+ const FILE_MODES = new Set(['100644', '100755']);
6
+ /**
7
+ * The store root's path below the repository's top level, "/"-terminated, or
8
+ * "" when the store is the top level — the prefix every tree path carries and
9
+ * every reported path drops.
10
+ */
11
+ export async function storePrefix(git, storeRoot) {
12
+ const { stdout } = await git.run(['rev-parse', '--show-prefix'], { cwd: storeRoot });
13
+ return stdout.replace(/\n$/, '');
14
+ }
15
+ /**
16
+ * review-the-knowledge-diff (D2): the notes a commit holds, enumerated by the
17
+ * same admission rule `listNotes` applies to the filesystem and read through
18
+ * git's object store, so neither side of a graph diff needs a checkout, and
19
+ * the working tree's uncommitted or untracked files never enter it.
20
+ *
21
+ * Paths are relative to the store root and sorted, matching `listNotes`.
22
+ * Writes nothing.
23
+ */
24
+ export async function listNotesAtCommit(git, storeRoot, commit, config) {
25
+ const prefix = await storePrefix(git, storeRoot);
26
+ const pathspec = prefix === '' ? [] : ['--', prefix];
27
+ const { stdout } = await git.run(['ls-tree', '-r', '-z', '--full-tree', commit, ...pathspec], { cwd: storeRoot });
28
+ const admits = noteAdmission(config);
29
+ const admitted = [];
30
+ for (const record of stdout.split('\0')) {
31
+ if (record === '')
32
+ continue;
33
+ const tab = record.indexOf('\t');
34
+ const [mode, type, blob] = record.slice(0, tab).split(' ');
35
+ if (type !== 'blob' || !FILE_MODES.has(mode))
36
+ continue;
37
+ const relativePath = record.slice(tab + 1).slice(prefix.length);
38
+ if (admits(relativePath))
39
+ admitted.push({ path: relativePath, blob: blob });
40
+ }
41
+ admitted.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
42
+ const texts = await readBlobs(storeRoot, admitted.map((entry) => entry.blob));
43
+ return admitted.map((entry) => ({ ...parseNoteText(texts.get(entry.blob), entry.path), blob: entry.blob }));
44
+ }
45
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/core/graph/tree.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,16 @@ export interface Note {
17
17
  */
18
18
  export { isUnderAnyPrefix } from '../fs/prefix.js';
19
19
  export declare function excludedPrefixesFor(config: StoreConfig): string[];
20
+ /**
21
+ * review-the-knowledge-diff (D2): the note-admission rule as one pure
22
+ * predicate over a store-relative, "/"-separated path, so the git-tree
23
+ * enumeration (`graph/tree.ts`) admits exactly what the filesystem walk does.
24
+ * Built once per enumeration: the exclusion list and the harness entry files
25
+ * are resolved here, not per path.
26
+ */
27
+ export declare function noteAdmission(config: StoreConfig): (relativePath: string) => boolean;
28
+ /** The single-path form of `noteAdmission`, for a caller holding one path. */
29
+ export declare function admitsNotePath(relativePath: string, config: StoreConfig): boolean;
20
30
  /**
21
31
  * retain-captures-as-provenance: every markdown capture in the tier, which is
22
32
  * exactly the set `listNotes` refuses to return — the capture root is a
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/core/notes/list.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAmCD;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAmBjE;AAkCD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAM1F;AAED,wGAAwG;AACxG,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAO9G"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/core/notes/list.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,IAAI;IACnB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;CACd;AAmCD;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAmBjE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAEpF;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjF;AA8CD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAM1F;AAED,wGAAwG;AACxG,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAQ9G"}
@@ -13,7 +13,7 @@ const ALWAYS_SKIP_DIRS = new Set(['.git', '.githooks', '.queue']);
13
13
  * generates: the store root's own `AGENTS.md` (`agents-doc.ts` hardcodes
14
14
  * `path.join(root, 'AGENTS.md')`, never a nested path). A same-named file
15
15
  * anywhere else is ordinary content an operator happened to name AGENTS.md
16
- * — the walk below applies this root-only, the same way it treats a
16
+ * — the admission predicate below applies this root-only, the same way it treats a
17
17
  * harness's own entry filename (`skipRootFiles`, right below).
18
18
  */
19
19
  const ALWAYS_SKIP_FILES = new Set(['AGENTS.md']);
@@ -60,7 +60,34 @@ export function excludedPrefixesFor(config) {
60
60
  config.organize.log_path ?? DEFAULT_LOG_PATH,
61
61
  ];
62
62
  }
63
- async function walk(dir, root, excludePrefixes, skipRootFiles, results) {
63
+ /**
64
+ * review-the-knowledge-diff (D2): the note-admission rule as one pure
65
+ * predicate over a store-relative, "/"-separated path, so the git-tree
66
+ * enumeration (`graph/tree.ts`) admits exactly what the filesystem walk does.
67
+ * Built once per enumeration: the exclusion list and the harness entry files
68
+ * are resolved here, not per path.
69
+ */
70
+ export function noteAdmission(config) {
71
+ return pathAdmission(excludedPrefixesFor(config), harnessEntryFiles(config));
72
+ }
73
+ /** The single-path form of `noteAdmission`, for a caller holding one path. */
74
+ export function admitsNotePath(relativePath, config) {
75
+ return noteAdmission(config)(relativePath);
76
+ }
77
+ function pathAdmission(excludePrefixes, skipRootFiles) {
78
+ return (relativePath) => {
79
+ const segments = relativePath.split('/');
80
+ const name = segments[segments.length - 1];
81
+ if (!name.endsWith('.md'))
82
+ return false;
83
+ if (segments.slice(0, -1).some((segment) => ALWAYS_SKIP_DIRS.has(segment)))
84
+ return false;
85
+ if (segments.length === 1 && (ALWAYS_SKIP_FILES.has(name) || skipRootFiles.has(name)))
86
+ return false;
87
+ return !isUnderAnyPrefix(relativePath, excludePrefixes);
88
+ };
89
+ }
90
+ async function walk(dir, root, excludePrefixes, admits, results) {
64
91
  let entries;
65
92
  try {
66
93
  entries = await readdir(dir, { withFileTypes: true });
@@ -74,19 +101,14 @@ async function walk(dir, root, excludePrefixes, skipRootFiles, results) {
74
101
  const fullPath = path.join(dir, entry.name);
75
102
  const relativePath = path.relative(root, fullPath).split(path.sep).join('/');
76
103
  if (entry.isDirectory()) {
104
+ // Pruning only: `admits` would refuse every file beneath; this skips reading them.
77
105
  if (ALWAYS_SKIP_DIRS.has(entry.name))
78
106
  continue;
79
107
  if (isUnderAnyPrefix(relativePath, excludePrefixes))
80
108
  continue;
81
- await walk(fullPath, root, excludePrefixes, skipRootFiles, results);
109
+ await walk(fullPath, root, excludePrefixes, admits, results);
82
110
  }
83
- else if (entry.isFile() && entry.name.endsWith('.md')) {
84
- if (relativePath === entry.name && ALWAYS_SKIP_FILES.has(entry.name))
85
- continue;
86
- if (relativePath === entry.name && skipRootFiles.has(entry.name))
87
- continue;
88
- if (isUnderAnyPrefix(relativePath, excludePrefixes))
89
- continue;
111
+ else if (entry.isFile() && admits(relativePath)) {
90
112
  results.push(relativePath);
91
113
  }
92
114
  }
@@ -106,14 +128,15 @@ async function walk(dir, root, excludePrefixes, skipRootFiles, results) {
106
128
  export async function listCaptures(storeRoot, config) {
107
129
  const captureRoot = path.join(storeRoot, config.ingest.capture_root);
108
130
  const relativePaths = [];
109
- await walk(captureRoot, storeRoot, [], new Set(), relativePaths);
131
+ await walk(captureRoot, storeRoot, [], pathAdmission([], new Set()), relativePaths);
110
132
  relativePaths.sort();
111
133
  return Promise.all(relativePaths.map((relativePath) => parseNote(path.join(storeRoot, relativePath), relativePath)));
112
134
  }
113
135
  /** Every retrievable note in the store: everything under a .md path, minus every declared exclusion. */
114
136
  export async function listNotes(storeRoot, config, query = {}) {
115
137
  const relativePaths = [];
116
- await walk(storeRoot, storeRoot, excludedPrefixesFor(config), harnessEntryFiles(config), relativePaths);
138
+ const excludePrefixes = excludedPrefixesFor(config);
139
+ await walk(storeRoot, storeRoot, excludePrefixes, pathAdmission(excludePrefixes, harnessEntryFiles(config)), relativePaths);
117
140
  relativePaths.sort();
118
141
  const scoped = query.underPrefix ? relativePaths.filter((p) => isUnderAnyPrefix(p, [query.underPrefix])) : relativePaths;
119
142
  return Promise.all(scoped.map((relativePath) => parseNote(path.join(storeRoot, relativePath), relativePath)));
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/core/notes/list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/core/notes/list.ts"],"names":[],"mappings":"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"}