grounder 0.4.0 → 0.5.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.
- package/README.md +148 -270
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +2 -1
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +2 -1
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/hook-runtime.d.ts +3 -3
- package/dist/agents/hook-runtime.js +4 -4
- package/dist/agents/hook-runtime.js.map +1 -1
- package/dist/cli.js +11 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply-agent-installs.d.ts +2 -2
- package/dist/commands/apply-agent-installs.d.ts.map +1 -1
- package/dist/commands/apply-agent-installs.js +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +7 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts +23 -13
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +28 -16
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff.d.ts +2 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +10 -1
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/link.d.ts +12 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/{repo/init.js → link.js} +35 -27
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.js +3 -5
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/note/list.d.ts +17 -9
- package/dist/commands/note/list.d.ts.map +1 -1
- package/dist/commands/note/list.js +19 -14
- package/dist/commands/note/list.js.map +1 -1
- package/dist/commands/note.d.ts +2 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +10 -1
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/output.d.ts +22 -2
- package/dist/commands/output.d.ts.map +1 -1
- package/dist/commands/output.js +18 -6
- package/dist/commands/output.js.map +1 -1
- package/dist/commands/plan/list.d.ts +20 -12
- package/dist/commands/plan/list.d.ts.map +1 -1
- package/dist/commands/plan/list.js +22 -17
- package/dist/commands/plan/list.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +12 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/require-linked.js +2 -2
- package/dist/commands/require-linked.js.map +1 -1
- package/dist/commands/search.d.ts +23 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +277 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/{vault/init.d.ts → setup.d.ts} +5 -4
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +137 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +24 -15
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade-banner.d.ts +2 -2
- package/dist/commands/upgrade-banner.js +2 -2
- package/dist/connector/home.d.ts +12 -0
- package/dist/connector/home.d.ts.map +1 -1
- package/dist/connector/home.js +26 -2
- package/dist/connector/home.js.map +1 -1
- package/dist/connector/state.d.ts +1 -1
- package/dist/connector/state.d.ts.map +1 -1
- package/dist/connector/vault.d.ts +2 -0
- package/dist/connector/vault.d.ts.map +1 -1
- package/dist/connector/vault.js +6 -1
- package/dist/connector/vault.js.map +1 -1
- package/dist/help.d.ts +3 -3
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +70 -51
- package/dist/help.js.map +1 -1
- package/dist/util/frontmatter.d.ts +9 -7
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/frontmatter.js +29 -4
- package/dist/util/frontmatter.js.map +1 -1
- package/dist/util/path.d.ts +23 -0
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +39 -0
- package/dist/util/path.js.map +1 -1
- package/dist/vault/list-handoffs.d.ts +3 -1
- package/dist/vault/list-handoffs.d.ts.map +1 -1
- package/dist/vault/list-handoffs.js +17 -15
- package/dist/vault/list-handoffs.js.map +1 -1
- package/dist/vault/list-markdown.d.ts +8 -0
- package/dist/vault/list-markdown.d.ts.map +1 -0
- package/dist/vault/list-markdown.js +35 -0
- package/dist/vault/list-markdown.js.map +1 -0
- package/dist/vault/list-notes.d.ts +5 -5
- package/dist/vault/list-notes.d.ts.map +1 -1
- package/dist/vault/list-notes.js +12 -22
- package/dist/vault/list-notes.js.map +1 -1
- package/dist/vault/list-plans.d.ts +2 -2
- package/dist/vault/list-plans.d.ts.map +1 -1
- package/dist/vault/list-plans.js +9 -19
- package/dist/vault/list-plans.js.map +1 -1
- package/dist/vault/search.d.ts +55 -0
- package/dist/vault/search.d.ts.map +1 -0
- package/dist/vault/search.js +328 -0
- package/dist/vault/search.js.map +1 -0
- package/dist/vault/write-handoff.d.ts +2 -0
- package/dist/vault/write-handoff.d.ts.map +1 -1
- package/dist/vault/write-handoff.js +5 -0
- package/dist/vault/write-handoff.js.map +1 -1
- package/dist/vault/write-note.d.ts +2 -0
- package/dist/vault/write-note.d.ts.map +1 -1
- package/dist/vault/write-note.js +9 -1
- package/dist/vault/write-note.js.map +1 -1
- package/dist/vault/write-plan.d.ts +4 -0
- package/dist/vault/write-plan.d.ts.map +1 -1
- package/dist/vault/write-plan.js +14 -1
- package/dist/vault/write-plan.js.map +1 -1
- package/package.json +10 -3
- package/templates/agents/claude/commands/grounder-note.md +6 -2
- package/templates/agents/claude/commands/grounder-plan.md +7 -5
- package/templates/agents/claude/commands/grounder-search.md +144 -0
- package/templates/agents/claude/commands/grounder-task-handoff.md +5 -1
- package/templates/agents/claude/commands/grounder-task.md +2 -2
- package/templates/agents/cursor/commands/grounder-note.md +6 -2
- package/templates/agents/cursor/commands/grounder-plan.md +7 -5
- package/templates/agents/cursor/commands/grounder-search.md +144 -0
- package/templates/agents/cursor/commands/grounder-task-handoff.md +5 -1
- package/templates/agents/cursor/commands/grounder-task.md +2 -2
- package/dist/commands/repo/init.d.ts +0 -11
- package/dist/commands/repo/init.d.ts.map +0 -1
- package/dist/commands/repo/init.js.map +0 -1
- package/dist/commands/vault/init.d.ts.map +0 -1
- package/dist/commands/vault/init.js +0 -90
- package/dist/commands/vault/init.js.map +0 -1
package/dist/help.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** Help tiers and command metadata for the grounder CLI. */
|
|
2
|
-
const GROUP_ORDER = ["Setup", "Write", "Paths", "Maintain", "Advanced"];
|
|
2
|
+
const GROUP_ORDER = ["Setup", "Write", "Retrieve", "Paths", "Maintain", "Advanced"];
|
|
3
3
|
const QUICKSTART = `Quickstart:
|
|
4
|
-
grounder
|
|
5
|
-
grounder
|
|
4
|
+
grounder setup <path-to-your-vault>
|
|
5
|
+
grounder link
|
|
6
6
|
grounder note "my first note"
|
|
7
7
|
grounder handoff $'# Handoff\\n\\n## Next\\n1. …'
|
|
8
8
|
grounder handoff list
|
|
@@ -14,109 +14,127 @@ const QUICKSTART = `Quickstart:
|
|
|
14
14
|
*/
|
|
15
15
|
export const COMMANDS = [
|
|
16
16
|
{
|
|
17
|
-
id: "
|
|
17
|
+
id: "setup",
|
|
18
18
|
group: "Setup",
|
|
19
|
-
summary: "
|
|
20
|
-
listUsage: "
|
|
21
|
-
usage: "grounder
|
|
22
|
-
list: false,
|
|
23
|
-
flags: `Subcommands:
|
|
24
|
-
vault init Initialize vault + home config (once per machine)`,
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: "vault init",
|
|
28
|
-
group: "Setup",
|
|
29
|
-
summary: "Initialize vault + home config (once per machine)",
|
|
30
|
-
listUsage: "vault init <path>",
|
|
31
|
-
usage: "grounder vault init <path> [--yes] [--force] [--agent <id>] [--hooks]",
|
|
19
|
+
summary: "Connect to a markdown vault (once per machine)",
|
|
20
|
+
listUsage: "setup <path>",
|
|
21
|
+
usage: "grounder setup <path> [--yes] [--force] [--agent <id>] [--hooks] [--dry-run]",
|
|
32
22
|
flags: `Flags:
|
|
33
23
|
--yes Skip confirmation prompts
|
|
34
24
|
--force Overwrite existing home config / generated files
|
|
35
25
|
--agent <id> Install for a specific agent (repeatable; default: auto-detect)
|
|
36
26
|
Supported: cursor, claude
|
|
37
|
-
--hooks Also install session-start teaser hooks
|
|
27
|
+
--hooks Also install session-start teaser hooks
|
|
28
|
+
--dry-run Preview without writing`,
|
|
38
29
|
},
|
|
39
30
|
{
|
|
40
|
-
id: "
|
|
31
|
+
id: "link",
|
|
41
32
|
group: "Setup",
|
|
42
|
-
summary: "
|
|
43
|
-
listUsage: "
|
|
44
|
-
usage: "grounder
|
|
33
|
+
summary: "Link this project inside the markdown vault (once per project)",
|
|
34
|
+
listUsage: "link",
|
|
35
|
+
usage: "grounder link [--yes] [--force] [--id <id>] [--vault <path>] [--dry-run]",
|
|
45
36
|
flags: `Flags:
|
|
46
37
|
--yes Skip confirmation prompts
|
|
47
38
|
--force Overwrite an existing link marker
|
|
48
39
|
--id <id> Override detected project id
|
|
49
|
-
--vault <path> Override home vault root for this run
|
|
40
|
+
--vault <path> Override home vault root for this run
|
|
41
|
+
--dry-run Preview without writing`,
|
|
50
42
|
},
|
|
51
43
|
{
|
|
52
44
|
id: "note",
|
|
53
45
|
group: "Write",
|
|
54
46
|
summary: "Write a note to the vault",
|
|
55
47
|
listUsage: "note <text>",
|
|
56
|
-
usage: "grounder note <text> [--title <slug>]",
|
|
48
|
+
usage: "grounder note <text> [--title <slug>] [--topics <list>]",
|
|
57
49
|
flags: `Flags:
|
|
58
|
-
--title <slug>
|
|
50
|
+
--title <slug> Short slug in filename (default: slugified first line)
|
|
51
|
+
--topics <list> Comma-separated keywords for search (e.g. "auth,jwt,session")
|
|
59
52
|
|
|
60
53
|
Subcommands:
|
|
61
|
-
note list Print recent notes
|
|
54
|
+
note list Print recent notes under notes/** (bucket-relative titles, newest first)`,
|
|
62
55
|
},
|
|
63
56
|
{
|
|
64
57
|
id: "note list",
|
|
65
58
|
group: "Write",
|
|
66
|
-
summary: "Print recent notes
|
|
59
|
+
summary: "Print recent notes under notes/** (bucket-relative titles, newest first)",
|
|
67
60
|
listUsage: "note list",
|
|
68
|
-
usage: "grounder note list [--limit <n>]",
|
|
61
|
+
usage: "grounder note list [--limit <n>] [--markdown]",
|
|
69
62
|
flags: `Flags:
|
|
70
|
-
--limit <n> Max notes to print (default: 5)
|
|
63
|
+
--limit <n> Max notes to print (default: 5)
|
|
64
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
65
|
+
(lists notes/**; nested e.g. feature/name.md)`,
|
|
71
66
|
},
|
|
72
67
|
{
|
|
73
68
|
id: "handoff",
|
|
74
69
|
group: "Write",
|
|
75
70
|
summary: "Write a session handoff to vault logs/",
|
|
76
71
|
listUsage: "handoff <text>",
|
|
77
|
-
usage: "grounder handoff <text> [--title <slug>]",
|
|
72
|
+
usage: "grounder handoff <text> [--title <slug>] [--topics <list>]",
|
|
78
73
|
flags: `Flags:
|
|
79
|
-
--title <slug>
|
|
74
|
+
--title <slug> Short slug in filename (default: slugified first line)
|
|
75
|
+
--topics <list> Comma-separated keywords for search (e.g. "auth,jwt,session")
|
|
80
76
|
|
|
81
77
|
Subcommands:
|
|
82
|
-
handoff list Print recent handoffs
|
|
78
|
+
handoff list Print recent handoffs under logs/** (bucket-relative titles, newest first)
|
|
83
79
|
handoff peek One-line latest-handoff teaser (session hooks)`,
|
|
84
80
|
},
|
|
85
81
|
{
|
|
86
82
|
id: "handoff list",
|
|
87
83
|
group: "Write",
|
|
88
|
-
summary: "Print recent handoffs
|
|
84
|
+
summary: "Print recent handoffs under logs/** (bucket-relative titles, newest first)",
|
|
89
85
|
listUsage: "handoff list",
|
|
90
|
-
usage: "grounder handoff list [--limit <n>] [--head]",
|
|
86
|
+
usage: "grounder handoff list [--limit <n>] [--head] [--markdown]",
|
|
91
87
|
flags: `Flags:
|
|
92
88
|
--limit <n> Max handoffs to print (default: 5)
|
|
93
89
|
--head Print only the newest usable path
|
|
94
|
-
(skips empty/unreadable files; same pick as handoff peek)
|
|
90
|
+
(skips empty/unreadable files; same pick as handoff peek)
|
|
91
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
92
|
+
(lists logs/**; nested e.g. feature/name.md; not with --head)`,
|
|
95
93
|
},
|
|
96
94
|
{
|
|
97
95
|
id: "plan",
|
|
98
96
|
group: "Write",
|
|
99
97
|
summary: "Write/update a named plan under vault plans/",
|
|
100
98
|
listUsage: "plan <text>",
|
|
101
|
-
usage: "grounder plan <text> (--title <name> [--force] | --path <file>)",
|
|
99
|
+
usage: "grounder plan <text> (--title <name> [--force] | --path <file>) [--topics <list>]",
|
|
102
100
|
flags: `Flags:
|
|
103
|
-
--title <name>
|
|
104
|
-
|
|
105
|
-
--path <file>
|
|
106
|
-
|
|
107
|
-
--force
|
|
101
|
+
--title <name> Required filename stem when creating/updating by name
|
|
102
|
+
(trailing .md ok; sanitized, max 80 chars)
|
|
103
|
+
--path <file> Update an existing plan by path (must resolve under this
|
|
104
|
+
project's plans/; no title sanitization; always overwrites)
|
|
105
|
+
--force With --title: overwrite an existing plan (preserves created)
|
|
106
|
+
--topics <list> Comma-separated keywords for search (e.g. "caching,redis,api").
|
|
107
|
+
On update, omit to keep existing topics.
|
|
108
108
|
|
|
109
109
|
Subcommands:
|
|
110
|
-
plan list Print recent plans
|
|
110
|
+
plan list Print recent plans under plans/** (bucket-relative titles, newest first)`,
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
113
|
id: "plan list",
|
|
114
114
|
group: "Write",
|
|
115
|
-
summary: "Print recent plans
|
|
115
|
+
summary: "Print recent plans under plans/** (bucket-relative titles, newest first)",
|
|
116
116
|
listUsage: "plan list",
|
|
117
|
-
usage: "grounder plan list [--limit <n>]",
|
|
117
|
+
usage: "grounder plan list [--limit <n>] [--markdown]",
|
|
118
|
+
flags: `Flags:
|
|
119
|
+
--limit <n> Max plans to print (default: 5)
|
|
120
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
121
|
+
(lists plans/**; nested e.g. migration/cutover.md)`,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "search",
|
|
125
|
+
group: "Retrieve",
|
|
126
|
+
summary: "Search linked project vault for keywords (scoped retrieval)",
|
|
127
|
+
listUsage: "search <query>",
|
|
128
|
+
usage: "grounder search <query> [--terms <csv>] [--limit <n>] [--max-hits <n>] [--context <n>] [--since <date>] [--markdown] [--json]",
|
|
118
129
|
flags: `Flags:
|
|
119
|
-
--
|
|
130
|
+
--terms <csv> Extra keyword variants (comma-separated)
|
|
131
|
+
--limit <n> Max files to print (default: 10)
|
|
132
|
+
--max-hits <n> Max stored line snippets per file during scan (default: 50)
|
|
133
|
+
--context <n> Context lines around each snippet (default: 1)
|
|
134
|
+
--since <date> Only files modified on or after date (YYYY-MM-DD local midnight, or Nd, e.g. 7d)
|
|
135
|
+
--after <date> Alias for --since
|
|
136
|
+
--markdown Agent relay: file:// links + fenced snippets
|
|
137
|
+
--json Structured output (relativePath, fileUri, alsoMatchedHint per hit)`,
|
|
120
138
|
},
|
|
121
139
|
{
|
|
122
140
|
id: "path notes",
|
|
@@ -204,7 +222,7 @@ Examples:
|
|
|
204
222
|
grounder help
|
|
205
223
|
grounder help note
|
|
206
224
|
grounder help handoff list
|
|
207
|
-
grounder help
|
|
225
|
+
grounder help setup`,
|
|
208
226
|
},
|
|
209
227
|
];
|
|
210
228
|
/**
|
|
@@ -212,9 +230,8 @@ Examples:
|
|
|
212
230
|
* `cli.ts` / `helpExitCode(...)` call sites — the invariant test locks this.
|
|
213
231
|
*/
|
|
214
232
|
export const DISPATCHED_COMMAND_IDS = [
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"init",
|
|
233
|
+
"setup",
|
|
234
|
+
"link",
|
|
218
235
|
"note",
|
|
219
236
|
"note list",
|
|
220
237
|
"handoff",
|
|
@@ -222,6 +239,7 @@ export const DISPATCHED_COMMAND_IDS = [
|
|
|
222
239
|
"handoff peek",
|
|
223
240
|
"plan",
|
|
224
241
|
"plan list",
|
|
242
|
+
"search",
|
|
225
243
|
"path",
|
|
226
244
|
"path notes",
|
|
227
245
|
"path logs",
|
|
@@ -316,9 +334,10 @@ function formatFullCommandDetails() {
|
|
|
316
334
|
}
|
|
317
335
|
return blocks.join("\n\n");
|
|
318
336
|
}
|
|
337
|
+
const BANNER = "grounder — markdown-native memory for AI agents";
|
|
319
338
|
/** Bare `grounder` / `-h` — short grouped synopsis (no flag encyclopedia). */
|
|
320
339
|
export function printSynopsis() {
|
|
321
|
-
process.stdout.write(
|
|
340
|
+
process.stdout.write(`${BANNER}
|
|
322
341
|
|
|
323
342
|
${formatGroupedLists()}
|
|
324
343
|
|
|
@@ -335,7 +354,7 @@ ${QUICKSTART}
|
|
|
335
354
|
}
|
|
336
355
|
/** `--help` / `grounder help` with no args — one-shot reference for humans/agents. */
|
|
337
356
|
export function printFullHelp() {
|
|
338
|
-
process.stdout.write(
|
|
357
|
+
process.stdout.write(`${BANNER}
|
|
339
358
|
|
|
340
359
|
${formatGroupedLists()}
|
|
341
360
|
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAoB5D,MAAM,WAAW,GAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
export interface ParsedFrontmatter {
|
|
2
|
+
title?: string;
|
|
3
|
+
created?: string;
|
|
4
|
+
topics?: string[];
|
|
5
|
+
}
|
|
1
6
|
/**
|
|
2
|
-
* Parse `title` / `created` from Grounder
|
|
3
|
-
* Accepts the quoted `key: "value"` shape
|
|
4
|
-
* unquoted `key: value` from earlier
|
|
7
|
+
* Parse `title` / `created` / `topics` from Grounder frontmatter.
|
|
8
|
+
* Accepts the quoted `key: "value"` shape write commands produce, and
|
|
9
|
+
* unquoted `key: value` from earlier files. Not a general YAML parser.
|
|
5
10
|
* Returns `{}` on anything unexpected; never throws.
|
|
6
11
|
*/
|
|
7
|
-
export declare function parseHandoffFrontmatter(content: string):
|
|
8
|
-
title?: string;
|
|
9
|
-
created?: string;
|
|
10
|
-
};
|
|
12
|
+
export declare function parseHandoffFrontmatter(content: string): ParsedFrontmatter;
|
|
11
13
|
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/util/frontmatter.ts"],"names":[],"mappings":"AA6BA
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/util/frontmatter.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAoBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA2C1E"}
|
package/dist/util/frontmatter.js
CHANGED
|
@@ -27,9 +27,28 @@ function unescapeYamlDoubleQuoted(value) {
|
|
|
27
27
|
return result;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Parse `
|
|
31
|
-
*
|
|
32
|
-
|
|
30
|
+
* Parse a YAML flow sequence like `["a", "b"]` or `[a, b]` into a string array.
|
|
31
|
+
* Returns `undefined` on anything unexpected.
|
|
32
|
+
*/
|
|
33
|
+
function parseYamlFlowSequence(raw) {
|
|
34
|
+
const trimmed = raw.trim();
|
|
35
|
+
if (!trimmed.startsWith("[") || !trimmed.endsWith("]"))
|
|
36
|
+
return undefined;
|
|
37
|
+
const inner = trimmed.slice(1, -1);
|
|
38
|
+
if (!inner.trim())
|
|
39
|
+
return [];
|
|
40
|
+
return inner.split(",").map((item) => {
|
|
41
|
+
const s = item.trim();
|
|
42
|
+
if (s.startsWith('"') && s.endsWith('"')) {
|
|
43
|
+
return unescapeYamlDoubleQuoted(s.slice(1, -1));
|
|
44
|
+
}
|
|
45
|
+
return s;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse `title` / `created` / `topics` from Grounder frontmatter.
|
|
50
|
+
* Accepts the quoted `key: "value"` shape write commands produce, and
|
|
51
|
+
* unquoted `key: value` from earlier files. Not a general YAML parser.
|
|
33
52
|
* Returns `{}` on anything unexpected; never throws.
|
|
34
53
|
*/
|
|
35
54
|
export function parseHandoffFrontmatter(content) {
|
|
@@ -44,13 +63,19 @@ export function parseHandoffFrontmatter(content) {
|
|
|
44
63
|
if (line === "---") {
|
|
45
64
|
break;
|
|
46
65
|
}
|
|
66
|
+
const topicsMatch = /^topics:\s*(\[.*\])\s*$/.exec(line);
|
|
67
|
+
if (topicsMatch) {
|
|
68
|
+
const parsed = parseYamlFlowSequence(topicsMatch[1] ?? "");
|
|
69
|
+
if (parsed)
|
|
70
|
+
result.topics = parsed;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
47
73
|
const quoted = /^(title|created):\s*"(.*)"\s*$/.exec(line);
|
|
48
74
|
if (quoted) {
|
|
49
75
|
const key = quoted[1];
|
|
50
76
|
result[key] = unescapeYamlDoubleQuoted(quoted[2] ?? "");
|
|
51
77
|
continue;
|
|
52
78
|
}
|
|
53
|
-
// Opening quote without a closing pair — ignore rather than treat as unquoted.
|
|
54
79
|
if (/^(title|created):\s*"/.test(line)) {
|
|
55
80
|
continue;
|
|
56
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/util/frontmatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,SAAS,wBAAwB,CAAC,KAAa;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAClC,MAAM,IAAI,IAAI,CAAC;gBACf,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,MAAM,IAAI,IAAI,CAAC;gBACf,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,MAAM,IAAI,IAAI,CAAC;gBACf,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/util/frontmatter.ts"],"names":[],"mappings":"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"}
|
package/dist/util/path.d.ts
CHANGED
|
@@ -17,4 +17,27 @@ export declare function isPathInside(parent: string, child: string): boolean;
|
|
|
17
17
|
* Returns `null` if either path cannot be resolved (e.g. missing).
|
|
18
18
|
*/
|
|
19
19
|
export declare function isRealPathInside(parent: string, child: string): Promise<boolean | null>;
|
|
20
|
+
/** `file://` href for an absolute filesystem path (spaces percent-encoded). */
|
|
21
|
+
export declare function toFileUri(filePath: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Escape text for a Markdown link label (`[label](...)`) so `\`, `[`, and `]`
|
|
24
|
+
* do not break the link syntax.
|
|
25
|
+
*/
|
|
26
|
+
export declare function escapeMarkdownLinkLabel(text: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* `[label](fileUri)` for an absolute path. Escapes special chars in the label;
|
|
29
|
+
* percent-encodes `(` / `)` in the URI so they do not close the destination.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatMarkdownFileLink(label: string, filePath: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Path relative to a vault/project root, always with `/` separators
|
|
34
|
+
* (stable for markdown links and JSON across platforms).
|
|
35
|
+
*/
|
|
36
|
+
export declare function vaultRelativePath(rootDir: string, filePath: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Plain list title: path relative to `rootDir` with a trailing `.md` stripped
|
|
39
|
+
* (e.g. `migration/phase-1`). Falls back to the filename stem when `rootDir`
|
|
40
|
+
* is omitted.
|
|
41
|
+
*/
|
|
42
|
+
export declare function vaultItemPlainTitle(filePath: string, rootDir?: string): string;
|
|
20
43
|
//# sourceMappingURL=path.d.ts.map
|
package/dist/util/path.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAElF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAanE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQ7F;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9E"}
|
package/dist/util/path.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { realpath } from "node:fs/promises";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
4
5
|
/**
|
|
5
6
|
* Expand a leading `~` / `~/…` to the user home directory.
|
|
6
7
|
* Leaves other paths unchanged (including a mid-path `~`, which is not home).
|
|
@@ -50,4 +51,42 @@ export async function isRealPathInside(parent, child) {
|
|
|
50
51
|
return null;
|
|
51
52
|
}
|
|
52
53
|
}
|
|
54
|
+
/** `file://` href for an absolute filesystem path (spaces percent-encoded). */
|
|
55
|
+
export function toFileUri(filePath) {
|
|
56
|
+
return pathToFileURL(filePath).href;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Escape text for a Markdown link label (`[label](...)`) so `\`, `[`, and `]`
|
|
60
|
+
* do not break the link syntax.
|
|
61
|
+
*/
|
|
62
|
+
export function escapeMarkdownLinkLabel(text) {
|
|
63
|
+
return text.replace(/\\/g, "\\\\").replace(/\[/g, "\\[").replace(/\]/g, "\\]");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* `[label](fileUri)` for an absolute path. Escapes special chars in the label;
|
|
67
|
+
* percent-encodes `(` / `)` in the URI so they do not close the destination.
|
|
68
|
+
*/
|
|
69
|
+
export function formatMarkdownFileLink(label, filePath) {
|
|
70
|
+
const uri = toFileUri(filePath).replace(/\(/g, "%28").replace(/\)/g, "%29");
|
|
71
|
+
return `[${escapeMarkdownLinkLabel(label)}](${uri})`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Path relative to a vault/project root, always with `/` separators
|
|
75
|
+
* (stable for markdown links and JSON across platforms).
|
|
76
|
+
*/
|
|
77
|
+
export function vaultRelativePath(rootDir, filePath) {
|
|
78
|
+
return path.relative(rootDir, filePath).split(path.sep).join("/");
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Plain list title: path relative to `rootDir` with a trailing `.md` stripped
|
|
82
|
+
* (e.g. `migration/phase-1`). Falls back to the filename stem when `rootDir`
|
|
83
|
+
* is omitted.
|
|
84
|
+
*/
|
|
85
|
+
export function vaultItemPlainTitle(filePath, rootDir) {
|
|
86
|
+
if (rootDir === undefined) {
|
|
87
|
+
return path.basename(filePath, ".md");
|
|
88
|
+
}
|
|
89
|
+
const rel = vaultRelativePath(rootDir, filePath);
|
|
90
|
+
return rel.endsWith(".md") ? rel.slice(0, -3) : rel;
|
|
91
|
+
}
|
|
53
92
|
//# sourceMappingURL=path.js.map
|
package/dist/util/path.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ export interface ListHandoffsOptions {
|
|
|
3
3
|
limit?: number;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* Lists handoff markdown files under `logsDir
|
|
6
|
+
* Lists handoff markdown files under `logsDir` recursively, newest basename
|
|
7
|
+
* first (timestamp-prefixed names sort correctly). Same basename in different
|
|
8
|
+
* subfolders ties break by vault-relative path descending.
|
|
7
9
|
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
8
10
|
*/
|
|
9
11
|
export declare function listHandoffs(logsDir: string, options?: ListHandoffsOptions): Promise<string[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-handoffs.d.ts","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-handoffs.d.ts","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAwBnB"}
|
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import { readdir } from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
2
|
+
import { vaultRelativePath } from "../util/path.js";
|
|
3
|
+
import { listMarkdownFiles } from "./list-markdown.js";
|
|
3
4
|
/**
|
|
4
|
-
* Lists handoff markdown files under `logsDir
|
|
5
|
+
* Lists handoff markdown files under `logsDir` recursively, newest basename
|
|
6
|
+
* first (timestamp-prefixed names sort correctly). Same basename in different
|
|
7
|
+
* subfolders ties break by vault-relative path descending.
|
|
5
8
|
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
6
9
|
*/
|
|
7
10
|
export async function listHandoffs(logsDir, options = {}) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const mdPaths = await listMarkdownFiles(logsDir);
|
|
12
|
+
const ranked = mdPaths.map((filePath) => ({
|
|
13
|
+
filePath,
|
|
14
|
+
name: path.basename(filePath),
|
|
15
|
+
rel: vaultRelativePath(logsDir, filePath),
|
|
16
|
+
}));
|
|
17
|
+
ranked.sort((a, b) => {
|
|
18
|
+
if (a.name !== b.name) {
|
|
19
|
+
return a.name < b.name ? 1 : -1;
|
|
15
20
|
}
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
const paths =
|
|
19
|
-
.filter((name) => name.endsWith(".md"))
|
|
20
|
-
.sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))
|
|
21
|
-
.map((name) => path.join(logsDir, name));
|
|
21
|
+
return a.rel < b.rel ? 1 : a.rel > b.rel ? -1 : 0;
|
|
22
|
+
});
|
|
23
|
+
const paths = ranked.map((entry) => entry.filePath);
|
|
22
24
|
if (options.limit === undefined) {
|
|
23
25
|
return paths;
|
|
24
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-handoffs.js","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"list-handoffs.js","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAOvD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAA+B,EAAE;IAEjC,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,QAAQ;QACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,GAAG,EAAE,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC;KAC1C,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively lists `*.md` files under `rootDir` (absolute paths).
|
|
3
|
+
* Missing dirs yield `[]`. Does not follow directory symlinks (`Dirent`
|
|
4
|
+
* type checks); plain files that are symlinks to `.md` are included when
|
|
5
|
+
* `isFile()` reports true.
|
|
6
|
+
*/
|
|
7
|
+
export declare function listMarkdownFiles(rootDir: string): Promise<string[]>;
|
|
8
|
+
//# sourceMappingURL=list-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-markdown.d.ts","sourceRoot":"","sources":["../../src/vault/list-markdown.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA0B1E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Recursively lists `*.md` files under `rootDir` (absolute paths).
|
|
5
|
+
* Missing dirs yield `[]`. Does not follow directory symlinks (`Dirent`
|
|
6
|
+
* type checks); plain files that are symlinks to `.md` are included when
|
|
7
|
+
* `isFile()` reports true.
|
|
8
|
+
*/
|
|
9
|
+
export async function listMarkdownFiles(rootDir) {
|
|
10
|
+
const results = [];
|
|
11
|
+
async function walk(dir) {
|
|
12
|
+
let entries;
|
|
13
|
+
try {
|
|
14
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error.code === "ENOENT") {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const full = path.join(dir, entry.name);
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
await walk(full);
|
|
26
|
+
}
|
|
27
|
+
else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
28
|
+
results.push(full);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
await walk(rootDir);
|
|
33
|
+
return results;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=list-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-markdown.js","sourceRoot":"","sources":["../../src/vault/list-markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -3,13 +3,13 @@ export interface ListNotesOptions {
|
|
|
3
3
|
limit?: number;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* Lists note markdown files under `notesDir
|
|
6
|
+
* Lists note markdown files under `notesDir` recursively, newest mtime first.
|
|
7
7
|
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
8
|
-
* Ties break by
|
|
8
|
+
* Ties break by vault-relative path descending for stable output.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Matches {@link listPlans} sorting for consistency across list commands
|
|
11
|
+
* (filename-descending alone is viable for timestamp-prefixed notes, like
|
|
12
|
+
* {@link listHandoffs}).
|
|
13
13
|
*/
|
|
14
14
|
export declare function listNotes(notesDir: string, options?: ListNotesOptions): Promise<string[]>;
|
|
15
15
|
//# sourceMappingURL=list-notes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-notes.d.ts","sourceRoot":"","sources":["../../src/vault/list-notes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-notes.d.ts","sourceRoot":"","sources":["../../src/vault/list-notes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}
|