sqlew 3.5.3 → 3.6.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 (257) hide show
  1. package/CHANGELOG.md +247 -1772
  2. package/README.md +70 -304
  3. package/assets/config.example.toml +106 -0
  4. package/dist/adapters/index.d.ts +11 -0
  5. package/dist/adapters/index.d.ts.map +1 -0
  6. package/dist/adapters/index.js +21 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/adapters/mysql-adapter.d.ts +31 -0
  9. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  10. package/dist/adapters/mysql-adapter.js +63 -0
  11. package/dist/adapters/mysql-adapter.js.map +1 -0
  12. package/dist/adapters/postgresql-adapter.d.ts +31 -0
  13. package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
  14. package/dist/adapters/postgresql-adapter.js +63 -0
  15. package/dist/adapters/postgresql-adapter.js.map +1 -0
  16. package/dist/adapters/sqlite-adapter.d.ts +37 -0
  17. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  18. package/dist/adapters/sqlite-adapter.js +129 -0
  19. package/dist/adapters/sqlite-adapter.js.map +1 -0
  20. package/dist/adapters/types.d.ts +33 -0
  21. package/dist/adapters/types.d.ts.map +1 -0
  22. package/dist/adapters/types.js +2 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/cli.js +55 -54
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config/example-generator.d.ts +11 -0
  27. package/dist/config/example-generator.d.ts.map +1 -0
  28. package/dist/config/example-generator.js +48 -0
  29. package/dist/config/example-generator.js.map +1 -0
  30. package/dist/config/loader.d.ts.map +1 -1
  31. package/dist/config/loader.js +4 -0
  32. package/dist/config/loader.js.map +1 -1
  33. package/dist/config/types.d.ts +11 -0
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/config/types.js.map +1 -1
  36. package/dist/database.d.ts +56 -121
  37. package/dist/database.d.ts.map +1 -1
  38. package/dist/database.js +266 -414
  39. package/dist/database.js.map +1 -1
  40. package/dist/index.js +329 -245
  41. package/dist/index.js.map +1 -1
  42. package/dist/knexfile.d.ts +6 -0
  43. package/dist/knexfile.d.ts.map +1 -0
  44. package/dist/knexfile.js +85 -0
  45. package/dist/knexfile.js.map +1 -0
  46. package/dist/migrations/add-help-system-tables.d.ts +35 -0
  47. package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
  48. package/dist/migrations/add-help-system-tables.js +206 -0
  49. package/dist/migrations/add-help-system-tables.js.map +1 -0
  50. package/dist/migrations/add-token-tracking.d.ts +28 -0
  51. package/dist/migrations/add-token-tracking.d.ts.map +1 -0
  52. package/dist/migrations/add-token-tracking.js +108 -0
  53. package/dist/migrations/add-token-tracking.js.map +1 -0
  54. package/dist/migrations/index.d.ts +25 -12
  55. package/dist/migrations/index.d.ts.map +1 -1
  56. package/dist/migrations/index.js +147 -20
  57. package/dist/migrations/index.js.map +1 -1
  58. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
  59. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
  60. package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
  61. package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
  62. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
  63. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
  64. package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
  65. package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
  66. package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
  67. package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
  68. package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
  69. package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
  70. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
  71. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
  72. package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
  73. package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
  74. package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
  75. package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
  76. package/dist/migrations/knex/20251025070349_create_views.js +143 -0
  77. package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
  78. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
  79. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  80. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
  81. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  82. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
  83. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  84. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
  85. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  86. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
  87. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
  88. package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
  89. package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
  90. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
  91. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  92. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
  93. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  94. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
  95. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
  96. package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
  97. package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
  98. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
  99. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  100. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
  101. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
  102. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
  103. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  104. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
  105. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  106. package/dist/migrations/knex/20251027000000_add_agent_reuse_system.d.ts +14 -0
  107. package/dist/migrations/knex/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
  108. package/dist/migrations/knex/20251027000000_add_agent_reuse_system.js +34 -0
  109. package/dist/migrations/knex/20251027000000_add_agent_reuse_system.js.map +1 -0
  110. package/dist/migrations/knex/20251027010000_add_task_constraint_to_decision_context.d.ts +4 -0
  111. package/dist/migrations/knex/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
  112. package/dist/migrations/knex/20251027010000_add_task_constraint_to_decision_context.js +24 -0
  113. package/dist/migrations/knex/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
  114. package/dist/migrations/knex/20251027020000_update_agent_reusability.d.ts +16 -0
  115. package/dist/migrations/knex/20251027020000_update_agent_reusability.d.ts.map +1 -0
  116. package/dist/migrations/knex/20251027020000_update_agent_reusability.js +27 -0
  117. package/dist/migrations/knex/20251027020000_update_agent_reusability.js.map +1 -0
  118. package/dist/migrations/seed-help-data.d.ts +48 -0
  119. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  120. package/dist/migrations/seed-help-data.js +1466 -0
  121. package/dist/migrations/seed-help-data.js.map +1 -0
  122. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  123. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  124. package/dist/migrations/seed-tool-metadata.js +392 -0
  125. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  126. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  127. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  128. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  129. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  130. package/dist/schema.d.ts.map +1 -1
  131. package/dist/schema.js +2 -0
  132. package/dist/schema.js.map +1 -1
  133. package/dist/tests/agent-reuse.test.d.ts +6 -0
  134. package/dist/tests/agent-reuse.test.d.ts.map +1 -0
  135. package/dist/tests/agent-reuse.test.js +242 -0
  136. package/dist/tests/agent-reuse.test.js.map +1 -0
  137. package/dist/tests/all-features.test.d.ts +7 -0
  138. package/dist/tests/all-features.test.d.ts.map +1 -0
  139. package/dist/tests/all-features.test.js +514 -0
  140. package/dist/tests/all-features.test.js.map +1 -0
  141. package/dist/tests/git-aware-completion.test.js +89 -70
  142. package/dist/tests/git-aware-completion.test.js.map +1 -1
  143. package/dist/tests/help-system.test.d.ts +23 -0
  144. package/dist/tests/help-system.test.d.ts.map +1 -0
  145. package/dist/tests/help-system.test.js +374 -0
  146. package/dist/tests/help-system.test.js.map +1 -0
  147. package/dist/tests/tasks.auto-pruning-decision-link.test.js +92 -78
  148. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -1
  149. package/dist/tests/tasks.auto-pruning-partial.test.js +106 -95
  150. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
  151. package/dist/tests/tasks.auto-pruning-persistence.test.js +115 -97
  152. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -1
  153. package/dist/tests/tasks.auto-pruning-safety.test.js +124 -103
  154. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -1
  155. package/dist/tests/tasks.dependencies.test.js +338 -307
  156. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  157. package/dist/tests/tasks.link-file-backward-compat.test.js +116 -104
  158. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  159. package/dist/tests/tasks.watch-files-action.test.js +122 -101
  160. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  161. package/dist/tests/tasks.watch-files-parameter.test.js +105 -94
  162. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
  163. package/dist/tests/two-step-git-completion.test.js +176 -133
  164. package/dist/tests/two-step-git-completion.test.js.map +1 -1
  165. package/dist/tests/vcs-staging.test.js +1 -1
  166. package/dist/tests/vcs-staging.test.js.map +1 -1
  167. package/dist/tools/config.d.ts +9 -6
  168. package/dist/tools/config.d.ts.map +1 -1
  169. package/dist/tools/config.js +16 -14
  170. package/dist/tools/config.js.map +1 -1
  171. package/dist/tools/constraints.d.ts +10 -7
  172. package/dist/tools/constraints.d.ts.map +1 -1
  173. package/dist/tools/constraints.js +73 -51
  174. package/dist/tools/constraints.js.map +1 -1
  175. package/dist/tools/context.d.ts +36 -33
  176. package/dist/tools/context.d.ts.map +1 -1
  177. package/dist/tools/context.js +441 -340
  178. package/dist/tools/context.js.map +1 -1
  179. package/dist/tools/files.d.ts +12 -9
  180. package/dist/tools/files.d.ts.map +1 -1
  181. package/dist/tools/files.js +173 -95
  182. package/dist/tools/files.js.map +1 -1
  183. package/dist/tools/help-queries.d.ts +130 -0
  184. package/dist/tools/help-queries.d.ts.map +1 -0
  185. package/dist/tools/help-queries.js +393 -0
  186. package/dist/tools/help-queries.js.map +1 -0
  187. package/dist/tools/messaging.d.ts +14 -11
  188. package/dist/tools/messaging.d.ts.map +1 -1
  189. package/dist/tools/messaging.js +239 -133
  190. package/dist/tools/messaging.js.map +1 -1
  191. package/dist/tools/tasks.d.ts +18 -16
  192. package/dist/tools/tasks.d.ts.map +1 -1
  193. package/dist/tools/tasks.js +519 -442
  194. package/dist/tools/tasks.js.map +1 -1
  195. package/dist/tools/utils.d.ts +14 -11
  196. package/dist/tools/utils.d.ts.map +1 -1
  197. package/dist/tools/utils.js +90 -122
  198. package/dist/tools/utils.js.map +1 -1
  199. package/dist/types.d.ts +1 -0
  200. package/dist/types.d.ts.map +1 -1
  201. package/dist/utils/activity-logging.d.ts +114 -0
  202. package/dist/utils/activity-logging.d.ts.map +1 -0
  203. package/dist/utils/activity-logging.js +162 -0
  204. package/dist/utils/activity-logging.js.map +1 -0
  205. package/dist/utils/batch.d.ts +2 -2
  206. package/dist/utils/batch.d.ts.map +1 -1
  207. package/dist/utils/batch.js +8 -8
  208. package/dist/utils/batch.js.map +1 -1
  209. package/dist/utils/cleanup.d.ts +24 -14
  210. package/dist/utils/cleanup.d.ts.map +1 -1
  211. package/dist/utils/cleanup.js +37 -27
  212. package/dist/utils/cleanup.js.map +1 -1
  213. package/dist/utils/debug-logger.d.ts +99 -0
  214. package/dist/utils/debug-logger.d.ts.map +1 -0
  215. package/dist/utils/debug-logger.js +267 -0
  216. package/dist/utils/debug-logger.js.map +1 -0
  217. package/dist/utils/error-handler.d.ts +28 -0
  218. package/dist/utils/error-handler.d.ts.map +1 -0
  219. package/dist/utils/error-handler.js +121 -0
  220. package/dist/utils/error-handler.js.map +1 -0
  221. package/dist/utils/help-tracking.d.ts +55 -0
  222. package/dist/utils/help-tracking.d.ts.map +1 -0
  223. package/dist/utils/help-tracking.js +88 -0
  224. package/dist/utils/help-tracking.js.map +1 -0
  225. package/dist/utils/param-parser.d.ts +23 -0
  226. package/dist/utils/param-parser.d.ts.map +1 -0
  227. package/dist/utils/param-parser.js +52 -0
  228. package/dist/utils/param-parser.js.map +1 -0
  229. package/dist/utils/retention.d.ts +17 -7
  230. package/dist/utils/retention.d.ts.map +1 -1
  231. package/dist/utils/retention.js +31 -12
  232. package/dist/utils/retention.js.map +1 -1
  233. package/dist/utils/task-stale-detection.d.ts +15 -13
  234. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  235. package/dist/utils/task-stale-detection.js +100 -302
  236. package/dist/utils/task-stale-detection.js.map +1 -1
  237. package/dist/utils/token-estimation.d.ts +72 -0
  238. package/dist/utils/token-estimation.d.ts.map +1 -0
  239. package/dist/utils/token-estimation.js +71 -0
  240. package/dist/utils/token-estimation.js.map +1 -0
  241. package/dist/utils/token-logging.d.ts +48 -0
  242. package/dist/utils/token-logging.d.ts.map +1 -0
  243. package/dist/utils/token-logging.js +112 -0
  244. package/dist/utils/token-logging.js.map +1 -0
  245. package/dist/utils/view-queries.d.ts +34 -0
  246. package/dist/utils/view-queries.d.ts.map +1 -0
  247. package/dist/utils/view-queries.js +192 -0
  248. package/dist/utils/view-queries.js.map +1 -0
  249. package/dist/watcher/file-watcher.d.ts.map +1 -1
  250. package/dist/watcher/file-watcher.js +25 -11
  251. package/dist/watcher/file-watcher.js.map +1 -1
  252. package/docs/BEST_PRACTICES.md +56 -448
  253. package/docs/MIGRATION_v3.6.0.md +170 -0
  254. package/docs/SHARED_CONCEPTS.md +63 -208
  255. package/docs/TASK_OVERVIEW.md +2 -2
  256. package/docs/TOOL_SELECTION.md +41 -248
  257. package/package.json +17 -4
