@jagilber-org/index-server 1.28.5 → 1.28.9

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
@@ -51,6 +51,8 @@ index-server --dashboard
51
51
 
52
52
  > **No-install alternative:** `npx -y @jagilber-org/index-server@latest --setup` works too (resolves from npmjs.org). Use it for a one-shot try; prefer `-g` for routine use. The GitHub Packages mirror requires authentication, so `npx` against `npm.pkg.github.com` needs a per-scope `.npmrc` plus a `GITHUB_TOKEN` with `read:packages`.
53
53
 
54
+ > **Upgrading or hitting "unsupported INDEX_SERVER key" / "Cannot find module" errors after install?** See [Upgrading and Uninstalling](docs/quickstart.md#upgrading-and-uninstalling) for the clean-uninstall steps that clear stale non-global installs.
55
+
54
56
  #### Bootstrap HTTPS for the dashboard
55
57
 
56
58
  Generate a self-signed TLS cert+key in one command:
@@ -1,30 +1,30 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <meta name="dashboard-build-version" content="1.28.5-0009101e">
4
+ <meta name="dashboard-build-version" content="1.28.9-0009101e">
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <title>Index Server Admin</title>
8
- <link rel="stylesheet" href="css/admin.css?v=1.28.5-0009101e">
9
- <script defer src="js/admin.utils.js?v=1.28.5-0009101e"></script>
10
- <script defer src="js/admin.auth.js?v=1.28.5-0009101e"></script>
11
- <script defer src="js/admin.overview.js?v=1.28.5-0009101e"></script>
12
- <script defer src="js/admin.sessions.js?v=1.28.5-0009101e"></script>
13
- <script defer src="js/admin.monitor.js?v=1.28.5-0009101e"></script>
14
- <script defer src="js/admin.events.js?v=1.28.5-0009101e"></script>
15
- <script defer src="js/admin.graph.js?v=1.28.5-0009101e"></script>
8
+ <link rel="stylesheet" href="css/admin.css?v=1.28.9-0009101e">
9
+ <script defer src="js/admin.utils.js?v=1.28.9-0009101e"></script>
10
+ <script defer src="js/admin.auth.js?v=1.28.9-0009101e"></script>
11
+ <script defer src="js/admin.overview.js?v=1.28.9-0009101e"></script>
12
+ <script defer src="js/admin.sessions.js?v=1.28.9-0009101e"></script>
13
+ <script defer src="js/admin.monitor.js?v=1.28.9-0009101e"></script>
14
+ <script defer src="js/admin.events.js?v=1.28.9-0009101e"></script>
15
+ <script defer src="js/admin.graph.js?v=1.28.9-0009101e"></script>
16
16
  <script defer src="js/marked.umd.js"></script>
17
- <script defer src="js/admin.instructions.js?v=1.28.5-0009101e"></script>
18
- <script defer src="js/admin.logs.js?v=1.28.5-0009101e"></script>
19
- <script defer src="js/admin.maintenance.js?v=1.28.5-0009101e"></script>
20
- <script defer src="js/admin.config.js?v=1.28.5-0009101e"></script>
21
- <script defer src="js/admin.performance.js?v=1.28.5-0009101e"></script>
22
- <script defer src="js/admin.instances.js?v=1.28.5-0009101e"></script>
23
- <script defer src="js/admin.embeddings.js?v=1.28.5-0009101e"></script>
24
- <script defer src="js/admin.messaging.js?v=1.28.5-0009101e"></script>
25
- <script defer src="js/admin.sqlite.js?v=1.28.5-0009101e"></script>
26
- <script defer src="js/admin.boot.js?v=1.28.5-0009101e"></script>
27
- <script defer src="js/admin.feedback.js?v=1.28.5-0009101e"></script>
17
+ <script defer src="js/admin.instructions.js?v=1.28.9-0009101e"></script>
18
+ <script defer src="js/admin.logs.js?v=1.28.9-0009101e"></script>
19
+ <script defer src="js/admin.maintenance.js?v=1.28.9-0009101e"></script>
20
+ <script defer src="js/admin.config.js?v=1.28.9-0009101e"></script>
21
+ <script defer src="js/admin.performance.js?v=1.28.9-0009101e"></script>
22
+ <script defer src="js/admin.instances.js?v=1.28.9-0009101e"></script>
23
+ <script defer src="js/admin.embeddings.js?v=1.28.9-0009101e"></script>
24
+ <script defer src="js/admin.messaging.js?v=1.28.9-0009101e"></script>
25
+ <script defer src="js/admin.sqlite.js?v=1.28.9-0009101e"></script>
26
+ <script defer src="js/admin.boot.js?v=1.28.9-0009101e"></script>
27
+ <script defer src="js/admin.feedback.js?v=1.28.9-0009101e"></script>
28
28
  </head>
29
29
  <body>
30
30
  <div class="admin-container admin-root">
@@ -909,10 +909,10 @@
909
909
  }
