mirror-mind 0.0.1 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/log-assistant-reply.sh +85 -0
- package/.claude/hooks/log-session-end.sh +85 -0
- package/.claude/hooks/log-user-prompt.sh +85 -0
- package/.claude/hooks/mirror-inject.sh +85 -0
- package/.claude/hooks/session-start.sh +85 -0
- package/.gemini/hooks/log-assistant.sh +85 -0
- package/.gemini/hooks/log-user.sh +85 -0
- package/.gemini/hooks/session-end.sh +85 -0
- package/.gemini/hooks/session-start.sh +85 -0
- package/.pi/extensions/mirror-logger.ts +646 -0
- package/.pi/skills/mm-backup/SKILL.md +21 -0
- package/.pi/skills/mm-build/SKILL.md +1206 -0
- package/.pi/skills/mm-consolidate/SKILL.md +112 -0
- package/.pi/skills/mm-consult/SKILL.md +70 -0
- package/.pi/skills/mm-conversations/SKILL.md +16 -0
- package/.pi/skills/mm-discard/SKILL.md +39 -0
- package/.pi/skills/mm-explore/SKILL.md +255 -0
- package/.pi/skills/mm-help/SKILL.md +74 -0
- package/.pi/skills/mm-identity/SKILL.md +96 -0
- package/.pi/skills/mm-journal/SKILL.md +16 -0
- package/.pi/skills/mm-journey/SKILL.md +23 -0
- package/.pi/skills/mm-journeys/SKILL.md +15 -0
- package/.pi/skills/mm-memories/SKILL.md +17 -0
- package/.pi/skills/mm-mirror/SKILL.md +98 -0
- package/.pi/skills/mm-mute/SKILL.md +18 -0
- package/.pi/skills/mm-new/SKILL.md +18 -0
- package/.pi/skills/mm-recall/SKILL.md +17 -0
- package/.pi/skills/mm-release-notes/SKILL.md +52 -0
- package/.pi/skills/mm-seed/SKILL.md +19 -0
- package/.pi/skills/mm-shadow/SKILL.md +117 -0
- package/.pi/skills/mm-soul/SKILL.md +502 -0
- package/.pi/skills/mm-tasks/SKILL.md +24 -0
- package/.pi/skills/mm-update/SKILL.md +32 -0
- package/.pi/skills/mm-week/SKILL.md +28 -0
- package/.pi/skills/mm-welcome/SKILL.md +24 -0
- package/AGENTS.md +188 -0
- package/README.md +126 -9
- package/bin/loader.js +67 -0
- package/bin/mirror-hook.js +7 -0
- package/bin/mirror.js +7 -0
- package/docs/releases/index.md +100 -0
- package/docs/releases/pending-cutoffs.md +510 -0
- package/docs/releases/v0.10.0.md +123 -0
- package/docs/releases/v0.10.1.md +66 -0
- package/docs/releases/v0.10.10.md +51 -0
- package/docs/releases/v0.10.11.md +39 -0
- package/docs/releases/v0.10.12.md +57 -0
- package/docs/releases/v0.10.13.md +35 -0
- package/docs/releases/v0.10.14.md +42 -0
- package/docs/releases/v0.10.15.md +53 -0
- package/docs/releases/v0.10.16.md +35 -0
- package/docs/releases/v0.10.17.md +43 -0
- package/docs/releases/v0.10.2.md +64 -0
- package/docs/releases/v0.10.3.md +78 -0
- package/docs/releases/v0.10.4.md +42 -0
- package/docs/releases/v0.10.5.md +57 -0
- package/docs/releases/v0.10.6.md +47 -0
- package/docs/releases/v0.10.7.md +53 -0
- package/docs/releases/v0.10.8.md +49 -0
- package/docs/releases/v0.10.9.md +37 -0
- package/docs/releases/v0.11.0.md +86 -0
- package/docs/releases/v0.12.0.md +67 -0
- package/docs/releases/v0.13.0.md +64 -0
- package/docs/releases/v0.14.0.md +68 -0
- package/docs/releases/v0.15.0.md +48 -0
- package/docs/releases/v0.16.0.md +50 -0
- package/docs/releases/v0.16.1.md +55 -0
- package/docs/releases/v0.16.2.md +36 -0
- package/docs/releases/v0.17.0.md +50 -0
- package/docs/releases/v0.17.1.md +58 -0
- package/docs/releases/v0.17.2.md +42 -0
- package/docs/releases/v0.17.3.md +58 -0
- package/docs/releases/v0.18.0.md +84 -0
- package/docs/releases/v0.18.1.md +51 -0
- package/docs/releases/v0.18.2.md +69 -0
- package/docs/releases/v0.19.0.md +85 -0
- package/docs/releases/v0.19.1.md +46 -0
- package/docs/releases/v0.20.0.md +85 -0
- package/docs/releases/v0.21.0.md +61 -0
- package/docs/releases/v0.21.1.md +47 -0
- package/docs/releases/v0.22.0.md +77 -0
- package/docs/releases/v0.22.1.md +42 -0
- package/docs/releases/v0.23.0.md +105 -0
- package/docs/releases/v0.24.0.md +125 -0
- package/docs/releases/v0.25.0.md +107 -0
- package/docs/releases/v0.26.0.md +139 -0
- package/docs/releases/v0.26.1.md +65 -0
- package/docs/releases/v0.26.2.md +43 -0
- package/docs/releases/v0.27.0.md +63 -0
- package/docs/releases/v0.28.0.md +59 -0
- package/docs/releases/v0.29.0.md +61 -0
- package/docs/releases/v0.29.1.md +59 -0
- package/docs/releases/v0.29.2.md +59 -0
- package/docs/releases/v0.29.3.md +93 -0
- package/docs/releases/v0.30.0.md +75 -0
- package/docs/releases/v0.30.1.md +93 -0
- package/docs/releases/v0.30.2.md +66 -0
- package/docs/releases/v0.31.0.md +122 -0
- package/docs/releases/v0.31.1.md +142 -0
- package/docs/releases/v0.31.10.md +118 -0
- package/docs/releases/v0.31.11.md +88 -0
- package/docs/releases/v0.31.12.md +105 -0
- package/docs/releases/v0.31.13.md +99 -0
- package/docs/releases/v0.31.14.md +97 -0
- package/docs/releases/v0.31.2.md +115 -0
- package/docs/releases/v0.31.3.md +142 -0
- package/docs/releases/v0.31.4.md +117 -0
- package/docs/releases/v0.31.5.md +155 -0
- package/docs/releases/v0.31.6.md +132 -0
- package/docs/releases/v0.31.7.md +132 -0
- package/docs/releases/v0.31.8.md +120 -0
- package/docs/releases/v0.31.9.md +120 -0
- package/docs/releases/v0.32.0.md +261 -0
- package/docs/releases/v0.32.1.md +59 -0
- package/docs/releases/v0.33.0.md +164 -0
- package/docs/releases/v0.8.0.md +118 -0
- package/docs/releases/v0.9.0.md +98 -0
- package/docs/releases/v0.9.1.md +83 -0
- package/package.json +102 -6
- package/plugins/mirror-mind/.claude-plugin/plugin.json +17 -0
- package/plugins/mirror-mind/hooks/hooks.json +62 -0
- package/plugins/mirror-mind/hooks/log-assistant-reply.sh +98 -0
- package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
- package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
- package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
- package/plugins/mirror-mind/hooks/session-start.sh +98 -0
- package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
- package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
- package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
- package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
- package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
- package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
- package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
- package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
- package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
- package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
- package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
- package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +67 -0
- package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
- package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
- package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
- package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
- package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
- package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
- package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
- package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
- package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
- package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
- package/scripts/codex-hooks/session-end.sh +85 -0
- package/scripts/codex-hooks/session-start.sh +85 -0
- package/scripts/codex-mirror.sh +48 -0
- package/templates/identity/README.md +119 -0
- package/templates/identity/ego/behavior.yaml +52 -0
- package/templates/identity/ego/constraints.yaml +15 -0
- package/templates/identity/ego/identity.yaml +43 -0
- package/templates/identity/journeys/personal-growth.yaml +39 -0
- package/templates/identity/organization/identity.yaml +24 -0
- package/templates/identity/organization/principles.yaml +17 -0
- package/templates/identity/personas/coach.yaml +94 -0
- package/templates/identity/personas/designer.yaml +93 -0
- package/templates/identity/personas/doctor.yaml +96 -0
- package/templates/identity/personas/engineer.yaml +77 -0
- package/templates/identity/personas/financial.yaml +97 -0
- package/templates/identity/personas/prompt-engineer.yaml +122 -0
- package/templates/identity/personas/researcher.yaml +88 -0
- package/templates/identity/personas/strategist.yaml +91 -0
- package/templates/identity/personas/teacher.yaml +95 -0
- package/templates/identity/personas/therapist.yaml +91 -0
- package/templates/identity/personas/thinker.yaml +74 -0
- package/templates/identity/personas/writer.yaml +76 -0
- package/templates/identity/self/config.yaml +16 -0
- package/templates/identity/self/soul.yaml +105 -0
- package/templates/identity/user/identity.yaml +30 -0
- package/ts/src/backup/staging.ts +62 -0
- package/ts/src/backup/zipBackup.ts +267 -0
- package/ts/src/backup/zipReader.ts +109 -0
- package/ts/src/backup/zipWriter.ts +148 -0
- package/ts/src/builder/activeCheckpoint.ts +134 -0
- package/ts/src/builder/aggregateStatus.ts +34 -0
- package/ts/src/builder/approve.ts +149 -0
- package/ts/src/builder/argv.ts +292 -0
- package/ts/src/builder/ariadMethod.ts +536 -0
- package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
- package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
- package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
- package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
- package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
- package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
- package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
- package/ts/src/builder/artifacts/storyFiles.ts +61 -0
- package/ts/src/builder/artifacts/storyIndex.ts +166 -0
- package/ts/src/builder/cadence.ts +59 -0
- package/ts/src/builder/card.ts +192 -0
- package/ts/src/builder/checkpointRefused.ts +66 -0
- package/ts/src/builder/closure.ts +964 -0
- package/ts/src/builder/commands.ts +2053 -0
- package/ts/src/builder/cursorPosition.ts +176 -0
- package/ts/src/builder/cursorTransitions.ts +77 -0
- package/ts/src/builder/deliveryCursor.ts +577 -0
- package/ts/src/builder/deliveryStoryClosure.ts +521 -0
- package/ts/src/builder/deliveryStoryPlan.ts +536 -0
- package/ts/src/builder/deliveryStoryReady.ts +160 -0
- package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
- package/ts/src/builder/expand.ts +336 -0
- package/ts/src/builder/flowUnit.ts +339 -0
- package/ts/src/builder/homeSurface.ts +122 -0
- package/ts/src/builder/implementationGuard.ts +125 -0
- package/ts/src/builder/index.ts +11 -0
- package/ts/src/builder/lifecycleRefusal.ts +92 -0
- package/ts/src/builder/lifecycleRibbon.ts +159 -0
- package/ts/src/builder/load.ts +313 -0
- package/ts/src/builder/methodAdoption.ts +113 -0
- package/ts/src/builder/methodDefinition.ts +429 -0
- package/ts/src/builder/methodInspection.ts +371 -0
- package/ts/src/builder/plan.ts +408 -0
- package/ts/src/builder/planPreauthorization.ts +265 -0
- package/ts/src/builder/prepare.ts +225 -0
- package/ts/src/builder/projectPaths.ts +64 -0
- package/ts/src/builder/pull.ts +356 -0
- package/ts/src/builder/pullCandidates.ts +463 -0
- package/ts/src/builder/pullCandidatesRender.ts +238 -0
- package/ts/src/builder/refinementField.ts +93 -0
- package/ts/src/builder/releaseIntent.ts +173 -0
- package/ts/src/builder/resumeState.ts +84 -0
- package/ts/src/builder/resumeSurface.ts +149 -0
- package/ts/src/builder/roadmapGrammar.ts +300 -0
- package/ts/src/builder/roadmapScan.ts +97 -0
- package/ts/src/builder/roadmapScope.ts +210 -0
- package/ts/src/builder/scopePhrases.ts +146 -0
- package/ts/src/builder/storyPaths.ts +196 -0
- package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
- package/ts/src/builder/surfaceProtocol.ts +42 -0
- package/ts/src/builder/templateGeneration.ts +148 -0
- package/ts/src/builder/transition.ts +178 -0
- package/ts/src/consult/args.ts +99 -0
- package/ts/src/consult/core.ts +122 -0
- package/ts/src/consult/modelCatalog.ts +55 -0
- package/ts/src/consult/render.ts +47 -0
- package/ts/src/conversation/append.ts +414 -0
- package/ts/src/conversation/backfill.ts +387 -0
- package/ts/src/conversation/closeTail.ts +467 -0
- package/ts/src/conversation/extraction.ts +333 -0
- package/ts/src/conversation/extractionDriver.ts +130 -0
- package/ts/src/conversation/extractionRun.ts +70 -0
- package/ts/src/conversation/hookPayload.ts +51 -0
- package/ts/src/conversation/journeyInference.ts +165 -0
- package/ts/src/conversation/journeyRepair.ts +114 -0
- package/ts/src/conversation/lifecycleFaces.ts +197 -0
- package/ts/src/conversation/lifecycleWrites.ts +313 -0
- package/ts/src/conversation/listing.ts +77 -0
- package/ts/src/conversation/logger.ts +851 -0
- package/ts/src/conversation/loggerCli.ts +321 -0
- package/ts/src/conversation/loggerRuntime.ts +259 -0
- package/ts/src/conversation/metadataLifecycle.ts +443 -0
- package/ts/src/conversation/recall.ts +66 -0
- package/ts/src/conversation/sessionComposites.ts +258 -0
- package/ts/src/conversation/sessionImport.ts +90 -0
- package/ts/src/conversation/transcriptBackfill.ts +141 -0
- package/ts/src/cultivation/applyActions.ts +241 -0
- package/ts/src/cultivation/cluster.ts +86 -0
- package/ts/src/cultivation/consolidationStore.ts +281 -0
- package/ts/src/cultivation/promptContext.ts +62 -0
- package/ts/src/cultivation/propose.ts +305 -0
- package/ts/src/cultivation/scan.ts +155 -0
- package/ts/src/db/backupGate.ts +47 -0
- package/ts/src/db/bootstrap.ts +108 -0
- package/ts/src/db/bootstrapLock.ts +223 -0
- package/ts/src/db/copyGuard.ts +60 -0
- package/ts/src/db/database.ts +397 -0
- package/ts/src/db/decode.ts +66 -0
- package/ts/src/db/ftsIntegrity.ts +41 -0
- package/ts/src/db/migrateOnOpen.ts +214 -0
- package/ts/src/db/migrations.ts +576 -0
- package/ts/src/db/readyOnOpen.ts +35 -0
- package/ts/src/db/rowDecode.ts +42 -0
- package/ts/src/db/schema.ts +432 -0
- package/ts/src/db/schemaInventory.ts +225 -0
- package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
- package/ts/src/db/schemaState.ts +91 -0
- package/ts/src/db/schemaTsDivergence.ts +114 -0
- package/ts/src/descriptor/descriptorRead.ts +49 -0
- package/ts/src/docs/docsLint.ts +265 -0
- package/ts/src/explorer/handoff.ts +522 -0
- package/ts/src/explorer/render.ts +335 -0
- package/ts/src/explorer/story.ts +769 -0
- package/ts/src/explorer/transition.ts +72 -0
- package/ts/src/extensions/bindings.ts +170 -0
- package/ts/src/extensions/catalog.ts +249 -0
- package/ts/src/extensions/catalogCommands.ts +513 -0
- package/ts/src/extensions/catalogWrites.ts +652 -0
- package/ts/src/extensions/contextRuntime.ts +325 -0
- package/ts/src/extensions/dispatch.ts +374 -0
- package/ts/src/extensions/errors.ts +24 -0
- package/ts/src/extensions/manifest.ts +356 -0
- package/ts/src/extensions/migrations.ts +350 -0
- package/ts/src/extraction/conversation.ts +304 -0
- package/ts/src/extraction/conversationMetadata.ts +206 -0
- package/ts/src/extraction/fencing.ts +106 -0
- package/ts/src/extraction/json.ts +17 -0
- package/ts/src/extraction/prompts.ts +470 -0
- package/ts/src/frontDoor/args.ts +30 -0
- package/ts/src/frontDoor/argvShape.ts +106 -0
- package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
- package/ts/src/frontDoor/buildRoute.ts +398 -0
- package/ts/src/frontDoor/cli.ts +1872 -0
- package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
- package/ts/src/frontDoor/consultRoute.ts +50 -0
- package/ts/src/frontDoor/contentTailRoute.ts +239 -0
- package/ts/src/frontDoor/conversationLoggerRoute.ts +83 -0
- package/ts/src/frontDoor/cultivationRoute.ts +210 -0
- package/ts/src/frontDoor/dbPath.ts +131 -0
- package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
- package/ts/src/frontDoor/exploreRoute.ts +572 -0
- package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
- package/ts/src/frontDoor/frontDoorLog.ts +57 -0
- package/ts/src/frontDoor/identityWrite.ts +36 -0
- package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
- package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
- package/ts/src/frontDoor/liveBackup.ts +100 -0
- package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
- package/ts/src/frontDoor/namedRefusal.ts +35 -0
- package/ts/src/frontDoor/nodeSupport.ts +24 -0
- package/ts/src/frontDoor/render/consolidate.ts +199 -0
- package/ts/src/frontDoor/render/conversations.ts +33 -0
- package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
- package/ts/src/frontDoor/render/descriptor.ts +20 -0
- package/ts/src/frontDoor/render/detectPersona.ts +50 -0
- package/ts/src/frontDoor/render/icons.ts +13 -0
- package/ts/src/frontDoor/render/identity.ts +59 -0
- package/ts/src/frontDoor/render/identityRows.ts +17 -0
- package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
- package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
- package/ts/src/frontDoor/render/journeys.ts +79 -0
- package/ts/src/frontDoor/render/list.ts +41 -0
- package/ts/src/frontDoor/render/memories.ts +67 -0
- package/ts/src/frontDoor/render/recall.ts +49 -0
- package/ts/src/frontDoor/render/shadow.ts +155 -0
- package/ts/src/frontDoor/render/tasks.ts +99 -0
- package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
- package/ts/src/frontDoor/render/week.ts +113 -0
- package/ts/src/frontDoor/routing.ts +1001 -0
- package/ts/src/frontDoor/runtimeRoute.ts +623 -0
- package/ts/src/frontDoor/searchRoute.ts +166 -0
- package/ts/src/frontDoor/seedPaths.ts +98 -0
- package/ts/src/frontDoor/sessionStartWelcomeRoute.ts +166 -0
- package/ts/src/frontDoor/soulRoute.ts +433 -0
- package/ts/src/frontDoor/stdinSource.ts +37 -0
- package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
- package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
- package/ts/src/frontDoor/usage.ts +176 -0
- package/ts/src/guards/claudePlugin.ts +298 -0
- package/ts/src/guards/packContents.ts +306 -0
- package/ts/src/guards/piSourcedSkills.ts +70 -0
- package/ts/src/guards/retiredRouteShadows.ts +57 -0
- package/ts/src/guards/retiredSurfaces.ts +564 -0
- package/ts/src/hooks/claude.ts +214 -0
- package/ts/src/hooks/codex.ts +45 -0
- package/ts/src/hooks/gemini.ts +126 -0
- package/ts/src/hooks/main.ts +109 -0
- package/ts/src/hooks/mirrorState.ts +71 -0
- package/ts/src/hooks/payload.ts +73 -0
- package/ts/src/hooks/runtime.ts +179 -0
- package/ts/src/hooks/runtimeDetection.ts +34 -0
- package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
- package/ts/src/identity/descriptorGenerate.ts +162 -0
- package/ts/src/identity/identityEdit.ts +143 -0
- package/ts/src/identity/identityKey.ts +77 -0
- package/ts/src/identity/identityRead.ts +69 -0
- package/ts/src/identity/identityStore.ts +80 -0
- package/ts/src/identity/journeyListing.ts +53 -0
- package/ts/src/identity/personaInspect.ts +44 -0
- package/ts/src/identity/personaListing.ts +37 -0
- package/ts/src/identity/setIdentity.ts +64 -0
- package/ts/src/index.ts +231 -0
- package/ts/src/init/init.ts +111 -0
- package/ts/src/journey/journeyOptions.ts +131 -0
- package/ts/src/journey/journeyRemoval.ts +158 -0
- package/ts/src/journey/journeyStatus.ts +149 -0
- package/ts/src/journey/journeySyncFile.ts +87 -0
- package/ts/src/journey/journeyWrite.ts +203 -0
- package/ts/src/journey/parentJourney.ts +41 -0
- package/ts/src/journey/validateParentJourney.ts +55 -0
- package/ts/src/mcp/boundary.ts +151 -0
- package/ts/src/mcp/guards.ts +244 -0
- package/ts/src/mcp/main.ts +121 -0
- package/ts/src/mcp/payload.ts +141 -0
- package/ts/src/mcp/protocol.ts +141 -0
- package/ts/src/mcp/readModels.ts +241 -0
- package/ts/src/mcp/registry.ts +201 -0
- package/ts/src/mcp/serve.ts +120 -0
- package/ts/src/mcp/tools/deterministic.ts +137 -0
- package/ts/src/mcp/tools/providerCrossing.ts +187 -0
- package/ts/src/mcp/wire.ts +8 -0
- package/ts/src/memory/journal.ts +180 -0
- package/ts/src/memory/listing.ts +107 -0
- package/ts/src/memory/memoryWrite.ts +88 -0
- package/ts/src/memory/reinforcement.ts +35 -0
- package/ts/src/mirror/context.ts +161 -0
- package/ts/src/mirror/defaultResolution.ts +199 -0
- package/ts/src/mirror/mirrorForm.ts +43 -0
- package/ts/src/mirror/orchestration.ts +364 -0
- package/ts/src/mirror/reception.ts +194 -0
- package/ts/src/mirror/render.ts +75 -0
- package/ts/src/mirror/runtimeSession.ts +205 -0
- package/ts/src/mode/operatingMode.ts +148 -0
- package/ts/src/observability/callOutcome.ts +115 -0
- package/ts/src/observability/inspectLedger.ts +329 -0
- package/ts/src/observability/ledgerHooks.ts +126 -0
- package/ts/src/observability/llmCalls.ts +154 -0
- package/ts/src/persona/detectPersona.ts +81 -0
- package/ts/src/planning/promptAssembly.ts +111 -0
- package/ts/src/planning/weekPending.ts +81 -0
- package/ts/src/planning/weekPlan.ts +183 -0
- package/ts/src/planning/weekSave.ts +117 -0
- package/ts/src/providers/config.ts +189 -0
- package/ts/src/providers/cost.ts +64 -0
- package/ts/src/providers/credits.ts +204 -0
- package/ts/src/providers/embedding.ts +321 -0
- package/ts/src/providers/familyProviders.ts +147 -0
- package/ts/src/providers/llm.ts +334 -0
- package/ts/src/providers/openrouter.ts +244 -0
- package/ts/src/providers/redaction.ts +110 -0
- package/ts/src/providers/replay.ts +15 -0
- package/ts/src/providers/transport.ts +410 -0
- package/ts/src/repair/encodingRepair.ts +253 -0
- package/ts/src/runtime/backup.ts +151 -0
- package/ts/src/runtime/channel.ts +146 -0
- package/ts/src/runtime/config.ts +168 -0
- package/ts/src/runtime/diagnose.ts +686 -0
- package/ts/src/runtime/git.ts +510 -0
- package/ts/src/runtime/installKind.ts +220 -0
- package/ts/src/runtime/migrate.ts +154 -0
- package/ts/src/runtime/packageIdentity.ts +102 -0
- package/ts/src/runtime/releaseNotes.ts +244 -0
- package/ts/src/runtime/status.ts +557 -0
- package/ts/src/runtime/strategies/clone.ts +200 -0
- package/ts/src/runtime/strategies/package.ts +328 -0
- package/ts/src/runtime/treeRoot.ts +30 -0
- package/ts/src/runtime/update.ts +445 -0
- package/ts/src/runtime/updateGate.ts +40 -0
- package/ts/src/runtime/updatePipeline.ts +159 -0
- package/ts/src/runtime/version.ts +36 -0
- package/ts/src/runtime/wiring.ts +130 -0
- package/ts/src/search/memorySearch.ts +338 -0
- package/ts/src/search/ranker.ts +154 -0
- package/ts/src/seed/seed.ts +256 -0
- package/ts/src/seed/seedYaml.ts +133 -0
- package/ts/src/soul/apply.ts +218 -0
- package/ts/src/soul/harvest.ts +267 -0
- package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
- package/ts/src/soul/prompts/soul_self_voice.md +219 -0
- package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
- package/ts/src/soul/prompts.ts +85 -0
- package/ts/src/soul/render.ts +358 -0
- package/ts/src/soul/state.ts +212 -0
- package/ts/src/soul/transition.ts +37 -0
- package/ts/src/tasks/journeyPathParse.ts +113 -0
- package/ts/src/tasks/taskImportSync.ts +142 -0
- package/ts/src/tasks/taskStore.ts +312 -0
- package/ts/src/tasks/weekView.ts +120 -0
- package/ts/src/util/clipCodePoints.ts +26 -0
- package/ts/src/util/paths.ts +63 -0
- package/ts/src/util/program.ts +9 -0
- package/ts/src/util/pyGenerators.ts +144 -0
- package/ts/src/util/pythonText.ts +317 -0
- package/ts/src/util/semver.ts +45 -0
- package/ts/src/util/shellWord.ts +25 -0
- package/ts/src/util/slug.ts +64 -0
- package/ts/src/welcome/card.ts +339 -0
- package/ts/src/welcome/statusLine.ts +101 -0
- package/ts/src/welcome/updateCache.ts +129 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
// CV22.DS7.US8 plateau 5 — aggregate closure: Validate, Debt Review, Coherence, Done.
|
|
2
|
+
//
|
|
3
|
+
// Port of `src/memory/builder/delivery_story_closure.py`.
|
|
4
|
+
//
|
|
5
|
+
// The story-level closure in `closure.ts` decides three cursor fields from a
|
|
6
|
+
// missing-evidence tuple. This one decides them from an ORDERED STATUS LIST: each
|
|
7
|
+
// verb requires a specific `aggregate_checkpoint_status` entry and writes its own,
|
|
8
|
+
// and `replaceStatus` appends rather than replacing in place — so the same set can
|
|
9
|
+
// carry different bytes, and the cursor's compare-and-swap matches bytes.
|
|
10
|
+
//
|
|
11
|
+
// Four guard shapes, in Python's order, and the order is the behavior:
|
|
12
|
+
//
|
|
13
|
+
// * every verb first requires a Delivery Story cursor, under `delivery_story`
|
|
14
|
+
// flow, with an active item AND child work packages;
|
|
15
|
+
// * Validate then requires `plan:approved`;
|
|
16
|
+
// * Review requires `validation:passed` — exact, not a prefix;
|
|
17
|
+
// * Coherence and Done require a `debt_review:review:` PREFIX, so any decision
|
|
18
|
+
// (`no_action`, `defer`, `pay_now`) satisfies them. Done therefore accepts a
|
|
19
|
+
// reviewed state directly: DS-level Coherence is an option, not a precondition,
|
|
20
|
+
// exactly as at story level.
|
|
21
|
+
//
|
|
22
|
+
// Two inherited shapes are reproduced rather than repaired, and both have corpus
|
|
23
|
+
// cases so a tidier port fails:
|
|
24
|
+
//
|
|
25
|
+
// * `_ribbon` has no `coherence` branch, so the Coherence surface renders the
|
|
26
|
+
// DONE ribbon by fall-through;
|
|
27
|
+
// * the artifacts are written UNCONDITIONALLY (CR079), so an authored
|
|
28
|
+
// `validation.md` is replaced by scaffold.
|
|
29
|
+
//
|
|
30
|
+
// Done is also the only verb that does not route through the shared cursor update:
|
|
31
|
+
// it writes `coherence:coherent` and `done:done` in one write, which is what lets
|
|
32
|
+
// its surface truthfully say coherence was checked inside Done.
|
|
33
|
+
|
|
34
|
+
import type { WritableDatabase } from "#db/database.ts";
|
|
35
|
+
import { pyStrip } from "#util/pythonText.ts";
|
|
36
|
+
import { replaceStatus } from "./aggregateStatus.ts";
|
|
37
|
+
import type { MaterializedArtifact } from "./artifacts/artifactSurfaces.ts";
|
|
38
|
+
import type { ArtifactOutcome } from "./artifacts/artifactWriter.ts";
|
|
39
|
+
import { writeDeliveryStoryClosureArtifact } from "./artifacts/deliveryStoryArtifacts.ts";
|
|
40
|
+
import { cardText, cardWrapped } from "./card.ts";
|
|
41
|
+
import {
|
|
42
|
+
type BuilderDeliveryCursor,
|
|
43
|
+
type CursorWriteDeps,
|
|
44
|
+
getDeliveryCursor,
|
|
45
|
+
setDeliveryCursor,
|
|
46
|
+
} from "./deliveryCursor.ts";
|
|
47
|
+
import { FLOW_UNIT_DELIVERY_STORY } from "./flowUnit.ts";
|
|
48
|
+
import { wrapAriadSurface } from "./surfaceProtocol.ts";
|
|
49
|
+
|
|
50
|
+
export interface DeliveryStoryClosureReport {
|
|
51
|
+
readonly journey: string;
|
|
52
|
+
readonly method: string;
|
|
53
|
+
readonly deliveryStory: string;
|
|
54
|
+
readonly deliveryStoryTitle: string | null;
|
|
55
|
+
readonly childWorkItems: readonly string[];
|
|
56
|
+
readonly checkpoint: string;
|
|
57
|
+
readonly status: string;
|
|
58
|
+
readonly summary: string;
|
|
59
|
+
readonly cursor: BuilderDeliveryCursor;
|
|
60
|
+
readonly artifactPath: string | null;
|
|
61
|
+
/** What the writer did with the record (CR079); absent when nothing was written. */
|
|
62
|
+
readonly artifactOutcome?: ArtifactOutcome | null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Python `_require_delivery_story_cursor`. */
|
|
66
|
+
function requireDeliveryStoryCursor(db: WritableDatabase, journey: string): BuilderDeliveryCursor {
|
|
67
|
+
const cursor = getDeliveryCursor(db, journey);
|
|
68
|
+
if (cursor === null) {
|
|
69
|
+
throw new Error("delivery cursor is required before Delivery Story closure");
|
|
70
|
+
}
|
|
71
|
+
if (cursor.activeItemLevel !== "delivery_story") {
|
|
72
|
+
throw new Error("Delivery Story closure requires an active Delivery Story");
|
|
73
|
+
}
|
|
74
|
+
if (cursor.navigatorFlowUnit !== FLOW_UNIT_DELIVERY_STORY) {
|
|
75
|
+
throw new Error("Delivery Story closure requires navigator_flow_unit=delivery_story");
|
|
76
|
+
}
|
|
77
|
+
if (!cursor.activeItem) {
|
|
78
|
+
throw new Error("active Delivery Story is required before Delivery Story closure");
|
|
79
|
+
}
|
|
80
|
+
if (cursor.childWorkItems.length === 0) {
|
|
81
|
+
throw new Error("Delivery Story closure requires child work packages");
|
|
82
|
+
}
|
|
83
|
+
return cursor;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Python `_require_status`: an EXACT `checkpoint:status` entry. */
|
|
87
|
+
function requireStatus(cursor: BuilderDeliveryCursor, checkpoint: string, status: string): void {
|
|
88
|
+
const expected = `${checkpoint}:${status}`;
|
|
89
|
+
if (!cursor.aggregateCheckpointStatus.includes(expected)) {
|
|
90
|
+
throw new Error(`Delivery Story ${checkpoint} requires aggregate status ${expected}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Python `_require_prefix`: any entry under `checkpoint:prefix`. */
|
|
95
|
+
function requirePrefix(
|
|
96
|
+
cursor: BuilderDeliveryCursor,
|
|
97
|
+
checkpoint: string,
|
|
98
|
+
prefixStatus: string,
|
|
99
|
+
): void {
|
|
100
|
+
const prefix = `${checkpoint}:${prefixStatus}`;
|
|
101
|
+
if (!cursor.aggregateCheckpointStatus.some((item) => item.startsWith(prefix))) {
|
|
102
|
+
throw new Error(`Delivery Story ${checkpoint} requires aggregate status starting ${prefix}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface UpdateOptions {
|
|
107
|
+
readonly journey: string;
|
|
108
|
+
readonly method: string;
|
|
109
|
+
readonly cursor: BuilderDeliveryCursor;
|
|
110
|
+
readonly event: string;
|
|
111
|
+
readonly activeCheckpoint: string | null;
|
|
112
|
+
readonly pendingConfirmation: string | null;
|
|
113
|
+
readonly checkpoint: string;
|
|
114
|
+
readonly status: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Python `_update_cursor`. */
|
|
118
|
+
function updateCursor(
|
|
119
|
+
db: WritableDatabase,
|
|
120
|
+
options: UpdateOptions,
|
|
121
|
+
deps: CursorWriteDeps,
|
|
122
|
+
): BuilderDeliveryCursor {
|
|
123
|
+
const { cursor } = options;
|
|
124
|
+
return setDeliveryCursor(
|
|
125
|
+
db,
|
|
126
|
+
{
|
|
127
|
+
journey: options.journey,
|
|
128
|
+
method: options.method,
|
|
129
|
+
activeItem: cursor.activeItem,
|
|
130
|
+
activeItemTitle: cursor.activeItemTitle,
|
|
131
|
+
activeItemLevel: cursor.activeItemLevel,
|
|
132
|
+
activeCheckpoint: options.activeCheckpoint,
|
|
133
|
+
pendingConfirmation: options.pendingConfirmation,
|
|
134
|
+
lastDeliveryEvent: options.event,
|
|
135
|
+
cadenceProfile: cursor.cadenceProfile,
|
|
136
|
+
cadenceLimits: cursor.cadenceLimits,
|
|
137
|
+
granularityDecision: cursor.granularityDecision,
|
|
138
|
+
navigatorFlowUnit: cursor.navigatorFlowUnit,
|
|
139
|
+
childWorkItems: cursor.childWorkItems,
|
|
140
|
+
aggregateCheckpointStatus: replaceStatus(
|
|
141
|
+
cursor.aggregateCheckpointStatus,
|
|
142
|
+
options.checkpoint,
|
|
143
|
+
options.status,
|
|
144
|
+
),
|
|
145
|
+
},
|
|
146
|
+
deps,
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Python `_report`: the summary falls back to `none` when blank. */
|
|
151
|
+
function buildReport(options: {
|
|
152
|
+
journey: string;
|
|
153
|
+
method: string;
|
|
154
|
+
cursor: BuilderDeliveryCursor;
|
|
155
|
+
checkpoint: string;
|
|
156
|
+
status: string;
|
|
157
|
+
summary: string;
|
|
158
|
+
updated: BuilderDeliveryCursor;
|
|
159
|
+
artifactPath: string | null;
|
|
160
|
+
}): DeliveryStoryClosureReport {
|
|
161
|
+
return {
|
|
162
|
+
journey: options.journey,
|
|
163
|
+
method: options.method,
|
|
164
|
+
deliveryStory: options.cursor.activeItem || "none",
|
|
165
|
+
deliveryStoryTitle: options.cursor.activeItemTitle,
|
|
166
|
+
childWorkItems: options.cursor.childWorkItems,
|
|
167
|
+
checkpoint: options.checkpoint,
|
|
168
|
+
status: options.status,
|
|
169
|
+
summary: pyStrip(options.summary) || "none",
|
|
170
|
+
cursor: options.updated,
|
|
171
|
+
artifactPath: options.artifactPath,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function persistArtifact(
|
|
176
|
+
report: DeliveryStoryClosureReport,
|
|
177
|
+
projectRoot: string | null | undefined,
|
|
178
|
+
): ArtifactOutcome | null {
|
|
179
|
+
return writeDeliveryStoryClosureArtifact(
|
|
180
|
+
report.artifactPath,
|
|
181
|
+
{
|
|
182
|
+
deliveryStory: report.deliveryStory,
|
|
183
|
+
childWorkItems: report.childWorkItems,
|
|
184
|
+
checkpoint: report.checkpoint,
|
|
185
|
+
status: report.status,
|
|
186
|
+
summary: report.summary,
|
|
187
|
+
boundary: boundaryFor(report),
|
|
188
|
+
},
|
|
189
|
+
projectRoot,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* The artifact manifest the CLI prints: what the writer did, never a pre-check
|
|
195
|
+
* (CR079). A pre-sampled `existing` once announced a file the command had just
|
|
196
|
+
* replaced.
|
|
197
|
+
*/
|
|
198
|
+
export function closureArtifactManifest(
|
|
199
|
+
kind: string,
|
|
200
|
+
path: string | null,
|
|
201
|
+
outcome: ArtifactOutcome | null | undefined,
|
|
202
|
+
): readonly MaterializedArtifact[] {
|
|
203
|
+
if (path === null || outcome === null || outcome === undefined) return [];
|
|
204
|
+
return [{ kind, path, status: outcome }];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface ValidateDeliveryStoryOptions {
|
|
208
|
+
readonly journey: string;
|
|
209
|
+
readonly method: string;
|
|
210
|
+
readonly summary: string;
|
|
211
|
+
readonly navigatorAccepted?: boolean;
|
|
212
|
+
readonly artifactPath?: string | null;
|
|
213
|
+
/** The project the artifact must stay inside (CR079). */
|
|
214
|
+
readonly projectRoot?: string | null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/** Python `validate_delivery_story`. */
|
|
218
|
+
export function validateDeliveryStory(
|
|
219
|
+
db: WritableDatabase,
|
|
220
|
+
options: ValidateDeliveryStoryOptions,
|
|
221
|
+
deps: CursorWriteDeps,
|
|
222
|
+
): DeliveryStoryClosureReport {
|
|
223
|
+
const cursor = requireDeliveryStoryCursor(db, options.journey);
|
|
224
|
+
requireStatus(cursor, "plan", "approved");
|
|
225
|
+
const accepted = options.navigatorAccepted ?? false;
|
|
226
|
+
const status = accepted ? "passed" : "pending_navigator_validation";
|
|
227
|
+
const updated = updateCursor(
|
|
228
|
+
db,
|
|
229
|
+
{
|
|
230
|
+
journey: options.journey,
|
|
231
|
+
method: options.method,
|
|
232
|
+
cursor,
|
|
233
|
+
event: accepted ? "delivery_story_validation_complete" : "delivery_story_validation",
|
|
234
|
+
activeCheckpoint: accepted ? null : "delivery_story_validation",
|
|
235
|
+
pendingConfirmation: accepted ? null : "navigator_delivery_story_validation",
|
|
236
|
+
checkpoint: "validation",
|
|
237
|
+
status,
|
|
238
|
+
},
|
|
239
|
+
deps,
|
|
240
|
+
);
|
|
241
|
+
const report = buildReport({
|
|
242
|
+
journey: options.journey,
|
|
243
|
+
method: options.method,
|
|
244
|
+
cursor,
|
|
245
|
+
checkpoint: "validation",
|
|
246
|
+
status,
|
|
247
|
+
summary: options.summary,
|
|
248
|
+
updated,
|
|
249
|
+
artifactPath: options.artifactPath ?? null,
|
|
250
|
+
});
|
|
251
|
+
return { ...report, artifactOutcome: persistArtifact(report, options.projectRoot) };
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export interface ReviewDeliveryStoryOptions {
|
|
255
|
+
readonly journey: string;
|
|
256
|
+
readonly method: string;
|
|
257
|
+
readonly decision: string;
|
|
258
|
+
readonly summary: string;
|
|
259
|
+
readonly artifactPath?: string | null;
|
|
260
|
+
/** The project the artifact must stay inside (CR079). */
|
|
261
|
+
readonly projectRoot?: string | null;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** Python `review_delivery_story`. */
|
|
265
|
+
export function reviewDeliveryStory(
|
|
266
|
+
db: WritableDatabase,
|
|
267
|
+
options: ReviewDeliveryStoryOptions,
|
|
268
|
+
deps: CursorWriteDeps,
|
|
269
|
+
): DeliveryStoryClosureReport {
|
|
270
|
+
const cursor = requireDeliveryStoryCursor(db, options.journey);
|
|
271
|
+
requireStatus(cursor, "validation", "passed");
|
|
272
|
+
if (!["no_action", "defer", "pay_now"].includes(options.decision)) {
|
|
273
|
+
throw new Error("Delivery Story debt decision must be no_action, defer, or pay_now");
|
|
274
|
+
}
|
|
275
|
+
const status = `review:${options.decision}`;
|
|
276
|
+
const updated = updateCursor(
|
|
277
|
+
db,
|
|
278
|
+
{
|
|
279
|
+
journey: options.journey,
|
|
280
|
+
method: options.method,
|
|
281
|
+
cursor,
|
|
282
|
+
event: "delivery_story_review_complete",
|
|
283
|
+
activeCheckpoint: null,
|
|
284
|
+
pendingConfirmation: null,
|
|
285
|
+
checkpoint: "debt_review",
|
|
286
|
+
status,
|
|
287
|
+
},
|
|
288
|
+
deps,
|
|
289
|
+
);
|
|
290
|
+
const report = buildReport({
|
|
291
|
+
journey: options.journey,
|
|
292
|
+
method: options.method,
|
|
293
|
+
cursor,
|
|
294
|
+
checkpoint: "debt_review",
|
|
295
|
+
status,
|
|
296
|
+
summary: options.summary,
|
|
297
|
+
updated,
|
|
298
|
+
artifactPath: options.artifactPath ?? null,
|
|
299
|
+
});
|
|
300
|
+
return { ...report, artifactOutcome: persistArtifact(report, options.projectRoot) };
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export interface CoherenceDeliveryStoryOptions {
|
|
304
|
+
readonly journey: string;
|
|
305
|
+
readonly method: string;
|
|
306
|
+
readonly summary: string;
|
|
307
|
+
readonly artifactPath?: string | null;
|
|
308
|
+
/** The project the artifact must stay inside (CR079). */
|
|
309
|
+
readonly projectRoot?: string | null;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Python `coherence_delivery_story`. */
|
|
313
|
+
export function coherenceDeliveryStory(
|
|
314
|
+
db: WritableDatabase,
|
|
315
|
+
options: CoherenceDeliveryStoryOptions,
|
|
316
|
+
deps: CursorWriteDeps,
|
|
317
|
+
): DeliveryStoryClosureReport {
|
|
318
|
+
const cursor = requireDeliveryStoryCursor(db, options.journey);
|
|
319
|
+
requirePrefix(cursor, "debt_review", "review:");
|
|
320
|
+
const updated = updateCursor(
|
|
321
|
+
db,
|
|
322
|
+
{
|
|
323
|
+
journey: options.journey,
|
|
324
|
+
method: options.method,
|
|
325
|
+
cursor,
|
|
326
|
+
event: "delivery_story_coherence_complete",
|
|
327
|
+
activeCheckpoint: null,
|
|
328
|
+
pendingConfirmation: null,
|
|
329
|
+
checkpoint: "coherence",
|
|
330
|
+
status: "coherent",
|
|
331
|
+
},
|
|
332
|
+
deps,
|
|
333
|
+
);
|
|
334
|
+
const report = buildReport({
|
|
335
|
+
journey: options.journey,
|
|
336
|
+
method: options.method,
|
|
337
|
+
cursor,
|
|
338
|
+
checkpoint: "coherence",
|
|
339
|
+
status: "coherent",
|
|
340
|
+
summary: options.summary,
|
|
341
|
+
updated,
|
|
342
|
+
artifactPath: options.artifactPath ?? null,
|
|
343
|
+
});
|
|
344
|
+
return { ...report, artifactOutcome: persistArtifact(report, options.projectRoot) };
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export interface DoneDeliveryStoryOptions {
|
|
348
|
+
readonly journey: string;
|
|
349
|
+
readonly method: string;
|
|
350
|
+
readonly summary: string;
|
|
351
|
+
readonly artifactPath?: string | null;
|
|
352
|
+
/** The project the artifact must stay inside (CR079). */
|
|
353
|
+
readonly projectRoot?: string | null;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Python `done_delivery_story`.
|
|
358
|
+
*
|
|
359
|
+
* The only verb that writes TWO statuses in one write — `coherence:coherent` then
|
|
360
|
+
* `done:done` — and therefore the only one that does not go through
|
|
361
|
+
* `updateCursor`. Note what it does NOT do: the authored-roadmap preflight lives in
|
|
362
|
+
* the CLI, ahead of this call, so the module can be driven in a test without a
|
|
363
|
+
* project on disk.
|
|
364
|
+
*/
|
|
365
|
+
export function doneDeliveryStory(
|
|
366
|
+
db: WritableDatabase,
|
|
367
|
+
options: DoneDeliveryStoryOptions,
|
|
368
|
+
deps: CursorWriteDeps,
|
|
369
|
+
): DeliveryStoryClosureReport {
|
|
370
|
+
const cursor = requireDeliveryStoryCursor(db, options.journey);
|
|
371
|
+
requirePrefix(cursor, "debt_review", "review:");
|
|
372
|
+
let statuses = replaceStatus(cursor.aggregateCheckpointStatus, "coherence", "coherent");
|
|
373
|
+
statuses = replaceStatus(statuses, "done", "done");
|
|
374
|
+
const updated = setDeliveryCursor(
|
|
375
|
+
db,
|
|
376
|
+
{
|
|
377
|
+
journey: options.journey,
|
|
378
|
+
method: options.method,
|
|
379
|
+
activeItem: cursor.activeItem,
|
|
380
|
+
activeItemTitle: cursor.activeItemTitle,
|
|
381
|
+
activeItemLevel: cursor.activeItemLevel,
|
|
382
|
+
activeCheckpoint: null,
|
|
383
|
+
pendingConfirmation: null,
|
|
384
|
+
lastDeliveryEvent: "delivery_story_done_complete",
|
|
385
|
+
cadenceProfile: cursor.cadenceProfile,
|
|
386
|
+
cadenceLimits: cursor.cadenceLimits,
|
|
387
|
+
granularityDecision: cursor.granularityDecision,
|
|
388
|
+
navigatorFlowUnit: cursor.navigatorFlowUnit,
|
|
389
|
+
childWorkItems: cursor.childWorkItems,
|
|
390
|
+
aggregateCheckpointStatus: statuses,
|
|
391
|
+
},
|
|
392
|
+
deps,
|
|
393
|
+
);
|
|
394
|
+
const report = buildReport({
|
|
395
|
+
journey: options.journey,
|
|
396
|
+
method: options.method,
|
|
397
|
+
cursor,
|
|
398
|
+
checkpoint: "done",
|
|
399
|
+
status: "done",
|
|
400
|
+
summary: options.summary,
|
|
401
|
+
updated,
|
|
402
|
+
artifactPath: options.artifactPath ?? null,
|
|
403
|
+
});
|
|
404
|
+
return { ...report, artifactOutcome: persistArtifact(report, options.projectRoot) };
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// --- surfaces ---------------------------------------------------------------
|
|
408
|
+
|
|
409
|
+
const RIBBON_VALIDATION =
|
|
410
|
+
"Delivery Flow: ✓ Pull → ✓ Prepare → ✓ Expand → ✓ DS Plan → ✓ Implement → ◉ Validate → ○ Debt Review → ○ Done";
|
|
411
|
+
const RIBBON_DEBT_REVIEW =
|
|
412
|
+
"Delivery Flow: ✓ Pull → ✓ Prepare → ✓ Expand → ✓ DS Plan → ✓ Implement → ✓ Validate → ◉ Debt Review → ○ Done";
|
|
413
|
+
const RIBBON_DONE =
|
|
414
|
+
"Delivery Flow: ✓ Pull → ✓ Prepare → ✓ Expand → ✓ DS Plan → ✓ Implement → ✓ Validate → ✓ Debt Review → ◉ Done";
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Python `_ribbon`.
|
|
418
|
+
*
|
|
419
|
+
* `coherence` has NO branch in Python, so it falls through to the Done ribbon and a
|
|
420
|
+
* Coherence checkpoint renders `◉ Done`. Adding the missing branch is prettier and
|
|
421
|
+
* fails `delivery_story_flow_happy_path`.
|
|
422
|
+
*/
|
|
423
|
+
function ribbon(checkpoint: string): string {
|
|
424
|
+
if (checkpoint === "validation") return RIBBON_VALIDATION;
|
|
425
|
+
if (checkpoint === "debt_review") return RIBBON_DEBT_REVIEW;
|
|
426
|
+
return RIBBON_DONE;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/** Python `_boundary`. */
|
|
430
|
+
function boundaryFor(report: DeliveryStoryClosureReport): string {
|
|
431
|
+
if (report.checkpoint === "validation" && report.status !== "passed") {
|
|
432
|
+
return "Do not proceed to DS-level Debt Review until Navigator validation is accepted.";
|
|
433
|
+
}
|
|
434
|
+
if (report.checkpoint === "done") {
|
|
435
|
+
return "Delivery Story closure is complete; push and release remain separate hard gates.";
|
|
436
|
+
}
|
|
437
|
+
return "No push or release action is authorized by this checkpoint.";
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const WHAT_HAPPENED: Record<string, string> = {
|
|
441
|
+
validation: "What was validated?",
|
|
442
|
+
debt_review: "What was reviewed?",
|
|
443
|
+
coherence: "What was checked?",
|
|
444
|
+
done: "What was completed?",
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
const STATE_HEADING: Record<string, string> = {
|
|
448
|
+
validation: "Navigator validation",
|
|
449
|
+
debt_review: "Debt decision",
|
|
450
|
+
coherence: "Coherence state",
|
|
451
|
+
done: "Done state",
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
/** Python `_state_summary`. */
|
|
455
|
+
function stateSummary(report: DeliveryStoryClosureReport): string {
|
|
456
|
+
if (report.checkpoint === "validation") {
|
|
457
|
+
return report.status === "passed"
|
|
458
|
+
? "Navigator accepted validation."
|
|
459
|
+
: "Awaiting Navigator validation acceptance.";
|
|
460
|
+
}
|
|
461
|
+
if (report.checkpoint === "debt_review") return report.status.replaceAll("review:", "");
|
|
462
|
+
return report.status.replaceAll("_", " ");
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Python `_next_movement`. */
|
|
466
|
+
function nextMovement(report: DeliveryStoryClosureReport): string {
|
|
467
|
+
if (report.checkpoint === "validation") {
|
|
468
|
+
return report.status === "passed"
|
|
469
|
+
? "Proceed to DS-level Debt Review."
|
|
470
|
+
: "Accept validation before DS-level Debt Review.";
|
|
471
|
+
}
|
|
472
|
+
if (report.checkpoint === "debt_review") return "Proceed to DS-level Done.";
|
|
473
|
+
if (report.checkpoint === "coherence") {
|
|
474
|
+
return "Coherence is now checked inside Done for DS-level flow.";
|
|
475
|
+
}
|
|
476
|
+
if (report.checkpoint === "done") return "Delivery Story closure is complete.";
|
|
477
|
+
return boundaryFor(report);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** Python `_active_delivery`. */
|
|
481
|
+
function activeDelivery(report: DeliveryStoryClosureReport): string {
|
|
482
|
+
const title = report.deliveryStoryTitle ? ` — ${report.deliveryStoryTitle}` : "";
|
|
483
|
+
return `🟦[${report.deliveryStory}]${title}`;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/** Python `render_delivery_story_closure_report`. */
|
|
487
|
+
export function renderDeliveryStoryClosureReport(report: DeliveryStoryClosureReport): string {
|
|
488
|
+
const doneCoherence =
|
|
489
|
+
report.checkpoint === "done"
|
|
490
|
+
? [
|
|
491
|
+
"│ │",
|
|
492
|
+
cardText("Coherence check"),
|
|
493
|
+
...cardWrapped(
|
|
494
|
+
"Closure coherence passed: Done materialization, roadmap state, artifacts, and next-pull readiness were checked as part of Done.",
|
|
495
|
+
),
|
|
496
|
+
"│ │",
|
|
497
|
+
]
|
|
498
|
+
: [];
|
|
499
|
+
const body = [
|
|
500
|
+
"Delivery",
|
|
501
|
+
ribbon(report.checkpoint),
|
|
502
|
+
"",
|
|
503
|
+
"╭────────────────────────────────────────────────────────╮",
|
|
504
|
+
cardText(` 🧪 DELIVERY STORY ${report.checkpoint.replaceAll("_", " ").toUpperCase()}`),
|
|
505
|
+
"│ │",
|
|
506
|
+
cardText(WHAT_HAPPENED[report.checkpoint] ?? "What happened?"),
|
|
507
|
+
...cardWrapped(activeDelivery(report)),
|
|
508
|
+
"│ │",
|
|
509
|
+
cardText("Evidence summary"),
|
|
510
|
+
...cardWrapped(report.summary),
|
|
511
|
+
"│ │",
|
|
512
|
+
cardText(STATE_HEADING[report.checkpoint] ?? "State"),
|
|
513
|
+
...cardWrapped(stateSummary(report)),
|
|
514
|
+
"│ │",
|
|
515
|
+
...doneCoherence,
|
|
516
|
+
cardText("Next movement"),
|
|
517
|
+
...cardWrapped(nextMovement(report)),
|
|
518
|
+
"╰────────────────────────────────────────────────────────╯",
|
|
519
|
+
];
|
|
520
|
+
return wrapAriadSurface("delivery_story_closure_checkpoint", `${body.join("\n")}\n`);
|
|
521
|
+
}
|