grounder 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -2
  3. package/dist/agents/claude.d.ts +7 -0
  4. package/dist/agents/claude.d.ts.map +1 -0
  5. package/dist/agents/claude.js +46 -0
  6. package/dist/agents/claude.js.map +1 -0
  7. package/dist/agents/cursor.d.ts +7 -0
  8. package/dist/agents/cursor.d.ts.map +1 -0
  9. package/dist/agents/cursor.js +46 -0
  10. package/dist/agents/cursor.js.map +1 -0
  11. package/dist/agents/index.d.ts +11 -0
  12. package/dist/agents/index.d.ts.map +1 -0
  13. package/dist/agents/index.js +23 -0
  14. package/dist/agents/index.js.map +1 -0
  15. package/dist/agents/types.d.ts +20 -0
  16. package/dist/agents/types.d.ts.map +1 -0
  17. package/dist/agents/types.js +2 -0
  18. package/dist/agents/types.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +95 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands/handoff/list.d.ts +23 -0
  24. package/dist/commands/handoff/list.d.ts.map +1 -0
  25. package/dist/commands/handoff/list.js +64 -0
  26. package/dist/commands/handoff/list.js.map +1 -0
  27. package/dist/commands/handoff.d.ts +25 -0
  28. package/dist/commands/handoff.d.ts.map +1 -0
  29. package/dist/commands/handoff.js +47 -0
  30. package/dist/commands/handoff.js.map +1 -0
  31. package/dist/commands/note.d.ts +10 -0
  32. package/dist/commands/note.d.ts.map +1 -0
  33. package/dist/commands/note.js +33 -0
  34. package/dist/commands/note.js.map +1 -0
  35. package/dist/commands/path/logs.d.ts +7 -0
  36. package/dist/commands/path/logs.d.ts.map +1 -0
  37. package/dist/commands/path/logs.js +17 -0
  38. package/dist/commands/path/logs.js.map +1 -0
  39. package/dist/commands/path/notes.d.ts +7 -0
  40. package/dist/commands/path/notes.d.ts.map +1 -0
  41. package/dist/commands/path/notes.js +17 -0
  42. package/dist/commands/path/notes.js.map +1 -0
  43. package/dist/commands/repo/init.d.ts +11 -0
  44. package/dist/commands/repo/init.d.ts.map +1 -0
  45. package/dist/commands/repo/init.js +78 -0
  46. package/dist/commands/repo/init.js.map +1 -0
  47. package/dist/commands/require-linked.d.ts +7 -0
  48. package/dist/commands/require-linked.d.ts.map +1 -0
  49. package/dist/commands/require-linked.js +19 -0
  50. package/dist/commands/require-linked.js.map +1 -0
  51. package/dist/commands/vault/init.d.ts +11 -0
  52. package/dist/commands/vault/init.d.ts.map +1 -0
  53. package/dist/commands/vault/init.js +73 -0
  54. package/dist/commands/vault/init.js.map +1 -0
  55. package/dist/connector/git.d.ts +12 -0
  56. package/dist/connector/git.d.ts.map +1 -0
  57. package/dist/connector/git.js +53 -0
  58. package/dist/connector/git.js.map +1 -0
  59. package/dist/connector/home.d.ts +13 -0
  60. package/dist/connector/home.d.ts.map +1 -0
  61. package/dist/connector/home.js +52 -0
  62. package/dist/connector/home.js.map +1 -0
  63. package/dist/connector/linked.d.ts +25 -0
  64. package/dist/connector/linked.d.ts.map +1 -0
  65. package/dist/connector/linked.js +24 -0
  66. package/dist/connector/linked.js.map +1 -0
  67. package/dist/connector/project-id.d.ts +17 -0
  68. package/dist/connector/project-id.d.ts.map +1 -0
  69. package/dist/connector/project-id.js +102 -0
  70. package/dist/connector/project-id.js.map +1 -0
  71. package/dist/connector/repo.d.ts +9 -0
  72. package/dist/connector/repo.d.ts.map +1 -0
  73. package/dist/connector/repo.js +41 -0
  74. package/dist/connector/repo.js.map +1 -0
  75. package/dist/connector/vault.d.ts +12 -0
  76. package/dist/connector/vault.d.ts.map +1 -0
  77. package/dist/connector/vault.js +27 -0
  78. package/dist/connector/vault.js.map +1 -0
  79. package/dist/index.d.ts +2 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +7 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/util/fs.d.ts +8 -0
  84. package/dist/util/fs.d.ts.map +1 -0
  85. package/dist/util/fs.js +36 -0
  86. package/dist/util/fs.js.map +1 -0
  87. package/dist/util/parse-args.d.ts +12 -0
  88. package/dist/util/parse-args.d.ts.map +1 -0
  89. package/dist/util/parse-args.js +49 -0
  90. package/dist/util/parse-args.js.map +1 -0
  91. package/dist/util/path.d.ts +10 -0
  92. package/dist/util/path.d.ts.map +1 -0
  93. package/dist/util/path.js +22 -0
  94. package/dist/util/path.js.map +1 -0
  95. package/dist/util/project-id.d.ts +2 -0
  96. package/dist/util/project-id.d.ts.map +1 -0
  97. package/dist/util/project-id.js +8 -0
  98. package/dist/util/project-id.js.map +1 -0
  99. package/dist/util/prompt.d.ts +2 -0
  100. package/dist/util/prompt.d.ts.map +1 -0
  101. package/dist/util/prompt.js +19 -0
  102. package/dist/util/prompt.js.map +1 -0
  103. package/dist/util/timestamp-slug.d.ts +38 -0
  104. package/dist/util/timestamp-slug.d.ts.map +1 -0
  105. package/dist/util/timestamp-slug.js +66 -0
  106. package/dist/util/timestamp-slug.js.map +1 -0
  107. package/dist/util/yaml.d.ts +6 -0
  108. package/dist/util/yaml.d.ts.map +1 -0
  109. package/dist/util/yaml.js +13 -0
  110. package/dist/util/yaml.js.map +1 -0
  111. package/dist/vault/layout.d.ts +13 -0
  112. package/dist/vault/layout.d.ts.map +1 -0
  113. package/dist/vault/layout.js +22 -0
  114. package/dist/vault/layout.js.map +1 -0
  115. package/dist/vault/list-handoffs.d.ts +10 -0
  116. package/dist/vault/list-handoffs.d.ts.map +1 -0
  117. package/dist/vault/list-handoffs.js +30 -0
  118. package/dist/vault/list-handoffs.js.map +1 -0
  119. package/dist/vault/write-handoff.d.ts +21 -0
  120. package/dist/vault/write-handoff.d.ts.map +1 -0
  121. package/dist/vault/write-handoff.js +40 -0
  122. package/dist/vault/write-handoff.js.map +1 -0
  123. package/dist/vault/write-note.d.ts +11 -0
  124. package/dist/vault/write-note.d.ts.map +1 -0
  125. package/dist/vault/write-note.js +15 -0
  126. package/dist/vault/write-note.js.map +1 -0
  127. package/package.json +45 -10
  128. package/templates/agents/claude/commands/grounder-note.md +11 -0
  129. package/templates/agents/claude/commands/grounder-task-handoff.md +54 -0
  130. package/templates/agents/claude/commands/grounder-task.md +20 -0
  131. package/templates/agents/cursor/commands/grounder-note.md +11 -0
  132. package/templates/agents/cursor/commands/grounder-task-handoff.md +54 -0
  133. package/templates/agents/cursor/commands/grounder-task.md +20 -0
  134. package/templates/vault/session-handoff.md +19 -0
  135. package/index.js +0 -1
