ctxloom-pro 1.7.6 → 1.7.7

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/README.md CHANGED
@@ -69,7 +69,7 @@ The full first-run flow is **one install + one trial + one init per project.** E
69
69
  npm install -g ctxloom-pro
70
70
  ```
71
71
 
72
- > **For local trial / dev use the unpinned command above is fine.** For unattended CI usage, pin to the exact version (`ctxloom-pro@1.7.6`) so future CLI releases don't silently desync your agent-spec coverage — see the workflow example below.
72
+ > **For local trial / dev use the unpinned command above is fine.** For unattended CI usage, pin to the exact version (`ctxloom-pro@1.7.7`) so future CLI releases don't silently desync your agent-spec coverage — see the workflow example below.
73
73
 
74
74
  ### 2 — Start your free trial (once per email)
75
75
 
@@ -383,7 +383,7 @@ jobs:
383
383
  # Exact pin (not `@^1`) so future CLI releases that add/remove MCP
384
384
  # tools don't silently desync your reviewer-agent specs. Bump on
385
385
  # every release; see CHANGELOG.md for the live version table.
386
- - run: npm install -g ctxloom-pro@1.7.6
386
+ - run: npm install -g ctxloom-pro@1.7.7
387
387
  - run: ctxloom index
388
388
  - run: ctxloom rules check --json
389
389
  ```
@@ -2929,7 +2929,7 @@ var CallGraphIndex = class _CallGraphIndex {
2929
2929
  var TS_EXTENSIONS2 = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".vue"]);
2930
2930
  var PY_EXTENSIONS = /* @__PURE__ */ new Set([".py", ".ipynb"]);
2931
2931
  var AST_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".py", ".go", ".rs", ".java", ".cs", ".rb", ".kt", ".kts", ".swift", ".ipynb", ".php", ".dart"]);
2932
- var CTXLOOM_VERSION = "1.7.6".length > 0 ? "1.7.6" : "dev";
2932
+ var CTXLOOM_VERSION = "1.7.7".length > 0 ? "1.7.7" : "dev";
2933
2933
  var SNAPSHOT_SCHEMA_VERSION = 2;
2934
2934
  function compareCtxloomVersions(snapshotVer, currentVer) {
2935
2935
  if (snapshotVer === currentVer) return "same";
@@ -3112,6 +3112,7 @@ var DependencyGraph = class {
3112
3112
  });
3113
3113
  this.symbolIndex.set(node.name, existing);
3114
3114
  }
3115
+ this.indexClassMethods(node, relPath);
3115
3116
  }
3116
3117
  if (TS_EXTENSIONS2.has(ext)) {
3117
3118
  const callEdges = await this.parser.parseAllCallEdges(absPath);
@@ -3331,6 +3332,36 @@ var DependencyGraph = class {
3331
3332
  getImporters(fileRel) {
3332
3333
  return Array.from(this.reverseEdges.get(fileRel) ?? []);
3333
3334
  }
3335
+ /**
3336
+ * Register each class method as its own symbol-index entry.
3337
+ *
3338
+ * TS/JS class methods are parsed as `methodRanges` on the class node,
3339
+ * not as standalone `method` nodes — so the `node.type === 'method'`
3340
+ * branch in the symbol-indexing loops never fired for them. That left
3341
+ * methods (e.g. DependencyGraph.getRootDir) unfindable by
3342
+ * `lookupSymbol`, which is why `ctx_get_call_graph {symbol: aMethod}`
3343
+ * returned "Symbol not found" even though the call-graph snapshot had
3344
+ * edges for it. Indexing methods here closes that gap.
3345
+ *
3346
+ * No-op for nodes without methodRanges (functions, imports, etc.).
3347
+ */
3348
+ indexClassMethods(node, relPath) {
3349
+ if (!node.methodRanges) return;
3350
+ for (const m of node.methodRanges) {
3351
+ if (!m.name) continue;
3352
+ const existing = this.symbolIndex.get(m.name) ?? [];
3353
+ existing.push({
3354
+ filePath: relPath,
3355
+ type: "method",
3356
+ signature: `method ${m.name}`,
3357
+ // MethodRange only carries the signature line; use it as the
3358
+ // start and fall back to the enclosing class's end for the range.
3359
+ startLine: m.signatureLine,
3360
+ endLine: node.endLine ?? m.signatureLine
3361
+ });
3362
+ this.symbolIndex.set(m.name, existing);
3363
+ }
3364
+ }
3334
3365
  /**
3335
3366
  * Look up a symbol by name. Returns all definitions across files.
3336
3367
  */
@@ -3518,6 +3549,7 @@ var DependencyGraph = class {
3518
3549
  });
3519
3550
  this.symbolIndex.set(node.name, existing);
3520
3551
  }
