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,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,7 @@
|
|
|
1
|
+
export interface StatusOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
homeDir?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function runStatus(_argv: string[]): Promise<number>;
|
|
6
|
+
export declare function runStatusWithOptions(options?: StatusOptions): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA8CD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgEvF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { currentBranch, findGitRoot } from "../connector/git.js";
|
|
3
|
+
import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
|
|
4
|
+
import { findLinkedRepoRoot, readRepoConfig, repoConfigPath, } from "../connector/repo.js";
|
|
5
|
+
import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../connector/vault.js";
|
|
6
|
+
const LABEL_WIDTH = 12;
|
|
7
|
+
const VAULT_INIT = "grounder vault init <path>";
|
|
8
|
+
const REPO_INIT = "grounder init";
|
|
9
|
+
const REPO_INIT_FORCE = "grounder init --force";
|
|
10
|
+
function section(title) {
|
|
11
|
+
return `${title}\n`;
|
|
12
|
+
}
|
|
13
|
+
function statusLine(label, value) {
|
|
14
|
+
return ` ${label.padEnd(LABEL_WIDTH)}${value}\n`;
|
|
15
|
+
}
|
|
16
|
+
function errorDetail(error) {
|
|
17
|
+
return error instanceof Error ? error.message : String(error);
|
|
18
|
+
}
|
|
19
|
+
async function writeGitLine(gitRoot) {
|
|
20
|
+
if (!gitRoot) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const branch = await currentBranch(gitRoot);
|
|
24
|
+
const gitValue = branch !== undefined ? `${gitRoot} (branch: ${branch})` : gitRoot;
|
|
25
|
+
process.stdout.write(statusLine("Git:", gitValue));
|
|
26
|
+
}
|
|
27
|
+
async function tryReadHome() {
|
|
28
|
+
try {
|
|
29
|
+
return { home: await readHomeConfig(), invalid: null };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return { home: null, invalid: errorDetail(error) };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function tryReadRepo(linkedRoot) {
|
|
36
|
+
try {
|
|
37
|
+
return { repo: await readRepoConfig(linkedRoot), invalid: null };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return { repo: null, invalid: errorDetail(error) };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function runStatus(_argv) {
|
|
44
|
+
return runStatusWithOptions({});
|
|
45
|
+
}
|
|
46
|
+
export async function runStatusWithOptions(options = {}) {
|
|
47
|
+
return withHomeDir(options.homeDir, async () => {
|
|
48
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
49
|
+
const { home, invalid: homeInvalid } = await tryReadHome();
|
|
50
|
+
const gitRoot = await findGitRoot(cwd);
|
|
51
|
+
const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
|
|
52
|
+
const { repo, invalid: repoInvalid } = linkedRoot
|
|
53
|
+
? await tryReadRepo(linkedRoot)
|
|
54
|
+
: { repo: null, invalid: null };
|
|
55
|
+
process.stdout.write(section("Machine"));
|
|
56
|
+
if (homeInvalid) {
|
|
57
|
+
process.stdout.write(statusLine("Config:", `invalid → run: ${VAULT_INIT}`));
|
|
58
|
+
}
|
|
59
|
+
else if (!home) {
|
|
60
|
+
process.stdout.write(statusLine("Config:", `missing → run: ${VAULT_INIT}`));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
process.stdout.write(statusLine("Config:", homeConfigPath()));
|
|
64
|
+
process.stdout.write(statusLine("Vault:", resolveVaultRoot(home)));
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write("\n");
|
|
67
|
+
process.stdout.write(section("Project"));
|
|
68
|
+
if (!linkedRoot) {
|
|
69
|
+
process.stdout.write(statusLine("Linked:", "no"));
|
|
70
|
+
if (home) {
|
|
71
|
+
process.stdout.write(statusLine("Config:", `missing → run: ${REPO_INIT}`));
|
|
72
|
+
}
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
if (repoInvalid || !repo) {
|
|
76
|
+
const fix = home ? REPO_INIT_FORCE : VAULT_INIT;
|
|
77
|
+
process.stdout.write(statusLine("Linked:", `incomplete → run: ${fix}`));
|
|
78
|
+
process.stdout.write(statusLine("Folder:", linkedRoot));
|
|
79
|
+
process.stdout.write(statusLine("Config:", repoInvalid ? `invalid → run: ${REPO_INIT_FORCE}` : `missing → run: ${REPO_INIT}`));
|
|
80
|
+
await writeGitLine(gitRoot);
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
if (!home) {
|
|
84
|
+
process.stdout.write(statusLine("Linked:", `incomplete → run: ${VAULT_INIT}`));
|
|
85
|
+
process.stdout.write(statusLine("Folder:", linkedRoot));
|
|
86
|
+
process.stdout.write(statusLine("Config:", repoConfigPath(linkedRoot)));
|
|
87
|
+
process.stdout.write(statusLine("Id:", repo.projectId));
|
|
88
|
+
await writeGitLine(gitRoot);
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
process.stdout.write(statusLine("Linked:", "yes"));
|
|
92
|
+
process.stdout.write(statusLine("Folder:", linkedRoot));
|
|
93
|
+
process.stdout.write(statusLine("Config:", repoConfigPath(linkedRoot)));
|
|
94
|
+
process.stdout.write(statusLine("Id:", repo.projectId));
|
|
95
|
+
process.stdout.write(statusLine("Notes:", resolveNotesDir(home, repo)));
|
|
96
|
+
process.stdout.write(statusLine("Logs:", resolveLogsDir(home, repo)));
|
|
97
|
+
await writeGitLine(gitRoot);
|
|
98
|
+
return 0;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked.js","sourceRoot":"","sources":["../../src/connector/linked.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAkBhF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ProjectIdSource = "flag" | "package.json" | "git-remote" | "basename";
|
|
2
|
+
export interface DetectedProjectId {
|
|
3
|
+
id: string;
|
|
4
|
+
source: ProjectIdSource;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Detects the project id for a given link root.
|
|
8
|
+
* Tries to detect it from the package.json, git remote, and folder name.
|
|
9
|
+
*
|
|
10
|
+
* @param linkRoot - The root directory of the link.
|
|
11
|
+
* @param override - An optional project id to use instead of detecting one.
|
|
12
|
+
* @param gitRoot - An optional git root to use instead of detecting one.
|
|
13
|
+
* @returns The detected project id.
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectProjectId(linkRoot: string, override?: string, gitRoot?: string | null): Promise<DetectedProjectId>;
|
|
16
|
+
export declare function formatProjectIdSource(source: ProjectIdSource): string;
|
|
17
|
+
//# sourceMappingURL=project-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-id.d.ts","sourceRoot":"","sources":["../../src/connector/project-id.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,eAAe,CAAC;CACzB;AAkDD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAWrE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { sanitizeProjectId } from "../util/project-id.js";
|
|
4
|
+
async function readPackageName(repoRoot) {
|
|
5
|
+
const packagePath = path.join(repoRoot, "package.json");
|
|
6
|
+
try {
|
|
7
|
+
const raw = JSON.parse(await readFile(packagePath, "utf8"));
|
|
8
|
+
return typeof raw.name === "string" && raw.name.length > 0 ? raw.name : null;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function parseRemoteSlug(url) {
|
|
15
|
+
const trimmed = url.trim();
|
|
16
|
+
const scpMatch = /^[^@]+@[^:]+:(.+)$/.exec(trimmed);
|
|
17
|
+
const rawPath = scpMatch ? scpMatch[1] : trimmed.replace(/^[^:]+:\/\//, "");
|
|
18
|
+
const lastSegment = rawPath.split("/").filter(Boolean).pop();
|
|
19
|
+
if (!lastSegment) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return lastSegment.replace(/\.git$/i, "");
|
|
23
|
+
}
|
|
24
|
+
async function readGitRemoteSlug(repoRoot) {
|
|
25
|
+
const configPath = path.join(repoRoot, ".git", "config");
|
|
26
|
+
try {
|
|
27
|
+
const contents = await readFile(configPath, "utf8");
|
|
28
|
+
const lines = contents.split("\n");
|
|
29
|
+
let inOrigin = false;
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
const section = /^\[remote "(.+)"\]$/.exec(line.trim());
|
|
32
|
+
if (section) {
|
|
33
|
+
inOrigin = section[1] === "origin";
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (inOrigin) {
|
|
37
|
+
const urlMatch = /^\s*url\s*=\s*(.+)$/.exec(line);
|
|
38
|
+
if (urlMatch) {
|
|
39
|
+
return parseRemoteSlug(urlMatch[1]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detects the project id for a given link root.
|
|
51
|
+
* Tries to detect it from the package.json, git remote, and folder name.
|
|
52
|
+
*
|
|
53
|
+
* @param linkRoot - The root directory of the link.
|
|
54
|
+
* @param override - An optional project id to use instead of detecting one.
|
|
55
|
+
* @param gitRoot - An optional git root to use instead of detecting one.
|
|
56
|
+
* @returns The detected project id.
|
|
57
|
+
*/
|
|
58
|
+
export async function detectProjectId(linkRoot, override, gitRoot) {
|
|
59
|
+
if (override) {
|
|
60
|
+
const id = sanitizeProjectId(override);
|
|
61
|
+
if (!id) {
|
|
62
|
+
throw new Error(`Invalid project id: ${override}`);
|
|
63
|
+
}
|
|
64
|
+
return { id, source: "flag" };
|
|
65
|
+
}
|
|
66
|
+
const packageName = await readPackageName(linkRoot);
|
|
67
|
+
if (packageName) {
|
|
68
|
+
const id = sanitizeProjectId(packageName);
|
|
69
|
+
if (id) {
|
|
70
|
+
return { id, source: "package.json" };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (gitRoot !== null) {
|
|
74
|
+
const remoteRoot = gitRoot ?? linkRoot;
|
|
75
|
+
const remoteSlug = await readGitRemoteSlug(remoteRoot);
|
|
76
|
+
if (remoteSlug) {
|
|
77
|
+
const id = sanitizeProjectId(remoteSlug);
|
|
78
|
+
if (id) {
|
|
79
|
+
return { id, source: "git-remote" };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const basename = path.basename(linkRoot);
|
|
84
|
+
const id = sanitizeProjectId(basename);
|
|
85
|
+
if (!id) {
|
|
86
|
+
throw new Error("Could not detect a valid project id");
|
|
87
|
+
}
|
|
88
|
+
return { id, source: "basename" };
|
|
89
|
+
}
|
|
90
|
+
export function formatProjectIdSource(source) {
|
|
91
|
+
switch (source) {
|
|
92
|
+
case "flag":
|
|
93
|
+
return "from --id";
|
|
94
|
+
case "package.json":
|
|
95
|
+
return "from package.json";
|
|
96
|
+
case "git-remote":
|
|
97
|
+
return "from git remote";
|
|
98
|
+
case "basename":
|
|
99
|
+
return "from folder name";
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=project-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-id.js","sourceRoot":"","sources":["../../src/connector/project-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RepoConfig {
|
|
2
|
+
version: 1;
|
|
3
|
+
projectId: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function repoConfigPath(repoRoot: string): string;
|
|
6
|
+
export declare function findLinkedRepoRoot(cwd: string, gitRoot?: string | null): Promise<string | null>;
|
|
7
|
+
export declare function readRepoConfig(repoRoot: string): Promise<RepoConfig | null>;
|
|
8
|
+
export declare function writeRepoConfig(repoRoot: string, config: RepoConfig): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAYjF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF"}
|