Rename the CLI binary from ascapi to asc

cargo install smbcloud-ascapi-cli now installs asc. The clap command name, the no-subcommand hint, and the command examples in the READMEs, CLAUDE.md and doc comments say asc as well. The MCP Registry name io.github.smbcloudXYZ/ascapi, the MCP server's own name, crate names and internal identifiers stay as they are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Seto Elkahfi committed Oct 9, 2026 at 09:04 UTC 585ea13195425fb8096dd70d5b457fe9dfb9e90d
10 files changed +24 -26
CLAUDE.md
+6 -6
@@ -7,8 +7,8 @@ Guidance for Claude Code (and other agents) working in this repository.
7 `smbcloud-ascapi` is a Rust workspace wrapping the App Store Connect API. It
8 ships two front ends over one shared core:
9
10 -- the `ascapi` CLI (`crates/cli`), and
11 -- an MCP stdio server (`crates/mcp`, reachable via `ascapi --mcp`).
10 +- the `asc` CLI (`crates/cli`), and
11 +- an MCP stdio server (`crates/mcp`, reachable via `asc --mcp`).
12
13 Both go through `smbcloud-ascapi-frontend` so they can't drift. See `README.md`
14 for the full crate table.
@@ -40,21 +40,21 @@ All are subcommands of `apps` (clap kebab-cases the command names):
40 ```sh
41 # GET /v1/builds?filter[app]={id} — newest first. Check processingState
42 # (VALID / INVALID / PROCESSING / FAILED).
43 -ascapi apps builds <APP_ID> \
43 +asc apps builds <APP_ID> \
44 [--version <BUILD_NUMBER>] \ # filter[version], e.g. 42
45 [--pre-release-version <MARKETING>] \ # filter[preReleaseVersion.version], e.g. 1.1.0
46 [--processing-state <STATE>] # filter[processingState]
47
48 # GET /v1/builds/{id} — a single build by its ASC id.
49 -ascapi apps build <BUILD_ID>
49 +asc apps build <BUILD_ID>
50
51 # GET /v1/preReleaseVersions?filter[app]={id} — the marketing version strings
52 # TestFlight groups builds under.
53 -ascapi apps pre-release-versions <APP_ID> [--platform <ios|mac-os|tv-os|vision-os>]
53 +asc apps pre-release-versions <APP_ID> [--platform <ios|mac-os|tv-os|vision-os>]
54
55 # xcrun altool --upload-package, authenticated with the same key id, issuer
56 # and .p8 (--p8-file-path) as every other command. --dry-run prints the argv.
57 -ascapi apps upload <PATH.ipa|PATH.pkg> [--wait]
57 +asc apps upload <PATH.ipa|PATH.pkg> [--wait]
58 ```
59
60 The underlying API lives in `crates/aso/src/build.rs`: `BuildsApi` (in the
README.md
+1 -1
@@ -13,7 +13,7 @@ from the other:
13 | `smbcloud-ascapi-signing` | Code signing: certificates and provisioning profiles, plus local RSA key pair and CSR generation |
14 | `smbcloud-ascapi-frontend` | Operations both surfaces share, so the CLI and the MCP server agree by construction, plus the CLI's `xcrun altool` upload |
15 | `smbcloud-ascapi-mcp` | The MCP contract and stdio server |
16 -| `smbcloud-ascapi-cli` | The `ascapi` binary: clap command tree, plus `--mcp` |
16 +| `smbcloud-ascapi-cli` | The `asc` binary: clap command tree, plus `--mcp` |
17
18 `aso`, `pricing` and `signing` know nothing about each other, and neither knows
19 anything about the front ends. Each adds its calls to
crates/cli/Cargo.toml
+1 -1
@@ -9,7 +9,7 @@ description = "CLI and MCP server for App Store Connect: issue Apple signing cer
9 readme = "README.md"
10
11 [[bin]]
12 -name = "ascapi"
12 +name = "asc"
13 path = "src/main.rs"
14
15 [dependencies]
crates/cli/README.md
+7 -7
@@ -1,6 +1,6 @@
1 # App Store Connect Signing
2
3 -`ascapi` issues and inspects Apple signing certificates from the terminal
3 +`asc` issues and inspects Apple signing certificates from the terminal
4 or as an MCP server, without a trip to the developer portal. It also
5 covers App Store Connect's App Metadata surface: apps, app infos, app
6 store versions, bundle IDs, screenshots, and their localizations.
@@ -39,12 +39,12 @@ Reports, then request a report date and frequency:
39 export ASC_VENDOR_NUMBER=12345678
40
41 # Yesterday's paid-app and in-app purchase sales.
42 -ascapi sales-reports download \
42 +asc sales-reports download \
43 --frequency DAILY \
44 --report-date 2026-09-11
45
46 # Save a monthly report rather than printing it to stdout.
47 -ascapi sales-reports download \
47 +asc sales-reports download \
48 --frequency MONTHLY \
49 --report-date 2026-08 \
50 --output sales-2026-08.json
@@ -57,8 +57,8 @@ use `--version` where that layout requires a report format version.
57 ## Signing certificates
58
59 ```bash
60 -ascapi certificates list --type distribution
61 -ascapi certificates create --type mac-installer-distribution --out-dir ~/certs
60 +asc certificates list --type distribution
61 +asc certificates create --type mac-installer-distribution --out-dir ~/certs
62 ```
63
64 `create` generates an RSA 2048 key pair locally, sends Apple only a
@@ -79,7 +79,7 @@ never saved.
79 ## MCP server
80
81 ```bash
82 -ascapi --mcp
82 +asc --mcp
83 ```
84
85 Speaks MCP over stdio and exposes 28 tools: every operation the command
@@ -101,7 +101,7 @@ Two deliberate absences:
101 - **No revocation tool.** Revoking a signing certificate invalidates every
102 provisioning profile embedding it, for every teammate and every CI job,
103 at once and irreversibly. That is the one delete no confirmation string a
104 - model types on your behalf makes safe, so `ascapi certificates revoke`
104 + model types on your behalf makes safe, so `asc certificates revoke`
105 stays on the command line, where a human is the one typing. A test fails
106 the build if it ever appears in the tool list.
107 - **No key material in tool results.** `certificate_create` returns the
crates/cli/src/main.rs
+2 -4
@@ -32,7 +32,7 @@ use std::path::PathBuf;
32 /// Add/update App Store Connect app metadata (apps, app infos, app store
33 /// versions, and their localizations) from the terminal or a script.
34 #[derive(Parser)]
35 -#[command(name = "ascapi", version, about)]
35 +#[command(name = "asc", version, about)]
36 struct Cli {
37 /// App Store Connect API key ID (Users and Access → Integrations → App
38 /// Store Connect API). Not required with `--mcp`, which resolves
@@ -787,9 +787,7 @@ async fn main() -> Result<()> {
787 let client = Client::new(api_key);
788
789 let Some(command) = cli.command else {
790 - anyhow::bail!(
791 - "no subcommand given; run `ascapi --help`, or `ascapi --mcp` for the MCP server"
792 - )
790 + anyhow::bail!("no subcommand given; run `asc --help`, or `asc --mcp` for the MCP server")
791 };
792
793 match command {
crates/frontend/Cargo.toml
+1 -1
@@ -5,7 +5,7 @@ edition.workspace = true
5 authors.workspace = true
6 license.workspace = true
7 repository.workspace = true
8 -description = "Shared operations behind the ascapi command line and MCP surfaces: credential resolution, result shaping, certificate issuance, and altool uploads."
8 +description = "Shared operations behind the asc command line and MCP surfaces: credential resolution, result shaping, certificate issuance, and altool uploads."
9
10 [lib]
11 path = "src/lib.rs"
crates/frontend/src/lib.rs
+1 -1
@@ -1,4 +1,4 @@
1 -//! Operations shared by the `ascapi` command line and its MCP server.
1 +//! Operations shared by the `asc` command line and its MCP server.
2 //!
3 //! Both surfaces need the same things: resolve credentials, call the App
4 //! Store Connect client, and shape the result into something worth showing
crates/frontend/src/upload.rs
+1 -1
@@ -38,7 +38,7 @@ pub struct UploadOutcome {
38 pub exit_code: Option<i32>,
39 /// The delivery UUID altool reports for a successful upload, if its
40 /// output carried one. It is also the build's App Store Connect id, so
41 - /// `ascapi apps build <delivery_id>` reads the build back.
41 + /// `asc apps build <delivery_id>` reads the build back.
42 pub delivery_id: Option<String>,
43 /// altool's `--output-format json` body when it parsed (an array of
44 /// both documents with `--wait`), otherwise its stdout as a string.
crates/mcp/src/lib.rs
+2 -2
@@ -1,6 +1,6 @@
1 //! App Store Connect MCP contract.
2 //!
3 -//! Defines the canonical tool set exposed by `ascapi --mcp`. Each name is
3 +//! Defines the canonical tool set exposed by `asc --mcp`. Each name is
4 //! supplied by the embedder through [`crate::ascapi_mcp_tools`], so the
5 //! standalone binary and any host that re-exposes this contract share one
6 //! implementation and one public surface. Same arrangement `xcrs` uses in
@@ -20,7 +20,7 @@
20 //!
21 //! # What is deliberately absent
22 //!
23 -//! Certificate revocation. `ascapi certificates revoke` exists on the
23 +//! Certificate revocation. `asc certificates revoke` exists on the
24 //! command line and is intentionally not a tool: revoking a distribution
25 //! certificate invalidates every provisioning profile embedding it, for
26 //! every teammate and every CI job, at once and irreversibly. That is not
crates/mcp/src/server.rs
+2 -2
@@ -1,4 +1,4 @@
1 -//! The `ascapi --mcp` server.
1 +//! The `asc --mcp` server.
2 //!
3 //! Holds no state: every tool resolves its App Store Connect credentials
4 //! from the environment per call, so an unconfigured server still starts
@@ -76,7 +76,7 @@ impl ServerHandler for AscapiMcpServer {
76 makes its certificate permanently unusable. Revocation is deliberately not \
77 offered here, because revoking a distribution certificate invalidates every \
78 provisioning profile embedding it for the whole team at once; run \
79 - `ascapi certificates revoke` from a terminal instead. Requires ASC_API_KEY, \
79 + `asc certificates revoke` from a terminal instead. Requires ASC_API_KEY, \
80 ASC_ISSUER_ID, and a readable .p8 key.",
81 )
82 }