@specferret/core 0.4.2 → 0.5.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/README.md +1 -1
- package/dist/audit/index.d.ts +1 -1
- package/dist/audit/index.js +1 -1
- package/dist/context/index.d.ts +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +24 -2
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +4 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js.map +1 -1
- package/dist/extractor/__fixtures__/active-status.fixture.d.ts +10 -0
- package/dist/extractor/__fixtures__/active-status.fixture.d.ts.map +1 -0
- package/dist/extractor/__fixtures__/active-status.fixture.js +10 -0
- package/dist/extractor/__fixtures__/active-status.fixture.js.map +1 -0
- package/dist/extractor/__fixtures__/no-status.fixture.d.ts +9 -0
- package/dist/extractor/__fixtures__/no-status.fixture.d.ts.map +1 -0
- package/dist/extractor/__fixtures__/no-status.fixture.js +9 -0
- package/dist/extractor/__fixtures__/no-status.fixture.js.map +1 -0
- package/dist/extractor/__fixtures__/same-file-dotted-id-consumes.fixture.d.ts +23 -0
- package/dist/extractor/__fixtures__/same-file-dotted-id-consumes.fixture.d.ts.map +1 -0
- package/dist/extractor/__fixtures__/same-file-dotted-id-consumes.fixture.js +14 -0
- package/dist/extractor/__fixtures__/same-file-dotted-id-consumes.fixture.js.map +1 -0
- package/dist/extractor/__fixtures__/source-field.fixture.d.ts +9 -0
- package/dist/extractor/__fixtures__/source-field.fixture.d.ts.map +1 -0
- package/dist/extractor/__fixtures__/source-field.fixture.js +11 -0
- package/dist/extractor/__fixtures__/source-field.fixture.js.map +1 -0
- package/dist/extractor/frontmatter.d.ts +7 -0
- package/dist/extractor/frontmatter.d.ts.map +1 -1
- package/dist/extractor/frontmatter.js +10 -0
- package/dist/extractor/frontmatter.js.map +1 -1
- package/dist/extractor/typescript-contract.d.ts.map +1 -1
- package/dist/extractor/typescript-contract.js +6 -4
- package/dist/extractor/typescript-contract.js.map +1 -1
- package/dist/reconciler/index.js +5 -5
- package/dist/reconciler/index.js.map +1 -1
- package/dist/status/index.d.ts +2 -2
- package/dist/status/index.js +2 -2
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +11 -2
- package/dist/store/sqlite.js.map +1 -1
- package/dist/store/types.d.ts +2 -2
- package/package.json +1 -1
- package/src/audit/index.test.ts +129 -0
- package/src/audit/index.ts +2 -2
- package/src/context/index.test.ts +34 -5
- package/src/context/index.ts +27 -2
- package/src/contract.ts +3 -6
- package/src/extractor/__fixtures__/active-status.fixture.ts +10 -0
- package/src/extractor/__fixtures__/no-status.fixture.ts +9 -0
- package/src/extractor/__fixtures__/same-file-dotted-id-consumes.fixture.ts +15 -0
- package/src/extractor/__fixtures__/source-field.fixture.ts +11 -0
- package/src/extractor/frontmatter.test.ts +71 -0
- package/src/extractor/frontmatter.ts +14 -0
- package/src/extractor/typescript-contract.test.ts +40 -7
- package/src/extractor/typescript-contract.ts +6 -4
- package/src/reconciler/index.ts +5 -5
- package/src/status/index.ts +4 -4
- package/src/store/sqlite.test.ts +45 -0
- package/src/store/sqlite.ts +10 -2
- package/src/store/types.ts +2 -2
package/src/store/sqlite.test.ts
CHANGED
|
@@ -326,3 +326,48 @@ describe('SqliteStore — S50: code_source_file and code_source_symbol', () => {
|
|
|
326
326
|
await store.close();
|
|
327
327
|
});
|
|
328
328
|
});
|
|
329
|
+
|
|
330
|
+
describe('SqliteStore — S62: roadmap → pending migration', () => {
|
|
331
|
+
it('init() migrates legacy roadmap contracts to pending via UPDATE', async () => {
|
|
332
|
+
const store = makeStore();
|
|
333
|
+
await store.init();
|
|
334
|
+
|
|
335
|
+
const node = makeNode({ status: 'stable' });
|
|
336
|
+
await store.upsertNode(node);
|
|
337
|
+
|
|
338
|
+
// Directly insert a contract with status 'roadmap' to simulate legacy data
|
|
339
|
+
const db = (store as any).db;
|
|
340
|
+
db.prepare(
|
|
341
|
+
`INSERT INTO ferret_contracts (id, node_id, shape_hash, shape_schema, type, status)
|
|
342
|
+
VALUES (?, ?, ?, ?, ?, 'roadmap')`,
|
|
343
|
+
).run('api.roadmap-contract', node.id, 'abc', '{}', 'api');
|
|
344
|
+
|
|
345
|
+
// Run the migration UPDATE directly (same as init() does)
|
|
346
|
+
db.exec(`UPDATE ferret_contracts SET status = 'pending' WHERE status = 'roadmap';`);
|
|
347
|
+
|
|
348
|
+
const row = db.prepare('SELECT status FROM ferret_contracts WHERE id = ?').get('api.roadmap-contract') as any;
|
|
349
|
+
assert.equal(row?.status, 'pending');
|
|
350
|
+
|
|
351
|
+
await store.close();
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('init() migrates legacy roadmap nodes to pending via UPDATE', async () => {
|
|
355
|
+
const store = makeStore();
|
|
356
|
+
await store.init();
|
|
357
|
+
|
|
358
|
+
// Directly insert a node with status 'roadmap'
|
|
359
|
+
const db = (store as any).db;
|
|
360
|
+
db.prepare(
|
|
361
|
+
`INSERT INTO ferret_nodes (id, file_path, hash, status)
|
|
362
|
+
VALUES (?, ?, ?, 'roadmap')`,
|
|
363
|
+
).run('node-roadmap', 'contracts/roadmap.contract.md', 'abc');
|
|
364
|
+
|
|
365
|
+
// Run migration UPDATE directly (same as init() does)
|
|
366
|
+
db.exec(`UPDATE ferret_nodes SET status = 'pending' WHERE status = 'roadmap';`);
|
|
367
|
+
|
|
368
|
+
const row = db.prepare('SELECT status FROM ferret_nodes WHERE id = ?').get('node-roadmap') as any;
|
|
369
|
+
assert.equal(row?.status, 'pending');
|
|
370
|
+
|
|
371
|
+
await store.close();
|
|
372
|
+
});
|
|
373
|
+
});
|
package/src/store/sqlite.ts
CHANGED
|
@@ -83,11 +83,19 @@ export class SqliteStore implements DBStore {
|
|
|
83
83
|
|
|
84
84
|
try {
|
|
85
85
|
this.db.exec(`ALTER TABLE ferret_contracts ADD COLUMN code_source_file TEXT;`);
|
|
86
|
-
} catch {
|
|
86
|
+
} catch (e: unknown) {
|
|
87
|
+
if (!(e instanceof Error && e.message.includes('duplicate column'))) throw e;
|
|
88
|
+
}
|
|
87
89
|
|
|
88
90
|
try {
|
|
89
91
|
this.db.exec(`ALTER TABLE ferret_contracts ADD COLUMN code_source_symbol TEXT;`);
|
|
90
|
-
} catch {
|
|
92
|
+
} catch (e: unknown) {
|
|
93
|
+
if (!(e instanceof Error && e.message.includes('duplicate column'))) throw e;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// S62 migration: rename legacy 'roadmap' status to 'pending'
|
|
97
|
+
this.db.exec(`UPDATE ferret_contracts SET status = 'pending' WHERE status = 'roadmap';`);
|
|
98
|
+
this.db.exec(`UPDATE ferret_nodes SET status = 'pending' WHERE status = 'roadmap';`);
|
|
91
99
|
}
|
|
92
100
|
|
|
93
101
|
async close(): Promise<void> {
|
package/src/store/types.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type NodeStatus = 'stable' | 'needs-review' | '
|
|
2
|
-
export type ContractStatus = 'stable' | '
|
|
1
|
+
export type NodeStatus = 'stable' | 'needs-review' | 'pending' | 'blocked';
|
|
2
|
+
export type ContractStatus = 'stable' | 'pending' | 'needs-review';
|
|
3
3
|
|
|
4
4
|
export interface FerretNode {
|
|
5
5
|
id: string;
|