grounder 0.2.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 +81 -32
- package/dist/agents/claude.d.ts +1 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +38 -13
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts +1 -0
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +38 -13
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/hook-runtime.d.ts +65 -21
- package/dist/agents/hook-runtime.d.ts.map +1 -1
- package/dist/agents/hook-runtime.js +172 -31
- package/dist/agents/hook-runtime.js.map +1 -1
- 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 +19 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli.js +58 -60
- 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 +202 -51
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +5 -0
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff/peek.d.ts +5 -2
- package/dist/commands/handoff/peek.d.ts.map +1 -1
- package/dist/commands/handoff/peek.js +47 -6
- package/dist/commands/handoff/peek.js.map +1 -1
- 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.map +1 -1
- package/dist/commands/vault/init.js +18 -29
- 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/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/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/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 +2 -2
- 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 +2 -2
- package/templates/vault/plan.md +16 -0
|
@@ -1 +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"}
|
|
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,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,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,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,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,23 @@
|
|
|
1
|
+
import { type AgentAdapter } from "../agents/index.js";
|
|
2
|
+
export interface MigrateOptions {
|
|
3
|
+
force?: boolean;
|
|
4
|
+
hooks?: boolean;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
homeDir?: string;
|
|
7
|
+
/** Agent ids to migrate. Defaults to ledger keys, else auto-detect. */
|
|
8
|
+
agents?: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve which agents to migrate:
|
|
12
|
+
* 1. Explicit `--agent` ids (unknown ids still throw)
|
|
13
|
+
* 2. Else agents recorded in `~/.grounder/state.json` that this binary knows
|
|
14
|
+
* 3. Else auto-detect installed agents (legacy / pre-ledger)
|
|
15
|
+
*
|
|
16
|
+
* Ledger keys from a newer Grounder (agents this binary does not know) are
|
|
17
|
+
* skipped with a stderr warning — same forward-compat idea as schema hard-stops,
|
|
18
|
+
* but migrate can still refresh the agents it understands.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveMigrateAgents(explicitIds: string[] | undefined, homeDir?: string): Promise<AgentAdapter[]>;
|
|
21
|
+
export declare function runMigrate(argv: string[]): Promise<number>;
|
|
22
|
+
export declare function runMigrateWithOptions(options?: MigrateOptions): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,oBAAoB,CAAC;AAQlF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBzB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE;AAED,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DzF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ALL_AGENTS, resolveAgents } from "../agents/index.js";
|
|
2
|
+
import { readHomeConfig, withHomeDir } from "../connector/home.js";
|
|
3
|
+
import { assertAgentSchemasSupported, readGrounderState, statePath } from "../connector/state.js";
|
|
4
|
+
import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
|
|
5
|
+
import { helpExitCode } from "../help.js";
|
|
6
|
+
import { flagBool, flagStrings, parseArgs } from "../util/parse-args.js";
|
|
7
|
+
import { applyAgentInstalls } from "./apply-agent-installs.js";
|
|
8
|
+
/**
|
|
9
|
+
* Resolve which agents to migrate:
|
|
10
|
+
* 1. Explicit `--agent` ids (unknown ids still throw)
|
|
11
|
+
* 2. Else agents recorded in `~/.grounder/state.json` that this binary knows
|
|
12
|
+
* 3. Else auto-detect installed agents (legacy / pre-ledger)
|
|
13
|
+
*
|
|
14
|
+
* Ledger keys from a newer Grounder (agents this binary does not know) are
|
|
15
|
+
* skipped with a stderr warning — same forward-compat idea as schema hard-stops,
|
|
16
|
+
* but migrate can still refresh the agents it understands.
|
|
17
|
+
*/
|
|
18
|
+
export async function resolveMigrateAgents(explicitIds, homeDir) {
|
|
19
|
+
if (explicitIds && explicitIds.length > 0) {
|
|
20
|
+
return resolveAgents(explicitIds);
|
|
21
|
+
}
|
|
22
|
+
const state = await readGrounderState(homeDir);
|
|
23
|
+
const recordedIds = state ? Object.keys(state.agents) : [];
|
|
24
|
+
if (recordedIds.length === 0) {
|
|
25
|
+
return resolveAgents();
|
|
26
|
+
}
|
|
27
|
+
const known = ALL_AGENTS.filter((a) => recordedIds.includes(a.id));
|
|
28
|
+
const unknown = recordedIds.filter((id) => !ALL_AGENTS.some((a) => a.id === id));
|
|
29
|
+
if (unknown.length > 0) {
|
|
30
|
+
process.stderr.write(`Skipping unknown agent(s) in install state: ${unknown.join(", ")}. Upgrade grounder to migrate them.\n`);
|
|
31
|
+
}
|
|
32
|
+
return known;
|
|
33
|
+
}
|
|
34
|
+
export async function runMigrate(argv) {
|
|
35
|
+
const helpCode = helpExitCode(argv, "migrate");
|
|
36
|
+
if (helpCode !== null) {
|
|
37
|
+
return helpCode;
|
|
38
|
+
}
|
|
39
|
+
const { flags, repeated } = parseArgs(argv);
|
|
40
|
+
const agents = flagStrings(repeated, "agent");
|
|
41
|
+
return runMigrateWithOptions({
|
|
42
|
+
force: flagBool(flags, "force", "f"),
|
|
43
|
+
hooks: flagBool(flags, "hooks"),
|
|
44
|
+
dryRun: flagBool(flags, "dry-run"),
|
|
45
|
+
agents: agents.length > 0 ? agents : undefined,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function runMigrateWithOptions(options = {}) {
|
|
49
|
+
return withHomeDir(options.homeDir, async () => {
|
|
50
|
+
const homeDir = options.homeDir;
|
|
51
|
+
const force = options.force ?? false;
|
|
52
|
+
const hooks = options.hooks ?? false;
|
|
53
|
+
const dryRun = options.dryRun ?? false;
|
|
54
|
+
const home = await readHomeConfig();
|
|
55
|
+
if (!home) {
|
|
56
|
+
process.stderr.write("No home config found. Run `grounder vault init <path>` first.\n");
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
const agents = await resolveMigrateAgents(options.agents, homeDir);
|
|
60
|
+
try {
|
|
61
|
+
const state = await readGrounderState(homeDir);
|
|
62
|
+
assertAgentSchemasSupported(state, agents);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (isUnsupportedSchemaError(error)) {
|
|
66
|
+
process.stderr.write(`${error.message}\n`);
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
process.stdout.write(`Vault root: ${home.vaultRoot}\n`);
|
|
72
|
+
if (dryRun) {
|
|
73
|
+
process.stdout.write("Dry run — no files will be written.\n");
|
|
74
|
+
}
|
|
75
|
+
process.stdout.write("Will refresh:\n");
|
|
76
|
+
if (agents.length === 0) {
|
|
77
|
+
process.stdout.write(" (no agents recorded or detected)\n");
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
for (const agent of agents) {
|
|
81
|
+
for (const artifactPath of agent.expectedArtifacts(homeDir)) {
|
|
82
|
+
process.stdout.write(` ${agent.id.padEnd(8)} ${artifactPath}\n`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
process.stdout.write(" hooks previously installed or --hooks (owned JSON always refreshed)\n");
|
|
86
|
+
process.stdout.write(` state ${statePath(homeDir)}\n`);
|
|
87
|
+
}
|
|
88
|
+
process.stdout.write("\n");
|
|
89
|
+
if (agents.length === 0) {
|
|
90
|
+
process.stdout.write("Nothing to migrate.\n");
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
await applyAgentInstalls({
|
|
94
|
+
agents,
|
|
95
|
+
force,
|
|
96
|
+
hooks,
|
|
97
|
+
refreshInstalledHooks: true,
|
|
98
|
+
dryRun,
|
|
99
|
+
homeDir,
|
|
100
|
+
});
|
|
101
|
+
return 0;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../src/commands/note.ts"],"names":[],"mappings":"AAOA,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,CAkB7D;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E"}
|
package/dist/commands/note.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { withHomeDir } from "../connector/home.js";
|
|
2
2
|
import { resolveNotesDir } from "../connector/vault.js";
|
|
3
|
+
import { helpExitCode } from "../help.js";
|
|
3
4
|
import { flagString, parseArgs } from "../util/parse-args.js";
|
|
4
5
|
import { writeNote } from "../vault/write-note.js";
|
|
5
6
|
import { requireLinkedProject } from "./require-linked.js";
|
|
6
7
|
export async function runNote(argv) {
|
|
8
|
+
const helpCode = helpExitCode(argv, "note");
|
|
9
|
+
if (helpCode !== null) {
|
|
10
|
+
return helpCode;
|
|
11
|
+
}
|
|
7
12
|
const { positional, flags } = parseArgs(argv);
|
|
8
13
|
const text = positional.join(" ").trim();
|
|
9
14
|
if (!text) {
|
|
@@ -1 +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"}
|
|
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,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,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,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,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,18 @@
|
|
|
1
|
+
import { type PackageVersionRelation } from "../util/semver.js";
|
|
2
|
+
export interface PackageVersionNotice {
|
|
3
|
+
relation: Exclude<PackageVersionRelation, "match">;
|
|
4
|
+
/** Doctor check message (plain language; versions in parentheses). */
|
|
5
|
+
message: string;
|
|
6
|
+
/** Suggested fix action. */
|
|
7
|
+
fix: string;
|
|
8
|
+
/** One-line stderr banner (includes trailing newlines). */
|
|
9
|
+
banner: string;
|
|
10
|
+
/** `grounder status` value after the Package: label. */
|
|
11
|
+
status: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Plain-language notice when the running Grounder and the version recorded for
|
|
15
|
+
* this machine's configuration disagree.
|
|
16
|
+
*/
|
|
17
|
+
export declare function packageVersionNotice(running: string, recorded: string): PackageVersionNotice | null;
|
|
18
|
+
//# sourceMappingURL=package-version-notice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version-notice.d.ts","sourceRoot":"","sources":["../../src/commands/package-version-notice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAA0B,MAAM,mBAAmB,CAAC;AAKxF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAC;IACnD,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,oBAAoB,GAAG,IAAI,CAiC7B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { packageVersionRelation } from "../util/semver.js";
|
|
2
|
+
const MIGRATE = "grounder migrate";
|
|
3
|
+
const UPGRADE = "install a newer Grounder";
|
|
4
|
+
/**
|
|
5
|
+
* Plain-language notice when the running Grounder and the version recorded for
|
|
6
|
+
* this machine's configuration disagree.
|
|
7
|
+
*/
|
|
8
|
+
export function packageVersionNotice(running, recorded) {
|
|
9
|
+
const relation = packageVersionRelation(running, recorded);
|
|
10
|
+
if (relation === "match") {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (relation === "ahead") {
|
|
14
|
+
return {
|
|
15
|
+
relation,
|
|
16
|
+
message: `Grounder ${running} is installed, but your configuration is still from ${recorded}`,
|
|
17
|
+
fix: MIGRATE,
|
|
18
|
+
banner: `Grounder was updated (${running}). Run \`${MIGRATE}\` to update your configuration.\n\n`,
|
|
19
|
+
status: `configuration outdated — run: ${MIGRATE}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (relation === "behind") {
|
|
23
|
+
return {
|
|
24
|
+
relation,
|
|
25
|
+
message: `this Grounder (${running}) is older than your configuration (${recorded})`,
|
|
26
|
+
fix: UPGRADE,
|
|
27
|
+
banner: `This Grounder (${running}) is older than your configuration (${recorded}). Install a newer Grounder.\n\n`,
|
|
28
|
+
status: `older than configuration — ${UPGRADE}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
relation: "differs",
|
|
33
|
+
message: `Grounder version (${running}) doesn't match your configuration (${recorded})`,
|
|
34
|
+
fix: MIGRATE,
|
|
35
|
+
banner: `Grounder version doesn't match your configuration. Run \`${MIGRATE}\`.\n\n`,
|
|
36
|
+
status: `doesn't match configuration — run: ${MIGRATE}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=package-version-notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-version-notice.js","sourceRoot":"","sources":["../../src/commands/package-version-notice.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAc3C;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,QAAgB;IAEhB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,YAAY,OAAO,uDAAuD,QAAQ,EAAE;YAC7F,GAAG,EAAE,OAAO;YACZ,MAAM,EAAE,yBAAyB,OAAO,YAAY,OAAO,sCAAsC;YACjG,MAAM,EAAE,iCAAiC,OAAO,EAAE;SACnD,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,kBAAkB,OAAO,uCAAuC,QAAQ,GAAG;YACpF,GAAG,EAAE,OAAO;YACZ,MAAM,EAAE,kBAAkB,OAAO,uCAAuC,QAAQ,kCAAkC;YAClH,MAAM,EAAE,8BAA8B,OAAO,EAAE;SAChD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,qBAAqB,OAAO,uCAAuC,QAAQ,GAAG;QACvF,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,4DAA4D,OAAO,SAAS;QACpF,MAAM,EAAE,sCAAsC,OAAO,EAAE;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -2,6 +2,6 @@ export interface PathLogsOptions {
|
|
|
2
2
|
cwd?: string;
|
|
3
3
|
homeDir?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function runPathLogs(
|
|
5
|
+
export declare function runPathLogs(argv: string[]): Promise<number>;
|
|
6
6
|
export declare function runPathLogsWithOptions(options?: PathLogsOptions): Promise<number>;
|
|
7
7
|
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/commands/path/logs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/commands/path/logs.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAOjE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3F"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { withHomeDir } from "../../connector/home.js";
|
|
2
2
|
import { resolveLogsDir } from "../../connector/vault.js";
|
|
3
|
+
import { helpExitCode } from "../../help.js";
|
|
3
4
|
import { requireLinkedProject } from "../require-linked.js";
|
|
4
|
-
export async function runPathLogs(
|
|
5
|
+
export async function runPathLogs(argv) {
|
|
6
|
+
const helpCode = helpExitCode(argv, "path logs");
|
|
7
|
+
if (helpCode !== null) {
|
|
8
|
+
return helpCode;
|
|
9
|
+
}
|
|
5
10
|
return runPathLogsWithOptions({});
|
|
6
11
|
}
|
|
7
12
|
export async function runPathLogsWithOptions(options = {}) {
|
|
@@ -1 +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,
|
|
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,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,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"}
|
|
@@ -2,6 +2,6 @@ export interface PathNotesOptions {
|
|
|
2
2
|
cwd?: string;
|
|
3
3
|
homeDir?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function runPathNotes(
|
|
5
|
+
export declare function runPathNotes(argv: string[]): Promise<number>;
|
|
6
6
|
export declare function runPathNotesWithOptions(options?: PathNotesOptions): Promise<number>;
|
|
7
7
|
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../../src/commands/path/notes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../../src/commands/path/notes.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7F"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { withHomeDir } from "../../connector/home.js";
|
|
2
2
|
import { resolveNotesDir } from "../../connector/vault.js";
|
|
3
|
+
import { helpExitCode } from "../../help.js";
|
|
3
4
|
import { requireLinkedProject } from "../require-linked.js";
|
|
4
|
-
export async function runPathNotes(
|
|
5
|
+
export async function runPathNotes(argv) {
|
|
6
|
+
const helpCode = helpExitCode(argv, "path notes");
|
|
7
|
+
if (helpCode !== null) {
|
|
8
|
+
return helpCode;
|
|
9
|
+
}
|
|
5
10
|
return runPathNotesWithOptions({});
|
|
6
11
|
}
|
|
7
12
|
export async function runPathNotesWithOptions(options = {}) {
|
|
@@ -1 +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,
|
|
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,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,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,7 @@
|
|
|
1
|
+
export interface PathPlansOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
homeDir?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function runPathPlans(argv: string[]): Promise<number>;
|
|
6
|
+
export declare function runPathPlansWithOptions(options?: PathPlansOptions): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=plans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.d.ts","sourceRoot":"","sources":["../../../src/commands/path/plans.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAOlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7F"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { withHomeDir } from "../../connector/home.js";
|
|
2
|
+
import { resolvePlansDir } from "../../connector/vault.js";
|
|
3
|
+
import { helpExitCode } from "../../help.js";
|
|
4
|
+
import { requireLinkedProject } from "../require-linked.js";
|
|
5
|
+
export async function runPathPlans(argv) {
|
|
6
|
+
const helpCode = helpExitCode(argv, "path plans");
|
|
7
|
+
if (helpCode !== null) {
|
|
8
|
+
return helpCode;
|
|
9
|
+
}
|
|
10
|
+
return runPathPlansWithOptions({});
|
|
11
|
+
}
|
|
12
|
+
export async function runPathPlansWithOptions(options = {}) {
|
|
13
|
+
return withHomeDir(options.homeDir, async () => {
|
|
14
|
+
const linked = await requireLinkedProject(options.cwd ?? process.cwd());
|
|
15
|
+
if (!linked) {
|
|
16
|
+
return 1;
|
|
17
|
+
}
|
|
18
|
+
process.stdout.write(`${resolvePlansDir(linked.home, linked.repo)}\n`);
|
|
19
|
+
return 0;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=plans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plans.js","sourceRoot":"","sources":["../../../src/commands/path/plans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,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,23 @@
|
|
|
1
|
+
/** Options for {@link runPlanListWithOptions} (CLI parsing and tests). */
|
|
2
|
+
export interface PlanListOptions {
|
|
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 plan 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 runPlanList(argv: string[]): Promise<number>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the linked project, lists recent plan paths under `plans/` (newest first).
|
|
18
|
+
* Prints one absolute path per line; empty when no plans. Same vault/link
|
|
19
|
+
* prerequisites as `grounder plan`.
|
|
20
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
21
|
+
*/
|
|
22
|
+
export declare function runPlanListWithOptions(options?: PlanListOptions): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/plan/list.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,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,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCjE;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB3F"}
|
|
@@ -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
|