sqlew 4.0.0 → 4.0.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 +40 -0
- package/dist/database/migrations/v4/20251128000000_drop_all_views.d.ts +24 -0
- package/dist/database/migrations/v4/20251128000000_drop_all_views.d.ts.map +1 -0
- package/dist/database/migrations/v4/20251128000000_drop_all_views.js +67 -0
- package/dist/database/migrations/v4/20251128000000_drop_all_views.js.map +1 -0
- package/dist/tests/feature/vcs/git-aware-completion.test.js +33 -0
- package/dist/tests/feature/vcs/git-aware-completion.test.js.map +1 -1
- package/dist/tools/constraints/actions/get.d.ts +2 -2
- package/dist/tools/constraints/actions/get.d.ts.map +1 -1
- package/dist/tools/constraints/actions/get.js +56 -19
- package/dist/tools/constraints/actions/get.js.map +1 -1
- package/dist/tools/files/actions/get.d.ts +2 -2
- package/dist/tools/files/actions/get.d.ts.map +1 -1
- package/dist/tools/files/actions/get.js +22 -51
- package/dist/tools/files/actions/get.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
+
## [4.0.1] - 2025-11-28
|
|
11
|
+
|
|
12
|
+
### Removed
|
|
13
|
+
|
|
14
|
+
**Database Views Eliminated**
|
|
15
|
+
|
|
16
|
+
- Dropped all database views (`v_tagged_constraints`, `v_recent_file_changes`, etc.)
|
|
17
|
+
- Views caused migration complexity across SQLite/MySQL/PostgreSQL due to database-specific syntax
|
|
18
|
+
- Migration: `20251128000000_drop_all_views.ts`
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
**JOIN-Based Queries**
|
|
23
|
+
|
|
24
|
+
- `src/tools/constraints/actions/get.ts` - Replaced `v_tagged_constraints` view with JOIN query
|
|
25
|
+
- `src/tools/files/actions/get.ts` - Replaced `v_recent_file_changes` view with JOIN query
|
|
26
|
+
- Uses `UniversalKnex` wrapper for cross-database compatibility (date functions, boolean values, string aggregation)
|
|
27
|
+
|
|
28
|
+
**VCS Test Cleanup**
|
|
29
|
+
|
|
30
|
+
- `src/tests/feature/vcs/git-aware-completion.test.ts` - Added automatic git reset after tests
|
|
31
|
+
- Test commits are now automatically dropped when tests complete
|
|
32
|
+
- Prevents test artifacts from polluting git history
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
**No-Views Guardrail Skill**
|
|
37
|
+
|
|
38
|
+
- `.claude/skills/no-views/SKILL.md` - Documentation for view prohibition policy
|
|
39
|
+
- `.claude/skills/skill-rules.json` - Added `no-views` rule (enforcement: block)
|
|
40
|
+
- Blocks creation of database views, requires JOINs instead
|
|
41
|
+
|
|
42
|
+
**Documentation Updates**
|
|
43
|
+
|
|
44
|
+
- `CLAUDE.md` - Updated to reflect no-views policy
|
|
45
|
+
- Removed Views section from database schema documentation
|
|
46
|
+
- Added `no-views` to Guardrail Skills table
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
10
50
|
## [4.0.0] - 2025-11-27
|
|
11
51
|
|
|
12
52
|
### Changed
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v4.0.1: Drop all database views
|
|
3
|
+
*
|
|
4
|
+
* Problem:
|
|
5
|
+
* - Database views cause migration complexity across different database engines
|
|
6
|
+
* - Views require database-specific SQL syntax (datetime functions, string aggregation)
|
|
7
|
+
* - Architectural decision: No views in v4+ schema - use JOINs instead
|
|
8
|
+
*
|
|
9
|
+
* Solution:
|
|
10
|
+
* - Drop all legacy views that may exist from v3 migrations
|
|
11
|
+
* - Tool files use JOIN queries via Knex query builder (cross-DB compatible)
|
|
12
|
+
* - Reference: src/utils/view-queries.ts for equivalent JOIN-based queries
|
|
13
|
+
*
|
|
14
|
+
* Related files updated:
|
|
15
|
+
* - src/tools/constraints/actions/get.ts - Now uses JOINs
|
|
16
|
+
* - src/tools/files/actions/get.ts - Now uses JOINs
|
|
17
|
+
*
|
|
18
|
+
* IDEMPOTENT: Can be run multiple times safely.
|
|
19
|
+
* SQLite, MySQL, PostgreSQL compatible.
|
|
20
|
+
*/
|
|
21
|
+
import type { Knex } from 'knex';
|
|
22
|
+
export declare function up(knex: Knex): Promise<void>;
|
|
23
|
+
export declare function down(knex: Knex): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=20251128000000_drop_all_views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251128000000_drop_all_views.d.ts","sourceRoot":"","sources":["../../../../src/database/migrations/v4/20251128000000_drop_all_views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqBjC,wBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBlD;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v4.0.1: Drop all database views
|
|
3
|
+
*
|
|
4
|
+
* Problem:
|
|
5
|
+
* - Database views cause migration complexity across different database engines
|
|
6
|
+
* - Views require database-specific SQL syntax (datetime functions, string aggregation)
|
|
7
|
+
* - Architectural decision: No views in v4+ schema - use JOINs instead
|
|
8
|
+
*
|
|
9
|
+
* Solution:
|
|
10
|
+
* - Drop all legacy views that may exist from v3 migrations
|
|
11
|
+
* - Tool files use JOIN queries via Knex query builder (cross-DB compatible)
|
|
12
|
+
* - Reference: src/utils/view-queries.ts for equivalent JOIN-based queries
|
|
13
|
+
*
|
|
14
|
+
* Related files updated:
|
|
15
|
+
* - src/tools/constraints/actions/get.ts - Now uses JOINs
|
|
16
|
+
* - src/tools/files/actions/get.ts - Now uses JOINs
|
|
17
|
+
*
|
|
18
|
+
* IDEMPOTENT: Can be run multiple times safely.
|
|
19
|
+
* SQLite, MySQL, PostgreSQL compatible.
|
|
20
|
+
*/
|
|
21
|
+
// All possible views from v3 schema that may still exist
|
|
22
|
+
const VIEWS_TO_DROP = [
|
|
23
|
+
// v3 views
|
|
24
|
+
'v_tagged_decisions',
|
|
25
|
+
'v_active_context',
|
|
26
|
+
'v_layer_summary',
|
|
27
|
+
'v_unread_messages_by_priority',
|
|
28
|
+
'v_recent_file_changes',
|
|
29
|
+
'v_tagged_constraints',
|
|
30
|
+
'v_task_board',
|
|
31
|
+
// v4 prefixed views (in case any were accidentally created)
|
|
32
|
+
'v4_tagged_decisions',
|
|
33
|
+
'v4_active_context',
|
|
34
|
+
'v4_layer_summary',
|
|
35
|
+
'v4_recent_file_changes',
|
|
36
|
+
'v4_tagged_constraints',
|
|
37
|
+
'v4_task_board',
|
|
38
|
+
];
|
|
39
|
+
export async function up(knex) {
|
|
40
|
+
console.log('🔄 Dropping all database views (v4.0.1 - No views policy)...');
|
|
41
|
+
for (const viewName of VIEWS_TO_DROP) {
|
|
42
|
+
try {
|
|
43
|
+
await knex.raw(`DROP VIEW IF EXISTS ${viewName}`);
|
|
44
|
+
console.log(` ✓ Dropped view: ${viewName}`);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Ignore errors if view doesn't exist (different error messages per DB)
|
|
48
|
+
const errorMsg = error.message?.toLowerCase() || '';
|
|
49
|
+
if (errorMsg.includes('does not exist') ||
|
|
50
|
+
errorMsg.includes('unknown') ||
|
|
51
|
+
errorMsg.includes('no such')) {
|
|
52
|
+
console.log(` ⚠️ View ${viewName} does not exist, skipping`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
console.log('✅ All views dropped successfully');
|
|
60
|
+
console.log('📝 Policy: No views in v4+ - use JOIN queries via Knex query builder');
|
|
61
|
+
}
|
|
62
|
+
export async function down(knex) {
|
|
63
|
+
console.log('⚠️ WARNING: Views will NOT be recreated');
|
|
64
|
+
console.log(' v4+ policy: No database views - use JOINs instead');
|
|
65
|
+
console.log(' Reference: src/utils/view-queries.ts for equivalent queries');
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=20251128000000_drop_all_views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"20251128000000_drop_all_views.js","sourceRoot":"","sources":["../../../../src/database/migrations/v4/20251128000000_drop_all_views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,yDAAyD;AACzD,MAAM,aAAa,GAAG;IACpB,WAAW;IACX,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,+BAA+B;IAC/B,uBAAuB;IACvB,sBAAsB;IACtB,cAAc;IACd,4DAA4D;IAC5D,qBAAqB;IACrB,mBAAmB;IACnB,kBAAkB;IAClB,wBAAwB;IACxB,uBAAuB;IACvB,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,IAAU;IACjC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAE5E,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,wEAAwE;YACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACpD,IACE,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACnC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC5B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC5B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,2BAA2B,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAU;IACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -17,11 +17,40 @@ function cleanupTestDir() {
|
|
|
17
17
|
rmSync(TEST_DIR, { recursive: true, force: true });
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
// Helper to get current git HEAD hash
|
|
21
|
+
function getGitHead() {
|
|
22
|
+
try {
|
|
23
|
+
return execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Helper to reset git to a specific commit
|
|
30
|
+
function resetGitTo(commitHash) {
|
|
31
|
+
try {
|
|
32
|
+
execSync(`git reset --hard ${commitHash}`, { stdio: 'ignore' });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Ignore errors (e.g., if reset fails)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
20
38
|
describe('Git-Aware Auto-Complete', () => {
|
|
21
39
|
let db;
|
|
40
|
+
let initialGitHead = null;
|
|
22
41
|
before(async () => {
|
|
42
|
+
// Record initial git HEAD to reset after tests (cleanup test commits)
|
|
43
|
+
initialGitHead = getGitHead();
|
|
23
44
|
// Clean up before tests
|
|
24
45
|
cleanupTestDir();
|
|
46
|
+
// Configure git user for test commits (required if not set globally)
|
|
47
|
+
try {
|
|
48
|
+
execSync('git config user.email 2>/dev/null || git config user.email "test@example.com"', { stdio: 'ignore' });
|
|
49
|
+
execSync('git config user.name 2>/dev/null || git config user.name "Test User"', { stdio: 'ignore' });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Ignore - may already be configured
|
|
53
|
+
}
|
|
25
54
|
// Create test database (in-memory)
|
|
26
55
|
db = await initializeDatabase({
|
|
27
56
|
databaseType: 'sqlite',
|
|
@@ -50,6 +79,10 @@ describe('Git-Aware Auto-Complete', () => {
|
|
|
50
79
|
}
|
|
51
80
|
// Clean up test directory
|
|
52
81
|
cleanupTestDir();
|
|
82
|
+
// Reset git to initial HEAD to drop test commits
|
|
83
|
+
if (initialGitHead) {
|
|
84
|
+
resetGitTo(initialGitHead);
|
|
85
|
+
}
|
|
53
86
|
});
|
|
54
87
|
it('should auto-complete task when all watched files are committed', async () => {
|
|
55
88
|
const knex = db.getKnex();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-aware-completion.test.js","sourceRoot":"","sources":["../../../../src/tests/feature/vcs/git-aware-completion.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAa,MAAM,WAAW,CAAC;AACnE,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;AAEtD,oCAAoC;AACpC,SAAS,cAAc;IACrB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,EAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"git-aware-completion.test.js","sourceRoot":"","sources":["../../../../src/tests/feature/vcs/git-aware-completion.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Retrieve constraints with advanced filtering
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses JOIN queries instead of database views for cross-DB compatibility
|
|
4
4
|
*/
|
|
5
5
|
import { DatabaseAdapter } from '../../../adapters/index.js';
|
|
6
6
|
import type { GetConstraintsParams, GetConstraintsResponse } from '../types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Retrieve v4_constraints with advanced filtering
|
|
9
|
-
* Uses
|
|
9
|
+
* Uses JOIN queries for cross-database compatibility (no views)
|
|
10
10
|
*
|
|
11
11
|
* @param params - Filter parameters
|
|
12
12
|
* @param adapter - Optional database adapter (for testing)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/constraints/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/constraints/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAQ7D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAwGjC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Retrieve constraints with advanced filtering
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses JOIN queries instead of database views for cross-DB compatibility
|
|
4
4
|
*/
|
|
5
5
|
import { getAdapter } from '../../../database.js';
|
|
6
6
|
import { validateCategory } from '../../../utils/validators.js';
|
|
@@ -8,9 +8,10 @@ import { validateActionParams } from '../../../utils/parameter-validator.js';
|
|
|
8
8
|
import { parseStringArray } from '../../../utils/param-parser.js';
|
|
9
9
|
import { getProjectContext } from '../../../utils/project-context.js';
|
|
10
10
|
import connectionManager from '../../../utils/connection-manager.js';
|
|
11
|
+
import { UniversalKnex } from '../../../utils/universal-knex.js';
|
|
11
12
|
/**
|
|
12
13
|
* Retrieve v4_constraints with advanced filtering
|
|
13
|
-
* Uses
|
|
14
|
+
* Uses JOIN queries for cross-database compatibility (no views)
|
|
14
15
|
*
|
|
15
16
|
* @param params - Filter parameters
|
|
16
17
|
* @param adapter - Optional database adapter (for testing)
|
|
@@ -25,39 +26,75 @@ export async function getConstraints(params, adapter) {
|
|
|
25
26
|
const projectId = getProjectContext().getProjectId();
|
|
26
27
|
// Validate parameters
|
|
27
28
|
validateActionParams('constraint', 'get', params);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const db = new UniversalKnex(knex);
|
|
30
|
+
// Build query using JOINs (no views - cross-DB compatible)
|
|
31
|
+
let query = knex('v4_constraints as c')
|
|
32
|
+
.join('v4_constraint_categories as cat', 'c.category_id', 'cat.id')
|
|
33
|
+
.leftJoin('v4_layers as l', 'c.layer_id', 'l.id')
|
|
34
|
+
.where('c.project_id', projectId)
|
|
35
|
+
.where('c.active', db.boolTrue());
|
|
31
36
|
// Filter by category
|
|
32
37
|
if (params.category) {
|
|
33
38
|
validateCategory(params.category);
|
|
34
|
-
query = query.where('
|
|
39
|
+
query = query.where('cat.name', params.category);
|
|
35
40
|
}
|
|
36
41
|
// Filter by layer
|
|
37
42
|
if (params.layer) {
|
|
38
|
-
query = query.where('
|
|
43
|
+
query = query.where('l.name', params.layer);
|
|
39
44
|
}
|
|
40
45
|
// Filter by priority
|
|
41
46
|
if (params.priority) {
|
|
42
|
-
|
|
47
|
+
// Convert priority string to integer for DB query
|
|
48
|
+
const priorityMap = {
|
|
49
|
+
low: 1, medium: 2, high: 3, critical: 4
|
|
50
|
+
};
|
|
51
|
+
const priorityInt = priorityMap[params.priority];
|
|
52
|
+
if (priorityInt !== undefined) {
|
|
53
|
+
query = query.where('c.priority', priorityInt);
|
|
54
|
+
}
|
|
43
55
|
}
|
|
44
|
-
// Filter by
|
|
56
|
+
// Filter by tags (OR logic - match ANY tag)
|
|
45
57
|
if (params.tags && params.tags.length > 0) {
|
|
46
|
-
// Parse tags (handles both arrays and JSON strings from MCP)
|
|
47
58
|
const tags = parseStringArray(params.tags);
|
|
48
|
-
query = query.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
59
|
+
query = query.whereExists(function () {
|
|
60
|
+
this.select(knex.raw('1'))
|
|
61
|
+
.from('v4_constraint_tags as ct')
|
|
62
|
+
.join('v4_tags as t', 'ct.tag_id', 't.id')
|
|
63
|
+
.whereRaw('ct.constraint_id = c.id')
|
|
64
|
+
.whereIn('t.name', tags);
|
|
52
65
|
});
|
|
53
66
|
}
|
|
54
|
-
//
|
|
55
|
-
|
|
67
|
+
// Order by priority DESC, category, ts DESC
|
|
68
|
+
query = query
|
|
69
|
+
.orderBy('c.priority', 'desc')
|
|
70
|
+
.orderBy('cat.name', 'asc')
|
|
71
|
+
.orderBy('c.ts', 'desc');
|
|
72
|
+
// Add limit
|
|
56
73
|
const limit = params.limit || 50;
|
|
57
74
|
query = query.limit(limit);
|
|
58
|
-
//
|
|
59
|
-
const rows = await query.select(
|
|
60
|
-
|
|
75
|
+
// Select columns with tags subquery
|
|
76
|
+
const rows = await query.select([
|
|
77
|
+
'c.id',
|
|
78
|
+
'c.project_id',
|
|
79
|
+
'cat.name as category',
|
|
80
|
+
'l.name as layer',
|
|
81
|
+
'c.constraint_text',
|
|
82
|
+
knex.raw(`CASE c.priority
|
|
83
|
+
WHEN 1 THEN 'low'
|
|
84
|
+
WHEN 2 THEN 'medium'
|
|
85
|
+
WHEN 3 THEN 'high'
|
|
86
|
+
ELSE 'critical'
|
|
87
|
+
END as priority`),
|
|
88
|
+
knex.raw(`${db.dateFunction('c.ts')} as created_at`),
|
|
89
|
+
// Tags subquery
|
|
90
|
+
knex.raw(`(
|
|
91
|
+
SELECT ${db.stringAgg('t2.name', ',')}
|
|
92
|
+
FROM v4_constraint_tags ct2
|
|
93
|
+
JOIN v4_tags t2 ON ct2.tag_id = t2.id
|
|
94
|
+
WHERE ct2.constraint_id = c.id
|
|
95
|
+
) as tags`),
|
|
96
|
+
]);
|
|
97
|
+
// Parse tags from comma-separated to array for consistency
|
|
61
98
|
const constraints = rows.map(row => ({
|
|
62
99
|
...row,
|
|
63
100
|
tags: row.tags ? row.tags.split(',') : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/tools/constraints/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/tools/constraints/actions/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Get file changes with advanced filtering
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses JOIN queries instead of database views for cross-DB compatibility
|
|
4
4
|
*/
|
|
5
5
|
import { DatabaseAdapter } from '../../../adapters/index.js';
|
|
6
6
|
import type { GetFileChangesParams, GetFileChangesResponse } from '../types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Get file changes with advanced filtering.
|
|
9
|
-
* Uses
|
|
9
|
+
* Uses JOIN queries for cross-database compatibility (no views).
|
|
10
10
|
*
|
|
11
11
|
* @param params - Filter parameters
|
|
12
12
|
* @param adapter - Optional database adapter (for testing)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/files/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAY7D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,GAAE,oBAAyB,EACjC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/tools/files/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAY7D,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,GAAE,oBAAyB,EACjC,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAiFjC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Get file changes with advanced filtering
|
|
3
|
-
* Uses
|
|
3
|
+
* Uses JOIN queries instead of database views for cross-DB compatibility
|
|
4
4
|
*/
|
|
5
5
|
import { getAdapter } from '../../../database.js';
|
|
6
6
|
import { getProjectContext } from '../../../utils/project-context.js';
|
|
@@ -8,10 +8,10 @@ import connectionManager from '../../../utils/connection-manager.js';
|
|
|
8
8
|
import { STRING_TO_CHANGE_TYPE, STANDARD_LAYERS, DEFAULT_QUERY_LIMIT } from '../../../constants.js';
|
|
9
9
|
import { validateChangeType } from '../../../utils/validators.js';
|
|
10
10
|
import { validateActionParams } from '../internal/validation.js';
|
|
11
|
-
import {
|
|
11
|
+
import { UniversalKnex } from '../../../utils/universal-knex.js';
|
|
12
12
|
/**
|
|
13
13
|
* Get file changes with advanced filtering.
|
|
14
|
-
* Uses
|
|
14
|
+
* Uses JOIN queries for cross-database compatibility (no views).
|
|
15
15
|
*
|
|
16
16
|
* @param params - Filter parameters
|
|
17
17
|
* @param adapter - Optional database adapter (for testing)
|
|
@@ -27,75 +27,46 @@ export async function getFileChanges(params = {}, adapter) {
|
|
|
27
27
|
// Execute with connection retry
|
|
28
28
|
return await connectionManager.executeWithRetry(async () => {
|
|
29
29
|
const knex = actualAdapter.getKnex();
|
|
30
|
+
const db = new UniversalKnex(knex);
|
|
30
31
|
const limit = params.limit || DEFAULT_QUERY_LIMIT;
|
|
31
|
-
// Build
|
|
32
|
-
const filterConditions = [];
|
|
33
|
-
if (params.file_path) {
|
|
34
|
-
filterConditions.push({ type: 'equals', field: 'f.path', value: params.file_path });
|
|
35
|
-
}
|
|
36
|
-
if (params.agent_name) {
|
|
37
|
-
filterConditions.push({ type: 'equals', field: 'a.name', value: params.agent_name });
|
|
38
|
-
}
|
|
39
|
-
if (params.layer) {
|
|
40
|
-
// Validate layer
|
|
41
|
-
if (!STANDARD_LAYERS.includes(params.layer)) {
|
|
42
|
-
throw new Error(`Invalid layer: ${params.layer}. Must be one of: ${STANDARD_LAYERS.join(', ')}`);
|
|
43
|
-
}
|
|
44
|
-
filterConditions.push({ type: 'equals', field: 'l.name', value: params.layer });
|
|
45
|
-
}
|
|
46
|
-
if (params.change_type) {
|
|
47
|
-
validateChangeType(params.change_type);
|
|
48
|
-
const changeTypeInt = STRING_TO_CHANGE_TYPE[params.change_type];
|
|
49
|
-
filterConditions.push({ type: 'equals', field: 'fc.change_type', value: changeTypeInt });
|
|
50
|
-
}
|
|
51
|
-
if (params.since) {
|
|
52
|
-
// Convert ISO 8601 to Unix epoch
|
|
53
|
-
const sinceEpoch = Math.floor(new Date(params.since).getTime() / 1000);
|
|
54
|
-
filterConditions.push({ type: 'greaterThanOrEqual', field: 'fc.ts', value: sinceEpoch });
|
|
55
|
-
}
|
|
56
|
-
// Use view if no specific filters (token efficient)
|
|
57
|
-
// Note: View already includes project_id filtering in application layer
|
|
58
|
-
if (filterConditions.length === 0) {
|
|
59
|
-
const rows = await knex('v_recent_file_changes')
|
|
60
|
-
.where('project_id', projectId)
|
|
61
|
-
.limit(limit)
|
|
62
|
-
.select('*');
|
|
63
|
-
return {
|
|
64
|
-
changes: rows,
|
|
65
|
-
count: rows.length,
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
// Build WHERE clause using query builder
|
|
69
|
-
const { whereClause, params: queryParams } = buildWhereClause(filterConditions);
|
|
70
|
-
// Build query dynamically with filters
|
|
32
|
+
// Build query using JOINs (no views - cross-DB compatible)
|
|
71
33
|
// Note: Agent tracking removed in v4.0 - changed_by field removed
|
|
72
34
|
let query = knex('v4_file_changes as fc')
|
|
73
35
|
.join('v4_files as f', 'fc.file_id', 'f.id')
|
|
74
36
|
.leftJoin('v4_layers as l', 'fc.layer_id', 'l.id')
|
|
75
|
-
.where('fc.project_id', projectId)
|
|
76
|
-
.select('f.path', 'l.name as layer', knex.raw(`CASE fc.change_type
|
|
77
|
-
WHEN 1 THEN 'created'
|
|
78
|
-
WHEN 2 THEN 'modified'
|
|
79
|
-
ELSE 'deleted'
|
|
80
|
-
END as change_type`), 'fc.description', knex.raw(`datetime(fc.ts, 'unixepoch') as changed_at`))
|
|
81
|
-
.orderBy('fc.ts', 'desc')
|
|
82
|
-
.limit(limit);
|
|
37
|
+
.where('fc.project_id', projectId);
|
|
83
38
|
// Apply filter conditions
|
|
84
39
|
if (params.file_path) {
|
|
85
40
|
query = query.where('f.path', params.file_path);
|
|
86
41
|
}
|
|
87
42
|
// Note: agent_name filter removed in v4.0 (agent tracking removed)
|
|
88
43
|
if (params.layer) {
|
|
44
|
+
// Validate layer
|
|
45
|
+
if (!STANDARD_LAYERS.includes(params.layer)) {
|
|
46
|
+
throw new Error(`Invalid layer: ${params.layer}. Must be one of: ${STANDARD_LAYERS.join(', ')}`);
|
|
47
|
+
}
|
|
89
48
|
query = query.where('l.name', params.layer);
|
|
90
49
|
}
|
|
91
50
|
if (params.change_type) {
|
|
51
|
+
validateChangeType(params.change_type);
|
|
92
52
|
const changeTypeInt = STRING_TO_CHANGE_TYPE[params.change_type];
|
|
93
53
|
query = query.where('fc.change_type', changeTypeInt);
|
|
94
54
|
}
|
|
95
55
|
if (params.since) {
|
|
56
|
+
// Convert ISO 8601 to Unix epoch
|
|
96
57
|
const sinceEpoch = Math.floor(new Date(params.since).getTime() / 1000);
|
|
97
58
|
query = query.where('fc.ts', '>=', sinceEpoch);
|
|
98
59
|
}
|
|
60
|
+
// Select columns with proper date formatting
|
|
61
|
+
query = query.select('f.path', 'l.name as layer', knex.raw(`CASE fc.change_type
|
|
62
|
+
WHEN 1 THEN 'created'
|
|
63
|
+
WHEN 2 THEN 'modified'
|
|
64
|
+
ELSE 'deleted'
|
|
65
|
+
END as change_type`), 'fc.description', knex.raw(`${db.dateFunction('fc.ts')} as changed_at`));
|
|
66
|
+
// Order and limit
|
|
67
|
+
query = query
|
|
68
|
+
.orderBy('fc.ts', 'desc')
|
|
69
|
+
.limit(limit);
|
|
99
70
|
const rows = await query;
|
|
100
71
|
return {
|
|
101
72
|
changes: rows,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/tools/files/actions/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,iBAAiB,MAAM,sCAAsC,CAAC;AACrE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/tools/files/actions/get.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED