mirror-mind 0.0.1 → 0.32.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 (467) hide show
  1. package/.claude/hooks/log-session-end.sh +85 -0
  2. package/.claude/hooks/log-user-prompt.sh +85 -0
  3. package/.claude/hooks/mirror-inject.sh +85 -0
  4. package/.claude/hooks/session-start.sh +85 -0
  5. package/.gemini/hooks/log-assistant.sh +85 -0
  6. package/.gemini/hooks/log-user.sh +85 -0
  7. package/.gemini/hooks/session-end.sh +85 -0
  8. package/.gemini/hooks/session-start.sh +85 -0
  9. package/.pi/extensions/mirror-logger.ts +561 -0
  10. package/.pi/skills/mm-backup/SKILL.md +21 -0
  11. package/.pi/skills/mm-build/SKILL.md +1206 -0
  12. package/.pi/skills/mm-consolidate/SKILL.md +112 -0
  13. package/.pi/skills/mm-consult/SKILL.md +70 -0
  14. package/.pi/skills/mm-conversations/SKILL.md +16 -0
  15. package/.pi/skills/mm-discard/SKILL.md +39 -0
  16. package/.pi/skills/mm-explore/SKILL.md +255 -0
  17. package/.pi/skills/mm-help/SKILL.md +74 -0
  18. package/.pi/skills/mm-identity/SKILL.md +96 -0
  19. package/.pi/skills/mm-journal/SKILL.md +16 -0
  20. package/.pi/skills/mm-journey/SKILL.md +23 -0
  21. package/.pi/skills/mm-journeys/SKILL.md +15 -0
  22. package/.pi/skills/mm-memories/SKILL.md +17 -0
  23. package/.pi/skills/mm-mirror/SKILL.md +98 -0
  24. package/.pi/skills/mm-mute/SKILL.md +18 -0
  25. package/.pi/skills/mm-new/SKILL.md +18 -0
  26. package/.pi/skills/mm-recall/SKILL.md +17 -0
  27. package/.pi/skills/mm-release-notes/SKILL.md +52 -0
  28. package/.pi/skills/mm-seed/SKILL.md +19 -0
  29. package/.pi/skills/mm-shadow/SKILL.md +117 -0
  30. package/.pi/skills/mm-soul/SKILL.md +502 -0
  31. package/.pi/skills/mm-tasks/SKILL.md +24 -0
  32. package/.pi/skills/mm-update/SKILL.md +32 -0
  33. package/.pi/skills/mm-week/SKILL.md +28 -0
  34. package/.pi/skills/mm-welcome/SKILL.md +24 -0
  35. package/AGENTS.md +188 -0
  36. package/README.md +126 -9
  37. package/bin/loader.js +67 -0
  38. package/bin/mirror-hook.js +7 -0
  39. package/bin/mirror.js +7 -0
  40. package/docs/releases/index.md +99 -0
  41. package/docs/releases/pending-cutoffs.md +510 -0
  42. package/docs/releases/v0.10.0.md +123 -0
  43. package/docs/releases/v0.10.1.md +66 -0
  44. package/docs/releases/v0.10.10.md +51 -0
  45. package/docs/releases/v0.10.11.md +39 -0
  46. package/docs/releases/v0.10.12.md +57 -0
  47. package/docs/releases/v0.10.13.md +35 -0
  48. package/docs/releases/v0.10.14.md +42 -0
  49. package/docs/releases/v0.10.15.md +53 -0
  50. package/docs/releases/v0.10.16.md +35 -0
  51. package/docs/releases/v0.10.17.md +43 -0
  52. package/docs/releases/v0.10.2.md +64 -0
  53. package/docs/releases/v0.10.3.md +78 -0
  54. package/docs/releases/v0.10.4.md +42 -0
  55. package/docs/releases/v0.10.5.md +57 -0
  56. package/docs/releases/v0.10.6.md +47 -0
  57. package/docs/releases/v0.10.7.md +53 -0
  58. package/docs/releases/v0.10.8.md +49 -0
  59. package/docs/releases/v0.10.9.md +37 -0
  60. package/docs/releases/v0.11.0.md +86 -0
  61. package/docs/releases/v0.12.0.md +67 -0
  62. package/docs/releases/v0.13.0.md +64 -0
  63. package/docs/releases/v0.14.0.md +68 -0
  64. package/docs/releases/v0.15.0.md +48 -0
  65. package/docs/releases/v0.16.0.md +50 -0
  66. package/docs/releases/v0.16.1.md +55 -0
  67. package/docs/releases/v0.16.2.md +36 -0
  68. package/docs/releases/v0.17.0.md +50 -0
  69. package/docs/releases/v0.17.1.md +58 -0
  70. package/docs/releases/v0.17.2.md +42 -0
  71. package/docs/releases/v0.17.3.md +58 -0
  72. package/docs/releases/v0.18.0.md +84 -0
  73. package/docs/releases/v0.18.1.md +51 -0
  74. package/docs/releases/v0.18.2.md +69 -0
  75. package/docs/releases/v0.19.0.md +85 -0
  76. package/docs/releases/v0.19.1.md +46 -0
  77. package/docs/releases/v0.20.0.md +85 -0
  78. package/docs/releases/v0.21.0.md +61 -0
  79. package/docs/releases/v0.21.1.md +47 -0
  80. package/docs/releases/v0.22.0.md +77 -0
  81. package/docs/releases/v0.22.1.md +42 -0
  82. package/docs/releases/v0.23.0.md +105 -0
  83. package/docs/releases/v0.24.0.md +125 -0
  84. package/docs/releases/v0.25.0.md +107 -0
  85. package/docs/releases/v0.26.0.md +139 -0
  86. package/docs/releases/v0.26.1.md +65 -0
  87. package/docs/releases/v0.26.2.md +43 -0
  88. package/docs/releases/v0.27.0.md +63 -0
  89. package/docs/releases/v0.28.0.md +59 -0
  90. package/docs/releases/v0.29.0.md +61 -0
  91. package/docs/releases/v0.29.1.md +59 -0
  92. package/docs/releases/v0.29.2.md +59 -0
  93. package/docs/releases/v0.29.3.md +93 -0
  94. package/docs/releases/v0.30.0.md +75 -0
  95. package/docs/releases/v0.30.1.md +93 -0
  96. package/docs/releases/v0.30.2.md +66 -0
  97. package/docs/releases/v0.31.0.md +122 -0
  98. package/docs/releases/v0.31.1.md +142 -0
  99. package/docs/releases/v0.31.10.md +118 -0
  100. package/docs/releases/v0.31.11.md +88 -0
  101. package/docs/releases/v0.31.12.md +105 -0
  102. package/docs/releases/v0.31.13.md +99 -0
  103. package/docs/releases/v0.31.14.md +97 -0
  104. package/docs/releases/v0.31.2.md +115 -0
  105. package/docs/releases/v0.31.3.md +142 -0
  106. package/docs/releases/v0.31.4.md +117 -0
  107. package/docs/releases/v0.31.5.md +155 -0
  108. package/docs/releases/v0.31.6.md +132 -0
  109. package/docs/releases/v0.31.7.md +132 -0
  110. package/docs/releases/v0.31.8.md +120 -0
  111. package/docs/releases/v0.31.9.md +120 -0
  112. package/docs/releases/v0.32.0.md +261 -0
  113. package/docs/releases/v0.32.1.md +59 -0
  114. package/docs/releases/v0.8.0.md +118 -0
  115. package/docs/releases/v0.9.0.md +98 -0
  116. package/docs/releases/v0.9.1.md +83 -0
  117. package/package.json +102 -6
  118. package/plugins/mirror-mind/.claude-plugin/plugin.json +13 -0
  119. package/plugins/mirror-mind/hooks/hooks.json +50 -0
  120. package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
  121. package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
  122. package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
  123. package/plugins/mirror-mind/hooks/session-start.sh +98 -0
  124. package/plugins/mirror-mind/mcp/launch.sh +52 -0
  125. package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
  126. package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
  127. package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
  128. package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
  129. package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
  130. package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
  131. package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
  132. package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
  133. package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
  134. package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
  135. package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
  136. package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
  137. package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
  138. package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +65 -0
  139. package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
  140. package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
  141. package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
  142. package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
  143. package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
  144. package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
  145. package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
  146. package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
  147. package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
  148. package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
  149. package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
  150. package/scripts/codex-hooks/session-end.sh +85 -0
  151. package/scripts/codex-hooks/session-start.sh +85 -0
  152. package/scripts/codex-mirror.sh +48 -0
  153. package/templates/identity/README.md +119 -0
  154. package/templates/identity/ego/behavior.yaml +52 -0
  155. package/templates/identity/ego/constraints.yaml +15 -0
  156. package/templates/identity/ego/identity.yaml +43 -0
  157. package/templates/identity/journeys/personal-growth.yaml +39 -0
  158. package/templates/identity/organization/identity.yaml +24 -0
  159. package/templates/identity/organization/principles.yaml +17 -0
  160. package/templates/identity/personas/coach.yaml +94 -0
  161. package/templates/identity/personas/designer.yaml +93 -0
  162. package/templates/identity/personas/doctor.yaml +96 -0
  163. package/templates/identity/personas/engineer.yaml +77 -0
  164. package/templates/identity/personas/financial.yaml +97 -0
  165. package/templates/identity/personas/prompt-engineer.yaml +122 -0
  166. package/templates/identity/personas/researcher.yaml +88 -0
  167. package/templates/identity/personas/strategist.yaml +91 -0
  168. package/templates/identity/personas/teacher.yaml +95 -0
  169. package/templates/identity/personas/therapist.yaml +91 -0
  170. package/templates/identity/personas/thinker.yaml +74 -0
  171. package/templates/identity/personas/writer.yaml +76 -0
  172. package/templates/identity/self/config.yaml +16 -0
  173. package/templates/identity/self/soul.yaml +105 -0
  174. package/templates/identity/user/identity.yaml +30 -0
  175. package/ts/src/backup/staging.ts +62 -0
  176. package/ts/src/backup/zipBackup.ts +267 -0
  177. package/ts/src/backup/zipReader.ts +109 -0
  178. package/ts/src/backup/zipWriter.ts +148 -0
  179. package/ts/src/builder/activeCheckpoint.ts +134 -0
  180. package/ts/src/builder/aggregateStatus.ts +34 -0
  181. package/ts/src/builder/approve.ts +149 -0
  182. package/ts/src/builder/argv.ts +292 -0
  183. package/ts/src/builder/ariadMethod.ts +536 -0
  184. package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
  185. package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
  186. package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
  187. package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
  188. package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
  189. package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
  190. package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
  191. package/ts/src/builder/artifacts/storyFiles.ts +61 -0
  192. package/ts/src/builder/artifacts/storyIndex.ts +166 -0
  193. package/ts/src/builder/cadence.ts +59 -0
  194. package/ts/src/builder/card.ts +192 -0
  195. package/ts/src/builder/checkpointRefused.ts +66 -0
  196. package/ts/src/builder/closure.ts +964 -0
  197. package/ts/src/builder/commands.ts +2053 -0
  198. package/ts/src/builder/cursorPosition.ts +176 -0
  199. package/ts/src/builder/cursorTransitions.ts +77 -0
  200. package/ts/src/builder/deliveryCursor.ts +577 -0
  201. package/ts/src/builder/deliveryStoryClosure.ts +521 -0
  202. package/ts/src/builder/deliveryStoryPlan.ts +536 -0
  203. package/ts/src/builder/deliveryStoryReady.ts +160 -0
  204. package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
  205. package/ts/src/builder/expand.ts +336 -0
  206. package/ts/src/builder/flowUnit.ts +339 -0
  207. package/ts/src/builder/homeSurface.ts +122 -0
  208. package/ts/src/builder/implementationGuard.ts +125 -0
  209. package/ts/src/builder/index.ts +11 -0
  210. package/ts/src/builder/lifecycleRefusal.ts +92 -0
  211. package/ts/src/builder/lifecycleRibbon.ts +159 -0
  212. package/ts/src/builder/load.ts +313 -0
  213. package/ts/src/builder/methodAdoption.ts +113 -0
  214. package/ts/src/builder/methodDefinition.ts +429 -0
  215. package/ts/src/builder/methodInspection.ts +371 -0
  216. package/ts/src/builder/plan.ts +408 -0
  217. package/ts/src/builder/planPreauthorization.ts +265 -0
  218. package/ts/src/builder/prepare.ts +225 -0
  219. package/ts/src/builder/projectPaths.ts +64 -0
  220. package/ts/src/builder/pull.ts +356 -0
  221. package/ts/src/builder/pullCandidates.ts +463 -0
  222. package/ts/src/builder/pullCandidatesRender.ts +238 -0
  223. package/ts/src/builder/refinementField.ts +93 -0
  224. package/ts/src/builder/releaseIntent.ts +173 -0
  225. package/ts/src/builder/resumeState.ts +84 -0
  226. package/ts/src/builder/resumeSurface.ts +149 -0
  227. package/ts/src/builder/roadmapGrammar.ts +300 -0
  228. package/ts/src/builder/roadmapScan.ts +97 -0
  229. package/ts/src/builder/roadmapScope.ts +210 -0
  230. package/ts/src/builder/scopePhrases.ts +146 -0
  231. package/ts/src/builder/storyPaths.ts +196 -0
  232. package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
  233. package/ts/src/builder/surfaceProtocol.ts +42 -0
  234. package/ts/src/builder/templateGeneration.ts +148 -0
  235. package/ts/src/builder/transition.ts +178 -0
  236. package/ts/src/consult/args.ts +99 -0
  237. package/ts/src/consult/core.ts +122 -0
  238. package/ts/src/consult/modelCatalog.ts +55 -0
  239. package/ts/src/consult/render.ts +47 -0
  240. package/ts/src/conversation/append.ts +414 -0
  241. package/ts/src/conversation/backfill.ts +387 -0
  242. package/ts/src/conversation/closeTail.ts +467 -0
  243. package/ts/src/conversation/extraction.ts +333 -0
  244. package/ts/src/conversation/extractionDriver.ts +130 -0
  245. package/ts/src/conversation/extractionRun.ts +70 -0
  246. package/ts/src/conversation/journeyInference.ts +165 -0
  247. package/ts/src/conversation/journeyRepair.ts +114 -0
  248. package/ts/src/conversation/lifecycleFaces.ts +197 -0
  249. package/ts/src/conversation/lifecycleWrites.ts +313 -0
  250. package/ts/src/conversation/listing.ts +77 -0
  251. package/ts/src/conversation/logger.ts +576 -0
  252. package/ts/src/conversation/loggerCli.ts +282 -0
  253. package/ts/src/conversation/loggerRuntime.ts +259 -0
  254. package/ts/src/conversation/metadataLifecycle.ts +443 -0
  255. package/ts/src/conversation/recall.ts +66 -0
  256. package/ts/src/conversation/sessionComposites.ts +258 -0
  257. package/ts/src/conversation/sessionImport.ts +90 -0
  258. package/ts/src/conversation/transcriptBackfill.ts +141 -0
  259. package/ts/src/cultivation/applyActions.ts +241 -0
  260. package/ts/src/cultivation/cluster.ts +86 -0
  261. package/ts/src/cultivation/consolidationStore.ts +281 -0
  262. package/ts/src/cultivation/promptContext.ts +62 -0
  263. package/ts/src/cultivation/propose.ts +305 -0
  264. package/ts/src/cultivation/scan.ts +155 -0
  265. package/ts/src/db/backupGate.ts +47 -0
  266. package/ts/src/db/bootstrap.ts +108 -0
  267. package/ts/src/db/bootstrapLock.ts +223 -0
  268. package/ts/src/db/copyGuard.ts +60 -0
  269. package/ts/src/db/database.ts +397 -0
  270. package/ts/src/db/decode.ts +66 -0
  271. package/ts/src/db/ftsIntegrity.ts +41 -0
  272. package/ts/src/db/migrateOnOpen.ts +214 -0
  273. package/ts/src/db/migrations.ts +576 -0
  274. package/ts/src/db/readyOnOpen.ts +35 -0
  275. package/ts/src/db/rowDecode.ts +42 -0
  276. package/ts/src/db/schema.ts +432 -0
  277. package/ts/src/db/schemaInventory.ts +225 -0
  278. package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
  279. package/ts/src/db/schemaState.ts +91 -0
  280. package/ts/src/db/schemaTsDivergence.ts +114 -0
  281. package/ts/src/descriptor/descriptorRead.ts +49 -0
  282. package/ts/src/docs/docsLint.ts +265 -0
  283. package/ts/src/explorer/handoff.ts +522 -0
  284. package/ts/src/explorer/render.ts +335 -0
  285. package/ts/src/explorer/story.ts +769 -0
  286. package/ts/src/explorer/transition.ts +72 -0
  287. package/ts/src/extensions/bindings.ts +170 -0
  288. package/ts/src/extensions/catalog.ts +249 -0
  289. package/ts/src/extensions/catalogCommands.ts +513 -0
  290. package/ts/src/extensions/catalogWrites.ts +652 -0
  291. package/ts/src/extensions/contextRuntime.ts +325 -0
  292. package/ts/src/extensions/dispatch.ts +374 -0
  293. package/ts/src/extensions/errors.ts +24 -0
  294. package/ts/src/extensions/manifest.ts +356 -0
  295. package/ts/src/extensions/migrations.ts +350 -0
  296. package/ts/src/extraction/conversation.ts +304 -0
  297. package/ts/src/extraction/conversationMetadata.ts +206 -0
  298. package/ts/src/extraction/fencing.ts +106 -0
  299. package/ts/src/extraction/json.ts +17 -0
  300. package/ts/src/extraction/prompts.ts +470 -0
  301. package/ts/src/frontDoor/args.ts +30 -0
  302. package/ts/src/frontDoor/argvShape.ts +106 -0
  303. package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
  304. package/ts/src/frontDoor/buildRoute.ts +398 -0
  305. package/ts/src/frontDoor/cli.ts +1865 -0
  306. package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
  307. package/ts/src/frontDoor/consultRoute.ts +50 -0
  308. package/ts/src/frontDoor/contentTailRoute.ts +239 -0
  309. package/ts/src/frontDoor/conversationLoggerRoute.ts +73 -0
  310. package/ts/src/frontDoor/cultivationRoute.ts +210 -0
  311. package/ts/src/frontDoor/dbPath.ts +131 -0
  312. package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
  313. package/ts/src/frontDoor/exploreRoute.ts +572 -0
  314. package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
  315. package/ts/src/frontDoor/frontDoorLog.ts +57 -0
  316. package/ts/src/frontDoor/identityWrite.ts +36 -0
  317. package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
  318. package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
  319. package/ts/src/frontDoor/liveBackup.ts +100 -0
  320. package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
  321. package/ts/src/frontDoor/namedRefusal.ts +35 -0
  322. package/ts/src/frontDoor/nodeSupport.ts +24 -0
  323. package/ts/src/frontDoor/render/consolidate.ts +199 -0
  324. package/ts/src/frontDoor/render/conversations.ts +33 -0
  325. package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
  326. package/ts/src/frontDoor/render/descriptor.ts +20 -0
  327. package/ts/src/frontDoor/render/detectPersona.ts +50 -0
  328. package/ts/src/frontDoor/render/icons.ts +13 -0
  329. package/ts/src/frontDoor/render/identity.ts +59 -0
  330. package/ts/src/frontDoor/render/identityRows.ts +17 -0
  331. package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
  332. package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
  333. package/ts/src/frontDoor/render/journeys.ts +79 -0
  334. package/ts/src/frontDoor/render/list.ts +41 -0
  335. package/ts/src/frontDoor/render/memories.ts +67 -0
  336. package/ts/src/frontDoor/render/recall.ts +49 -0
  337. package/ts/src/frontDoor/render/shadow.ts +155 -0
  338. package/ts/src/frontDoor/render/tasks.ts +99 -0
  339. package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
  340. package/ts/src/frontDoor/render/week.ts +113 -0
  341. package/ts/src/frontDoor/routing.ts +999 -0
  342. package/ts/src/frontDoor/runtimeRoute.ts +623 -0
  343. package/ts/src/frontDoor/searchRoute.ts +166 -0
  344. package/ts/src/frontDoor/seedPaths.ts +98 -0
  345. package/ts/src/frontDoor/soulRoute.ts +433 -0
  346. package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
  347. package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
  348. package/ts/src/frontDoor/usage.ts +176 -0
  349. package/ts/src/guards/claudePlugin.ts +252 -0
  350. package/ts/src/guards/packContents.ts +306 -0
  351. package/ts/src/guards/piSourcedSkills.ts +70 -0
  352. package/ts/src/guards/retiredRouteShadows.ts +57 -0
  353. package/ts/src/guards/retiredSurfaces.ts +564 -0
  354. package/ts/src/hooks/claude.ts +176 -0
  355. package/ts/src/hooks/codex.ts +45 -0
  356. package/ts/src/hooks/gemini.ts +126 -0
  357. package/ts/src/hooks/main.ts +109 -0
  358. package/ts/src/hooks/mirrorState.ts +71 -0
  359. package/ts/src/hooks/payload.ts +68 -0
  360. package/ts/src/hooks/runtime.ts +159 -0
  361. package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
  362. package/ts/src/identity/descriptorGenerate.ts +162 -0
  363. package/ts/src/identity/identityEdit.ts +143 -0
  364. package/ts/src/identity/identityKey.ts +77 -0
  365. package/ts/src/identity/identityRead.ts +69 -0
  366. package/ts/src/identity/identityStore.ts +80 -0
  367. package/ts/src/identity/journeyListing.ts +53 -0
  368. package/ts/src/identity/personaInspect.ts +44 -0
  369. package/ts/src/identity/personaListing.ts +37 -0
  370. package/ts/src/identity/setIdentity.ts +64 -0
  371. package/ts/src/index.ts +231 -0
  372. package/ts/src/init/init.ts +111 -0
  373. package/ts/src/journey/journeyOptions.ts +131 -0
  374. package/ts/src/journey/journeyRemoval.ts +158 -0
  375. package/ts/src/journey/journeyStatus.ts +149 -0
  376. package/ts/src/journey/journeySyncFile.ts +87 -0
  377. package/ts/src/journey/journeyWrite.ts +203 -0
  378. package/ts/src/journey/parentJourney.ts +41 -0
  379. package/ts/src/journey/validateParentJourney.ts +55 -0
  380. package/ts/src/mcp/boundary.ts +151 -0
  381. package/ts/src/mcp/guards.ts +244 -0
  382. package/ts/src/mcp/main.ts +121 -0
  383. package/ts/src/mcp/payload.ts +141 -0
  384. package/ts/src/mcp/protocol.ts +141 -0
  385. package/ts/src/mcp/readModels.ts +241 -0
  386. package/ts/src/mcp/registry.ts +201 -0
  387. package/ts/src/mcp/serve.ts +120 -0
  388. package/ts/src/mcp/tools/deterministic.ts +137 -0
  389. package/ts/src/mcp/tools/providerCrossing.ts +187 -0
  390. package/ts/src/mcp/wire.ts +8 -0
  391. package/ts/src/memory/journal.ts +180 -0
  392. package/ts/src/memory/listing.ts +107 -0
  393. package/ts/src/memory/memoryWrite.ts +88 -0
  394. package/ts/src/memory/reinforcement.ts +35 -0
  395. package/ts/src/mirror/context.ts +161 -0
  396. package/ts/src/mirror/defaultResolution.ts +199 -0
  397. package/ts/src/mirror/orchestration.ts +364 -0
  398. package/ts/src/mirror/reception.ts +194 -0
  399. package/ts/src/mirror/render.ts +75 -0
  400. package/ts/src/mirror/runtimeSession.ts +205 -0
  401. package/ts/src/mode/operatingMode.ts +148 -0
  402. package/ts/src/observability/callOutcome.ts +115 -0
  403. package/ts/src/observability/inspectLedger.ts +329 -0
  404. package/ts/src/observability/ledgerHooks.ts +126 -0
  405. package/ts/src/observability/llmCalls.ts +154 -0
  406. package/ts/src/persona/detectPersona.ts +81 -0
  407. package/ts/src/planning/promptAssembly.ts +111 -0
  408. package/ts/src/planning/weekPending.ts +81 -0
  409. package/ts/src/planning/weekPlan.ts +183 -0
  410. package/ts/src/planning/weekSave.ts +117 -0
  411. package/ts/src/providers/config.ts +189 -0
  412. package/ts/src/providers/cost.ts +64 -0
  413. package/ts/src/providers/credits.ts +204 -0
  414. package/ts/src/providers/embedding.ts +321 -0
  415. package/ts/src/providers/familyProviders.ts +147 -0
  416. package/ts/src/providers/llm.ts +334 -0
  417. package/ts/src/providers/openrouter.ts +244 -0
  418. package/ts/src/providers/redaction.ts +110 -0
  419. package/ts/src/providers/replay.ts +15 -0
  420. package/ts/src/providers/transport.ts +410 -0
  421. package/ts/src/repair/encodingRepair.ts +253 -0
  422. package/ts/src/runtime/backup.ts +151 -0
  423. package/ts/src/runtime/channel.ts +146 -0
  424. package/ts/src/runtime/config.ts +168 -0
  425. package/ts/src/runtime/diagnose.ts +686 -0
  426. package/ts/src/runtime/git.ts +510 -0
  427. package/ts/src/runtime/installKind.ts +220 -0
  428. package/ts/src/runtime/migrate.ts +154 -0
  429. package/ts/src/runtime/packageIdentity.ts +102 -0
  430. package/ts/src/runtime/releaseNotes.ts +244 -0
  431. package/ts/src/runtime/status.ts +557 -0
  432. package/ts/src/runtime/strategies/clone.ts +200 -0
  433. package/ts/src/runtime/strategies/package.ts +328 -0
  434. package/ts/src/runtime/treeRoot.ts +30 -0
  435. package/ts/src/runtime/update.ts +445 -0
  436. package/ts/src/runtime/updateGate.ts +40 -0
  437. package/ts/src/runtime/updatePipeline.ts +159 -0
  438. package/ts/src/runtime/version.ts +36 -0
  439. package/ts/src/runtime/wiring.ts +130 -0
  440. package/ts/src/search/memorySearch.ts +338 -0
  441. package/ts/src/search/ranker.ts +154 -0
  442. package/ts/src/seed/seed.ts +256 -0
  443. package/ts/src/seed/seedYaml.ts +133 -0
  444. package/ts/src/soul/apply.ts +218 -0
  445. package/ts/src/soul/harvest.ts +267 -0
  446. package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
  447. package/ts/src/soul/prompts/soul_self_voice.md +219 -0
  448. package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
  449. package/ts/src/soul/prompts.ts +85 -0
  450. package/ts/src/soul/render.ts +358 -0
  451. package/ts/src/soul/state.ts +212 -0
  452. package/ts/src/soul/transition.ts +37 -0
  453. package/ts/src/tasks/journeyPathParse.ts +113 -0
  454. package/ts/src/tasks/taskImportSync.ts +142 -0
  455. package/ts/src/tasks/taskStore.ts +312 -0
  456. package/ts/src/tasks/weekView.ts +120 -0
  457. package/ts/src/util/clipCodePoints.ts +26 -0
  458. package/ts/src/util/paths.ts +63 -0
  459. package/ts/src/util/program.ts +9 -0
  460. package/ts/src/util/pyGenerators.ts +144 -0
  461. package/ts/src/util/pythonText.ts +317 -0
  462. package/ts/src/util/semver.ts +45 -0
  463. package/ts/src/util/shellWord.ts +25 -0
  464. package/ts/src/util/slug.ts +64 -0
  465. package/ts/src/welcome/card.ts +339 -0
  466. package/ts/src/welcome/statusLine.ts +101 -0
  467. package/ts/src/welcome/updateCache.ts +129 -0
