imprnt 0.1.4-edge.100 → 0.1.4-edge.103

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/CLAUDE.md CHANGED
@@ -194,7 +194,7 @@ Core is the vault + `ingest → recall → check`. Everything else (a task-mirro
194
194
  - **`recall` searches `vault/` only, forever.** Sibling dirs + `raw/` are outside the corpus by construction. A plugin surfaces into search only by **proposing one low-frequency summary note** (the escape hatch).
195
195
  - **Behavior plugins** are a separate class: ship a fixed-size fragment the **user wires into the agent's system prompt**. The vault never auto-injects. Remove = delete the wire-in. No referee for conflicting fragments, the user owns composition. (The old system imposed. imprnt composes.)
196
196
  - **Harness plugins** are the third class: they customize Claude Code itself, never the vault (timemachine's PreToolUse snapshot hook, the statusline, a skill). The same plugin folder doubles as a **native Claude Code plugin** (`.claude-plugin/plugin.json` + `hooks/` + `skills/`, Anthropic's format) and/or carries **`imp-settings.json`** (the settings keys Claude only takes via config, e.g. `statusLine`, with `${PLUGIN_DIR}` as the plugin's absolute dir). `imp` carries enabled ones into every claude session it launches: one `--plugin-dir` per native plugin + one merged `--settings` (gemini has no host for claude harness plugins, so `imp --gemini` skips them with a warning). Stock `claude` stays stock, nothing is ever written to settings files, `plugin rm` undoes everything.
197
- - **Capability modules** are the one bend in "share nothing": a module may *provide* a capability another *consumes* (the session-host brokers an authed-session token to the kleinanzeigen watcher). Bounded so it can't re-bloat core: the consumer copies a tiny client (`sessionToken(site) -> string | null`) over a **localhost broker**, never imports the provider or reads its folder. The invariant that replaces "no cross-plugin reads": **removing a provider degrades a consumer gracefully** (`null` = host down, fall back), never breaks it. This is a third contact surface (vault . agent-context . broker), fenced like the sync edge: deterministic, answer-on-request, auditable (token fingerprint, never the token), never resident. The litmus extends: zero core edits to add/remove a *provider* too, because there is no capability registry in core. Credential-holding modules follow the auth finding: human login once, read-only attach, never copy a profile, never automate the password. Full rules: `plugins/README.md`.
197
+ - **Capability modules** are the one bend in "share nothing": a module may *provide* a capability another *consumes* (a warm-browser module brokering an authed-session token to a watcher that needs a login is the shape). Bounded so it can't re-bloat core: the consumer copies a tiny client (`sessionToken(site) -> string | null`) over a **localhost broker**, never imports the provider or reads its folder. The invariant that replaces "no cross-plugin reads": **removing a provider degrades a consumer gracefully** (`null` = host down, fall back), never breaks it. This is a third contact surface (vault . agent-context . broker), fenced like the sync edge: deterministic, answer-on-request, auditable (token fingerprint, never the token), never resident. The litmus extends: zero core edits to add/remove a *provider* too, because there is no capability registry in core. Credential-holding modules follow the auth finding: human login once, read-only attach, never copy a profile, never automate the password. Full rules: `plugins/README.md`.
198
198
  - **Secrets are env vars at the plugin's edge.** A plugin calling an external service reads its key from an env var named in its README and fails loud when missing. Keys never land in the vault, the plugin folder, or anything committed. No central secret store.
199
199
  - **Commands only, no forced daemon.** The user schedules sync. Install/remove is manual (README `## Install` / `## Remove` + `rm -rf`), no registry.
200
200
  - **Core ↔ plugin contact = exactly four convention-based contact points**, all dumb and uniform: `imprnt check --all` globs `plugins/*/check.js` (each plugin's built artifact, or `check.mjs`, with `.js` winning when both exist), runs each with `node`, reads **exit code only**, forwards stdout verbatim, never parses plugin output. `imprnt ingest --apply` files staged notes the plugins drop in `plugins/*/proposed/`. `imp` turns the enable list into launch flags (`--plugin-dir` per native plugin + one merged `--settings`) for the session it spawns. `imprnt <module> <command>` dispatches to `plugins/<module>/<module>.js` or `<module>.mjs` (stdio inherited, exit code passed through, a built-in subcommand always wins, zero per-module logic). All discover by filename/dir convention, never by import, never by naming a specific plugin. Fence: core may provide read-only *aggregation* helpers, never write/orchestration. (Not k8s liveness/readiness. Nothing runs, so the only health question is "is the data sound", which is what `check` answers.)
package/dist/cli.js CHANGED
@@ -2202,7 +2202,7 @@ function bestPassages(absPath, n) {
2202
2202
  const out = paras.filter((p) => keep.has(p));
2203
2203
  return out.length ? out : paras.slice(0, n);
2204
2204
  }
2205
- var args2, vault2, limit = 15, gap = 0, passages = 0, proximity = false, coverage = false, stem = false, positional2, query, vocab, MAX_SYNONYM_NGRAM, STOPWORDS, tokenize = (text2) => {
2205
+ var args2, vault2, limit = 15, gap = 0, passages = 0, proximity = true, coverage = true, stem = true, positional2, query, vocab, MAX_SYNONYM_NGRAM, STOPWORDS, tokenize = (text2) => {
2206
2206
  const raw = text2.normalize("NFC").toLowerCase().replace(/['’]/gu, "").split(/[^\p{L}\p{N}]+/u).filter(Boolean);
2207
2207
  return stem ? raw.map(stemWord) : raw;
2208
2208
  }, phraseSynonymTokens = (q) => {
@@ -2255,10 +2255,16 @@ var init_recall = __esm(() => {
2255
2255
  limit = n;
2256
2256
  } else if (args2[i] === "--proximity") {
2257
2257
  proximity = true;
2258
+ } else if (args2[i] === "--no-proximity") {
2259
+ proximity = false;
2258
2260
  } else if (args2[i] === "--coverage") {
2259
2261
  coverage = true;
2262
+ } else if (args2[i] === "--no-coverage") {
2263
+ coverage = false;
2260
2264
  } else if (args2[i] === "--stem") {
2261
2265
  stem = true;
2266
+ } else if (args2[i] === "--no-stem") {
2267
+ stem = false;
2262
2268
  } else if (args2[i] === "--passages") {
2263
2269
  const tok = args2[++i];
2264
2270
  if (tok === undefined || !/^[0-9]+$/.test(tok)) {
@@ -4070,7 +4076,7 @@ engine (same subcommands under \`imp\` or \`imprnt\`):
4070
4076
  imprnt global rm <name> [--purge] disable a global module; --purge deletes the global copy
4071
4077
  imprnt global list show globally-enabled modules
4072
4078
  imprnt vault list|archive|restore the vault as its own object — outlives any agent
4073
- imprnt <module> <command> [...] run an installed module's command (e.g. \`imprnt session-host login\`, \`imprnt kleinanzeigen sync\`) — no \`node\` paths
4079
+ imprnt <module> <command> [...] run an installed module's command (e.g. \`imprnt kopeika sync\`) — no \`node\` paths
4074
4080
 
4075
4081
  layout: entities (people · orgs · holdings) · domains (identity · health · finances · work · life · projects) · forms (events · mistakes)
4076
4082
  the vault is plain markdown. an agent greps it directly — no MCP, no DB.`);
package/dist/imp.js CHANGED
@@ -2202,7 +2202,7 @@ function bestPassages(absPath, n) {
2202
2202
  const out = paras.filter((p) => keep.has(p));
2203
2203
  return out.length ? out : paras.slice(0, n);
2204
2204
  }
2205
- var args2, vault2, limit = 15, gap = 0, passages = 0, proximity = false, coverage = false, stem = false, positional2, query, vocab, MAX_SYNONYM_NGRAM, STOPWORDS, tokenize = (text2) => {
2205
+ var args2, vault2, limit = 15, gap = 0, passages = 0, proximity = true, coverage = true, stem = true, positional2, query, vocab, MAX_SYNONYM_NGRAM, STOPWORDS, tokenize = (text2) => {
2206
2206
  const raw = text2.normalize("NFC").toLowerCase().replace(/['’]/gu, "").split(/[^\p{L}\p{N}]+/u).filter(Boolean);
2207
2207
  return stem ? raw.map(stemWord) : raw;
2208
2208
  }, phraseSynonymTokens = (q) => {
@@ -2255,10 +2255,16 @@ var init_recall = __esm(() => {
2255
2255
  limit = n;
2256
2256
  } else if (args2[i] === "--proximity") {
2257
2257
  proximity = true;
2258
+ } else if (args2[i] === "--no-proximity") {
2259
+ proximity = false;
2258
2260
  } else if (args2[i] === "--coverage") {
2259
2261
  coverage = true;
2262
+ } else if (args2[i] === "--no-coverage") {
2263
+ coverage = false;
2260
2264
  } else if (args2[i] === "--stem") {
2261
2265
  stem = true;
2266
+ } else if (args2[i] === "--no-stem") {
2267
+ stem = false;
2262
2268
  } else if (args2[i] === "--passages") {
2263
2269
  const tok = args2[++i];
2264
2270
  if (tok === undefined || !/^[0-9]+$/.test(tok)) {
@@ -4070,7 +4076,7 @@ engine (same subcommands under \`imp\` or \`imprnt\`):
4070
4076
  imprnt global rm <name> [--purge] disable a global module; --purge deletes the global copy
4071
4077
  imprnt global list show globally-enabled modules
4072
4078
  imprnt vault list|archive|restore the vault as its own object — outlives any agent
4073
- imprnt <module> <command> [...] run an installed module's command (e.g. \`imprnt session-host login\`, \`imprnt kleinanzeigen sync\`) — no \`node\` paths
4079
+ imprnt <module> <command> [...] run an installed module's command (e.g. \`imprnt kopeika sync\`) — no \`node\` paths
4074
4080
 
4075
4081
  layout: entities (people · orgs · holdings) · domains (identity · health · finances · work · life · projects) · forms (events · mistakes)
4076
4082
  the vault is plain markdown. an agent greps it directly — no MCP, no DB.`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imprnt",
3
- "version": "0.1.4-edge.100",
3
+ "version": "0.1.4-edge.103",
4
4
  "stable": true,
5
5
  "description": "Deterministic-first, plain-markdown knowledge vault. Code does the bulk transform. The LLM only touches the irreducibly-semantic 20%. Native grep plus BM25 retrieval, zero MCP on the vault.",
6
6
  "type": "module",