sqlew 5.1.0 → 5.2.1
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 +2140 -2081
- package/LICENSE +190 -190
- package/NOTICE +24 -24
- package/README.md +204 -190
- package/dist/adapters/mysql-adapter.js +3 -3
- package/dist/adapters/postgresql-adapter.js +3 -3
- package/dist/cli/db-export.js +32 -32
- package/dist/cli/db-import.js +30 -30
- package/dist/cli/hooks/codex-transcript.d.ts +23 -0
- package/dist/cli/hooks/codex-transcript.d.ts.map +1 -0
- package/dist/cli/hooks/codex-transcript.js +134 -0
- package/dist/cli/hooks/codex-transcript.js.map +1 -0
- package/dist/cli/hooks/on-exit-plan.d.ts.map +1 -1
- package/dist/cli/hooks/on-exit-plan.js +72 -4
- package/dist/cli/hooks/on-exit-plan.js.map +1 -1
- package/dist/cli/hooks/on-prompt.d.ts.map +1 -1
- package/dist/cli/hooks/on-prompt.js +38 -16
- package/dist/cli/hooks/on-prompt.js.map +1 -1
- package/dist/cli/hooks/plan-processor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-processor.js +16 -2
- package/dist/cli/hooks/plan-processor.js.map +1 -1
- package/dist/cli/hooks/pr-adr.js +5 -5
- package/dist/cli/hooks/stdin-parser.d.ts +43 -0
- package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
- package/dist/cli/hooks/stdin-parser.js +212 -6
- package/dist/cli/hooks/stdin-parser.js.map +1 -1
- package/dist/cli/hooks/track-plan.d.ts +13 -0
- package/dist/cli/hooks/track-plan.d.ts.map +1 -1
- package/dist/cli/hooks/track-plan.js +73 -18
- package/dist/cli/hooks/track-plan.js.map +1 -1
- package/dist/cli.js +48 -48
- package/dist/config/global-config.d.ts +7 -1
- package/dist/config/global-config.d.ts.map +1 -1
- package/dist/config/global-config.js +5 -26
- package/dist/config/global-config.js.map +1 -1
- package/dist/database/migrations/v4/20251126000000_v4_bootstrap.js +32 -32
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.d.ts.map +1 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js +2 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js.map +1 -1
- package/dist/database/migrations/v4/20260102204000_v4_fix_decision_set_example.js +3 -3
- package/dist/help-data/constraint.toml +259 -259
- package/dist/help-data/decision.toml +845 -845
- package/dist/help-data/queue.toml +134 -134
- package/dist/server/tool-schemas.js +30 -30
- package/dist/tests/docker/native/db-init.js +9 -9
- package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts +7 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.js +112 -0
- package/dist/tests/unit/hooks/codex-hook-normalization.test.js.map +1 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts +9 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js +136 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts +7 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js +55 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js.map +1 -0
- package/dist/tests/utils/db-schema.js +48 -48
- package/dist/tests/utils/test-helpers.js +48 -48
- package/dist/tools/constraints/actions/get.js +5 -5
- package/dist/utils/path-normalize.d.ts +23 -0
- package/dist/utils/path-normalize.d.ts.map +1 -0
- package/dist/utils/path-normalize.js +38 -0
- package/dist/utils/path-normalize.js.map +1 -0
- package/dist/utils/project-root.d.ts +7 -3
- package/dist/utils/project-root.d.ts.map +1 -1
- package/dist/utils/project-root.js +17 -3
- package/dist/utils/project-root.js.map +1 -1
- package/dist/watcher/base-watcher.d.ts +0 -4
- package/dist/watcher/base-watcher.d.ts.map +1 -1
- package/dist/watcher/base-watcher.js +11 -22
- package/dist/watcher/base-watcher.js.map +1 -1
- package/docs/ADR_CONCEPTS.md +152 -152
- package/docs/CLI_USAGE.md +392 -392
- package/docs/CONFIGURATION.md +157 -157
- package/docs/CROSS_DATABASE.md +66 -66
- package/docs/DATABASE_AUTH.md +135 -135
- package/docs/HOOKS_GUIDE.md +116 -67
- package/docs/MIGRATION_TO_SAAS.md +176 -176
- package/docs/SHARED_DATABASE.md +108 -108
- package/package.json +88 -88
- package/scripts/copy-help-data.js +19 -19
- package/scripts/filter-test-output.js +78 -78
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok-hook-normalization.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/hooks/grok-hook-normalization.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok-plan-template-injection.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/hooks/grok-plan-template-injection.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grok Build plan.md template injection unit tests
|
|
3
|
+
*
|
|
4
|
+
* @since v5.2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
7
|
+
import assert from 'node:assert';
|
|
8
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { tmpdir } from 'os';
|
|
11
|
+
import { injectGrokPlanTemplate, PLAN_TEMPLATE_MARKER, } from '../../../cli/hooks/track-plan.js';
|
|
12
|
+
describe('injectGrokPlanTemplate', () => {
|
|
13
|
+
let testDir;
|
|
14
|
+
let planPath;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
testDir = join(tmpdir(), `sqlew-grok-plan-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
17
|
+
mkdirSync(testDir, { recursive: true });
|
|
18
|
+
planPath = join(testDir, 'plan.md');
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
if (existsSync(testDir)) {
|
|
22
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it('should create plan.md with template when file does not exist', () => {
|
|
26
|
+
const injected = injectGrokPlanTemplate(planPath);
|
|
27
|
+
assert.strictEqual(injected, true);
|
|
28
|
+
assert.ok(existsSync(planPath));
|
|
29
|
+
const content = readFileSync(planPath, 'utf-8');
|
|
30
|
+
assert.ok(content.includes(PLAN_TEMPLATE_MARKER));
|
|
31
|
+
assert.ok(content.includes('### 📌 Decision:'));
|
|
32
|
+
assert.ok(content.includes('### 🚫 Constraint:'));
|
|
33
|
+
});
|
|
34
|
+
it('should append template when plan exists without marker or patterns', () => {
|
|
35
|
+
writeFileSync(planPath, '# My Plan\n\nSome content.\n', 'utf-8');
|
|
36
|
+
const injected = injectGrokPlanTemplate(planPath);
|
|
37
|
+
assert.strictEqual(injected, true);
|
|
38
|
+
const content = readFileSync(planPath, 'utf-8');
|
|
39
|
+
assert.ok(content.startsWith('# My Plan'));
|
|
40
|
+
assert.ok(content.includes(PLAN_TEMPLATE_MARKER));
|
|
41
|
+
});
|
|
42
|
+
it('should skip when template marker already present', () => {
|
|
43
|
+
writeFileSync(planPath, `# Plan\n\n${PLAN_TEMPLATE_MARKER}\n`, 'utf-8');
|
|
44
|
+
const injected = injectGrokPlanTemplate(planPath);
|
|
45
|
+
assert.strictEqual(injected, false);
|
|
46
|
+
const content = readFileSync(planPath, 'utf-8');
|
|
47
|
+
assert.strictEqual((content.match(new RegExp(PLAN_TEMPLATE_MARKER, 'g')) || []).length, 1);
|
|
48
|
+
});
|
|
49
|
+
it('should skip when real decision patterns already exist', () => {
|
|
50
|
+
writeFileSync(planPath, '### 📌 Decision: auth/strategy\n- **Value**: Use JWT\n- **Layer**: business\n', 'utf-8');
|
|
51
|
+
const injected = injectGrokPlanTemplate(planPath);
|
|
52
|
+
assert.strictEqual(injected, false);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=grok-plan-template-injection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok-plan-template-injection.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/hooks/grok-plan-template-injection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,9 +36,9 @@ export async function disconnectDb(db) {
|
|
|
36
36
|
export async function dropAllTables(db, type) {
|
|
37
37
|
if (type === 'sqlite') {
|
|
38
38
|
// SQLite: Get all tables and views, then drop them
|
|
39
|
-
const objects = await db.raw(`
|
|
40
|
-
SELECT name, type FROM sqlite_master
|
|
41
|
-
WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'
|
|
39
|
+
const objects = await db.raw(`
|
|
40
|
+
SELECT name, type FROM sqlite_master
|
|
41
|
+
WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'
|
|
42
42
|
`);
|
|
43
43
|
await db.raw('PRAGMA foreign_keys = OFF');
|
|
44
44
|
for (const row of objects) {
|
|
@@ -55,19 +55,19 @@ export async function dropAllTables(db, type) {
|
|
|
55
55
|
// MySQL/MariaDB: Drop all views first, then tables
|
|
56
56
|
await db.raw('SET FOREIGN_KEY_CHECKS=0');
|
|
57
57
|
// Drop views
|
|
58
|
-
const views = await db.raw(`
|
|
59
|
-
SELECT TABLE_NAME
|
|
60
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
61
|
-
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'VIEW'
|
|
58
|
+
const views = await db.raw(`
|
|
59
|
+
SELECT TABLE_NAME
|
|
60
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
61
|
+
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'VIEW'
|
|
62
62
|
`);
|
|
63
63
|
for (const row of views[0]) {
|
|
64
64
|
await db.raw(`DROP VIEW IF EXISTS ??`, [row.TABLE_NAME]);
|
|
65
65
|
}
|
|
66
66
|
// Drop tables
|
|
67
|
-
const tables = await db.raw(`
|
|
68
|
-
SELECT TABLE_NAME
|
|
69
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
70
|
-
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'BASE TABLE'
|
|
67
|
+
const tables = await db.raw(`
|
|
68
|
+
SELECT TABLE_NAME
|
|
69
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
70
|
+
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'BASE TABLE'
|
|
71
71
|
`);
|
|
72
72
|
for (const row of tables[0]) {
|
|
73
73
|
await db.raw(`DROP TABLE IF EXISTS ??`, [row.TABLE_NAME]);
|
|
@@ -85,30 +85,30 @@ export async function dropAllTables(db, type) {
|
|
|
85
85
|
*/
|
|
86
86
|
export async function getTables(db, type) {
|
|
87
87
|
if (type === 'sqlite') {
|
|
88
|
-
const result = await db.raw(`
|
|
89
|
-
SELECT name FROM sqlite_master
|
|
90
|
-
WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name != 'knex_migrations'
|
|
91
|
-
ORDER BY name
|
|
88
|
+
const result = await db.raw(`
|
|
89
|
+
SELECT name FROM sqlite_master
|
|
90
|
+
WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name != 'knex_migrations'
|
|
91
|
+
ORDER BY name
|
|
92
92
|
`);
|
|
93
93
|
return result.map((r) => r.name);
|
|
94
94
|
}
|
|
95
95
|
else if (type === 'mysql' || type === 'mariadb') {
|
|
96
|
-
const result = await db.raw(`
|
|
97
|
-
SELECT TABLE_NAME
|
|
98
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
99
|
-
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
100
|
-
AND TABLE_TYPE = 'BASE TABLE'
|
|
101
|
-
AND TABLE_NAME != 'knex_migrations'
|
|
102
|
-
ORDER BY TABLE_NAME
|
|
96
|
+
const result = await db.raw(`
|
|
97
|
+
SELECT TABLE_NAME
|
|
98
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
99
|
+
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
100
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
101
|
+
AND TABLE_NAME != 'knex_migrations'
|
|
102
|
+
ORDER BY TABLE_NAME
|
|
103
103
|
`);
|
|
104
104
|
return result[0].map((r) => r.TABLE_NAME);
|
|
105
105
|
}
|
|
106
106
|
else if (type === 'postgresql') {
|
|
107
|
-
const result = await db.raw(`
|
|
108
|
-
SELECT tablename
|
|
109
|
-
FROM pg_tables
|
|
110
|
-
WHERE schemaname = 'public' AND tablename != 'knex_migrations'
|
|
111
|
-
ORDER BY tablename
|
|
107
|
+
const result = await db.raw(`
|
|
108
|
+
SELECT tablename
|
|
109
|
+
FROM pg_tables
|
|
110
|
+
WHERE schemaname = 'public' AND tablename != 'knex_migrations'
|
|
111
|
+
ORDER BY tablename
|
|
112
112
|
`);
|
|
113
113
|
return result.rows.map((r) => r.tablename);
|
|
114
114
|
}
|
|
@@ -161,15 +161,15 @@ export async function getFKConstraints(db, type, tableName) {
|
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
else if (type === 'mysql' || type === 'mariadb') {
|
|
164
|
-
const result = await db.raw(`
|
|
165
|
-
SELECT
|
|
166
|
-
COLUMN_NAME,
|
|
167
|
-
REFERENCED_TABLE_NAME,
|
|
168
|
-
REFERENCED_COLUMN_NAME
|
|
169
|
-
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
170
|
-
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
171
|
-
AND TABLE_NAME = ?
|
|
172
|
-
AND REFERENCED_TABLE_NAME IS NOT NULL
|
|
164
|
+
const result = await db.raw(`
|
|
165
|
+
SELECT
|
|
166
|
+
COLUMN_NAME,
|
|
167
|
+
REFERENCED_TABLE_NAME,
|
|
168
|
+
REFERENCED_COLUMN_NAME
|
|
169
|
+
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
170
|
+
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
171
|
+
AND TABLE_NAME = ?
|
|
172
|
+
AND REFERENCED_TABLE_NAME IS NOT NULL
|
|
173
173
|
`, [tableName]);
|
|
174
174
|
for (const fk of result[0]) {
|
|
175
175
|
constraints.push({
|
|
@@ -181,18 +181,18 @@ export async function getFKConstraints(db, type, tableName) {
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
else if (type === 'postgresql') {
|
|
184
|
-
const result = await db.raw(`
|
|
185
|
-
SELECT
|
|
186
|
-
kcu.column_name,
|
|
187
|
-
ccu.table_name AS referenced_table,
|
|
188
|
-
ccu.column_name AS referenced_column
|
|
189
|
-
FROM information_schema.table_constraints AS tc
|
|
190
|
-
JOIN information_schema.key_column_usage AS kcu
|
|
191
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
192
|
-
JOIN information_schema.constraint_column_usage AS ccu
|
|
193
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
194
|
-
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
195
|
-
AND tc.table_name = ?
|
|
184
|
+
const result = await db.raw(`
|
|
185
|
+
SELECT
|
|
186
|
+
kcu.column_name,
|
|
187
|
+
ccu.table_name AS referenced_table,
|
|
188
|
+
ccu.column_name AS referenced_column
|
|
189
|
+
FROM information_schema.table_constraints AS tc
|
|
190
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
191
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
192
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
193
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
194
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
195
|
+
AND tc.table_name = ?
|
|
196
196
|
`, [tableName]);
|
|
197
197
|
for (const fk of result.rows) {
|
|
198
198
|
constraints.push({
|
|
@@ -92,9 +92,9 @@ export async function disconnectDb(db) {
|
|
|
92
92
|
export async function dropAllTables(db, type) {
|
|
93
93
|
if (type === 'sqlite') {
|
|
94
94
|
// SQLite: Get all tables and views, then drop them
|
|
95
|
-
const objects = await db.raw(`
|
|
96
|
-
SELECT name, type FROM sqlite_master
|
|
97
|
-
WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'
|
|
95
|
+
const objects = await db.raw(`
|
|
96
|
+
SELECT name, type FROM sqlite_master
|
|
97
|
+
WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'
|
|
98
98
|
`);
|
|
99
99
|
await db.raw('PRAGMA foreign_keys = OFF');
|
|
100
100
|
for (const row of objects) {
|
|
@@ -109,18 +109,18 @@ export async function dropAllTables(db, type) {
|
|
|
109
109
|
}
|
|
110
110
|
else if (type === 'mysql' || type === 'mariadb') {
|
|
111
111
|
await db.raw('SET FOREIGN_KEY_CHECKS=0');
|
|
112
|
-
const views = await db.raw(`
|
|
113
|
-
SELECT TABLE_NAME
|
|
114
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
115
|
-
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'VIEW'
|
|
112
|
+
const views = await db.raw(`
|
|
113
|
+
SELECT TABLE_NAME
|
|
114
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
115
|
+
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'VIEW'
|
|
116
116
|
`);
|
|
117
117
|
for (const row of views[0]) {
|
|
118
118
|
await db.raw(`DROP VIEW IF EXISTS ??`, [row.TABLE_NAME]);
|
|
119
119
|
}
|
|
120
|
-
const tables = await db.raw(`
|
|
121
|
-
SELECT TABLE_NAME
|
|
122
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
123
|
-
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'BASE TABLE'
|
|
120
|
+
const tables = await db.raw(`
|
|
121
|
+
SELECT TABLE_NAME
|
|
122
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
123
|
+
WHERE TABLE_SCHEMA = 'mcp_test' AND TABLE_TYPE = 'BASE TABLE'
|
|
124
124
|
`);
|
|
125
125
|
for (const row of tables[0]) {
|
|
126
126
|
await db.raw(`DROP TABLE IF EXISTS ??`, [row.TABLE_NAME]);
|
|
@@ -138,30 +138,30 @@ export async function dropAllTables(db, type) {
|
|
|
138
138
|
*/
|
|
139
139
|
export async function getTables(db, type) {
|
|
140
140
|
if (type === 'sqlite') {
|
|
141
|
-
const result = await db.raw(`
|
|
142
|
-
SELECT name FROM sqlite_master
|
|
143
|
-
WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name != 'knex_migrations'
|
|
144
|
-
ORDER BY name
|
|
141
|
+
const result = await db.raw(`
|
|
142
|
+
SELECT name FROM sqlite_master
|
|
143
|
+
WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name != 'knex_migrations'
|
|
144
|
+
ORDER BY name
|
|
145
145
|
`);
|
|
146
146
|
return result.map((r) => r.name);
|
|
147
147
|
}
|
|
148
148
|
else if (type === 'mysql' || type === 'mariadb') {
|
|
149
|
-
const result = await db.raw(`
|
|
150
|
-
SELECT TABLE_NAME
|
|
151
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
152
|
-
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
153
|
-
AND TABLE_TYPE = 'BASE TABLE'
|
|
154
|
-
AND TABLE_NAME != 'knex_migrations'
|
|
155
|
-
ORDER BY TABLE_NAME
|
|
149
|
+
const result = await db.raw(`
|
|
150
|
+
SELECT TABLE_NAME
|
|
151
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
152
|
+
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
153
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
154
|
+
AND TABLE_NAME != 'knex_migrations'
|
|
155
|
+
ORDER BY TABLE_NAME
|
|
156
156
|
`);
|
|
157
157
|
return result[0].map((r) => r.TABLE_NAME);
|
|
158
158
|
}
|
|
159
159
|
else if (type === 'postgresql') {
|
|
160
|
-
const result = await db.raw(`
|
|
161
|
-
SELECT tablename
|
|
162
|
-
FROM pg_tables
|
|
163
|
-
WHERE schemaname = 'public' AND tablename != 'knex_migrations'
|
|
164
|
-
ORDER BY tablename
|
|
160
|
+
const result = await db.raw(`
|
|
161
|
+
SELECT tablename
|
|
162
|
+
FROM pg_tables
|
|
163
|
+
WHERE schemaname = 'public' AND tablename != 'knex_migrations'
|
|
164
|
+
ORDER BY tablename
|
|
165
165
|
`);
|
|
166
166
|
return result.rows.map((r) => r.tablename);
|
|
167
167
|
}
|
|
@@ -214,15 +214,15 @@ export async function getFKConstraints(db, type, tableName) {
|
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
else if (type === 'mysql' || type === 'mariadb') {
|
|
217
|
-
const result = await db.raw(`
|
|
218
|
-
SELECT
|
|
219
|
-
COLUMN_NAME,
|
|
220
|
-
REFERENCED_TABLE_NAME,
|
|
221
|
-
REFERENCED_COLUMN_NAME
|
|
222
|
-
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
223
|
-
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
224
|
-
AND TABLE_NAME = ?
|
|
225
|
-
AND REFERENCED_TABLE_NAME IS NOT NULL
|
|
217
|
+
const result = await db.raw(`
|
|
218
|
+
SELECT
|
|
219
|
+
COLUMN_NAME,
|
|
220
|
+
REFERENCED_TABLE_NAME,
|
|
221
|
+
REFERENCED_COLUMN_NAME
|
|
222
|
+
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
223
|
+
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
224
|
+
AND TABLE_NAME = ?
|
|
225
|
+
AND REFERENCED_TABLE_NAME IS NOT NULL
|
|
226
226
|
`, [tableName]);
|
|
227
227
|
for (const fk of result[0]) {
|
|
228
228
|
constraints.push({
|
|
@@ -234,18 +234,18 @@ export async function getFKConstraints(db, type, tableName) {
|
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
else if (type === 'postgresql') {
|
|
237
|
-
const result = await db.raw(`
|
|
238
|
-
SELECT
|
|
239
|
-
kcu.column_name,
|
|
240
|
-
ccu.table_name AS referenced_table,
|
|
241
|
-
ccu.column_name AS referenced_column
|
|
242
|
-
FROM information_schema.table_constraints AS tc
|
|
243
|
-
JOIN information_schema.key_column_usage AS kcu
|
|
244
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
245
|
-
JOIN information_schema.constraint_column_usage AS ccu
|
|
246
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
247
|
-
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
248
|
-
AND tc.table_name = ?
|
|
237
|
+
const result = await db.raw(`
|
|
238
|
+
SELECT
|
|
239
|
+
kcu.column_name,
|
|
240
|
+
ccu.table_name AS referenced_table,
|
|
241
|
+
ccu.column_name AS referenced_column
|
|
242
|
+
FROM information_schema.table_constraints AS tc
|
|
243
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
244
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
245
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
246
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
247
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
248
|
+
AND tc.table_name = ?
|
|
249
249
|
`, [tableName]);
|
|
250
250
|
for (const fk of result.rows) {
|
|
251
251
|
constraints.push({
|
|
@@ -86,11 +86,11 @@ export async function getConstraints(params, adapter) {
|
|
|
86
86
|
'c.priority',
|
|
87
87
|
knex.raw(`${db.dateFunction('c.ts')} as created_at`),
|
|
88
88
|
// Tags subquery
|
|
89
|
-
knex.raw(`(
|
|
90
|
-
SELECT ${db.stringAgg('t2.name', ',')}
|
|
91
|
-
FROM t_constraint_tags ct2
|
|
92
|
-
JOIN m_tags t2 ON ct2.tag_id = t2.id
|
|
93
|
-
WHERE ct2.constraint_id = c.id
|
|
89
|
+
knex.raw(`(
|
|
90
|
+
SELECT ${db.stringAgg('t2.name', ',')}
|
|
91
|
+
FROM t_constraint_tags ct2
|
|
92
|
+
JOIN m_tags t2 ON ct2.tag_id = t2.id
|
|
93
|
+
WHERE ct2.constraint_id = c.id
|
|
94
94
|
) as tags`),
|
|
95
95
|
]);
|
|
96
96
|
// Convert priority integer to string and parse tags
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Normalization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform path normalization for Windows environments.
|
|
5
|
+
* Handles Git Bash/MSYS2 path conversion and drive letter consistency.
|
|
6
|
+
*
|
|
7
|
+
* @since v5.2.0
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Normalize a path for Windows cross-platform consistency.
|
|
11
|
+
*
|
|
12
|
+
* Performs:
|
|
13
|
+
* 1. Git Bash/MSYS2 path conversion (/c/Users/... -> C:\Users\...)
|
|
14
|
+
* 2. Absolute path resolution via resolve()
|
|
15
|
+
* 3. Drive letter lowercase normalization
|
|
16
|
+
*
|
|
17
|
+
* On non-Windows platforms, only resolve() is applied.
|
|
18
|
+
*
|
|
19
|
+
* @param inputPath - Path to normalize
|
|
20
|
+
* @returns Normalized absolute path
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeWindowsPath(inputPath: string): string;
|
|
23
|
+
//# sourceMappingURL=path-normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-normalize.d.ts","sourceRoot":"","sources":["../../src/utils/path-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAkB9D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Normalization Utilities
|
|
3
|
+
*
|
|
4
|
+
* Cross-platform path normalization for Windows environments.
|
|
5
|
+
* Handles Git Bash/MSYS2 path conversion and drive letter consistency.
|
|
6
|
+
*
|
|
7
|
+
* @since v5.2.0
|
|
8
|
+
*/
|
|
9
|
+
import { resolve } from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Normalize a path for Windows cross-platform consistency.
|
|
12
|
+
*
|
|
13
|
+
* Performs:
|
|
14
|
+
* 1. Git Bash/MSYS2 path conversion (/c/Users/... -> C:\Users\...)
|
|
15
|
+
* 2. Absolute path resolution via resolve()
|
|
16
|
+
* 3. Drive letter lowercase normalization
|
|
17
|
+
*
|
|
18
|
+
* On non-Windows platforms, only resolve() is applied.
|
|
19
|
+
*
|
|
20
|
+
* @param inputPath - Path to normalize
|
|
21
|
+
* @returns Normalized absolute path
|
|
22
|
+
*/
|
|
23
|
+
export function normalizeWindowsPath(inputPath) {
|
|
24
|
+
let normalizedPath = inputPath;
|
|
25
|
+
// Convert Git Bash/MSYS2 paths (/c/Users/...) to Windows paths (C:\Users\...)
|
|
26
|
+
if (process.platform === 'win32' && /^\/[a-zA-Z]\//.test(normalizedPath)) {
|
|
27
|
+
const driveLetter = normalizedPath[1].toUpperCase();
|
|
28
|
+
normalizedPath = driveLetter + ':' + normalizedPath.slice(2).replace(/\//g, '\\');
|
|
29
|
+
}
|
|
30
|
+
// Resolve to absolute path
|
|
31
|
+
normalizedPath = resolve(normalizedPath);
|
|
32
|
+
// Lowercase drive letter for consistency
|
|
33
|
+
if (process.platform === 'win32' && /^[A-Z]:/.test(normalizedPath)) {
|
|
34
|
+
normalizedPath = normalizedPath[0].toLowerCase() + normalizedPath.slice(1);
|
|
35
|
+
}
|
|
36
|
+
return normalizedPath;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=path-normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-normalize.js","sourceRoot":"","sources":["../../src/utils/path-normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,cAAc,GAAG,SAAS,CAAC;IAE/B,8EAA8E;IAC9E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,cAAc,GAAG,WAAW,GAAG,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpF,CAAC;IAED,2BAA2B;IAC3B,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEzC,yCAAyC;IACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACnE,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* Project Root Determination Utility
|
|
3
3
|
*
|
|
4
4
|
* Determines the project root directory with correct priority order:
|
|
5
|
-
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code
|
|
5
|
+
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code / Grok Build hooks)
|
|
6
|
+
* 0b. GROK_WORKSPACE_ROOT environment variable (Grok Build hooks / MCP)
|
|
7
|
+
* 0c. CODEX_CWD environment variable (Codex hooks / MCP)
|
|
6
8
|
* 1. SQLEW_PROJECT_ROOT environment variable (MCP client can set this)
|
|
7
9
|
* 2. CLI --db-path argument (absolute path) → use dirname
|
|
8
10
|
* 3. CLI --config-path argument (absolute path) → use dirname
|
|
@@ -13,7 +15,8 @@
|
|
|
13
15
|
* like C:\Windows\System32 (e.g., by MCP hosts like Claude Desktop or Junie AI).
|
|
14
16
|
*
|
|
15
17
|
* Environment Variable Support:
|
|
16
|
-
* - CLAUDE_PROJECT_DIR: Set automatically by Claude Code
|
|
18
|
+
* - CLAUDE_PROJECT_DIR: Set automatically by Claude Code / Grok Build hooks (v4.1.0+)
|
|
19
|
+
* - GROK_WORKSPACE_ROOT: Set automatically by Grok Build hooks (v5.2.0+)
|
|
17
20
|
* - SQLEW_PROJECT_ROOT: MCP clients can set this (Serena-MCP pattern)
|
|
18
21
|
* This allows project-relative database paths without absolute CLI arguments.
|
|
19
22
|
*/
|
|
@@ -38,7 +41,8 @@ export interface ProjectRootOptions {
|
|
|
38
41
|
* Determines the project root directory based on available path information.
|
|
39
42
|
*
|
|
40
43
|
* Priority order (highest to lowest):
|
|
41
|
-
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code
|
|
44
|
+
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code / Grok Build hooks)
|
|
45
|
+
* 0b. GROK_WORKSPACE_ROOT environment variable (Grok Build)
|
|
42
46
|
* 1. SQLEW_PROJECT_ROOT environment variable
|
|
43
47
|
* 2. CLI --db-path (absolute)
|
|
44
48
|
* 3. CLI --config-path (absolute)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAuD7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiB1D"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* Project Root Determination Utility
|
|
3
3
|
*
|
|
4
4
|
* Determines the project root directory with correct priority order:
|
|
5
|
-
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code
|
|
5
|
+
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code / Grok Build hooks)
|
|
6
|
+
* 0b. GROK_WORKSPACE_ROOT environment variable (Grok Build hooks / MCP)
|
|
7
|
+
* 0c. CODEX_CWD environment variable (Codex hooks / MCP)
|
|
6
8
|
* 1. SQLEW_PROJECT_ROOT environment variable (MCP client can set this)
|
|
7
9
|
* 2. CLI --db-path argument (absolute path) → use dirname
|
|
8
10
|
* 3. CLI --config-path argument (absolute path) → use dirname
|
|
@@ -13,7 +15,8 @@
|
|
|
13
15
|
* like C:\Windows\System32 (e.g., by MCP hosts like Claude Desktop or Junie AI).
|
|
14
16
|
*
|
|
15
17
|
* Environment Variable Support:
|
|
16
|
-
* - CLAUDE_PROJECT_DIR: Set automatically by Claude Code
|
|
18
|
+
* - CLAUDE_PROJECT_DIR: Set automatically by Claude Code / Grok Build hooks (v4.1.0+)
|
|
19
|
+
* - GROK_WORKSPACE_ROOT: Set automatically by Grok Build hooks (v5.2.0+)
|
|
17
20
|
* - SQLEW_PROJECT_ROOT: MCP clients can set this (Serena-MCP pattern)
|
|
18
21
|
* This allows project-relative database paths without absolute CLI arguments.
|
|
19
22
|
*/
|
|
@@ -22,7 +25,8 @@ import * as path from 'path';
|
|
|
22
25
|
* Determines the project root directory based on available path information.
|
|
23
26
|
*
|
|
24
27
|
* Priority order (highest to lowest):
|
|
25
|
-
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code
|
|
28
|
+
* 0. CLAUDE_PROJECT_DIR environment variable (Claude Code / Grok Build hooks)
|
|
29
|
+
* 0b. GROK_WORKSPACE_ROOT environment variable (Grok Build)
|
|
26
30
|
* 1. SQLEW_PROJECT_ROOT environment variable
|
|
27
31
|
* 2. CLI --db-path (absolute)
|
|
28
32
|
* 3. CLI --config-path (absolute)
|
|
@@ -64,6 +68,16 @@ export function determineProjectRoot(options = {}) {
|
|
|
64
68
|
// Normalize to forward slashes for cross-platform consistency
|
|
65
69
|
return claudeProjectDir.replace(/\\/g, '/');
|
|
66
70
|
}
|
|
71
|
+
// Priority 0b: GROK_WORKSPACE_ROOT (Grok Build hooks inject this on every hook process)
|
|
72
|
+
const grokWorkspaceRoot = process.env.GROK_WORKSPACE_ROOT;
|
|
73
|
+
if (grokWorkspaceRoot && path.isAbsolute(grokWorkspaceRoot)) {
|
|
74
|
+
return grokWorkspaceRoot.replace(/\\/g, '/');
|
|
75
|
+
}
|
|
76
|
+
// Priority 0c: CODEX_CWD (Codex hooks inject workspace cwd)
|
|
77
|
+
const codexCwd = process.env.CODEX_CWD;
|
|
78
|
+
if (codexCwd && path.isAbsolute(codexCwd)) {
|
|
79
|
+
return codexCwd.replace(/\\/g, '/');
|
|
80
|
+
}
|
|
67
81
|
// Priority 1: SQLEW_PROJECT_ROOT environment variable
|
|
68
82
|
// MCP clients (Junie, Claude Desktop, etc.) can set this to specify project directory
|
|
69
83
|
const envProjectRoot = process.env.SQLEW_PROJECT_ROOT;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/utils/project-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAsB7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAA8B,EAAE;IACnE,gEAAgE;IAChE,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,IAAI,gBAAgB,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1D,8DAA8D;QAC9D,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,wFAAwF;IACxF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1D,IAAI,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC5D,OAAO,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,sDAAsD;IACtD,sFAAsF;IACtF,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACtD,IAAI,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtD,8DAA8D;QAC9D,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,wDAAwD;IACxD,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvD,8DAA8D;QAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,wCAAwC;IACxC,kFAAkF;IAClF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEjE,oCAAoC;IACpC,MAAM,UAAU,GAAG;QACjB,mBAAmB;QACnB,mBAAmB;QACnB,UAAU;QACV,gBAAgB;QAChB,sBAAsB;KACvB,CAAC;IAEF,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -37,10 +37,6 @@ export declare abstract class BaseWatcher {
|
|
|
37
37
|
protected readonly debounceMs: number;
|
|
38
38
|
protected readonly watcherName: string;
|
|
39
39
|
constructor(name: string, debounceMs?: number);
|
|
40
|
-
/**
|
|
41
|
-
* Detect if running on WSL (Windows Subsystem for Linux)
|
|
42
|
-
*/
|
|
43
|
-
protected isWSL(): boolean;
|
|
44
40
|
/**
|
|
45
41
|
* Initialize chokidar watcher with common options
|
|
46
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/base-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAiB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,8BAAsB,WAAW;IAC/B,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC3C,SAAS,CAAC,SAAS,EAAE,OAAO,CAAS;IACrC,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAa;IAClE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAE3B,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAa;IAKnD;;OAEG;IACH,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"base-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/base-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAiB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,8BAAsB,WAAW;IAC/B,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC3C,SAAS,CAAC,SAAS,EAAE,OAAO,CAAS;IACrC,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAa;IAClE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAE3B,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAa;IAKnD;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS;IAmC/D;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAsB1E;;OAEG;aACa,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEtC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBlC;;OAEG;IACI,YAAY,IAAI,OAAO;IAI9B;;OAEG;IACI,OAAO,IAAI,MAAM;CAGzB"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* @since v4.1.0
|
|
11
11
|
*/
|
|
12
12
|
import chokidar from 'chokidar';
|
|
13
|
-
import {
|
|
13
|
+
import { detectEnvironment } from '../utils/environment-detector.js';
|
|
14
14
|
import { debugLog } from '../utils/debug-logger.js';
|
|
15
15
|
/**
|
|
16
16
|
* Abstract base class for file watchers
|
|
@@ -25,33 +25,22 @@ export class BaseWatcher {
|
|
|
25
25
|
this.watcherName = name;
|
|
26
26
|
this.debounceMs = debounceMs;
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Detect if running on WSL (Windows Subsystem for Linux)
|
|
30
|
-
*/
|
|
31
|
-
isWSL() {
|
|
32
|
-
if (process.platform !== 'linux') {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
const result = execSync('uname -r', {
|
|
37
|
-
encoding: 'utf-8',
|
|
38
|
-
stdio: ['pipe', 'pipe', 'ignore'],
|
|
39
|
-
});
|
|
40
|
-
return (result.toLowerCase().includes('microsoft') ||
|
|
41
|
-
result.toLowerCase().includes('wsl'));
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
28
|
/**
|
|
48
29
|
* Initialize chokidar watcher with common options
|
|
49
30
|
*/
|
|
50
31
|
initializeWatcher(options) {
|
|
51
|
-
const
|
|
32
|
+
const env = detectEnvironment();
|
|
33
|
+
const isWSL = env === 'wsl';
|
|
52
34
|
if (isWSL) {
|
|
53
35
|
debugLog('INFO', `${this.watcherName}: WSL detected`);
|
|
54
36
|
}
|
|
37
|
+
// WSL2 + Windows FS (/mnt/) requires polling because inotify doesn't work
|
|
38
|
+
const paths = Array.isArray(options.paths) ? options.paths : [options.paths];
|
|
39
|
+
const needsPolling = isWSL && paths.some(p => p.startsWith('/mnt/'));
|
|
40
|
+
const usePolling = options.usePolling ?? needsPolling;
|
|
41
|
+
if (needsPolling && options.usePolling === undefined) {
|
|
42
|
+
debugLog('INFO', `${this.watcherName}: Auto-enabling polling for WSL2 Windows FS`);
|
|
43
|
+
}
|
|
55
44
|
const watcherConfig = {
|
|
56
45
|
persistent: true,
|
|
57
46
|
ignoreInitial: options.ignoreInitial ?? true,
|
|
@@ -60,7 +49,7 @@ export class BaseWatcher {
|
|
|
60
49
|
stabilityThreshold: Math.max(options.debounceMs ?? this.debounceMs, 1000),
|
|
61
50
|
pollInterval: 500, // Reduced polling frequency to avoid duplicate events
|
|
62
51
|
},
|
|
63
|
-
usePolling
|
|
52
|
+
usePolling,
|
|
64
53
|
interval: options.pollInterval ?? 500, // Match polling interval
|
|
65
54
|
};
|
|
66
55
|
if (options.ignored && watcherConfig) {
|