mirror-mind 0.0.0-stage → 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 (468) 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/LICENSE +21 -0
  37. package/README.md +128 -2
  38. package/bin/loader.js +67 -0
  39. package/bin/mirror-hook.js +7 -0
  40. package/bin/mirror.js +7 -0
  41. package/docs/releases/index.md +99 -0
  42. package/docs/releases/pending-cutoffs.md +510 -0
  43. package/docs/releases/v0.10.0.md +123 -0
  44. package/docs/releases/v0.10.1.md +66 -0
  45. package/docs/releases/v0.10.10.md +51 -0
  46. package/docs/releases/v0.10.11.md +39 -0
  47. package/docs/releases/v0.10.12.md +57 -0
  48. package/docs/releases/v0.10.13.md +35 -0
  49. package/docs/releases/v0.10.14.md +42 -0
  50. package/docs/releases/v0.10.15.md +53 -0
  51. package/docs/releases/v0.10.16.md +35 -0
  52. package/docs/releases/v0.10.17.md +43 -0
  53. package/docs/releases/v0.10.2.md +64 -0
  54. package/docs/releases/v0.10.3.md +78 -0
  55. package/docs/releases/v0.10.4.md +42 -0
  56. package/docs/releases/v0.10.5.md +57 -0
  57. package/docs/releases/v0.10.6.md +47 -0
  58. package/docs/releases/v0.10.7.md +53 -0
  59. package/docs/releases/v0.10.8.md +49 -0
  60. package/docs/releases/v0.10.9.md +37 -0
  61. package/docs/releases/v0.11.0.md +86 -0
  62. package/docs/releases/v0.12.0.md +67 -0
  63. package/docs/releases/v0.13.0.md +64 -0
  64. package/docs/releases/v0.14.0.md +68 -0
  65. package/docs/releases/v0.15.0.md +48 -0
  66. package/docs/releases/v0.16.0.md +50 -0
  67. package/docs/releases/v0.16.1.md +55 -0
  68. package/docs/releases/v0.16.2.md +36 -0
  69. package/docs/releases/v0.17.0.md +50 -0
  70. package/docs/releases/v0.17.1.md +58 -0
  71. package/docs/releases/v0.17.2.md +42 -0
  72. package/docs/releases/v0.17.3.md +58 -0
  73. package/docs/releases/v0.18.0.md +84 -0
  74. package/docs/releases/v0.18.1.md +51 -0
  75. package/docs/releases/v0.18.2.md +69 -0
  76. package/docs/releases/v0.19.0.md +85 -0
  77. package/docs/releases/v0.19.1.md +46 -0
  78. package/docs/releases/v0.20.0.md +85 -0
  79. package/docs/releases/v0.21.0.md +61 -0
  80. package/docs/releases/v0.21.1.md +47 -0
  81. package/docs/releases/v0.22.0.md +77 -0
  82. package/docs/releases/v0.22.1.md +42 -0
  83. package/docs/releases/v0.23.0.md +105 -0
  84. package/docs/releases/v0.24.0.md +125 -0
  85. package/docs/releases/v0.25.0.md +107 -0
  86. package/docs/releases/v0.26.0.md +139 -0
  87. package/docs/releases/v0.26.1.md +65 -0
  88. package/docs/releases/v0.26.2.md +43 -0
  89. package/docs/releases/v0.27.0.md +63 -0
  90. package/docs/releases/v0.28.0.md +59 -0
  91. package/docs/releases/v0.29.0.md +61 -0
  92. package/docs/releases/v0.29.1.md +59 -0
  93. package/docs/releases/v0.29.2.md +59 -0
  94. package/docs/releases/v0.29.3.md +93 -0
  95. package/docs/releases/v0.30.0.md +75 -0
  96. package/docs/releases/v0.30.1.md +93 -0
  97. package/docs/releases/v0.30.2.md +66 -0
  98. package/docs/releases/v0.31.0.md +122 -0
  99. package/docs/releases/v0.31.1.md +142 -0
  100. package/docs/releases/v0.31.10.md +118 -0
  101. package/docs/releases/v0.31.11.md +88 -0
  102. package/docs/releases/v0.31.12.md +105 -0
  103. package/docs/releases/v0.31.13.md +99 -0
  104. package/docs/releases/v0.31.14.md +97 -0
  105. package/docs/releases/v0.31.2.md +115 -0
  106. package/docs/releases/v0.31.3.md +142 -0
  107. package/docs/releases/v0.31.4.md +117 -0
  108. package/docs/releases/v0.31.5.md +155 -0
  109. package/docs/releases/v0.31.6.md +132 -0
  110. package/docs/releases/v0.31.7.md +132 -0
  111. package/docs/releases/v0.31.8.md +120 -0
  112. package/docs/releases/v0.31.9.md +120 -0
  113. package/docs/releases/v0.32.0.md +261 -0
  114. package/docs/releases/v0.32.1.md +59 -0
  115. package/docs/releases/v0.8.0.md +118 -0
  116. package/docs/releases/v0.9.0.md +98 -0
  117. package/docs/releases/v0.9.1.md +83 -0
  118. package/package.json +110 -4
  119. package/plugins/mirror-mind/.claude-plugin/plugin.json +13 -0
  120. package/plugins/mirror-mind/hooks/hooks.json +50 -0
  121. package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
  122. package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
  123. package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
  124. package/plugins/mirror-mind/hooks/session-start.sh +98 -0
  125. package/plugins/mirror-mind/mcp/launch.sh +52 -0
  126. package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
  127. package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
  128. package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
  129. package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
  130. package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
  131. package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
  132. package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
  133. package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
  134. package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
  135. package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
  136. package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
  137. package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
  138. package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
  139. package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +65 -0
  140. package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
  141. package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
  142. package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
  143. package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
  144. package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
  145. package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
  146. package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
  147. package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
  148. package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
  149. package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
  150. package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
  151. package/scripts/codex-hooks/session-end.sh +85 -0
  152. package/scripts/codex-hooks/session-start.sh +85 -0
  153. package/scripts/codex-mirror.sh +48 -0
  154. package/templates/identity/README.md +119 -0
  155. package/templates/identity/ego/behavior.yaml +52 -0
  156. package/templates/identity/ego/constraints.yaml +15 -0
  157. package/templates/identity/ego/identity.yaml +43 -0
  158. package/templates/identity/journeys/personal-growth.yaml +39 -0
  159. package/templates/identity/organization/identity.yaml +24 -0
  160. package/templates/identity/organization/principles.yaml +17 -0
  161. package/templates/identity/personas/coach.yaml +94 -0
  162. package/templates/identity/personas/designer.yaml +93 -0
  163. package/templates/identity/personas/doctor.yaml +96 -0
  164. package/templates/identity/personas/engineer.yaml +77 -0
  165. package/templates/identity/personas/financial.yaml +97 -0
  166. package/templates/identity/personas/prompt-engineer.yaml +122 -0
  167. package/templates/identity/personas/researcher.yaml +88 -0
  168. package/templates/identity/personas/strategist.yaml +91 -0
  169. package/templates/identity/personas/teacher.yaml +95 -0
  170. package/templates/identity/personas/therapist.yaml +91 -0
  171. package/templates/identity/personas/thinker.yaml +74 -0
  172. package/templates/identity/personas/writer.yaml +76 -0
  173. package/templates/identity/self/config.yaml +16 -0
  174. package/templates/identity/self/soul.yaml +105 -0
  175. package/templates/identity/user/identity.yaml +30 -0
  176. package/ts/src/backup/staging.ts +62 -0
  177. package/ts/src/backup/zipBackup.ts +267 -0
  178. package/ts/src/backup/zipReader.ts +109 -0
  179. package/ts/src/backup/zipWriter.ts +148 -0
  180. package/ts/src/builder/activeCheckpoint.ts +134 -0
  181. package/ts/src/builder/aggregateStatus.ts +34 -0
  182. package/ts/src/builder/approve.ts +149 -0
  183. package/ts/src/builder/argv.ts +292 -0
  184. package/ts/src/builder/ariadMethod.ts +536 -0
  185. package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
  186. package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
  187. package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
  188. package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
  189. package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
  190. package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
  191. package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
  192. package/ts/src/builder/artifacts/storyFiles.ts +61 -0
  193. package/ts/src/builder/artifacts/storyIndex.ts +166 -0
  194. package/ts/src/builder/cadence.ts +59 -0
  195. package/ts/src/builder/card.ts +192 -0
  196. package/ts/src/builder/checkpointRefused.ts +66 -0
  197. package/ts/src/builder/closure.ts +964 -0
  198. package/ts/src/builder/commands.ts +2053 -0
  199. package/ts/src/builder/cursorPosition.ts +176 -0
  200. package/ts/src/builder/cursorTransitions.ts +77 -0
  201. package/ts/src/builder/deliveryCursor.ts +577 -0
  202. package/ts/src/builder/deliveryStoryClosure.ts +521 -0
  203. package/ts/src/builder/deliveryStoryPlan.ts +536 -0
  204. package/ts/src/builder/deliveryStoryReady.ts +160 -0
  205. package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
  206. package/ts/src/builder/expand.ts +336 -0
  207. package/ts/src/builder/flowUnit.ts +339 -0
  208. package/ts/src/builder/homeSurface.ts +122 -0
  209. package/ts/src/builder/implementationGuard.ts +125 -0
  210. package/ts/src/builder/index.ts +11 -0
  211. package/ts/src/builder/lifecycleRefusal.ts +92 -0
  212. package/ts/src/builder/lifecycleRibbon.ts +159 -0
  213. package/ts/src/builder/load.ts +313 -0
  214. package/ts/src/builder/methodAdoption.ts +113 -0
  215. package/ts/src/builder/methodDefinition.ts +429 -0
  216. package/ts/src/builder/methodInspection.ts +371 -0
  217. package/ts/src/builder/plan.ts +408 -0
  218. package/ts/src/builder/planPreauthorization.ts +265 -0
  219. package/ts/src/builder/prepare.ts +225 -0
  220. package/ts/src/builder/projectPaths.ts +64 -0
  221. package/ts/src/builder/pull.ts +356 -0
  222. package/ts/src/builder/pullCandidates.ts +463 -0
  223. package/ts/src/builder/pullCandidatesRender.ts +238 -0
  224. package/ts/src/builder/refinementField.ts +93 -0
  225. package/ts/src/builder/releaseIntent.ts +173 -0
  226. package/ts/src/builder/resumeState.ts +84 -0
  227. package/ts/src/builder/resumeSurface.ts +149 -0
  228. package/ts/src/builder/roadmapGrammar.ts +300 -0
  229. package/ts/src/builder/roadmapScan.ts +97 -0
  230. package/ts/src/builder/roadmapScope.ts +210 -0
  231. package/ts/src/builder/scopePhrases.ts +146 -0
  232. package/ts/src/builder/storyPaths.ts +196 -0
  233. package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
  234. package/ts/src/builder/surfaceProtocol.ts +42 -0
  235. package/ts/src/builder/templateGeneration.ts +148 -0
  236. package/ts/src/builder/transition.ts +178 -0
  237. package/ts/src/consult/args.ts +99 -0
  238. package/ts/src/consult/core.ts +122 -0
  239. package/ts/src/consult/modelCatalog.ts +55 -0
  240. package/ts/src/consult/render.ts +47 -0
  241. package/ts/src/conversation/append.ts +414 -0
  242. package/ts/src/conversation/backfill.ts +387 -0
  243. package/ts/src/conversation/closeTail.ts +467 -0
  244. package/ts/src/conversation/extraction.ts +333 -0
  245. package/ts/src/conversation/extractionDriver.ts +130 -0
  246. package/ts/src/conversation/extractionRun.ts +70 -0
  247. package/ts/src/conversation/journeyInference.ts +165 -0
  248. package/ts/src/conversation/journeyRepair.ts +114 -0
  249. package/ts/src/conversation/lifecycleFaces.ts +197 -0
  250. package/ts/src/conversation/lifecycleWrites.ts +313 -0
  251. package/ts/src/conversation/listing.ts +77 -0
  252. package/ts/src/conversation/logger.ts +576 -0
  253. package/ts/src/conversation/loggerCli.ts +282 -0
  254. package/ts/src/conversation/loggerRuntime.ts +259 -0
  255. package/ts/src/conversation/metadataLifecycle.ts +443 -0
  256. package/ts/src/conversation/recall.ts +66 -0
  257. package/ts/src/conversation/sessionComposites.ts +258 -0
  258. package/ts/src/conversation/sessionImport.ts +90 -0
  259. package/ts/src/conversation/transcriptBackfill.ts +141 -0
  260. package/ts/src/cultivation/applyActions.ts +241 -0
  261. package/ts/src/cultivation/cluster.ts +86 -0
  262. package/ts/src/cultivation/consolidationStore.ts +281 -0
  263. package/ts/src/cultivation/promptContext.ts +62 -0
  264. package/ts/src/cultivation/propose.ts +305 -0
  265. package/ts/src/cultivation/scan.ts +155 -0
  266. package/ts/src/db/backupGate.ts +47 -0
  267. package/ts/src/db/bootstrap.ts +108 -0
  268. package/ts/src/db/bootstrapLock.ts +223 -0
  269. package/ts/src/db/copyGuard.ts +60 -0
  270. package/ts/src/db/database.ts +397 -0
  271. package/ts/src/db/decode.ts +66 -0
  272. package/ts/src/db/ftsIntegrity.ts +41 -0
  273. package/ts/src/db/migrateOnOpen.ts +214 -0
  274. package/ts/src/db/migrations.ts +576 -0
  275. package/ts/src/db/readyOnOpen.ts +35 -0
  276. package/ts/src/db/rowDecode.ts +42 -0
  277. package/ts/src/db/schema.ts +432 -0
  278. package/ts/src/db/schemaInventory.ts +225 -0
  279. package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
  280. package/ts/src/db/schemaState.ts +91 -0
  281. package/ts/src/db/schemaTsDivergence.ts +114 -0
  282. package/ts/src/descriptor/descriptorRead.ts +49 -0
  283. package/ts/src/docs/docsLint.ts +265 -0
  284. package/ts/src/explorer/handoff.ts +522 -0
  285. package/ts/src/explorer/render.ts +335 -0
  286. package/ts/src/explorer/story.ts +769 -0
  287. package/ts/src/explorer/transition.ts +72 -0
  288. package/ts/src/extensions/bindings.ts +170 -0
  289. package/ts/src/extensions/catalog.ts +249 -0
  290. package/ts/src/extensions/catalogCommands.ts +513 -0
  291. package/ts/src/extensions/catalogWrites.ts +652 -0
  292. package/ts/src/extensions/contextRuntime.ts +325 -0
  293. package/ts/src/extensions/dispatch.ts +374 -0
  294. package/ts/src/extensions/errors.ts +24 -0
  295. package/ts/src/extensions/manifest.ts +356 -0
  296. package/ts/src/extensions/migrations.ts +350 -0
  297. package/ts/src/extraction/conversation.ts +304 -0
  298. package/ts/src/extraction/conversationMetadata.ts +206 -0
  299. package/ts/src/extraction/fencing.ts +106 -0
  300. package/ts/src/extraction/json.ts +17 -0
  301. package/ts/src/extraction/prompts.ts +470 -0
  302. package/ts/src/frontDoor/args.ts +30 -0
  303. package/ts/src/frontDoor/argvShape.ts +106 -0
  304. package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
  305. package/ts/src/frontDoor/buildRoute.ts +398 -0
  306. package/ts/src/frontDoor/cli.ts +1865 -0
  307. package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
  308. package/ts/src/frontDoor/consultRoute.ts +50 -0
  309. package/ts/src/frontDoor/contentTailRoute.ts +239 -0
  310. package/ts/src/frontDoor/conversationLoggerRoute.ts +73 -0
  311. package/ts/src/frontDoor/cultivationRoute.ts +210 -0
  312. package/ts/src/frontDoor/dbPath.ts +131 -0
  313. package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
  314. package/ts/src/frontDoor/exploreRoute.ts +572 -0
  315. package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
  316. package/ts/src/frontDoor/frontDoorLog.ts +57 -0
  317. package/ts/src/frontDoor/identityWrite.ts +36 -0
  318. package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
  319. package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
  320. package/ts/src/frontDoor/liveBackup.ts +100 -0
  321. package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
  322. package/ts/src/frontDoor/namedRefusal.ts +35 -0
  323. package/ts/src/frontDoor/nodeSupport.ts +24 -0
  324. package/ts/src/frontDoor/render/consolidate.ts +199 -0
  325. package/ts/src/frontDoor/render/conversations.ts +33 -0
  326. package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
  327. package/ts/src/frontDoor/render/descriptor.ts +20 -0
  328. package/ts/src/frontDoor/render/detectPersona.ts +50 -0
  329. package/ts/src/frontDoor/render/icons.ts +13 -0
  330. package/ts/src/frontDoor/render/identity.ts +59 -0
  331. package/ts/src/frontDoor/render/identityRows.ts +17 -0
  332. package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
  333. package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
  334. package/ts/src/frontDoor/render/journeys.ts +79 -0
  335. package/ts/src/frontDoor/render/list.ts +41 -0
  336. package/ts/src/frontDoor/render/memories.ts +67 -0
  337. package/ts/src/frontDoor/render/recall.ts +49 -0
  338. package/ts/src/frontDoor/render/shadow.ts +155 -0
  339. package/ts/src/frontDoor/render/tasks.ts +99 -0
  340. package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
  341. package/ts/src/frontDoor/render/week.ts +113 -0
  342. package/ts/src/frontDoor/routing.ts +999 -0
  343. package/ts/src/frontDoor/runtimeRoute.ts +623 -0
  344. package/ts/src/frontDoor/searchRoute.ts +166 -0
  345. package/ts/src/frontDoor/seedPaths.ts +98 -0
  346. package/ts/src/frontDoor/soulRoute.ts +433 -0
  347. package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
  348. package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
  349. package/ts/src/frontDoor/usage.ts +176 -0
  350. package/ts/src/guards/claudePlugin.ts +252 -0
  351. package/ts/src/guards/packContents.ts +306 -0
  352. package/ts/src/guards/piSourcedSkills.ts +70 -0
  353. package/ts/src/guards/retiredRouteShadows.ts +57 -0
  354. package/ts/src/guards/retiredSurfaces.ts +564 -0
  355. package/ts/src/hooks/claude.ts +176 -0
  356. package/ts/src/hooks/codex.ts +45 -0
  357. package/ts/src/hooks/gemini.ts +126 -0
  358. package/ts/src/hooks/main.ts +109 -0
  359. package/ts/src/hooks/mirrorState.ts +71 -0
  360. package/ts/src/hooks/payload.ts +68 -0
  361. package/ts/src/hooks/runtime.ts +159 -0
  362. package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
  363. package/ts/src/identity/descriptorGenerate.ts +162 -0
  364. package/ts/src/identity/identityEdit.ts +143 -0
  365. package/ts/src/identity/identityKey.ts +77 -0
  366. package/ts/src/identity/identityRead.ts +69 -0
  367. package/ts/src/identity/identityStore.ts +80 -0
  368. package/ts/src/identity/journeyListing.ts +53 -0
  369. package/ts/src/identity/personaInspect.ts +44 -0
  370. package/ts/src/identity/personaListing.ts +37 -0
  371. package/ts/src/identity/setIdentity.ts +64 -0
  372. package/ts/src/index.ts +231 -0
  373. package/ts/src/init/init.ts +111 -0
  374. package/ts/src/journey/journeyOptions.ts +131 -0
  375. package/ts/src/journey/journeyRemoval.ts +158 -0
  376. package/ts/src/journey/journeyStatus.ts +149 -0
  377. package/ts/src/journey/journeySyncFile.ts +87 -0
  378. package/ts/src/journey/journeyWrite.ts +203 -0
  379. package/ts/src/journey/parentJourney.ts +41 -0
  380. package/ts/src/journey/validateParentJourney.ts +55 -0
  381. package/ts/src/mcp/boundary.ts +151 -0
  382. package/ts/src/mcp/guards.ts +244 -0
  383. package/ts/src/mcp/main.ts +121 -0
  384. package/ts/src/mcp/payload.ts +141 -0
  385. package/ts/src/mcp/protocol.ts +141 -0
  386. package/ts/src/mcp/readModels.ts +241 -0
  387. package/ts/src/mcp/registry.ts +201 -0
  388. package/ts/src/mcp/serve.ts +120 -0
  389. package/ts/src/mcp/tools/deterministic.ts +137 -0
  390. package/ts/src/mcp/tools/providerCrossing.ts +187 -0
  391. package/ts/src/mcp/wire.ts +8 -0
  392. package/ts/src/memory/journal.ts +180 -0
  393. package/ts/src/memory/listing.ts +107 -0
  394. package/ts/src/memory/memoryWrite.ts +88 -0
  395. package/ts/src/memory/reinforcement.ts +35 -0
  396. package/ts/src/mirror/context.ts +161 -0
  397. package/ts/src/mirror/defaultResolution.ts +199 -0
  398. package/ts/src/mirror/orchestration.ts +364 -0
  399. package/ts/src/mirror/reception.ts +194 -0
  400. package/ts/src/mirror/render.ts +75 -0
  401. package/ts/src/mirror/runtimeSession.ts +205 -0
  402. package/ts/src/mode/operatingMode.ts +148 -0
  403. package/ts/src/observability/callOutcome.ts +115 -0
  404. package/ts/src/observability/inspectLedger.ts +329 -0
  405. package/ts/src/observability/ledgerHooks.ts +126 -0
  406. package/ts/src/observability/llmCalls.ts +154 -0
  407. package/ts/src/persona/detectPersona.ts +81 -0
  408. package/ts/src/planning/promptAssembly.ts +111 -0
  409. package/ts/src/planning/weekPending.ts +81 -0
  410. package/ts/src/planning/weekPlan.ts +183 -0
  411. package/ts/src/planning/weekSave.ts +117 -0
  412. package/ts/src/providers/config.ts +189 -0
  413. package/ts/src/providers/cost.ts +64 -0
  414. package/ts/src/providers/credits.ts +204 -0
  415. package/ts/src/providers/embedding.ts +321 -0
  416. package/ts/src/providers/familyProviders.ts +147 -0
  417. package/ts/src/providers/llm.ts +334 -0
  418. package/ts/src/providers/openrouter.ts +244 -0
  419. package/ts/src/providers/redaction.ts +110 -0
  420. package/ts/src/providers/replay.ts +15 -0
  421. package/ts/src/providers/transport.ts +410 -0
  422. package/ts/src/repair/encodingRepair.ts +253 -0
  423. package/ts/src/runtime/backup.ts +151 -0
  424. package/ts/src/runtime/channel.ts +146 -0
  425. package/ts/src/runtime/config.ts +168 -0
  426. package/ts/src/runtime/diagnose.ts +686 -0
  427. package/ts/src/runtime/git.ts +510 -0
  428. package/ts/src/runtime/installKind.ts +220 -0
  429. package/ts/src/runtime/migrate.ts +154 -0
  430. package/ts/src/runtime/packageIdentity.ts +102 -0
  431. package/ts/src/runtime/releaseNotes.ts +244 -0
  432. package/ts/src/runtime/status.ts +557 -0
  433. package/ts/src/runtime/strategies/clone.ts +200 -0
  434. package/ts/src/runtime/strategies/package.ts +328 -0
  435. package/ts/src/runtime/treeRoot.ts +30 -0
  436. package/ts/src/runtime/update.ts +445 -0
  437. package/ts/src/runtime/updateGate.ts +40 -0
  438. package/ts/src/runtime/updatePipeline.ts +159 -0
  439. package/ts/src/runtime/version.ts +36 -0
  440. package/ts/src/runtime/wiring.ts +130 -0
  441. package/ts/src/search/memorySearch.ts +338 -0
  442. package/ts/src/search/ranker.ts +154 -0
  443. package/ts/src/seed/seed.ts +256 -0
  444. package/ts/src/seed/seedYaml.ts +133 -0
  445. package/ts/src/soul/apply.ts +218 -0
  446. package/ts/src/soul/harvest.ts +267 -0
  447. package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
  448. package/ts/src/soul/prompts/soul_self_voice.md +219 -0
  449. package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
  450. package/ts/src/soul/prompts.ts +85 -0
  451. package/ts/src/soul/render.ts +358 -0
  452. package/ts/src/soul/state.ts +212 -0
  453. package/ts/src/soul/transition.ts +37 -0
  454. package/ts/src/tasks/journeyPathParse.ts +113 -0
  455. package/ts/src/tasks/taskImportSync.ts +142 -0
  456. package/ts/src/tasks/taskStore.ts +312 -0
  457. package/ts/src/tasks/weekView.ts +120 -0
  458. package/ts/src/util/clipCodePoints.ts +26 -0
  459. package/ts/src/util/paths.ts +63 -0
  460. package/ts/src/util/program.ts +9 -0
  461. package/ts/src/util/pyGenerators.ts +144 -0
  462. package/ts/src/util/pythonText.ts +317 -0
  463. package/ts/src/util/semver.ts +45 -0
  464. package/ts/src/util/shellWord.ts +25 -0
  465. package/ts/src/util/slug.ts +64 -0
  466. package/ts/src/welcome/card.ts +339 -0
  467. package/ts/src/welcome/statusLine.ts +101 -0
  468. package/ts/src/welcome/updateCache.ts +129 -0