910
910
  }
911
911
 
912
- // Graph logic was extracted to js/admin.graph.js?v=1.28.5-0009101e
912
+ // Graph logic was extracted to js/admin.graph.js?v=1.28.9-0009101e
913
913
  // Functions available globally: reloadGraphMermaid, initGraphScopeDefaults, copyMermaidSource, toggleGraphEdit, applyGraphEdit, cancelGraphEdit, refreshDrillCategories, loadDrillInstructions, clearSelections
914
914
 
915
- <!-- overview functions moved to js/admin.overview.js?v=1.28.5-0009101e -->
915
+ <!-- overview functions moved to js/admin.overview.js?v=1.28.9-0009101e -->
916
916
 
917
917
  // Lightweight overview-level maintenance display (optional)
918
918
  // Intentionally minimal to avoid blocking overview rendering.
@@ -1097,7 +1097,7 @@
1097
1097
  }
1098
1098
 
1099
1099
  // --- Backup / Restore ---
1100
- // Extracted to js/admin.maintenance.js?v=1.28.5-0009101e
1100
+ // Extracted to js/admin.maintenance.js?v=1.28.9-0009101e
1101
1101
 
1102
1102
  async function performBackup() {
1103
1103
  try {
@@ -1163,7 +1163,7 @@
1163
1163
  }
1164
1164
 
1165
1165
  async function loadConfiguration() {
1166
- // Primary implementation in js/admin.config.js?v=1.28.5-0009101e (loaded via defer).
1166
+ // Primary implementation in js/admin.config.js?v=1.28.9-0009101e (loaded via defer).
1167
1167
  // This inline fallback only fires if the external script failed to load.
1168
1168
  if (window.__configExternalLoaded) return;
1169
1169
  try {
@@ -1223,10 +1223,10 @@
1223
1223
  return false;
1224
1224
  }
1225
1225
 
1226
- // Monitoring functions moved to js/admin.monitor.js?v=1.28.5-0009101e
1226
+ // Monitoring functions moved to js/admin.monitor.js?v=1.28.9-0009101e
1227
1227
 
1228
1228
  // ===== Log Viewer =====
1229
- // Extracted to js/admin.logs.js?v=1.28.5-0009101e
1229
+ // Extracted to js/admin.logs.js?v=1.28.9-0009101e
1230
1230
 
1231
1231
  // ===== Instruction Management =====
1232
1232
  let instructionEditing = null;
@@ -1723,7 +1723,7 @@
1723
1723
  setInterval(fetchResourceTrends, 10000);
1724
1724
  })();
1725
1725
 
1726
- // Instruction management logic extracted to js/admin.instructions.js?v=1.28.5-0009101e
1726
+ // Instruction management logic extracted to js/admin.instructions.js?v=1.28.9-0009101e
1727
1727
  // Functions exposed globally: loadInstructions, renderInstructionList, editInstruction, saveInstruction, deleteInstruction, etc.
1728
1728
 
