replen 1.0.31 → 1.0.33

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/mcp-setup.js CHANGED
@@ -26,6 +26,14 @@ import { fileURLToPath } from "node:url";
26
26
  import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
27
27
  import { installSkills } from "./skill-install.js";
28
28
  const SERVER_NAME = "replen";
29
+ // Launch the MCP via a SEMVER RANGE, not a tag-less spec. Bare `npx @replen/mcp`
30
+ // resolves once and reuses the cached build forever, so users silently run stale
31
+ // builds and miss new tools (the paths/mode regression came from exactly this).
32
+ // `@^1` makes npx re-resolve the newest 1.x on every session spawn — auto-updates
33
+ // minors/patches, never jumps a breaking major — so a fresh agent session = latest
34
+ // features with no manual `@latest` step to remember. Each setup run REWRITES this
35
+ // entry, so returning users are migrated off the old tag-less spec automatically.
36
+ const MCP_PKG = "@replen/mcp@^1";
29
37
  const CLAUDE_CONFIG = join(homedir(), ".claude.json");
30
38
  const CLAUDE_SETTINGS = join(homedir(), ".claude", "settings.json");
31
39
  const CODEX_CONFIG = join(homedir(), ".codex", "config.toml");
@@ -99,7 +107,7 @@ function setupClaude(token, base) {
99
107
  mcpServers[SERVER_NAME] = {
100
108
  type: "stdio",
101
109
  command: "npx",
102
- args: ["-y", "@replen/mcp"],
110
+ args: ["-y", MCP_PKG],
103
111
  env: { DIGEST_BASE_URL: base, DIGEST_TOKEN: token },
104
112
  };
105
113
  const hooks = installSessionStartHook(config.hooks ?? {});
@@ -146,7 +154,7 @@ function setupGemini(token, base) {
146
154
  // docs/tools/mcp-server.md): command, args, env. No `type` field.
147
155
  mcpServers[SERVER_NAME] = {
148
156
  command: "npx",
149
- args: ["-y", "@replen/mcp"],
157
+ args: ["-y", MCP_PKG],
150
158
  env: { DIGEST_BASE_URL: base, DIGEST_TOKEN: token },
151
159
  };
152
160
  writeJsonAtomic(path, { ...config, mcpServers });
@@ -168,7 +176,7 @@ function setupCodex(token, base) {
168
176
  // handles automatically for small objects.
169
177
  mcpServers[SERVER_NAME] = {
170
178
  command: "npx",
171
- args: ["-y", "@replen/mcp"],
179
+ args: ["-y", MCP_PKG],
172
180
  env: { DIGEST_BASE_URL: base, DIGEST_TOKEN: token },
173
181
  };
174
182
  writeTomlAtomic(path, { ...config, mcp_servers: mcpServers });
@@ -239,6 +239,28 @@ A triage that isn't recorded never happened.
239
239
  Only the user-judgment actions (star / hide / handoff / queue work) wait
240
240
  for the user. Verdicts never do.
241
241
 
242
+ #### 3e. Write back what you LEARNED from the code — not just the verdict
243
+
244
+ Triage is the one moment you actually read the source, so feed what you
245
+ learned back into Replen's model of the project (it's non-destructive and
246
+ makes every future match sharper). Two cheap write-backs, both optional,
247
+ both additive:
248
+
249
+ - **Capability paths.** When you confirm which file(s) implement the
250
+ capability a candidate matched — especially if the candidate's
251
+ `matchedFacet` has no paths yet — call `replen_set_capabilities` with
252
+ **`mode:"merge"`** and just that one capability:
253
+ `{ tag: "<matchedFacet>", paths: ["src/…", "lib/…"] }`. Merge mode adds
254
+ the paths without touching the project's other capabilities. This is what
255
+ makes "port THIS exact file" possible in later sessions and populates the
256
+ Atlas dossier + cross-project leaps. Paths only, never code.
257
+ - **Dep corrections.** When the code shows a listed dependency is unused or
258
+ superseded (e.g. a stale `ethers` in a repo that's actually on `viem`),
259
+ pass `depsSuperseded: ["ethers"]` on the `replen_record_triage` call —
260
+ it's marked migrate-off (reversible) so its release/pricing/upgrade noise
261
+ stops. Pass `depsConfirmed: [...]` for deps you verified are genuinely
262
+ used that Replen didn't already know. Names only.
263
+
242
264
  No marketing voice. No hype. The user is a working engineer; talk to
243
265
  them like a peer. Concrete > clever.
244
266
 
@@ -255,6 +255,19 @@ strings. Each is `{tag, descriptor, modality}`:
255
255
  Break broad capabilities into the concrete techniques the code uses. Be
256
256
  specific — `cloudflare bypass`/`proxy rotation`, not just `web scraping`.
257
257
 
258
+ **Also capture architectural PRACTICES as capabilities.** Beyond what the code
259
+ *does*, note the distinctive structural *moves* it makes — these are what let
260
+ Replen suggest a pattern to your OTHER projects ("Aegis made its domain model
261
+ data-driven; this data-heavy project should consider it"). Include a capability
262
+ for any deliberate practice you find: a **data-driven domain ontology** (entity
263
+ types/relationships stored as DATA/rows, not hardcoded — configurable without a
264
+ redeploy), **event sourcing**, **outbox pattern**, **CQRS**, **pgvector
265
+ semantic search**, **feature store**, etc. Use the standard practice name as the
266
+ `tag` (so it matches Keystone's practice registry). Respect the cover — describe
267
+ the practice's STRUCTURE, never the sensitive entity names it models (for a
268
+ covered repo, "a configurable Postgres-backed domain ontology — entity types,
269
+ typed properties, computed properties as rows", never the entity names).
270
+
258
271
  ### 2e. Push to Replen
259
272
 
260
273
  1. **Register** the repo if it isn't already. The per-repo `replen_set_tags` /
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replen",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
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": {