@keinar/aac-cli 1.2.0 → 1.2.1

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.
Files changed (2) hide show
  1. package/dist/index.cjs +31 -28
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Y=Object.create;var F=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var z=(e,o,r,l)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of G(o))!W.call(e,i)&&i!==r&&F(e,i,{get:()=>o[i],enumerable:!(l=q(o,i))||l.enumerable});return e};var k=(e,o,r)=>(r=e!=null?Y(H(e)):{},z(o||!e||!e.__esModule?F(r,"default",{value:e,enumerable:!0}):r,e));var M=require("commander"),p=k(require("@clack/prompts"),1),A=k(require("picocolors"),1);var P=require("fs/promises"),$=require("path"),s=k(require("@clack/prompts"),1),d=k(require("picocolors"),1);var b="1.50.0";function L(e){return`FROM mcr.microsoft.com/playwright:v${e}-jammy
2
+ "use strict";var G=Object.create;var j=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var J=(e,r,i,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of W(r))!K.call(e,o)&&o!==i&&j(e,o,{get:()=>r[o],enumerable:!(s=H(r,o))||s.enumerable});return e};var P=(e,r,i)=>(i=e!=null?G(z(e)):{},J(r||!e||!e.__esModule?j(i,"default",{value:e,enumerable:!0}):i,e));var Y=require("commander"),m=P(require("@clack/prompts"),1),A=P(require("picocolors"),1);var C=require("fs/promises"),D=require("path"),a=P(require("@clack/prompts"),1),d=P(require("picocolors"),1);var x="1.50.0";function N(e){return`FROM mcr.microsoft.com/playwright:v${e}-jammy
3
3
 
4
4
  WORKDIR /app
5
5
 
@@ -9,7 +9,7 @@ RUN npm ci
9
9
  COPY . .
10
10
 
11
11
  RUN chmod +x /app/entrypoint.sh
12
- `}var j=`#!/bin/sh
12
+ `}var I=`#!/bin/sh
13
13
 
14
14
  FOLDER=$1
15
15
 
@@ -27,25 +27,28 @@ else
27
27
  echo "Running tests in folder: $FOLDER"
28
28
  npx playwright test "$FOLDER"
29
29
  fi
30
- `;function N(e){let{pythonVersion:o,packageManager:r,installPlaywright:l,playwrightBrowser:i,extraSystemDeps:t}=e,a=`FROM ${l?`mcr.microsoft.com/playwright/python:v${b}-jammy`:`python:${o}-slim`}
30
+ `;function V(e){let{pythonVersion:r,packageManager:i,installPlaywright:s,playwrightVersion:o,playwrightBrowser:t,browserChannel:c,extraSystemDeps:p}=e,l=`FROM ${s?`mcr.microsoft.com/playwright/python:v${o||x}-jammy`:`python:${r}-slim`}
31
31
 
32
- `;return a+=`WORKDIR /app
32
+ `;return l+=`WORKDIR /app
33
33
 
34
- `,t.length>0&&(a+=`RUN apt-get update && apt-get install -y --no-install-recommends \\
35
- `,a+=` ${t.join(" ")} && \\
36
- `,a+=` rm -rf /var/lib/apt/lists/*
34
+ `,p.length>0&&(l+=`RUN apt-get update && apt-get install -y --no-install-recommends \\
35
+ `,l+=` ${p.join(" ")} && \\
36
+ `,l+=` rm -rf /var/lib/apt/lists/*
37
37
 
38
- `),r==="poetry"?(a+=`RUN pip install poetry
39
- `,a+=`COPY pyproject.toml poetry.lock ./
40
- `,a+=`RUN poetry install --no-root
38
+ `),i==="poetry"?(l+=`RUN pip install poetry
39
+ `,l+=`COPY pyproject.toml poetry.lock ./
40
+ `,l+=`RUN poetry install --no-root
41
41
 
42
- `):(a+=`COPY requirements.txt ./
43
- `,a+=`RUN pip install --no-cache-dir -r requirements.txt
42
+ `):(l+=`COPY requirements.txt ./
43
+ `,l+=`RUN pip install --no-cache-dir -r requirements.txt
44
44
 
45
- `),a+=`COPY . .
45
+ `),c&&(l+=`# Required: pytest.ini specifies --browser-channel ${c}
46
+ `,l+=`RUN playwright install ${c}
46
47
 
47
- `,a+=`RUN chmod +x /app/entrypoint.sh
48
- `,a}function I(e){let o=e==="poetry"?"poetry run pytest":"pytest";return`#!/bin/sh
48
+ `),l+=`COPY . .
49
+
50
+ `,l+=`RUN chmod +x /app/entrypoint.sh
51
+ `,l}function S(e){let r=e==="poetry"?"poetry run pytest":"pytest";return`#!/bin/sh
49
52
 
50
53
  FOLDER=$1
51
54
 
@@ -56,24 +59,24 @@ fi
56
59
 
57
60
  if [ -z "$FOLDER" ] || [ "$FOLDER" = "all" ]; then
58
61
  echo "Running ALL tests..."
59
- ${o}
62
+ ${r}
60
63
  else
61
64
  echo "Running tests in folder: $FOLDER"
62
- ${o} "$FOLDER"
65
+ ${r} "$FOLDER"
63
66
  fi
64
- `}var S=`.git
67
+ `}var B=`.git
65
68
  .env
66
69
  node_modules
67
70
  __pycache__
68
71
  .venv
69
- `;var x=require("fs/promises"),h=require("path");async function D(e){try{return await(0,x.stat)(e),!0}catch{return!1}}async function V(e){let o=await D((0,h.join)(e,"requirements.txt")),r=await D((0,h.join)(e,"pyproject.toml")),l=await D((0,h.join)(e,"poetry.lock")),i="",t="pip",c=null;if(r){let w=await(0,x.readFile)((0,h.join)(e,"pyproject.toml"),"utf-8");if(l||w.includes("[tool.poetry]")){t="poetry",i+=w;let R=w.match(/python\s*=\s*"([^"]+)"/);if(R){let E=R[1].match(/(\d+\.\d+)/);E&&(c=E[1])}}}if(!c&&await D((0,h.join)(e,".python-version"))){let R=(await(0,x.readFile)((0,h.join)(e,".python-version"),"utf-8")).trim().match(/(\d+\.\d+)/);R&&(c=R[1])}if(o){let w=await(0,x.readFile)((0,h.join)(e,"requirements.txt"),"utf-8");i+=`
70
- `+w}let a=i.includes("playwright")||i.includes("pytest-playwright"),y=i.includes("allure-pytest"),m=i.includes("selenium")||i.includes("pytest-selenium"),f=!a&&!m,g=null,O=i.match(/playwright==([\d.]+)/);return O&&(g=O[1]),{hasPlaywright:a,hasAllure:y,hasSelenium:m,isApiOnly:f,packageManager:t,pythonVersion:c,playwrightVersion:g}}async function K(e){try{let o=await(0,P.readFile)((0,$.join)(e,"package.json"),"utf-8"),r=JSON.parse(o),l=r.devDependencies?.["@playwright/test"]??r.dependencies?.["@playwright/test"];return l?l.replace(/^[^\d]*/,"")||b:b}catch{return b}}async function J(e,o){let r=e==="playwright",l,i;if(r){let t=await K(o);s.log.info(`Detected Playwright version: ${d.default.cyan("v"+t)}`),l=L(t),i=j}else{s.log.info(d.default.cyan("Analyzing project structure..."));let t=await V(o),c=null;if(!t.isApiOnly){let g=await s.select({message:"Which browser does your test suite use?",options:[{value:"chromium",label:"Chromium (default)"},{value:"firefox",label:"Firefox"},{value:"webkit",label:"Webkit"},{value:"none",label:"None (API tests only)"}],initialValue:"chromium"});s.isCancel(g)&&(s.cancel("Operation cancelled."),process.exit(0)),g!=="none"?c=g:(t.isApiOnly=!0,t.hasPlaywright=!1)}let a=t.hasAllure;if(!a){let g=await s.confirm({message:"Does your project use Allure reporting?"});s.isCancel(g)&&process.exit(0),a=g}let y=await s.text({message:"Are there any system-level dependencies your tests need? (space separated)",placeholder:"e.g. ffmpeg fonts-liberation"});s.isCancel(y)&&process.exit(0);let m=y?y.split(" ").filter(Boolean):[];s.note(` Base image: ${t.hasPlaywright?`mcr.microsoft.com/playwright/python:v${t.playwrightVersion||b}-jammy`:`python:${t.pythonVersion||"3.11"}-slim`}
72
+ `;var k=require("fs/promises"),h=require("path");async function $(e){try{return await(0,k.stat)(e),!0}catch{return!1}}async function U(e){let r=await $((0,h.join)(e,"requirements.txt")),i=await $((0,h.join)(e,"pyproject.toml")),s=await $((0,h.join)(e,"poetry.lock")),o="",t="pip",c=null;if(i){let f=await(0,k.readFile)((0,h.join)(e,"pyproject.toml"),"utf-8");if(s||f.includes("[tool.poetry]")){t="poetry",o+=f;let R=f.match(/python\s*=\s*"([^"]+)"/);if(R){let L=R[1].match(/(\d+\.\d+)/);L&&(c=L[1])}}}if(!c&&await $((0,h.join)(e,".python-version"))){let R=(await(0,k.readFile)((0,h.join)(e,".python-version"),"utf-8")).trim().match(/(\d+\.\d+)/);R&&(c=R[1])}if(r){let f=await(0,k.readFile)((0,h.join)(e,"requirements.txt"),"utf-8");o+=`
73
+ `+f}let p=o.includes("playwright")||o.includes("pytest-playwright"),y=o.includes("allure-pytest"),u=o.includes("selenium")||o.includes("pytest-selenium"),l=!p&&!u,w=null,b=o.match(/playwright==([\d.]+)/)||o.match(/pytest-playwright==([\d.]+)/),F=o.match(/^playwright==(\d+\.\d+\.\d+)/m);F&&(w=F[1]);let O=null;if(await $((0,h.join)(e,"pytest.ini"))){let f=await(0,k.readFile)((0,h.join)(e,"pytest.ini"),"utf-8");f.includes("--browser-channel chrome")?O="chrome":f.includes("--browser-channel msedge")&&(O="msedge")}return{hasPlaywright:p,hasAllure:y,hasSelenium:u,isApiOnly:l,packageManager:t,pythonVersion:c,playwrightVersion:w,browserChannel:O}}async function Q(e){try{let r=await(0,C.readFile)((0,D.join)(e,"package.json"),"utf-8"),i=JSON.parse(r),s=i.devDependencies?.["@playwright/test"]??i.dependencies?.["@playwright/test"];return s?s.replace(/^[^\d]*/,"")||x:x}catch{return x}}async function X(e,r){let i=e==="playwright",s,o;if(i){let t=await Q(r);a.log.info(`Detected Playwright version: ${d.default.cyan("v"+t)}`),s=N(t),o=I}else{a.log.info(d.default.cyan("Analyzing project structure..."));let t=await U(r),c=null;if(!t.isApiOnly){let b=await a.select({message:"Which browser does your test suite use?",options:[{value:"chromium",label:"Chromium (default)"},{value:"firefox",label:"Firefox"},{value:"webkit",label:"Webkit"},{value:"none",label:"None (API tests only)"}],initialValue:"chromium"});a.isCancel(b)&&(a.cancel("Operation cancelled."),process.exit(0)),b!=="none"?c=b:(t.isApiOnly=!0,t.hasPlaywright=!1)}let p=t.hasAllure;if(!p){let b=await a.confirm({message:"Does your project use Allure reporting?"});a.isCancel(b)&&process.exit(0),p=b}let y=await a.text({message:"Are there any system-level dependencies your tests need? (space separated)",placeholder:"e.g. ffmpeg fonts-liberation"});a.isCancel(y)&&process.exit(0);let u=y?y.split(" ").filter(Boolean):[],l=c||"none";t.browserChannel&&(l+=` + ${t.browserChannel} (detected --browser-channel ${t.browserChannel})`),a.note(` Base image: ${t.hasPlaywright?`mcr.microsoft.com/playwright/python:v${t.playwrightVersion||x}-jammy`:`python:${t.pythonVersion||"3.11"}-slim`}
71
74
  Package mgr: ${t.packageManager}
72
- Browser: ${c||"none"}
73
- Allure: ${a?"yes":"no"}
74
- Extra deps: ${m.length?m.join(", "):"none"}`,"\u{1F4CB} AAC will generate the following setup:");let f=await s.confirm({message:"Proceed with these settings?",initialValue:!0});(s.isCancel(f)||!f)&&(s.cancel("Operation cancelled."),process.exit(0)),l=N({pythonVersion:t.pythonVersion||"3.11",packageManager:t.packageManager,installPlaywright:t.hasPlaywright,playwrightBrowser:c,extraSystemDeps:m}),i=I(t.packageManager)}return[{name:".dockerignore",content:S,mode:420},{name:"entrypoint.sh",content:i,mode:493},{name:"Dockerfile",content:l,mode:420}]}async function Q(e){try{return await(0,P.stat)(e),!0}catch{return!1}}function X(e){return e.replace(/\r\n/g,`
75
- `)}async function B(e,o){let r=await J(e,o),l=new Set;for(let t of r){let c=(0,$.join)(o,t.name);if(await Q(c)){let a=await s.confirm({message:`File ${d.default.yellow(t.name)} already exists. Overwrite?`});s.isCancel(a)&&(s.cancel("Operation cancelled."),process.exit(0)),a||l.add(t.name)}}if(l.size===r.length){s.log.warn("All files were skipped. No changes were made.");return}let i=[];for(let t of r){if(l.has(t.name))continue;let c=(0,$.join)(o,t.name),a=X(t.content);await(0,P.writeFile)(c,a,{mode:t.mode}),i.push(t.name)}for(let t of i)s.log.success(`Created ${d.default.green(t)}`);s.note([`${d.default.bold("1.")} docker build -t your-username/my-automation-tests:latest .`,`${d.default.bold("2.")} docker push your-username/my-automation-tests:latest`,`${d.default.bold("3.")} Enter this image name in the AAC Dashboard.`].join(`
76
- `),`${d.default.green("\u2705")} Next steps to connect your project to the AAC`)}var v=require("child_process"),T=require("fs/promises"),U=require("path"),n=k(require("@clack/prompts"),1),u=k(require("picocolors"),1);async function Z(e){try{let o=await(0,T.readFile)((0,U.join)(e,"package.json"),"utf-8"),r=JSON.parse(o);return r.name?r.name.replace(/^@[^/]+\//,""):null}catch{return null}}async function _(e){let o=await n.confirm({message:"Do you have a Docker Hub account?"});if(n.isCancel(o)){n.cancel("Deployment cancelled.");return}o||(n.note(`Create a free account at ${u.default.cyan("https://hub.docker.com")}
77
- Press Enter when you're ready to continue.`,u.default.yellow("Docker Hub Account Required")),await n.text({message:"Press Enter to continue...",defaultValue:"",placeholder:""}));let r=await n.text({message:"What is your Docker Hub username?",validate:m=>{if(!m.trim())return"Username is required."}});if(n.isCancel(r)){n.cancel("Deployment cancelled.");return}let l=await Z(e),i;if(l){let m=await n.confirm({message:`Detected project name "${u.default.cyan(l)}". Use this for the image?`});if(n.isCancel(m)){n.cancel("Deployment cancelled.");return}if(m)i=l;else{let f=await n.text({message:"Enter the image name:",validate:g=>{if(!g.trim())return"Image name is required."}});if(n.isCancel(f)){n.cancel("Deployment cancelled.");return}i=f.trim()}}else{let m=await n.text({message:"Enter the image name:",validate:f=>{if(!f.trim())return"Image name is required."}});if(n.isCancel(m)){n.cancel("Deployment cancelled.");return}i=m.trim()}let t=`${r.trim()}/${i}:latest`,c=await n.confirm({message:"I need to log you into Docker. Send a login request?"});if(n.isCancel(c)){n.cancel("Deployment cancelled.");return}if(c){n.log.step("Opening Docker login...");try{(0,v.execSync)("docker login",{stdio:"inherit",cwd:e}),n.log.success("Docker login successful.")}catch{n.log.error("Docker login failed. Please try again manually.");return}}let a=await n.confirm({message:`Build multi-platform image ${u.default.cyan(t)} and push to Docker Hub?`});if(n.isCancel(a)||!a){n.log.warn("Build skipped."),n.note([`${u.default.bold("1.")} docker buildx create --name aac-builder --use`,`${u.default.bold("2.")} docker buildx build --platform linux/amd64,linux/arm64 -t ${t} --push .`].join(`
78
- `),"You can build manually later");return}let y=n.spinner();try{y.start("Setting up Docker Buildx builder..."),(0,v.execSync)("docker buildx create --name aac-builder --use",{stdio:"pipe",cwd:e}),y.stop("Buildx builder ready.")}catch{y.stop("Using existing Buildx builder.")}n.log.step(`Building & pushing ${u.default.cyan(t)}...`);try{(0,v.execSync)(`docker buildx build --platform linux/amd64,linux/arm64 -t ${t} --push .`,{stdio:"inherit",cwd:e}),n.log.success(`Image ${u.default.green(t)} pushed successfully!`),n.note(`Go to the ${u.default.bold("AAC Dashboard")} and enter:
79
- ${u.default.cyan(t)}`,u.default.green("\u2705 Deployment Complete"))}catch{n.log.error("Docker build failed. Check the output above for details.")}}var C=new M.Command;C.name("aac-cli").description("Agnostic Automation Center CLI \u2014 Prepare any test automation repo for the AAC platform").version("1.1.0");C.command("init").description("Generate AAC integration files and optionally build & push your Docker image").action(async()=>{p.intro(A.default.bgCyan(A.default.black(" AAC CLI ")));let e=await p.select({message:"Select your automation project framework:",options:[{value:"playwright",label:"Playwright (TypeScript/Node.js)"},{value:"pytest",label:"Pytest (Python)"}]});p.isCancel(e)&&(p.cancel("Operation cancelled."),process.exit(0));let o=p.spinner();o.start("Generating AAC integration files..."),await new Promise(i=>setTimeout(i,300)),o.stop("Files ready.");let r=process.cwd();await B(e,r);let l=await p.confirm({message:"Do you want to build and push the image to Docker Hub right now?"});p.isCancel(l)&&(p.cancel("Operation cancelled."),process.exit(0)),l&&await _(r),p.outro(A.default.green("Done!")+" "+A.default.dim("Run `aac-cli init` again anytime."))});C.parse();
75
+ Browser: ${l}
76
+ Allure: ${p?"yes":"no"}
77
+ Extra deps: ${u.length?u.join(", "):"none"}`,"\u{1F4CB} AAC will generate the following setup:");let w=await a.confirm({message:"Proceed with these settings?",initialValue:!0});(a.isCancel(w)||!w)&&(a.cancel("Operation cancelled."),process.exit(0)),s=V({pythonVersion:t.pythonVersion||"3.11",packageManager:t.packageManager,installPlaywright:t.hasPlaywright,playwrightBrowser:c,playwrightVersion:t.playwrightVersion,browserChannel:t.browserChannel,extraSystemDeps:u}),o=S(t.packageManager)}return[{name:".dockerignore",content:B,mode:420},{name:"entrypoint.sh",content:o,mode:493},{name:"Dockerfile",content:s,mode:420}]}async function Z(e){try{return await(0,C.stat)(e),!0}catch{return!1}}function ee(e){return e.replace(/\r\n/g,`
78
+ `)}async function T(e,r){let i=await X(e,r),s=new Set;for(let t of i){let c=(0,D.join)(r,t.name);if(await Z(c)){let p=await a.confirm({message:`File ${d.default.yellow(t.name)} already exists. Overwrite?`});a.isCancel(p)&&(a.cancel("Operation cancelled."),process.exit(0)),p||s.add(t.name)}}if(s.size===i.length){a.log.warn("All files were skipped. No changes were made.");return}let o=[];for(let t of i){if(s.has(t.name))continue;let c=(0,D.join)(r,t.name),p=ee(t.content);await(0,C.writeFile)(c,p,{mode:t.mode}),o.push(t.name)}for(let t of o)a.log.success(`Created ${d.default.green(t)}`);a.note([`${d.default.bold("1.")} docker build -t your-username/my-automation-tests:latest .`,`${d.default.bold("2.")} docker push your-username/my-automation-tests:latest`,`${d.default.bold("3.")} Enter this image name in the AAC Dashboard.`].join(`
79
+ `),`${d.default.green("\u2705")} Next steps to connect your project to the AAC`)}var v=require("child_process"),M=require("fs/promises"),_=require("path"),n=P(require("@clack/prompts"),1),g=P(require("picocolors"),1);async function te(e){try{let r=await(0,M.readFile)((0,_.join)(e,"package.json"),"utf-8"),i=JSON.parse(r);return i.name?i.name.replace(/^@[^/]+\//,""):null}catch{return null}}async function q(e){let r=await n.confirm({message:"Do you have a Docker Hub account?"});if(n.isCancel(r)){n.cancel("Deployment cancelled.");return}r||(n.note(`Create a free account at ${g.default.cyan("https://hub.docker.com")}
80
+ Press Enter when you're ready to continue.`,g.default.yellow("Docker Hub Account Required")),await n.text({message:"Press Enter to continue...",defaultValue:"",placeholder:""}));let i=await n.text({message:"What is your Docker Hub username?",validate:u=>{if(!u.trim())return"Username is required."}});if(n.isCancel(i)){n.cancel("Deployment cancelled.");return}let s=await te(e),o;if(s){let u=await n.confirm({message:`Detected project name "${g.default.cyan(s)}". Use this for the image?`});if(n.isCancel(u)){n.cancel("Deployment cancelled.");return}if(u)o=s;else{let l=await n.text({message:"Enter the image name:",validate:w=>{if(!w.trim())return"Image name is required."}});if(n.isCancel(l)){n.cancel("Deployment cancelled.");return}o=l.trim()}}else{let u=await n.text({message:"Enter the image name:",validate:l=>{if(!l.trim())return"Image name is required."}});if(n.isCancel(u)){n.cancel("Deployment cancelled.");return}o=u.trim()}let t=`${i.trim()}/${o}:latest`,c=await n.confirm({message:"I need to log you into Docker. Send a login request?"});if(n.isCancel(c)){n.cancel("Deployment cancelled.");return}if(c){n.log.step("Opening Docker login...");try{(0,v.execSync)("docker login",{stdio:"inherit",cwd:e}),n.log.success("Docker login successful.")}catch{n.log.error("Docker login failed. Please try again manually.");return}}let p=await n.confirm({message:`Build multi-platform image ${g.default.cyan(t)} and push to Docker Hub?`});if(n.isCancel(p)||!p){n.log.warn("Build skipped."),n.note([`${g.default.bold("1.")} docker buildx create --name aac-builder --use`,`${g.default.bold("2.")} docker buildx build --platform linux/amd64,linux/arm64 -t ${t} --push .`].join(`
81
+ `),"You can build manually later");return}let y=n.spinner();try{y.start("Setting up Docker Buildx builder..."),(0,v.execSync)("docker buildx create --name aac-builder --use",{stdio:"pipe",cwd:e}),y.stop("Buildx builder ready.")}catch{y.stop("Using existing Buildx builder.")}n.log.step(`Building & pushing ${g.default.cyan(t)}...`);try{(0,v.execSync)(`docker buildx build --platform linux/amd64,linux/arm64 -t ${t} --push .`,{stdio:"inherit",cwd:e}),n.log.success(`Image ${g.default.green(t)} pushed successfully!`),n.note(`Go to the ${g.default.bold("AAC Dashboard")} and enter:
82
+ ${g.default.cyan(t)}`,g.default.green("\u2705 Deployment Complete"))}catch{n.log.error("Docker build failed. Check the output above for details.")}}var E=new Y.Command;E.name("aac-cli").description("Agnostic Automation Center CLI \u2014 Prepare any test automation repo for the AAC platform").version("1.1.0");E.command("init").description("Generate AAC integration files and optionally build & push your Docker image").action(async()=>{m.intro(A.default.bgCyan(A.default.black(" AAC CLI ")));let e=await m.select({message:"Select your automation project framework:",options:[{value:"playwright",label:"Playwright (TypeScript/Node.js)"},{value:"pytest",label:"Pytest (Python)"}]});m.isCancel(e)&&(m.cancel("Operation cancelled."),process.exit(0));let r=m.spinner();r.start("Generating AAC integration files..."),await new Promise(o=>setTimeout(o,300)),r.stop("Files ready.");let i=process.cwd();await T(e,i);let s=await m.confirm({message:"Do you want to build and push the image to Docker Hub right now?"});m.isCancel(s)&&(m.cancel("Operation cancelled."),process.exit(0)),s&&await q(i),m.outro(A.default.green("Done!")+" "+A.default.dim("Run `aac-cli init` again anytime."))});E.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keinar/aac-cli",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "Agnostic Automation Center CLI — Prepare any test automation repo for the AAC platform",
5
5
  "author": "keinar",
6
6
  "license": "MIT",