@@ -0,0 +1,131 @@
1
+ // DB-path resolution for the TS front door — the port of the Python config
2
+ // resolution (`src/memory/config.py`).
3
+ //
4
+ // Python semantics reproduced here (CR024/CR007):
5
+ // - The environment selects the database NAME: `db_name_for_env` maps
6
+ // production→memory.db, development→memory_dev.db, test→memory_test.db,
7
+ // anything else→memory_<env>.db. A dev session must never touch memory.db.
8
+ // - Env-var precedence matches Python: DB_PATH (full file path) wins over
9
+ // every derived directory; then MEMORY_PROD_DIR (production only), then
10
+ // MEMORY_DIR, then the mirror home from MIRROR_HOME/MIRROR_USER.
11
+ // - MIRROR_HOME and MIRROR_USER conflict (home basename must equal the user,
12
+ // as in `resolve_mirror_home`) raises instead of silently preferring one.
13
+ // - MIRROR_USER falls back to the legacy `~/.mirror/<user>` home when the
14
+ // modern `~/.mirror-minds/<user>` does not exist (one-line stderr warning,
15
+ // permanent support — see docs/project/decisions.md).
16
+ // - Nothing configured fails loudly (CV9.E2.S6: unconfigured resolution must
17
+ // not write to the homes root), unlike the pre-CR024 silent fallback.
18
+ //
19
+ // Front-door-only extension: the CLI flags `--db-path` and `--mirror-home`
20
+ // are explicit per-invocation intent and take precedence over all env vars.
21
+
22
+ import { existsSync } from "node:fs";
23
+ import { homedir } from "node:os";
24
+ import { basename, join } from "node:path";
25
+ import { expandHome } from "#util/paths.ts";
26
+ import { optionValue } from "./args.ts";
27
+
28
+ /** Raised when no database location can be resolved — maps to CLI exit 2. */
29
+ export class MirrorHomeNotConfiguredError extends Error {}
30
+
31
+ const DB_NAMES: Record<string, string> = {
32
+ production: "memory.db",
33
+ development: "memory_dev.db",
34
+ test: "memory_test.db",
35
+ };
36
+
37
+ const DEFAULT_USER_HOMES_DIR = ".mirror-minds";
38
+ const LEGACY_USER_HOMES_DIR = ".mirror";
39
+
40
+ /** Port of Python `db_name_for_env`: one (environment) → one database name. */
41
+ export function dbNameForEnv(env: string): string {
42
+ return DB_NAMES[env] ?? `memory_${env}.db`;
43
+ }
44
+
45
+ /** The env-var slice the resolver reads. `process.env` satisfies it. */
46
+ export interface DbPathEnv {
47
+ MEMORY_ENV?: string;
48
+ DB_PATH?: string;
49
+ MEMORY_PROD_DIR?: string;
50
+ MEMORY_DIR?: string;
51
+ MIRROR_HOME?: string;
52
+ MIRROR_USER?: string;
53
+ }
54
+
55
+ /** Injection points so tests can run without touching the real filesystem. */
56
+ export interface DbPathIo {
57
+ home?: string;
58
+ exists?: (path: string) => boolean;
59
+ warn?: (message: string) => void;
60
+ }
61
+
62
+ /**
63
+ * Port of Python `resolve_mirror_home`: MIRROR_HOME wins; MIRROR_USER derives
64
+ * `<home>/.mirror-minds/<user>` (with the legacy `.mirror` fallback); both set
65
+ * and inconsistent raises; neither set raises.
66
+ */
67
+ export function resolveMirrorHome(env: DbPathEnv, io: DbPathIo = {}): string {
68
+ const home = io.home ?? homedir();
69
+ const exists = io.exists ?? existsSync;
70
+ const warn = io.warn ?? ((message: string) => console.error(message));
71
+
72
+ const explicitHome = env.MIRROR_HOME ?? "";
73
+ const explicitUser = env.MIRROR_USER ?? "";
74
+ const resolvedHome = explicitHome ? expandHome(explicitHome) : null;
75
+ const derivedHome = explicitUser ? join(home, DEFAULT_USER_HOMES_DIR, explicitUser) : null;
76
+
77
+ if (resolvedHome && explicitUser && basename(resolvedHome) !== explicitUser) {
78
+ throw new MirrorHomeNotConfiguredError(
79
+ `MIRROR_HOME (${resolvedHome}) conflicts with MIRROR_USER (${explicitUser}).`,
80
+ );
81
+ }
82
+ if (resolvedHome) return resolvedHome;
83
+ if (derivedHome) {
84
+ if (!exists(derivedHome)) {
85
+ const legacyHome = join(home, LEGACY_USER_HOMES_DIR, explicitUser);
86
+ if (exists(legacyHome)) {
87
+ warn(
88
+ `warning: using legacy mirror home at ${legacyHome}. ` +
89
+ `To migrate: mv ${legacyHome} ${derivedHome}. ` +
90
+ "The legacy path remains supported indefinitely.",
91
+ );
92
+ return legacyHome;
93
+ }
94
+ }
95
+ return derivedHome;
96
+ }
97
+ throw new MirrorHomeNotConfiguredError(
98
+ "Mirror home is not configured. Set MIRROR_HOME or MIRROR_USER " +
99
+ "(or pass an explicit MEMORY_DIR/DB_PATH override).",
100
+ );
101
+ }
102
+
103
+ /**
104
+ * Resolve the database file for a front-door invocation.
105
+ *
106
+ * Precedence: `--db-path` flag → `--mirror-home` flag → `DB_PATH` env →
107
+ * `MEMORY_PROD_DIR` (production only) → `MEMORY_DIR` → mirror home
108
+ * (MIRROR_HOME/MIRROR_USER). Every directory branch joins the
109
+ * environment-specific database name; the two full-file-path branches
110
+ * (`--db-path`, `DB_PATH`) are used as-is, matching Python.
111
+ */
112
+ export function resolveDbPath(
113
+ args: readonly string[],
114
+ env: DbPathEnv = process.env,
115
+ io: DbPathIo = {},
116
+ ): string {
117
+ const explicitDbPath = optionValue(args, "--db-path");
118
+ if (explicitDbPath) return expandHome(explicitDbPath);
119
+
120
+ const selectedEnv = env.MEMORY_ENV || "production";
121
+ const dbName = dbNameForEnv(selectedEnv);
122
+
123
+ const explicitHome = optionValue(args, "--mirror-home");
124
+ if (explicitHome) return join(expandHome(explicitHome), dbName);
125
+ if (env.DB_PATH) return expandHome(env.DB_PATH);
126
+ if (selectedEnv === "production" && env.MEMORY_PROD_DIR) {
127
+ return join(expandHome(env.MEMORY_PROD_DIR), dbName);
128
+ }
129
+ if (env.MEMORY_DIR) return join(expandHome(env.MEMORY_DIR), dbName);
130
+ return join(resolveMirrorHome(env, io), dbName);
131
+ }
@@ -0,0 +1,240 @@
1
+ // Front-door routes for the DB safety tools (CV22.DS7.TS1): `backup` and
2
+ // `repair-encoding`. Argument handling mirrors the two Python argparse
3
+ // parsers closely enough that the exit codes and error lines match; the
4
+ // behavior itself lives in `#backup/zipBackup.ts` and
5
+ // `#repair/encodingRepair.ts`, graded by their goldens.
6
+ //
7
+ // `backup` never opens the database through the front door and never
8
+ // bootstraps one; its snapshot uses a read-only connection of its own. Since
9
+ // CR060, a backup that wrote no archive exits 1 whatever --silent says, with
10
+ // one stderr line that leads with the consequence -- Python exited 0 under
11
+ // --silent, which hid every failed session-end backup.
12
+ // `repair-encoding` reads through a plain read-only handle for the dry run
13
+ // (Python does not check the schema either — the scan is tolerant of old
14
+ // databases by design) and goes through the caller-supplied live-write seam
15
+ // for `--apply`, which adds the front door's own silent pre-write snapshot on
16
+ // top of the dated zip Python takes.
17
+
18
+ import { existsSync } from "node:fs";
19
+ import { dirname, join } from "node:path";
20
+ import { BackupSnapshotError, createZipBackup } from "#backup/zipBackup.ts";
21
+ import { Zip64RequiredError } from "#backup/zipWriter.ts";
22
+ import { type Database, openDatabaseReadOnly, type WritableDatabase } from "#db/database.ts";
23
+ import {
24
+ applyRepairs,
25
+ renderApplyReport,
26
+ renderScanReport,
27
+ scanDatabase,
28
+ } from "#repair/encodingRepair.ts";
29
+ import { expandHome } from "#util/paths.ts";
30
+ import { MirrorHomeNotConfiguredError } from "./dbPath.ts";
31
+
32
+ const BACKUP_USAGE =
33
+ "usage: backup [-h] [--silent] [--mirror-home MIRROR_HOME] [--backup-dir BACKUP_DIR]";
34
+ const REPAIR_USAGE =
35
+ "usage: repair-encoding [-h] [--mirror-home MIRROR_HOME] [--apply] [--no-backup] [--limit LIMIT]";
36
+
37
+ interface ParsedArgs {
38
+ flags: Set<string>;
39
+ values: Map<string, string>;
40
+ error: string | null;
41
+ }
42
+
43
+ /** argparse-shaped parsing: known flags, known valued options, nothing else. */
44
+ function parseArgs(
45
+ args: readonly string[],
46
+ spec: { flags: readonly string[]; valued: readonly string[] },
47
+ ): ParsedArgs {
48
+ const flags = new Set<string>();
49
+ const values = new Map<string, string>();
50
+ const unrecognized: string[] = [];
51
+ for (let index = 0; index < args.length; index += 1) {
52
+ const arg = args[index] as string;
53
+ if (spec.flags.includes(arg)) {
54
+ flags.add(arg);
55
+ } else if (spec.valued.includes(arg)) {
56
+ const value = args[index + 1];
57
+ if (value === undefined)
58
+ return { flags, values, error: `argument ${arg}: expected one argument` };
59
+ values.set(arg, value);
60
+ index += 1;
61
+ } else {
62
+ unrecognized.push(arg);
63
+ }
64
+ }
65
+ return {
66
+ flags,
67
+ values,
68
+ error: unrecognized.length > 0 ? `unrecognized arguments: ${unrecognized.join(" ")}` : null,
69
+ };
70
+ }
71
+
72
+ function usageError(usage: string, program: string, message: string): number {
73
+ process.stderr.write(`${usage}\n${program}: error: ${message}\n`);
74
+ return 2;
75
+ }
76
+
77
+ export interface SafetyToolsIo {
78
+ /**
79
+ * Resolve the database path from argv (`--db-path`, `--mirror-home`, env);
80
+ * null when unconfigured and already reported. `backup` is handed a resolver
81
+ * that throws `MirrorHomeNotConfiguredError` instead, so that failure is
82
+ * reported once, in the backup's own words.
83
+ */
84
+ resolveDbPath: (args: readonly string[]) => string | null;
85
+ /** The live-write seam for a resolved path: pre-write snapshot, schema guard, always-close. */
86
+ withLiveWriteDb: (dbPath: string, write: (db: WritableDatabase) => number) => number;
87
+ stdout?: (line: string) => void;
88
+ stderr?: (line: string) => void;
89
+ now?: () => Date;
90
+ env?: Readonly<Record<string, string | undefined>>;
91
+ }
92
+
93
+ /** What `backup` answered, for the caller and the front-door log. */
94
+ export interface BackupOutcome {
95
+ exitCode: number;
96
+ /** `backup=<why>` when no archive was written: content-free, never a path or an argument. */
97
+ detail?: string;
98
+ }
99
+
100
+ type BackupFailure = "home_unresolved" | "database_missing" | "snapshot_failed" | "write_failed";
101
+
102
+ /** An operating-system refusal (no space, no permission, a file in the way) rather than a bug. */
103
+ function isSystemError(error: unknown): error is NodeJS.ErrnoException {
104
+ return error instanceof Error && typeof (error as NodeJS.ErrnoException).code === "string";
105
+ }
106
+
107
+ /** `backup [--silent] [--mirror-home PATH] [--backup-dir PATH] [--db-path PATH]`. */
108
+ export function runBackupRoute(argv: readonly string[], io: SafetyToolsIo): BackupOutcome {
109
+ const args = argv.slice(1);
110
+ const parsed = parseArgs(args, {
111
+ flags: ["--silent"],
112
+ valued: ["--mirror-home", "--backup-dir", "--db-path"],
113
+ });
114
+ if (parsed.error) return { exitCode: usageError(BACKUP_USAGE, "backup", parsed.error) };
115
+ const silent = parsed.flags.has("--silent");
116
+ const err = io.stderr ?? ((line: string) => process.stderr.write(`${line}\n`));
117
+ // CR060: --silent suppresses progress, never failure.
118
+ const fail = (why: BackupFailure, reason: string): BackupOutcome => {
119
+ err(`backup: no archive was written: ${reason}`);
120
+ return { exitCode: 1, detail: `backup=${why}` };
121
+ };
122
+
123
+ let dbPath: string | null;
124
+ try {
125
+ dbPath = io.resolveDbPath(args);
126
+ } catch (error) {
127
+ if (error instanceof MirrorHomeNotConfiguredError)
128
+ return fail("home_unresolved", error.message);
129
+ throw error;
130
+ }
131
+ // A resolver that returns null has reported the failure itself.
132
+ if (dbPath === null) return { exitCode: 1, detail: "backup=home_unresolved" };
133
+
134
+ const explicitHome = parsed.values.get("--mirror-home");
135
+ const explicitDir = parsed.values.get("--backup-dir");
136
+ let archive: string | null;
137
+ try {
138
+ archive = createZipBackup({
139
+ dbPath,
140
+ mirrorHome: explicitHome === undefined ? dirname(dbPath) : expandHome(explicitHome),
141
+ backupDir: explicitDir === undefined ? null : expandHome(explicitDir),
142
+ silent,
143
+ env: io.env ?? process.env,
144
+ ...(io.now ? { now: io.now } : {}),
145
+ ...(io.stdout ? { stdout: io.stdout } : {}),
146
+ ...(io.stderr ? { stderr: io.stderr } : {}),
147
+ });
148
+ } catch (error) {
149
+ // Expected failures are one line; anything else is a bug and keeps its stack.
150
+ if (error instanceof BackupSnapshotError) return fail("snapshot_failed", error.message);
151
+ if (isSystemError(error) || error instanceof Zip64RequiredError) {
152
+ return fail("write_failed", error.message);
153
+ }
154
+ throw error;
155
+ }
156
+ if (archive === null) {
157
+ // Without --silent, createZipBackup already said "Database not found" on stdout.
158
+ if (!silent) return { exitCode: 1, detail: "backup=database_missing" };
159
+ return fail("database_missing", `database not found: ${dbPath}`);
160
+ }
161
+ return { exitCode: 0 };
162
+ }
163
+
164
+ /** `repair-encoding [--mirror-home PATH] [--apply] [--no-backup] [--limit N] [--db-path PATH]`. */
165
+ export function runRepairEncodingRoute(argv: readonly string[], io: SafetyToolsIo): number {
166
+ const args = argv.slice(1);
167
+ const parsed = parseArgs(args, {
168
+ flags: ["--apply", "--no-backup"],
169
+ valued: ["--mirror-home", "--limit", "--db-path"],
170
+ });
171
+ if (parsed.error) return usageError(REPAIR_USAGE, "repair-encoding", parsed.error);
172
+ const rawLimit = parsed.values.get("--limit");
173
+ // argparse `type=int`: Python's int() accepts surrounding whitespace and a sign.
174
+ if (rawLimit !== undefined && !/^\s*[+-]?\d+\s*$/.test(rawLimit)) {
175
+ return usageError(
176
+ REPAIR_USAGE,
177
+ "repair-encoding",
178
+ `argument --limit: invalid int value: '${rawLimit}'`,
179
+ );
180
+ }
181
+ const limit = rawLimit === undefined ? 20 : Number.parseInt(rawLimit, 10);
182
+ const apply = parsed.flags.has("--apply");
183
+ const noBackup = parsed.flags.has("--no-backup");
184
+ const out = io.stdout ?? ((line: string) => process.stdout.write(`${line}\n`));
185
+ const err = io.stderr ?? ((line: string) => process.stderr.write(`${line}\n`));
186
+
187
+ const dbPath = io.resolveDbPath(args);
188
+ if (dbPath === null) return 1;
189
+ if (!existsSync(dbPath)) {
190
+ err(`Database not found: ${dbPath}`);
191
+ return 1;
192
+ }
193
+
194
+ const explicitHome = parsed.values.get("--mirror-home");
195
+ const report = (db: Database) => {
196
+ const hits = scanDatabase(db);
197
+ out(renderScanReport({ dbPath, hits, limit }).replace(/\n$/, ""));
198
+ return hits;
199
+ };
200
+
201
+ if (!apply) {
202
+ const db = openDatabaseReadOnly(dbPath);
203
+ try {
204
+ report(db);
205
+ } finally {
206
+ db.close();
207
+ }
208
+ out("Dry-run only. Re-run with --apply to modify the database.");
209
+ return 0;
210
+ }
211
+
212
+ return io.withLiveWriteDb(dbPath, (db) => {
213
+ const hits = report(db);
214
+ if (hits.length === 0) {
215
+ out("No changes needed.");
216
+ return 0;
217
+ }
218
+ if (!noBackup) {
219
+ // Python: backup(silent=False, db_path, db_backup_path=<home>/backups,
220
+ // mirror_home=<explicit or None>) -- the `Mirror home:` line appears
221
+ // only when --mirror-home was passed.
222
+ const created = createZipBackup({
223
+ dbPath,
224
+ mirrorHome: explicitHome === undefined ? null : expandHome(explicitHome),
225
+ backupDir: join(dirname(dbPath), "backups"),
226
+ silent: false,
227
+ env: io.env ?? process.env,
228
+ ...(io.now ? { now: io.now } : {}),
229
+ stdout: out,
230
+ stderr: err,
231
+ });
232
+ if (created === null) {
233
+ err("Backup failed; aborting repair.");
234
+ return 1;
235
+ }
236
+ }
237
+ out(renderApplyReport(applyRepairs(db, hits)).replace(/\n$/, ""));
238
+ return 0;
239
+ });
240
+ }