sqlew 3.2.5 → 3.6.0

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 (291) hide show
  1. package/CHANGELOG.md +288 -1011
  2. package/README.md +80 -263
  3. package/assets/config.example.toml +97 -0
  4. package/assets/schema.sql +6 -1
  5. package/dist/adapters/index.d.ts +11 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +21 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/mysql-adapter.d.ts +31 -0
  10. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  11. package/dist/adapters/mysql-adapter.js +63 -0
  12. package/dist/adapters/mysql-adapter.js.map +1 -0
  13. package/dist/adapters/postgresql-adapter.d.ts +31 -0
  14. package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
  15. package/dist/adapters/postgresql-adapter.js +63 -0
  16. package/dist/adapters/postgresql-adapter.js.map +1 -0
  17. package/dist/adapters/sqlite-adapter.d.ts +37 -0
  18. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  19. package/dist/adapters/sqlite-adapter.js +129 -0
  20. package/dist/adapters/sqlite-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +33 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +2 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/cli.js +55 -54
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config/example-generator.d.ts +11 -0
  28. package/dist/config/example-generator.d.ts.map +1 -0
  29. package/dist/config/example-generator.js +48 -0
  30. package/dist/config/example-generator.js.map +1 -0
  31. package/dist/config/loader.d.ts +46 -0
  32. package/dist/config/loader.d.ts.map +1 -0
  33. package/dist/config/loader.js +155 -0
  34. package/dist/config/loader.js.map +1 -0
  35. package/dist/config/types.d.ts +86 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +28 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/constants.d.ts +9 -0
  40. package/dist/constants.d.ts.map +1 -1
  41. package/dist/constants.js +10 -0
  42. package/dist/constants.js.map +1 -1
  43. package/dist/database.d.ts +44 -122
  44. package/dist/database.d.ts.map +1 -1
  45. package/dist/database.js +145 -349
  46. package/dist/database.js.map +1 -1
  47. package/dist/index.js +223 -175
  48. package/dist/index.js.map +1 -1
  49. package/dist/knexfile.d.ts +6 -0
  50. package/dist/knexfile.d.ts.map +1 -0
  51. package/dist/knexfile.js +85 -0
  52. package/dist/knexfile.js.map +1 -0
  53. package/dist/migrations/add-help-system-tables.d.ts +35 -0
  54. package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
  55. package/dist/migrations/add-help-system-tables.js +206 -0
  56. package/dist/migrations/add-help-system-tables.js.map +1 -0
  57. package/dist/migrations/add-token-tracking.d.ts +28 -0
  58. package/dist/migrations/add-token-tracking.d.ts.map +1 -0
  59. package/dist/migrations/add-token-tracking.js +108 -0
  60. package/dist/migrations/add-token-tracking.js.map +1 -0
  61. package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
  62. package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
  63. package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
  64. package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
  65. package/dist/migrations/index.d.ts +26 -12
  66. package/dist/migrations/index.d.ts.map +1 -1
  67. package/dist/migrations/index.js +162 -20
  68. package/dist/migrations/index.js.map +1 -1
  69. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
  70. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
  71. package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
  72. package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
  73. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
  74. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
  75. package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
  76. package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
  77. package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
  78. package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
  79. package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
  80. package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
  81. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
  82. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
  83. package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
  84. package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
  85. package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
  86. package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
  87. package/dist/migrations/knex/20251025070349_create_views.js +143 -0
  88. package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
  89. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
  90. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  91. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
  92. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  93. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
  94. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  95. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
  96. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  97. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
  98. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
  99. package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
  100. package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
  101. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
  102. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  103. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
  104. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  105. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
  106. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
  107. package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
  108. package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
  109. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
  110. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  111. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
  112. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
  113. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
  114. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  115. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
  116. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  117. package/dist/migrations/seed-help-data.d.ts +48 -0
  118. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  119. package/dist/migrations/seed-help-data.js +1466 -0
  120. package/dist/migrations/seed-help-data.js.map +1 -0
  121. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  122. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  123. package/dist/migrations/seed-tool-metadata.js +392 -0
  124. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  125. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  126. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  127. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  128. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  129. package/dist/schema.d.ts.map +1 -1
  130. package/dist/schema.js +2 -0
  131. package/dist/schema.js.map +1 -1
  132. package/dist/tests/git-aware-completion.test.d.ts +6 -0
  133. package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
  134. package/dist/tests/git-aware-completion.test.js +160 -0
  135. package/dist/tests/git-aware-completion.test.js.map +1 -0
  136. package/dist/tests/help-system.test.d.ts +23 -0
  137. package/dist/tests/help-system.test.d.ts.map +1 -0
  138. package/dist/tests/help-system.test.js +374 -0
  139. package/dist/tests/help-system.test.js.map +1 -0
  140. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
  141. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
  142. package/dist/tests/tasks.auto-pruning-decision-link.test.js +264 -0
  143. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
  144. package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
  145. package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
  146. package/dist/tests/tasks.auto-pruning-partial.test.js +285 -0
  147. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
  148. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
  149. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
  150. package/dist/tests/tasks.auto-pruning-persistence.test.js +250 -0
  151. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
  152. package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
  153. package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
  154. package/dist/tests/tasks.auto-pruning-safety.test.js +217 -0
  155. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
  156. package/dist/tests/tasks.dependencies.test.js +338 -307
  157. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  158. package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
  159. package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
  160. package/dist/tests/tasks.link-file-backward-compat.test.js +247 -0
  161. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
  162. package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
  163. package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
  164. package/dist/tests/tasks.watch-files-action.test.js +372 -0
  165. package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
  166. package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
  167. package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
  168. package/dist/tests/tasks.watch-files-parameter.test.js +260 -0
  169. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
  170. package/dist/tests/two-step-git-completion.test.d.ts +6 -0
  171. package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
  172. package/dist/tests/two-step-git-completion.test.js +326 -0
  173. package/dist/tests/two-step-git-completion.test.js.map +1 -0
  174. package/dist/tests/vcs-staging.test.d.ts +6 -0
  175. package/dist/tests/vcs-staging.test.d.ts.map +1 -0
  176. package/dist/tests/vcs-staging.test.js +137 -0
  177. package/dist/tests/vcs-staging.test.js.map +1 -0
  178. package/dist/tools/config.d.ts +9 -4
  179. package/dist/tools/config.d.ts.map +1 -1
  180. package/dist/tools/config.js +16 -12
  181. package/dist/tools/config.js.map +1 -1
  182. package/dist/tools/constraints.d.ts +9 -3
  183. package/dist/tools/constraints.d.ts.map +1 -1
  184. package/dist/tools/constraints.js +66 -45
  185. package/dist/tools/constraints.js.map +1 -1
  186. package/dist/tools/context.d.ts +35 -16
  187. package/dist/tools/context.d.ts.map +1 -1
  188. package/dist/tools/context.js +374 -314
  189. package/dist/tools/context.js.map +1 -1
  190. package/dist/tools/files.d.ts +11 -4
  191. package/dist/tools/files.d.ts.map +1 -1
  192. package/dist/tools/files.js +173 -91
  193. package/dist/tools/files.js.map +1 -1
  194. package/dist/tools/help-queries.d.ts +130 -0
  195. package/dist/tools/help-queries.d.ts.map +1 -0
  196. package/dist/tools/help-queries.js +393 -0
  197. package/dist/tools/help-queries.js.map +1 -0
  198. package/dist/tools/messaging.d.ts +13 -6
  199. package/dist/tools/messaging.d.ts.map +1 -1
  200. package/dist/tools/messaging.js +217 -129
  201. package/dist/tools/messaging.js.map +1 -1
  202. package/dist/tools/tasks.d.ts +42 -12
  203. package/dist/tools/tasks.d.ts.map +1 -1
  204. package/dist/tools/tasks.js +809 -347
  205. package/dist/tools/tasks.js.map +1 -1
  206. package/dist/tools/utils.d.ts +13 -5
  207. package/dist/tools/utils.d.ts.map +1 -1
  208. package/dist/tools/utils.js +92 -115
  209. package/dist/tools/utils.js.map +1 -1
  210. package/dist/types.d.ts +4 -0
  211. package/dist/types.d.ts.map +1 -1
  212. package/dist/utils/activity-logging.d.ts +114 -0
  213. package/dist/utils/activity-logging.d.ts.map +1 -0
  214. package/dist/utils/activity-logging.js +162 -0
  215. package/dist/utils/activity-logging.js.map +1 -0
  216. package/dist/utils/batch.d.ts +2 -2
  217. package/dist/utils/batch.d.ts.map +1 -1
  218. package/dist/utils/batch.js +8 -8
  219. package/dist/utils/batch.js.map +1 -1
  220. package/dist/utils/cleanup.d.ts +21 -13
  221. package/dist/utils/cleanup.d.ts.map +1 -1
  222. package/dist/utils/cleanup.js +31 -24
  223. package/dist/utils/cleanup.js.map +1 -1
  224. package/dist/utils/debug-logger.d.ts +44 -0
  225. package/dist/utils/debug-logger.d.ts.map +1 -0
  226. package/dist/utils/debug-logger.js +116 -0
  227. package/dist/utils/debug-logger.js.map +1 -0
  228. package/dist/utils/file-pruning.d.ts +69 -0
  229. package/dist/utils/file-pruning.d.ts.map +1 -0
  230. package/dist/utils/file-pruning.js +185 -0
  231. package/dist/utils/file-pruning.js.map +1 -0
  232. package/dist/utils/help-tracking.d.ts +55 -0
  233. package/dist/utils/help-tracking.d.ts.map +1 -0
  234. package/dist/utils/help-tracking.js +88 -0
  235. package/dist/utils/help-tracking.js.map +1 -0
  236. package/dist/utils/quality-checks.d.ts +60 -0
  237. package/dist/utils/quality-checks.d.ts.map +1 -0
  238. package/dist/utils/quality-checks.js +228 -0
  239. package/dist/utils/quality-checks.js.map +1 -0
  240. package/dist/utils/retention.d.ts +13 -5
  241. package/dist/utils/retention.d.ts.map +1 -1
  242. package/dist/utils/retention.js +20 -8
  243. package/dist/utils/retention.js.map +1 -1
  244. package/dist/utils/task-stale-detection.d.ts +77 -7
  245. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  246. package/dist/utils/task-stale-detection.js +309 -34
  247. package/dist/utils/task-stale-detection.js.map +1 -1
  248. package/dist/utils/token-estimation.d.ts +72 -0
  249. package/dist/utils/token-estimation.d.ts.map +1 -0
  250. package/dist/utils/token-estimation.js +71 -0
  251. package/dist/utils/token-estimation.js.map +1 -0
  252. package/dist/utils/token-logging.d.ts +48 -0
  253. package/dist/utils/token-logging.d.ts.map +1 -0
  254. package/dist/utils/token-logging.js +112 -0
  255. package/dist/utils/token-logging.js.map +1 -0
  256. package/dist/utils/vcs-adapter.d.ts +68 -0
  257. package/dist/utils/vcs-adapter.d.ts.map +1 -0
  258. package/dist/utils/vcs-adapter.js +187 -0
  259. package/dist/utils/vcs-adapter.js.map +1 -0
  260. package/dist/utils/view-queries.d.ts +34 -0
  261. package/dist/utils/view-queries.d.ts.map +1 -0
  262. package/dist/utils/view-queries.js +192 -0
  263. package/dist/utils/view-queries.js.map +1 -0
  264. package/dist/watcher/file-watcher.d.ts +54 -4
  265. package/dist/watcher/file-watcher.d.ts.map +1 -1
  266. package/dist/watcher/file-watcher.js +329 -33
  267. package/dist/watcher/file-watcher.js.map +1 -1
  268. package/dist/watcher/gitignore-parser.d.ts +70 -0
  269. package/dist/watcher/gitignore-parser.d.ts.map +1 -0
  270. package/dist/watcher/gitignore-parser.js +191 -0
  271. package/dist/watcher/gitignore-parser.js.map +1 -0
  272. package/dist/watcher/index.d.ts +1 -0
  273. package/dist/watcher/index.d.ts.map +1 -1
  274. package/dist/watcher/index.js +1 -0
  275. package/dist/watcher/index.js.map +1 -1
  276. package/docs/AI_AGENT_GUIDE.md +1 -1
  277. package/docs/ARCHITECTURE.md +12 -0
  278. package/docs/AUTO_FILE_TRACKING.md +486 -82
  279. package/docs/BEST_PRACTICES.md +56 -448
  280. package/docs/CONFIGURATION.md +908 -0
  281. package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
  282. package/docs/MIGRATION_v3.3.md +602 -0
  283. package/docs/MIGRATION_v3.6.0.md +170 -0
  284. package/docs/SHARED_CONCEPTS.md +65 -209
  285. package/docs/TASK_ACTIONS.md +12 -0
  286. package/docs/TASK_OVERVIEW.md +125 -24
  287. package/docs/TASK_PRUNING.md +589 -0
  288. package/docs/TASK_SYSTEM.md +83 -13
  289. package/docs/TOOL_REFERENCE.md +94 -6
  290. package/docs/TOOL_SELECTION.md +41 -248
  291. package/package.json +21 -7
package/dist/index.js CHANGED
@@ -6,16 +6,21 @@
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';
14
15
  import { addConstraint, getConstraints, deactivateConstraint, constraintHelp, constraintExample } from './tools/constraints.js';
15
16
  import { getLayerSummary, clearOldData, getStats, getActivityLog, flushWAL, statsHelp, statsExample } from './tools/utils.js';
16
17
  import { getConfig, updateConfig, configHelp, configExample } from './tools/config.js';
17
- import { createTask, updateTask, getTask, listTasks, moveTask, linkTask, archiveTask, batchCreateTasks, addDependency, removeDependency, getDependencies, taskHelp, taskExample, watcherStatus } from './tools/tasks.js';
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, debugLogError } from './utils/debug-logger.js';
23
+ import { ensureSqlewDirectory } from './config/example-generator.js';
19
24
  // Parse command-line arguments
20
25
  const args = process.argv.slice(2);
21
26
  const parsedArgs = {};
@@ -46,6 +51,12 @@ for (let i = 0; i < args.length; i++) {
46
51
  else if (arg === '--autodelete-file-history-days' && i + 1 < args.length) {
47
52
  parsedArgs.autodeleteFileHistoryDays = parseInt(args[++i], 10);
48
53
  }
54
+ else if (arg.startsWith('--debug-log=')) {
55
+ parsedArgs.debugLogPath = arg.split('=')[1];
56
+ }
57
+ else if (arg === '--debug-log' && i + 1 < args.length) {
58
+ parsedArgs.debugLogPath = args[++i];
59
+ }
49
60
  else if (!arg.startsWith('--')) {
50
61
  // Backward compatibility: first non-flag argument is dbPath
51
62
  if (!parsedArgs.dbPath) {
@@ -53,33 +64,12 @@ for (let i = 0; i < args.length; i++) {
53
64
  }
54
65
  }
55
66
  }
56
- const dbPath = parsedArgs.dbPath;
57
- // Initialize database
67
+ // Load config file and determine database path
68
+ // Priority: CLI --db-path > config file > default
69
+ const fileConfig = loadConfigFile();
70
+ const dbPath = parsedArgs.dbPath || fileConfig.database?.path;
71
+ // Initialize database (will be set after async init completes)
58
72
  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
73
  // Create MCP server
84
74
  const server = new Server({
85
75
  name: 'mcp-sqlew',
@@ -108,47 +98,7 @@ Use action: "example" for comprehensive usage examples.`,
108
98
  type: 'string',
109
99
  description: 'Action',
110
100
  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' },
101
+ }
152
102
  },
153
103
  required: ['action'],
154
104
  },
@@ -164,22 +114,11 @@ Use action: "example" for comprehensive usage examples.`,
164
114
  inputSchema: {
165
115
  type: 'object',
166
116
  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)' },
117
+ action: {
118
+ type: 'string',
119
+ description: 'Action',
120
+ enum: ['send', 'get', 'mark_read', 'send_batch', 'help', 'example']
121
+ }
183
122
  },
184
123
  required: ['action'],
185
124
  },
@@ -195,18 +134,11 @@ Use action: "example" for comprehensive usage examples.`,
195
134
  inputSchema: {
196
135
  type: 'object',
197
136
  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)' },
137
+ action: {
138
+ type: 'string',
139
+ description: 'Action',
140
+ enum: ['record', 'get', 'check_lock', 'record_batch', 'help', 'example']
141
+ }
210
142
  },
211
143
  required: ['action'],
212
144
  },
@@ -222,16 +154,11 @@ Use action: "example" for comprehensive usage examples.`,
222
154
  inputSchema: {
223
155
  type: 'object',
224
156
  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 },
157
+ action: {
158
+ type: 'string',
159
+ description: 'Action',
160
+ enum: ['add', 'get', 'deactivate', 'help', 'example']
161
+ }
235
162
  },
