sqlew 3.5.3 → 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 (227) hide show
  1. package/CHANGELOG.md +247 -1772
  2. package/README.md +70 -304
  3. package/assets/config.example.toml +97 -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 +9 -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 +44 -122
  37. package/dist/database.d.ts.map +1 -1
  38. package/dist/database.js +145 -416
  39. package/dist/database.js.map +1 -1
  40. package/dist/index.js +215 -185
  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/seed-help-data.d.ts +48 -0
  107. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  108. package/dist/migrations/seed-help-data.js +1466 -0
  109. package/dist/migrations/seed-help-data.js.map +1 -0
  110. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  111. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  112. package/dist/migrations/seed-tool-metadata.js +392 -0
  113. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  114. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  115. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  116. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  117. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  118. package/dist/schema.d.ts.map +1 -1
  119. package/dist/schema.js +2 -0
  120. package/dist/schema.js.map +1 -1
  121. package/dist/tests/git-aware-completion.test.js +89 -70
  122. package/dist/tests/git-aware-completion.test.js.map +1 -1
  123. package/dist/tests/help-system.test.d.ts +23 -0
  124. package/dist/tests/help-system.test.d.ts.map +1 -0
  125. package/dist/tests/help-system.test.js +374 -0
  126. package/dist/tests/help-system.test.js.map +1 -0
  127. package/dist/tests/tasks.auto-pruning-decision-link.test.js +92 -78
  128. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -1
  129. package/dist/tests/tasks.auto-pruning-partial.test.js +106 -95
  130. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
  131. package/dist/tests/tasks.auto-pruning-persistence.test.js +115 -97
  132. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -1
  133. package/dist/tests/tasks.auto-pruning-safety.test.js +124 -103
  134. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -1
  135. package/dist/tests/tasks.dependencies.test.js +338 -307
  136. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  137. package/dist/tests/tasks.link-file-backward-compat.test.js +116 -104
  138. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  139. package/dist/tests/tasks.watch-files-action.test.js +122 -101
  140. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  141. package/dist/tests/tasks.watch-files-parameter.test.js +105 -94
  142. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
  143. package/dist/tests/two-step-git-completion.test.js +176 -133
  144. package/dist/tests/two-step-git-completion.test.js.map +1 -1
  145. package/dist/tests/vcs-staging.test.js +1 -1
  146. package/dist/tests/vcs-staging.test.js.map +1 -1
  147. package/dist/tools/config.d.ts +9 -6
  148. package/dist/tools/config.d.ts.map +1 -1
  149. package/dist/tools/config.js +16 -14
  150. package/dist/tools/config.js.map +1 -1
  151. package/dist/tools/constraints.d.ts +10 -7
  152. package/dist/tools/constraints.d.ts.map +1 -1
  153. package/dist/tools/constraints.js +66 -48
  154. package/dist/tools/constraints.js.map +1 -1
  155. package/dist/tools/context.d.ts +36 -33
  156. package/dist/tools/context.d.ts.map +1 -1
  157. package/dist/tools/context.js +374 -330
  158. package/dist/tools/context.js.map +1 -1
  159. package/dist/tools/files.d.ts +12 -9
  160. package/dist/tools/files.d.ts.map +1 -1
  161. package/dist/tools/files.js +173 -95
  162. package/dist/tools/files.js.map +1 -1
  163. package/dist/tools/help-queries.d.ts +130 -0
  164. package/dist/tools/help-queries.d.ts.map +1 -0
  165. package/dist/tools/help-queries.js +393 -0
  166. package/dist/tools/help-queries.js.map +1 -0
  167. package/dist/tools/messaging.d.ts +14 -11
  168. package/dist/tools/messaging.d.ts.map +1 -1
  169. package/dist/tools/messaging.js +217 -133
  170. package/dist/tools/messaging.js.map +1 -1
  171. package/dist/tools/tasks.d.ts +18 -16
  172. package/dist/tools/tasks.d.ts.map +1 -1
  173. package/dist/tools/tasks.js +513 -439
  174. package/dist/tools/tasks.js.map +1 -1
  175. package/dist/tools/utils.d.ts +14 -11
  176. package/dist/tools/utils.d.ts.map +1 -1
  177. package/dist/tools/utils.js +86 -121
  178. package/dist/tools/utils.js.map +1 -1
  179. package/dist/utils/activity-logging.d.ts +114 -0
  180. package/dist/utils/activity-logging.d.ts.map +1 -0
  181. package/dist/utils/activity-logging.js +162 -0
  182. package/dist/utils/activity-logging.js.map +1 -0
  183. package/dist/utils/batch.d.ts +2 -2
  184. package/dist/utils/batch.d.ts.map +1 -1
  185. package/dist/utils/batch.js +8 -8
  186. package/dist/utils/batch.js.map +1 -1
  187. package/dist/utils/cleanup.d.ts +21 -13
  188. package/dist/utils/cleanup.d.ts.map +1 -1
  189. package/dist/utils/cleanup.js +31 -24
  190. package/dist/utils/cleanup.js.map +1 -1
  191. package/dist/utils/debug-logger.d.ts +44 -0
  192. package/dist/utils/debug-logger.d.ts.map +1 -0
  193. package/dist/utils/debug-logger.js +116 -0
  194. package/dist/utils/debug-logger.js.map +1 -0
  195. package/dist/utils/help-tracking.d.ts +55 -0
  196. package/dist/utils/help-tracking.d.ts.map +1 -0
  197. package/dist/utils/help-tracking.js +88 -0
  198. package/dist/utils/help-tracking.js.map +1 -0
  199. package/dist/utils/retention.d.ts +7 -7
  200. package/dist/utils/retention.d.ts.map +1 -1
  201. package/dist/utils/retention.js +12 -12
  202. package/dist/utils/retention.js.map +1 -1
  203. package/dist/utils/task-stale-detection.d.ts +15 -13
  204. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  205. package/dist/utils/task-stale-detection.js +100 -302
  206. package/dist/utils/task-stale-detection.js.map +1 -1
  207. package/dist/utils/token-estimation.d.ts +72 -0
  208. package/dist/utils/token-estimation.d.ts.map +1 -0
  209. package/dist/utils/token-estimation.js +71 -0
  210. package/dist/utils/token-estimation.js.map +1 -0
  211. package/dist/utils/token-logging.d.ts +48 -0
  212. package/dist/utils/token-logging.d.ts.map +1 -0
  213. package/dist/utils/token-logging.js +112 -0
  214. package/dist/utils/token-logging.js.map +1 -0
  215. package/dist/utils/view-queries.d.ts +34 -0
  216. package/dist/utils/view-queries.d.ts.map +1 -0
  217. package/dist/utils/view-queries.js +192 -0
  218. package/dist/utils/view-queries.js.map +1 -0
  219. package/dist/watcher/file-watcher.d.ts.map +1 -1
  220. package/dist/watcher/file-watcher.js +25 -11
  221. package/dist/watcher/file-watcher.js.map +1 -1
  222. package/docs/BEST_PRACTICES.md +56 -448
  223. package/docs/MIGRATION_v3.6.0.md +170 -0
  224. package/docs/SHARED_CONCEPTS.md +63 -208
  225. package/docs/TASK_OVERVIEW.md +2 -2
  226. package/docs/TOOL_SELECTION.md +41 -248
  227. package/package.json +16 -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,10 @@ 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, 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,36 +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', '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' },
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
+ }
321
222
  },
322
223
  required: ['action'],
323
224
  },
@@ -329,6 +230,9 @@ Use action: "example" for comprehensive usage examples.`,
329
230
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
330
231
  const { name, arguments: args } = request.params;
331
232
  const params = args;
233
+ const action = params.action || 'N/A';
234
+ // Debug logging: Tool call
235
+ debugLogToolCall(name, action, params);
332
236
  try {
333
237
  let result;
334
238
  switch (name) {
@@ -398,10 +302,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
398
302
  result = listDecisionContextsAction(params);
399
303
  break;
400
304
  case 'help':
401
- result = decisionHelp();
305
+ const helpContent = decisionHelp();
306
+ trackAndReturnHelp('decision', 'help', JSON.stringify(helpContent));
307
+ result = helpContent;
402
308
  break;
403
309
  case 'example':
404
- result = decisionExample();
310
+ const exampleContent = decisionExample();
311
+ trackAndReturnHelp('decision', 'example', JSON.stringify(exampleContent));
312
+ result = exampleContent;
405
313
  break;
406
314
  default: throw new Error(`Unknown action: ${params.action}`);
407
315
  }
@@ -421,10 +329,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
421
329
  result = sendMessageBatch({ messages: params.messages, atomic: params.atomic });
422
330
  break;
423
331
  case 'help':
424
- result = messageHelp();
332
+ const msgHelpContent = messageHelp();
333
+ trackAndReturnHelp('message', 'help', JSON.stringify(msgHelpContent));
334
+ result = msgHelpContent;
425
335
  break;
426
336
  case 'example':
427
- result = messageExample();
337
+ const msgExampleContent = messageExample();
338
+ trackAndReturnHelp('message', 'example', JSON.stringify(msgExampleContent));
339
+ result = msgExampleContent;
428
340
  break;
429
341
  default: throw new Error(`Unknown action: ${params.action}`);
430
342
  }
@@ -444,10 +356,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
444
356
  result = recordFileChangeBatch({ file_changes: params.file_changes, atomic: params.atomic });
445
357
  break;
446
358
  case 'help':
447
- result = fileHelp();
359
+ const fileHelpContent = fileHelp();
360
+ trackAndReturnHelp('file', 'help', JSON.stringify(fileHelpContent));
361
+ result = fileHelpContent;
448
362
  break;
449
363
  case 'example':
450
- result = fileExample();
364
+ const fileExampleContent = fileExample();
365
+ trackAndReturnHelp('file', 'example', JSON.stringify(fileExampleContent));
366
+ result = fileExampleContent;
451
367
  break;
452
368
  default: throw new Error(`Unknown action: ${params.action}`);
453
369
  }
@@ -464,10 +380,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
464
380
  result = deactivateConstraint(params);
465
381
  break;
466
382
  case 'help':
467
- result = constraintHelp();
383
+ const constraintHelpContent = constraintHelp();
384
+ trackAndReturnHelp('constraint', 'help', JSON.stringify(constraintHelpContent));
385
+ result = constraintHelpContent;
468
386
  break;
469
387
  case 'example':
470
- result = constraintExample();
388
+ const constraintExampleContent = constraintExample();
389
+ trackAndReturnHelp('constraint', 'example', JSON.stringify(constraintExampleContent));
390
+ result = constraintExampleContent;
471
391
  break;
472
392
  default: throw new Error(`Unknown action: ${params.action}`);
473
393
  }
@@ -475,10 +395,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
475
395
  case 'stats':
476
396
  switch (params.action) {
477
397
  case 'layer_summary':
478
- result = getLayerSummary();
398
+ result = await getLayerSummary();
479
399
  break;
480
400
  case 'db_stats':
481
- result = getStats();
401
+ result = await getStats();
482
402
  break;
483
403
  case 'clear':
484
404
  result = clearOldData(params);
@@ -494,11 +414,63 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
494
414
  case 'flush':
495
415
  result = flushWAL();
496
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;
497
465
  case 'help':
498
- result = statsHelp();
466
+ const statsHelpContent = statsHelp();
467
+ trackAndReturnHelp('stats', 'help', JSON.stringify(statsHelpContent));
468
+ result = statsHelpContent;
499
469
  break;
500
470
  case 'example':
501
- result = statsExample();
471
+ const statsExampleContent = statsExample();
472
+ trackAndReturnHelp('stats', 'example', JSON.stringify(statsExampleContent));
473
+ result = statsExampleContent;
502
474
  break;
503
475
  default: throw new Error(`Unknown action: ${params.action}`);
504
476
  }
@@ -512,10 +484,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
512
484
  result = updateConfig(params);
513
485
  break;
514
486
  case 'help':
515
- result = configHelp();
487
+ const configHelpContent = configHelp();
488
+ trackAndReturnHelp('config', 'help', JSON.stringify(configHelpContent));
489
+ result = configHelpContent;
516
490
  break;
517
491
  case 'example':
518
- result = configExample();
492
+ const configExampleContent = configExample();
493
+ trackAndReturnHelp('config', 'example', JSON.stringify(configExampleContent));
494
+ result = configExampleContent;
519
495
  break;
520
496
  default: throw new Error(`Unknown action: ${params.action}`);
521
497
  }
@@ -523,55 +499,59 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
523
499
  case 'task':
524
500
  switch (params.action) {
525
501
  case 'create':
526
- result = createTask(params);
502
+ result = await createTask(params);
527
503
  break;
528
504
  case 'update':
529
- result = updateTask(params);
505
+ result = await updateTask(params);
530
506
  break;
531
507
  case 'get':
532
- result = getTask(params);
508
+ result = await getTask(params);
533
509
  break;
534
510
  case 'list':
535
511
  result = await listTasks(params);
536
512
  break;
537
513
  case 'move':
538
- result = moveTask(params);
514
+ result = await moveTask(params);
539
515
  break;
540
516
  case 'link':
541
- result = linkTask(params);
517
+ result = await linkTask(params);
542
518
  break;
543
519
  case 'archive':
544
- result = archiveTask(params);
520
+ result = await archiveTask(params);
545
521
  break;
546
522
  case 'batch_create':
547
- result = batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
523
+ result = await batchCreateTasks({ tasks: params.tasks, atomic: params.atomic });
548
524
  break;
549
525
  case 'add_dependency':
550
- result = addDependency(params);
526
+ result = await addDependency(params);
551
527
  break;
552
528
  case 'remove_dependency':
553
- result = removeDependency(params);
529
+ result = await removeDependency(params);
554
530
  break;
555
531
  case 'get_dependencies':
556
- result = getDependencies(params);
532
+ result = await getDependencies(params);
557
533
  break;
558
534
  case 'watch_files':
559
- result = watchFiles(params);
535
+ result = await watchFiles(params);
560
536
  break;
561
537
  case 'get_pruned_files':
562
- result = getPrunedFiles(params);
538
+ result = await getPrunedFiles(params);
563
539
  break;
564
540
  case 'link_pruned_file':
565
- result = linkPrunedFile(params);
541
+ result = await linkPrunedFile(params);
566
542
  break;
567
543
  case 'watcher':
568
- result = watcherStatus(params);
544
+ result = await watcherStatus(params);
569
545
  break;
570
546
  case 'help':
571
- result = taskHelp();
547
+ const taskHelpContent = taskHelp();
548
+ trackAndReturnHelp('task', 'help', JSON.stringify(taskHelpContent));
549
+ result = taskHelpContent;
572
550
  break;
573
551
  case 'example':
574
- result = taskExample();
552
+ const taskExampleContent = taskExample();
553
+ trackAndReturnHelp('task', 'example', JSON.stringify(taskExampleContent));
554
+ result = taskExampleContent;
575
555
  break;
576
556
  default: throw new Error(`Unknown action: ${params.action}`);
577
557
  }
@@ -579,12 +559,17 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
579
559
  default:
580
560
  throw new Error(`Unknown tool: ${name}`);
581
561
  }
562
+ // Debug logging: Success
563
+ debugLogToolResponse(name, action, true, result);
582
564
  return {
583
565
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
584
566
  };
585
567
  }
586
568
  catch (error) {
587
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 });
588
573
  return {
589
574
  content: [{ type: 'text', text: JSON.stringify({ error: message }, null, 2) }],
590
575
  isError: true,
@@ -594,6 +579,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
594
579
  // Handle graceful shutdown
595
580
  process.on('SIGINT', async () => {
596
581
  console.error('\n✓ Shutting down MCP server...');
582
+ debugLog('INFO', 'Received SIGINT, shutting down gracefully');
597
583
  try {
598
584
  const watcher = FileWatcher.getInstance();
599
585
  await watcher.stop();
@@ -602,10 +588,12 @@ process.on('SIGINT', async () => {
602
588
  // Ignore watcher errors during shutdown
603
589
  }
604
590
  closeDatabase();
591
+ closeDebugLogger();
605
592
  process.exit(0);
606
593
  });
607
594
  process.on('SIGTERM', async () => {
608
595
  console.error('\n✓ Shutting down MCP server...');
596
+ debugLog('INFO', 'Received SIGTERM, shutting down gracefully');
609
597
  try {
610
598
  const watcher = FileWatcher.getInstance();
611
599
  await watcher.stop();
@@ -614,21 +602,63 @@ process.on('SIGTERM', async () => {
614
602
  // Ignore watcher errors during shutdown
615
603
  }
616
604
  closeDatabase();
605
+ closeDebugLogger();
617
606
  process.exit(0);
618
607
  });
619
608
  // Start server with stdio transport
620
609
  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
610
  try {
626
- const watcher = FileWatcher.getInstance();
627
- 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
+ }
628
657
  }
629
658
  catch (error) {
630
- console.error(' Failed to start file watcher:', error);
631
- console.error(' (Auto task tracking will be disabled)');
659
+ console.error(' Failed to initialize database:', error);
660
+ closeDatabase();
661
+ process.exit(1);
632
662
  }
633
663
  }
634
664
  main().catch((error) => {