sverklo 0.28.3 → 0.29.1
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 +18 -13
- package/dist/bin/sverklo.js +186 -11
- package/dist/bin/sverklo.js.map +1 -1
- package/dist/src/doctor.d.ts +4 -1
- package/dist/src/doctor.js +120 -1
- package/dist/src/doctor.js.map +1 -1
- package/dist/src/indexer/parser-tree-sitter.js +0 -1
- package/dist/src/indexer/parser-tree-sitter.js.map +1 -1
- package/dist/src/init-global.js +25 -24
- package/dist/src/init-global.js.map +1 -1
- package/dist/src/init.d.ts +5 -0
- package/dist/src/init.js +140 -1
- package/dist/src/init.js.map +1 -1
- package/dist/src/marketing/campaign-cycle.d.ts +13 -0
- package/dist/src/marketing/campaign-cycle.js +107 -0
- package/dist/src/marketing/campaign-cycle.js.map +1 -0
- package/dist/src/marketing/content-quality.d.ts +11 -0
- package/dist/src/marketing/content-quality.js +51 -0
- package/dist/src/marketing/content-quality.js.map +1 -0
- package/dist/src/marketing/content-seeding.d.ts +2 -0
- package/dist/src/marketing/content-seeding.js +105 -0
- package/dist/src/marketing/content-seeding.js.map +1 -0
- package/dist/src/marketing/decisions.d.ts +10 -0
- package/dist/src/marketing/decisions.js +142 -0
- package/dist/src/marketing/decisions.js.map +1 -0
- package/dist/src/marketing/index.d.ts +12 -0
- package/dist/src/marketing/index.js +13 -0
- package/dist/src/marketing/index.js.map +1 -0
- package/dist/src/marketing/models.d.ts +189 -0
- package/dist/src/marketing/models.js +5 -0
- package/dist/src/marketing/models.js.map +1 -0
- package/dist/src/marketing/opportunity-scout.d.ts +8 -0
- package/dist/src/marketing/opportunity-scout.js +73 -0
- package/dist/src/marketing/opportunity-scout.js.map +1 -0
- package/dist/src/marketing/profile-health.d.ts +2 -0
- package/dist/src/marketing/profile-health.js +96 -0
- package/dist/src/marketing/profile-health.js.map +1 -0
- package/dist/src/marketing/report.d.ts +4 -0
- package/dist/src/marketing/report.js +67 -0
- package/dist/src/marketing/report.js.map +1 -0
- package/dist/src/marketing/scoring.d.ts +5 -0
- package/dist/src/marketing/scoring.js +89 -0
- package/dist/src/marketing/scoring.js.map +1 -0
- package/dist/src/marketing/status.d.ts +3 -0
- package/dist/src/marketing/status.js +58 -0
- package/dist/src/marketing/status.js.map +1 -0
- package/dist/src/marketing/storage.d.ts +29 -0
- package/dist/src/marketing/storage.js +99 -0
- package/dist/src/marketing/storage.js.map +1 -0
- package/dist/src/marketing/test-fixtures.d.ts +7 -0
- package/dist/src/marketing/test-fixtures.js +31 -0
- package/dist/src/marketing/test-fixtures.js.map +1 -0
- package/dist/src/marketing/validation.d.ts +9 -0
- package/dist/src/marketing/validation.js +66 -0
- package/dist/src/marketing/validation.js.map +1 -0
- package/dist/src/prove.d.ts +2 -0
- package/dist/src/prove.js +41 -2
- package/dist/src/prove.js.map +1 -1
- package/dist/src/server/tools/review-diff.js +0 -1
- package/dist/src/server/tools/review-diff.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -15,14 +15,17 @@ Sverklo gives coding agents repo memory: symbols, callers, diffs, blast radius,
|
|
|
15
15
|
Use grep when you know the exact string. Use Sverklo when the agent needs relationships: who calls this, what depends on it, what changed, and which project decisions still apply. The public bench covers 180 hand-verified tasks across 6 OSS codebases; the methodology and ground truth live in [sverklo/sverklo-bench](https://github.com/sverklo/sverklo-bench). [Bench](https://sverklo.com/bench/) · [paper](https://doi.org/10.5281/zenodo.19802051) · [90-second demo](https://www.youtube.com/watch?v=OX7aEgdlqhQ)
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
sverklo
|
|
18
|
+
cd your-project
|
|
19
|
+
npm exec --yes --package=sverklo@latest -- sverklo prove --no-write --guided
|
|
20
|
+
sverklo init --dry-run
|
|
21
|
+
npm install -g sverklo && sverklo init
|
|
21
22
|
```
|
|
22
23
|
|
|
23
|
-
`sverklo init` writes the MCP config for your agent, appends local instructions to `AGENTS.md` or `CLAUDE.md`, and runs `sverklo doctor` to verify the handshake.
|
|
24
|
+
`sverklo prove --no-write --guided` shows central files, a real symbol with callers, why that proof was selected, and the exact prompt to paste into your agent before any MCP config or instruction files are written. It may cache the local model/index under `~/.sverklo`, but it does not mutate your project. `sverklo init --dry-run` then previews the files `init` would touch; `sverklo init` writes the MCP config for your agent, appends local instructions to `AGENTS.md` or `CLAUDE.md`, and runs `sverklo doctor` to verify the handshake. Your code stays on your machine.
|
|
24
25
|
|
|
25
|
-
Need something shareable? Run `sverklo prove --markdown` to print a GitHub/Discord-ready proof receipt from your repo.
|
|
26
|
+
Need something shareable? Run `sverklo prove --markdown` to print a GitHub/Discord-ready proof receipt from your repo, then [post it in the proof thread](https://github.com/sverklo/sverklo/discussions/79).
|
|
27
|
+
|
|
28
|
+
Need local launch planning for the Sverklo account? `sverklo marketing` runs a local-first Twitter/X agent-team workflow from operator-provided snapshots. It ranks opportunities, drafts seed-content queues, checks profile health, and records human decisions without posting, scraping, replying, liking, reposting, following, or changing the profile.
|
|
26
29
|
|
|
27
30
|
> *"The map is not the territory."* — Alfred Korzybski
|
|
28
31
|
>
|
|
@@ -75,12 +78,13 @@ Sverklo drills into your repo before the agent does — symbol graph, blast radi
|
|
|
75
78
|
</table>
|
|
76
79
|
|
|
77
80
|
```bash
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
sverklo
|
|
81
|
+
cd your-project
|
|
82
|
+
npm exec --yes --package=sverklo@latest -- sverklo prove --no-write --guided
|
|
83
|
+
sverklo init --dry-run
|
|
84
|
+
npm install -g sverklo && sverklo init
|
|
81
85
|
```
|
|
82
86
|
|
|
83
|
-
That's it. `sverklo init` auto-detects your installed AI coding agent (Claude Code, Cursor, Windsurf, Zed), writes the right MCP config, appends instructions to `AGENTS.md` if present (otherwise `CLAUDE.md`), and runs `sverklo doctor` to verify the setup. `sverklo prove`
|
|
87
|
+
That's it. `sverklo prove --no-write --guided` gives you the first useful repo-memory proof from your own codebase before project config changes; `sverklo init --dry-run` previews every setup target; `sverklo init` auto-detects your installed AI coding agent (Claude Code, Cursor, Windsurf, Zed), writes the right MCP config, appends instructions to `AGENTS.md` if present (otherwise `CLAUDE.md`), and runs `sverklo doctor` to verify the setup. `sverklo prove --markdown` makes that proof shareable in [the public proof thread](https://github.com/sverklo/sverklo/discussions/79). Works on macOS, Linux, and Windows. **No API keys. No cloud. Telemetry off by default.**
|
|
84
88
|
|
|
85
89
|
> The embedding model (`all-MiniLM-L6-v2` ONNX, ~86 MB) is downloaded from HuggingFace on first use into `~/.sverklo/models/` and cached forever — every subsequent run is fully offline.
|
|
86
90
|
|
|
@@ -449,12 +453,13 @@ Click the badge for your editor. Cursor / VS Code prompt to confirm, then sverkl
|
|
|
449
453
|
<br/>
|
|
450
454
|
|
|
451
455
|
```bash
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
sverklo
|
|
456
|
+
cd your-project
|
|
457
|
+
npm exec --yes --package=sverklo@latest -- sverklo prove --no-write --guided
|
|
458
|
+
sverklo init --dry-run
|
|
459
|
+
npm install -g sverklo && sverklo init
|
|
455
460
|
```
|
|
456
461
|
|
|
457
|
-
`sverklo init` auto-detects which AI coding agents you have (Claude Code, Cursor, Windsurf, Zed, Antigravity) and writes the right MCP config files.
|
|
462
|
+
Start with proof, then wire the agent. `sverklo prove --no-write --guided` prints central files, a real caller graph, why that symbol was selected, and a prompt to paste into your agent without writing MCP config or instruction files. `sverklo init --dry-run` previews setup targets. `sverklo init` auto-detects which AI coding agents you have (Claude Code, Cursor, Windsurf, Zed, Antigravity) and writes the right MCP config files. Add `--markdown` or `--receipt` for a shareable proof artifact, then post it in [the proof thread](https://github.com/sverklo/sverklo/discussions/79). Idempotent — safe to re-run. If sverklo doesn't appear in your agent after restart, run `sverklo doctor --agent claude` or the matching agent name.
|
|
458
463
|
|
|
459
464
|
**Per-agent config locations** (`sverklo init` writes these for you):
|
|
460
465
|
- Claude Code: `.mcp.json` at project root + appends to `CLAUDE.md` (or `AGENTS.md` if present)
|
package/dist/bin/sverklo.js
CHANGED
|
@@ -39,6 +39,8 @@ async function resolveProjectPath(flags) {
|
|
|
39
39
|
}
|
|
40
40
|
function parseProveArgs(rawArgs) {
|
|
41
41
|
let format = "text";
|
|
42
|
+
let guided = false;
|
|
43
|
+
let noWrite = false;
|
|
42
44
|
const pathArgs = [];
|
|
43
45
|
for (let i = 0; i < rawArgs.length; i++) {
|
|
44
46
|
const arg = rawArgs[i];
|
|
@@ -65,9 +67,17 @@ function parseProveArgs(rawArgs) {
|
|
|
65
67
|
format = value === "markdown" ? "markdown" : "text";
|
|
66
68
|
continue;
|
|
67
69
|
}
|
|
70
|
+
if (arg === "--guided") {
|
|
71
|
+
guided = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (arg === "--no-write" || arg === "--no-config-write") {
|
|
75
|
+
noWrite = true;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
68
78
|
pathArgs.push(arg);
|
|
69
79
|
}
|
|
70
|
-
return { format, pathArgs };
|
|
80
|
+
return { format, guided, noWrite, pathArgs };
|
|
71
81
|
}
|
|
72
82
|
// Global --help / -h interceptor.
|
|
73
83
|
//
|
|
@@ -102,6 +112,7 @@ if (command && command !== "--help" && command !== "-h") {
|
|
|
102
112
|
digest: "5-line summary of what changed in this project. Flags: --since 7d, --format markdown|plain.",
|
|
103
113
|
receipt: "Token-spend receipt for your recent Claude Code sessions. Shows where tokens went and projected yearly cost. Flags: --since 7d, --format plain|json.",
|
|
104
114
|
memory: "Manage the memory store. Subcommands: show, edit, import, export.",
|
|
115
|
+
marketing: "Run the local-first Sverklo Twitter agent team workflow. Subcommands: init, run-cycle, decide, status.",
|
|
105
116
|
grammars: "Manage tree-sitter grammars for the SVERKLO_PARSER=tree-sitter opt-in path. Subcommands: install.",
|
|
106
117
|
weights: "Inspect .sverklo.yaml weight rules. Subcommands: explain <path> — show which glob matched and the effective weight.",
|
|
107
118
|
"audit-prompt": "Print a ready-to-paste codebase-audit prompt (hybrid agent workflow).",
|
|
@@ -149,6 +160,137 @@ if (command === "--version" || command === "-v" || command === "-V") {
|
|
|
149
160
|
console.log("sverklo (version unknown)");
|
|
150
161
|
process.exit(0);
|
|
151
162
|
}
|
|
163
|
+
if (command === "marketing") {
|
|
164
|
+
const subcommand = args[1];
|
|
165
|
+
const flags = args.slice(2);
|
|
166
|
+
const flagVal = (name) => {
|
|
167
|
+
const idx = flags.indexOf(name);
|
|
168
|
+
if (idx !== -1 && flags[idx + 1])
|
|
169
|
+
return flags[idx + 1];
|
|
170
|
+
const prefixed = flags.find((f) => f.startsWith(`${name}=`));
|
|
171
|
+
return prefixed ? prefixed.slice(name.length + 1) : undefined;
|
|
172
|
+
};
|
|
173
|
+
const requireFlag = (name) => {
|
|
174
|
+
const value = flagVal(name);
|
|
175
|
+
if (!value) {
|
|
176
|
+
console.error(`✗ ${name} is required`);
|
|
177
|
+
process.exit(2);
|
|
178
|
+
}
|
|
179
|
+
return value;
|
|
180
|
+
};
|
|
181
|
+
const format = flagVal("--format") ?? "text";
|
|
182
|
+
if (format !== "text" && format !== "json") {
|
|
183
|
+
console.error(`✗ --format must be text or json, got "${format}"`);
|
|
184
|
+
process.exit(2);
|
|
185
|
+
}
|
|
186
|
+
const { appendOperatorDecision, applyOperatorDecision, assertEvidenceCatalog, assertProfileSnapshot, assertRecentPostsSnapshot, assertTrendSnapshot, buildStatusSummary, createOperatorDecision, initMarketingWorkspace, jsonFile, loadActiveCampaignCycle, loadCampaignCycle, loadMarketingWorkspace, marketingPaths, normalizeAccountHandle, recomputeCampaignReadiness, renderContentReport, renderOpportunityReport, renderProfileHealthReport, renderStatusText, resolveMarketingWorkspace, runCampaignCycle, saveCampaignCycle, saveMarketingWorkspace, writeReport, } = await import("../src/marketing/index.js");
|
|
187
|
+
const { existsSync } = await import("node:fs");
|
|
188
|
+
const { join } = await import("node:path");
|
|
189
|
+
const workspacePath = flagVal("--workspace");
|
|
190
|
+
const readOptional = (path) => {
|
|
191
|
+
return path && existsSync(path) ? jsonFile(path) : undefined;
|
|
192
|
+
};
|
|
193
|
+
if (!subcommand || subcommand === "--help" || subcommand === "-h") {
|
|
194
|
+
console.log(`\nsverklo marketing — local-first Twitter agent team workflow\n\n` +
|
|
195
|
+
`Usage:\n` +
|
|
196
|
+
` sverklo marketing init --account @sverklo [--workspace PATH]\n` +
|
|
197
|
+
` sverklo marketing run-cycle [--workspace PATH] [--trends PATH] [--profile PATH] [--recent-posts PATH] [--evidence PATH] [--format text|json]\n` +
|
|
198
|
+
` sverklo marketing decide --target-type TYPE --target-id ID --decision VALUE [--reason TEXT] [--future]\n` +
|
|
199
|
+
` sverklo marketing status [--workspace PATH] [--format text|json]\n\n` +
|
|
200
|
+
`No command posts to X/Twitter, scrapes X, sends DMs, likes, reposts, follows, unfollows, or mutates the profile.\n`);
|
|
201
|
+
process.exit(0);
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
if (subcommand === "init") {
|
|
205
|
+
const account = normalizeAccountHandle(requireFlag("--account"));
|
|
206
|
+
const workspace = initMarketingWorkspace({ workspacePath, accountHandle: account });
|
|
207
|
+
console.log(`Initialized marketing workspace for ${workspace.account_handle} at ${resolveMarketingWorkspace(workspacePath)}`);
|
|
208
|
+
process.exit(0);
|
|
209
|
+
}
|
|
210
|
+
if (subcommand === "run-cycle") {
|
|
211
|
+
const workspace = loadMarketingWorkspace(workspacePath);
|
|
212
|
+
const root = resolveMarketingWorkspace(workspacePath);
|
|
213
|
+
const inputDir = marketingPaths(root).inputs;
|
|
214
|
+
const existing = loadActiveCampaignCycle(workspacePath, workspace);
|
|
215
|
+
const trends = readOptional(flagVal("--trends") ?? join(inputDir, "trend-snapshot.json"));
|
|
216
|
+
const profile = readOptional(flagVal("--profile") ?? join(inputDir, "profile-snapshot.json"));
|
|
217
|
+
const recentPosts = readOptional(flagVal("--recent-posts") ?? join(inputDir, "recent-posts.json"));
|
|
218
|
+
const evidence = readOptional(flagVal("--evidence") ?? join(inputDir, "evidence.json"));
|
|
219
|
+
if (trends)
|
|
220
|
+
assertTrendSnapshot(trends);
|
|
221
|
+
if (profile)
|
|
222
|
+
assertProfileSnapshot(profile);
|
|
223
|
+
if (recentPosts)
|
|
224
|
+
assertRecentPostsSnapshot(recentPosts);
|
|
225
|
+
if (evidence)
|
|
226
|
+
assertEvidenceCatalog(evidence);
|
|
227
|
+
if (!trends && !profile && !recentPosts && !evidence && !existing) {
|
|
228
|
+
throw new Error("no local marketing inputs found; provide --trends, --profile, --recent-posts, or --evidence");
|
|
229
|
+
}
|
|
230
|
+
const cycleNow = trends?.captured_at ??
|
|
231
|
+
profile?.captured_at ??
|
|
232
|
+
recentPosts?.captured_at ??
|
|
233
|
+
existing?.updated_at;
|
|
234
|
+
const cycle = runCampaignCycle({
|
|
235
|
+
workspace,
|
|
236
|
+
existingCycle: existing,
|
|
237
|
+
trendSnapshot: trends,
|
|
238
|
+
profileSnapshot: profile,
|
|
239
|
+
recentPosts,
|
|
240
|
+
evidence,
|
|
241
|
+
cycleId: flagVal("--cycle"),
|
|
242
|
+
now: cycleNow,
|
|
243
|
+
});
|
|
244
|
+
saveMarketingWorkspace(workspacePath, workspace);
|
|
245
|
+
saveCampaignCycle(workspacePath, cycle);
|
|
246
|
+
writeReport(workspacePath, cycle.cycle_id, "opportunities", renderOpportunityReport(cycle));
|
|
247
|
+
writeReport(workspacePath, cycle.cycle_id, "content", renderContentReport(cycle));
|
|
248
|
+
writeReport(workspacePath, cycle.cycle_id, "profile-health", renderProfileHealthReport(cycle));
|
|
249
|
+
const summary = buildStatusSummary(cycle);
|
|
250
|
+
if (format === "json")
|
|
251
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
252
|
+
else
|
|
253
|
+
process.stdout.write(renderStatusText(summary));
|
|
254
|
+
process.exit(0);
|
|
255
|
+
}
|
|
256
|
+
if (subcommand === "decide") {
|
|
257
|
+
const workspace = loadMarketingWorkspace(workspacePath);
|
|
258
|
+
if (!workspace.active_cycle_id)
|
|
259
|
+
throw new Error("no active marketing cycle");
|
|
260
|
+
const cycle = loadCampaignCycle(workspacePath, workspace.active_cycle_id);
|
|
261
|
+
const decision = createOperatorDecision({
|
|
262
|
+
targetType: requireFlag("--target-type"),
|
|
263
|
+
targetId: requireFlag("--target-id"),
|
|
264
|
+
decision: requireFlag("--decision"),
|
|
265
|
+
reason: flagVal("--reason"),
|
|
266
|
+
future: flags.includes("--future"),
|
|
267
|
+
});
|
|
268
|
+
applyOperatorDecision(workspace, cycle, decision);
|
|
269
|
+
recomputeCampaignReadiness(cycle);
|
|
270
|
+
saveMarketingWorkspace(workspacePath, workspace);
|
|
271
|
+
saveCampaignCycle(workspacePath, cycle);
|
|
272
|
+
appendOperatorDecision(workspacePath, decision);
|
|
273
|
+
console.log(`Recorded decision ${decision.decision_id}`);
|
|
274
|
+
process.exit(0);
|
|
275
|
+
}
|
|
276
|
+
if (subcommand === "status") {
|
|
277
|
+
const workspace = loadMarketingWorkspace(workspacePath);
|
|
278
|
+
const cycle = loadActiveCampaignCycle(workspacePath, workspace);
|
|
279
|
+
const summary = buildStatusSummary(cycle);
|
|
280
|
+
if (format === "json")
|
|
281
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
282
|
+
else
|
|
283
|
+
process.stdout.write(renderStatusText(summary));
|
|
284
|
+
process.exit(0);
|
|
285
|
+
}
|
|
286
|
+
console.error(`✗ unknown marketing subcommand: ${subcommand}`);
|
|
287
|
+
process.exit(2);
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
console.error(`✗ ${err instanceof Error ? err.message : String(err)}`);
|
|
291
|
+
process.exit(2);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
152
294
|
if (command === "init") {
|
|
153
295
|
// Parse flags: --auto-capture, --mine-chats, --global
|
|
154
296
|
const flags = args.filter((a) => a.startsWith("--"));
|
|
@@ -156,7 +298,18 @@ if (command === "init") {
|
|
|
156
298
|
const autoCapture = flags.includes("--auto-capture");
|
|
157
299
|
const mineChats = flags.includes("--mine-chats");
|
|
158
300
|
const isGlobal = flags.includes("--global");
|
|
301
|
+
const dryRun = flags.includes("--dry-run");
|
|
159
302
|
const projectPath = resolve(positional[1] || process.cwd());
|
|
303
|
+
if (dryRun) {
|
|
304
|
+
if (isGlobal) {
|
|
305
|
+
console.error("✗ sverklo init --dry-run does not support --global yet");
|
|
306
|
+
console.error(" Run `sverklo init --global` only after reviewing global instruction targets manually.");
|
|
307
|
+
process.exit(2);
|
|
308
|
+
}
|
|
309
|
+
const { renderInitDryRun } = await import("../src/init.js");
|
|
310
|
+
process.stdout.write(renderInitDryRun(projectPath, { autoCapture, mineChats }));
|
|
311
|
+
process.exit(0);
|
|
312
|
+
}
|
|
160
313
|
if (isGlobal) {
|
|
161
314
|
// Issue #72 — one-time-per-machine setup. Writes SVERKLO_SNIPPET to
|
|
162
315
|
// global agent-instruction locations (~/.claude/CLAUDE.md, ~/.codex/AGENTS.md),
|
|
@@ -195,10 +348,10 @@ if (command === "register") {
|
|
|
195
348
|
process.exit(0);
|
|
196
349
|
}
|
|
197
350
|
if (command === "prove") {
|
|
198
|
-
const { format, pathArgs } = parseProveArgs(args.slice(1));
|
|
351
|
+
const { format, guided, noWrite, pathArgs } = parseProveArgs(args.slice(1));
|
|
199
352
|
const projectPath = await resolveProjectPath(pathArgs);
|
|
200
353
|
const { runProve } = await import("../src/prove.js");
|
|
201
|
-
const report = await runProve(projectPath, { format });
|
|
354
|
+
const report = await runProve(projectPath, { format, guided, noWrite });
|
|
202
355
|
process.stdout.write(report);
|
|
203
356
|
process.exit(0);
|
|
204
357
|
}
|
|
@@ -523,9 +676,24 @@ if (command === "audit-prompt" || command === "review-prompt") {
|
|
|
523
676
|
process.exit(0);
|
|
524
677
|
}
|
|
525
678
|
if (command === "doctor" || command === "diagnose" || command === "check") {
|
|
526
|
-
|
|
679
|
+
let agent;
|
|
680
|
+
const pathArgs = [];
|
|
681
|
+
for (let i = 1; i < args.length; i++) {
|
|
682
|
+
const arg = args[i];
|
|
683
|
+
if (arg === "--agent") {
|
|
684
|
+
agent = args[i + 1];
|
|
685
|
+
i++;
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
if (arg.startsWith("--agent=")) {
|
|
689
|
+
agent = arg.slice("--agent=".length);
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
pathArgs.push(arg);
|
|
693
|
+
}
|
|
694
|
+
const projectPath = resolve(pathArgs[0] || process.cwd());
|
|
527
695
|
const { runDoctor } = await import("../src/doctor.js");
|
|
528
|
-
runDoctor(projectPath);
|
|
696
|
+
runDoctor(projectPath, { agent });
|
|
529
697
|
process.exit(0);
|
|
530
698
|
}
|
|
531
699
|
if (command === "workspace") {
|
|
@@ -2612,16 +2780,21 @@ if (command === "--help" || command === "-h") {
|
|
|
2612
2780
|
sverklo — code intelligence for AI agents
|
|
2613
2781
|
|
|
2614
2782
|
Just installed? Run these two:
|
|
2615
|
-
sverklo
|
|
2616
|
-
|
|
2783
|
+
sverklo prove --no-write --guided
|
|
2784
|
+
Show proof before writing project or agent config files
|
|
2785
|
+
sverklo init --dry-run Preview the config files init would touch
|
|
2617
2786
|
|
|
2618
2787
|
Then restart your AI agent (Claude Code, Cursor, Windsurf, etc.) — sverklo tools become available automatically.
|
|
2619
2788
|
|
|
2620
2789
|
Usage:
|
|
2621
2790
|
sverklo init Set up sverklo in your project (.mcp.json + CLAUDE.md)
|
|
2791
|
+
sverklo init --dry-run Preview planned writes without changing files
|
|
2622
2792
|
sverklo doctor Diagnose MCP setup issues
|
|
2793
|
+
sverklo doctor --agent codex
|
|
2794
|
+
Show agent-specific setup/check prompt guidance
|
|
2623
2795
|
sverklo prove [path] Show central files, a real caller graph, and an agent prompt
|
|
2624
|
-
Use --
|
|
2796
|
+
Use --guided for selection notes, --no-write for trial mode,
|
|
2797
|
+
and --markdown or --receipt for a shareable artifact.
|
|
2625
2798
|
sverklo reindex [path] Incremental rebuild of the index (changed files only)
|
|
2626
2799
|
Use --force to clear and rebuild from scratch.
|
|
2627
2800
|
Use --timing to see per-phase elapsed ms.
|
|
@@ -2646,6 +2819,7 @@ Memory + offline maintenance:
|
|
|
2646
2819
|
sverklo wiki Generate a markdown wiki from the indexed codebase
|
|
2647
2820
|
sverklo digest 5-line summary of what changed in this project (--since 7d)
|
|
2648
2821
|
sverklo memory export Export memories to markdown / Notion / JSON
|
|
2822
|
+
sverklo marketing Local Sverklo Twitter agent team workflow
|
|
2649
2823
|
sverklo grammars install Install tree-sitter grammars for the v0.17 opt-in parser
|
|
2650
2824
|
sverklo prune Decay stale memories + consolidate similar episodic ones
|
|
2651
2825
|
sverklo concept-index Label clusters with an LLM (requires Ollama)
|
|
@@ -2662,9 +2836,10 @@ Setup / runtime:
|
|
|
2662
2836
|
sverklo --help Show this help
|
|
2663
2837
|
|
|
2664
2838
|
Quick start (single project):
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
sverklo
|
|
2839
|
+
cd your-project
|
|
2840
|
+
npm exec --yes --package=sverklo@latest -- sverklo prove --no-write --guided
|
|
2841
|
+
sverklo init --dry-run
|
|
2842
|
+
npm install -g sverklo && sverklo init
|
|
2668
2843
|
sverklo prove --markdown # shareable proof for GitHub, Discord, Reddit, etc.
|
|
2669
2844
|
claude # start coding — sverklo tools are preferred automatically
|
|
2670
2845
|
|