@jagilber-org/index-server 1.28.5 → 1.28.8

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.8-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.8-0009101e">
9
+ <script defer src="js/admin.utils.js?v=1.28.8-0009101e"></script>
10
+ <script defer src="js/admin.auth.js?v=1.28.8-0009101e"></script>
11
+ <script defer src="js/admin.overview.js?v=1.28.8-0009101e"></script>
12
+ <script defer src="js/admin.sessions.js?v=1.28.8-0009101e"></script>
13
+ <script defer src="js/admin.monitor.js?v=1.28.8-0009101e"></script>
14
+ <script defer src="js/admin.events.js?v=1.28.8-0009101e"></script>
15
+ <script defer src="js/admin.graph.js?v=1.28.8-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.8-0009101e"></script>
18
+ <script defer src="js/admin.logs.js?v=1.28.8-0009101e"></script>
19
+ <script defer src="js/admin.maintenance.js?v=1.28.8-0009101e"></script>
20
+ <script defer src="js/admin.config.js?v=1.28.8-0009101e"></script>
21
+ <script defer src="js/admin.performance.js?v=1.28.8-0009101e"></script>
22
+ <script defer src="js/admin.instances.js?v=1.28.8-0009101e"></script>
23
+ <script defer src="js/admin.embeddings.js?v=1.28.8-0009101e"></script>
24
+ <script defer src="js/admin.messaging.js?v=1.28.8-0009101e"></script>
25
+ <script defer src="js/admin.sqlite.js?v=1.28.8-0009101e"></script>
26
+ <script defer src="js/admin.boot.js?v=1.28.8-0009101e"></script>
27
+ <script defer src="js/admin.feedback.js?v=1.28.8-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.8-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.8-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.8-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.8-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.8-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.8-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.8-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' },
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.8",
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
  // --------------------------------------------------------------------------
@@ -636,6 +656,23 @@ Non-interactive mode:
636
656
  previewConfigs(configTargets, config);
637
657
  }
638
658
 
659
+ // ── Generate TLS certs BEFORE writing configs so cert paths exist
660
+ // and the user sees a consistent flow (certs → config wired to them).
661
+ if (config.generateCerts) {
662
+ console.log('\n🔐 Generating TLS certificates...');
663
+ try {
664
+ const certDir = path.join(config.root, 'certs');
665
+ execFileSync(
666
+ process.execPath,
667
+ [path.join(ROOT, 'scripts', 'build', 'generate-certs.mjs'), '--hostname', 'localhost', '--output', certDir],
668
+ { stdio: 'inherit' }
669
+ );
670
+ } catch {
671
+ console.error('❌ Certificate generation failed. Run manually:');
672
+ console.error(` node scripts/build/generate-certs.mjs --output "${path.join(config.root, 'certs')}"`);
673
+ }
674
+ }
675
+
639
676
  // Write to real files or sidecar
640
677
  if (config.write) {
641
678
  console.log('📁 Writing configuration files...\n');
@@ -671,22 +708,6 @@ Non-interactive mode:
671
708
  // ── Deploy runtime if target root differs from package root ─────────
672
709
  await deployRuntime(config);
673
710
 
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
711
  // ── Next steps ──────────────────────────────────────────────────────
691
712
  const proto = (config.profile === 'enhanced' || config.profile === 'experimental') ? 'https' : 'http';
692
713
  const launch = resolveServerLaunch(config);
@@ -724,6 +745,13 @@ Non-interactive mode:
724
745
  console.log(` ${proto}://localhost:${config.port}\n`);
725
746
  step++;
726
747
 
748
+ if (config.tls && config.generateCerts) {
749
+ console.log(` ${step}. TLS certificates wired into your MCP config:`);
750
+ console.log(` INDEX_SERVER_DASHBOARD_TLS_CERT = ${fwd(path.join(config.root, 'certs', 'server.crt'))}`);
751
+ console.log(` INDEX_SERVER_DASHBOARD_TLS_KEY = ${fwd(path.join(config.root, 'certs', 'server.key'))}\n`);
752
+ step++;
753
+ }
754
+
727
755
  if (config.profile === 'enhanced' || config.profile === 'experimental') {
728
756
  console.log(` ${step}. First-time semantic search:`);
729
757
  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.8",
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.8",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  }