2sagaco48 1.0.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 (365) hide show
  1. package/diagnostics.mjs +141 -0
  2. package/dist/compute.worker-j5ahIpF-.js +1 -0
  3. package/dist/graph.worker-DG6iGCB9.js +1 -0
  4. package/dist/index.html +2314 -0
  5. package/flatten-guide.md +248 -0
  6. package/index.html +12 -0
  7. package/package.json +38 -0
  8. package/src/App.orig.tsx +204 -0
  9. package/src/App.orig1.tsx +27 -0
  10. package/src/App.orig2.tsx +25 -0
  11. package/src/App.tsx +3 -0
  12. package/src/BaseApp.tsx +18 -0
  13. package/src/INTEGRATION_LEDGER.md +22 -0
  14. package/src/PERSIST_CANARY.orig.txt +1 -0
  15. package/src/PERSIST_CANARY.txt +1 -0
  16. package/src/REGRESSION_LEDGER.md +651 -0
  17. package/src/TEMPLATE_PIPELINE_AUDIT.md +208 -0
  18. package/src/WILLIAMS_PERSONA_GUIDE.md +62 -0
  19. package/src/chat/VeritasChat.tsx +69 -0
  20. package/src/chat/synthesis.ts +31 -0
  21. package/src/chat/tier.ts +45 -0
  22. package/src/components/AdaptersPage.orig.tsx +99 -0
  23. package/src/components/AdaptersPage.tsx +3 -0
  24. package/src/components/AdversarialPanel.tsx +136 -0
  25. package/src/components/AnchorBaselinePanel.tsx +75 -0
  26. package/src/components/AnswerPanel.tsx +60 -0
  27. package/src/components/ArtifactPanel.tsx +43 -0
  28. package/src/components/ChatApp.orig.tsx +1582 -0
  29. package/src/components/ChatApp.orig1.tsx +722 -0
  30. package/src/components/ChatApp.tsx +95 -0
  31. package/src/components/ChatAugmentPanels.tsx +73 -0
  32. package/src/components/CitationLedgerPanel.tsx +313 -0
  33. package/src/components/ComputeSandboxPanel.tsx +130 -0
  34. package/src/components/ConfigPanel.tsx +110 -0
  35. package/src/components/ControlPlanePage.tsx +195 -0
  36. package/src/components/CreativeTreeLifePage.tsx +234 -0
  37. package/src/components/CreativeTreeOfLifePanel.tsx +149 -0
  38. package/src/components/DebugTracePanel.tsx +137 -0
  39. package/src/components/DeepReasoningTrace.tsx +48 -0
  40. package/src/components/EntitySheetPanel.tsx +51 -0
  41. package/src/components/FailureModesPanel.tsx +104 -0
  42. package/src/components/GBSDashboard.tsx +239 -0
  43. package/src/components/GraphView.tsx +116 -0
  44. package/src/components/HUD.tsx +125 -0
  45. package/src/components/HypothesisPanel.tsx +67 -0
  46. package/src/components/InnovationGenomeEngine.tsx +792 -0
  47. package/src/components/InnovationPersonaGuide.tsx +348 -0
  48. package/src/components/InnovationPersonaPanel.tsx +289 -0
  49. package/src/components/LiveResourceHUD.tsx +109 -0
  50. package/src/components/LongWriterPanel.tsx +112 -0
  51. package/src/components/MainPipelineV10Bridge.tsx +72 -0
  52. package/src/components/MarkdownLite.tsx +63 -0
  53. package/src/components/MemoryInspector.tsx +38 -0
  54. package/src/components/MemoryMonitor.tsx +52 -0
  55. package/src/components/MemoryStressPanel.tsx +176 -0
  56. package/src/components/ModulesPage.tsx +171 -0
  57. package/src/components/PipelineDebugConsole.orig.tsx +1856 -0
  58. package/src/components/PipelineDebugConsole.tsx +3 -0
  59. package/src/components/PreFlightHUD.tsx +67 -0
  60. package/src/components/PrismaFetchTracePanel.tsx +87 -0
  61. package/src/components/ReportOSPanel.tsx +165 -0
  62. package/src/components/ResourceEstimatorPage.tsx +327 -0
  63. package/src/components/RichText.tsx +181 -0
  64. package/src/components/SagaOsPanel.tsx +605 -0
  65. package/src/components/SagaOsReference.tsx +421 -0
  66. package/src/components/SagaOsV2Panel.tsx +594 -0
  67. package/src/components/SagaStyleTab.tsx +382 -0
  68. package/src/components/SageBlueprintPanel.tsx +416 -0
  69. package/src/components/SharedChatInput.tsx +77 -0
  70. package/src/components/StatFinancePanel.tsx +190 -0
  71. package/src/components/StylePersonaPanel.tsx +128 -0
  72. package/src/components/TemplatesPage.tsx +300 -0
  73. package/src/components/TestPanel.tsx +63 -0
  74. package/src/components/TraceLog.tsx +89 -0
  75. package/src/components/V15CalibrationAugment.tsx +1134 -0
  76. package/src/components/V15CalibrationDialog.tsx +1871 -0
  77. package/src/components/V15Overlay.orig.tsx +120 -0
  78. package/src/components/V15Overlay.tsx +4 -0
  79. package/src/components/V15OverlayWrapper.tsx +362 -0
  80. package/src/components/V15Toggle.tsx +34 -0
  81. package/src/console/DiagnosticRecoveryPanel.tsx +358 -0
  82. package/src/console/EngineeringConsole.tsx +103 -0
  83. package/src/console/FictionSystemPanels.tsx +882 -0
  84. package/src/console/InspectorPanels.tsx +254 -0
  85. package/src/console/ManuscriptGraderPanel.tsx +182 -0
  86. package/src/console/RecursiveReviserPanel.tsx +245 -0
  87. package/src/console/SeedControlPanel.tsx +135 -0
  88. package/src/console/StoryControllerPanel.tsx +443 -0
  89. package/src/console/engineBridge.ts +258 -0
  90. package/src/console/gemini.ts +106 -0
  91. package/src/console/grading.ts +250 -0
  92. package/src/console/util.ts +45 -0
  93. package/src/fiction/continuity.ts +372 -0
  94. package/src/fiction/crash-protection.ts +111 -0
  95. package/src/fiction/diagnostics.ts +208 -0
  96. package/src/fiction/diff.ts +74 -0
  97. package/src/fiction/entity-state-machine.ts +214 -0
  98. package/src/fiction/nive-engine.ts +404 -0
  99. package/src/fiction/pipeline-selftest.ts +132 -0
  100. package/src/fiction/seed-control.ts +193 -0
  101. package/src/fiction/story-engine.ts +326 -0
  102. package/src/fiction/types.ts +68 -0
  103. package/src/flatten-guide.md +379 -0
  104. package/src/index.css +14 -0
  105. package/src/index.orig.css +13 -0
  106. package/src/lib/academic-sources.base.ts +188 -0
  107. package/src/lib/academic-sources.orig.ts +28 -0
  108. package/src/lib/academic-sources.ts +10 -0
  109. package/src/lib/advanced-math.ts +119 -0
  110. package/src/lib/adversarial-engine.base.ts +409 -0
  111. package/src/lib/adversarial-engine.ts +82 -0
  112. package/src/lib/ai-revision.ts +623 -0
  113. package/src/lib/app-state.tsx +426 -0
  114. package/src/lib/artifact-registry.ts +97 -0
  115. package/src/lib/artifacts.ts +180 -0
  116. package/src/lib/atlas-dr.ts +167 -0
  117. package/src/lib/browser-mtls.ts +127 -0
  118. package/src/lib/browser-queue.ts +221 -0
  119. package/src/lib/browser-search-scraper.base.ts +382 -0
  120. package/src/lib/browser-search-scraper.orig.ts +90 -0
  121. package/src/lib/browser-search-scraper.ts +10 -0
  122. package/src/lib/calc-interceptor.ts +82 -0
  123. package/src/lib/citation-lane-tap.ts +78 -0
  124. package/src/lib/citation-ledger-store.ts +369 -0
  125. package/src/lib/citation-ledger.ts +203 -0
  126. package/src/lib/compute-sandbox.ts +215 -0
  127. package/src/lib/compute.worker.ts +153 -0
  128. package/src/lib/connectors/gemini.ts +120 -0
  129. package/src/lib/connectors/jina.ts +233 -0
  130. package/src/lib/connectors/marketdata.ts +51 -0
  131. package/src/lib/connectors/prismafetch.base.ts +175 -0
  132. package/src/lib/connectors/prismafetch.ts +1 -0
  133. package/src/lib/connectors/serpapi.ts +65 -0
  134. package/src/lib/connectors/wikidata.ts +44 -0
  135. package/src/lib/constraints.ts +331 -0
  136. package/src/lib/continuation-detector.base.ts +153 -0
  137. package/src/lib/continuation-detector.ts +48 -0
  138. package/src/lib/contradraft.ts +168 -0
  139. package/src/lib/cors-proxy.ts +120 -0
  140. package/src/lib/coverage.ts +81 -0
  141. package/src/lib/debug/architecture-prescription.ts +556 -0
  142. package/src/lib/debug/covea-repair.ts +543 -0
  143. package/src/lib/debug/helios-ground.ts +319 -0
  144. package/src/lib/debug/intent-decomposer.ts +281 -0
  145. package/src/lib/debug/intent-lattice.ts +349 -0
  146. package/src/lib/debug/pipeline-diagnosis.ts +1149 -0
  147. package/src/lib/debug/pipeline-trace-bus.ts +424 -0
  148. package/src/lib/debug/prompt-forge.ts +678 -0
  149. package/src/lib/debug/repair-sites.ts +513 -0
  150. package/src/lib/debug/research-phase.ts +266 -0
  151. package/src/lib/debug/retrieval-context.ts +76 -0
  152. package/src/lib/debug/retrieval-hardener.ts +142 -0
  153. package/src/lib/debug/scraper-debug-runner.ts +576 -0
  154. package/src/lib/debug/scraper-forensics.ts +418 -0
  155. package/src/lib/debug/scraper-lane-roadmap.ts +136 -0
  156. package/src/lib/debug/self-test.ts +415 -0
  157. package/src/lib/debug/step-attribution.ts +211 -0
  158. package/src/lib/debug/template-rubric.ts +301 -0
  159. package/src/lib/debug/unified-innovation.ts +126 -0
  160. package/src/lib/debug/veritas-hybrid-scraper.ts +335 -0
  161. package/src/lib/defense-registry.ts +104 -0
  162. package/src/lib/defenses.ts +162 -0
  163. package/src/lib/deterministic-citation-ledger.ts +174 -0
  164. package/src/lib/elo-registry.base.ts +117 -0
  165. package/src/lib/elo-registry.ts +1 -0
  166. package/src/lib/entity-resolver.ts +291 -0
  167. package/src/lib/failure-modes.ts +267 -0
  168. package/src/lib/feature-registry.ts +69 -0
  169. package/src/lib/flaw-registry.ts +143 -0
  170. package/src/lib/flaws/_template.ts +52 -0
  171. package/src/lib/flaws/builtins.ts +63 -0
  172. package/src/lib/flaws/finance.ts +169 -0
  173. package/src/lib/flaws/fixers.ts +10 -0
  174. package/src/lib/flaws/index.ts +32 -0
  175. package/src/lib/flaws/legal.ts +157 -0
  176. package/src/lib/flaws/medical.ts +188 -0
  177. package/src/lib/flaws/original-defenses-pack.ts +81 -0
  178. package/src/lib/flaws/sample-declarative-pack.json +38 -0
  179. package/src/lib/flaws/selftest.ts +201 -0
  180. package/src/lib/flaws/software-extended.ts +125 -0
  181. package/src/lib/flaws/software-rn-webgl.ts +182 -0
  182. package/src/lib/flaws/statistics-advanced.ts +46 -0
  183. package/src/lib/flaws/statistics.ts +61 -0
  184. package/src/lib/gbse/config.ts +20 -0
  185. package/src/lib/gbse/engine.ts +226 -0
  186. package/src/lib/gbse/graph.ts +118 -0
  187. package/src/lib/gbse/graph.worker.ts +21 -0
  188. package/src/lib/gbse/tests.ts +117 -0
  189. package/src/lib/gbse/tiers.ts +65 -0
  190. package/src/lib/gbse/types.ts +94 -0
  191. package/src/lib/innovation-genome-engine-v2.orig.ts +1001 -0
  192. package/src/lib/innovation-genome-engine-v2.ts +3 -0
  193. package/src/lib/innovation-genome-engine.orig.ts +330 -0
  194. package/src/lib/innovation-genome-engine.ts +3 -0
  195. package/src/lib/innovation-genome-v10.orig.ts +314 -0
  196. package/src/lib/innovation-genome-v10.ts +2 -0
  197. package/src/lib/innovation-genome-v3.orig.ts +2015 -0
  198. package/src/lib/innovation-genome-v3.ts +2 -0
  199. package/src/lib/innovation-genome-v4.orig.ts +1959 -0
  200. package/src/lib/innovation-genome-v4.ts +2 -0
  201. package/src/lib/innovation-genome-v5.orig.ts +1210 -0
  202. package/src/lib/innovation-genome-v5.ts +2 -0
  203. package/src/lib/innovation-genome-v7.orig.ts +2549 -0
  204. package/src/lib/innovation-genome-v7.ts +2 -0
  205. package/src/lib/innovation-genome-v8.orig.ts +1485 -0
  206. package/src/lib/innovation-genome-v8.ts +2 -0
  207. package/src/lib/innovation-genome-v9.orig.ts +643 -0
  208. package/src/lib/innovation-genome-v9.ts +2 -0
  209. package/src/lib/jina.base.ts +293 -0
  210. package/src/lib/jina.ts +1 -0
  211. package/src/lib/live-telemetry.ts +61 -0
  212. package/src/lib/longwriter.ts +84 -0
  213. package/src/lib/manuscript-grade-v2.ts +298 -0
  214. package/src/lib/memory-governor.ts +173 -0
  215. package/src/lib/memory-stress-tests.ts +248 -0
  216. package/src/lib/model-intelligence.ts +48 -0
  217. package/src/lib/model-rotator.ts +75 -0
  218. package/src/lib/models.orig.ts +513 -0
  219. package/src/lib/models.ts +151 -0
  220. package/src/lib/n-deep.base.ts +592 -0
  221. package/src/lib/n-deep.ts +51 -0
  222. package/src/lib/nih-simulator.ts +56 -0
  223. package/src/lib/nih-vulnerability-fixes.ts +460 -0
  224. package/src/lib/omega-templates.base.ts +294 -0
  225. package/src/lib/omega-templates.ts +225 -0
  226. package/src/lib/omni-nexus.ts +64 -0
  227. package/src/lib/oracle-adapters.ts +67 -0
  228. package/src/lib/oracle-registry.ts +163 -0
  229. package/src/lib/orchestrator.ts +357 -0
  230. package/src/lib/output-boundary.ts +235 -0
  231. package/src/lib/overrides/vite-native-chaos-harness.ts +154 -0
  232. package/src/lib/overrides/vite-native-contract-plane.ts +245 -0
  233. package/src/lib/overrides/vite-native-doctor-plane.ts +208 -0
  234. package/src/lib/overrides/vite-native-knowledge-store.ts +267 -0
  235. package/src/lib/overrides/vite-native-policy-plane.ts +190 -0
  236. package/src/lib/overrides/vite-native-replay-plane.ts +197 -0
  237. package/src/lib/overrides/vite-native-runtime-plane.ts +106 -0
  238. package/src/lib/overrides/vite-native-scraper.ts +848 -0
  239. package/src/lib/overrides/vite-native-selftest-functional.ts +217 -0
  240. package/src/lib/overrides/vite-native-selftest.ts +183 -0
  241. package/src/lib/overrides/vite-native-snapshot-plane.ts +123 -0
  242. package/src/lib/philosophy-toolkit.ts +75 -0
  243. package/src/lib/pipeline.orig.ts +659 -0
  244. package/src/lib/pipeline.ts +42 -0
  245. package/src/lib/precache.ts +128 -0
  246. package/src/lib/py-sandbox.ts +205 -0
  247. package/src/lib/quality-score.ts +96 -0
  248. package/src/lib/quant-engine.ts +231 -0
  249. package/src/lib/quant-lib.ts +80 -0
  250. package/src/lib/reportos.ts +175 -0
  251. package/src/lib/research-os.ts +306 -0
  252. package/src/lib/resource-estimator.ts +114 -0
  253. package/src/lib/rpm-governor.ts +93 -0
  254. package/src/lib/runtime-estimator.ts +135 -0
  255. package/src/lib/sage/empty-space-v6.ts +560 -0
  256. package/src/lib/sage/empty-space-v7.ts +222 -0
  257. package/src/lib/sage/empty-space.ts +733 -0
  258. package/src/lib/sage/engine.ts +786 -0
  259. package/src/lib/sage/index.ts +17 -0
  260. package/src/lib/sage/judge.ts +246 -0
  261. package/src/lib/sage/prng.ts +53 -0
  262. package/src/lib/sage/reality-grounding.ts +380 -0
  263. package/src/lib/sage/repetition.ts +151 -0
  264. package/src/lib/sage/saga-os-v2-engines.ts +1870 -0
  265. package/src/lib/sage/saga-os-v2.ts +274 -0
  266. package/src/lib/sage/saga-os-v3-core.ts +1491 -0
  267. package/src/lib/sage/saga-os-v3-release.ts +739 -0
  268. package/src/lib/sage/saga-os-v4-aureate.ts +1161 -0
  269. package/src/lib/sage/saga-os-v4.ts +212 -0
  270. package/src/lib/sage/saga-os-v5.ts +205 -0
  271. package/src/lib/sage/saga-os-v6.ts +346 -0
  272. package/src/lib/sage/saga-os-v7.ts +314 -0
  273. package/src/lib/sage/saga-os-v8.ts +505 -0
  274. package/src/lib/sage/saga-os.ts +329 -0
  275. package/src/lib/sage/taxonomy.ts +403 -0
  276. package/src/lib/sage/unified-roll.ts +524 -0
  277. package/src/lib/sage/worked-sketches.ts +44 -0
  278. package/src/lib/sage.ts +166 -0
  279. package/src/lib/scraper-debug-bus.ts +53 -0
  280. package/src/lib/scraper-enhanced.orig.ts +153 -0
  281. package/src/lib/scraper-enhanced.ts +10 -0
  282. package/src/lib/scraper-hardener.base.orig.ts +155 -0
  283. package/src/lib/scraper-hardener.base.ts +317 -0
  284. package/src/lib/scraper-hardener.ts +1 -0
  285. package/src/lib/scraper-palisade/palisade-adjudicator.orig.ts +419 -0
  286. package/src/lib/scraper-palisade/palisade-adjudicator.ts +13 -0
  287. package/src/lib/scraper-vnext/arbiter-omega.orig.ts +688 -0
  288. package/src/lib/scraper-vnext/arbiter-omega.ts +13 -0
  289. package/src/lib/scraper-vnext/canonical-portfolio-augments.ts +479 -0
  290. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.orig.ts +1529 -0
  291. package/src/lib/scraper-vnext/canonical-portfolio-orchestrator.ts +13 -0
  292. package/src/lib/scraper-vnext/conclave-omega.ts +1830 -0
  293. package/src/lib/scraper-vnext/content-extractor-v2.ts +226 -0
  294. package/src/lib/scraper-vnext/diagnostics-suite.ts +36 -0
  295. package/src/lib/scraper-vnext/epistemic-packer.ts +97 -0
  296. package/src/lib/scraper-vnext/fusion-v2.ts +65 -0
  297. package/src/lib/scraper-vnext/hydra-reader.orig.ts +1216 -0
  298. package/src/lib/scraper-vnext/hydra-reader.ts +13 -0
  299. package/src/lib/scraper-vnext/native-scraper-browser-vnext.orig.ts +91 -0
  300. package/src/lib/scraper-vnext/native-scraper-browser-vnext.ts +13 -0
  301. package/src/lib/scraper-vnext/nexus-consensus.orig.ts +905 -0
  302. package/src/lib/scraper-vnext/nexus-consensus.ts +13 -0
  303. package/src/lib/scraper-vnext/portfolio-consensus-adjudicator.ts +804 -0
  304. package/src/lib/scraper-vnext/portfolio-consensus-memory.ts +377 -0
  305. package/src/lib/scraper-vnext/portfolio-terminal-governor.ts +548 -0
  306. package/src/lib/scraper-vnext/query-strategist.orig.ts +224 -0
  307. package/src/lib/scraper-vnext/query-strategist.ts +423 -0
  308. package/src/lib/scraper-vnext/retrieval-accelerator.ts +708 -0
  309. package/src/lib/scraper-vnext/retrieval-audit-augments.ts +477 -0
  310. package/src/lib/scraper-vnext/retrieval-control-plane.ts +904 -0
  311. package/src/lib/scraper-vnext/retrieval-policy-augments.ts +358 -0
  312. package/src/lib/scraper-vnext/safe-fetch-v2.ts +157 -0
  313. package/src/lib/scraper-vnext/sentinel-omega.ts +56 -0
  314. package/src/lib/scraper-vnext/sentinel-orchestrator.ts +69 -0
  315. package/src/lib/scraper-vnext/sibyl-oracle.orig.ts +413 -0
  316. package/src/lib/scraper-vnext/sibyl-oracle.ts +13 -0
  317. package/src/lib/scraper-vnext/smart-read-v2.ts +55 -0
  318. package/src/lib/scraper-vnext/spa-rescue-bridge.ts +608 -0
  319. package/src/lib/scraper-vnext/strata-engine.orig.ts +2666 -0
  320. package/src/lib/scraper-vnext/strata-engine.ts +13 -0
  321. package/src/lib/scraper-vnext/structured-source-adapter.orig.ts +369 -0
  322. package/src/lib/scraper-vnext/structured-source-adapter.ts +34 -0
  323. package/src/lib/scraper-vnext/terminal-complete.ts +224 -0
  324. package/src/lib/scraper-vnext/terminal-final.ts +277 -0
  325. package/src/lib/scraper-vnext/terminal-saturation.ts +345 -0
  326. package/src/lib/scraper-vnext/terminal-wire.ts +425 -0
  327. package/src/lib/scraper-vnext/vanguard-titanium.orig.ts +467 -0
  328. package/src/lib/scraper-vnext/vanguard-titanium.ts +17 -0
  329. package/src/lib/search-cache.ts +138 -0
  330. package/src/lib/sloop-runner.base.ts +223 -0
  331. package/src/lib/sloop-runner.ts +104 -0
  332. package/src/lib/sloop.ts +114 -0
  333. package/src/lib/small-model-adapters.ts +82 -0
  334. package/src/lib/sscp.ts +86 -0
  335. package/src/lib/system-map.ts +54 -0
  336. package/src/lib/uni-node.ts +86 -0
  337. package/src/lib/universal-rigor-guard.ts +433 -0
  338. package/src/lib/v15-gate-testbed.ts +274 -0
  339. package/src/lib/v15-gemini.base.ts +89 -0
  340. package/src/lib/v15-gemini.ts +1 -0
  341. package/src/lib/v15-grounding.orig.ts +241 -0
  342. package/src/lib/v15-grounding.ts +79 -0
  343. package/src/lib/v15-pipeline.base.ts +769 -0
  344. package/src/lib/v15-pipeline.orig.ts +1154 -0
  345. package/src/lib/v15-pipeline.ts +674 -0
  346. package/src/lib/v15-questions.ts +64 -0
  347. package/src/lib/v15-rate-limiter.orig.ts +91 -0
  348. package/src/lib/v15-rate-limiter.ts +48 -0
  349. package/src/lib/v15-state.base.ts +87 -0
  350. package/src/lib/v15-state.ts +28 -0
  351. package/src/lib/visual-table-generator.tsx +207 -0
  352. package/src/lib/wasm-runtime.ts +133 -0
  353. package/src/lib/williams-persona-guide.ts +265 -0
  354. package/src/lib/williams-style.base.ts +464 -0
  355. package/src/lib/williams-style.ts +59 -0
  356. package/src/lib/worker-pool.ts +96 -0
  357. package/src/lib/writing-tiers.ts +125 -0
  358. package/src/main.orig.tsx +10 -0
  359. package/src/main.tsx +10 -0
  360. package/src/utils/cn.orig.ts +6 -0
  361. package/src/utils/cn.ts +6 -0
  362. package/src/vite-env.d.ts +1 -0
  363. package/tsconfig.json +31 -0
  364. package/unify.mjs +537 -0
  365. package/vite.config.ts +18 -0
