@mindflight/mindbrain-personal-studio 0.6.1

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 (166) hide show
  1. package/.env.example +50 -0
  2. package/README.md +134 -0
  3. package/bin/mindbrain-studio.mjs +20 -0
  4. package/build/client/_app/immutable/assets/2.BXRKVU9n.css +1 -0
  5. package/build/client/_app/immutable/assets/2.BXRKVU9n.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.BXRKVU9n.css.gz +0 -0
  7. package/build/client/_app/immutable/chunks/-OSExkSk.js +2 -0
  8. package/build/client/_app/immutable/chunks/-OSExkSk.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/-OSExkSk.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/BIHI7g3E.js +1 -0
  11. package/build/client/_app/immutable/chunks/BIHI7g3E.js.br +2 -0
  12. package/build/client/_app/immutable/chunks/BIHI7g3E.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BJB7pSge.js +1 -0
  14. package/build/client/_app/immutable/chunks/BJB7pSge.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BJB7pSge.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/BNUkRZqg.js +1 -0
  17. package/build/client/_app/immutable/chunks/BNUkRZqg.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BNUkRZqg.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/BP2JbIUZ.js +1 -0
  20. package/build/client/_app/immutable/chunks/BP2JbIUZ.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BP2JbIUZ.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BVrgUHq-.js +1 -0
  23. package/build/client/_app/immutable/chunks/BVrgUHq-.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BVrgUHq-.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/BmeSanva.js +1 -0
  26. package/build/client/_app/immutable/chunks/BmeSanva.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BmeSanva.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/BnkCgNCx.js +1 -0
  29. package/build/client/_app/immutable/chunks/BnkCgNCx.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BnkCgNCx.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/C5KYKPa8.js +311 -0
  32. package/build/client/_app/immutable/chunks/C5KYKPa8.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/C5KYKPa8.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/CBDzfqXr.js +1 -0
  35. package/build/client/_app/immutable/chunks/CBDzfqXr.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/CBDzfqXr.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/Cp9dXlPT.js +1 -0
  38. package/build/client/_app/immutable/chunks/Cp9dXlPT.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/Cp9dXlPT.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/D0daF8Eh.js +2 -0
  41. package/build/client/_app/immutable/chunks/D0daF8Eh.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/D0daF8Eh.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/D4SoBmS0.js +1 -0
  44. package/build/client/_app/immutable/chunks/D4SoBmS0.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/D4SoBmS0.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/DpVrWha3.js +1 -0
  47. package/build/client/_app/immutable/chunks/DpVrWha3.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/DpVrWha3.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/DyXQogav.js +1 -0
  50. package/build/client/_app/immutable/chunks/DyXQogav.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/DyXQogav.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/Gs0cNFYG.js +1 -0
  53. package/build/client/_app/immutable/chunks/Gs0cNFYG.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/Gs0cNFYG.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/NXeHtWpC.js +1 -0
  56. package/build/client/_app/immutable/chunks/NXeHtWpC.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/NXeHtWpC.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/i0D5dc1Y.js +1 -0
  59. package/build/client/_app/immutable/chunks/i0D5dc1Y.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/i0D5dc1Y.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/nnWk1BBo.js +1 -0
  62. package/build/client/_app/immutable/chunks/nnWk1BBo.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/nnWk1BBo.js.gz +0 -0
  64. package/build/client/_app/immutable/entry/app.CVz6aYsT.js +2 -0
  65. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.br +0 -0
  66. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.gz +0 -0
  67. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js +1 -0
  68. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.br +2 -0
  69. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js +1 -0
  71. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/0.C2sXq0eH.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js +1 -0
  74. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.gz +0 -0
  76. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js +9 -0
  77. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js.br +0 -0
  78. package/build/client/_app/immutable/nodes/2.D0pSa9ko.js.gz +0 -0
  79. package/build/client/_app/version.json +1 -0
  80. package/build/client/_app/version.json.br +0 -0
  81. package/build/client/_app/version.json.gz +0 -0
  82. package/build/client/robots.txt +3 -0
  83. package/build/client/robots.txt.br +0 -0
  84. package/build/client/robots.txt.gz +0 -0
  85. package/build/env.js +70 -0
  86. package/build/env.js.map +1 -0
  87. package/build/handler.js +26 -0
  88. package/build/handler.js.map +1 -0
  89. package/build/index.js +149 -0
  90. package/build/index.js.map +1 -0
  91. package/build/server/chunks/chunks/edgeLinkModes.js-CfRqrZtd.js +50 -0
  92. package/build/server/chunks/chunks/edgeLinkModes.js-CfRqrZtd.js.map +1 -0
  93. package/build/server/chunks/chunks/environment.js-Bf8x1V_n.js +16 -0
  94. package/build/server/chunks/chunks/environment.js-Bf8x1V_n.js.map +1 -0
  95. package/build/server/chunks/chunks/exports.js-DFR3riS9.js +217 -0
  96. package/build/server/chunks/chunks/exports.js-DFR3riS9.js.map +1 -0
  97. package/build/server/chunks/chunks/false.js-CRHihH2U.js +4 -0
  98. package/build/server/chunks/chunks/false.js-CRHihH2U.js.map +1 -0
  99. package/build/server/chunks/chunks/graphRepository.js-D2DARfVY.js +280 -0
  100. package/build/server/chunks/chunks/graphRepository.js-D2DARfVY.js.map +1 -0
  101. package/build/server/chunks/chunks/internal.js-D8EA_he2.js +119 -0
  102. package/build/server/chunks/chunks/internal.js-D8EA_he2.js.map +1 -0
  103. package/build/server/chunks/chunks/mindbrainClient.js-BFAJqRSL.js +108 -0
  104. package/build/server/chunks/chunks/mindbrainClient.js-BFAJqRSL.js.map +1 -0
  105. package/build/server/chunks/chunks/ontologyInspect.js-Dm3l7KgF.js +13 -0
  106. package/build/server/chunks/chunks/ontologyInspect.js-Dm3l7KgF.js.map +1 -0
  107. package/build/server/chunks/chunks/render-context.js-CTu5Wkzp.js +475 -0
  108. package/build/server/chunks/chunks/render-context.js-CTu5Wkzp.js.map +1 -0
  109. package/build/server/chunks/chunks/renderer.js-DsOhU1UZ.js +1243 -0
  110. package/build/server/chunks/chunks/renderer.js-DsOhU1UZ.js.map +1 -0
  111. package/build/server/chunks/chunks/root.js-DCnlE3XY.js +2815 -0
  112. package/build/server/chunks/chunks/root.js-DCnlE3XY.js.map +1 -0
  113. package/build/server/chunks/chunks/shared-server.js-DaWdgxVh.js +11 -0
  114. package/build/server/chunks/chunks/shared-server.js-DaWdgxVh.js.map +1 -0
  115. package/build/server/chunks/chunks/shared.js-DuDDTJVi.js +1338 -0
  116. package/build/server/chunks/chunks/shared.js-DuDDTJVi.js.map +1 -0
  117. package/build/server/chunks/chunks/utils.js-DGYJFmnf.js +39 -0
  118. package/build/server/chunks/chunks/utils.js-DGYJFmnf.js.map +1 -0
  119. package/build/server/chunks/entries/endpoints/api/brain/_...path_/_server.ts.js-MgPpKBks.js +82 -0
  120. package/build/server/chunks/entries/endpoints/api/brain/_...path_/_server.ts.js-MgPpKBks.js.map +1 -0
  121. package/build/server/chunks/entries/endpoints/api/brain/health/_server.ts.js-DnJQNmWV.js +19 -0
  122. package/build/server/chunks/entries/endpoints/api/brain/health/_server.ts.js-DnJQNmWV.js.map +1 -0
  123. package/build/server/chunks/entries/endpoints/api/graph/_server.ts.js-Bxo7qHVz.js +37 -0
  124. package/build/server/chunks/entries/endpoints/api/graph/_server.ts.js-Bxo7qHVz.js.map +1 -0
  125. package/build/server/chunks/entries/endpoints/api/graph/count/_server.ts.js-BajaLnqp.js +37 -0
  126. package/build/server/chunks/entries/endpoints/api/graph/count/_server.ts.js-BajaLnqp.js.map +1 -0
  127. package/build/server/chunks/entries/endpoints/api/graph/ontologies/_server.ts.js-BFq2mbbX.js +146 -0
  128. package/build/server/chunks/entries/endpoints/api/graph/ontologies/_server.ts.js-BFq2mbbX.js.map +1 -0
  129. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js +154 -0
  130. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js.map +1 -0
  131. package/build/server/chunks/entries/endpoints/api/projections/catalog/_server.ts.js-Ds1RymA0.js +351 -0
  132. package/build/server/chunks/entries/endpoints/api/projections/catalog/_server.ts.js-Ds1RymA0.js.map +1 -0
  133. package/build/server/chunks/entries/fallbacks/error.svelte.js-B7V4yZjo.js +51 -0
  134. package/build/server/chunks/entries/fallbacks/error.svelte.js-B7V4yZjo.js.map +1 -0
  135. package/build/server/chunks/entries/pages/_layout.svelte.js-CoC9BAeH.js +15 -0
  136. package/build/server/chunks/entries/pages/_layout.svelte.js-CoC9BAeH.js.map +1 -0
  137. package/build/server/chunks/entries/pages/_page.svelte.js-DMEbD3K6.js +891 -0
  138. package/build/server/chunks/entries/pages/_page.svelte.js-DMEbD3K6.js.map +1 -0
  139. package/build/server/chunks/handler-BjXBCd1c.js +1698 -0
  140. package/build/server/chunks/handler-BjXBCd1c.js.map +1 -0
  141. package/build/server/chunks/index.js-BJYcV8V7.js +4183 -0
  142. package/build/server/chunks/index.js-BJYcV8V7.js.map +1 -0
  143. package/build/server/chunks/manifest.js-Ddaot0P4.js +91 -0
  144. package/build/server/chunks/manifest.js-Ddaot0P4.js.map +1 -0
  145. package/build/server/chunks/nodes/0.js-87v83UX9.js +9 -0
  146. package/build/server/chunks/nodes/0.js-87v83UX9.js.map +1 -0
  147. package/build/server/chunks/nodes/1.js-BRigw_9J.js +9 -0
  148. package/build/server/chunks/nodes/1.js-BRigw_9J.js.map +1 -0
  149. package/build/server/chunks/nodes/2.js-D9-B_qyX.js +9 -0
  150. package/build/server/chunks/nodes/2.js-D9-B_qyX.js.map +1 -0
  151. package/build/shims.js +33 -0
  152. package/build/shims.js.map +1 -0
  153. package/fixtures/minimal-graph.sqlite +0 -0
  154. package/package.json +81 -0
  155. package/scripts/backend-sqlite.mjs +190 -0
  156. package/scripts/build-serenity-v6-concept-review-pack.mjs +493 -0
  157. package/scripts/build-serenity-v6-review-pack.mjs +479 -0
  158. package/scripts/create-serenity-production-v6.mjs +627 -0
  159. package/scripts/dev-sqlite.mjs +86 -0
  160. package/scripts/export-serenity-v6-backup.mjs +178 -0
  161. package/scripts/import-serenity-v6-user-decisions.mjs +543 -0
  162. package/scripts/lib/sqlite-runtime.mjs +197 -0
  163. package/scripts/materialize-serenity-v6-snapshots.mjs +675 -0
  164. package/scripts/publish-npm.mjs +134 -0
  165. package/scripts/seed-immeuble-projections.mjs +169 -0
  166. package/scripts/studio-sqlite.mjs +74 -0
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+
6
+ const WORKSPACE = 'serenity-production-v6';
7
+ const DEFAULT_DB = '/home/dlamotte/.ghostcrab/databases/ghostcrab-serenity-v4-demos.sqlite';
8
+ const DEFAULT_OUT_ROOT = 'docs/demo/export-audit/2026-06-26/serenity-production-v6-backups';
9
+
10
+ const dbPath = valueAfter('--db') ?? process.env.GHOSTCRAB_SQLITE_PATH ?? DEFAULT_DB;
11
+ const outRoot = valueAfter('--out-dir') ?? DEFAULT_OUT_ROOT;
12
+ const stamp = valueAfter('--stamp') ?? timestamp();
13
+ const outDir = join(outRoot, stamp);
14
+
15
+ function valueAfter(flag) {
16
+ const index = process.argv.indexOf(flag);
17
+ return index >= 0 ? process.argv[index + 1] : null;
18
+ }
19
+
20
+ function timestamp() {
21
+ const now = new Date();
22
+ const pad = (n) => String(n).padStart(2, '0');
23
+ return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}T${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
24
+ }
25
+
26
+ function runJson(sql) {
27
+ const result = spawnSync('sqlite3', ['-readonly', '-json', dbPath, sql], {
28
+ encoding: 'utf8',
29
+ maxBuffer: 1024 * 1024 * 256
30
+ });
31
+ if (result.status !== 0) throw new Error(result.stderr || result.stdout || `sqlite3 failed: ${sql}`);
32
+ return JSON.parse(result.stdout || '[]');
33
+ }
34
+
35
+ function quote(value) {
36
+ if (value === null || value === undefined) return 'NULL';
37
+ if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL';
38
+ if (typeof value === 'boolean') return value ? '1' : '0';
39
+ return `'${String(value).replaceAll("'", "''")}'`;
40
+ }
41
+
42
+ function sqlIn(values) {
43
+ if (values.length === 0) return "('__no_rows__')";
44
+ return `(${values.map(quote).join(', ')})`;
45
+ }
46
+
47
+ function tableColumns(table) {
48
+ return runJson(`PRAGMA table_info(${table})`).map((row) => row.name);
49
+ }
50
+
51
+ function selectTable(table, where) {
52
+ const rows = runJson(`SELECT * FROM ${table} WHERE ${where}`);
53
+ return { columns: tableColumns(table), rows };
54
+ }
55
+
56
+ function insertSql(table, columns, row) {
57
+ const values = columns.map((column) => quote(row[column])).join(', ');
58
+ return `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${values});`;
59
+ }
60
+
61
+ const ontologyIds = runJson(
62
+ `SELECT ontology_id FROM ontologies WHERE workspace_id=${quote(WORKSPACE)} ORDER BY ontology_id`
63
+ ).map((row) => row.ontology_id);
64
+ const artifactIds = runJson(
65
+ `SELECT artifact_id FROM mindbrain_answer_artifacts WHERE workspace_id=${quote(WORKSPACE)} ORDER BY artifact_id`
66
+ ).map((row) => row.artifact_id);
67
+ const entityIds = runJson(
68
+ `SELECT entity_id FROM graph_entity WHERE workspace_id=${quote(WORKSPACE)} ORDER BY entity_id`
69
+ ).map((row) => row.entity_id);
70
+ const relationIds = runJson(
71
+ `SELECT relation_id FROM graph_relation WHERE workspace_id=${quote(WORKSPACE)} ORDER BY relation_id`
72
+ ).map((row) => row.relation_id);
73
+
74
+ const tableSpecs = [
75
+ ['workspaces', `workspace_id=${quote(WORKSPACE)} OR id=${quote(WORKSPACE)}`],
76
+ ['workspace_settings', `workspace_id=${quote(WORKSPACE)}`],
77
+ ['ontologies', `workspace_id=${quote(WORKSPACE)}`],
78
+ ['ontology_namespaces', `ontology_id IN ${sqlIn(ontologyIds)}`],
79
+ ['ontology_dimensions', `ontology_id IN ${sqlIn(ontologyIds)}`],
80
+ ['ontology_values', `ontology_id IN ${sqlIn(ontologyIds)}`],
81
+ ['ontology_entity_types', `ontology_id IN ${sqlIn(ontologyIds)}`],
82
+ ['ontology_edge_types', `ontology_id IN ${sqlIn(ontologyIds)}`],
83
+ ['ontology_triples_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
84
+ ['ontology_entities_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
85
+ ['ontology_relations_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
86
+ ['collections', `workspace_id=${quote(WORKSPACE)}`],
87
+ ['collection_ontologies', `workspace_id=${quote(WORKSPACE)}`],
88
+ ['documents_raw', `workspace_id=${quote(WORKSPACE)}`],
89
+ ['chunks_raw', `workspace_id=${quote(WORKSPACE)}`],
90
+ ['document_links_raw', `workspace_id=${quote(WORKSPACE)}`],
91
+ ['external_links_raw', `workspace_id=${quote(WORKSPACE)}`],
92
+ ['facet_assignments_raw', `workspace_id=${quote(WORKSPACE)}`],
93
+ ['agent_facts', `workspace_id=${quote(WORKSPACE)}`],
94
+ ['graph_entity', `workspace_id=${quote(WORKSPACE)}`],
95
+ ['graph_entity_alias', `entity_id IN ${sqlIn(entityIds)}`],
96
+ ['graph_entity_chunk', `workspace_id=${quote(WORKSPACE)}`],
97
+ ['graph_entity_document', `entity_id IN ${sqlIn(entityIds)}`],
98
+ ['graph_entity_degree', `entity_id IN ${sqlIn(entityIds)}`],
99
+ ['graph_lj_in', `entity_id IN ${sqlIn(entityIds)}`],
100
+ ['graph_lj_out', `entity_id IN ${sqlIn(entityIds)}`],
101
+ ['graph_relation', `workspace_id=${quote(WORKSPACE)}`],
102
+ ['graph_relation_property', `relation_id IN ${sqlIn(relationIds)}`],
103
+ ['graph_gap_rules', `workspace_id=${quote(WORKSPACE)}`],
104
+ ['graph_rule_evaluations', `workspace_id=${quote(WORKSPACE)}`],
105
+ ['graph_rule_events', `workspace_id=${quote(WORKSPACE)}`],
106
+ ['entities_raw', `workspace_id=${quote(WORKSPACE)}`],
107
+ ['entity_aliases_raw', `workspace_id=${quote(WORKSPACE)} OR entity_id IN ${sqlIn(entityIds)}`],
108
+ ['entity_documents_raw', `workspace_id=${quote(WORKSPACE)}`],
109
+ ['entity_chunks_raw', `workspace_id=${quote(WORKSPACE)}`],
110
+ ['relations_raw', `workspace_id=${quote(WORKSPACE)}`],
111
+ ['relation_properties_raw', `workspace_id=${quote(WORKSPACE)}`],
112
+ ['table_semantics', `workspace_id=${quote(WORKSPACE)}`],
113
+ ['column_semantics', `workspace_id=${quote(WORKSPACE)}`],
114
+ ['relation_semantics', `workspace_id=${quote(WORKSPACE)}`],
115
+ ['source_mappings', `workspace_id=${quote(WORKSPACE)}`],
116
+ ['structured_import_provenance', `workspace_id=${quote(WORKSPACE)}`],
117
+ ['pending_migrations', `workspace_id=${quote(WORKSPACE)}`],
118
+ ['quality_convergence_run', `workspace_id=${quote(WORKSPACE)}`],
119
+ ['quality_remediation_action', `workspace_id=${quote(WORKSPACE)}`],
120
+ ['mindbrain_answer_artifacts', `workspace_id=${quote(WORKSPACE)}`],
121
+ ['mindbrain_answer_events', `artifact_id IN ${sqlIn(artifactIds)}`]
122
+ ];
123
+
124
+ const existingTables = new Set(runJson(`SELECT name FROM sqlite_master WHERE type='table'`).map((row) => row.name));
125
+ const tables = {};
126
+ for (const [table, where] of tableSpecs) {
127
+ if (!existingTables.has(table)) continue;
128
+ const data = selectTable(table, where);
129
+ if (data.rows.length > 0) tables[table] = data;
130
+ }
131
+
132
+ const manifest = {
133
+ generated_at: new Date().toISOString(),
134
+ workspace_id: WORKSPACE,
135
+ db_path: dbPath,
136
+ export_kind: 'workspace_scoped_json_and_sql',
137
+ row_counts: Object.fromEntries(Object.entries(tables).map(([table, data]) => [table, data.rows.length])),
138
+ total_rows: Object.values(tables).reduce((sum, data) => sum + data.rows.length, 0)
139
+ };
140
+
141
+ mkdirSync(outDir, { recursive: true });
142
+ writeFileSync(
143
+ join(outDir, 'serenity-production-v6.backup.json'),
144
+ `${JSON.stringify({ manifest, tables }, null, 2)}\n`
145
+ );
146
+ writeFileSync(join(outDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
147
+
148
+ const deleteOrder = Object.keys(tables).reverse();
149
+ const insertOrder = Object.keys(tables);
150
+ const sql = [
151
+ `-- Serenity Production V6 workspace-scoped SQL backup`,
152
+ `-- Generated at ${manifest.generated_at}`,
153
+ `-- Source DB: ${dbPath}`,
154
+ `PRAGMA foreign_keys=OFF;`,
155
+ `BEGIN IMMEDIATE;`,
156
+ ...deleteOrder.map((table) => `DELETE FROM ${table} WHERE ${tableSpecs.find(([name]) => name === table)?.[1] ?? '1=0'};`),
157
+ ...insertOrder.flatMap((table) =>
158
+ tables[table].rows.map((row) => insertSql(table, tables[table].columns, row))
159
+ ),
160
+ `COMMIT;`,
161
+ `PRAGMA foreign_keys=ON;`
162
+ ].join('\n');
163
+
164
+ writeFileSync(join(outDir, 'serenity-production-v6.backup.sql'), `${sql}\n`);
165
+
166
+ console.log(
167
+ JSON.stringify(
168
+ {
169
+ out_dir: outDir,
170
+ json: join(outDir, 'serenity-production-v6.backup.json'),
171
+ sql: join(outDir, 'serenity-production-v6.backup.sql'),
172
+ manifest: join(outDir, 'manifest.json'),
173
+ ...manifest
174
+ },
175
+ null,
176
+ 2
177
+ )
178
+ );