xtrm-tools 0.5.43 → 0.5.45

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xtrm-tools",
3
- "version": "0.5.43",
3
+ "version": "0.5.45",
4
4
  "description": "xtrm-tools: dual-runtime workflow enforcement (Claude Code + Pi) — hooks, extensions, skills, and MCP servers",
5
5
  "author": {
6
6
  "name": "jaggers"
package/CHANGELOG.md CHANGED
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
+ ## [0.5.43] - 2026-03-25
11
+
12
+ ### Fixed
13
+ - Restore specialists project hooks in `.claude/settings.json` — incorrectly removed in 0.5.42
14
+
15
+ ---
16
+
17
+ ## [0.5.42] - 2026-03-25
18
+
19
+ ### Fixed
20
+ - Remove accidentally committed specialists hooks from `.claude/settings.json` (reverted in 0.5.43 — see note)
21
+
22
+ ---
23
+
24
+ ## [0.5.41] - 2026-03-25
25
+
26
+ ### Added
27
+ - **`xt memory update`**: New CLI command that shells out to the `memory-processor` specialist to synthesize bd memories + project state into `.xtrm/memory.md`. Supports `--dry-run` (report only) and `--no-beads` flags.
28
+ - **`memory-processor` specialist** (`specialists/memory-processor.specialist.yaml`): Autonomous specialist that cross-references bd memories against current source code, writes a condensed `.xtrm/memory.md` (100–200 lines, 3 sections: Architecture & Decisions, Non-obvious Gotchas, Process & Workflow Rules), and prunes stale/redundant/contradicted memories from bd.
29
+ - **`.xtrm/memory.md` injection at SessionStart**: `using-xtrm-reminder.mjs` now appends `.xtrm/memory.md` to the system prompt when present — synthesized project context is available from turn 1.
30
+ - **Pi parity — memory.md injection**: `xtrm-loader` Pi extension now injects `.xtrm/memory.md` in `before_agent_start` (same semantics as Claude Code SessionStart injection).
31
+ - **Pi parity — memory gate prompt**: `beads` Pi extension memory gate now uses the same 4-criteria checklist and articulated ack format as the Claude hook.
32
+
33
+ ### Changed
34
+ - **`beads-memory-gate.mjs`**: Switched from blocking (exit 2 + stderr) to non-blocking (`additionalContext` + exit 0) — memory gate is advisory, not a hard stop.
35
+ - **`beads-stop-gate.mjs`**: Switched from blocking to non-blocking (`additionalContext` + exit 0) — eliminates spurious stop-gate noise between conversational turns.
36
+ - **Memory gate prompt** (`beads-gate-messages.mjs`): Now uses 4-criteria quality filter (hard to rediscover, non-obvious from source, will affect future decisions, still relevant in ~14 days) with mandatory articulated ack (not just `1`).
37
+
38
+ ---
39
+
10
40
  ## [Unreleased]
11
41
 
12
42
  ### Added
@@ -56267,6 +56267,10 @@ function createHelpCommand() {
56267
56267
  " xtrm docs cross-check [--days <n>] [--json]",
56268
56268
  " Validate docs against recent PR activity and closed bd issues.",
56269
56269
  "",
56270
+ " xtrm memory update [--dry-run] [--no-beads]",
56271
+ " Run memory-processor specialist to synthesize bd memories into .xtrm/memory.md.",
56272
+ " --dry-run: classify and report without writing memory.md or pruning.",
56273
+ "",
56270
56274
  " xtrm debug [options]",
56271
56275
  " Stream xtrm event log (tool calls, gates, session/bd lifecycle).",
56272
56276
  " Options: --follow, --all, --session <id>, --type <domain>, --json",
@@ -57739,7 +57743,7 @@ function createMemoryCommand() {
57739
57743
  return new Command("memory").description("Manage project memory (.xtrm/memory.md)").addCommand(createMemoryUpdateCommand());
57740
57744
  }
57741
57745
  function createMemoryUpdateCommand() {
57742
- return new Command("update").description("Run memory-processor specialist to synthesize bd memories into .xtrm/memory.md").option("--dry-run", "Report only \u2014 do not modify memories or write memory.md", false).option("--no-beads", "Skip creating a tracking bead for this run", false).action((opts) => {
57746
+ return new Command("update").description("Run memory-processor specialist to synthesize bd memories into .xtrm/memory.md").option("--dry-run", "Report only \u2014 do not modify memories or write memory.md", false).option("--no-beads", "Skip creating a tracking bead for this run", false).action(async (opts) => {
57743
57747
  const cwd = process.cwd();
57744
57748
  const check2 = (0, import_node_child_process12.spawnSync)("specialists", ["--version"], { encoding: "utf8", stdio: "pipe" });
57745
57749
  if (check2.status !== 0) {
@@ -57764,17 +57768,28 @@ function createMemoryUpdateCommand() {
57764
57768
  const prompt = opts.dryRun ? "Dry run: classify all memories and show the full report. Do not call bd forget or write .xtrm/memory.md." : "Run the full memory processor workflow.";
57765
57769
  const args = ["run", "memory-processor", "--prompt", prompt];
57766
57770
  if (!opts.beads) args.push("--no-beads");
57771
+ const memPath = (0, import_node_path7.join)(cwd, ".xtrm", "memory.md");
57772
+ const spinnerText = opts.dryRun ? "Analyzing memories..." : `${(0, import_node_fs6.existsSync)(memPath) ? "Updating" : "Creating"} .xtrm/memory.md...`;
57767
57773
  console.log(kleur_default.bold(`
57768
57774
  xt memory update${opts.dryRun ? " (dry run)" : ""}
57769
57775
  `));
57770
- if (!opts.dryRun) {
57771
- const memPath = (0, import_node_path7.join)(cwd, ".xtrm", "memory.md");
57772
- const action = (0, import_node_fs6.existsSync)(memPath) ? "Updating" : "Creating";
57773
- console.log(kleur_default.dim(` ${action} .xtrm/memory.md...
57774
- `));
57776
+ const spinner = ora({ text: spinnerText, color: "cyan" }).start();
57777
+ const chunks = [];
57778
+ const exitCode = await new Promise((resolve2) => {
57779
+ const proc = (0, import_node_child_process12.spawn)("specialists", args, { cwd, stdio: ["inherit", "pipe", "pipe"] });
57780
+ proc.stdout.on("data", (d) => chunks.push(d.toString()));
57781
+ proc.stderr.on("data", (d) => chunks.push(d.toString()));
57782
+ proc.on("close", (code) => resolve2(code ?? 0));
57783
+ });
57784
+ if (exitCode === 0) {
57785
+ spinner.succeed(opts.dryRun ? "Analysis complete." : ".xtrm/memory.md written.");
57786
+ } else {
57787
+ spinner.fail("memory-processor failed.");
57775
57788
  }
57776
- const result = (0, import_node_child_process12.spawnSync)("specialists", args, { cwd, stdio: "inherit", encoding: "utf8" });
57777
- process.exit(result.status ?? 0);
57789
+ const lines = chunks.join("").split("\n").filter((l) => l.trim());
57790
+ const tail = lines.slice(-10).map((l) => kleur_default.dim(" " + l)).join("\n");
57791
+ if (tail) console.log("\n" + tail + "\n");
57792
+ process.exit(exitCode);
57778
57793
  });
57779
57794
  }
57780
57795