@@ -157,7 +157,7 @@ async function setupVoiceCallArchiveInstall(params: { outName: string; version:
157157}
158158
159159function expectPluginFiles ( result : { targetDir : string } , stateDir : string , pluginId : string ) {
160- expect ( result . targetDir ) . toBe ( path . join ( stateDir , "extensions" , pluginId ) ) ;
160+ expect ( result . targetDir ) . toBe ( path . join ( stateDir , "extensions" , pluginId . replaceAll ( "/" , "__" ) ) ) ;
161161 expect ( fs . existsSync ( path . join ( result . targetDir , "package.json" ) ) ) . toBe ( true ) ;
162162 expect ( fs . existsSync ( path . join ( result . targetDir , "dist" , "index.js" ) ) ) . toBe ( true ) ;
163163}
@@ -394,7 +394,7 @@ beforeEach(() => {
394394} ) ;
395395
396396describe ( "installPluginFromArchive" , ( ) => {
397- it ( "installs into ~/.openclaw/extensions and uses unscoped id " , async ( ) => {
397+ it ( "installs into ~/.openclaw/extensions and preserves scoped package ids " , async ( ) => {
398398 const { stateDir, archivePath, extensionsDir } = await setupVoiceCallArchiveInstall ( {
399399 outName : "plugin.tgz" ,
400400 version : "0.0.1" ,
@@ -404,7 +404,7 @@ describe("installPluginFromArchive", () => {
404404 archivePath,
405405 extensionsDir,
406406 } ) ;
407- expectSuccessfulArchiveInstall ( { result, stateDir, pluginId : "voice-call" } ) ;
407+ expectSuccessfulArchiveInstall ( { result, stateDir, pluginId : "@openclaw/ voice-call" } ) ;
408408 } ) ;
409409
410410 it ( "rejects installing when plugin already exists" , async ( ) => {
@@ -443,7 +443,7 @@ describe("installPluginFromArchive", () => {
443443 archivePath,
444444 extensionsDir,
445445 } ) ;
446- expectSuccessfulArchiveInstall ( { result, stateDir, pluginId : "zipper" } ) ;
446+ expectSuccessfulArchiveInstall ( { result, stateDir, pluginId : "@openclaw/ zipper" } ) ;
447447 } ) ;
448448
449449 it ( "allows updates when mode is update" , async ( ) => {
@@ -615,16 +615,17 @@ describe("installPluginFromArchive", () => {
615615} ) ;
616616
617617describe ( "installPluginFromDir" , ( ) => {
618- function expectInstalledAsMemoryCognee (
618+ function expectInstalledWithPluginId (
619619 result : Awaited < ReturnType < typeof installPluginFromDir > > ,
620620 extensionsDir : string ,
621+ pluginId : string ,
621622 ) {
622623 expect ( result . ok ) . toBe ( true ) ;
623624 if ( ! result . ok ) {
624625 return ;
625626 }
626- expect ( result . pluginId ) . toBe ( "memory-cognee" ) ;
627- expect ( result . targetDir ) . toBe ( path . join ( extensionsDir , "memory-cognee" ) ) ;
627+ expect ( result . pluginId ) . toBe ( pluginId ) ;
628+ expect ( result . targetDir ) . toBe ( path . join ( extensionsDir , pluginId . replaceAll ( "/" , "__" ) ) ) ;
628629 }
629630
630631 it ( "uses --ignore-scripts for dependency install" , async ( ) => {
@@ -689,29 +690,40 @@ describe("installPluginFromDir", () => {
689690 logger : { info : ( msg : string ) => infoMessages . push ( msg ) , warn : ( ) => { } } ,
690691 } ) ;
691692
692- expectInstalledAsMemoryCognee ( res , extensionsDir ) ;
693+ expectInstalledWithPluginId ( res , extensionsDir , "memory-cognee" ) ;
693694 expect (
694695 infoMessages . some ( ( msg ) =>
695696 msg . includes (
696- 'Plugin manifest id "memory-cognee" differs from npm package name "cognee-openclaw"' ,
697+ 'Plugin manifest id "memory-cognee" differs from npm package name "@openclaw/ cognee-openclaw"' ,
697698 ) ,
698699 ) ,
699700 ) . toBe ( true ) ;
700701 } ) ;
701702
702- it ( "normalizes scoped manifest ids to unscoped install keys" , async ( ) => {
703+ it ( "preserves scoped manifest ids as install keys" , async ( ) => {
703704 const { pluginDir, extensionsDir } = setupManifestInstallFixture ( {
704705 manifestId : "@team/memory-cognee" ,
705706 } ) ;
706707
707708 const res = await installPluginFromDir ( {
708709 dirPath : pluginDir ,
709710 extensionsDir,
710- expectedPluginId : "memory-cognee" ,
711+ expectedPluginId : "@team/ memory-cognee" ,
711712 logger : { info : ( ) => { } , warn : ( ) => { } } ,
712713 } ) ;
713714
714- expectInstalledAsMemoryCognee ( res , extensionsDir ) ;
715+ expectInstalledWithPluginId ( res , extensionsDir , "@team/memory-cognee" ) ;
716+ } ) ;
717+
718+ it ( "preserves scoped package names when no plugin manifest id is present" , async ( ) => {
719+ const { pluginDir, extensionsDir } = setupInstallPluginFromDirFixture ( ) ;
720+
721+ const res = await installPluginFromDir ( {
722+ dirPath : pluginDir ,
723+ extensionsDir,
724+ } ) ;
725+
726+ expectInstalledWithPluginId ( res , extensionsDir , "@openclaw/test-plugin" ) ;
715727 } ) ;
716728} ) ;
717729
0 commit comments