@pasosdejesus/m 0.27.2 → 0.29.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 (323) hide show
  1. package/README.md +2 -2
  2. package/dist/CHANGELOG.md +147 -0
  3. package/dist/compose/data.d.ts +30 -0
  4. package/dist/compose/data.d.ts.map +1 -0
  5. package/dist/compose/data.js +46 -0
  6. package/dist/compose/data.js.map +1 -0
  7. package/dist/compose/derive.d.ts +59 -0
  8. package/dist/compose/derive.d.ts.map +1 -0
  9. package/dist/compose/derive.js +143 -0
  10. package/dist/compose/derive.js.map +1 -0
  11. package/dist/compose/discover.d.ts +32 -0
  12. package/dist/compose/discover.d.ts.map +1 -0
  13. package/dist/compose/discover.js +96 -0
  14. package/dist/compose/discover.js.map +1 -0
  15. package/dist/compose/git.d.ts +31 -0
  16. package/dist/compose/git.d.ts.map +1 -0
  17. package/dist/compose/git.js +71 -0
  18. package/dist/compose/git.js.map +1 -0
  19. package/dist/compose/index.d.ts +19 -0
  20. package/dist/compose/index.d.ts.map +1 -0
  21. package/dist/compose/index.js +18 -0
  22. package/dist/compose/index.js.map +1 -0
  23. package/dist/compose/manifest.d.ts +89 -0
  24. package/dist/compose/manifest.d.ts.map +1 -0
  25. package/dist/compose/manifest.js +16 -0
  26. package/dist/compose/manifest.js.map +1 -0
  27. package/dist/compose/sync.d.ts +12 -0
  28. package/dist/compose/sync.d.ts.map +1 -0
  29. package/dist/compose/sync.js +27 -0
  30. package/dist/compose/sync.js.map +1 -0
  31. package/dist/compose/usage.d.ts +54 -0
  32. package/dist/compose/usage.d.ts.map +1 -0
  33. package/dist/compose/usage.js +167 -0
  34. package/dist/compose/usage.js.map +1 -0
  35. package/dist/compose/vendor.d.ts +68 -0
  36. package/dist/compose/vendor.d.ts.map +1 -0
  37. package/dist/compose/vendor.js +166 -0
  38. package/dist/compose/vendor.js.map +1 -0
  39. package/dist/compose/verify.d.ts +11 -0
  40. package/dist/compose/verify.d.ts.map +1 -0
  41. package/dist/compose/verify.js +74 -0
  42. package/dist/compose/verify.js.map +1 -0
  43. package/dist/e2e/env.d.ts +1 -1
  44. package/dist/e2e/env.js +3 -3
  45. package/dist/e2e/env.js.map +1 -1
  46. package/dist/e2e/local-node.js +1 -1
  47. package/dist/e2e/local-node.js.map +1 -1
  48. package/dist/e2e/wallet-mock.js +1 -1
  49. package/dist/e2e/wallet-mock.js.map +1 -1
  50. package/dist/e2e/warmup.js +1 -1
  51. package/dist/e2e/warmup.js.map +1 -1
  52. package/dist/engine.d.ts +3 -16
  53. package/dist/engine.d.ts.map +1 -1
  54. package/dist/i18n/locales/cli.d.ts.map +1 -1
  55. package/dist/i18n/locales/cli.js +20 -10
  56. package/dist/i18n/locales/cli.js.map +1 -1
  57. package/dist/m.js +15 -10
  58. package/dist/m.js.map +1 -1
  59. package/dist/shadcn_components/ui/button.d.ts +1 -1
  60. package/dist/tasks/create.d.ts +1 -1
  61. package/dist/tasks/create.d.ts.map +1 -1
  62. package/dist/tasks/create.js +5 -13
  63. package/dist/tasks/create.js.map +1 -1
  64. package/dist/tasks/db.d.ts +2 -1
  65. package/dist/tasks/db.d.ts.map +1 -1
  66. package/dist/tasks/db.js +14 -11
  67. package/dist/tasks/db.js.map +1 -1
  68. package/dist/tasks/e2e-summary.js +1 -1
  69. package/dist/tasks/e2e-summary.js.map +1 -1
  70. package/dist/tasks/e2e.js +1 -1
  71. package/dist/tasks/e2e.js.map +1 -1
  72. package/dist/tasks/engine.d.ts.map +1 -1
  73. package/dist/tasks/engine.js +436 -17
  74. package/dist/tasks/engine.js.map +1 -1
  75. package/dist/tasks/msip.d.ts +11 -0
  76. package/dist/tasks/msip.d.ts.map +1 -0
  77. package/dist/tasks/{base-model.js → msip.js} +161 -25
  78. package/dist/tasks/msip.js.map +1 -0
  79. package/dist/tasks/warmup.js +1 -1
  80. package/dist/tasks/warmup.js.map +1 -1
  81. package/dist/templates/apps/hardhat/README.md +0 -8
  82. package/dist/templates/apps/nextjs/bin/m +3 -0
  83. package/dist/templates/apps/nextjs/tests/global-setup.ts +28 -0
  84. package/dist/templates/apps/nextjs/vitest.config.ts +3 -0
  85. package/dist/test-utils/console.d.ts +1 -1
  86. package/dist/test-utils/console.js +1 -1
  87. package/dist/test-utils/kysely-mocks.d.ts +1 -1
  88. package/dist/test-utils/kysely-mocks.js +1 -1
  89. package/dist/test-utils/wallet-mocks.js +1 -1
  90. package/dist/test-utils/wallet-setup.js +1 -1
  91. package/dist/util/engines.d.ts +4 -6
  92. package/dist/util/engines.d.ts.map +1 -1
  93. package/dist/util/engines.js +5 -38
  94. package/dist/util/engines.js.map +1 -1
  95. package/dist/util/msip.d.ts +17 -0
  96. package/dist/util/msip.d.ts.map +1 -0
  97. package/dist/util/msip.js +86 -0
  98. package/dist/util/msip.js.map +1 -0
  99. package/dist/wallet/index.js +1 -1
  100. package/dist/wallet/index.js.map +1 -1
  101. package/dist/wallet/next/i18n.d.ts +1 -1
  102. package/dist/wallet/next/i18n.js +1 -1
  103. package/dist/wallet/next/index.js +1 -1
  104. package/dist/wallet/next/index.js.map +1 -1
  105. package/dist/wallet/next/namespaces.d.ts +1 -1
  106. package/dist/wallet/next/namespaces.js +1 -1
  107. package/dist/wallet/storage/idb.d.ts +1 -1
  108. package/dist/wallet/storage/idb.js +1 -1
  109. package/package.json +4 -6
  110. package/src/e2e/README.md +6 -6
  111. package/src/tasks/README.md +3 -3
  112. package/src/test-utils/README.md +2 -2
  113. package/src/wallet/README.md +4 -4
  114. package/dist/base-model/baseline.generated.d.ts +0 -48
  115. package/dist/base-model/baseline.generated.d.ts.map +0 -1
  116. package/dist/base-model/baseline.generated.js +0 -930
  117. package/dist/base-model/baseline.generated.js.map +0 -1
  118. package/dist/base-model/check.d.ts +0 -6
  119. package/dist/base-model/check.d.ts.map +0 -1
  120. package/dist/base-model/check.js +0 -195
  121. package/dist/base-model/check.js.map +0 -1
  122. package/dist/base-model/forward/baseline_1_0_0.d.ts +0 -3
  123. package/dist/base-model/forward/baseline_1_0_0.d.ts.map +0 -1
  124. package/dist/base-model/forward/baseline_1_0_0.js +0 -23
  125. package/dist/base-model/forward/baseline_1_0_0.js.map +0 -1
  126. package/dist/base-model/forward/index.d.ts +0 -28
  127. package/dist/base-model/forward/index.d.ts.map +0 -1
  128. package/dist/base-model/forward/index.js +0 -126
  129. package/dist/base-model/forward/index.js.map +0 -1
  130. package/dist/base-model/forward/index.test.d.ts +0 -2
  131. package/dist/base-model/forward/index.test.d.ts.map +0 -1
  132. package/dist/base-model/forward/index.test.js +0 -65
  133. package/dist/base-model/forward/index.test.js.map +0 -1
  134. package/dist/base-model/forward/policy.d.ts +0 -16
  135. package/dist/base-model/forward/policy.d.ts.map +0 -1
  136. package/dist/base-model/forward/policy.js +0 -37
  137. package/dist/base-model/forward/policy.js.map +0 -1
  138. package/dist/base-model/forward/policy.test.d.ts +0 -2
  139. package/dist/base-model/forward/policy.test.d.ts.map +0 -1
  140. package/dist/base-model/forward/policy.test.js +0 -40
  141. package/dist/base-model/forward/policy.test.js.map +0 -1
  142. package/dist/base-model/forward/types.d.ts +0 -21
  143. package/dist/base-model/forward/types.d.ts.map +0 -1
  144. package/dist/base-model/forward/types.js +0 -2
  145. package/dist/base-model/forward/types.js.map +0 -1
  146. package/dist/base-model/generate.d.ts +0 -42
  147. package/dist/base-model/generate.d.ts.map +0 -1
  148. package/dist/base-model/generate.js +0 -241
  149. package/dist/base-model/generate.js.map +0 -1
  150. package/dist/base-model/guidelines.d.ts +0 -13
  151. package/dist/base-model/guidelines.d.ts.map +0 -1
  152. package/dist/base-model/guidelines.js +0 -61
  153. package/dist/base-model/guidelines.js.map +0 -1
  154. package/dist/base-model/index.d.ts +0 -24
  155. package/dist/base-model/index.d.ts.map +0 -1
  156. package/dist/base-model/index.js +0 -29
  157. package/dist/base-model/index.js.map +0 -1
  158. package/dist/base-model/parse-structure.d.ts +0 -4
  159. package/dist/base-model/parse-structure.d.ts.map +0 -1
  160. package/dist/base-model/parse-structure.js +0 -170
  161. package/dist/base-model/parse-structure.js.map +0 -1
  162. package/dist/base-model/queries.d.ts +0 -34
  163. package/dist/base-model/queries.d.ts.map +0 -1
  164. package/dist/base-model/queries.js +0 -118
  165. package/dist/base-model/queries.js.map +0 -1
  166. package/dist/base-model/references/learn-tg.d.ts +0 -21
  167. package/dist/base-model/references/learn-tg.d.ts.map +0 -1
  168. package/dist/base-model/references/learn-tg.js +0 -65
  169. package/dist/base-model/references/learn-tg.js.map +0 -1
  170. package/dist/base-model/references/msip.d.ts +0 -29
  171. package/dist/base-model/references/msip.d.ts.map +0 -1
  172. package/dist/base-model/references/msip.js +0 -33
  173. package/dist/base-model/references/msip.js.map +0 -1
  174. package/dist/base-model/types.d.ts +0 -207
  175. package/dist/base-model/types.d.ts.map +0 -1
  176. package/dist/base-model/types.js +0 -10
  177. package/dist/base-model/types.js.map +0 -1
  178. package/dist/base-model/version.d.ts +0 -19
  179. package/dist/base-model/version.d.ts.map +0 -1
  180. package/dist/base-model/version.js +0 -26
  181. package/dist/base-model/version.js.map +0 -1
  182. package/dist/base-model/wallet-link.d.ts +0 -69
  183. package/dist/base-model/wallet-link.d.ts.map +0 -1
  184. package/dist/base-model/wallet-link.js +0 -220
  185. package/dist/base-model/wallet-link.js.map +0 -1
  186. package/dist/base-model/wallet-link.test.d.ts +0 -2
  187. package/dist/base-model/wallet-link.test.d.ts.map +0 -1
  188. package/dist/base-model/wallet-link.test.js +0 -147
  189. package/dist/base-model/wallet-link.test.js.map +0 -1
  190. package/dist/e2e/env.test.d.ts +0 -2
  191. package/dist/e2e/env.test.d.ts.map +0 -1
  192. package/dist/e2e/env.test.js +0 -72
  193. package/dist/e2e/env.test.js.map +0 -1
  194. package/dist/e2e/full-wallet.test.d.ts +0 -2
  195. package/dist/e2e/full-wallet.test.d.ts.map +0 -1
  196. package/dist/e2e/full-wallet.test.js +0 -63
  197. package/dist/e2e/full-wallet.test.js.map +0 -1
  198. package/dist/e2e/in-app-wallet.test.d.ts +0 -2
  199. package/dist/e2e/in-app-wallet.test.d.ts.map +0 -1
  200. package/dist/e2e/in-app-wallet.test.js +0 -52
  201. package/dist/e2e/in-app-wallet.test.js.map +0 -1
  202. package/dist/e2e/local-node.test.d.ts +0 -2
  203. package/dist/e2e/local-node.test.d.ts.map +0 -1
  204. package/dist/e2e/local-node.test.js +0 -43
  205. package/dist/e2e/local-node.test.js.map +0 -1
  206. package/dist/e2e/retry.test.d.ts +0 -2
  207. package/dist/e2e/retry.test.d.ts.map +0 -1
  208. package/dist/e2e/retry.test.js +0 -43
  209. package/dist/e2e/retry.test.js.map +0 -1
  210. package/dist/e2e/signer.test.d.ts +0 -2
  211. package/dist/e2e/signer.test.d.ts.map +0 -1
  212. package/dist/e2e/signer.test.js +0 -57
  213. package/dist/e2e/signer.test.js.map +0 -1
  214. package/dist/e2e/siwe-optional.test.d.ts +0 -2
  215. package/dist/e2e/siwe-optional.test.d.ts.map +0 -1
  216. package/dist/e2e/siwe-optional.test.js +0 -13
  217. package/dist/e2e/siwe-optional.test.js.map +0 -1
  218. package/dist/e2e/wallet-mock.test.d.ts +0 -2
  219. package/dist/e2e/wallet-mock.test.d.ts.map +0 -1
  220. package/dist/e2e/wallet-mock.test.js +0 -28
  221. package/dist/e2e/wallet-mock.test.js.map +0 -1
  222. package/dist/e2e/warmup.test.d.ts +0 -2
  223. package/dist/e2e/warmup.test.d.ts.map +0 -1
  224. package/dist/e2e/warmup.test.js +0 -67
  225. package/dist/e2e/warmup.test.js.map +0 -1
  226. package/dist/engine.test.d.ts +0 -2
  227. package/dist/engine.test.d.ts.map +0 -1
  228. package/dist/engine.test.js +0 -35
  229. package/dist/engine.test.js.map +0 -1
  230. package/dist/index.test.d.ts +0 -2
  231. package/dist/index.test.d.ts.map +0 -1
  232. package/dist/index.test.js +0 -11
  233. package/dist/index.test.js.map +0 -1
  234. package/dist/tasks/base-model.d.ts +0 -5
  235. package/dist/tasks/base-model.d.ts.map +0 -1
  236. package/dist/tasks/base-model.js.map +0 -1
  237. package/dist/tasks/create.test.d.ts +0 -2
  238. package/dist/tasks/create.test.d.ts.map +0 -1
  239. package/dist/tasks/create.test.js +0 -41
  240. package/dist/tasks/create.test.js.map +0 -1
  241. package/dist/tasks/e2e.test.d.ts +0 -2
  242. package/dist/tasks/e2e.test.d.ts.map +0 -1
  243. package/dist/tasks/e2e.test.js +0 -108
  244. package/dist/tasks/e2e.test.js.map +0 -1
  245. package/dist/tasks/update.test.d.ts +0 -2
  246. package/dist/tasks/update.test.d.ts.map +0 -1
  247. package/dist/tasks/update.test.js +0 -79
  248. package/dist/tasks/update.test.js.map +0 -1
  249. package/dist/tasks/warmup.test.d.ts +0 -2
  250. package/dist/tasks/warmup.test.d.ts.map +0 -1
  251. package/dist/tasks/warmup.test.js +0 -40
  252. package/dist/tasks/warmup.test.js.map +0 -1
  253. package/dist/templates/apps/nextjs/tests/index.test.ts +0 -7
  254. package/dist/templates/apps/nextjs/tests/test-utils.example.test.ts +0 -169
  255. package/dist/templates/apps/nextjs/tsconfig.test.json +0 -38
  256. package/dist/test-utils/console.test.d.ts +0 -2
  257. package/dist/test-utils/console.test.d.ts.map +0 -1
  258. package/dist/test-utils/console.test.js +0 -70
  259. package/dist/test-utils/console.test.js.map +0 -1
  260. package/dist/test-utils/kysely-mocks.test.d.ts +0 -2
  261. package/dist/test-utils/kysely-mocks.test.d.ts.map +0 -1
  262. package/dist/test-utils/kysely-mocks.test.js +0 -126
  263. package/dist/test-utils/kysely-mocks.test.js.map +0 -1
  264. package/dist/test-utils/wallet-mocks.test.d.ts +0 -2
  265. package/dist/test-utils/wallet-mocks.test.d.ts.map +0 -1
  266. package/dist/test-utils/wallet-mocks.test.js +0 -55
  267. package/dist/test-utils/wallet-mocks.test.js.map +0 -1
  268. package/dist/test-utils/wallet-setup.test.d.ts +0 -2
  269. package/dist/test-utils/wallet-setup.test.d.ts.map +0 -1
  270. package/dist/test-utils/wallet-setup.test.js +0 -18
  271. package/dist/test-utils/wallet-setup.test.js.map +0 -1
  272. package/dist/util/engines.test.d.ts +0 -2
  273. package/dist/util/engines.test.d.ts.map +0 -1
  274. package/dist/util/engines.test.js +0 -79
  275. package/dist/util/engines.test.js.map +0 -1
  276. package/dist/wallet/biometric.test.d.ts +0 -2
  277. package/dist/wallet/biometric.test.d.ts.map +0 -1
  278. package/dist/wallet/biometric.test.js +0 -44
  279. package/dist/wallet/biometric.test.js.map +0 -1
  280. package/dist/wallet/crypto.test.d.ts +0 -2
  281. package/dist/wallet/crypto.test.d.ts.map +0 -1
  282. package/dist/wallet/crypto.test.js +0 -34
  283. package/dist/wallet/crypto.test.js.map +0 -1
  284. package/dist/wallet/destinations.test.d.ts +0 -2
  285. package/dist/wallet/destinations.test.d.ts.map +0 -1
  286. package/dist/wallet/destinations.test.js +0 -34
  287. package/dist/wallet/destinations.test.js.map +0 -1
  288. package/dist/wallet/external-provider.test.d.ts +0 -2
  289. package/dist/wallet/external-provider.test.d.ts.map +0 -1
  290. package/dist/wallet/external-provider.test.js +0 -44
  291. package/dist/wallet/external-provider.test.js.map +0 -1
  292. package/dist/wallet/indexeddb.test.d.ts +0 -2
  293. package/dist/wallet/indexeddb.test.d.ts.map +0 -1
  294. package/dist/wallet/indexeddb.test.js +0 -28
  295. package/dist/wallet/indexeddb.test.js.map +0 -1
  296. package/dist/wallet/kdf.test.d.ts +0 -2
  297. package/dist/wallet/kdf.test.d.ts.map +0 -1
  298. package/dist/wallet/kdf.test.js +0 -54
  299. package/dist/wallet/kdf.test.js.map +0 -1
  300. package/dist/wallet/next/components.test.d.ts +0 -2
  301. package/dist/wallet/next/components.test.d.ts.map +0 -1
  302. package/dist/wallet/next/components.test.js +0 -122
  303. package/dist/wallet/next/components.test.js.map +0 -1
  304. package/dist/wallet/next/useInAppWallet.test.d.ts +0 -2
  305. package/dist/wallet/next/useInAppWallet.test.d.ts.map +0 -1
  306. package/dist/wallet/next/useInAppWallet.test.js +0 -261
  307. package/dist/wallet/next/useInAppWallet.test.js.map +0 -1
  308. package/dist/wallet/provider.test.d.ts +0 -2
  309. package/dist/wallet/provider.test.d.ts.map +0 -1
  310. package/dist/wallet/provider.test.js +0 -170
  311. package/dist/wallet/provider.test.js.map +0 -1
  312. package/dist/wallet/signer.test.d.ts +0 -2
  313. package/dist/wallet/signer.test.d.ts.map +0 -1
  314. package/dist/wallet/signer.test.js +0 -62
  315. package/dist/wallet/signer.test.js.map +0 -1
  316. package/dist/wallet/storage.test.d.ts +0 -2
  317. package/dist/wallet/storage.test.d.ts.map +0 -1
  318. package/dist/wallet/storage.test.js +0 -103
  319. package/dist/wallet/storage.test.js.map +0 -1
  320. package/dist/wallet/wallet.test.d.ts +0 -2
  321. package/dist/wallet/wallet.test.d.ts.map +0 -1
  322. package/dist/wallet/wallet.test.js +0 -150
  323. package/dist/wallet/wallet.test.js.map +0 -1
