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.
- package/CHANGELOG.md +247 -1772
- package/README.md +70 -304
- package/assets/config.example.toml +97 -0
- 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.map +1 -1
- package/dist/config/loader.js +4 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database.d.ts +44 -122
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +145 -416
- package/dist/database.js.map +1 -1
- package/dist/index.js +215 -185
- 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/index.d.ts +25 -12
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +147 -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.js +89 -70
- package/dist/tests/git-aware-completion.test.js.map +1 -1
- 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.js +92 -78
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-partial.test.js +106 -95
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-persistence.test.js +115 -97
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -1
- package/dist/tests/tasks.auto-pruning-safety.test.js +124 -103
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -1
- 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.js +116 -104
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +122 -101
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-parameter.test.js +105 -94
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
- package/dist/tests/two-step-git-completion.test.js +176 -133
- package/dist/tests/two-step-git-completion.test.js.map +1 -1
- package/dist/tests/vcs-staging.test.js +1 -1
- package/dist/tests/vcs-staging.test.js.map +1 -1
- package/dist/tools/config.d.ts +9 -6
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +16 -14
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +10 -7
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +66 -48
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +36 -33
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +374 -330
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +12 -9
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +173 -95
- 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 +14 -11
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +217 -133
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +18 -16
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +513 -439
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +14 -11
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +86 -121
- package/dist/tools/utils.js.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/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/retention.d.ts +7 -7
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +12 -12
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +15 -13
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +100 -302
- 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/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.map +1 -1
- package/dist/watcher/file-watcher.js +25 -11
- package/dist/watcher/file-watcher.js.map +1 -1
- package/docs/BEST_PRACTICES.md +56 -448
- package/docs/MIGRATION_v3.6.0.md +170 -0
- package/docs/SHARED_CONCEPTS.md +63 -208
- package/docs/TASK_OVERVIEW.md +2 -2
- package/docs/TOOL_SELECTION.md +41 -248
- 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
|
-
|
|
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,36 +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
|
-
// 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
|
-
|
|
305
|
+
const helpContent = decisionHelp();
|
|
306
|
+
trackAndReturnHelp('decision', 'help', JSON.stringify(helpContent));
|
|
307
|
+
result = helpContent;
|
|
402
308
|
break;
|
|
403
309
|
case 'example':
|
|
404
|
-
|
|
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
|
-
|
|
332
|
+
const msgHelpContent = messageHelp();
|
|
333
|
+
trackAndReturnHelp('message', 'help', JSON.stringify(msgHelpContent));
|
|
334
|
+
result = msgHelpContent;
|
|
425
335
|
break;
|
|
426
336
|
case 'example':
|
|
427
|
-
|
|
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
|
-
|
|
359
|
+
const fileHelpContent = fileHelp();
|
|
360
|
+
trackAndReturnHelp('file', 'help', JSON.stringify(fileHelpContent));
|
|
361
|
+
result = fileHelpContent;
|
|
448
362
|
break;
|
|
449
363
|
case 'example':
|
|
450
|
-
|
|
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
|
-
|
|
383
|
+
const constraintHelpContent = constraintHelp();
|
|
384
|
+
trackAndReturnHelp('constraint', 'help', JSON.stringify(constraintHelpContent));
|
|
385
|
+
result = constraintHelpContent;
|
|
468
386
|
break;
|
|
469
387
|
case 'example':
|
|
470
|
-
|
|
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
|
-
|
|
466
|
+
const statsHelpContent = statsHelp();
|
|
467
|
+
trackAndReturnHelp('stats', 'help', JSON.stringify(statsHelpContent));
|
|
468
|
+
result = statsHelpContent;
|
|
499
469
|
break;
|
|
500
470
|
case 'example':
|
|
501
|
-
|
|
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
|
-
|
|
487
|
+
const configHelpContent = configHelp();
|
|
488
|
+
trackAndReturnHelp('config', 'help', JSON.stringify(configHelpContent));
|
|
489
|
+
result = configHelpContent;
|
|
516
490
|
break;
|
|
517
491
|
case 'example':
|
|
518
|
-
|
|
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
|
-
|
|
547
|
+
const taskHelpContent = taskHelp();
|
|
548
|
+
trackAndReturnHelp('task', 'help', JSON.stringify(taskHelpContent));
|
|
549
|
+
result = taskHelpContent;
|
|
572
550
|
break;
|
|
573
551
|
case 'example':
|
|
574
|
-
|
|
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
|
-
|
|
627
|
-
|
|
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('
|
|
631
|
-
|
|
659
|
+
console.error('✗ Failed to initialize database:', error);
|
|
660
|
+
closeDatabase();
|
|
661
|
+
process.exit(1);
|
|
632
662
|
}
|
|
633
663
|
}
|
|
634
664
|
main().catch((error) => {
|