@search-docs/mcp-server 1.0.14 → 1.0.15

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 (87) hide show
  1. package/dist/__tests__/helpers/test-setup.d.ts +33 -0
  2. package/dist/__tests__/helpers/test-setup.d.ts.map +1 -0
  3. package/dist/__tests__/helpers/test-setup.js +106 -0
  4. package/dist/__tests__/helpers/test-setup.js.map +1 -0
  5. package/dist/__tests__/helpers/types.d.ts +22 -0
  6. package/dist/__tests__/helpers/types.d.ts.map +1 -0
  7. package/dist/__tests__/helpers/types.js +5 -0
  8. package/dist/__tests__/helpers/types.js.map +1 -0
  9. package/dist/__tests__/mcp-server-basic.test.d.ts +16 -0
  10. package/dist/__tests__/mcp-server-basic.test.d.ts.map +1 -0
  11. package/dist/__tests__/mcp-server-basic.test.js +113 -0
  12. package/dist/__tests__/mcp-server-basic.test.js.map +1 -0
  13. package/dist/__tests__/server-lifecycle.test.d.ts +15 -0
  14. package/dist/__tests__/server-lifecycle.test.d.ts.map +1 -0
  15. package/dist/__tests__/server-lifecycle.test.js +171 -0
  16. package/dist/__tests__/server-lifecycle.test.js.map +1 -0
  17. package/dist/__tests__/server-state-transition-v2.test.d.ts +7 -0
  18. package/dist/__tests__/server-state-transition-v2.test.d.ts.map +1 -0
  19. package/dist/__tests__/server-state-transition-v2.test.js +182 -0
  20. package/dist/__tests__/server-state-transition-v2.test.js.map +1 -0
  21. package/dist/__tests__/server-state.test.d.ts +11 -0
  22. package/dist/__tests__/server-state.test.d.ts.map +1 -0
  23. package/dist/__tests__/server-state.test.js +123 -0
  24. package/dist/__tests__/server-state.test.js.map +1 -0
  25. package/dist/__tests__/state.test.d.ts +5 -0
  26. package/dist/__tests__/state.test.d.ts.map +1 -0
  27. package/dist/__tests__/state.test.js +114 -0
  28. package/dist/__tests__/state.test.js.map +1 -0
  29. package/dist/server-manager.d.ts +1 -1
  30. package/dist/server-manager.d.ts.map +1 -1
  31. package/dist/server-manager.js +68 -15
  32. package/dist/server-manager.js.map +1 -1
  33. package/dist/server-state-transition.test.d.ts +9 -0
  34. package/dist/server-state-transition.test.d.ts.map +1 -0
  35. package/dist/server-state-transition.test.js +267 -0
  36. package/dist/server-state-transition.test.js.map +1 -0
  37. package/dist/server.d.ts +4 -0
  38. package/dist/server.d.ts.map +1 -1
  39. package/dist/server.js +91 -270
  40. package/dist/server.js.map +1 -1
  41. package/dist/server.test.js +32 -1
  42. package/dist/server.test.js.map +1 -1
  43. package/dist/state.d.ts +42 -0
  44. package/dist/state.d.ts.map +1 -0
  45. package/dist/state.js +96 -0
  46. package/dist/state.js.map +1 -0
  47. package/dist/tools/__tests__/index-status.test.d.ts +5 -0
  48. package/dist/tools/__tests__/index-status.test.d.ts.map +1 -0
  49. package/dist/tools/__tests__/index-status.test.js +123 -0
  50. package/dist/tools/__tests__/index-status.test.js.map +1 -0
  51. package/dist/tools/get-document.d.ts +10 -0
  52. package/dist/tools/get-document.d.ts.map +1 -0
  53. package/dist/tools/get-document.js +73 -0
  54. package/dist/tools/get-document.js.map +1 -0
  55. package/dist/tools/index-status.d.ts +10 -0
  56. package/dist/tools/index-status.d.ts.map +1 -0
  57. package/dist/tools/index-status.js +51 -0
  58. package/dist/tools/index-status.js.map +1 -0
  59. package/dist/tools/index.d.ts +11 -0
  60. package/dist/tools/index.d.ts.map +1 -0
  61. package/dist/tools/index.js +12 -0
  62. package/dist/tools/index.js.map +1 -0
  63. package/dist/tools/init.d.ts +10 -0
  64. package/dist/tools/init.d.ts.map +1 -0
  65. package/dist/tools/init.js +71 -0
  66. package/dist/tools/init.js.map +1 -0
  67. package/dist/tools/search.d.ts +10 -0
  68. package/dist/tools/search.d.ts.map +1 -0
  69. package/dist/tools/search.js +92 -0
  70. package/dist/tools/search.js.map +1 -0
  71. package/dist/tools/server-control.d.ts +14 -0
  72. package/dist/tools/server-control.d.ts.map +1 -0
  73. package/dist/tools/server-control.js +121 -0
  74. package/dist/tools/server-control.js.map +1 -0
  75. package/dist/tools/system-status.d.ts +10 -0
  76. package/dist/tools/system-status.d.ts.map +1 -0
  77. package/dist/tools/system-status.js +68 -0
  78. package/dist/tools/system-status.js.map +1 -0
  79. package/dist/tools/types.d.ts +17 -0
  80. package/dist/tools/types.d.ts.map +1 -0
  81. package/dist/tools/types.js +5 -0
  82. package/dist/tools/types.js.map +1 -0
  83. package/dist/utils.d.ts +19 -0
  84. package/dist/utils.d.ts.map +1 -0
  85. package/dist/utils.js +36 -0
  86. package/dist/utils.js.map +1 -0
  87. package/package.json +2 -2
