aso-cli 0.1.0 → 0.2.2

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.
package/README.md CHANGED
@@ -1,13 +1,15 @@
1
- # App Store Optimization CLI
1
+ <h1 align="center">App Store Optimization CLI</h1>
2
2
 
3
- [![npm version](https://img.shields.io/npm/v/aso-cli)](https://www.npmjs.com/package/aso-cli)
4
- [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)
5
- [![Node.js](https://img.shields.io/node/v/aso-cli)](https://www.npmjs.com/package/aso-cli)
6
- [![CI](https://img.shields.io/github/actions/workflow/status/semihcihan/App-Store-Optimization-CLI/ci.yml?branch=main&label=ci)](https://github.com/semihcihan/App-Store-Optimization-CLI/actions/workflows/ci.yml)
3
+ <p align="center">
4
+ <a href="https://www.npmjs.com/package/aso-cli"><img src="https://img.shields.io/npm/v/aso-cli" alt="npm version" /></a>
5
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License: MIT" /></a>
6
+ <a href="https://www.npmjs.com/package/aso-cli"><img src="https://img.shields.io/node/v/aso-cli" alt="Node.js" /></a>
7
+ <a href="https://github.com/semihcihan/App-Store-Optimization-CLI/actions/workflows/ci.yml"><img src="https://github.com/semihcihan/App-Store-Optimization-CLI/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI" /></a>
8
+ </p>
7
9
 
8
10
  Research ASO keywords, inspect competition, and manage results from one local-first CLI.
9
11
 
10
- ## Why use it
12
+ ## What Is It?
11
13
 
12
14
  - Fast, free keyword research and visibility tracking
13
15
  - Keyword scoring with popularity + difficulty in one command
package/cli/dist/cli.js CHANGED
@@ -240,7 +240,7 @@ ${s}`;break;case"retry":LAe(s)&&(r[i]=s);break;case"id":UAe(s)&&(r[i]=s);break;c
240
240
  `).slice(1).join(`
241
241
  `);e.stack=r?`${r}
242
242
  ${s}`:i.stack}z.exports.fetch=function(t,r=void 0){return Ift(t,r).catch(n=>{throw XAe?ece(n,XAe):n&&typeof n=="object"&&Error.captureStackTrace(n,z.exports.fetch),n})};z.exports.Headers=_a().Headers;z.exports.Response=dh().Response;z.exports.Request=P0().Request;z.exports.FormData=PC().FormData;var{setGlobalOrigin:yft,getGlobalOrigin:Bft}=QT();z.exports.setGlobalOrigin=yft;z.exports.getGlobalOrigin=Bft;var{CacheStorage:Dft}=Mae(),{kConstruct:xft}=We();z.exports.caches=new Dft(xft);var{deleteCookie:Qft,getCookies:wft,getSetCookies:Sft,setCookie:vft,parseCookie:_ft}=Jae();z.exports.deleteCookie=Qft;z.exports.getCookies=wft;z.exports.getSetCookies=Sft;z.exports.setCookie=vft;z.exports.parseCookie=_ft;var{parseMIMEType:Tft,serializeAMimeType:Fft}=Qn();z.exports.parseMIMEType=Tft;z.exports.serializeAMimeType=Fft;var{CloseEvent:Rft,ErrorEvent:Nft,MessageEvent:Mft}=iy(),{WebSocket:Oft,ping:kft}=wAe();z.exports.WebSocket=Oft;z.exports.CloseEvent=Rft;z.exports.ErrorEvent=Nft;z.exports.MessageEvent=Mft;z.exports.ping=kft;z.exports.WebSocketStream=MAe().WebSocketStream;z.exports.WebSocketError=UF().WebSocketError;z.exports.request=Dh(Z0.request);z.exports.stream=Dh(Z0.stream);z.exports.pipeline=Dh(Z0.pipeline);z.exports.connect=Dh(Z0.connect);z.exports.upgrade=Dh(Z0.upgrade);z.exports.MockClient=Aft;z.exports.MockCallHistory=cft;z.exports.MockCallHistoryLog=lft;z.exports.MockPool=dft;z.exports.MockAgent=fft;z.exports.SnapshotAgent=hft;z.exports.mockErrors=gft;var{EventSource:Lft}=KAe();z.exports.EventSource=Lft;function Uft(){globalThis.fetch=z.exports.fetch,globalThis.Headers=z.exports.Headers,globalThis.Response=z.exports.Response,globalThis.Request=z.exports.Request,globalThis.FormData=z.exports.FormData,globalThis.WebSocket=z.exports.WebSocket,globalThis.CloseEvent=z.exports.CloseEvent,globalThis.ErrorEvent=z.exports.ErrorEvent,globalThis.MessageEvent=z.exports.MessageEvent,globalThis.EventSource=z.exports.EventSource}z.exports.install=Uft});var xh=f(gu=>{"use strict";gu.removeLeadingAndTrailingHTTPWhitespace=e=>e.replace(/^[ \t\n\r]+/u,"").replace(/[ \t\n\r]+$/u,"");gu.removeTrailingHTTPWhitespace=e=>e.replace(/[ \t\n\r]+$/u,"");gu.isHTTPWhitespaceChar=e=>e===" "||e===" "||e===`
243
- `||e==="\r";gu.solelyContainsHTTPTokenCodePoints=e=>/^[-!#$%&'*+.^_`|~A-Za-z0-9]*$/u.test(e);gu.soleyContainsHTTPQuotedStringTokenCodePoints=e=>/^[\t\u0020-\u007E\u0080-\u00FF]*$/u.test(e);gu.asciiLowercase=e=>e.replace(/[A-Z]/ug,t=>t.toLowerCase());gu.collectAnHTTPQuotedString=(e,t)=>{let r="";for(t++;;){for(;t<e.length&&e[t]!=='"'&&e[t]!=="\\";)r+=e[t],++t;if(t>=e.length)break;let n=e[t];if(++t,n==="\\"){if(t>=e.length){r+="\\";break}r+=e[t],++t}else break}return[r,t]}});var nce=f((G3t,rce)=>{"use strict";var{asciiLowercase:my,solelyContainsHTTPTokenCodePoints:Pft,soleyContainsHTTPQuotedStringTokenCodePoints:qft}=xh();rce.exports=class{constructor(t){this._map=t}get size(){return this._map.size}get(t){return t=my(String(t)),this._map.get(t)}has(t){return t=my(String(t)),this._map.has(t)}set(t,r){if(t=my(String(t)),r=String(r),!Pft(t))throw new Error(`Invalid MIME type parameter name "${t}": only HTTP token code points are valid.`);if(!qft(r))throw new Error(`Invalid MIME type parameter value "${r}": only HTTP quoted-string token code points are valid.`);return this._map.set(t,r)}clear(){this._map.clear()}delete(t){return t=my(String(t)),this._map.delete(t)}forEach(t,r){this._map.forEach(t,r)}keys(){return this._map.keys()}values(){return this._map.values()}entries(){return this._map.entries()}[Symbol.iterator](){return this._map[Symbol.iterator]()}}});var oce=f((V3t,sce)=>{"use strict";var{removeLeadingAndTrailingHTTPWhitespace:Hft,removeTrailingHTTPWhitespace:ice,isHTTPWhitespaceChar:Yft,solelyContainsHTTPTokenCodePoints:VF,soleyContainsHTTPQuotedStringTokenCodePoints:Gft,asciiLowercase:WF,collectAnHTTPQuotedString:Vft}=xh();sce.exports=e=>{e=Hft(e);let t=0,r="";for(;t<e.length&&e[t]!=="/";)r+=e[t],++t;if(r.length===0||!VF(r)||t>=e.length)return null;++t;let n="";for(;t<e.length&&e[t]!==";";)n+=e[t],++t;if(n=ice(n),n.length===0||!VF(n))return null;let i={type:WF(r),subtype:WF(n),parameters:new Map};for(;t<e.length;){for(++t;Yft(e[t]);)++t;let s="";for(;t<e.length&&e[t]!==";"&&e[t]!=="=";)s+=e[t],++t;if(s=WF(s),t<e.length){if(e[t]===";")continue;++t}let o=null;if(e[t]==='"')for([o,t]=Vft(e,t);t<e.length&&e[t]!==";";)++t;else{for(o="";t<e.length&&e[t]!==";";)o+=e[t],++t;if(o=ice(o),o==="")continue}s.length>0&&VF(s)&&Gft(o)&&!i.parameters.has(s)&&i.parameters.set(s,o)}return i}});var ace=f((W3t,uce)=>{"use strict";var{solelyContainsHTTPTokenCodePoints:Wft}=xh();uce.exports=e=>{let t=`${e.type}/${e.subtype}`;if(e.parameters.size===0)return t;for(let[r,n]of e.parameters)t+=";",t+=r,t+="=",(!Wft(n)||n.length===0)&&(n=n.replace(/(["\\])/ug,"\\$1"),n=`"${n}"`),t+=n;return t}});var fce=f((J3t,lce)=>{"use strict";var jft=nce(),Jft=oce(),Kft=ace(),{asciiLowercase:Ace,solelyContainsHTTPTokenCodePoints:cce}=xh();lce.exports=class{constructor(t){t=String(t);let r=Jft(t);if(r===null)throw new Error(`Could not parse MIME type string "${t}"`);this._type=r.type,this._subtype=r.subtype,this._parameters=new jft(r.parameters)}static parse(t){try{return new this(t)}catch{return null}}get essence(){return`${this.type}/${this.subtype}`}get type(){return this._type}set type(t){if(t=Ace(String(t)),t.length===0)throw new Error("Invalid type: must be a non-empty string");if(!cce(t))throw new Error(`Invalid type ${t}: must contain only HTTP token code points`);this._type=t}get subtype(){return this._subtype}set subtype(t){if(t=Ace(String(t)),t.length===0)throw new Error("Invalid subtype: must be a non-empty string");if(!cce(t))throw new Error(`Invalid subtype ${t}: must contain only HTTP token code points`);this._subtype=t}get parameters(){return this._parameters}toString(){return Kft(this)}isJavaScript({prohibitParameters:t=!1}={}){switch(this._type){case"text":switch(this._subtype){case"ecmascript":case"javascript":case"javascript1.0":case"javascript1.1":case"javascript1.2":case"javascript1.3":case"javascript1.4":case"javascript1.5":case"jscript":case"livescript":case"x-ecmascript":case"x-javascript":return!t||this._parameters.size===0;default:return!1}case"application":switch(this._subtype){case"ecmascript":case"javascript":case"x-ecmascript":case"x-javascript":return!t||this._parameters.size===0;default:return!1}default:return!1}}isXML(){return this._subtype==="xml"&&(this._type==="text"||this._type==="application")||this._subtype.endsWith("+xml")}isHTML(){return this._subtype==="html"&&this._type==="text"}}});var Ky=ne(require("dotenv")),PR=ne(require("path"));process.env.DOTENV_CONFIG_SILENT="true";Ky.default.config();Ky.default.config({path:PR.default.resolve(__dirname,"../../.env")});var HR="0.1.0";var Hh={name:"aso-cli",version:HR,description:"Local App Store Optimization CLI",main:"cli/dist/cli.js",bin:{aso:"cli/dist/cli.js","aso-mcp":"cli/dist/mcp.js"},scripts:{prebuild:"npm run generate-mcp-content",predev:"npm run generate-mcp-content",pretypecheck:"npm run generate-mcp-content","generate-mcp-content":"node cli/mcp/generate-mcp-content.js",build:"node esbuild.config.js","build:watch":"node esbuild.config.js --watch",watch:"npm run build:watch","dashboard:build":"vite build --config cli/dashboard-ui/vite.config.ts","dashboard:watch":"vite build --watch --config cli/dashboard-ui/vite.config.ts",dev:'concurrently -k -n watch,app "npm:watch" "npm:start:dev"',clean:"rm -rf cli/dist",nuke:"rm -rf node_modules cli/dist package-lock.json",start:"node cli/dist/cli.js","start:dev":"NODE_ENV=development node cli/dist/cli.js",mcp:"node cli/dist/mcp.js","mcp:test":"npx @modelcontextprotocol/inspector node cli/dist/mcp.js",test:"jest --config jest.config.js","test:coverage":"jest --config jest.config.js --coverage",typecheck:"tsc -p tsconfig.json --noEmit && tsc -p cli/dashboard-ui/tsconfig.json --noEmit",ci:"npm run typecheck && npm run test -- --watchman=false && npm run build","upload-sourcemap":"npx bugsnag-source-maps upload-node --api-key ed1a4165d4f8fd836bf16f3ca1915a67 --overwrite --detect-app-version --bundle cli/dist/cli.js --source-map cli/dist/cli.js.map",prepublishOnly:"npm run build"},keywords:["aso","cli","app-store","keyword-research","app-store-optimization","mcp"],repository:{type:"git",url:"git+https://github.com/semihcihan/App-Store-Optimization-CLI.git"},contributors:[{name:"Semih Cihan",url:"https://github.com/semihcihan"}],license:"MIT",engines:{node:">=18.0.0",npm:">=8.0.0"},homepage:"https://github.com/semihcihan/App-Store-Optimization-CLI",files:["cli/dist/","README.md","THIRD_PARTY_LICENSES.md"],dependencies:{"@bugsnag/js":"^8.6.0","@modelcontextprotocol/sdk":"^1.0.0",axios:"^1.10.0","axios-retry":"^4.5.0","better-sqlite3":"^11.10.0",cheerio:"^1.2.0",dotenv:"^16.6.1",inquirer:"^8.2.5",ora:"^8.2.0",winston:"^3.17.0",yargs:"^17.7.2",zod:"4.1.9","zod-validation-error":"^4.0.2"},devDependencies:{"@bugsnag/cli":"^3.4.1","@bugsnag/source-maps":"^2.3.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@types/better-sqlite3":"^7.6.12","@types/inquirer":"^9.0.9","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/react":"^19.1.12","@types/react-dom":"^19.1.9","@types/yargs":"^17.0.33","@vitejs/plugin-react":"^5.1.0","axios-mock-adapter":"^2.1.0",concurrently:"^9.2.1",esbuild:"^0.27.3",jest:"^30.0.4","jest-environment-jsdom":"^30.2.0",prettier:"^3.0.0",react:"^19.1.1","react-dom":"^19.1.1","ts-jest":"^29.4.0",typescript:"^5.8.3",vite:"^7.1.4",yaml:"^2.8.2"}};var oB=ne(fN()),sfe="ed1a4165d4f8fd836bf16f3ca1915a67",iB=!1,sB=!1,ofe=["error","manual"];function ufe(e){if(e instanceof Error)return e;if(typeof e=="string")return new Error(e);try{return new Error(JSON.stringify(e))}catch{return new Error(String(e))}}function dN(e){iB||(sB=e.isDevelopment,!sB&&(oB.default.start({apiKey:sfe,autoTrackSessions:!1,appVersion:e.appVersion,logger:null,enabledBreadcrumbTypes:e.enabledBreadcrumbTypes??ofe}),iB=!0))}function hN(e,t={},r){!iB||sB||oB.default.notify(ufe(e),n=>{n.addMetadata("metadata",t),r&&r(n)})}var afe=process.env.NODE_ENV=="development";dN({isDevelopment:afe,appVersion:HR});var p0e=ne(require("yargs")),E0e=require("yargs/helpers");var os=ne(qk()),Gk=ne(require("util")),Kg=require("zod-validation-error"),Q1e=["debug","info","warn","error"],LD="info",Jg={RESET:"\x1B[0m",GREEN:"\x1B[32m",YELLOW:"\x1B[33m",RED:"\x1B[31m"},w1e={debug:{prefix:"d"},info:{prefix:"i",color:Jg.GREEN},warn:{prefix:"warn",color:Jg.YELLOW},error:{prefix:"error",color:Jg.RED}},S1e=(e,t)=>{let r=w1e[e];if(!r)return{visible:`${e}:`,formatted:`${e}:`};let{prefix:n,color:i}=r,s=t&&i?`${i}${n}${Jg.RESET}`:n;return{visible:n,formatted:s}},Vk=e=>e[Symbol.for("splat")]||[],v1e=e=>typeof e!="object"||e===null||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype?!1:Object.keys(e).length===0,_1e=(e,t,r)=>{if(e===void 0)return;let n=us(e,t,r);if(n!==void 0&&!(typeof n=="object"&&n!==null&&Object.keys(n).length===0))return n},T1e=(e,t,r)=>{let n={message:(0,Kg.isZodErrorLike)(e)?(0,Kg.fromError)(e).message:e.message};if(t&&e.stack&&(n.stack=e.stack),Object.keys(e).forEach(i=>{if(i==="name"||i==="message"||i==="stack")return;let s=e[i];s!==void 0&&(n[i]=us(s,t,r))}),n.context!==void 0){let i=_1e(n.context,t,r);i!==void 0?n.context=i:delete n.context}return n},us=(e,t,r=new WeakSet)=>{if(e==null||typeof e!="object")return e;if(r.has(e))return"[Circular]";if(r.add(e),e instanceof Error)return T1e(e,t,r);if(Array.isArray(e))return e.map(s=>us(s,t,r));let n=Object.entries(e);if(n.length===0)return e;let i={};for(let[s,o]of n)i[s]=us(o,t,r);return i},Hk=(e,t,r)=>{try{if(typeof e=="string")return e;let n=us(e,t);return r&&typeof n=="object"&&n!==null&&"message"in n&&(delete n.message,v1e(n))?"":Gk.default.inspect(n,{colors:!1,depth:null,compact:!1,maxArrayLength:null,maxStringLength:null,customInspect:!0})}catch{return String(e)}},F1e=(e,t,r,n,i,s)=>{let{visible:o,formatted:u}=S1e(e,!i),a=" ".repeat(o.length+1),A=Hk(t,n,!1),c=Vk(r),d="";c.length>0&&(d=`
243
+ `||e==="\r";gu.solelyContainsHTTPTokenCodePoints=e=>/^[-!#$%&'*+.^_`|~A-Za-z0-9]*$/u.test(e);gu.soleyContainsHTTPQuotedStringTokenCodePoints=e=>/^[\t\u0020-\u007E\u0080-\u00FF]*$/u.test(e);gu.asciiLowercase=e=>e.replace(/[A-Z]/ug,t=>t.toLowerCase());gu.collectAnHTTPQuotedString=(e,t)=>{let r="";for(t++;;){for(;t<e.length&&e[t]!=='"'&&e[t]!=="\\";)r+=e[t],++t;if(t>=e.length)break;let n=e[t];if(++t,n==="\\"){if(t>=e.length){r+="\\";break}r+=e[t],++t}else break}return[r,t]}});var nce=f((G3t,rce)=>{"use strict";var{asciiLowercase:my,solelyContainsHTTPTokenCodePoints:Pft,soleyContainsHTTPQuotedStringTokenCodePoints:qft}=xh();rce.exports=class{constructor(t){this._map=t}get size(){return this._map.size}get(t){return t=my(String(t)),this._map.get(t)}has(t){return t=my(String(t)),this._map.has(t)}set(t,r){if(t=my(String(t)),r=String(r),!Pft(t))throw new Error(`Invalid MIME type parameter name "${t}": only HTTP token code points are valid.`);if(!qft(r))throw new Error(`Invalid MIME type parameter value "${r}": only HTTP quoted-string token code points are valid.`);return this._map.set(t,r)}clear(){this._map.clear()}delete(t){return t=my(String(t)),this._map.delete(t)}forEach(t,r){this._map.forEach(t,r)}keys(){return this._map.keys()}values(){return this._map.values()}entries(){return this._map.entries()}[Symbol.iterator](){return this._map[Symbol.iterator]()}}});var oce=f((V3t,sce)=>{"use strict";var{removeLeadingAndTrailingHTTPWhitespace:Hft,removeTrailingHTTPWhitespace:ice,isHTTPWhitespaceChar:Yft,solelyContainsHTTPTokenCodePoints:VF,soleyContainsHTTPQuotedStringTokenCodePoints:Gft,asciiLowercase:WF,collectAnHTTPQuotedString:Vft}=xh();sce.exports=e=>{e=Hft(e);let t=0,r="";for(;t<e.length&&e[t]!=="/";)r+=e[t],++t;if(r.length===0||!VF(r)||t>=e.length)return null;++t;let n="";for(;t<e.length&&e[t]!==";";)n+=e[t],++t;if(n=ice(n),n.length===0||!VF(n))return null;let i={type:WF(r),subtype:WF(n),parameters:new Map};for(;t<e.length;){for(++t;Yft(e[t]);)++t;let s="";for(;t<e.length&&e[t]!==";"&&e[t]!=="=";)s+=e[t],++t;if(s=WF(s),t<e.length){if(e[t]===";")continue;++t}let o=null;if(e[t]==='"')for([o,t]=Vft(e,t);t<e.length&&e[t]!==";";)++t;else{for(o="";t<e.length&&e[t]!==";";)o+=e[t],++t;if(o=ice(o),o==="")continue}s.length>0&&VF(s)&&Gft(o)&&!i.parameters.has(s)&&i.parameters.set(s,o)}return i}});var ace=f((W3t,uce)=>{"use strict";var{solelyContainsHTTPTokenCodePoints:Wft}=xh();uce.exports=e=>{let t=`${e.type}/${e.subtype}`;if(e.parameters.size===0)return t;for(let[r,n]of e.parameters)t+=";",t+=r,t+="=",(!Wft(n)||n.length===0)&&(n=n.replace(/(["\\])/ug,"\\$1"),n=`"${n}"`),t+=n;return t}});var fce=f((J3t,lce)=>{"use strict";var jft=nce(),Jft=oce(),Kft=ace(),{asciiLowercase:Ace,solelyContainsHTTPTokenCodePoints:cce}=xh();lce.exports=class{constructor(t){t=String(t);let r=Jft(t);if(r===null)throw new Error(`Could not parse MIME type string "${t}"`);this._type=r.type,this._subtype=r.subtype,this._parameters=new jft(r.parameters)}static parse(t){try{return new this(t)}catch{return null}}get essence(){return`${this.type}/${this.subtype}`}get type(){return this._type}set type(t){if(t=Ace(String(t)),t.length===0)throw new Error("Invalid type: must be a non-empty string");if(!cce(t))throw new Error(`Invalid type ${t}: must contain only HTTP token code points`);this._type=t}get subtype(){return this._subtype}set subtype(t){if(t=Ace(String(t)),t.length===0)throw new Error("Invalid subtype: must be a non-empty string");if(!cce(t))throw new Error(`Invalid subtype ${t}: must contain only HTTP token code points`);this._subtype=t}get parameters(){return this._parameters}toString(){return Kft(this)}isJavaScript({prohibitParameters:t=!1}={}){switch(this._type){case"text":switch(this._subtype){case"ecmascript":case"javascript":case"javascript1.0":case"javascript1.1":case"javascript1.2":case"javascript1.3":case"javascript1.4":case"javascript1.5":case"jscript":case"livescript":case"x-ecmascript":case"x-javascript":return!t||this._parameters.size===0;default:return!1}case"application":switch(this._subtype){case"ecmascript":case"javascript":case"x-ecmascript":case"x-javascript":return!t||this._parameters.size===0;default:return!1}default:return!1}}isXML(){return this._subtype==="xml"&&(this._type==="text"||this._type==="application")||this._subtype.endsWith("+xml")}isHTML(){return this._subtype==="html"&&this._type==="text"}}});var Ky=ne(require("dotenv")),PR=ne(require("path"));process.env.DOTENV_CONFIG_SILENT="true";Ky.default.config();Ky.default.config({path:PR.default.resolve(__dirname,"../../.env")});var HR="0.2.2";var Hh={name:"aso-cli",version:HR,description:"Local App Store Optimization CLI",main:"cli/dist/cli.js",bin:{aso:"cli/dist/cli.js","aso-mcp":"cli/dist/mcp.js"},scripts:{prebuild:"npm run generate-mcp-content",predev:"npm run generate-mcp-content",pretypecheck:"npm run generate-mcp-content","generate-mcp-content":"node cli/mcp/generate-mcp-content.js",build:"node esbuild.config.js","build:watch":"node esbuild.config.js --watch",watch:"npm run build:watch","dashboard:build":"vite build --config cli/dashboard-ui/vite.config.ts","dashboard:watch":"vite build --watch --config cli/dashboard-ui/vite.config.ts",dev:'concurrently -k -n watch,app "npm:watch" "npm:start:dev"',clean:"rm -rf cli/dist",nuke:"rm -rf node_modules cli/dist package-lock.json",start:"node cli/dist/cli.js","start:dev":"NODE_ENV=development node cli/dist/cli.js",mcp:"node cli/dist/mcp.js","mcp:test":"npx @modelcontextprotocol/inspector node cli/dist/mcp.js",test:"jest --config jest.config.js","test:coverage":"jest --config jest.config.js --coverage",typecheck:"tsc -p tsconfig.json --noEmit && tsc -p cli/dashboard-ui/tsconfig.json --noEmit",ci:"npm run typecheck && npm run test -- --watchman=false && npm run build","upload-sourcemap":"npx bugsnag-source-maps upload-node --api-key ed1a4165d4f8fd836bf16f3ca1915a67 --overwrite --detect-app-version --bundle cli/dist/cli.js --source-map cli/dist/cli.js.map",prepublishOnly:"npm run build"},keywords:["aso","cli","app-store","keyword-research","app-store-optimization","mcp"],repository:{type:"git",url:"git+https://github.com/semihcihan/App-Store-Optimization-CLI.git"},contributors:[{name:"Semih Cihan",url:"https://github.com/semihcihan"}],license:"MIT",engines:{node:">=18.0.0",npm:">=8.0.0"},homepage:"https://github.com/semihcihan/App-Store-Optimization-CLI",files:["cli/dist/","README.md","THIRD_PARTY_LICENSES.md"],dependencies:{"@bugsnag/js":"^8.6.0","@modelcontextprotocol/sdk":"^1.0.0",axios:"^1.10.0","axios-retry":"^4.5.0","better-sqlite3":"^11.10.0",cheerio:"^1.2.0",dotenv:"^16.6.1",inquirer:"^8.2.5",ora:"^8.2.0",winston:"^3.17.0",yargs:"^17.7.2",zod:"4.1.9","zod-validation-error":"^4.0.2"},devDependencies:{"@bugsnag/cli":"^3.4.1","@bugsnag/source-maps":"^2.3.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@types/better-sqlite3":"^7.6.12","@types/inquirer":"^9.0.9","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/react":"^19.1.12","@types/react-dom":"^19.1.9","@types/yargs":"^17.0.33","@vitejs/plugin-react":"^5.1.0","axios-mock-adapter":"^2.1.0",concurrently:"^9.2.1",esbuild:"^0.27.3",jest:"^30.0.4","jest-environment-jsdom":"^30.2.0",prettier:"^3.0.0",react:"^19.1.1","react-dom":"^19.1.1","ts-jest":"^29.4.0",typescript:"^5.8.3",vite:"^7.1.4",yaml:"^2.8.2"}};var oB=ne(fN()),sfe="ed1a4165d4f8fd836bf16f3ca1915a67",iB=!1,sB=!1,ofe=["error","manual"];function ufe(e){if(e instanceof Error)return e;if(typeof e=="string")return new Error(e);try{return new Error(JSON.stringify(e))}catch{return new Error(String(e))}}function dN(e){iB||(sB=e.isDevelopment,!sB&&(oB.default.start({apiKey:sfe,autoTrackSessions:!1,appVersion:e.appVersion,logger:null,enabledBreadcrumbTypes:e.enabledBreadcrumbTypes??ofe}),iB=!0))}function hN(e,t={},r){!iB||sB||oB.default.notify(ufe(e),n=>{n.addMetadata("metadata",t),r&&r(n)})}var afe=process.env.NODE_ENV=="development";dN({isDevelopment:afe,appVersion:HR});var p0e=ne(require("yargs")),E0e=require("yargs/helpers");var os=ne(qk()),Gk=ne(require("util")),Kg=require("zod-validation-error"),Q1e=["debug","info","warn","error"],LD="info",Jg={RESET:"\x1B[0m",GREEN:"\x1B[32m",YELLOW:"\x1B[33m",RED:"\x1B[31m"},w1e={debug:{prefix:"d"},info:{prefix:"i",color:Jg.GREEN},warn:{prefix:"warn",color:Jg.YELLOW},error:{prefix:"error",color:Jg.RED}},S1e=(e,t)=>{let r=w1e[e];if(!r)return{visible:`${e}:`,formatted:`${e}:`};let{prefix:n,color:i}=r,s=t&&i?`${i}${n}${Jg.RESET}`:n;return{visible:n,formatted:s}},Vk=e=>e[Symbol.for("splat")]||[],v1e=e=>typeof e!="object"||e===null||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype?!1:Object.keys(e).length===0,_1e=(e,t,r)=>{if(e===void 0)return;let n=us(e,t,r);if(n!==void 0&&!(typeof n=="object"&&n!==null&&Object.keys(n).length===0))return n},T1e=(e,t,r)=>{let n={message:(0,Kg.isZodErrorLike)(e)?(0,Kg.fromError)(e).message:e.message};if(t&&e.stack&&(n.stack=e.stack),Object.keys(e).forEach(i=>{if(i==="name"||i==="message"||i==="stack")return;let s=e[i];s!==void 0&&(n[i]=us(s,t,r))}),n.context!==void 0){let i=_1e(n.context,t,r);i!==void 0?n.context=i:delete n.context}return n},us=(e,t,r=new WeakSet)=>{if(e==null||typeof e!="object")return e;if(r.has(e))return"[Circular]";if(r.add(e),e instanceof Error)return T1e(e,t,r);if(Array.isArray(e))return e.map(s=>us(s,t,r));let n=Object.entries(e);if(n.length===0)return e;let i={};for(let[s,o]of n)i[s]=us(o,t,r);return i},Hk=(e,t,r)=>{try{if(typeof e=="string")return e;let n=us(e,t);return r&&typeof n=="object"&&n!==null&&"message"in n&&(delete n.message,v1e(n))?"":Gk.default.inspect(n,{colors:!1,depth:null,compact:!1,maxArrayLength:null,maxStringLength:null,customInspect:!0})}catch{return String(e)}},F1e=(e,t,r,n,i,s)=>{let{visible:o,formatted:u}=S1e(e,!i),a=" ".repeat(o.length+1),A=Hk(t,n,!1),c=Vk(r),d="";c.length>0&&(d=`
244
244
  ${c.map((m,w)=>Hk(m,n,w===0)).join(`
245
245
  `)}`);let h=A+d,p=String(h).replace(/\n/g,`
246
246
  ${a}`);return i&&s?`${s} [${e.toUpperCase()}] ${p}`:`${u} ${p}