claude-code-session-manager 0.90.0 → 0.91.1

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 (35) hide show
  1. package/dist/assets/{AgentLibrary-CrmoSn9-.js → AgentLibrary-Chmfxih8.js} +1 -1
  2. package/dist/assets/{DataModel-SPLQTR8E.js → DataModel-Cp38ePS_.js} +1 -1
  3. package/dist/assets/{History-DT6S3abz.js → History-SMWV7lD6.js} +1 -1
  4. package/dist/assets/{Hooks-CC2iv5Oq.js → Hooks-JUWiyu-r.js} +1 -1
  5. package/dist/assets/{HostBilko-DqY7dA2a.js → HostBilko-DFTixTqy.js} +1 -1
  6. package/dist/assets/{Library-CUoOC77T.js → Library-zUu71gsR.js} +1 -1
  7. package/dist/assets/{ListDetail-DgrG72f4.js → ListDetail-BK_PH4lf.js} +1 -1
  8. package/dist/assets/{MarkdownEditor-C8dB3ZWU.js → MarkdownEditor-ITJDD0Mr.js} +1 -1
  9. package/dist/assets/{McpServers-DupdjvFt.js → McpServers-CWwrfGkx.js} +1 -1
  10. package/dist/assets/{Memory-C_4LhC2r.js → Memory-DgHttor9.js} +1 -1
  11. package/dist/assets/{Panel-DWmE5Fu9.js → Panel-C2Cb7TS4.js} +1 -1
  12. package/dist/assets/{Permissions-hxiN2IWM.js → Permissions-hd8OBsj_.js} +1 -1
  13. package/dist/assets/{Plugins-fttEgZqy.js → Plugins-BYa-ClGK.js} +2 -2
  14. package/dist/assets/{ProvenanceBadge-DROCzlbx.js → ProvenanceBadge-Dmhz8ZOB.js} +1 -1
  15. package/dist/assets/{SaveBar-BZs0IQHq.js → SaveBar-1NvfbO9r.js} +1 -1
  16. package/dist/assets/{Scheduler-Bi4oZ8gg.js → Scheduler-SYgINPCB.js} +1 -1
  17. package/dist/assets/{ScopeSwitcher-C0538XU8.js → ScopeSwitcher-MBmWNzFk.js} +1 -1
  18. package/dist/assets/{Settings-CcW6x-wu.js → Settings-C1WOHoYb.js} +1 -1
  19. package/dist/assets/{SkillReferenceGraph-BtCcPAYO.js → SkillReferenceGraph-Cuse__ul.js} +1 -1
  20. package/dist/assets/{Skills-Daf_1sQR.js → Skills-CQmLYgNh.js} +1 -1
  21. package/dist/assets/{SystemPrompt-rYIla_wt.js → SystemPrompt-DkhAYRXL.js} +1 -1
  22. package/dist/assets/{TagLibrary-81Mr1RLU.js → TagLibrary-DGxI_3m3.js} +1 -1
  23. package/dist/assets/{TiptapBody-BxuLNg1e.js → TiptapBody-BY-fFjwh.js} +1 -1
  24. package/dist/assets/{Toggle-CN8EVEai.js → Toggle--nwLR-_8.js} +1 -1
  25. package/dist/assets/{index-A9TWmB7_.js → index-4dEn1t8J.js} +314 -314
  26. package/dist/assets/{index-Dh7BLxdA.css → index-CRPJslSA.css} +1 -1
  27. package/dist/assets/{settingsSchema-C9I9a0jv.js → settingsSchema-DiqEpSBA.js} +1 -1
  28. package/dist/index.html +2 -2
  29. package/package.json +1 -1
  30. package/src/main/__tests__/bilkoHost-integration.test.cjs +22 -9
  31. package/src/main/__tests__/projectHomeAdminRoutes.test.cjs +12 -0
  32. package/src/main/bilkoHost.cjs +6 -7
  33. package/src/main/build-info.json +4 -4
  34. package/src/main/index.cjs +1 -1
  35. package/src/preload/api.d.ts +2 -2
package/dist/index.html CHANGED
@@ -7,10 +7,10 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
9
  <link href="https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;1,6..72,400&family=Geist:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
10
- <script type="module" crossorigin src="./assets/index-A9TWmB7_.js"></script>
10
+ <script type="module" crossorigin src="./assets/index-4dEn1t8J.js"></script>
11
11
  <link rel="modulepreload" crossorigin href="./assets/monaco-editor-BW5C4Iv1.js">
12
12
  <link rel="stylesheet" crossorigin href="./assets/monaco-editor-BTnBOi8r.css">