3552
+ this.indexClassMethods(node, relPath);
3521
3553
  }
3522
3554
  if (TS_EXTENSIONS2.has(ext)) {
3523
3555
  const callEdges = await this.parser.parseAllCallEdges(absPath);
@@ -12303,7 +12335,7 @@ function resolveTelemetryLevel() {
12303
12335
  }
12304
12336
  var TELEMETRY_LEVEL = resolveTelemetryLevel();
12305
12337
  var TELEMETRY_DISABLED = TELEMETRY_LEVEL === "off";
12306
- var CTXLOOM_VERSION2 = "1.7.6".length > 0 ? "1.7.6" : "dev";
12338
+ var CTXLOOM_VERSION2 = "1.7.7".length > 0 ? "1.7.7" : "dev";
12307
12339
  var POSTHOG_HOST = "https://eu.i.posthog.com";
12308
12340
  var POSTHOG_KEY = process.env["POSTHOG_API_KEY"] ?? (true ? "phc_CiDkmFLcZ2K6uCpcoSUQLmFrnnUvsyXGhSxopX5TVKE6" : "");
12309
12341
  var SENTRY_DSN = process.env["SENTRY_DSN"] ?? (true ? "https://81c94a0f04a8e242dee493ac1e17f733@o4508531702497280.ingest.de.sentry.io/4511256875368528" : "");
@@ -2705,7 +2705,7 @@ var CallGraphIndex = class _CallGraphIndex {
2705
2705
  var TS_EXTENSIONS2 = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".vue"]);
2706
2706
  var PY_EXTENSIONS = /* @__PURE__ */ new Set([".py", ".ipynb"]);
2707
2707
  var AST_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".py", ".go", ".rs", ".java", ".cs", ".rb", ".kt", ".kts", ".swift", ".ipynb", ".php", ".dart"]);
2708
- var CTXLOOM_VERSION = "1.7.6".length > 0 ? "1.7.6" : "dev";
2708
+ var CTXLOOM_VERSION = "1.7.7".length > 0 ? "1.7.7" : "dev";
2709
2709
  var SNAPSHOT_SCHEMA_VERSION = 2;
2710
2710
  function compareCtxloomVersions(snapshotVer, currentVer) {
2711
2711
  if (snapshotVer === currentVer) return "same";
@@ -2888,6 +2888,7 @@ var DependencyGraph = class {
2888
2888
  });
2889
2889
  this.symbolIndex.set(node.name, existing);
2890
2890
  }
2891
+ this.indexClassMethods(node, relPath);
2891
2892
  }
