Repository: pwrdrvr/microapps-core (language: python)

Issue:
microapps-publish - Naming and convenience packages
## Motivations
- The project should be easy to find
- The name should be unique
- The commands should be memorable and short

## To-Do
- [ ] Publish `pwrdrvr` top-level package that includes `@pwrdrvr/microapps-publish` as a dependency
- [ ] Add command called `pwrdrvr` to `@pwrdrvr/microapps-publish` package
- [ ] Update docs to refer to `pwrdrvr` command instead of `microapps-publish`


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 7fd7e676..6be5f53d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -332,7 +332,7 @@ jobs:
 
       - name: Publish URL App to MicroApps
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name blog \
             --type url \
             --new-version ${PACKAGE_VERSION} \
@@ -342,7 +342,7 @@ jobs:
 
       - name: Publish Static App to Child MicroApps
         run: |
-          npx microapps-publish publish-static \
+          npx pwrdrvr publish-static \
             --app-name ${STATIC_APP_NAME} \
             --new-version 0.0.0 \
             --deployer-lambda-name ${DEPLOYER_LAMBDA_ARN} \
@@ -352,7 +352,7 @@ jobs:
 
       - name: Publish Demo App to MicroApps
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${DEMO_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
@@ -386,7 +386,7 @@ jobs:
 
       - name: Publish Demo App to MicroApps - To Delete
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${DEMO_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
@@ -400,14 +400,14 @@ jobs:
 
       - name: Delete Demo App - To Delete
         run: |
-          npx microapps-publish delete \
+          npx pwrdrvr delete \
             --app-name ${DEMO_APP_NAME} \
             --new-version 0.0.0-delete.1  \
             --deployer-lambda-name ${DEPLOYER_LAMBDA_NAME}
 
       - name: Publish Demo App to MicroApps - Root App
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name '[root]' \
             --type lambda-url \
             --startup-type direct \
@@ -441,7 +441,7 @@ jobs:
 
       - name: Publish Nextjs Demo App to MicroApps
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${NEXTJS_DEMO_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
@@ -473,7 +473,7 @@ jobs:
 
       - name: Publish Release App to MicroApps
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${RELEASE_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
@@ -566,7 +566,7 @@ jobs:
       - name: Publish Demo App to Child MicroApps - To Delete
         if: ${{ matrix.deployName == 'microapps-core' }}
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${DEMO_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
@@ -580,7 +580,7 @@ jobs:
       - name: Delete Demo App from Child MicroApps - To Delete
         if: ${{ matrix.deployName == 'microapps-core' }}
         run: |
-          npx microapps-publish delete \
+          npx pwrdrvr delete \
             --app-name ${DEMO_APP_NAME} \
             --new-version 0.0.0-childDelete.1  \
             --deployer-lambda-name ${CHILD_DEPLOYER_LAMBDA_ARN}
@@ -588,7 +588,7 @@ jobs:
       - name: Publish Demo App to Child MicroApps
         if: ${{ matrix.deployName == 'microapps-core' }}
         run: |
-          npx microapps-publish publish \
+          npx pwrdrvr publish \
             --app-name ${DEMO_APP_NAME} \
             --type lambda-url \
             --startup-type direct \
diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml
index d93692d9..483ce18e 100644
--- a/.github/workflows/main-build.yml
+++ b/.github/workflows/main-build.yml
@@ -24,7 +24,7 @@ jobs:
     outputs:
       self_mutation_happened: ${{ steps.self_mutation.outputs.self_mutation_happened }}
     env:
-      CI: "true"
+      CI: 'true'
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -47,7 +47,7 @@ jobs:
         if: steps.cache-node-modules.outputs.cache-hit != 'true'
         run: yarn install --frozen-lockfile
       - name: Build All TypeScript
-        run: yarn build 
+        run: yarn build
       - name: Run Node Tests
         env:
           NODE_ENV: test
@@ -142,13 +142,20 @@ jobs:
         if: steps.cache-node-modules.outputs.cache-hit != 'true'
         run: yarn install --frozen-lockfile
       - name: Build Publish TypeScript
-        run: yarn build:publish 
+        run: yarn build:publish
       - name: Run Lint
         run: yarn lint
       - name: Upload Publish Tool artifact
         uses: actions/upload-artifact@v3
         with:
           name: publish-tool-dist
+          path: |
+            packages/pwrdrvr/
+            !packages/pwrdrvr/node_modules/
+      - name: Upload Publish Tool - Convenience artifact
+        uses: actions/upload-artifact@v3
+        with:
+          name: publish-tool-dist-convenience
           path: |
             packages/microapps-publish/
             !packages/microapps-publish/node_modules/
@@ -170,15 +177,20 @@ jobs:
   # Release Assets - Dry Run Only
   #
   package-js-publish-tool:
-    needs: [ build, build-publish-tool ]
+    needs: [build, build-publish-tool]
     runs-on: ubuntu-latest
     permissions: {}
-    if: "! needs.build.outputs.self_mutation_happened"
+    if: '! needs.build.outputs.self_mutation_happened'
     steps:
       - uses: actions/setup-node@v3
         with:
           node-version: 16
       - name: Download Publish Tool build artifacts
+        uses: actions/download-artifact@v3
+        with:
+          name: publish-tool-dist
+          path: packages/pwrdrvr
+      - name: Download Publish Tool - Convenience build artifacts
         uses: actions/download-artifact@v3
         with:
           name: publish-tool-dist
@@ -196,6 +208,10 @@ jobs:
       - name: NPM registry authentication
         run: npm set //registry.npmjs.org/:_authToken ${{ secrets.NPMJSORG_PUBLISH_TOKEN }}
       - name: Release Publish Tool - NPM - Dry Run
+        working-directory: packages/pwrdrvr
+        run: |
+          npm publish --dry-run
+      - name: Release Publish Tool Convenience - NPM - Dry Run
         working-directory: packages/microapps-publish
         run: |
           npm publish --dry-run
@@ -209,10 +225,10 @@ jobs:
           npm publish --dry-run
 
   package-js:
-    needs: [ build ]
+    needs: [build]
     runs-on: ubuntu-latest
     permissions: {}
-    if: "! needs.build.outputs.self_mutation_happened"
+    if: '! needs.build.outputs.self_mutation_happened'
     steps:
       - uses: actions/setup-node@v3
         with:
@@ -234,7 +250,7 @@ jobs:
     needs: build
     runs-on: ubuntu-latest
     permissions: {}
-    if: "! needs.build.outputs.self_mutation_happened"
+    if: '! needs.build.outputs.self_mutation_happened'
     steps:
       - uses: actions/setup-java@v2
         with:
@@ -260,7 +276,7 @@ jobs:
     needs: build
     runs-on: ubuntu-latest
     permissions: {}
-    if: "! needs.build.outputs.self_mutation_happened"
+    if: '! needs.build.outputs.self_mutation_happened'
     steps:
       - uses: actions/setup-node@v3
         with:
@@ -285,7 +301,7 @@ jobs:
     needs: build
     runs-on: ubuntu-latest
     permissions: {}
-    if: "! needs.build.outputs.self_mutation_happened"
+    if: '! needs.build.outputs.self_mutation_happened'
     steps:
       - uses: actions/setup-node@v3
         with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8a277735..5a8aa392 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -19,7 +19,7 @@ jobs:
     outputs:
       latest_commit: ${{ steps.git_remote.outputs.latest_commit }}
     env:
-      CI: "true"
+      CI: 'true'
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -45,7 +45,7 @@ jobs:
         if: steps.cache-node-modules.outputs.cache-hit != 'true'
         run: yarn install --frozen-lockfile
       - name: Build All TypeScript
-        run: yarn build 
+        run: yarn build
       - name: Run Node Tests
         env:
           NODE_ENV: test
@@ -137,13 +137,20 @@ jobs:
           cat dist/version.txt
           npm version v$(cat dist/version.txt) --no-git-tag-version --workspaces
       - name: Build Publish TypeScript
-        run: yarn build:publish 
+        run: yarn build:publish
       - name: Run Lint
         run: yarn lint
       - name: Upload Publish Tool artifact
         uses: actions/upload-artifact@v3
         with:
           name: publish-tool-dist
+          path: |
+            packages/pwrdrvr/
+            !packages/pwrdrvr/node_modules/
+      - name: Upload Publish Tool - Convenience artifact
+        uses: actions/upload-artifact@v3
+        with:
+          name: publish-tool-dist-convenience
           path: |
             packages/microapps-publish/
             !packages/microapps-publish/node_modules/
@@ -193,7 +200,7 @@ jobs:
           NPM_TOKEN: ${{ secrets.NPMJSORG_PUBLISH_TOKEN }} # publib requires NPM_TOKEN as an env var
   release_npm_publish_tool:
     name: Publish to npm - Publish Tool
-    needs: [ release, release_npm, release-publish-tool ]
+    needs: [release, release_npm, release-publish-tool]
     runs-on: ubuntu-latest
     permissions:
       contents: read
@@ -206,6 +213,11 @@ jobs:
         uses: actions/download-artifact@v3
         with:
           name: publish-tool-dist
+          path: packages/pwrdrvr
+      - name: Download Publish Tool - Convenience build artifacts
+        uses: actions/download-artifact@v3
+        with:
+          name: publish-tool-dist-convenience
           path: packages/microapps-publish
       - name: Download Datalib build artifacts
         uses: actions/download-artifact@v3
@@ -223,6 +235,10 @@ jobs:
       - name: NPM registry authentication
         run: npm set //registry.npmjs.org/:_authToken ${{ secrets.NPMJSORG_PUBLISH_TOKEN }}
       - name: Release Publish Tool - NPM
+        working-directory: packages/pwrdrvr/
+        run: |
+          npm publish
+      - name: Release Publish Tool - Convenience - NPM
         working-directory: packages/microapps-publish/
         run: |
           npm publish
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f946a77f..5c05f07f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,7 +12,7 @@ Instructions, tools, and tips for those wishing to contribute.
 - [Bootstrapping Projen Templates](#bootstrapping-projen-templates)
 - [Releasing NPM Packages](#releasing-npm-packages)
   - [Get the Version that Projen Tagged](#get-the-version-that-projen-tagged)
-  - [Apply Version to microapps-publish Package.json](#apply-version-to-microapps-publish-packagejson)
+  - [Apply Version to `pwrdrvr` Package.json](#apply-version-to-pwrdrvr-packagejson)
 - [Cleaning Git History](#cleaning-git-history)
   - [Example `filter.txt`](#example-filtertxt)
 
@@ -58,9 +58,9 @@ npx projen new awscdk-construct --no-git --name @pwrdrvr/microapps-cdk --author
 
 # Releasing NPM Packages
 
-Challenge: `projen` does not support monorepos well, so it can build, tag, version, and release the CDK Construct library in `packages/microapps-cdk` but it cannot be invoked to release `packages/microapps-publish` and, because it doesn't support monorepos well, it cannot build and publish both in one invocation.
+Challenge: `projen` does not support monorepos well, so it can build, tag, version, and release the CDK Construct library in `packages/microapps-cdk` but it cannot be invoked to release `packages/pwrdrvr` and, because it doesn't support monorepos well, it cannot build and publish both in one invocation.
 
-Below are tips, tricks, and commands used to build and release `microapps-publish` to NPM after `microapps-cdk` is done being published by `projen`.
+Below are tips, tricks, and commands used to build and release `pwrdrvr` to NPM after `microapps-cdk` is done being published by `projen`.
 
 ## Get the Version that Projen Tagged
 
@@ -72,7 +72,7 @@ Note: this _has_ to be done with `npm 7.18.1` in `node 16` as a fix from April,
 
 Example output: `v0.9.3`
 
-## Apply Version to microapps-publish Package.json
+## Apply Version to `pwrdrvr` Package.json
 
 Note: this can accept the `v`-prefixed version (e.g. `v0.9.3`) retrieved from `npm version from-git --allow-same-version --no-git-tag-version`
 
diff --git a/deploy.sh b/deploy.sh
index 4e07a79c..657f897e 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -22,7 +22,7 @@ RELEASE_APP_LAMBDA_NAME=$(aws cloudformation list-exports --query "Exports[?Name
 EDGE_DOMAIN=$(aws cloudformation list-exports --query "Exports[?Name==\`microapps-demo-deploy-${NODE_ENV}-edge-domain-name\`].Value"  --output text)
 
 # Deploy the Release App
-npx microapps-publish publish --app-name release --new-version ${RELEASE_APP_PACKAGE_VERSION} --deployer-lambda-name ${DEPLOYER_LAMBDA_NAME} --app-lambda-name ${RELEASE_APP_LAMBDA_NAME} --static-assets-path node_modules/@pwrdrvr/microapps-app-release-cdk/lib/static_files/release/${RELEASE_APP_PACKAGE_VERSION}/ --overwrite --no-cache
+npx pwrdrvr publish --app-name release --new-version ${RELEASE_APP_PACKAGE_VERSION} --deployer-lambda-name ${DEPLOYER_LAMBDA_NAME} --app-lambda-name ${RELEASE_APP_LAMBDA_NAME} --static-assets-path node_modules/@pwrdrvr/microapps-app-release-cdk/lib/static_files/release/${RELEASE_APP_PACKAGE_VERSION}/ --overwrite --no-cache
 
 # Print App URL
 echo "App Available at URL: https://${EDGE_DOMAIN}/release/"
diff --git a/package.json b/package.json
index 145a8f97..22096f46 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,7 @@
     "prettier": "2.8.4",
     "projen": "0.56.19",
     "replace-in-file": "6.3.5",
-    "rimraf": "4.3.0",
+    "rimraf": "5.0.1",
     "start-server-and-test": "^1.14.0",
     "ts-jest": "29.0.5",
     "ts-node": "10.9.1",
diff --git a/packages/microapps-cdk/README.md b/packages/microapps-cdk/README.md
index 1de50ac2..7f430cdd 100644
--- a/packages/microapps-cdk/README.md
+++ b/packages/microapps-cdk/README.md
@@ -86,7 +86,7 @@ Note: requests can also be dispatched into the same account, but this model is m
   - Deploys the CDK Stack
   - Essentially runs two commands along with extraction of outputs:
     - `npx cdk deploy --context @pwrdrvr/microapps:deployReleaseApp=true microapps-basic`
-    - `npx microapps-publish publish --app-name release --new-version ${RELEASE_APP_PACKAGE_VERSION} --deployer-lambda-name ${DEPLOYER_LAMBDA_NAME} --app-lambda-name ${RELEASE_APP_LAMBDA_NAME} --static-assets-path node_modules/@pwrdrvr/microapps-app-release-cdk/lib/static_files/release/${RELEASE_APP_PACKAGE_VERSION}/ --overwrite --no-cache`
+    - `npx pwrdrvr publish --app-name release --new-version ${RELEASE_APP_PACKAGE_VERSION} --deployer-lambda-name ${DEPLOYER_LAMBDA_NAME} --app-lambda-name ${RELEASE_APP_LAMBDA_NAME} --static-assets-path node_modules/@pwrdrvr/microapps-app-release-cdk/lib/static_files/release/${RELEASE_APP_PACKAGE_VERSION}/ --overwrite --no-cache`
   - URL will be printed as last output
 
 # Limitations / Future Development
@@ -95,14 +95,6 @@ Note: requests can also be dispatched into the same account, but this model is m
   - For the time being this has only been implemented for AWS technologies and APIs
   - It is possible that Azure and GCP have sufficient support to enable porting the framework
   - CDK would have to be replaced as well (unless it's made available for Azure and GCP in the near future)
-- `microapps-publish` only supports Lambda function apps
-  - There is no technical reason for the apps to only run as Lambda functions
-  - Web apps could just as easily run on EC2, Kubernetes, EKS, ECS, etc
-  - Anything that API Gateway can route to can work for serving a MicroApp
-  - The publish tool needs to provide additional options for setting up the API Gateway route to the app
-- Authentication
-  - Authentication requires rolling your own API Gateway and CloudFront deployment at the moment
-  - The "turn key" CDK Construct should provide options to show an example of how authentication can be integrated
 - Release Rules
   - Currently only a Default rule is supported
   - Need to evaluate if a generic implementation can be made, possibly allowing plugins or webhooks to support arbitrary rules
@@ -181,13 +173,13 @@ With Lambda@Edge (even with Origin Requests) the cost is 3x higher per GB-second
 - [packages/microapps-datalib](https://github.com/pwrdrvr/microapps-core/tree/main/packages/microapps-datalib)
   - Installed from `npm`:
     - `npm i -g @pwrdrvr/microapps-datalib`
-  - APIs for access to the DynamoDB Table used by `microapps-publish`, `microapps-deployer`, and `@pwrdrvr/microapps-app-release-cdk`
+  - APIs for access to the DynamoDB Table used by the `pwrdrvr` CLI, `microapps-deployer`, and `@pwrdrvr/microapps-app-release-cdk`
 - [packages/microapps-deployer](https://github.com/pwrdrvr/microapps-core/tree/main/packages/microapps-deployer)
-  - Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.
+  - Lambda service invoked by the `pwrdrvr` CLI to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.
   - Returns a temporary S3 token with restricted access to the staging S3 bucket for upload of the static files for one app/semver
-- [packages/microapps-publish](https://github.com/pwrdrvr/microapps-core/tree/main/packages/microapps-publish)
+- [packages/pwrdrvr](https://github.com/pwrdrvr/microapps-core/tree/main/packages/pwrdrvr)
   - Installed from `npm`:
-    - `npm i -g @pwrdrvr/microapps-publish`
+    - `npm i -g pwrdrvr`
   - Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`
   - AWS IAM permissions required:
     - `lambda:InvokeFunction`
@@ -200,20 +192,20 @@ With Lambda@Edge (even with Origin Requests) the cost is 3x higher per GB-second
 
 # Creating a MicroApp Using Docker Lambda Functions
 
-Note: semi-deprecated as of 2022-01-27. Zip Lambda functions are better supported.
+Docker Lambdas are great for large applications.  These used to be slower to cold start but as of early 2023 that appears to no longer be an issue.
 
 ## Next.js Apps
 
-Create a Next.js app then follow the steps in this section to set it up for publishing to AWS Lambda @ Origin as a MicroApp. To publish new versions of the app use `npx microapps-publish --new-version x.y.z` when logged in to the target AWS account.
+Create a Next.js app then follow the steps in this section to set it up for publishing to AWS Lambda @ Origin as a MicroApp. To publish new versions of the app use `npx pwrdrvr --new-version x.y.z` when logged in to the target AWS account.
 
 ### Modify package.json
 
-Replace the version with `0.0.0` so it can be modified by the `microapps-publish` tool.
+Replace the version with `0.0.0` so it can be modified by the `pwrdrvr` CLI.
 
 ### Install Dependencies
 
 ```
-npm i --save-dev @pwrdrvr/microapps-publish
+npm i --save-dev pwrdrvr
 ```
 
 ### Dockerfile
diff --git a/packages/microapps-cdk/src/MicroAppsSvcs.ts b/packages/microapps-cdk/src/MicroAppsSvcs.ts
index d894658a..5ae1f8a7 100644
--- a/packages/microapps-cdk/src/MicroAppsSvcs.ts
+++ b/packages/microapps-cdk/src/MicroAppsSvcs.ts
@@ -365,7 +365,7 @@ export class MicroAppsSvcs extends Construct implements IMicroAppsSvcs {
     //
     // Deployer upload temp role
     // Deployer assumes this role with a limited policy to generate
-    // an STS temp token to return to microapps-publish for the upload.
+    // an STS temp token to return to the `pwrdrvr` CLI for the upload.
     //
     const iamRoleUpload = new iam.Role(this, 'deployer-upload-role', {
       roleName: iamRoleUploadName,
diff --git a/packages/microapps-deployer/src/controllers/version/LambdaAlias.spec.ts b/packages/microapps-deployer/src/controllers/version/LambdaAlias.spec.ts
index d70eccfe..31b3df7e 100644
--- a/packages/microapps-deployer/src/controllers/version/LambdaAlias.spec.ts
+++ b/packages/microapps-deployer/src/controllers/version/LambdaAlias.spec.ts
@@ -206,21 +206,8 @@ describe('LambdaAlias', () => {
           FunctionName: fakeLambdaARNBase,
           Qualifier: fakeLambdaAlias,
         })
-        .resolves({
-          Policy: JSON.stringify({
-            Version: '2012-10-17',
-            Statement: [
-              // {
-              //   Action: 'lambda:InvokeFunctionUrl',
-              //   Principal: roleToAdd,
-              // StatementId: `microapps-edge-to-origin-${roleArnHash}`,
-              // FunctionName: lambdaBaseARN,
-              // Qualifier: lambdaAlias,
-              //   Condition: {
-              //     ArnLike: {
-              //       'AWS:SourceArn': 'arn:aws:execute-api:us-east-1:123456789012:123/*',
-            ],
-          }),
+        .rejects({
+          name: 'ResourceNotFoundException',
         })
         .on(lambda.AddPermissionCommand, {
           // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -233,6 +220,7 @@ describe('LambdaAlias', () => {
           Action: 'lambda:InvokeFunctionUrl',
           FunctionName: fakeLambdaARNBase,
           Qualifier: fakeLambdaAlias,
+          FunctionUrlAuthType: 'AWS_IAM',
         })
         .resolves({
           $metadata: {
@@ -248,6 +236,7 @@ describe('LambdaAlias', () => {
           Action: 'lambda:InvokeFunctionUrl',
           FunctionName: fakeLambdaARNBase,
           Qualifier: fakeLambdaAlias,
+          FunctionUrlAuthType: 'AWS_IAM',
         })
         .resolves({
           $metadata: {
@@ -493,21 +482,8 @@ describe('LambdaAlias', () => {
           FunctionName: fakeLambdaARNBase,
           Qualifier: fakeLambdaAlias,
         })
-        .resolves({
-          Policy: JSON.stringify({
-            Version: '2012-10-17',
-            Statement: [
-              // {
-              //   Action: 'lambda:InvokeFunctionUrl',
-              //   Principal: roleToAdd,
-              // StatementId: `microapps-edge-to-origin-${roleArnHash}`,
-              // FunctionName: lambdaBaseARN,
-              // Qualifier: lambdaAlias,
-              //   Condition: {
-              //     ArnLike: {
-              //       'AWS:SourceArn': 'arn:aws:execute-api:us-east-1:123456789012:123/*',
-            ],
-          }),
+        .rejects({
+          name: 'ResourceNotFoundException',
         })
         .on(lambda.AddPermissionCommand, {
           // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -520,6 +496,7 @@ describe('LambdaAlias', () => {
           Action: 'lambda:InvokeFunctionUrl',
           FunctionName: fakeLambdaARNBase,
           Qualifier: fakeLambdaAlias,
+          FunctionUrlAuthType: 'AWS_IAM',
         })
         .resolves({
           $metadata: {
diff --git a/packages/microapps-deployer/src/controllers/version/LambdaAlias.ts b/packages/microapps-deployer/src/controllers/version/LambdaAlias.ts
index e32adfdb..37ca3e6e 100644
--- a/packages/microapps-deployer/src/controllers/version/LambdaAlias.ts
+++ b/packages/microapps-deployer/src/controllers/version/LambdaAlias.ts
@@ -39,7 +39,7 @@ export async function LambdaAlias(opts: {
 
   if (parsedLambdaARN.lambdaARNType === 'function') {
     Log.Instance.warn(
-      'Lambda ARN is a function, not a version - It is safer to publish a version using IaC and to pass that version to `microapps-publish publish`',
+      'Lambda ARN is a function, not a version - It is safer to publish a version using IaC and to pass that version to `pwrdrvr publish`',
       {
         lambdaARN,
       },
@@ -380,6 +380,11 @@ async function AddCrossAccountPermissionsToAlias({
     return;
   }
 
+  Log.Instance.info('Adding cross-account permissions to lambda alias', {
+    lambdaBaseARN,
+    lambdaAlias,
+  });
+
   // Call the parent Deployer to get the additional list of Role ARNs that are allowed
   const originRequestRoleARNs: string[] =
     config.edgeToOriginRoleARN && config.edgeToOriginRoleARN.length > 0
@@ -412,6 +417,8 @@ async function AddCrossAccountPermissionsToAlias({
           originRequestRoleARNs.push(...filteredRoles);
         }
       }
+    } else {
+      Log.Instance.info('Get config failed, adding only locally configurd role');
     }
   } else {
     throw new Error(
@@ -424,6 +431,18 @@ async function AddCrossAccountPermissionsToAlias({
   // 3. Create statement ids with a hash of the role ARNs
   // 4. Add the role ARNs that were missing
 
+  interface IPolicyDocument {
+    Version: string;
+    Id: string;
+    Statement: {
+      Sid: string;
+      Principal: { AWS: string };
+    }[];
+  }
+
+  let policyDoc: IPolicyDocument | undefined = undefined;
+
+  // Getting the policy will throw if it does not exist
   try {
     const existingPolicy = await lambdaClient.send(
       new lambda.GetPolicyCommand({
@@ -432,44 +451,49 @@ async function AddCrossAccountPermissionsToAlias({
       }),
     );
     if (existingPolicy.Policy) {
-      interface IPolicyDocument {
-        Version: string;
-        Id: string;
-        Statement: { Sid: string; Principal: { AWS: string } }[];
-      }
-      const policyDoc = JSON.parse(existingPolicy.Policy) as IPolicyDocument;
-
-      if (policyDoc.Statement) {
-        // Loop through statements to check which role ARNs are already allowed
-        const existingRoleArns = policyDoc.Statement.filter((value) =>
-          (value.Sid ?? '').startsWith('microapps-edge-to-origin'),
-        ).map((value) => value.Principal.AWS);
-
-        // Determine which ARNs need to be added
-        const rolesToAdd = originRequestRoleARNs.filter(
-          (roleArn) => !existingRoleArns.includes(roleArn),
-        );
-
-        for (const roleToAdd of rolesToAdd) {
-          // Create statement ids with a hash of the role ARNs
-          const roleArnHash = createHash('sha256').update(roleToAdd).digest('hex').substring(0, 8);
-
-          // Add the role ARNs that were missing
-          await lambdaClient.send(
-            new lambda.AddPermissionCommand({
-              Principal: roleToAdd,
-              StatementId: `microapps-edge-to-origin-${roleArnHash}`,
-              Action: 'lambda:InvokeFunctionUrl',
-              FunctionName: lambdaBaseARN,
-              Qualifier: lambdaAlias,
-            }),
-          );
-        }
-      }
+      policyDoc = JSON.parse(existingPolicy.Policy) as IPolicyDocument;
     }
   } catch (error: any) {
     if (error.name !== 'ResourceNotFoundException') {
       throw error;
     }
+
+    // Policy does not exist, create it by falling through
+  }
+
+  // If policyDoc is still undefined after trying to retrieve it, we assume there's no existing policy.
+  if (!policyDoc) {
+    policyDoc = {
+      Version: '2012-10-17',
+      Id: `${lambdaBaseARN}/default`,
+      Statement: [],
+    };
+  }
+
+  // Now proceed with the role ARN processing.
+  const existingRoleArns = policyDoc.Statement.filter((value) =>
+    value.Sid.startsWith('microapps-edge-to-origin'),
+  ).map((value) => value.Principal.AWS);
+
+  // Determine which ARNs need to be added
+  const rolesToAdd = originRequestRoleARNs.filter((roleArn) => !existingRoleArns.includes(roleArn));
+
+  for (const roleToAdd of rolesToAdd) {
+    // Create statement ids with a hash of the role ARNs
+    const roleArnHash = createHash('sha256').update(roleToAdd).digest('hex').substring(0, 8);
+
+    // Add the role ARNs that were missing
+    await lambdaClient.send(
+      new lambda.AddPermissionCommand({
+        Principal: roleToAdd,
+        StatementId: `microapps-edge-to-origin-${roleArnHash}`,
+        Action: 'lambda:InvokeFunctionUrl',
+        FunctionName: lambdaBaseARN,
+        Qualifier: lambdaAlias,
+        // Require that the Function URL used IAM auth
+        // This prevents accidentally opening the function up to the world
+        FunctionUrlAuthType: 'AWS_IAM',
+      }),
+    );
   }
 }
diff --git a/packages/microapps-publish/README.md b/packages/microapps-publish/README.md
deleted file mode 100644
index 717e3f76..00000000
--- a/packages/microapps-publish/README.md
+++ /dev/null
@@ -1,241 +0,0 @@
-# Overview
-
-`microapps-publish` is used to deploy new MicroApps and new versions for existing MicroApps using the [MicroApps framework](https://github.com/pwrdrvr/microapps-core/).
-
-# Table of Contents <!-- omit in toc -->
-
-- [Overview](#overview)
-- [Video Preview of Deploying an App](#video-preview-of-deploying-an-app)
-- [Installation](#installation)
-- [Usage](#usage)
-  - [Command - help](#command---help)
-  - [Command - preflight](#command---preflight)
-  - [Command - publish](#command---publish)
-  - [Command - publish-static](#command---publish-static)
-  - [Command - nextjs-version](#command---nextjs-version)
-  - [Command - nextjs-version-restore](#command---nextjs-version-restore)
-  - [Command - delete](#command---delete)
-
-# Video Preview of Deploying an App
-
-![Video Preview of Deploying an App](https://raw.githubusercontent.com/pwrdrvr/microapps-core/main/assets/videos/microapps-publish-demo-deploy.gif)
-
-# Installation
-
-`npm i -g @pwrdrvr/microapps-publish`
-
-# Usage
-
-## Command - help
-
-`npx microapps-publish help`
-
-```
-Publish tool for deploying apps and updates
-
-VERSION
-  @pwrdrvr/microapps-publish/0.0.0 darwin-arm64 node-v18.12.1
-
-USAGE
-  $ microapps-publish [COMMAND]
-
-COMMANDS
-  delete                  Delete app/version
-  help                    display help for microapps-publish
-  nextjs-version          Apply version to next.config.js overtop of 0.0.0 placeholder
-  nextjs-version-restore  Restore next.config.js
-  preflight               Check if app/version are available
-  publish                 Publish arbitrary framework app - deploy static assets to S3, alias the $LATEST Lambda
-                          function, and add integration/route to API Gateway.
-  publish-static          Publish arbitrary framework static app - deploy static assets to S3 only.
-```
-
-## Command - preflight
-
-`npx microapps-publish preflight help`
-
-```
-Check if app/version are available
-
-USAGE
-  $ microapps-publish preflight
-
-OPTIONS
-  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
-  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
-  -n, --new-version=new-version                    New semantic version to apply
-
-  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
-                                                   Discouraged outside of test envs if cacheable static files have
-                                                   changed.
-
-  -v, --version                                    show CLI version
-
-  --help                                           show CLI help
-
-EXAMPLE
-  $ microapps-publish preflight -d microapps-deployer-dev -a release -n 0.0.13
-  ✔ Preflight Version Check [0.2s]
-```
-
-## Command - publish
-
-`npx microapps-publish publish help`
-
-```
-Publish arbitrary framework app - deploy static assets to S3, alias the $LATEST Lambda function, and add integration/route to API Gateway.
-
-USAGE
-  $ microapps-publish publish
-
-OPTIONS
-  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
-  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
-
-  -i, --default-file=default-file                  Default file to return when the app is loaded via the router
-                                                   without a version (e.g. when app/ is requested).
-
-  -l, --app-lambda-name=app-lambda-name            ARN of lambda version, alias, or function (name or ARN) to deploy
-
-  -n, --new-version=new-version                    New semantic version to apply
-
-  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
-                                                   Discouraged outside of test envs if cacheable static files have
-                                                   changed.
-
-  -s, --static-assets-path=static-assets-path      Path to files to be uploaded to S3 static bucket at app/version/
-                                                   path.  Do include app/version/ in path if files are already
-                                                   "rooted" under that path locally.
-
-  -t, --type=(apigwy|lambda-url|url|static)        [default: lambda-url] Type of the application and how its
-                                                   requests are routed
-
-  -u, --url=url                                    URL for `url` type applications
-
-  -v, --version                                    show CLI version
-
-  --help                                           show CLI help
-
-  --no-cache                                       Force revalidation of CloudFront and browser caching of static
-                                                   assets
-
-  --startup-type=(iframe|direct)                   [default: iframe] How the app should be loaded
-
-EXAMPLE
-  $ microapps-publish publish -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
-  ✔ Get S3 Temp Credentials [1s]
-  ✔ Deploy to Lambda [0.6s]
-  ✔ Confirm Static Assets Folder Exists [0.0s]
-  ✔ Copy Static Files to Local Upload Dir [0.0s]
-  ✔ Enumerate Files to Upload to S3 [0.0s]
-  ✔ Upload Static Files to S3 [1s]
-  ✔ Creating MicroApp Application: release [0.0s]
-  ✔ Creating MicroApp Version: 0.0.21 [1s]
-```
-
-## Command - publish-static
-
-`npx microapps-publish publish-static help`
-
-```
-Publish arbitrary framework static app - deploy static assets to S3 only.
-
-USAGE
-  $ microapps-publish publish-static
-
-OPTIONS
-  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
-  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
-
-  -i, --default-file=default-file                  Default file to return when the app is loaded via the router
-                                                   without a version (e.g. when app/ is requested).
-
-  -n, --new-version=new-version                    New semantic version to apply
-
-  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
-                                                   Discouraged outside of test envs if cacheable static files have
-                                                   changed.
-
-  -s, --static-assets-path=static-assets-path      Path to files to be uploaded to S3 static bucket at app/version/
-                                                   path.  Do include app/version/ in path if files are already
-                                                   "rooted" under that path locally.
-
-  -v, --version                                    show CLI version
-
-  --help                                           show CLI help
-
-  --no-cache                                       Force revalidation of CloudFront and browser caching of static
-                                                   assets
-
-EXAMPLE
-  $ microapps-publish publish-static -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
-  ✔ Get S3 Temp Credentials [1s]
-  ✔ Confirm Static Assets Folder Exists [0.0s]
-  ✔ Copy Static Files to Local Upload Dir [0.0s]
-  ✔ Enumerate Files to Upload to S3 [0.0s]
-  ✔ Upload Static Files to S3 [1s]
-  ✔ Creating MicroApp Application: release [0.0s]
-  ✔ Creating MicroApp Version: 0.0.21 [1s]
-```
-
-## Command - nextjs-version
-
-`npx microapps-publish nextjs-version help`
-
-```
-Apply version to next.config.js overtop of 0.0.0 placeholder
-
-USAGE
-  $ microapps-publish nextjs-version
-
-OPTIONS
-  -l, --leave-copy               Leave a copy of the modifed files as .modified
-  -n, --new-version=new-version  New semantic version to apply
-  -v, --version                  show CLI version
-  --help                         show CLI help
-
-EXAMPLE
-  $ microapps-publish nextjs-version -n 0.0.13
-  ✔ Modifying Config Files [0.0s]
-```
-
-## Command - nextjs-version-restore
-
-`npx microapps-publish nextjs-version-restore help`
-
-```
-Restore next.config.js
-
-USAGE
-  $ microapps-publish nextjs-version-restore
-
-OPTIONS
-  -v, --version  show CLI version
-  --help         show CLI help
-
-EXAMPLE
-  $ microapps-publish nextjs-version-restore
-  ✔ Restoring Modified Config Files [0.0s]
-```
-
-## Command - delete
-
-`npx microapps-publish delete help`
-
-```
-Delete app/version
-
-USAGE
-  $ microapps-publish delete
-
-OPTIONS
-  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
-  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
-  -n, --new-version=new-version                    New semantic version to apply
-  -v, --version                                    show CLI version
-  --help                                           show CLI help
-
-EXAMPLE
-  $ microapps-publish delete -d microapps-deployer-dev -a release -n 0.0.13
-  ✔ App/Version deleted: release/0.0.13 [1.2s]
-```
diff --git a/packages/microapps-publish/README.md b/packages/microapps-publish/README.md
new file mode 120000
index 00000000..7d633cb3
--- /dev/null
+++ b/packages/microapps-publish/README.md
@@ -0,0 +1,1 @@
+../pwrdrvr/README.md
\ No newline at end of file
diff --git a/packages/microapps-publish/package.json b/packages/microapps-publish/package.json
index 227a0e51..2a267b5d 100644
--- a/packages/microapps-publish/package.json
+++ b/packages/microapps-publish/package.json
@@ -1,15 +1,10 @@
 {
   "name": "@pwrdrvr/microapps-publish",
   "version": "0.0.0",
-  "description": "Publish tool for deploying apps and updates",
-  "main": "dist/index.js",
-  "source": "src/index.ts",
+  "description": "Convenience package: renamed to `pwrdrvr`",
   "publishConfig": {
     "access": "public"
   },
-  "bin": {
-    "microapps-publish": "./bin/run"
-  },
   "engineStrict": true,
   "engine": {
     "node": ">= 12.0.0"
@@ -18,8 +13,6 @@
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "files": [
-    "dist",
-    "src",
     "package.json",
     "LICENSE",
     "README.md"
@@ -34,49 +27,9 @@
     "url": "https://github.com/pwrdrvr/microapps-core/issues"
   },
   "homepage": "https://github.com/pwrdrvr/microapps-core#readme",
-  "dependencies": {
-    "@aws-sdk/client-lambda": "^3.78.0",
-    "@aws-sdk/client-s3": "^3.78.0",
-    "@aws-sdk/client-sts": "^3.78.0",
-    "@aws-sdk/lib-storage": "^3.78.0",
-    "@oclif/command": "^1.8.4",
-    "@oclif/config": "^1.17.1",
-    "@oclif/core": "^1.0.4",
-    "@oclif/errors": "^1.3.5",
-    "@oclif/plugin-help": "^3.2.7",
-    "chalk": "^4.1.2",
-    "convict": "^6.1.0",
-    "convict-format-with-validator": "^6.0.1",
-    "fs-extra": "^9.1.0",
-    "js-yaml": "^4.1.0",
-    "listr2": "^3.13.5",
-    "mime-types": "^2.1.30",
-    "p-map": "^4.0.0",
-    "reflect-metadata": "^0.1.13",
-    "source-map-support": "0.5.21",
-    "ts-convict": "^1.1.0",
-    "tslib": "^2.1.0"
-  },
-  "peerDependencies": {
-    "@aws-sdk/client-lambda": "^3.78.0",
-    "@aws-sdk/client-s3": "^3.78.0",
-    "@aws-sdk/client-sts": "^3.78.0",
-    "@aws-sdk/lib-storage": "^3.78.0"
-  },
+  "dependencies": {},
+  "peerDependencies": {},
   "devDependencies": {
-    "@types/convict": "^6.0.2",
-    "@types/convict-format-with-validator": "^6.0.2",
-    "@types/fs-extra": "^9.0.11",
-    "@types/js-yaml": "^4.0.1",
-    "@types/mime-types": "^2.1.0",
-    "@types/source-map-support": "0.5.6",
-    "type-fest": "^0.20.2"
-  },
-  "oclif": {
-    "commands": "./dist/commands/",
-    "bin": "microapps-publish",
-    "plugins": [
-      "@oclif/plugin-help"
-    ]
+    "pwrdrvr": "*"
   }
 }
diff --git a/packages/microapps-publish/.npmignore b/packages/pwrdrvr/.npmignore
similarity index 100%
rename from packages/microapps-publish/.npmignore
rename to packages/pwrdrvr/.npmignore
diff --git a/packages/microapps-publish/CONTRIBUTING.md b/packages/pwrdrvr/CONTRIBUTING.md
similarity index 75%
rename from packages/microapps-publish/CONTRIBUTING.md
rename to packages/pwrdrvr/CONTRIBUTING.md
index 0d1c03ea..f3ccd80c 100644
--- a/packages/microapps-publish/CONTRIBUTING.md
+++ b/packages/pwrdrvr/CONTRIBUTING.md
@@ -8,10 +8,10 @@ This document contains instructions, tips, and example commands for those contri
   - `npm run build`
   - `npm link`
 - In the consuming app directory
-  - `npm link --save-dev @pwrdrvr/microapps-publish`
+  - `npm link --save-dev pwrdrvr`
 - Test the version
-  - `npx microapps-publish --help`
+  - `npx pwrdrvr --help`
 - Unlink when done
-  - `npx @pwrdrvr/microapps-publish`
+  - `npx pwrdrvr`
 
 [More Info](https://dev.to/jamesqquick/how-to-test-npm-packages-locally-5elb)
diff --git a/packages/pwrdrvr/LICENSE b/packages/pwrdrvr/LICENSE
new file mode 120000
index 00000000..30cff740
--- /dev/null
+++ b/packages/pwrdrvr/LICENSE
@@ -0,0 +1,1 @@
+../../LICENSE
\ No newline at end of file
diff --git a/packages/pwrdrvr/README.md b/packages/pwrdrvr/README.md
new file mode 100644
index 00000000..3bdd78d8
--- /dev/null
+++ b/packages/pwrdrvr/README.md
@@ -0,0 +1,241 @@
+# Overview
+
+`pwrdrvr` is the CLI used to deploy new MicroApps and new versions for existing MicroApps using the [MicroApps framework](https://github.com/pwrdrvr/microapps-core/).
+
+# Table of Contents <!-- omit in toc -->
+
+- [Overview](#overview)
+- [Video Preview of Deploying an App](#video-preview-of-deploying-an-app)
+- [Installation](#installation)
+- [Usage](#usage)
+  - [Command - help](#command---help)
+  - [Command - preflight](#command---preflight)
+  - [Command - publish](#command---publish)
+  - [Command - publish-static](#command---publish-static)
+  - [Command - nextjs-version](#command---nextjs-version)
+  - [Command - nextjs-version-restore](#command---nextjs-version-restore)
+  - [Command - delete](#command---delete)
+
+# Video Preview of Deploying an App
+
+![Video Preview of Deploying an App](https://raw.githubusercontent.com/pwrdrvr/microapps-core/main/assets/videos/pwrdrvr-demo-deploy.gif)
+
+# Installation
+
+`npm i -g pwrdrvr`
+
+# Usage
+
+## Command - help
+
+`npx pwrdrvr help`
+
+```
+Publish tool for deploying apps and updates
+
+VERSION
+  pwrdrvr/0.0.0 darwin-arm64 node-v18.12.1
+
+USAGE
+  $ pwrdrvr [COMMAND]
+
+COMMANDS
+  delete                  Delete app/version
+  help                    display help for pwrdrvr
+  nextjs-version          Apply version to next.config.js overtop of 0.0.0 placeholder
+  nextjs-version-restore  Restore next.config.js
+  preflight               Check if app/version are available
+  publish                 Publish arbitrary framework app - deploy static assets to S3, alias the $LATEST Lambda
+                          function, and add integration/route to API Gateway.
+  publish-static          Publish arbitrary framework static app - deploy static assets to S3 only.
+```
+
+## Command - preflight
+
+`npx pwrdrvr preflight help`
+
+```
+Check if app/version are available
+
+USAGE
+  $ pwrdrvr preflight
+
+OPTIONS
+  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
+  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
+  -n, --new-version=new-version                    New semantic version to apply
+
+  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
+                                                   Discouraged outside of test envs if cacheable static files have
+                                                   changed.
+
+  -v, --version                                    show CLI version
+
+  --help                                           show CLI help
+
+EXAMPLE
+  $ pwrdrvr preflight -d microapps-deployer-dev -a release -n 0.0.13
+  ✔ Preflight Version Check [0.2s]
+```
+
+## Command - publish
+
+`npx pwrdrvr publish help`
+
+```
+Publish arbitrary framework app - deploy static assets to S3, alias the $LATEST Lambda function, and add integration/route to API Gateway.
+
+USAGE
+  $ pwrdrvr publish
+
+OPTIONS
+  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
+  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
+
+  -i, --default-file=default-file                  Default file to return when the app is loaded via the router
+                                                   without a version (e.g. when app/ is requested).
+
+  -l, --app-lambda-name=app-lambda-name            ARN of lambda version, alias, or function (name or ARN) to deploy
+
+  -n, --new-version=new-version                    New semantic version to apply
+
+  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
+                                                   Discouraged outside of test envs if cacheable static files have
+                                                   changed.
+
+  -s, --static-assets-path=static-assets-path      Path to files to be uploaded to S3 static bucket at app/version/
+                                                   path.  Do include app/version/ in path if files are already
+                                                   "rooted" under that path locally.
+
+  -t, --type=(apigwy|lambda-url|url|static)        [default: lambda-url] Type of the application and how its
+                                                   requests are routed
+
+  -u, --url=url                                    URL for `url` type applications
+
+  -v, --version                                    show CLI version
+
+  --help                                           show CLI help
+
+  --no-cache                                       Force revalidation of CloudFront and browser caching of static
+                                                   assets
+
+  --startup-type=(iframe|direct)                   [default: iframe] How the app should be loaded
+
+EXAMPLE
+  $ pwrdrvr publish -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
+  ✔ Get S3 Temp Credentials [1s]
+  ✔ Deploy to Lambda [0.6s]
+  ✔ Confirm Static Assets Folder Exists [0.0s]
+  ✔ Copy Static Files to Local Upload Dir [0.0s]
+  ✔ Enumerate Files to Upload to S3 [0.0s]
+  ✔ Upload Static Files to S3 [1s]
+  ✔ Creating MicroApp Application: release [0.0s]
+  ✔ Creating MicroApp Version: 0.0.21 [1s]
+```
+
+## Command - publish-static
+
+`npx pwrdrvr publish-static help`
+
+```
+Publish arbitrary framework static app - deploy static assets to S3 only.
+
+USAGE
+  $ pwrdrvr publish-static
+
+OPTIONS
+  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
+  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
+
+  -i, --default-file=default-file                  Default file to return when the app is loaded via the router
+                                                   without a version (e.g. when app/ is requested).
+
+  -n, --new-version=new-version                    New semantic version to apply
+
+  -o, --overwrite                                  Allow overwrite - Warn but do not fail if version exists.
+                                                   Discouraged outside of test envs if cacheable static files have
+                                                   changed.
+
+  -s, --static-assets-path=static-assets-path      Path to files to be uploaded to S3 static bucket at app/version/
+                                                   path.  Do include app/version/ in path if files are already
+                                                   "rooted" under that path locally.
+
+  -v, --version                                    show CLI version
+
+  --help                                           show CLI help
+
+  --no-cache                                       Force revalidation of CloudFront and browser caching of static
+                                                   assets
+
+EXAMPLE
+  $ pwrdrvr publish-static -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
+  ✔ Get S3 Temp Credentials [1s]
+  ✔ Confirm Static Assets Folder Exists [0.0s]
+  ✔ Copy Static Files to Local Upload Dir [0.0s]
+  ✔ Enumerate Files to Upload to S3 [0.0s]
+  ✔ Upload Static Files to S3 [1s]
+  ✔ Creating MicroApp Application: release [0.0s]
+  ✔ Creating MicroApp Version: 0.0.21 [1s]
+```
+
+## Command - nextjs-version
+
+`npx pwrdrvr nextjs-version help`
+
+```
+Apply version to next.config.js overtop of 0.0.0 placeholder
+
+USAGE
+  $ pwrdrvr nextjs-version
+
+OPTIONS
+  -l, --leave-copy               Leave a copy of the modifed files as .modified
+  -n, --new-version=new-version  New semantic version to apply
+  -v, --version                  show CLI version
+  --help                         show CLI help
+
+EXAMPLE
+  $ pwrdrvr nextjs-version -n 0.0.13
+  ✔ Modifying Config Files [0.0s]
+```
+
+## Command - nextjs-version-restore
+
+`npx pwrdrvr nextjs-version-restore help`
+
+```
+Restore next.config.js
+
+USAGE
+  $ pwrdrvr nextjs-version-restore
+
+OPTIONS
+  -v, --version  show CLI version
+  --help         show CLI help
+
+EXAMPLE
+  $ pwrdrvr nextjs-version-restore
+  ✔ Restoring Modified Config Files [0.0s]
+```
+
+## Command - delete
+
+`npx pwrdrvr delete help`
+
+```
+Delete app/version
+
+USAGE
+  $ pwrdrvr delete
+
+OPTIONS
+  -a, --app-name=app-name                          MicroApps app name (this becomes the path the app is rooted at)
+  -d, --deployer-lambda-name=deployer-lambda-name  Name of the deployer lambda function
+  -n, --new-version=new-version                    New semantic version to apply
+  -v, --version                                    show CLI version
+  --help                                           show CLI help
+
+EXAMPLE
+  $ pwrdrvr delete -d microapps-deployer-dev -a release -n 0.0.13
+  ✔ App/Version deleted: release/0.0.13 [1.2s]
+```
diff --git a/packages/microapps-publish/bin/run b/packages/pwrdrvr/bin/run
similarity index 100%
rename from packages/microapps-publish/bin/run
rename to packages/pwrdrvr/bin/run
diff --git a/packages/microapps-publish/configs/config-dev.yml b/packages/pwrdrvr/configs/config-dev.yml
similarity index 100%
rename from packages/microapps-publish/configs/config-dev.yml
rename to packages/pwrdrvr/configs/config-dev.yml
diff --git a/packages/microapps-publish/configs/config-prod.yml b/packages/pwrdrvr/configs/config-prod.yml
similarity index 100%
rename from packages/microapps-publish/configs/config-prod.yml
rename to packages/pwrdrvr/configs/config-prod.yml
diff --git a/packages/microapps-publish/configs/config-qa.yml b/packages/pwrdrvr/configs/config-qa.yml
similarity index 100%
rename from packages/microapps-publish/configs/config-qa.yml
rename to packages/pwrdrvr/configs/config-qa.yml
diff --git a/packages/microapps-publish/configs/config.yaml b/packages/pwrdrvr/configs/config.yaml
similarity index 100%
rename from packages/microapps-publish/configs/config.yaml
rename to packages/pwrdrvr/configs/config.yaml
diff --git a/packages/microapps-publish/microapps.json b/packages/pwrdrvr/microapps.json
similarity index 100%
rename from packages/microapps-publish/microapps.json
rename to packages/pwrdrvr/microapps.json
diff --git a/packages/microapps-publish/microapps.yaml b/packages/pwrdrvr/microapps.yaml
similarity index 100%
rename from packages/microapps-publish/microapps.yaml
rename to packages/pwrdrvr/microapps.yaml
diff --git a/packages/pwrdrvr/package.json b/packages/pwrdrvr/package.json
new file mode 100644
index 00000000..dfe94ced
--- /dev/null
+++ b/packages/pwrdrvr/package.json
@@ -0,0 +1,83 @@
+{
+  "name": "pwrdrvr",
+  "version": "0.0.0",
+  "description": "Publish tool for deploying apps and updates",
+  "main": "dist/index.js",
+  "source": "src/index.ts",
+  "publishConfig": {
+    "access": "public"
+  },
+  "bin": {
+    "microapps-publish": "./bin/run",
+    "pwrdrvr": "./bin/run"
+  },
+  "engineStrict": true,
+  "engine": {
+    "node": ">= 12.0.0"
+  },
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "files": [
+    "dist",
+    "src",
+    "package.json",
+    "LICENSE",
+    "README.md"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/pwrdrvr/microapps-core.git"
+  },
+  "author": "PwrDrvr LLC",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/pwrdrvr/microapps-core/issues"
+  },
+  "homepage": "https://github.com/pwrdrvr/microapps-core#readme",
+  "dependencies": {
+    "@aws-sdk/client-lambda": "^3.78.0",
+    "@aws-sdk/client-s3": "^3.78.0",
+    "@aws-sdk/client-sts": "^3.78.0",
+    "@aws-sdk/lib-storage": "^3.78.0",
+    "@oclif/command": "^1.8.4",
+    "@oclif/config": "^1.17.1",
+    "@oclif/core": "^1.0.4",
+    "@oclif/errors": "^1.3.5",
+    "@oclif/plugin-help": "^3.2.7",
+    "chalk": "^4.1.2",
+    "convict": "^6.1.0",
+    "convict-format-with-validator": "^6.0.1",
+    "fs-extra": "^9.1.0",
+    "js-yaml": "^4.1.0",
+    "listr2": "^3.13.5",
+    "mime-types": "^2.1.30",
+    "p-map": "^4.0.0",
+    "reflect-metadata": "^0.1.13",
+    "source-map-support": "0.5.21",
+    "ts-convict": "^1.1.0",
+    "tslib": "^2.1.0"
+  },
+  "peerDependencies": {
+    "@aws-sdk/client-lambda": "^3.78.0",
+    "@aws-sdk/client-s3": "^3.78.0",
+    "@aws-sdk/client-sts": "^3.78.0",
+    "@aws-sdk/lib-storage": "^3.78.0"
+  },
+  "devDependencies": {
+    "@types/convict": "^6.0.2",
+    "@types/convict-format-with-validator": "^6.0.2",
+    "@types/fs-extra": "^9.0.11",
+    "@types/js-yaml": "^4.0.1",
+    "@types/mime-types": "^2.1.0",
+    "@types/source-map-support": "0.5.6",
+    "type-fest": "^0.20.2"
+  },
+  "oclif": {
+    "commands": "./dist/commands/",
+    "bin": "pwrdrvr",
+    "plugins": [
+      "@oclif/plugin-help"
+    ]
+  }
+}
diff --git a/packages/microapps-publish/src/commands-deprecated/nextjs-docker-auto.skip b/packages/pwrdrvr/src/commands-deprecated/nextjs-docker-auto.skip
similarity index 99%
rename from packages/microapps-publish/src/commands-deprecated/nextjs-docker-auto.skip
rename to packages/pwrdrvr/src/commands-deprecated/nextjs-docker-auto.skip
index 0c12e861..7bd45825 100755
--- a/packages/microapps-publish/src/commands-deprecated/nextjs-docker-auto.skip
+++ b/packages/pwrdrvr/src/commands-deprecated/nextjs-docker-auto.skip
@@ -35,7 +35,7 @@ export class DockerAutoCommand extends Command {
     'Fully automatic publishing of Docker-based Lambda function using Next.js and serverless-nextjs-router';
 
   static examples = [
-    `$ microapps-publish nextjs-docker-auto -d microapps-deployer-dev -r microapps-app-release-dev-repo -n 0.0.14
+    `$ pwrdrvr nextjs-docker-auto -d microapps-deployer-dev -r microapps-app-release-dev-repo -n 0.0.14
 ✔ Logging into ECR [2s]
 ✔ Modifying Config Files [0.0s]
 ✔ Preflight Version Check [1s]
diff --git a/packages/microapps-publish/src/commands/delete.ts b/packages/pwrdrvr/src/commands/delete.ts
similarity index 98%
rename from packages/microapps-publish/src/commands/delete.ts
rename to packages/pwrdrvr/src/commands/delete.ts
index 61868204..0f683982 100644
--- a/packages/microapps-publish/src/commands/delete.ts
+++ b/packages/pwrdrvr/src/commands/delete.ts
@@ -9,7 +9,7 @@ export class DeleteCommand extends Command {
   static description = 'Delete app/version';
 
   static examples = [
-    `$ microapps-publish delete -d microapps-deployer-dev -a release -n 0.0.13
+    `$ pwrdrvr delete -d microapps-deployer-dev -a release -n 0.0.13
 ✔ App/Version deleted: release/0.0.13 [1.2s]
 `,
   ];
diff --git a/packages/microapps-publish/src/commands/nextjs-version-restore.ts b/packages/pwrdrvr/src/commands/nextjs-version-restore.ts
similarity index 97%
rename from packages/microapps-publish/src/commands/nextjs-version-restore.ts
rename to packages/pwrdrvr/src/commands/nextjs-version-restore.ts
index 7f56c4a5..8b9ae885 100644
--- a/packages/microapps-publish/src/commands/nextjs-version-restore.ts
+++ b/packages/pwrdrvr/src/commands/nextjs-version-restore.ts
@@ -7,7 +7,7 @@ export class NextJSVersionRestoreCommand extends Command {
   static description = 'Restore next.config.js';
 
   static examples = [
-    `$ microapps-publish nextjs-version-restore
+    `$ pwrdrvr nextjs-version-restore
 ✔ Restoring Modified Config Files [0.0s]
 `,
   ];
diff --git a/packages/microapps-publish/src/commands/nextjs-version.ts b/packages/pwrdrvr/src/commands/nextjs-version.ts
similarity index 98%
rename from packages/microapps-publish/src/commands/nextjs-version.ts
rename to packages/pwrdrvr/src/commands/nextjs-version.ts
index 5904e3b5..b29ec299 100644
--- a/packages/microapps-publish/src/commands/nextjs-version.ts
+++ b/packages/pwrdrvr/src/commands/nextjs-version.ts
@@ -8,7 +8,7 @@ export class NextJSVersionCommand extends Command {
   static description = 'Apply version to next.config.js overtop of 0.0.0 placeholder';
 
   static examples = [
-    `$ microapps-publish nextjs-version -n 0.0.13
+    `$ pwrdrvr nextjs-version -n 0.0.13
 ✔ Modifying Config Files [0.0s]
 `,
   ];
diff --git a/packages/microapps-publish/src/commands/preflight.ts b/packages/pwrdrvr/src/commands/preflight.ts
similarity index 98%
rename from packages/microapps-publish/src/commands/preflight.ts
rename to packages/pwrdrvr/src/commands/preflight.ts
index fd4c7407..cacdd268 100644
--- a/packages/microapps-publish/src/commands/preflight.ts
+++ b/packages/pwrdrvr/src/commands/preflight.ts
@@ -9,7 +9,7 @@ export class PreflightCommand extends Command {
   static description = 'Check if app/version are available';
 
   static examples = [
-    `$ microapps-publish preflight -d microapps-deployer-dev -a release -n 0.0.13
+    `$ pwrdrvr preflight -d microapps-deployer-dev -a release -n 0.0.13
 ✔ Preflight Version Check [0.2s]
 `,
   ];
diff --git a/packages/microapps-publish/src/commands/publish-static.ts b/packages/pwrdrvr/src/commands/publish-static.ts
similarity index 99%
rename from packages/microapps-publish/src/commands/publish-static.ts
rename to packages/pwrdrvr/src/commands/publish-static.ts
index b04c1a42..23860b32 100644
--- a/packages/microapps-publish/src/commands/publish-static.ts
+++ b/packages/pwrdrvr/src/commands/publish-static.ts
@@ -26,7 +26,7 @@ export class PublishCommand extends Command {
   static description = 'Publish arbitrary framework static app - deploy static assets to S3 only.';
 
   static examples = [
-    `$ microapps-publish publish-static -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
+    `$ pwrdrvr publish-static -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
 ✔ Get S3 Temp Credentials [1s]
 ✔ Confirm Static Assets Folder Exists [0.0s]
 ✔ Copy Static Files to Local Upload Dir [0.0s]
diff --git a/packages/microapps-publish/src/commands/publish.ts b/packages/pwrdrvr/src/commands/publish.ts
similarity index 99%
rename from packages/microapps-publish/src/commands/publish.ts
rename to packages/pwrdrvr/src/commands/publish.ts
index 96b06c91..203fabd3 100644
--- a/packages/microapps-publish/src/commands/publish.ts
+++ b/packages/pwrdrvr/src/commands/publish.ts
@@ -52,7 +52,7 @@ export class PublishCommand extends Command {
     'Publish arbitrary framework app - deploy static assets to S3, alias the $LATEST Lambda function, and add integration/route to API Gateway.';
 
   static examples = [
-    `$ microapps-publish publish -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
+    `$ pwrdrvr publish -d microapps-deployer-dev -l microapps-app-release-dev -a release -n 0.0.21
 ✔ Get S3 Temp Credentials [1s]
 ✔ Deploy to Lambda [0.6s]
 ✔ Confirm Static Assets Folder Exists [0.0s]
diff --git a/packages/microapps-publish/src/config/Application.ts b/packages/pwrdrvr/src/config/Application.ts
similarity index 100%
rename from packages/microapps-publish/src/config/Application.ts
rename to packages/pwrdrvr/src/config/Application.ts
diff --git a/packages/microapps-publish/src/config/Config.ts b/packages/pwrdrvr/src/config/Config.ts
similarity index 100%
rename from packages/microapps-publish/src/config/Config.ts
rename to packages/pwrdrvr/src/config/Config.ts
diff --git a/packages/microapps-publish/src/config/Deployer.ts b/packages/pwrdrvr/src/config/Deployer.ts
similarity index 100%
rename from packages/microapps-publish/src/config/Deployer.ts
rename to packages/pwrdrvr/src/config/Deployer.ts
diff --git a/packages/microapps-publish/src/index.ts b/packages/pwrdrvr/src/index.ts
similarity index 100%
rename from packages/microapps-publish/src/index.ts
rename to packages/pwrdrvr/src/index.ts
diff --git a/packages/microapps-publish/src/lib/DeployClient.ts b/packages/pwrdrvr/src/lib/DeployClient.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/DeployClient.ts
rename to packages/pwrdrvr/src/lib/DeployClient.ts
diff --git a/packages/microapps-publish/src/lib/FilesExist.ts b/packages/pwrdrvr/src/lib/FilesExist.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/FilesExist.ts
rename to packages/pwrdrvr/src/lib/FilesExist.ts
diff --git a/packages/microapps-publish/src/lib/S3TransferUtility.spec.ts b/packages/pwrdrvr/src/lib/S3TransferUtility.spec.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/S3TransferUtility.spec.ts
rename to packages/pwrdrvr/src/lib/S3TransferUtility.spec.ts
diff --git a/packages/microapps-publish/src/lib/S3TransferUtility.ts b/packages/pwrdrvr/src/lib/S3TransferUtility.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/S3TransferUtility.ts
rename to packages/pwrdrvr/src/lib/S3TransferUtility.ts
diff --git a/packages/microapps-publish/src/lib/S3Uploader.ts b/packages/pwrdrvr/src/lib/S3Uploader.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/S3Uploader.ts
rename to packages/pwrdrvr/src/lib/S3Uploader.ts
diff --git a/packages/microapps-publish/src/lib/Versions.ts b/packages/pwrdrvr/src/lib/Versions.ts
similarity index 100%
rename from packages/microapps-publish/src/lib/Versions.ts
rename to packages/pwrdrvr/src/lib/Versions.ts
diff --git a/packages/microapps-publish/src/lib/__snapshots__/S3TransferUtility.spec.ts.snap b/packages/pwrdrvr/src/lib/__snapshots__/S3TransferUtility.spec.ts.snap
similarity index 100%
rename from packages/microapps-publish/src/lib/__snapshots__/S3TransferUtility.spec.ts.snap
rename to packages/pwrdrvr/src/lib/__snapshots__/S3TransferUtility.spec.ts.snap
diff --git a/packages/microapps-publish/tsconfig.json b/packages/pwrdrvr/tsconfig.json
similarity index 100%
rename from packages/microapps-publish/tsconfig.json
rename to packages/pwrdrvr/tsconfig.json
diff --git a/tsconfig.json b/tsconfig.json
index 47bd5723..6a65f0d2 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -29,7 +29,7 @@
       "path": "packages/cdk/"
     },
     {
-      "path": "packages/microapps-publish/"
+      "path": "packages/pwrdrvr/"
     }
   ]
 }
diff --git a/tsconfig.publish.json b/tsconfig.publish.json
index 27f13925..c5354b55 100644
--- a/tsconfig.publish.json
+++ b/tsconfig.publish.json
@@ -8,7 +8,7 @@
       "path": "packages/microapps-deployer-lib/"
     },
     {
-      "path": "packages/microapps-publish/"
+      "path": "packages/pwrdrvr/"
     },
     {
       "path": "packages/microapps-router-lib/"
diff --git a/yarn.lock b/yarn.lock
index cef8dc54..794ec455 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2859,6 +2859,18 @@
   resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz"
   integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
 
+"@isaacs/cliui@^8.0.2":
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+  integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+  dependencies:
+    string-width "^5.1.2"
+    string-width-cjs "npm:string-width@^4.2.0"
+    strip-ansi "^7.0.1"
+    strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+    wrap-ansi "^8.1.0"
+    wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
 "@istanbuljs/load-nyc-config@^1.0.0":
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz"
@@ -3445,6 +3457,11 @@
   resolved "https://registry.yarnpkg.com/@oozcitak/util/-/util-8.3.8.tgz"
   integrity sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==
 
+"@pkgjs/parseargs@^0.11.0":
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+  integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
 "@pkgr/utils@^2.3.1":
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03"
@@ -4140,7 +4157,7 @@ ansi-styles@^5.0.0:
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
-ansi-styles@^6.0.0:
+ansi-styles@^6.0.0, ansi-styles@^6.1.0:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
   integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
@@ -5109,7 +5126,7 @@ cross-spawn@^6.0.5:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz"
   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -6292,6 +6309,14 @@ for-each@^0.3.3:
   dependencies:
     is-callable "^1.1.3"
 
+foreground-child@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
+  integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+  dependencies:
+    cross-spawn "^7.0.0"
+    signal-exit "^4.0.1"
+
 form-data@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz"
@@ -6532,6 +6557,17 @@ glob-parent@^6.0.1, glob-parent@^6.0.2:
   dependencies:
     is-glob "^4.0.3"
 
+glob@^10.2.5:
+  version "10.2.5"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.5.tgz#73c1850ac8f077810d8370ba414b382ad1a86083"
+  integrity sha512-Gj+dFYPZ5hc5dazjXzB0iHg2jKWJZYMjITXYPBRQ/xc2Buw7H0BINknRTwURJ6IC6MEFpYbLvtgVb3qD+DwyuA==
+  dependencies:
+    foreground-child "^3.1.0"
+    jackspeak "^2.0.3"
+    minimatch "^9.0.0"
+    minipass "^5.0.0 || ^6.0.2"
+    path-scurry "^1.7.0"
+
 glob@^7, glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.0:
   version "7.2.3"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz"
@@ -6555,16 +6591,6 @@ glob@^8.0.1:
     minimatch "^5.0.1"
     once "^1.3.0"
 
-glob@^9.2.0:
-  version "9.2.1"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-9.2.1.tgz#f47e34e1119e7d4f93a546e75851ba1f1e68de50"
-  integrity sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==
-  dependencies:
-    fs.realpath "^1.0.0"
-    minimatch "^7.4.1"
-    minipass "^4.2.4"
-    path-scurry "^1.6.1"
-
 global-dirs@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz"
@@ -7256,6 +7282,15 @@ istanbul-reports@^3.1.3:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
+jackspeak@^2.0.3:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.0.tgz#497cbaedc902ec3f31d5d61be804d2364ff9ddad"
+  integrity sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==
+  dependencies:
+    "@isaacs/cliui" "^8.0.2"
+  optionalDependencies:
+    "@pkgjs/parseargs" "^0.11.0"
+
 jake@^10.8.5:
   version "10.8.5"
   resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz"
@@ -8232,16 +8267,16 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
-lru-cache@^7.14.1:
-  version "7.18.1"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.1.tgz#4716408dec51d5d0104732647f584d1f6738b109"
-  integrity sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==
-
 lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1:
   version "7.10.1"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz"
   integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A==
 
+lru-cache@^9.1.1:
+  version "9.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1"
+  integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==
+
 ltgt@~2.2.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz"
@@ -8396,10 +8431,10 @@ minimatch@^5.0.1:
   dependencies:
     brace-expansion "^2.0.1"
 
-minimatch@^7.4.1:
-  version "7.4.2"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.2.tgz#157e847d79ca671054253b840656720cb733f10f"
-  integrity sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==
+minimatch@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56"
+  integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==
   dependencies:
     brace-expansion "^2.0.1"
 
@@ -8471,10 +8506,10 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6:
   dependencies:
     yallist "^4.0.0"
 
-minipass@^4.0.2, minipass@^4.2.4:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06"
-  integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==
+"minipass@^5.0.0 || ^6.0.2":
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81"
+  integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==
 
 minizlib@^2.1.1, minizlib@^2.1.2:
   version "2.1.2"
@@ -9101,13 +9136,13 @@ path-parse@^1.0.7:
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz"
   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 
-path-scurry@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.1.tgz#dab45f7bb1d3f45a0e271ab258999f4ab7e23132"
-  integrity sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==
+path-scurry@^1.7.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63"
+  integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==
   dependencies:
-    lru-cache "^7.14.1"
-    minipass "^4.0.2"
+    lru-cache "^9.1.1"
+    minipass "^5.0.0 || ^6.0.2"
 
 path-to-regexp@^1.7.0:
   version "1.8.0"
@@ -9597,12 +9632,12 @@ rfdc@^1.3.0:
   resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz"
   integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
 
-rimraf@4.3.0:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.3.0.tgz#cd4d9a918c1735197e0ae8217e5eeb4657d42154"
-  integrity sha512-5qVDXPbByA1qSJEWMv1qAwKsoS22vVpsL2QyxCKBw4gf6XiFo1K3uRLY6uSOOBFDwnqAZtnbILqWKKlzh8bkGg==
+rimraf@5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0"
+  integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==
   dependencies:
-    glob "^9.2.0"
+    glob "^10.2.5"
 
 rimraf@^2.6.3:
   version "2.7.1"
@@ -9757,6 +9792,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
 
+signal-exit@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967"
+  integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==
+
 sinon@^10.0.0:
   version "10.0.1"
   resolved "https://registry.yarnpkg.com/sinon/-/sinon-10.0.1.tgz"
@@ -10025,6 +10065,15 @@ string-length@^4.0.1:
     char-regex "^1.0.2"
     strip-ansi "^6.0.0"
 
+"string-width-cjs@npm:string-width@^4.2.0":
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
 "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
   version "4.2.3"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz"
@@ -10034,7 +10083,7 @@ string-length@^4.0.1:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.1"
 
-string-width@^5.0.0:
+string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
   integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
@@ -10103,6 +10152,13 @@ stringify-package@^1.0.1:
   resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz"
   integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
 
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
 strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz"
@@ -10725,6 +10781,15 @@ workerpool@^6.2.1:
   resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz"
   integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
 
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz"
@@ -10743,6 +10808,15 @@ wrap-ansi@^7.0.0:
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
 
+wrap-ansi@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+  integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+  dependencies:
+    ansi-styles "^6.1.0"
+    string-width "^5.0.1"
+    strip-ansi "^7.0.1"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz"


Test patch:
diff --git a/packages/microapps-publish/tests/files/dir1/.touch b/packages/pwrdrvr/tests/files/dir1/.touch
similarity index 100%
rename from packages/microapps-publish/tests/files/dir1/.touch
rename to packages/pwrdrvr/tests/files/dir1/.touch
diff --git a/packages/microapps-publish/tests/files/dir2/dir21/dir211/some211-1.json b/packages/pwrdrvr/tests/files/dir2/dir21/dir211/some211-1.json
similarity index 100%
rename from packages/microapps-publish/tests/files/dir2/dir21/dir211/some211-1.json
rename to packages/pwrdrvr/tests/files/dir2/dir21/dir211/some211-1.json
diff --git a/packages/microapps-publish/tests/files/dir2/dir21/dir211/some211-2.json b/packages/pwrdrvr/tests/files/dir2/dir21/dir211/some211-2.json
similarity index 100%
rename from packages/microapps-publish/tests/files/dir2/dir21/dir211/some211-2.json
rename to packages/pwrdrvr/tests/files/dir2/dir21/dir211/some211-2.json
diff --git a/packages/microapps-publish/tests/files/dir2/dir21/some21.json b/packages/pwrdrvr/tests/files/dir2/dir21/some21.json
similarity index 100%
rename from packages/microapps-publish/tests/files/dir2/dir21/some21.json
rename to packages/pwrdrvr/tests/files/dir2/dir21/some21.json
diff --git a/packages/microapps-publish/tests/files/dir2/dir22/some22.json b/packages/pwrdrvr/tests/files/dir2/dir22/some22.json
similarity index 100%
rename from packages/microapps-publish/tests/files/dir2/dir22/some22.json
rename to packages/pwrdrvr/tests/files/dir2/dir22/some22.json
diff --git a/packages/microapps-publish/tests/files/some.json b/packages/pwrdrvr/tests/files/some.json
similarity index 100%
rename from packages/microapps-publish/tests/files/some.json
rename to packages/pwrdrvr/tests/files/some.json