13
- <link rel="stylesheet" crossorigin href="./assets/index-Dh7BLxdA.css">
13
+ <link rel="stylesheet" crossorigin href="./assets/index-CRPJslSA.css">
14
14
  </head>
15
15
  <body class="bg-bg text-fg font-sans antialiased">
16
16
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-session-manager",
3
- "version": "0.90.0",
3
+ "version": "0.91.1",
4
4
  "description": "Local cockpit for the Claude Code CLI — multi-tab terminal, full config surface, scheduler, voice dictation, and live observability.",
5
5
  "type": "module",
6
6
  "main": "src/main/index.cjs",
@@ -12,15 +12,12 @@ const bilkoHost = require('../bilkoHost.cjs');
12
12
  function makeProject() {
13
13
  const root = fs.mkdtempSync(path.join(os.tmpdir(), 'bilko-host-'));
14
14
  config.addAllowedRoot(root);
15
- fs.mkdirSync(path.join(root, 'session-manager-operations', 'project-pages', 'output'), { recursive: true });
15
+ fs.mkdirSync(path.join(root, 'session-manager-operations', 'project-pages'), { recursive: true });
16
16
  fs.writeFileSync(
17
17
  path.join(root, 'session-manager-operations', 'project-pages', 'home.html'),
18
18
  '<html><title>Demo</title>Home</html>',
19
19
  );
20
- fs.writeFileSync(
21
- path.join(root, 'session-manager-operations', 'project-pages', 'output', 'feature.html'),
22
- '<html><title>Demo</title>Feature</html>',
23
- );
20
+ fs.writeFileSync(path.join(root, 'feature.html'), '<html><title>Demo</title>Feature</html>');
24
21
  fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: 'demo-app', version: '1.2.3' }));
25
22
  return root;
26
23
  }
@@ -42,7 +39,7 @@ test('addDocument then prepareBundle writes a sub-path document at the expected
42
39
  cwd: root,
43
40
  subpath: 'special-doc/01',
44
41
  title: 'Feature deep-dive',
45
- source: { kind: 'project-page-lens', lens: 'feature' },
42
+ source: { kind: 'file', path: 'feature.html' },
46
43
  });
47
44
  const result = await bilkoHost.prepareBundle({ cwd: root, slug: 'demo-app' });
48
45
  assert.equal(
@@ -53,6 +50,22 @@ test('addDocument then prepareBundle writes a sub-path document at the expected
53
50
  fs.rmSync(root, { recursive: true, force: true });
54
51
  });
55
52
 
53
+ test('a non-home project-page-lens document throws the retired-lens error (no output/ fallback)', async () => {
54
+ const root = makeProject();
55
+ await bilkoHost.prepareBundle({ cwd: root, slug: 'demo-app' });
56
+ await bilkoHost.addDocument({
57
+ cwd: root,
58
+ subpath: 'special-doc/01',
59
+ title: 'Feature deep-dive',
60
+ source: { kind: 'project-page-lens', lens: 'feature' },
61
+ });
62
+ await assert.rejects(
63
+ () => bilkoHost.prepareBundle({ cwd: root, slug: 'demo-app' }),
64
+ /retired "feature" Project Page lens; only the single home\.html page is generated now/,
65
+ );
66
+ fs.rmSync(root, { recursive: true, force: true });
67
+ });
68
+
56
69
  test('removeDocument + prepareBundle wholesale-rebuilds dist/, leaving no trace of the removed file', async () => {
57
70
  const root = makeProject();
58
71
  await bilkoHost.prepareBundle({ cwd: root, slug: 'demo-app' });
@@ -60,7 +73,7 @@ test('removeDocument + prepareBundle wholesale-rebuilds dist/, leaving no trace
60
73
  cwd: root,
61
74
  subpath: 'special-doc/01',
62
75
  title: 'Feature deep-dive',
63
- source: { kind: 'project-page-lens', lens: 'feature' },
76
+ source: { kind: 'file', path: 'feature.html' },
64
77
  });
65
78
  await bilkoHost.prepareBundle({ cwd: root, slug: 'demo-app' });
66
79
  const docId = added.documents.find((d) => d.subpath === 'special-doc/01').id;
@@ -95,10 +108,10 @@ test('addDocument refuses a duplicate sub-path', async () => {
95
108
  cwd: root,
96
109
  subpath: 'doc',
97
110
  title: 'A',
98
- source: { kind: 'project-page-lens', lens: 'feature' },
111
+ source: { kind: 'file', path: 'feature.html' },
99
112
  });
100
113
  await assert.rejects(
101
- () => bilkoHost.addDocument({ cwd: root, subpath: 'doc', title: 'B', source: { kind: 'project-page-lens', lens: 'feature' } }),
114
+ () => bilkoHost.addDocument({ cwd: root, subpath: 'doc', title: 'B', source: { kind: 'file', path: 'feature.html' } }),
102
115
  /already uses subpath/,
103
116
  );
104
117
  fs.rmSync(root, { recursive: true, force: true });
@@ -163,3 +163,15 @@ test('bad JSON, missing/relative cwd, non-project cwd, and unknown keys are 400s
163
163
  expect(res.status).toBe(400);
164
164
  expect(res.body.error).toContain('not a Session Manager project');
165
165
  });
