@@ -255,7 +255,8 @@ function primeHookPackNpmFallback() {
255255 ...createHookPackInstallResult ( "/tmp/hooks/demo-hooks" ) ,
256256 npmResolution : {
257257 name : "@acme/demo-hooks" ,
258- spec : "@acme/demo-hooks@1.2.3" ,
258+ version : "1.2.3" ,
259+ resolvedSpec : "@acme/demo-hooks@1.2.3" ,
259260 integrity : "sha256-demo" ,
260261 } ,
261262 } ) ;
@@ -932,6 +933,36 @@ describe("plugins cli install", () => {
932933 expect ( writeConfigFile ) . toHaveBeenCalledWith ( enabledCfg ) ;
933934 } ) ;
934935
936+ it ( "stores npm resolution metadata without changing the active plugin install selector" , async ( ) => {
937+ const cfg = createEmptyPluginConfig ( ) ;
938+ const enabledCfg = createEnabledPluginConfig ( "demo" ) ;
939+ loadConfig . mockReturnValue ( cfg ) ;
940+ installPluginFromNpmSpec . mockResolvedValue ( {
941+ ok : true ,
942+ pluginId : "demo" ,
943+ targetDir : cliInstallPath ( "demo" ) ,
944+ version : "1.2.3" ,
945+ npmResolution : {
946+ name : "demo" ,
947+ version : "1.2.3" ,
948+ resolvedSpec : "demo@1.2.3" ,
949+ integrity : "sha512-demo" ,
950+ } ,
951+ } ) ;
952+ enablePluginInConfig . mockReturnValue ( { config : enabledCfg } ) ;
953+ applyExclusiveSlotSelection . mockReturnValue ( {
954+ config : enabledCfg ,
955+ warnings : [ ] ,
956+ } ) ;
957+
958+ await runPluginsCommand ( [ "plugins" , "install" , "demo" ] ) ;
959+
960+ const record = persistedInstallRecord ( "demo" ) ;
961+ expect ( record . spec ) . toBe ( "demo" ) ;
962+ expect ( record . resolvedSpec ) . toBe ( "demo@1.2.3" ) ;
963+ expect ( record . integrity ) . toBe ( "sha512-demo" ) ;
964+ } ) ;
965+
935966 it ( "passes bare npm selectors through npm without ClawHub lookup" , async ( ) => {
936967 const cfg = createEmptyPluginConfig ( ) ;
937968 const enabledCfg = createEnabledPluginConfig ( "demo" ) ;
@@ -1826,7 +1857,8 @@ describe("plugins cli install", () => {
18261857 version : "1.2.3" ,
18271858 npmResolution : {
18281859 name : "@acme/demo-hooks" ,
1829- spec : "@acme/demo-hooks@1.2.3" ,
1860+ version : "1.2.3" ,
1861+ resolvedSpec : "@acme/demo-hooks@1.2.3" ,
18301862 integrity : "sha256-demo" ,
18311863 } ,
18321864 } ) ;
@@ -1865,8 +1897,13 @@ describe("plugins cli install", () => {
18651897 await runPluginsCommand ( [ "plugins" , "install" , "@acme/demo-hooks" ] ) ;
18661898
18671899 expect ( hookNpmInstallCall ( ) . spec ) . toBe ( "@acme/demo-hooks" ) ;
1868- expect ( recordHookInstallCall ( ) . hookId ) . toBe ( "demo-hooks" ) ;
1869- expect ( recordHookInstallCall ( ) . hooks ) . toEqual ( [ "command-audit" ] ) ;
1900+ const record = recordHookInstallCall ( ) ;
1901+ expect ( record . hookId ) . toBe ( "demo-hooks" ) ;
1902+ expect ( record . spec ) . toBe ( "@acme/demo-hooks" ) ;
1903+ expect ( record . resolvedVersion ) . toBe ( "1.2.3" ) ;
1904+ expect ( record . resolvedSpec ) . toBe ( "@acme/demo-hooks@1.2.3" ) ;
1905+ expect ( record . integrity ) . toBe ( "sha256-demo" ) ;
1906+ expect ( record . hooks ) . toEqual ( [ "command-audit" ] ) ;
18701907 expect ( writeConfigFile ) . toHaveBeenCalledWith ( installedCfg ) ;
18711908 expect ( runtimeLogsContain ( "Installed hook pack: demo-hooks" ) ) . toBe ( true ) ;
18721909 } ) ;
0 commit comments