2892
2893
  if (TS_EXTENSIONS2.has(ext)) {
2893
2894
  const callEdges = await this.parser.parseAllCallEdges(absPath);
@@ -3107,6 +3108,36 @@ var DependencyGraph = class {
3107
3108
  getImporters(fileRel) {
3108
3109
  return Array.from(this.reverseEdges.get(fileRel) ?? []);
3109
3110
  }
3111
+ /**
3112
+ * Register each class method as its own symbol-index entry.
3113
+ *
3114
+ * TS/JS class methods are parsed as `methodRanges` on the class node,
3115
+ * not as standalone `method` nodes — so the `node.type === 'method'`
3116
+ * branch in the symbol-indexing loops never fired for them. That left
3117
+ * methods (e.g. DependencyGraph.getRootDir) unfindable by
3118
+ * `lookupSymbol`, which is why `ctx_get_call_graph {symbol: aMethod}`
3119
+ * returned "Symbol not found" even though the call-graph snapshot had
3120
+ * edges for it. Indexing methods here closes that gap.
3121
+ *
3122
+ * No-op for nodes without methodRanges (functions, imports, etc.).
3123
+ */
3124
+ indexClassMethods(node, relPath) {
3125
+ if (!node.methodRanges) return;
3126
+ for (const m of node.methodRanges) {
3127
+ if (!m.name) continue;
3128
+ const existing = this.symbolIndex.get(m.name) ?? [];
3129
+ existing.push({
3130
+ filePath: relPath,
3131
+ type: "method",
3132
+ signature: `method ${m.name}`,
3133
+ // MethodRange only carries the signature line; use it as the
3134
+ // start and fall back to the enclosing class's end for the range.
3135
+ startLine: m.signatureLine,
3136
+ endLine: node.endLine ?? m.signatureLine
3137
+ });
3138
+ this.symbolIndex.set(m.name, existing);
3139
+ }
3140
+ }
3110
3141
  /**
3111
3142
  * Look up a symbol by name. Returns all definitions across files.
3112
3143
  */
@@ -3294,6 +3325,7 @@ var DependencyGraph = class {
3294
3325
  });
3295
3326
  this.symbolIndex.set(node.name, existing);
3296
3327
  }
3328
+ this.indexClassMethods(node, relPath);
3297
3329
  }
