@slope-dev/slope 1.5.4 → 1.7.0

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.
Files changed (84) hide show
  1. package/dist/cli/commands/init.d.ts.map +1 -1
  2. package/dist/cli/commands/init.js +70 -0
  3. package/dist/cli/commands/init.js.map +1 -1
  4. package/dist/cli/commands/map.d.ts.map +1 -1
  5. package/dist/cli/commands/map.js +46 -66
  6. package/dist/cli/commands/map.js.map +1 -1
  7. package/dist/cli/commands/standup.d.ts.map +1 -1
  8. package/dist/cli/commands/standup.js +31 -2
  9. package/dist/cli/commands/standup.js.map +1 -1
  10. package/dist/cli/guards/subagent-gate.d.ts.map +1 -1
  11. package/dist/cli/guards/subagent-gate.js +31 -1
  12. package/dist/cli/guards/subagent-gate.js.map +1 -1
  13. package/dist/cli/store.d.ts.map +1 -1
  14. package/dist/cli/store.js +16 -0
  15. package/dist/cli/store.js.map +1 -1
  16. package/dist/core/config.d.ts +6 -0
  17. package/dist/core/config.d.ts.map +1 -1
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/core/event-ingestion.d.ts +34 -0
  20. package/dist/core/event-ingestion.d.ts.map +1 -0
  21. package/dist/core/event-ingestion.js +115 -0
  22. package/dist/core/event-ingestion.js.map +1 -0
  23. package/dist/core/github.d.ts +40 -0
  24. package/dist/core/github.d.ts.map +1 -0
  25. package/dist/core/github.js +130 -0
  26. package/dist/core/github.js.map +1 -0
  27. package/dist/core/index.d.ts +13 -3
  28. package/dist/core/index.d.ts.map +1 -1
  29. package/dist/core/index.js +12 -2
  30. package/dist/core/index.js.map +1 -1
  31. package/dist/core/interview.d.ts +31 -0
  32. package/dist/core/interview.d.ts.map +1 -0
  33. package/dist/core/interview.js +167 -0
  34. package/dist/core/interview.js.map +1 -0
  35. package/dist/core/metaphor.js +1 -1
  36. package/dist/core/metaphor.js.map +1 -1
  37. package/dist/core/metaphors/agile.d.ts +3 -0
  38. package/dist/core/metaphors/agile.d.ts.map +1 -0
  39. package/dist/core/metaphors/agile.js +90 -0
  40. package/dist/core/metaphors/agile.js.map +1 -0
  41. package/dist/core/metaphors/baseball.d.ts.map +1 -1
  42. package/dist/core/metaphors/baseball.js +1 -0
  43. package/dist/core/metaphors/baseball.js.map +1 -1
  44. package/dist/core/metaphors/dnd.d.ts.map +1 -1
  45. package/dist/core/metaphors/dnd.js +1 -0
  46. package/dist/core/metaphors/dnd.js.map +1 -1
  47. package/dist/core/metaphors/gaming.d.ts.map +1 -1
  48. package/dist/core/metaphors/gaming.js +1 -0
  49. package/dist/core/metaphors/gaming.js.map +1 -1
  50. package/dist/core/metaphors/golf.d.ts.map +1 -1
  51. package/dist/core/metaphors/golf.js +1 -0
  52. package/dist/core/metaphors/golf.js.map +1 -1
  53. package/dist/core/metaphors/index.d.ts +2 -1
  54. package/dist/core/metaphors/index.d.ts.map +1 -1
  55. package/dist/core/metaphors/index.js +3 -1
  56. package/dist/core/metaphors/index.js.map +1 -1
  57. package/dist/core/metaphors/matrix.d.ts.map +1 -1
  58. package/dist/core/metaphors/matrix.js +1 -0
  59. package/dist/core/metaphors/matrix.js.map +1 -1
  60. package/dist/core/metaphors/tennis.d.ts.map +1 -1
  61. package/dist/core/metaphors/tennis.js +1 -0
  62. package/dist/core/metaphors/tennis.js.map +1 -1
  63. package/dist/core/project-registry.d.ts +26 -0
  64. package/dist/core/project-registry.d.ts.map +1 -0
  65. package/dist/core/project-registry.js +56 -0
  66. package/dist/core/project-registry.js.map +1 -0
  67. package/dist/core/standup.d.ts +33 -0
  68. package/dist/core/standup.d.ts.map +1 -1
  69. package/dist/core/standup.js +137 -0
  70. package/dist/core/standup.js.map +1 -1
  71. package/dist/core/types.d.ts +1 -1
  72. package/dist/core/types.d.ts.map +1 -1
  73. package/dist/core/webhooks.d.ts +31 -0
  74. package/dist/core/webhooks.d.ts.map +1 -0
  75. package/dist/core/webhooks.js +114 -0
  76. package/dist/core/webhooks.js.map +1 -0
  77. package/dist/mcp/registry.d.ts +1 -1
  78. package/dist/mcp/registry.d.ts.map +1 -1
  79. package/dist/mcp/registry.js +1 -1
  80. package/dist/store-pg/index.d.ts +49 -0
  81. package/dist/store-pg/index.d.ts.map +1 -0
  82. package/dist/store-pg/index.js +422 -0
  83. package/dist/store-pg/index.js.map +1 -0
  84. package/package.json +8 -1