package/dist/state.js ADDED
@@ -0,0 +1,96 @@
1
+ /**
2
+ * システム状態管理
3
+ */
4
+ import { SearchDocsClient } from '@search-docs/client';
5
+ import { ConfigLoader } from '@search-docs/types';
6
+ /**
7
+ * システム状態を判定
8
+ *
9
+ * @param cwd - カレントワーキングディレクトリ
10
+ * @returns システム状態情報
11
+ */
12
+ export async function detectSystemState(cwd) {
13
+ // 1. 設定ファイルの存在確認
14
+ let config;
15
+ let configPath;
16
+ let projectRoot;
17
+ try {
18
+ const result = await ConfigLoader.resolve({
19
+ cwd,
20
+ requireConfig: false, // エラーで終了しない
21
+ traverseUp: false, // 上位ディレクトリを遡らない(テスト時の意図しない設定読み込みを防ぐ)
22
+ });
23
+ // 設定ファイルが見つからない場合(configPath === null)は未設定状態
24
+ // ConfigLoader.resolve()はデフォルト設定を返すが、設定ファイルが存在しない場合は
25
+ // NOT_CONFIGURED状態として扱う
26
+ if (!result.config || result.configPath === null) {
27
+ // 設定ファイルなし
28
+ return {
29
+ state: 'NOT_CONFIGURED',
30
+ projectRoot: cwd,
31
+ };
32
+ }
33
+ config = result.config;
34
+ configPath = result.configPath ?? undefined;
35
+ projectRoot = result.projectRoot;
36
+ }
37
+ catch (_error) {
38
+ // 設定ファイル読み込みエラー
39
+ return {
40
+ state: 'NOT_CONFIGURED',
41
+ projectRoot: cwd,
42
+ };
43
+ }
44
+ // 2. サーバのヘルスチェック
45
+ const serverUrl = `http://${config.server.host}:${config.server.port}`;
46
+ const client = new SearchDocsClient({ baseUrl: serverUrl });
47
+ try {
48
+ await client.healthCheck();
49
+ // サーバ稼働中
50
+ return {
51
+ state: 'RUNNING',
52
+ config,
53
+ configPath,
54
+ projectRoot,
55
+ serverUrl,
56
+ client,
57
+ };
58
+ }
59
+ catch (_error) {
60
+ // サーバ停止中
61
+ return {
62
+ state: 'CONFIGURED_SERVER_DOWN',
63
+ config,
64
+ configPath,
65
+ projectRoot,
66
+ serverUrl,
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * システム状態に応じたエラーメッセージを生成
72
+ *
73
+ * @param state - システム状態
74
+ * @param action - 実行しようとしたアクション名
75
+ * @returns エラーメッセージ
76
+ */
77
+ export function getStateErrorMessage(state, action) {
78
+ switch (state) {
79
+ case 'NOT_CONFIGURED':
80
+ return (`${action}を実行できません。search-docsがまだセットアップされていません。\n\n` +
81
+ 'まず、設定ファイルを作成してください:\n' +
82
+ ' ツール: init\n\n' +
83
+ '設定作成後、サーバを起動してください:\n' +
84
+ ' ツール: server_start');
85
+ case 'CONFIGURED_SERVER_DOWN':
86
+ return (`${action}を実行できません。search-docsサーバが起動していません。\n\n` +
87
+ 'サーバを起動してください:\n' +
88
+ ' ツール: server_start\n\n' +
89
+ 'または、設定を再作成する場合:\n' +
90
+ ' ツール: init (--force オプション付き)');
91
+ case 'RUNNING':
92
+ // サーバ稼働中は通常エラーにならないが、念のため
93
+ return `${action}を実行できません。予期しないエラーが発生しました。`;
94
+ }
95
+ }
96
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAyB,MAAM,oBAAoB,CAAC;AAyBzE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,iBAAiB;IACjB,IAAI,MAAoC,CAAC;IACzC,IAAI,UAA8B,CAAC;IACnC,IAAI,WAAmB,CAAC;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YACxC,GAAG;YACH,aAAa,EAAE,KAAK,EAAE,YAAY;YAClC,UAAU,EAAE,KAAK,EAAE,qCAAqC;SACzD,CAAC,CAAC;QAEH,6CAA6C;QAC7C,qDAAqD;QACrD,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACjD,WAAW;YACX,OAAO;gBACL,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,GAAG;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC;QAC5C,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACnC,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,gBAAgB;QAChB,OAAO;YACL,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,GAAG;SACjB,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,SAAS,GAAG,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,SAAS;QACT,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM;YACN,UAAU;YACV,WAAW;YACX,SAAS;YACT,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,SAAS;QACT,OAAO;YACL,KAAK,EAAE,wBAAwB;YAC/B,MAAM;YACN,UAAU;YACV,WAAW;YACX,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,MAAc;IACrE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,gBAAgB;YACnB,OAAO,CACL,GAAG,MAAM,2CAA2C;gBACpD,uBAAuB;gBACvB,iBAAiB;gBACjB,uBAAuB;gBACvB,qBAAqB,CACtB,CAAC;QAEJ,KAAK,wBAAwB;YAC3B,OAAO,CACL,GAAG,MAAM,uCAAuC;gBAChD,iBAAiB;gBACjB,yBAAyB;gBACzB,mBAAmB;gBACnB,+BAA+B,CAChC,CAAC;QAEJ,KAAK,SAAS;YACZ,0BAA0B;YAC1B,OAAO,GAAG,MAAM,2BAA2B,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * index_statusツールのテスト
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index-status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-status.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/index-status.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * index_statusツールのテスト
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { registerIndexStatusTool } from '../index-status.js';
6
+ describe('index_status tool', () => {
7
+ let mockServer;
8
+ let registeredTool;
9
+ beforeEach(() => {
10
+ vi.clearAllMocks();
11
+ // MCPサーバのモック
12
+ mockServer = {
13
+ registerTool: vi.fn((name, schema, handler) => {
14
+ registeredTool = { name, schema, handler };
15
+ }),
16
+ };
17
+ });
18
+ it('RUNNING状態の場合、正常に動作する', async () => {
19
+ const mockResponse = {
20
+ server: {
21
+ version: '1.0.0',
22
+ uptime: 123456,
23
+ pid: 12345,
24
+ },
25
+ index: {
26
+ totalDocuments: 10,
27
+ totalSections: 50,
28
+ dirtyCount: 2,
29
+ },
30
+ worker: {
31
+ running: true,
32
+ processing: 1,
33
+ queue: 3,
34
+ },
35
+ };
36
+ const mockClient = {
37
+ getStatus: vi.fn().mockResolvedValue(mockResponse),
38
+ };
39
+ const systemState = {
40
+ state: 'RUNNING',
41
+ config: {},
42
+ configPath: '/test/.search-docs.json',
43
+ projectRoot: '/test',
44
+ serverUrl: 'http://localhost:24280',
45
+ client: mockClient,
46
+ };
47
+ const context = {
48
+ server: mockServer,
49
+ systemState,
50
+ refreshSystemState: async () => { },
51
+ };
52
+ // ツール登録
53
+ registerIndexStatusTool(context);
54
+ expect(mockServer.registerTool).toHaveBeenCalledWith('index_status', expect.objectContaining({
55
+ description: expect.stringContaining('インデックスの状態'),
56
+ }), expect.any(Function));
57
+ // ツールハンドラを実行
58
+ const result = await registeredTool.handler();
59
+ expect(mockClient.getStatus).toHaveBeenCalled();
60
+ expect(result.content[0].text).toContain('📊 インデックス状態');
61
+ expect(result.content[0].text).toContain('バージョン: 1.0.0');
62
+ expect(result.content[0].text).toContain('総文書数: 10件');
63
+ expect(result.content[0].text).toContain('総セクション数: 50件');
64
+ expect(result.content[0].text).toContain('Dirtyセクション: 2件');
65
+ expect(result.content[0].text).toContain('実行中: Yes');
66
+ });
67
+ it('NOT_CONFIGURED状態の場合、エラーを返す', async () => {
68
+ const systemState = {
69
+ state: 'NOT_CONFIGURED',
70
+ projectRoot: '/test',
71
+ };
72
+ const context = {
73
+ server: mockServer,
74
+ systemState,
75
+ refreshSystemState: async () => { },
76
+ };
77
+ // ツール登録
78
+ registerIndexStatusTool(context);
79
+ // ツールハンドラを実行
80
+ await expect(registeredTool.handler()).rejects.toThrow('セットアップされていません');
81
+ });
82
+ it('CONFIGURED_SERVER_DOWN状態の場合、エラーを返す', async () => {
83
+ const systemState = {
84
+ state: 'CONFIGURED_SERVER_DOWN',
85
+ config: {},
86
+ configPath: '/test/.search-docs.json',
87
+ projectRoot: '/test',
88
+ serverUrl: 'http://localhost:24280',
89
+ };
90
+ const context = {
91
+ server: mockServer,
92
+ systemState,
93
+ refreshSystemState: async () => { },
94
+ };
95
+ // ツール登録
96
+ registerIndexStatusTool(context);
97
+ // ツールハンドラを実行
98
+ await expect(registeredTool.handler()).rejects.toThrow('起動していません');
99
+ });
100
+ it('client.getStatus()がエラーの場合、エラーを返す', async () => {
101
+ const mockClient = {
102
+ getStatus: vi.fn().mockRejectedValue(new Error('Connection error')),
103
+ };
104
+ const systemState = {
105
+ state: 'RUNNING',
106
+ config: {},
107
+ configPath: '/test/.search-docs.json',
108
+ projectRoot: '/test',
109
+ serverUrl: 'http://localhost:24280',
110
+ client: mockClient,
111
+ };
112
+ const context = {
113
+ server: mockServer,
114
+ systemState,
115
+ refreshSystemState: async () => { },
116
+ };
117
+ // ツール登録
118
+ registerIndexStatusTool(context);
119
+ // ツールハンドラを実行
120
+ await expect(registeredTool.handler()).rejects.toThrow('ステータス取得エラー');
121
+ });
122
+ });
123
+ //# sourceMappingURL=index-status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-status.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/index-status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * get_document ツール
3
+ * 文書の内容を取得する
4
+ */
5
+ import type { ToolRegistrationContext } from './types.js';
6
+ /**
7
+ * get_document ツールを登録
8
+ */
9
+ export declare function registerGetDocumentTool(context: ToolRegistrationContext): void;
10
+ //# sourceMappingURL=get-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document.d.ts","sourceRoot":"","sources":["../../src/tools/get-document.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAwE9E"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * get_document ツール
3
+ * 文書の内容を取得する
4
+ */
5
+ import { z } from 'zod';
6
+ import { getStateErrorMessage } from '../state.js';
7
+ import { getDepthLabel } from '../utils.js';
8
+ /**
9
+ * get_document ツールを登録
10
+ */
11
+ export function registerGetDocumentTool(context) {
12
+ const { server, systemState } = context;
13
+ server.registerTool('get_document', {
14
+ description: '文書の内容を取得します。パス指定で文書全体、またはセクションIDで特定セクションを取得できます。pathとsectionIdのどちらか一方は必須です。',
15
+ inputSchema: {
16
+ path: z.string().optional().describe('文書パス(sectionIdを指定しない場合は必須)'),
17
+ sectionId: z.string().optional().describe('セクションID(検索結果から取得。pathを指定しない場合は必須)'),
18
+ },
19
+ }, async (args) => {
20
+ // 状態チェック
21
+ if (systemState.state !== 'RUNNING') {
22
+ throw new Error(getStateErrorMessage(systemState.state, '文書の取得'));
23
+ }
24
+ const { path: documentPath, sectionId } = args;
25
+ // どちらか一方は必須
26
+ if (!documentPath && !sectionId) {
27
+ throw new Error('pathまたはsectionIdのどちらか一方を指定してください');
28
+ }
29
+ const client = systemState.client;
30
+ try {
31
+ const response = await client.getDocument({ path: documentPath, sectionId });
32
+ if (!response.document && !response.section) {
33
+ throw new Error(`Document or section not found`);
34
+ }
35
+ let resultText = '';
36
+ // セクション取得の場合
37
+ if (sectionId && response.section) {
38
+ resultText += `セクション: ${response.section.heading || '(no heading)'}\n`;
39
+ resultText += `文書: ${response.section.documentPath}\n`;
40
+ const depthLabel = getDepthLabel(response.section.depth);
41
+ const sectionPath = response.section.sectionNumber.join('-');
42
+ resultText += `Level: ${depthLabel} | Section: ${sectionPath} | Line: ${response.section.startLine}-${response.section.endLine}\n\n`;
43
+ resultText += `内容:\n${'='.repeat(60)}\n`;
44
+ resultText += response.section.content;
45
+ resultText += `\n${'='.repeat(60)}`;
46
+ }
47
+ else if (response.document) {
48
+ // 文書全体取得の場合
49
+ resultText += `文書: ${response.document.path}\n`;
50
+ if (response.document.metadata.title) {
51
+ resultText += `タイトル: ${response.document.metadata.title}\n`;
52
+ }
53
+ resultText += `作成日: ${new Date(response.document.metadata.createdAt).toLocaleString()}\n`;
54
+ resultText += `更新日: ${new Date(response.document.metadata.updatedAt).toLocaleString()}\n\n`;
55
+ resultText += `内容:\n${'='.repeat(60)}\n`;
56
+ resultText += response.document.content;
57
+ resultText += `\n${'='.repeat(60)}`;
58
+ }
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: resultText,
64
+ },
65
+ ],
66
+ };
67
+ }
68
+ catch (error) {
69
+ throw new Error(`文書取得エラー: ${error.message}`);
70
+ }
71
+ });
72
+ }
73
+ //# sourceMappingURL=get-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-document.js","sourceRoot":"","sources":["../../src/tools/get-document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * index_status ツール
3
+ * インデックスの状態を確認する
4
+ */
5
+ import type { ToolRegistrationContext } from './types.js';
6
+ /**
7
+ * index_status ツールを登録
8
+ */
9
+ export declare function registerIndexStatusTool(context: ToolRegistrationContext): void;
10
+ //# sourceMappingURL=index-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-status.d.ts","sourceRoot":"","sources":["../../src/tools/index-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAmD9E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * index_status ツール
3
+ * インデックスの状態を確認する
4
+ */
5
+ import { getStateErrorMessage } from '../state.js';
6
+ /**
7
+ * index_status ツールを登録
8
+ */
9
+ export function registerIndexStatusTool(context) {
10
+ const { server, systemState } = context;
11
+ server.registerTool('index_status', {
12
+ description: 'インデックスの状態を確認します。総文書数、セクション数、Dirtyセクション数などを表示します。',
13
+ inputSchema: {},
14
+ }, async () => {
15
+ // 状態チェック
16
+ if (systemState.state !== 'RUNNING') {
17
+ throw new Error(getStateErrorMessage(systemState.state, 'インデックス状態の確認'));
18
+ }
19
+ const client = systemState.client;
20
+ try {
21
+ const response = await client.getStatus();
22
+ let statusText = '📊 インデックス状態\n\n';
23
+ statusText += `サーバ情報:\n`;
24
+ statusText += ` バージョン: ${response.server.version}\n`;
25
+ statusText += ` 起動時間: ${(response.server.uptime / 1000).toFixed(1)}秒\n`;
26
+ statusText += ` PID: ${response.server.pid}\n\n`;
27
+ statusText += `インデックス情報:\n`;
28
+ statusText += ` 総文書数: ${response.index.totalDocuments}件\n`;
29
+ statusText += ` 総セクション数: ${response.index.totalSections}件\n`;
30
+ statusText += ` Dirtyセクション: ${response.index.dirtyCount}件\n`;
31
+ if (response.worker) {
32
+ statusText += `\nワーカー情報:\n`;
33
+ statusText += ` 実行中: ${response.worker.running ? 'Yes' : 'No'}\n`;
34
+ statusText += ` 処理中: ${response.worker.processing}件\n`;
35
+ statusText += ` キュー: ${response.worker.queue}件\n`;
36
+ }
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: statusText,
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ catch (error) {
47
+ throw new Error(`ステータス取得エラー: ${error.message}`);
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=index-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-status.js","sourceRoot":"","sources":["../../src/tools/index-status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAgC;IACtE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,SAAS;QACT,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAO,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAE1C,IAAI,UAAU,GAAG,iBAAiB,CAAC;YACnC,UAAU,IAAI,UAAU,CAAC;YACzB,UAAU,IAAI,YAAY,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC;YACtD,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YACzE,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAElD,UAAU,IAAI,aAAa,CAAC;YAC5B,UAAU,IAAI,WAAW,QAAQ,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC;YAC5D,UAAU,IAAI,cAAc,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC;YAC9D,UAAU,IAAI,iBAAiB,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC;YAE9D,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,UAAU,IAAI,aAAa,CAAC;gBAC5B,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBACnE,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,UAAU,KAAK,CAAC;gBACxD,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;YACrD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,eAAgB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ツール登録のエクスポート
3
+ */
4
+ export { registerSearchTool } from './search.js';
5
+ export { registerGetDocumentTool } from './get-document.js';
6
+ export { registerIndexStatusTool } from './index-status.js';
7
+ export { registerInitTool } from './init.js';
8
+ export { registerServerStartTool, registerServerStopTool } from './server-control.js';
9
+ export { registerSystemStatusTool } from './system-status.js';
10
+ export type { ToolRegistrationContext } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ツール登録のエクスポート
3
+ */
4
+ // 既存ツール
5
+ export { registerSearchTool } from './search.js';
6
+ export { registerGetDocumentTool } from './get-document.js';
7
+ export { registerIndexStatusTool } from './index-status.js';
8
+ // 新規ツール
9
+ export { registerInitTool } from './init.js';
10
+ export { registerServerStartTool, registerServerStopTool } from './server-control.js';
11
+ export { registerSystemStatusTool } from './system-status.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * init ツール
3
+ * search-docsの設定ファイルを初期化する
4
+ */
5
+ import type { ToolRegistrationContext } from './types.js';
6
+ /**
7
+ * init ツールを登録
8
+ */
9
+ export declare function registerInitTool(context: ToolRegistrationContext): void;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAsEvE"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * init ツール
3
+ * search-docsの設定ファイルを初期化する
4
+ */
5
+ import { z } from 'zod';
6
+ import { initConfig } from '@search-docs/cli/commands/config/init';
7
+ /**
8
+ * init ツールを登録
9
+ */
10
+ export function registerInitTool(context) {
11
+ const { server, systemState } = context;
12
+ server.registerTool('init', {
13
+ description: 'search-docsの設定ファイルを初期化します。プロジェクトで初めてsearch-docsを使用する場合に実行してください。既存の設定ファイルがある場合、forceオプションを指定しない限り上書きしません。',
14
+ inputSchema: {
15
+ port: z
16
+ .number()
17
+ .optional()
18
+ .describe('サーバポート番号(省略時はランダムなポート番号が割り当てられます)'),
19
+ force: z
20
+ .boolean()
21
+ .optional()
22
+ .describe('既存設定を上書き(デフォルト: false)'),
23
+ },
24
+ }, async (args) => {
25
+ const { port, force } = args;
26
+ try {
27
+ // CLIのinitConfig関数を呼び出し
28
+ await initConfig({
29
+ port,
30
+ force,
31
+ cwd: systemState.projectRoot,
32
+ });
33
+ let resultText = '✅ 設定ファイルの初期化が完了しました。\n\n';
34
+ if (force) {
35
+ resultText += '既存の設定ファイルを上書きしました。\n\n';
36
+ }
37
+ resultText += '📝 設定ファイルの重要な項目:\n\n';
38
+ resultText += '**files.include**: インデックス対象ファイルのパターン\n';
39
+ resultText += ' - デフォルト: ["**/*.md", "docs/**/*.txt"]\n';
40
+ resultText += ' - プロジェクトに応じてパターンを調整してください\n\n';
41
+ resultText += '**files.exclude**: 除外するファイルパターン\n';
42
+ resultText += ' - デフォルト: node_modules, .git, dist, buildを除外\n';
43
+ resultText += ' - 必要に応じて追加してください\n\n';
44
+ resultText += '**indexing.maxDepth**: セクション分割の最大深度(0-3)\n';
45
+ resultText += ' - 0: 文書全体のみ\n';
46
+ resultText += ' - 1: 章レベルまで分割\n';
47
+ resultText += ' - 2: 節レベルまで分割\n';
48
+ resultText += ' - 3: 項レベルまで分割(デフォルト)\n\n';
49
+ resultText += '**indexing.maxTokensPerSection**: セクションの最大トークン数\n';
50
+ resultText += ' - デフォルト: 2000トークン\n';
51
+ resultText += ' - 大きくすると粗い分割、小さくすると細かい分割になります\n\n';
52
+ resultText += '次のステップ:\n';
53
+ resultText += ' 1. 設定を調整(必要に応じて): .search-docs.jsonを編集\n';
54
+ resultText += ' 2. サーバを起動: server_start\n';
55
+ resultText += ' 3. システム状態を確認: get_system_status\n';
56
+ resultText += ' 4. 文書を検索: search\n';
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: resultText,
62
+ },
63
+ ],
64
+ };
65
+ }
66
+ catch (error) {
67
+ throw new Error(`設定ファイルの初期化に失敗しました: ${error.message}`);
68
+ }
69
+ });
70
+ }
71
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAGnE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;YAChD,KAAK,EAAE,CAAC;iBACL,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EACD,KAAK,EAAE,IAAwC,EAAE,EAAE;QACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,UAAU,CAAC;gBACf,IAAI;gBACJ,KAAK;gBACL,GAAG,EAAE,WAAW,CAAC,WAAW;aAC7B,CAAC,CAAC;YAEH,IAAI,UAAU,GAAG,0BAA0B,CAAC;YAE5C,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,IAAI,wBAAwB,CAAC;YACzC,CAAC;YAED,UAAU,IAAI,sBAAsB,CAAC;YACrC,UAAU,IAAI,wCAAwC,CAAC;YACvD,UAAU,IAAI,2CAA2C,CAAC;YAC1D,UAAU,IAAI,iCAAiC,CAAC;YAChD,UAAU,IAAI,mCAAmC,CAAC;YAClD,UAAU,IAAI,iDAAiD,CAAC;YAChE,UAAU,IAAI,wBAAwB,CAAC;YACvC,UAAU,IAAI,4CAA4C,CAAC;YAC3D,UAAU,IAAI,iBAAiB,CAAC;YAChC,UAAU,IAAI,mBAAmB,CAAC;YAClC,UAAU,IAAI,mBAAmB,CAAC;YAClC,UAAU,IAAI,4BAA4B,CAAC;YAC3C,UAAU,IAAI,mDAAmD,CAAC;YAClE,UAAU,IAAI,uBAAuB,CAAC;YACtC,UAAU,IAAI,qCAAqC,CAAC;YACpD,UAAU,IAAI,WAAW,CAAC;YAC1B,UAAU,IAAI,4CAA4C,CAAC;YAC3D,UAAU,IAAI,6BAA6B,CAAC;YAC5C,UAAU,IAAI,qCAAqC,CAAC;YACpD,UAAU,IAAI,sBAAsB,CAAC;YAErC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU;qBACjB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * search ツール
3
+ * 文書を検索する
4
+ */
5
+ import type { ToolRegistrationContext } from './types.js';
6
+ /**
7
+ * search ツールを登録
8
+ */
9
+ export declare function registerSearchTool(context: ToolRegistrationContext): void;
10
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAmGzE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * search ツール
3
+ * 文書を検索する
4
+ */
5
+ import { z } from 'zod';
6
+ import { getStateErrorMessage } from '../state.js';
7
+ import { getDepthLabel, getPreviewContent } from '../utils.js';
8
+ /**
9
+ * search ツールを登録
10
+ */
11
+ export function registerSearchTool(context) {
12
+ const { server, systemState } = context;
13
+ server.registerTool('search', {
14
+ description: '文書を検索します。クエリに基づいてVector検索を実行し、関連する文書セクションを返します。検索結果には行番号(startLine-endLine)とセクションIDが含まれるため、Readツールで該当箇所を直接参照したり、get_documentでセクション全体を取得できます。',
15
+ inputSchema: {
16
+ query: z.string().describe('検索クエリ'),
17
+ depth: z
18
+ .number()
19
+ .optional()
20
+ .describe('最大深度(0-3)。この深度まで検索します。0=文書全体のみ、1=章まで、2=節まで、3=項まで。省略時は全階層を検索'),
21
+ limit: z.number().optional().describe('結果数制限(デフォルト: 10)'),
22
+ includeCleanOnly: z
23
+ .boolean()
24
+ .optional()
25
+ .describe('最新の文書内容のみを検索対象とする。falseの場合、文書が更新されていても古いインデックスも含めて検索します(デフォルト: false)'),
26
+ previewLines: z.number().optional().describe('プレビュー行数(デフォルト: 5)'),
27
+ },
28
+ }, async (args) => {
29
+ // 状態チェック
30
+ if (systemState.state !== 'RUNNING') {
31
+ throw new Error(getStateErrorMessage(systemState.state, '文書の検索'));
32
+ }
33
+ const { query, depth, limit, includeCleanOnly, previewLines = 5 } = args;
34
+ const client = systemState.client;
35
+ try {
36
+ const response = await client.search({
37
+ query,
38
+ options: {
39
+ depth,
40
+ limit,
41
+ includeCleanOnly,
42
+ },
43
+ });
44
+ // 結果を整形
45
+ let resultText = `検索結果: ${response.total}件\n`;
46
+ resultText += `処理時間: ${response.took}ms\n\n`;
47
+ if (response.results.length === 0) {
48
+ resultText += '該当する結果が見つかりませんでした。';
49
+ }
50
+ else {
51
+ response.results.forEach((result, index) => {
52
+ // ヘッダー行
53
+ const heading = result.heading || '(no heading)';
54
+ resultText += `${index + 1}. ${result.documentPath} > ${heading}\n`;
55
+ // メタデータ(1行にまとめる)
56
+ const depthLabel = getDepthLabel(result.depth);
57
+ const sectionPath = result.sectionNumber.join('-');
58
+ const metaParts = [
59
+ `Level: ${depthLabel}`,
60
+ `Section: ${sectionPath}`,
61
+ `Line: ${result.startLine}-${result.endLine}`,
62
+ `Score: ${result.score.toFixed(4)}`,
63
+ ];
64
+ // indexStatusが'updating'または'outdated'の場合のみ表示
65
+ if (result.indexStatus === 'updating' || result.indexStatus === 'outdated') {
66
+ metaParts.push(`Status: ${result.indexStatus}`);
67
+ }
68
+ resultText += metaParts.join(' | ') + '\n\n';
69
+ // コンテンツ(引用として明確に)
70
+ resultText += '```markdown\n';
71
+ const preview = getPreviewContent(result.content, previewLines);
72
+ resultText += preview + '\n';
73
+ resultText += '```\n\n';
74
+ // セクションID(get_documentで取得するため)
75
+ resultText += `(セクションID: ${result.id})\n\n`;
76
+ });
77
+ }
78
+ return {
79
+ content: [
80
+ {
81
+ type: 'text',
82
+ text: resultText,
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ catch (error) {
88
+ throw new Error(`検索エラー: ${error.message}`);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=search.js.map