package/README.md CHANGED
@@ -31,12 +31,12 @@ credentials). The `usdt` payment engine lives in `@pasosdejesus/usdt`.
31
31
  | Area | Commands |
32
32
  |------|----------|
33
33
  | Scaffolding | `m:create`, `m:update` |
34
- | Database (PostgreSQL + Kysely) | `db:create`, `db:migrate`, `db:rollback`, `db:dump`, `db:restore`, `db:structure:dump/load`, `db:check`, `db:console`, `db:test` |
34
+ | Database (PostgreSQL + Kysely) | `db:create`, `db:migrate`, `db:rollback`, `db:dump`, `db:restore`, `db:structure:dump/load`, `db:console`, `db:test`, `db:seed` |
35
35
  | Wallet (replaces `cast` on OpenBSD) | `wallet:generate`, `wallet:import`, `wallet:list`, `wallet:balance`, `wallet:send`, `wallet:approve`, `wallet:call`, `wallet:sign`, `wallet:broadcast`, `wallet:keccak`, `wallet:derive` — keys in `~/.m/wallets/` with `chmod 600` |
36
36
  | Contracts | `contract:test` (EVM via `@pasosdejesus/edr`, no native binaries) |
37
37
  | AI tooling | `ai:context`, `ai:readfile`, `ai:writefile`, `ai:edit`, `ai:grep`, `ai:glob` |
38
38
  | Requirements | `req:list`, `req:show`, `req:cross`, `req:compare`, `req:sync-from-repo`, `req:sync-to-repo`, `req:list-repo`, `req:create`, `req:close` |
39
- | Engines | `m:create engine`, `eng:list`, `eng:check`, `eng:wba:setup`, `eng:credentials:setup` |
39
+ | Engines | `m:create engine`, `eng:list`, `eng:sync`, `eng:verify`, `eng:check`, `eng:setup`, `eng:wba:setup`, `eng:credentials:setup`, `eng:msip:setup`, `eng:msip:seed` |
40
40
  | Environment | `env:diff` |
41
41
 
42
42
  Subpath exports for programmatic use: `@pasosdejesus/m/i18n`,
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,153 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.29.0] - 2026-10-13
6
+
7
+ ### Added — [m/REQ/40](https://gitlab.com/pasosdeJesus/m/-/work_items/40) (glue genérico, fuentes y drift)
8
+
9
+ - **`eng:setup [<motor>]` / `eng:seed [<motor>]` (D3):** glue genérico sobre **cualquier** motor.
10
+ `eng:setup` copia las migraciones del motor (`db/migrations`) de forma idempotente; `eng:seed` carga su
11
+ seed (`db/seed.sql.gz`). `eng:msip:setup` / `eng:msip:seed` quedan como **alias** para `msip`, que
12
+ conserva su seed idempotente.
13
+ - **`eng:sync <motor> --from-git <url>#<ref> [--path <subdir>]` (D4):** toma el motor de un **subárbol
14
+ git** (materializa el `ref` en caché) y anota en `PROVENANCE.json` `kind`/`origin`/`ref`/`version`/`sha256`.
15
+ - **Drift por versión (D5):** `eng:check` marca drift tanto por cambio de **esquema** (`sha256` de
16
+ `db/structure.sql`) como por cambio de **versión** del motor; además materializa el `ref` git anotado
17
+ para medir el drift contra él.
18
+
19
+ ### Changed
20
+
21
+ - **`commands` de un motor:** se derivan de su **registro real** (`src/register.ts`), no de
22
+ `package.json:m.commands` (que duplicaba una lista que no reflejaba el registro).
23
+ - **Alcance de [m/REQ/40](https://gitlab.com/pasosdeJesus/m/-/work_items/40):** los motores `heb412_gen`/`mr519_gen` quedan **fuera** de este requerimiento
24
+ (se tratan con los consumidores que adoptan esos modelos).
25
+
26
+ ## [0.28.0] - 2026-10-12
27
+
28
+ ### Changed (breaking) — Fase 1 de `m/REQ/39`
29
+
30
+ - **`base-model` → `msip`, y el modelo sale de `m`:** ya no hay subpath `@pasosdejesus/m/base-model`
31
+ **ni `@pasosdejesus/m/msip`**: el modelo base es el motor **`@pasosdejesus/msip`** (paquete aparte,
32
+ versión propia) y `m` **lo resuelve al ejecutar** donde el consumidor lo tenga (vendorizado en
33
+ `packages/generated/msip`, o instalado). Actualizar imports (`@pasosdejesus/m/base-model` →
34
+ `@pasosdejesus/msip`, o a la copia vendorizada).
35
+ - **Comandos:** la familia `base-model:*` se retira; ahora **`eng:msip:setup` / `eng:msip:baseline` /
36
+ `eng:msip:dump` / `eng:msip:verify`**, y **`db:check` se fusiona en `eng:check`**.
37
+ - **`engine.json` → `m-engine.json`**: el manifiesto de un motor se descubre **si y sólo si** el
38
+ paquete tiene `m-engine.json` (sin `"mEngine": true` ni convención de nombre). `name`/`version`
39
+ salen del `package.json`; el montaje va en `mount`.
40
+ - **Sin material específico de consumidores** en `m`: se eliminan
41
+ `packages/m/src/msip/references/` (`msip.ts`, `learn-tg.ts`) y el export `LEARN_TG_EXTENSIONS`; lo
42
+ específico se aporta en tiempo de ejecución (`--additions`/`--extensions`).
43
+ - **Docs:** `doc/base-model-*` → `doc/engines-*`.
44
+
45
+ ### Added — Fase 2 de `m/REQ/39` (composición de motores)
46
+
47
+ - **Dos archivos por motor:** `m-engine.json` (intención, a mano) y `m-engine.generated.ts` (hechos
48
+ derivados, generado por `eng:sync`). Regla de oro: lo que se deriva no se escribe a mano.
49
+ - **`eng:sync [<motor>] [--check]`:** regenera `m-engine.generated.ts` desde las fuentes (idempotente;
50
+ `--check` no escribe y sale ≠ 0 si está desactualizado). Sin `<motor>`, opera sobre toda la composición.
51
+ - **`eng:verify [<motor>]`:** guarda el generado contra las fuentes y la intención (`GENERATED_MISSING` /
52
+ `GENERATED_STALE`) y comprueba la propiedad de `engines.<motor>.tables` (`MISSING_ENGINE` /
53
+ `UNKNOWN_TABLE` / `BROKEN_REFERENCE`). El guard del baseline `msip` pasa a **`eng:msip:verify`**.
54
+ - **Descubrimiento:** un paquete es motor **si y sólo si** tiene `m-engine.json`; `eng:list` lo halla
55
+ entre las dependencias y sigue el closure de `engines`.
56
+
57
+ ### Changed (breaking) — Fase 3 de `m/REQ/39` (el modelo `msip` sale a un motor propio)
58
+
59
+ - **Nuevo paquete `@pasosdejesus/msip`** (`packages/msip`): el modelo de msip sale de `m` (`db/structure.sql`
60
+ con su **esquema real de 40 tablas**: `usuario` + `msip_*`), más el baseline, los pasos `forward/*`,
61
+ `wallet-link` y la capa de datos. Expone la forma genérica `model` (`{ version, tables, migrations }`)
62
+ en `@pasosdejesus/msip/model`; `model.tables` se **deriva** de `src/m-engine.generated.ts` (no de una
63
+ lista a mano). Un motor exporta **todo** su esquema; el recorte es del consumidor (`engines.<motor>.tables`).
64
+ - **`eng:sync`** escribe el generado en **`src/m-engine.generated.ts`** (compilable/importable) y crea
65
+ el directorio si falta.
66
+ - **Baseline derivado del esquema:** `eng:msip:dump` regenera `baseline.generated.ts` para **todas** las
67
+ tablas del esquema (40), y `BASE_MODEL_TABLES`/`BASE_MODEL_VERSION` se **derivan** de él.
68
+ `eng:msip:setup` + `db:migrate` ahora crean las **40** (antes 5). Corregido de paso: una secuencia se
69
+ emitía una vez por cada tabla que la prefijaba (`msip_pais` ⊂ `msip_pais_histvigencia`).
70
+ - **Datos iniciales (`eng:msip:seed`)**: carga el seed del motor —subconjunto empaquetado
71
+ `db/seed.sql.gz` (catálogos + `msip_pais`/`msip_departamento`/`msip_municipio`)—; `--file <sql|gz>`
72
+ para el dataset completo (~104 MB, con centros poblados/veredas), `--force` recarga y `--check`
73
+ reporta. Atómico (`psql -1`) e idempotente.
74
+ - **`m` ya no depende del motor `msip`:** sólo figura en sus `devDependencies` (para el monorepo), así que
75
+ el manifiesto **publicado** de `m` no lo menciona; sus comandos lo resuelven al ejecutar con `import()`:
76
+ **primero** la copia vendorizada del consumidor (`packages/generated/msip/dist`, hay que compilarla con
77
+ `tsc -b`) y si no el paquete instalado; si no hay ninguno, error con instrucciones. Con eso publicar `m`
78
+ **no obliga a publicar el motor**: `msip` queda **`private`** (su `version` sirve para **trazar
79
+ procedencia** —`PROVENANCE.json`, drift—, no para el registro de npm) y los consumidores lo vendorizan
80
+ con `eng:sync --vendor`.
81
+
82
+ ### Added — Fases 4–6 de `m/REQ/39`
83
+
84
+ - **Vendorización `eng:sync <motor> --vendor [--out <dir>]`:** copia trazable de un motor a
85
+ `packages/generated/<motor>` con `PROVENANCE.json` (motor, versión, origen, `sha256`); `eng:check`
86
+ mide el **drift** de las copias vendorizadas (`ok`/`drift`/`absent`). El descubrimiento incluye
87
+ `packages/generated/*`.
88
+ - **`eng:remove <motor> [--drop]`:** quita una copia vendorizada (simétrico de `--vendor`); `--drop`
89
+ borra además las tablas del modelo. Test de ciclo completo (`agregar → poblar → consultar → quitar`)
90
+ en `tests/test-project/apps/nextjs/tests/msip-motor-lifecycle.test.ts`.
91
+ - **Autocontención en `eng:check`:** deriva "lo usado" del código (`src/**`, `app/**`; parser de `tsc`
92
+ con fallback) y lo compara con lo declarado (`engines.<motor>.tables`), reportando `missing`/`extra`.
93
+ - **Limpieza/documentación (Fase 6):** test que impide listas específicas de consumidores en `m`
94
+ (`src/consumers.test.ts`); docs del modelo renombrados de `base-model-*`/`engines-*` a **`doc/msip-*`**
95
+ (`msip-tutorial.md`, `msip-tutorial-contabilidad.md`, `msip-demo.mjs`); `doc/engines.md`, `API.md`,
96
+ `README.md` y `ARCHITECTURE.md` al día.
97
+
98
+ ### Changed — citas de requisitos y guía de agentes
99
+
100
+ - **Citas `REQ/<n>` → URL del work item** en código, docs y comentarios (política en `AGENTS.md` §10):
101
+ los requisitos de `m` apuntan a `https://gitlab.com/pasosdeJesus/m/-/work_items/<n>`, los de learn.tg
102
+ a `https://github.com/pasosdeJesus/learn.tg/issues/<n>` y los de sivel3 a
103
+ `https://github.com/pasosdeJesus/sivel3/issues/<n>`; los enlaces de GitLab `/-/issues/<n>` pasan a
104
+ `/-/work_items/<n>`. El `CHANGELOG` histórico y los bloques de código con diagramas o ejemplos quedan
105
+ como estaban.
106
+ - **`AGENTS.md`**: se añaden los comandos `ai:*` de asimilación (§1, con `ai:adJ` para OpenBSD/adJ), las
107
+ trampas estructurales (§4b), la restricción financiera (§8), el trabajo en segundo plano (§9), las
108
+ citas por URL de work item (§10) y las herramientas de búsqueda del proyecto (§11).
109
+ - **Restos de `base-model` retirados del motor `msip`**: la cabecera de las migraciones generadas cita
110
+ `m eng:msip:setup`, la ruta pasa a `msip/forward/` y las guías hablan de la versión de `msip`.
111
+
112
+ ### Added — vendorización (etapa 0) verificada
113
+
114
+ - **`eng:sync <motor> --vendor` emite un paquete compilable aparte**: `package.json` (con `exports` y
115
+ `build`/`typecheck`) y `tsconfig.json` **autónomos** en `packages/generated/<motor>`, más las
116
+ `dependencies`/`peerDependencies` declaradas por el motor. Así el consumidor compila el motor por
117
+ separado (`tsc -b`) y su app no carga ese build.
118
+ - **`eng:check --from <dir>`**: mide el drift de las copias vendorizadas contra un **checkout** del motor
119
+ (carpeta del motor o `packages/<motor>`); sin original alcanzable sólo avisa. Por defecto sigue usando
120
+ el `source` de `PROVENANCE.json`.
121
+ - Guía y lineamientos en `doc/engines.md` §12.1 (copia derivada, paquete aparte, drift, dependencias) y
122
+ nota de **fuentes futuras** (npm o subárboles git, de terceros incluidos) en `doc/diseno/engines.md`.
123
+ Verificado por `tests/test-project/apps/nextjs/tests/msip-motor-lifecycle.test.ts` (vendorizar →
124
+ compilar la copia → `eng:check --from` → quitar).
125
+ - **Guardia "el motor declara lo que usa"** en `eng:verify`: falla con `UNDECLARED_IMPORT` si el `src/`
126
+ de un motor importa un paquete que no está en sus `dependencies`/`peerDependencies`/
127
+ `optionalDependencies` (en pruebas vale `devDependencies`). Analiza el AST (`import`/`export … from`/
128
+ `require`), así que **no** cuenta el texto que el motor emite dentro de plantillas (el caso de `msip`,
129
+ cuya migración generada importa `kysely` para el consumidor).
130
+
131
+ ### Fixed
132
+
133
+ - **La suite de `tests/test-project` ya no ensucia el árbol**: los tests de BD (`db:migrate`,
134
+ `db:rollback`, `db:structure:dump`) regeneran derivados del esquema y dejaban `db/db.d.ts` (que está
135
+ versionado y usa `.config/kysely.config.ts`) convertido en un stub de 4 líneas, y `db/structure.sql`
136
+ como archivo suelto. Un `globalSetup` de vitest (`tests/test-project/apps/nextjs/tests/global-setup.ts`)
137
+ los fotografía al inicio de la corrida y los restaura al final (se propagó a la plantilla).
138
+ - **Los paquetes publicados ya no incluyen pruebas**: `files` con negaciones (`!dist/**/*.test.*`,
139
+ `!src/**/*.test.*`, `!contracts/**/*.test.*`) en `m`, `msip` y `usdt`; antes el tarball de `m` llevaba
140
+ 36 `*.test.js` (y `msip`/`usdt` sus fuentes de prueba). Verificado con `npm pack --dry-run`
141
+ ([REQ/40](https://gitlab.com/pasosdeJesus/m/-/work_items/40)).
142
+ - **Los tipos publicados ya no mencionan el motor `msip`**: `dist/util/msip.d.ts` decía
143
+ `typeof import('@pasosdejesus/msip')` y un consumidor sin el motor (con `skipLibCheck: false`) no podía
144
+ resolverlo; ahora el tipo es local a `tasks/msip.ts` (no se emite) y `util/msip.ts` valida en ejecución
145
+ los símbolos que necesita (`MSIP_SYMBOLS`), descartando versiones incompatibles.
146
+
147
+ - **Plantilla `bin/m` y `tests/test-project`**: el `bin/m` ahora importa `@pasosdejesus/mpdj` (como
148
+ documenta `ARCHITECTURE.md` §5.2). Desde la Fase 1 el plugin ya no se descubre por nombre (`@pasosdejesus/m*`)
149
+ y `mpdj` no trae `m-engine.json`, así que un proyecto generado perdía `ai:*`, `req:*` y
150
+ `eng:credentials:*`; la suite de integración lo detectó (10 fallos que ahora pasan).
151
+
5
152
  ## [0.27.2] - 2026-10-10
6
153
 
7
154
  ### Fixed
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Datos de un motor ([REQ/40](https://gitlab.com/pasosdeJesus/m/-/work_items/40) D3): sus migraciones y su seed,
3
+ * declarados por convención, para que `eng:setup`/`eng:seed` operen sobre
4
+ * **cualquier** motor y no sólo `msip`.
5
+ *
6
+ * - Migraciones: `<motor>/db/migrations/*.{ts,sql}`.
7
+ * - Seed: `<motor>/db/seed.sql.gz` (o `db/seed.sql`).
8
+ *
9
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
10
+ */
11
+ /** Directorio de migraciones de un motor (`db/migrations`, por convención), o `null`. */
12
+ export declare function motorMigrationDir(dir: string): string | null;
13
+ /** Archivos de migración que el motor trae (`.ts`/`.sql`), ordenados. */
14
+ export declare function motorMigrationFiles(dir: string): string[];
15
+ export interface MigrationPlan {
16
+ /** Directorio de migraciones del motor, o `null` si no trae. */
17
+ sourceDir: string | null;
18
+ /** Migraciones que ya están en el consumidor. */
19
+ present: string[];
20
+ /** Migraciones que faltan en el consumidor. */
21
+ missing: string[];
22
+ }
23
+ /**
24
+ * Qué migraciones de un motor faltan en el consumidor (idempotente): `eng:setup`
25
+ * sólo copia las que no están.
26
+ */
27
+ export declare function planMigrationCopy(motorDir: string, outDir: string): MigrationPlan;
28
+ /** Archivo de seed que el motor trae (`db/seed.sql.gz` o `db/seed.sql`), o `null`. */
29
+ export declare function motorSeedFile(dir: string): string | null;
30
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/compose/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAIzD;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAQjF;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKxD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Datos de un motor ([REQ/40](https://gitlab.com/pasosdeJesus/m/-/work_items/40) D3): sus migraciones y su seed,
3
+ * declarados por convención, para que `eng:setup`/`eng:seed` operen sobre
4
+ * **cualquier** motor y no sólo `msip`.
5
+ *
6
+ * - Migraciones: `<motor>/db/migrations/*.{ts,sql}`.
7
+ * - Seed: `<motor>/db/seed.sql.gz` (o `db/seed.sql`).
8
+ *
9
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
10
+ */
11
+ import { existsSync, readdirSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ /** Directorio de migraciones de un motor (`db/migrations`, por convención), o `null`. */
14
+ export function motorMigrationDir(dir) {
15
+ const candidate = join(dir, 'db', 'migrations');
16
+ return existsSync(candidate) ? candidate : null;
17
+ }
18
+ /** Archivos de migración que el motor trae (`.ts`/`.sql`), ordenados. */
19
+ export function motorMigrationFiles(dir) {
20
+ const migrationsDir = motorMigrationDir(dir);
21
+ if (!migrationsDir)
22
+ return [];
23
+ return readdirSync(migrationsDir).filter((file) => file.endsWith('.ts') || file.endsWith('.sql')).sort();
24
+ }
25
+ /**
26
+ * Qué migraciones de un motor faltan en el consumidor (idempotente): `eng:setup`
27
+ * sólo copia las que no están.
28
+ */
29
+ export function planMigrationCopy(motorDir, outDir) {
30
+ const files = motorMigrationFiles(motorDir);
31
+ const existing = existsSync(outDir) ? readdirSync(outDir) : [];
32
+ return {
33
+ sourceDir: motorMigrationDir(motorDir),
34
+ present: files.filter((file) => existing.includes(file)),
35
+ missing: files.filter((file) => !existing.includes(file)),
36
+ };
37
+ }
38
+ /** Archivo de seed que el motor trae (`db/seed.sql.gz` o `db/seed.sql`), o `null`. */
39
+ export function motorSeedFile(dir) {
40
+ for (const candidate of ['db/seed.sql.gz', 'db/seed.sql']) {
41
+ if (existsSync(join(dir, candidate)))
42
+ return join(dir, candidate);
43
+ }
44
+ return null;
45
+ }
46
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/compose/data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IAC/C,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,CAAC,aAAa;QAAE,OAAO,EAAE,CAAA;IAC7B,OAAO,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1G,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,MAAc;IAChE,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9D,OAAO;QACL,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACtC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KAC1D,CAAA;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,KAAK,MAAM,SAAS,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC;QAC1D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACnE,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Motor derivation (https://gitlab.com/pasosdeJesus/m/-/work_items/39, §3.4): the facts `eng:sync` reads from a package's
3
+ * sources and writes into `m-engine.generated.ts`.
4
+ *
5
+ * Derivable → generated: `name`/`version` (package.json), `model.migrations`
6
+ * (convention), `model.tables` (the motor's reference
7
+ * structure), `contracts` (`contracts/contracts/*.sol`),
8
+ * `views` (`src/components`, `assets`).
9
+ * Intention → `m-engine.json`: `mount`, `engines`, `provides`/`requires`.
10
+ *
11
+ * "Porque ¿quién de vosotros, queriendo edificar una torre, no se sienta primero y calcula los gastos…?" (Lucas 14:28)
12
+ */
13
+ import type { Derived } from './manifest.js';
14
+ /** Header of a generated file; `eng:sync` writes it verbatim. */
15
+ export declare const GENERATED_HEADER = "// m-engine.generated.ts \u2014 generado por `eng:sync`; no editar a mano.";
16
+ /** Name of the generated file. */
17
+ export declare const GENERATED_FILENAME = "m-engine.generated.ts";
18
+ /**
19
+ * Generated facts live under `src/` (like `baseline.generated.ts`) so they
20
+ * compile and can be imported by the motor's `model` subpath. `eng:sync` writes
21
+ * them there and `eng:verify` reads them from there.
22
+ */
23
+ export declare const GENERATED_RELATIVE = "src/m-engine.generated.ts";
24
+ /**
25
+ * Tablas de una estructura de referencia (`pg_dump`): `CREATE TABLE [ONLY] public.<tabla> (`.
26
+ * Mismo patrón que `msip/src/parse-structure.ts`; aquí sólo se derivan los **nombres** para
27
+ * `m-engine.generated.ts` (el inventario completo de columnas/restricciones vive en el motor).
28
+ */
29
+ export declare function structureTables(sql: string): string[];
30
+ /**
31
+ * Tables of a motor's own model, derived from its **reference structure**
32
+ * (`db/structure.sql`), never from scanning all migrations (which have
33
+ * `DROP`/`RENAME`). A motor with no structure has no model tables (`[]`).
34
+ */
35
+ export declare function deriveTables(dir: string): string[];
36
+ /** Migrations directory, by convention `db/migrations` when it exists. */
37
+ export declare function deriveMigrations(dir: string): string | undefined;
38
+ /** Solidity contract names, from `contracts/contracts/*.sol` (skipping `_`-prefixed mocks). */
39
+ export declare function deriveContracts(dir: string): string[];
40
+ /** Views: React components under `src/components` and an `assets` directory. */
41
+ export declare function deriveViews(dir: string): Derived['views'];
42
+ /**
43
+ * Commands the motor registers (design §3.4: lo que el motor registra
44
+ * (`register.ts`/exports); nombres `eng:{motor}:*`). Se leen del módulo de registro
45
+ * del motor (`src/register.ts` o `register.ts`) extrayendo sus literales
46
+ * `eng:*`; ya **no** de `package.json:m.commands`, que duplicaba una lista que no
47
+ * reflejaba el registro real.
48
+ */
49
+ export declare function deriveCommands(dir: string): string[];
50
+ /**
51
+ * Build the derived facts of a motor. Key order is fixed so the generated file
52
+ * is byte-identical across runs (idempotent, diffable).
53
+ */
54
+ export declare function deriveFrom(dir: string, name: string, version: string, pkg?: unknown): Derived;
55
+ /** Render `m-engine.generated.ts` from the derived facts (pure JSON body + `as const`). */
56
+ export declare function renderGenerated(derived: Derived): string;
57
+ /** Read and parse the generated facts, or `null` when absent/unreadable. */
58
+ export declare function readGenerated(dir: string): Derived | null;
59
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/compose/derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,iEAAiE;AACjE,eAAO,MAAM,gBAAgB,+EAA0E,CAAA;AAEvG,kCAAkC;AAClC,eAAO,MAAM,kBAAkB,0BAA0B,CAAA;AAEzD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,8BAA8B,CAAA;AAK7D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAIrD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOlD;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAOrD;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWpD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAc7F;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAWzD"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Motor derivation (https://gitlab.com/pasosdeJesus/m/-/work_items/39, §3.4): the facts `eng:sync` reads from a package's
3
+ * sources and writes into `m-engine.generated.ts`.
4
+ *
5
+ * Derivable → generated: `name`/`version` (package.json), `model.migrations`
6
+ * (convention), `model.tables` (the motor's reference
7
+ * structure), `contracts` (`contracts/contracts/*.sol`),
8
+ * `views` (`src/components`, `assets`).
9
+ * Intention → `m-engine.json`: `mount`, `engines`, `provides`/`requires`.
10
+ *
11
+ * "Porque ¿quién de vosotros, queriendo edificar una torre, no se sienta primero y calcula los gastos…?" (Lucas 14:28)
12
+ */
13
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ /** Header of a generated file; `eng:sync` writes it verbatim. */
16
+ export const GENERATED_HEADER = '// m-engine.generated.ts — generado por `eng:sync`; no editar a mano.';
17
+ /** Name of the generated file. */
18
+ export const GENERATED_FILENAME = 'm-engine.generated.ts';
19
+ /**
20
+ * Generated facts live under `src/` (like `baseline.generated.ts`) so they
21
+ * compile and can be imported by the motor's `model` subpath. `eng:sync` writes
22
+ * them there and `eng:verify` reads them from there.
23
+ */
24
+ export const GENERATED_RELATIVE = `src/${GENERATED_FILENAME}`;
25
+ /** Reference structures a motor may ship (the "current inventory", like the baseline). */
26
+ const STRUCTURE_CANDIDATES = ['db/structure.sql', 'db/schema.sql'];
27
+ /**
28
+ * Tablas de una estructura de referencia (`pg_dump`): `CREATE TABLE [ONLY] public.<tabla> (`.
29
+ * Mismo patrón que `msip/src/parse-structure.ts`; aquí sólo se derivan los **nombres** para
30
+ * `m-engine.generated.ts` (el inventario completo de columnas/restricciones vive en el motor).
31
+ */
32
+ export function structureTables(sql) {
33
+ const found = new Set();
34
+ for (const match of sql.matchAll(/^CREATE TABLE (?:ONLY )?public\.(\w+) \(\r?\n/gm))
35
+ found.add(match[1]);
36
+ return [...found].sort();
37
+ }
38
+ /**
39
+ * Tables of a motor's own model, derived from its **reference structure**
40
+ * (`db/structure.sql`), never from scanning all migrations (which have
41
+ * `DROP`/`RENAME`). A motor with no structure has no model tables (`[]`).
42
+ */
43
+ export function deriveTables(dir) {
44
+ for (const candidate of STRUCTURE_CANDIDATES) {
45
+ const file = join(dir, candidate);
46
+ if (!existsSync(file))
47
+ continue;
48
+ return structureTables(readFileSync(file, 'utf-8'));
49
+ }
50
+ return [];
51
+ }
52
+ /** Migrations directory, by convention `db/migrations` when it exists. */
53
+ export function deriveMigrations(dir) {
54
+ return existsSync(join(dir, 'db', 'migrations')) ? 'db/migrations' : undefined;
55
+ }
56
+ /** Solidity contract names, from `contracts/contracts/*.sol` (skipping `_`-prefixed mocks). */
57
+ export function deriveContracts(dir) {
58
+ const contractsDir = join(dir, 'contracts', 'contracts');
59
+ if (!existsSync(contractsDir))
60
+ return [];
61
+ return readdirSync(contractsDir)
62
+ .filter((file) => file.endsWith('.sol') && !file.startsWith('_'))
63
+ .map((file) => file.replace(/\.sol$/, ''))
64
+ .sort();
65
+ }
66
+ /** Views: React components under `src/components` and an `assets` directory. */
67
+ export function deriveViews(dir) {
68
+ const componentsDir = join(dir, 'src', 'components');
69
+ const components = existsSync(componentsDir)
70
+ ? readdirSync(componentsDir)
71
+ .filter((file) => /\.tsx?$/.test(file) && !/\.test\./.test(file))
72
+ .map((file) => file.replace(/\.tsx?$/, ''))
73
+ .filter((name) => name !== 'index')
74
+ .sort()
75
+ : [];
76
+ const assets = existsSync(join(dir, 'assets')) ? 'assets' : undefined;
77
+ if (components.length === 0 && !assets)
78
+ return undefined;
79
+ return { components, ...(assets ? { assets } : {}) };
80
+ }
81
+ /**
82
+ * Commands the motor registers (design §3.4: lo que el motor registra
83
+ * (`register.ts`/exports); nombres `eng:{motor}:*`). Se leen del módulo de registro
84
+ * del motor (`src/register.ts` o `register.ts`) extrayendo sus literales
85
+ * `eng:*`; ya **no** de `package.json:m.commands`, que duplicaba una lista que no
86
+ * reflejaba el registro real.
87
+ */
88
+ export function deriveCommands(dir) {
89
+ const register = ['src/register.ts', 'register.ts']
90
+ .map((file) => join(dir, file))
91
+ .find((file) => existsSync(file));
92
+ if (!register)
93
+ return [];
94
+ const text = readFileSync(register, 'utf-8');
95
+ const found = new Set();
96
+ for (const match of text.matchAll(/['"`](eng:[a-zA-Z0-9_-]+(?::[a-zA-Z0-9_-]+)+)['"`]/g)) {
97
+ found.add(match[1]);
98
+ }
99
+ return [...found].sort();
100
+ }
101
+ /**
102
+ * Build the derived facts of a motor. Key order is fixed so the generated file
103
+ * is byte-identical across runs (idempotent, diffable).
104
+ */
105
+ export function deriveFrom(dir, name, version, pkg) {
106
+ const migrations = deriveMigrations(dir);
107
+ const derived = {
108
+ name,
109
+ version,
110
+ model: { tables: deriveTables(dir), ...(migrations ? { migrations } : {}) },
111
+ };
112
+ const contracts = deriveContracts(dir);
113
+ if (contracts.length > 0)
114
+ derived.contracts = contracts;
115
+ const commands = deriveCommands(dir);
116
+ if (commands.length > 0)
117
+ derived.commands = commands;
118
+ const views = deriveViews(dir);
119
+ if (views)
120
+ derived.views = views;
121
+ return derived;
122
+ }
123
+ /** Render `m-engine.generated.ts` from the derived facts (pure JSON body + `as const`). */
124
+ export function renderGenerated(derived) {
125
+ return `${GENERATED_HEADER}\nexport const engine = ${JSON.stringify(derived, null, 2)} as const;\n`;
126
+ }
127
+ /** Read and parse the generated facts, or `null` when absent/unreadable. */
128
+ export function readGenerated(dir) {
129
+ const file = join(dir, GENERATED_RELATIVE);
130
+ if (!existsSync(file))
131
+ return null;
132
+ const text = readFileSync(file, 'utf-8');
133
+ const match = text.match(/export const engine = (\{[\s\S]*\}) as const/);
134
+ if (!match)
135
+ return null;
136
+ try {
137
+ return JSON.parse(match[1]);
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/compose/derive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Engine discovery (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D5): a package is a motor **iff** it ships an
3
+ * `m-engine.json` (the file is the marker; no `mEngine` flag nor naming). `m`
4
+ * finds the motors among the dependencies (`packages/*`) and follows the
5
+ * **closure** of what each motor declares in `engines`.
6
+ *
7
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
8
+ */
9
+ import type { EngineManifest, Intention } from './manifest.js';
10
+ export interface PackageJson {
11
+ name?: string;
12
+ version?: string;
13
+ dependencies?: Record<string, string>;
14
+ peerDependencies?: Record<string, string>;
15
+ optionalDependencies?: Record<string, string>;
16
+ devDependencies?: Record<string, string>;
17
+ }
18
+ /** Read `m-engine.json` (the intention), or `null` when the package is not a motor. */
19
+ export declare function readIntention(dir: string): Intention | null;
20
+ /** Read `package.json` (name/version), or `null` when absent/unreadable. */
21
+ export declare function readPackageJson(dir: string): PackageJson | null;
22
+ /** Resolve a single motor directory into a manifest (intention + derived facts). */
23
+ export declare function readEngineManifest(dir: string, fallbackName?: string): EngineManifest | null;
24
+ /** Discover the motors of a monorepo by reading the marker under `packages/`. */
25
+ export declare function discoverEngines(rootDir: string): Promise<EngineManifest[]>;
26
+ /**
27
+ * Closure of a set of motors: the requested motors **plus** everything they
28
+ * declare in `engines`, transitively. Deterministic order (roots first, then
29
+ * declared dependencies, depth-first).
30
+ */
31
+ export declare function engineClosure(roots: readonly string[], byName: ReadonlyMap<string, EngineManifest>): EngineManifest[];
32
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/compose/discover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9D,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACzC;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ3D;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQ/D;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAQ5F;AAED,iFAAiF;AACjF,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAoBhF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAC1C,cAAc,EAAE,CAalB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Engine discovery (https://gitlab.com/pasosdeJesus/m/-/work_items/39, D5): a package is a motor **iff** it ships an
3
+ * `m-engine.json` (the file is the marker; no `mEngine` flag nor naming). `m`
4
+ * finds the motors among the dependencies (`packages/*`) and follows the
5
+ * **closure** of what each motor declares in `engines`.
6
+ *
7
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
8
+ */
9
+ import { existsSync, readFileSync } from 'node:fs';
10
+ import { readdir } from 'node:fs/promises';
11
+ import { basename, join } from 'node:path';
12
+ import { deriveFrom, readGenerated } from './derive.js';
13
+ /** Read `m-engine.json` (the intention), or `null` when the package is not a motor. */
14
+ export function readIntention(dir) {
15
+ const file = join(dir, 'm-engine.json');
16
+ if (!existsSync(file))
17
+ return null;
18
+ try {
19
+ return JSON.parse(readFileSync(file, 'utf-8'));
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Read `package.json` (name/version), or `null` when absent/unreadable. */
26
+ export function readPackageJson(dir) {
27
+ const file = join(dir, 'package.json');
28
+ if (!existsSync(file))
29
+ return null;
30
+ try {
31
+ return JSON.parse(readFileSync(file, 'utf-8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ /** Resolve a single motor directory into a manifest (intention + derived facts). */
38
+ export function readEngineManifest(dir, fallbackName) {
39
+ const intention = readIntention(dir);
40
+ if (!intention)
41
+ return null;
42
+ const pkg = readPackageJson(dir);
43
+ const name = pkg?.name ?? fallbackName ?? basename(dir);
44
+ const version = pkg?.version ?? '0.0.0';
45
+ const derived = readGenerated(dir) ?? deriveFrom(dir, name, version, pkg);
46
+ return { ...derived, ...intention, name, version, dir };
47
+ }
48
+ /** Discover the motors of a monorepo by reading the marker under `packages/`. */
49
+ export async function discoverEngines(rootDir) {
50
+ const packagesDir = join(rootDir, 'packages');
51
+ const manifests = [];
52
+ const scan = async (dir) => {
53
+ let entries;
54
+ try {
55
+ entries = await readdir(dir, { withFileTypes: true });
56
+ }
57
+ catch {
58
+ return;
59
+ }
60
+ for (const entry of entries) {
61
+ if (!entry.isDirectory())
62
+ continue;
63
+ const manifest = readEngineManifest(join(dir, entry.name), entry.name);
64
+ if (manifest)
65
+ manifests.push(manifest);
66
+ }
67
+ };
68
+ await scan(packagesDir);
69
+ // Copias vendorizadas (https://gitlab.com/pasosdeJesus/m/-/work_items/39 D17): `packages/generated/<motor>`.
70
+ await scan(join(packagesDir, 'generated'));
71
+ return manifests;
72
+ }
73
+ /**
74
+ * Closure of a set of motors: the requested motors **plus** everything they
75
+ * declare in `engines`, transitively. Deterministic order (roots first, then
76
+ * declared dependencies, depth-first).
77
+ */
78
+ export function engineClosure(roots, byName) {
79
+ const seen = new Set();
80
+ const out = [];
81
+ const visit = (name) => {
82
+ if (seen.has(name))
83
+ return;
84
+ seen.add(name);
85
+ const manifest = byName.get(name);
86
+ if (!manifest)
87
+ return;
88
+ out.push(manifest);
89
+ for (const dep of Object.keys(manifest.engines ?? {}))
90
+ visit(dep);
91
+ };
92
+ for (const name of roots)
93
+ visit(name);
94
+ return out;
95
+ }
96
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/compose/discover.ts"],"names":[],"mappings":"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"}