package/unify.mjs ADDED
@@ -0,0 +1,537 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * unify.mjs — Sidecar → Flat unification
4
+ * ---------------------------------------------------------------------------
5
+ * 7-PASS ARCHITECTURE
6
+ * Pass 0 Self-Heal obsolete App.tsx wrapper (TRAP 12)
7
+ * Pass 1 Dissolve pure shims (Type A)
8
+ * Pass 2 Rename bases with Chain-of-Wrappers Support (TRAP 1 & 10)
9
+ * Pass 3 Stateless import rewrite (TRAP 2) + Windows Path Fix (TRAP 8)
10
+ * Pass 4 Intelligent Export Injection (TRAP 4 & 9) - TYPE AWARE
11
+ * Pass 5 Rewrite NPM imports & scrub comments (TRAP 3, 5, 7, 11)
12
+ * Pass 6 Cleanup leftover self-importing shims (TRAP 6)
13
+ *
14
+ * Usage:
15
+ * node unify.mjs <new-pkg-name> → TRANSFER mode
16
+ * node unify.mjs → FLATTEN mode (zero-dep)
17
+ *
18
+ * Idempotent. Exits non-zero on any unrecoverable state.
19
+ */
20
+ import fs from "node:fs";
21
+ import path from "node:path";
22
+ import { execSync } from "node:child_process";
23
+ import process from "node:process";
24
+
25
+ // --- CONFIGURATION ---
26
+ const OLD_PKG_NAME = 'nsagaco5max';
27
+ const NEW_PKG_NAME = '2sagaco48';
28
+ const OLD_REPO_PATH = 'jyvplay/nsagaco5max';
29
+ const NEW_REPO_PATH = 'jyvplay/2sagaco48';
30
+ const OLD_REPO_URL = `https://github.com/${OLD_REPO_PATH}`;
31
+ const NEW_REPO_URL = `https://github.com/${NEW_REPO_PATH}`;
32
+ const HISTORICAL_PKGS = ['gpt56lxh', 'g31ppv2', 'unkbv10', 'gpt56sme', 'sagav8aa', 'nsagaco5max', '2sagaco48'];
33
+ // ---------------------
34
+
35
+ console.log(`🚀 Starting Hardened Unified Migration Script for ${NEW_PKG_NAME}...`);
36
+
37
+ const npmPkgPath = path.resolve('node_modules', OLD_PKG_NAME, 'package.json');
38
+ if (!fs.existsSync(npmPkgPath)) {
39
+ console.log(`📦 Base package not found. Installing ${OLD_PKG_NAME}...`);
40
+ execSync(`npm install ${OLD_PKG_NAME} --no-save`, { stdio: 'inherit' });
41
+ }
42
+
43
+ console.log("2. Merging package.json dependencies...");
44
+ const localPkgPath = path.resolve('package.json');
45
+ const localPkg = JSON.parse(fs.readFileSync(localPkgPath, 'utf-8'));
46
+ const npmPkg = JSON.parse(fs.readFileSync(npmPkgPath, 'utf-8'));
47
+
48
+ localPkg.dependencies = { ...npmPkg.dependencies, ...localPkg.dependencies };
49
+ for (const pkg of HISTORICAL_PKGS) {
50
+ delete localPkg.dependencies[pkg];
51
+ }
52
+ localPkg.name = NEW_PKG_NAME;
53
+ localPkg.version = "1.0.0";
54
+
55
+ if (localPkg.repository) {
56
+ if (typeof localPkg.repository === 'string') localPkg.repository = NEW_REPO_URL;
57
+ else localPkg.repository.url = `git+${NEW_REPO_URL}.git`;
58
+ }
59
+ if (localPkg.bugs) localPkg.bugs.url = `${NEW_REPO_URL}/issues`;
60
+ if (localPkg.homepage) localPkg.homepage = `${NEW_REPO_URL}#readme`;
61
+
62
+ fs.writeFileSync(localPkgPath, JSON.stringify(localPkg, null, 2));
63
+
64
+ console.log("3. Fusing src directories...");
65
+ if (fs.existsSync('src_advanced')) fs.rmSync('src_advanced', { recursive: true, force: true });
66
+ fs.renameSync('src', 'src_advanced');
67
+ fs.cpSync(path.join('node_modules', OLD_PKG_NAME, 'src'), 'src', { recursive: true });
68
+
69
+ console.log("4. Merging Advanced Overlay & Resolving Base Overrides...");
70
+
71
+ const pkgRegexStr = `(?:${HISTORICAL_PKGS.map(s => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join('|')})`;
72
+
73
+ // TRAP 4: critical wrappers and the exports they MUST surface.
74
+ const REQUIRED_EXPORTS = {
75
+ "src/lib/v15-grounding.ts": [
76
+ "getTitaniumEgressEnabled",
77
+ "setTitaniumEgressEnabled",
78
+ "groundQuestion",
79
+ ],
80
+ "src/lib/v15-pipeline.ts": [
81
+ "runV15OnQuestion",
82
+ "runBaselineOnQuestion",
83
+ "judgePanelEnhanced",
84
+ "runComparativeJudge",
85
+ ],
86
+ "src/lib/v15-state.ts": ["getV15Enabled", "setV15Enabled", "getGeminiKey"],
87
+ "src/lib/scraper-vnext/structured-source-adapter.ts": [
88
+ "buildAmpCacheUrl",
89
+ "fetchViaAmpCache",
90
+ "wrappedStructuredChallengeReader",
91
+ "type:StructuredItem"
92
+ ]
93
+ };
94
+
95
+ // ─── UTIL ──────────────────────────────────────────────────────────────────
96
+ function walk(dir, out = []) {
97
+ const EXT = new Set([".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"]);
98
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
99
+ const p = path.join(dir, e.name);
100
+ if (e.isDirectory()) walk(p, out);
101
+ else if (EXT.has(path.extname(e.name))) out.push(p);
102
+ }
103
+ return out;
104
+ }
105
+ const rel = (p) => path.relative(process.cwd(), p).split(path.sep).join("/");
106
+ const read = (p) => fs.readFileSync(p, "utf8");
107
+ const write = (p, c) => fs.writeFileSync(p, c, "utf8");
108
+
109
+ let ERRORS = 0;
110
+ const fail = (m) => { console.error(` \u2717 ${m}`); ERRORS++; };
111
+ const ok = (m) => console.log(` \u2713 ${m}`);
112
+ const info = (m) => console.log(` \u00b7 ${m}`);
113
+
114
+ function stripComments(s) {
115
+ return s.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "");
116
+ }
117
+
118
+ // ═══════════════════════════════════════════════════════════════════════════
119
+ // PASS 0 — SELF-HEAL OBSOLETE APP.TSX WRAPPER (TRAP 12)
120
+ // ═══════════════════════════════════════════════════════════════════════════
121
+ function pass0_healAppTsx() {
122
+ console.log("\n[PASS 0] Self-Healing obsolete App.tsx wrapper");
123
+ const appPath = path.resolve(process.cwd(), "src_advanced/App.tsx");
124
+ if (fs.existsSync(appPath)) {
125
+ // Convert the local App.tsx into a pure shim so Pass 1 dissolves it.
126
+ // This forces the build to use the package's App.tsx, which contains the
127
+ // unbroken import chain to PipelineDebugConsole and all 400+ modules.
128
+ const content = `/** Type A pure shim */\nexport * from "${NEW_PKG_NAME}/src/App.tsx";\nexport { default } from "${NEW_PKG_NAME}/src/App.tsx";\n`;
129
+ fs.writeFileSync(appPath, content);
130
+ ok("Converted obsolete App.tsx wrapper to pure shim");
131
+ }
132
+ // Delete empty .orig files that might have been manually created to bypass crashes
133
+ for (const file of walk(path.resolve(process.cwd(), "src"))) {
134
+ if (file.includes(".orig") && fs.statSync(file).size === 0) {
135
+ fs.unlinkSync(file);
136
+ ok(`Deleted empty ghost file: ${rel(file)}`);
137
+ }
138
+ }
139
+ }
140
+
141
+ // ═══════════════════════════════════════════════════════════════════════════
142
+ // PASS 1 — DISSOLVE PURE SHIMS (Type A)
143
+ // ═══════════════════════════════════════════════════════════════════════════
144
+ function pass1_dissolveShims() {
145
+ console.log("\n[PASS 1] Dissolving pure shims");
146
+ const pureShim = new RegExp(
147
+ `^\\s*export\\s*\\*\\s*from\\s*["']${pkgRegexStr}/src/[^"']+["'];?\\s*$`
148
+ );
149
+ let n = 0;
150
+ for (const file of walk(path.resolve(process.cwd(), "src_advanced"))) {
151
+ const body = stripComments(read(file)).trim();
152
+ if (body.length === 0) continue;
153
+ if (pureShim.test(body)) {
154
+ fs.unlinkSync(file);
155
+ info(`dissolved ${rel(file)}`);
156
+ n++;
157
+ }
158
+ }
159
+ ok(`${n} pure shim(s) dissolved`);
160
+ }
161
+
162
+ // ═══════════════════════════════════════════════════════════════════════════
163
+ // PASS 2 — RENAME BASES WITH CHAIN-OF-WRAPPERS SUPPORT ***TRAP 1 & 10***
164
+ // ═══════════════════════════════════════════════════════════════════════════
165
+ function pass2_renameBases() {
166
+ console.log("\n[PASS 2] Renaming bases (Chain-of-Wrappers safe)");
167
+ const renamedBases = new Map();
168
+ const importRe = new RegExp(`["']${pkgRegexStr}/src/([^"']+)["']`, "g");
169
+ const SRC = path.resolve(process.cwd(), "src");
170
+ const SRC_ADV = path.resolve(process.cwd(), "src_advanced");
171
+
172
+ for (const file of walk(SRC_ADV)) {
173
+ const content = read(file);
174
+ for (const m of content.matchAll(importRe)) {
175
+ const importPath = m[1];
176
+ const basePath = importPath.replace(/\.(tsx?|jsx?)$/, "");
177
+ const ext = path.extname(file);
178
+ const targetPath = path.join(SRC, `${basePath}${ext}`);
179
+
180
+ if (path.resolve(path.join(SRC_ADV, rel(targetPath).replace(/^src[\\/]/, ''))) !== path.resolve(file)) continue;
181
+
182
+ if (fs.existsSync(targetPath)) {
183
+ let origName = `${basePath}.orig${ext}`;
184
+ let origPath = path.join(SRC, origName);
185
+ let counter = 1;
186
+ // TRAP 10: If .orig already exists, increment counter to preserve history
187
+ while (fs.existsSync(origPath)) {
188
+ origName = `${basePath}.orig${counter}${ext}`;
189
+ origPath = path.join(SRC, origName);
190
+ counter++;
191
+ }
192
+ fs.renameSync(targetPath, origPath);
193
+ info(`renamed ${rel(targetPath)} -> ${rel(origPath)}`);
194
+ renamedBases.set(importPath, origName);
195
+ }
196
+ }
197
+ }
198
+ ok(`${renamedBases.size} base(s) in rewrite ledger`);
199
+ return renamedBases;
200
+ }
201
+
202
+ // ═══════════════════════════════════════════════════════════════════════════
203
+ // PASS 3 — STATELESS IMPORT REWRITE ***TRAP 2*** + WINDOWS PATH FIX ***TRAP 8***
204
+ // ═══════════════════════════════════════════════════════════════════════════
205
+ function pass3_rewriteImports(renamedBases) {
206
+ console.log("\n[PASS 3] Rewriting imports -> ./*.orig (stateless)");
207
+ let n = 0;
208
+ const SRC = path.resolve(process.cwd(), "src");
209
+ const SRC_ADV = path.resolve(process.cwd(), "src_advanced");
210
+
211
+ for (const file of walk(SRC_ADV)) {
212
+ const before = read(file);
213
+ let content = before;
214
+ const relPath = path.relative(SRC_ADV, file);
215
+ const targetPath = path.join(SRC, relPath);
216
+
217
+ if (!fs.existsSync(path.dirname(targetPath))) {
218
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
219
+ }
220
+
221
+ for (const [importPath, origName] of renamedBases.entries()) {
222
+ const escapedPath = importPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
223
+ const importRegex = new RegExp(
224
+ `["'](?:(?:\\.\\.\\/)*node_modules\\/)?${pkgRegexStr}/src/(?:${escapedPath}(?:\\.orig)?|${escapedPath}/index)(?:\\.[jt]sx?)?["']`,
225
+ "g"
226
+ );
227
+
228
+ const currentDir = path.dirname(relPath);
229
+
230
+ // CRITICAL FIX: origName is already relative to src (e.g., "App.orig1.tsx")
231
+ // currentDir is relative to src (e.g., "." or "components")
232
+ let relativeToOrig = path.relative(currentDir, origName).split(path.sep).join('/');
233
+
234
+ if (!relativeToOrig.startsWith('.')) relativeToOrig = './' + relativeToOrig;
235
+
236
+ content = content.replace(importRegex, `"${relativeToOrig}"`);
237
+ }
238
+
239
+ write(targetPath, content);
240
+ if (content !== before) { info(`rewrote ${rel(targetPath)}`); n++; }
241
+ }
242
+ ok(`${n} file(s) rewritten`);
243
+ }
244
+
245
+ // ═══════════════════════════════════════════════════════════════════════════
246
+ // PASS 4 — INTELLIGENT EXPORT INJECTION ***TRAP 4 & 9***
247
+ // ═══════════════════════════════════════════════════════════════════════════
248
+ function pass4_injectExports(renamedBases) {
249
+ console.log("\n[PASS 4] Injecting missing wrapper exports (Type-Aware)");
250
+ let n = 0;
251
+ for (const [relFile, symbols] of Object.entries(REQUIRED_EXPORTS)) {
252
+ const file = path.resolve(process.cwd(), relFile);
253
+ if (!fs.existsSync(file)) { info(`skip ${relFile} (absent)`); continue; }
254
+
255
+ let content = read(file);
256
+ const ext = path.extname(file);
257
+
258
+ const importPath = relFile.replace(/^src[\\/]/, '').replace(/\.(tsx?|jsx?)$/, '').split(path.sep).join('/');
259
+
260
+ // CRITICAL FIX: origName from renamedBases includes the directory (e.g., "lib/v15-grounding.orig1.ts")
261
+ const fallbackOrigName = importPath + ".orig" + ext;
262
+ const origName = renamedBases.get(importPath) || fallbackOrigName;
263
+
264
+ const origAbs = path.join(process.cwd(), "src", origName);
265
+ const origSrc = fs.existsSync(origAbs) ? read(origAbs) : "";
266
+
267
+ const currentDir = path.dirname(relFile); // e.g., "src/lib"
268
+ let origRel = path.relative(currentDir, path.join("src", origName)).split(path.sep).join('/');
269
+ if (!origRel.startsWith('.')) origRel = './' + origRel;
270
+
271
+ const missingToReexportValues = [];
272
+ const missingToReexportTypes = [];
273
+ const missingToMock = [];
274
+
275
+ const cleanContent = stripComments(content);
276
+ const cleanOrigSrc = stripComments(origSrc);
277
+
278
+ for (const symDef of symbols) {
279
+ const isType = symDef.startsWith("type:");
280
+ const sym = isType ? symDef.slice(5) : symDef;
281
+ const escSym = sym.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
282
+
283
+ const declLocal = new RegExp(
284
+ `export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|const|let|var|class|type|interface)\\s+${escSym}\\b` +
285
+ `|export\\s*(?:type\\s*)?\\{[^}]*\\b${escSym}\\b[^}]*\\}`
286
+ );
287
+
288
+ if (declLocal.test(cleanContent)) continue; // Already in wrapper
289
+
290
+ const declBase = new RegExp(
291
+ `export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|const|let|var|class|type|interface)\\s+${escSym}\\b` +
292
+ `|export\\s*(?:type\\s*)?\\{[^}]*\\b${escSym}\\b[^}]*\\}`
293
+ );
294
+
295
+ if (declBase.test(cleanOrigSrc)) {
296
+ if (isType) missingToReexportTypes.push(sym);
297
+ else missingToReexportValues.push(sym);
298
+ } else {
299
+ missingToMock.push(symDef);
300
+ }
301
+ }
302
+
303
+ if (missingToReexportValues.length) {
304
+ content += `\n\n// [unify.mjs] Explicit value re-exports for Rollup resolution\nexport { ${missingToReexportValues.join(", ")} } from "${origRel}";\n`;
305
+ n += missingToReexportValues.length;
306
+ }
307
+
308
+ if (missingToReexportTypes.length) {
309
+ content += `\n\n// [unify.mjs] Explicit type re-exports for Rollup resolution\nexport type { ${missingToReexportTypes.join(", ")} } from "${origRel}";\n`;
310
+ n += missingToReexportTypes.length;
311
+ }
312
+
313
+ if (missingToMock.length) {
314
+ content += `\n\n// [unify.mjs] Emergency mocks for symbols lost from package/wrapper\n`;
315
+
316
+ if (missingToMock.includes("getTitaniumEgressEnabled")) content += `export function getTitaniumEgressEnabled(): boolean { try { return localStorage.getItem("veritas.v15.enableTitaniumEgress") === "true"; } catch { return false; } }\n`;
317
+ if (missingToMock.includes("setTitaniumEgressEnabled")) content += `export function setTitaniumEgressEnabled(enabled: boolean): void { try { localStorage.setItem("veritas.v15.enableTitaniumEgress", enabled ? "true" : "false"); if (typeof window !== "undefined") window.dispatchEvent(new CustomEvent("veritas:titanium-egress-changed", { detail: enabled })); } catch {} }\n`;
318
+ if (missingToMock.includes("groundQuestion")) content += `export async function groundQuestion(opts: any): Promise<any> { return { ok: false, error: "Mocked groundQuestion" }; }\n`;
319
+
320
+ if (missingToMock.includes("runV15OnQuestion")) content += `export async function runV15OnQuestion(opts: any): Promise<any> { return {}; }\n`;
321
+ if (missingToMock.includes("runBaselineOnQuestion")) content += `export async function runBaselineOnQuestion(opts: any): Promise<any> { return {}; }\n`;
322
+ if (missingToMock.includes("judgePanelEnhanced")) content += `export async function judgePanelEnhanced(opts: any): Promise<any> { return null; }\n`;
323
+ if (missingToMock.includes("runComparativeJudge")) content += `export async function runComparativeJudge(opts: any): Promise<any> { return null; }\n`;
324
+
325
+ if (missingToMock.includes("getV15Enabled")) content += `export function getV15Enabled(): boolean { return true; }\n`;
326
+ if (missingToMock.includes("setV15Enabled")) content += `export function setV15Enabled(v: boolean): void {}\n`;
327
+ if (missingToMock.includes("getGeminiKey")) content += `export function getGeminiKey(): string { return ""; }\n`;
328
+
329
+ if (missingToMock.includes("buildAmpCacheUrl")) content += `export function buildAmpCacheUrl(url: string): string { return "https://cdn.ampproject.org/c/s/" + url.replace(/^https?:\\/\\//, ""); }\n`;
330
+ if (missingToMock.includes("fetchViaAmpCache")) content += `export async function fetchViaAmpCache(url: string, init?: any): Promise<Response> { return fetch(buildAmpCacheUrl(url), init); }\n`;
331
+ if (missingToMock.includes("wrappedStructuredChallengeReader")) content += `export async function wrappedStructuredChallengeReader(url: string): Promise<any> { return { url, content: "", title: "Fallback" }; }\n`;
332
+ if (missingToMock.includes("type:StructuredItem")) content += `export type StructuredItem = any;\n`;
333
+
334
+ n += missingToMock.length;
335
+ }
336
+
337
+ write(file, content);
338
+ }
339
+ ok(`${n} export(s) injected/mocked`);
340
+ }
341
+
342
+ // ═══════════════════════════════════════════════════════════════════════════
343
+ // PASS 5 — REWRITE NPM IMPORTS & SCRUB COMMENTS (TRAP 3, 5, 7, 11)
344
+ // ═══════════════════════════════════════════════════════════════════════════
345
+ function pass5_scrubAndRewrite(newPkg) {
346
+ console.log("\n[PASS 5] Rewriting NPM imports and scrubbing comments");
347
+
348
+ // TRAP 11: Handle non-src imports (like dist/index.html?raw)
349
+ const allImportsRegex = new RegExp(`['"](?:(?:\\.\\.\\/)*node_modules\\/)?${pkgRegexStr}/src/([^'"]+)['"]`, 'g');
350
+ const distHtmlRegex = new RegExp(`['"](?:(?:\\.\\.\\/)*node_modules\\/)?${pkgRegexStr}/dist/index\\.html(\\?raw)?['"]`, 'g');
351
+ const nonSrcImportsRegex = new RegExp(`['"](?:(?:\\.\\.\\/)*node_modules\\/)?${pkgRegexStr}/(?!src/)([^'"]+)['"]`, 'g');
352
+
353
+ const nodeModulesPkgRegex = new RegExp(`node_modules/${pkgRegexStr}/`, "g");
354
+ const commentPathRegex = new RegExp(`${pkgRegexStr}/src/`, "g");
355
+ const bareNameRegex = new RegExp(`\\b${pkgRegexStr}\\b`, "g");
356
+ let n = 0;
357
+ const SRC = path.resolve(process.cwd(), "src");
358
+
359
+ for (const file of walk(SRC)) {
360
+ const before = read(file);
361
+ let content = before;
362
+
363
+ // 1. Replace quotes-based imports: "pkg/src/X" -> "@/$1"
364
+ content = content.replace(allImportsRegex, "'@/$1'");
365
+
366
+ // 1.1 Replace dist/index.html imports specifically to point to the root index.html
367
+ content = content.replace(distHtmlRegex, "'/index.html$1'");
368
+
369
+ // 1.2 Replace any other non-src imports (e.g., pkg/package.json) to point to the root
370
+ content = content.replace(nonSrcImportsRegex, "'/$1'");
371
+
372
+ // 1.5 SELF-HEALING RECOVERY: Fix imports that were mangled to "src/..." by previous buggy scripts
373
+ content = content.replace(/(from\s+['"])src\/([^'"]+)(['"])/g, "$1@/$2$3");
374
+ content = content.replace(/(import\s*\(\s*['"])src\/([^'"]+)(['"])/g, "$1@/$2$3");
375
+
376
+ // 2. Replace node_modules/pkg/ in comments/docstrings with node_modules/
377
+ content = content.replace(nodeModulesPkgRegex, "node_modules/");
378
+
379
+ // 3. Replace pkg/src/ in comments/docstrings with src/
380
+ content = content.replace(commentPathRegex, "src/");
381
+
382
+ // 4. Replace standalone package names with NEW_PKG_NAME
383
+ if (newPkg) content = content.replace(bareNameRegex, newPkg);
384
+
385
+ if (content !== before) { write(file, content); info(`scrubbed ${rel(file)}`); n++; }
386
+ }
387
+ ok(`${n} file(s) scrubbed`);
388
+ }
389
+
390
+ // ═══════════════════════════════════════════════════════════════════════════
391
+ // PASS 6 — CLEANUP LEFTOVER SELF-IMPORTING SHIMS (TRAP 6)
392
+ // ═══════════════════════════════════════════════════════════════════════════
393
+ function pass6_cleanupSelfImports() {
394
+ console.log("\n[PASS 6] Cleaning up leftover self-importing shims");
395
+ let n = 0;
396
+ const SRC = path.resolve(process.cwd(), "src");
397
+
398
+ for (const file of walk(SRC)) {
399
+ const base = path.basename(file, path.extname(file));
400
+ const body = read(file);
401
+ const cleanBody = body.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\/\/.*$/gm, '').trim();
402
+ if (cleanBody.length === 0) continue;
403
+
404
+ const statements = cleanBody.split(/(?:;|\n)+/).map(s => s.trim()).filter(s => s.length > 0);
405
+ let isSelfShim = true;
406
+
407
+ for (const stmt of statements) {
408
+ const match = stmt.match(/^export\s+(?:[*]|{[^}]+}|default)\s+from\s+["']\.\/([^"']+)["']$/);
409
+ if (!match) { isSelfShim = false; break; }
410
+ const target = match[1];
411
+ if (target !== base) { isSelfShim = false; break; }
412
+ }
413
+
414
+ if (isSelfShim) {
415
+ fs.unlinkSync(file);
416
+ info(`deleted self-importing shim ${rel(file)}`);
417
+ n++;
418
+ }
419
+ }
420
+ ok(`${n} self-importing shim(s) deleted`);
421
+ }
422
+
423
+ // ─── MAIN ──────────────────────────────────────────────────────────────────
424
+ function main() {
425
+ const newPkg = process.argv[2] || NEW_PKG_NAME;
426
+ console.log("=".repeat(72));
427
+ console.log(`unify.mjs — mode: ${newPkg ? `TRANSFER -> ${newPkg}` : "FLATTEN (zero-dep)"}`);
428
+ console.log(`historical packages: ${HISTORICAL_PKGS.join(", ")}`);
429
+ console.log("=".repeat(72));
430
+
431
+ const SRC_ADV = path.resolve(process.cwd(), "src_advanced");
432
+ if (!fs.existsSync(SRC_ADV)) { fail("src_advanced/ not found — run force-materialize.mjs or ensure step 3 ran"); process.exit(1); }
433
+
434
+ pass0_healAppTsx();
435
+ pass1_dissolveShims();
436
+ const renamedBases = pass2_renameBases();
437
+ pass3_rewriteImports(renamedBases);
438
+
439
+ fs.rmSync(SRC_ADV, { recursive: true, force: true });
440
+
441
+ pass4_injectExports(renamedBases);
442
+ pass5_scrubAndRewrite(newPkg);
443
+ pass6_cleanupSelfImports();
444
+
445
+ console.log("\n7. Scorched Earth Cleanup of Sidecar Artifacts...");
446
+ const SRC = path.resolve(process.cwd(), "src");
447
+ const cssPath = path.join(SRC, 'index.css');
448
+ if (fs.existsSync(cssPath)) {
449
+ let css = fs.readFileSync(cssPath, 'utf-8');
450
+ const cssRegex = new RegExp(`@source\\s+"(?:\\.\\.\\/)*node_modules/${pkgRegexStr}/src";?\\r?\\n?`, 'g');
451
+ css = css.replace(cssRegex, '');
452
+ fs.writeFileSync(cssPath, css);
453
+ }
454
+
455
+ const viteConfigPath = 'vite.config.ts';
456
+ if (fs.existsSync(viteConfigPath)) {
457
+ const cleanViteConfig = `import path from "path";\nimport { fileURLToPath } from "url";\nimport tailwindcss from "@tailwindcss/vite";\nimport react from "@vitejs/plugin-react";\nimport { defineConfig } from "vite";\nimport { viteSingleFile } from "vite-plugin-singlefile";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport default defineConfig({\n plugins: [react(), tailwindcss(), viteSingleFile()],\n resolve: {\n alias: {\n "@": path.resolve(__dirname, "src"),\n }\n }\n});`;
458
+ fs.writeFileSync(viteConfigPath, cleanViteConfig);
459
+ }
460
+
461
+ const tsconfigPath = 'tsconfig.json';
462
+ if (fs.existsSync(tsconfigPath)) {
463
+ try {
464
+ const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));
465
+ if (tsconfig.compilerOptions && tsconfig.compilerOptions.paths) {
466
+ delete tsconfig.compilerOptions.paths['@/lib/*'];
467
+ }
468
+ fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2));
469
+ } catch (e) {
470
+ console.log("Note: Could not parse tsconfig.json automatically.");
471
+ }
472
+ }
473
+
474
+ if (fs.existsSync('script.js')) fs.rmSync('script.js');
475
+ const localPkgPath = path.resolve('package.json');
476
+ if (fs.existsSync(localPkgPath)) {
477
+ const pkg = JSON.parse(fs.readFileSync(localPkgPath, 'utf-8'));
478
+ if (pkg.scripts && pkg.scripts.build) pkg.scripts.build = "vite build";
479
+ fs.writeFileSync(localPkgPath, JSON.stringify(pkg, null, 2));
480
+ }
481
+
482
+ console.log("8. Rewriting NPM imports in public/ and root files...");
483
+ const EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.css', '.md', '.html', '.json'];
484
+
485
+ function patchFiles(dir) {
486
+ if (!fs.existsSync(dir)) return;
487
+ const files = fs.readdirSync(dir);
488
+ for (const file of files) {
489
+ const fullPath = path.join(dir, file);
490
+ if (fs.statSync(fullPath).isDirectory()) {
491
+ patchFiles(fullPath);
492
+ } else if (EXTENSIONS.includes(path.extname(fullPath))) {
493
+ let content = fs.readFileSync(fullPath, 'utf-8');
494
+ let originalContent = content;
495
+
496
+ const allImportsRegex = new RegExp(`['"](?:(?:\\.\\.\\/)*node_modules\\/)?${pkgRegexStr}/src/([^'"]+)['"]`, 'g');
497
+ content = content.replace(allImportsRegex, "'@/$1'");
498
+
499
+ for (const pkg of HISTORICAL_PKGS) {
500
+ content = content.replaceAll(pkg, NEW_PKG_NAME);
501
+ }
502
+ content = content.replaceAll(OLD_REPO_URL, NEW_REPO_URL);
503
+ content = content.replaceAll(OLD_REPO_PATH, NEW_REPO_PATH);
504
+
505
+ if (content !== originalContent) {
506
+ fs.writeFileSync(fullPath, content, 'utf-8');
507
+ }
508
+ }
509
+ }
510
+ }
511
+ patchFiles('public');
512
+
513
+ ['README.md', 'index.html'].forEach(file => {
514
+ if (fs.existsSync(file)) {
515
+ let content = fs.readFileSync(file, 'utf-8');
516
+ let originalContent = content;
517
+ for (const pkg of HISTORICAL_PKGS) {
518
+ content = content.replaceAll(pkg, NEW_PKG_NAME);
519
+ }
520
+ content = content.replaceAll(OLD_REPO_URL, NEW_REPO_URL);
521
+ content = content.replaceAll(OLD_REPO_PATH, NEW_REPO_PATH);
522
+ if (content !== originalContent) fs.writeFileSync(file, content, 'utf-8');
523
+ }
524
+ });
525
+
526
+ console.log("9. Cleaning up...");
527
+ fs.rmSync(path.join('node_modules', OLD_PKG_NAME), { recursive: true, force: true });
528
+ if (fs.existsSync('package-lock.json')) fs.rmSync('package-lock.json');
529
+ execSync('npm install', { stdio: 'inherit' });
530
+
531
+ console.log("\n" + "=".repeat(72));
532
+ if (ERRORS) { console.error(`FAILED with ${ERRORS} error(s)`); process.exit(1); }
533
+ console.log(`✅ Unification complete! Push to ${NEW_REPO_PATH} and publish to NPM as ${NEW_PKG_NAME}.`);
534
+ console.log("Next: node diagnostics.mjs");
535
+ console.log("=".repeat(72));
536
+ }
537
+ main();
package/vite.config.ts ADDED
@@ -0,0 +1,18 @@
1
+ import path from "path";
2
+ import { fileURLToPath } from "url";
3
+ import tailwindcss from "@tailwindcss/vite";
4
+ import react from "@vitejs/plugin-react";
5
+ import { defineConfig } from "vite";
6
+ import { viteSingleFile } from "vite-plugin-singlefile";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ export default defineConfig({
12
+ plugins: [react(), tailwindcss(), viteSingleFile()],
13
+ resolve: {
14
+ alias: {
15
+ "@": path.resolve(__dirname, "src"),
16
+ }
17
+ }
18
+ });