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,204 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolveAgents } from "../agents/index.js";
|
|
4
|
+
import { findGitRoot } from "../connector/git.js";
|
|
5
|
+
import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
|
|
6
|
+
import { findLinkedRepoRoot, readRepoConfig } from "../connector/repo.js";
|
|
7
|
+
import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../connector/vault.js";
|
|
8
|
+
import { fileExists } from "../util/fs.js";
|
|
9
|
+
import { flagBool, parseArgs } from "../util/parse-args.js";
|
|
10
|
+
import { projectsParent } from "../vault/layout.js";
|
|
11
|
+
import { failCheck, okCheck, warnCheck } from "./check.js";
|
|
12
|
+
const VAULT_INIT = "grounder vault init <path>";
|
|
13
|
+
const VAULT_INIT_FORCE = "grounder vault init <path> --force";
|
|
14
|
+
const REPO_INIT = "grounder init";
|
|
15
|
+
async function isDirectory(dirPath) {
|
|
16
|
+
try {
|
|
17
|
+
const info = await stat(dirPath);
|
|
18
|
+
return info.isDirectory();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function formatCheck(check) {
|
|
25
|
+
const level = check.level.padEnd(4);
|
|
26
|
+
const id = check.id.padEnd(18);
|
|
27
|
+
const fix = check.fix ? ` → ${check.fix}` : "";
|
|
28
|
+
return ` ${level} ${id} ${check.message}${fix}\n`;
|
|
29
|
+
}
|
|
30
|
+
function writeSection(title, checks) {
|
|
31
|
+
process.stdout.write(`${title}\n`);
|
|
32
|
+
for (const check of checks) {
|
|
33
|
+
process.stdout.write(formatCheck(check));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function summarize(checks) {
|
|
37
|
+
const passed = checks.filter((c) => c.level === "ok").length;
|
|
38
|
+
const failed = checks.filter((c) => c.level === "fail").length;
|
|
39
|
+
const warned = checks.filter((c) => c.level === "warn").length;
|
|
40
|
+
return `${passed} passed, ${failed} failed, ${warned} warned\n`;
|
|
41
|
+
}
|
|
42
|
+
async function checkHomeConfig() {
|
|
43
|
+
const configPath = homeConfigPath();
|
|
44
|
+
if (!(await fileExists(configPath))) {
|
|
45
|
+
return {
|
|
46
|
+
check: failCheck("home-config", "home config missing", VAULT_INIT),
|
|
47
|
+
home: null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const home = await readHomeConfig();
|
|
52
|
+
if (!home) {
|
|
53
|
+
return {
|
|
54
|
+
check: failCheck("home-config", "home config missing", VAULT_INIT),
|
|
55
|
+
home: null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
check: okCheck("home-config", `home config present (${configPath})`),
|
|
60
|
+
home,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
65
|
+
return {
|
|
66
|
+
check: failCheck("home-config", `home config invalid: ${detail}`, VAULT_INIT),
|
|
67
|
+
home: null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function checkVault(home) {
|
|
72
|
+
if (!home) {
|
|
73
|
+
return {
|
|
74
|
+
check: failCheck("vault", "cannot resolve vault (no home config)", VAULT_INIT),
|
|
75
|
+
vaultRoot: null,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const vaultRoot = resolveVaultRoot(home);
|
|
79
|
+
if (!(await isDirectory(vaultRoot))) {
|
|
80
|
+
return {
|
|
81
|
+
check: failCheck("vault", `${vaultRoot} missing or not a directory`, "Fix path or re-run vault init"),
|
|
82
|
+
vaultRoot: null,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
check: okCheck("vault", `vault reachable (${vaultRoot})`),
|
|
87
|
+
vaultRoot,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async function checkProjectsDir(vaultRoot) {
|
|
91
|
+
if (!vaultRoot) {
|
|
92
|
+
return failCheck("projects-dir", "cannot check 10-Projects/ (no vault)", VAULT_INIT);
|
|
93
|
+
}
|
|
94
|
+
const projectsDir = projectsParent(vaultRoot);
|
|
95
|
+
if (!(await isDirectory(projectsDir))) {
|
|
96
|
+
return failCheck("projects-dir", `${projectsDir} missing`, `${VAULT_INIT} (idempotent)`);
|
|
97
|
+
}
|
|
98
|
+
return okCheck("projects-dir", `10-Projects/ present (${projectsDir})`);
|
|
99
|
+
}
|
|
100
|
+
async function checkAgentArtifacts(homeDir) {
|
|
101
|
+
const agents = await resolveAgents();
|
|
102
|
+
const checks = [];
|
|
103
|
+
for (const agent of agents) {
|
|
104
|
+
const expected = agent.expectedArtifacts(homeDir);
|
|
105
|
+
const present = await Promise.all(expected.map((p) => fileExists(p)));
|
|
106
|
+
const presentCount = present.filter(Boolean).length;
|
|
107
|
+
const id = `agent-${agent.id}`;
|
|
108
|
+
if (presentCount === expected.length) {
|
|
109
|
+
checks.push(okCheck(id, `${agent.name} command files present`));
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const fix = `${VAULT_INIT_FORCE} (or --agent=${agent.id})`;
|
|
113
|
+
if (presentCount === 0) {
|
|
114
|
+
checks.push(warnCheck(id, `${agent.name} detected but no Grounder command files`, fix));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const missing = expected.filter((_, i) => !present[i]);
|
|
118
|
+
checks.push(failCheck(id, `${agent.name} missing ${missing.length} command file(s): ${missing.map((p) => path.basename(p)).join(", ")}`, fix));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return checks;
|
|
122
|
+
}
|
|
123
|
+
async function runMachineChecks(homeDir) {
|
|
124
|
+
const { check: homeCheck, home } = await checkHomeConfig();
|
|
125
|
+
const { check: vaultCheck, vaultRoot } = await checkVault(home);
|
|
126
|
+
const projectsCheck = await checkProjectsDir(vaultRoot);
|
|
127
|
+
const agentChecks = await checkAgentArtifacts(homeDir);
|
|
128
|
+
return {
|
|
129
|
+
checks: [homeCheck, vaultCheck, projectsCheck, ...agentChecks],
|
|
130
|
+
home,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async function runProjectChecks(cwd, home) {
|
|
134
|
+
const checks = [];
|
|
135
|
+
const gitRoot = await findGitRoot(cwd);
|
|
136
|
+
const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
|
|
137
|
+
if (!linkedRoot) {
|
|
138
|
+
checks.push(failCheck("repo-config", "no .grounder.json uptree", REPO_INIT));
|
|
139
|
+
checks.push(failCheck("repo-config-valid", "cannot validate projectId (no repo config)", REPO_INIT));
|
|
140
|
+
checks.push(failCheck("notes-dir", "cannot resolve notes/ (no repo config)", REPO_INIT));
|
|
141
|
+
checks.push(failCheck("logs-dir", "cannot resolve logs/ (no repo config)", REPO_INIT));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
checks.push(okCheck("repo-config", `repo config present (${path.join(linkedRoot, ".grounder.json")})`));
|
|
145
|
+
let repo = null;
|
|
146
|
+
try {
|
|
147
|
+
repo = await readRepoConfig(linkedRoot);
|
|
148
|
+
if (!repo) {
|
|
149
|
+
checks.push(failCheck("repo-config-valid", "missing or invalid projectId", `Fix or re-run ${REPO_INIT} --force`));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
checks.push(okCheck("repo-config-valid", `projectId ok (${repo.projectId})`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
157
|
+
checks.push(failCheck("repo-config-valid", `invalid repo config: ${detail}`, `Fix or re-run ${REPO_INIT} --force`));
|
|
158
|
+
}
|
|
159
|
+
if (!home || !repo) {
|
|
160
|
+
const reason = !home ? "no home config" : "no valid repo config";
|
|
161
|
+
const fix = !home ? VAULT_INIT : REPO_INIT;
|
|
162
|
+
checks.push(failCheck("notes-dir", `cannot resolve notes/ (${reason})`, fix));
|
|
163
|
+
checks.push(failCheck("logs-dir", `cannot resolve logs/ (${reason})`, fix));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
const notes = resolveNotesDir(home, repo);
|
|
167
|
+
const logs = resolveLogsDir(home, repo);
|
|
168
|
+
checks.push((await isDirectory(notes))
|
|
169
|
+
? okCheck("notes-dir", `notes/ present (${notes})`)
|
|
170
|
+
: failCheck("notes-dir", `${notes} missing`, `${REPO_INIT} (creates dirs)`));
|
|
171
|
+
checks.push((await isDirectory(logs))
|
|
172
|
+
? okCheck("logs-dir", `logs/ present (${logs})`)
|
|
173
|
+
: failCheck("logs-dir", `${logs} missing`, REPO_INIT));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!gitRoot) {
|
|
177
|
+
checks.push(warnCheck("git", "no git repository found (optional)"));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
checks.push(okCheck("git", `git root (${gitRoot})`));
|
|
181
|
+
}
|
|
182
|
+
return checks;
|
|
183
|
+
}
|
|
184
|
+
export async function runDoctor(argv) {
|
|
185
|
+
const { flags } = parseArgs(argv);
|
|
186
|
+
return runDoctorWithOptions({ global: flagBool(flags, "global") });
|
|
187
|
+
}
|
|
188
|
+
export async function runDoctorWithOptions(options = {}) {
|
|
189
|
+
return withHomeDir(options.homeDir, async () => {
|
|
190
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
191
|
+
const { checks: machineChecks, home } = await runMachineChecks(options.homeDir);
|
|
192
|
+
const projectChecks = options.global ? [] : await runProjectChecks(cwd, home);
|
|
193
|
+
const checks = [...machineChecks, ...projectChecks];
|
|
194
|
+
writeSection("Machine", machineChecks);
|
|
195
|
+
if (!options.global) {
|
|
196
|
+
process.stdout.write("\n");
|
|
197
|
+
writeSection("Project", projectChecks);
|
|
198
|
+
}
|
|
199
|
+
process.stdout.write("\n");
|
|
200
|
+
process.stdout.write(summarize(checks));
|
|
201
|
+
return checks.some((c) => c.level === "fail") ? 1 : 0;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Options for {@link runHandoffListWithOptions} (CLI parsing and tests). */
|
|
2
|
+
export interface HandoffListOptions {
|
|
3
|
+
/** Directory used to find the linked repo (default: `process.cwd()`). */
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** Max paths to print, newest first (default: 5). */
|
|
6
|
+
limit?: number;
|
|
7
|
+
/** Override home dir / `GROUNDER_HOME` (tests). */
|
|
8
|
+
homeDir?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* CLI entry for `grounder handoff list [--limit <n>]`.
|
|
12
|
+
* `--limit` must be a positive integer when provided.
|
|
13
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
14
|
+
*/
|
|
15
|
+
export declare function runHandoffList(argv: string[]): Promise<number>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the linked project, lists recent handoff paths under `logs/` (newest first).
|
|
18
|
+
* Prints one absolute path per line; empty when no handoffs. Same vault/link
|
|
19
|
+
* prerequisites as `grounder handoff`.
|
|
20
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
21
|
+
*/
|
|
22
|
+
export declare function runHandoffListWithOptions(options?: HandoffListOptions): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/handoff/list.ts"],"names":[],"mappings":"AAQA,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BpE;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBjG"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { withHomeDir } from "../../connector/home.js";
|
|
2
|
+
import { resolveLogsDir } from "../../connector/vault.js";
|
|
3
|
+
import { parseArgs } from "../../util/parse-args.js";
|
|
4
|
+
import { listHandoffs } from "../../vault/list-handoffs.js";
|
|
5
|
+
import { requireLinkedProject } from "../require-linked.js";
|
|
6
|
+
const DEFAULT_LIMIT = 5;
|
|
7
|
+
const USAGE = "Usage: grounder handoff list [--limit <n>]\n";
|
|
8
|
+
function usageError() {
|
|
9
|
+
process.stderr.write(USAGE);
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* CLI entry for `grounder handoff list [--limit <n>]`.
|
|
14
|
+
* `--limit` must be a positive integer when provided.
|
|
15
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
16
|
+
*/
|
|
17
|
+
export async function runHandoffList(argv) {
|
|
18
|
+
const { positional, flags } = parseArgs(argv);
|
|
19
|
+
if (positional.length > 0) {
|
|
20
|
+
return usageError();
|
|
21
|
+
}
|
|
22
|
+
for (const key of flags.keys()) {
|
|
23
|
+
if (key !== "limit") {
|
|
24
|
+
return usageError();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const limitRaw = flags.get("limit");
|
|
28
|
+
let limit = DEFAULT_LIMIT;
|
|
29
|
+
if (limitRaw !== undefined) {
|
|
30
|
+
if (typeof limitRaw !== "string") {
|
|
31
|
+
return usageError();
|
|
32
|
+
}
|
|
33
|
+
const trimmed = limitRaw.trim();
|
|
34
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
35
|
+
if (!/^\d+$/.test(trimmed) || Number.isNaN(parsed) || parsed < 1) {
|
|
36
|
+
return usageError();
|
|
37
|
+
}
|
|
38
|
+
limit = parsed;
|
|
39
|
+
}
|
|
40
|
+
return runHandoffListWithOptions({ limit });
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolves the linked project, lists recent handoff paths under `logs/` (newest first).
|
|
44
|
+
* Prints one absolute path per line; empty when no handoffs. Same vault/link
|
|
45
|
+
* prerequisites as `grounder handoff`.
|
|
46
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
47
|
+
*/
|
|
48
|
+
export async function runHandoffListWithOptions(options = {}) {
|
|
49
|
+
return withHomeDir(options.homeDir, async () => {
|
|
50
|
+
const linked = await requireLinkedProject(options.cwd ?? process.cwd());
|
|
51
|
+
if (!linked) {
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
const logsDir = resolveLogsDir(linked.home, linked.repo);
|
|
55
|
+
const paths = await listHandoffs(logsDir, {
|
|
56
|
+
limit: options.limit ?? DEFAULT_LIMIT,
|
|
57
|
+
});
|
|
58
|
+
for (const filePath of paths) {
|
|
59
|
+
process.stdout.write(`${filePath}\n`);
|
|
60
|
+
}
|
|
61
|
+
return 0;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/handoff/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,aAAa,GAAG,CAAC,CAAC;AAYxB,MAAM,KAAK,GAAG,8CAA8C,CAAC;AAE7D,SAAS,UAAU;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,aAAa,CAAC;IAC1B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,UAAU,EAAE,CAAC;QACtB,CAAC;QACD,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IAED,OAAO,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAA8B,EAAE;IAC9E,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,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,aAAa;SACtC,CAAC,CAAC;QAEH,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Options for {@link runHandoffWithOptions} (CLI parsing and tests). */
|
|
2
|
+
export interface HandoffOptions {
|
|
3
|
+
/** Directory used to find the linked repo (default: `process.cwd()`). */
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** Markdown body stored under the project `logs/` folder. */
|
|
6
|
+
text: string;
|
|
7
|
+
/** Optional filename + frontmatter title slug (`--title`). */
|
|
8
|
+
title?: string;
|
|
9
|
+
/** Override home dir / `GROUNDER_HOME` (tests). */
|
|
10
|
+
homeDir?: string;
|
|
11
|
+
/** Fixed clock for deterministic filenames and `created` (tests). */
|
|
12
|
+
now?: Date;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* CLI entry for `grounder handoff <text> [--title <slug>]`.
|
|
16
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
17
|
+
*/
|
|
18
|
+
export declare function runHandoff(argv: string[]): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolves the linked project, writes a new handoff under `logs/`, prints `Wrote <path>`.
|
|
21
|
+
* Same vault/link prerequisites as `grounder note`.
|
|
22
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
23
|
+
*/
|
|
24
|
+
export declare function runHandoffWithOptions(options: HandoffOptions): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAOA,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAahE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBpF"}
|
|
@@ -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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"}
|