@specferret/core 0.2.0 → 0.3.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 (85) hide show
  1. package/dist/config.d.ts +3 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js.map +1 -1
  4. package/dist/contract.d.ts +16 -0
  5. package/dist/contract.d.ts.map +1 -0
  6. package/dist/contract.js +17 -0
  7. package/dist/contract.js.map +1 -0
  8. package/dist/extractor/__fixtures__/cross-file-id.fixture.d.ts +15 -0
  9. package/dist/extractor/__fixtures__/cross-file-id.fixture.d.ts.map +1 -0
  10. package/dist/extractor/__fixtures__/cross-file-id.fixture.js +9 -0
  11. package/dist/extractor/__fixtures__/cross-file-id.fixture.js.map +1 -0
  12. package/dist/extractor/__fixtures__/cross-file-unresolved.fixture.d.ts +14 -0
  13. package/dist/extractor/__fixtures__/cross-file-unresolved.fixture.d.ts.map +1 -0
  14. package/dist/extractor/__fixtures__/cross-file-unresolved.fixture.js +9 -0
  15. package/dist/extractor/__fixtures__/cross-file-unresolved.fixture.js.map +1 -0
  16. package/dist/extractor/__fixtures__/empty.fixture.d.ts +6 -0
  17. package/dist/extractor/__fixtures__/empty.fixture.d.ts.map +1 -0
  18. package/dist/extractor/__fixtures__/empty.fixture.js +5 -0
  19. package/dist/extractor/__fixtures__/empty.fixture.js.map +1 -0
  20. package/dist/extractor/__fixtures__/external-no-id.fixture.d.ts +8 -0
  21. package/dist/extractor/__fixtures__/external-no-id.fixture.d.ts.map +1 -0
  22. package/dist/extractor/__fixtures__/external-no-id.fixture.js +7 -0
  23. package/dist/extractor/__fixtures__/external-no-id.fixture.js.map +1 -0
  24. package/dist/extractor/__fixtures__/external-with-id.fixture.d.ts +9 -0
  25. package/dist/extractor/__fixtures__/external-with-id.fixture.d.ts.map +1 -0
  26. package/dist/extractor/__fixtures__/external-with-id.fixture.js +8 -0
  27. package/dist/extractor/__fixtures__/external-with-id.fixture.js.map +1 -0
  28. package/dist/extractor/__fixtures__/mixed.fixture.d.ts +24 -0
  29. package/dist/extractor/__fixtures__/mixed.fixture.d.ts.map +1 -0
  30. package/dist/extractor/__fixtures__/mixed.fixture.js +15 -0
  31. package/dist/extractor/__fixtures__/mixed.fixture.js.map +1 -0
  32. package/dist/extractor/__fixtures__/one-contract.fixture.d.ts +10 -0
  33. package/dist/extractor/__fixtures__/one-contract.fixture.d.ts.map +1 -0
  34. package/dist/extractor/__fixtures__/one-contract.fixture.js +10 -0
  35. package/dist/extractor/__fixtures__/one-contract.fixture.js.map +1 -0
  36. package/dist/extractor/__fixtures__/optional-fields.fixture.d.ts +10 -0
  37. package/dist/extractor/__fixtures__/optional-fields.fixture.d.ts.map +1 -0
  38. package/dist/extractor/__fixtures__/optional-fields.fixture.js +10 -0
  39. package/dist/extractor/__fixtures__/optional-fields.fixture.js.map +1 -0
  40. package/dist/extractor/__fixtures__/same-file-consumes.fixture.d.ts +20 -0
  41. package/dist/extractor/__fixtures__/same-file-consumes.fixture.d.ts.map +1 -0
  42. package/dist/extractor/__fixtures__/same-file-consumes.fixture.js +11 -0
  43. package/dist/extractor/__fixtures__/same-file-consumes.fixture.js.map +1 -0
  44. package/dist/extractor/__fixtures__/three-unresolved.fixture.d.ts +38 -0
  45. package/dist/extractor/__fixtures__/three-unresolved.fixture.d.ts.map +1 -0
  46. package/dist/extractor/__fixtures__/three-unresolved.fixture.js +21 -0
  47. package/dist/extractor/__fixtures__/three-unresolved.fixture.js.map +1 -0
  48. package/dist/extractor/__fixtures__/throws-on-import.fixture.d.ts +2 -0
  49. package/dist/extractor/__fixtures__/throws-on-import.fixture.d.ts.map +1 -0
  50. package/dist/extractor/__fixtures__/throws-on-import.fixture.js +5 -0
  51. package/dist/extractor/__fixtures__/throws-on-import.fixture.js.map +1 -0
  52. package/dist/extractor/frontmatter.d.ts +1 -1
  53. package/dist/extractor/frontmatter.d.ts.map +1 -1
  54. package/dist/extractor/typescript-contract.d.ts +3 -0
  55. package/dist/extractor/typescript-contract.d.ts.map +1 -0
  56. package/dist/extractor/typescript-contract.js +67 -0
  57. package/dist/extractor/typescript-contract.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +3 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/status/index.d.ts +20 -0
  63. package/dist/status/index.d.ts.map +1 -0
  64. package/dist/status/index.js +46 -0
  65. package/dist/status/index.js.map +1 -0
  66. package/package.json +3 -2
  67. package/src/config.ts +3 -0
  68. package/src/contract.test.ts +99 -0
  69. package/src/contract.ts +38 -0
  70. package/src/extractor/__fixtures__/cross-file-id.fixture.ts +9 -0
  71. package/src/extractor/__fixtures__/cross-file-unresolved.fixture.ts +9 -0
  72. package/src/extractor/__fixtures__/empty.fixture.ts +4 -0
  73. package/src/extractor/__fixtures__/external-no-id.fixture.ts +7 -0
  74. package/src/extractor/__fixtures__/external-with-id.fixture.ts +8 -0
  75. package/src/extractor/__fixtures__/mixed.fixture.ts +17 -0
  76. package/src/extractor/__fixtures__/one-contract.fixture.ts +10 -0
  77. package/src/extractor/__fixtures__/optional-fields.fixture.ts +10 -0
  78. package/src/extractor/__fixtures__/same-file-consumes.fixture.ts +12 -0
  79. package/src/extractor/__fixtures__/three-unresolved.fixture.ts +24 -0
  80. package/src/extractor/__fixtures__/throws-on-import.fixture.ts +3 -0
  81. package/src/extractor/frontmatter.ts +1 -1
  82. package/src/extractor/typescript-contract.test.ts +143 -0
  83. package/src/extractor/typescript-contract.ts +76 -0
  84. package/src/index.ts +3 -0
  85. package/src/status/index.ts +68 -0
