@nahisaho/musubix-formal-verify 1.7.5

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 (78) hide show
  1. package/README.md +62 -0
  2. package/dist/converters/EarsToSmtConverter.d.ts +102 -0
  3. package/dist/converters/EarsToSmtConverter.d.ts.map +1 -0
  4. package/dist/converters/EarsToSmtConverter.js +368 -0
  5. package/dist/converters/EarsToSmtConverter.js.map +1 -0
  6. package/dist/converters/index.d.ts +6 -0
  7. package/dist/converters/index.d.ts.map +1 -0
  8. package/dist/converters/index.js +5 -0
  9. package/dist/converters/index.js.map +1 -0
  10. package/dist/converters/types.d.ts +103 -0
  11. package/dist/converters/types.d.ts.map +1 -0
  12. package/dist/converters/types.js +7 -0
  13. package/dist/converters/types.js.map +1 -0
  14. package/dist/index.d.ts +22 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +23 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/tools/formal-verify-tools.d.ts +60 -0
  19. package/dist/tools/formal-verify-tools.d.ts.map +1 -0
  20. package/dist/tools/formal-verify-tools.js +371 -0
  21. package/dist/tools/formal-verify-tools.js.map +1 -0
  22. package/dist/tools/index.d.ts +5 -0
  23. package/dist/tools/index.d.ts.map +1 -0
  24. package/dist/tools/index.js +5 -0
  25. package/dist/tools/index.js.map +1 -0
  26. package/dist/traceability/ImpactAnalyzer.d.ts +103 -0
  27. package/dist/traceability/ImpactAnalyzer.d.ts.map +1 -0
  28. package/dist/traceability/ImpactAnalyzer.js +281 -0
  29. package/dist/traceability/ImpactAnalyzer.js.map +1 -0
  30. package/dist/traceability/TraceabilityDB.d.ts +123 -0
  31. package/dist/traceability/TraceabilityDB.d.ts.map +1 -0
  32. package/dist/traceability/TraceabilityDB.js +379 -0
  33. package/dist/traceability/TraceabilityDB.js.map +1 -0
  34. package/dist/traceability/index.d.ts +8 -0
  35. package/dist/traceability/index.d.ts.map +1 -0
  36. package/dist/traceability/index.js +6 -0
  37. package/dist/traceability/index.js.map +1 -0
  38. package/dist/traceability/types.d.ts +156 -0
  39. package/dist/traceability/types.d.ts.map +1 -0
  40. package/dist/traceability/types.js +7 -0
  41. package/dist/traceability/types.js.map +1 -0
  42. package/dist/verifiers/PostconditionVerifier.d.ts +105 -0
  43. package/dist/verifiers/PostconditionVerifier.d.ts.map +1 -0
  44. package/dist/verifiers/PostconditionVerifier.js +326 -0
  45. package/dist/verifiers/PostconditionVerifier.js.map +1 -0
  46. package/dist/verifiers/PreconditionVerifier.d.ts +87 -0
  47. package/dist/verifiers/PreconditionVerifier.d.ts.map +1 -0
  48. package/dist/verifiers/PreconditionVerifier.js +286 -0
  49. package/dist/verifiers/PreconditionVerifier.js.map +1 -0
  50. package/dist/verifiers/index.d.ts +7 -0
  51. package/dist/verifiers/index.d.ts.map +1 -0
  52. package/dist/verifiers/index.js +6 -0
  53. package/dist/verifiers/index.js.map +1 -0
  54. package/dist/verifiers/types.d.ts +109 -0
  55. package/dist/verifiers/types.d.ts.map +1 -0
  56. package/dist/verifiers/types.js +7 -0
  57. package/dist/verifiers/types.js.map +1 -0
  58. package/dist/z3/Z3Adapter.d.ts +92 -0
  59. package/dist/z3/Z3Adapter.d.ts.map +1 -0
  60. package/dist/z3/Z3Adapter.js +189 -0
  61. package/dist/z3/Z3Adapter.js.map +1 -0
  62. package/dist/z3/Z3ProcessFallback.d.ts +67 -0
  63. package/dist/z3/Z3ProcessFallback.d.ts.map +1 -0
  64. package/dist/z3/Z3ProcessFallback.js +287 -0
  65. package/dist/z3/Z3ProcessFallback.js.map +1 -0
  66. package/dist/z3/Z3WasmClient.d.ts +55 -0
  67. package/dist/z3/Z3WasmClient.d.ts.map +1 -0
  68. package/dist/z3/Z3WasmClient.js +172 -0
  69. package/dist/z3/Z3WasmClient.js.map +1 -0
  70. package/dist/z3/index.d.ts +9 -0
  71. package/dist/z3/index.d.ts.map +1 -0
  72. package/dist/z3/index.js +7 -0
  73. package/dist/z3/index.js.map +1 -0
  74. package/dist/z3/types.d.ts +82 -0
  75. package/dist/z3/types.d.ts.map +1 -0
  76. package/dist/z3/types.js +7 -0
  77. package/dist/z3/types.js.map +1 -0
  78. package/package.json +79 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Impact Analyzer