3298
3330
  if (TS_EXTENSIONS2.has(ext)) {
3299
3331
  const callEdges = await this.parser.parseAllCallEdges(absPath);
@@ -11110,7 +11142,7 @@ var TELEMETRY_DISABLED = TELEMETRY_LEVEL === "off";
11110
11142
  function getTelemetryLevel() {
11111
11143
  return TELEMETRY_LEVEL;
11112
11144
  }
11113
- var CTXLOOM_VERSION2 = "1.7.6".length > 0 ? "1.7.6" : "dev";
11145
+ var CTXLOOM_VERSION2 = "1.7.7".length > 0 ? "1.7.7" : "dev";
11114
11146
  var POSTHOG_HOST = "https://eu.i.posthog.com";
11115
11147
  var POSTHOG_KEY = process.env["POSTHOG_API_KEY"] ?? (true ? "phc_CiDkmFLcZ2K6uCpcoSUQLmFrnnUvsyXGhSxopX5TVKE6" : "");
11116
11148
  var SENTRY_DSN = process.env["SENTRY_DSN"] ?? (true ? "https://81c94a0f04a8e242dee493ac1e17f733@o4508531702497280.ingest.de.sentry.io/4511256875368528" : "");
@@ -12796,4 +12828,4 @@ export {
12796
12828
  skillFilePath,
12797
12829
  installHarness
12798
12830
  };
12799
- //# sourceMappingURL=chunk-ISXDIRSN.js.map
12831
+ //# sourceMappingURL=chunk-OEDNX3CV.js.map
package/dist/index.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  validateDefaultRoot,
48
48
  wrapWithIndexingEnvelope,
49
49
  writeCODEOWNERS
50
- } from "./chunk-ISXDIRSN.js";
50
+ } from "./chunk-OEDNX3CV.js";
51
51
  import {
52
52
  addCtxloomToConfig,
53
53
  detectInstalledClients
@@ -1068,7 +1068,7 @@ try {
1068
1068
  } catch {
1069
1069
  }
1070
1070
  var args = process.argv.slice(2);
1071
- var ctxloomVersion = "1.7.6".length > 0 ? "1.7.6" : "dev";
1071
+ var ctxloomVersion = "1.7.7".length > 0 ? "1.7.7" : "dev";
1072
1072
  if (args.includes("--version") || args.includes("-v")) {
1073
1073
  process.stdout.write(`ctxloom ${ctxloomVersion}
1074
1074
  `);
@@ -1163,7 +1163,7 @@ async function checkLicense() {
1163
1163
  if (command !== void 0 && LICENSE_GATE_BYPASS_COMMANDS.has(command)) return;
1164
1164
  const ciKey = process.env["CTXLOOM_LICENSE_KEY"];
1165
1165
  if (ciKey) {
1166
- const { ApiClient } = await import("./src-FB2SJJZR.js");
1166
+ const { ApiClient } = await import("./src-HFPCEHYB.js");
1167
1167
  const client = new ApiClient(process.env["CTXLOOM_API_BASE"]);
1168
1168
  try {
1169
1169
  const result = await client.validate(ciKey, "ci-ephemeral");
@@ -1556,7 +1556,7 @@ async function main() {
1556
1556
  }
1557
1557
  if (!skipHarness) {
1558
1558
  process.stdout.write("\n");
1559
- const { installHarness } = await import("./src-FB2SJJZR.js");
1559
+ const { installHarness } = await import("./src-HFPCEHYB.js");
1560
1560
  const h = installHarness({ cwd: initRoot, dryRun, force, extraHosts });
1561
1561
  const harnessFiles = [
1562
1562
  h.claudeMd,
@@ -1619,7 +1619,7 @@ async function main() {
1619
1619
  process.exit(1);
1620
1620
  }
1621
1621
  if (alias !== void 0) {
1622
- const { validateAlias } = await import("./src-FB2SJJZR.js");
1622
+ const { validateAlias } = await import("./src-HFPCEHYB.js");
1623
1623
  const v = validateAlias(alias);
1624
1624
  if (!v.ok) {
1625
1625
  console.error(`[ctxloom] Invalid alias: ${v.reason}`);
@@ -1978,7 +1978,7 @@ Suggested reviewers for ${files.length} file(s):`);
1978
1978
  process.stderr.write("[ctxloom] --limit must be a non-negative integer (0 for unlimited)\n");
1979
1979
  process.exit(2);
1980
1980
  }
1981
- const { loadRulesConfig, RulesChecker, formatText, formatJson, RulesConfigError } = await import("./src-FB2SJJZR.js");
1981
+ const { loadRulesConfig, RulesChecker, formatText, formatJson, RulesConfigError } = await import("./src-HFPCEHYB.js");
1982
1982
  let config;
1983
1983
  try {
1984
1984
  config = await loadRulesConfig(root);
@@ -2002,7 +2002,7 @@ Suggested reviewers for ${files.length} file(s):`);
2002
2002
  }
2003
2003
  let graph;
2004
2004
  if (useSnapshot) {
2005
- const { DependencyGraph: DG } = await import("./src-FB2SJJZR.js");
2005
+ const { DependencyGraph: DG } = await import("./src-HFPCEHYB.js");
2006
2006
  graph = new DG();
2007
2007
  const loaded = await graph.loadSnapshotOnly(root);
2008
2008
  if (!loaded) {
@@ -2011,7 +2011,7 @@ Suggested reviewers for ${files.length} file(s):`);
2011
2011
  }
2012
2012
  } else {
2013
2013
  process.stderr.write("[ctxloom] Building dependency graph...\n");
2014
- const { ASTParser: ASTParser2, DependencyGraph: DependencyGraph2 } = await import("./src-FB2SJJZR.js");
2014
+ const { ASTParser: ASTParser2, DependencyGraph: DependencyGraph2 } = await import("./src-HFPCEHYB.js");
2015
2015
  let parser;
2016
2016
  try {
2017
2017
  parser = new ASTParser2();
@@ -132,7 +132,7 @@ import {
132
132
  wrapBlock,
133
133
  wrapWithIndexingEnvelope,
134
134
  writeCODEOWNERS
135
- } from "./chunk-ISXDIRSN.js";
135
+ } from "./chunk-OEDNX3CV.js";
136
136
  import {
137
137
  VectorStore
138
138
  } from "./chunk-XQEQLXY5.js";
@@ -304,4 +304,4 @@ export {
304
304
  wrapWithIndexingEnvelope,
305
305
  writeCODEOWNERS
306
306
  };
307
- //# sourceMappingURL=src-FB2SJJZR.js.map
307
+ //# sourceMappingURL=src-HFPCEHYB.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ctxloom-pro",
3
- "version": "1.7.6",
3
+ "version": "1.7.7",
4
4
  "description": "ctxloom — The Universal Code Context Engine. A local-first MCP server providing intelligent code context via hybrid Vector + AST + Graph search with Skeletonization (92% token reduction).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",