@mindflight/mindbrain-personal-studio 0.6.1 → 0.6.3

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 (212) hide show
  1. package/README.md +16 -8
  2. package/build/client/_app/immutable/chunks/CIErFlYG.js +1 -0
  3. package/build/client/_app/immutable/chunks/CIErFlYG.js.br +0 -0
  4. package/build/client/_app/immutable/chunks/CIErFlYG.js.gz +0 -0
  5. package/build/client/_app/immutable/entry/{app.CVz6aYsT.js → app.mURYm8o_.js} +2 -2
  6. package/build/client/_app/immutable/entry/app.mURYm8o_.js.br +0 -0
  7. package/build/client/_app/immutable/entry/app.mURYm8o_.js.gz +0 -0
  8. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js +1 -0
  9. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.br +2 -0
  10. package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.gz +0 -0
  11. package/build/client/_app/immutable/nodes/{1.BBtxY46Q.js → 1.DHKtMeFI.js} +1 -1
  12. package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.br +1 -0
  13. package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.gz +0 -0
  14. package/build/client/_app/version.json +1 -1
  15. package/build/client/_app/version.json.br +0 -0
  16. package/build/client/_app/version.json.gz +0 -0
  17. package/build/handler.js +4 -4
  18. package/build/index.js +4 -4
  19. package/build/server/chunks/chunks/{internal.js-D8EA_he2.js → internal.js-C3tV0XXj.js} +2 -2
  20. package/build/server/chunks/chunks/{internal.js-D8EA_he2.js.map → internal.js-C3tV0XXj.js.map} +1 -1
  21. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/{_server.ts.js-Dyfsc-VA.js → _server.ts.js-CAsXxBRq.js} +7 -2
  22. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-CAsXxBRq.js.map +1 -0
  23. package/build/server/chunks/{handler-BjXBCd1c.js → handler-DlaCCnxx.js} +3 -3
  24. package/build/server/chunks/{handler-BjXBCd1c.js.map → handler-DlaCCnxx.js.map} +1 -1
  25. package/build/server/chunks/{index.js-BJYcV8V7.js → index.js-BGfKWHak.js} +2 -2
  26. package/build/server/chunks/{index.js-BJYcV8V7.js.map → index.js-BGfKWHak.js.map} +1 -1
  27. package/build/server/chunks/{manifest.js-Ddaot0P4.js → manifest.js-CnmaNf5D.js} +4 -4
  28. package/build/server/chunks/{manifest.js-Ddaot0P4.js.map → manifest.js-CnmaNf5D.js.map} +1 -1
  29. package/build/server/chunks/nodes/{1.js-BRigw_9J.js → 1.js-BypjwBYB.js} +2 -2
  30. package/build/server/chunks/nodes/{1.js-BRigw_9J.js.map → 1.js-BypjwBYB.js.map} +1 -1
  31. package/examples/immeuble/ACCEPTANCE.yaml +82 -0
  32. package/examples/immeuble/BIM_LITE.md +15 -0
  33. package/examples/immeuble/CHECKLIST.md +128 -0
  34. package/examples/immeuble/README.md +121 -0
  35. package/examples/immeuble/bundle/immeuble.bundle.json +22786 -0
  36. package/examples/immeuble/contracts/answer_artifacts.seed.jsonl +34 -0
  37. package/examples/immeuble/contracts/business_capabilities.seed.jsonl +25 -0
  38. package/examples/immeuble/contracts/consumer_contract.yaml +131 -0
  39. package/examples/immeuble/contracts/immeuble_structured_import_model.json +310 -0
  40. package/examples/immeuble/contracts/mapping_external_to_canonical.json +375 -0
  41. package/examples/immeuble/contracts/mapping_external_to_canonical.yaml +55 -0
  42. package/examples/immeuble/contracts/mapping_external_to_canonical_ws.json +65 -0
  43. package/examples/immeuble/contracts/model_contract.json +943 -0
  44. package/examples/immeuble/contracts/projection_catalog.yaml +366 -0
  45. package/examples/immeuble/contracts/scenarios.yaml +27 -0
  46. package/examples/immeuble/contracts/semantic_proposal.golden.json +1 -0
  47. package/examples/immeuble/contracts/source_profile.yaml +38 -0
  48. package/examples/immeuble/fake_data/DeltaFinding.csv +20 -0
  49. package/examples/immeuble/fake_data/ProjectionResult.csv +13 -0
  50. package/examples/immeuble/fake_data/ag_meeting.csv +4 -0
  51. package/examples/immeuble/fake_data/agenda_item.csv +4 -0
  52. package/examples/immeuble/fake_data/architect.csv +3 -0
  53. package/examples/immeuble/fake_data/architecture_firm.csv +2 -0
  54. package/examples/immeuble/fake_data/bank_account.csv +3 -0
  55. package/examples/immeuble/fake_data/billing_group.csv +41 -0
  56. package/examples/immeuble/fake_data/block.csv +10 -0
  57. package/examples/immeuble/fake_data/budget_line.csv +3 -0
  58. package/examples/immeuble/fake_data/building.csv +6 -0
  59. package/examples/immeuble/fake_data/cellar.csv +41 -0
  60. package/examples/immeuble/fake_data/change_order.csv +2 -0
  61. package/examples/immeuble/fake_data/charge_call.csv +58 -0
  62. package/examples/immeuble/fake_data/claim.csv +4 -0
  63. package/examples/immeuble/fake_data/coda_entry.csv +49 -0
  64. package/examples/immeuble/fake_data/compliance_certificate.csv +10 -0
  65. package/examples/immeuble/fake_data/contractor.csv +4 -0
  66. package/examples/immeuble/fake_data/decision.csv +5 -0
  67. package/examples/immeuble/fake_data/defect_reserve.csv +3 -0
  68. package/examples/immeuble/fake_data/household.csv +41 -0
  69. package/examples/immeuble/fake_data/inspection.csv +3 -0
  70. package/examples/immeuble/fake_data/insurance_policy.csv +4 -0
  71. package/examples/immeuble/fake_data/intervention.csv +13 -0
  72. package/examples/immeuble/fake_data/invoice.csv +3 -0
  73. package/examples/immeuble/fake_data/lease_contract.csv +12 -0
  74. package/examples/immeuble/fake_data/maintenance_ticket.csv +13 -0
  75. package/examples/immeuble/fake_data/meter.csv +4 -0
  76. package/examples/immeuble/fake_data/meter_reading.csv +19 -0
  77. package/examples/immeuble/fake_data/milestone.csv +3 -0
  78. package/examples/immeuble/fake_data/organization.csv +12 -0
  79. package/examples/immeuble/fake_data/parking_space.csv +8 -0
  80. package/examples/immeuble/fake_data/permit.csv +3 -0
  81. package/examples/immeuble/fake_data/person.csv +85 -0
  82. package/examples/immeuble/fake_data/private_garden.csv +7 -0
  83. package/examples/immeuble/fake_data/progress_event.csv +2 -0
  84. package/examples/immeuble/fake_data/quote.csv +3 -0
  85. package/examples/immeuble/fake_data/receipt.csv +2 -0
  86. package/examples/immeuble/fake_data/reminder.csv +11 -0
  87. package/examples/immeuble/fake_data/service_contract.csv +4 -0
  88. package/examples/immeuble/fake_data/shared_equipment.csv +8 -0
  89. package/examples/immeuble/fake_data/shared_space.csv +10 -0
  90. package/examples/immeuble/fake_data/unit.csv +41 -0
  91. package/examples/immeuble/fake_data/work_package.csv +4 -0
  92. package/examples/immeuble/fake_data/worksite_project.csv +3 -0
  93. package/examples/immeuble/gap-rules/L0-patrimoine.json +57 -0
  94. package/examples/immeuble/gap-rules/L1-syndic-naive.json +36 -0
  95. package/examples/immeuble/gap-rules/L1-syndic.json +61 -0
  96. package/examples/immeuble/gap-rules/L2-chantier.json +87 -0
  97. package/examples/immeuble/gap-rules/L2-exploitation.json +87 -0
  98. package/examples/immeuble/gap-rules/L2-finance.json +48 -0
  99. package/examples/immeuble/gap-rules/L2-maintenance.json +107 -0
  100. package/examples/immeuble/gap-rules/L2-syndic-filtered.json +39 -0
  101. package/examples/immeuble/gap-rules/L3-full.json +332 -0
  102. package/examples/immeuble/gap-rules/closed-world-contract.md +76 -0
  103. package/examples/immeuble/gap-rules/demo.json +51 -0
  104. package/examples/immeuble/gap-rules/expected-findings.yaml +100 -0
  105. package/examples/immeuble/gap-rules/gap-scenarios.yaml +79 -0
  106. package/examples/immeuble/gap-rules/motifs.json +38 -0
  107. package/examples/immeuble/gap-rules/syndic.json +40 -0
  108. package/examples/immeuble/import_manifest.yaml +25 -0
  109. package/examples/immeuble/import_ready/graph_edges_import.csv +848 -0
  110. package/examples/immeuble/import_ready/mfo_facets_import.csv +559 -0
  111. package/examples/immeuble/index.md +140 -0
  112. package/examples/immeuble/model/immeuble_model.json +418 -0
  113. package/examples/immeuble/reports/01-model.validation.json +56 -0
  114. package/examples/immeuble/reports/02-mapping.validation.json +9 -0
  115. package/examples/immeuble/reports/acceptance.validation.json +161 -0
  116. package/examples/immeuble/reports/consumer_contract.validation.json +162 -0
  117. package/examples/immeuble/reports/graph_edges.jsonl +847 -0
  118. package/examples/immeuble/reports/graph_nodes.jsonl +558 -0
  119. package/examples/immeuble/reports/hybrid-compare.json +144 -0
  120. package/examples/immeuble/reports/immeuble-import-scenario.json +233 -0
  121. package/examples/immeuble/reports/live-artifacts-refresh.validation.json +51 -0
  122. package/examples/immeuble/reports/pipeline_audit.json +59 -0
  123. package/examples/immeuble/reports/projection_audit.json +69 -0
  124. package/examples/immeuble/reports/projection_audit_immeuble.json +257 -0
  125. package/examples/immeuble/reports/projection_audit_immeuble.md +122 -0
  126. package/examples/immeuble/reports/projection_candidates.json +1596 -0
  127. package/examples/immeuble/reports/projection_candidates.md +117 -0
  128. package/examples/immeuble/reports/projection_model_validation.md +115 -0
  129. package/examples/immeuble/reports/reindex.json +4 -0
  130. package/examples/immeuble/reports/reset-immeuble-workspace.json +32 -0
  131. package/examples/immeuble/reports/schema-id-prefix-check.json +5 -0
  132. package/examples/immeuble/scripts/audit-immeuble-projections.mjs +254 -0
  133. package/examples/immeuble/scripts/build-immeuble-model.mjs +308 -0
  134. package/examples/immeuble/scripts/compare-immeuble-snapshots.sh +227 -0
  135. package/examples/immeuble/scripts/enrich-immeuble-demo.mjs +1135 -0
  136. package/examples/immeuble/scripts/reset-immeuble-workspace.mjs +139 -0
  137. package/examples/immeuble/scripts/run-immeuble-backend.sh +164 -0
  138. package/examples/immeuble/scripts/run-immeuble-import.mjs +232 -0
  139. package/examples/immeuble/scripts/run-immeuble-live-lab.sh +439 -0
  140. package/examples/immeuble/scripts/seed-immeuble-gap-rules.mjs +69 -0
  141. package/examples/immeuble/scripts/start-immeuble-demo.sh +52 -0
  142. package/examples/immeuble/scripts/starterkit/analysis-lenses.mjs +181 -0
  143. package/examples/immeuble/scripts/starterkit/analyze-projection-candidates.mjs +714 -0
  144. package/examples/immeuble/scripts/starterkit/audit-ghostcrab-projections.mjs +674 -0
  145. package/examples/immeuble/scripts/starterkit/facet-prefix.mjs +166 -0
  146. package/examples/immeuble/scripts/starterkit/sqlite-utils.mjs +131 -0
  147. package/examples/immeuble/scripts/verify-immeuble-acceptance.mjs +284 -0
  148. package/examples/immeuble/scripts/verify-immeuble-live-artifacts.mjs +140 -0
  149. package/examples/immeuble/scripts/yaml-lite.mjs +96 -0
  150. package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites-immo-mcp.md +161 -0
  151. package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites.md +39 -0
  152. package/examples/immeuble/sources/agent-prompts/prompts/01-discovery-and-model-proposal.md +42 -0
  153. package/examples/immeuble/sources/agent-prompts/prompts/02-ontology-register.md +44 -0
  154. package/examples/immeuble/sources/agent-prompts/prompts/03-gap-rules-design.md +44 -0
  155. package/examples/immeuble/sources/agent-prompts/prompts/04-document-ingest.md +40 -0
  156. package/examples/immeuble/sources/agent-prompts/prompts/05-graph-extraction.md +44 -0
  157. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-immo-mcp.md +109 -0
  158. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-test-immo-mcp3.md +30 -0
  159. package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare.md +63 -0
  160. package/examples/immeuble/sources/checklists/gap-rules-checklist.md +42 -0
  161. package/examples/immeuble/sources/checklists/ontology-checklist.md +54 -0
  162. package/examples/immeuble/sources/documents/README.md +42 -0
  163. package/examples/immeuble/sources/documents/annexes-caves-garages-jardins.md +8 -0
  164. package/examples/immeuble/sources/documents/annexes-jardins-garages.md +1 -0
  165. package/examples/immeuble/sources/documents/baux-erables.md +1 -0
  166. package/examples/immeuble/sources/documents/baux-locatifs.md +11 -0
  167. package/examples/immeuble/sources/documents/coda-janvier-2026.md +10 -0
  168. package/examples/immeuble/sources/documents/composition-menages.md +1 -0
  169. package/examples/immeuble/sources/documents/composition-occupants.md +18 -0
  170. package/examples/immeuble/sources/documents/expected-coverage.json +70 -0
  171. package/examples/immeuble/sources/documents/extrait-coda-janvier-2026.md +1 -0
  172. package/examples/immeuble/sources/documents/groupes-facturation.md +30 -0
  173. package/examples/immeuble/sources/documents/manifest.json +79 -0
  174. package/examples/immeuble/sources/documents/note-architecte-chantier-erables.md +3 -0
  175. package/examples/immeuble/sources/documents/permis-urbanisme-erables.md +3 -0
  176. package/examples/immeuble/sources/documents/procedures-operationnelles.md +3 -0
  177. package/examples/immeuble/sources/documents/pv-ag-budget-2026.md +1 -0
  178. package/examples/immeuble/sources/documents/pv-reception-reserves-erables.md +3 -0
  179. package/examples/immeuble/sources/documents/registre-coproprietaires.md +24 -0
  180. package/examples/immeuble/sources/documents/reglement-copropriete-tilleuls.md +1 -0
  181. package/examples/immeuble/sources/documents/statuts-erables.md +22 -0
  182. package/examples/immeuble/sources/documents/statuts-tilleuls.md +19 -0
  183. package/examples/immeuble/sources/documents/succession-jean-dupont.md +3 -0
  184. package/examples/immeuble/sources/documents/titre-propriete-tilleuls-a3.md +1 -0
  185. package/examples/immeuble/sources/documents/trous-pedagogiques.md +3 -0
  186. package/examples/immeuble/sources/ontology/README.md +1 -0
  187. package/examples/immeuble/sources/ontology/core.yaml +444 -0
  188. package/examples/immeuble/success-criteria.yaml +35 -0
  189. package/fixtures/immeuble-demo.sqlite +0 -0
  190. package/package.json +16 -3
  191. package/scripts/lib/sqlite-runtime.mjs +1 -1
  192. package/scripts/load-immeuble-demo.sh +103 -0
  193. package/scripts/seed-immeuble-projections.mjs +75 -148
  194. package/scripts/verify-immeuble-demo-sources.mjs +93 -0
  195. package/scripts/verify-immeuble-demo.mjs +69 -0
  196. package/build/client/_app/immutable/chunks/BmeSanva.js +0 -1
  197. package/build/client/_app/immutable/chunks/BmeSanva.js.br +0 -0
  198. package/build/client/_app/immutable/chunks/BmeSanva.js.gz +0 -0
  199. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.br +0 -0
  200. package/build/client/_app/immutable/entry/app.CVz6aYsT.js.gz +0 -0
  201. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js +0 -1
  202. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.br +0 -2
  203. package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.gz +0 -0
  204. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.br +0 -0
  205. package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.gz +0 -0
  206. package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js.map +0 -1
  207. package/scripts/build-serenity-v6-concept-review-pack.mjs +0 -493
  208. package/scripts/build-serenity-v6-review-pack.mjs +0 -479
  209. package/scripts/create-serenity-production-v6.mjs +0 -627
  210. package/scripts/export-serenity-v6-backup.mjs +0 -178
  211. package/scripts/import-serenity-v6-user-decisions.mjs +0 -543
  212. package/scripts/materialize-serenity-v6-snapshots.mjs +0 -675
@@ -1,178 +0,0 @@
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
- );