{"_id":"@armcompany/armfly","_rev":"7-a955b2f34a019768de00e9d1a01912e2","name":"@armcompany/armfly","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@armcompany/armfly","version":"0.1.0","keywords":["app-store","google-play","release","deployment","cli"],"_id":"@armcompany/armfly@0.1.0","maintainers":[{"name":"armcompany","email":"dev@armbuilds.com"}],"homepage":"https://github.com/armcompany/storefly#readme","bugs":{"url":"https://github.com/armcompany/storefly/issues"},"bin":{"armfly":"dist/index.js"},"dist":{"shasum":"059035bf660d4c6b6212c20ebb55ffccb0b176de","tarball":"https://registry.npmjs.org/@armcompany/armfly/-/armfly-0.1.0.tgz","fileCount":6,"integrity":"sha512-nQuPaWimXtc9VCvipBroOu68O59hkJ5mmOsR1aqBe2AdwC+MVpJETvjFMAmaVNXAWHYR9sBfm4oyXvi3bwaDSw==","signatures":[{"sig":"MEUCIELis+HMp6F5e9lXpSe/ttMat4cvy5MfeB28fBoLaQ8LAiEAj4wJtVKkrEFkRinTMXIGsl/y6lx9QLIQkGlMSqs4zmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57587},"type":"module","engines":{"node":">=18.17"},"gitHead":"0dc8890334dff9c27fd3ddef2e863c01b1ce3eb5","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsc","prepack":"npm run build"},"_npmUser":{"name":"armcompany","email":"dev@armbuilds.com"},"deprecated":"Use 0.1.1 or newer; 0.1.0 was published without the armfly binary.","repository":{"url":"git+https://github.com/armcompany/storefly.git","type":"git","directory":"apps/cli"},"_npmVersion":"11.12.1","description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","directories":{},"_nodeVersion":"25.9.0","dependencies":{"commander":"^12.1.0","@armcompany/armfly-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/armfly_0.1.0_1784832476890_0.8584330714143076","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@armcompany/armfly","version":"0.1.1","keywords":["app-store","google-play","release","deployment","cli"],"_id":"@armcompany/armfly@0.1.1","maintainers":[{"name":"armcompany","email":"dev@armbuilds.com"}],"homepage":"https://github.com/armcompany/storefly#readme","bugs":{"url":"https://github.com/armcompany/storefly/issues"},"bin":{"armfly":"dist/index.js"},"dist":{"shasum":"761a51bb70396a222eb05f7e79a2bb50f86d7af7","tarball":"https://registry.npmjs.org/@armcompany/armfly/-/armfly-0.1.1.tgz","fileCount":6,"integrity":"sha512-6SrXd3R3zPQB5xS8QfQhXT2T5+MAXrhfTFhBnZyNX3j/i+hXsKMem7F0/veZRG2lkKmJCfJRhgNqKgWrG3PIhQ==","signatures":[{"sig":"MEUCIQDMmPgGQkgLDHZbZxEc84PReqDpmKu+flIYRmWfYrlHFgIgXAg+bZQYjbOPpkyCr9molKAmcdMi8b/Qf2gZwc77aPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57585},"type":"module","engines":{"node":">=18.17"},"gitHead":"0dc8890334dff9c27fd3ddef2e863c01b1ce3eb5","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsc","prepack":"npm run build"},"_npmUser":{"name":"armcompany","email":"dev@armbuilds.com"},"repository":{"url":"git+https://github.com/armcompany/storefly.git","type":"git","directory":"apps/cli"},"_npmVersion":"11.12.1","description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","directories":{},"_nodeVersion":"25.9.0","dependencies":{"commander":"^12.1.0","@armcompany/armfly-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/armfly_0.1.1_1784832552385_0.29807283855667954","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@armcompany/armfly","version":"0.1.2","keywords":["app-store","google-play","release","deployment","cli"],"_id":"@armcompany/armfly@0.1.2","maintainers":[{"name":"armdevelop","email":"dev@armbuilds.com"}],"homepage":"https://github.com/armcompany/armfly#readme","bugs":{"url":"https://github.com/armcompany/armfly/issues"},"bin":{"armfly":"dist/index.js"},"dist":{"shasum":"d1eb5d4641a3dc0fda18674d2f5da67e13f4b591","tarball":"https://registry.npmjs.org/@armcompany/armfly/-/armfly-0.1.2.tgz","fileCount":6,"integrity":"sha512-/aob46D98MDirq870VfURL+2lAUKhoophNu2nc930aq9BBu1nEASZnAKs3KEi2SMWFCERYBR6VKvrQ9PfJUjyg==","signatures":[{"sig":"MEUCIAhYdVRdBvD619R+DwNKIxdvvqeYBDt1WBYDnRlhxUyZAiEAhAuTUquxbST0Oz70DHpijVSKFxrFPJf0bGa6Kmztpz8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57579},"type":"module","engines":{"node":">=18.17"},"gitHead":"48a61e818a4fac449007af5af562655d76e91dd0","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsc","prepack":"npm run build"},"_npmUser":{"name":"armdevelop","email":"dev@armbuilds.com"},"repository":{"url":"git+https://github.com/armcompany/armfly.git","type":"git","directory":"apps/cli"},"_npmVersion":"11.18.0","description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","directories":{},"_nodeVersion":"20.19.4","dependencies":{"commander":"^12.1.0","@armcompany/armfly-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/armfly_0.1.2_1786495354373_0.2228660878158688","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@armcompany/armfly","version":"0.1.3","keywords":["app-store","google-play","release","deployment","cli"],"_id":"@armcompany/armfly@0.1.3","maintainers":[{"name":"armdevelop","email":"dev@armbuilds.com"}],"homepage":"https://github.com/armcompany/armfly#readme","bugs":{"url":"https://github.com/armcompany/armfly/issues"},"bin":{"armfly":"dist/index.js"},"dist":{"shasum":"739b06dfe41476d6b5b38ce9c2b3b8fde6a21540","tarball":"https://registry.npmjs.org/@armcompany/armfly/-/armfly-0.1.3.tgz","fileCount":6,"integrity":"sha512-r/lOvsttxvo8mrXa0R96KSksq9LjM9Zi5QSu5wM203UQKgpuipGLSApzfGmv3nfZ/9O8MPyKxdwdL0l0WK4Mpw==","signatures":[{"sig":"MEUCICXcr10+qorZxjETHkfGKtQrZ8TmnBMSxMu8X++3RWdsAiEAhF8rEizA6DyfNif5+o5I5UKWGf8qO/IBugibgB5KM0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57606},"type":"module","engines":{"node":">=18.17"},"gitHead":"c31e728226ff9f27f310e15ce0d2b7eeafa4ca26","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsc","prepack":"npm run build"},"_npmUser":{"name":"armdevelop","email":"dev@armbuilds.com"},"repository":{"url":"git+https://github.com/armcompany/armfly.git","type":"git","directory":"apps/cli"},"_npmVersion":"11.18.0","description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","directories":{},"_nodeVersion":"20.19.4","dependencies":{"commander":"^12.1.0","@armcompany/armfly-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/armfly_0.1.3_1786904995175_0.11847861143190652","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@armcompany/armfly","version":"0.1.4","description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","type":"module","bin":{"armfly":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/armcompany/armfly.git","directory":"apps/cli"},"homepage":"https://github.com/armcompany/armfly#readme","bugs":{"url":"https://github.com/armcompany/armfly/issues"},"keywords":["app-store","google-play","release","deployment","cli"],"publishConfig":{"access":"public"},"engines":{"node":">=18.17"},"scripts":{"build":"tsc","prepack":"npm run build","dev":"tsx src/index.ts","test":"vitest run","lint":"tsc --noEmit"},"dependencies":{"@armcompany/armfly-core":"^0.1.0","commander":"^12.1.0"},"gitHead":"39c129e5414c9581d347876490a7b65623082024","_id":"@armcompany/armfly@0.1.4","_nodeVersion":"20.19.4","_npmVersion":"11.18.0","dist":{"integrity":"sha512-waWbgLFgXKE5JP3NMQoJyiKFoTtJG+gvkHeF4osR9nvhPX61DTzKCryFSf3+Sdzzx3d3qvrw42+tAh0g/ygHmg==","shasum":"51f204a6e0fa91d1c270b23ed6ce0cd949ea7a09","tarball":"https://registry.npmjs.org/@armcompany/armfly/-/armfly-0.1.4.tgz","fileCount":6,"unpackedSize":57757,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICrySLfMasfEisL5hQVcIsUzXbTWIFvddcNUID/6nQVAAiEA80Mjo5Jd1PU98RUW2eGEhPBeSeoat76p/+aeFnQpqF8="}]},"_npmUser":{"name":"armdevelop","email":"dev@armbuilds.com"},"directories":{},"maintainers":[{"name":"armdevelop","email":"dev@armbuilds.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/armfly_0.1.4_1786905724135_0.9699540149979922"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T18:47:56.729Z","modified":"2026-08-16T18:42:04.449Z","0.1.0":"2026-07-23T18:47:57.035Z","0.1.1":"2026-07-23T18:49:12.516Z","0.1.2":"2026-08-12T00:42:34.504Z","0.1.3":"2026-08-16T18:29:55.323Z","0.1.4":"2026-08-16T18:42:04.286Z"},"bugs":{"url":"https://github.com/armcompany/armfly/issues"},"homepage":"https://github.com/armcompany/armfly#readme","keywords":["app-store","google-play","release","deployment","cli"],"repository":{"type":"git","url":"git+https://github.com/armcompany/armfly.git","directory":"apps/cli"},"description":"ARM FLY — zero-touch deploy CLI for App Store & Google Play","maintainers":[{"name":"armdevelop","email":"dev@armbuilds.com"}],"readme":"# `armfly` — zero-touch deploy CLI (ARM FLY)\n\nFull publishing pipeline with minimal human action: **3 commands on the first\ndeploy, 1 command on every deploy after that.**\n\n```\narmfly init      # once: generates armfly.yaml + .gitignore\narmfly analyze   # detects features from an artifact (IPA/APK/AAB) → marketing copy\narmfly translate # re-localizes metadata for every locale (ASO-aware)\narmfly review    # diagnoses a rejection and drafts a reply to the reviewer\narmfly assets    # generates store screenshots from raw screens (frame + headline)\narmfly video     # creates promo video (App Store preview / Reel / TikTok) — needs ffmpeg\narmfly doctor    # validates config, credentials and local tooling\narmfly deploy    # build → metadata (AI) → upload → submit (Apple + Google)\narmfly watch     # polls review until approved/rejected, with diagnosis on rejection\narmfly ui        # local web dashboard (edit metadata, run deploys, live logs)\narmfly batch ... # runs any command in batch over many projects (white label)\n```\n\n## Mass publishing / white label (`armfly batch`)\n\nRuns **any** ARM FLY command over several projects at once — the \"100 apps →\nupdate → publish in batch\" case:\n\n```yaml\n# armfly.workspace.yaml\nname: My Agency\nenv:                              # shared value, injected into every project\n  RELEASE_NOTES: \"Bug fixes and improvements\"\nprojects:\n  - clients/barberpro\n  - clients/petshop\n```\n\n```bash\narmfly batch translate                 # localize every app\narmfly batch deploy --stagger 5        # publish in batch, 5s between apps (rate-limit)\narmfly batch assets --concurrency 4    # generate screenshots in parallel\n```\n\nEach project runs in its own directory with its own `armfly.yaml`; the workspace\n`env:` becomes `${VAR}` inside every config (the white-label lever). Sequential\nby default (safe for the stores); use `--concurrency` for read-only commands.\n\n## Mockup Studio (`armfly assets`)\n\nTurns a raw app screenshot into a store-ready screenshot — device frame +\nmarketing headline — at the **exact size** each store requires:\n\n```yaml\nassets:\n  output: assets/generated\n  style: modern                  # clean | dark | modern | startup | luxury | enterprise\n  devices: [iphone_6_7, pixel]   # + iphone_6_5, ipad_13, galaxy, android_phone\n  screens:\n    - source: raw/home.png\n      headline: \"Book services in seconds\"\n      subheadline: \"More convenience for your customers\"\n      locales: [en-US]           # optional; default = metadata.locales\n```\n\n`armfly assets` renders `output/{locale}/{device}/NN.png` and **prints a\nready-to-paste `screenshots:` block** — which `armfly deploy` then uploads to the\nstores. Deterministic rendering via resvg; no device farm.\n\n## Web dashboard (`armfly ui`)\n\nServes a panel at `http://localhost:4321` (loopback only — credentials never\nleave your machine):\n\n- **Pipeline**: live status of every step (metadata, builds, publish) read from the journal\n- **Metadata per locale**: tabs per locale, fields with a character counter against store limits; edits are saved and become the source of truth for the next deploy\n- **Actions**: Generate metadata, Dry-run, Deploy, Deploy --fresh and Doctor with real-time logs\n\nFlags: `-p/--port` (default 4321), `-c` for an alternative config. On macOS it\nopens the browser automatically.\n\n## Installation\n\nFor use in an app project:\n\n```bash\nnpm install --global @armcompany/armfly\narmfly --help\n```\n\nOr run it without a global install:\n\n```bash\nnpx @armcompany/armfly --help\n```\n\nTo develop ARM FLY from the monorepo:\n\n```bash\nnpm install          # installs all workspaces\nnpm run build        # builds @armcompany/armfly-core, then the CLI\nnpm link -w armfly   # exposes the `armfly` binary globally\n```\n\n## The minimal flow\n\n```bash\ncd my-app\narmfly init                  # edit the armfly.yaml placeholders\narmfly doctor                # all green?\narmfly deploy --dry-run      # review the plan without touching the stores\narmfly deploy                # runs end to end\narmfly watch                 # optional: poll review, with hints on rejection\n```\n\nFailed midway? Run `armfly deploy` again — the journal in `.armfly/state.json`\nskips every step already completed (same fingerprint ⇒ skip). `--fresh` resets\nthe journal.\n\n## Credentials (the only unavoidable manual step)\n\n| Store | What to get | Where to put it |\n|---|---|---|\n| Apple | App Store Connect API Key (`.p8` + keyId + issuerId) — Users and Access → Integrations | `stores.apple` (use `${ENV_VAR}` in the yaml) |\n| Google | Service account JSON with Play Console access (\"Release manager\" role) | `stores.google.serviceAccountPath` |\n| AI (optional) | `OPENCODE_ZEN_API_KEY` (or `ANTHROPIC_API_KEY`) for AI-generated metadata | environment; without it, falls back to deterministic template copy |\n\n## Useful flags\n\n| Flag | Effect |\n|---|---|\n| `--dry-run` | prints the full plan with no side effects |\n| `--no-submit` | uploads build+metadata but does not submit for review |\n| `--platform ios\\|android` | limits to one side |\n| `--fresh` | ignores the journal and re-runs everything |\n| `-c other.yaml` | alternative config (multi-app in the same repo) |\n\n## What is real vs. known limitations\n\n**Real:** App Store Connect ES256 JWT; version + localizations + **title/subtitle\n(appInfoLocalizations)** + **promotional text / marketing copy** + **screenshot\nupload** (reservation → PUT → md5 confirmation) + build attach (filtered by the\ncorrect version) + submission via ASC API; full transactional Play flow (edit →\nupload AAB → **store listing per locale** → **screenshots/graphics per locale** →\ntrack with staged rollout → commit); metadata with the stores' hard limits;\nidempotent resume; retries with backoff; AI-generated metadata, localization and\nrejection diagnosis; mockup screenshot generation; promo video generation; local\nweb dashboard (`armfly ui`).\n\n**Limitations:** IPA upload delegates to `xcrun altool` (macOS only); binaries and\nimages are read into memory (fine up to ~hundreds of MB); the app must already\nexist in the stores (creating the app record is done manually in the consoles —\nGoogle requires this for the first AAB); not yet validated against real store\naccounts end to end.\n\n### Declaring screenshots in `armfly.yaml`\n\n```yaml\nscreenshots:\n  ios:                 # Apple types: APP_IPHONE_67, APP_IPHONE_65, APP_IPAD_PRO_3GEN_129 ...\n    en-US:\n      APP_IPHONE_67: [assets/ios/en/6.7/01.png, assets/ios/en/6.7/02.png]\n  android:             # Play types: phoneScreenshots, sevenInchScreenshots, featureGraphic ...\n    en-US:\n      phoneScreenshots: [assets/android/en/01.png]\n```\n\nEach deploy **replaces** the set for that type/locale (idempotent).\n","readmeFilename":"README.md"}