@blockspool/core 0.4.1 → 0.4.2
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/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +74 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +321 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +177 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +128 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scout/index.d.ts +15 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +383 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/prompt.d.ts +32 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +104 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +68 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +270 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +35 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +164 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +179 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +239 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +120 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +205 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatabaseAdapter - Abstract interface for database operations
|
|
3
|
+
*
|
|
4
|
+
* This interface allows BlockSpool to work with different database backends:
|
|
5
|
+
* - PostgreSQL (for teams/cloud)
|
|
6
|
+
* - SQLite (for individual developers, zero-config)
|
|
7
|
+
*
|
|
8
|
+
* Implementations must handle:
|
|
9
|
+
* - Connection management
|
|
10
|
+
* - Query execution with parameterized queries
|
|
11
|
+
* - Transaction support
|
|
12
|
+
* - Schema migrations
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Result of a database query
|
|
16
|
+
*/
|
|
17
|
+
export interface QueryResult<T = Record<string, unknown>> {
|
|
18
|
+
/** Array of rows returned by the query */
|
|
19
|
+
rows: T[];
|
|
20
|
+
/** Number of rows affected (for INSERT/UPDATE/DELETE) */
|
|
21
|
+
rowCount: number | null;
|
|
22
|
+
/** Column metadata (optional, Postgres-specific) */
|
|
23
|
+
fields?: Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
dataTypeID?: number;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Transaction client interface
|
|
30
|
+
* Passed to transaction callbacks to execute queries within the transaction
|
|
31
|
+
*/
|
|
32
|
+
export interface TransactionClient {
|
|
33
|
+
/**
|
|
34
|
+
* Execute a query within the transaction
|
|
35
|
+
*/
|
|
36
|
+
query<T = Record<string, unknown>>(text: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Migration definition
|
|
40
|
+
*/
|
|
41
|
+
export interface Migration {
|
|
42
|
+
/** Unique migration identifier (e.g., "001_initial") */
|
|
43
|
+
id: string;
|
|
44
|
+
/** SQL to apply the migration */
|
|
45
|
+
up: string;
|
|
46
|
+
/** SQL to rollback the migration (optional) */
|
|
47
|
+
down?: string;
|
|
48
|
+
/** Checksum for integrity validation */
|
|
49
|
+
checksum: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Migration result
|
|
53
|
+
*/
|
|
54
|
+
export interface MigrationResult {
|
|
55
|
+
/** Migrations that were applied */
|
|
56
|
+
applied: string[];
|
|
57
|
+
/** Migrations that were skipped (already applied) */
|
|
58
|
+
skipped: string[];
|
|
59
|
+
/** Whether this was a dry run */
|
|
60
|
+
dryRun: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Query logging configuration
|
|
64
|
+
*/
|
|
65
|
+
export interface QueryLogConfig {
|
|
66
|
+
/** Log all queries (verbose) */
|
|
67
|
+
logAll: boolean;
|
|
68
|
+
/** Log queries slower than this threshold (ms) */
|
|
69
|
+
slowQueryThresholdMs: number;
|
|
70
|
+
/** Log query parameters (may expose sensitive data) */
|
|
71
|
+
logParams: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Query statistics for monitoring
|
|
75
|
+
*/
|
|
76
|
+
export interface QueryStats {
|
|
77
|
+
totalQueries: number;
|
|
78
|
+
totalErrors: number;
|
|
79
|
+
totalDurationMs: number;
|
|
80
|
+
byType: Record<string, {
|
|
81
|
+
count: number;
|
|
82
|
+
errors: number;
|
|
83
|
+
durationMs: number;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Database adapter interface
|
|
88
|
+
*
|
|
89
|
+
* All database operations in BlockSpool go through this interface,
|
|
90
|
+
* allowing seamless switching between backends.
|
|
91
|
+
*/
|
|
92
|
+
export interface DatabaseAdapter {
|
|
93
|
+
/**
|
|
94
|
+
* Adapter name for logging/debugging
|
|
95
|
+
*/
|
|
96
|
+
readonly name: string;
|
|
97
|
+
/**
|
|
98
|
+
* Whether the adapter is connected
|
|
99
|
+
*/
|
|
100
|
+
readonly connected: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Execute a parameterized query
|
|
103
|
+
*
|
|
104
|
+
* @param text - SQL query with $1, $2, etc. placeholders
|
|
105
|
+
* @param params - Parameter values
|
|
106
|
+
* @returns Query result with rows and metadata
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* const result = await adapter.query<UserRow>(
|
|
110
|
+
* 'SELECT * FROM users WHERE id = $1',
|
|
111
|
+
* [userId]
|
|
112
|
+
* );
|
|
113
|
+
*/
|
|
114
|
+
query<T = Record<string, unknown>>(text: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
115
|
+
/**
|
|
116
|
+
* Execute a function within a database transaction
|
|
117
|
+
*
|
|
118
|
+
* The transaction is automatically committed on success,
|
|
119
|
+
* or rolled back on error.
|
|
120
|
+
*
|
|
121
|
+
* @param fn - Function to execute within the transaction
|
|
122
|
+
* @returns Result of the function
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* await adapter.withTransaction(async (tx) => {
|
|
126
|
+
* await tx.query('INSERT INTO orders ...', [...]);
|
|
127
|
+
* await tx.query('UPDATE inventory ...', [...]);
|
|
128
|
+
* });
|
|
129
|
+
*/
|
|
130
|
+
withTransaction<T>(fn: (client: TransactionClient) => Promise<T>): Promise<T>;
|
|
131
|
+
/**
|
|
132
|
+
* Run pending migrations
|
|
133
|
+
*
|
|
134
|
+
* @param options - Migration options
|
|
135
|
+
* @returns Migration result
|
|
136
|
+
*/
|
|
137
|
+
migrate(options?: {
|
|
138
|
+
dryRun?: boolean;
|
|
139
|
+
target?: string;
|
|
140
|
+
verbose?: boolean;
|
|
141
|
+
}): Promise<MigrationResult>;
|
|
142
|
+
/**
|
|
143
|
+
* Close the database connection
|
|
144
|
+
*
|
|
145
|
+
* Should be called when shutting down the application.
|
|
146
|
+
*/
|
|
147
|
+
close(): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* Configure query logging
|
|
150
|
+
*/
|
|
151
|
+
configureLogging?(config: Partial<QueryLogConfig>): void;
|
|
152
|
+
/**
|
|
153
|
+
* Get query statistics
|
|
154
|
+
*/
|
|
155
|
+
getStats?(): Readonly<QueryStats>;
|
|
156
|
+
/**
|
|
157
|
+
* Reset query statistics
|
|
158
|
+
*/
|
|
159
|
+
resetStats?(): void;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Factory function type for creating database adapters
|
|
163
|
+
*/
|
|
164
|
+
export type DatabaseAdapterFactory = (config: DatabaseConfig) => Promise<DatabaseAdapter>;
|
|
165
|
+
/**
|
|
166
|
+
* Database configuration
|
|
167
|
+
*/
|
|
168
|
+
export interface DatabaseConfig {
|
|
169
|
+
/** Connection URL (postgres://, sqlite://, or file path) */
|
|
170
|
+
url: string;
|
|
171
|
+
/** Maximum connections in pool (Postgres) */
|
|
172
|
+
maxConnections?: number;
|
|
173
|
+
/** Idle timeout in ms */
|
|
174
|
+
idleTimeoutMs?: number;
|
|
175
|
+
/** Connection timeout in ms */
|
|
176
|
+
connectionTimeoutMs?: number;
|
|
177
|
+
/** Enable WAL mode (SQLite) */
|
|
178
|
+
walMode?: boolean;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Detect database type from URL
|
|
182
|
+
*/
|
|
183
|
+
export declare function detectDatabaseType(url: string): 'postgres' | 'sqlite' | 'unknown';
|
|
184
|
+
/**
|
|
185
|
+
* Default database URL based on environment
|
|
186
|
+
*
|
|
187
|
+
* - If DATABASE_URL is set, use it (Postgres)
|
|
188
|
+
* - Otherwise, default to SQLite at ~/.blockspool/data.db
|
|
189
|
+
*/
|
|
190
|
+
export declare function getDefaultDatabaseUrl(): string;
|
|
191
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/db/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DatabaseAdapter - Abstract interface for database operations
|
|
3
|
+
*
|
|
4
|
+
* This interface allows BlockSpool to work with different database backends:
|
|
5
|
+
* - PostgreSQL (for teams/cloud)
|
|
6
|
+
* - SQLite (for individual developers, zero-config)
|
|
7
|
+
*
|
|
8
|
+
* Implementations must handle:
|
|
9
|
+
* - Connection management
|
|
10
|
+
* - Query execution with parameterized queries
|
|
11
|
+
* - Transaction support
|
|
12
|
+
* - Schema migrations
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Detect database type from URL
|
|
16
|
+
*/
|
|
17
|
+
export function detectDatabaseType(url) {
|
|
18
|
+
if (url.startsWith('postgres://') || url.startsWith('postgresql://')) {
|
|
19
|
+
return 'postgres';
|
|
20
|
+
}
|
|
21
|
+
if (url.startsWith('sqlite://') || url.startsWith('file:') || url.endsWith('.db') || url.endsWith('.sqlite')) {
|
|
22
|
+
return 'sqlite';
|
|
23
|
+
}
|
|
24
|
+
return 'unknown';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Default database URL based on environment
|
|
28
|
+
*
|
|
29
|
+
* - If DATABASE_URL is set, use it (Postgres)
|
|
30
|
+
* - Otherwise, default to SQLite at ~/.blockspool/data.db
|
|
31
|
+
*/
|
|
32
|
+
export function getDefaultDatabaseUrl() {
|
|
33
|
+
if (process.env.DATABASE_URL) {
|
|
34
|
+
return process.env.DATABASE_URL;
|
|
35
|
+
}
|
|
36
|
+
// Default to SQLite for zero-config mode
|
|
37
|
+
const home = process.env.HOME || process.env.USERPROFILE || '.';
|
|
38
|
+
return `${home}/.blockspool/data.db`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/db/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAwLH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACrE,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7G,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC;IAED,yCAAyC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,sBAAsB,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Adapter Contract Tests
|
|
3
|
+
*
|
|
4
|
+
* This module exports a test harness that validates any DatabaseAdapter
|
|
5
|
+
* implementation behaves correctly. Run these tests against both SQLite
|
|
6
|
+
* and Postgres adapters to ensure consistent behavior.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { runAdapterContract } from '@blockspool/core/db/contract';
|
|
10
|
+
* import { createSQLiteAdapter } from '@blockspool/sqlite';
|
|
11
|
+
*
|
|
12
|
+
* describe('SQLite Adapter', () => {
|
|
13
|
+
* runAdapterContract(() => createSQLiteAdapter({ url: ':memory:' }));
|
|
14
|
+
* });
|
|
15
|
+
*/
|
|
16
|
+
import type { DatabaseAdapter } from './adapter.js';
|
|
17
|
+
/**
|
|
18
|
+
* Test result
|
|
19
|
+
*/
|
|
20
|
+
export interface ContractTestResult {
|
|
21
|
+
name: string;
|
|
22
|
+
passed: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
durationMs: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Contract test suite result
|
|
28
|
+
*/
|
|
29
|
+
export interface ContractSuiteResult {
|
|
30
|
+
adapter: string;
|
|
31
|
+
total: number;
|
|
32
|
+
passed: number;
|
|
33
|
+
failed: number;
|
|
34
|
+
results: ContractTestResult[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run the adapter contract test suite
|
|
38
|
+
*
|
|
39
|
+
* @param createAdapter - Factory function to create a fresh adapter for each test
|
|
40
|
+
* @returns Test results
|
|
41
|
+
*/
|
|
42
|
+
export declare function runAdapterContract(createAdapter: () => Promise<DatabaseAdapter>): Promise<ContractSuiteResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Format contract test results for console output
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatContractResults(suite: ContractSuiteResult): string;
|
|
47
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/db/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAWpD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,GAC5C,OAAO,CAAC,mBAAmB,CAAC,CAwR9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAmBxE"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Adapter Contract Tests
|
|
3
|
+
*
|
|
4
|
+
* This module exports a test harness that validates any DatabaseAdapter
|
|
5
|
+
* implementation behaves correctly. Run these tests against both SQLite
|
|
6
|
+
* and Postgres adapters to ensure consistent behavior.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { runAdapterContract } from '@blockspool/core/db/contract';
|
|
10
|
+
* import { createSQLiteAdapter } from '@blockspool/sqlite';
|
|
11
|
+
*
|
|
12
|
+
* describe('SQLite Adapter', () => {
|
|
13
|
+
* runAdapterContract(() => createSQLiteAdapter({ url: ':memory:' }));
|
|
14
|
+
* });
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Test assertion helper
|
|
18
|
+
*/
|
|
19
|
+
function assert(condition, message) {
|
|
20
|
+
if (!condition) {
|
|
21
|
+
throw new Error(`Assertion failed: ${message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run the adapter contract test suite
|
|
26
|
+
*
|
|
27
|
+
* @param createAdapter - Factory function to create a fresh adapter for each test
|
|
28
|
+
* @returns Test results
|
|
29
|
+
*/
|
|
30
|
+
export async function runAdapterContract(createAdapter) {
|
|
31
|
+
const results = [];
|
|
32
|
+
let adapterName = 'unknown';
|
|
33
|
+
const tests = [
|
|
34
|
+
{
|
|
35
|
+
name: 'adapter has correct name',
|
|
36
|
+
fn: async (adapter) => {
|
|
37
|
+
adapterName = adapter.name;
|
|
38
|
+
assert(typeof adapter.name === 'string' && adapter.name.length > 0, 'adapter.name should be a non-empty string');
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'adapter reports connected state',
|
|
43
|
+
fn: async (adapter) => {
|
|
44
|
+
assert(adapter.connected === true, 'adapter should be connected after creation');
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'migrations create required tables',
|
|
49
|
+
fn: async (adapter) => {
|
|
50
|
+
// Run a simple query against each expected table to verify they exist
|
|
51
|
+
// This works across both SQLite and Postgres
|
|
52
|
+
try {
|
|
53
|
+
await adapter.query('SELECT 1 FROM projects LIMIT 1');
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error('Assertion failed: projects table should exist');
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await adapter.query('SELECT 1 FROM tickets LIMIT 1');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new Error('Assertion failed: tickets table should exist');
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
await adapter.query('SELECT 1 FROM runs LIMIT 1');
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error('Assertion failed: runs table should exist');
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
await adapter.query('SELECT 1 FROM leases LIMIT 1');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new Error('Assertion failed: leases table should exist');
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await adapter.query('SELECT 1 FROM run_steps LIMIT 1');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new Error('Assertion failed: run_steps table should exist');
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'ensureProject is idempotent',
|
|
86
|
+
fn: async (adapter) => {
|
|
87
|
+
const projectId = 'test_proj_1';
|
|
88
|
+
const projectData = {
|
|
89
|
+
id: projectId,
|
|
90
|
+
name: 'Test Project',
|
|
91
|
+
repo_url: 'https://github.com/test/repo',
|
|
92
|
+
root_path: '/tmp/test',
|
|
93
|
+
};
|
|
94
|
+
// First insert
|
|
95
|
+
await adapter.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectData.id, projectData.name, projectData.repo_url, projectData.root_path]);
|
|
96
|
+
// Query back
|
|
97
|
+
const result1 = await adapter.query('SELECT id FROM projects WHERE id = $1', [projectId]);
|
|
98
|
+
assert(result1.rows.length === 1, 'project should exist after first insert');
|
|
99
|
+
// Second insert should fail (unique constraint) or be idempotent
|
|
100
|
+
try {
|
|
101
|
+
await adapter.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectData.id, projectData.name, projectData.repo_url, projectData.root_path]);
|
|
102
|
+
// If we get here, the adapter allows duplicates (bad) unless it's an upsert
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Expected: unique constraint violation
|
|
106
|
+
}
|
|
107
|
+
// Query should still return exactly one row
|
|
108
|
+
const result2 = await adapter.query('SELECT id FROM projects WHERE id = $1', [projectId]);
|
|
109
|
+
assert(result2.rows.length === 1, 'should still have exactly one project');
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'createRun then getRun returns same data',
|
|
114
|
+
fn: async (adapter) => {
|
|
115
|
+
// Create project first
|
|
116
|
+
const projectId = 'test_proj_run';
|
|
117
|
+
await adapter.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectId, 'Test', null, '/tmp']);
|
|
118
|
+
// Create run
|
|
119
|
+
const runId = 'test_run_1';
|
|
120
|
+
await adapter.query(`INSERT INTO runs (id, project_id, type, status, max_iterations)
|
|
121
|
+
VALUES ($1, $2, $3, $4, $5)`, [runId, projectId, 'scout', 'running', 10]);
|
|
122
|
+
// Query back
|
|
123
|
+
const result = await adapter.query('SELECT id, project_id, type, status FROM runs WHERE id = $1', [runId]);
|
|
124
|
+
assert(result.rows.length === 1, 'run should exist');
|
|
125
|
+
assert(result.rows[0].id === runId, 'run id should match');
|
|
126
|
+
assert(result.rows[0].project_id === projectId, 'project_id should match');
|
|
127
|
+
assert(result.rows[0].type === 'scout', 'type should match');
|
|
128
|
+
assert(result.rows[0].status === 'running', 'status should match');
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'transaction commits on success',
|
|
133
|
+
fn: async (adapter) => {
|
|
134
|
+
const projectId = 'test_proj_tx_success';
|
|
135
|
+
await adapter.withTransaction(async (tx) => {
|
|
136
|
+
await tx.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectId, 'TX Test', null, '/tmp/tx']);
|
|
137
|
+
});
|
|
138
|
+
// Should exist after commit
|
|
139
|
+
const result = await adapter.query('SELECT id FROM projects WHERE id = $1', [projectId]);
|
|
140
|
+
assert(result.rows.length === 1, 'project should exist after transaction commit');
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'transaction rollbacks on error',
|
|
145
|
+
fn: async (adapter) => {
|
|
146
|
+
const projectId = 'test_proj_tx_rollback';
|
|
147
|
+
try {
|
|
148
|
+
await adapter.withTransaction(async (tx) => {
|
|
149
|
+
await tx.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectId, 'TX Rollback Test', null, '/tmp/tx']);
|
|
150
|
+
// Force error
|
|
151
|
+
throw new Error('Intentional rollback');
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Expected
|
|
156
|
+
}
|
|
157
|
+
// Should NOT exist after rollback
|
|
158
|
+
const result = await adapter.query('SELECT id FROM projects WHERE id = $1', [projectId]);
|
|
159
|
+
assert(result.rows.length === 0, 'project should not exist after transaction rollback');
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
name: 'query returns correct rowCount for INSERT',
|
|
164
|
+
fn: async (adapter) => {
|
|
165
|
+
const result = await adapter.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, ['test_proj_rowcount', 'RowCount Test', null, '/tmp']);
|
|
166
|
+
// Note: SQLite returns changes, Postgres returns rowCount
|
|
167
|
+
// Both should indicate 1 row affected
|
|
168
|
+
assert(result.rowCount === 1 || result.rowCount === null, 'rowCount should be 1 or null for single insert');
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'timestamps are stored correctly',
|
|
173
|
+
fn: async (adapter) => {
|
|
174
|
+
const projectId = 'test_proj_timestamps';
|
|
175
|
+
// Give 1 second buffer for timing issues
|
|
176
|
+
const beforeInsert = new Date(Date.now() - 1000);
|
|
177
|
+
await adapter.query(`INSERT INTO projects (id, name, repo_url, root_path) VALUES ($1, $2, $3, $4)`, [projectId, 'Timestamp Test', null, '/tmp']);
|
|
178
|
+
const result = await adapter.query('SELECT created_at FROM projects WHERE id = $1', [projectId]);
|
|
179
|
+
assert(result.rows.length === 1, 'project should exist');
|
|
180
|
+
// Parse the timestamp (SQLite uses 'YYYY-MM-DD HH:MM:SS' format)
|
|
181
|
+
const createdAtStr = result.rows[0].created_at;
|
|
182
|
+
const createdAt = new Date(createdAtStr.replace(' ', 'T') + 'Z');
|
|
183
|
+
const afterInsert = new Date(Date.now() + 1000);
|
|
184
|
+
assert(createdAt >= beforeInsert && createdAt <= afterInsert, `created_at (${createdAt.toISOString()}) should be between ${beforeInsert.toISOString()} and ${afterInsert.toISOString()}`);
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'close disconnects adapter',
|
|
189
|
+
fn: async (adapter) => {
|
|
190
|
+
await adapter.close();
|
|
191
|
+
assert(adapter.connected === false, 'adapter should be disconnected after close');
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
];
|
|
195
|
+
// Run each test
|
|
196
|
+
for (const test of tests) {
|
|
197
|
+
const start = Date.now();
|
|
198
|
+
let adapter = null;
|
|
199
|
+
try {
|
|
200
|
+
adapter = await createAdapter();
|
|
201
|
+
await test.fn(adapter);
|
|
202
|
+
results.push({
|
|
203
|
+
name: test.name,
|
|
204
|
+
passed: true,
|
|
205
|
+
durationMs: Date.now() - start,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
results.push({
|
|
210
|
+
name: test.name,
|
|
211
|
+
passed: false,
|
|
212
|
+
error: error instanceof Error ? error.message : String(error),
|
|
213
|
+
durationMs: Date.now() - start,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
// Close adapter if test didn't already close it
|
|
218
|
+
if (adapter?.connected) {
|
|
219
|
+
try {
|
|
220
|
+
await adapter.close();
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Ignore close errors
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const passed = results.filter(r => r.passed).length;
|
|
229
|
+
const failed = results.filter(r => !r.passed).length;
|
|
230
|
+
return {
|
|
231
|
+
adapter: adapterName,
|
|
232
|
+
total: results.length,
|
|
233
|
+
passed,
|
|
234
|
+
failed,
|
|
235
|
+
results,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Format contract test results for console output
|
|
240
|
+
*/
|
|
241
|
+
export function formatContractResults(suite) {
|
|
242
|
+
const lines = [
|
|
243
|
+
`\nAdapter Contract Tests: ${suite.adapter}`,
|
|
244
|
+
`${'='.repeat(50)}`,
|
|
245
|
+
];
|
|
246
|
+
for (const result of suite.results) {
|
|
247
|
+
const status = result.passed ? '✓' : '✗';
|
|
248
|
+
const time = `(${result.durationMs}ms)`;
|
|
249
|
+
lines.push(`${status} ${result.name} ${time}`);
|
|
250
|
+
if (result.error) {
|
|
251
|
+
lines.push(` Error: ${result.error}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
lines.push(`${'='.repeat(50)}`);
|
|
255
|
+
lines.push(`Total: ${suite.total} | Passed: ${suite.passed} | Failed: ${suite.failed}`);
|
|
256
|
+
return lines.join('\n');
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/db/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database adapter exports
|
|
3
|
+
*/
|
|
4
|
+
export { type QueryResult, type TransactionClient, type Migration, type MigrationResult, type QueryLogConfig, type QueryStats, type DatabaseAdapter, type DatabaseAdapterFactory, type DatabaseConfig, detectDatabaseType, getDefaultDatabaseUrl, } from './adapter.js';
|
|
5
|
+
export { runAdapterContract, formatContractResults, type ContractTestResult, type ContractSuiteResult, } from './contract.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAUL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GAGtB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exec/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exec/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC"}
|