Moving an object forward relative to Vive Controller

I'm trying to implement a pool queue that I'd like to move along its forward (blue) axis according to movement from the Vive Controller. When the right controller is clicked, movement should be locked to the forward axis. Rotation is locked as well.

I'm using this code in a script on the GameObject that has the queue model as a child:

The code works well as long as both the queue and the left controller are parallel to the world's z-axis. As soon as the queue rotation changes, the directions get all messed up. I (think I) know that this is because the forward vector changes and I'm still using the z value of the left controller but I just don't get how this can be done dynamically.