context-compress 2026.5.0 → 2026.7.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.
Files changed (79) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +12 -0
  3. package/.codex-plugin/plugin.json +40 -0
  4. package/.mcp.json +11 -0
  5. package/README.md +43 -12
  6. package/dist/bench/quality.d.ts +46 -0
  7. package/dist/bench/quality.d.ts.map +1 -0
  8. package/dist/bench/quality.js +118 -0
  9. package/dist/bench/quality.js.map +1 -0
  10. package/dist/bench/run.d.ts +2 -0
  11. package/dist/bench/run.d.ts.map +1 -0
  12. package/dist/bench/run.js +4 -0
  13. package/dist/bench/run.js.map +1 -0
  14. package/dist/cli/filter.d.ts.map +1 -1
  15. package/dist/cli/filter.js +13 -1
  16. package/dist/cli/filter.js.map +1 -1
  17. package/dist/cli/index.js +0 -0
  18. package/dist/cli/uninstall.d.ts.map +1 -1
  19. package/dist/cli/uninstall.js +4 -2
  20. package/dist/cli/uninstall.js.map +1 -1
  21. package/dist/config.d.ts +2 -0
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +11 -0
  24. package/dist/config.js.map +1 -1
  25. package/dist/executor.d.ts.map +1 -1
  26. package/dist/executor.js +32 -8
  27. package/dist/executor.js.map +1 -1
  28. package/dist/format-filter.d.ts +63 -0
  29. package/dist/format-filter.d.ts.map +1 -0
  30. package/dist/format-filter.js +331 -0
  31. package/dist/format-filter.js.map +1 -0
  32. package/dist/logger.d.ts +4 -0
  33. package/dist/logger.d.ts.map +1 -1
  34. package/dist/logger.js +14 -1
  35. package/dist/logger.js.map +1 -1
  36. package/dist/runtime/index.d.ts +2 -2
  37. package/dist/runtime/index.d.ts.map +1 -1
  38. package/dist/runtime/index.js +37 -20
  39. package/dist/runtime/index.js.map +1 -1
  40. package/dist/server.bundle.mjs +479 -110
  41. package/dist/server.bundle.mjs.map +4 -4
  42. package/dist/server.d.ts.map +1 -1
  43. package/dist/server.js +5 -2
  44. package/dist/server.js.map +1 -1
  45. package/dist/stats.d.ts.map +1 -1
  46. package/dist/stats.js +19 -1
  47. package/dist/stats.js.map +1 -1
  48. package/dist/store.d.ts +1 -0
  49. package/dist/store.d.ts.map +1 -1
  50. package/dist/store.js +20 -2
  51. package/dist/store.js.map +1 -1
  52. package/dist/tools/batch-execute.d.ts.map +1 -1
  53. package/dist/tools/batch-execute.js +20 -2
  54. package/dist/tools/batch-execute.js.map +1 -1
  55. package/dist/util/auto-mode.d.ts +8 -0
  56. package/dist/util/auto-mode.d.ts.map +1 -1
  57. package/dist/util/auto-mode.js +40 -26
  58. package/dist/util/auto-mode.js.map +1 -1
  59. package/dist/util/fetch-code.d.ts.map +1 -1
  60. package/dist/util/fetch-code.js +2 -48
  61. package/dist/util/fetch-code.js.map +1 -1
  62. package/dist/util/html-to-markdown.d.ts +17 -0
  63. package/dist/util/html-to-markdown.d.ts.map +1 -0
  64. package/dist/util/html-to-markdown.js +66 -0
  65. package/dist/util/html-to-markdown.js.map +1 -0
  66. package/dist/util/intent-filter.d.ts +12 -3
  67. package/dist/util/intent-filter.d.ts.map +1 -1
  68. package/dist/util/intent-filter.js +61 -8
  69. package/dist/util/intent-filter.js.map +1 -1
  70. package/dist/util/regret.d.ts +54 -0
  71. package/dist/util/regret.d.ts.map +1 -0
  72. package/dist/util/regret.js +107 -0
  73. package/dist/util/regret.js.map +1 -0
  74. package/docs/agentic-benchmark.md +110 -0
  75. package/docs/quality-regression-report.md +20 -0
  76. package/hooks/claude-codex-hooks.json +19 -0
  77. package/package.json +9 -5
  78. package/skills/context-compress-audit/SKILL.md +49 -0
  79. package/skills/context-compress-audit/agents/openai.yaml +13 -0
package/dist/logger.js CHANGED
@@ -1,6 +1,19 @@
1
1
  import { getConfig } from "./config.js";
2
+ // When set, this takes precedence over the global config singleton. Lets the
3
+ // entrypoint inject the resolved debug flag (`configureLogger(config.debug)`)
4
+ // instead of the logger reaching back into the config singleton on every call.
5
+ let debugOverride = null;
6
+ /** Inject the debug flag, decoupling the logger from the config singleton. */
7
+ export function configureLogger(debugEnabled) {
8
+ debugOverride = debugEnabled;
9
+ }
10
+ /** Reset injected state (used by tests). */
11
+ export function resetLogger() {
12
+ debugOverride = null;
13
+ }
2
14
  export function debug(...args) {
3
- if (getConfig().debug) {
15
+ const enabled = debugOverride ?? getConfig().debug;
16
+ if (enabled) {
4
17
  process.stderr.write(`[context-compress] ${args.map(String).join(" ")}\n`);
5
18
  }
6
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe;IACvC,IAAI,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,IAAI,aAAa,GAAmB,IAAI,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,YAAqB;IACpD,aAAa,GAAG,YAAY,CAAC;AAC9B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,WAAW;IAC1B,aAAa,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe;IACvC,MAAM,OAAO,GAAG,aAAa,IAAI,SAAS,EAAE,CAAC,KAAK,CAAC;IACnD,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;AACF,CAAC"}
@@ -6,9 +6,9 @@ export type RuntimeMap = Map<Language, {
6
6
  runtime: string;
7
7
  }>;
8
8
  /**
9
- * Detect all available runtimes in parallel (~40ms vs ~250ms sequential).
9
+ * Detect all available runtimes by scanning PATH (no subprocesses spawned).
10
10
  */
11
- export declare function detectRuntimes(): Promise<RuntimeMap>;
11
+ export declare function detectRuntimes(): RuntimeMap;
12
12
  /**
13
13
  * Get a human-readable summary of detected runtimes.
14
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAiBlD,QAAA,MAAM,WAAW,EAAE,cAAc,EAYhC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAapF;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CAuB1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAM9D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAGpD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAelD,QAAA,MAAM,WAAW,EAAE,cAAc,EAYhC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAsCpF;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAc3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAM9D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAGpD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -1,5 +1,5 @@
1
- import { exec } from "node:child_process";
2
- import { promisify } from "node:util";
1
+ import { constants, accessSync } from "node:fs";
2
+ import { delimiter, join } from "node:path";
3
3
  import { debug } from "../logger.js";
4
4
  // Import all language plugins
5
5
  import { elixirPlugin } from "./languages/elixir.js";
@@ -13,7 +13,6 @@ import { rubyPlugin } from "./languages/ruby.js";
13
13
  import { rustPlugin } from "./languages/rust.js";
14
14
  import { shellPlugin } from "./languages/shell.js";
15
15
  import { typescriptPlugin } from "./languages/typescript.js";
16
- const execAsync = promisify(exec);
17
16
  const ALL_PLUGINS = [
18
17
  javascriptPlugin,
19
18
  typescriptPlugin,
@@ -27,10 +26,35 @@ const ALL_PLUGINS = [
27
26
  rPlugin,
28
27
  elixirPlugin,
29
28
  ];
30
- async function commandExists(cmd) {
31
- const checkCmd = process.platform === "win32" ? `where ${cmd} 2>nul` : `command -v ${cmd} 2>/dev/null`;
29
+ const PATH_DIRS = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
30
+ const WIN_EXTS = (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean);
31
+ /**
32
+ * Check whether an executable is on PATH by scanning the filesystem directly.
33
+ *
34
+ * This replaces the previous shell-based `command -v ${cmd}` / `where ${cmd}`,
35
+ * which both interpolated `cmd` into a shell string and spawned one shell per
36
+ * candidate (~19 processes across all plugins). Scanning PATH with `accessSync`
37
+ * spawns nothing and never touches a shell, eliminating both the injection
38
+ * surface and the process-spawn overhead.
39
+ */
40
+ function commandExists(cmd) {
41
+ // Names with a path separator are resolved relative to cwd, not PATH.
42
+ if (cmd.includes("/") || cmd.includes("\\")) {
43
+ return isExecutable(cmd);
44
+ }
45
+ const exts = process.platform === "win32" ? WIN_EXTS : [""];
46
+ for (const dir of PATH_DIRS) {
47
+ for (const ext of exts) {
48
+ if (isExecutable(join(dir, cmd + ext)))
49
+ return true;
50
+ }
51
+ }
52
+ return false;
53
+ }
54
+ function isExecutable(filePath) {
32
55
  try {
33
- await execAsync(checkCmd, { timeout: 3000 });
56
+ // On Windows the executable bit is not meaningful; existence is enough.
57
+ accessSync(filePath, process.platform === "win32" ? constants.F_OK : constants.X_OK);
34
58
  return true;
35
59
  }
36
60
  catch {
@@ -38,25 +62,18 @@ async function commandExists(cmd) {
38
62
  }
39
63
  }
40
64
  /**
41
- * Detect all available runtimes in parallel (~40ms vs ~250ms sequential).
65
+ * Detect all available runtimes by scanning PATH (no subprocesses spawned).
42
66
  */
43
- export async function detectRuntimes() {
67
+ export function detectRuntimes() {
44
68
  const map = new Map();
45
- // Build detection tasks for all plugins in parallel
46
- const tasks = ALL_PLUGINS.map(async (plugin) => {
69
+ for (const plugin of ALL_PLUGINS) {
47
70
  for (const candidate of plugin.runtimeCandidates) {
48
- if (await commandExists(candidate)) {
49
- return { plugin, runtime: candidate };
71
+ if (commandExists(candidate)) {
72
+ map.set(plugin.language, { plugin, runtime: candidate });
73
+ debug(`Detected ${plugin.language}: ${candidate}`);
74
+ break;
50
75
  }
51
76
  }
52
- return null;
53
- });
54
- const results = await Promise.all(tasks);
55
- for (const result of results) {
56
- if (result) {
57
- map.set(result.plugin.language, result);
58
- debug(`Detected ${result.plugin.language}: ${result.runtime}`);
59
- }
60
77
  }
61
78
  return map;
62
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAIrC,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,WAAW,GAAqB;IACrC,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,UAAU;IACV,OAAO;IACP,YAAY;CACZ,CAAC;AAIF,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5E,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAE3F;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,GAAW;IACjC,sEAAsE;IACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACrD,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACrC,IAAI,CAAC;QACJ,wEAAwE;QACxE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC7B,MAAM,GAAG,GAAe,IAAI,GAAG,EAAE,CAAC;IAElC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QAClC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAClD,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBACzD,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC,CAAC;gBACnD,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAoB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,QAAoB;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,OAAO,EAAE,EAAE,OAAO,KAAK,KAAK,CAAC;AAC9B,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}