@mantajs/cli 0.2.0-beta.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 (282) hide show
  1. package/bin/manta.mjs +20 -0
  2. package/bin/manta.ts +13 -0
  3. package/dist/admin/generate-admin-config.d.ts +8 -0
  4. package/dist/admin/generate-admin-config.d.ts.map +1 -0
  5. package/dist/admin/generate-admin-config.js +127 -0
  6. package/dist/admin/generate-admin-config.js.map +1 -0
  7. package/dist/ai/chat-handler.d.ts +10 -0
  8. package/dist/ai/chat-handler.d.ts.map +1 -0
  9. package/dist/ai/chat-handler.js +1353 -0
  10. package/dist/ai/chat-handler.js.map +1 -0
  11. package/dist/bootstrap/boot.d.ts +25 -0
  12. package/dist/bootstrap/boot.d.ts.map +1 -0
  13. package/dist/bootstrap/boot.js +344 -0
  14. package/dist/bootstrap/boot.js.map +1 -0
  15. package/dist/bootstrap/bootstrap-app.d.ts +71 -0
  16. package/dist/bootstrap/bootstrap-app.d.ts.map +1 -0
  17. package/dist/bootstrap/bootstrap-app.js +308 -0
  18. package/dist/bootstrap/bootstrap-app.js.map +1 -0
  19. package/dist/bootstrap/bootstrap-context.d.ts +76 -0
  20. package/dist/bootstrap/bootstrap-context.d.ts.map +1 -0
  21. package/dist/bootstrap/bootstrap-context.js +4 -0
  22. package/dist/bootstrap/bootstrap-context.js.map +1 -0
  23. package/dist/bootstrap/bootstrap-helpers.d.ts +71 -0
  24. package/dist/bootstrap/bootstrap-helpers.d.ts.map +1 -0
  25. package/dist/bootstrap/bootstrap-helpers.js +373 -0
  26. package/dist/bootstrap/bootstrap-helpers.js.map +1 -0
  27. package/dist/bootstrap/generate-types.d.ts +7 -0
  28. package/dist/bootstrap/generate-types.d.ts.map +1 -0
  29. package/dist/bootstrap/generate-types.js +832 -0
  30. package/dist/bootstrap/generate-types.js.map +1 -0
  31. package/dist/bootstrap/phases/assemble/index.d.ts +5 -0
  32. package/dist/bootstrap/phases/assemble/index.d.ts.map +1 -0
  33. package/dist/bootstrap/phases/assemble/index.js +5 -0
  34. package/dist/bootstrap/phases/assemble/index.js.map +1 -0
  35. package/dist/bootstrap/phases/assemble/load-links.d.ts +3 -0
  36. package/dist/bootstrap/phases/assemble/load-links.d.ts.map +1 -0
  37. package/dist/bootstrap/phases/assemble/load-links.js +160 -0
  38. package/dist/bootstrap/phases/assemble/load-links.js.map +1 -0
  39. package/dist/bootstrap/phases/assemble/load-modules.d.ts +3 -0
  40. package/dist/bootstrap/phases/assemble/load-modules.d.ts.map +1 -0
  41. package/dist/bootstrap/phases/assemble/load-modules.js +163 -0
  42. package/dist/bootstrap/phases/assemble/load-modules.js.map +1 -0
  43. package/dist/bootstrap/phases/assemble/load-resources.d.ts +3 -0
  44. package/dist/bootstrap/phases/assemble/load-resources.d.ts.map +1 -0
  45. package/dist/bootstrap/phases/assemble/load-resources.js +270 -0
  46. package/dist/bootstrap/phases/assemble/load-resources.js.map +1 -0
  47. package/dist/bootstrap/phases/assemble/wire-commands.d.ts +3 -0
  48. package/dist/bootstrap/phases/assemble/wire-commands.d.ts.map +1 -0
  49. package/dist/bootstrap/phases/assemble/wire-commands.js +408 -0
  50. package/dist/bootstrap/phases/assemble/wire-commands.js.map +1 -0
  51. package/dist/bootstrap/phases/assemble-modules.d.ts +3 -0
  52. package/dist/bootstrap/phases/assemble-modules.d.ts.map +1 -0
  53. package/dist/bootstrap/phases/assemble-modules.js +14 -0
  54. package/dist/bootstrap/phases/assemble-modules.js.map +1 -0
  55. package/dist/bootstrap/phases/build-app.d.ts +3 -0
  56. package/dist/bootstrap/phases/build-app.d.ts.map +1 -0
  57. package/dist/bootstrap/phases/build-app.js +15 -0
  58. package/dist/bootstrap/phases/build-app.js.map +1 -0
  59. package/dist/bootstrap/phases/discover-resources.d.ts +3 -0
  60. package/dist/bootstrap/phases/discover-resources.d.ts.map +1 -0
  61. package/dist/bootstrap/phases/discover-resources.js +60 -0
  62. package/dist/bootstrap/phases/discover-resources.js.map +1 -0
  63. package/dist/bootstrap/phases/index.d.ts +7 -0
  64. package/dist/bootstrap/phases/index.d.ts.map +1 -0
  65. package/dist/bootstrap/phases/index.js +7 -0
  66. package/dist/bootstrap/phases/index.js.map +1 -0
  67. package/dist/bootstrap/phases/init-infra.d.ts +3 -0
  68. package/dist/bootstrap/phases/init-infra.d.ts.map +1 -0
  69. package/dist/bootstrap/phases/init-infra.js +193 -0
  70. package/dist/bootstrap/phases/init-infra.js.map +1 -0
  71. package/dist/bootstrap/phases/seed-dev-users.d.ts +3 -0
  72. package/dist/bootstrap/phases/seed-dev-users.d.ts.map +1 -0
  73. package/dist/bootstrap/phases/seed-dev-users.js +93 -0
  74. package/dist/bootstrap/phases/seed-dev-users.js.map +1 -0
  75. package/dist/bootstrap/phases/wire/auth-helpers.d.ts +12 -0
  76. package/dist/bootstrap/phases/wire/auth-helpers.d.ts.map +1 -0
  77. package/dist/bootstrap/phases/wire/auth-helpers.js +25 -0
  78. package/dist/bootstrap/phases/wire/auth-helpers.js.map +1 -0
  79. package/dist/bootstrap/phases/wire/contexts/context-registry.d.ts +4 -0
  80. package/dist/bootstrap/phases/wire/contexts/context-registry.d.ts.map +1 -0
  81. package/dist/bootstrap/phases/wire/contexts/context-registry.js +96 -0
  82. package/dist/bootstrap/phases/wire/contexts/context-registry.js.map +1 -0
  83. package/dist/bootstrap/phases/wire/contexts/cqrs-routes.d.ts +3 -0
  84. package/dist/bootstrap/phases/wire/contexts/cqrs-routes.d.ts.map +1 -0
  85. package/dist/bootstrap/phases/wire/contexts/cqrs-routes.js +138 -0
  86. package/dist/bootstrap/phases/wire/contexts/cqrs-routes.js.map +1 -0
  87. package/dist/bootstrap/phases/wire/contexts/index.d.ts +6 -0
  88. package/dist/bootstrap/phases/wire/contexts/index.d.ts.map +1 -0
  89. package/dist/bootstrap/phases/wire/contexts/index.js +6 -0
  90. package/dist/bootstrap/phases/wire/contexts/index.js.map +1 -0
  91. package/dist/bootstrap/phases/wire/contexts/query-endpoints.d.ts +3 -0
  92. package/dist/bootstrap/phases/wire/contexts/query-endpoints.d.ts.map +1 -0
  93. package/dist/bootstrap/phases/wire/contexts/query-endpoints.js +116 -0
  94. package/dist/bootstrap/phases/wire/contexts/query-endpoints.js.map +1 -0
  95. package/dist/bootstrap/phases/wire/contexts/spa-warnings.d.ts +3 -0
  96. package/dist/bootstrap/phases/wire/contexts/spa-warnings.d.ts.map +1 -0
  97. package/dist/bootstrap/phases/wire/contexts/spa-warnings.js +17 -0
  98. package/dist/bootstrap/phases/wire/contexts/spa-warnings.js.map +1 -0
  99. package/dist/bootstrap/phases/wire/contexts/user-routes.d.ts +3 -0
  100. package/dist/bootstrap/phases/wire/contexts/user-routes.d.ts.map +1 -0
  101. package/dist/bootstrap/phases/wire/contexts/user-routes.js +83 -0
  102. package/dist/bootstrap/phases/wire/contexts/user-routes.js.map +1 -0
  103. package/dist/bootstrap/phases/wire/index.d.ts +5 -0
  104. package/dist/bootstrap/phases/wire/index.d.ts.map +1 -0
  105. package/dist/bootstrap/phases/wire/index.js +5 -0
  106. package/dist/bootstrap/phases/wire/index.js.map +1 -0
  107. package/dist/bootstrap/phases/wire/wire-adapter.d.ts +12 -0
  108. package/dist/bootstrap/phases/wire/wire-adapter.d.ts.map +1 -0
  109. package/dist/bootstrap/phases/wire/wire-adapter.js +156 -0
  110. package/dist/bootstrap/phases/wire/wire-adapter.js.map +1 -0
  111. package/dist/bootstrap/phases/wire/wire-auth.d.ts +3 -0
  112. package/dist/bootstrap/phases/wire/wire-auth.d.ts.map +1 -0
  113. package/dist/bootstrap/phases/wire/wire-auth.js +46 -0
  114. package/dist/bootstrap/phases/wire/wire-auth.js.map +1 -0
  115. package/dist/bootstrap/phases/wire/wire-contexts.d.ts +3 -0
  116. package/dist/bootstrap/phases/wire/wire-contexts.d.ts.map +1 -0
  117. package/dist/bootstrap/phases/wire/wire-contexts.js +15 -0
  118. package/dist/bootstrap/phases/wire/wire-contexts.js.map +1 -0
  119. package/dist/bootstrap/phases/wire/wire-cron-routes.d.ts +3 -0
  120. package/dist/bootstrap/phases/wire/wire-cron-routes.d.ts.map +1 -0
  121. package/dist/bootstrap/phases/wire/wire-cron-routes.js +102 -0
  122. package/dist/bootstrap/phases/wire/wire-cron-routes.js.map +1 -0
  123. package/dist/bootstrap/phases/wire/wire-extras.d.ts +3 -0
  124. package/dist/bootstrap/phases/wire/wire-extras.d.ts.map +1 -0
  125. package/dist/bootstrap/phases/wire/wire-extras.js +305 -0
  126. package/dist/bootstrap/phases/wire/wire-extras.js.map +1 -0
  127. package/dist/bootstrap/phases/wire/wire-workflow-routes.d.ts +3 -0
  128. package/dist/bootstrap/phases/wire/wire-workflow-routes.d.ts.map +1 -0
  129. package/dist/bootstrap/phases/wire/wire-workflow-routes.js +212 -0
  130. package/dist/bootstrap/phases/wire/wire-workflow-routes.js.map +1 -0
  131. package/dist/bootstrap/phases/wire-http.d.ts +3 -0
  132. package/dist/bootstrap/phases/wire-http.d.ts.map +1 -0
  133. package/dist/bootstrap/phases/wire-http.js +10 -0
  134. package/dist/bootstrap/phases/wire-http.js.map +1 -0
  135. package/dist/bootstrap/validate-generated-ts.d.ts +6 -0
  136. package/dist/bootstrap/validate-generated-ts.d.ts.map +1 -0
  137. package/dist/bootstrap/validate-generated-ts.js +26 -0
  138. package/dist/bootstrap/validate-generated-ts.js.map +1 -0
  139. package/dist/build/generate-manifest.d.ts +10 -0
  140. package/dist/build/generate-manifest.d.ts.map +1 -0
  141. package/dist/build/generate-manifest.js +138 -0
  142. package/dist/build/generate-manifest.js.map +1 -0
  143. package/dist/cli.d.ts +3 -0
  144. package/dist/cli.d.ts.map +1 -0
  145. package/dist/cli.js +421 -0
  146. package/dist/cli.js.map +1 -0
  147. package/dist/commands/build.d.ts +21 -0
  148. package/dist/commands/build.d.ts.map +1 -0
  149. package/dist/commands/build.js +399 -0
  150. package/dist/commands/build.js.map +1 -0
  151. package/dist/commands/db/create.d.ts +17 -0
  152. package/dist/commands/db/create.d.ts.map +1 -0
  153. package/dist/commands/db/create.js +94 -0
  154. package/dist/commands/db/create.js.map +1 -0
  155. package/dist/commands/db/diff.d.ts +39 -0
  156. package/dist/commands/db/diff.d.ts.map +1 -0
  157. package/dist/commands/db/diff.js +81 -0
  158. package/dist/commands/db/diff.js.map +1 -0
  159. package/dist/commands/db/generate.d.ts +58 -0
  160. package/dist/commands/db/generate.d.ts.map +1 -0
  161. package/dist/commands/db/generate.js +138 -0
  162. package/dist/commands/db/generate.js.map +1 -0
  163. package/dist/commands/db/migrate.d.ts +29 -0
  164. package/dist/commands/db/migrate.d.ts.map +1 -0
  165. package/dist/commands/db/migrate.js +118 -0
  166. package/dist/commands/db/migrate.js.map +1 -0
  167. package/dist/commands/db/pg-deps.d.ts +30 -0
  168. package/dist/commands/db/pg-deps.d.ts.map +1 -0
  169. package/dist/commands/db/pg-deps.js +178 -0
  170. package/dist/commands/db/pg-deps.js.map +1 -0
  171. package/dist/commands/db/rollback.d.ts +21 -0
  172. package/dist/commands/db/rollback.d.ts.map +1 -0
  173. package/dist/commands/db/rollback.js +85 -0
  174. package/dist/commands/db/rollback.js.map +1 -0
  175. package/dist/commands/db/types.d.ts +113 -0
  176. package/dist/commands/db/types.d.ts.map +1 -0
  177. package/dist/commands/db/types.js +4 -0
  178. package/dist/commands/db/types.js.map +1 -0
  179. package/dist/commands/dev.d.ts +12 -0
  180. package/dist/commands/dev.d.ts.map +1 -0
  181. package/dist/commands/dev.js +79 -0
  182. package/dist/commands/dev.js.map +1 -0
  183. package/dist/commands/exec.d.ts +21 -0
  184. package/dist/commands/exec.d.ts.map +1 -0
  185. package/dist/commands/exec.js +148 -0
  186. package/dist/commands/exec.js.map +1 -0
  187. package/dist/commands/generate.d.ts +11 -0
  188. package/dist/commands/generate.d.ts.map +1 -0
  189. package/dist/commands/generate.js +19 -0
  190. package/dist/commands/generate.js.map +1 -0
  191. package/dist/commands/init.d.ts +14 -0
  192. package/dist/commands/init.d.ts.map +1 -0
  193. package/dist/commands/init.js +476 -0
  194. package/dist/commands/init.js.map +1 -0
  195. package/dist/commands/start.d.ts +15 -0
  196. package/dist/commands/start.d.ts.map +1 -0
  197. package/dist/commands/start.js +121 -0
  198. package/dist/commands/start.js.map +1 -0
  199. package/dist/commands/user.d.ts +19 -0
  200. package/dist/commands/user.d.ts.map +1 -0
  201. package/dist/commands/user.js +125 -0
  202. package/dist/commands/user.js.map +1 -0
  203. package/dist/config/load-config.d.ts +23 -0
  204. package/dist/config/load-config.d.ts.map +1 -0
  205. package/dist/config/load-config.js +105 -0
  206. package/dist/config/load-config.js.map +1 -0
  207. package/dist/config/load-env.d.ts +11 -0
  208. package/dist/config/load-env.d.ts.map +1 -0
  209. package/dist/config/load-env.js +61 -0
  210. package/dist/config/load-env.js.map +1 -0
  211. package/dist/config/resolve-adapters.d.ts +23 -0
  212. package/dist/config/resolve-adapters.d.ts.map +1 -0
  213. package/dist/config/resolve-adapters.js +96 -0
  214. package/dist/config/resolve-adapters.js.map +1 -0
  215. package/dist/index.d.ts +18 -0
  216. package/dist/index.d.ts.map +1 -0
  217. package/dist/index.js +19 -0
  218. package/dist/index.js.map +1 -0
  219. package/dist/jiti.d.ts +2 -0
  220. package/dist/jiti.d.ts.map +1 -0
  221. package/dist/jiti.js +2 -0
  222. package/dist/jiti.js.map +1 -0
  223. package/dist/openapi/generate-spec.d.ts +56 -0
  224. package/dist/openapi/generate-spec.d.ts.map +1 -0
  225. package/dist/openapi/generate-spec.js +491 -0
  226. package/dist/openapi/generate-spec.js.map +1 -0
  227. package/dist/openapi/index.d.ts +4 -0
  228. package/dist/openapi/index.d.ts.map +1 -0
  229. package/dist/openapi/index.js +3 -0
  230. package/dist/openapi/index.js.map +1 -0
  231. package/dist/openapi/swagger-html.d.ts +2 -0
  232. package/dist/openapi/swagger-html.d.ts.map +1 -0
  233. package/dist/openapi/swagger-html.js +29 -0
  234. package/dist/openapi/swagger-html.js.map +1 -0
  235. package/dist/plugins/merge-resources.d.ts +18 -0
  236. package/dist/plugins/merge-resources.d.ts.map +1 -0
  237. package/dist/plugins/merge-resources.js +76 -0
  238. package/dist/plugins/merge-resources.js.map +1 -0
  239. package/dist/plugins/resolve-plugins.d.ts +14 -0
  240. package/dist/plugins/resolve-plugins.d.ts.map +1 -0
  241. package/dist/plugins/resolve-plugins.js +73 -0
  242. package/dist/plugins/resolve-plugins.js.map +1 -0
  243. package/dist/resource-loader.d.ts +151 -0
  244. package/dist/resource-loader.d.ts.map +1 -0
  245. package/dist/resource-loader.js +456 -0
  246. package/dist/resource-loader.js.map +1 -0
  247. package/dist/route-discovery.d.ts +33 -0
  248. package/dist/route-discovery.d.ts.map +1 -0
  249. package/dist/route-discovery.js +69 -0
  250. package/dist/route-discovery.js.map +1 -0
  251. package/dist/server-bootstrap.d.ts +38 -0
  252. package/dist/server-bootstrap.d.ts.map +1 -0
  253. package/dist/server-bootstrap.js +21 -0
  254. package/dist/server-bootstrap.js.map +1 -0
  255. package/dist/spa/generate-spa.d.ts +15 -0
  256. package/dist/spa/generate-spa.d.ts.map +1 -0
  257. package/dist/spa/generate-spa.js +357 -0
  258. package/dist/spa/generate-spa.js.map +1 -0
  259. package/dist/templates/agent/nextjs.md +129 -0
  260. package/dist/templates/agent/nuxt.md +98 -0
  261. package/dist/templates/agent/standalone.md +498 -0
  262. package/dist/types.d.ts +145 -0
  263. package/dist/types.d.ts.map +1 -0
  264. package/dist/types.js +3 -0
  265. package/dist/types.js.map +1 -0
  266. package/dist/utils/colors.d.ts +7 -0
  267. package/dist/utils/colors.d.ts.map +1 -0
  268. package/dist/utils/colors.js +8 -0
  269. package/dist/utils/colors.js.map +1 -0
  270. package/dist/utils/logger.d.ts +10 -0
  271. package/dist/utils/logger.d.ts.map +1 -0
  272. package/dist/utils/logger.js +27 -0
  273. package/dist/utils/logger.js.map +1 -0
  274. package/dist/utils/prompts.d.ts +6 -0
  275. package/dist/utils/prompts.d.ts.map +1 -0
  276. package/dist/utils/prompts.js +28 -0
  277. package/dist/utils/prompts.js.map +1 -0
  278. package/dist/utils/spinner.d.ts +7 -0
  279. package/dist/utils/spinner.d.ts.map +1 -0
  280. package/dist/utils/spinner.js +20 -0
  281. package/dist/utils/spinner.js.map +1 -0
  282. package/package.json +80 -0
