grounder 0.3.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 +157 -215
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +3 -3
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +3 -3
- 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/agents/install-command.d.ts +0 -2
- package/dist/agents/install-command.d.ts.map +1 -1
- package/dist/agents/install-command.js.map +1 -1
- package/dist/cli.js +15 -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 +120 -50
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts +27 -9
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +31 -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 +36 -0
- package/dist/commands/note/list.d.ts.map +1 -0
- package/dist/commands/note/list.js +77 -0
- package/dist/commands/note/list.js.map +1 -0
- 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 +47 -0
- package/dist/commands/output.d.ts.map +1 -0
- package/dist/commands/output.js +63 -0
- package/dist/commands/output.js.map +1 -0
- package/dist/commands/plan/list.d.ts +21 -5
- package/dist/commands/plan/list.d.ts.map +1 -1
- package/dist/commands/plan/list.js +24 -13
- 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 +39 -29
- 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 +4 -13
- package/dist/connector/state.d.ts.map +1 -1
- package/dist/connector/state.js +3 -21
- package/dist/connector/state.js.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 +80 -48
- 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/parse-args.d.ts.map +1 -1
- package/dist/util/parse-args.js +11 -2
- package/dist/util/parse-args.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 +15 -0
- package/dist/vault/list-notes.d.ts.map +1 -0
- package/dist/vault/list-notes.js +34 -0
- package/dist/vault/list-notes.js.map +1 -0
- 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 +13 -4
- package/templates/agents/claude/commands/grounder-note.md +30 -4
- package/templates/agents/claude/commands/grounder-plan.md +23 -17
- 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 +4 -2
- package/templates/agents/cursor/commands/grounder-note.md +31 -5
- package/templates/agents/cursor/commands/grounder-plan.md +24 -18
- package/templates/agents/cursor/commands/grounder-search.md +144 -0
- package/templates/agents/cursor/commands/grounder-task-handoff.md +6 -2
- package/templates/agents/cursor/commands/grounder-task.md +5 -3
- 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/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":"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;AAQD;;;GAGG;AACH,SAAS,qBAAqB,CAAC,GAAW;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,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,GAAsB,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;YAED,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,IAAI,MAAM;oBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACnC,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAwB,CAAC;gBAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,SAAS;YACX,CAAC;YAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAwB,CAAC;gBAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/util/parse-args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACrC,yFAAyF;IACzF,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../src/util/parse-args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACrC,yFAAyF;IACzF,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACjC;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoCpD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAQzF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGhG;AAED,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAElF"}
|
package/dist/util/parse-args.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
/** Long options only: `--title`, `--dry-run`. Not `---` / markdown / YAML bodies. */
|
|
2
|
+
const LONG_OPTION = /^--[a-zA-Z][\w-]*$/;
|
|
3
|
+
/** Short options only: `-f`, `-fy`. Not markdown bullets like `- item`. */
|
|
4
|
+
const SHORT_OPTION = /^-[a-zA-Z]+$/;
|
|
1
5
|
export function parseArgs(argv) {
|
|
2
6
|
const positional = [];
|
|
3
7
|
const flags = new Map();
|
|
4
8
|
const repeated = new Map();
|
|
5
9
|
for (let i = 0; i < argv.length; i++) {
|
|
6
10
|
const arg = argv[i];
|
|
7
|
-
|
|
11
|
+
// POSIX end-of-options: everything after is positional (including leading --).
|
|
12
|
+
if (arg === "--") {
|
|
13
|
+
positional.push(...argv.slice(i + 1));
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
if (LONG_OPTION.test(arg)) {
|
|
8
17
|
const key = arg.slice(2);
|
|
9
18
|
const next = argv[i + 1];
|
|
10
19
|
if (next !== undefined && !next.startsWith("-")) {
|
|
@@ -18,7 +27,7 @@ export function parseArgs(argv) {
|
|
|
18
27
|
flags.set(key, true);
|
|
19
28
|
}
|
|
20
29
|
}
|
|
21
|
-
else if (
|
|
30
|
+
else if (SHORT_OPTION.test(arg)) {
|
|
22
31
|
for (const char of arg.slice(1)) {
|
|
23
32
|
flags.set(char, true);
|
|
24
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/util/parse-args.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../../src/util/parse-args.ts"],"names":[],"mappings":"AAOA,qFAAqF;AACrF,MAAM,WAAW,GAAG,oBAAoB,CAAC;AACzC,2EAA2E;AAC3E,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,+EAA+E;QAC/E,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM;QACR,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAoC,EAAE,GAAG,IAAc;IAC9E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAoC,EAAE,GAAW;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,WAAW,CAAC,QAA+B,EAAE,GAAW;IACtE,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ListNotesOptions {
|
|
2
|
+
/** Max paths to return (newest first). Omit to return all. */
|
|
3
|
+
limit?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Lists note markdown files under `notesDir` recursively, newest mtime first.
|
|
7
|
+
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
8
|
+
* Ties break by vault-relative path descending for stable output.
|
|
9
|
+
*
|
|
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
|
+
*/
|
|
14
|
+
export declare function listNotes(notesDir: string, options?: ListNotesOptions): Promise<string[]>;
|
|
15
|
+
//# sourceMappingURL=list-notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { vaultRelativePath } from "../util/path.js";
|
|
3
|
+
import { listMarkdownFiles } from "./list-markdown.js";
|
|
4
|
+
/**
|
|
5
|
+
* Lists note markdown files under `notesDir` recursively, newest mtime first.
|
|
6
|
+
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
7
|
+
* Ties break by vault-relative path descending for stable output.
|
|
8
|
+
*
|
|
9
|
+
* Matches {@link listPlans} sorting for consistency across list commands
|
|
10
|
+
* (filename-descending alone is viable for timestamp-prefixed notes, like
|
|
11
|
+
* {@link listHandoffs}).
|
|
12
|
+
*/
|
|
13
|
+
export async function listNotes(notesDir, options = {}) {
|
|
14
|
+
const mdPaths = await listMarkdownFiles(notesDir);
|
|
15
|
+
const withMtime = await Promise.all(mdPaths.map(async (filePath) => {
|
|
16
|
+
const { mtimeMs } = await stat(filePath);
|
|
17
|
+
return { filePath, rel: vaultRelativePath(notesDir, filePath), mtimeMs };
|
|
18
|
+
}));
|
|
19
|
+
withMtime.sort((a, b) => {
|
|
20
|
+
if (a.mtimeMs !== b.mtimeMs) {
|
|
21
|
+
return b.mtimeMs - a.mtimeMs;
|
|
22
|
+
}
|
|
23
|
+
return a.rel < b.rel ? 1 : a.rel > b.rel ? -1 : 0;
|
|
24
|
+
});
|
|
25
|
+
const paths = withMtime.map((entry) => entry.filePath);
|
|
26
|
+
if (options.limit === undefined) {
|
|
27
|
+
return paths;
|
|
28
|
+
}
|
|
29
|
+
if (options.limit <= 0) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return paths.slice(0, options.limit);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=list-notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-notes.js","sourceRoot":"","sources":["../../src/vault/list-notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAOvD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CACH,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,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,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEvD,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"}
|
|
@@ -3,9 +3,9 @@ export interface ListPlansOptions {
|
|
|
3
3
|
limit?: number;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
* Lists plan markdown files under `plansDir
|
|
6
|
+
* Lists plan markdown files under `plansDir` 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
10
|
export declare function listPlans(plansDir: string, options?: ListPlansOptions): Promise<string[]>;
|
|
11
11
|
//# sourceMappingURL=list-plans.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-plans.d.ts","sourceRoot":"","sources":["../../src/vault/list-plans.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-plans.d.ts","sourceRoot":"","sources":["../../src/vault/list-plans.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBnB"}
|
package/dist/vault/list-plans.js
CHANGED
|
@@ -1,32 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { vaultRelativePath } from "../util/path.js";
|
|
3
|
+
import { listMarkdownFiles } from "./list-markdown.js";
|
|
3
4
|
/**
|
|
4
|
-
* Lists plan markdown files under `plansDir
|
|
5
|
+
* Lists plan markdown files under `plansDir` recursively, newest mtime first.
|
|
5
6
|
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
6
|
-
* Ties break by
|
|
7
|
+
* Ties break by vault-relative path descending for stable output.
|
|
7
8
|
*/
|
|
8
9
|
export async function listPlans(plansDir, options = {}) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
entries = await readdir(plansDir);
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
if (error.code === "ENOENT") {
|
|
15
|
-
return [];
|
|
16
|
-
}
|
|
17
|
-
throw error;
|
|
18
|
-
}
|
|
19
|
-
const mdNames = entries.filter((name) => name.endsWith(".md"));
|
|
20
|
-
const withMtime = await Promise.all(mdNames.map(async (name) => {
|
|
21
|
-
const filePath = path.join(plansDir, name);
|
|
10
|
+
const mdPaths = await listMarkdownFiles(plansDir);
|
|
11
|
+
const withMtime = await Promise.all(mdPaths.map(async (filePath) => {
|
|
22
12
|
const { mtimeMs } = await stat(filePath);
|
|
23
|
-
return { filePath,
|
|
13
|
+
return { filePath, rel: vaultRelativePath(plansDir, filePath), mtimeMs };
|
|
24
14
|
}));
|
|
25
15
|
withMtime.sort((a, b) => {
|
|
26
16
|
if (a.mtimeMs !== b.mtimeMs) {
|
|
27
17
|
return b.mtimeMs - a.mtimeMs;
|
|
28
18
|
}
|
|
29
|
-
return a.
|
|
19
|
+
return a.rel < b.rel ? 1 : a.rel > b.rel ? -1 : 0;
|
|
30
20
|
});
|
|
31
21
|
const paths = withMtime.map((entry) => entry.filePath);
|
|
32
22
|
if (options.limit === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-plans.js","sourceRoot":"","sources":["../../src/vault/list-plans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list-plans.js","sourceRoot":"","sources":["../../src/vault/list-plans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAOvD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CACH,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/B,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,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEvD,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,55 @@
|
|
|
1
|
+
/** One line-level match inside a markdown file. */
|
|
2
|
+
export interface SearchLineHit {
|
|
3
|
+
line: number;
|
|
4
|
+
matchedTerm: string;
|
|
5
|
+
snippet: string;
|
|
6
|
+
}
|
|
7
|
+
/** Matches grouped by file, after ranking and per-file dedupe. */
|
|
8
|
+
export interface SearchFileHit {
|
|
9
|
+
filePath: string;
|
|
10
|
+
mtimeMs: number;
|
|
11
|
+
topicsMatch: boolean;
|
|
12
|
+
hits: SearchLineHit[];
|
|
13
|
+
/** Distinct matching terms (original spelling), longest first. */
|
|
14
|
+
matchedTerms: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface SearchOptions {
|
|
17
|
+
/** Project vault root — searched recursively for `*.md`. */
|
|
18
|
+
rootDir: string;
|
|
19
|
+
/** Primary query phrase. */
|
|
20
|
+
query: string;
|
|
21
|
+
/** Extra keyword variants (deduped with query). */
|
|
22
|
+
terms?: readonly string[];
|
|
23
|
+
/** Max distinct files in the result (default 10). */
|
|
24
|
+
limit?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Cap stored line snippets per file during scan (default 50; hard-capped at
|
|
27
|
+
* 50). Does not abort the tree walk; ranking still uses full hit counts.
|
|
28
|
+
*/
|
|
29
|
+
maxHits?: number;
|
|
30
|
+
/** Context lines around each match (default 1). */
|
|
31
|
+
context?: number;
|
|
32
|
+
/** Max line hits kept per file after grouping (default 1). */
|
|
33
|
+
maxHitsPerFile?: number;
|
|
34
|
+
/** Exclude files with mtime before this date. */
|
|
35
|
+
since?: Date;
|
|
36
|
+
}
|
|
37
|
+
export interface SearchOutcome {
|
|
38
|
+
query: string;
|
|
39
|
+
terms: string[];
|
|
40
|
+
/** How many files each term matched (keyed by lowercased term). */
|
|
41
|
+
termHitCounts: Record<string, number>;
|
|
42
|
+
totalMatchCount: number;
|
|
43
|
+
totalFileCount: number;
|
|
44
|
+
files: SearchFileHit[];
|
|
45
|
+
truncated: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Case-insensitive markdown scan under `rootDir`.
|
|
49
|
+
* Frontmatter `topics:` matches boost file ranking; body and frontmatter lines
|
|
50
|
+
* both contribute line hits. Files rank by relevance (distinct terms, hit
|
|
51
|
+
* density, filename/path terms, topics; demotes search dogfood when query is
|
|
52
|
+
* unrelated), then archive, recency, folder. Pure fs — no index, no deps.
|
|
53
|
+
*/
|
|
54
|
+
export declare function searchVault(options: SearchOptions): Promise<SearchOutcome>;
|
|
55
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/vault/search.ts"],"names":[],"mappings":"AAKA,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,kEAAkE;IAClE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,KAAK,CAAC,EAAE,IAAI,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAuOD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAqJhF"}
|