@@ -0,0 +1,47 @@
1
+ import { currentBranch } from "../connector/git.js";
2
+ import { withHomeDir } from "../connector/home.js";
3
+ import { resolveLogsDir } from "../connector/vault.js";
4
+ import { flagString, parseArgs } from "../util/parse-args.js";
5
+ import { writeHandoff } from "../vault/write-handoff.js";
6
+ import { requireLinkedProject } from "./require-linked.js";
7
+ /**
8
+ * CLI entry for `grounder handoff <text> [--title <slug>]`.
9
+ * @returns Exit code (`0` on success, `1` on usage or config errors).
10
+ */
11
+ export async function runHandoff(argv) {
12
+ const { positional, flags } = parseArgs(argv);
13
+ const text = positional.join(" ").trim();
14
+ if (!text) {
15
+ process.stderr.write("Usage: grounder handoff <text>\n");
16
+ return 1;
17
+ }
18
+ return runHandoffWithOptions({
19
+ text,
20
+ title: flagString(flags, "title"),
21
+ });
22
+ }
23
+ /**
24
+ * Resolves the linked project, writes a new handoff under `logs/`, prints `Wrote <path>`.
25
+ * Same vault/link prerequisites as `grounder note`.
26
+ * @returns Exit code (`0` on success, `1` when vault/link is missing).
27
+ */
28
+ export async function runHandoffWithOptions(options) {
29
+ return withHomeDir(options.homeDir, async () => {
30
+ const linked = await requireLinkedProject(options.cwd ?? process.cwd());
31
+ if (!linked) {
32
+ return 1;
33
+ }
34
+ const { home, repo, gitRoot } = linked;
35
+ const logsDir = resolveLogsDir(home, repo);
36
+ const branch = gitRoot ? await currentBranch(gitRoot) : undefined;
37
+ const writtenPath = await writeHandoff(logsDir, options.text, {
38
+ projectId: repo.projectId,
39
+ title: options.title,
40
+ branch,
41
+ now: options.now,
42
+ });
43
+ process.stdout.write(`Wrote ${writtenPath}\n`);
44
+ return 0;
45
+ });
46
+ }
47
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAgB3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,qBAAqB,CAAC;QAC3B,IAAI;QACJ,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAuB;IACjE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;YAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM;YACN,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface NoteOptions {
2
+ cwd?: string;
3
+ text: string;
4
+ title?: string;
5
+ homeDir?: string;
6
+ now?: Date;
7
+ }
8
+ export declare function runNote(argv: string[]): Promise<number>;
9
+ export declare function runNoteWithOptions(options: NoteOptions): Promise<number>;
10
+ //# sourceMappingURL=note.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAa7D;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E"}
@@ -0,0 +1,33 @@
1
+ import { withHomeDir } from "../connector/home.js";
2
+ import { resolveNotesDir } from "../connector/vault.js";
3
+ import { flagString, parseArgs } from "../util/parse-args.js";
4
+ import { writeNote } from "../vault/write-note.js";
5
+ import { requireLinkedProject } from "./require-linked.js";
6
+ export async function runNote(argv) {
7
+ const { positional, flags } = parseArgs(argv);
8
+ const text = positional.join(" ").trim();
9
+ if (!text) {
10
+ process.stderr.write("Usage: grounder note <text>\n");
11
+ return 1;
12
+ }
13
+ return runNoteWithOptions({
14
+ text,
15
+ title: flagString(flags, "title"),
16
+ });
17
+ }
18
+ export async function runNoteWithOptions(options) {
19
+ return withHomeDir(options.homeDir, async () => {
20
+ const linked = await requireLinkedProject(options.cwd ?? process.cwd());
21
+ if (!linked) {
22
+ return 1;
23
+ }
24
+ const notesDir = resolveNotesDir(linked.home, linked.repo);
25
+ const writtenPath = await writeNote(notesDir, options.text, {
26
+ title: options.title,
27
+ now: options.now,
28
+ });
29
+ process.stdout.write(`Wrote ${writtenPath}\n`);
30
+ return 0;
31
+ });
32
+ }
33
+ //# sourceMappingURL=note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.js","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAU3D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,kBAAkB,CAAC;QACxB,IAAI;QACJ,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAoB;IAC3D,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE;YAC1D,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,WAAW,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface PathLogsOptions {
2
+ cwd?: string;
3
+ homeDir?: string;
4
+ }
5
+ export declare function runPathLogs(_argv: string[]): Promise<number>;
6
+ export declare function runPathLogsWithOptions(options?: PathLogsOptions): Promise<number>;
7
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/commands/path/logs.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3F"}
@@ -0,0 +1,17 @@
1
+ import { withHomeDir } from "../../connector/home.js";
2
+ import { resolveLogsDir } from "../../connector/vault.js";
3
+ import { requireLinkedProject } from "../require-linked.js";
4
+ export async function runPathLogs(_argv) {
5
+ return runPathLogsWithOptions({});
6
+ }
7
+ export async function runPathLogsWithOptions(options = {}) {
8
+ return withHomeDir(options.homeDir, async () => {
9
+ const linked = await requireLinkedProject(options.cwd ?? process.cwd());
10
+ if (!linked) {
11
+ return 1;
12
+ }
13
+ process.stdout.write(`${resolveLogsDir(linked.home, linked.repo)}\n`);
14
+ return 0;
15
+ });
16
+ }
17
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/path/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAe;IAC/C,OAAO,sBAAsB,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,UAA2B,EAAE;IACxE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface PathNotesOptions {
2
+ cwd?: string;
3
+ homeDir?: string;
4
+ }
5
+ export declare function runPathNotes(_argv: string[]): Promise<number>;
6
+ export declare function runPathNotesWithOptions(options?: PathNotesOptions): Promise<number>;
7
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../../src/commands/path/notes.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7F"}
@@ -0,0 +1,17 @@
1
+ import { withHomeDir } from "../../connector/home.js";
2
+ import { resolveNotesDir } from "../../connector/vault.js";
3
+ import { requireLinkedProject } from "../require-linked.js";
4
+ export async function runPathNotes(_argv) {
5
+ return runPathNotesWithOptions({});
6
+ }
7
+ export async function runPathNotesWithOptions(options = {}) {
8
+ return withHomeDir(options.homeDir, async () => {
9
+ const linked = await requireLinkedProject(options.cwd ?? process.cwd());
10
+ if (!linked) {
11
+ return 1;
12
+ }
13
+ process.stdout.write(`${resolveNotesDir(linked.home, linked.repo)}\n`);
14
+ return 0;
15
+ });
16
+ }
17
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/commands/path/notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,OAAO,uBAAuB,CAAC,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAA4B,EAAE;IAC1E,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface RepoInitOptions {
2
+ cwd?: string;
3
+ yes?: boolean;
4
+ force?: boolean;
5
+ id?: string;
6
+ vault?: string;
7
+ homeDir?: string;
8
+ }
9
+ export declare function runRepoInit(argv: string[]): Promise<number>;
10
+ export declare function runRepoInitWithOptions(options?: RepoInitOptions): Promise<number>;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQjE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsE3F"}
@@ -0,0 +1,78 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { findGitRoot } from "../../connector/git.js";
4
+ import { readHomeConfig, withHomeDir } from "../../connector/home.js";
5
+ import { detectProjectId, formatProjectIdSource } from "../../connector/project-id.js";
6
+ import { readRepoConfig, repoConfigPath, writeRepoConfig } from "../../connector/repo.js";
7
+ import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../../connector/vault.js";
8
+ import { flagBool, flagString, parseArgs } from "../../util/parse-args.js";
9
+ import { resolveUserPath } from "../../util/path.js";
10
+ import { confirm } from "../../util/prompt.js";
11
+ export async function runRepoInit(argv) {
12
+ const { flags } = parseArgs(argv);
13
+ return runRepoInitWithOptions({
14
+ yes: flagBool(flags, "yes", "y"),
15
+ force: flagBool(flags, "force", "f"),
16
+ id: flagString(flags, "id"),
17
+ vault: flagString(flags, "vault"),
18
+ });
19
+ }
20
+ export async function runRepoInitWithOptions(options = {}) {
21
+ return withHomeDir(options.homeDir, async () => {
22
+ const cwd = path.resolve(options.cwd ?? process.cwd());
23
+ const yes = options.yes ?? false;
24
+ const force = options.force ?? false;
25
+ const gitRoot = await findGitRoot(cwd);
26
+ let home = await readHomeConfig();
27
+ if (!home) {
28
+ if (!options.vault) {
29
+ process.stderr.write("No vault configured. Run: grounder vault init <path>\n");
30
+ return 1;
31
+ }
32
+ home = { vaultRoot: resolveUserPath(options.vault) };
33
+ }
34
+ const vaultRoot = resolveVaultRoot(home, options.vault);
35
+ const detected = await detectProjectId(cwd, options.id, gitRoot);
36
+ const existingRepo = await readRepoConfig(cwd);
37
+ const projectConfig = { version: 1, projectId: detected.id };
38
+ const notesDir = resolveNotesDir(home, projectConfig, options.vault);
39
+ const logsDir = resolveLogsDir(home, projectConfig, options.vault);
40
+ process.stdout.write(`✓ Folder: ${cwd}\n`);
41
+ if (gitRoot) {
42
+ process.stdout.write(`✓ Git repo: ${gitRoot}\n`);
43
+ }
44
+ process.stdout.write(`✓ Vault: ${vaultRoot}\n`);
45
+ process.stdout.write(`✓ Project: ${detected.id} (${formatProjectIdSource(detected.source)})\n\n`);
46
+ const notesDirRelative = path.relative(vaultRoot, notesDir);
47
+ const logsDirRelative = path.relative(vaultRoot, logsDir);
48
+ process.stdout.write("Will create:\n");
49
+ process.stdout.write(` link ${repoConfigPath(cwd)}\n`);
50
+ process.stdout.write(` vault ${notesDirRelative}/\n`);
51
+ process.stdout.write(` vault ${logsDirRelative}/\n`);
52
+ if (!yes) {
53
+ const proceed = await confirm("Proceed?");
54
+ if (!proceed) {
55
+ process.stdout.write("Aborted.\n");
56
+ return 0;
57
+ }
58
+ }
59
+ if (existingRepo && !force) {
60
+ if (existingRepo.projectId === detected.id) {
61
+ process.stdout.write("✓ Already linked (skipped)\n");
62
+ await mkdir(notesDir, { recursive: true });
63
+ await mkdir(logsDir, { recursive: true });
64
+ return 0;
65
+ }
66
+ process.stderr.write(`Folder already linked as ${existingRepo.projectId}. Use --force to overwrite.\n`);
67
+ return 1;
68
+ }
69
+ await writeRepoConfig(cwd, { version: 1, projectId: detected.id });
70
+ await mkdir(notesDir, { recursive: true });
71
+ await mkdir(logsDir, { recursive: true });
72
+ process.stdout.write("✓ Wrote .grounder.json\n");
73
+ process.stdout.write(`✓ Created notes folder: ${notesDir}\n`);
74
+ process.stdout.write(`✓ Created logs folder: ${logsDir}\n`);
75
+ return 0;
76
+ });
77
+ }
78
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type LinkedProject } from "../connector/linked.js";
2
+ /**
3
+ * Resolves the linked project for CLI commands.
4
+ * Writes the standard stderr hints and returns `null` on failure.
5
+ */
6
+ export declare function requireLinkedProject(cwd: string): Promise<LinkedProject | null>;
7
+ //# sourceMappingURL=require-linked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-linked.d.ts","sourceRoot":"","sources":["../../src/commands/require-linked.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,wBAAwB,CAAC;AAElF;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAWrF"}
@@ -0,0 +1,19 @@
1
+ import { resolveLinkedProject } from "../connector/linked.js";
2
+ /**
3
+ * Resolves the linked project for CLI commands.
4
+ * Writes the standard stderr hints and returns `null` on failure.
5
+ */
6
+ export async function requireLinkedProject(cwd) {
7
+ const result = await resolveLinkedProject(cwd);
8
+ if (!result.ok) {
9
+ if (result.error === "no-vault") {
10
+ process.stderr.write("No vault configured. Run: grounder vault init <path>\n");
11
+ }
12
+ else {
13
+ process.stderr.write("Folder not linked. Run: grounder init\n");
14
+ }
15
+ return null;
16
+ }
17
+ return result.value;
18
+ }
19
+ //# sourceMappingURL=require-linked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-linked.js","sourceRoot":"","sources":["../../src/commands/require-linked.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAElF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface VaultInitOptions {
2
+ vaultPath: string;
3
+ yes?: boolean;
4
+ force?: boolean;
5
+ homeDir?: string;
6
+ /** Agent ids to install for. Defaults to auto-detecting installed agents. */
7
+ agents?: string[];
8
+ }
9
+ export declare function runVaultInit(argv: string[]): Promise<number>;
10
+ export declare function runVaultInitWithOptions(options: VaultInitOptions): Promise<number>;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DxF"}
@@ -0,0 +1,73 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { resolveAgents } from "../../agents/index.js";
3
+ import { homeConfigPath, readHomeConfig, withHomeDir, writeHomeConfig, } from "../../connector/home.js";
4
+ import { flagBool, flagStrings, parseArgs } from "../../util/parse-args.js";
5
+ import { resolveUserPath } from "../../util/path.js";
6
+ import { confirm } from "../../util/prompt.js";
7
+ import { projectsParent } from "../../vault/layout.js";
8
+ export async function runVaultInit(argv) {
9
+ const { positional, flags, repeated } = parseArgs(argv);
10
+ const vaultPathArg = positional[0];
11
+ const yes = flagBool(flags, "yes", "y");
12
+ const force = flagBool(flags, "force", "f");
13
+ const agents = flagStrings(repeated, "agent");
14
+ if (!vaultPathArg) {
15
+ process.stderr.write("Usage: grounder vault init <path>\n");
16
+ return 1;
17
+ }
18
+ return runVaultInitWithOptions({
19
+ vaultPath: vaultPathArg,
20
+ yes,
21
+ force,
22
+ agents: agents.length > 0 ? agents : undefined,
23
+ });
24
+ }
25
+ export async function runVaultInitWithOptions(options) {
26
+ return withHomeDir(options.homeDir, async () => {
27
+ const vaultRoot = resolveUserPath(options.vaultPath);
28
+ const yes = options.yes ?? false;
29
+ const force = options.force ?? false;
30
+ const homeDir = options.homeDir;
31
+ const existingHome = await readHomeConfig();
32
+ const projectsDir = projectsParent(vaultRoot);
33
+ const agents = await resolveAgents(options.agents);
34
+ if (existingHome && existingHome.vaultRoot !== vaultRoot && !force) {
35
+ process.stderr.write(`Home config already exists with vault ${existingHome.vaultRoot}. Use --force to overwrite.\n`);
36
+ return 1;
37
+ }
38
+ process.stdout.write(`Vault root: ${vaultRoot}\n`);
39
+ process.stdout.write("Will write:\n");
40
+ process.stdout.write(` home ${homeConfigPath(homeDir)}\n`);
41
+ process.stdout.write(" vault 10-Projects/ (if missing)\n");
42
+ for (const agent of agents) {
43
+ process.stdout.write(` ${agent.id.padEnd(8)} (${agent.name} artifacts)\n`);
44
+ }
45
+ if (agents.length === 0) {
46
+ process.stdout.write(" (no supported agents detected — skipping agent artifacts)\n");
47
+ }
48
+ process.stdout.write("\n");
49
+ if (!yes) {
50
+ const proceed = await confirm("Proceed?");
51
+ if (!proceed) {
52
+ process.stdout.write("Aborted.\n");
53
+ return 0;
54
+ }
55
+ }
56
+ await writeHomeConfig({ vaultRoot });
57
+ await mkdir(projectsDir, { recursive: true });
58
+ process.stdout.write("✓ Wrote home config\n");
59
+ process.stdout.write(`✓ Vault scaffold: ${projectsDir}\n`);
60
+ for (const agent of agents) {
61
+ const result = await agent.install({ force, homeDir });
62
+ for (const [artifactPath, status] of Object.entries(result.artifacts)) {
63
+ const label = status === "skipped" ? "already exists (skipped)" : `installed: ${artifactPath}`;
64
+ process.stdout.write(`✓ ${agent.name} command ${label}\n`);
65
+ }
66
+ if (Object.keys(result.artifacts).length === 0) {
67
+ process.stdout.write(`✓ ${agent.name}: no artifacts to install yet\n`);
68
+ }
69
+ }
70
+ return 0;
71
+ });
72
+ }
73
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Walks upward from `startDir` looking for a `.git` entry.
3
+ * @returns Absolute git root, or `null` if none is found.
4
+ */
5
+ export declare function findGitRoot(startDir: string): Promise<string | null>;
6
+ /**
7
+ * Best-effort branch name via `git rev-parse --abbrev-ref HEAD`.
8
+ * @returns Branch name, or `undefined` if git fails / output is empty
9
+ * / detached HEAD (`abbrev-ref` prints `HEAD`), etc.
10
+ */
11
+ export declare function currentBranch(gitRoot: string): Promise<string | undefined>;
12
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/connector/git.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc1E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAchF"}
@@ -0,0 +1,53 @@
1
+ import { execFile } from "node:child_process";
2
+ import { access } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ async function isGitRoot(dir) {
7
+ try {
8
+ await access(path.join(dir, ".git"));
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ /**
16
+ * Walks upward from `startDir` looking for a `.git` entry.
17
+ * @returns Absolute git root, or `null` if none is found.
18
+ */
19
+ export async function findGitRoot(startDir) {
20
+ let current = path.resolve(startDir);
21
+ while (true) {
22
+ if (await isGitRoot(current)) {
23
+ return current;
24
+ }
25
+ const parent = path.dirname(current);
26
+ if (parent === current) {
27
+ return null;
28
+ }
29
+ current = parent;
30
+ }
31
+ }
32
+ /**
33
+ * Best-effort branch name via `git rev-parse --abbrev-ref HEAD`.
34
+ * @returns Branch name, or `undefined` if git fails / output is empty
35
+ * / detached HEAD (`abbrev-ref` prints `HEAD`), etc.
36
+ */
37
+ export async function currentBranch(gitRoot) {
38
+ try {
39
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
40
+ cwd: gitRoot,
41
+ encoding: "utf8",
42
+ });
43
+ const branch = String(stdout).trim();
44
+ if (!branch || branch === "HEAD") {
45
+ return undefined;
46
+ }
47
+ return branch;
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/connector/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE;YACnF,GAAG,EAAE,OAAO;YACZ,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface HomeConfig {
2
+ vaultRoot: string;
3
+ }
4
+ export declare function resolveHomeDir(override?: string): string;
5
+ export declare function homeConfigPath(homeDir?: string): string;
6
+ /**
7
+ * Runs `fn` with home config resolved under `homeDir` (for tests/sandboxing).
8
+ * Sets `GROUNDER_HOME` for the call, then restores it. No-op if `homeDir` is unset.
9
+ */
10
+ export declare function withHomeDir<T>(homeDir: string | undefined, fn: () => Promise<T>): Promise<T>;
11
+ export declare function readHomeConfig(): Promise<HomeConfig | null>;
12
+ export declare function writeHomeConfig(config: HomeConfig): Promise<void>;
13
+ //# sourceMappingURL=home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/connector/home.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAYjE;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE"}
@@ -0,0 +1,52 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileExists } from "../util/fs.js";
5
+ export function resolveHomeDir(override) {
6
+ if (override) {
7
+ return override;
8
+ }
9
+ return process.env.GROUNDER_HOME ?? os.homedir();
10
+ }
11
+ export function homeConfigPath(homeDir) {
12
+ return path.join(resolveHomeDir(homeDir), ".grounder", "config.json");
13
+ }
14
+ /**
15
+ * Runs `fn` with home config resolved under `homeDir` (for tests/sandboxing).
16
+ * Sets `GROUNDER_HOME` for the call, then restores it. No-op if `homeDir` is unset.
17
+ */
18
+ export async function withHomeDir(homeDir, fn) {
19
+ if (!homeDir) {
20
+ return fn();
21
+ }
22
+ const previous = process.env.GROUNDER_HOME;
23
+ process.env.GROUNDER_HOME = homeDir;
24
+ try {
25
+ return await fn();
26
+ }
27
+ finally {
28
+ if (previous === undefined) {
29
+ delete process.env.GROUNDER_HOME;
30
+ }
31
+ else {
32
+ process.env.GROUNDER_HOME = previous;
33
+ }
34
+ }
35
+ }
36
+ export async function readHomeConfig() {
37
+ const configPath = homeConfigPath();
38
+ if (!(await fileExists(configPath))) {
39
+ return null;
40
+ }
41
+ const raw = JSON.parse(await readFile(configPath, "utf8"));
42
+ if (typeof raw.vaultRoot !== "string" || raw.vaultRoot.length === 0) {
43
+ throw new Error(`Invalid home config at ${configPath}: missing vaultRoot`);
44
+ }
45
+ return { vaultRoot: raw.vaultRoot };
46
+ }
47
+ export async function writeHomeConfig(config) {
48
+ const configPath = homeConfigPath();
49
+ await mkdir(path.dirname(configPath), { recursive: true });
50
+ await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
51
+ }
52
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/connector/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B,EAC3B,EAAoB;IAEpB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,QAAQ,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,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,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,qBAAqB,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAkB;IACtD,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,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,25 @@
1
+ import { type HomeConfig } from "./home.js";
2
+ import { type RepoConfig } from "./repo.js";
3
+ /** Home config + linked repo marker resolved from a cwd. */
4
+ export interface LinkedProject {
5
+ home: HomeConfig;
6
+ repo: RepoConfig;
7
+ /** Directory that contains `.grounder.json`. */
8
+ linkedRoot: string;
9
+ /** Nearest git root when present. */
10
+ gitRoot: string | null;
11
+ }
12
+ export type LinkedProjectError = "no-vault" | "not-linked";
13
+ export type ResolveLinkedProjectResult = {
14
+ ok: true;
15
+ value: LinkedProject;
16
+ } | {
17
+ ok: false;
18
+ error: LinkedProjectError;
19
+ };
20
+ /**
21
+ * Resolves home vault config and the linked project marker for `cwd`.
22
+ * Does not write to stderr — callers map {@link LinkedProjectError} to UX.
23
+ */
24
+ export declare function resolveLinkedProject(cwd: string): Promise<ResolveLinkedProjectResult>;
25
+ //# sourceMappingURL=linked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked.d.ts","sourceRoot":"","sources":["../../src/connector/linked.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAsB,KAAK,UAAU,EAAkB,MAAM,WAAW,CAAC;AAEhF,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,YAAY,CAAC;AAE3D,MAAM,MAAM,0BAA0B,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE7C;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAkB3F"}
@@ -0,0 +1,24 @@
1
+ import { findGitRoot } from "./git.js";
2
+ import { readHomeConfig } from "./home.js";
3
+ import { findLinkedRepoRoot, readRepoConfig } from "./repo.js";
4
+ /**
5
+ * Resolves home vault config and the linked project marker for `cwd`.
6
+ * Does not write to stderr — callers map {@link LinkedProjectError} to UX.
7
+ */
8
+ export async function resolveLinkedProject(cwd) {
9
+ const home = await readHomeConfig();
10
+ if (!home) {
11
+ return { ok: false, error: "no-vault" };
12
+ }
13
+ const gitRoot = await findGitRoot(cwd);
14
+ const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
15
+ if (!linkedRoot) {
16
+ return { ok: false, error: "not-linked" };
17
+ }
18
+ const repo = await readRepoConfig(linkedRoot);
19
+ if (!repo) {
20
+ return { ok: false, error: "not-linked" };
21
+ }
22
+ return { ok: true, value: { home, repo, linkedRoot, gitRoot } };
23
+ }
24
+ //# sourceMappingURL=linked.js.map