@@ -0,0 +1,536 @@
1
+ // CV22.DS7.US8 plateau 5 — the Delivery Story Plan checkpoint and its approval.
2
+ //
3
+ // Port of `src/memory/builder/delivery_story_plan.py`.
4
+ //
5
+ // This is the aggregate face of Plan: one checkpoint over a whole Delivery Story
6
+ // and its child work packages, chosen by the Navigator through `set-flow-unit`.
7
+ // The story-level Plan in `plan.ts` stays exactly as it was — the two are separate
8
+ // state machines over the same cursor, and the flow unit decides which one may run.
9
+ //
10
+ // Three things a port gets wrong here, all pinned by the corpus:
11
+ //
12
+ // 1. **`replaceStatus` APPENDS.** `aggregate_checkpoint_status` is an ordered
13
+ // list cell, and replacing an entry removes it and pushes the new value to the
14
+ // END. Re-validating after a debt review therefore REORDERS the list without
15
+ // changing its set — and the cursor's compare-and-swap matches on the
16
+ // serialized bytes, so an in-place replace passes every set-wise assertion and
17
+ // breaks the swap of a cursor the Python engine wrote.
18
+ // 2. **`plan.md` is preserved, not upserted.** Python's own docstring says it is
19
+ // "upserted on every call"; both branches of its `if report.status ==
20
+ // "approved"` guard write only `if not plan_existed`, so the branches are
21
+ // identical and the file survives. The corpus pins the CODE
22
+ // (`delivery_story_plan_preserves_authored_plan`), and this comment exists so
23
+ // nobody ports the docstring.
24
+ // 3. **Approval under authority uses compare-and-swap.** `expectedCursor` is
25
+ // passed only on the preauthorized path, and a conflict there is answered by
26
+ // re-reading: a concurrent writer that already consumed the receipt yields
27
+ // `already_approved`, anything else is a bounded mismatch. That branch cannot
28
+ // be reached from the corpus (the replay has no way to interpose a write
29
+ // between the read and the swap), so it is graded by an injected-conflict test
30
+ // instead, and declared as corpus-unreachable rather than implied.
31
+
32
+ import type { WritableDatabase } from "#db/database.ts";
33
+ import { pyStrip } from "#util/pythonText.ts";
34
+ import { replaceStatus } from "./aggregateStatus.ts";
35
+ import type { MaterializedArtifact } from "./artifacts/artifactSurfaces.ts";
36
+ import {
37
+ unfilledDeliveryStoryPlanSections,
38
+ writeDeliveryStoryPackage,
39
+ } from "./artifacts/deliveryStoryArtifacts.ts";
40
+ import { cardPrefixed, cardText, cardWrapped } from "./card.ts";
41
+ import {
42
+ type BuilderDeliveryCursor,
43
+ type CursorWriteDeps,
44
+ DeliveryCursorConflict,
45
+ getDeliveryCursor,
46
+ type PlanPreauthorizationReceipt,
47
+ setDeliveryCursor,
48
+ } from "./deliveryCursor.ts";
49
+ import { FLOW_UNIT_DELIVERY_STORY } from "./flowUnit.ts";
50
+ import {
51
+ createPlanPreauthorizationReceipt,
52
+ DELIVERY_STORY_PLAN_CONTRACT,
53
+ invalidatePlanPreauthorization,
54
+ PlanPreauthorizationMismatch,
55
+ PREAUTHORIZATION_STOP,
56
+ planPreauthorizationMismatchReason,
57
+ } from "./planPreauthorization.ts";
58
+ import { wrapAriadSurface } from "./surfaceProtocol.ts";
59
+
60
+ export interface DeliveryStoryPlanReport {
61
+ readonly journey: string;
62
+ readonly method: string;
63
+ readonly deliveryStory: string;
64
+ readonly deliveryStoryTitle: string | null;
65
+ readonly childWorkItems: readonly string[];
66
+ readonly objective: string;
67
+ readonly status: string;
68
+ readonly cursor: BuilderDeliveryCursor;
69
+ readonly planArtifactPath: string | null;
70
+ readonly materializedArtifacts: readonly MaterializedArtifact[];
71
+ readonly unfilledSections: readonly string[];
72
+ readonly implementationStarted: boolean;
73
+ }
74
+
75
+ /** Python `_normalize_items`: strip, drop empties, preserve order. */
76
+ function normalizeItems(items: readonly string[]): string[] {
77
+ return items.map((item) => pyStrip(item)).filter((item) => item !== "");
78
+ }
79
+
80
+ export interface PlanDeliveryStoryOptions {
81
+ readonly journey: string;
82
+ readonly method: string;
83
+ readonly objective: string;
84
+ readonly childWorkItems?: readonly string[];
85
+ readonly planArtifactPath?: string | null;
86
+ /** The project the package must stay inside (CR079). */
87
+ readonly projectRoot?: string | null;
88
+ readonly preauthorize?: boolean;
89
+ readonly stopBoundary?: string;
90
+ }
91
+
92
+ /**
93
+ * Python `plan_delivery_story_checkpoint`.
94
+ *
95
+ * The four guards run in Python's order, and the order is behavior: cursor, then
96
+ * level, then flow unit, then active item — so a story-level cursor under
97
+ * `delivery_story` flow reports the LEVEL, not the flow unit.
98
+ */
99
+ export function planDeliveryStoryCheckpoint(
100
+ db: WritableDatabase,
101
+ options: PlanDeliveryStoryOptions,
102
+ deps: CursorWriteDeps,
103
+ ): DeliveryStoryPlanReport {
104
+ const cursor = getDeliveryCursor(db, options.journey);
105
+ if (cursor === null) {
106
+ throw new Error("delivery cursor is required before Delivery Story Plan");
107
+ }
108
+ if (cursor.activeItemLevel !== "delivery_story") {
109
+ throw new Error("Delivery Story Plan requires an active Delivery Story");
110
+ }
111
+ if (cursor.navigatorFlowUnit !== FLOW_UNIT_DELIVERY_STORY) {
112
+ throw new Error("Delivery Story Plan requires navigator_flow_unit=delivery_story");
113
+ }
114
+ if (!cursor.activeItem) {
115
+ throw new Error("active Delivery Story is required before Delivery Story Plan");
116
+ }
117
+ const requested = normalizeItems(options.childWorkItems ?? []);
118
+ const children = requested.length > 0 ? requested : [...cursor.childWorkItems];
119
+ if (children.length === 0) {
120
+ throw new Error("Delivery Story Plan requires at least one child work item");
121
+ }
122
+ const objective = pyStrip(options.objective);
123
+ if (objective === "") {
124
+ throw new Error("Delivery Story Plan objective must not be empty");
125
+ }
126
+ const stopBoundary = options.stopBoundary ?? PREAUTHORIZATION_STOP;
127
+ let receipt: PlanPreauthorizationReceipt | null = null;
128
+ if (options.preauthorize) {
129
+ if (stopBoundary !== PREAUTHORIZATION_STOP) {
130
+ throw new Error("unsupported Plan preauthorization stop boundary");
131
+ }
132
+ receipt = createPlanPreauthorizationReceipt(cursor, {
133
+ method: options.method,
134
+ childWorkItems: children,
135
+ planContractVersion: DELIVERY_STORY_PLAN_CONTRACT,
136
+ stopBoundary,
137
+ });
138
+ }
139
+ const updated = setDeliveryCursor(
140
+ db,
141
+ {
142
+ journey: options.journey,
143
+ method: options.method,
144
+ activeItem: cursor.activeItem,
145
+ activeItemTitle: cursor.activeItemTitle,
146
+ activeItemLevel: cursor.activeItemLevel,
147
+ activeCheckpoint: "after_delivery_story_plan",
148
+ pendingConfirmation: "navigator_delivery_story_plan_approval",
149
+ lastDeliveryEvent: "delivery_story_plan",
150
+ cadenceProfile: cursor.cadenceProfile,
151
+ cadenceLimits: cursor.cadenceLimits,
152
+ granularityDecision: cursor.granularityDecision,
153
+ navigatorFlowUnit: cursor.navigatorFlowUnit,
154
+ childWorkItems: children,
155
+ aggregateCheckpointStatus: replaceStatus(cursor.aggregateCheckpointStatus, "plan", "pending"),
156
+ cursorGeneration: cursor.cursorGeneration,
157
+ planPreauthorization: { kind: "set", value: receipt },
158
+ },
159
+ deps,
160
+ );
161
+ const report: DeliveryStoryPlanReport = {
162
+ journey: options.journey,
163
+ method: options.method,
164
+ deliveryStory: cursor.activeItem,
165
+ deliveryStoryTitle: cursor.activeItemTitle,
166
+ childWorkItems: children,
167
+ objective,
168
+ status: "pending_approval",
169
+ cursor: updated,
170
+ planArtifactPath: options.planArtifactPath ?? null,
171
+ materializedArtifacts: [],
172
+ unfilledSections: [],
173
+ implementationStarted: false,
174
+ };
175
+ const materialized = materializePackage(report, options.projectRoot);
176
+ return { ...report, materializedArtifacts: materialized };
177
+ }
178
+
179
+ export interface ApproveDeliveryStoryPlanOptions {
180
+ readonly journey: string;
181
+ readonly method: string;
182
+ readonly planArtifactPath?: string | null;
183
+ /** The project the package must stay inside (CR079). */
184
+ readonly projectRoot?: string | null;
185
+ readonly usePreauthorization?: boolean;
186
+ }
187
+
188
+ /** Python `_is_consumed_approval`: the idempotence test for a repeated consume. */
189
+ function isConsumedApproval(cursor: BuilderDeliveryCursor): boolean {
190
+ const receipt = cursor.planPreauthorization;
191
+ return (
192
+ receipt !== null &&
193
+ receipt.status === "consumed" &&
194
+ cursor.lastDeliveryEvent === "delivery_story_plan_approved" &&
195
+ cursor.aggregateCheckpointStatus.includes("plan:approved")
196
+ );
197
+ }
198
+
199
+ function alreadyApprovedReport(
200
+ cursor: BuilderDeliveryCursor,
201
+ options: ApproveDeliveryStoryPlanOptions,
202
+ ): DeliveryStoryPlanReport {
203
+ return {
204
+ journey: options.journey,
205
+ method: options.method,
206
+ deliveryStory: cursor.activeItem ?? "",
207
+ deliveryStoryTitle: cursor.activeItemTitle,
208
+ childWorkItems: cursor.childWorkItems,
209
+ objective: "Delivery Story Plan was already approved.",
210
+ status: "already_approved",
211
+ cursor,
212
+ planArtifactPath: options.planArtifactPath ?? null,
213
+ materializedArtifacts: [],
214
+ unfilledSections: [],
215
+ implementationStarted: false,
216
+ };
217
+ }
218
+
219
+ /** Python `approve_delivery_story_plan`. */
220
+ export function approveDeliveryStoryPlan(
221
+ db: WritableDatabase,
222
+ options: ApproveDeliveryStoryPlanOptions,
223
+ deps: CursorWriteDeps,
224
+ ): DeliveryStoryPlanReport {
225
+ const usePreauthorization = options.usePreauthorization ?? false;
226
+ const cursor = getDeliveryCursor(db, options.journey);
227
+ if (cursor === null) {
228
+ throw new Error("delivery cursor is required before Delivery Story Plan approval");
229
+ }
230
+ if (usePreauthorization && isConsumedApproval(cursor)) {
231
+ return alreadyApprovedReport(cursor, options);
232
+ }
233
+ if (cursor.activeCheckpoint !== "after_delivery_story_plan") {
234
+ throw new Error(
235
+ "Delivery Story Plan approval requires an after_delivery_story_plan checkpoint",
236
+ );
237
+ }
238
+ if (cursor.pendingConfirmation !== "navigator_delivery_story_plan_approval") {
239
+ throw new Error("Delivery Story Plan approval requires navigator approval");
240
+ }
241
+ if (!cursor.activeItem) {
242
+ throw new Error("active Delivery Story is required before Delivery Story Plan approval");
243
+ }
244
+ // The DS rule, not the story rule: see `unfilledDeliveryStoryPlanSections`.
245
+ const unfilled = unfilledDeliveryStoryPlanSections(options.planArtifactPath ?? null);
246
+ if (usePreauthorization) {
247
+ const mismatch = planPreauthorizationMismatchReason(cursor, {
248
+ journey: options.journey,
249
+ method: options.method,
250
+ flowUnit: FLOW_UNIT_DELIVERY_STORY,
251
+ childWorkItems: cursor.childWorkItems,
252
+ planContractVersion: DELIVERY_STORY_PLAN_CONTRACT,
253
+ unfilledSections: unfilled,
254
+ });
255
+ if (mismatch !== null) {
256
+ invalidatePlanPreauthorization(db, cursor, mismatch, deps);
257
+ throw new PlanPreauthorizationMismatch(mismatch);
258
+ }
259
+ }
260
+ let receipt = cursor.planPreauthorization;
261
+ if (receipt !== null && receipt.status === "pending") {
262
+ receipt = {
263
+ ...receipt,
264
+ status: usePreauthorization ? "consumed" : "invalidated",
265
+ reason: usePreauthorization ? null : "ordinary_approval_used",
266
+ };
267
+ }
268
+ let updated: BuilderDeliveryCursor;
269
+ try {
270
+ updated = setDeliveryCursor(
271
+ db,
272
+ {
273
+ journey: options.journey,
274
+ method: options.method,
275
+ activeItem: cursor.activeItem,
276
+ activeItemTitle: cursor.activeItemTitle,
277
+ activeItemLevel: cursor.activeItemLevel,
278
+ activeCheckpoint: null,
279
+ pendingConfirmation: null,
280
+ lastDeliveryEvent: "delivery_story_plan_approved",
281
+ cadenceProfile: cursor.cadenceProfile,
282
+ cadenceLimits: cursor.cadenceLimits,
283
+ granularityDecision: cursor.granularityDecision,
284
+ navigatorFlowUnit: cursor.navigatorFlowUnit,
285
+ childWorkItems: cursor.childWorkItems,
286
+ aggregateCheckpointStatus: replaceStatus(
287
+ cursor.aggregateCheckpointStatus,
288
+ "plan",
289
+ "approved",
290
+ ),
291
+ cursorGeneration: cursor.cursorGeneration,
292
+ planPreauthorization: { kind: "set", value: receipt },
293
+ expectedCursor: usePreauthorization ? cursor : null,
294
+ },
295
+ deps,
296
+ );
297
+ } catch (error) {
298
+ if (!(error instanceof DeliveryCursorConflict)) throw error;
299
+ // Corpus-unreachable by construction: reaching it needs a write between the
300
+ // read above and the swap. Graded by an injected-conflict test instead.
301
+ const current = getDeliveryCursor(db, options.journey);
302
+ if (usePreauthorization && current !== null && isConsumedApproval(current)) {
303
+ return alreadyApprovedReport(current, options);
304
+ }
305
+ if (usePreauthorization) {
306
+ throw new PlanPreauthorizationMismatch("cursor_changed");
307
+ }
308
+ throw new Error("delivery cursor changed before Plan approval");
309
+ }
310
+ const report: DeliveryStoryPlanReport = {
311
+ journey: options.journey,
312
+ method: options.method,
313
+ deliveryStory: cursor.activeItem,
314
+ deliveryStoryTitle: cursor.activeItemTitle,
315
+ childWorkItems: cursor.childWorkItems,
316
+ objective: "Delivery Story Plan approved.",
317
+ status: "approved",
318
+ cursor: updated,
319
+ planArtifactPath: options.planArtifactPath ?? null,
320
+ materializedArtifacts: [],
321
+ unfilledSections: [],
322
+ implementationStarted: true,
323
+ };
324
+ const materialized = materializePackage(report, options.projectRoot);
325
+ return { ...report, materializedArtifacts: materialized, unfilledSections: unfilled };
326
+ }
327
+
328
+ /** Python `cancel_delivery_story_plan_preauthorization`. */
329
+ export function cancelDeliveryStoryPlanPreauthorization(
330
+ db: WritableDatabase,
331
+ options: { journey: string; method: string },
332
+ deps: CursorWriteDeps,
333
+ ): BuilderDeliveryCursor {
334
+ const cursor = getDeliveryCursor(db, options.journey);
335
+ if (cursor === null) {
336
+ throw new Error("delivery cursor is required before Plan preauthorization cancellation");
337
+ }
338
+ if (cursor.method !== options.method) {
339
+ throw new Error("active Builder method does not match cancellation method");
340
+ }
341
+ const receipt = cursor.planPreauthorization;
342
+ if (receipt === null || receipt.status !== "pending") {
343
+ throw new Error("pending Plan preauthorization is required before cancellation");
344
+ }
345
+ invalidatePlanPreauthorization(db, cursor, "navigator_cancelled", deps);
346
+ const cancelled = getDeliveryCursor(db, options.journey);
347
+ if (cancelled === null) {
348
+ throw new Error("delivery cursor disappeared during cancellation");
349
+ }
350
+ return cancelled;
351
+ }
352
+
353
+ // --- package materialization ------------------------------------------------
354
+
355
+ /**
356
+ * Python `_write_delivery_story_package`, called with the report's own plan path.
357
+ *
358
+ * Both branches of Python's `status == "approved"` test write `plan.md` only when
359
+ * it is absent, so the branches are IDENTICAL and an authored plan survives both
360
+ * Plan and approval. Python's docstring claims an upsert; the code does not. The
361
+ * writer keeps one branch, and the corpus proves it is the right one.
362
+ */
363
+ function materializePackage(
364
+ report: DeliveryStoryPlanReport,
365
+ projectRoot: string | null | undefined,
366
+ ): readonly MaterializedArtifact[] {
367
+ const planPath = report.planArtifactPath;
368
+ if (planPath === null) return [];
369
+ return writeDeliveryStoryPackage(planPath, report, projectRoot);
370
+ }
371
+
372
+ // --- surfaces ---------------------------------------------------------------
373
+
374
+ /** Python `_active_delivery`. */
375
+ function activeDelivery(report: DeliveryStoryPlanReport): string {
376
+ const title = report.deliveryStoryTitle ? ` — ${report.deliveryStoryTitle}` : "";
377
+ return `🟦[${report.deliveryStory}]${title}`;
378
+ }
379
+
380
+ const RIBBON_PLANNING =
381
+ "Delivery Flow: ✓ Pull → ✓ Prepare → ✓ Expand → ◉ DS Plan → ○ Implement → ○ Validate → ○ Debt Review → ○ Done";
382
+ const RIBBON_IMPLEMENTING =
383
+ "Delivery Flow: ✓ Pull → ✓ Prepare → ✓ Expand → ✓ DS Plan → ◉ Implement → ○ Validate → ○ Debt Review → ○ Done";
384
+
385
+ const APPROVED_STATUSES = ["approved", "already_approved"];
386
+
387
+ /** Python `_next_movement`. */
388
+ function nextMovement(report: DeliveryStoryPlanReport): string {
389
+ if (report.status === "already_approved") {
390
+ return "No transition was repeated; continue from the existing approved state.";
391
+ }
392
+ if (report.status === "approved") return "Begin implementation under the approved plan.";
393
+ return "Review the plan artifact, then approve or revise.";
394
+ }
395
+
396
+ /** Python `render_delivery_story_plan_report`. */
397
+ export function renderDeliveryStoryPlanReport(report: DeliveryStoryPlanReport): string {
398
+ const approved = APPROVED_STATUSES.includes(report.status);
399
+ const body: string[] = [
400
+ "Delivery",
401
+ report.status === "approved" ? RIBBON_IMPLEMENTING : RIBBON_PLANNING,
402
+ "",
403
+ "╭────────────────────────────────────────────────────────╮",
404
+ cardText(
405
+ approved ? " 🧭 DELIVERY STORY PLAN APPROVED" : " 🧭 DELIVERY STORY PLAN",
406
+ ),
407
+ "│ │",
408
+ ];
409
+ if (approved) {
410
+ body.push(
411
+ cardText("What was approved?"),
412
+ ...cardWrapped(activeDelivery(report)),
413
+ "│ │",
414
+ cardText("Approved work packages"),
415
+ ...cardPrefixed(report.childWorkItems, "-"),
416
+ );
417
+ if (report.unfilledSections.length > 0) {
418
+ body.push(
419
+ "│ │",
420
+ cardText("Sections still pending"),
421
+ ...cardPrefixed(report.unfilledSections, "-"),
422
+ );
423
+ }
424
+ } else {
425
+ body.push(
426
+ cardText("What is being planned?"),
427
+ ...cardWrapped(activeDelivery(report)),
428
+ "│ │",
429
+ cardText("Plan objective"),
430
+ ...cardWrapped(report.objective),
431
+ "│ │",
432
+ cardText("Work packages"),
433
+ ...cardPrefixed(report.childWorkItems, "-"),
434
+ );
435
+ }
436
+ body.push(
437
+ "│ │",
438
+ cardText("Next movement"),
439
+ ...cardWrapped(nextMovement(report)),
440
+ );
441
+ if (!approved) {
442
+ body.push(
443
+ "│ │",
444
+ ...cardWrapped("Choose the next move when ready."),
445
+ );
446
+ }
447
+ body.push("╰────────────────────────────────────────────────────────╯");
448
+ return wrapAriadSurface("delivery_story_plan_checkpoint", `${body.join("\n")}\n`);
449
+ }
450
+
451
+ /** Python `render_plan_preauthorization_recorded`. */
452
+ export function renderPlanPreauthorizationRecorded(report: DeliveryStoryPlanReport): string {
453
+ const receipt = report.cursor.planPreauthorization;
454
+ if (receipt === null) {
455
+ throw new Error("Plan preauthorization receipt is required");
456
+ }
457
+ const body = [
458
+ "Delivery",
459
+ "",
460
+ "╭────────────────────────────────────────────────────────╮",
461
+ "│ 🧭 PLAN PREAUTHORIZATION RECORDED │",
462
+ "│ │",
463
+ cardText("Authorized delivery"),
464
+ ...cardWrapped(receipt.activeItem),
465
+ "│ │",
466
+ cardText("Policy"),
467
+ ...cardWrapped(receipt.policy),
468
+ "│ │",
469
+ cardText("Exact child set"),
470
+ ...cardPrefixed(receipt.childWorkItems, "-"),
471
+ "│ │",
472
+ cardText("Fixed stop"),
473
+ ...cardWrapped(receipt.stopBoundary),
474
+ "│ │",
475
+ cardText("Boundary"),
476
+ ...cardWrapped(
477
+ "Single-use authority remains pending until the Driver completes the Plan and every structural coordinate matches.",
478
+ ),
479
+ "╰────────────────────────────────────────────────────────╯",
480
+ ];
481
+ return wrapAriadSurface("plan_preauthorization_recorded", `${body.join("\n")}\n`);
482
+ }
483
+
484
+ /** Python `render_plan_preauthorization_mismatch`. */
485
+ export function renderPlanPreauthorizationMismatch(options: {
486
+ activeItem: string | null;
487
+ reason: string;
488
+ }): string {
489
+ const body = [
490
+ "Delivery",
491
+ "",
492
+ "╭────────────────────────────────────────────────────────╮",
493
+ "│ ⛔ PLAN PREAUTHORIZATION NOT CONSUMED │",
494
+ "│ │",
495
+ cardText("Active delivery"),
496
+ ...cardWrapped(options.activeItem || "none"),
497
+ "│ │",
498
+ cardText("Bounded reason"),
499
+ ...cardWrapped(options.reason),
500
+ "│ │",
501
+ cardText("Result"),
502
+ ...cardWrapped("Plan approval remains blocked; ordinary Navigator approval is available."),
503
+ "╰────────────────────────────────────────────────────────╯",
504
+ ];
505
+ return wrapAriadSurface("plan_preauthorization_mismatch", `${body.join("\n")}\n`);
506
+ }
507
+
508
+ /** Python `render_delivery_story_implementation_started`. */
509
+ export function renderDeliveryStoryImplementationStarted(report: DeliveryStoryPlanReport): string {
510
+ const body = [
511
+ "Delivery",
512
+ RIBBON_IMPLEMENTING,
513
+ "",
514
+ "╭────────────────────────────────────────────────────────╮",
515
+ "│ 🟧 IMPLEMENTATION STARTED │",
516
+ "│ │",
517
+ cardText("What changed?"),
518
+ ...cardWrapped("The approved Delivery Story Plan now authorizes implementation work."),
519
+ "│ │",
520
+ cardText("Active delivery"),
521
+ ...cardWrapped(activeDelivery(report)),
522
+ "│ │",
523
+ cardText("Work packages"),
524
+ ...cardPrefixed(report.childWorkItems, "-"),
525
+ "│ │",
526
+ cardText("Boundary"),
527
+ ...cardWrapped(
528
+ "Implementation may mutate local project files under the approved plan. Push, release, deploy, purchase, or externally irreversible actions still require explicit Navigator authorization.",
529
+ ),
530
+ "│ │",
531
+ cardText("Driver action"),
532
+ ...cardWrapped("Begin implementing the approved plan now."),
533
+ "╰────────────────────────────────────────────────────────╯",
534
+ ];
535
+ return wrapAriadSurface("implementation_started", `${body.join("\n")}\n`);
536
+ }