grounder 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -28
- package/dist/agents/claude.d.ts +15 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +256 -11
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor-hook-input.d.ts +14 -0
- package/dist/agents/cursor-hook-input.d.ts.map +1 -0
- package/dist/agents/cursor-hook-input.js +80 -0
- package/dist/agents/cursor-hook-input.js.map +1 -0
- package/dist/agents/cursor.d.ts +11 -0
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +206 -11
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/hook-runtime.d.ts +152 -0
- package/dist/agents/hook-runtime.d.ts.map +1 -0
- package/dist/agents/hook-runtime.js +401 -0
- package/dist/agents/hook-runtime.js.map +1 -0
- package/dist/agents/index.d.ts +18 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +27 -4
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/install-command.d.ts +37 -0
- package/dist/agents/install-command.d.ts.map +1 -0
- package/dist/agents/install-command.js +65 -0
- package/dist/agents/install-command.js.map +1 -0
- package/dist/agents/types.d.ts +23 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli.js +62 -53
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply-agent-installs.d.ts +34 -0
- package/dist/commands/apply-agent-installs.d.ts.map +1 -0
- package/dist/commands/apply-agent-installs.js +137 -0
- package/dist/commands/apply-agent-installs.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +231 -14
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts +9 -0
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +20 -4
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff/peek.d.ts +41 -0
- package/dist/commands/handoff/peek.d.ts.map +1 -0
- package/dist/commands/handoff/peek.js +161 -0
- package/dist/commands/handoff/peek.js.map +1 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +5 -0
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/migrate.d.ts +23 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +104 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +5 -0
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/package-version-notice.d.ts +18 -0
- package/dist/commands/package-version-notice.d.ts.map +1 -0
- package/dist/commands/package-version-notice.js +39 -0
- package/dist/commands/package-version-notice.js.map +1 -0
- package/dist/commands/path/logs.d.ts +1 -1
- package/dist/commands/path/logs.d.ts.map +1 -1
- package/dist/commands/path/logs.js +6 -1
- package/dist/commands/path/logs.js.map +1 -1
- package/dist/commands/path/notes.d.ts +1 -1
- package/dist/commands/path/notes.d.ts.map +1 -1
- package/dist/commands/path/notes.js +6 -1
- package/dist/commands/path/notes.js.map +1 -1
- package/dist/commands/path/plans.d.ts +7 -0
- package/dist/commands/path/plans.d.ts.map +1 -0
- package/dist/commands/path/plans.js +22 -0
- package/dist/commands/path/plans.js.map +1 -0
- package/dist/commands/plan/list.d.ts +23 -0
- package/dist/commands/plan/list.d.ts.map +1 -0
- package/dist/commands/plan/list.js +69 -0
- package/dist/commands/plan/list.js.map +1 -0
- package/dist/commands/plan.d.ts +34 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +121 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/repo/init.d.ts.map +1 -1
- package/dist/commands/repo/init.js +12 -1
- package/dist/commands/repo/init.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +52 -9
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade-banner.d.ts +9 -0
- package/dist/commands/upgrade-banner.d.ts.map +1 -0
- package/dist/commands/upgrade-banner.js +27 -0
- package/dist/commands/upgrade-banner.js.map +1 -0
- package/dist/commands/vault/init.d.ts +2 -0
- package/dist/commands/vault/init.d.ts.map +1 -1
- package/dist/commands/vault/init.js +28 -11
- package/dist/commands/vault/init.js.map +1 -1
- package/dist/connector/repo.d.ts +2 -0
- package/dist/connector/repo.d.ts.map +1 -1
- package/dist/connector/repo.js +12 -1
- package/dist/connector/repo.js.map +1 -1
- package/dist/connector/state.d.ts +95 -0
- package/dist/connector/state.d.ts.map +1 -0
- package/dist/connector/state.js +189 -0
- package/dist/connector/state.js.map +1 -0
- package/dist/connector/unsupported-schema.d.ts +9 -0
- package/dist/connector/unsupported-schema.d.ts.map +1 -0
- package/dist/connector/unsupported-schema.js +14 -0
- package/dist/connector/unsupported-schema.js.map +1 -0
- package/dist/connector/vault.d.ts +2 -0
- package/dist/connector/vault.d.ts.map +1 -1
- package/dist/connector/vault.js +6 -1
- package/dist/connector/vault.js.map +1 -1
- package/dist/help.d.ts +45 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +355 -0
- package/dist/help.js.map +1 -0
- package/dist/util/frontmatter.d.ts +11 -0
- package/dist/util/frontmatter.d.ts.map +1 -0
- package/dist/util/frontmatter.js +69 -0
- package/dist/util/frontmatter.js.map +1 -0
- package/dist/util/fs.d.ts +6 -0
- package/dist/util/fs.d.ts.map +1 -1
- package/dist/util/fs.js +15 -1
- package/dist/util/fs.js.map +1 -1
- package/dist/util/hash.d.ts +3 -0
- package/dist/util/hash.d.ts.map +1 -0
- package/dist/util/hash.js +6 -0
- package/dist/util/hash.js.map +1 -0
- package/dist/util/merge-json.d.ts +15 -0
- package/dist/util/merge-json.d.ts.map +1 -0
- package/dist/util/merge-json.js +40 -0
- package/dist/util/merge-json.js.map +1 -0
- package/dist/util/path.d.ts +10 -0
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +31 -0
- package/dist/util/path.js.map +1 -1
- package/dist/util/plan-name.d.ts +10 -0
- package/dist/util/plan-name.d.ts.map +1 -0
- package/dist/util/plan-name.js +18 -0
- package/dist/util/plan-name.js.map +1 -0
- package/dist/util/semver.d.ts +10 -0
- package/dist/util/semver.d.ts.map +1 -0
- package/dist/util/semver.js +40 -0
- package/dist/util/semver.js.map +1 -0
- package/dist/vault/find-usable-handoff.d.ts +19 -0
- package/dist/vault/find-usable-handoff.d.ts.map +1 -0
- package/dist/vault/find-usable-handoff.js +28 -0
- package/dist/vault/find-usable-handoff.js.map +1 -0
- package/dist/vault/layout.d.ts +2 -0
- package/dist/vault/layout.d.ts.map +1 -1
- package/dist/vault/layout.js +4 -0
- package/dist/vault/layout.js.map +1 -1
- package/dist/vault/list-plans.d.ts +11 -0
- package/dist/vault/list-plans.d.ts.map +1 -0
- package/dist/vault/list-plans.js +40 -0
- package/dist/vault/list-plans.js.map +1 -0
- package/dist/vault/write-plan.d.ts +28 -0
- package/dist/vault/write-plan.d.ts.map +1 -0
- package/dist/vault/write-plan.js +61 -0
- package/dist/vault/write-plan.js.map +1 -0
- package/package.json +1 -1
- package/templates/agents/claude/commands/grounder-note.md +1 -1
- package/templates/agents/claude/commands/grounder-plan.md +65 -0
- package/templates/agents/claude/commands/grounder-task-handoff.md +3 -3
- package/templates/agents/claude/commands/grounder-task.md +4 -4
- package/templates/agents/cursor/commands/grounder-note.md +1 -1
- package/templates/agents/cursor/commands/grounder-plan.md +65 -0
- package/templates/agents/cursor/commands/grounder-task-handoff.md +3 -3
- package/templates/agents/cursor/commands/grounder-task.md +4 -4
- package/templates/vault/plan.md +16 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { withHomeDir } from "../../connector/home.js";
|
|
2
|
+
import { resolvePlansDir } from "../../connector/vault.js";
|
|
3
|
+
import { helpExitCode } from "../../help.js";
|
|
4
|
+
import { parseArgs } from "../../util/parse-args.js";
|
|
5
|
+
import { listPlans } from "../../vault/list-plans.js";
|
|
6
|
+
import { requireLinkedProject } from "../require-linked.js";
|
|
7
|
+
const DEFAULT_LIMIT = 5;
|
|
8
|
+
const USAGE = "Usage: grounder plan list [--limit <n>]\n";
|
|
9
|
+
function usageError() {
|
|
10
|
+
process.stderr.write(USAGE);
|
|
11
|
+
return 1;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* CLI entry for `grounder plan list [--limit <n>]`.
|
|
15
|
+
* `--limit` must be a positive integer when provided.
|
|
16
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
17
|
+
*/
|
|
18
|
+
export async function runPlanList(argv) {
|
|
19
|
+
const helpCode = helpExitCode(argv, "plan list");
|
|
20
|
+
if (helpCode !== null) {
|
|
21
|
+
return helpCode;
|
|
22
|
+
}
|
|
23
|
+
const { positional, flags } = parseArgs(argv);
|
|
24
|
+
if (positional.length > 0) {
|
|
25
|
+
return usageError();
|
|
26
|
+
}
|
|
27
|
+
for (const key of flags.keys()) {
|
|
28
|
+
if (key !== "limit") {
|
|
29
|
+
return usageError();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const limitRaw = flags.get("limit");
|
|
33
|
+
let limit = DEFAULT_LIMIT;
|
|
34
|
+
if (limitRaw !== undefined) {
|
|
35
|
+
if (typeof limitRaw !== "string") {
|
|
36
|
+
return usageError();
|
|
37
|
+
}
|
|
38
|
+
const trimmed = limitRaw.trim();
|
|
39
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
40
|
+
if (!/^\d+$/.test(trimmed) || Number.isNaN(parsed) || parsed < 1) {
|
|
41
|
+
return usageError();
|
|
42
|
+
}
|
|
43
|
+
limit = parsed;
|
|
44
|
+
}
|
|
45
|
+
return runPlanListWithOptions({ limit });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolves the linked project, lists recent plan paths under `plans/` (newest first).
|
|
49
|
+
* Prints one absolute path per line; empty when no plans. Same vault/link
|
|
50
|
+
* prerequisites as `grounder plan`.
|
|
51
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
52
|
+
*/
|
|
53
|
+
export async function runPlanListWithOptions(options = {}) {
|
|
54
|
+
return withHomeDir(options.homeDir, async () => {
|
|
55
|
+
const linked = await requireLinkedProject(options.cwd ?? process.cwd());
|
|
56
|
+
if (!linked) {
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
const plansDir = resolvePlansDir(linked.home, linked.repo);
|
|
60
|
+
const paths = await listPlans(plansDir, {
|
|
61
|
+
limit: options.limit ?? DEFAULT_LIMIT,
|
|
62
|
+
});
|
|
63
|
+
for (const filePath of paths) {
|
|
64
|
+
process.stdout.write(`${filePath}\n`);
|
|
65
|
+
}
|
|
66
|
+
return 0;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/plan/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Options for {@link runPlanWithOptions} (CLI parsing and tests). */
|
|
2
|
+
export interface PlanOptions {
|
|
3
|
+
/** Directory used to find the linked repo (default: `process.cwd()`). */
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** Markdown body stored under the project `plans/` folder. */
|
|
6
|
+
text: string;
|
|
7
|
+
/** Required filename stem (`--title`); sanitized via {@link sanitizePlanName}. */
|
|
8
|
+
title?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Absolute or relative path to an existing plan file (`--path`).
|
|
11
|
+
* Mutually exclusive with `--title`. Updates in place (no sanitization).
|
|
12
|
+
*/
|
|
13
|
+
planPath?: string;
|
|
14
|
+
/** When true, overwrite an existing plan (preserving original `created`). */
|
|
15
|
+
force?: boolean;
|
|
16
|
+
/** Override home dir / `GROUNDER_HOME` (tests). */
|
|
17
|
+
homeDir?: string;
|
|
18
|
+
/** Fixed clock for deterministic `created` / `updated` (tests). */
|
|
19
|
+
now?: Date;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* CLI entry for `grounder plan <text> (--title <name> [--force] | --path <file>)`.
|
|
23
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
24
|
+
*/
|
|
25
|
+
export declare function runPlan(argv: string[]): Promise<number>;
|
|
26
|
+
/**
|
|
27
|
+
* Resolves the linked project, writes/updates a named plan under `plans/`.
|
|
28
|
+
* Prints `Wrote <path>` on create, `Updated <path>` on overwrite.
|
|
29
|
+
* Without `--force`, an existing title-addressed plan prints a conflict hint and exits 1.
|
|
30
|
+
* With `--path`, updates an existing file in place (must resolve under this project's `plans/`).
|
|
31
|
+
* @returns Exit code (`0` on success, `1` on usage/conflict/link errors).
|
|
32
|
+
*/
|
|
33
|
+
export declare function runPlanWithOptions(options: PlanOptions): Promise<number>;
|
|
34
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAeA,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB7D;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA4C9E"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { withHomeDir } from "../connector/home.js";
|
|
3
|
+
import { resolvePlansDir } from "../connector/vault.js";
|
|
4
|
+
import { helpExitCode } from "../help.js";
|
|
5
|
+
import { fileExists } from "../util/fs.js";
|
|
6
|
+
import { flagBool, flagString, parseArgs } from "../util/parse-args.js";
|
|
7
|
+
import { isPathInside, isRealPathInside, resolveUserPath } from "../util/path.js";
|
|
8
|
+
import { sanitizePlanName } from "../util/plan-name.js";
|
|
9
|
+
import { updatePlanAtPath, writePlan } from "../vault/write-plan.js";
|
|
10
|
+
import { requireLinkedProject } from "./require-linked.js";
|
|
11
|
+
const USAGE = "Usage: grounder plan <text> --title <name> [--force]\n" +
|
|
12
|
+
" or: grounder plan <text> --path <file>";
|
|
13
|
+
/**
|
|
14
|
+
* CLI entry for `grounder plan <text> (--title <name> [--force] | --path <file>)`.
|
|
15
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
16
|
+
*/
|
|
17
|
+
export async function runPlan(argv) {
|
|
18
|
+
const helpCode = helpExitCode(argv, "plan");
|
|
19
|
+
if (helpCode !== null) {
|
|
20
|
+
return helpCode;
|
|
21
|
+
}
|
|
22
|
+
const { positional, flags } = parseArgs(argv);
|
|
23
|
+
const text = positional.join(" ").trim();
|
|
24
|
+
if (!text) {
|
|
25
|
+
process.stderr.write(`${USAGE}\n`);
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
return runPlanWithOptions({
|
|
29
|
+
text,
|
|
30
|
+
title: flagString(flags, "title"),
|
|
31
|
+
planPath: flagString(flags, "path"),
|
|
32
|
+
force: flagBool(flags, "force"),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the linked project, writes/updates a named plan under `plans/`.
|
|
37
|
+
* Prints `Wrote <path>` on create, `Updated <path>` on overwrite.
|
|
38
|
+
* Without `--force`, an existing title-addressed plan prints a conflict hint and exits 1.
|
|
39
|
+
* With `--path`, updates an existing file in place (must resolve under this project's `plans/`).
|
|
40
|
+
* @returns Exit code (`0` on success, `1` on usage/conflict/link errors).
|
|
41
|
+
*/
|
|
42
|
+
export async function runPlanWithOptions(options) {
|
|
43
|
+
const hasTitle = options.title !== undefined;
|
|
44
|
+
const hasPath = options.planPath !== undefined;
|
|
45
|
+
if (hasTitle && hasPath) {
|
|
46
|
+
process.stderr.write("Use either --title or --path, not both.\n");
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
if (!hasTitle && !hasPath) {
|
|
50
|
+
process.stderr.write(`${USAGE}\n`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
if (hasPath && options.force) {
|
|
54
|
+
process.stderr.write("--force is not used with --path (path updates always overwrite).\n");
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
const sanitizedTitle = hasTitle ? sanitizePlanName(options.title ?? "") : undefined;
|
|
58
|
+
if (hasTitle && !sanitizedTitle) {
|
|
59
|
+
process.stderr.write(`${USAGE}\n`);
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
return withHomeDir(options.homeDir, async () => {
|
|
63
|
+
const linked = await requireLinkedProject(options.cwd ?? process.cwd());
|
|
64
|
+
if (!linked) {
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
const plansDir = resolvePlansDir(linked.home, linked.repo);
|
|
68
|
+
if (hasPath) {
|
|
69
|
+
return updateByPath(plansDir, linked.repo.projectId, options);
|
|
70
|
+
}
|
|
71
|
+
if (!sanitizedTitle) {
|
|
72
|
+
process.stderr.write(`${USAGE}\n`);
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
return writeByTitle(plansDir, linked.repo.projectId, sanitizedTitle, options);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async function writeByTitle(plansDir, projectId, name, options) {
|
|
79
|
+
const result = await writePlan(plansDir, name, options.text, {
|
|
80
|
+
projectId,
|
|
81
|
+
force: options.force,
|
|
82
|
+
now: options.now,
|
|
83
|
+
});
|
|
84
|
+
if (result.status === "exists") {
|
|
85
|
+
process.stderr.write(`Plan already exists: ${result.path}\nUse --force to overwrite.\n`);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
const verb = result.status === "overwritten" ? "Updated" : "Wrote";
|
|
89
|
+
process.stdout.write(`${verb} ${result.path}\n`);
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
async function updateByPath(plansDir, projectId, options) {
|
|
93
|
+
const raw = options.planPath ?? "";
|
|
94
|
+
const cwd = options.cwd ?? process.cwd();
|
|
95
|
+
const filePath = resolveUserPath(raw, cwd);
|
|
96
|
+
if (!filePath.toLowerCase().endsWith(".md")) {
|
|
97
|
+
process.stderr.write(`Plan path must be a .md file under plans/: ${filePath}\n`);
|
|
98
|
+
return 1;
|
|
99
|
+
}
|
|
100
|
+
if (!isPathInside(plansDir, filePath) || path.resolve(filePath) === path.resolve(plansDir)) {
|
|
101
|
+
process.stderr.write(`Plan path must resolve inside this project's plans directory:\n ${plansDir}\nGot: ${filePath}\n`);
|
|
102
|
+
return 1;
|
|
103
|
+
}
|
|
104
|
+
if (!(await fileExists(filePath))) {
|
|
105
|
+
process.stderr.write(`Plan not found: ${filePath}\n`);
|
|
106
|
+
return 1;
|
|
107
|
+
}
|
|
108
|
+
// Check follows symlinks; write would too — refuse links that land outside plans/.
|
|
109
|
+
const realInside = await isRealPathInside(plansDir, filePath);
|
|
110
|
+
if (realInside !== true) {
|
|
111
|
+
process.stderr.write(`Plan path must resolve inside this project's plans directory:\n ${plansDir}\nGot: ${filePath}\n`);
|
|
112
|
+
return 1;
|
|
113
|
+
}
|
|
114
|
+
const result = await updatePlanAtPath(filePath, options.text, {
|
|
115
|
+
projectId,
|
|
116
|
+
now: options.now,
|
|
117
|
+
});
|
|
118
|
+
process.stdout.write(`Updated ${result.path}\n`);
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"AAiBA,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,CAajE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E3F"}
|
|
@@ -4,11 +4,16 @@ import { findGitRoot } from "../../connector/git.js";
|
|
|
4
4
|
import { readHomeConfig, withHomeDir } from "../../connector/home.js";
|
|
5
5
|
import { detectProjectId, formatProjectIdSource } from "../../connector/project-id.js";
|
|
6
6
|
import { readRepoConfig, repoConfigPath, writeRepoConfig } from "../../connector/repo.js";
|
|
7
|
-
import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../../connector/vault.js";
|
|
7
|
+
import { resolveLogsDir, resolveNotesDir, resolvePlansDir, resolveVaultRoot, } from "../../connector/vault.js";
|
|
8
|
+
import { helpExitCode } from "../../help.js";
|
|
8
9
|
import { flagBool, flagString, parseArgs } from "../../util/parse-args.js";
|
|
9
10
|
import { resolveUserPath } from "../../util/path.js";
|
|
10
11
|
import { confirm } from "../../util/prompt.js";
|
|
11
12
|
export async function runRepoInit(argv) {
|
|
13
|
+
const helpCode = helpExitCode(argv, "init");
|
|
14
|
+
if (helpCode !== null) {
|
|
15
|
+
return helpCode;
|
|
16
|
+
}
|
|
12
17
|
const { flags } = parseArgs(argv);
|
|
13
18
|
return runRepoInitWithOptions({
|
|
14
19
|
yes: flagBool(flags, "yes", "y"),
|
|
@@ -37,6 +42,7 @@ export async function runRepoInitWithOptions(options = {}) {
|
|
|
37
42
|
const projectConfig = { version: 1, projectId: detected.id };
|
|
38
43
|
const notesDir = resolveNotesDir(home, projectConfig, options.vault);
|
|
39
44
|
const logsDir = resolveLogsDir(home, projectConfig, options.vault);
|
|
45
|
+
const plansDir = resolvePlansDir(home, projectConfig, options.vault);
|
|
40
46
|
process.stdout.write(`✓ Folder: ${cwd}\n`);
|
|
41
47
|
if (gitRoot) {
|
|
42
48
|
process.stdout.write(`✓ Git repo: ${gitRoot}\n`);
|
|
@@ -45,10 +51,12 @@ export async function runRepoInitWithOptions(options = {}) {
|
|
|
45
51
|
process.stdout.write(`✓ Project: ${detected.id} (${formatProjectIdSource(detected.source)})\n\n`);
|
|
46
52
|
const notesDirRelative = path.relative(vaultRoot, notesDir);
|
|
47
53
|
const logsDirRelative = path.relative(vaultRoot, logsDir);
|
|
54
|
+
const plansDirRelative = path.relative(vaultRoot, plansDir);
|
|
48
55
|
process.stdout.write("Will create:\n");
|
|
49
56
|
process.stdout.write(` link ${repoConfigPath(cwd)}\n`);
|
|
50
57
|
process.stdout.write(` vault ${notesDirRelative}/\n`);
|
|
51
58
|
process.stdout.write(` vault ${logsDirRelative}/\n`);
|
|
59
|
+
process.stdout.write(` vault ${plansDirRelative}/\n`);
|
|
52
60
|
if (!yes) {
|
|
53
61
|
const proceed = await confirm("Proceed?");
|
|
54
62
|
if (!proceed) {
|
|
@@ -61,6 +69,7 @@ export async function runRepoInitWithOptions(options = {}) {
|
|
|
61
69
|
process.stdout.write("✓ Already linked (skipped)\n");
|
|
62
70
|
await mkdir(notesDir, { recursive: true });
|
|
63
71
|
await mkdir(logsDir, { recursive: true });
|
|
72
|
+
await mkdir(plansDir, { recursive: true });
|
|
64
73
|
return 0;
|
|
65
74
|
}
|
|
66
75
|
process.stderr.write(`Folder already linked as ${existingRepo.projectId}. Use --force to overwrite.\n`);
|
|
@@ -69,9 +78,11 @@ export async function runRepoInitWithOptions(options = {}) {
|
|
|
69
78
|
await writeRepoConfig(cwd, { version: 1, projectId: detected.id });
|
|
70
79
|
await mkdir(notesDir, { recursive: true });
|
|
71
80
|
await mkdir(logsDir, { recursive: true });
|
|
81
|
+
await mkdir(plansDir, { recursive: true });
|
|
72
82
|
process.stdout.write("✓ Wrote .grounder.json\n");
|
|
73
83
|
process.stdout.write(`✓ Created notes folder: ${notesDir}\n`);
|
|
74
84
|
process.stdout.write(`✓ Created logs folder: ${logsDir}\n`);
|
|
85
|
+
process.stdout.write(`✓ Created plans folder: ${plansDir}\n`);
|
|
75
86
|
return 0;
|
|
76
87
|
});
|
|
77
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/repo/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@ export interface StatusOptions {
|
|
|
2
2
|
cwd?: string;
|
|
3
3
|
homeDir?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function runStatus(
|
|
5
|
+
export declare function runStatus(argv: string[]): Promise<number>;
|
|
6
6
|
export declare function runStatusWithOptions(options?: StatusOptions): Promise<number>;
|
|
7
7
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2ED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/D;AAED,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+EvF"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
+
import { ALL_AGENTS } from "../agents/index.js";
|
|
2
3
|
import { currentBranch, findGitRoot } from "../connector/git.js";
|
|
3
4
|
import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
|
|
4
5
|
import { findLinkedRepoRoot, readRepoConfig, repoConfigPath, } from "../connector/repo.js";
|
|
5
|
-
import {
|
|
6
|
+
import { isInstallSchemaStale, readGrounderState, statePath } from "../connector/state.js";
|
|
7
|
+
import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
|
|
8
|
+
import { resolveLogsDir, resolveNotesDir, resolvePlansDir, resolveVaultRoot, } from "../connector/vault.js";
|
|
9
|
+
import { helpExitCode } from "../help.js";
|
|
10
|
+
import { VERSION } from "../index.js";
|
|
11
|
+
import { packageVersionNotice } from "./package-version-notice.js";
|
|
6
12
|
const LABEL_WIDTH = 12;
|
|
7
13
|
const VAULT_INIT = "grounder vault init <path>";
|
|
8
14
|
const REPO_INIT = "grounder init";
|
|
9
15
|
const REPO_INIT_FORCE = "grounder init --force";
|
|
16
|
+
const MIGRATE = "grounder migrate";
|
|
17
|
+
const MIGRATE_FORCE = "grounder migrate --force";
|
|
18
|
+
const UPGRADE_GROUNDER = "upgrade grounder";
|
|
10
19
|
function section(title) {
|
|
11
20
|
return `${title}\n`;
|
|
12
21
|
}
|
|
@@ -34,13 +43,41 @@ async function tryReadHome() {
|
|
|
34
43
|
}
|
|
35
44
|
async function tryReadRepo(linkedRoot) {
|
|
36
45
|
try {
|
|
37
|
-
return { repo: await readRepoConfig(linkedRoot), invalid: null };
|
|
46
|
+
return { repo: await readRepoConfig(linkedRoot), invalid: null, unsupported: false };
|
|
38
47
|
}
|
|
39
48
|
catch (error) {
|
|
40
|
-
return {
|
|
49
|
+
return {
|
|
50
|
+
repo: null,
|
|
51
|
+
invalid: errorDetail(error),
|
|
52
|
+
unsupported: isUnsupportedSchemaError(error),
|
|
53
|
+
};
|
|
41
54
|
}
|
|
42
55
|
}
|
|
43
|
-
|
|
56
|
+
async function writeInstallStateLine(homeDir) {
|
|
57
|
+
try {
|
|
58
|
+
const state = await readGrounderState(homeDir);
|
|
59
|
+
if (!state) {
|
|
60
|
+
process.stdout.write(statusLine("State:", `missing → run: ${MIGRATE_FORCE}`));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
process.stdout.write(statusLine("State:", statePath(homeDir)));
|
|
64
|
+
const packageNotice = packageVersionNotice(VERSION, state.grounderVersion);
|
|
65
|
+
if (packageNotice) {
|
|
66
|
+
process.stdout.write(statusLine("Package:", packageNotice.status));
|
|
67
|
+
}
|
|
68
|
+
if (isInstallSchemaStale(state, ALL_AGENTS)) {
|
|
69
|
+
process.stdout.write(statusLine("Schemas:", `stale → run: ${MIGRATE}`));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
process.stdout.write(statusLine("State:", `invalid → run: ${MIGRATE_FORCE}`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function runStatus(argv) {
|
|
77
|
+
const helpCode = helpExitCode(argv, "status");
|
|
78
|
+
if (helpCode !== null) {
|
|
79
|
+
return helpCode;
|
|
80
|
+
}
|
|
44
81
|
return runStatusWithOptions({});
|
|
45
82
|
}
|
|
46
83
|
export async function runStatusWithOptions(options = {}) {
|
|
@@ -49,9 +86,9 @@ export async function runStatusWithOptions(options = {}) {
|
|
|
49
86
|
const { home, invalid: homeInvalid } = await tryReadHome();
|
|
50
87
|
const gitRoot = await findGitRoot(cwd);
|
|
51
88
|
const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
|
|
52
|
-
const { repo, invalid: repoInvalid } = linkedRoot
|
|
89
|
+
const { repo, invalid: repoInvalid, unsupported: repoUnsupported, } = linkedRoot
|
|
53
90
|
? await tryReadRepo(linkedRoot)
|
|
54
|
-
: { repo: null, invalid: null };
|
|
91
|
+
: { repo: null, invalid: null, unsupported: false };
|
|
55
92
|
process.stdout.write(section("Machine"));
|
|
56
93
|
if (homeInvalid) {
|
|
57
94
|
process.stdout.write(statusLine("Config:", `invalid → run: ${VAULT_INIT}`));
|
|
@@ -62,6 +99,7 @@ export async function runStatusWithOptions(options = {}) {
|
|
|
62
99
|
else {
|
|
63
100
|
process.stdout.write(statusLine("Config:", homeConfigPath()));
|
|
64
101
|
process.stdout.write(statusLine("Vault:", resolveVaultRoot(home)));
|
|
102
|
+
await writeInstallStateLine(options.homeDir);
|
|
65
103
|
}
|
|
66
104
|
process.stdout.write("\n");
|
|
67
105
|
process.stdout.write(section("Project"));
|
|
@@ -73,10 +111,14 @@ export async function runStatusWithOptions(options = {}) {
|
|
|
73
111
|
return 0;
|
|
74
112
|
}
|
|
75
113
|
if (repoInvalid || !repo) {
|
|
76
|
-
const fix = home ? REPO_INIT_FORCE : VAULT_INIT;
|
|
77
|
-
process.stdout.write(statusLine("Linked:", `incomplete → run: ${fix}`));
|
|
114
|
+
const fix = repoUnsupported ? UPGRADE_GROUNDER : home ? REPO_INIT_FORCE : VAULT_INIT;
|
|
115
|
+
process.stdout.write(statusLine("Linked:", repoUnsupported ? `unsupported → ${fix}` : `incomplete → run: ${fix}`));
|
|
78
116
|
process.stdout.write(statusLine("Folder:", linkedRoot));
|
|
79
|
-
process.stdout.write(statusLine("Config:",
|
|
117
|
+
process.stdout.write(statusLine("Config:", repoUnsupported
|
|
118
|
+
? `unsupported → ${UPGRADE_GROUNDER}`
|
|
119
|
+
: repoInvalid
|
|
120
|
+
? `invalid → run: ${REPO_INIT_FORCE}`
|
|
121
|
+
: `missing → run: ${REPO_INIT}`));
|
|
80
122
|
await writeGitLine(gitRoot);
|
|
81
123
|
return 0;
|
|
82
124
|
}
|
|
@@ -94,6 +136,7 @@ export async function runStatusWithOptions(options = {}) {
|
|
|
94
136
|
process.stdout.write(statusLine("Id:", repo.projectId));
|
|
95
137
|
process.stdout.write(statusLine("Notes:", resolveNotesDir(home, repo)));
|
|
96
138
|
process.stdout.write(statusLine("Logs:", resolveLogsDir(home, repo)));
|
|
139
|
+
process.stdout.write(statusLine("Plans:", resolvePlansDir(home, repo)));
|
|
97
140
|
await writeGitLine(gitRoot);
|
|
98
141
|
return 0;
|
|
99
142
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAmB,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EACL,kBAAkB,EAElB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr notice when the running Grounder version and the version stored for
|
|
3
|
+
* this machine's configuration disagree (ordered by version when both look like
|
|
4
|
+
* x.y.z). Prints on ordinary commands until migrate or vault init updates state.
|
|
5
|
+
* Silent if state is missing or broken. Skip for `handoff peek` (session hooks),
|
|
6
|
+
* `migrate`, and `vault init` (those update state themselves).
|
|
7
|
+
*/
|
|
8
|
+
export declare function notifyUpgradeIfNeeded(homeDir?: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=upgrade-banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-banner.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade-banner.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { readGrounderState } from "../connector/state.js";
|
|
2
|
+
import { VERSION } from "../index.js";
|
|
3
|
+
import { packageVersionNotice } from "./package-version-notice.js";
|
|
4
|
+
/**
|
|
5
|
+
* Stderr notice when the running Grounder version and the version stored for
|
|
6
|
+
* this machine's configuration disagree (ordered by version when both look like
|
|
7
|
+
* x.y.z). Prints on ordinary commands until migrate or vault init updates state.
|
|
8
|
+
* Silent if state is missing or broken. Skip for `handoff peek` (session hooks),
|
|
9
|
+
* `migrate`, and `vault init` (those update state themselves).
|
|
10
|
+
*/
|
|
11
|
+
export async function notifyUpgradeIfNeeded(homeDir) {
|
|
12
|
+
try {
|
|
13
|
+
const state = await readGrounderState(homeDir);
|
|
14
|
+
if (!state) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const notice = packageVersionNotice(VERSION, state.grounderVersion);
|
|
18
|
+
if (!notice) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
process.stderr.write(notice.banner);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Missing/corrupt state — doctor covers diagnostics.
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=upgrade-banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-banner.js","sourceRoot":"","sources":["../../src/commands/upgrade-banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAgB;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -2,6 +2,8 @@ export interface VaultInitOptions {
|
|
|
2
2
|
vaultPath: string;
|
|
3
3
|
yes?: boolean;
|
|
4
4
|
force?: boolean;
|
|
5
|
+
/** Also install session-start teaser hooks for adapters that support them. */
|
|
6
|
+
hooks?: boolean;
|
|
5
7
|
homeDir?: string;
|
|
6
8
|
/** Agent ids to install for. Defaults to auto-detecting installed agents. */
|
|
7
9
|
agents?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,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,CAyBlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiExF"}
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { mkdir } from "node:fs/promises";
|
|
2
|
+
import { runtimeCliPath } from "../../agents/hook-runtime.js";
|
|
2
3
|
import { resolveAgents } from "../../agents/index.js";
|
|
3
4
|
import { homeConfigPath, readHomeConfig, withHomeDir, writeHomeConfig, } from "../../connector/home.js";
|
|
5
|
+
import { helpExitCode } from "../../help.js";
|
|
4
6
|
import { flagBool, flagStrings, parseArgs } from "../../util/parse-args.js";
|
|
5
7
|
import { resolveUserPath } from "../../util/path.js";
|
|
6
8
|
import { confirm } from "../../util/prompt.js";
|
|
7
9
|
import { projectsParent } from "../../vault/layout.js";
|
|
10
|
+
import { applyAgentInstalls } from "../apply-agent-installs.js";
|
|
8
11
|
export async function runVaultInit(argv) {
|
|
12
|
+
const helpCode = helpExitCode(argv, "vault init");
|
|
13
|
+
if (helpCode !== null) {
|
|
14
|
+
return helpCode;
|
|
15
|
+
}
|
|
9
16
|
const { positional, flags, repeated } = parseArgs(argv);
|
|
10
17
|
const vaultPathArg = positional[0];
|
|
11
18
|
const yes = flagBool(flags, "yes", "y");
|
|
12
19
|
const force = flagBool(flags, "force", "f");
|
|
20
|
+
const hooks = flagBool(flags, "hooks");
|
|
13
21
|
const agents = flagStrings(repeated, "agent");
|
|
14
22
|
if (!vaultPathArg) {
|
|
15
23
|
process.stderr.write("Usage: grounder vault init <path>\n");
|
|
@@ -19,6 +27,7 @@ export async function runVaultInit(argv) {
|
|
|
19
27
|
vaultPath: vaultPathArg,
|
|
20
28
|
yes,
|
|
21
29
|
force,
|
|
30
|
+
hooks,
|
|
22
31
|
agents: agents.length > 0 ? agents : undefined,
|
|
23
32
|
});
|
|
24
33
|
}
|
|
@@ -27,6 +36,7 @@ export async function runVaultInitWithOptions(options) {
|
|
|
27
36
|
const vaultRoot = resolveUserPath(options.vaultPath);
|
|
28
37
|
const yes = options.yes ?? false;
|
|
29
38
|
const force = options.force ?? false;
|
|
39
|
+
const hooks = options.hooks ?? false;
|
|
30
40
|
const homeDir = options.homeDir;
|
|
31
41
|
const existingHome = await readHomeConfig();
|
|
32
42
|
const projectsDir = projectsParent(vaultRoot);
|
|
@@ -39,8 +49,19 @@ export async function runVaultInitWithOptions(options) {
|
|
|
39
49
|
process.stdout.write("Will write:\n");
|
|
40
50
|
process.stdout.write(` home ${homeConfigPath(homeDir)}\n`);
|
|
41
51
|
process.stdout.write(" vault 10-Projects/ (if missing)\n");
|
|
52
|
+
if (agents.length > 0) {
|
|
53
|
+
// Shared across agents (slash commands + optional hooks) — list once.
|
|
54
|
+
process.stdout.write(` grounder runtime ${runtimeCliPath(homeDir)}\n`);
|
|
55
|
+
}
|
|
42
56
|
for (const agent of agents) {
|
|
43
|
-
|
|
57
|
+
for (const artifactPath of agent.expectedArtifacts(homeDir)) {
|
|
58
|
+
process.stdout.write(` ${agent.id.padEnd(8)} ${artifactPath}\n`);
|
|
59
|
+
}
|
|
60
|
+
if (hooks && agent.expectedHookArtifacts) {
|
|
61
|
+
for (const hookPath of agent.expectedHookArtifacts(homeDir)) {
|
|
62
|
+
process.stdout.write(` ${agent.id.padEnd(8)} hook ${hookPath}\n`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
44
65
|
}
|
|
45
66
|
if (agents.length === 0) {
|
|
46
67
|
process.stdout.write(" (no supported agents detected — skipping agent artifacts)\n");
|
|
@@ -57,16 +78,12 @@ export async function runVaultInitWithOptions(options) {
|
|
|
57
78
|
await mkdir(projectsDir, { recursive: true });
|
|
58
79
|
process.stdout.write("✓ Wrote home config\n");
|
|
59
80
|
process.stdout.write(`✓ Vault scaffold: ${projectsDir}\n`);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (Object.keys(result.artifacts).length === 0) {
|
|
67
|
-
process.stdout.write(`✓ ${agent.name}: no artifacts to install yet\n`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
81
|
+
await applyAgentInstalls({
|
|
82
|
+
agents,
|
|
83
|
+
force,
|
|
84
|
+
hooks,
|
|
85
|
+
homeDir,
|
|
86
|
+
});
|
|
70
87
|
return 0;
|
|
71
88
|
});
|
|
72
89
|
}
|