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,24 @@
|
|
|
1
|
+
// Extension error hierarchy (CV22.DS7.TS3 plateau 3a). Port of
|
|
2
|
+
// `src/memory/extensions/errors.py`.
|
|
3
|
+
//
|
|
4
|
+
// These messages are not internal: `runtime status` prints an extension's
|
|
5
|
+
// validation or migration failure verbatim as its health note, so the text and
|
|
6
|
+
// the `[extension/<id>]` prefix are a graded parity surface, not free-form
|
|
7
|
+
// diagnostics. `extension_id` is optional because a malformed manifest is
|
|
8
|
+
// discovered before the id is known.
|
|
9
|
+
|
|
10
|
+
export class ExtensionError extends Error {
|
|
11
|
+
readonly extensionId: string | null;
|
|
12
|
+
|
|
13
|
+
constructor(message: string, extensionId: string | null = null) {
|
|
14
|
+
super(extensionId ? `[extension/${extensionId}] ${message}` : message);
|
|
15
|
+
this.extensionId = extensionId;
|
|
16
|
+
this.name = new.target.name;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Raised when an extension's manifest fails validation. */
|
|
21
|
+
export class ExtensionValidationError extends ExtensionError {}
|
|
22
|
+
|
|
23
|
+
/** Raised when a SQL migration file is malformed or fails to apply. */
|
|
24
|
+
export class ExtensionMigrationError extends ExtensionError {}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
// Extension manifest validation (CV22.DS7.TS3 plateau 3a). Port of
|
|
2
|
+
// `load_extension_manifest` and its helpers from `src/memory/cli/extensions.py`.
|
|
3
|
+
//
|
|
4
|
+
// Why this lands in TS3 rather than TS4, where the extension catalog lives:
|
|
5
|
+
// `inspect_extension_health` -- which `runtime status` renders -- calls the
|
|
6
|
+
// validator for two fields (`id`, `kind`) and prints `str(exc)` verbatim as
|
|
7
|
+
// the health note when it raises. Knowing a manifest is valid IS running the
|
|
8
|
+
// validator, so there is no smaller honest port. TS4 extends this module.
|
|
9
|
+
//
|
|
10
|
+
// TWO RECORDED DIVERGENCES, both from the YAML parser and neither from us
|
|
11
|
+
// (Navigator decision, 2026-09-08):
|
|
12
|
+
//
|
|
13
|
+
// D1. `_load_yaml` renders `invalid YAML in {path}: {exc}` where `{exc}` is
|
|
14
|
+
// PyYAML's own error text. The `yaml` package cannot reproduce it. The
|
|
15
|
+
// golden pins the stable prefix byte-for-byte and records both tails.
|
|
16
|
+
// D2. PyYAML is YAML 1.1; `yaml` is YAML 1.2. An unquoted `no`/`yes`/`on`/
|
|
17
|
+
// `off`, octal, or sexagesimal scalar resolves differently. The same
|
|
18
|
+
// family swallows one branch outright: Python's `runtime names must be
|
|
19
|
+
// strings` is unreachable here, because a JavaScript object key is
|
|
20
|
+
// always a string. A manifest keying a runtime by `1:` gets Python's
|
|
21
|
+
// type error and TypeScript's `invalid runtime name: 1`.
|
|
22
|
+
//
|
|
23
|
+
// Every Mirror-authored message below is byte-identical across cores.
|
|
24
|
+
|
|
25
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
26
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
27
|
+
import { parse } from "yaml";
|
|
28
|
+
import { pyRepr, pyStr, pyTruthy } from "#util/pythonText.ts";
|
|
29
|
+
import { ExtensionValidationError } from "./errors.ts";
|
|
30
|
+
import { tablePrefixFor } from "./migrations.ts";
|
|
31
|
+
|
|
32
|
+
const ALLOWED_KINDS = new Set(["prompt-skill", "command-skill"]);
|
|
33
|
+
const RUNTIME_NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
34
|
+
const SKILL_ID_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
35
|
+
const REQUIRED_FIELDS = ["id", "name", "category", "kind", "summary", "runtimes"] as const;
|
|
36
|
+
const PATH_LIKE_SUFFIXES = new Set([".js", ".mjs", ".cjs", ".py"]);
|
|
37
|
+
|
|
38
|
+
/** One runtime's validated entry, in the shape the catalog renderers print. */
|
|
39
|
+
export interface ExtensionRuntimeEntry {
|
|
40
|
+
commandName: string;
|
|
41
|
+
/** The declared relative path, as written in the manifest. */
|
|
42
|
+
skillFile: string | null;
|
|
43
|
+
/** The resolved absolute path, present only when `skillFile` is. */
|
|
44
|
+
skillPath: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The validated manifest.
|
|
49
|
+
*
|
|
50
|
+
* TS3 returned `{id, kind}` -- all `runtime status` reads -- and said TS4
|
|
51
|
+
* would widen it "when the catalog commands give the remaining fields
|
|
52
|
+
* somewhere to go". They do now: every field below is printed by `extensions
|
|
53
|
+
* list`, `ext list`, or `inspect extension`, and none is here for its own
|
|
54
|
+
* sake.
|
|
55
|
+
*
|
|
56
|
+
* `entrypoint` is an ORDERED pair list rather than an object because
|
|
57
|
+
* `inspect extension` prints it by iterating the mapping, and Python appends
|
|
58
|
+
* the resolved `module_path` to the dict it parsed -- so insertion order is
|
|
59
|
+
* observable output, not an implementation detail.
|
|
60
|
+
*/
|
|
61
|
+
export interface ExtensionManifest {
|
|
62
|
+
id: string;
|
|
63
|
+
kind: string;
|
|
64
|
+
name: string;
|
|
65
|
+
category: string;
|
|
66
|
+
summary: string;
|
|
67
|
+
/** Absolute path of the extension directory, as Python's `root`. */
|
|
68
|
+
root: string;
|
|
69
|
+
manifestPath: string;
|
|
70
|
+
runtimes: Record<string, ExtensionRuntimeEntry>;
|
|
71
|
+
entrypoint: ReadonlyArray<readonly [string, string]>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function isMapping(value: unknown): value is Record<string, unknown> {
|
|
75
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Port of `_load_yaml`. See D1 for the malformed-YAML branch. */
|
|
79
|
+
function loadYaml(manifestPath: string): Record<string, unknown> {
|
|
80
|
+
let text: string;
|
|
81
|
+
try {
|
|
82
|
+
text = readFileSync(manifestPath, "utf8");
|
|
83
|
+
} catch {
|
|
84
|
+
throw new ExtensionValidationError(`missing manifest: ${manifestPath}`);
|
|
85
|
+
}
|
|
86
|
+
let data: unknown;
|
|
87
|
+
try {
|
|
88
|
+
data = parse(text);
|
|
89
|
+
} catch (error) {
|
|
90
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
91
|
+
throw new ExtensionValidationError(`invalid YAML in ${manifestPath}: ${detail}`);
|
|
92
|
+
}
|
|
93
|
+
if (!isMapping(data)) {
|
|
94
|
+
throw new ExtensionValidationError(`manifest must be a mapping: ${manifestPath}`);
|
|
95
|
+
}
|
|
96
|
+
return data;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Port of `_validate_runtime_name`. */
|
|
100
|
+
function validateRuntimeName(name: string): void {
|
|
101
|
+
if (!RUNTIME_NAME_RE.test(name)) {
|
|
102
|
+
throw new ExtensionValidationError(`invalid runtime name: ${name}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Port of `_validate_command_name`: the per-runtime command namespaces. */
|
|
107
|
+
function validateCommandName(runtime: string, commandName: string): void {
|
|
108
|
+
if (runtime === "claude" && !commandName.startsWith("ext:")) {
|
|
109
|
+
throw new ExtensionValidationError(`runtime '${runtime}' command_name must start with 'ext:'`);
|
|
110
|
+
}
|
|
111
|
+
if (runtime === "pi" && !commandName.startsWith("ext-")) {
|
|
112
|
+
throw new ExtensionValidationError(`runtime '${runtime}' command_name must start with 'ext-'`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Python `Path(p).suffix.lower()`. */
|
|
117
|
+
function suffixOf(argument: string): string {
|
|
118
|
+
const base = argument.split(/[\\/]/).pop() ?? "";
|
|
119
|
+
const dot = base.lastIndexOf(".");
|
|
120
|
+
return dot <= 0 ? "" : base.slice(dot).toLowerCase();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Python `candidate.is_relative_to(root)`. */
|
|
124
|
+
function isRelativeTo(candidate: string, root: string): boolean {
|
|
125
|
+
const rel = relative(root, candidate);
|
|
126
|
+
return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** Port of `_validate_context_providers`. */
|
|
130
|
+
function validateContextProviders(
|
|
131
|
+
data: Record<string, unknown>,
|
|
132
|
+
extensionDir: string,
|
|
133
|
+
manifestPath: string,
|
|
134
|
+
): void {
|
|
135
|
+
const providers = data.mirror_context_providers;
|
|
136
|
+
if (providers === null || providers === undefined) return;
|
|
137
|
+
if (!Array.isArray(providers)) {
|
|
138
|
+
throw new ExtensionValidationError(
|
|
139
|
+
`mirror_context_providers must be a list in ${manifestPath}`,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
const seen = new Set<string>();
|
|
143
|
+
const root = resolve(extensionDir);
|
|
144
|
+
for (const provider of providers) {
|
|
145
|
+
if (!isMapping(provider)) {
|
|
146
|
+
throw new ExtensionValidationError(
|
|
147
|
+
`mirror_context_providers entries must be objects in ${manifestPath}`,
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
const capabilityId = provider.id;
|
|
151
|
+
if (typeof capabilityId !== "string" || !RUNTIME_NAME_RE.test(capabilityId)) {
|
|
152
|
+
throw new ExtensionValidationError(
|
|
153
|
+
`invalid mirror context capability id ${pyRepr(capabilityId)} in ${manifestPath}`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
if (seen.has(capabilityId)) {
|
|
157
|
+
throw new ExtensionValidationError(
|
|
158
|
+
`duplicate mirror context capability id ${pyRepr(capabilityId)} in ${manifestPath}`,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
seen.add(capabilityId);
|
|
162
|
+
const runtime = provider.provider_runtime;
|
|
163
|
+
if (runtime === null || runtime === undefined) continue;
|
|
164
|
+
if (!isMapping(runtime) || runtime.protocol !== "mirror-context-v1") {
|
|
165
|
+
throw new ExtensionValidationError(
|
|
166
|
+
`provider_runtime for ${pyRepr(capabilityId)} must use mirror-context-v1 ` +
|
|
167
|
+
`in ${manifestPath}`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
const command = runtime.command;
|
|
171
|
+
if (
|
|
172
|
+
!Array.isArray(command) ||
|
|
173
|
+
command.length === 0 ||
|
|
174
|
+
command.some((part) => typeof part !== "string" || part.length === 0)
|
|
175
|
+
) {
|
|
176
|
+
throw new ExtensionValidationError(
|
|
177
|
+
`provider_runtime.command for ${pyRepr(capabilityId)} must be a non-empty argv list ` +
|
|
178
|
+
`in ${manifestPath}`,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
for (const [index, argument] of (command as string[]).entries()) {
|
|
182
|
+
const pathLike =
|
|
183
|
+
isAbsolute(argument) ||
|
|
184
|
+
argument.includes("/") ||
|
|
185
|
+
argument.includes("\\") ||
|
|
186
|
+
(index > 0 && PATH_LIKE_SUFFIXES.has(suffixOf(argument)));
|
|
187
|
+
if (!pathLike) continue;
|
|
188
|
+
const candidate = resolve(root, argument);
|
|
189
|
+
if (isAbsolute(argument) || !isRelativeTo(candidate, root)) {
|
|
190
|
+
throw new ExtensionValidationError(
|
|
191
|
+
`provider_runtime.command path escapes extension root in ${manifestPath}`,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
if (!existsSync(candidate)) {
|
|
195
|
+
throw new ExtensionValidationError(`provider_runtime.command path not found: ${candidate}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Validate an entrypoint the extension DECLARED, as the oracle did, and return
|
|
203
|
+
* the module path it resolves to. The `.py` suffix is the declared contract of
|
|
204
|
+
* an entrypoint -- an extension may be Python -- not a demand on extensions
|
|
205
|
+
* that declare none.
|
|
206
|
+
*/
|
|
207
|
+
function declaredModulePath(
|
|
208
|
+
entrypoint: unknown,
|
|
209
|
+
extensionDir: string,
|
|
210
|
+
manifestPath: string,
|
|
211
|
+
): string {
|
|
212
|
+
if (!isMapping(entrypoint) || !pyTruthy(entrypoint.module)) {
|
|
213
|
+
throw new ExtensionValidationError(
|
|
214
|
+
"a declared entrypoint requires entrypoint.module (a Python module " +
|
|
215
|
+
`name under the extension directory) in ${manifestPath}`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
const moduleName = entrypoint.module;
|
|
219
|
+
if (typeof moduleName !== "string" || moduleName.length === 0) {
|
|
220
|
+
throw new ExtensionValidationError(
|
|
221
|
+
`entrypoint.module must be a non-empty string in ${manifestPath}`,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
const modulePath = join(extensionDir, `${moduleName}.py`);
|
|
225
|
+
if (!existsSync(modulePath)) {
|
|
226
|
+
throw new ExtensionValidationError(
|
|
227
|
+
`entrypoint.module '${moduleName}' not found at ${modulePath}`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
return modulePath;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Port of `load_extension_manifest`. Check order is load-bearing: the oracle
|
|
235
|
+
* reports the FIRST failure, so reordering would change the health note text
|
|
236
|
+
* for a manifest that breaks two rules at once.
|
|
237
|
+
*/
|
|
238
|
+
export function loadExtensionManifest(extensionDir: string): ExtensionManifest {
|
|
239
|
+
// `join`, not `resolve`: the oracle builds these display paths with
|
|
240
|
+
// `extension_dir / name`, which does not normalize `..`, and the path is
|
|
241
|
+
// interpolated into error messages the health note prints verbatim.
|
|
242
|
+
const manifestPath = join(extensionDir, "skill.yaml");
|
|
243
|
+
const data = loadYaml(manifestPath);
|
|
244
|
+
|
|
245
|
+
for (const field of REQUIRED_FIELDS) {
|
|
246
|
+
if (!pyTruthy(data[field])) {
|
|
247
|
+
throw new ExtensionValidationError(`missing required field '${field}' in ${manifestPath}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const skillId = data.id;
|
|
252
|
+
if (typeof skillId !== "string" || !SKILL_ID_RE.test(skillId)) {
|
|
253
|
+
throw new ExtensionValidationError(`invalid skill id '${pyStr(skillId)}' in ${manifestPath}`);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (data.category !== "extension") {
|
|
257
|
+
throw new ExtensionValidationError(
|
|
258
|
+
`unsupported category '${pyStr(data.category)}' in ${manifestPath}`,
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const kind = data.kind;
|
|
263
|
+
if (typeof kind !== "string" || !ALLOWED_KINDS.has(kind)) {
|
|
264
|
+
throw new ExtensionValidationError(`unsupported kind '${pyStr(kind)}' in ${manifestPath}`);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const runtimes = data.runtimes;
|
|
268
|
+
if (!isMapping(runtimes) || Object.keys(runtimes).length === 0) {
|
|
269
|
+
throw new ExtensionValidationError(`runtimes must be a non-empty mapping in ${manifestPath}`);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Python mutates the parsed `entrypoint` dict, appending `module_path` after
|
|
273
|
+
// the keys the author wrote; `inspect extension` prints that order.
|
|
274
|
+
const entrypointPairs: [string, string][] = isMapping(data.entrypoint)
|
|
275
|
+
? Object.entries(data.entrypoint).map(([key, value]) => [key, pyStr(value)])
|
|
276
|
+
: [];
|
|
277
|
+
const entrypoint: ReadonlyArray<readonly [string, string]> = entrypointPairs;
|
|
278
|
+
const validatedRuntimes: Record<string, ExtensionRuntimeEntry> = {};
|
|
279
|
+
|
|
280
|
+
if (kind === "command-skill") {
|
|
281
|
+
// Optional since CV22.DS10.TS5 (D10). The core has imported no entrypoint
|
|
282
|
+
// since CV22.DS10.TS2 -- every capability declares its own runtime -- so
|
|
283
|
+
// the rule demanded a Python file from every command-skill and read
|
|
284
|
+
// nothing from it. An entrypoint an extension DOES declare is validated
|
|
285
|
+
// exactly as before, so every installed extension validates as it did.
|
|
286
|
+
if (data.entrypoint !== undefined && data.entrypoint !== null) {
|
|
287
|
+
entrypointPairs.push([
|
|
288
|
+
"module_path",
|
|
289
|
+
declaredModulePath(data.entrypoint, extensionDir, manifestPath),
|
|
290
|
+
]);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const expectedPrefix = tablePrefixFor(skillId);
|
|
294
|
+
const declaredPrefix = data.table_prefix;
|
|
295
|
+
if (declaredPrefix !== null && declaredPrefix !== undefined) {
|
|
296
|
+
if (declaredPrefix !== expectedPrefix) {
|
|
297
|
+
throw new ExtensionValidationError(
|
|
298
|
+
`table_prefix '${pyStr(declaredPrefix)}' does not match the ` +
|
|
299
|
+
`required prefix '${expectedPrefix}' for id '${skillId}' ` +
|
|
300
|
+
`in ${manifestPath}`,
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
for (const [runtimeName, runtimeData] of Object.entries(runtimes)) {
|
|
307
|
+
validateRuntimeName(runtimeName);
|
|
308
|
+
if (!isMapping(runtimeData)) {
|
|
309
|
+
throw new ExtensionValidationError(
|
|
310
|
+
`runtime '${runtimeName}' must map to an object in ${manifestPath}`,
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
const commandName = runtimeData.command_name;
|
|
314
|
+
if (typeof commandName !== "string" || commandName.length === 0) {
|
|
315
|
+
throw new ExtensionValidationError(
|
|
316
|
+
`runtime '${runtimeName}' missing command_name in ${manifestPath}`,
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
validateCommandName(runtimeName, commandName);
|
|
320
|
+
|
|
321
|
+
const skillFile = runtimeData.skill_file;
|
|
322
|
+
if (kind === "prompt-skill" && (typeof skillFile !== "string" || skillFile.length === 0)) {
|
|
323
|
+
throw new ExtensionValidationError(
|
|
324
|
+
`prompt-skill runtime '${runtimeName}' missing skill_file in ${manifestPath}`,
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
let skillPath: string | null = null;
|
|
328
|
+
if (typeof skillFile === "string" && skillFile.length > 0) {
|
|
329
|
+
skillPath = join(extensionDir, skillFile);
|
|
330
|
+
if (!existsSync(skillPath)) {
|
|
331
|
+
throw new ExtensionValidationError(
|
|
332
|
+
`runtime '${runtimeName}' skill_file not found: ${skillPath}`,
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
validatedRuntimes[runtimeName] = {
|
|
337
|
+
commandName,
|
|
338
|
+
skillFile: typeof skillFile === "string" && skillFile.length > 0 ? skillFile : null,
|
|
339
|
+
skillPath,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
validateContextProviders(data, extensionDir, manifestPath);
|
|
344
|
+
|
|
345
|
+
return {
|
|
346
|
+
id: skillId,
|
|
347
|
+
kind,
|
|
348
|
+
name: pyStr(data.name),
|
|
349
|
+
category: pyStr(data.category),
|
|
350
|
+
summary: pyStr(data.summary),
|
|
351
|
+
root: extensionDir,
|
|
352
|
+
manifestPath,
|
|
353
|
+
runtimes: validatedRuntimes,
|
|
354
|
+
entrypoint,
|
|
355
|
+
};
|
|
356
|
+
}
|