@@ -0,0 +1,422 @@
1
+ // SLOPE — PostgreSQL Storage Adapter
2
+ // Implements SlopeStore backed by PostgreSQL with JSONB and multi-tenancy.
3
+ // Requires the `pg` package: npm install pg
4
+ import { SlopeStoreError } from '../core/store.js';
5
+ function generateId(prefix) {
6
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
7
+ }
8
+ function nowISO() {
9
+ return new Date().toISOString();
10
+ }
11
+ /** Parse a JSONB column — PostgreSQL returns objects directly, SQLite returns strings */
12
+ function parseJsonColumn(val) {
13
+ if (typeof val === 'string')
14
+ return JSON.parse(val);
15
+ if (typeof val === 'object' && val !== null)
16
+ return val;
17
+ return {};
18
+ }
19
+ function parseJsonColumnOrNull(val) {
20
+ if (val === null || val === undefined)
21
+ return undefined;
22
+ return parseJsonColumn(val);
23
+ }
24
+ // Advisory lock ID for migration concurrency safety
25
+ const MIGRATION_LOCK_ID = 8675309;
26
+ const MIGRATIONS = [
27
+ {
28
+ version: 1,
29
+ sql: `
30
+ CREATE TABLE IF NOT EXISTS sessions (
31
+ session_id TEXT PRIMARY KEY,
32
+ project_id TEXT NOT NULL DEFAULT 'default',
33
+ role TEXT NOT NULL,
34
+ ide TEXT NOT NULL,
35
+ worktree_path TEXT,
36
+ branch TEXT,
37
+ started_at TEXT NOT NULL,
38
+ last_heartbeat_at TEXT NOT NULL,
39
+ metadata JSONB,
40
+ agent_role TEXT,
41
+ swarm_id TEXT
42
+ );
43
+
44
+ CREATE INDEX IF NOT EXISTS idx_sessions_project ON sessions(project_id);
45
+ CREATE INDEX IF NOT EXISTS idx_sessions_swarm ON sessions(swarm_id);
46
+
47
+ CREATE TABLE IF NOT EXISTS claims (
48
+ id TEXT PRIMARY KEY,
49
+ project_id TEXT NOT NULL DEFAULT 'default',
50
+ session_id TEXT,
51
+ sprint_number INTEGER NOT NULL,
52
+ target TEXT NOT NULL,
53
+ player TEXT NOT NULL,
54
+ scope TEXT NOT NULL,
55
+ claimed_at TEXT NOT NULL,
56
+ expires_at TEXT,
57
+ notes TEXT,
58
+ metadata JSONB,
59
+ UNIQUE(project_id, sprint_number, scope, target)
60
+ );
61
+
62
+ CREATE INDEX IF NOT EXISTS idx_claims_project ON claims(project_id);
63
+
64
+ CREATE TABLE IF NOT EXISTS scorecards (
65
+ project_id TEXT NOT NULL DEFAULT 'default',
66
+ sprint_number INTEGER NOT NULL,
67
+ data JSONB NOT NULL,
68
+ created_at TEXT NOT NULL,
69
+ updated_at TEXT NOT NULL,
70
+ PRIMARY KEY(project_id, sprint_number)
71
+ );
72
+
73
+ CREATE TABLE IF NOT EXISTS common_issues (
74
+ project_id TEXT PRIMARY KEY DEFAULT 'default',
75
+ data JSONB NOT NULL,
76
+ updated_at TEXT NOT NULL
77
+ );
78
+
79
+ CREATE TABLE IF NOT EXISTS events (
80
+ id TEXT PRIMARY KEY,
81
+ project_id TEXT NOT NULL DEFAULT 'default',
82
+ session_id TEXT,
83
+ type TEXT NOT NULL,
84
+ timestamp TEXT NOT NULL,
85
+ data JSONB NOT NULL DEFAULT '{}',
86
+ sprint_number INTEGER,
87
+ ticket_key TEXT
88
+ );
89
+
90
+ CREATE INDEX IF NOT EXISTS idx_events_project ON events(project_id);
91
+ CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
92
+ CREATE INDEX IF NOT EXISTS idx_events_sprint ON events(sprint_number);
93
+ CREATE INDEX IF NOT EXISTS idx_events_ticket ON events(ticket_key);
94
+ CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
95
+ `,
96
+ },
97
+ ];
98
+ export class PostgresSlopeStore {
99
+ pool;
100
+ ownedPool;
101
+ projectId;
102
+ migrated = false;
103
+ constructor(opts) {
104
+ if (opts.pool) {
105
+ this.pool = opts.pool;
106
+ this.ownedPool = false;
107
+ }
108
+ else if (opts.connectionString) {
109
+ // Dynamic import already happened in createPostgresStore
110
+ // We receive a pre-constructed pool
111
+ throw new Error('Use createPostgresStore() factory instead of direct constructor with connectionString');
112
+ }
113
+ else {
114
+ throw new Error('Either pool or connectionString is required');
115
+ }
116
+ this.projectId = opts.projectId ?? 'default';
117
+ }
118
+ /** Run schema migrations with transaction-scoped advisory lock for concurrency safety */
119
+ async migrate() {
120
+ if (this.migrated)
121
+ return;
122
+ const client = await this.pool.connect();
123
+ try {
124
+ // Use transaction-scoped advisory lock — auto-releases on COMMIT or ROLLBACK,
125
+ // so a migration failure never leaves a dangling lock in the pool.
126
+ await client.query('BEGIN');
127
+ await client.query(`SELECT pg_advisory_xact_lock(${MIGRATION_LOCK_ID})`);
128
+ // Bootstrap schema_version table
129
+ await client.query(`
130
+ CREATE TABLE IF NOT EXISTS schema_version (
131
+ version INTEGER PRIMARY KEY,
132
+ applied_at TEXT NOT NULL
133
+ )
134
+ `);
135
+ const result = await client.query('SELECT MAX(version) as v FROM schema_version');
136
+ const currentVersion = result.rows[0]?.v ?? 0;
137
+ for (const migration of MIGRATIONS) {
138
+ if (migration.version > currentVersion) {
139
+ await client.query(migration.sql);
140
+ await client.query('INSERT INTO schema_version (version, applied_at) VALUES ($1, $2)', [migration.version, nowISO()]);
141
+ }
142
+ }
143
+ await client.query('COMMIT');
144
+ this.migrated = true;
145
+ }
146
+ catch (err) {
147
+ await client.query('ROLLBACK').catch(() => { });
148
+ throw err;
149
+ }
150
+ finally {
151
+ client.release();
152
+ }
153
+ }
154
+ // --- Sessions ---
155
+ async registerSession(session) {
156
+ const now = nowISO();
157
+ const full = {
158
+ ...session,
159
+ started_at: now,
160
+ last_heartbeat_at: now,
161
+ };
162
+ try {
163
+ await this.pool.query(`
164
+ INSERT INTO sessions (session_id, project_id, role, ide, worktree_path, branch, started_at, last_heartbeat_at, metadata, agent_role, swarm_id)
165
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
166
+ `, [
167
+ full.session_id,
168
+ this.projectId,
169
+ full.role,
170
+ full.ide,
171
+ full.worktree_path ?? null,
172
+ full.branch ?? null,
173
+ full.started_at,
174
+ full.last_heartbeat_at,
175
+ full.metadata ? JSON.stringify(full.metadata) : null,
176
+ full.agent_role ?? null,
177
+ full.swarm_id ?? null,
178
+ ]);
179
+ }
180
+ catch (err) {
181
+ if (err instanceof Error && (err.message.includes('duplicate key') || err.message.includes('unique constraint'))) {
182
+ throw new SlopeStoreError('SESSION_CONFLICT', `Session "${session.session_id}" already exists`);
183
+ }
184
+ throw err;
185
+ }
186
+ return full;
187
+ }
188
+ async removeSession(sessionId) {
189
+ // Delete claims first (no FK cascade in PG schema)
190
+ await this.pool.query('DELETE FROM claims WHERE session_id = $1 AND project_id = $2', [sessionId, this.projectId]);
191
+ const result = await this.pool.query('DELETE FROM sessions WHERE session_id = $1 AND project_id = $2', [sessionId, this.projectId]);
192
+ return (result.rowCount ?? 0) > 0;
193
+ }
194
+ async getActiveSessions() {
195
+ const result = await this.pool.query('SELECT * FROM sessions WHERE project_id = $1 ORDER BY started_at DESC', [this.projectId]);
196
+ return result.rows.map(rowToSession);
197
+ }
198
+ async getSessionsBySwarm(swarmId) {
199
+ const result = await this.pool.query('SELECT * FROM sessions WHERE swarm_id = $1 AND project_id = $2 ORDER BY started_at', [swarmId, this.projectId]);
200
+ return result.rows.map(rowToSession);
201
+ }
202
+ async updateHeartbeat(sessionId) {
203
+ const result = await this.pool.query('UPDATE sessions SET last_heartbeat_at = $1 WHERE session_id = $2 AND project_id = $3', [nowISO(), sessionId, this.projectId]);
204
+ if ((result.rowCount ?? 0) === 0) {
205
+ throw new SlopeStoreError('NOT_FOUND', `Session "${sessionId}" not found`);
206
+ }
207
+ }
208
+ async cleanStaleSessions(maxAgeMs) {
209
+ const cutoff = new Date(Date.now() - maxAgeMs).toISOString();
210
+ // Delete claims for stale sessions first
211
+ await this.pool.query(`
212
+ DELETE FROM claims WHERE session_id IN (
213
+ SELECT session_id FROM sessions WHERE last_heartbeat_at < $1 AND project_id = $2
214
+ ) AND project_id = $2
215
+ `, [cutoff, this.projectId]);
216
+ const result = await this.pool.query('DELETE FROM sessions WHERE last_heartbeat_at < $1 AND project_id = $2', [cutoff, this.projectId]);
217
+ return result.rowCount ?? 0;
218
+ }
219
+ // --- Claims (SprintRegistry + extensions) ---
220
+ async claim(input) {
221
+ const claim = {
222
+ id: generateId('claim'),
223
+ claimed_at: nowISO(),
224
+ ...input,
225
+ };
226
+ try {
227
+ await this.pool.query(`
228
+ INSERT INTO claims (id, project_id, session_id, sprint_number, target, player, scope, claimed_at, expires_at, notes, metadata)
229
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
230
+ `, [
231
+ claim.id,
232
+ this.projectId,
233
+ claim.session_id ?? null,
234
+ claim.sprint_number,
235
+ claim.target,
236
+ claim.player,
237
+ claim.scope,
238
+ claim.claimed_at,
239
+ claim.expires_at ?? null,
240
+ claim.notes ?? null,
241
+ claim.metadata ? JSON.stringify(claim.metadata) : null,
242
+ ]);
243
+ }
244
+ catch (err) {
245
+ if (err instanceof Error && (err.message.includes('duplicate key') || err.message.includes('unique constraint'))) {
246
+ throw new SlopeStoreError('CLAIM_EXISTS', `Claim already exists for target "${input.target}" in sprint ${input.sprint_number}`);
247
+ }
248
+ throw err;
249
+ }
250
+ return claim;
251
+ }
252
+ async release(id) {
253
+ const result = await this.pool.query('DELETE FROM claims WHERE id = $1 AND project_id = $2', [id, this.projectId]);
254
+ return (result.rowCount ?? 0) > 0;
255
+ }
256
+ async list(sprintNumber) {
257
+ const result = await this.pool.query('SELECT * FROM claims WHERE sprint_number = $1 AND project_id = $2 ORDER BY claimed_at', [sprintNumber, this.projectId]);
258
+ return result.rows.map(rowToClaim);
259
+ }
260
+ async get(id) {
261
+ const result = await this.pool.query('SELECT * FROM claims WHERE id = $1 AND project_id = $2', [id, this.projectId]);
262
+ return result.rows.length > 0 ? rowToClaim(result.rows[0]) : undefined;
263
+ }
264
+ async getActiveClaims(sprintNumber) {
265
+ if (sprintNumber !== undefined) {
266
+ return this.list(sprintNumber);
267
+ }
268
+ const result = await this.pool.query('SELECT * FROM claims WHERE project_id = $1 ORDER BY sprint_number, claimed_at', [this.projectId]);
269
+ return result.rows.map(rowToClaim);
270
+ }
271
+ // --- Scorecards ---
272
+ async saveScorecard(card) {
273
+ const now = nowISO();
274
+ await this.pool.query(`
275
+ INSERT INTO scorecards (project_id, sprint_number, data, created_at, updated_at)
276
+ VALUES ($1, $2, $3, $4, $5)
277
+ ON CONFLICT(project_id, sprint_number) DO UPDATE SET data = EXCLUDED.data, updated_at = EXCLUDED.updated_at
278
+ `, [this.projectId, card.sprint_number, JSON.stringify(card), now, now]);
279
+ }
280
+ async listScorecards(filter) {
281
+ let sql = 'SELECT data FROM scorecards WHERE project_id = $1';
282
+ const params = [this.projectId];
283
+ let idx = 2;
284
+ if (filter?.minSprint !== undefined) {
285
+ sql += ` AND sprint_number >= $${idx}`;
286
+ params.push(filter.minSprint);
287
+ idx++;
288
+ }
289
+ if (filter?.maxSprint !== undefined) {
290
+ sql += ` AND sprint_number <= $${idx}`;
291
+ params.push(filter.maxSprint);
292
+ idx++;
293
+ }
294
+ sql += ' ORDER BY sprint_number';
295
+ const result = await this.pool.query(sql, params);
296
+ return result.rows.map(r => {
297
+ const data = r.data;
298
+ return (typeof data === 'string' ? JSON.parse(data) : data);
299
+ });
300
+ }
301
+ // --- Common Issues ---
302
+ async loadCommonIssues() {
303
+ const result = await this.pool.query('SELECT data FROM common_issues WHERE project_id = $1', [this.projectId]);
304
+ if (result.rows.length === 0) {
305
+ return { recurring_patterns: [] };
306
+ }
307
+ const data = result.rows[0].data;
308
+ return (typeof data === 'string' ? JSON.parse(data) : data);
309
+ }
310
+ async saveCommonIssues(issues) {
311
+ await this.pool.query(`
312
+ INSERT INTO common_issues (project_id, data, updated_at) VALUES ($1, $2, $3)
313
+ ON CONFLICT(project_id) DO UPDATE SET data = EXCLUDED.data, updated_at = EXCLUDED.updated_at
314
+ `, [this.projectId, JSON.stringify(issues), nowISO()]);
315
+ }
316
+ // --- Events ---
317
+ async insertEvent(event) {
318
+ const full = {
319
+ id: generateId('evt'),
320
+ timestamp: nowISO(),
321
+ ...event,
322
+ };
323
+ await this.pool.query(`
324
+ INSERT INTO events (id, project_id, session_id, type, timestamp, data, sprint_number, ticket_key)
325
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
326
+ ON CONFLICT(id) DO NOTHING
327
+ `, [
328
+ full.id,
329
+ this.projectId,
330
+ full.session_id ?? null,
331
+ full.type,
332
+ full.timestamp,
333
+ JSON.stringify(full.data),
334
+ full.sprint_number ?? null,
335
+ full.ticket_key ?? null,
336
+ ]);
337
+ return full;
338
+ }
339
+ async getEventsBySession(sessionId) {
340
+ const result = await this.pool.query('SELECT * FROM events WHERE session_id = $1 AND project_id = $2 ORDER BY timestamp', [sessionId, this.projectId]);
341
+ return result.rows.map(rowToEvent);
342
+ }
343
+ async getEventsBySprint(sprintNumber) {
344
+ const result = await this.pool.query('SELECT * FROM events WHERE sprint_number = $1 AND project_id = $2 ORDER BY timestamp', [sprintNumber, this.projectId]);
345
+ return result.rows.map(rowToEvent);
346
+ }
347
+ async getEventsByTicket(ticketKey) {
348
+ const result = await this.pool.query('SELECT * FROM events WHERE ticket_key = $1 AND project_id = $2 ORDER BY timestamp', [ticketKey, this.projectId]);
349
+ return result.rows.map(rowToEvent);
350
+ }
351
+ // --- Lifecycle ---
352
+ close() {
353
+ if (this.ownedPool) {
354
+ this.pool.end();
355
+ }
356
+ }
357
+ }
358
+ // --- Row mappers ---
359
+ function rowToSession(row) {
360
+ return {
361
+ session_id: row.session_id,
362
+ role: row.role,
363
+ ide: row.ide,
364
+ worktree_path: row.worktree_path ?? undefined,
365
+ branch: row.branch ?? undefined,
366
+ started_at: row.started_at,
367
+ last_heartbeat_at: row.last_heartbeat_at,
368
+ metadata: parseJsonColumnOrNull(row.metadata),
369
+ agent_role: row.agent_role ?? undefined,
370
+ swarm_id: row.swarm_id ?? undefined,
371
+ };
372
+ }
373
+ function rowToClaim(row) {
374
+ return {
375
+ id: row.id,
376
+ sprint_number: row.sprint_number,
377
+ player: row.player,
378
+ target: row.target,
379
+ scope: row.scope,
380
+ claimed_at: row.claimed_at,
381
+ notes: row.notes ?? undefined,
382
+ session_id: row.session_id ?? undefined,
383
+ expires_at: row.expires_at ?? undefined,
384
+ metadata: parseJsonColumnOrNull(row.metadata),
385
+ };
386
+ }
387
+ function rowToEvent(row) {
388
+ return {
389
+ id: row.id,
390
+ session_id: row.session_id ?? undefined,
391
+ type: row.type,
392
+ timestamp: row.timestamp,
393
+ data: parseJsonColumn(row.data),
394
+ sprint_number: row.sprint_number ?? undefined,
395
+ ticket_key: row.ticket_key ?? undefined,
396
+ };
397
+ }
398
+ /** Create a PostgreSQL-backed SlopeStore. Requires `pg` package to be installed. */
399
+ export async function createPostgresStore(opts) {
400
+ let pool;
401
+ let ownedPool;
402
+ if (opts.pool) {
403
+ pool = opts.pool;
404
+ ownedPool = false;
405
+ }
406
+ else if (opts.connectionString) {
407
+ // Dynamic import of pg — user must have it installed
408
+ const pgModule = await import('pg');
409
+ const PgPool = pgModule.default?.Pool ?? pgModule.Pool;
410
+ pool = new PgPool({ connectionString: opts.connectionString });
411
+ ownedPool = true;
412
+ }
413
+ else {
414
+ throw new Error('Either connectionString or pool is required');
415
+ }
416
+ const store = new PostgresSlopeStore({ pool, projectId: opts.projectId });
417
+ // Set ownedPool directly since constructor can't handle connectionString
418
+ store.ownedPool = ownedPool;
419
+ await store.migrate();
420
+ return store;
421
+ }
422
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store-pg/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slope-dev/slope",
3
- "version": "1.5.4",
3
+ "version": "1.7.0",
4
4
  "description": "SLOPE — Sprint Lifecycle & Operational Performance Engine. Golf-metaphor sprint scoring for engineering teams.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -9,6 +9,10 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./store-pg": {
14
+ "types": "./dist/store-pg/index.d.ts",
15
+ "import": "./dist/store-pg/index.js"
12
16
  }
13
17
  },
14
18
  "bin": {
@@ -22,6 +26,7 @@
22
26
  "prepare": "tsc",
23
27
  "build": "tsc",
24
28
  "test": "vitest run",
29
+ "test:pg": "SLOPE_TEST_PG_URL=postgresql://postgres:slope@localhost:5432/slope_test vitest run tests/store-pg/",
25
30
  "typecheck": "tsc --noEmit",
26
31
  "prepublishOnly": "pnpm run build",
27
32
  "version:bump": "node scripts/version-bump.mjs"
@@ -58,6 +63,8 @@
58
63
  "devDependencies": {
59
64
  "@types/better-sqlite3": "^7.6.0",
60
65
  "@types/node": "^25.3.0",
66
+ "@types/pg": "^8.11.0",
67
+ "pg": "^8.18.0",
61
68
  "typescript": "^5.7.0",
62
69
  "vitest": "^3.0.0"
63
70
  },