grounder 0.0.1 → 0.1.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/LICENSE +21 -0
- package/README.md +204 -2
- package/dist/agents/claude.d.ts +8 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +50 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/cursor.d.ts +8 -0
- package/dist/agents/cursor.d.ts.map +1 -0
- package/dist/agents/cursor.js +50 -0
- package/dist/agents/cursor.js.map +1 -0
- package/dist/agents/index.d.ts +11 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +23 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/types.d.ts +22 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +108 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +13 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +21 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +204 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/handoff/list.d.ts +23 -0
- package/dist/commands/handoff/list.d.ts.map +1 -0
- package/dist/commands/handoff/list.js +64 -0
- package/dist/commands/handoff/list.js.map +1 -0
- package/dist/commands/handoff.d.ts +25 -0
- package/dist/commands/handoff.d.ts.map +1 -0
- package/dist/commands/handoff.js +47 -0
- package/dist/commands/handoff.js.map +1 -0
- package/dist/commands/note.d.ts +10 -0
- package/dist/commands/note.d.ts.map +1 -0
- package/dist/commands/note.js +33 -0
- package/dist/commands/note.js.map +1 -0
- package/dist/commands/path/logs.d.ts +7 -0
- package/dist/commands/path/logs.d.ts.map +1 -0
- package/dist/commands/path/logs.js +17 -0
- package/dist/commands/path/logs.js.map +1 -0
- package/dist/commands/path/notes.d.ts +7 -0
- package/dist/commands/path/notes.d.ts.map +1 -0
- package/dist/commands/path/notes.js +17 -0
- package/dist/commands/path/notes.js.map +1 -0
- package/dist/commands/repo/init.d.ts +11 -0
- package/dist/commands/repo/init.d.ts.map +1 -0
- package/dist/commands/repo/init.js +78 -0
- package/dist/commands/repo/init.js.map +1 -0
- package/dist/commands/require-linked.d.ts +7 -0
- package/dist/commands/require-linked.d.ts.map +1 -0
- package/dist/commands/require-linked.js +19 -0
- package/dist/commands/require-linked.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +101 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/vault/init.d.ts +11 -0
- package/dist/commands/vault/init.d.ts.map +1 -0
- package/dist/commands/vault/init.js +73 -0
- package/dist/commands/vault/init.js.map +1 -0
- package/dist/connector/git.d.ts +12 -0
- package/dist/connector/git.d.ts.map +1 -0
- package/dist/connector/git.js +53 -0
- package/dist/connector/git.js.map +1 -0
- package/dist/connector/home.d.ts +13 -0
- package/dist/connector/home.d.ts.map +1 -0
- package/dist/connector/home.js +52 -0
- package/dist/connector/home.js.map +1 -0
- package/dist/connector/linked.d.ts +25 -0
- package/dist/connector/linked.d.ts.map +1 -0
- package/dist/connector/linked.js +24 -0
- package/dist/connector/linked.js.map +1 -0
- package/dist/connector/project-id.d.ts +17 -0
- package/dist/connector/project-id.d.ts.map +1 -0
- package/dist/connector/project-id.js +102 -0
- package/dist/connector/project-id.js.map +1 -0
- package/dist/connector/repo.d.ts +9 -0
- package/dist/connector/repo.d.ts.map +1 -0
- package/dist/connector/repo.js +41 -0
- package/dist/connector/repo.js.map +1 -0
- package/dist/connector/vault.d.ts +12 -0
- package/dist/connector/vault.d.ts.map +1 -0
- package/dist/connector/vault.js +27 -0
- package/dist/connector/vault.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/util/fs.d.ts +8 -0
- package/dist/util/fs.d.ts.map +1 -0
- package/dist/util/fs.js +36 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/parse-args.d.ts +12 -0
- package/dist/util/parse-args.d.ts.map +1 -0
- package/dist/util/parse-args.js +49 -0
- package/dist/util/parse-args.js.map +1 -0
- package/dist/util/path.d.ts +10 -0
- package/dist/util/path.d.ts.map +1 -0
- package/dist/util/path.js +22 -0
- package/dist/util/path.js.map +1 -0
- package/dist/util/project-id.d.ts +2 -0
- package/dist/util/project-id.d.ts.map +1 -0
- package/dist/util/project-id.js +8 -0
- package/dist/util/project-id.js.map +1 -0
- package/dist/util/prompt.d.ts +2 -0
- package/dist/util/prompt.d.ts.map +1 -0
- package/dist/util/prompt.js +19 -0
- package/dist/util/prompt.js.map +1 -0
- package/dist/util/timestamp-slug.d.ts +38 -0
- package/dist/util/timestamp-slug.d.ts.map +1 -0
- package/dist/util/timestamp-slug.js +66 -0
- package/dist/util/timestamp-slug.js.map +1 -0
- package/dist/util/yaml.d.ts +6 -0
- package/dist/util/yaml.d.ts.map +1 -0
- package/dist/util/yaml.js +13 -0
- package/dist/util/yaml.js.map +1 -0
- package/dist/vault/layout.d.ts +13 -0
- package/dist/vault/layout.d.ts.map +1 -0
- package/dist/vault/layout.js +22 -0
- package/dist/vault/layout.js.map +1 -0
- package/dist/vault/list-handoffs.d.ts +10 -0
- package/dist/vault/list-handoffs.d.ts.map +1 -0
- package/dist/vault/list-handoffs.js +30 -0
- package/dist/vault/list-handoffs.js.map +1 -0
- package/dist/vault/write-handoff.d.ts +21 -0
- package/dist/vault/write-handoff.d.ts.map +1 -0
- package/dist/vault/write-handoff.js +40 -0
- package/dist/vault/write-handoff.js.map +1 -0
- package/dist/vault/write-note.d.ts +11 -0
- package/dist/vault/write-note.d.ts.map +1 -0
- package/dist/vault/write-note.js +15 -0
- package/dist/vault/write-note.js.map +1 -0
- package/package.json +45 -10
- package/templates/agents/claude/commands/grounder-note.md +11 -0
- package/templates/agents/claude/commands/grounder-task-handoff.md +54 -0
- package/templates/agents/claude/commands/grounder-task.md +20 -0
- package/templates/agents/cursor/commands/grounder-note.md +11 -0
- package/templates/agents/cursor/commands/grounder-task-handoff.md +54 -0
- package/templates/agents/cursor/commands/grounder-task.md +20 -0
- package/templates/vault/session-handoff.md +19 -0
- package/index.js +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileExists } from "../util/fs.js";
|
|
4
|
+
const REPO_MARKER_FILE = ".grounder.json";
|
|
5
|
+
export function repoConfigPath(repoRoot) {
|
|
6
|
+
return path.join(repoRoot, REPO_MARKER_FILE);
|
|
7
|
+
}
|
|
8
|
+
export async function findLinkedRepoRoot(cwd, gitRoot = null) {
|
|
9
|
+
let current = path.resolve(cwd);
|
|
10
|
+
const stopAtGitRoot = gitRoot ? path.resolve(gitRoot) : null;
|
|
11
|
+
while (true) {
|
|
12
|
+
if (await fileExists(repoConfigPath(current))) {
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
if (stopAtGitRoot && current === stopAtGitRoot) {
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
const parent = path.dirname(current);
|
|
19
|
+
if (parent === current) {
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
current = parent;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export async function readRepoConfig(repoRoot) {
|
|
27
|
+
const configPath = repoConfigPath(repoRoot);
|
|
28
|
+
if (!(await fileExists(configPath))) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const raw = JSON.parse(await readFile(configPath, "utf8"));
|
|
32
|
+
if (raw.version !== 1 || typeof raw.projectId !== "string" || raw.projectId.length === 0) {
|
|
33
|
+
throw new Error(`Invalid repo config at ${configPath}`);
|
|
34
|
+
}
|
|
35
|
+
return { version: 1, projectId: raw.projectId };
|
|
36
|
+
}
|
|
37
|
+
export async function writeRepoConfig(repoRoot, config) {
|
|
38
|
+
const configPath = repoConfigPath(repoRoot);
|
|
39
|
+
await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,UAAyB,IAAI;IAE7B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,aAAa,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC/C,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAwB,CAAC;IAClF,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAkB;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HomeConfig } from "./home.js";
|
|
2
|
+
import type { RepoConfig } from "./repo.js";
|
|
3
|
+
/**
|
|
4
|
+
* Effective vault root, in order: explicit `override`, `GROUNDER_VAULT`, then home config.
|
|
5
|
+
* Expands a leading `~` so vault paths like `~/Documents/…` resolve to the user home.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveVaultRoot(home: HomeConfig, override?: string): string;
|
|
8
|
+
/** Project notes directory under the effective vault root. */
|
|
9
|
+
export declare function resolveNotesDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
|
|
10
|
+
/** Project logs (handoff) directory under the effective vault root. */
|
|
11
|
+
export declare function resolveLogsDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
|
|
12
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Config-aware vault resolution: effective vault root and artifact paths from connector state.
|
|
2
|
+
import { resolveUserPath } from "../util/path.js";
|
|
3
|
+
import { logsDir, notesDir } from "../vault/layout.js";
|
|
4
|
+
/**
|
|
5
|
+
* Effective vault root, in order: explicit `override`, `GROUNDER_VAULT`, then home config.
|
|
6
|
+
* Expands a leading `~` so vault paths like `~/Documents/…` resolve to the user home.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveVaultRoot(home, override) {
|
|
9
|
+
if (override) {
|
|
10
|
+
return resolveUserPath(override);
|
|
11
|
+
}
|
|
12
|
+
if (process.env.GROUNDER_VAULT) {
|
|
13
|
+
return resolveUserPath(process.env.GROUNDER_VAULT);
|
|
14
|
+
}
|
|
15
|
+
return resolveUserPath(home.vaultRoot);
|
|
16
|
+
}
|
|
17
|
+
/** Project notes directory under the effective vault root. */
|
|
18
|
+
export function resolveNotesDir(home, repo, vaultOverride) {
|
|
19
|
+
const vaultRoot = resolveVaultRoot(home, vaultOverride);
|
|
20
|
+
return notesDir(vaultRoot, repo.projectId);
|
|
21
|
+
}
|
|
22
|
+
/** Project logs (handoff) directory under the effective vault root. */
|
|
23
|
+
export function resolveLogsDir(home, repo, vaultOverride) {
|
|
24
|
+
const vaultRoot = resolveVaultRoot(home, vaultOverride);
|
|
25
|
+
return logsDir(vaultRoot, repo.projectId);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAIvD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAiB;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAgB,EAAE,aAAsB;IACvF,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO,QAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
5
|
+
const pkg = JSON.parse(readFileSync(path.join(pkgRoot, "package.json"), "utf8"));
|
|
6
|
+
export const VERSION = pkg.version;
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACjF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE9E,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
2
|
+
/**
|
|
3
|
+
* Creates a new markdown file under `dir`; never overwrites.
|
|
4
|
+
* Tries `basename.md`, then `basename_02.md`, `_03`, … with `wx` (O_EXCL)
|
|
5
|
+
* so concurrent writers cannot clobber each other.
|
|
6
|
+
*/
|
|
7
|
+
export declare function writeUniqueMarkdown(dir: string, basename: string, content: string): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
|
package/dist/util/fs.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { access, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { collisionSuffix } from "./timestamp-slug.js";
|
|
4
|
+
export async function fileExists(filePath) {
|
|
5
|
+
try {
|
|
6
|
+
await access(filePath);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new markdown file under `dir`; never overwrites.
|
|
15
|
+
* Tries `basename.md`, then `basename_02.md`, `_03`, … with `wx` (O_EXCL)
|
|
16
|
+
* so concurrent writers cannot clobber each other.
|
|
17
|
+
*/
|
|
18
|
+
export async function writeUniqueMarkdown(dir, basename, content) {
|
|
19
|
+
let n = 0;
|
|
20
|
+
for (;;) {
|
|
21
|
+
const stem = n === 0 ? basename : `${basename}${collisionSuffix(n)}`;
|
|
22
|
+
const filePath = path.join(dir, `${stem}.md`);
|
|
23
|
+
try {
|
|
24
|
+
await writeFile(filePath, content, { encoding: "utf8", flag: "wx" });
|
|
25
|
+
return filePath;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error.code === "EEXIST") {
|
|
29
|
+
n = n === 0 ? 2 : n + 1;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,QAAgB,EAChB,OAAe;IAEf,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,SAAS,CAAC;QACR,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ParsedArgs {
|
|
2
|
+
positional: string[];
|
|
3
|
+
flags: Map<string, string | boolean>;
|
|
4
|
+
/** Raw repeated flag values, e.g. --agent=cursor --agent=claude → ["cursor","claude"] */
|
|
5
|
+
repeated: Map<string, string[]>;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
8
|
+
export declare function flagBool(flags: Map<string, string | boolean>, ...keys: string[]): boolean;
|
|
9
|
+
export declare function flagString(flags: Map<string, string | boolean>, key: string): string | undefined;
|
|
10
|
+
/** Collect all values from a repeated flag, e.g. --agent cursor --agent claude → ["cursor","claude"]. */
|
|
11
|
+
export declare function flagStrings(repeated: Map<string, string[]>, key: string): string[];
|
|
12
|
+
//# sourceMappingURL=parse-args.d.ts.map
|
|
@@ -0,0 +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;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6BpD;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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function parseArgs(argv) {
|
|
2
|
+
const positional = [];
|
|
3
|
+
const flags = new Map();
|
|
4
|
+
const repeated = new Map();
|
|
5
|
+
for (let i = 0; i < argv.length; i++) {
|
|
6
|
+
const arg = argv[i];
|
|
7
|
+
if (arg.startsWith("--")) {
|
|
8
|
+
const key = arg.slice(2);
|
|
9
|
+
const next = argv[i + 1];
|
|
10
|
+
if (next !== undefined && !next.startsWith("-")) {
|
|
11
|
+
flags.set(key, next);
|
|
12
|
+
const arr = repeated.get(key) ?? [];
|
|
13
|
+
arr.push(next);
|
|
14
|
+
repeated.set(key, arr);
|
|
15
|
+
i++;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
flags.set(key, true);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else if (arg.startsWith("-") && arg.length > 1) {
|
|
22
|
+
for (const char of arg.slice(1)) {
|
|
23
|
+
flags.set(char, true);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
positional.push(arg);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { positional, flags, repeated };
|
|
31
|
+
}
|
|
32
|
+
export function flagBool(flags, ...keys) {
|
|
33
|
+
for (const key of keys) {
|
|
34
|
+
const value = flags.get(key);
|
|
35
|
+
if (value === true || value === "true") {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
export function flagString(flags, key) {
|
|
42
|
+
const value = flags.get(key);
|
|
43
|
+
return typeof value === "string" ? value : undefined;
|
|
44
|
+
}
|
|
45
|
+
/** Collect all values from a repeated flag, e.g. --agent cursor --agent claude → ["cursor","claude"]. */
|
|
46
|
+
export function flagStrings(repeated, key) {
|
|
47
|
+
return repeated.get(key) ?? [];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=parse-args.js.map
|
|
@@ -0,0 +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;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,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,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjD,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand a leading `~` / `~/…` to the user home directory.
|
|
3
|
+
* Leaves other paths unchanged (including a mid-path `~`, which is not home).
|
|
4
|
+
*/
|
|
5
|
+
export declare function expandHome(input: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Expand a leading `~`, then resolve to an absolute path (relative to `cwd` if given).
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveUserPath(input: string, cwd?: string): string;
|
|
10
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAGA;;;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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Expand a leading `~` / `~/…` to the user home directory.
|
|
5
|
+
* Leaves other paths unchanged (including a mid-path `~`, which is not home).
|
|
6
|
+
*/
|
|
7
|
+
export function expandHome(input) {
|
|
8
|
+
if (input === "~") {
|
|
9
|
+
return os.homedir();
|
|
10
|
+
}
|
|
11
|
+
if (input.startsWith("~/") || input.startsWith(`~${path.sep}`)) {
|
|
12
|
+
return path.join(os.homedir(), input.slice(2));
|
|
13
|
+
}
|
|
14
|
+
return input;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Expand a leading `~`, then resolve to an absolute path (relative to `cwd` if given).
|
|
18
|
+
*/
|
|
19
|
+
export function resolveUserPath(input, cwd = process.cwd()) {
|
|
20
|
+
return path.resolve(cwd, expandHome(input));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACxE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-id.d.ts","sourceRoot":"","sources":["../../src/util/project-id.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-id.js","sourceRoot":"","sources":["../../src/util/project-id.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/util/prompt.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBlF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import readline from "node:readline/promises";
|
|
2
|
+
export async function confirm(message, defaultYes = true) {
|
|
3
|
+
const hint = defaultYes ? "[Y/n]" : "[y/N]";
|
|
4
|
+
const rl = readline.createInterface({
|
|
5
|
+
input: process.stdin,
|
|
6
|
+
output: process.stdout,
|
|
7
|
+
});
|
|
8
|
+
try {
|
|
9
|
+
const answer = (await rl.question(`${message} ${hint} `)).trim().toLowerCase();
|
|
10
|
+
if (answer === "") {
|
|
11
|
+
return defaultYes;
|
|
12
|
+
}
|
|
13
|
+
return answer === "y" || answer === "yes";
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
rl.close();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/util/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,UAAU,GAAG,IAAI;IAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/E,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const MAX_SLUG_LENGTH = 20;
|
|
2
|
+
/**
|
|
3
|
+
* Builds a short filesystem-safe slug from text.
|
|
4
|
+
* Uses only the first line, truncated to {@link MAX_SLUG_LENGTH}.
|
|
5
|
+
*/
|
|
6
|
+
export declare function slugifyText(text: string): string;
|
|
7
|
+
/** Local-time prefix `YYYY-MM-DD-HHmm` (legacy minute precision). */
|
|
8
|
+
export declare function dateMinutePrefix(date: Date): string;
|
|
9
|
+
/** Local-time prefix `YYYY-MM-DD-HHmmss` for sortable filenames. */
|
|
10
|
+
export declare function dateSecondPrefix(date: Date): string;
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated Prefer {@link dateSecondPrefix} (hyphenated date + time).
|
|
13
|
+
* Legacy `YYYY-MM-DD-HH-mm-ss` form.
|
|
14
|
+
*/
|
|
15
|
+
export declare function timestampSlug(date?: Date): string;
|
|
16
|
+
/**
|
|
17
|
+
* Filename stem: `YYYY-MM-DD-HHmmss` plus optional slug from `title`, else from `text`.
|
|
18
|
+
* Returns the date prefix alone when the slug is empty.
|
|
19
|
+
*/
|
|
20
|
+
export declare function timestampedBasename(text: string, options?: {
|
|
21
|
+
title?: string;
|
|
22
|
+
now?: Date;
|
|
23
|
+
}): string;
|
|
24
|
+
/**
|
|
25
|
+
* @deprecated Alias of {@link timestampedBasename} (always second precision).
|
|
26
|
+
*/
|
|
27
|
+
export declare function timestampedBasenameWithSeconds(text: string, options?: {
|
|
28
|
+
title?: string;
|
|
29
|
+
now?: Date;
|
|
30
|
+
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* Numeric collision suffix for a basename that already exists.
|
|
33
|
+
* Uses `_` so `base_02.md` sorts after `base.md` lexicographically
|
|
34
|
+
* (`_` > `.`), keeping filename-desc “newest first” correct.
|
|
35
|
+
* Zero-padded to 2 digits so `_02` < `_10`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function collisionSuffix(n: number): string;
|
|
38
|
+
//# sourceMappingURL=timestamp-slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp-slug.d.ts","sourceRoot":"","sources":["../../src/util/timestamp-slug.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,KAAK,CAAC;AAIlC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD;AAUD,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEnD;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,OAAa,GAAG,MAAM,CASvD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC3C,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC3C,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { sanitizeProjectId } from "./project-id.js";
|
|
2
|
+
export const MAX_SLUG_LENGTH = 20;
|
|
3
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
4
|
+
/**
|
|
5
|
+
* Builds a short filesystem-safe slug from text.
|
|
6
|
+
* Uses only the first line, truncated to {@link MAX_SLUG_LENGTH}.
|
|
7
|
+
*/
|
|
8
|
+
export function slugifyText(text) {
|
|
9
|
+
const firstLine = text.trim().split(/\r?\n/)[0] ?? "";
|
|
10
|
+
return sanitizeProjectId(firstLine.trim().slice(0, MAX_SLUG_LENGTH));
|
|
11
|
+
}
|
|
12
|
+
function datePrefix(date, includeSeconds) {
|
|
13
|
+
const y = date.getFullYear();
|
|
14
|
+
const m = pad(date.getMonth() + 1);
|
|
15
|
+
const d = pad(date.getDate());
|
|
16
|
+
const time = `${pad(date.getHours())}${pad(date.getMinutes())}${includeSeconds ? pad(date.getSeconds()) : ""}`;
|
|
17
|
+
return `${y}-${m}-${d}-${time}`;
|
|
18
|
+
}
|
|
19
|
+
/** Local-time prefix `YYYY-MM-DD-HHmm` (legacy minute precision). */
|
|
20
|
+
export function dateMinutePrefix(date) {
|
|
21
|
+
return datePrefix(date, false);
|
|
22
|
+
}
|
|
23
|
+
/** Local-time prefix `YYYY-MM-DD-HHmmss` for sortable filenames. */
|
|
24
|
+
export function dateSecondPrefix(date) {
|
|
25
|
+
return datePrefix(date, true);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Prefer {@link dateSecondPrefix} (hyphenated date + time).
|
|
29
|
+
* Legacy `YYYY-MM-DD-HH-mm-ss` form.
|
|
30
|
+
*/
|
|
31
|
+
export function timestampSlug(date = new Date()) {
|
|
32
|
+
return [
|
|
33
|
+
date.getFullYear(),
|
|
34
|
+
pad(date.getMonth() + 1),
|
|
35
|
+
pad(date.getDate()),
|
|
36
|
+
pad(date.getHours()),
|
|
37
|
+
pad(date.getMinutes()),
|
|
38
|
+
pad(date.getSeconds()),
|
|
39
|
+
].join("-");
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Filename stem: `YYYY-MM-DD-HHmmss` plus optional slug from `title`, else from `text`.
|
|
43
|
+
* Returns the date prefix alone when the slug is empty.
|
|
44
|
+
*/
|
|
45
|
+
export function timestampedBasename(text, options = {}) {
|
|
46
|
+
const now = options.now ?? new Date();
|
|
47
|
+
const shortSlug = options.title ? slugifyText(options.title) : slugifyText(text);
|
|
48
|
+
const prefix = dateSecondPrefix(now);
|
|
49
|
+
return shortSlug ? `${prefix}-${shortSlug}` : prefix;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @deprecated Alias of {@link timestampedBasename} (always second precision).
|
|
53
|
+
*/
|
|
54
|
+
export function timestampedBasenameWithSeconds(text, options = {}) {
|
|
55
|
+
return timestampedBasename(text, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Numeric collision suffix for a basename that already exists.
|
|
59
|
+
* Uses `_` so `base_02.md` sorts after `base.md` lexicographically
|
|
60
|
+
* (`_` > `.`), keeping filename-desc “newest first” correct.
|
|
61
|
+
* Zero-padded to 2 digits so `_02` < `_10`.
|
|
62
|
+
*/
|
|
63
|
+
export function collisionSuffix(n) {
|
|
64
|
+
return `_${String(n).padStart(2, "0")}`;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=timestamp-slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp-slug.js","sourceRoot":"","sources":["../../src/util/timestamp-slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtD,OAAO,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,IAAU,EAAE,cAAuB;IACrD,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/G,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE;IAC7C,OAAO;QACL,IAAI,CAAC,WAAW,EAAE;QAClB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;KACvB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,UAA0C,EAAE;IAE5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAY,EACZ,UAA0C,EAAE;IAE5C,OAAO,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/util/yaml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Double-quote a YAML scalar and escape `\`, `"`, and newlines.
|
|
3
|
+
* Always quoted so values with `:`, `#`, leading spaces, etc. stay valid.
|
|
4
|
+
*/
|
|
5
|
+
export function yamlDoubleQuoted(value) {
|
|
6
|
+
const escaped = value
|
|
7
|
+
.replace(/\\/g, "\\\\")
|
|
8
|
+
.replace(/"/g, '\\"')
|
|
9
|
+
.replace(/\r/g, "\\r")
|
|
10
|
+
.replace(/\n/g, "\\n");
|
|
11
|
+
return `"${escaped}"`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/util/yaml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure vault layout: path segments only — no config files or env overrides.
|
|
3
|
+
*/
|
|
4
|
+
export declare const PROJECTS_DIR = "10-Projects";
|
|
5
|
+
/** `<vault>/10-Projects` — parent of all project folders. */
|
|
6
|
+
export declare function projectsParent(vaultRoot: string): string;
|
|
7
|
+
/** `<vault>/10-Projects/{projectId}`. */
|
|
8
|
+
export declare function projectDir(vaultRoot: string, projectId: string): string;
|
|
9
|
+
/** `<vault>/10-Projects/{projectId}/notes`. */
|
|
10
|
+
export declare function notesDir(vaultRoot: string, projectId: string): string;
|
|
11
|
+
/** `<vault>/10-Projects/{projectId}/logs` — session handoffs. */
|
|
12
|
+
export declare function logsDir(vaultRoot: string, projectId: string): string;
|
|
13
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/vault/layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure vault layout: path segments only — no config files or env overrides.
|
|
3
|
+
*/
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
export const PROJECTS_DIR = "10-Projects";
|
|
6
|
+
/** `<vault>/10-Projects` — parent of all project folders. */
|
|
7
|
+
export function projectsParent(vaultRoot) {
|
|
8
|
+
return path.join(vaultRoot, PROJECTS_DIR);
|
|
9
|
+
}
|
|
10
|
+
/** `<vault>/10-Projects/{projectId}`. */
|
|
11
|
+
export function projectDir(vaultRoot, projectId) {
|
|
12
|
+
return path.join(vaultRoot, PROJECTS_DIR, projectId);
|
|
13
|
+
}
|
|
14
|
+
/** `<vault>/10-Projects/{projectId}/notes`. */
|
|
15
|
+
export function notesDir(vaultRoot, projectId) {
|
|
16
|
+
return path.join(vaultRoot, PROJECTS_DIR, projectId, "notes");
|
|
17
|
+
}
|
|
18
|
+
/** `<vault>/10-Projects/{projectId}/logs` — session handoffs. */
|
|
19
|
+
export function logsDir(vaultRoot, projectId) {
|
|
20
|
+
return path.join(vaultRoot, PROJECTS_DIR, projectId, "logs");
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/vault/layout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,SAAiB;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,SAAiB;IAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,SAAiB;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ListHandoffsOptions {
|
|
2
|
+
/** Max paths to return (newest first). Omit to return all. */
|
|
3
|
+
limit?: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Lists handoff markdown files under `logsDir`, newest filename first.
|
|
7
|
+
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function listHandoffs(logsDir: string, options?: ListHandoffsOptions): Promise<string[]>;
|
|
10
|
+
//# sourceMappingURL=list-handoffs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-handoffs.d.ts","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Lists handoff markdown files under `logsDir`, newest filename first.
|
|
5
|
+
* Returns absolute paths. Missing or empty dirs yield `[]`.
|
|
6
|
+
*/
|
|
7
|
+
export async function listHandoffs(logsDir, options = {}) {
|
|
8
|
+
let entries;
|
|
9
|
+
try {
|
|
10
|
+
entries = await readdir(logsDir);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error.code === "ENOENT") {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
const paths = entries
|
|
19
|
+
.filter((name) => name.endsWith(".md"))
|
|
20
|
+
.sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))
|
|
21
|
+
.map((name) => path.join(logsDir, name));
|
|
22
|
+
if (options.limit === undefined) {
|
|
23
|
+
return paths;
|
|
24
|
+
}
|
|
25
|
+
if (options.limit <= 0) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return paths.slice(0, options.limit);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=list-handoffs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-handoffs.js","sourceRoot":"","sources":["../../src/vault/list-handoffs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,UAA+B,EAAE;IAEjC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO;SAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACtC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3C,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,21 @@
|
|
|
1
|
+
/** Options for {@link writeHandoff}. */
|
|
2
|
+
export interface WriteHandoffOptions {
|
|
3
|
+
/** Project id written into YAML frontmatter. */
|
|
4
|
+
projectId: string;
|
|
5
|
+
/** Optional title slug for the filename and frontmatter. */
|
|
6
|
+
title?: string;
|
|
7
|
+
/** Git branch when known; omitted from frontmatter if unset. */
|
|
8
|
+
branch?: string;
|
|
9
|
+
/** Timestamp for filename prefix and `created` (default: now). */
|
|
10
|
+
now?: Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Writes a new handoff markdown file under `logsDir` (created if missing).
|
|
14
|
+
* Prepends YAML frontmatter (`project`, optional `branch`/`title`, `created`)
|
|
15
|
+
* ahead of `body`. Never overwrites — exclusive create with `_NN` on collision.
|
|
16
|
+
* @param logsDir - Absolute project logs directory.
|
|
17
|
+
* @param body - Agent-supplied markdown (sections such as Done / Next); not validated here.
|
|
18
|
+
* @returns Absolute path of the written file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeHandoff(logsDir: string, body: string, options: WriteHandoffOptions): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=write-handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-handoff.d.ts","sourceRoot":"","sources":["../../src/vault/write-handoff.ts"],"names":[],"mappings":"AAKA,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAoBD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|