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,93 @@
1
+ // The Refinement field snapshot.
2
+ //
3
+ // Port of `find_canonical_refinement_index`, `inspect_refinement_field`, and
4
+ // `_refinement_snapshot` from `src/memory/builder/home_surface.py`.
5
+ //
6
+ // CV22.DS7.US8 landed the filesystem half here and the Workbench read beside
7
+ // it, because `build load` rendered the `🧰 Refinement field` out of SQLite
8
+ // whenever a project had no `docs/project/refinement/index.md`.
9
+ // CV22.DS10.TS4 retired that Workbench, and with it the second authority: a
10
+ // project either HAS the canonical index or has not created it yet. There is
11
+ // no other place to look, so this module no longer takes a database read of
12
+ // any kind.
13
+ //
14
+ // The port reproduced one inherited oddity rather than clean it mid-port: a
15
+ // seed-CR count read from a HARD-CODED path into Mirror Mind's own roadmap,
16
+ // inside the USER's project -- any other project simply reported zero. It was
17
+ // carried as debt D-024 and removed from both engines by CV22.DS10.TS5, which
18
+ // left the field with a single conditional: the canonical index, or not yet.
19
+
20
+ import { statSync } from "node:fs";
21
+ import { join } from "node:path";
22
+
23
+ /** Python `CANONICAL_REFINEMENT_INDEX`. */
24
+ export const CANONICAL_REFINEMENT_INDEX = "docs/project/refinement/index.md";
25
+
26
+ /**
27
+ * Python `RefinementFieldSnapshot`.
28
+ *
29
+ * `activeRefinementStory` and `activeChangeRequest` are retained as always-null
30
+ * fields because the surfaces still read them; the three Workbench COUNTS went
31
+ * with the Workbench, since a permanently-zero count invites a reader to
32
+ * believe something counts it.
33
+ */
34
+ export interface RefinementFieldSnapshot {
35
+ readonly activeRefinementStory: string | null;
36
+ readonly activeChangeRequest: string | null;
37
+ readonly storageState: string;
38
+ readonly nextMove: string;
39
+ readonly canonicalIndex: string | null;
40
+ }
41
+
42
+ function isFile(path: string): boolean {
43
+ try {
44
+ return statSync(path).isFile();
45
+ } catch {
46
+ return false;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Python `find_canonical_refinement_index`: the project-relative path when the
52
+ * canonical index exists as a FILE. A directory at that path is not an index —
53
+ * Python's `is_file()`, not `exists()`.
54
+ */
55
+ export function findCanonicalRefinementIndex(projectPath: string | null): string | null {
56
+ if (projectPath === null) return null;
57
+ return isFile(join(projectPath, CANONICAL_REFINEMENT_INDEX)) ? CANONICAL_REFINEMENT_INDEX : null;
58
+ }
59
+
60
+ /**
61
+ * Python `inspect_refinement_field`.
62
+ *
63
+ * The canonical index reports `storage_state="project files"`; without it the
64
+ * answer is the same authority in its unstarted state.
65
+ */
66
+ export function inspectRefinementField(projectPath: string | null): RefinementFieldSnapshot {
67
+ const canonicalIndex = findCanonicalRefinementIndex(projectPath);
68
+ if (canonicalIndex !== null) {
69
+ return {
70
+ activeRefinementStory: null,
71
+ activeChangeRequest: null,
72
+ storageState: "project files",
73
+ nextMove: "inspect canonical Refinement index",
74
+ canonicalIndex,
75
+ };
76
+ }
77
+
78
+ return buildRefinementSnapshot();
79
+ }
80
+
81
+ /**
82
+ * Python `_refinement_snapshot`: the field for a project with no canonical
83
+ * index. One state, and the next move is to create the file.
84
+ */
85
+ export function buildRefinementSnapshot(): RefinementFieldSnapshot {
86
+ return {
87
+ activeRefinementStory: null,
88
+ activeChangeRequest: null,
89
+ storageState: "project files (not started)",
90
+ nextMove: `create ${CANONICAL_REFINEMENT_INDEX}`,
91
+ canonicalIndex: null,
92
+ };
93
+ }
@@ -0,0 +1,173 @@
1
+ // CV22.DS7.US8 plateau 6 — Delivery Story release intent.
2
+ //
3
+ // Port of `src/memory/builder/release_intent.py`.
4
+ //
5
+ // Release intent is the only Builder state that belongs to an ANCESTOR rather than
6
+ // to the active item: it is stored as a pair — the intent and the Delivery Story
7
+ // code it was recorded against — so moving to a story under a different Delivery
8
+ // Story makes the inspect face report `not_recorded` instead of inheriting the
9
+ // previous decision. Two cursor fields, one meaning.
10
+ //
11
+ // The boundary itself is derived from the active item's CODE by
12
+ // `deliveryStoryCodeForItem` (already ported for the cursor), so a story whose code
13
+ // carries no `DS<n>` segment has nothing to record against and is refused.
14
+ //
15
+ // `not_recorded` is a RENDERED value, never a stored one: the cursor holds `null`,
16
+ // and the surface distinguishes "nothing was decided" from the explicit decision
17
+ // `none`. Collapsing the two would erase the difference between an open question
18
+ // and an answered one, which is the whole point of the `undecided` value existing
19
+ // beside them.
20
+
21
+ import type { Database, WritableDatabase } from "#db/database.ts";
22
+ import { pyStrip } from "#util/pythonText.ts";
23
+ import { cardText, cardWrapped } from "./card.ts";
24
+ import { deliveryStoryCodeForItem } from "./cursorTransitions.ts";
25
+ import {
26
+ type BuilderDeliveryCursor,
27
+ type CursorWriteDeps,
28
+ getDeliveryCursor,
29
+ setDeliveryCursor,
30
+ } from "./deliveryCursor.ts";
31
+ import { wrapAriadSurface } from "./surfaceProtocol.ts";
32
+
33
+ /** Python `RELEASE_INTENTS`. */
34
+ export const RELEASE_INTENTS = ["planned", "none", "undecided"] as const;
35
+
36
+ export interface ReleaseIntentReport {
37
+ readonly journey: string;
38
+ readonly method: string;
39
+ readonly deliveryStory: string;
40
+ readonly intent: string;
41
+ readonly cursor: BuilderDeliveryCursor;
42
+ /** False when the pair already said this, which the surface renders as `inspected`. */
43
+ readonly changed: boolean;
44
+ }
45
+
46
+ /** Python `_active_delivery_story`: cursor, method match, then the DS ancestor. */
47
+ function activeDeliveryStory(
48
+ db: Database,
49
+ journey: string,
50
+ method: string,
51
+ ): { cursor: BuilderDeliveryCursor; deliveryStory: string } {
52
+ const cursor = getDeliveryCursor(db, journey);
53
+ if (cursor === null) {
54
+ throw new Error("delivery cursor is required before release intent");
55
+ }
56
+ if (cursor.method !== method) {
57
+ throw new Error("active Builder method does not match release intent method");
58
+ }
59
+ const deliveryStory = deliveryStoryCodeForItem(cursor.activeItem);
60
+ if (deliveryStory === null) {
61
+ throw new Error("active Delivery Story boundary is required for release intent");
62
+ }
63
+ return { cursor, deliveryStory };
64
+ }
65
+
66
+ /** Python `set_release_intent`. */
67
+ export function setReleaseIntent(
68
+ db: WritableDatabase,
69
+ options: { journey: string; method: string; intent: string },
70
+ deps: CursorWriteDeps,
71
+ ): ReleaseIntentReport {
72
+ const normalized = pyStrip(options.intent).toLowerCase();
73
+ if (!(RELEASE_INTENTS as readonly string[]).includes(normalized)) {
74
+ throw new Error("release intent must be planned, none, or undecided");
75
+ }
76
+ // Value first, then the cursor: an unknown intent is refused even with no cursor.
77
+ const { cursor, deliveryStory } = activeDeliveryStory(db, options.journey, options.method);
78
+ const changed = !(
79
+ cursor.releaseIntentDeliveryStory === deliveryStory && cursor.releaseIntent === normalized
80
+ );
81
+ const updated = setDeliveryCursor(
82
+ db,
83
+ {
84
+ journey: cursor.journey,
85
+ method: cursor.method,
86
+ activeItem: cursor.activeItem,
87
+ activeItemTitle: cursor.activeItemTitle,
88
+ activeItemLevel: cursor.activeItemLevel,
89
+ activeCheckpoint: cursor.activeCheckpoint,
90
+ pendingConfirmation: cursor.pendingConfirmation,
91
+ lastDeliveryEvent: cursor.lastDeliveryEvent,
92
+ cadenceProfile: cursor.cadenceProfile,
93
+ cadenceLimits: cursor.cadenceLimits,
94
+ granularityDecision: cursor.granularityDecision,
95
+ navigatorFlowUnit: cursor.navigatorFlowUnit,
96
+ childWorkItems: cursor.childWorkItems,
97
+ aggregateCheckpointStatus: cursor.aggregateCheckpointStatus,
98
+ cursorGeneration: cursor.cursorGeneration,
99
+ releaseIntentDeliveryStory: { kind: "set", value: deliveryStory },
100
+ releaseIntent: { kind: "set", value: normalized },
101
+ },
102
+ deps,
103
+ );
104
+ return {
105
+ journey: options.journey,
106
+ method: options.method,
107
+ deliveryStory,
108
+ intent: normalized,
109
+ cursor: updated,
110
+ changed,
111
+ };
112
+ }
113
+
114
+ /** Python `inspect_release_intent`. */
115
+ export function inspectReleaseIntent(
116
+ db: Database,
117
+ options: { journey: string; method: string },
118
+ ): ReleaseIntentReport {
119
+ const { cursor, deliveryStory } = activeDeliveryStory(db, options.journey, options.method);
120
+ const recorded =
121
+ cursor.releaseIntentDeliveryStory === deliveryStory && cursor.releaseIntent
122
+ ? cursor.releaseIntent
123
+ : "not_recorded";
124
+ return {
125
+ journey: options.journey,
126
+ method: options.method,
127
+ deliveryStory,
128
+ intent: recorded,
129
+ cursor,
130
+ changed: false,
131
+ };
132
+ }
133
+
134
+ const MEANING: Record<string, string> = {
135
+ planned: "This Delivery Story is expected to create a release boundary if completed coherently.",
136
+ none: "This Delivery Story is not expected to create a release boundary.",
137
+ undecided: "Release intent is intentionally unresolved and may be revisited later.",
138
+ not_recorded: "No release intent has been recorded for this Delivery Story.",
139
+ };
140
+
141
+ /** Python `render_release_intent_report`. */
142
+ export function renderReleaseIntentReport(report: ReleaseIntentReport): string {
143
+ const meaning = MEANING[report.intent];
144
+ if (meaning === undefined) {
145
+ // Python indexes the dict directly, so an unknown intent is a KeyError there.
146
+ throw new Error(`unknown release intent: ${report.intent}`);
147
+ }
148
+ const body = [
149
+ "Delivery",
150
+ "",
151
+ "╭────────────────────────────────────────────────────────╮",
152
+ "│ 🚦 DELIVERY STORY RELEASE INTENT │",
153
+ "│ │",
154
+ cardText("Delivery Story"),
155
+ ...cardWrapped(report.deliveryStory),
156
+ "│ │",
157
+ cardText("Intent"),
158
+ ...cardWrapped(report.intent),
159
+ "│ │",
160
+ cardText("Meaning"),
161
+ ...cardWrapped(meaning),
162
+ "│ │",
163
+ cardText("Action"),
164
+ ...cardWrapped(report.changed ? "recorded" : "inspected"),
165
+ "│ │",
166
+ cardText("Authority boundary"),
167
+ ...cardWrapped(
168
+ "Release intent does not authorize commit, push, tag creation, stable promotion, release publication, or remote mutation.",
169
+ ),
170
+ "╰────────────────────────────────────────────────────────╯",
171
+ ];
172
+ return wrapAriadSurface("release_intent", `${body.join("\n")}\n`);
173
+ }
@@ -0,0 +1,84 @@
1
+ // CV22.DS7.US8 plateau 2 — the DB-backed Builder resume state.
2
+ //
3
+ // Port of `read_builder_resume_state` from `src/memory/builder/resume_state.py`,
4
+ // deferred from plateau 1 because it needs both the adoption row and the delivery
5
+ // cursor, and the cursor's reader ships with its writer.
6
+ //
7
+ // Three states, in Python's order of precedence, each with its own reason:
8
+ //
9
+ // no adopted method -> `adoption_required`
10
+ // no cursor -> `cursor_sync_required`
11
+ // otherwise -> resumable
12
+ //
13
+ // CR114: the actions come from `allowedNextActions` in `cursorPosition.ts`, the list
14
+ // `build show` prints too, except for a journey that adopted no method, which `build
15
+ // show` refuses. Python chose them here, from two facts and never the cursor's last
16
+ // event, so it offered Prepare at every position with nothing pending.
17
+ //
18
+ // CV22.DS10.TS4 removed the Workbench read that used to happen here, and with
19
+ // it an asymmetry both engines carried: Python read the Workbench unguarded
20
+ // here while the Home path wrapped the same call, so a database predating
21
+ // CV20.DS6 degraded there and RAISED on this one. Resume state is Delivery
22
+ // state now; the absent-tables case is graded in the golden.
23
+
24
+ import type { Database } from "#db/database.ts";
25
+ import { allowedNextActions, NOT_ADOPTED_ACTIONS } from "./cursorPosition.ts";
26
+ import { getDeliveryCursor } from "./deliveryCursor.ts";
27
+ import { getAdoptedMethod } from "./methodAdoption.ts";
28
+ import type { BuilderResumeState, ResumeCursorView } from "./resumeSurface.ts";
29
+
30
+ /** Python `_normalize_journey`. */
31
+ function normalizeJourney(journey: string): string {
32
+ const normalized = typeof journey === "string" ? journey.trim() : "";
33
+ if (!normalized) throw new Error("journey must not be empty");
34
+ return normalized;
35
+ }
36
+
37
+ /** Python `read_builder_resume_state`. */
38
+ export function readBuilderResumeState(db: Database, journey: string): BuilderResumeState {
39
+ const normalizedJourney = normalizeJourney(journey);
40
+
41
+ const adoptedMethod = getAdoptedMethod(db, normalizedJourney);
42
+ if (!adoptedMethod) {
43
+ return {
44
+ journey: normalizedJourney,
45
+ adoptedMethod: null,
46
+ cursor: null,
47
+ resumable: false,
48
+ reason: "adoption_required",
49
+ allowedNextActions: [...NOT_ADOPTED_ACTIONS],
50
+ };
51
+ }
52
+
53
+ const cursor = getDeliveryCursor(db, normalizedJourney);
54
+ if (cursor === null) {
55
+ return {
56
+ journey: normalizedJourney,
57
+ adoptedMethod,
58
+ cursor: null,
59
+ resumable: false,
60
+ reason: "cursor_sync_required",
61
+ allowedNextActions: [...allowedNextActions(null)],
62
+ };
63
+ }
64
+
65
+ const view: ResumeCursorView = {
66
+ activeItem: cursor.activeItem,
67
+ activeItemLevel: cursor.activeItemLevel,
68
+ activeCheckpoint: cursor.activeCheckpoint,
69
+ pendingConfirmation: cursor.pendingConfirmation,
70
+ lastDeliveryEvent: cursor.lastDeliveryEvent,
71
+ releaseIntent: cursor.releaseIntent,
72
+ releaseIntentDeliveryStory: cursor.releaseIntentDeliveryStory,
73
+ cadenceProfile: cursor.cadenceProfile,
74
+ cadenceLimits: cursor.cadenceLimits,
75
+ };
76
+ return {
77
+ journey: normalizedJourney,
78
+ adoptedMethod,
79
+ cursor: view,
80
+ resumable: true,
81
+ reason: null,
82
+ allowedNextActions: [...allowedNextActions(view)],
83
+ };
84
+ }
@@ -0,0 +1,149 @@
1
+ // CV22.DS7.US8 plateau 1 — the `■ BUILDER RESUME` surface.
2
+ //
3
+ // Port of `src/memory/builder/resume_surface.py`. Python's three allowed-next-action
4
+ // tuples and the rule that picked between them lived here too. CR114 replaced them:
5
+ // the rule never read the cursor's last event, so it offered Prepare at every
6
+ // position with nothing pending. The list is chosen in `cursorPosition.ts` now, and
7
+ // this module only prints it.
8
+ //
9
+ // Three conditional shapes a port merges by accident:
10
+ //
11
+ // * the `reason` block renders only when a reason exists;
12
+ // * `release intent` needs BOTH `release_intent` AND
13
+ // `release_intent_delivery_story` — `and`, not `or`, so a cursor carrying one
14
+ // of them shows neither;
15
+ // * `_last_refinement_event` reports `"none"` whenever there is no active
16
+ // Refinement Story, EVEN WHEN an event is recorded. Reading the field
17
+ // directly is the obvious port and it is wrong.
18
+ //
19
+ // `_resume_phase` exists in Python and is never called by anything. It is not
20
+ // ported: dead code that the surface does not reach is not parity surface, and
21
+ // carrying it forward would import a maintenance obligation with no observable
22
+ // behavior. Recorded in the story's debt list instead.
23
+
24
+ import { type CadenceView, cadenceCardLines } from "./cadence.ts";
25
+ import { cardPrefixed, cardText, cardWrapped } from "./card.ts";
26
+ import { CANONICAL_REFINEMENT_INDEX } from "./refinementField.ts";
27
+ import type { RoadmapScope } from "./roadmapScope.ts";
28
+ import { roadmapPositionLines } from "./scopePhrases.ts";
29
+ import { wrapAriadSurface } from "./surfaceProtocol.ts";
30
+
31
+ const FRAME_TOP = "╭────────────────────────────────────────────────────────╮";
32
+ const FRAME_BOTTOM = "╰────────────────────────────────────────────────────────╯";
33
+ const FRAME_BLANK = "│ │";
34
+
35
+ /** The cursor fields the resume surface reads, and its next actions are chosen from. */
36
+ export interface ResumeCursorView extends CadenceView {
37
+ readonly activeItem: string | null;
38
+ readonly activeItemLevel: string | null;
39
+ readonly activeCheckpoint: string | null;
40
+ readonly pendingConfirmation: string | null;
41
+ readonly lastDeliveryEvent: string | null;
42
+ readonly releaseIntent: string | null;
43
+ readonly releaseIntentDeliveryStory: string | null;
44
+ }
45
+
46
+ /** Python `BuilderResumeState`. */
47
+ export interface BuilderResumeState {
48
+ readonly journey: string;
49
+ readonly adoptedMethod: string | null;
50
+ readonly cursor: ResumeCursorView | null;
51
+ readonly resumable: boolean;
52
+ readonly reason: string | null;
53
+ readonly allowedNextActions: readonly string[];
54
+ }
55
+
56
+ /** Python `_release_intent_lines`: both fields, or no block at all. */
57
+ function releaseIntentLines(cursor: ResumeCursorView | null): string[] {
58
+ const intent = cursor?.releaseIntent ?? null;
59
+ const deliveryStory = cursor?.releaseIntentDeliveryStory ?? null;
60
+ if (!intent || !deliveryStory) return [];
61
+ return [
62
+ FRAME_BLANK,
63
+ cardText("release intent"),
64
+ ...cardWrapped(`${deliveryStory}: ${intent}`),
65
+ ...cardWrapped("intent is not release authorization"),
66
+ ];
67
+ }
68
+
69
+ /** Python `_refinement_field_lines`. Two shapes since CV22.DS10.TS4. */
70
+ function refinementFieldLines(canonicalRefinementIndex: string | null): string[] {
71
+ if (canonicalRefinementIndex) {
72
+ return [
73
+ cardText("authority: project files"),
74
+ ...cardWrapped(`index: ${canonicalRefinementIndex}`),
75
+ ];
76
+ }
77
+ return [
78
+ cardText("authority: project files (not started)"),
79
+ ...cardWrapped(`create: ${CANONICAL_REFINEMENT_INDEX}`),
80
+ ];
81
+ }
82
+
83
+ /**
84
+ * Python `render_builder_resume_surface`, except for the `roadmap position` row.
85
+ *
86
+ * Python filled that row with the first roadmap file whose status contained
87
+ * "Active", whichever journey asked. Since CR002 it states the journey's own
88
+ * scope, which the caller resolves from the same cursor `state` carries. The
89
+ * scope is required so that no caller can fall back to a guess by omission.
90
+ */
91
+ export function renderBuilderResumeSurface(
92
+ state: BuilderResumeState,
93
+ options: {
94
+ scope: RoadmapScope;
95
+ canonicalRefinementIndex?: string | null;
96
+ },
97
+ ): string {
98
+ const canonicalRefinementIndex = options.canonicalRefinementIndex ?? null;
99
+ const cursor = state.cursor;
100
+ const lines: string[] = [
101
+ "Delivery",
102
+ "",
103
+ FRAME_TOP,
104
+ "│ ■ BUILDER RESUME │",
105
+ FRAME_BLANK,
106
+ cardText("journey"),
107
+ cardText(state.journey),
108
+ FRAME_BLANK,
109
+ cardText("adopted method"),
110
+ cardText(state.adoptedMethod || "none"),
111
+ FRAME_BLANK,
112
+ cardText("resumable"),
113
+ cardText(state.resumable ? "yes" : "no"),
114
+ ];
115
+ if (state.reason) {
116
+ lines.push(FRAME_BLANK, cardText("reason"), ...cardWrapped(state.reason));
117
+ }
118
+ lines.push(
119
+ FRAME_BLANK,
120
+ cardText("roadmap position"),
121
+ ...roadmapPositionLines(options.scope).flatMap(cardWrapped),
122
+ FRAME_BLANK,
123
+ cardText("active item"),
124
+ cardText(cursor?.activeItem || "none"),
125
+ FRAME_BLANK,
126
+ cardText("active checkpoint"),
127
+ cardText(cursor?.activeCheckpoint || "none"),
128
+ FRAME_BLANK,
129
+ cardText("pending confirmation"),
130
+ cardText(cursor?.pendingConfirmation || "none"),
131
+ FRAME_BLANK,
132
+ cardText("last delivery event"),
133
+ cardText(cursor?.lastDeliveryEvent || "none"),
134
+ FRAME_BLANK,
135
+ ...cadenceCardLines(cursor),
136
+ ...releaseIntentLines(cursor),
137
+ FRAME_BLANK,
138
+ cardText("🧰 Refinement field"),
139
+ ...refinementFieldLines(canonicalRefinementIndex),
140
+ FRAME_BLANK,
141
+ cardText("allowed next actions"),
142
+ ...cardPrefixed(state.allowedNextActions, "-"),
143
+ FRAME_BLANK,
144
+ cardText("boundary"),
145
+ ...cardWrapped("Builder resumes context only; no story lifecycle work was executed."),
146
+ FRAME_BOTTOM,
147
+ );
148
+ return wrapAriadSurface("builder_resume", `${lines.join("\n")}\n`);
149
+ }