236
163
  required: ['action'],
237
164
  },
@@ -247,13 +174,11 @@ Use action: "example" for comprehensive usage examples.`,
247
174
  inputSchema: {
248
175
  type: 'object',
249
176
  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)' },
177
+ action: {
178
+ type: 'string',
179
+ description: 'Action',
180
+ 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']
181
+ }
257
182
  },
258
183
  required: ['action'],
259
184
  },
@@ -269,10 +194,11 @@ Use action: "example" for comprehensive usage examples.`,
269
194
  inputSchema: {
270
195
  type: 'object',
271
196
  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 },
197
+ action: {
198
+ type: 'string',
199
+ description: 'Action',
200
+ enum: ['get', 'update', 'help', 'example']
201
+ }
276
202
  },
277
203
  required: ['action'],
278
204
  },
@@ -288,27 +214,11 @@ Use action: "example" for comprehensive usage examples.`,
288
214
  inputSchema: {
289
215
  type: 'object',
290
216
  properties: {
291
- action: { type: 'string', description: 'Action (use "help" for usage)', enum: ['create', 'update', 'get', 'list', 'move', 'link', 'archive', 'batch_create', '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
- // batch_create parameters
310
- tasks: { type: 'array', description: 'Array of tasks for batch operation (max: 50)' },
311
- atomic: { type: 'boolean', description: 'Atomic mode - all succeed or all fail (default: true)' },
217
+ action: {
218
+ type: 'string',
219
+ description: 'Action',
220
+ enum: ['create', 'update', 'get', 'list', 'move', 'link', 'archive', 'batch_create', 'add_dependency', 'remove_dependency', 'get_dependencies', 'watch_files', 'watcher', 'help', 'example']
221
+ }
312
222
  },
313
223
  required: ['action'],
314
224
  },
@@ -320,6 +230,9 @@ Use action: "example" for comprehensive usage examples.`,
320
230
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
321
231
  const { name, arguments: args } = request.params;
