replen 1.0.5 → 1.0.7

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 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-match` skill into `~/.claude/skills/`
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-match for full triage.`);
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-match → triage today's candidates against this repo,");
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-match\` — redundant.
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-match\` if they want a fresh triage mid-session.
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
@@ -4,7 +4,7 @@
4
4
  //
5
5
  // - Claude Code → ~/.claude.json (JSON, mcpServers object,
6
6
  // + SessionStart hook,
7
- // + /replen-match skill)
7
+ // + /replen skill)
8
8
  // - Codex → ~/.codex/config.toml (TOML, [mcp_servers.replen]
9
9
  // table; AGENTS.md inject
10
10
  // provides session-start
@@ -1,12 +1,12 @@
1
- // Install the bundled `replen-match` skill into Claude Code's
2
- // ~/.claude/skills/ tree so users can invoke it via `/replen-match`
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-match",
26
- files: ["replen-match/SKILL.md"],
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-match
3
- description: Triage today's Replen candidates against the open codebase, in-session, using subscription tokens. Pulls the day's inventory from Replen, reads the user's local source, produces per-candidate writeups with verdict + effort + concrete file-level impact, then captures star/hide/handoff actions back to Replen. Invoke with `/replen-match` or by saying "run replen on this repo" / "what's new from replen?".
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,19 +207,36 @@ 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 sync-projects` (scans the
211
- local repos and pushes them to Replen). Then **set the domain tags yourself
212
- with the `replen_set_tags` tool** — derive them from the code you just read
213
- (e.g. for a Python CCXT market-making engine:
214
- `["crypto","trading","market-making","ccxt","quant","backtesting"]`).
215
- **Do NOT tell the user to set tags on the web** — that's the sticky step this
216
- replaces; set them with the tool. (They can still fine-tune later at
217
- app.replen.dev/projects.) Tags matter most right after onboarding, before the
218
- project has an embedding — without them a fresh project falls back to
219
- language-only matching and surfaces noise.
220
- 4. **Re-run.** Once it has a remote + docs + tags, call `replen_match` again
221
- now it scopes to the project and matches against the real code. (Its embedding
222
- lands on the next pipeline run; until then, tags carry the relevance.)
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
+ (e.g. `["crypto exchange","market data","backtesting","technical
219
+ analysis"]`; for a defense CV pipeline `["computer vision","object
220
+ detection","satellite imagery","geospatial mapping"]`). Derive these from
221
+ the actual imports/deps, not guesses. This is the highest-leverage step:
222
+ the server builds the project's facet vectors from these IMMEDIATELY (no
223
+ waiting for a scheduled run), and they drive both faceted matching and the
224
+ shared capability catalogue.
225
+
226
+ **Do NOT tell the user to set tags/capabilities on the web** — that's the
227
+ sticky step this replaces; set them with the tools. (They can fine-tune later
228
+ at app.replen.dev/projects.) These matter most right after onboarding — they
229
+ give a fresh project working query vectors before any server-side inference.
230
+ 4. **Embed it now (don't wait for the daily run).** A freshly-registered
231
+ project has no embedding yet, so matching falls back to language/tags only
232
+ (noise) until the next scheduled run. Trigger an immediate run with the
233
+ `replen_run` tool — it builds the project's summary + embedding + initial
234
+ candidates from the README/CLAUDE.md you just pushed. It's async: poll
235
+ `replen_status` until the phase reports inventory ready (~1–3 min). Tell the
236
+ user it's processing.
237
+ 5. **Re-run.** Once the run finishes, call `replen_match` again — now scoped
238
+ AND embedded, matching against the real code (a dev-tool that only shared the
239
+ project's language now scores low on cosine and gets floored out).
223
240
 
224
241
  Note on recording actions: always use the MCP tools — `replen_state` (star /
225
242
  hide / handoff), `replen_record_triage` (your verdict), `replen_set_tags` — for
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replen",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
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": {