grounder 0.4.0 → 0.6.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 +150 -271
- package/dist/agents/claude.d.ts +4 -4
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +158 -178
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts +3 -3
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +97 -143
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/home-skills.d.ts +46 -0
- package/dist/agents/home-skills.d.ts.map +1 -0
- package/dist/agents/home-skills.js +83 -0
- package/dist/agents/home-skills.js.map +1 -0
- package/dist/agents/hook-fragment.d.ts +52 -0
- package/dist/agents/hook-fragment.d.ts.map +1 -0
- package/dist/agents/hook-fragment.js +76 -0
- package/dist/agents/hook-fragment.js.map +1 -0
- package/dist/agents/hook-install.d.ts +62 -0
- package/dist/agents/hook-install.d.ts.map +1 -0
- package/dist/agents/hook-install.js +74 -0
- package/dist/agents/hook-install.js.map +1 -0
- package/dist/agents/hook-runtime.d.ts +80 -13
- package/dist/agents/hook-runtime.d.ts.map +1 -1
- package/dist/agents/hook-runtime.js +278 -74
- package/dist/agents/hook-runtime.js.map +1 -1
- package/dist/agents/index.d.ts +8 -14
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +13 -19
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +56 -16
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli.js +15 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply.d.ts +69 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +238 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +197 -101
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts +23 -13
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +28 -16
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff/peek.d.ts +1 -1
- package/dist/commands/handoff/peek.d.ts.map +1 -1
- package/dist/commands/handoff/peek.js +28 -12
- package/dist/commands/handoff/peek.js.map +1 -1
- package/dist/commands/handoff.d.ts +2 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +10 -1
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/install-drift.d.ts +34 -0
- package/dist/commands/install-drift.d.ts.map +1 -0
- package/dist/commands/install-drift.js +72 -0
- package/dist/commands/install-drift.js.map +1 -0
- package/dist/commands/link.d.ts +12 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/{repo/init.js → link.js} +35 -27
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +11 -3
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +66 -34
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/note/list.d.ts +17 -9
- package/dist/commands/note/list.d.ts.map +1 -1
- package/dist/commands/note/list.js +19 -14
- package/dist/commands/note/list.js.map +1 -1
- package/dist/commands/note.d.ts +2 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +10 -1
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/output.d.ts +22 -2
- package/dist/commands/output.d.ts.map +1 -1
- package/dist/commands/output.js +18 -6
- package/dist/commands/output.js.map +1 -1
- package/dist/commands/overview.d.ts +33 -0
- package/dist/commands/overview.d.ts.map +1 -0
- package/dist/commands/overview.js +150 -0
- package/dist/commands/overview.js.map +1 -0
- package/dist/commands/plan/list.d.ts +20 -12
- package/dist/commands/plan/list.d.ts.map +1 -1
- package/dist/commands/plan/list.js +22 -17
- package/dist/commands/plan/list.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +12 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/render-artifact-table.d.ts +85 -0
- package/dist/commands/render-artifact-table.d.ts.map +1 -0
- package/dist/commands/render-artifact-table.js +232 -0
- package/dist/commands/render-artifact-table.js.map +1 -0
- package/dist/commands/require-linked.js +2 -2
- package/dist/commands/require-linked.js.map +1 -1
- package/dist/commands/search.d.ts +23 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +288 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/{vault/init.d.ts → setup.d.ts} +5 -4
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +210 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +273 -83
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade-banner.d.ts +2 -2
- package/dist/commands/upgrade-banner.js +2 -2
- package/dist/connector/home.d.ts +12 -0
- package/dist/connector/home.d.ts.map +1 -1
- package/dist/connector/home.js +26 -2
- package/dist/connector/home.js.map +1 -1
- package/dist/connector/ledger-migrations.d.ts +55 -0
- package/dist/connector/ledger-migrations.d.ts.map +1 -0
- package/dist/connector/ledger-migrations.js +94 -0
- package/dist/connector/ledger-migrations.js.map +1 -0
- package/dist/connector/state.d.ts +97 -60
- package/dist/connector/state.d.ts.map +1 -1
- package/dist/connector/state.js +165 -107
- package/dist/connector/state.js.map +1 -1
- 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 +3 -3
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +97 -56
- package/dist/help.js.map +1 -1
- package/dist/reconcile/apply.d.ts +31 -0
- package/dist/reconcile/apply.d.ts.map +1 -0
- package/dist/reconcile/apply.js +97 -0
- package/dist/reconcile/apply.js.map +1 -0
- package/dist/reconcile/core.d.ts +82 -0
- package/dist/reconcile/core.d.ts.map +1 -0
- package/dist/reconcile/core.js +163 -0
- package/dist/reconcile/core.js.map +1 -0
- package/dist/reconcile/disk.d.ts +13 -0
- package/dist/reconcile/disk.d.ts.map +1 -0
- package/dist/reconcile/disk.js +28 -0
- package/dist/reconcile/disk.js.map +1 -0
- package/dist/util/frontmatter.d.ts +9 -7
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/frontmatter.js +29 -4
- package/dist/util/frontmatter.js.map +1 -1
- package/dist/util/fs.d.ts +14 -0
- package/dist/util/fs.d.ts.map +1 -1
- package/dist/util/fs.js +27 -1
- package/dist/util/fs.js.map +1 -1
- package/dist/util/merge-json.d.ts +13 -2
- package/dist/util/merge-json.d.ts.map +1 -1
- package/dist/util/merge-json.js +24 -10
- package/dist/util/merge-json.js.map +1 -1
- package/dist/util/path.d.ts +23 -0
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +39 -0
- package/dist/util/path.js.map +1 -1
- package/dist/vault/list-handoffs.d.ts +14 -2
- package/dist/vault/list-handoffs.d.ts.map +1 -1
- package/dist/vault/list-handoffs.js +40 -23
- package/dist/vault/list-handoffs.js.map +1 -1
- package/dist/vault/list-markdown.d.ts +8 -0
- package/dist/vault/list-markdown.d.ts.map +1 -0
- package/dist/vault/list-markdown.js +35 -0
- package/dist/vault/list-markdown.js.map +1 -0
- package/dist/vault/list-notes.d.ts +15 -6
- package/dist/vault/list-notes.d.ts.map +1 -1
- package/dist/vault/list-notes.js +23 -27
- package/dist/vault/list-notes.js.map +1 -1
- package/dist/vault/list-plans.d.ts +12 -3
- package/dist/vault/list-plans.d.ts.map +1 -1
- package/dist/vault/list-plans.js +20 -24
- package/dist/vault/list-plans.js.map +1 -1
- package/dist/vault/search.d.ts +55 -0
- package/dist/vault/search.d.ts.map +1 -0
- package/dist/vault/search.js +432 -0
- package/dist/vault/search.js.map +1 -0
- package/dist/vault/write-handoff.d.ts +2 -0
- package/dist/vault/write-handoff.d.ts.map +1 -1
- package/dist/vault/write-handoff.js +5 -0
- package/dist/vault/write-handoff.js.map +1 -1
- package/dist/vault/write-note.d.ts +2 -0
- package/dist/vault/write-note.d.ts.map +1 -1
- package/dist/vault/write-note.js +9 -1
- package/dist/vault/write-note.js.map +1 -1
- package/dist/vault/write-plan.d.ts +4 -0
- package/dist/vault/write-plan.d.ts.map +1 -1
- package/dist/vault/write-plan.js +14 -1
- package/dist/vault/write-plan.js.map +1 -1
- package/package.json +11 -4
- package/templates/agents/claude/skills/grounder-handoff/SKILL.md +73 -0
- package/templates/agents/claude/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
- package/templates/agents/claude/skills/grounder-overview/SKILL.md +21 -0
- package/templates/agents/claude/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
- package/templates/agents/claude/skills/grounder-recall/SKILL.md +34 -0
- package/templates/agents/claude/skills/grounder-search/SKILL.md +152 -0
- package/templates/agents/cursor/skills/grounder-handoff/SKILL.md +73 -0
- package/templates/agents/cursor/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
- package/templates/agents/cursor/skills/grounder-overview/SKILL.md +21 -0
- package/templates/agents/cursor/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
- package/templates/agents/cursor/skills/grounder-recall/SKILL.md +34 -0
- package/templates/agents/cursor/skills/grounder-search/SKILL.md +152 -0
- package/templates/vault/plan.md +1 -1
- package/templates/vault/session-handoff.md +2 -1
- package/dist/agents/install-command.d.ts +0 -35
- package/dist/agents/install-command.d.ts.map +0 -1
- package/dist/agents/install-command.js +0 -65
- package/dist/agents/install-command.js.map +0 -1
- package/dist/commands/apply-agent-installs.d.ts +0 -34
- package/dist/commands/apply-agent-installs.d.ts.map +0 -1
- package/dist/commands/apply-agent-installs.js +0 -137
- package/dist/commands/apply-agent-installs.js.map +0 -1
- package/dist/commands/repo/init.d.ts +0 -11
- package/dist/commands/repo/init.d.ts.map +0 -1
- package/dist/commands/repo/init.js.map +0 -1
- package/dist/commands/vault/init.d.ts.map +0 -1
- package/dist/commands/vault/init.js +0 -90
- package/dist/commands/vault/init.js.map +0 -1
- package/templates/agents/claude/commands/grounder-task-handoff.md +0 -54
- package/templates/agents/claude/commands/grounder-task.md +0 -22
- package/templates/agents/cursor/commands/grounder-task-handoff.md +0 -54
- package/templates/agents/cursor/commands/grounder-task.md +0 -22
package/dist/commands/migrate.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { ALL_AGENTS, resolveAgents } from "../agents/index.js";
|
|
2
2
|
import { readHomeConfig, withHomeDir } from "../connector/home.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ledgerVersionChanged, readGrounderState, statePath, } from "../connector/state.js";
|
|
4
4
|
import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
|
|
5
5
|
import { helpExitCode } from "../help.js";
|
|
6
|
+
import { VERSION } from "../index.js";
|
|
6
7
|
import { flagBool, flagStrings, parseArgs } from "../util/parse-args.js";
|
|
7
|
-
import { applyAgentInstalls } from "./apply
|
|
8
|
+
import { applyAgentInstalls } from "./apply.js";
|
|
9
|
+
import { renderAgentErrors, renderModifiedNote, renderSummary, renderTable, rowsFromApplyResult, stateRow, } from "./render-artifact-table.js";
|
|
8
10
|
/**
|
|
9
11
|
* Resolve which agents to migrate:
|
|
10
12
|
* 1. Explicit `--agent` ids (unknown ids still throw)
|
|
@@ -12,14 +14,18 @@ import { applyAgentInstalls } from "./apply-agent-installs.js";
|
|
|
12
14
|
* 3. Else auto-detect installed agents (legacy / pre-ledger)
|
|
13
15
|
*
|
|
14
16
|
* Ledger keys from a newer Grounder (agents this binary does not know) are
|
|
15
|
-
* skipped with a stderr warning — same forward-compat idea as
|
|
16
|
-
* but migrate can still refresh the agents it understands.
|
|
17
|
+
* skipped with a stderr warning — same forward-compat idea as the version
|
|
18
|
+
* hard stop, but migrate can still refresh the agents it understands.
|
|
19
|
+
*
|
|
20
|
+
* Takes the already-read `state` rather than reading it itself — the caller
|
|
21
|
+
* has already read it once (and needs it again for the too-new guard and the
|
|
22
|
+
* trailing state row), so this stays pure lookup logic instead of a second
|
|
23
|
+
* read of the same file.
|
|
17
24
|
*/
|
|
18
|
-
export async function resolveMigrateAgents(explicitIds,
|
|
25
|
+
export async function resolveMigrateAgents(explicitIds, state) {
|
|
19
26
|
if (explicitIds && explicitIds.length > 0) {
|
|
20
27
|
return resolveAgents(explicitIds);
|
|
21
28
|
}
|
|
22
|
-
const state = await readGrounderState(homeDir);
|
|
23
29
|
const recordedIds = state ? Object.keys(state.agents) : [];
|
|
24
30
|
if (recordedIds.length === 0) {
|
|
25
31
|
return resolveAgents();
|
|
@@ -38,9 +44,16 @@ export async function runMigrate(argv) {
|
|
|
38
44
|
}
|
|
39
45
|
const { flags, repeated } = parseArgs(argv);
|
|
40
46
|
const agents = flagStrings(repeated, "agent");
|
|
47
|
+
const hooks = flagBool(flags, "hooks");
|
|
48
|
+
const noHooks = flagBool(flags, "no-hooks");
|
|
49
|
+
if (hooks && noHooks) {
|
|
50
|
+
process.stderr.write("Cannot pass both --hooks and --no-hooks.\n");
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
41
53
|
return runMigrateWithOptions({
|
|
42
54
|
force: flagBool(flags, "force", "f"),
|
|
43
|
-
hooks
|
|
55
|
+
hooks,
|
|
56
|
+
noHooks,
|
|
44
57
|
dryRun: flagBool(flags, "dry-run"),
|
|
45
58
|
agents: agents.length > 0 ? agents : undefined,
|
|
46
59
|
});
|
|
@@ -50,16 +63,21 @@ export async function runMigrateWithOptions(options = {}) {
|
|
|
50
63
|
const homeDir = options.homeDir;
|
|
51
64
|
const force = options.force ?? false;
|
|
52
65
|
const hooks = options.hooks ?? false;
|
|
66
|
+
const noHooks = options.noHooks ?? false;
|
|
53
67
|
const dryRun = options.dryRun ?? false;
|
|
54
68
|
const home = await readHomeConfig();
|
|
55
69
|
if (!home) {
|
|
56
|
-
process.stderr.write("No home config found. Run `grounder
|
|
70
|
+
process.stderr.write("No home config found. Run `grounder setup <path>` first.\n");
|
|
57
71
|
return 1;
|
|
58
72
|
}
|
|
59
|
-
|
|
73
|
+
// Read once, up front, inside this guard — `resolveMigrateAgents` used to
|
|
74
|
+
// trigger a second, unguarded read (migrate.ts:46 pre-refactor) that a
|
|
75
|
+
// too-new ledger threw through before this catch was ever reached.
|
|
76
|
+
let state;
|
|
77
|
+
let agents;
|
|
60
78
|
try {
|
|
61
|
-
|
|
62
|
-
|
|
79
|
+
state = await readGrounderState(homeDir);
|
|
80
|
+
agents = await resolveMigrateAgents(options.agents, state);
|
|
63
81
|
}
|
|
64
82
|
catch (error) {
|
|
65
83
|
if (isUnsupportedSchemaError(error)) {
|
|
@@ -69,36 +87,50 @@ export async function runMigrateWithOptions(options = {}) {
|
|
|
69
87
|
throw error;
|
|
70
88
|
}
|
|
71
89
|
process.stdout.write(`Vault root: ${home.vaultRoot}\n`);
|
|
90
|
+
process.stdout.write("Refresh Grounder after an upgrade (skills/hooks; vault path unchanged).\n");
|
|
91
|
+
if (agents.length === 0) {
|
|
92
|
+
process.stdout.write("No agents recorded or detected — nothing to migrate.\n" +
|
|
93
|
+
"Run `grounder setup` first, or pass --agent to target one explicitly.\n");
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
72
96
|
if (dryRun) {
|
|
73
97
|
process.stdout.write("Dry run — no files will be written.\n");
|
|
74
98
|
}
|
|
75
|
-
process.stdout.write("
|
|
76
|
-
|
|
77
|
-
|
|
99
|
+
process.stdout.write("\n");
|
|
100
|
+
let applyResult;
|
|
101
|
+
try {
|
|
102
|
+
applyResult = await applyAgentInstalls({
|
|
103
|
+
agents,
|
|
104
|
+
force,
|
|
105
|
+
hooks,
|
|
106
|
+
noHooks,
|
|
107
|
+
refreshInstalledHooks: true,
|
|
108
|
+
dryRun,
|
|
109
|
+
homeDir,
|
|
110
|
+
grounderVersion: VERSION,
|
|
111
|
+
});
|
|
78
112
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (isUnsupportedSchemaError(error)) {
|
|
115
|
+
process.stderr.write(`${error.message}\n`);
|
|
116
|
+
return 1;
|
|
84
117
|
}
|
|
85
|
-
|
|
86
|
-
process.stdout.write(` state ${statePath(homeDir)}\n`);
|
|
118
|
+
throw error;
|
|
87
119
|
}
|
|
120
|
+
const rows = rowsFromApplyResult(applyResult);
|
|
121
|
+
// Computed once, by the same code, whether or not this is `--dry-run` —
|
|
122
|
+
// `applyAgentInstalls` decides "would this write change the ledger" from
|
|
123
|
+
// the reconciled plan itself, and only actually writes when it's real. So
|
|
124
|
+
// there's no separate prediction to keep in sync here: real and dry-run
|
|
125
|
+
// report the exact same thing for the exact same reason.
|
|
126
|
+
const ledgerChanged = applyResult.agents.some((a) => a.ledgerChanged) || ledgerVersionChanged(state, VERSION);
|
|
127
|
+
rows.push(stateRow(ledgerChanged, state, statePath(homeDir)));
|
|
128
|
+
renderTable(rows);
|
|
88
129
|
process.stdout.write("\n");
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
await applyAgentInstalls({
|
|
94
|
-
agents,
|
|
95
|
-
force,
|
|
96
|
-
hooks,
|
|
97
|
-
refreshInstalledHooks: true,
|
|
98
|
-
dryRun,
|
|
99
|
-
homeDir,
|
|
100
|
-
});
|
|
101
|
-
return 0;
|
|
130
|
+
renderSummary(rows, dryRun);
|
|
131
|
+
renderModifiedNote(rows, "grounder migrate");
|
|
132
|
+
renderAgentErrors(applyResult);
|
|
133
|
+
return applyResult.agents.some((a) => a.error !== undefined) ? 1 : 0;
|
|
102
134
|
});
|
|
103
135
|
}
|
|
104
136
|
//# sourceMappingURL=migrate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,24 +4,32 @@ export interface NoteListOptions {
|
|
|
4
4
|
cwd?: string;
|
|
5
5
|
/** Max notes to print, newest first (default: 5). */
|
|
6
6
|
limit?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Agent relay: `[bucketRelativePath](fileUri)` on the title line (default:
|
|
9
|
+
* plain bucket-relative stem path). Absolute path stays indented beneath
|
|
10
|
+
* either way.
|
|
11
|
+
*/
|
|
12
|
+
markdown?: boolean;
|
|
7
13
|
/** Override home dir / `GROUNDER_HOME` (tests). */
|
|
8
14
|
homeDir?: string;
|
|
9
15
|
}
|
|
10
16
|
/**
|
|
11
|
-
* CLI entry for `grounder note list [--limit <n>]`.
|
|
17
|
+
* CLI entry for `grounder note list [--limit <n>] [--markdown]`.
|
|
12
18
|
* `--limit` must be a positive integer when provided.
|
|
13
19
|
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
14
20
|
*/
|
|
15
21
|
export declare function runNoteList(argv: string[]): Promise<number>;
|
|
16
22
|
/**
|
|
17
|
-
* Resolves the linked project, lists recent notes under `notes/`
|
|
18
|
-
* Prints a count header (blank line after when non-empty), then
|
|
19
|
-
* numbered two-line block — `N. ` +
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
23
|
+
* Resolves the linked project, lists recent notes under `notes/` recursively
|
|
24
|
+
* (newest first). Prints a count header (blank line after when non-empty), then
|
|
25
|
+
* each note as a numbered two-line block — `N. ` + bucket-relative stem path
|
|
26
|
+
* (nested files include subfolders), then the indented absolute path —
|
|
27
|
+
* separated by a blank line. With `markdown: true`, the title line is
|
|
28
|
+
* `[bucketRelativePath](fileUri)` under `notes/` (`.md` kept; no `notes/`
|
|
29
|
+
* prefix). The title line ends with two trailing spaces (a Markdown hard line
|
|
30
|
+
* break) so agents can relay stdout into chat and keep title and path on
|
|
31
|
+
* separate rendered lines. When `notes/` is empty, prints `No notes.` only.
|
|
32
|
+
* Same vault/link prerequisites as `grounder note`.
|
|
25
33
|
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
26
34
|
*/
|
|
27
35
|
export declare function runNoteListWithOptions(options?: NoteListOptions): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/note/list.ts"],"names":[],"mappings":"AAUA,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
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/note/list.ts"],"names":[],"mappings":"AAUA,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,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;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB3F"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { withHomeDir } from "../../connector/home.js";
|
|
2
2
|
import { resolveNotesDir } from "../../connector/vault.js";
|
|
3
3
|
import { helpExitCode } from "../../help.js";
|
|
4
|
-
import { parseArgs } from "../../util/parse-args.js";
|
|
4
|
+
import { flagBool, parseArgs } from "../../util/parse-args.js";
|
|
5
5
|
import { listNotes } from "../../vault/list-notes.js";
|
|
6
6
|
import { writeVaultItemList } from "../output.js";
|
|
7
7
|
import { requireLinkedProject } from "../require-linked.js";
|
|
8
8
|
const DEFAULT_LIMIT = 5;
|
|
9
|
-
const USAGE = "Usage: grounder note list [--limit <n>]\n";
|
|
9
|
+
const USAGE = "Usage: grounder note list [--limit <n>] [--markdown]\n";
|
|
10
10
|
function usageError() {
|
|
11
11
|
process.stderr.write(USAGE);
|
|
12
12
|
return 1;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* CLI entry for `grounder note list [--limit <n>]`.
|
|
15
|
+
* CLI entry for `grounder note list [--limit <n>] [--markdown]`.
|
|
16
16
|
* `--limit` must be a positive integer when provided.
|
|
17
17
|
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
18
18
|
*/
|
|
@@ -26,7 +26,7 @@ export async function runNoteList(argv) {
|
|
|
26
26
|
return usageError();
|
|
27
27
|
}
|
|
28
28
|
for (const key of flags.keys()) {
|
|
29
|
-
if (key !== "limit") {
|
|
29
|
+
if (key !== "limit" && key !== "markdown") {
|
|
30
30
|
return usageError();
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -43,17 +43,19 @@ export async function runNoteList(argv) {
|
|
|
43
43
|
}
|
|
44
44
|
limit = parsed;
|
|
45
45
|
}
|
|
46
|
-
return runNoteListWithOptions({ limit });
|
|
46
|
+
return runNoteListWithOptions({ limit, markdown: flagBool(flags, "markdown") });
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
* Resolves the linked project, lists recent notes under `notes/`
|
|
50
|
-
* Prints a count header (blank line after when non-empty), then
|
|
51
|
-
* numbered two-line block — `N. ` +
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
49
|
+
* Resolves the linked project, lists recent notes under `notes/` recursively
|
|
50
|
+
* (newest first). Prints a count header (blank line after when non-empty), then
|
|
51
|
+
* each note as a numbered two-line block — `N. ` + bucket-relative stem path
|
|
52
|
+
* (nested files include subfolders), then the indented absolute path —
|
|
53
|
+
* separated by a blank line. With `markdown: true`, the title line is
|
|
54
|
+
* `[bucketRelativePath](fileUri)` under `notes/` (`.md` kept; no `notes/`
|
|
55
|
+
* prefix). The title line ends with two trailing spaces (a Markdown hard line
|
|
56
|
+
* break) so agents can relay stdout into chat and keep title and path on
|
|
57
|
+
* separate rendered lines. When `notes/` is empty, prints `No notes.` only.
|
|
58
|
+
* Same vault/link prerequisites as `grounder note`.
|
|
57
59
|
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
58
60
|
*/
|
|
59
61
|
export async function runNoteListWithOptions(options = {}) {
|
|
@@ -65,7 +67,10 @@ export async function runNoteListWithOptions(options = {}) {
|
|
|
65
67
|
const limit = options.limit ?? DEFAULT_LIMIT;
|
|
66
68
|
const notesDir = resolveNotesDir(linked.home, linked.repo);
|
|
67
69
|
const paths = await listNotes(notesDir, { limit });
|
|
68
|
-
writeVaultItemList(paths, limit, { singular: "note", plural: "notes" }
|
|
70
|
+
writeVaultItemList(paths, limit, { singular: "note", plural: "notes" }, {
|
|
71
|
+
markdown: options.markdown === true,
|
|
72
|
+
titleRootDir: notesDir,
|
|
73
|
+
});
|
|
69
74
|
return 0;
|
|
70
75
|
});
|
|
71
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/note/list.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,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/note/list.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/note.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,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,CA2B7D;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiB9E"}
|
package/dist/commands/note.js
CHANGED
|
@@ -12,12 +12,20 @@ export async function runNote(argv) {
|
|
|
12
12
|
const { positional, flags } = parseArgs(argv);
|
|
13
13
|
const text = positional.join(" ").trim();
|
|
14
14
|
if (!text) {
|
|
15
|
-
process.stderr.write("Usage: grounder note <text> [--title <slug>]\n");
|
|
15
|
+
process.stderr.write("Usage: grounder note <text> [--title <slug>] [--topics <list>]\n");
|
|
16
16
|
return 1;
|
|
17
17
|
}
|
|
18
|
+
const topicsRaw = flagString(flags, "topics");
|
|
19
|
+
const topics = topicsRaw
|
|
20
|
+
? topicsRaw
|
|
21
|
+
.split(",")
|
|
22
|
+
.map((t) => t.trim())
|
|
23
|
+
.filter(Boolean)
|
|
24
|
+
: undefined;
|
|
18
25
|
return runNoteWithOptions({
|
|
19
26
|
text,
|
|
20
27
|
title: flagString(flags, "title"),
|
|
28
|
+
topics,
|
|
21
29
|
});
|
|
22
30
|
}
|
|
23
31
|
export async function runNoteWithOptions(options) {
|
|
@@ -29,6 +37,7 @@ export async function runNoteWithOptions(options) {
|
|
|
29
37
|
const notesDir = resolveNotesDir(linked.home, linked.repo);
|
|
30
38
|
const writtenPath = await writeNote(notesDir, options.text, {
|
|
31
39
|
title: options.title,
|
|
40
|
+
topics: options.topics,
|
|
32
41
|
now: options.now,
|
|
33
42
|
});
|
|
34
43
|
process.stdout.write(`Wrote ${writtenPath}\n`);
|
|
@@ -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,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;
|
|
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;AAY3D,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,kEAAkE,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,SAAS;QACtB,CAAC,CAAC,SAAS;aACN,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,kBAAkB,CAAC;QACxB,IAAI;QACJ,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;QACjC,MAAM;KACP,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,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,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"}
|
|
@@ -7,6 +7,21 @@ export type VaultItemListNoun = {
|
|
|
7
7
|
singular: string;
|
|
8
8
|
plural: string;
|
|
9
9
|
};
|
|
10
|
+
/** Options for {@link writeVaultItemList} / {@link writeVaultItemListEntries}. */
|
|
11
|
+
export type VaultItemListFormatOptions = {
|
|
12
|
+
/**
|
|
13
|
+
* Agent relay: first line is `[bucketRelativePath](fileUri)` (keeps `.md`);
|
|
14
|
+
* absolute path stays indented beneath for `--path` / Read matching.
|
|
15
|
+
* Requires `titleRootDir`.
|
|
16
|
+
*/
|
|
17
|
+
markdown?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Bucket dir (`notes/` / `logs/` / `plans/`) for titles — nested files show
|
|
20
|
+
* as `subdir/stem` (plain) or `subdir/name.md` (markdown) instead of a
|
|
21
|
+
* colliding bare name. Required when `markdown` is set.
|
|
22
|
+
*/
|
|
23
|
+
titleRootDir?: string;
|
|
24
|
+
};
|
|
10
25
|
/**
|
|
11
26
|
* Lead line for note/handoff/plan list stdout: truncation signal when
|
|
12
27
|
* `count === limit`, complete inventory when fewer, or empty-dir notice.
|
|
@@ -17,11 +32,16 @@ export declare function formatVaultItemListHeader(count: number, limit: number,
|
|
|
17
32
|
* Each title line ends with two trailing spaces (a Markdown hard line break)
|
|
18
33
|
* so agents can relay stdout into chat and keep title and path on separate
|
|
19
34
|
* rendered lines.
|
|
35
|
+
*
|
|
36
|
+
* Titles are bucket-relative under `titleRootDir` when set (nested files keep
|
|
37
|
+
* subfolders; no `notes/` / `logs/` / `plans/` prefix). With `markdown: true`,
|
|
38
|
+
* the title line is `[bucketRelativePath](fileUri)` (`.md` kept); plain mode
|
|
39
|
+
* strips the extension.
|
|
20
40
|
*/
|
|
21
|
-
export declare function writeVaultItemListEntries(paths: readonly string[]): void;
|
|
41
|
+
export declare function writeVaultItemListEntries(paths: readonly string[], options?: VaultItemListFormatOptions): void;
|
|
22
42
|
/**
|
|
23
43
|
* Count header + numbered title/path blocks for vault item lists.
|
|
24
44
|
* When `paths` is empty, prints only the empty-dir notice from the header.
|
|
25
45
|
*/
|
|
26
|
-
export declare function writeVaultItemList(paths: readonly string[], limit: number, noun: VaultItemListNoun): void;
|
|
46
|
+
export declare function writeVaultItemList(paths: readonly string[], limit: number, noun: VaultItemListNoun, options?: VaultItemListFormatOptions): void;
|
|
27
47
|
//# sourceMappingURL=output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/commands/output.ts"],"names":[],"mappings":"AAEA,sEAAsE;AAEtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,GACtB,MAAM,CASR;AAED
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/commands/output.ts"],"names":[],"mappings":"AAEA,sEAAsE;AAEtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wDAAwD;AACxD,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,8EAA8E;AAC9E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAMF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,GACtB,MAAM,CASR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,0BAA+B,GACvC,IAAI,CAiBN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,0BAA+B,GACvC,IAAI,CAGN"}
|
package/dist/commands/output.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { formatMarkdownFileLink, vaultItemPlainTitle, vaultRelativePath } from "../util/path.js";
|
|
2
2
|
/** Shared checklist/snapshot formatting for `doctor` and `status`. */
|
|
3
3
|
export function writeSection(title) {
|
|
4
4
|
process.stdout.write(`${title}\n`);
|
|
@@ -29,23 +29,35 @@ export function formatVaultItemListHeader(count, limit, noun) {
|
|
|
29
29
|
* Each title line ends with two trailing spaces (a Markdown hard line break)
|
|
30
30
|
* so agents can relay stdout into chat and keep title and path on separate
|
|
31
31
|
* rendered lines.
|
|
32
|
+
*
|
|
33
|
+
* Titles are bucket-relative under `titleRootDir` when set (nested files keep
|
|
34
|
+
* subfolders; no `notes/` / `logs/` / `plans/` prefix). With `markdown: true`,
|
|
35
|
+
* the title line is `[bucketRelativePath](fileUri)` (`.md` kept); plain mode
|
|
36
|
+
* strips the extension.
|
|
32
37
|
*/
|
|
33
|
-
export function writeVaultItemListEntries(paths) {
|
|
38
|
+
export function writeVaultItemListEntries(paths, options = {}) {
|
|
39
|
+
const markdown = options.markdown === true;
|
|
40
|
+
const titleRootDir = options.titleRootDir;
|
|
41
|
+
if (markdown && titleRootDir === undefined) {
|
|
42
|
+
throw new Error("titleRootDir is required when markdown is true");
|
|
43
|
+
}
|
|
34
44
|
paths.forEach((filePath, index) => {
|
|
35
45
|
if (index > 0) {
|
|
36
46
|
process.stdout.write("\n");
|
|
37
47
|
}
|
|
38
|
-
const
|
|
48
|
+
const title = markdown
|
|
49
|
+
? formatMarkdownFileLink(vaultRelativePath(titleRootDir, filePath), filePath)
|
|
50
|
+
: vaultItemPlainTitle(filePath, titleRootDir);
|
|
39
51
|
// Two trailing spaces: Markdown hard break when stdout is relayed into chat.
|
|
40
|
-
process.stdout.write(`${index + 1}. ${
|
|
52
|
+
process.stdout.write(`${index + 1}. ${title} \n ${filePath}\n`);
|
|
41
53
|
});
|
|
42
54
|
}
|
|
43
55
|
/**
|
|
44
56
|
* Count header + numbered title/path blocks for vault item lists.
|
|
45
57
|
* When `paths` is empty, prints only the empty-dir notice from the header.
|
|
46
58
|
*/
|
|
47
|
-
export function writeVaultItemList(paths, limit, noun) {
|
|
59
|
+
export function writeVaultItemList(paths, limit, noun, options = {}) {
|
|
48
60
|
process.stdout.write(formatVaultItemListHeader(paths.length, limit, noun));
|
|
49
|
-
writeVaultItemListEntries(paths);
|
|
61
|
+
writeVaultItemListEntries(paths, options);
|
|
50
62
|
}
|
|
51
63
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/commands/output.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/commands/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,sEAAsE;AAEtE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AAwBD,SAAS,aAAa,CAAC,KAAa,EAAE,IAAuB;IAC3D,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,KAAa,EACb,IAAuB;IAEvB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,eAAe,KAAK,IAAI,KAAK,2BAA2B,CAAC;IAClE,CAAC;IACD,OAAO,OAAO,KAAK,IAAI,KAAK,OAAO,CAAC;AACtC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAwB,EACxB,UAAsC,EAAE;IAExC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,QAAQ,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ;YACpB,CAAC,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,YAAsB,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;YACvF,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,6EAA6E;QAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,SAAS,QAAQ,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAwB,EACxB,KAAa,EACb,IAAuB,EACvB,UAAsC,EAAE;IAExC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3E,yBAAyB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Options for {@link runOverviewWithOptions} (CLI parsing and tests). */
|
|
2
|
+
export interface OverviewOptions {
|
|
3
|
+
/** Directory used to find the linked repo (default: `process.cwd()`). */
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** Max recent titles to print per bucket (default: 3). */
|
|
6
|
+
limit?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Agent relay: `[bucketRelativePath](fileUri)` on each title line (default:
|
|
9
|
+
* plain bucket-relative stem path).
|
|
10
|
+
*/
|
|
11
|
+
markdown?: boolean;
|
|
12
|
+
/** Structured JSON payload instead of formatted text. Mutually exclusive with `markdown`. */
|
|
13
|
+
json?: boolean;
|
|
14
|
+
/** Override home dir / `GROUNDER_HOME` (tests). */
|
|
15
|
+
homeDir?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* CLI entry for `grounder overview [--limit <n>] [--markdown] [--json]`.
|
|
19
|
+
* `--limit` must be a positive integer when provided.
|
|
20
|
+
* @returns Exit code (`0` on success, `1` on usage or config errors).
|
|
21
|
+
*/
|
|
22
|
+
export declare function runOverview(argv: string[]): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Resolves the linked project, gathers a per-bucket count + capped recent
|
|
25
|
+
* titles across `notes/`, `logs/` (handoffs), and `plans/` — the same
|
|
26
|
+
* newest-first listings `note/handoff/plan list` use, in one call. `--json`
|
|
27
|
+
* items also include `mtimeMs` (the same on-disk mtime each lister already
|
|
28
|
+
* fetches to rank entries; see `listNotesDetailed` / `listHandoffsDetailed` /
|
|
29
|
+
* `listPlansDetailed`). Text and markdown stay title + path only.
|
|
30
|
+
* @returns Exit code (`0` on success, `1` when vault/link is missing).
|
|
31
|
+
*/
|
|
32
|
+
export declare function runOverviewWithOptions(options?: OverviewOptions): Promise<number>;
|
|
33
|
+
//# sourceMappingURL=overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/commands/overview.ts"],"names":[],"mappings":"AAaA,0EAA0E;AAC1E,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,OAAO,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,CAuCjE;AA6FD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C3F"}
|