sqlew 3.6.3 → 3.6.6
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 +89 -0
- package/LICENSE +52 -52
- package/README.md +45 -3
- package/assets/config.example.toml +41 -0
- package/assets/sample-agents/README.md +38 -0
- package/assets/sample-agents/sqlew-architect.md +247 -0
- package/assets/sample-agents/sqlew-researcher.md +189 -0
- package/assets/sample-agents/sqlew-scrum-master.md +236 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +13 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/minimal-generator.d.ts +25 -0
- package/dist/config/minimal-generator.d.ts.map +1 -0
- package/dist/config/minimal-generator.js +103 -0
- package/dist/config/minimal-generator.js.map +1 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -1
- package/dist/database.d.ts +6 -9
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +30 -106
- package/dist/database.js.map +1 -1
- package/dist/index.js +36 -72
- package/dist/index.js.map +1 -1
- package/dist/init-agents.d.ts +7 -0
- package/dist/init-agents.d.ts.map +1 -0
- package/dist/init-agents.js +207 -0
- package/dist/init-agents.js.map +1 -0
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -1
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js +49 -34
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js +211 -175
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts +23 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js +44 -0
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/sync-agents.d.ts +13 -0
- package/dist/sync-agents.d.ts.map +1 -0
- package/dist/sync-agents.js +112 -0
- package/dist/sync-agents.js.map +1 -0
- package/dist/tests/all-features.test.js +0 -71
- package/dist/tests/all-features.test.js.map +1 -1
- package/dist/tests/parameter-validation.test.d.ts +8 -0
- package/dist/tests/parameter-validation.test.d.ts.map +1 -0
- package/dist/tests/parameter-validation.test.js +461 -0
- package/dist/tests/parameter-validation.test.js.map +1 -0
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +7 -8
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +68 -39
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +9 -7
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/help-queries.d.ts.map +1 -1
- package/dist/tools/help-queries.js +20 -14
- package/dist/tools/help-queries.js.map +1 -1
- package/dist/tools/messaging.d.ts +4 -0
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +38 -0
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +13 -0
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +15 -12
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +93 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/action-specs.d.ts +46 -0
- package/dist/utils/action-specs.d.ts.map +1 -0
- package/dist/utils/action-specs.js +527 -0
- package/dist/utils/action-specs.js.map +1 -0
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +41 -24
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts +53 -0
- package/dist/utils/parameter-validator.d.ts.map +1 -0
- package/dist/utils/parameter-validator.js +286 -0
- package/dist/utils/parameter-validator.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +11 -5
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +43 -10
- package/dist/watcher/file-watcher.js.map +1 -1
- package/docs/BEST_PRACTICES.md +69 -0
- package/docs/CONFIGURATION.md +35 -19
- package/docs/SPECIALIZED_AGENTS.md +576 -0
- package/docs/TOOL_REFERENCE.md +178 -0
- package/package.json +86 -85
- package/dist/tests/agent-reuse.test.d.ts +0 -6
- package/dist/tests/agent-reuse.test.d.ts.map +0 -1
- package/dist/tests/agent-reuse.test.js +0 -242
- package/dist/tests/agent-reuse.test.js.map +0 -1
- package/dist/tools/config.d.ts +0 -50
- package/dist/tools/config.d.ts.map +0 -1
- package/dist/tools/config.js +0 -170
- package/dist/tools/config.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAU;IAKpC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,SAAS,CAAC;IAExD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,MAAc,EACd,KAAU,EACV,MAAY;IAEZ,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEhE,iDAAiD;IACjD,aAAa,CAAC,QAAQ,QAAQ,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE;QACjD,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter Validation with Typo Detection for MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive parameter validation with:
|
|
5
|
+
* - Missing required parameter detection
|
|
6
|
+
* - Typo suggestions using Levenshtein distance
|
|
7
|
+
* - Structured error messages with examples
|
|
8
|
+
* - Support for all sqlew MCP tools
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* validateActionParams('decision', 'set', params);
|
|
12
|
+
* // Throws ValidationError with structured details if validation fails
|
|
13
|
+
*/
|
|
14
|
+
import type { DecisionAction, TaskAction, FileAction, ConstraintAction, StatsAction, ConfigAction, MessageAction } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Validate action parameters and throw structured error if invalid
|
|
17
|
+
*
|
|
18
|
+
* @param tool Tool name (e.g., 'decision', 'task', 'file', 'constraint', 'stats')
|
|
19
|
+
* @param action Action name (accepts both typed action enums and strings for backward compatibility)
|
|
20
|
+
* @param params Parameters provided by user
|
|
21
|
+
* @throws Error with structured ValidationError JSON if validation fails
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateActionParams(tool: string, action: DecisionAction | TaskAction | FileAction | ConstraintAction | StatsAction | ConfigAction | MessageAction | string, params: any): void;
|
|
24
|
+
/**
|
|
25
|
+
* Validate batch operation parameters
|
|
26
|
+
* Used by set_batch, record_batch, batch_create actions
|
|
27
|
+
*
|
|
28
|
+
* @param tool Tool name
|
|
29
|
+
* @param batchParamName Name of the batch array parameter (e.g., 'decisions', 'tasks', 'file_changes')
|
|
30
|
+
* @param items Array of items to validate
|
|
31
|
+
* @param itemAction Action name for each item (e.g., 'set' for decision items)
|
|
32
|
+
* @param maxItems Maximum allowed items (default: 50)
|
|
33
|
+
* @throws Error if batch validation fails
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateBatchParams(tool: string, batchParamName: string, items: any[], itemAction: string, maxItems?: number): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get all available actions for a tool
|
|
38
|
+
* Useful for error messages suggesting alternatives
|
|
39
|
+
*
|
|
40
|
+
* @param tool Tool name
|
|
41
|
+
* @returns Array of available action names
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAvailableActions(tool: string): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Suggest similar action names using Levenshtein distance
|
|
46
|
+
* Helps users when they misspell an action name
|
|
47
|
+
*
|
|
48
|
+
* @param tool Tool name
|
|
49
|
+
* @param providedAction Action name provided by user
|
|
50
|
+
* @returns Array of suggested action names (max 3)
|
|
51
|
+
*/
|
|
52
|
+
export declare function suggestSimilarActions(tool: string, providedAction: string): string[];
|
|
53
|
+
//# sourceMappingURL=parameter-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-validator.d.ts","sourceRoot":"","sources":["../../src/utils/parameter-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC;AAgKrB;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,gBAAgB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,EACzH,MAAM,EAAE,GAAG,GACV,IAAI,CAmDN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,GAAG,EAAE,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAW,GACpB,IAAI,CAqCN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM1D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CAcpF"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter Validation with Typo Detection for MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Provides comprehensive parameter validation with:
|
|
5
|
+
* - Missing required parameter detection
|
|
6
|
+
* - Typo suggestions using Levenshtein distance
|
|
7
|
+
* - Structured error messages with examples
|
|
8
|
+
* - Support for all sqlew MCP tools
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* validateActionParams('decision', 'set', params);
|
|
12
|
+
* // Throws ValidationError with structured details if validation fails
|
|
13
|
+
*/
|
|
14
|
+
import { getActionSpec, ACTION_SPECS_BY_TOOL } from './action-specs.js';
|
|
15
|
+
/**
|
|
16
|
+
* Calculate Levenshtein distance between two strings
|
|
17
|
+
* Used for typo detection (e.g., "context_key" → "key")
|
|
18
|
+
*
|
|
19
|
+
* @param a First string
|
|
20
|
+
* @param b Second string
|
|
21
|
+
* @returns Edit distance (number of single-character edits needed)
|
|
22
|
+
*/
|
|
23
|
+
function levenshteinDistance(a, b) {
|
|
24
|
+
if (a.length === 0)
|
|
25
|
+
return b.length;
|
|
26
|
+
if (b.length === 0)
|
|
27
|
+
return a.length;
|
|
28
|
+
const matrix = [];
|
|
29
|
+
// Initialize matrix
|
|
30
|
+
for (let i = 0; i <= b.length; i++) {
|
|
31
|
+
matrix[i] = [i];
|
|
32
|
+
}
|
|
33
|
+
for (let j = 0; j <= a.length; j++) {
|
|
34
|
+
matrix[0][j] = j;
|
|
35
|
+
}
|
|
36
|
+
// Fill matrix
|
|
37
|
+
for (let i = 1; i <= b.length; i++) {
|
|
38
|
+
for (let j = 1; j <= a.length; j++) {
|
|
39
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
40
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
44
|
+
matrix[i][j - 1] + 1, // insertion
|
|
45
|
+
matrix[i - 1][j] + 1 // deletion
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return matrix[b.length][a.length];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Common abbreviation patterns for AI parameter typos
|
|
54
|
+
* Maps abbreviated/shortened names to their full parameter names
|
|
55
|
+
*/
|
|
56
|
+
const COMMON_ABBREVIATIONS = {
|
|
57
|
+
desc: ['description'],
|
|
58
|
+
val: ['value'],
|
|
59
|
+
prio: ['priority'],
|
|
60
|
+
pri: ['priority'],
|
|
61
|
+
config: ['configuration'],
|
|
62
|
+
msg: ['message'],
|
|
63
|
+
crit: ['criteria', 'critical'],
|
|
64
|
+
req: ['required'],
|
|
65
|
+
opt: ['optional'],
|
|
66
|
+
param: ['parameter', 'params'],
|
|
67
|
+
arg: ['argument', 'args'],
|
|
68
|
+
attr: ['attribute', 'attributes'],
|
|
69
|
+
prop: ['property', 'properties'],
|
|
70
|
+
stat: ['status', 'statistics'],
|
|
71
|
+
info: ['information'],
|
|
72
|
+
temp: ['template'],
|
|
73
|
+
rel: ['related', 'relation'],
|
|
74
|
+
deps: ['dependencies'],
|
|
75
|
+
dep: ['dependency'],
|
|
76
|
+
ref: ['reference'],
|
|
77
|
+
ctx: ['context'],
|
|
78
|
+
db: ['database'],
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Check if provided parameter matches any common abbreviation pattern
|
|
82
|
+
*
|
|
83
|
+
* @param provided Parameter name provided by user (potentially abbreviated)
|
|
84
|
+
* @param validParams List of valid parameters to match against
|
|
85
|
+
* @returns Matched full parameter name, or null if no match
|
|
86
|
+
*/
|
|
87
|
+
function checkAbbreviation(provided, validParams) {
|
|
88
|
+
const lowerProvided = provided.toLowerCase();
|
|
89
|
+
// Direct abbreviation match
|
|
90
|
+
if (COMMON_ABBREVIATIONS[lowerProvided]) {
|
|
91
|
+
for (const fullForm of COMMON_ABBREVIATIONS[lowerProvided]) {
|
|
92
|
+
// Check if any valid parameter contains this full form
|
|
93
|
+
const match = validParams.find(v => v.toLowerCase().includes(fullForm));
|
|
94
|
+
if (match) {
|
|
95
|
+
return match;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check if provided is a prefix abbreviation (e.g., "desc" → "description")
|
|
100
|
+
for (const valid of validParams) {
|
|
101
|
+
if (valid.length > provided.length &&
|
|
102
|
+
valid.toLowerCase().startsWith(lowerProvided) &&
|
|
103
|
+
provided.length >= 3) { // Minimum 3 chars for prefix matching
|
|
104
|
+
return valid;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find typo suggestions for provided parameters
|
|
111
|
+
* Uses:
|
|
112
|
+
* 1. Abbreviation dictionary for common AI shortcuts
|
|
113
|
+
* 2. Prefix matching for partial parameter names
|
|
114
|
+
* 3. Levenshtein distance ≤ 2 for typos
|
|
115
|
+
*
|
|
116
|
+
* @param providedParams Parameters actually provided by user
|
|
117
|
+
* @param validParams All valid parameters (required + optional)
|
|
118
|
+
* @returns Map of typo → suggested correction
|
|
119
|
+
*/
|
|
120
|
+
function findTypoSuggestions(providedParams, validParams) {
|
|
121
|
+
const suggestions = {};
|
|
122
|
+
for (const provided of providedParams) {
|
|
123
|
+
// Skip 'action' parameter (always valid)
|
|
124
|
+
if (provided === 'action') {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// Skip if it's a valid parameter
|
|
128
|
+
if (validParams.includes(provided)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// 1. Check abbreviation dictionary first (highest priority)
|
|
132
|
+
const abbreviationMatch = checkAbbreviation(provided, validParams);
|
|
133
|
+
if (abbreviationMatch) {
|
|
134
|
+
suggestions[provided] = abbreviationMatch;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// 2. Find closest match within Levenshtein distance ≤ 2
|
|
138
|
+
let bestMatch = null;
|
|
139
|
+
let bestDistance = Infinity;
|
|
140
|
+
for (const valid of validParams) {
|
|
141
|
+
const distance = levenshteinDistance(provided.toLowerCase(), valid.toLowerCase());
|
|
142
|
+
if (distance <= 2 && distance < bestDistance) {
|
|
143
|
+
bestDistance = distance;
|
|
144
|
+
bestMatch = valid;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (bestMatch) {
|
|
148
|
+
suggestions[provided] = bestMatch;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return suggestions;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validate action parameters and throw structured error if invalid
|
|
155
|
+
*
|
|
156
|
+
* @param tool Tool name (e.g., 'decision', 'task', 'file', 'constraint', 'stats')
|
|
157
|
+
* @param action Action name (accepts both typed action enums and strings for backward compatibility)
|
|
158
|
+
* @param params Parameters provided by user
|
|
159
|
+
* @throws Error with structured ValidationError JSON if validation fails
|
|
160
|
+
*/
|
|
161
|
+
export function validateActionParams(tool, action, params) {
|
|
162
|
+
// Skip validation for help actions
|
|
163
|
+
const helpActions = ['help', 'example', 'use_case', 'help_action', 'help_params',
|
|
164
|
+
'help_tool', 'help_use_case', 'help_list_use_cases', 'help_next_actions'];
|
|
165
|
+
if (helpActions.includes(action)) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// Get action specification
|
|
169
|
+
const spec = getActionSpec(tool, action);
|
|
170
|
+
if (!spec) {
|
|
171
|
+
throw new Error(`Unknown action "${action}" for tool "${tool}". Use action: "help" to see available actions, or action: "use_case" for comprehensive scenarios.`);
|
|
172
|
+
}
|
|
173
|
+
// Check for missing required parameters
|
|
174
|
+
const missingParams = [];
|
|
175
|
+
for (const requiredParam of spec.required) {
|
|
176
|
+
if (params[requiredParam] === undefined || params[requiredParam] === null || params[requiredParam] === '') {
|
|
177
|
+
missingParams.push(requiredParam);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Get all provided parameters (excluding 'action')
|
|
181
|
+
const providedParams = Object.keys(params).filter(p => p !== 'action');
|
|
182
|
+
// All valid parameters for this action
|
|
183
|
+
const allValidParams = [...spec.required, ...spec.optional];
|
|
184
|
+
// Find typo suggestions
|
|
185
|
+
const typoSuggestions = findTypoSuggestions(providedParams, allValidParams);
|
|
186
|
+
// If validation fails, throw structured error
|
|
187
|
+
if (missingParams.length > 0 || Object.keys(typoSuggestions).length > 0) {
|
|
188
|
+
const error = {
|
|
189
|
+
error: missingParams.length > 0
|
|
190
|
+
? `Missing required parameter${missingParams.length > 1 ? 's' : ''} for action '${action}': ${missingParams.join(', ')}`
|
|
191
|
+
: `Invalid parameter name${Object.keys(typoSuggestions).length > 1 ? 's' : ''} detected`,
|
|
192
|
+
action: action,
|
|
193
|
+
missing_params: missingParams.length > 0 ? missingParams : undefined,
|
|
194
|
+
required_params: spec.required,
|
|
195
|
+
optional_params: spec.optional,
|
|
196
|
+
you_provided: providedParams,
|
|
197
|
+
did_you_mean: Object.keys(typoSuggestions).length > 0 ? typoSuggestions : undefined,
|
|
198
|
+
example: spec.example,
|
|
199
|
+
hint: spec.hint,
|
|
200
|
+
need_help: `For comprehensive scenarios and examples, try: ${tool}({ action: "use_case" })`
|
|
201
|
+
};
|
|
202
|
+
// Throw error with JSON-formatted details for easy parsing by AI agents
|
|
203
|
+
throw new Error(JSON.stringify(error, null, 2));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Validate batch operation parameters
|
|
208
|
+
* Used by set_batch, record_batch, batch_create actions
|
|
209
|
+
*
|
|
210
|
+
* @param tool Tool name
|
|
211
|
+
* @param batchParamName Name of the batch array parameter (e.g., 'decisions', 'tasks', 'file_changes')
|
|
212
|
+
* @param items Array of items to validate
|
|
213
|
+
* @param itemAction Action name for each item (e.g., 'set' for decision items)
|
|
214
|
+
* @param maxItems Maximum allowed items (default: 50)
|
|
215
|
+
* @throws Error if batch validation fails
|
|
216
|
+
*/
|
|
217
|
+
export function validateBatchParams(tool, batchParamName, items, itemAction, maxItems = 50) {
|
|
218
|
+
// Check if batch parameter exists and is an array
|
|
219
|
+
if (!items || !Array.isArray(items)) {
|
|
220
|
+
throw new Error(`Parameter "${batchParamName}" is required and must be an array`);
|
|
221
|
+
}
|
|
222
|
+
// Check array is not empty
|
|
223
|
+
if (items.length === 0) {
|
|
224
|
+
// Allow empty arrays (will return empty success response)
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
// Check max items constraint
|
|
228
|
+
if (items.length > maxItems) {
|
|
229
|
+
throw new Error(`Parameter "${batchParamName}" must contain at most ${maxItems} items (got ${items.length})`);
|
|
230
|
+
}
|
|
231
|
+
// Validate each item in the batch
|
|
232
|
+
const itemErrors = [];
|
|
233
|
+
for (let i = 0; i < items.length; i++) {
|
|
234
|
+
try {
|
|
235
|
+
validateActionParams(tool, itemAction, items[i]);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
239
|
+
itemErrors.push({
|
|
240
|
+
index: i,
|
|
241
|
+
error: message
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// If any items have validation errors, throw aggregate error
|
|
246
|
+
if (itemErrors.length > 0) {
|
|
247
|
+
const errorSummary = itemErrors.map(e => `Item ${e.index}: ${e.error}`).join('\n');
|
|
248
|
+
throw new Error(`Batch validation failed for ${itemErrors.length} item(s):\n${errorSummary}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get all available actions for a tool
|
|
253
|
+
* Useful for error messages suggesting alternatives
|
|
254
|
+
*
|
|
255
|
+
* @param tool Tool name
|
|
256
|
+
* @returns Array of available action names
|
|
257
|
+
*/
|
|
258
|
+
export function getAvailableActions(tool) {
|
|
259
|
+
const toolSpecs = ACTION_SPECS_BY_TOOL[tool];
|
|
260
|
+
if (!toolSpecs) {
|
|
261
|
+
return [];
|
|
262
|
+
}
|
|
263
|
+
return Object.keys(toolSpecs);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Suggest similar action names using Levenshtein distance
|
|
267
|
+
* Helps users when they misspell an action name
|
|
268
|
+
*
|
|
269
|
+
* @param tool Tool name
|
|
270
|
+
* @param providedAction Action name provided by user
|
|
271
|
+
* @returns Array of suggested action names (max 3)
|
|
272
|
+
*/
|
|
273
|
+
export function suggestSimilarActions(tool, providedAction) {
|
|
274
|
+
const availableActions = getAvailableActions(tool);
|
|
275
|
+
const scored = availableActions.map(action => ({
|
|
276
|
+
action,
|
|
277
|
+
distance: levenshteinDistance(providedAction.toLowerCase(), action.toLowerCase())
|
|
278
|
+
}));
|
|
279
|
+
// Sort by distance and return top 3 within distance ≤ 3
|
|
280
|
+
return scored
|
|
281
|
+
.filter(item => item.distance <= 3)
|
|
282
|
+
.sort((a, b) => a.distance - b.distance)
|
|
283
|
+
.slice(0, 3)
|
|
284
|
+
.map(item => item.action);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=parameter-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-validator.js","sourceRoot":"","sources":["../../src/utils/parameter-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAYxE;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAEpC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,cAAc;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACrB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe;gBACzC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAM,YAAY;gBACtC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAM,WAAW;iBACtC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,oBAAoB,GAA6B;IACrD,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,GAAG,EAAE,CAAC,OAAO,CAAC;IACd,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,MAAM,EAAE,CAAC,eAAe,CAAC;IACzB,GAAG,EAAE,CAAC,SAAS,CAAC;IAChB,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC9B,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,GAAG,EAAE,CAAC,UAAU,CAAC;IACjB,KAAK,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC9B,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IACjC,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;IAChC,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC9B,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC5B,IAAI,EAAE,CAAC,cAAc,CAAC;IACtB,GAAG,EAAE,CAAC,YAAY,CAAC;IACnB,GAAG,EAAE,CAAC,WAAW,CAAC;IAClB,GAAG,EAAE,CAAC,SAAS,CAAC;IAChB,EAAE,EAAE,CAAC,UAAU,CAAC;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,QAAgB,EAAE,WAAqB;IAChE,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,QAAQ,IAAI,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3D,uDAAuD;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;YAC9B,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YAC7C,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAE,sCAAsC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAC1B,cAAwB,EACxB,WAAqB;IAErB,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,yCAAyC;QACzC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,iCAAiC;QACjC,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,4DAA4D;QAC5D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,iBAAiB,EAAE,CAAC;YACtB,WAAW,CAAC,QAAQ,CAAC,GAAG,iBAAiB,CAAC;YAC1C,SAAS;QACX,CAAC;QAED,wDAAwD;QACxD,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,YAAY,GAAG,QAAQ,CAAC;QAE5B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YAClF,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;gBAC7C,YAAY,GAAG,QAAQ,CAAC;gBACxB,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,MAAyH,EACzH,MAAW;IAEX,mCAAmC;IACnC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;QAC3D,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;IAC/F,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,eAAe,IAAI,oGAAoG,CAAC,CAAC;IACpK,CAAC;IAED,wCAAwC;IACxC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1G,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEvE,uCAAuC;IACvC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE5D,wBAAwB;IACxB,MAAM,eAAe,GAAG,mBAAmB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAE5E,8CAA8C;IAC9C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAoB;YAC7B,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;gBAC7B,CAAC,CAAC,6BAA6B,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,gBAAgB,MAAM,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxH,CAAC,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW;YAC1F,MAAM,EAAE,MAAM;YACd,cAAc,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YACpE,eAAe,EAAE,IAAI,CAAC,QAAQ;YAC9B,eAAe,EAAE,IAAI,CAAC,QAAQ;YAC9B,YAAY,EAAE,cAAc;YAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;YACnF,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,kDAAkD,IAAI,0BAA0B;SAC5F,CAAC;QAEF,wEAAwE;QACxE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,cAAsB,EACtB,KAAY,EACZ,UAAkB,EAClB,WAAmB,EAAE;IAErB,kDAAkD;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,cAAc,cAAc,oCAAoC,CAAC,CAAC;IACpF,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,0DAA0D;QAC1D,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,cAAc,0BAA0B,QAAQ,eAAe,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAChH,CAAC;IAED,kCAAkC;IAClC,MAAM,UAAU,GAA4C,EAAE,CAAC;IAE/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,OAAO;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,MAAM,cAAc,YAAY,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,cAAsB;IACxE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM;QACN,QAAQ,EAAE,mBAAmB,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;KAClF,CAAC,CAAC,CAAC;IAEJ,wDAAwD;IACxD,OAAO,MAAM;SACV,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -25,6 +25,7 @@ export declare class FileWatcher {
|
|
|
25
25
|
private lastModifiedTimes;
|
|
26
26
|
private filesModifiedSet;
|
|
27
27
|
private vcsDetectionInterval;
|
|
28
|
+
private stagingPollInterval;
|
|
28
29
|
private constructor();
|
|
29
30
|
/**
|
|
30
31
|
* Get singleton instance
|
|
@@ -35,7 +36,7 @@ export declare class FileWatcher {
|
|
|
35
36
|
*/
|
|
36
37
|
private isWSL;
|
|
37
38
|
/**
|
|
38
|
-
* Initialize and start the file watcher (
|
|
39
|
+
* Initialize and start the file watcher (Chokidar v4)
|
|
39
40
|
*/
|
|
40
41
|
start(): Promise<void>;
|
|
41
42
|
/**
|
|
@@ -59,14 +60,14 @@ export declare class FileWatcher {
|
|
|
59
60
|
*/
|
|
60
61
|
private isVCSIndexFile;
|
|
61
62
|
/**
|
|
62
|
-
* Get VCS index file path for given VCS type
|
|
63
|
+
* Get VCS index file path for given VCS type
|
|
63
64
|
* Centralized mapping for easier extension to Mercurial/SVN
|
|
64
65
|
* @param vcsType - VCS type string (Git, Mercurial, SVN)
|
|
65
66
|
* @returns Absolute path to VCS index file, or null if VCS has no local index
|
|
66
67
|
*/
|
|
67
68
|
private getVCSIndexPath;
|
|
68
69
|
/**
|
|
69
|
-
* Re-detect VCS and start watching index files
|
|
70
|
+
* Re-detect VCS and start watching index files
|
|
70
71
|
* Called when VCS might be initialized after watcher starts
|
|
71
72
|
* Public method for external triggering (e.g., after git init)
|
|
72
73
|
*/
|
|
@@ -80,12 +81,17 @@ export declare class FileWatcher {
|
|
|
80
81
|
*/
|
|
81
82
|
private handleFileChange;
|
|
82
83
|
/**
|
|
83
|
-
* Handle VCS index file change - triggers two-step Git-aware workflow
|
|
84
|
+
* Handle VCS index file change - triggers two-step Git-aware workflow
|
|
84
85
|
* Step 1: Staging (git add) → waiting_review → done
|
|
85
86
|
* Step 2: Commit (git commit) → done → archived
|
|
86
|
-
* Fallback: If files already committed (not in staging), use
|
|
87
|
+
* Fallback: If files already committed (not in staging), use legacy logic
|
|
87
88
|
*/
|
|
88
89
|
private handleVCSIndexChange;
|
|
90
|
+
/**
|
|
91
|
+
* Poll staging area for changes (WSL workaround)
|
|
92
|
+
* Called periodically on WSL where chokidar doesn't reliably detect .git/index changes
|
|
93
|
+
*/
|
|
94
|
+
private pollStagingArea;
|
|
89
95
|
/**
|
|
90
96
|
* Check acceptance criteria and auto-complete task if all pass
|
|
91
97
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqCH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,oBAAoB,CAA+B;
|
|
1
|
+
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqCH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,oBAAoB,CAA+B;IAC3D,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,OAAO;IAMP;;OAEG;WACW,WAAW,IAAI,WAAW;IAOxC;;OAEG;IACH,OAAO,CAAC,KAAK;IASb;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+FnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwClC;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IA4BrG;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoB7D;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACU,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUhD;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,gBAAgB;IAuF9B;;;;;OAKG;YACW,oBAAoB;IAsClC;;;OAGG;YACW,eAAe;IAiB7B;;OAEG;YACW,uBAAuB;IA2FrC;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;OASG;YACW,0BAA0B;IA6GxC;;OAEG;IACI,SAAS,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB;CAOF"}
|
|
@@ -47,7 +47,8 @@ export class FileWatcher {
|
|
|
47
47
|
projectRoot;
|
|
48
48
|
lastModifiedTimes = new Map(); // taskId -> timestamp
|
|
49
49
|
filesModifiedSet = new Map(); // taskId -> modified files
|
|
50
|
-
vcsDetectionInterval = null; // Periodic VCS re-detection
|
|
50
|
+
vcsDetectionInterval = null; // Periodic VCS re-detection
|
|
51
|
+
stagingPollInterval = null; // WSL staging detection polling
|
|
51
52
|
constructor() {
|
|
52
53
|
// Private constructor for singleton
|
|
53
54
|
// Determine project root (current working directory)
|
|
@@ -75,7 +76,7 @@ export class FileWatcher {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
78
|
-
* Initialize and start the file watcher (
|
|
79
|
+
* Initialize and start the file watcher (Chokidar v4)
|
|
79
80
|
*/
|
|
80
81
|
async start() {
|
|
81
82
|
if (this.isRunning) {
|
|
@@ -135,14 +136,22 @@ export class FileWatcher {
|
|
|
135
136
|
// Initialize tracking maps
|
|
136
137
|
this.lastModifiedTimes.clear();
|
|
137
138
|
this.filesModifiedSet.clear();
|
|
138
|
-
// Watch VCS index files for commit detection (
|
|
139
|
+
// Watch VCS index files for commit detection (VCS-aware auto-complete)
|
|
139
140
|
await this.watchVCSIndexFiles();
|
|
140
|
-
// Periodic VCS re-detection
|
|
141
|
+
// Periodic VCS re-detection
|
|
141
142
|
// Handles case where git is initialized after watcher starts
|
|
142
143
|
// Check every 5 minutes for new VCS initialization
|
|
143
144
|
this.vcsDetectionInterval = setInterval(async () => {
|
|
144
145
|
await this.refreshVCSWatching();
|
|
145
146
|
}, 5 * 60 * 1000); // 5 minutes
|
|
147
|
+
// WSL-specific: Periodic staging detection
|
|
148
|
+
// Workaround for chokidar not reliably detecting .git/index changes on WSL
|
|
149
|
+
if (isWSL) {
|
|
150
|
+
this.stagingPollInterval = setInterval(async () => {
|
|
151
|
+
await this.pollStagingArea();
|
|
152
|
+
}, 1000); // Poll every 1 second
|
|
153
|
+
console.error('✓ WSL periodic staging detection enabled (1s interval)');
|
|
154
|
+
}
|
|
146
155
|
this.isRunning = true;
|
|
147
156
|
console.error('✓ File watcher started successfully');
|
|
148
157
|
console.error(` Project root: ${this.projectRoot}`);
|
|
@@ -168,11 +177,16 @@ export class FileWatcher {
|
|
|
168
177
|
// Clear tracking maps
|
|
169
178
|
this.lastModifiedTimes.clear();
|
|
170
179
|
this.filesModifiedSet.clear();
|
|
171
|
-
// Clear VCS detection interval
|
|
180
|
+
// Clear VCS detection interval
|
|
172
181
|
if (this.vcsDetectionInterval) {
|
|
173
182
|
clearInterval(this.vcsDetectionInterval);
|
|
174
183
|
this.vcsDetectionInterval = null;
|
|
175
184
|
}
|
|
185
|
+
// Clear WSL staging poll interval
|
|
186
|
+
if (this.stagingPollInterval) {
|
|
187
|
+
clearInterval(this.stagingPollInterval);
|
|
188
|
+
this.stagingPollInterval = null;
|
|
189
|
+
}
|
|
176
190
|
// Close watcher
|
|
177
191
|
if (this.watcher) {
|
|
178
192
|
await this.watcher.close();
|
|
@@ -265,7 +279,7 @@ export class FileWatcher {
|
|
|
265
279
|
return false;
|
|
266
280
|
}
|
|
267
281
|
/**
|
|
268
|
-
* Get VCS index file path for given VCS type
|
|
282
|
+
* Get VCS index file path for given VCS type
|
|
269
283
|
* Centralized mapping for easier extension to Mercurial/SVN
|
|
270
284
|
* @param vcsType - VCS type string (Git, Mercurial, SVN)
|
|
271
285
|
* @returns Absolute path to VCS index file, or null if VCS has no local index
|
|
@@ -279,7 +293,7 @@ export class FileWatcher {
|
|
|
279
293
|
return vcsIndexPaths[vcsType] || null;
|
|
280
294
|
}
|
|
281
295
|
/**
|
|
282
|
-
* Re-detect VCS and start watching index files
|
|
296
|
+
* Re-detect VCS and start watching index files
|
|
283
297
|
* Called when VCS might be initialized after watcher starts
|
|
284
298
|
* Public method for external triggering (e.g., after git init)
|
|
285
299
|
*/
|
|
@@ -309,7 +323,7 @@ export class FileWatcher {
|
|
|
309
323
|
}
|
|
310
324
|
if (existsSync(indexPath) && this.watcher) {
|
|
311
325
|
this.watcher.add(indexPath);
|
|
312
|
-
console.error(`✓ Watching ${indexPath} for ${vcsType} commits
|
|
326
|
+
console.error(`✓ Watching ${indexPath} for ${vcsType} commits`);
|
|
313
327
|
}
|
|
314
328
|
else if (!existsSync(indexPath)) {
|
|
315
329
|
console.error(`⚠ ${vcsType} index file not found: ${indexPath}`);
|
|
@@ -389,10 +403,10 @@ export class FileWatcher {
|
|
|
389
403
|
}
|
|
390
404
|
}
|
|
391
405
|
/**
|
|
392
|
-
* Handle VCS index file change - triggers two-step Git-aware workflow
|
|
406
|
+
* Handle VCS index file change - triggers two-step Git-aware workflow
|
|
393
407
|
* Step 1: Staging (git add) → waiting_review → done
|
|
394
408
|
* Step 2: Commit (git commit) → done → archived
|
|
395
|
-
* Fallback: If files already committed (not in staging), use
|
|
409
|
+
* Fallback: If files already committed (not in staging), use legacy logic
|
|
396
410
|
*/
|
|
397
411
|
async handleVCSIndexChange(filePath) {
|
|
398
412
|
console.error('\n🔄 VCS index changed - checking for tasks ready to auto-transition');
|
|
@@ -427,6 +441,25 @@ export class FileWatcher {
|
|
|
427
441
|
console.error(` ✗ Error during VCS-aware auto-transition:`, error);
|
|
428
442
|
}
|
|
429
443
|
}
|
|
444
|
+
/**
|
|
445
|
+
* Poll staging area for changes (WSL workaround)
|
|
446
|
+
* Called periodically on WSL where chokidar doesn't reliably detect .git/index changes
|
|
447
|
+
*/
|
|
448
|
+
async pollStagingArea() {
|
|
449
|
+
try {
|
|
450
|
+
const db = getAdapter();
|
|
451
|
+
const { detectAndCompleteOnStaging } = await import('../utils/task-stale-detection.js');
|
|
452
|
+
const completedCount = await detectAndCompleteOnStaging(db);
|
|
453
|
+
// Only log if tasks were actually completed (reduce noise)
|
|
454
|
+
if (completedCount > 0) {
|
|
455
|
+
console.error(`\n🔄 WSL polling detected staging → ${completedCount} task(s) auto-completed`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
// Silently ignore errors to avoid spamming console
|
|
460
|
+
// The next poll will retry
|
|
461
|
+
}
|
|
462
|
+
}
|
|
430
463
|
/**
|
|
431
464
|
* Check acceptance criteria and auto-complete task if all pass
|
|
432
465
|
*/
|