replen 1.3.0 → 1.4.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.
@@ -148,6 +148,9 @@ async function postProjectsBulk(base, token, projects) {
148
148
  name: p.name,
149
149
  tags: p.tags,
150
150
  primaryLanguage: p.primaryLanguage ?? undefined,
151
+ // Absolute local checkout path — see sync-projects.ts. Inert unless
152
+ // the server is a self-host install with Immersion enabled.
153
+ localPath: p.localPath,
151
154
  })),
152
155
  }),
153
156
  signal: ctrl.signal,
@@ -20,6 +20,7 @@ const BUNDLED_SKILLS_ROOT = join(SELF_DIR, "..", "extras", "skills");
20
20
  // follow the MCP tool's description instead. The CLAUDE.md instruction
21
21
  // shipped by `replen project-init` is the cross-host fallback.
22
22
  const CLAUDE_SKILLS_ROOT = join(homedir(), ".claude", "skills");
23
+ const CLAUDE_COMMANDS_ROOT = join(homedir(), ".claude", "commands");
23
24
  const SKILLS = [
24
25
  {
25
26
  name: "replen",
@@ -54,6 +55,18 @@ export function installSkills() {
54
55
  catch { /* best effort */ }
55
56
  }
56
57
  }
58
+ // Migrate: an early Replen shipped a `/replen` slash COMMAND (~/.claude/commands/
59
+ // replen.md) that invokes the now-removed `replen-match` skill. Left in place it
60
+ // renders a DUPLICATE `/replen` next to the skill. Remove only OUR stale command —
61
+ // gated on it referencing `replen-match`, so a user's own `/replen` command (or any
62
+ // other) is never touched.
63
+ try {
64
+ const legacyCmd = join(CLAUDE_COMMANDS_ROOT, "replen.md");
65
+ if (existsSync(legacyCmd) && readFileSync(legacyCmd, "utf8").includes("replen-match")) {
66
+ rmSync(legacyCmd, { force: true });
67
+ }
68
+ }
69
+ catch { /* best effort */ }
57
70
  let installed = 0;
58
71
  for (const skill of SKILLS) {
59
72
  for (const rel of skill.files) {
@@ -38,6 +38,11 @@ export async function syncDiscoveredProjects({ token, base, explicitRoots = [],
38
38
  name: p.name,
39
39
  tags: p.tags,
40
40
  primaryLanguage: p.primaryLanguage ?? undefined,
41
+ // Absolute local checkout path. Used by Immersion on a self-host install
42
+ // (server == this machine) to ground on the actual source; inert on the
43
+ // hosted server, which can't read it. Always sent — it's identity, not
44
+ // code; nothing is read unless the operator enables Immersion.
45
+ localPath: p.localPath,
41
46
  })),
42
47
  };
43
48
  let res;
@@ -1,6 +1,6 @@
1
1
  ---
2
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?".
3
+ description: Triage today's Replen matches for this repo a verdict and effort estimate per candidate, grounded in your code. Invoke with `/replen` or "what's new from Replen?".
4
4
  ---
5
5
 
6
6
  # Replen Match — in-session candidate triage
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: replen-onboard
3
- description: One-time background setup for Replen. Works through the user's active repos reading each one's code, tidying thin/missing docs (never touching good ones), and building a tailored, grounded profile (a project report + capabilities) so Replen surfaces genuinely useful tools instead of generic ones. Runs autonomously in the background. Invoke with `/replen-onboard`, or when the user first sets up Replen and wants it configured properly across their projects.
3
+ description: One-time Replen setup profiles your active repos so matches are relevant, not generic. Runs autonomously in the background. Invoke with `/replen-onboard`.
4
4
  ---
5
5
 
6
6
  # Replen onboarding — autonomous, background, multi-repo setup
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replen",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Make your AI coding tools smarter. One command, no API keys, free. Replen watches what your projects actually do and surfaces a few things worth bringing in each month. Use one as is, port a piece of another, cherry pick an idea, or build it clean room. The match happens inside your AI tool's session. A few actionable matches a month, by design.",
5
5
  "type": "module",
6
6
  "bin": {