replen 1.0.6 → 1.0.8
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 +1 -1
- package/dist/commands.js +1 -1
- package/dist/init.js +1 -1
- package/dist/inject-instruction.js +2 -2
- package/dist/mcp-setup.js +1 -1
- package/dist/skill-install.js +19 -5
- package/extras/skills/{replen-match → replen}/SKILL.md +26 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ In 60 seconds, the one-liner:
|
|
|
27
27
|
4. Auto-extracts tags from each (`package.json` deps, `pyproject.toml`, etc.)
|
|
28
28
|
5. Registers them with Replen as your projects (no GitHub PAT needed)
|
|
29
29
|
6. Wires the [@replen/mcp](https://www.npmjs.com/package/@replen/mcp) server into your Claude Code / Codex config
|
|
30
|
-
7. Installs the `/replen
|
|
30
|
+
7. Installs the `/replen` skill into `~/.claude/skills/`
|
|
31
31
|
8. Injects a small "Replen integration" section into each project's `CLAUDE.md` + `AGENTS.md`
|
|
32
32
|
|
|
33
33
|
**What you do not provide:**
|
package/dist/commands.js
CHANGED
|
@@ -302,7 +302,7 @@ export async function runCheckNew(argv) {
|
|
|
302
302
|
const inv = await fetchInventoryStatus(cfg, cwdRepo);
|
|
303
303
|
if (inv && inv.count > 0) {
|
|
304
304
|
const top = inv.topRepo ? ` Top: ${inv.topRepo}${inv.topSimilarity ? ` (~${inv.topSimilarity}% match)` : ""}.` : "";
|
|
305
|
-
console.log(`Replen has ${inv.count} candidate${inv.count === 1 ? "" : "s"} queued for ${cwdRepo}.${top} Run /replen
|
|
305
|
+
console.log(`Replen has ${inv.count} candidate${inv.count === 1 ? "" : "s"} queued for ${cwdRepo}.${top} Run /replen for full triage.`);
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
308
|
catch {
|
package/dist/init.js
CHANGED
|
@@ -160,7 +160,7 @@ export async function runInit() {
|
|
|
160
160
|
await runFirstIngest({ token: exchange.token, base: exchange.base, savedAt: "" });
|
|
161
161
|
console.log("");
|
|
162
162
|
console.log(" All set. Restart Claude Code and try:");
|
|
163
|
-
console.log(" /replen
|
|
163
|
+
console.log(" /replen → triage today's candidates against this repo,");
|
|
164
164
|
console.log(" in-session, using your subscription tokens");
|
|
165
165
|
console.log(" (no LLM API keys needed — the agent does the reasoning)");
|
|
166
166
|
console.log("");
|
|
@@ -77,7 +77,7 @@ On your **very first response** of each session:
|
|
|
77
77
|
shape.
|
|
78
78
|
|
|
79
79
|
**Additional silent cases** (besides \`(none)\` USER-FACING MESSAGE):
|
|
80
|
-
- The user explicitly typed \`/replen
|
|
80
|
+
- The user explicitly typed \`/replen\` — redundant.
|
|
81
81
|
- The user directly asked for Replen output ("anything from replen
|
|
82
82
|
today?", "what\'s new from replen?"). Just answer.
|
|
83
83
|
|
|
@@ -88,7 +88,7 @@ primitive here.
|
|
|
88
88
|
|
|
89
89
|
**Don\'t call \`replen_match\` again on subsequent turns** — once
|
|
90
90
|
per session at start only. The user explicitly types
|
|
91
|
-
\`/replen
|
|
91
|
+
\`/replen\` if they want a fresh triage mid-session.
|
|
92
92
|
`;
|
|
93
93
|
// Find candidate project directories using the same layered discovery
|
|
94
94
|
// as `npx replen sync-projects` — explicit --root flag → REPLEN_PROJECT_ROOTS
|
package/dist/mcp-setup.js
CHANGED
package/dist/skill-install.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
// Install the bundled `replen
|
|
2
|
-
// ~/.claude/skills/ tree so users can invoke it via `/replen
|
|
1
|
+
// Install the bundled `replen` skill into Claude Code's
|
|
2
|
+
// ~/.claude/skills/ tree so users can invoke it via `/replen`
|
|
3
3
|
// (or by saying "use replen / triage today / what's new from replen").
|
|
4
4
|
//
|
|
5
5
|
// Idempotent: re-running setup overwrites the skill in place. The
|
|
6
6
|
// skill is the source of truth in Replen's npm package; users
|
|
7
7
|
// shouldn't be hand-editing the installed copy because it'll be
|
|
8
8
|
// clobbered on next `npx replen mcp setup`.
|
|
9
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, rmSync } from "node:fs";
|
|
10
10
|
import { homedir } from "node:os";
|
|
11
11
|
import { join, dirname } from "node:path";
|
|
12
12
|
import { fileURLToPath } from "node:url";
|
|
@@ -22,10 +22,14 @@ const BUNDLED_SKILLS_ROOT = join(SELF_DIR, "..", "extras", "skills");
|
|
|
22
22
|
const CLAUDE_SKILLS_ROOT = join(homedir(), ".claude", "skills");
|
|
23
23
|
const SKILLS = [
|
|
24
24
|
{
|
|
25
|
-
name: "replen
|
|
26
|
-
files: ["replen
|
|
25
|
+
name: "replen",
|
|
26
|
+
files: ["replen/SKILL.md"],
|
|
27
27
|
},
|
|
28
28
|
];
|
|
29
|
+
// Old skill name, removed on setup so the renamed `/replen` is the single
|
|
30
|
+
// source of truth (a stale `/replen-match` copy would otherwise linger and
|
|
31
|
+
// show a duplicate command).
|
|
32
|
+
const LEGACY_SKILL_DIRS = ["replen-match"];
|
|
29
33
|
export function installSkills() {
|
|
30
34
|
if (!existsSync(BUNDLED_SKILLS_ROOT)) {
|
|
31
35
|
// Bundle missing — running from a source tree without the
|
|
@@ -36,6 +40,16 @@ export function installSkills() {
|
|
|
36
40
|
return;
|
|
37
41
|
}
|
|
38
42
|
mkdirSync(CLAUDE_SKILLS_ROOT, { recursive: true });
|
|
43
|
+
// Migrate: drop the pre-rename /replen-match skill so it doesn't linger.
|
|
44
|
+
for (const old of LEGACY_SKILL_DIRS) {
|
|
45
|
+
const oldFile = join(CLAUDE_SKILLS_ROOT, old, "SKILL.md");
|
|
46
|
+
if (existsSync(oldFile)) {
|
|
47
|
+
try {
|
|
48
|
+
rmSync(join(CLAUDE_SKILLS_ROOT, old), { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
catch { /* best effort */ }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
39
53
|
let installed = 0;
|
|
40
54
|
for (const skill of SKILLS) {
|
|
41
55
|
for (const rel of skill.files) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: replen
|
|
3
|
-
description:
|
|
2
|
+
name: replen
|
|
3
|
+
description: Review Replen's suggestions for the current repo against your code. Replen surfaces libraries, dependency releases, and security advisories relevant to what you're building; this reads the codebase, gives each one a clear verdict and effort estimate with the specific files it affects, and records what you decide. Invoke with `/replen` or by saying "what's new from Replen?".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Replen Match — in-session candidate triage
|
|
@@ -207,16 +207,30 @@ that actually fit."* If the user agrees, run this checklist:
|
|
|
207
207
|
what it is · stack · niche/domain · active areas · constraints/non-goals ·
|
|
208
208
|
anti-patterns · integration preferences). Use the project's real domain
|
|
209
209
|
vocabulary, not abstractions.
|
|
210
|
-
3. **Register + tag.** Register the repo: `npx replen
|
|
211
|
-
local repos and pushes them to Replen). Then
|
|
212
|
-
|
|
213
|
-
(e.g. for
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
210
|
+
3. **Register + tag + set capabilities.** Register the repo: `npx replen
|
|
211
|
+
sync-projects` (scans the local repos and pushes them to Replen). Then, from
|
|
212
|
+
the code you just read:
|
|
213
|
+
- **Set domain tags** with `replen_set_tags` — broad domain labels (e.g. for
|
|
214
|
+
a Python CCXT market-making engine:
|
|
215
|
+
`["crypto","trading","market-making","ccxt","quant","backtesting"]`).
|
|
216
|
+
- **Set technical capabilities** with `replen_set_capabilities` — short,
|
|
217
|
+
GitHub-searchable tech terms for what the project DOES at the tech level.
|
|
218
|
+
Aim for **8-15** and be **SPECIFIC** — specific capabilities match far
|
|
219
|
+
better than broad ones. Break a broad capability into the concrete
|
|
220
|
+
techniques the code actually uses: not just `"web scraping"` but
|
|
221
|
+
`["web scraping","headless browser","cloudflare bypass","proxy rotation",
|
|
222
|
+
"session handling","rate limiting"]`; not just `"trading"` but
|
|
223
|
+
`["crypto exchange","market data","backtesting","technical analysis",
|
|
224
|
+
"order management","websockets"]`. Derive them from the actual
|
|
225
|
+
imports/deps and code, not guesses. This is the highest-leverage step:
|
|
226
|
+
the server builds the project's facet vectors from these IMMEDIATELY (no
|
|
227
|
+
waiting for a scheduled run), and they drive faceted matching against the
|
|
228
|
+
shared library catalogue.
|
|
229
|
+
|
|
230
|
+
**Do NOT tell the user to set tags/capabilities on the web** — that's the
|
|
231
|
+
sticky step this replaces; set them with the tools. (They can fine-tune later
|
|
232
|
+
at app.replen.dev/projects.) These matter most right after onboarding — they
|
|
233
|
+
give a fresh project working query vectors before any server-side inference.
|
|
220
234
|
4. **Embed it now (don't wait for the daily run).** A freshly-registered
|
|
221
235
|
project has no embedding yet, so matching falls back to language/tags only
|
|
222
236
|
(noise) until the next scheduled run. Trigger an immediate run with the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "replen",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
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": {
|