3
+ *
4
+ * 変更の影響範囲を分析するクラス
5
+ */
6
+ /**
7
+ * 影響分析器
8
+ *
9
+ * トレーサビリティDBを使用して、特定のノードが変更された場合の
10
+ * 影響範囲を分析します。
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const db = new TraceabilityDB('./trace.db');
15
+ * const analyzer = new ImpactAnalyzer(db);
16
+ *
17
+ * // REQ-001が変更された場合の影響分析
18
+ * const impact = await analyzer.analyze('REQ-001');
19
+ *
20
+ * console.log(`影響を受けるノード: ${impact.totalImpacted}件`);
21
+ * for (const node of impact.impactedNodes) {
22
+ * console.log(`- ${node.id}: 影響度 ${node.impactScore}`);
23
+ * }
24
+ * ```
25
+ */
26
+ export class ImpactAnalyzer {
27
+ db;
28
+ constructor(db) {
29
+ this.db = db;
30
+ }
31
+ /**
32
+ * 影響分析を実行
33
+ *
34
+ * @param sourceId - 変更の起点となるノードID
35
+ * @param options - 分析オプション
36
+ * @returns 影響分析結果
37
+ */
38
+ async analyze(sourceId, options = {}) {
39
+ const startTime = Date.now();
40
+ const { maxDepth = 5, linkTypes, nodeTypes, decayRate = 0.7, minImpactScore = 0.1, } = options;
41
+ const impactedNodes = [];
42
+ const visited = new Set();
43
+ // BFSで影響範囲を探索
44
+ const queue = [];
45
+ // 初期ノードの隣接ノードをキューに追加
46
+ const initialLinks = await this.getOutgoingLinks(sourceId, linkTypes);
47
+ for (const link of initialLinks) {
48
+ queue.push({
49
+ id: link.target,
50
+ depth: 1,
51
+ path: [sourceId, link.target],
52
+ linkType: link.type,
53
+ impactScore: 1.0 * decayRate,
54
+ });
55
+ }
56
+ visited.add(sourceId);
57
+ while (queue.length > 0) {
58
+ const current = queue.shift();
59
+ if (visited.has(current.id)) {
60
+ continue;
61
+ }
62
+ if (current.depth > maxDepth) {
63
+ continue;
64
+ }
65
+ if (current.impactScore < minImpactScore) {
66
+ continue;
67
+ }
68
+ visited.add(current.id);
69
+ // ノード情報を取得
70
+ const node = await this.db.getNode(current.id);
71
+ if (!node) {
72
+ continue;
73
+ }
74
+ // ノードタイプフィルタ
75
+ if (nodeTypes && !nodeTypes.includes(node.type)) {
76
+ continue;
77
+ }
78
+ // 影響ノードとして追加
79
+ impactedNodes.push({
80
+ id: node.id,
81
+ type: node.type,
82
+ title: node.title,
83
+ distance: current.depth,
84
+ path: current.path,
85
+ linkType: current.linkType,
86
+ impactScore: current.impactScore,
87
+ });
88
+ // 次の隣接ノードをキューに追加
89
+ const nextLinks = await this.getOutgoingLinks(current.id, linkTypes);
90
+ for (const link of nextLinks) {
91
+ if (!visited.has(link.target)) {
92
+ queue.push({
93
+ id: link.target,
94
+ depth: current.depth + 1,
95
+ path: [...current.path, link.target],
96
+ linkType: link.type,
97
+ impactScore: current.impactScore * decayRate,
98
+ });
99
+ }
100
+ }
101
+ }
102
+ // 影響度でソート
103
+ impactedNodes.sort((a, b) => b.impactScore - a.impactScore);
104
+ return {
105
+ sourceId,
106
+ impactedNodes,
107
+ depth: Math.max(0, ...impactedNodes.map(n => n.distance)),
108
+ totalImpacted: impactedNodes.length,
109
+ duration: Date.now() - startTime,
110
+ };
111
+ }
112
+ /**
113
+ * 逆方向の影響分析(依存元を探す)
114
+ *
115
+ * @param targetId - 調査対象のノードID
116
+ * @param options - 分析オプション
117
+ */
118
+ async analyzeReverse(targetId, options = {}) {
119
+ const startTime = Date.now();
120
+ const { maxDepth = 5, linkTypes, nodeTypes, decayRate = 0.7, minImpactScore = 0.1, } = options;
121
+ const impactedNodes = [];
122
+ const visited = new Set();
123
+ const queue = [];
124
+ // 初期ノードの入力リンクをキューに追加
125
+ const initialLinks = await this.getIncomingLinks(targetId, linkTypes);
126
+ for (const link of initialLinks) {
127
+ queue.push({
128
+ id: link.source,
129
+ depth: 1,
130
+ path: [targetId, link.source],
131
+ linkType: link.type,
132
+ impactScore: 1.0 * decayRate,
133
+ });
134
+ }
135
+ visited.add(targetId);
136
+ while (queue.length > 0) {
137
+ const current = queue.shift();
138
+ if (visited.has(current.id) || current.depth > maxDepth || current.impactScore < minImpactScore) {
139
+ continue;
140
+ }
141
+ visited.add(current.id);
142
+ const node = await this.db.getNode(current.id);
143
+ if (!node)
144
+ continue;
145
+ if (nodeTypes && !nodeTypes.includes(node.type))
146
+ continue;
147
+ impactedNodes.push({
148
+ id: node.id,
149
+ type: node.type,
150
+ title: node.title,
151
+ distance: current.depth,
152
+ path: current.path,
153
+ linkType: current.linkType,
154
+ impactScore: current.impactScore,
155
+ });
156
+ const nextLinks = await this.getIncomingLinks(current.id, linkTypes);
157
+ for (const link of nextLinks) {
158
+ if (!visited.has(link.source)) {
159
+ queue.push({
160
+ id: link.source,
161
+ depth: current.depth + 1,
162
+ path: [...current.path, link.source],
163
+ linkType: link.type,
164
+ impactScore: current.impactScore * decayRate,
165
+ });
166
+ }
167
+ }
168
+ }
169
+ impactedNodes.sort((a, b) => b.impactScore - a.impactScore);
170
+ return {
171
+ sourceId: targetId,
172
+ impactedNodes,
173
+ depth: Math.max(0, ...impactedNodes.map(n => n.distance)),
174
+ totalImpacted: impactedNodes.length,
175
+ duration: Date.now() - startTime,
176
+ };
177
+ }
178
+ /**
179
+ * カバレッジ分析
180
+ *
181
+ * 要件がどの程度テストでカバーされているかを分析
182
+ */
183
+ async analyzeCoverage(requirementType = 'requirement', testType = 'test') {
184
+ const requirements = await this.db.getNodesByType(requirementType);
185
+ const tests = await this.db.getNodesByType(testType);
186
+ const covered = [];
187
+ const uncovered = [];
188
+ for (const req of requirements) {
189
+ const impact = await this.analyze(req.id, {
190
+ maxDepth: 10,
191
+ nodeTypes: [testType],
192
+ });
193
+ if (impact.totalImpacted > 0) {
194
+ covered.push(req.id);
195
+ }
196
+ else {
197
+ uncovered.push(req.id);
198
+ }
199
+ }
200
+ const coveragePercentage = requirements.length > 0
201
+ ? (covered.length / requirements.length) * 100
202
+ : 0;
203
+ return {
204
+ totalRequirements: requirements.length,
205
+ coveredRequirements: covered.length,
206
+ uncoveredRequirements: uncovered.length,
207
+ coveragePercentage,
208
+ covered,
209
+ uncovered,
210
+ totalTests: tests.length,
211
+ };
212
+ }
213
+ /**
214
+ * 循環依存を検出
215
+ */
216
+ async detectCycles() {
217
+ const cycles = [];
218
+ const visited = new Set();
219
+ const recursionStack = new Set();
220
+ const stats = await this.db.getStats();
221
+ const allNodeTypes = Object.keys(stats.nodesByType);
222
+ for (const nodeType of allNodeTypes) {
223
+ const nodes = await this.db.getNodesByType(nodeType);
224
+ for (const node of nodes) {
225
+ if (!visited.has(node.id)) {
226
+ await this.detectCyclesDFS(node.id, visited, recursionStack, [], cycles);
227
+ }
228
+ }
229
+ }
230
+ return cycles;
231
+ }
232
+ /**
233
+ * DFSで循環を検出
234
+ */
235
+ async detectCyclesDFS(nodeId, visited, recursionStack, path, cycles) {
236
+ visited.add(nodeId);
237
+ recursionStack.add(nodeId);
238
+ path.push(nodeId);
239
+ const links = await this.getOutgoingLinks(nodeId);
240
+ for (const link of links) {
241
+ if (!visited.has(link.target)) {
242
+ await this.detectCyclesDFS(link.target, visited, recursionStack, [...path], cycles);
243
+ }
244
+ else if (recursionStack.has(link.target)) {
245
+ // 循環を検出
246
+ const cycleStart = path.indexOf(link.target);
247
+ const cycle = path.slice(cycleStart);
248
+ cycle.push(link.target); // サイクルを閉じる
249
+ cycles.push(cycle);
250
+ }
251
+ }
252
+ recursionStack.delete(nodeId);
253
+ }
254
+ /**
255
+ * 出力リンクを取得
256
+ */
257
+ async getOutgoingLinks(nodeId, linkTypes) {
258
+ const result = await this.db.query(nodeId, {
259
+ direction: 'forward',
260
+ linkTypes,
261
+ maxDepth: 1,
262
+ });
263
+ return result.links
264
+ .filter(link => link.source === nodeId)
265
+ .map(link => ({ target: link.target, type: link.type }));
266
+ }
267
+ /**
268
+ * 入力リンクを取得
269
+ */
270
+ async getIncomingLinks(nodeId, linkTypes) {
271
+ const result = await this.db.query(nodeId, {
272
+ direction: 'backward',
273
+ linkTypes,
274
+ maxDepth: 1,
275
+ });
276
+ return result.links
277
+ .filter(link => link.target === nodeId)
278
+ .map(link => ({ source: link.source, type: link.type }));
279
+ }
280
+ }
281
+ //# sourceMappingURL=ImpactAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImpactAnalyzer.js","sourceRoot":"","sources":["../../src/traceability/ImpactAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Traceability Database
3
+ *
4
+ * SQLiteベースのトレーサビリティデータベース
5
+ */
6
+ import type { TraceNode, TraceNodeInput, TraceLink, TraceNodeType, TraceQueryOptions, TraceQueryResult, TraceDbStats } from './types.js';
7
+ /**
8
+ * トレーサビリティDB
9
+ *
10
+ * 要件↔設計↔コード↔テストのトレーサビリティを管理するSQLiteベースのデータベース。
11
+ * グラフ構造でノード間の関係を追跡し、影響分析やカバレッジ計算を支援します。
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const db = new TraceabilityDB('./trace.db');
16
+ *
17
+ * // ノードを追加
18
+ * await db.addNode({
19
+ * id: 'REQ-001',
20
+ * type: 'requirement',
21
+ * title: 'User Authentication',
22
+ * createdAt: new Date(),
23
+ * updatedAt: new Date(),
24
+ * });
25
+ *
26
+ * // リンクを追加
27
+ * await db.addLink({
28
+ * source: 'REQ-001',
29
+ * target: 'DES-001',
30
+ * type: 'implements',
31
+ * });
32
+ *
33
+ * // クエリ
34
+ * const related = await db.query('REQ-001', { direction: 'forward' });
35
+ * ```
36
+ */
37
+ export declare class TraceabilityDB {
38
+ private db;
39
+ private readonly _dbPath;
40
+ constructor(dbPath?: string);
41
+ /**
42
+ * データベーススキーマを初期化
43
+ */
44
+ private initializeSchema;
45
+ /**
46
+ * ノードを追加
47
+ * @throws Error 既に同じIDのノードが存在する場合
48
+ */
49
+ addNode(input: TraceNodeInput): Promise<TraceNode>;
50
+ /**
51
+ * ノードを取得
52
+ */
53
+ getNode(id: string): Promise<TraceNode | null>;
54
+ /**
55
+ * ノードを更新
56
+ */
57
+ updateNode(id: string, updates: Partial<TraceNode>): Promise<void>;
58
+ /**
59
+ * ノードを削除
60
+ */
61
+ deleteNode(id: string): Promise<void>;
62
+ /**
63
+ * ノードを削除(deleteNodeのエイリアス)
64
+ */
65
+ removeNode(id: string): Promise<void>;
66
+ /**
67
+ * リンクを追加
68
+ * @throws Error ソースまたはターゲットノードが存在しない場合
69
+ */
70
+ addLink(link: Omit<TraceLink, 'id' | 'createdAt'> & {
71
+ id?: string;
72
+ createdAt?: Date;
73
+ }): Promise<TraceLink>;
74
+ /**
75
+ * リンクを取得
76
+ */
77
+ getLink(id: string): Promise<TraceLink | null>;
78
+ /**
79
+ * ノード間のリンクを取得
80
+ */
81
+ getLinksBetween(source: string, target: string): Promise<TraceLink[]>;
82
+ /**
83
+ * リンクを削除
84
+ */
85
+ deleteLink(id: string): Promise<void>;
86
+ /**
87
+ * ノードをクエリ
88
+ */
89
+ query(nodeId: string, options?: TraceQueryOptions): Promise<TraceQueryResult>;
90
+ /**
91
+ * 関連リンクを取得
92
+ */
93
+ private getRelatedLinks;
94
+ /**
95
+ * タイプ別にノードを取得
96
+ */
97
+ getNodesByType(type: TraceNodeType): Promise<TraceNode[]>;
98
+ /**
99
+ * 孤立ノードを取得
100
+ */
101
+ getOrphanNodes(): Promise<TraceNode[]>;
102
+ /**
103
+ * 統計情報を取得
104
+ */
105
+ getStats(): Promise<TraceDbStats>;
106
+ /**
107
+ * データベースを閉じる
108
+ */
109
+ close(): void;
110
+ /**
111
+ * リンクIDを生成
112
+ */
113
+ private generateLinkId;
114
+ /**
115
+ * DBの行をノードに変換
116
+ */
117
+ private rowToNode;
118
+ /**
119
+ * DBの行をリンクに変換
120
+ */
121
+ private rowToLink;
122
+ }
123
+ //# sourceMappingURL=TraceabilityDB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TraceabilityDB.d.ts","sourceRoot":"","sources":["../../src/traceability/TraceabilityDB.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,SAAS,EAET,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,GAAE,MAAmB;IAMvC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IAiCxD;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASpD;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BxE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3C;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IA4ChH;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASpD;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAS3E;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkEvF;;OAEG;YACW,eAAe;IAoC7B;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAO/D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAW5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IA4CvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;CAYlB"}