replen 1.0.9 → 1.0.11
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/dist/commands.js +33 -0
- package/dist/index.js +7 -1
- package/dist/mcp-setup.js +9 -0
- package/package.json +1 -1
package/dist/commands.js
CHANGED
|
@@ -547,3 +547,36 @@ async function fetchInventoryStatus(cfg, repo) {
|
|
|
547
547
|
clearTimeout(timer);
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
|
+
// `replen atlas` — write your knowledge graph as an owned, Obsidian-compatible
|
|
551
|
+
// markdown vault to ~/.replen/atlas/. Fetches the rendered files from the server
|
|
552
|
+
// (one source of truth) and writes them locally; you own and can open them.
|
|
553
|
+
export async function runAtlas(argv) {
|
|
554
|
+
const { mkdirSync, writeFileSync, rmSync } = await import("node:fs");
|
|
555
|
+
const { join, dirname } = await import("node:path");
|
|
556
|
+
const { homedir } = await import("node:os");
|
|
557
|
+
const cfg = await loadConfigOrExit();
|
|
558
|
+
const dir = getFlag(argv, "--out") ?? join(homedir(), ".replen", "atlas");
|
|
559
|
+
const data = await apiGet(cfg, "/api/graph/atlas");
|
|
560
|
+
if (!data.files?.length) {
|
|
561
|
+
console.log("No Atlas yet — run /replen-onboard and a pipeline run first so the graph has something to map.");
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
// Fresh write: clear the managed subdirs, then write.
|
|
565
|
+
for (const sub of ["projects", "capabilities", "candidates", "themes"]) {
|
|
566
|
+
try {
|
|
567
|
+
rmSync(join(dir, sub), { recursive: true, force: true });
|
|
568
|
+
}
|
|
569
|
+
catch { /* */ }
|
|
570
|
+
}
|
|
571
|
+
for (const f of data.files) {
|
|
572
|
+
const full = join(dir, f.path);
|
|
573
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
574
|
+
writeFileSync(full, f.content);
|
|
575
|
+
}
|
|
576
|
+
if (hasFlag(argv, "--json")) {
|
|
577
|
+
console.log(JSON.stringify({ dir, count: data.files.length }));
|
|
578
|
+
return;
|
|
579
|
+
}
|
|
580
|
+
console.log(`Atlas written: ${data.files.length} notes → ${dir}`);
|
|
581
|
+
console.log(`Open ${dir} in Obsidian (or any markdown editor) to explore the graph view of your projects, capabilities, and decisions.`);
|
|
582
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { runInit } from "./init.js";
|
|
|
3
3
|
import { setupMcp } from "./mcp-setup.js";
|
|
4
4
|
import { readConfig, configPath } from "./config.js";
|
|
5
5
|
import { runProjectInit } from "./project-init.js";
|
|
6
|
-
import { runCheckNew, runFeed, runHandoff, runProgress, runRun, runSearch, runStarred, runWatch } from "./commands.js";
|
|
6
|
+
import { runCheckNew, runFeed, runHandoff, runProgress, runRun, runSearch, runStarred, runWatch, runAtlas } from "./commands.js";
|
|
7
7
|
const HELP = `replen: Smarter AI Development workflows
|
|
8
8
|
|
|
9
9
|
Usage:
|
|
@@ -21,6 +21,10 @@ Usage:
|
|
|
21
21
|
[--root PATH ...] and register them with Replen. Run after
|
|
22
22
|
cloning a new repo, or pass --root to point
|
|
23
23
|
at a non-conventional layout.
|
|
24
|
+
npx replen atlas Write your knowledge graph as an owned,
|
|
25
|
+
Obsidian-compatible markdown vault to
|
|
26
|
+
~/.replen/atlas/ (projects, capabilities,
|
|
27
|
+
decisions, themes, all cross-linked)
|
|
24
28
|
npx replen logout Forget saved auth
|
|
25
29
|
npx replen --help This help
|
|
26
30
|
|
|
@@ -146,6 +150,8 @@ async function main() {
|
|
|
146
150
|
return runStarred(argv);
|
|
147
151
|
if (cmd === "handoff")
|
|
148
152
|
return runHandoff(argv);
|
|
153
|
+
if (cmd === "atlas")
|
|
154
|
+
return runAtlas(argv);
|
|
149
155
|
if (cmd === undefined) {
|
|
150
156
|
// Default: if already signed in, just rerun mcp setup. Otherwise, full flow.
|
|
151
157
|
const cfg = await readConfig();
|
package/dist/mcp-setup.js
CHANGED
|
@@ -79,6 +79,15 @@ export async function setupMcp(token, base) {
|
|
|
79
79
|
const summary = summariseOutcome(outcome);
|
|
80
80
|
if (summary)
|
|
81
81
|
console.log(summary);
|
|
82
|
+
// Point the user at the onboarding sweep — the highest-leverage next step,
|
|
83
|
+
// and otherwise invisible (it's a separately-invoked skill, not part of this
|
|
84
|
+
// CLI flow). Without grounded, per-repo profiles the matcher leans on thin
|
|
85
|
+
// server-side inference; the sweep is what makes matches genuinely relevant.
|
|
86
|
+
console.log("");
|
|
87
|
+
console.log(" ▸ Next: open Claude Code and run /replen-onboard");
|
|
88
|
+
console.log(" It sets Replen up across your active repos in the background —");
|
|
89
|
+
console.log(" reading each one and building a tailored profile so matches are");
|
|
90
|
+
console.log(" relevant, not generic. Runs autonomously; nothing to wait on.");
|
|
82
91
|
}
|
|
83
92
|
function setupClaude(token, base) {
|
|
84
93
|
const path = CLAUDE_CONFIG;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "replen",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"description": "Make your AI coding tools smarter. One command, no API keys. Replen scouts the OSS firehose against your projects and surfaces drop-in libraries, ideas to port, and dead deps to swap — the match decision happens inside your AI tool's session on your subscription tokens. 1-3 actionable matches a month, by design.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|