@promptwheel/core 0.6.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.
- package/dist/codebase-index/index.d.ts +23 -0
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +361 -0
- package/dist/codebase-index/index.js.map +1 -0
- package/dist/codebase-index/shared.d.ts +95 -0
- package/dist/codebase-index/shared.d.ts.map +1 -0
- package/dist/codebase-index/shared.js +319 -0
- package/dist/codebase-index/shared.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/critic/shared.d.ts +49 -0
- package/dist/critic/shared.d.ts.map +1 -0
- package/dist/critic/shared.js +204 -0
- package/dist/critic/shared.js.map +1 -0
- 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/dedup/shared.d.ts +82 -0
- package/dist/dedup/shared.d.ts.map +1 -0
- package/dist/dedup/shared.js +215 -0
- package/dist/dedup/shared.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/formulas/shared.d.ts +42 -0
- package/dist/formulas/shared.d.ts.map +1 -0
- package/dist/formulas/shared.js +204 -0
- package/dist/formulas/shared.js.map +1 -0
- package/dist/guidelines/shared.d.ts +46 -0
- package/dist/guidelines/shared.d.ts.map +1 -0
- package/dist/guidelines/shared.js +128 -0
- package/dist/guidelines/shared.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings/shared.d.ts +112 -0
- package/dist/learnings/shared.d.ts.map +1 -0
- package/dist/learnings/shared.js +402 -0
- package/dist/learnings/shared.js.map +1 -0
- package/dist/proposals/shared.d.ts +137 -0
- package/dist/proposals/shared.d.ts.map +1 -0
- package/dist/proposals/shared.js +254 -0
- package/dist/proposals/shared.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 +75 -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 +328 -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 +185 -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 +158 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scope/shared.d.ts +67 -0
- package/dist/scope/shared.d.ts.map +1 -0
- package/dist/scope/shared.js +355 -0
- package/dist/scope/shared.js.map +1 -0
- package/dist/scout/index.d.ts +18 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +445 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/kimi-runner.d.ts +21 -0
- package/dist/scout/kimi-runner.d.ts.map +1 -0
- package/dist/scout/kimi-runner.js +76 -0
- package/dist/scout/kimi-runner.js.map +1 -0
- package/dist/scout/mcp-batch-server.d.ts +37 -0
- package/dist/scout/mcp-batch-server.d.ts.map +1 -0
- package/dist/scout/mcp-batch-server.js +144 -0
- package/dist/scout/mcp-batch-server.js.map +1 -0
- package/dist/scout/openai-local-runner.d.ts +20 -0
- package/dist/scout/openai-local-runner.d.ts.map +1 -0
- package/dist/scout/openai-local-runner.js +82 -0
- package/dist/scout/openai-local-runner.js.map +1 -0
- package/dist/scout/prompt.d.ts +49 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +153 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +101 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +521 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +61 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +315 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +221 -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/sectors/shared.d.ts +146 -0
- package/dist/sectors/shared.d.ts.map +1 -0
- package/dist/sectors/shared.js +408 -0
- package/dist/sectors/shared.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 +228 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +164 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +215 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/spindle/shared.d.ts +14 -0
- package/dist/spindle/shared.d.ts.map +1 -0
- package/dist/spindle/shared.js +65 -0
- package/dist/spindle/shared.js.map +1 -0
- package/dist/tools/shared.d.ts +35 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +247 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/trace/shared.d.ts +147 -0
- package/dist/trace/shared.d.ts.map +1 -0
- package/dist/trace/shared.js +414 -0
- package/dist/trace/shared.js.map +1 -0
- package/dist/trajectory/shared.d.ts +69 -0
- package/dist/trajectory/shared.d.ts.map +1 -0
- package/dist/trajectory/shared.js +336 -0
- package/dist/trajectory/shared.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/dist/waves/shared.d.ts +106 -0
- package/dist/waves/shared.d.ts.map +1 -0
- package/dist/waves/shared.js +356 -0
- package/dist/waves/shared.js.map +1 -0
- package/package.json +126 -0
|
@@ -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 '@promptwheel/core/db/contract';
|
|
10
|
+
* import { createSQLiteAdapter } from '@promptwheel/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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure dedup algorithms — no filesystem, no database.
|
|
3
|
+
*
|
|
4
|
+
* Shared by both @promptwheel/cli and @promptwheel/mcp.
|
|
5
|
+
* CLI keeps its proposal-level wrapper (isDuplicateProposal).
|
|
6
|
+
* MCP keeps its file I/O (dedup-memory.json persistence).
|
|
7
|
+
*/
|
|
8
|
+
export interface DedupEntry {
|
|
9
|
+
title: string;
|
|
10
|
+
/** 0-100, decays per session load */
|
|
11
|
+
weight: number;
|
|
12
|
+
/** ISO timestamp of first encounter */
|
|
13
|
+
created_at: string;
|
|
14
|
+
/** ISO timestamp of most recent bump (re-proposal or completion) */
|
|
15
|
+
last_seen_at: string;
|
|
16
|
+
/** How many times this title was encountered (proposed or completed) */
|
|
17
|
+
hit_count: number;
|
|
18
|
+
/** Whether this was actually executed successfully (stronger signal) */
|
|
19
|
+
completed: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface DedupMatch {
|
|
22
|
+
entry: DedupEntry;
|
|
23
|
+
similarity: number;
|
|
24
|
+
}
|
|
25
|
+
export declare const DEDUP_DEFAULTS: {
|
|
26
|
+
readonly DECAY_RATE: 5;
|
|
27
|
+
readonly DEFAULT_WEIGHT: 60;
|
|
28
|
+
readonly COMPLETED_WEIGHT: 80;
|
|
29
|
+
readonly MAX_WEIGHT: 100;
|
|
30
|
+
readonly BUMP_AMOUNT: 15;
|
|
31
|
+
readonly RECENT_WINDOW_MS: number;
|
|
32
|
+
readonly DEFAULT_BUDGET: 1500;
|
|
33
|
+
readonly SIMILARITY_THRESHOLD: 0.6;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Normalize a title for comparison (lowercase, remove punctuation, collapse whitespace).
|
|
37
|
+
*/
|
|
38
|
+
export declare function normalizeTitle(title: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate word overlap similarity between two titles (Jaccard on words, 0-1).
|
|
41
|
+
* Filters out short words (≤2 chars) to focus on meaningful terms.
|
|
42
|
+
*/
|
|
43
|
+
export declare function titleSimilarity(a: string, b: string): number;
|
|
44
|
+
/**
|
|
45
|
+
* Bigram-based title similarity (Jaccard on character bigrams, 0-1).
|
|
46
|
+
* More resilient to word reordering and minor phrasing differences.
|
|
47
|
+
*/
|
|
48
|
+
export declare function bigramSimilarity(a: string, b: string): number;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a title is a duplicate of any existing title.
|
|
51
|
+
*/
|
|
52
|
+
export declare function isDuplicate(title: string, existing: string[], threshold?: number): {
|
|
53
|
+
isDuplicate: boolean;
|
|
54
|
+
reason?: string;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Apply temporal decay to dedup entries. Returns surviving entries (weight > 0).
|
|
58
|
+
*/
|
|
59
|
+
export declare function applyDecay(entries: DedupEntry[], decayRate?: number, now?: number): DedupEntry[];
|
|
60
|
+
/**
|
|
61
|
+
* Match a title against dedup memory entries.
|
|
62
|
+
* Returns the best match above threshold, or null.
|
|
63
|
+
*/
|
|
64
|
+
export declare function matchAgainstMemory(title: string, memory: DedupEntry[], threshold?: number): DedupMatch | null;
|
|
65
|
+
/**
|
|
66
|
+
* Record a title as "seen" in a dedup entry list.
|
|
67
|
+
* Returns the updated entries array (mutates in place for efficiency).
|
|
68
|
+
*/
|
|
69
|
+
export declare function recordEntry(entries: DedupEntry[], title: string, completed: boolean, now?: string): DedupEntry[];
|
|
70
|
+
/**
|
|
71
|
+
* Batch-record multiple titles.
|
|
72
|
+
*/
|
|
73
|
+
export declare function recordEntries(entries: DedupEntry[], titles: {
|
|
74
|
+
title: string;
|
|
75
|
+
completed: boolean;
|
|
76
|
+
}[], now?: string): DedupEntry[];
|
|
77
|
+
/**
|
|
78
|
+
* Format dedup memory for prompt injection.
|
|
79
|
+
* Highest-weight entries first, respects char budget.
|
|
80
|
+
*/
|
|
81
|
+
export declare function formatDedupForPrompt(entries: DedupEntry[], budget?: number): string;
|
|
82
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/dedup/shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,eAAO,MAAM,cAAc;;;;;;;;;CASjB,CAAC;AAMX;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc7D;AAeD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,GAAE,MAA4C,GACtD;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB3C;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,GAAE,MAAkC,EAC7C,GAAG,GAAE,MAAmB,GACvB,UAAU,EAAE,CAyBd;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAAE,EACpB,SAAS,GAAE,MAA4C,GACtD,UAAU,GAAG,IAAI,CAoBnB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,EAAE,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,EAClB,GAAG,GAAE,MAAiC,GACrC,UAAU,EAAE,CAqBd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,EAC/C,GAAG,GAAE,MAAiC,GACrC,UAAU,EAAE,CAKd;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,GAAE,MAAsC,GAC7C,MAAM,CAqBR"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure dedup algorithms — no filesystem, no database.
|
|
3
|
+
*
|
|
4
|
+
* Shared by both @promptwheel/cli and @promptwheel/mcp.
|
|
5
|
+
* CLI keeps its proposal-level wrapper (isDuplicateProposal).
|
|
6
|
+
* MCP keeps its file I/O (dedup-memory.json persistence).
|
|
7
|
+
*/
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Constants
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export const DEDUP_DEFAULTS = {
|
|
12
|
+
DECAY_RATE: 5,
|
|
13
|
+
DEFAULT_WEIGHT: 60,
|
|
14
|
+
COMPLETED_WEIGHT: 80,
|
|
15
|
+
MAX_WEIGHT: 100,
|
|
16
|
+
BUMP_AMOUNT: 15,
|
|
17
|
+
RECENT_WINDOW_MS: 3 * 24 * 60 * 60 * 1000, // 3 days
|
|
18
|
+
DEFAULT_BUDGET: 1500,
|
|
19
|
+
SIMILARITY_THRESHOLD: 0.6,
|
|
20
|
+
};
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Title normalization and similarity
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Normalize a title for comparison (lowercase, remove punctuation, collapse whitespace).
|
|
26
|
+
*/
|
|
27
|
+
export function normalizeTitle(title) {
|
|
28
|
+
return title
|
|
29
|
+
.toLowerCase()
|
|
30
|
+
.replace(/[^\w\s]/g, ' ')
|
|
31
|
+
.replace(/\s+/g, ' ')
|
|
32
|
+
.trim();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate word overlap similarity between two titles (Jaccard on words, 0-1).
|
|
36
|
+
* Filters out short words (≤2 chars) to focus on meaningful terms.
|
|
37
|
+
*/
|
|
38
|
+
export function titleSimilarity(a, b) {
|
|
39
|
+
const wordsA = new Set(normalizeTitle(a).split(' ').filter(w => w.length > 2));
|
|
40
|
+
const wordsB = new Set(normalizeTitle(b).split(' ').filter(w => w.length > 2));
|
|
41
|
+
if (wordsA.size === 0 || wordsB.size === 0)
|
|
42
|
+
return 0;
|
|
43
|
+
let overlap = 0;
|
|
44
|
+
for (const word of wordsA) {
|
|
45
|
+
if (wordsB.has(word))
|
|
46
|
+
overlap++;
|
|
47
|
+
}
|
|
48
|
+
const union = new Set([...wordsA, ...wordsB]).size;
|
|
49
|
+
return overlap / union;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Bigram-based title similarity (Jaccard on character bigrams, 0-1).
|
|
53
|
+
* More resilient to word reordering and minor phrasing differences.
|
|
54
|
+
*/
|
|
55
|
+
export function bigramSimilarity(a, b) {
|
|
56
|
+
const bigramsA = bigrams(a.toLowerCase());
|
|
57
|
+
const bigramsB = bigrams(b.toLowerCase());
|
|
58
|
+
if (bigramsA.size === 0 && bigramsB.size === 0)
|
|
59
|
+
return 1;
|
|
60
|
+
if (bigramsA.size === 0 || bigramsB.size === 0)
|
|
61
|
+
return 0;
|
|
62
|
+
let intersection = 0;
|
|
63
|
+
for (const bg of bigramsA) {
|
|
64
|
+
if (bigramsB.has(bg))
|
|
65
|
+
intersection++;
|
|
66
|
+
}
|
|
67
|
+
const union = bigramsA.size + bigramsB.size - intersection;
|
|
68
|
+
return union === 0 ? 0 : intersection / union;
|
|
69
|
+
}
|
|
70
|
+
function bigrams(s) {
|
|
71
|
+
const result = new Set();
|
|
72
|
+
const cleaned = s.replace(/[^a-z0-9 ]/g, '').trim();
|
|
73
|
+
for (let i = 0; i < cleaned.length - 1; i++) {
|
|
74
|
+
result.add(cleaned.slice(i, i + 2));
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Duplicate detection (pure — no I/O)
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Check if a title is a duplicate of any existing title.
|
|
83
|
+
*/
|
|
84
|
+
export function isDuplicate(title, existing, threshold = DEDUP_DEFAULTS.SIMILARITY_THRESHOLD) {
|
|
85
|
+
const normalizedProposal = normalizeTitle(title);
|
|
86
|
+
// Exact match
|
|
87
|
+
for (const ex of existing) {
|
|
88
|
+
if (normalizeTitle(ex) === normalizedProposal) {
|
|
89
|
+
return { isDuplicate: true, reason: `Exact match: "${ex}"` };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Similarity match
|
|
93
|
+
for (const ex of existing) {
|
|
94
|
+
const sim = titleSimilarity(title, ex);
|
|
95
|
+
if (sim >= threshold) {
|
|
96
|
+
return { isDuplicate: true, reason: `Similar (${Math.round(sim * 100)}%): "${ex}"` };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { isDuplicate: false };
|
|
100
|
+
}
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
// Decay (pure — operates on in-memory arrays)
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
/**
|
|
105
|
+
* Apply temporal decay to dedup entries. Returns surviving entries (weight > 0).
|
|
106
|
+
*/
|
|
107
|
+
export function applyDecay(entries, decayRate = DEDUP_DEFAULTS.DECAY_RATE, now = Date.now()) {
|
|
108
|
+
const surviving = [];
|
|
109
|
+
for (const e of entries) {
|
|
110
|
+
let decay = decayRate;
|
|
111
|
+
// Re-confirmation bonus: halve decay if seen recently
|
|
112
|
+
const lastSeen = new Date(e.last_seen_at).getTime();
|
|
113
|
+
if (now - lastSeen < DEDUP_DEFAULTS.RECENT_WINDOW_MS) {
|
|
114
|
+
decay /= 2;
|
|
115
|
+
}
|
|
116
|
+
// Completed work decays slower (stronger signal)
|
|
117
|
+
if (e.completed) {
|
|
118
|
+
decay /= 2;
|
|
119
|
+
}
|
|
120
|
+
e.weight = Math.min(DEDUP_DEFAULTS.MAX_WEIGHT, e.weight - decay);
|
|
121
|
+
if (e.weight > 0) {
|
|
122
|
+
surviving.push(e);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return surviving;
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Memory matching (pure)
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/**
|
|
131
|
+
* Match a title against dedup memory entries.
|
|
132
|
+
* Returns the best match above threshold, or null.
|
|
133
|
+
*/
|
|
134
|
+
export function matchAgainstMemory(title, memory, threshold = DEDUP_DEFAULTS.SIMILARITY_THRESHOLD) {
|
|
135
|
+
const normalized = normalizeTitle(title);
|
|
136
|
+
let bestMatch = null;
|
|
137
|
+
for (const entry of memory) {
|
|
138
|
+
// Exact match
|
|
139
|
+
if (normalizeTitle(entry.title) === normalized) {
|
|
140
|
+
return { entry, similarity: 1.0 };
|
|
141
|
+
}
|
|
142
|
+
const sim = Math.max(titleSimilarity(title, entry.title), bigramSimilarity(title, entry.title));
|
|
143
|
+
if (sim >= threshold && (!bestMatch || sim > bestMatch.similarity)) {
|
|
144
|
+
bestMatch = { entry, similarity: sim };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return bestMatch;
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// Entry management (pure — returns new state, caller persists)
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
/**
|
|
153
|
+
* Record a title as "seen" in a dedup entry list.
|
|
154
|
+
* Returns the updated entries array (mutates in place for efficiency).
|
|
155
|
+
*/
|
|
156
|
+
export function recordEntry(entries, title, completed, now = new Date().toISOString()) {
|
|
157
|
+
const normalized = title.toLowerCase().trim();
|
|
158
|
+
const existing = entries.find(e => e.title.toLowerCase().trim() === normalized);
|
|
159
|
+
if (existing) {
|
|
160
|
+
existing.weight = Math.min(DEDUP_DEFAULTS.MAX_WEIGHT, existing.weight + DEDUP_DEFAULTS.BUMP_AMOUNT);
|
|
161
|
+
existing.last_seen_at = now;
|
|
162
|
+
existing.hit_count++;
|
|
163
|
+
if (completed)
|
|
164
|
+
existing.completed = true;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
entries.push({
|
|
168
|
+
title,
|
|
169
|
+
weight: completed ? DEDUP_DEFAULTS.COMPLETED_WEIGHT : DEDUP_DEFAULTS.DEFAULT_WEIGHT,
|
|
170
|
+
created_at: now,
|
|
171
|
+
last_seen_at: now,
|
|
172
|
+
hit_count: 1,
|
|
173
|
+
completed,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return entries;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Batch-record multiple titles.
|
|
180
|
+
*/
|
|
181
|
+
export function recordEntries(entries, titles, now = new Date().toISOString()) {
|
|
182
|
+
for (const { title, completed } of titles) {
|
|
183
|
+
recordEntry(entries, title, completed, now);
|
|
184
|
+
}
|
|
185
|
+
return entries;
|
|
186
|
+
}
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// Prompt formatting (pure)
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
/**
|
|
191
|
+
* Format dedup memory for prompt injection.
|
|
192
|
+
* Highest-weight entries first, respects char budget.
|
|
193
|
+
*/
|
|
194
|
+
export function formatDedupForPrompt(entries, budget = DEDUP_DEFAULTS.DEFAULT_BUDGET) {
|
|
195
|
+
if (entries.length === 0)
|
|
196
|
+
return '';
|
|
197
|
+
const sorted = [...entries].sort((a, b) => b.weight - a.weight);
|
|
198
|
+
const lines = [];
|
|
199
|
+
let charCount = 0;
|
|
200
|
+
const header = '<already-completed>\n## Already Completed — Do NOT Propose These\n\nThe following improvements have already been done or attempted. Do NOT propose similar changes:\n';
|
|
201
|
+
const footer = '\n</already-completed>';
|
|
202
|
+
charCount += header.length + footer.length;
|
|
203
|
+
for (const e of sorted) {
|
|
204
|
+
const status = e.completed ? '✓ done' : 'attempted';
|
|
205
|
+
const line = `- ${e.title} (${status}, seen ${e.hit_count}x)`;
|
|
206
|
+
if (charCount + line.length + 1 > budget)
|
|
207
|
+
break;
|
|
208
|
+
lines.push(line);
|
|
209
|
+
charCount += line.length + 1;
|
|
210
|
+
}
|
|
211
|
+
if (lines.length === 0)
|
|
212
|
+
return '';
|
|
213
|
+
return header + lines.join('\n') + footer;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/dedup/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|