@grafema/util 0.3.0-beta

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 (324) hide show
  1. package/LICENSE +190 -0
  2. package/dist/api/GraphAPI.d.ts +87 -0
  3. package/dist/api/GraphAPI.d.ts.map +1 -0
  4. package/dist/api/GraphAPI.js +212 -0
  5. package/dist/api/GraphAPI.js.map +1 -0
  6. package/dist/api/GuaranteeAPI.d.ts +147 -0
  7. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  8. package/dist/api/GuaranteeAPI.js +290 -0
  9. package/dist/api/GuaranteeAPI.js.map +1 -0
  10. package/dist/config/ConfigLoader.d.ts +214 -0
  11. package/dist/config/ConfigLoader.d.ts.map +1 -0
  12. package/dist/config/ConfigLoader.js +441 -0
  13. package/dist/config/ConfigLoader.js.map +1 -0
  14. package/dist/config/index.d.ts +6 -0
  15. package/dist/config/index.d.ts.map +1 -0
  16. package/dist/config/index.js +5 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  19. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  20. package/dist/core/CoverageAnalyzer.js +199 -0
  21. package/dist/core/CoverageAnalyzer.js.map +1 -0
  22. package/dist/core/FileExplainer.d.ts +101 -0
  23. package/dist/core/FileExplainer.d.ts.map +1 -0
  24. package/dist/core/FileExplainer.js +140 -0
  25. package/dist/core/FileExplainer.js.map +1 -0
  26. package/dist/core/FileOverview.d.ts +124 -0
  27. package/dist/core/FileOverview.d.ts.map +1 -0
  28. package/dist/core/FileOverview.js +279 -0
  29. package/dist/core/FileOverview.js.map +1 -0
  30. package/dist/core/GrafemaUri.d.ts +66 -0
  31. package/dist/core/GrafemaUri.d.ts.map +1 -0
  32. package/dist/core/GrafemaUri.js +191 -0
  33. package/dist/core/GrafemaUri.js.map +1 -0
  34. package/dist/core/GraphBackend.d.ts +158 -0
  35. package/dist/core/GraphBackend.d.ts.map +1 -0
  36. package/dist/core/GraphBackend.js +85 -0
  37. package/dist/core/GraphBackend.js.map +1 -0
  38. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  39. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  40. package/dist/core/GraphFreshnessChecker.js +104 -0
  41. package/dist/core/GraphFreshnessChecker.js.map +1 -0
  42. package/dist/core/GuaranteeManager.d.ts +254 -0
  43. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  44. package/dist/core/GuaranteeManager.js +447 -0
  45. package/dist/core/GuaranteeManager.js.map +1 -0
  46. package/dist/core/HashUtils.d.ts +24 -0
  47. package/dist/core/HashUtils.d.ts.map +1 -0
  48. package/dist/core/HashUtils.js +46 -0
  49. package/dist/core/HashUtils.js.map +1 -0
  50. package/dist/core/IncrementalReanalyzer.d.ts +33 -0
  51. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  52. package/dist/core/IncrementalReanalyzer.js +67 -0
  53. package/dist/core/IncrementalReanalyzer.js.map +1 -0
  54. package/dist/core/ResourceRegistry.d.ts +17 -0
  55. package/dist/core/ResourceRegistry.d.ts.map +1 -0
  56. package/dist/core/ResourceRegistry.js +32 -0
  57. package/dist/core/ResourceRegistry.js.map +1 -0
  58. package/dist/core/SemanticId.d.ts +159 -0
  59. package/dist/core/SemanticId.d.ts.map +1 -0
  60. package/dist/core/SemanticId.js +291 -0
  61. package/dist/core/SemanticId.js.map +1 -0
  62. package/dist/core/VersionManager.d.ts +166 -0
  63. package/dist/core/VersionManager.d.ts.map +1 -0
  64. package/dist/core/VersionManager.js +239 -0
  65. package/dist/core/VersionManager.js.map +1 -0
  66. package/dist/core/brandNodeInternal.d.ts +14 -0
  67. package/dist/core/brandNodeInternal.d.ts.map +1 -0
  68. package/dist/core/brandNodeInternal.js +4 -0
  69. package/dist/core/brandNodeInternal.js.map +1 -0
  70. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  71. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  72. package/dist/core/nodes/GuaranteeNode.js +118 -0
  73. package/dist/core/nodes/GuaranteeNode.js.map +1 -0
  74. package/dist/core/nodes/IssueNode.d.ts +73 -0
  75. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  76. package/dist/core/nodes/IssueNode.js +130 -0
  77. package/dist/core/nodes/IssueNode.js.map +1 -0
  78. package/dist/core/nodes/NodeKind.d.ts +104 -0
  79. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  80. package/dist/core/nodes/NodeKind.js +166 -0
  81. package/dist/core/nodes/NodeKind.js.map +1 -0
  82. package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
  83. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  84. package/dist/diagnostics/DiagnosticCollector.js +133 -0
  85. package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
  86. package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
  87. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  88. package/dist/diagnostics/DiagnosticReporter.js +300 -0
  89. package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
  90. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  91. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  92. package/dist/diagnostics/DiagnosticWriter.js +44 -0
  93. package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
  94. package/dist/diagnostics/categories.d.ts +57 -0
  95. package/dist/diagnostics/categories.d.ts.map +1 -0
  96. package/dist/diagnostics/categories.js +71 -0
  97. package/dist/diagnostics/categories.js.map +1 -0
  98. package/dist/diagnostics/index.d.ts +17 -0
  99. package/dist/diagnostics/index.d.ts.map +1 -0
  100. package/dist/diagnostics/index.js +15 -0
  101. package/dist/diagnostics/index.js.map +1 -0
  102. package/dist/errors/GrafemaError.d.ts +200 -0
  103. package/dist/errors/GrafemaError.d.ts.map +1 -0
  104. package/dist/errors/GrafemaError.js +209 -0
  105. package/dist/errors/GrafemaError.js.map +1 -0
  106. package/dist/index.d.ts +75 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +76 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/instructions/index.d.ts +8 -0
  111. package/dist/instructions/index.d.ts.map +1 -0
  112. package/dist/instructions/index.js +20 -0
  113. package/dist/instructions/index.js.map +1 -0
  114. package/dist/instructions/onboarding.md +133 -0
  115. package/dist/knowledge/KnowledgeBase.d.ts +113 -0
  116. package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
  117. package/dist/knowledge/KnowledgeBase.js +420 -0
  118. package/dist/knowledge/KnowledgeBase.js.map +1 -0
  119. package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
  120. package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
  121. package/dist/knowledge/SemanticAddressResolver.js +160 -0
  122. package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
  123. package/dist/knowledge/git-ingest.d.ts +58 -0
  124. package/dist/knowledge/git-ingest.d.ts.map +1 -0
  125. package/dist/knowledge/git-ingest.js +301 -0
  126. package/dist/knowledge/git-ingest.js.map +1 -0
  127. package/dist/knowledge/git-queries.d.ts +86 -0
  128. package/dist/knowledge/git-queries.d.ts.map +1 -0
  129. package/dist/knowledge/git-queries.js +177 -0
  130. package/dist/knowledge/git-queries.js.map +1 -0
  131. package/dist/knowledge/index.d.ts +14 -0
  132. package/dist/knowledge/index.d.ts.map +1 -0
  133. package/dist/knowledge/index.js +10 -0
  134. package/dist/knowledge/index.js.map +1 -0
  135. package/dist/knowledge/parser.d.ts +39 -0
  136. package/dist/knowledge/parser.d.ts.map +1 -0
  137. package/dist/knowledge/parser.js +292 -0
  138. package/dist/knowledge/parser.js.map +1 -0
  139. package/dist/knowledge/types.d.ts +133 -0
  140. package/dist/knowledge/types.d.ts.map +1 -0
  141. package/dist/knowledge/types.js +8 -0
  142. package/dist/knowledge/types.js.map +1 -0
  143. package/dist/logging/Logger.d.ts +98 -0
  144. package/dist/logging/Logger.d.ts.map +1 -0
  145. package/dist/logging/Logger.js +274 -0
  146. package/dist/logging/Logger.js.map +1 -0
  147. package/dist/notation/archetypes.d.ts +36 -0
  148. package/dist/notation/archetypes.d.ts.map +1 -0
  149. package/dist/notation/archetypes.js +173 -0
  150. package/dist/notation/archetypes.js.map +1 -0
  151. package/dist/notation/fold.d.ts +25 -0
  152. package/dist/notation/fold.d.ts.map +1 -0
  153. package/dist/notation/fold.js +598 -0
  154. package/dist/notation/fold.js.map +1 -0
  155. package/dist/notation/index.d.ts +18 -0
  156. package/dist/notation/index.d.ts.map +1 -0
  157. package/dist/notation/index.js +16 -0
  158. package/dist/notation/index.js.map +1 -0
  159. package/dist/notation/lodExtractor.d.ts +32 -0
  160. package/dist/notation/lodExtractor.d.ts.map +1 -0
  161. package/dist/notation/lodExtractor.js +149 -0
  162. package/dist/notation/lodExtractor.js.map +1 -0
  163. package/dist/notation/nameShortener.d.ts +22 -0
  164. package/dist/notation/nameShortener.d.ts.map +1 -0
  165. package/dist/notation/nameShortener.js +24 -0
  166. package/dist/notation/nameShortener.js.map +1 -0
  167. package/dist/notation/perspectives.d.ts +11 -0
  168. package/dist/notation/perspectives.d.ts.map +1 -0
  169. package/dist/notation/perspectives.js +16 -0
  170. package/dist/notation/perspectives.js.map +1 -0
  171. package/dist/notation/renderer.d.ts +31 -0
  172. package/dist/notation/renderer.d.ts.map +1 -0
  173. package/dist/notation/renderer.js +315 -0
  174. package/dist/notation/renderer.js.map +1 -0
  175. package/dist/notation/traceRenderer.d.ts +39 -0
  176. package/dist/notation/traceRenderer.d.ts.map +1 -0
  177. package/dist/notation/traceRenderer.js +358 -0
  178. package/dist/notation/traceRenderer.js.map +1 -0
  179. package/dist/notation/types.d.ts +66 -0
  180. package/dist/notation/types.d.ts.map +1 -0
  181. package/dist/notation/types.js +10 -0
  182. package/dist/notation/types.js.map +1 -0
  183. package/dist/queries/NodeContext.d.ts +81 -0
  184. package/dist/queries/NodeContext.d.ts.map +1 -0
  185. package/dist/queries/NodeContext.js +196 -0
  186. package/dist/queries/NodeContext.js.map +1 -0
  187. package/dist/queries/findCallsInFunction.d.ts +62 -0
  188. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  189. package/dist/queries/findCallsInFunction.js +169 -0
  190. package/dist/queries/findCallsInFunction.js.map +1 -0
  191. package/dist/queries/findContainingFunction.d.ts +57 -0
  192. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  193. package/dist/queries/findContainingFunction.js +91 -0
  194. package/dist/queries/findContainingFunction.js.map +1 -0
  195. package/dist/queries/index.d.ts +18 -0
  196. package/dist/queries/index.d.ts.map +1 -0
  197. package/dist/queries/index.js +14 -0
  198. package/dist/queries/index.js.map +1 -0
  199. package/dist/queries/traceDataflow.d.ts +65 -0
  200. package/dist/queries/traceDataflow.d.ts.map +1 -0
  201. package/dist/queries/traceDataflow.js +754 -0
  202. package/dist/queries/traceDataflow.js.map +1 -0
  203. package/dist/queries/traceValues.d.ts +70 -0
  204. package/dist/queries/traceValues.d.ts.map +1 -0
  205. package/dist/queries/traceValues.js +373 -0
  206. package/dist/queries/traceValues.js.map +1 -0
  207. package/dist/queries/types.d.ts +166 -0
  208. package/dist/queries/types.d.ts.map +1 -0
  209. package/dist/queries/types.js +10 -0
  210. package/dist/queries/types.js.map +1 -0
  211. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  212. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  213. package/dist/schema/GraphSchemaExtractor.js +125 -0
  214. package/dist/schema/GraphSchemaExtractor.js.map +1 -0
  215. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  216. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  217. package/dist/schema/InterfaceSchemaExtractor.js +113 -0
  218. package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
  219. package/dist/schema/index.d.ts +5 -0
  220. package/dist/schema/index.d.ts.map +1 -0
  221. package/dist/schema/index.js +3 -0
  222. package/dist/schema/index.js.map +1 -0
  223. package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
  224. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  225. package/dist/storage/backends/RFDBServerBackend.js +748 -0
  226. package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
  227. package/dist/storage/backends/typeValidation.d.ts +47 -0
  228. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  229. package/dist/storage/backends/typeValidation.js +141 -0
  230. package/dist/storage/backends/typeValidation.js.map +1 -0
  231. package/dist/utils/findRfdbBinary.d.ts +67 -0
  232. package/dist/utils/findRfdbBinary.d.ts.map +1 -0
  233. package/dist/utils/findRfdbBinary.js +261 -0
  234. package/dist/utils/findRfdbBinary.js.map +1 -0
  235. package/dist/utils/lazyDownload.d.ts +43 -0
  236. package/dist/utils/lazyDownload.d.ts.map +1 -0
  237. package/dist/utils/lazyDownload.js +175 -0
  238. package/dist/utils/lazyDownload.js.map +1 -0
  239. package/dist/utils/moduleResolution.d.ts +134 -0
  240. package/dist/utils/moduleResolution.d.ts.map +1 -0
  241. package/dist/utils/moduleResolution.js +189 -0
  242. package/dist/utils/moduleResolution.js.map +1 -0
  243. package/dist/utils/resolveNodeFile.d.ts +13 -0
  244. package/dist/utils/resolveNodeFile.d.ts.map +1 -0
  245. package/dist/utils/resolveNodeFile.js +18 -0
  246. package/dist/utils/resolveNodeFile.js.map +1 -0
  247. package/dist/utils/startRfdbServer.d.ts +63 -0
  248. package/dist/utils/startRfdbServer.d.ts.map +1 -0
  249. package/dist/utils/startRfdbServer.js +142 -0
  250. package/dist/utils/startRfdbServer.js.map +1 -0
  251. package/dist/validation/PathValidator.d.ts +80 -0
  252. package/dist/validation/PathValidator.d.ts.map +1 -0
  253. package/dist/validation/PathValidator.js +252 -0
  254. package/dist/validation/PathValidator.js.map +1 -0
  255. package/dist/version.d.ts +11 -0
  256. package/dist/version.d.ts.map +1 -0
  257. package/dist/version.js +26 -0
  258. package/dist/version.js.map +1 -0
  259. package/package.json +50 -0
  260. package/src/api/GraphAPI.ts +307 -0
  261. package/src/api/GuaranteeAPI.ts +402 -0
  262. package/src/config/ConfigLoader.ts +653 -0
  263. package/src/config/index.ts +13 -0
  264. package/src/core/CoverageAnalyzer.ts +243 -0
  265. package/src/core/FileExplainer.ts +179 -0
  266. package/src/core/FileOverview.ts +397 -0
  267. package/src/core/GrafemaUri.ts +216 -0
  268. package/src/core/GraphBackend.ts +266 -0
  269. package/src/core/GraphFreshnessChecker.ts +145 -0
  270. package/src/core/GuaranteeManager.ts +684 -0
  271. package/src/core/HashUtils.ts +48 -0
  272. package/src/core/IncrementalReanalyzer.ts +106 -0
  273. package/src/core/ResourceRegistry.ts +39 -0
  274. package/src/core/SemanticId.ts +423 -0
  275. package/src/core/VersionManager.ts +405 -0
  276. package/src/core/brandNodeInternal.ts +16 -0
  277. package/src/core/nodes/GuaranteeNode.ts +162 -0
  278. package/src/core/nodes/IssueNode.ts +177 -0
  279. package/src/core/nodes/NodeKind.ts +192 -0
  280. package/src/diagnostics/DiagnosticCollector.ts +170 -0
  281. package/src/diagnostics/DiagnosticReporter.ts +395 -0
  282. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  283. package/src/diagnostics/categories.ts +104 -0
  284. package/src/diagnostics/index.ts +30 -0
  285. package/src/errors/GrafemaError.ts +297 -0
  286. package/src/index.ts +261 -0
  287. package/src/instructions/index.ts +21 -0
  288. package/src/instructions/onboarding.md +133 -0
  289. package/src/knowledge/KnowledgeBase.ts +486 -0
  290. package/src/knowledge/SemanticAddressResolver.ts +191 -0
  291. package/src/knowledge/git-ingest.ts +402 -0
  292. package/src/knowledge/git-queries.ts +269 -0
  293. package/src/knowledge/index.ts +29 -0
  294. package/src/knowledge/parser.ts +294 -0
  295. package/src/knowledge/types.ts +146 -0
  296. package/src/logging/Logger.ts +303 -0
  297. package/src/notation/archetypes.ts +189 -0
  298. package/src/notation/fold.ts +696 -0
  299. package/src/notation/index.ts +27 -0
  300. package/src/notation/lodExtractor.ts +177 -0
  301. package/src/notation/nameShortener.ts +24 -0
  302. package/src/notation/perspectives.ts +18 -0
  303. package/src/notation/renderer.ts +394 -0
  304. package/src/notation/traceRenderer.ts +458 -0
  305. package/src/notation/types.ts +79 -0
  306. package/src/queries/NodeContext.ts +280 -0
  307. package/src/queries/findCallsInFunction.ts +249 -0
  308. package/src/queries/findContainingFunction.ts +124 -0
  309. package/src/queries/index.ts +44 -0
  310. package/src/queries/traceDataflow.ts +838 -0
  311. package/src/queries/traceValues.ts +531 -0
  312. package/src/queries/types.ts +191 -0
  313. package/src/schema/GraphSchemaExtractor.ts +177 -0
  314. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  315. package/src/schema/index.ts +5 -0
  316. package/src/storage/backends/RFDBServerBackend.ts +895 -0
  317. package/src/storage/backends/typeValidation.ts +154 -0
  318. package/src/utils/findRfdbBinary.ts +288 -0
  319. package/src/utils/lazyDownload.ts +206 -0
  320. package/src/utils/moduleResolution.ts +271 -0
  321. package/src/utils/resolveNodeFile.ts +18 -0
  322. package/src/utils/startRfdbServer.ts +197 -0
  323. package/src/validation/PathValidator.ts +334 -0
  324. package/src/version.ts +28 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Shared utility for starting rfdb-server
