contextsliver 0.1.3 → 0.1.4

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
@@ -2,6 +2,10 @@
2
2
 
3
3
  > On-demand context management for AI coding agents. Stop reading whole files — ask for the connected subgraph instead.
4
4
 
5
+ <p align="center">
6
+ <img src="assets/hero-banner.jpg" alt="ContextSliver — from chaos to clarity: on-demand code context for AI agents" width="800">
7
+ </p>
8
+
5
9
  [![CI](https://github.com/DevMuneeb/contextsliver/actions/workflows/ci.yml/badge.svg)](https://github.com/DevMuneeb/contextsliver/actions/workflows/ci.yml)
6
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
11
  [![npm version](https://img.shields.io/npm/v/contextsliver.svg)](https://www.npmjs.com/package/contextsliver)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAQA,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyBpD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CA8C9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAaA,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyDpD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAqD9E"}
@@ -6,8 +6,13 @@
6
6
  //
7
7
  // The watcher must NEVER throw into the event loop (it's a background process). All errors are
8
8
  // caught and logged to stderr. It also never touches stdout.
9
+ //
10
+ // IMPORTANT (chokidar v4): the `ignored` option does NOT support glob patterns (that was removed
11
+ // in v4). It must be a function. We use a path-segment matcher so `node_modules` is excluded
12
+ // everywhere — this is what prevents the EMFILE ("too many open files") errors that a naive
13
+ // glob-based ignore would cause on large repos with thousands of dependency files.
9
14
  import chokidar from 'chokidar';
10
- import { relative, resolve } from 'node:path';
15
+ import { relative, resolve, sep } from 'node:path';
11
16
  import { existsSync, readFileSync } from 'node:fs';
12
17
  import { hashFile, isDirty } from './hasher.js';
13
18
  import { indexFile } from '../parser/index.js';
@@ -15,21 +20,55 @@ import { pluginForFile } from '../parser/languages/registry.js';
15
20
  import { toPosix } from '../utils/paths.js';
16
21
  import { log } from '../utils/logger.js';
17
22
  const DEBOUNCE_MS = 300;
18
- /** Glob patterns the watcher ignores. */
19
- const IGNORED_GLOBS = [
20
- '**/node_modules/**',
21
- '**/.git/**',
22
- '**/.sliver/**',
23
- '**/dist/**',
24
- '**/build/**',
25
- '**/out/**',
26
- '**/*.min.js',
27
- '**/*.min.css',
28
- '**/__pycache__/**',
29
- '**/.next/**',
30
- '**/.nuxt/**',
31
- '**/coverage/**',
32
- ];
23
+ /**
24
+ * Directory names whose entire subtree is ignored by the watcher. We match by PATH SEGMENT
25
+ * (anywhere in the path), which is what makes node_modules exclusion work under chokidar v4.
26
+ */
27
+ const IGNORED_DIR_SEGMENTS = new Set([
28
+ 'node_modules',
29
+ '.git',
30
+ '.sliver',
31
+ 'dist',
32
+ 'build',
33
+ 'out',
34
+ '__pycache__',
35
+ '.next',
36
+ '.nuxt',
37
+ 'coverage',
38
+ '.cache',
39
+ '.turbo',
40
+ ]);
41
+ /** File suffixes that are never worth indexing (minified, sourcemaps). */
42
+ const IGNORED_SUFFIXES = ['.min.js', '.min.css', '.map'];
43
+ /**
44
+ * chokidar v4 `ignored` matcher. Returns true if the path should be IGNORED.
45
+ *
46
+ * We check each path segment against the ignored-dir set (so any path containing a
47
+ * `node_modules` segment anywhere is dropped), and the filename against ignored suffixes.
48
+ * Matching is on the raw path — both absolute and relative forms work because we split on the
49
+ * OS separator and also handle posix-style.
50
+ */
51
+ function isIgnored(absOrRelPath) {
52
+ if (!absOrRelPath)
53
+ return false;
54
+ // Normalize to posix segments so the matcher is platform-independent.
55
+ const segments = absOrRelPath.split(sep).join('/').split('/');
56
+ for (const seg of segments) {
57
+ if (IGNORED_DIR_SEGMENTS.has(seg))
58
+ return true;
59
+ }
60
+ for (const suffix of IGNORED_SUFFIXES) {
61
+ if (absOrRelPath.endsWith(suffix))
62
+ return true;
63
+ }
64
+ // Hidden directories (dot-prefixed) other than the ones we explicitly allow.
65
+ // (We already handle .git/.sliver above; this catches .vscode, .idea, etc.)
66
+ for (const seg of segments) {
67
+ if (seg.length > 1 && seg.startsWith('.'))
68
+ return true;
69
+ }
70
+ return false;
71
+ }
33
72
  /**
34
73
  * Start watching the project root for changes. Returns the chokidar watcher
35
74
  * (call .close() to stop). Reads from the GraphStore to detect unchanged files (hash dedup)
@@ -39,15 +78,23 @@ export function startWatcher(store, projectRoot) {
39
78
  const root = resolve(projectRoot);
40
79
  const timers = new Map();
41
80
  const watcher = chokidar.watch(root, {
42
- ignored: IGNORED_GLOBS,
81
+ ignored: isIgnored,
43
82
  persistent: true,
44
83
  ignoreInitial: true, // don't fire for files present at startup (already indexed)
84
+ // If the OS file-descriptor limit is still exceeded (very unusual now that node_modules is
85
+ // excluded), cap inotify/interval polling so we don't crash with EMFILE.
86
+ usePolling: false,
87
+ interval: 2000,
45
88
  });
46
89
  const relOf = (abs) => toPosix(relative(root, abs));
47
90
  const handleChange = (absPath) => {
48
91
  const rel = relOf(absPath);
49
92
  if (!pluginForFile(rel))
50
- return; // unsupported extension
93
+ return; // unsupported extension — don't index
94
+ // Defensive: the `ignored` matcher should already have filtered this, but re-check on the
95
+ // relative path in case of edge cases (e.g. symlinked dirs).
96
+ if (isIgnored(rel))
97
+ return;
51
98
  // Debounce: collapse rapid saves into one re-index.
52
99
  const existing = timers.get(rel);
53
100
  if (existing)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "contextsliver",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Universal context-management MCP server for AI coding agents. On-demand dependency-graph pruning with session awareness.",
5
5
  "keywords": [
6
6
  "mcp",