@@ -0,0 +1,178 @@
1
+ // Real PostgreSQL implementations of DB command dependencies
2
+ // Uses the 'postgres' library directly (same as adapter-drizzle-pg)
3
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ import postgres from 'postgres';
6
+ /**
7
+ * Create a DbClient from a postgres connection URL.
8
+ * Also exposes the raw postgres sql instance for parameterized queries.
9
+ */
10
+ export function createPgClient(url) {
11
+ const sql = postgres(url, { max: 3 });
12
+ const client = {
13
+ __pgSql: sql,
14
+ async execute(query) {
15
+ await sql.unsafe(query);
16
+ },
17
+ async query(query) {
18
+ const rows = await sql.unsafe(query);
19
+ return [...rows];
20
+ },
21
+ async transaction(fn) {
22
+ return await sql.begin(async (txSql) => {
23
+ const txClient = {
24
+ async execute(query) {
25
+ await txSql.unsafe(query);
26
+ },
27
+ async query(query) {
28
+ const rows = await txSql.unsafe(query);
29
+ return [...rows];
30
+ },
31
+ async transaction(fn) {
32
+ // Nested transaction via savepoint
33
+ return await txSql.savepoint(async (spSql) => {
34
+ const spClient = {
35
+ execute: async (q) => {
36
+ await spSql.unsafe(q);
37
+ },
38
+ query: async (q) => {
39
+ const r = await spSql.unsafe(q);
40
+ return [...r];
41
+ },
42
+ transaction: async () => {
43
+ throw new Error('Max nesting reached');
44
+ },
45
+ close: async () => { },
46
+ };
47
+ return await fn(spClient);
48
+ });
49
+ },
50
+ async close() { },
51
+ };
52
+ return await fn(txClient);
53
+ });
54
+ },
55
+ async close() {
56
+ await sql.end({ timeout: 5 });
57
+ },
58
+ };
59
+ return client;
60
+ }
61
+ /**
62
+ * Create a DbClient for the 'postgres' maintenance database.
63
+ * Used by db:create command.
64
+ */
65
+ export function createPgCreateDeps() {
66
+ return {
67
+ async connectMaintenance(url) {
68
+ return createPgClient(url);
69
+ },
70
+ };
71
+ }
72
+ /**
73
+ * Advisory-lock-based migration lock using pg_advisory_lock.
74
+ */
75
+ export function createMigrationLock(client) {
76
+ const LOCK_ID = 123456789; // Fixed advisory lock ID for Manta migrations
77
+ return {
78
+ async acquire(options) {
79
+ const timeoutMs = options?.timeoutMs ?? 10_000;
80
+ const retryMs = options?.retryMs ?? 50;
81
+ const start = Date.now();
82
+ while (Date.now() - start < timeoutMs) {
83
+ const rows = await client.query(`SELECT pg_try_advisory_lock(${LOCK_ID}) as locked`);
84
+ if (rows[0]?.locked)
85
+ return true;
86
+ await new Promise((r) => setTimeout(r, retryMs));
87
+ }
88
+ return false;
89
+ },
90
+ async release() {
91
+ await client.query(`SELECT pg_advisory_unlock(${LOCK_ID})`);
92
+ },
93
+ async forceRelease() {
94
+ await client.query(`SELECT pg_advisory_unlock_all()`);
95
+ },
96
+ };
97
+ }
98
+ /**
99
+ * Migration tracker backed by a _manta_migrations table.
100
+ * Accepts a DbClient with the __pgSql raw postgres instance for parameterized queries.
101
+ */
102
+ export function createMigrationTracker(client) {
103
+ const pgSql = client.__pgSql;
104
+ return {
105
+ async ensureTable() {
106
+ await client.execute(`
107
+ CREATE TABLE IF NOT EXISTS _manta_migrations (
108
+ id SERIAL PRIMARY KEY,
109
+ name TEXT NOT NULL UNIQUE,
110
+ applied_sql TEXT,
111
+ applied_at TIMESTAMPTZ DEFAULT NOW()
112
+ )
113
+ `);
114
+ },
115
+ async getApplied() {
116
+ const rows = await client.query(`SELECT name FROM _manta_migrations ORDER BY id ASC`);
117
+ return rows.map((r) => r.name);
118
+ },
119
+ async record(name, appliedSql) {
120
+ if (pgSql) {
121
+ // Use parameterized query via postgres tagged template to prevent SQL injection
122
+ await pgSql `INSERT INTO _manta_migrations (name, applied_sql) VALUES (${name}, ${appliedSql})`;
123
+ }
124
+ else {
125
+ // Fallback for test clients — escape single quotes
126
+ const safeName = name.replace(/'/g, "''");
127
+ const safeSql = appliedSql.replace(/'/g, "''");
128
+ await client.execute(`INSERT INTO _manta_migrations (name, applied_sql) VALUES ('${safeName}', '${safeSql}')`);
129
+ }
130
+ },
131
+ async remove(name) {
132
+ if (pgSql) {
133
+ // Use parameterized query via postgres tagged template to prevent SQL injection
134
+ await pgSql `DELETE FROM _manta_migrations WHERE name = ${name}`;
135
+ }
136
+ else {
137
+ // Fallback for test clients — escape single quotes
138
+ const safeName = name.replace(/'/g, "''");
139
+ await client.execute(`DELETE FROM _manta_migrations WHERE name = '${safeName}'`);
140
+ }
141
+ },
142
+ };
143
+ }
144
+ /**
145
+ * Filesystem-based migration file operations.
146
+ */
147
+ export function createMigrationFs(migrationsDir) {
148
+ return {
149
+ async listMigrationFiles() {
150
+ if (!existsSync(migrationsDir))
151
+ return [];
152
+ const entries = readdirSync(migrationsDir, { withFileTypes: true });
153
+ return entries
154
+ .filter((e) => e.isFile() && e.name.endsWith('.sql') && !e.name.endsWith('.down.sql'))
155
+ .map((e) => e.name.replace('.sql', ''))
156
+ .sort();
157
+ },
158
+ async readMigrationSql(name) {
159
+ return readFileSync(resolve(migrationsDir, `${name}.sql`), 'utf-8');
160
+ },
161
+ async readRollbackSql(name) {
162
+ const path = resolve(migrationsDir, `${name}.down.sql`);
163
+ if (!existsSync(path))
164
+ return null;
165
+ return readFileSync(path, 'utf-8');
166
+ },
167
+ rollbackFileExists(name) {
168
+ return existsSync(resolve(migrationsDir, `${name}.down.sql`));
169
+ },
170
+ readRollbackContent(name) {
171
+ const path = resolve(migrationsDir, `${name}.down.sql`);
172
+ if (!existsSync(path))
173
+ return null;
174
+ return readFileSync(path, 'utf-8');
175
+ },
176
+ };
177
+ }
178
+ //# sourceMappingURL=pg-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-deps.js","sourceRoot":"","sources":["../../../src/commands/db/pg-deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { RollbackDeps } from './types';
2
+ export interface RollbackOptions {
3
+ steps?: number;
4
+ }
5
+ export interface RollbackCommandResult {
6
+ exitCode: number;
7
+ errors: string[];
8
+ rolledBack: string[];
9
+ }
10
+ /**
11
+ * Validate a rollback SQL file.
12
+ * Returns null if valid, error message if invalid.
13
+ */
14
+ export declare function validateRollbackFile(filePath: string, cwd?: string): string | null;
15
+ /**
16
+ * manta db:rollback — Rollback the last N migrations.
17
+ * Stops at first failure. Best-effort.
18
+ * Accepts injectable deps for testability (hexagonal architecture).
19
+ */
20
+ export declare function rollbackCommand(options: RollbackOptions | undefined, deps: RollbackDeps): Promise<RollbackCommandResult>;
21
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../../src/commands/db/rollback.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAkBjG;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,YAAK,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAkEhC"}
@@ -0,0 +1,85 @@
1
+ // SPEC-014 — manta db:rollback command
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ // Rollback validation uses content inspection (no SQL = skeleton only)
5
+ /**
6
+ * Validate a rollback SQL file.
7
+ * Returns null if valid, error message if invalid.
8
+ */
9
+ export function validateRollbackFile(filePath, cwd = process.cwd()) {
10
+ const fullPath = resolve(cwd, filePath);
11
+ if (!existsSync(fullPath)) {
12
+ return `Rollback file not found: ${filePath}\nCreate the rollback SQL manually and try again.`;
13
+ }
14
+ const content = readFileSync(fullPath, 'utf-8').trim();
15
+ // Detect unmodified skeleton (all lines are comments or empty)
16
+ const hasRealSql = content.split('\n').some((line) => {
17
+ const trimmed = line.trim();
18
+ return trimmed.length > 0 && !trimmed.startsWith('--');
19
+ });
20
+ if (!hasRealSql) {
21
+ return `Rollback file has no SQL: ${filePath}\nIt contains only comments. Write the rollback SQL or revert your model and run \`manta db:generate\`.`;
22
+ }
23
+ return null;
24
+ }
25
+ /**
26
+ * manta db:rollback — Rollback the last N migrations.
27
+ * Stops at first failure. Best-effort.
28
+ * Accepts injectable deps for testability (hexagonal architecture).
29
+ */
30
+ export async function rollbackCommand(options = {}, deps) {
31
+ const result = { exitCode: 0, errors: [], rolledBack: [] };
32
+ const steps = options.steps ?? 1;
33
+ // Step 1: Get applied migrations
34
+ const applied = await deps.tracker.getApplied();
35
+ if (applied.length === 0) {
36
+ return result;
37
+ }
38
+ // Step 2: Take the last N applied migrations in reverse order
39
+ const toRollback = applied.slice(-steps).reverse();
40
+ // Step 3: For each migration in reverse order
41
+ for (const name of toRollback) {
42
+ // Check if rollback file exists
43
+ if (!deps.fs.rollbackFileExists(name)) {
44
+ result.exitCode = 1;
45
+ result.errors.push(`Rollback file not found: ${name}\nCreate the rollback SQL manually and try again.`);
46
+ break;
47
+ }
48
+ // Check if rollback file has real SQL (not just comments/skeleton)
49
+ const content = deps.fs.readRollbackContent(name);
50
+ const hasRealSql = content
51
+ ? content.split('\n').some((line) => {
52
+ const trimmed = line.trim();
53
+ return trimmed.length > 0 && !trimmed.startsWith('--');
54
+ })
55
+ : false;
56
+ if (!hasRealSql) {
57
+ result.exitCode = 1;
58
+ result.errors.push(`Rollback file has no SQL: ${name}\nIt contains only comments. Write the rollback SQL or revert your model and run \`manta db:generate\`.`);
59
+ break;
60
+ }
61
+ // Execute the rollback SQL in a transaction
62
+ try {
63
+ const sql = await deps.fs.readRollbackSql(name);
64
+ if (!sql) {
65
+ result.exitCode = 1;
66
+ result.errors.push(`Could not read rollback SQL for ${name}`);
67
+ break;
68
+ }
69
+ await deps.db.transaction(async (tx) => {
70
+ await tx.execute(sql);
71
+ });
72
+ // Update tracking
73
+ await deps.tracker.remove(name);
74
+ result.rolledBack.push(name);
75
+ }
76
+ catch (err) {
77
+ result.exitCode = 1;
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ result.errors.push(`Rollback failed for ${name}: ${message}\nDatabase may be in an inconsistent state. Consider using a forward fix.`);
80
+ break;
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../../src/commands/db/rollback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Minimal DB operations needed by CLI commands.
3
+ * This is NOT IDatabasePort — it's a focused subset for the CLI.
4
+ */
5
+ export interface DbClient {
6
+ /** Execute raw SQL */
7
+ execute(sql: string): Promise<void>;
8
+ /** Execute SQL and return rows */
9
+ query<T = Record<string, unknown>>(sql: string): Promise<T[]>;
10
+ /** Run a function inside a transaction */
11
+ transaction<T>(fn: (tx: DbClient) => Promise<T>): Promise<T>;
12
+ /** Close the connection */
13
+ close(): Promise<void>;
14
+ }
15
+ /**
16
+ * Migration lock operations.
17
+ */
18
+ export interface MigrationLock {
19
+ acquire(options?: {
20
+ timeoutMs?: number;
21
+ retryMs?: number;
22
+ }): Promise<boolean>;
23
+ release(): Promise<void>;
24
+ forceRelease(): Promise<void>;
25
+ }
26
+ /**
27
+ * Migration tracking — records which migrations have been applied.
28
+ */
29
+ export interface MigrationTracker {
30
+ /** Ensure the tracking table exists */
31
+ ensureTable(): Promise<void>;
32
+ /** Get list of applied migration names */
33
+ getApplied(): Promise<string[]>;
34
+ /** Record a migration as applied */
35
+ record(name: string, sql: string): Promise<void>;
36
+ /** Remove a migration from tracking (rollback) */
37
+ remove(name: string): Promise<void>;
38
+ }
39
+ /**
40
+ * Filesystem operations for migrations.
41
+ */
42
+ export interface MigrationFs {
43
+ /** List migration SQL files in order */
44
+ listMigrationFiles(): Promise<string[]>;
45
+ /** Read a migration file's SQL content */
46
+ readMigrationSql(name: string): Promise<string>;
47
+ /** Read a rollback (.down.sql) file */
48
+ readRollbackSql(name: string): Promise<string | null>;
49
+ /** Check if a rollback file exists */
50
+ rollbackFileExists(name: string): boolean;
51
+ /** Read rollback file content (may be TODO placeholder) */
52
+ readRollbackContent(name: string): string | null;
53
+ }
54
+ /**
55
+ * Dependencies for db:migrate command.
56
+ */
57
+ export interface MigrateDeps {
58
+ db: DbClient;
59
+ lock: MigrationLock;
60
+ tracker: MigrationTracker;
61
+ fs: MigrationFs;
62
+ }
63
+ /**
64
+ * Dependencies for db:rollback command.
65
+ */
66
+ export interface RollbackDeps {
67
+ db: DbClient;
68
+ tracker: MigrationTracker;
69
+ fs: MigrationFs;
70
+ }
71
+ /**
72
+ * Dependencies for db:create command.
73
+ */
74
+ export interface CreateDeps {
75
+ /** Connect to the 'postgres' maintenance database */
76
+ connectMaintenance(url: string): Promise<DbClient>;
77
+ }
78
+ /**
79
+ * Dependencies for db:diff command.
80
+ */
81
+ export interface DiffDeps {
82
+ db: DbClient;
83
+ }
84
+ /**
85
+ * Drizzle-kit abstraction for generate command.
86
+ */
87
+ export interface DrizzleKitRunner {
88
+ generate(entities: Array<{
89
+ name: string;
90
+ file: string;
91
+ }>): Promise<{
92
+ migrationFile: string | null;
93
+ sql: string | null;
94
+ }>;
95
+ }
96
+ /**
97
+ * Filesystem operations specific to generate command.
98
+ */
99
+ export interface GenerateMigrationFs {
100
+ writeRollbackSkeleton(migrationFile: string): Promise<void>;
101
+ writeDrizzleSchema(entities: Array<{
102
+ name: string;
103
+ file: string;
104
+ }>): Promise<void>;
105
+ }
106
+ /**
107
+ * Dependencies for db:generate command.
108
+ */
109
+ export interface GenerateDeps {
110
+ drizzleKit: DrizzleKitRunner;
111
+ migrationFs: GenerateMigrationFs;
112
+ }
113
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/db/types.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,sBAAsB;IACtB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,kCAAkC;IAClC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7D,0CAA0C;IAC1C,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5D,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACxB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,0CAA0C;IAC1C,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/B,oCAAoC;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,kDAAkD;IAClD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvC,0CAA0C;IAC1C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC/C,uCAAuC;IACvC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACrD,sCAAsC;IACtC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,2DAA2D;IAC3D,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,QAAQ,CAAA;IACZ,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,gBAAgB,CAAA;IACzB,EAAE,EAAE,WAAW,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAA;IACZ,OAAO,EAAE,gBAAgB,CAAA;IACzB,EAAE,EAAE,WAAW,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,QAAQ,CAAA;CACb;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC;QACjE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KACnB,CAAC,CAAA;CACH;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnF;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,gBAAgB,CAAA;IAC5B,WAAW,EAAE,mBAAmB,CAAA;CACjC"}
@@ -0,0 +1,4 @@
1
+ // Common dependency interfaces for DB commands
2
+ // These allow port injection for testability (hexagonal architecture)
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/db/types.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,sEAAsE"}
@@ -0,0 +1,12 @@
1
+ import type { DevOptions } from '../types';
2
+ export type { MantaRequest } from '../server-bootstrap';
3
+ export interface DevCommandResult {
4
+ exitCode: number;
5
+ errors: string[];
6
+ warnings: string[];
7
+ }
8
+ /**
9
+ * manta dev — Start Nitro dev server.
10
+ */
11
+ export declare function devCommand(options?: DevOptions, cwd?: string): Promise<DevCommandResult>;
12
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAA;AAExD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoFjH"}
@@ -0,0 +1,79 @@
1
+ // SPEC-070 — manta dev command
2
+ // Starts the Nitro dev server.
3
+ import { loadConfig, validateConfigForCommand } from '../config/load-config';
4
+ import { loadEnv } from '../config/load-env';
5
+ /**
6
+ * manta dev — Start Nitro dev server.
7
+ */
8
+ export async function devCommand(options = {}, cwd = process.cwd()) {
9
+ const result = { exitCode: 0, errors: [], warnings: [] };
10
+ // [1] Load .env
11
+ const envResult = loadEnv(cwd);
12
+ result.warnings.push(...envResult.warnings);
13
+ // [2] Load config
14
+ let config;
15
+ try {
16
+ config = await loadConfig(cwd);
17
+ }
18
+ catch (err) {
19
+ result.exitCode = 1;
20
+ result.errors.push(err instanceof Error ? err.message : String(err));
21
+ return result;
22
+ }
23
+ // [3] Validate
24
+ const validationErrors = validateConfigForCommand(config, 'dev');
25
+ if (validationErrors.length > 0) {
26
+ result.exitCode = 1;
27
+ result.errors.push(...validationErrors);
28
+ return result;
29
+ }
30
+ const port = options.port ?? (Number(process.env.PORT) || undefined) ?? config.http?.port ?? 3000;
31
+ // [4] Legacy src/admin/ removed — V2 uses src/spa/{name}/ exclusively
32
+ const viteConfigPath = undefined;
33
+ // [5] Generate .manta/generated.d.ts (codegen for typed step proxy)
34
+ try {
35
+ const { generateTypesFromModules } = await import('../bootstrap/generate-types');
36
+ await generateTypesFromModules(cwd);
37
+ }
38
+ catch (err) {
39
+ result.warnings.push(`Types generation failed: ${err instanceof Error ? err.message : String(err)}`);
40
+ }
41
+ // [5b] Auto-detect SPAs from src/spa/{name}/ + merge defaults with config overrides
42
+ const spaEntries = [];
43
+ {
44
+ const { discoverResources } = await import('../resource-loader');
45
+ const resources = await discoverResources(cwd);
46
+ if (resources.spas.length > 0) {
47
+ const { generateSpaArtifacts } = await import('../spa/generate-spa');
48
+ const { SPA_DEFAULTS } = await import('@mantajs/core');
49
+ const configOverrides = config.spa ?? {};
50
+ let nextPort = 5200;
51
+ for (const spa of resources.spas) {
52
+ const override = configOverrides[spa.name] ?? {};
53
+ const dashboard = override.dashboard === null ? undefined : (override.dashboard ?? SPA_DEFAULTS.dashboard);
54
+ const preset = override.preset === null ? undefined : (override.preset ?? SPA_DEFAULTS.preset);
55
+ const viteConfig = generateSpaArtifacts({ cwd, spa, dashboard, preset, port });
56
+ spaEntries.push({ name: spa.name, viteConfigPath: viteConfig, vitePort: nextPort++ });
57
+ console.log(` SPA: /${spa.name} (${spa.pages.length} pages${dashboard ? `, ${dashboard}` : ', custom'}${preset ? ` + ${preset}` : ''})`);
58
+ }
59
+ }
60
+ }
61
+ // [6] Launch dev server via @mantajs/host-nitro
62
+ console.log(`\n Starting Manta dev server on port ${port}...`);
63
+ console.log(` Nitro\n`);
64
+ const { startDevServer } = await import('@mantajs/host-nitro');
65
+ const server = await startDevServer({ cwd, port, viteConfigPath, spas: spaEntries });
66
+ // Block until process exits (or server is closed)
67
+ await new Promise((resolve) => {
68
+ process.on('SIGINT', async () => {
69
+ await server.close();
70
+ resolve();
71
+ });
72
+ process.on('SIGTERM', async () => {
73
+ await server.close();
74
+ resolve();
75
+ });
76
+ });
77
+ return result;
78
+ }
79
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TestMantaApp } from '@mantajs/core';
2
+ import type { ExecOptions } from '../types';
3
+ export interface ExecCommandResult {
4
+ exitCode: number;
5
+ errors: string[];
6
+ }
7
+ /**
8
+ * manta exec — Execute a script with the framework app loaded.
9
+ * Uses the ResourceLoader to discover and wire all project resources
10
+ * (modules, workflows, subscribers) — same boot path as manta dev.
11
+ * --dry-run: wraps in a transaction and rolls back.
12
+ */
13
+ export declare function execCommand(options: ExecOptions, cwd?: string): Promise<ExecCommandResult>;
14
+ /**
15
+ * ResourceLoader-based bootstrap -- discovers and wires all project resources.
16
+ * Same discovery logic as manta dev lazy boot (steps 9-18).
17
+ *
18
+ * Loads: modules, workflows, subscribers.
19
+ */
20
+ export declare function resourceLoaderBootstrap(app: TestMantaApp, cwd: string): Promise<void>;
21
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAW,YAAY,EAAsB,MAAM,eAAe,CAAA;AAU9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuD/G;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiE3F"}