sqlew 3.7.3 → 3.7.4
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 +184 -0
- package/LICENSE +0 -0
- package/README.md +2 -2
- package/assets/config.example.toml +0 -0
- package/assets/kanban-style.png +0 -0
- package/assets/sample-agents/README.md +0 -0
- package/assets/sample-agents/sqlew-architect.md +0 -0
- package/assets/sample-agents/sqlew-researcher.md +0 -0
- package/assets/sample-agents/sqlew-scrum-master.md +0 -0
- package/assets/schema.sql +0 -0
- package/assets/sqlew-logo.png +0 -0
- package/dist/cli/db-export.d.ts +29 -0
- package/dist/cli/db-export.d.ts.map +1 -0
- package/dist/cli/db-export.js +251 -0
- package/dist/cli/db-export.js.map +1 -0
- package/dist/cli/db-import.d.ts +31 -0
- package/dist/cli/db-import.d.ts.map +1 -0
- package/dist/cli/db-import.js +258 -0
- package/dist/cli/db-import.js.map +1 -0
- package/dist/cli.js +24 -2
- package/dist/cli.js.map +1 -1
- package/dist/tests/migrations/test-all-versions-real.js +3 -2
- package/dist/tests/migrations/test-all-versions-real.js.map +1 -1
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/exporter/export.d.ts +100 -0
- package/dist/utils/exporter/export.d.ts.map +1 -0
- package/dist/utils/exporter/export.js +363 -0
- package/dist/utils/exporter/export.js.map +1 -0
- package/dist/utils/importer/import.d.ts +29 -0
- package/dist/utils/importer/import.d.ts.map +1 -0
- package/dist/utils/importer/import.js +514 -0
- package/dist/utils/importer/import.js.map +1 -0
- package/dist/utils/importer/master-tables.d.ts +18 -0
- package/dist/utils/importer/master-tables.d.ts.map +1 -0
- package/dist/utils/importer/master-tables.js +255 -0
- package/dist/utils/importer/master-tables.js.map +1 -0
- package/dist/utils/importer/topological-sort.d.ts +61 -0
- package/dist/utils/importer/topological-sort.d.ts.map +1 -0
- package/dist/utils/importer/topological-sort.js +143 -0
- package/dist/utils/importer/topological-sort.js.map +1 -0
- package/docs/ACCEPTANCE_CRITERIA.md +0 -0
- package/docs/AI_AGENT_GUIDE.md +0 -0
- package/docs/ARCHITECTURE.md +0 -0
- package/docs/AUTO_FILE_TRACKING.md +0 -1
- package/docs/BEST_PRACTICES.md +0 -0
- package/docs/CONFIGURATION.md +0 -0
- package/docs/DATABASE_AUTH.md +1 -2
- package/docs/DECISION_CONTEXT.md +0 -0
- package/docs/DECISION_TO_TASK_MIGRATION_GUIDE.md +0 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +0 -0
- package/docs/SHARED_CONCEPTS.md +0 -0
- package/docs/SPECIALIZED_AGENTS.md +0 -0
- package/docs/TASK_ACTIONS.md +0 -0
- package/docs/TASK_DEPENDENCIES.md +0 -0
- package/docs/TASK_LINKING.md +0 -0
- package/docs/TASK_MIGRATION.md +0 -0
- package/docs/TASK_OVERVIEW.md +0 -0
- package/docs/TASK_PRUNING.md +0 -0
- package/docs/TASK_SYSTEM.md +0 -0
- package/docs/TOOL_REFERENCE.md +0 -2
- package/docs/TOOL_SELECTION.md +0 -0
- package/docs/WORKFLOWS.md +0 -0
- package/docs/{DATABASE_MIGRATION.md → cli/DATABASE_MIGRATION.md} +71 -32
- package/docs/cli/DATA_EXPORT_IMPORT.md +400 -0
- package/docs/cli/README.md +227 -0
- package/package.json +3 -2
- package/docs/BASEADAPTER_IMPLEMENTATION.md +0 -399
- package/docs/HELP_PREVIEW_COMPARISON.md +0 -259
- package/docs/MIGRATION_CHAIN.md +0 -293
- package/docs/MIGRATION_v2.md +0 -538
- package/docs/MIGRATION_v3.3.md +0 -602
- package/docs/MIGRATION_v3.6.0.md +0 -170
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +0 -497
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# sqlew CLI Mode
|
|
2
|
+
|
|
3
|
+
> Command-line tools for database migration and project data export/import
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
sqlew provides CLI commands for advanced database operations that complement the main MCP server functionality. These
|
|
8
|
+
commands are useful for database administration, backup/restore, and cross-project data migration.
|
|
9
|
+
|
|
10
|
+
## What is CLI Mode?
|
|
11
|
+
|
|
12
|
+
While the primary use of sqlew is as an **MCP server** (integrated with Claude Code via `.mcp.json`), it also provides
|
|
13
|
+
standalone **CLI commands** for:
|
|
14
|
+
|
|
15
|
+
- **Database Migration** - Generate SQL dumps for SQLite, MySQL, PostgresSQL migration
|
|
16
|
+
- **Project Export/Import** - Share project data across databases or team members
|
|
17
|
+
- **Backup/Restore** - Create SQL backups with schema and data
|
|
18
|
+
|
|
19
|
+
## MCP Server vs CLI Mode
|
|
20
|
+
|
|
21
|
+
| Feature | MCP Server (`npx sqlew`) | CLI Mode |
|
|
22
|
+
|-----------------|----------------------------------------|----------------------------------------------|
|
|
23
|
+
| **Primary Use** | AI agent context management | Database administration |
|
|
24
|
+
| **Setup** | `.mcp.json` configuration | Per-project npm install |
|
|
25
|
+
| **Commands** | MCP tools (decision, task, file, etc.) | CLI commands (db:dump, db:export, db:import) |
|
|
26
|
+
| **When to Use** | Daily AI development workflow | Database migration, backup, data sharing |
|
|
27
|
+
|
|
28
|
+
## Installation
|
|
29
|
+
|
|
30
|
+
### Install sqlew in Your Project
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cd /path/to/your/project
|
|
34
|
+
npm install sqlew
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Add npm Script Shortcut (Recommended)
|
|
38
|
+
|
|
39
|
+
Add to your `package.json`:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"scripts": {
|
|
44
|
+
"sqlew": "node node_modules/sqlew/dist/cli.js"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then you can use shorter commands:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm run sqlew db:dump --format=mysql --output=backup.sql
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Direct Command (Without Shortcut)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
node node_modules/sqlew/dist/cli.js db:dump --format=mysql --output=backup.sql
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Available Commands
|
|
62
|
+
|
|
63
|
+
### 1. `db:dump` - SQL Database Migration
|
|
64
|
+
|
|
65
|
+
Generate complete SQL dumps (schema + data) for database migration or backup.
|
|
66
|
+
|
|
67
|
+
**Use Cases**:
|
|
68
|
+
|
|
69
|
+
- Full database backup with schema
|
|
70
|
+
- Cross-database migration (SQLite → MySQL/PostgresSQL)
|
|
71
|
+
- Development → Production deployment
|
|
72
|
+
|
|
73
|
+
**Quick Example**:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Backup SQLite to MySQL dump
|
|
77
|
+
node node_modules/sqlew/dist/cli.js db:dump --format=mysql --output=backup.sql
|
|
78
|
+
|
|
79
|
+
# Backup to PostgresSQL dump
|
|
80
|
+
node node_modules/sqlew/dist/cli.js db:dump --format=postgresql --output=backup.sql
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**📖 Full Documentation**: [DATABASE_MIGRATION.md](DATABASE_MIGRATION.md)
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### 2. `db:export` - Project Data Export
|
|
88
|
+
|
|
89
|
+
Export project data to JSON format for sharing or multi-project consolidation.
|
|
90
|
+
|
|
91
|
+
**Use Cases**:
|
|
92
|
+
|
|
93
|
+
- Share context with team members
|
|
94
|
+
- Move projects between different databases
|
|
95
|
+
- Consolidate multiple projects into one database
|
|
96
|
+
|
|
97
|
+
**Quick Example**:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Export specific project
|
|
101
|
+
node node_modules/sqlew/dist/cli.js db:export --project=my-project --output=project.json
|
|
102
|
+
|
|
103
|
+
# Export all projects
|
|
104
|
+
node node_modules/sqlew/dist/cli.js db:export --output=all-projects.json
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**📖 Full Documentation**: [DATA_EXPORT_IMPORT.md](DATA_EXPORT_IMPORT.md#export-command)
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### 3. `db:import` - Project Data Import
|
|
112
|
+
|
|
113
|
+
Import project data from JSON export files.
|
|
114
|
+
|
|
115
|
+
**Use Cases**:
|
|
116
|
+
|
|
117
|
+
- Import shared project context
|
|
118
|
+
- Merge multiple projects into one database
|
|
119
|
+
- Migrate projects to a new database (different machine or DB type)
|
|
120
|
+
|
|
121
|
+
**Quick Example**:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Import from JSON export
|
|
125
|
+
node node_modules/sqlew/dist/cli.js db:import --source=project.json
|
|
126
|
+
|
|
127
|
+
# Import with custom name
|
|
128
|
+
node node_modules/sqlew/dist/cli.js db:import --source=project.json --project-name=new-name
|
|
129
|
+
|
|
130
|
+
# Dry-run validation
|
|
131
|
+
node node_modules/sqlew/dist/cli.js db:import --source=project.json --dry-run
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**📖 Full Documentation**: [DATA_EXPORT_IMPORT.md](DATA_EXPORT_IMPORT.md#import-command)
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Quick Comparison: When to Use Which Command
|
|
139
|
+
|
|
140
|
+
| Scenario | Use Command | Restore Capability |
|
|
141
|
+
|-----------------------------------------------|---------------------------|----------------------------|
|
|
142
|
+
| **Full database backup** | `db:dump` | ✅ Full restore |
|
|
143
|
+
| **Cross-database migration** (SQLite → MySQL) | `db:dump` | ✅ Full restore |
|
|
144
|
+
| **Share project with team** | `db:export` / `db:import` | ⚠️ Skips if project exists |
|
|
145
|
+
| **Consolidate multiple projects** | `db:export` / `db:import` | ⚠️ Skips if project exists |
|
|
146
|
+
| **Backup/restore same database** | `db:dump` | ✅ Full restore |
|
|
147
|
+
|
|
148
|
+
**⚠️ Important**: `db:export`/`db:import` uses `--skip-if-exists=true` by default, so it's NOT suitable for
|
|
149
|
+
backup/restore to the same database. Use `db:dump` for proper backup/restore.
|
|
150
|
+
|
|
151
|
+
## Common Workflows
|
|
152
|
+
|
|
153
|
+
### Workflow 1: Full Database Backup
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# Create SQL backup with schema + data
|
|
157
|
+
node node_modules/sqlew/dist/cli.js db:dump --format=sqlite --output=backup-$(date +%Y%m%d).sql
|
|
158
|
+
|
|
159
|
+
# Or simple SQLite file copy
|
|
160
|
+
cp .sqlew/sqlew.db .sqlew/backup-$(date +%Y%m%d).db
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Workflow 2: Share the Project with a Team Member
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Developer A: Export project
|
|
167
|
+
node node_modules/sqlew/dist/cli.js db:export --project=feature-x --output=feature-x.json
|
|
168
|
+
|
|
169
|
+
# Developer B: Import project (in their own database)
|
|
170
|
+
node node_modules/sqlew/dist/cli.js db:import --source=feature-x.json
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Workflow 3: Migrate to MySQL from SQLite
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Step 1: Generate MySQL dump
|
|
177
|
+
node node_modules/sqlew/dist/cli.js db:dump --format=mysql --output=migrate-to-mysql.sql
|
|
178
|
+
|
|
179
|
+
# Step 2: Create MySQL database
|
|
180
|
+
mysql -e "CREATE DATABASE sqlew_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
|
181
|
+
|
|
182
|
+
# Step 3: Import dump
|
|
183
|
+
mysql sqlew_db < migrate-to-mysql.sql
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Workflow 4: Consolidate Multiple Projects (Permission-Constrained)
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# Export from each project
|
|
190
|
+
cd ~/project-a && node node_modules/sqlew/dist/cli.js db:export --project=project-a --output=/tmp/a.json
|
|
191
|
+
cd ~/project-b && node node_modules/sqlew/dist/cli.js db:export --project=project-b --output=/tmp/b.json
|
|
192
|
+
|
|
193
|
+
# Import all to shared database
|
|
194
|
+
cd ~/shared-db
|
|
195
|
+
node node_modules/sqlew/dist/cli.js db:import --source=/tmp/a.json
|
|
196
|
+
node node_modules/sqlew/dist/cli.js db:import --source=/tmp/b.json
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Getting Help
|
|
200
|
+
|
|
201
|
+
Show command-specific help:
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
node node_modules/sqlew/dist/cli.js db:dump --help
|
|
205
|
+
node node_modules/sqlew/dist/cli.js db:export --help
|
|
206
|
+
node node_modules/sqlew/dist/cli.js db:import --help
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Detailed Documentation
|
|
210
|
+
|
|
211
|
+
- **[DATABASE_MIGRATION.md](DATABASE_MIGRATION.md)** - Complete `db:dump` reference
|
|
212
|
+
- SQL dump generation for all database types
|
|
213
|
+
- Data type mappings
|
|
214
|
+
- Transaction safety
|
|
215
|
+
- Conflict resolution
|
|
216
|
+
|
|
217
|
+
- **[DATA_EXPORT_IMPORT.md](DATA_EXPORT_IMPORT.md)** - Complete `db:export`/`db:import` reference
|
|
218
|
+
- JSON export/import system
|
|
219
|
+
- ID remapping strategy
|
|
220
|
+
- Multi-project consolidation
|
|
221
|
+
- Use cases and examples
|
|
222
|
+
|
|
223
|
+
## See Also
|
|
224
|
+
|
|
225
|
+
- [Main README](../../README.md) - MCP server setup and usage
|
|
226
|
+
- [Configuration Guide](../CONFIGURATION.md) - Database configuration options
|
|
227
|
+
- [Architecture](../ARCHITECTURE.md) - Technical architecture overview
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sqlew",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.4",
|
|
4
4
|
"description": "MCP server for efficient context sharing between Claude Code sub-agents (60-70% token reduction), Kanban Task Watcher, Decision or Constraint Context, and streamlined documentation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -45,7 +45,8 @@
|
|
|
45
45
|
"migrate:status": "npm run knex migrate:status",
|
|
46
46
|
"seed:make": "npm run knex seed:make",
|
|
47
47
|
"seed:run": "npm run knex seed:run",
|
|
48
|
-
"db:dump": "node dist/cli.js db:dump"
|
|
48
|
+
"db:dump": "node dist/cli.js db:dump",
|
|
49
|
+
"db:export": "node dist/cli.js db:export"
|
|
49
50
|
},
|
|
50
51
|
"engines": {
|
|
51
52
|
"node": ">=18.0.0"
|
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
# BaseAdapter Implementation Summary
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The `BaseAdapter` abstract class has been successfully implemented as part of the multi-RDBMS adapter system (Issue #20, Task #67). This implementation integrates authentication providers with database adapters, providing a unified foundation for all database connections.
|
|
6
|
-
|
|
7
|
-
## Implementation Details
|
|
8
|
-
|
|
9
|
-
### File Structure
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
src/adapters/
|
|
13
|
-
├── base-adapter.ts # NEW: Abstract base class with auth integration
|
|
14
|
-
├── sqlite-adapter.ts # UPDATED: Now extends BaseAdapter
|
|
15
|
-
├── postgresql-adapter.ts # UPDATED: Now extends BaseAdapter (stub)
|
|
16
|
-
├── mysql-adapter.ts # UPDATED: Now extends BaseAdapter (stub)
|
|
17
|
-
├── types.ts # UNCHANGED: DatabaseAdapter interface
|
|
18
|
-
├── index.ts # UPDATED: Exports BaseAdapter, updated factory
|
|
19
|
-
└── auth/
|
|
20
|
-
├── base-auth-provider.ts # Authentication provider base (completed)
|
|
21
|
-
├── direct-auth-provider.ts # Direct connection auth (completed)
|
|
22
|
-
├── auth-factory.ts # Provider factory (completed)
|
|
23
|
-
└── auth-types.ts # Type definitions (deprecated shim)
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Note**: SSH tunneling support was removed as of 2025-10-28. Users must set up SSH tunnels manually using the `ssh -L` command.
|
|
27
|
-
|
|
28
|
-
### Key Features
|
|
29
|
-
|
|
30
|
-
#### 1. **Authentication Integration**
|
|
31
|
-
|
|
32
|
-
The BaseAdapter integrates with authentication providers through a factory pattern:
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
export abstract class BaseAdapter implements DatabaseAdapter {
|
|
36
|
-
protected readonly config: DatabaseConfig;
|
|
37
|
-
protected authProvider: BaseAuthProvider | null = null;
|
|
38
|
-
protected knexInstance: Knex | null = null;
|
|
39
|
-
|
|
40
|
-
async connect(): Promise<Knex> {
|
|
41
|
-
// Create authentication provider
|
|
42
|
-
this.authProvider = createAuthProvider(this.config);
|
|
43
|
-
|
|
44
|
-
// Authenticate and get connection parameters
|
|
45
|
-
if (this.authProvider !== null) {
|
|
46
|
-
this.authProvider.validate();
|
|
47
|
-
const connParams = await this.authProvider.authenticate();
|
|
48
|
-
const knexConfig = this.buildKnexConfig(connParams);
|
|
49
|
-
this.knexInstance = knex(knexConfig);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Initialize adapter-specific settings
|
|
53
|
-
await this.initialize();
|
|
54
|
-
|
|
55
|
-
return this.knexInstance;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
#### 2. **Connection Lifecycle Management**
|
|
61
|
-
|
|
62
|
-
Complete lifecycle management with proper resource cleanup:
|
|
63
|
-
|
|
64
|
-
- **connect()**: Authenticate → Create Knex instance → Initialize
|
|
65
|
-
- **disconnect()**: Close Knex connection pool
|
|
66
|
-
- **cleanup()**: Release auth provider resources (SSH tunnels, tokens)
|
|
67
|
-
|
|
68
|
-
#### 3. **Abstract Methods**
|
|
69
|
-
|
|
70
|
-
Subclasses must implement:
|
|
71
|
-
|
|
72
|
-
- `initialize()`: Adapter-specific setup (pragmas, session settings)
|
|
73
|
-
- `getDialect()`: Knex dialect identifier ('sqlite3', 'pg', 'mysql2')
|
|
74
|
-
- Query adaptation methods (insertReturning, upsert, jsonExtract, etc.)
|
|
75
|
-
|
|
76
|
-
#### 4. **Backward Compatibility**
|
|
77
|
-
|
|
78
|
-
The implementation maintains full backward compatibility:
|
|
79
|
-
|
|
80
|
-
- Existing `DatabaseAdapter` interface unchanged
|
|
81
|
-
- Factory function supports both old and new signatures
|
|
82
|
-
- SQLite adapter works exactly as before (bypasses auth flow)
|
|
83
|
-
|
|
84
|
-
### Updated Adapters
|
|
85
|
-
|
|
86
|
-
#### SQLite Adapter
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
export class SQLiteAdapter extends BaseAdapter {
|
|
90
|
-
constructor(config: DatabaseConfig) {
|
|
91
|
-
super(config);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
getDialect(): string {
|
|
95
|
-
return 'better-sqlite3';
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async initialize(): Promise<void> {
|
|
99
|
-
const knex = this.getKnex();
|
|
100
|
-
// Configure SQLite pragmas
|
|
101
|
-
await knex.raw('PRAGMA journal_mode = WAL');
|
|
102
|
-
await knex.raw('PRAGMA foreign_keys = ON');
|
|
103
|
-
await knex.raw('PRAGMA synchronous = NORMAL');
|
|
104
|
-
await knex.raw('PRAGMA busy_timeout = 5000');
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Overrides connect() to bypass authentication
|
|
108
|
-
async connect(config?: Knex.Config): Promise<Knex> {
|
|
109
|
-
// SQLite doesn't need auth provider
|
|
110
|
-
this.knexInstance = knex(config || this.buildDefaultConfig());
|
|
111
|
-
this.rawConnection = await this.acquireRawConnection();
|
|
112
|
-
await this.initialize();
|
|
113
|
-
return this.knexInstance;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
#### PostgreSQL & MySQL Adapters (Stubs)
|
|
119
|
-
|
|
120
|
-
Both adapters now extend BaseAdapter with proper constructors, but throw "not implemented" errors for Phase 3:
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
export class PostgreSQLAdapter extends BaseAdapter {
|
|
124
|
-
constructor(config: DatabaseConfig) {
|
|
125
|
-
super(config);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
getDialect(): string {
|
|
129
|
-
return 'pg';
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async initialize(): Promise<void> {
|
|
133
|
-
throw new Error('PostgreSQL adapter not implemented yet. Planned for Phase 3.');
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Factory Function Updates
|
|
139
|
-
|
|
140
|
-
```typescript
|
|
141
|
-
export function createDatabaseAdapter(
|
|
142
|
-
databaseType: 'sqlite' | 'postgresql' | 'mysql',
|
|
143
|
-
config?: DatabaseConfig
|
|
144
|
-
): DatabaseAdapter {
|
|
145
|
-
// Build default config if not provided (backward compatibility)
|
|
146
|
-
const defaultConfig: DatabaseConfig = config || {
|
|
147
|
-
type: databaseType === 'postgresql' ? 'postgres' : databaseType,
|
|
148
|
-
connection: { host: '', port: 0, database: '' },
|
|
149
|
-
auth: { type: 'direct' },
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
switch (databaseType) {
|
|
153
|
-
case 'sqlite':
|
|
154
|
-
return new SQLiteAdapter(defaultConfig);
|
|
155
|
-
case 'postgresql':
|
|
156
|
-
return new PostgreSQLAdapter(defaultConfig);
|
|
157
|
-
case 'mysql':
|
|
158
|
-
return new MySQLAdapter(defaultConfig);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## Usage Examples
|
|
164
|
-
|
|
165
|
-
### Direct Database Connection
|
|
166
|
-
|
|
167
|
-
```typescript
|
|
168
|
-
import { PostgreSQLAdapter } from './adapters';
|
|
169
|
-
import type { DatabaseConfig } from './config/types';
|
|
170
|
-
|
|
171
|
-
const config: DatabaseConfig = {
|
|
172
|
-
type: 'postgres',
|
|
173
|
-
connection: {
|
|
174
|
-
host: 'localhost',
|
|
175
|
-
port: 5432,
|
|
176
|
-
database: 'mydb'
|
|
177
|
-
},
|
|
178
|
-
auth: {
|
|
179
|
-
type: 'direct',
|
|
180
|
-
user: 'postgres',
|
|
181
|
-
password: 'postgres'
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
const adapter = new PostgreSQLAdapter(config);
|
|
186
|
-
|
|
187
|
-
try {
|
|
188
|
-
// Connect with authentication
|
|
189
|
-
await adapter.connect();
|
|
190
|
-
|
|
191
|
-
// Use Knex instance
|
|
192
|
-
const knex = adapter.getKnex();
|
|
193
|
-
const users = await knex('users').select('*');
|
|
194
|
-
|
|
195
|
-
console.log(users);
|
|
196
|
-
} finally {
|
|
197
|
-
// Clean up resources
|
|
198
|
-
await adapter.disconnect();
|
|
199
|
-
await adapter.cleanup();
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Manual SSH Tunnel Connection
|
|
204
|
-
|
|
205
|
-
**Note**: SSH tunneling is NOT supported by this software. Users must set up SSH tunnels manually.
|
|
206
|
-
|
|
207
|
-
**Step 1**: Set up SSH tunnel manually:
|
|
208
|
-
```bash
|
|
209
|
-
ssh -L 5433:db.internal:5432 deploy@bastion.example.com
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**Step 2**: Configure adapter to use localhost:
|
|
213
|
-
```typescript
|
|
214
|
-
const config: DatabaseConfig = {
|
|
215
|
-
type: 'postgres',
|
|
216
|
-
connection: {
|
|
217
|
-
host: 'localhost', // Tunnel endpoint
|
|
218
|
-
port: 5433, // Forwarded port (not 5432!)
|
|
219
|
-
database: 'production'
|
|
220
|
-
},
|
|
221
|
-
auth: {
|
|
222
|
-
type: 'direct',
|
|
223
|
-
user: 'postgres',
|
|
224
|
-
password: 'dbpass'
|
|
225
|
-
}
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
const adapter = new PostgreSQLAdapter(config);
|
|
229
|
-
|
|
230
|
-
try {
|
|
231
|
-
await adapter.connect(); // Connects through manual SSH tunnel
|
|
232
|
-
const knex = adapter.getKnex();
|
|
233
|
-
// ... use connection (tunneled through bastion host)
|
|
234
|
-
} finally {
|
|
235
|
-
await adapter.disconnect(); // Close DB connection
|
|
236
|
-
await adapter.cleanup(); // Release auth resources
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Transaction Support
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
await adapter.transaction(async (trx) => {
|
|
244
|
-
await trx('accounts').where({ id: 1 }).decrement('balance', 100);
|
|
245
|
-
await trx('accounts').where({ id: 2 }).increment('balance', 100);
|
|
246
|
-
await trx('transfers').insert({ from: 1, to: 2, amount: 100 });
|
|
247
|
-
});
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## Testing
|
|
251
|
-
|
|
252
|
-
### Test Results
|
|
253
|
-
|
|
254
|
-
All existing tests pass with the new BaseAdapter implementation:
|
|
255
|
-
|
|
256
|
-
```
|
|
257
|
-
# tests 19
|
|
258
|
-
# suites 11
|
|
259
|
-
# pass 19
|
|
260
|
-
# fail 0
|
|
261
|
-
# cancelled 0
|
|
262
|
-
# skipped 0
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Test Updates
|
|
266
|
-
|
|
267
|
-
Two test files were updated to provide DatabaseConfig to SQLiteAdapter constructor:
|
|
268
|
-
|
|
269
|
-
1. `src/tests/tasks.link-file-backward-compat.test.ts`
|
|
270
|
-
2. `src/tests/tasks.watch-files-action.test.ts`
|
|
271
|
-
|
|
272
|
-
Both tests now create SQLiteAdapter with proper configuration:
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
const adapter = new SQLiteAdapter({
|
|
276
|
-
type: 'sqlite',
|
|
277
|
-
connection: { host: '', port: 0, database: ':memory:' },
|
|
278
|
-
auth: { type: 'direct' },
|
|
279
|
-
});
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
## Design Principles
|
|
283
|
-
|
|
284
|
-
### 1. **Separation of Concerns**
|
|
285
|
-
|
|
286
|
-
- Authentication providers handle credentials and tokens (SSH tunnels removed - manual setup required)
|
|
287
|
-
- Adapters handle database-specific operations
|
|
288
|
-
- Clean interfaces between layers
|
|
289
|
-
|
|
290
|
-
### 2. **Resource Safety**
|
|
291
|
-
|
|
292
|
-
- Explicit cleanup methods for both DB and auth resources
|
|
293
|
-
- Idempotent operations (safe to call connect/disconnect multiple times)
|
|
294
|
-
- Error handling prevents resource leaks
|
|
295
|
-
|
|
296
|
-
### 3. **Fail-Fast Validation**
|
|
297
|
-
|
|
298
|
-
- Auth provider validates config before connection attempt
|
|
299
|
-
- Clear error messages for misconfiguration
|
|
300
|
-
- TypeScript type safety throughout
|
|
301
|
-
|
|
302
|
-
### 4. **Extensibility**
|
|
303
|
-
|
|
304
|
-
- Easy to add new authentication methods (AWS IAM, GCP IAM - SSH removed)
|
|
305
|
-
- Easy to add new database adapters
|
|
306
|
-
- Factory pattern abstracts provider selection
|
|
307
|
-
|
|
308
|
-
## Implementation Statistics
|
|
309
|
-
|
|
310
|
-
### AI Time & Token Estimates
|
|
311
|
-
|
|
312
|
-
- **AI Time**: 25-30 minutes
|
|
313
|
-
- **Token Usage**: ~76,500 tokens
|
|
314
|
-
- **Complexity**: Medium (requires understanding of adapter pattern, auth integration, and backward compatibility)
|
|
315
|
-
|
|
316
|
-
### Breakdown
|
|
317
|
-
|
|
318
|
-
- Code reading and analysis: 5 minutes (~10k tokens)
|
|
319
|
-
- BaseAdapter implementation: 8 minutes (~20k tokens)
|
|
320
|
-
- Adapter updates (SQLite, PostgreSQL, MySQL): 7 minutes (~15k tokens)
|
|
321
|
-
- Test updates and compilation fixes: 5 minutes (~15k tokens)
|
|
322
|
-
- Testing and verification: 5 minutes (~16k tokens)
|
|
323
|
-
|
|
324
|
-
## Next Steps
|
|
325
|
-
|
|
326
|
-
### Phase 2: Database-Specific Adapters (Planned)
|
|
327
|
-
|
|
328
|
-
1. **PostgreSQL Adapter Implementation** (Task #68)
|
|
329
|
-
- Full PostgreSQL query adaptations
|
|
330
|
-
- Connection pool configuration
|
|
331
|
-
- PostgreSQL-specific features (JSONB, arrays, etc.)
|
|
332
|
-
|
|
333
|
-
2. **MySQL Adapter Implementation** (Task #69)
|
|
334
|
-
- Full MySQL query adaptations
|
|
335
|
-
- Connection pool configuration
|
|
336
|
-
- MySQL-specific features
|
|
337
|
-
|
|
338
|
-
### Phase 3: Advanced Features (Future)
|
|
339
|
-
|
|
340
|
-
1. **AWS IAM Authentication** (v3.8.0+)
|
|
341
|
-
- RDS IAM authentication provider
|
|
342
|
-
- Temporary token generation
|
|
343
|
-
- SSL/TLS certificate management
|
|
344
|
-
|
|
345
|
-
2. **GCP IAM Authentication** (v3.8.0+)
|
|
346
|
-
- Cloud SQL IAM authentication provider
|
|
347
|
-
- OAuth token handling
|
|
348
|
-
- Cloud SQL proxy integration
|
|
349
|
-
|
|
350
|
-
## Files Modified
|
|
351
|
-
|
|
352
|
-
### New Files
|
|
353
|
-
|
|
354
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/base-adapter.ts` (690 lines)
|
|
355
|
-
|
|
356
|
-
### Modified Files
|
|
357
|
-
|
|
358
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/sqlite-adapter.ts`
|
|
359
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/postgresql-adapter.ts`
|
|
360
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/mysql-adapter.ts`
|
|
361
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/index.ts`
|
|
362
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/adapters/auth/auth-factory.ts` (JSDoc fix)
|
|
363
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/tests/tasks.link-file-backward-compat.test.ts`
|
|
364
|
-
- `/home/kitayama/TypeScriptProject/mcp-sqlew/src/tests/tasks.watch-files-action.test.ts`
|
|
365
|
-
|
|
366
|
-
## Documentation
|
|
367
|
-
|
|
368
|
-
### Comprehensive JSDoc
|
|
369
|
-
|
|
370
|
-
The BaseAdapter includes extensive documentation:
|
|
371
|
-
|
|
372
|
-
- Class-level documentation with usage examples
|
|
373
|
-
- Method-level documentation with parameter descriptions
|
|
374
|
-
- Example code for common patterns
|
|
375
|
-
- Error handling guidance
|
|
376
|
-
- Resource management best practices
|
|
377
|
-
|
|
378
|
-
### Key Documentation Sections
|
|
379
|
-
|
|
380
|
-
1. **Connection Flow**: Step-by-step explanation of connection establishment
|
|
381
|
-
2. **Authentication Integration**: How auth providers are used
|
|
382
|
-
3. **Resource Lifecycle**: When to call connect/disconnect/cleanup
|
|
383
|
-
4. **Transaction Support**: How to use transactions safely
|
|
384
|
-
5. **Abstract Methods**: What subclasses must implement
|
|
385
|
-
|
|
386
|
-
## Conclusion
|
|
387
|
-
|
|
388
|
-
The BaseAdapter implementation successfully integrates authentication providers with database adapters while maintaining full backward compatibility. The design is extensible, well-documented, and type-safe, providing a solid foundation for the multi-RDBMS migration.
|
|
389
|
-
|
|
390
|
-
### Key Achievements
|
|
391
|
-
|
|
392
|
-
✅ Authentication provider integration via factory pattern
|
|
393
|
-
✅ Complete connection lifecycle management
|
|
394
|
-
✅ Backward compatibility with existing code
|
|
395
|
-
✅ Comprehensive error handling
|
|
396
|
-
✅ Full test coverage (all tests pass)
|
|
397
|
-
✅ Extensive documentation and examples
|
|
398
|
-
✅ Type-safe implementation throughout
|
|
399
|
-
✅ Prepared for Phase 2 (PostgreSQL/MySQL) and Phase 3 (Cloud IAM)
|