322
232
  const params = args;
233
+ const action = params.action || 'N/A';
234
+ // Debug logging: Tool call
235
+ debugLogToolCall(name, action, params);
323
236
  try {
324
237
  let result;
325
238
  switch (name) {
@@ -389,10 +302,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
389
302
  result = listDecisionContextsAction(params);
390
303
  break;
391
304
  case 'help':
392
- result = decisionHelp();
305
+ const helpContent = decisionHelp();
306
+ trackAndReturnHelp('decision', 'help', JSON.stringify(helpContent));
307
+ result = helpContent;
393
308
  break;
394
309
  case 'example':
395
- result = decisionExample();
310
+ const exampleContent = decisionExample();
311
+ trackAndReturnHelp('decision', 'example', JSON.stringify(exampleContent));
312
+ result = exampleContent;
396
313
  break;
397
314
  default: throw new Error(`Unknown action: ${params.action}`);
398
315
  }
@@ -412,10 +329,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
412
329
  result = sendMessageBatch({ messages: params.messages, atomic: params.atomic });
413
330
  break;
414
331
  case 'help':
415
- result = messageHelp();
332
+ const msgHelpContent = messageHelp();
333
+ trackAndReturnHelp('message', 'help', JSON.stringify(msgHelpContent));
334
+ result = msgHelpContent;
416
335
  break;
417
336
  case 'example':
418
- result = messageExample();
337
+ const msgExampleContent = messageExample();
338
+ trackAndReturnHelp('message', 'example', JSON.stringify(msgExampleContent));
339
+ result = msgExampleContent;
419
340
  break;
420
341
  default: throw new Error(`Unknown action: ${params.action}`);
421
342
  }
@@ -435,10 +356,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
435
356
  result = recordFileChangeBatch({ file_changes: params.file_changes, atomic: params.atomic });
436
357
  break;
437
358
  case 'help':
438
- result = fileHelp();
359
+ const fileHelpContent = fileHelp();
360
+ trackAndReturnHelp('file', 'help', JSON.stringify(fileHelpContent));
361
+ result = fileHelpContent;
439
362
  break;
440
363
  case 'example':
441
- result = fileExample();
364
+ const fileExampleContent = fileExample();
365
+ trackAndReturnHelp('file', 'example', JSON.stringify(fileExampleContent));
366
+ result = fileExampleContent;
442
367
  break;
443
368
  default: throw new Error(`Unknown action: ${params.action}`);
444
369
  }
@@ -455,10 +380,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
455
380
  result = deactivateConstraint(params);
456
381
  break;
457
382
  case 'help':
458
- result = constraintHelp();
383
+ const constraintHelpContent = constraintHelp();
384
+ trackAndReturnHelp('constraint', 'help', JSON.stringify(constraintHelpContent));
385
+ result = constraintHelpContent;
459
386
  break;
460
387
  case 'example':
461
- result = constraintExample();
388
+ const constraintExampleContent = constraintExample();
389
+ trackAndReturnHelp('constraint', 'example', JSON.stringify(constraintExampleContent));
390
+ result = constraintExampleContent;
462
391
  break;
463
392
  default: throw new Error(`Unknown action: ${params.action}`);
464
393
  }
@@ -466,10 +395,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
466
395
  case 'stats':
467
396
  switch (params.action) {
468
397
  case 'layer_summary':
469
- result = getLayerSummary();
398
+ result = await getLayerSummary();
470
399
  break;
471
400
  case 'db_stats':
472
- result = getStats();
401
+ result = await getStats();
473
402
  break;
474
403
  case 'clear':
475
404
  result = clearOldData(params);
@@ -485,11 +414,63 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
485
414
  case 'flush':
486
415
  result = flushWAL();
487
416
  break;
417
+ case 'help_action':
418
+ if (!params.target_tool || !params.target_action) {
419
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
420
+ }
421
+ else {
422
+ result = queryHelpAction(getAdapter(), params.target_tool, params.target_action);
423
+ }
424
+ break;
425
+ case 'help_params':
426
+ if (!params.target_tool || !params.target_action) {
427
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
428
+ }
429
+ else {
430
+ result = queryHelpParams(getAdapter(), params.target_tool, params.target_action);
431
+ }
432
+ break;
433
+ case 'help_tool':
434
+ if (!params.tool) {
435
+ result = { error: 'Parameter "tool" is required' };
436
+ }
437
+ else {
438
+ result = queryHelpTool(getAdapter(), params.tool);
439
+ }
440
+ break;
441
+ case 'help_use_case':
442
+ if (!params.use_case_id) {
443
+ result = { error: 'Parameter "use_case_id" is required' };
444
+ }
445
+ else {
446
+ result = queryHelpUseCase(getAdapter(), params.use_case_id);
447
+ }
448
+ break;
449
+ case 'help_list_use_cases':
450
+ result = queryHelpListUseCases(getAdapter(), {
451
+ category: params.category,
452
+ complexity: params.complexity,
453
+ limit: params.limit,
454
+ offset: params.offset
455
+ });
456
+ break;
457
+ case 'help_next_actions':
458
+ if (!params.target_tool || !params.target_action) {
459
+ result = { error: 'Parameters "target_tool" and "target_action" are required' };
460
+ }
461
+ else {
462
+ result = queryHelpNextActions(getAdapter(), params.target_tool, params.target_action);
463
+ }
464
+ break;
488
465
  case 'help':
489
- result = statsHelp();
466
+ const statsHelpContent = statsHelp();
467
+ trackAndReturnHelp('stats', 'help', JSON.stringify(statsHelpContent));
468
+ result = statsHelpContent;
490
469
  break;
491
470
  case 'example':
492
- result = statsExample();
471
+ const statsExampleContent = statsExample();
472
+ trackAndReturnHelp('stats', 'example', JSON.stringify(statsExampleContent));
473
+ result = statsExampleContent;
493
474
  break;
494
475
  default: throw new Error(`Unknown action: ${params.action}`);
495
476
  }
@@ -503,10 +484,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
503
484
  result = updateConfig(params);
504
485
  break;
505
486
  case 'help':
506
- result = configHelp();
487
+ const configHelpContent = configHelp();
488
+ trackAndReturnHelp('config', 'help', JSON.stringify(configHelpContent));
489
+ result = configHelpContent;
507
490
  break;
508
491
  case 'example':
509
- result = configExample();
492
+ const configExampleContent = configExample();
493
+ trackAndReturnHelp('config', 'example', JSON.stringify(configExampleContent));
494
+ result = configExampleContent;
510
495
  break;
511
496
  default: throw new Error(`Unknown action: ${params.action}`);
512
497
  }
@@ -514,46 +499,59 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
514
499
  case 'task':
515
500
  switch (params.action) {
516
501
  case 'create':
517
- result = createTask(params);
502
+ result = await createTask(params);
518
503
  break;
519
504
  case 'update':
520
- result = updateTask(params);
505
+ result = await updateTask(params);
521
506
  break;
522
507
  case 'get':
523
- result = getTask(params);
508
+ result = await getTask(params);
524
509
  break;
525
510
  case 'list':
526
- result = listTasks(params);
511
+ result = await listTasks(params);
527
512
  break;
528
513
  case 'move':
529
- result = moveTask(params);
514
+ result = await moveTask(params);
530
515
  break;
531
516
  case 'link':
532
- result = linkTask(params);
517
+ result = await linkTask(params);
533
518
  break;
534
519
  case 'archive':
535
- result = archiveTask(params);
520
+ result = await archiveTask(params);
536
521
  break;
537
522
  case 'batch_create':
538
- result = batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
523
+ result = await batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
539
524
  break;
540
525
  case 'add_dependency':
541
- result = addDependency(params);
526
+ result = await addDependency(params);
542
527
  break;
543
528
  case 'remove_dependency':
544
- result = removeDependency(params);
529
+ result = await removeDependency(params);
545
530
  break;
546
531
  case 'get_dependencies':
547
- result = getDependencies(params);
532
+ result = await getDependencies(params);
533
+ break;
534
+ case 'watch_files':
535
+ result = await watchFiles(params);
536
+ break;
537
+ case 'get_pruned_files':
538
+ result = await getPrunedFiles(params);
539
+ break;
540
+ case 'link_pruned_file':
541
+ result = await linkPrunedFile(params);
548
542
  break;
549
543
  case 'watcher':
550
- result = watcherStatus(params);
544
+ result = await watcherStatus(params);
551
545
  break;
552
546
  case 'help':
553
- result = taskHelp();
547
+ const taskHelpContent = taskHelp();
548
+ trackAndReturnHelp('task', 'help', JSON.stringify(taskHelpContent));
549
+ result = taskHelpContent;
554
550
  break;
555
551
  case 'example':
556
- result = taskExample();
552
+ const taskExampleContent = taskExample();
553
+ trackAndReturnHelp('task', 'example', JSON.stringify(taskExampleContent));
554
+ result = taskExampleContent;
557
555
  break;
558
556
  default: throw new Error(`Unknown action: ${params.action}`);
559
557
  }
@@ -561,12 +559,17 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
561
559
  default:
562
560
  throw new Error(`Unknown tool: ${name}`);
563
561
  }
562
+ // Debug logging: Success
563
+ debugLogToolResponse(name, action, true, result);
564
564
  return {
565
565
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
566
566
  };
567
567
  }
568
568
  catch (error) {
569
569
  const message = error instanceof Error ? error.message : String(error);
570
+ // Debug logging: Error
571
+ debugLogError(`Tool ${name}.${action}`, error);
572
+ debugLogToolResponse(name, action, false, undefined, { message });
570
573
  return {
571
574
  content: [{ type: 'text', text: JSON.stringify({ error: message }, null, 2) }],
572
575
  isError: true,
@@ -576,6 +579,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
576
579
  // Handle graceful shutdown
577
580
  process.on('SIGINT', async () => {
578
581
  console.error('\n✓ Shutting down MCP server...');
582
+ debugLog('INFO', 'Received SIGINT, shutting down gracefully');
579
583
  try {
580
584
  const watcher = FileWatcher.getInstance();
581
585
  await watcher.stop();
@@ -584,10 +588,12 @@ process.on('SIGINT', async () => {
584
588
  // Ignore watcher errors during shutdown
585
589
  }
586
590
  closeDatabase();
591
+ closeDebugLogger();
587
592
  process.exit(0);
588
593
  });
589
594
  process.on('SIGTERM', async () => {
590
595
  console.error('\n✓ Shutting down MCP server...');
596
+ debugLog('INFO', 'Received SIGTERM, shutting down gracefully');
591
597
  try {
592
598
  const watcher = FileWatcher.getInstance();
593
599
  await watcher.stop();
@@ -596,21 +602,63 @@ process.on('SIGTERM', async () => {
596
602
  // Ignore watcher errors during shutdown
597
603
  }
598
604
  closeDatabase();
605
+ closeDebugLogger();
599
606
  process.exit(0);
600
607
  });
601
608
  // Start server with stdio transport
602
609
  async function main() {
603
- const transport = new StdioServerTransport();
604
- await server.connect(transport);
605
- console.error('✓ MCP Shared Context Server running on stdio');
606
- // Start file watcher for auto-task-tracking
607
610
  try {
608
- const watcher = FileWatcher.getInstance();
609
- await watcher.start();
611
+ // 0. Ensure .sqlew directory and config template exist (first launch)
612
+ ensureSqlewDirectory();
613
+ // 1. Initialize database
614
+ const config = dbPath ? { connection: { filename: dbPath } } : undefined;
615
+ db = await initializeDatabase(config);
616
+ // Apply CLI config overrides if provided
617
+ if (parsedArgs.autodeleteIgnoreWeekend !== undefined) {
618
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND, parsedArgs.autodeleteIgnoreWeekend ? '1' : '0');
619
+ }
620
+ if (parsedArgs.autodeleteMessageHours !== undefined) {
621
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS, String(parsedArgs.autodeleteMessageHours));
622
+ }
623
+ if (parsedArgs.autodeleteFileHistoryDays !== undefined) {
624
+ await setConfigValue(db, CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS, String(parsedArgs.autodeleteFileHistoryDays));
625
+ }
626
+ // Display current config
627
+ const configValues = await getAllConfig(db);
628
+ const ignoreWeekend = configValues[CONFIG_KEYS.AUTODELETE_IGNORE_WEEKEND] === '1';
629
+ const messageHours = configValues[CONFIG_KEYS.AUTODELETE_MESSAGE_HOURS];
630
+ const fileHistoryDays = configValues[CONFIG_KEYS.AUTODELETE_FILE_HISTORY_DAYS];
631
+ console.error('✓ MCP Shared Context Server initialized');
632
+ if (dbPath) {
633
+ const source = parsedArgs.dbPath ? 'CLI' : 'config file';
634
+ console.error(` Database: ${dbPath} (from ${source})`);
635
+ }
636
+ console.error(` Auto-delete config: messages=${messageHours}h, file_history=${fileHistoryDays}d, ignore_weekend=${ignoreWeekend}`);
637
+ // Initialize debug logger (priority: CLI arg > environment variable > config file)
638
+ const debugLogPath = parsedArgs.debugLogPath || process.env.SQLEW_DEBUG || fileConfig.debug?.log_path;
639
+ initDebugLogger(debugLogPath);
640
+ debugLog('INFO', 'MCP Shared Context Server initialized', {
641
+ dbPath,
642
+ autoDeleteConfig: { messageHours, fileHistoryDays, ignoreWeekend }
643
+ });
644
+ // 2. Connect MCP server
645
+ const transport = new StdioServerTransport();
646
+ await server.connect(transport);
647
+ console.error('✓ MCP Shared Context Server running on stdio');
648
+ // 3. Start file watcher for auto-task-tracking (after database is ready)
649
+ try {
650
+ const watcher = FileWatcher.getInstance();
651
+ await watcher.start();
652
+ }
653
+ catch (error) {
654
+ console.error('⚠ Failed to start file watcher:', error);
655
+ console.error(' (Auto task tracking will be disabled)');
656
+ }
610
657
  }
611
658
  catch (error) {
612
- console.error(' Failed to start file watcher:', error);
613
- console.error(' (Auto task tracking will be disabled)');
659
+ console.error(' Failed to initialize database:', error);
660
+ closeDatabase();
661
+ process.exit(1);
614
662
  }
615
663
  }
616
664
  main().catch((error) => {