package/dist/index.js CHANGED
@@ -6,8 +6,9 @@
6
6
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
7
7
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
8
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
9
- import { initializeDatabase, closeDatabase, setConfigValue, getAllConfig } from './database.js';
9
+ import { initializeDatabase, closeDatabase, setConfigValue, getAllConfig, getAdapter } from './database.js';
10
10
  import { CONFIG_KEYS } from './constants.js';
11
+ import { loadConfigFile } from './config/loader.js';
11
12
  import { setDecision, getContext, getDecision, searchByTags, getVersions, searchByLayer, quickSetDecision, searchAdvanced, setDecisionBatch, hasUpdates, setFromTemplate, createTemplate, listTemplates, hardDeleteDecision, addDecisionContextAction, listDecisionContextsAction, decisionHelp, decisionExample } from './tools/context.js';
12
13
  import { sendMessage, getMessages, markRead, sendMessageBatch, messageHelp, messageExample } from './tools/messaging.js';
13
14
  import { recordFileChange, getFileChanges, checkFileLock, recordFileChangeBatch, fileHelp, fileExample } from './tools/files.js';
@@ -16,6 +17,11 @@ import { getLayerSummary, clearOldData, getStats, getActivityLog, flushWAL, stat
16
17
  import { getConfig, updateConfig, configHelp, configExample } from './tools/config.js';
17
18
  import { createTask, updateTask, getTask, listTasks, moveTask, linkTask, archiveTask, batchCreateTasks, addDependency, removeDependency, getDependencies, watchFiles, getPrunedFiles, linkPrunedFile, taskHelp, taskExample, watcherStatus } from './tools/tasks.js';
18
19
  import { FileWatcher } from './watcher/index.js';
20
+ import { trackAndReturnHelp } from './utils/help-tracking.js';
21
+ import { queryHelpAction, queryHelpParams, queryHelpTool, queryHelpUseCase, queryHelpListUseCases, queryHelpNextActions } from './tools/help-queries.js';
22
+ import { initDebugLogger, closeDebugLogger, debugLog, debugLogToolCall, debugLogToolResponse } from './utils/debug-logger.js';
23
+ import { handleToolError, handleInitializationError, setupGlobalErrorHandlers } from './utils/error-handler.js';
24
+ import { ensureSqlewDirectory } from './config/example-generator.js';
19
25
  // Parse command-line arguments
20
26
  const args = process.argv.slice(2);
21
27
  const parsedArgs = {};
@@ -46,6 +52,12 @@ for (let i = 0; i < args.length; i++) {
46
52
  else if (arg === '--autodelete-file-history-days' && i + 1 < args.length) {
47
53
  parsedArgs.autodeleteFileHistoryDays = parseInt(args[++i], 10);
48
54
  }
55
+ else if (arg.startsWith('--debug-log=')) {
56
+ parsedArgs.debugLogPath = arg.split('=')[1];
57
+ }
58
+ else if (arg === '--debug-log' && i + 1 < args.length) {
59
+ parsedArgs.debugLogPath = args[++i];
60
+ }
49
61
  else if (!arg.startsWith('--')) {
50
62
  // Backward compatibility: first non-flag argument is dbPath
51
63
  if (!parsedArgs.dbPath) {
@@ -53,33 +65,12 @@ for (let i = 0; i < args.length; i++) {
53
65
  }
54
66
  }
55
67
  }
56
- const dbPath = parsedArgs.dbPath;
57
- // Initialize database
68
+ // Load config file and determine database path
69
+ // Priority: CLI --db-path > config file > default
70
+ const fileConfig = loadConfigFile();
71
+ const dbPath = parsedArgs.dbPath || fileConfig.database?.path;
72
+ // Initialize database (will be set after async init completes)
58
73
  let db;
59
- try {
60
- db = initializeDatabase(dbPath);
61
- // Apply CLI config overrides if provided
62
- if (parsedArgs.autodeleteIgnoreWeekend !== undefined) {
63
- setConfigValue(db, CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND, parsedArgs.autodeleteIgnoreWeekend ? '1' : '0');
64
- }
65
- if (parsedArgs.autodeleteMessageHours !== undefined) {
66
- setConfigValue(db, CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS, String(parsedArgs.autodeleteMessageHours));
67
- }
68
- if (parsedArgs.autodeleteFileHistoryDays !== undefined) {
69
- setConfigValue(db, CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS, String(parsedArgs.autodeleteFileHistoryDays));
70
- }
71
- // Display current config
72
- const config = getAllConfig(db);
73
- const ignoreWeekend = config[CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND] === '1';
74
- const messageHours = config[CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS];
75
- const fileHistoryDays = config[CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS];
76
- console.error('✓ MCP Shared Context Server initialized');
77
- console.error(` Auto-delete config: messages=${messageHours}h, file_history=${fileHistoryDays}d, ignore_weekend=${ignoreWeekend}`);
78
- }
79
- catch (error) {
80
- console.error('✗ Failed to initialize database:', error);
81
- process.exit(1);
82
- }
83
74
  // Create MCP server
84
75
  const server = new Server({
85
76
  name: 'mcp-sqlew',
@@ -100,55 +91,16 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
100
91
  Context Management - Store decisions with metadata (tags, layers, versions, scopes)
101
92
 
102
93
  Use action: "help" for detailed documentation.
103
- Use action: "example" for comprehensive usage examples.`,
94
+ Use action: "example" for comprehensive usage examples.
95
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
104
96
  inputSchema: {
105
97
  type: 'object',
106
98
  properties: {
107
99
  action: {
108
100
  type: 'string',
109
101
  description: 'Action',
110
- enum: ['set', 'get', 'list', 'search_tags', 'search_layer', 'versions', 'quick_set', 'search_advanced', 'set_batch', 'has_updates', 'set_from_template', 'create_template', 'list_templates', 'hard_delete', 'add_decision_context', 'list_decision_contexts', 'help', 'example']
111
- },
112
- key: { type: 'string' },
113
- value: { type: ['string', 'number'] },
114
- agent: { type: 'string' },
115
- layer: { type: 'string', enum: ['presentation', 'business', 'data', 'infrastructure', 'cross-cutting'] },
116
- version: { type: 'string' },
117
- status: { type: 'string', enum: ['active', 'deprecated', 'draft'] },
118
- tags: { type: 'array', items: { type: 'string' } },
119
- scopes: { type: 'array', items: { type: 'string' } },
120
- scope: { type: 'string' },
121
- tag_match: { type: 'string', enum: ['AND', 'OR'] },
122
- include_tags: { type: 'boolean' },
123
- layers: { type: 'array', items: { type: 'string' } },
124
- tags_all: { type: 'array', items: { type: 'string' } },
125
- tags_any: { type: 'array', items: { type: 'string' } },
126
- exclude_tags: { type: 'array', items: { type: 'string' } },
127
- updated_after: { type: 'string' },
128
- updated_before: { type: 'string' },
129
- decided_by: { type: 'array', items: { type: 'string' } },
130
- statuses: { type: 'array', items: { type: 'string', enum: ['active', 'deprecated', 'draft'] } },
131
- search_text: { type: 'string' },
132
- sort_by: { type: 'string', enum: ['updated', 'key', 'version'] },
133
- sort_order: { type: 'string', enum: ['asc', 'desc'] },
134
- limit: { type: 'number' },
135
- offset: { type: 'number' },
136
- decisions: { type: 'array' },
137
- atomic: { type: 'boolean' },
138
- agent_name: { type: 'string' },
139
- since_timestamp: { type: 'string' },
140
- template: { type: 'string' },
141
- name: { type: 'string' },
142
- defaults: { type: 'object' },
143
- required_fields: { type: 'array', items: { type: 'string' } },
144
- created_by: { type: 'string' },
145
- rationale: { type: 'string' },
146
- alternatives_considered: { type: ['array', 'string'] },
147
- tradeoffs: { type: ['object', 'string'] },
148
- decision_key: { type: 'string' },
149
- related_task_id: { type: 'number' },
150
- related_constraint_id: { type: 'number' },
151
- include_context: { type: 'boolean' },
102
+ enum: ['set', 'get', 'list', 'search_tags', 'search_layer', 'versions', 'quick_set', 'search_advanced', 'set_batch', 'has_updates', 'set_from_template', 'create_template', 'list_templates', 'hard_delete', 'add_decision_context', 'list_decision_contexts', 'help', 'example', 'use_case']
103
+ }
152
104
  },
153
105
  required: ['action'],
154
106
  },
@@ -160,26 +112,16 @@ Use action: "example" for comprehensive usage examples.`,
160
112
  Agent Messaging - Send messages between agents with priority levels and read tracking
161
113
 
162
114
  Use action: "help" for detailed documentation.
163
- Use action: "example" for comprehensive usage examples.`,
115
+ Use action: "example" for comprehensive usage examples.
116
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
164
117
  inputSchema: {
165
118
  type: 'object',
166
119
  properties: {
167
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['send', 'get', 'mark_read', 'send_batch', 'help', 'example'] },
168
- agent_name: { type: 'string' },
169
- from_agent: { type: 'string' },
170
- to_agent: { type: ['string', 'null'] },
171
- msg_type: { type: 'string', enum: ['decision', 'warning', 'request', 'info'] },
172
- message: { type: 'string' },
173
- priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], default: 'medium' },
174
- payload: { type: 'object' },
175
- message_ids: { type: 'array', items: { type: 'number' } },
176
- unread_only: { type: 'boolean', default: false },
177
- msg_type_filter: { type: 'string', enum: ['decision', 'warning', 'request', 'info'] },
178
- priority_filter: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },
179
- limit: { type: 'number', default: 50 },
180
- // send_batch parameters
181
- messages: { type: 'array', description: 'Array of messages for batch operation (max: 50)' },
182
- atomic: { type: 'boolean', description: 'Atomic mode - all succeed or all fail (default: true)' },
120
+ action: {
121
+ type: 'string',
122
+ description: 'Action',
123
+ enum: ['send', 'get', 'mark_read', 'send_batch', 'help', 'example', 'use_case']
124
+ }
183
125
  },
184
126
  required: ['action'],
185
127
  },
@@ -191,22 +133,16 @@ Use action: "example" for comprehensive usage examples.`,
191
133
  File Change Tracking - Track file changes with layer classification and lock detection
192
134
 
193
135
  Use action: "help" for detailed documentation.
194
- Use action: "example" for comprehensive usage examples.`,
136
+ Use action: "example" for comprehensive usage examples.
137
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
195
138
  inputSchema: {
196
139
  type: 'object',
197
140
  properties: {
198
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['record', 'get', 'check_lock', 'record_batch', 'help', 'example'] },
199
- file_path: { type: 'string' },
200
- agent_name: { type: 'string' },
201
- change_type: { type: 'string', enum: ['created', 'modified', 'deleted'] },
202
- layer: { type: 'string', enum: ['presentation', 'business', 'data', 'infrastructure', 'cross-cutting'] },
203
- description: { type: 'string' },
204
- since: { type: 'string' },
205
- limit: { type: 'number' },
206
- lock_duration: { type: 'number' },
207
- // record_batch parameters
208
- file_changes: { type: 'array', description: 'Array of file changes for batch operation (max: 50)' },
209
- atomic: { type: 'boolean', description: 'Atomic mode - all succeed or all fail (default: true)' },
141
+ action: {
142
+ type: 'string',
143
+ description: 'Action',
144
+ enum: ['record', 'get', 'check_lock', 'record_batch', 'help', 'example', 'use_case']
145
+ }
210
146
  },
211
147
  required: ['action'],
212
148
  },
@@ -218,20 +154,16 @@ Use action: "example" for comprehensive usage examples.`,
218
154
  Constraint Management - Manage architectural rules and requirements
219
155
 
220
156
  Use action: "help" for detailed documentation.
221
- Use action: "example" for comprehensive usage examples.`,
157
+ Use action: "example" for comprehensive usage examples.
158
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
222
159
  inputSchema: {
223
160
  type: 'object',
224
161
  properties: {
225
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['add', 'get', 'deactivate', 'help', 'example'] },
226
- constraint_id: { type: 'number' },
227
- category: { type: 'string', enum: ['performance', 'architecture', 'security'] },
228
- constraint_text: { type: 'string' },
229
- priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], default: 'medium' },
230
- layer: { type: 'string', enum: ['presentation', 'business', 'data', 'infrastructure', 'cross-cutting'] },
231
- tags: { type: 'array', items: { type: 'string' } },
232
- created_by: { type: 'string' },
233
- active_only: { type: 'boolean', default: true },
234
- limit: { type: 'number', default: 50 },
162
+ action: {
163
+ type: 'string',
164
+ description: 'Action',
165
+ enum: ['add', 'get', 'deactivate', 'help', 'example', 'use_case']
166
+ }
235
167
  },
236
168
  required: ['action'],
237
169
  },
@@ -243,17 +175,16 @@ Use action: "example" for comprehensive usage examples.`,
243
175
  Statistics & Utilities - View stats, activity logs, manage data cleanup, and WAL checkpoints
244
176
 
245
177
  Use action: "help" for detailed documentation.
246
- Use action: "example" for comprehensive usage examples.`,
178
+ Use action: "example" for comprehensive usage examples.
179
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
247
180
  inputSchema: {
248
181
  type: 'object',
249
182
  properties: {
250
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['layer_summary', 'db_stats', 'clear', 'activity_log', 'flush', 'help', 'example'] },
251
- messages_older_than_hours: { type: 'number' },
252
- file_changes_older_than_days: { type: 'number' },
253
- since: { type: 'string', description: 'Time filter (e.g., "5m", "1h", "2d" or ISO timestamp)' },
254
- agent_names: { type: 'array', items: { type: 'string' }, description: 'Filter by agents' },
255
- actions: { type: 'array', items: { type: 'string' }, description: 'Filter by action types' },
256
- limit: { type: 'number', description: 'Max results (default: 100)' },
183
+ action: {
184
+ type: 'string',
185
+ description: 'Action',
186
+ enum: ['layer_summary', 'db_stats', 'clear', 'activity_log', 'flush', 'help_action', 'help_params', 'help_tool', 'help_use_case', 'help_list_use_cases', 'help_next_actions', 'help', 'example', 'use_case']
187
+ }
257
188
  },
258
189
  required: ['action'],
259
190
  },
@@ -265,14 +196,16 @@ Use action: "example" for comprehensive usage examples.`,
265
196
  Configuration - Manage auto-deletion settings with weekend-aware retention
266
197
 
267
198
  Use action: "help" for detailed documentation.
268
- Use action: "example" for comprehensive usage examples.`,
199
+ Use action: "example" for comprehensive usage examples.
200
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
269
201
  inputSchema: {
270
202
  type: 'object',
271
203
  properties: {
272
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['get', 'update', 'help', 'example'] },
273
- ignoreWeekend: { type: 'boolean' },
274
- messageRetentionHours: { type: 'number', minimum: 1, maximum: 168 },
275
- fileHistoryRetentionDays: { type: 'number', minimum: 1, maximum: 90 },
204
+ action: {
205
+ type: 'string',
206
+ description: 'Action',
207
+ enum: ['get', 'update', 'help', 'example', 'use_case']
208
+ }
276
209
  },
277
210
  required: ['action'],
278
211
  },
@@ -284,40 +217,16 @@ Use action: "example" for comprehensive usage examples.`,
284
217
  Kanban Task Watcher - AI-optimized task management with auto-stale detection
285
218
 
286
219
  Use action: "help" for detailed documentation.
287
- Use action: "example" for comprehensive usage examples.`,
220
+ Use action: "example" for comprehensive usage examples.
221
+ Use action: "use_case" for practical scenarios and when-to-use guidance.`,
288
222
  inputSchema: {
289
223
  type: 'object',
290
224
  properties: {
291
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['create', 'update', 'get', 'list', 'move', 'link', 'archive', 'batch_create', 'add_dependency', 'remove_dependency', 'get_dependencies', 'watch_files', 'watcher', 'help', 'example'] },
292
- task_id: { type: 'number' },
293
- title: { type: 'string' },
294
- description: { type: 'string' },
295
- acceptance_criteria: { type: 'string' },
296
- notes: { type: 'string' },
297
- priority: { type: 'number', minimum: 1, maximum: 4 },
298
- assigned_agent: { type: 'string' },
299
- created_by_agent: { type: 'string' },
300
- layer: { type: 'string', enum: ['presentation', 'business', 'data', 'infrastructure', 'cross-cutting'] },
301
- tags: { type: 'array', items: { type: 'string' } },
302
- status: { type: 'string', enum: ['todo', 'in_progress', 'waiting_review', 'blocked', 'done', 'archived'] },
303
- new_status: { type: 'string', enum: ['todo', 'in_progress', 'waiting_review', 'blocked', 'done', 'archived'] },
304
- link_type: { type: 'string', enum: ['decision', 'constraint', 'file'] },
305
- target_id: { type: ['string', 'number'] },
306
- link_relation: { type: 'string' },
307
- limit: { type: 'number', default: 50 },
308
- offset: { type: 'number', default: 0 },
309
- // watch_files parameters (v3.4.1)
310
- watch_files: { type: 'array', items: { type: 'string' }, description: 'Array of file paths to watch for auto-tracking' },
311
- file_path: { type: 'string', description: 'Single file path (for watch_files action)' },
312
- file_paths: { type: 'array', items: { type: 'string' }, description: 'Array of file paths (for watch_files action)' },
313
- // batch_create parameters
314
- tasks: { type: 'array', description: 'Array of tasks for batch operation (max: 50)' },
315
- atomic: { type: 'boolean', description: 'Atomic mode - all succeed or all fail (default: true)' },
316
- // dependency parameters (v3.2.0)
317
- blocker_task_id: { type: 'number' },
318
- blocked_task_id: { type: 'number' },
319
- include_dependencies: { type: 'boolean' },
320
- include_dependency_counts: { type: 'boolean' },
225
+ action: {
226
+ type: 'string',
227
+ description: 'Action',
228
+ enum: ['create', 'update', 'get', 'list', 'move', 'link', 'archive', 'batch_create', 'add_dependency', 'remove_dependency', 'get_dependencies', 'watch_files', 'watcher', 'help', 'example', 'use_case']
229
+ }
321
230
  },
322
231
  required: ['action'],
323
232
  },
@@ -329,34 +238,37 @@ Use action: "example" for comprehensive usage examples.`,
329
238
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
330
239
  const { name, arguments: args } = request.params;
331
240
  const params = args;
241
+ const action = params.action || 'N/A';
242
+ // Debug logging: Tool call
243
+ debugLogToolCall(name, action, params);
332
244
  try {
333
245
  let result;
334
246
  switch (name) {
335
247
  case 'decision':
336
248
  switch (params.action) {
337
249
  case 'set':
338
- result = setDecision(params);
250
+ result = await setDecision(params);
339
251
  break;
340
252
  case 'get':
341
- result = getDecision(params);
253
+ result = await getDecision(params);
342
254
  break;
343
255
  case 'list':
344
- result = getContext(params);
256
+ result = await getContext(params);
345
257
  break;
346
258
  case 'search_tags':
347
- result = searchByTags({ tags: params.tags, match_mode: params.tag_match, status: params.status, layer: params.layer });
259
+ result = await searchByTags({ tags: params.tags, match_mode: params.tag_match, status: params.status, layer: params.layer });
348
260
  break;
349
261
  case 'search_layer':
350
- result = searchByLayer({ layer: params.layer, status: params.status, include_tags: params.include_tags });
262
+ result = await searchByLayer({ layer: params.layer, status: params.status, include_tags: params.include_tags });
351
263
  break;
352
264
  case 'versions':
353
- result = getVersions(params);
265
+ result = await getVersions(params);
354
266
  break;
355
267
  case 'quick_set':
356
- result = quickSetDecision(params);
268
+ result = await quickSetDecision(params);
357
269
  break;
358
270
  case 'search_advanced':
359
- result = searchAdvanced({
271
+ result = await searchAdvanced({
360
272
  layers: params.layers,
361
273
  tags_all: params.tags_all,
362
274
  tags_any: params.tags_any,
@@ -374,34 +286,46 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
374
286
  });
375
287
  break;
376
288
  case 'set_batch':
377
- result = setDecisionBatch({ decisions: params.decisions, atomic: params.atomic });
289
+ result = await setDecisionBatch({ decisions: params.decisions, atomic: params.atomic });
378
290
  break;
379
291
  case 'has_updates':
380
- result = hasUpdates({ agent_name: params.agent_name, since_timestamp: params.since_timestamp });
292
+ result = await hasUpdates({ agent_name: params.agent_name, since_timestamp: params.since_timestamp });
381
293
  break;
382
294
  case 'set_from_template':
383
- result = setFromTemplate(params);
295
+ result = await setFromTemplate(params);
384
296
  break;
385
297
  case 'create_template':
386
- result = createTemplate(params);
298
+ result = await createTemplate(params);
387
299
  break;
388
300
  case 'list_templates':
389
- result = listTemplates(params);
301
+ result = await listTemplates(params);
390
302
  break;
391
303
  case 'hard_delete':
392
- result = hardDeleteDecision(params);
304
+ result = await hardDeleteDecision(params);
393
305
  break;
394
306
  case 'add_decision_context':
395
- result = addDecisionContextAction(params);
307
+ result = await addDecisionContextAction(params);
396
308
  break;
397
309
  case 'list_decision_contexts':
398
- result = listDecisionContextsAction(params);
310
+ result = await listDecisionContextsAction(params);
399
311
  break;
400
312
  case 'help':
401
- result = decisionHelp();
313
+ const helpContent = decisionHelp();
314
+ trackAndReturnHelp('decision', 'help', JSON.stringify(helpContent));
315
+ result = helpContent;
402
316
  break;
403
317
  case 'example':
404
- result = decisionExample();
318
+ const exampleContent = decisionExample();
319
+ trackAndReturnHelp('decision', 'example', JSON.stringify(exampleContent));
320
+ result = exampleContent;
321
+ break;
322
+ case 'use_case':
323
+ result = await queryHelpListUseCases(getAdapter(), {
324
+ category: params.category,
325
+ complexity: params.complexity,
326
+ limit: params.limit,
327
+ offset: params.offset
328
+ });
405
329
  break;
406
330
  default: throw new Error(`Unknown action: ${params.action}`);
407
331
  }
@@ -409,22 +333,34 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
409
333
  case 'message':
410
334
  switch (params.action) {
411
335
  case 'send':
412
- result = sendMessage(params);
336
+ result = await sendMessage(params);
413
337
  break;
414
338
  case 'get':
415
- result = getMessages(params);
339
+ result = await getMessages(params);
416
340
  break;
417
341
  case 'mark_read':
418
- result = markRead(params);
342
+ result = await markRead(params);
419
343
  break;
420
344
  case 'send_batch':
421
- result = sendMessageBatch({ messages: params.messages, atomic: params.atomic });
345
+ result = await sendMessageBatch({ messages: params.messages, atomic: params.atomic });
422
346
  break;
423
347
  case 'help':
424
- result = messageHelp();
348
+ const msgHelpContent = messageHelp();
349
+ trackAndReturnHelp('message', 'help', JSON.stringify(msgHelpContent));
350
+ result = msgHelpContent;
425
351
  break;
426
352
  case 'example':
427
- result = messageExample();
353
+ const msgExampleContent = messageExample();
354
+ trackAndReturnHelp('message', 'example', JSON.stringify(msgExampleContent));
355
+ result = msgExampleContent;
356
+ break;
357
+ case 'use_case':
358
+ result = await queryHelpListUseCases(getAdapter(), {
359
+ category: params.category,
360
+ complexity: params.complexity,
361
+ limit: params.limit,
362
+ offset: params.offset
363
+ });
428
364
  break;
429
365
  default: throw new Error(`Unknown action: ${params.action}`);
430
366
  }
@@ -432,22 +368,34 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
432
368
  case 'file':
433
369
  switch (params.action) {
434
370
  case 'record':
435
- result = recordFileChange(params);
371
+ result = await recordFileChange(params);
436
372
  break;
437
373
  case 'get':
438
- result = getFileChanges(params);
374
+ result = await getFileChanges(params);
439
375
  break;
440
376
  case 'check_lock':
441
- result = checkFileLock(params);
377
+ result = await checkFileLock(params);
442
378
  break;
443
379
  case 'record_batch':
444
- result = recordFileChangeBatch({ file_changes: params.file_changes, atomic: params.atomic });
380
+ result = await recordFileChangeBatch({ file_changes: params.file_changes, atomic: params.atomic });
445
381
  break;
446
382
  case 'help':
447
- result = fileHelp();
383
+ const fileHelpContent = fileHelp();
384
+ trackAndReturnHelp('file', 'help', JSON.stringify(fileHelpContent));
385
+ result = fileHelpContent;
448
386
  break;
449
387
  case 'example':
450
- result = fileExample();
388
+ const fileExampleContent = fileExample();
389
+ trackAndReturnHelp('file', 'example', JSON.stringify(fileExampleContent));
390
+ result = fileExampleContent;
391
+ break;
392
+ case 'use_case':
393
+ result = await queryHelpListUseCases(getAdapter(), {
394
+ category: params.category,
395
+ complexity: params.complexity,
396
+ limit: params.limit,
397
+ offset: params.offset
398
+ });
451
399
  break;
452
400
  default: throw new Error(`Unknown action: ${params.action}`);
453
401
  }
@@ -455,19 +403,31 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
455
403
  case 'constraint':
456
404
  switch (params.action) {
457
405
  case 'add':
458
- result = addConstraint(params);
406
+ result = await addConstraint(params);
459
407
  break;
460
408
  case 'get':
461
- result = getConstraints(params);
409
+ result = await getConstraints(params);
462
410
  break;
463
411
  case 'deactivate':
464
- result = deactivateConstraint(params);
412
+ result = await deactivateConstraint(params);
465
413
  break;
466
414
  case 'help':
467
- result = constraintHelp();
415
+ const constraintHelpContent = constraintHelp();
416
+ trackAndReturnHelp('constraint', 'help', JSON.stringify(constraintHelpContent));
417
+ result = constraintHelpContent;
468
418
  break;
469
419
  case 'example':
470
- result = constraintExample();
420
+ const constraintExampleContent = constraintExample();
421
+ trackAndReturnHelp('constraint', 'example', JSON.stringify(constraintExampleContent));
422
+ result = constraintExampleContent;
423
+ break;
424
+ case 'use_case':
425
+ result = await queryHelpListUseCases(getAdapter(), {
426
+ category: params.category,
427
+ complexity: params.complexity,
428
+ limit: params.limit,
429
+ offset: params.offset
430
+ });
471
431
  break;
472
432
  default: throw new Error(`Unknown action: ${params.action}`);
473
433
  }
@@ -475,16 +435,16 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
475
435
  case 'stats':
476
436
  switch (params.action) {
477
437
  case 'layer_summary':
478
- result = getLayerSummary();
438
+ result = await getLayerSummary();
479
439
  break;
480
440
  case 'db_stats':
481
- result = getStats();
441
+ result = await getStats();
482
442
  break;
483
443
  case 'clear':
484
- result = clearOldData(params);
444
+ result = await clearOldData(params);
485
445
  break;
486
446
  case 'activity_log':
487
- result = getActivityLog({
447
+ result = await getActivityLog({
488
448
  since: params.since,
489
449
  agent_names: params.agent_names,
490
450
  actions: params.actions,
@@ -492,13 +452,73 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
492
452
  });
493
453
  break;
494
454
  case 'flush':
495
- result = flushWAL();
455
+ result = await flushWAL();
456
+ break;
457
+ case 'help_action':
458
+ if (!params.target_tool || !params.target_action) {
459
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
460
+ }
461
+ else {
462
+ result = await queryHelpAction(getAdapter(), params.target_tool, params.target_action);
463
+ }
464
+ break;
465
+ case 'help_params':
466
+ if (!params.target_tool || !params.target_action) {
467
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
468
+ }
469
+ else {
470
+ result = await queryHelpParams(getAdapter(), params.target_tool, params.target_action);
471
+ }
472
+ break;
473
+ case 'help_tool':
474
+ if (!params.tool) {
475
+ result = { error: 'Parameter "tool" is required' };
476
+ }
477
+ else {
478
+ result = await queryHelpTool(getAdapter(), params.tool);
479
+ }
480
+ break;
481
+ case 'help_use_case':
482
+ if (!params.use_case_id) {
483
+ result = { error: 'Parameter "use_case_id" is required' };
484
+ }
485
+ else {
486
+ result = await queryHelpUseCase(getAdapter(), params.use_case_id);
487
+ }
488
+ break;
489
+ case 'help_list_use_cases':
490
+ result = await queryHelpListUseCases(getAdapter(), {
491
+ category: params.category,
492
+ complexity: params.complexity,
493
+ limit: params.limit,
494
+ offset: params.offset
495
+ });
496
+ break;
497
+ case 'help_next_actions':
498
+ if (!params.target_tool || !params.target_action) {
499
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
500
+ }
501
+ else {
502
+ result = await queryHelpNextActions(getAdapter(), params.target_tool, params.target_action);
503
+ }
496
504
  break;
497
505
  case 'help':
498
- result = statsHelp();
506
+ const statsHelpContent = statsHelp();
507
+ trackAndReturnHelp('stats', 'help', JSON.stringify(statsHelpContent));
508
+ result = statsHelpContent;
499
509
  break;
500
510
  case 'example':
501
- result = statsExample();
511
+ const statsExampleContent = statsExample();
512
+ trackAndReturnHelp('stats', 'example', JSON.stringify(statsExampleContent));
513
+ result = statsExampleContent;
514
+ break;
515
+ case 'use_case':
516
+ result = await queryHelpListUseCases(getAdapter(), {
517
+ category: params.category,
518
+ complexity: params.complexity,
519
+ limit: params.limit,
520
+ offset: params.offset
521
+ });
502
522
  break;
503
523
  default: throw new Error(`Unknown action: ${params.action}`);
504
524
  }
@@ -506,16 +526,28 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
506
526
  case 'config':
507
527
  switch (params.action) {
508
528
  case 'get':
509
- result = getConfig();
529
+ result = await getConfig();
510
530
  break;
511
531
  case 'update':
512
- result = updateConfig(params);
532
+ result = await updateConfig(params);
513
533
  break;
514
534
  case 'help':
515
- result = configHelp();
535
+ const configHelpContent = configHelp();
536
+ trackAndReturnHelp('config', 'help', JSON.stringify(configHelpContent));
537
+ result = configHelpContent;
516
538
  break;
517
539
  case 'example':
518
- result = configExample();
540
+ const configExampleContent = configExample();
541
+ trackAndReturnHelp('config', 'example', JSON.stringify(configExampleContent));
542
+ result = configExampleContent;
543
+ break;
544
+ case 'use_case':
545
+ result = await queryHelpListUseCases(getAdapter(), {
546
+ category: params.category,
547
+ complexity: params.complexity,
548
+ limit: params.limit,
549
+ offset: params.offset
550
+ });
519
551
  break;
520
552
  default: throw new Error(`Unknown action: ${params.action}`);
521
553
  }
@@ -523,55 +555,67 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
523
555
  case 'task':
524
556
  switch (params.action) {
525
557
  case 'create':
526
- result = createTask(params);
558
+ result = await createTask(params);
527
559
  break;
528
560
  case 'update':
529
- result = updateTask(params);
561
+ result = await updateTask(params);
530
562
  break;
531
563
  case 'get':
532
- result = getTask(params);
564
+ result = await getTask(params);
533
565
  break;
534
566
  case 'list':
535
567
  result = await listTasks(params);
536
568
  break;
537
569
  case 'move':
538
- result = moveTask(params);
570
+ result = await moveTask(params);
539
571
  break;
540
572
  case 'link':
541
- result = linkTask(params);
573
+ result = await linkTask(params);
542
574
  break;
543
575
  case 'archive':
544
- result = archiveTask(params);
576
+ result = await archiveTask(params);
545
577
  break;
546
578
  case 'batch_create':
547
- result = batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
579
+ result = await batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
548
580
  break;
549
581
  case 'add_dependency':
550
- result = addDependency(params);
582
+ result = await addDependency(params);
551
583
  break;
552
584
  case 'remove_dependency':
553
- result = removeDependency(params);
585
+ result = await removeDependency(params);
554
586
  break;
555
587
  case 'get_dependencies':
556
- result = getDependencies(params);
588
+ result = await getDependencies(params);
557
589
  break;
558
590
  case 'watch_files':
559
- result = watchFiles(params);
591
+ result = await watchFiles(params);
560
592
  break;
561
593
  case 'get_pruned_files':
562
- result = getPrunedFiles(params);
594
+ result = await getPrunedFiles(params);
563
595
  break;
564
596
  case 'link_pruned_file':
565
- result = linkPrunedFile(params);
597
+ result = await linkPrunedFile(params);
566
598
  break;
567
599
  case 'watcher':
568
- result = watcherStatus(params);
600
+ result = await watcherStatus(params);
569
601
  break;
570
602
  case 'help':
571
- result = taskHelp();
603
+ const taskHelpContent = taskHelp();
604
+ trackAndReturnHelp('task', 'help', JSON.stringify(taskHelpContent));
605
+ result = taskHelpContent;
572
606
  break;
573
607
  case 'example':
574
- result = taskExample();
608
+ const taskExampleContent = taskExample();
609
+ trackAndReturnHelp('task', 'example', JSON.stringify(taskExampleContent));
610
+ result = taskExampleContent;
611
+ break;
612
+ case 'use_case':
613
+ result = await queryHelpListUseCases(getAdapter(), {
614
+ category: params.category,
615
+ complexity: params.complexity,
616
+ limit: params.limit,
617
+ offset: params.offset
618
+ });
575
619
  break;
576
620
  default: throw new Error(`Unknown action: ${params.action}`);
577
621
  }
@@ -579,61 +623,101 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
579
623
  default:
580
624
  throw new Error(`Unknown tool: ${name}`);
581
625
  }
626
+ // Debug logging: Success
627
+ debugLogToolResponse(name, action, true, result);
582
628
  return {
583
629
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
584
630
  };
585
631
  }
586
632
  catch (error) {
587
- const message = error instanceof Error ? error.message : String(error);
633
+ // Use centralized error handler
634
+ const { message, stack } = handleToolError(name, action, error, params);
635
+ debugLogToolResponse(name, action, false, undefined, { message, stack });
588
636
  return {
589
- content: [{ type: 'text', text: JSON.stringify({ error: message }, null, 2) }],
637
+ content: [{ type: 'text', text: JSON.stringify({ error: message, stack: stack }, null, 2) }],
590
638
  isError: true,
591
639
  };
592
640
  }
593
641
  });
594
- // Handle graceful shutdown
595
- process.on('SIGINT', async () => {
596
- console.error('\n✓ Shutting down MCP server...');
597
- try {
598
- const watcher = FileWatcher.getInstance();
599
- await watcher.stop();
600
- }
601
- catch (error) {
602
- // Ignore watcher errors during shutdown
603
- }
604
- closeDatabase();
605
- process.exit(0);
606
- });
607
- process.on('SIGTERM', async () => {
608
- console.error('\n✓ Shutting down MCP server...');
642
+ // Setup centralized global error handlers
643
+ setupGlobalErrorHandlers(() => {
644
+ debugLog('INFO', 'Shutting down gracefully');
609
645
  try {
610
646
  const watcher = FileWatcher.getInstance();
611
- await watcher.stop();
647
+ watcher.stop();
612
648
  }
613
649
  catch (error) {
614
650
  // Ignore watcher errors during shutdown
615
651
  }
616
652
  closeDatabase();
617
- process.exit(0);
653
+ closeDebugLogger();
618
654
  });
619
655
  // Start server with stdio transport
620
656
  async function main() {
621
- const transport = new StdioServerTransport();
622
- await server.connect(transport);
623
- console.error('✓ MCP Shared Context Server running on stdio');
624
- // Start file watcher for auto-task-tracking
625
657
  try {
626
- const watcher = FileWatcher.getInstance();
627
- await watcher.start();
658
+ // 0. Ensure .sqlew directory and config template exist (first launch)
659
+ ensureSqlewDirectory();
660
+ // 1. Initialize database
661
+ const config = dbPath ? { connection: { filename: dbPath } } : undefined;
662
+ db = await initializeDatabase(config);
663
+ // Apply CLI config overrides if provided
664
+ if (parsedArgs.autodeleteIgnoreWeekend !== undefined) {
665
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND, parsedArgs.autodeleteIgnoreWeekend ? '1' : '0');
666
+ }
667
+ if (parsedArgs.autodeleteMessageHours !== undefined) {
668
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS, String(parsedArgs.autodeleteMessageHours));
669
+ }
670
+ if (parsedArgs.autodeleteFileHistoryDays !== undefined) {
671
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS, String(parsedArgs.autodeleteFileHistoryDays));
672
+ }
673
+ // Display current config
674
+ const configValues = await getAllConfig(db);
675
+ const ignoreWeekend = configValues[CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND] === '1';
676
+ const messageHours = configValues[CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS];
677
+ const fileHistoryDays = configValues[CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS];
678
+ console.error('✓ MCP Shared Context Server initialized');
679
+ if (dbPath) {
680
+ const source = parsedArgs.dbPath ? 'CLI' : 'config file';
681
+ console.error(` Database: ${dbPath} (from ${source})`);
682
+ }
683
+ console.error(` Auto-delete config: messages=${messageHours}h, file_history=${fileHistoryDays}d, ignore_weekend=${ignoreWeekend}`);
684
+ // Initialize debug logger (priority: CLI arg > environment variable > config file)
685
+ const debugLogPath = parsedArgs.debugLogPath || process.env.SQLEW_DEBUG || fileConfig.debug?.log_path;
686
+ const debugLogLevel = fileConfig.debug?.log_level || 'info';
687
+ initDebugLogger(debugLogPath, debugLogLevel);
688
+ debugLog('INFO', 'MCP Shared Context Server initialized', {
689
+ dbPath,
690
+ autoDeleteConfig: { messageHours, fileHistoryDays, ignoreWeekend },
691
+ debugLogLevel: debugLogLevel
692
+ });
693
+ // 2. Connect MCP server
694
+ const transport = new StdioServerTransport();
695
+ await server.connect(transport);
696
+ console.error('✓ MCP Shared Context Server running on stdio');
697
+ // 3. Start file watcher for auto-task-tracking (after database is ready)
698
+ try {
699
+ const watcher = FileWatcher.getInstance();
700
+ await watcher.start();
701
+ }
702
+ catch (error) {
703
+ console.error('⚠ Failed to start file watcher:', error);
704
+ console.error(' (Auto task tracking will be disabled)');
705
+ }
628
706
  }
629
707
  catch (error) {
630
- console.error('⚠ Failed to start file watcher:', error);
631
- console.error(' (Auto task tracking will be disabled)');
708
+ // Use centralized initialization error handler
709
+ handleInitializationError(error);
710
+ closeDatabase();
711
+ closeDebugLogger();
712
+ process.exit(1);
632
713
  }
633
714
  }
634
715
  main().catch((error) => {
635
- console.error('✗ Fatal error:', error);
716
+ // Use centralized initialization error handler
717
+ console.error('\n❌ FATAL ERROR:');
718
+ handleInitializationError(error);
636
719
  closeDatabase();
720
+ closeDebugLogger();
637
721
  process.exit(1);
638
722
  });
639
723
  //# sourceMappingURL=index.js.map