3
+ *
4
+ * Single authoritative function for spawning rfdb-server. All spawn sites
5
+ * (RFDBServerBackend, CLI server command, ParallelAnalysisRunner) delegate here.
6
+ *
7
+ * If pidPath is provided, checks for an existing server via PID file before
8
+ * spawning. Returns null when an existing server is detected (caller should
9
+ * not kill it).
10
+ */
11
+ import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
12
+ import { dirname } from 'path';
13
+ import { spawn } from 'child_process';
14
+ import { setTimeout as sleep } from 'timers/promises';
15
+ import { findRfdbBinary } from './findRfdbBinary.js';
16
+ /**
17
+ * Check if an existing server is running based on PID file.
18
+ *
19
+ * Returns:
20
+ * - 'alive' — PID file exists, process is alive, socket is present
21
+ * - 'stale' — PID file exists but process is dead or PID is invalid
22
+ * - 'none' — no PID file
23
+ */
24
+ export function checkExistingServer(pidPath, socketPath, deps) {
25
+ if (!deps.existsSync(pidPath))
26
+ return 'none';
27
+ let pidStr;
28
+ try {
29
+ pidStr = deps.readFileSync(pidPath, 'utf8').trim();
30
+ }
31
+ catch {
32
+ return 'stale';
33
+ }
34
+ const pid = parseInt(pidStr, 10);
35
+ if (isNaN(pid) || pid <= 0)
36
+ return 'stale';
37
+ try {
38
+ deps.killProcess(pid, 0);
39
+ // Process is alive — check socket too
40
+ if (deps.existsSync(socketPath)) {
41
+ return 'alive';
42
+ }
43
+ // PID alive but socket gone (server crashed partially)
44
+ return 'stale';
45
+ }
46
+ catch (err) {
47
+ if (err && typeof err === 'object' && 'code' in err && err.code === 'ESRCH') {
48
+ return 'stale';
49
+ }
50
+ // Unexpected error — re-throw rather than silently treating as stale
51
+ throw err;
52
+ }
53
+ }
54
+ /**
55
+ * Start an rfdb-server process (or detect existing one via PID file).
56
+ *
57
+ * 0. Check PID file for existing server (if pidPath provided)
58
+ * 1. Resolve binary (explicit or via findRfdbBinary)
59
+ * 2. Remove stale socket
60
+ * 3. Spawn detached process
61
+ * 4. Write PID file (if pidPath provided)
62
+ * 5. Poll for socket file up to waitTimeoutMs
63
+ * 6. Return ChildProcess (caller decides whether to kill later)
64
+ *
65
+ * Returns null if an existing server is already running (pidPath + alive PID).
66
+ */
67
+ export async function startRfdbServer(options) {
68
+ const { dbPath, socketPath, pidPath, waitTimeoutMs = 5000, logger, _deps, } = options;
69
+ const _spawn = _deps?.spawn ?? spawn;
70
+ const _findRfdbBinary = _deps?.findRfdbBinary ?? findRfdbBinary;
71
+ const _existsSync = _deps?.existsSync ?? existsSync;
72
+ const _unlinkSync = _deps?.unlinkSync ?? unlinkSync;
73
+ const _writeFileSync = _deps?.writeFileSync ?? writeFileSync;
74
+ const _readFileSync = _deps?.readFileSync ?? readFileSync;
75
+ const _killProcess = _deps?.killProcess ?? ((pid, signal) => process.kill(pid, signal));
76
+ // 0. Check for existing server via PID file
77
+ if (pidPath) {
78
+ const status = checkExistingServer(pidPath, socketPath, {
79
+ existsSync: _existsSync,
80
+ readFileSync: _readFileSync,
81
+ killProcess: _killProcess,
82
+ });
83
+ if (status === 'alive') {
84
+ logger?.debug(`rfdb-server already running (PID file: ${pidPath}), reusing`);
85
+ return null;
86
+ }
87
+ if (status === 'stale') {
88
+ logger?.debug(`Stale PID file found at ${pidPath}, removing`);
89
+ try {
90
+ _unlinkSync(pidPath);
91
+ }
92
+ catch { /* ignore */ }
93
+ }
94
+ }
95
+ // 1. Resolve binary
96
+ const binaryPath = options.binaryPath || _findRfdbBinary();
97
+ if (!binaryPath) {
98
+ throw new Error('RFDB server binary not found.\n' +
99
+ 'Install @grafema/rfdb: npm install @grafema/rfdb\n' +
100
+ 'Or build from source: cargo build --release --bin rfdb-server');
101
+ }
102
+ // 2. Remove stale socket
103
+ if (_existsSync(socketPath)) {
104
+ _unlinkSync(socketPath);
105
+ }
106
+ const dataDir = dirname(socketPath);
107
+ logger?.debug(`Starting rfdb-server: ${binaryPath} ${dbPath} --socket ${socketPath} --data-dir ${dataDir}`);
108
+ // 3. Spawn server (detached, survives parent exit)
109
+ // Mutable container to capture async spawn errors (Dijkstra amendment B)
110
+ const state = { spawnError: null };
111
+ const serverProcess = _spawn(binaryPath, [dbPath, '--socket', socketPath, '--data-dir', dataDir], {
112
+ stdio: ['ignore', 'ignore', process.stderr.isTTY ? 'inherit' : 'ignore'],
113
+ detached: true,
114
+ });
115
+ serverProcess.unref();
116
+ // Wire error handler to capture ENOENT and other spawn failures
117
+ serverProcess.on('error', (err) => {
118
+ state.spawnError = err;
119
+ });
120
+ // 4. Write PID file if requested and pid is available
121
+ if (pidPath && serverProcess.pid) {
122
+ _writeFileSync(pidPath, String(serverProcess.pid));
123
+ }
124
+ // 5. Poll for socket file
125
+ const maxAttempts = Math.ceil(waitTimeoutMs / 100);
126
+ let attempts = 0;
127
+ while (!_existsSync(socketPath) && attempts < maxAttempts) {
128
+ if (state.spawnError) {
129
+ throw new Error(`RFDB server failed to start: ${state.spawnError.message} — check binary: ${binaryPath}`);
130
+ }
131
+ await sleep(100);
132
+ attempts++;
133
+ }
134
+ // 6. Final check
135
+ if (!_existsSync(socketPath)) {
136
+ const detail = state.spawnError ? `: ${state.spawnError.message}` : '';
137
+ throw new Error(`RFDB server failed to start after ${waitTimeoutMs}ms${detail} — check binary: ${binaryPath}`);
138
+ }
139
+ logger?.debug(`rfdb-server started on ${socketPath}`);
140
+ return serverProcess;
141
+ }
142
+ //# sourceMappingURL=startRfdbServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startRfdbServer.js","sourceRoot":"","sources":["../../src/utils/startRfdbServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * PathValidator - проверяет безопасность рефакторинга через path equivalence
3
+ *
4
+ * КОНЦЕПЦИЯ:
5
+ * 1. Трассируем пути от main версии функции до endpoints (DATABASE, HTTP, EXTERNAL)
6
+ * 2. Трассируем пути от __local версии до тех же endpoints
7
+ * 3. Сравниваем: если все пути сохранились → safe, если нет → breaking change
8
+ *
9
+ * ENDPOINTS (критические точки):
10
+ * - DATABASE_QUERY: запросы к БД
11
+ * - HTTP_REQUEST: HTTP запросы
12
+ * - EXTERNAL: внешние сервисы
13
+ * - FILESYSTEM: операции с файлами
14
+ * - MODULE_BOUNDARY: exported functions
15
+ * - SIDE_EFFECTS: console.log, process.exit и т.д.
16
+ */
17
+ import type { GraphBackend } from '@grafema/types';
18
+ /**
19
+ * Validation result
20
+ */
21
+ export interface PathValidationResult {
22
+ safe: boolean;
23
+ severity: 'info' | 'warning' | 'error';
24
+ message: string;
25
+ deleted?: boolean;
26
+ missing?: EndpointDiff[];
27
+ added?: EndpointDiff[];
28
+ endpointsChecked: number;
29
+ }
30
+ /**
31
+ * Endpoint diff info
32
+ */
33
+ export interface EndpointDiff {
34
+ type: string;
35
+ name: string;
36
+ reason: string;
37
+ }
38
+ export declare class PathValidator {
39
+ private backend;
40
+ constructor(backend: GraphBackend);
41
+ /**
42
+ * Проверить эквивалентность путей между main и __local версиями функции
43
+ *
44
+ * @param functionName - Имя функции
45
+ * @param file - Путь к файлу
46
+ * @returns Результат валидации
47
+ */
48
+ checkPathEquivalence(functionName: string, file: string): Promise<PathValidationResult>;
49
+ /**
50
+ * Получить все достижимые endpoints из данной ноды
51
+ *
52
+ * @param nodeId - ID начальной ноды
53
+ * @returns Массив endpoint нод
54
+ */
55
+ private _getReachableEndpoints;
56
+ /**
57
+ * Сравнить два набора endpoints
58
+ *
59
+ * @param mainEndpoints - Endpoints из main версии
60
+ * @param localEndpoints - Endpoints из __local версии
61
+ * @returns { missing: [], added: [] }
62
+ */
63
+ private _compareEndpoints;
64
+ /**
65
+ * Получить уникальный ключ для endpoint
66
+ *
67
+ * @param endpoint - Endpoint нода
68
+ * @returns Уникальный ключ
69
+ */
70
+ private _getEndpointKey;
71
+ /**
72
+ * Получить reason для missing endpoint
73
+ */
74
+ private _getMissingReason;
75
+ /**
76
+ * Получить reason для added endpoint
77
+ */
78
+ private _getAddedReason;
79
+ }
80
+ //# sourceMappingURL=PathValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathValidator.d.ts","sourceRoot":"","sources":["../../src/validation/PathValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAWnD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,EAAE,YAAY;IAIjC;;;;;;OAMG;IACG,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsF7F;;;;;OAKG;YACW,sBAAsB;IAwDpC;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAexB"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * PathValidator - проверяет безопасность рефакторинга через path equivalence
3
+ *
4
+ * КОНЦЕПЦИЯ:
5
+ * 1. Трассируем пути от main версии функции до endpoints (DATABASE, HTTP, EXTERNAL)
6
+ * 2. Трассируем пути от __local версии до тех же endpoints
7
+ * 3. Сравниваем: если все пути сохранились → safe, если нет → breaking change
8
+ *
9
+ * ENDPOINTS (критические точки):
10
+ * - DATABASE_QUERY: запросы к БД
11
+ * - HTTP_REQUEST: HTTP запросы
12
+ * - EXTERNAL: внешние сервисы
13
+ * - FILESYSTEM: операции с файлами
14
+ * - MODULE_BOUNDARY: exported functions
15
+ * - SIDE_EFFECTS: console.log, process.exit и т.д.
16
+ */
17
+ export class PathValidator {
18
+ backend;
19
+ constructor(backend) {
20
+ this.backend = backend;
21
+ }
22
+ /**
23
+ * Проверить эквивалентность путей между main и __local версиями функции
24
+ *
25
+ * @param functionName - Имя функции
26
+ * @param file - Путь к файлу
27
+ * @returns Результат валидации
28
+ */
29
+ async checkPathEquivalence(functionName, file) {
30
+ // 1. Найти все версии функции (main и __local) по имени
31
+ const allVersions = [];
32
+ for await (const node of this.backend.queryNodes({ type: 'FUNCTION', name: functionName })) {
33
+ // Дополнительно фильтруем по file если он указан
34
+ if (node.file === file || node.file === undefined) {
35
+ allVersions.push(node);
36
+ }
37
+ }
38
+ const mainFunction = allVersions.find(n => n.version === 'main');
39
+ const localFunction = allVersions.find(n => n.version === '__local');
40
+ // 3. Обработать случаи: deleted, added, exists
41
+ if (!mainFunction && localFunction) {
42
+ // Новая функция
43
+ return {
44
+ safe: true,
45
+ severity: 'info',
46
+ message: `New function added: ${functionName}`,
47
+ endpointsChecked: 0
48
+ };
49
+ }
50
+ if (mainFunction && !localFunction) {
51
+ // Функция удалена
52
+ return {
53
+ safe: false,
54
+ severity: 'error',
55
+ deleted: true,
56
+ message: `Function deleted: ${functionName}`,
57
+ endpointsChecked: 0
58
+ };
59
+ }
60
+ if (!mainFunction && !localFunction) {
61
+ // Функция не найдена вообще
62
+ return {
63
+ safe: false,
64
+ severity: 'error',
65
+ message: `Function not found: ${functionName}`,
66
+ endpointsChecked: 0
67
+ };
68
+ }
69
+ // 4. Получить все endpoints для main версии
70
+ const mainEndpoints = await this._getReachableEndpoints(mainFunction.id);
71
+ // 5. Получить все endpoints для local версии
72
+ const localEndpoints = await this._getReachableEndpoints(localFunction.id);
73
+ // 6. Сравнить endpoints
74
+ const comparison = this._compareEndpoints(mainEndpoints, localEndpoints);
75
+ // 7. Определить результат
76
+ if (comparison.missing.length > 0) {
77
+ // Breaking change - критические endpoints удалены
78
+ return {
79
+ safe: false,
80
+ severity: 'error',
81
+ message: `Breaking change detected: ${comparison.missing.length} endpoint(s) no longer reachable`,
82
+ missing: comparison.missing,
83
+ endpointsChecked: mainEndpoints.length
84
+ };
85
+ }
86
+ if (comparison.added.length > 0) {
87
+ // Warning - новые endpoints добавлены
88
+ return {
89
+ safe: true,
90
+ severity: 'warning',
91
+ message: `New behavior added: ${comparison.added.length} new endpoint(s) reachable`,
92
+ added: comparison.added,
93
+ endpointsChecked: mainEndpoints.length
94
+ };
95
+ }
96
+ // Safe refactoring - все endpoints сохранены
97
+ return {
98
+ safe: true,
99
+ severity: 'info',
100
+ message: `Safe refactoring: all endpoints preserved`,
101
+ endpointsChecked: mainEndpoints.length
102
+ };
103
+ }
104
+ /**
105
+ * Получить все достижимые endpoints из данной ноды
106
+ *
107
+ * @param nodeId - ID начальной ноды
108
+ * @returns Массив endpoint нод
109
+ */
110
+ async _getReachableEndpoints(nodeId) {
111
+ // Трассируем пути через CALLS рёбра (BFS до глубины 10)
112
+ // Endpoints - это ноды типа: DATABASE_QUERY, HTTP_REQUEST, EXTERNAL, FILESYSTEM, SIDE_EFFECT
113
+ // Или exported FUNCTION (MODULE_BOUNDARY)
114
+ const CALLS_EDGE_TYPE = 'CALLS';
115
+ const MAX_DEPTH = 10;
116
+ // BFS для поиска всех достижимых нод
117
+ const visited = new Set();
118
+ const queue = [{ id: nodeId, depth: 0 }];
119
+ const endpoints = [];
120
+ while (queue.length > 0) {
121
+ const { id, depth } = queue.shift();
122
+ if (visited.has(id) || depth > MAX_DEPTH) {
123
+ continue;
124
+ }
125
+ visited.add(id);
126
+ // Получить ноду и проверить является ли она endpoint
127
+ const node = await this.backend.getNode(id);
128
+ if (node && id !== nodeId) {
129
+ // Check for endpoint types (new namespaced types + legacy names for backward compat)
130
+ const endpointTypes = [
131
+ 'db:query', 'DATABASE_QUERY',
132
+ 'http:request', 'HTTP_REQUEST',
133
+ 'EXTERNAL',
134
+ 'fs:operation', 'FILESYSTEM',
135
+ 'SIDE_EFFECT',
136
+ 'net:request', 'EXTERNAL_NETWORK',
137
+ 'net:stdio', 'EXTERNAL_STDIO'
138
+ ];
139
+ const isEndpoint = endpointTypes.includes(node.type) ||
140
+ (node.type === 'FUNCTION' && node.exported === true);
141
+ if (isEndpoint) {
142
+ endpoints.push(node);
143
+ }
144
+ }
145
+ // Получить исходящие CALLS рёбра
146
+ const outgoingEdges = await this.backend.getOutgoingEdges(id, [CALLS_EDGE_TYPE]);
147
+ for (const edge of outgoingEdges) {
148
+ const dstId = typeof edge.dst === 'string' ? edge.dst : String(edge.dst);
149
+ if (!visited.has(dstId)) {
150
+ queue.push({ id: dstId, depth: depth + 1 });
151
+ }
152
+ }
153
+ }
154
+ return endpoints;
155
+ }
156
+ /**
157
+ * Сравнить два набора endpoints
158
+ *
159
+ * @param mainEndpoints - Endpoints из main версии
160
+ * @param localEndpoints - Endpoints из __local версии
161
+ * @returns { missing: [], added: [] }
162
+ */
163
+ _compareEndpoints(mainEndpoints, localEndpoints) {
164
+ const missing = [];
165
+ const added = [];
166
+ // Создаём Map для быстрого поиска
167
+ const localMap = new Map();
168
+ localEndpoints.forEach(ep => {
169
+ const key = this._getEndpointKey(ep);
170
+ localMap.set(key, ep);
171
+ });
172
+ const mainMap = new Map();
173
+ mainEndpoints.forEach(ep => {
174
+ const key = this._getEndpointKey(ep);
175
+ mainMap.set(key, ep);
176
+ });
177
+ // Находим missing endpoints (есть в main, но нет в local)
178
+ for (const [key, endpoint] of mainMap.entries()) {
179
+ if (!localMap.has(key)) {
180
+ missing.push({
181
+ type: endpoint.type,
182
+ name: endpoint.name || endpoint.query || 'unknown',
183
+ reason: this._getMissingReason(endpoint)
184
+ });
185
+ }
186
+ }
187
+ // Находим added endpoints (есть в local, но нет в main)
188
+ for (const [key, endpoint] of localMap.entries()) {
189
+ if (!mainMap.has(key)) {
190
+ added.push({
191
+ type: endpoint.type,
192
+ name: endpoint.name || endpoint.query || 'unknown',
193
+ reason: this._getAddedReason(endpoint)
194
+ });
195
+ }
196
+ }
197
+ return { missing, added };
198
+ }
199
+ /**
200
+ * Получить уникальный ключ для endpoint
201
+ *
202
+ * @param endpoint - Endpoint нода
203
+ * @returns Уникальный ключ
204
+ */
205
+ _getEndpointKey(endpoint) {
206
+ if (endpoint.type === 'DATABASE_QUERY' || endpoint.type === 'db:query') {
207
+ // Для DB query используем query text
208
+ return `db:query:${endpoint.query || endpoint.name}`;
209
+ }
210
+ if (endpoint.type === 'FUNCTION' && endpoint.exported) {
211
+ // Для exported functions используем stable ID
212
+ return `${endpoint.type}:${endpoint.name}:${endpoint.file}`;
213
+ }
214
+ if (endpoint.type === 'EXTERNAL') {
215
+ // Для external используем service + name
216
+ return `${endpoint.type}:${endpoint.service}:${endpoint.name}`;
217
+ }
218
+ // Для остальных используем type + name
219
+ return `${endpoint.type}:${endpoint.name}`;
220
+ }
221
+ /**
222
+ * Получить reason для missing endpoint
223
+ */
224
+ _getMissingReason(endpoint) {
225
+ if (endpoint.type === 'DATABASE_QUERY') {
226
+ return `Database query no longer executed: ${endpoint.query}`;
227
+ }
228
+ if (endpoint.type === 'FUNCTION' && endpoint.exported) {
229
+ return `Exported function no longer called: ${endpoint.name}`;
230
+ }
231
+ if (endpoint.type === 'EXTERNAL') {
232
+ return `External service no longer called: ${endpoint.service}/${endpoint.name}`;
233
+ }
234
+ return `Endpoint no longer reachable: ${endpoint.name}`;
235
+ }
236
+ /**
237
+ * Получить reason для added endpoint
238
+ */
239
+ _getAddedReason(endpoint) {
240
+ if (endpoint.type === 'DATABASE_QUERY') {
241
+ return `New database query added: ${endpoint.query}`;
242
+ }
243
+ if (endpoint.type === 'FUNCTION' && endpoint.exported) {
244
+ return `New call to exported function: ${endpoint.name}`;
245
+ }
246
+ if (endpoint.type === 'EXTERNAL') {
247
+ return `New external service call: ${endpoint.service}/${endpoint.name}`;
248
+ }
249
+ return `New endpoint reachable: ${endpoint.name}`;
250
+ }
251
+ }
252
+ //# sourceMappingURL=PathValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathValidator.js","sourceRoot":"","sources":["../../src/validation/PathValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Full Grafema version string (e.g., "0.2.5-beta") */
2
+ export declare const GRAFEMA_VERSION: string;
3
+ /**
4
+ * Extract major.minor.patch from a version string, stripping pre-release tags.
5
+ *
6
+ * "0.2.5-beta" → "0.2.5"
7
+ * "0.2.5" → "0.2.5"
8
+ * "1.0.0-alpha.1" → "1.0.0"
9
+ */
10
+ export declare function getSchemaVersion(version: string): string;
11
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAaA,uDAAuD;AACvD,eAAO,MAAM,eAAe,EAAE,MAAoB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIxD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Grafema version constants.
3
+ *
4
+ * Reads version from @grafema/util package.json at module load time.
5
+ * This is the single source of truth for runtime version checks.
6
+ */
7
+ import { readFileSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
12
+ /** Full Grafema version string (e.g., "0.2.5-beta") */
13
+ export const GRAFEMA_VERSION = pkg.version;
14
+ /**
15
+ * Extract major.minor.patch from a version string, stripping pre-release tags.
16
+ *
17
+ * "0.2.5-beta" → "0.2.5"
18
+ * "0.2.5" → "0.2.5"
19
+ * "1.0.0-alpha.1" → "1.0.0"
20
+ */
21
+ export function getSchemaVersion(version) {
22
+ // Strip pre-release tag (everything after first hyphen)
23
+ const base = version.split('-')[0];
24
+ return base;
25
+ }
26
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAAW,GAAG,CAAC,OAAO,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,wDAAwD;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@grafema/util",
3
+ "version": "0.3.0-beta",
4
+ "description": "Query, config, and guarantee utilities for Grafema",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./*": {
14
+ "types": "./dist/*.d.ts",
15
+ "import": "./dist/*.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "src"
21
+ ],
22
+ "keywords": [
23
+ "grafema",
24
+ "code-analysis",
25
+ "utilities"
26
+ ],
27
+ "license": "Apache-2.0",
28
+ "author": "Vadim Reshetnikov",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/Disentinel/grafema.git",
32
+ "directory": "packages/util"
33
+ },
34
+ "dependencies": {
35
+ "ajv": "^8.17.1",
36
+ "minimatch": "^10.1.1",
37
+ "yaml": "^2.8.2",
38
+ "@grafema/rfdb-client": "0.3.0-beta",
39
+ "@grafema/types": "0.3.0-beta"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.0.8",
43
+ "typescript": "^5.9.3"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "postbuild": "cp -r src/instructions/*.md dist/instructions/",
48
+ "clean": "rm -rf dist"
49
+ }
50
+ }