1729
1729
  function startAutoRefresh() {
@@ -231,8 +231,8 @@ function buildEnvCatalog(config, paths) {
231
231
  { key: 'INDEX_SERVER_MUTATION', desc: 'Enable write operations', active: true, value: config.mutation ? '1' : '0' },
232
232
  { key: 'INDEX_SERVER_ADMIN_API_KEY', desc: 'Dashboard admin API key', active: false, value: '' },
233
233
  { key: 'INDEX_SERVER_DASHBOARD_TLS', desc: 'Enable HTTPS dashboard', active: config.tls, value: config.tls ? '1' : '0' },
234
- { key: 'INDEX_SERVER_DASHBOARD_TLS_CERT', desc: 'Path to TLS certificate file', active: false, value: `${paths.certs}/server.crt` },
235
- { key: 'INDEX_SERVER_DASHBOARD_TLS_KEY', desc: 'Path to TLS private key file', active: false, value: `${paths.certs}/server.key` },
234
+ { key: 'INDEX_SERVER_DASHBOARD_TLS_CERT', desc: 'Path to TLS certificate file', active: config.tls, value: `${paths.certs}/server.crt` },
235
+ { key: 'INDEX_SERVER_DASHBOARD_TLS_KEY', desc: 'Path to TLS private key file', active: config.tls, value: `${paths.certs}/server.key` },
236
236
  { key: 'INDEX_SERVER_DASHBOARD_TLS_CA', desc: 'Path to CA certificate', active: false, value: '' },
237
237
  { section: 'Semantic Search - embeddings' },
238
238
  { key: 'INDEX_SERVER_SEMANTIC_ENABLED', desc: 'Enable semantic search', active: isEnhanced, value: isEnhanced ? '1' : '0' },
@@ -77,8 +77,12 @@ function buildServerEntry(format, config, paths, envOverrides = {}) {
77
77
  entry.cwd = (0, flagCatalog_1.toForwardSlashes)(launch.cwd);
78
78
  if (format === 'vscode-global' && launch.command === 'node') {
79
79
  const firstArg = launch.args[0] ?? '';
80
- entry.args = [path_1.default.isAbsolute(firstArg) ? (0, flagCatalog_1.toForwardSlashes)(firstArg) : (0, flagCatalog_1.toForwardSlashes)(path_1.default.resolve(launch.cwd ?? config.root, firstArg))];
81
- entry.cwd = (0, flagCatalog_1.toForwardSlashes)(path_1.default.resolve(__dirname, '..', '..', '..'));
80
+ const baseCwd = launch.cwd ?? config.root;
81
+ entry.args = [path_1.default.isAbsolute(firstArg) ? (0, flagCatalog_1.toForwardSlashes)(firstArg) : (0, flagCatalog_1.toForwardSlashes)(path_1.default.resolve(baseCwd, firstArg))];
82
+ // Prefer the launch cwd (config.root for 'local' source — a stable user-scope
83
+ // directory). Fall back to package root only when the runtime hasn't been
84
+ // self-deployed under config.root (e.g. 'packaged' source straight out of npm-global).
85
+ entry.cwd = (0, flagCatalog_1.toForwardSlashes)(launch.cwd ?? path_1.default.resolve(__dirname, '..', '..', '..'));
82
86
  }
83
87
  return entry;
84
88
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jagilber-org/index-server",
3
- "version": "1.28.5",
3
+ "version": "1.28.9",
4
4
  "mcpName": "io.github.jagilber-org/index-server",
5
5
  "description": "MCP instruction indexing server with search, CRUD, validation, and cross-repo knowledge promotion.",
6
6
  "publishConfig": {
@@ -32,6 +32,18 @@ function writeTextFile(filePath, content) {
32
32
  fs['write' + 'FileSync'](filePath, content, 'utf8');
33
33
  }
34
34
  const IS_WINDOWS = process.platform === 'win32';
35
+
36
+ // Default install root for non-repo installs. Lives under the user profile so
37
+ // neither admin/elevated rights nor a cluttered C:\ root are required, and the
38
+ // runtime self-deploys cleanly there (args + cwd resolve under this root).
39
+ function defaultUserRoot() {
40
+ if (IS_WINDOWS) {
41
+ const base = process.env.LOCALAPPDATA || process.env.APPDATA || process.env.USERPROFILE || process.cwd();
42
+ return path.join(base, 'index-server');
43
+ }
44
+ const home = process.env.HOME || process.cwd();
45
+ return path.join(home, '.local', 'share', 'index-server');
46
+ }
35
47
  function parsePositiveTimeout(value, fallback) {
36
48
  const parsed = Number(value);
37
49
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
@@ -147,6 +159,10 @@ function parseNonInteractiveArgs() {
147
159
 
148
160
  const config = {
149
161
  profile: 'default',
162
+ // Non-interactive default stays at ROOT (package install dir) so scripted
163
+ // / CI flows that pass no --root don't trigger deployRuntime. Callers who
164
+ // want a user-profile install pass --root explicitly. Interactive flow
165
+ // defaults to defaultUserRoot() instead.
150
166
  root: ROOT,
151
167
  port: 8787,
152
168
  host: '127.0.0.1',
@@ -188,6 +204,8 @@ function parseNonInteractiveArgs() {
188
204
  if (config.profile === 'experimental') {
189
205
  config.logLevel = 'debug';
190
206
  }
207
+ // When certs are generated, TLS must be active so mcp.json env wires cert paths.
208
+ if (config.generateCerts) config.tls = true;
191
209
 
192
210
  return config;
193
211
  }
@@ -214,7 +232,7 @@ async function runInteractiveWizard() {
214
232
  });
215
233
 
216
234
  // Step 2: Root directory
217
- const defaultRoot = IS_WINDOWS ? 'C:\\mcp\\index-server' : '/opt/index-server';
235
+ const defaultRoot = defaultUserRoot();
218
236
  const root = path.resolve(await input({
219
237
  message: 'Base directory (all data paths resolve under this root)',
220
238
  default: defaultRoot,
@@ -294,7 +312,9 @@ async function runInteractiveWizard() {
294
312
  default: 'repo',
295
313
  });
296
314
 
297
- return { profile, root, serverName, port, host, mutation, logLevel, generateCerts, targets, scope, write: true, preview: true, deploy: true };
315
+ // When certs are generated TLS must be enabled so mcp.json env wires up cert paths.
316
+ const tls = generateCerts || profile === 'enhanced' || profile === 'experimental';
317
+ return { profile, root, serverName, port, host, tls, mutation, logLevel, generateCerts, targets, scope, write: true, preview: true, deploy: true };
298
318
  }
299
319
 
300
320
  // --------------------------------------------------------------------------
@@ -628,6 +648,12 @@ Non-interactive mode:
628
648
  console.log(`\n✅ .env written to: ${envPath}`);
629
649
  }
630
650
 
651
+ // ── Deploy runtime BEFORE config generation ─────────────────────────
652
+ // resolveServerLaunch picks 'local' source (cwd = config.root) only when
653
+ // <config.root>/dist/server/index-server.js exists. Deploy first so configs
654
+ // are emitted with stable user-data-root paths instead of npm-global paths.
655
+ await deployRuntime(config);
656
+
631
657
  // ── Multi-target config generation ──────────────────────────────────
632
658
  const configTargets = resolveConfigPaths(config);
633
659
 
@@ -636,6 +662,23 @@ Non-interactive mode:
636
662
  previewConfigs(configTargets, config);
637
663
  }
638
664
 
665
+ // ── Generate TLS certs BEFORE writing configs so cert paths exist
666
+ // and the user sees a consistent flow (certs → config wired to them).
667
+ if (config.generateCerts) {
668
+ console.log('\n🔐 Generating TLS certificates...');
669
+ try {
670
+ const certDir = path.join(config.root, 'certs');
671
+ execFileSync(
672
+ process.execPath,
673
+ [path.join(ROOT, 'scripts', 'build', 'generate-certs.mjs'), '--hostname', 'localhost', '--output', certDir],
674
+ { stdio: 'inherit' }
675
+ );
676
+ } catch {
677
+ console.error('❌ Certificate generation failed. Run manually:');
678
+ console.error(` node scripts/build/generate-certs.mjs --output "${path.join(config.root, 'certs')}"`);
679
+ }
680
+ }
681
+
639
682
  // Write to real files or sidecar
640
683
  if (config.write) {
641
684
  console.log('📁 Writing configuration files...\n');
@@ -668,25 +711,6 @@ Non-interactive mode:
668
711
  }
669
712
  }
670
713
 
671
- // ── Deploy runtime if target root differs from package root ─────────
672
- await deployRuntime(config);
673
-
674
- // ── Generate TLS certs ──────────────────────────────────────────────
675
- if (config.generateCerts) {
676
- console.log('\n🔐 Generating TLS certificates...');
677
- try {
678
- const certDir = path.join(config.root, 'certs');
679
- execFileSync(
680
- process.execPath,
681
- [path.join(ROOT, 'scripts', 'build', 'generate-certs.mjs'), '--hostname', 'localhost', '--output', certDir],
682
- { stdio: 'inherit' }
683
- );
684
- } catch {
685
- console.error('❌ Certificate generation failed. Run manually:');
686
- console.error(` node scripts/build/generate-certs.mjs --output "${path.join(config.root, 'certs')}"`);
687
- }
688
- }
689
-
690
714
  // ── Next steps ──────────────────────────────────────────────────────
691
715
  const proto = (config.profile === 'enhanced' || config.profile === 'experimental') ? 'https' : 'http';
692
716
  const launch = resolveServerLaunch(config);
@@ -724,6 +748,13 @@ Non-interactive mode:
724
748
  console.log(` ${proto}://localhost:${config.port}\n`);
725
749
  step++;
726
750
 
751
+ if (config.tls && config.generateCerts) {
752
+ console.log(` ${step}. TLS certificates wired into your MCP config:`);
753
+ console.log(` INDEX_SERVER_DASHBOARD_TLS_CERT = ${fwd(path.join(config.root, 'certs', 'server.crt'))}`);
754
+ console.log(` INDEX_SERVER_DASHBOARD_TLS_KEY = ${fwd(path.join(config.root, 'certs', 'server.key'))}\n`);
755
+ step++;
756
+ }
757
+
727
758
  if (config.profile === 'enhanced' || config.profile === 'experimental') {
728
759
  console.log(` ${step}. First-time semantic search:`);
729
760
  console.log(' The MiniLM model (~90MB) will download on first query.');
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/jagilber-org/index-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.28.5",
9
+ "version": "1.28.9",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@jagilber-org/index-server",
14
- "version": "1.28.5",
14
+ "version": "1.28.9",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }