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.
- package/CHANGELOG.md +288 -1011
- package/README.md +80 -263
- package/assets/config.example.toml +97 -0
- package/assets/schema.sql +6 -1
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mysql-adapter.d.ts +31 -0
- package/dist/adapters/mysql-adapter.d.ts.map +1 -0
- package/dist/adapters/mysql-adapter.js +63 -0
- package/dist/adapters/mysql-adapter.js.map +1 -0
- package/dist/adapters/postgresql-adapter.d.ts +31 -0
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
- package/dist/adapters/postgresql-adapter.js +63 -0
- package/dist/adapters/postgresql-adapter.js.map +1 -0
- package/dist/adapters/sqlite-adapter.d.ts +37 -0
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite-adapter.js +129 -0
- package/dist/adapters/sqlite-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +33 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.js +55 -54
- package/dist/cli.js.map +1 -1
- package/dist/config/example-generator.d.ts +11 -0
- package/dist/config/example-generator.d.ts.map +1 -0
- package/dist/config/example-generator.js +48 -0
- package/dist/config/example-generator.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +155 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +86 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +28 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +44 -122
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +145 -349
- package/dist/database.js.map +1 -1
- package/dist/index.js +223 -175
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts +6 -0
- package/dist/knexfile.d.ts.map +1 -0
- package/dist/knexfile.js +85 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/migrations/add-help-system-tables.d.ts +35 -0
- package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
- package/dist/migrations/add-help-system-tables.js +206 -0
- package/dist/migrations/add-help-system-tables.js.map +1 -0
- package/dist/migrations/add-token-tracking.d.ts +28 -0
- package/dist/migrations/add-token-tracking.d.ts.map +1 -0
- package/dist/migrations/add-token-tracking.js +108 -0
- package/dist/migrations/add-token-tracking.js.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
- package/dist/migrations/index.d.ts +26 -12
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +162 -20
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.js +143 -0
- package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/migrations/seed-help-data.d.ts +48 -0
- package/dist/migrations/seed-help-data.d.ts.map +1 -0
- package/dist/migrations/seed-help-data.js +1466 -0
- package/dist/migrations/seed-help-data.js.map +1 -0
- package/dist/migrations/seed-tool-metadata.d.ts +24 -0
- package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
- package/dist/migrations/seed-tool-metadata.js +392 -0
- package/dist/migrations/seed-tool-metadata.js.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -1
- package/dist/tests/git-aware-completion.test.d.ts +6 -0
- package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
- package/dist/tests/git-aware-completion.test.js +160 -0
- package/dist/tests/git-aware-completion.test.js.map +1 -0
- package/dist/tests/help-system.test.d.ts +23 -0
- package/dist/tests/help-system.test.d.ts.map +1 -0
- package/dist/tests/help-system.test.js +374 -0
- package/dist/tests/help-system.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js +264 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js +285 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js +250 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js +217 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
- package/dist/tests/tasks.dependencies.test.js +338 -307
- package/dist/tests/tasks.dependencies.test.js.map +1 -1
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +247 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.js +372 -0
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.js +260 -0
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
- package/dist/tests/two-step-git-completion.test.d.ts +6 -0
- package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
- package/dist/tests/two-step-git-completion.test.js +326 -0
- package/dist/tests/two-step-git-completion.test.js.map +1 -0
- package/dist/tests/vcs-staging.test.d.ts +6 -0
- package/dist/tests/vcs-staging.test.d.ts.map +1 -0
- package/dist/tests/vcs-staging.test.js +137 -0
- package/dist/tests/vcs-staging.test.js.map +1 -0
- package/dist/tools/config.d.ts +9 -4
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +16 -12
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +9 -3
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +66 -45
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +35 -16
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +374 -314
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +11 -4
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +173 -91
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/help-queries.d.ts +130 -0
- package/dist/tools/help-queries.d.ts.map +1 -0
- package/dist/tools/help-queries.js +393 -0
- package/dist/tools/help-queries.js.map +1 -0
- package/dist/tools/messaging.d.ts +13 -6
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +217 -129
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +42 -12
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +809 -347
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +13 -5
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +92 -115
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/activity-logging.d.ts +114 -0
- package/dist/utils/activity-logging.d.ts.map +1 -0
- package/dist/utils/activity-logging.js +162 -0
- package/dist/utils/activity-logging.js.map +1 -0
- package/dist/utils/batch.d.ts +2 -2
- package/dist/utils/batch.d.ts.map +1 -1
- package/dist/utils/batch.js +8 -8
- package/dist/utils/batch.js.map +1 -1
- package/dist/utils/cleanup.d.ts +21 -13
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +31 -24
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/debug-logger.d.ts +44 -0
- package/dist/utils/debug-logger.d.ts.map +1 -0
- package/dist/utils/debug-logger.js +116 -0
- package/dist/utils/debug-logger.js.map +1 -0
- package/dist/utils/file-pruning.d.ts +69 -0
- package/dist/utils/file-pruning.d.ts.map +1 -0
- package/dist/utils/file-pruning.js +185 -0
- package/dist/utils/file-pruning.js.map +1 -0
- package/dist/utils/help-tracking.d.ts +55 -0
- package/dist/utils/help-tracking.d.ts.map +1 -0
- package/dist/utils/help-tracking.js +88 -0
- package/dist/utils/help-tracking.js.map +1 -0
- package/dist/utils/quality-checks.d.ts +60 -0
- package/dist/utils/quality-checks.d.ts.map +1 -0
- package/dist/utils/quality-checks.js +228 -0
- package/dist/utils/quality-checks.js.map +1 -0
- package/dist/utils/retention.d.ts +13 -5
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +20 -8
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +77 -7
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +309 -34
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/utils/token-estimation.d.ts +72 -0
- package/dist/utils/token-estimation.d.ts.map +1 -0
- package/dist/utils/token-estimation.js +71 -0
- package/dist/utils/token-estimation.js.map +1 -0
- package/dist/utils/token-logging.d.ts +48 -0
- package/dist/utils/token-logging.d.ts.map +1 -0
- package/dist/utils/token-logging.js +112 -0
- package/dist/utils/token-logging.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +68 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -0
- package/dist/utils/vcs-adapter.js +187 -0
- package/dist/utils/vcs-adapter.js.map +1 -0
- package/dist/utils/view-queries.d.ts +34 -0
- package/dist/utils/view-queries.d.ts.map +1 -0
- package/dist/utils/view-queries.js +192 -0
- package/dist/utils/view-queries.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +54 -4
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +329 -33
- package/dist/watcher/file-watcher.js.map +1 -1
- package/dist/watcher/gitignore-parser.d.ts +70 -0
- package/dist/watcher/gitignore-parser.d.ts.map +1 -0
- package/dist/watcher/gitignore-parser.js +191 -0
- package/dist/watcher/gitignore-parser.js.map +1 -0
- package/dist/watcher/index.d.ts +1 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -0
- package/dist/watcher/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +12 -0
- package/docs/AUTO_FILE_TRACKING.md +486 -82
- package/docs/BEST_PRACTICES.md +56 -448
- package/docs/CONFIGURATION.md +908 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
- package/docs/MIGRATION_v3.3.md +602 -0
- package/docs/MIGRATION_v3.6.0.md +170 -0
- package/docs/SHARED_CONCEPTS.md +65 -209
- package/docs/TASK_ACTIONS.md +12 -0
- package/docs/TASK_OVERVIEW.md +125 -24
- package/docs/TASK_PRUNING.md +589 -0
- package/docs/TASK_SYSTEM.md +83 -13
- package/docs/TOOL_REFERENCE.md +94 -6
- package/docs/TOOL_SELECTION.md +41 -248
- 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
|
-
|
|
57
|
-
//
|
|
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: {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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: {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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: {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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: {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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: {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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: {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
-
|
|
305
|
+
const helpContent = decisionHelp();
|
|
306
|
+
trackAndReturnHelp('decision', 'help', JSON.stringify(helpContent));
|
|
307
|
+
result = helpContent;
|
|
393
308
|
break;
|
|
394
309
|
case 'example':
|
|
395
|
-
|
|
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
|
-
|
|
332
|
+
const msgHelpContent = messageHelp();
|
|
333
|
+
trackAndReturnHelp('message', 'help', JSON.stringify(msgHelpContent));
|
|
334
|
+
result = msgHelpContent;
|
|
416
335
|
break;
|
|
417
336
|
case 'example':
|
|
418
|
-
|
|
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
|
-
|
|
359
|
+
const fileHelpContent = fileHelp();
|
|
360
|
+
trackAndReturnHelp('file', 'help', JSON.stringify(fileHelpContent));
|
|
361
|
+
result = fileHelpContent;
|
|
439
362
|
break;
|
|
440
363
|
case 'example':
|
|
441
|
-
|
|
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
|
-
|
|
383
|
+
const constraintHelpContent = constraintHelp();
|
|
384
|
+
trackAndReturnHelp('constraint', 'help', JSON.stringify(constraintHelpContent));
|
|
385
|
+
result = constraintHelpContent;
|
|
459
386
|
break;
|
|
460
387
|
case 'example':
|
|
461
|
-
|
|
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
|
-
|
|
466
|
+
const statsHelpContent = statsHelp();
|
|
467
|
+
trackAndReturnHelp('stats', 'help', JSON.stringify(statsHelpContent));
|
|
468
|
+
result = statsHelpContent;
|
|
490
469
|
break;
|
|
491
470
|
case 'example':
|
|
492
|
-
|
|
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
|
-
|
|
487
|
+
const configHelpContent = configHelp();
|
|
488
|
+
trackAndReturnHelp('config', 'help', JSON.stringify(configHelpContent));
|
|
489
|
+
result = configHelpContent;
|
|
507
490
|
break;
|
|
508
491
|
case 'example':
|
|
509
|
-
|
|
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
|
-
|
|
547
|
+
const taskHelpContent = taskHelp();
|
|
548
|
+
trackAndReturnHelp('task', 'help', JSON.stringify(taskHelpContent));
|
|
549
|
+
result = taskHelpContent;
|
|
554
550
|
break;
|
|
555
551
|
case 'example':
|
|
556
|
-
|
|
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
|
-
|
|
609
|
-
|
|
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('
|
|
613
|
-
|
|
659
|
+
console.error('✗ Failed to initialize database:', error);
|
|
660
|
+
closeDatabase();
|
|
661
|
+
process.exit(1);
|
|
614
662
|
}
|
|
615
663
|
}
|
|
616
664
|
main().catch((error) => {
|