166
+
167
+ test('one-file contract: project-pages holds exactly home.html after one write and after a regenerate', async () => {
168
+ const cwd = await mkProjectCwd();
169
+ const adminHttp = makeFakeAdminHttp();
170
+ registerAdminRoute(adminHttp);
171
+ const pagesDir = path.join(fs.realpathSync(cwd), 'session-manager-operations', 'project-pages');
172
+ await adminHttp.call('POST', '/admin/project-home/write', { body: { cwd, html: '<p>first</p>' } });
173
+ expect(fs.readdirSync(pagesDir)).toEqual(['home.html']);
174
+ await adminHttp.call('POST', '/admin/project-home/write', { body: { cwd, html: '<p>second, different</p>' } });
175
+ expect(fs.readdirSync(pagesDir)).toEqual(['home.html']);
176
+ expect(fs.readFileSync(path.join(pagesDir, 'home.html'), 'utf8')).toBe('<p>second, different</p>');
177
+ });
@@ -220,13 +220,12 @@ async function removeDocument({ cwd, id }) {
220
220
 
221
221
  async function resolveDocumentHtml(cwd, doc) {
222
222
  if (doc.source.kind === 'project-page-lens') {
223
- // Only `home` is generated now (one home.html); the other lens names
224
- // are legacy and resolve to their old output/<lens>.html if one exists.
225
- const result = await config.readText(
226
- doc.source.lens === 'home'
227
- ? homePagePath(cwd)
228
- : opsPath(cwd, 'project-pages', 'output', `${doc.source.lens}.html`),
229
- );
223
+ // Only `home` is generated now (one home.html); other lens names are
224
+ // retired and have no output anywhere — fail loudly rather than fall back.
225
+ if (doc.source.lens !== 'home') {
226
+ throw new Error(`document "${doc.title}" points at the retired "${doc.source.lens}" Project Page lens; only the single home.html page is generated now`);
227
+ }
228
+ const result = await config.readText(homePagePath(cwd));
230
229
  if (!result.exists) {
231
230
  throw new Error(`document "${doc.title}" points at the ${doc.source.lens} Project Page, but it hasn't been generated yet`);
232
231
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "version": "0.90.0",
3
- "gitSha": "899dec1d2020863483a5ab7d77ce865dd051462a",
4
- "gitShortSha": "899dec1",
2
+ "version": "0.91.1",
3
+ "gitSha": "4ee78cf25ac1c0f896177df4f7c13f5287ae647d",
4
+ "gitShortSha": "4ee78cf",
5
5
  "gitBranch": "HEAD",
6
- "builtAt": "2026-09-20T19:04:54.415Z",
6
+ "builtAt": "2026-09-20T20:06:12.676Z",
7
7
  "dirty": false
8
8
  }
@@ -513,7 +513,7 @@ ipcMain.handle('app:launch-mode', () => ({
513
513
  // `claude mcp list`. Read-only, single in-flight call — no polling.
514
514
  ipcMain.handle('mcp:status', () => probeMcpStatus());
515
515
 
516
- // Project Home's "Agent tools" block (PhAgentTools): the same catalog data
516
+ // The Dashboard's "Agent tools" section (HomeAgentTools): the same catalog data
517
517
  // GET /admin/mcp/catalog serves to external callers, read in-process here so
518
518
  // the renderer never makes a direct HTTP call. Static data, no cwd needed.
519
519
  ipcMain.handle('mcp:catalog', () => ({ ok: true, tools: MCP_TOOL_CATALOG, recipes: MCP_RECIPES }));
@@ -200,8 +200,8 @@ export interface McpStatusResult {
200
200
  }
201
201
 
202
202
  /** One session-manager-scheduler MCP tool's catalog entry (src/main/lib/mcpToolCatalog.cjs) —
203
- * the same data GET /admin/mcp/catalog serves, read in-process for Project Home's
204
- * PhAgentTools block. */
203
+ * the same data GET /admin/mcp/catalog serves, read in-process for the Dashboard's
204
+ * HomeAgentTools section. */
205
205
  export interface McpToolCatalogEntry {
206
206
  name: string;
207
207
  group: 'scheduler' | 'chat' | 'feedback' | 'help';