@@ -0,0 +1,68 @@
1
+ import type { DBStore, ContractStatus } from '../store/types.js';
2
+
3
+ export type StatusContractEntry = {
4
+ id: string;
5
+ status: ContractStatus;
6
+ driftClass: 'breaking' | 'stable' | 'roadmap';
7
+ dependentCount: number;
8
+ dependents: string[];
9
+ };
10
+
11
+ export type StatusReport = {
12
+ version: '2.0';
13
+ timestamp: string;
14
+ total: number;
15
+ stable: number;
16
+ roadmap: number;
17
+ needsReview: number;
18
+ contracts: StatusContractEntry[];
19
+ };
20
+
21
+ export async function buildStatusReport(store: DBStore): Promise<StatusReport> {
22
+ const [contracts, nodes, deps] = await Promise.all([store.getContracts(), store.getNodes(), store.getDependencies()]);
23
+
24
+ const nodeById = new Map(nodes.map((n) => [n.id, n]));
25
+ const dependentsByContractId = new Map<string, string[]>();
26
+
27
+ for (const dep of deps) {
28
+ const node = nodeById.get(dep.source_node_id);
29
+ if (!node) continue;
30
+ const list = dependentsByContractId.get(dep.target_contract_id) ?? [];
31
+ if (!list.includes(node.file_path)) list.push(node.file_path);
32
+ dependentsByContractId.set(dep.target_contract_id, list);
33
+ }
34
+
35
+ const entries: StatusContractEntry[] = contracts.map((c) => {
36
+ const dependents = dependentsByContractId.get(c.id) ?? [];
37
+ return {
38
+ id: c.id,
39
+ status: c.status,
40
+ driftClass: c.status === 'needs-review' ? 'breaking' : c.status === 'roadmap' ? 'roadmap' : 'stable',
41
+ dependentCount: dependents.length,
42
+ dependents,
43
+ };
44
+ });
45
+
46
+ return {
47
+ version: '2.0',
48
+ timestamp: new Date().toISOString(),
49
+ total: contracts.length,
50
+ stable: contracts.filter((c) => c.status === 'stable').length,
51
+ roadmap: contracts.filter((c) => c.status === 'roadmap').length,
52
+ needsReview: contracts.filter((c) => c.status === 'needs-review').length,
53
+ contracts: entries,
54
+ };
55
+ }
56
+
57
+ export function buildStatusMarkdown(report: StatusReport): string {
58
+ const lines = [
59
+ '# Contract Status',
60
+ '',
61
+ `Generated: ${report.timestamp}`,
62
+ '',
63
+ '| Contract | Status | Drift Class | Dependents |',
64
+ '| --- | --- | --- | --- |',
65
+ ...report.contracts.map((c) => `| ${c.id} | ${c.status} | ${c.driftClass} | ${c.dependentCount} |`),
66
+ ];
67
+ return lines.join('\n') + '\n';
68
+ }