Skip to content

Commit cc6cc41

Browse files
gnbmShaneKthetaPC
authored
feat(v8): foundation for the major 8.0 release (#5128)
* chore(release): adopt Lerna 5 with GitHub Releases and add v8 breaking-change docs - Bump root lerna devDependency 3.13.3 -> 5.6.2 (matches ionic-framework) - publish:ci passes --create-release github so Lerna creates a GitHub Release per published tag; cd.yml provides GH_TOKEN (built-in token, contents: write) - Add BREAKING.md (+ BREAKING_ARCHIVE/ convention) seeding the v8 removed-command log - Add .github/RELEASING.md major-release runbook * fix(cli): make build, lint, and tests run on Windows and macOS Pre-existing cross-platform issues surfaced while validating the Lerna 5 upgrade; none are caused by the release tooling: - discover: pin netmask 2.0.2 and @types/netmask 2.0.5 — the untracked dependency tree had drifted to netmask 2.1.x, whose bundled types declare 'broadcast: string | undefined' and broke the build (TS2322) - replace the Unix-only 'lint': 'true' no-op with cross-platform 'exit 0' in all packages ('true' is not a cmd.exe builtin, so npm run lint failed on Windows) - angular/cordova tests: normalize path separators in assertions and return the floating expect().resolves promises (fixes Windows path failures and the resulting jest-worker 'Call retries were exceeded' crash) * docs(release): correct publish:testing guidance in runbook publish:testing is NOT a dry run — lerna publish runs npm publish (testing dist-tag); --no-push only suppresses git. It also only runs from 'stable' due to the allowBranch guard. Replace the §4 'dry run' step with a safe, non-publishing 'lerna version --no-push --no-git-tag-version --allow-branch' smoke test, and document the bump-from-commits behavior. * ci: pin actions to commit SHAs and bump to latest Security-harden workflows by pinning actions to immutable commit SHAs (version in trailing comment), and update from v3: - actions/checkout v3 -> v6.0.3 - actions/setup-node v3 -> v6.4.0 - actions/cache v3 -> v5.0.5 (v3 cache backend was retired by GitHub) * chore(deps): upgrade to TypeScript 5.9.3 and jest 29 Upgrade the TypeScript toolchain across all packages: - typescript ~4.8.0 -> ~5.9.3 - ts-jest ~26.3.0 -> ^29.4.11 - jest/jest-cli ^26.x -> ^29.7.0 (stays on 29 to keep Node 16 support) - @types/jest ^26.x -> ^29.5.14 - @types/node ~16.0.0 -> ^16.18.126 (16.0.3 conflicted with TS 5.9 libs) - tslib ^2.0.1 -> ^2.8.1 Required code/config changes: - jest.config.base.js: migrate ts-jest globals -> transform API, tsConfig -> tsconfig, explicit testEnvironment: node - utils-array reduce(): annotate accumulator T|U + cast awaited result (TS 5.9 Awaited/NonNullable inference) - tests: drop async from async-done callbacks (utils-fs), convert to async()+expect.assertions (utils-subprocess), spyOn().and.callFake -> jest.spyOn().mockImplementation (utils-network), legacyFakeTimers for timer-mock assertions (cli-framework-output) Validated: build + lint + full test suite green. * docs(release): make the runbook smoke-test command cross-shell The step-4 lerna version command used a bash-only backslash continuation and $(git branch --show-current), which fail in PowerShell/cmd. Use a single-line command with --allow-branch "*" (quoted so bash doesn't glob-expand it) so it runs identically in PowerShell, cmd, bash, and zsh. Also scope the cleanup to 'git checkout -- packages' so it only discards lerna's version writes. * Update .github/RELEASING.md Co-authored-by: Shane <shane@shanessite.net> * fix(discover): let netmask float and handle nullable broadcast netmask was pinned to an exact 2.0.2 to dodge a TS2322 build break. The break originates from netmask >= 2.1, which ships its own bundled type declarations (broadcast: string | undefined) that shadow @types/netmask entirely — so pinning @types/netmask alone does not fix it. Instead, restore the caret (^2.0.2) so the runtime can receive 2.x patches, drop the now-shadowed @types/netmask dev dependency, and handle the nullable broadcast in computeBroadcastAddress (broadcast is absent for /31 and /32 blocks; fall back to the network address). Validated: discover build + tests green with netmask 2.1.1. * docs(release): refresh Node guidance for the jest 29 toolchain The pre-publish validation note referenced a "bundled jest 26 worker" caveat that is stale on this branch (it ships jest 29). jest 29 supports newer Node than 26 did, so drop the caveat and state the validated matrix: Node 18 to match CI, with the suite also green on Node 16 and 24. * ci: block publishing BREAKING.md with unfilled <TODO placeholders The v8 BREAKING.md entries are seeded placeholders that each removal PR fills in. Add a guard to the stable publish pipeline that fails if any <TODO marker remains, so the "each removal PR fills it in" contract is enforced rather than risking placeholders shipping to users at 8.0.0. * docs: add pull request template Mirror the Ionic Framework PR template so contributors get a consistent structure: issue reference, current/new behavior, a breaking-change checkbox with migration guidance, and an other-information section. The breaking-change note points at this repo's BREAKING.md and the Conventional Commits footer format used by the publish pipeline. * Update .github/RELEASING.md Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com> * Update .github/RELEASING.md Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com> * feat!: require Node >= 18 Enforce the supported runtime through package.json rather than leaving it to documentation. Set engines.node to ">=18.0.0" across the monorepo: the root workspace, every published @ionic/* package, and the previously unset @ionic/discover and cli-scripts manifests. Align the rest of the toolchain with the new baseline — drop Node 16.x from the CI matrix (now 18.x and 20.x) and update the release runbook so the recommended and minimum Node versions no longer disagree. BREAKING CHANGE: Node 16 is no longer supported. The Ionic CLI and its @ionic/* packages now require Node 18 or newer. * docs(release): correct the discover drift-guard note The step-3 drift guard still described the old netmask@2.0.2 + @types/netmask@2.0.5 pins. That approach was replaced: netmask floats at ^2.0.2 (resolving to 2.1.x) using its own bundled types, @types/netmask was dropped, and computeBroadcastAddress handles the nullable broadcast. Update the note to match. * docs(release): point to source files for Node versions Stop hardcoding specific Node versions in the runbook. Reference the authoritative sources instead — `engines.node` in package.json for the minimum and the `node:` matrix in ci.yml (plus `node-version` in cd.yml) for the versions CI exercises — so the doc stays correct when CI's Node versions change without a separate edit. --------- Co-authored-by: Shane <shane@shanessite.net> Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>
1 parent 54a76b5 commit cc6cc41

31 files changed

Lines changed: 528 additions & 165 deletions

File tree

‎.github/PULL_REQUEST_TEMPLATE.md‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
Issue number: resolves #
2+
3+
---------
4+
5+
<!-- Please do not submit updates to dependencies unless it fixes an issue. -->
6+
7+
<!-- Please try to limit your pull request to one type (bugfix, feature, etc). Submit multiple pull requests if needed. -->
8+
9+
## What is the current behavior?
10+
<!-- Please describe the current behavior that you are modifying. -->
11+
12+
## What is the new behavior?
13+
<!-- Please describe the behavior or changes that are being added by this PR. -->
14+
15+
-
16+
-
17+
-
18+
19+
## Does this introduce a breaking change?
20+
21+
- [ ] Yes
22+
- [ ] No
23+
24+
<!--
25+
If this introduces a breaking change:
26+
1. Describe the impact and migration path for existing applications below.
27+
2. Update the BREAKING.md file with the breaking change.
28+
3. Add "BREAKING CHANGE: [...]" to the commit description when merging. See https://www.conventionalcommits.org/ for more information.
29+
-->
30+
31+
32+
## Other information
33+
34+
<!-- Any other information that is important to this PR such as screenshots of how the change behaves before and after. -->

‎.github/RELEASING.md‎

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# Releasing the Ionic CLI
2+
3+
This runbook describes how the Ionic CLI is published and, specifically, **how
4+
to cut a major release** (e.g. `8.0.0`). It reflects the repository as of the
5+
`major-x` branch.
6+
7+
## 1. How publishing works today
8+
9+
The CLI is a **Lerna monorepo** with `independent` versioning
10+
([`lerna.json`](../lerna.json) → `"version": "independent"`).
11+
Each `@ionic/*`
12+
package is versioned on its own based on the commits that touched it.
13+
14+
Release is **conventional-commit driven and automatic**:
15+
16+
- [`.github/workflows/cd.yml`](workflows/cd.yml) runs **only on push to the
17+
`stable` branch**.
18+
- It runs `npm run publish:ci`, defined in [`package.json`](../package.json):
19+
20+
- `lerna version --conventional-commits` computes each package's next version
21+
**from commit messages**, tags, and pushes the release commit.
22+
- `--create-release github` makes Lerna create the **GitHub Release** for each
23+
tag (see **3** — requires Lerna 5 and a `GH_TOKEN`).
24+
- `lerna exec ... npm publish --provenance` publishes the changed packages to
25+
npm.
26+
- `lerna.json` pins `"allowBranch": "stable"`, so `lerna version` refuses to run
27+
from any other branch.
28+
- After publishing, `cd.yml` builds and pushes a Docker image to GHCR (GitHub Container Registry).
29+
30+
> **Key consequence:** the version bump is derived from commit messages, **not**
31+
> from `BREAKING.md`. `BREAKING.md` is human documentation only. To land
32+
> `@ionic/cli` on `8.0.0`, the branch history must contain **breaking-change
33+
> commits** — a `feat!:` / `fix!:` subject or a `BREAKING CHANGE:` footer — for
34+
> the `@ionic/cli` package.
35+
36+
## 2. Cutting the v8 major
37+
38+
### 2a. Make sure the major bump will be computed
39+
40+
Because versioning is conventional-commit driven:
41+
42+
- The command-removal PRs (tracked separately) **must** use breaking-change
43+
commit syntax so Lerna computes a major bump for the affected package(s):
44+
45+
```bash
46+
feat(commands)!: remove deprecated Appflow/Enterprise/Cordova commands
47+
48+
BREAKING CHANGE: The config, cordova, enterprise, git, init, link,
49+
live-update, login, logout, repair, signup, and ssh commands have been
50+
removed. See BREAKING.md.
51+
```
52+
53+
- `independent` versioning means **only the packages whose commits include the
54+
breaking change get the major bump**. Confirm the removals live in the package
55+
that owns the command surface (typically `@ionic/cli`) so `@ionic/cli` is the
56+
one that reaches `8.0.0`. Utility `@ionic/*` packages bump independently based
57+
on their own commits.
58+
59+
### 2b. Path to publish from `major-8.0`
60+
61+
`cd.yml` only publishes from `stable`. The `major-8.0` work branch is **not**
62+
auto-published. Recommended path:
63+
64+
1. Land all removal PRs (with breaking-change commits) onto `major-8.0`.
65+
2. Normal merge / rebase `major-8.0` → `develop`.
66+
3. Follow the normal `develop` → `stable` promotion. The push to `stable`
67+
triggers `cd.yml`, which computes the major bump, tags, publishes to npm, and
68+
creates the GitHub Releases.
69+
70+
### 2c. Optional: ship a v8 release candidate first
71+
72+
Use a prerelease on a `next` dist-tag before GA so consumers can test:
73+
74+
```bash
75+
# A real prerelease under the `testing` dist-tag (publishes to npm, no git push):
76+
npm run publish:testing # publishes a `testing` prerelease with --no-push
77+
78+
# A real RC under the `next` tag (run from an allowed branch):
79+
lerna publish premajor --preid rc --dist-tag next --conventional-commits
80+
```
81+
82+
> To cut an RC directly from `major-8.0`, temporarily relax `allowBranch` in
83+
> `lerna.json` (e.g. `["stable", "major-8.0"]`) or run the prerelease from
84+
> `stable`. Decide this deliberately — don't leave `major-8.0` permanently
85+
> publishable.
86+
87+
## 3. GitHub Release creation (Lerna 5)
88+
89+
The CLI was upgraded from Lerna **3.13.3 → 5.x** so that releases are created on
90+
GitHub natively. This is wired via
91+
`--create-release github` in `publish:ci` (**1**).
92+
93+
Requirements for `--create-release github` to work in CI:
94+
95+
- It must run together with `--conventional-commits` (it is).
96+
- A **`GH_TOKEN`** must be present in the environment of the `lerna version`
97+
step. [`cd.yml`](workflows/cd.yml) provides it as `${{ github.token }}` — the
98+
built-in workflow token, which is sufficient because the workflow already
99+
grants `contents: write`. **No dedicated secret is required.**
100+
101+
## 4. Pre-publish validation (always, but especially after the Lerna upgrade)
102+
103+
These steps are **cross-platform** — every command is `npm`/`npx`-based and runs
104+
identically in PowerShell, `cmd`, bash, and zsh (Windows and macOS). For the Node
105+
version, don't rely on a number hardcoded here: the minimum is enforced by
106+
`engines.node` in each `package.json`, and the versions CI exercises are the
107+
`node:` matrix in [`ci.yml`](workflows/ci.yml) (the publish job pins its own under
108+
`node-version` in [`cd.yml`](workflows/cd.yml)). Use a version that satisfies both
109+
— checking those files keeps this runbook correct as the supported versions change.
110+
111+
> **Order matters.** This is a `lerna bootstrap` monorepo: per-package
112+
> devDependencies (including `@types/node`) are installed and hoisted by
113+
> `npm run bootstrap`, **not** by `npm install`. You must run steps 0→1 before
114+
> any `build`/`lint`/`test`. Running `npm run build` on a freshly-cleaned tree
115+
> fails with `TS2688: Cannot find type definition file for 'node'` — that means
116+
> bootstrap was skipped, not a real code error.
117+
118+
```bash
119+
# 0. (optional) Pristine tree — npx rimraf is cross-platform, unlike rm -rf
120+
npx rimraf node_modules "packages/@ionic/*/node_modules" "packages/cli-scripts/node_modules"
121+
122+
# 1. Install + bootstrap — REQUIRED before build/lint/test.
123+
# `npm install` only installs root devDeps (lerna, typescript);
124+
# `npm run bootstrap` installs+hoists every package's deps, then builds.
125+
npm install
126+
npm run bootstrap
127+
128+
# 2. Confirm the Lerna upgrade — expect 5.x, and `--create-release` in the help
129+
npx lerna --version
130+
npx lerna version --help # look for: --create-release ... [choices: "gitlab","github"]
131+
132+
# 3. Lint / test (bootstrap already built; re-run build explicitly if you like)
133+
npm run lint
134+
npm run test
135+
# Drift guard: a green build of @ionic/discover (no publisher.ts "broadcast"
136+
# TS2322) confirms netmask (^2.0.2, currently 2.1.x) resolved with its
137+
# bundled types and computeBroadcastAddress handles the nullable broadcast.
138+
139+
# 4. Non-publishing version smoke test — exercises the Lerna 5 version path
140+
# WITHOUT publishing to npm or touching git. --allow-branch "*" overrides the
141+
# lerna.json `allowBranch: stable` guard for this one local run.
142+
# Single line + quoted "*" so it runs the same in PowerShell, cmd, bash, zsh.
143+
npx lerna version --conventional-commits --no-push --no-git-tag-version --allow-branch "*" --yes
144+
git checkout -- packages # discard the version/CHANGELOG file writes lerna just made
145+
```
146+
147+
> **`npm run publish:testing` is NOT a dry run — it publishes to npm.**
148+
> `lerna publish` runs an `npm publish` (the `@ionic/*` packages under the
149+
> `testing` dist-tag); `--no-push`/`--no-git-tag-version` only suppress *git*
150+
> actions, not the registry publish. It also only runs from `stable` (the
151+
> `allowBranch` guard). Use step 4 above for a safe local check. Run
152+
> `publish:testing` only when you actually intend to push a `testing` prerelease
153+
> to npm, with valid npm credentials.
154+
155+
The step-4 smoke test also reveals the **computed version bump** from the
156+
branch's conventional commits. Note it will show a `patch`/`minor` bump until
157+
the branch carries breaking-change commits (`feat!:` / `BREAKING CHANGE:`) —
158+
those, not `BREAKING.md`, are what make `@ionic/cli` land on `8.0.0` (see §1).
159+
160+
> **Known platform note (pre-existing, unrelated to the release tooling):** on
161+
> **Windows**, one test in `integrations/cordova` asserts POSIX (`/`) path
162+
> separators and fails because `path.relative` returns `\` on Windows. It passes
163+
> on macOS/Linux (and therefore in CI). It is not introduced by these changes,
164+
> and the Cordova integration is slated for removal in v8.

‎.github/workflows/cd.yml‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,18 @@ jobs:
1616
runs-on: ubuntu-latest
1717
timeout-minutes: 30
1818
steps:
19-
- uses: actions/checkout@v3
19+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
2020
with:
2121
fetch-depth: 0
22-
- uses: actions/setup-node@v3
22+
- name: Guard against unfilled BREAKING.md placeholders
23+
# The removal PRs fill in each command's entry. Block a stable publish
24+
# if any <TODO placeholder would otherwise ship to users.
25+
run: |
26+
if grep -n '<TODO' BREAKING.md; then
27+
echo "::error file=BREAKING.md::BREAKING.md still contains <TODO placeholders; each removal PR must fill in its entry before publishing."
28+
exit 1
29+
fi
30+
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
2331
with:
2432
node-version: 18
2533
registry-url: https://registry.npmjs.org/
@@ -34,6 +42,10 @@ jobs:
3442
GIT_COMMITTER_NAME: Ionitron
3543
GIT_COMMITTER_EMAIL: hi@ionicframework.com
3644
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
45+
# Required by `lerna version --create-release github` to create the
46+
# GitHub Release for each published tag. The built-in token is
47+
# sufficient (the workflow already grants `contents: write`).
48+
GH_TOKEN: ${{ github.token }}
3749
- name: Sleep while npm takes its time
3850
run: sleep 20
3951
- name: GitHub Container Registry Login

‎.github/workflows/ci.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ jobs:
1717
matrix:
1818
node:
1919
- 18.x
20-
- 16.x
20+
- 20.x
2121
steps:
22-
- uses: actions/setup-node@v3
22+
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
2323
with:
2424
node-version: ${{ matrix.node }}
25-
- uses: actions/checkout@v3
25+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
2626
- name: Restore Dependency Cache
27-
uses: actions/cache@v3
27+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
2828
with:
2929
path: ~/.npm
3030
key: ${{ runner.OS }}-dependency-cache-${{ hashFiles('**/package.json') }}

‎.github/workflows/docker-image.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ jobs:
77
name: Build and Deploy Docker Container with latest CLI
88
runs-on: ubuntu-latest
99
steps:
10-
- uses: actions/setup-node@v3
10+
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
1111
with:
1212
node-version: 16.x
13-
- uses: actions/checkout@v3
13+
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
1414
with:
1515
fetch-depth: 0
1616
- name: GitHub Container Registry Login

‎BREAKING.md‎

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Breaking Changes
2+
3+
This is a comprehensive list of the breaking changes introduced in the major
4+
version releases of the Ionic CLI.
5+
6+
## Versions
7+
8+
- [Version 8.x](#version-8x)
9+
10+
> Older majors are archived under [`BREAKING_ARCHIVE/`](BREAKING_ARCHIVE) (e.g.
11+
> `BREAKING_ARCHIVE/v7.md`). When the next major begins, move the section below
12+
> into `BREAKING_ARCHIVE/v8.md` and start a fresh `Version 9.x` section here.
13+
14+
## Version 8.x
15+
16+
In version 8, the Ionic CLI is focused on the **Framework and Capacitor**
17+
workflows. The Appflow, Enterprise, and Cordova commands have been removed.
18+
19+
- [Removed Commands](#removed-commands)
20+
21+
### Removed Commands
22+
23+
The following commands have been removed. Each entry records **what was
24+
removed**, **why**, and the **migration path / alternative**.
25+
26+
> **Note:** The removal PRs are authored and coordinated separately. The entries
27+
> below are seeded placeholders — each removal PR should fill in the specifics
28+
> (the exact `diff`, the reason, and the migration link) for the command it
29+
> removes.
30+
31+
#### `config`
32+
33+
- **What:** The `config` command (and its `config get` / `config set` /
34+
`config unset` subcommands) has been removed. _<TODO: confirm exact surface
35+
removed in the removal PR.>_
36+
- **Why:** _<TODO: rationale — CLI configuration scope reduced for the
37+
Framework/Capacitor-focused CLI.>_
38+
- **Migration:** _<TODO: alternative / link.>_
39+
40+
#### `cordova`
41+
42+
- **What:** The `cordova` command group has been removed. _<TODO: confirm exact
43+
surface removed.>_
44+
- **Why:** _<TODO: Cordova retirement in favor of Capacitor.>_
45+
- **Migration:** Migrate to Capacitor. _<TODO: link to the Capacitor migration
46+
guide.>_
47+
48+
#### `enterprise`
49+
50+
- **What:** The `enterprise` command group has been removed. _<TODO: confirm
51+
exact surface removed.>_
52+
- **Why:** _<TODO: Ionic Enterprise tooling retirement.>_
53+
- **Migration:** _<TODO: point Enterprise users to current Appflow / Enterprise
54+
tooling.>_
55+
56+
#### `git`
57+
58+
- **What:** The `git` command group has been removed. _<TODO: confirm exact
59+
surface removed.>_
60+
- **Why:** _<TODO: tied to Appflow remote workflows being retired from the
61+
CLI.>_
62+
- **Migration:** _<TODO: alternative / link.>_
63+
64+
#### `init`
65+
66+
- **What:** The `init` command has been removed. _<TODO: confirm exact surface
67+
removed.>_
68+
- **Why:** _<TODO: rationale.>_
69+
- **Migration:** _<TODO: alternative — e.g. `ionic start` / Capacitor init.>_
70+
71+
#### `integrations` (Enterprise portion only)
72+
73+
- **What:** The **Enterprise portion** of the `integrations` command has been
74+
removed. **The Capacitor integration is kept.** _<TODO: confirm exact
75+
subcommands/flags removed vs. retained.>_
76+
- **Why:** _<TODO: Enterprise integration retirement; Capacitor remains a
77+
first-class workflow.>_
78+
- **Migration:** Continue using `ionic integrations enable capacitor`. _<TODO:
79+
link.>_
80+
81+
#### `link`
82+
83+
- **What:** The `link` command has been removed. _<TODO: confirm exact surface
84+
removed.>_
85+
- **Why:** _<TODO: Appflow app-linking retirement.>_
86+
- **Migration:** _<TODO: point Appflow users to current Appflow tooling.>_
87+
88+
#### `live-update`
89+
90+
- **What:** The `live-update` command group has been removed. _<TODO: confirm
91+
exact surface removed.>_
92+
- **Why:** _<TODO: Appflow Live Updates retirement from the CLI.>_
93+
- **Migration:** _<TODO: point users to current Appflow Live Updates tooling.>_
94+
95+
#### `login`
96+
97+
- **What:** The `login` command has been removed. _<TODO: confirm exact surface
98+
removed.>_
99+
- **Why:** _<TODO: Ionic account auth no longer needed by the CLI.>_
100+
- **Migration:** _<TODO: alternative / link.>_
101+
102+
#### `logout`
103+
104+
- **What:** The `logout` command has been removed. _<TODO: confirm exact surface
105+
removed.>_
106+
- **Why:** _<TODO: counterpart to `login` removal.>_
107+
- **Migration:** _<TODO: alternative / link.>_
108+
109+
#### `repair`
110+
111+
- **What:** The `repair` command has been removed. _<TODO: confirm exact surface
112+
removed.>_
113+
- **Why:** _<TODO: rationale.>_
114+
- **Migration:** _<TODO: alternative / link.>_
115+
116+
#### `signup`
117+
118+
- **What:** The `signup` command has been removed. _<TODO: confirm exact surface
119+
removed.>_
120+
- **Why:** _<TODO: Ionic account flows removed from the CLI.>_
121+
- **Migration:** _<TODO: alternative / link.>_
122+
123+
#### `ssh`
124+
125+
- **What:** The `ssh` command group (and its subcommands) has been removed.
126+
_<TODO: confirm exact surface removed.>_
127+
- **Why:** _<TODO: Appflow SSH key management retirement from the CLI.>_
128+
- **Migration:** _<TODO: point Appflow users to current Appflow tooling.>_

0 commit comments

Comments
 (0)