Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,15 @@ body:
id: plugin-version
attributes:
label: Magic Starter Version
placeholder: "0.0.39"
placeholder: "0.0.40"
validations:
required: true

- type: input
id: magic-version
attributes:
label: Magic Framework Version
placeholder: "1.0.0-alpha.3"
placeholder: "0.0.27"
validations:
required: true

Expand Down
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

Requires the `magic_payments` release whose rails purchase by catalogue product key and report `StoreBillingService.lastChangeTiming`, and `magic-starter-laravel` whose `GET /billing/plans` rows carry `products` with `sellable` and `store_ids`.
## [0.0.40] - 2026-10-09

Requires `magic_payments` 0.0.8, whose rails purchase by catalogue product key and report `StoreBillingService.lastChangeTiming`, and `magic-starter-laravel` whose `GET /billing/plans` rows carry `products` with `sellable` and `store_ids`.

### Added

Expand All @@ -30,6 +32,7 @@ Requires the `magic_payments` release whose rails purchase by catalogue product
- **The account-deletion refusal offers "Manage subscription" only where it works**: when the build's store rail sells through the store that billed the blocking team. On the web, or on the other store's device, the sentence stands alone. (`lib/src/http/controllers/magic_starter_profile_controller.dart`)
- **`billing.errors.managed_elsewhere` and `social.subscription_stripe_no_link` name no web**: "This subscription is managed elsewhere. Change it where you bought it." and "Cancel that subscription where you set it up". Both reach a store build's toast, where pointing at the web is what App Store guideline 3.1.3 forbids; a test now holds every shipped billing error and subscription refusal sentence to it. An existing app updates its own copy. (`assets/stubs/install/en.stub`)
- **A blank `legal.terms_url` or `legal.privacy_url` reads as unset**, so an empty env variable no longer renders a link that opens nothing on the register and billing screens. (`lib/src/configuration/magic_starter_config.dart`)
- **Every sibling floor names this batch's release.** `magic_payments` moves `^0.0.7` to `^0.0.8`, a real requirement: the billing screen purchases by catalogue product key and reads `PurchaseContext` and `StoreBillingService.lastChangeTiming`, which magic_payments 0.0.8 introduces, so this package does not compile below it. `magic` moves `^0.0.24` to `^0.0.27`, `magic_notifications` `^0.3.6` to `^0.3.8`, `fluttersdk_wind` `^1.8.0` to `^1.8.1` and `fluttersdk_artisan` `^0.0.17` to `^0.0.19`; those old ranges already admitted the new versions, so for them a fresh `pub get` resolves nothing differently. `magic_starter:install` writes `magic_notifications: ^0.3.8` to match. magic_payments 0.0.8 is BREAKING (purchase by product key, `products()`, `store` and `lastChangeTiming` on `StoreBillingService`, a typed `BillingException.code`, `BillingEntitlement.aiAnalysisTrialsRemaining` removed): this package adopts it in this release, and a host that implements `WebBillingService` or `StoreBillingService` meets it as the BREAKING entry above says. None of magic 0.0.25 to 0.0.27, magic_notifications 0.3.7 and 0.3.8, wind 1.8.1 or artisan 0.0.18 and 0.0.19 is breaking. (`pubspec.yaml`, `lib/src/cli/commands/magic_starter_install_command.dart`)

## [0.0.39] - 2026-10-05

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Flutter starter kit for the Magic Framework. Pre-built Auth, Profile, Teams & Notifications — 14 opt-in features, every screen overridable via Wind UI.

**Version:** 0.0.39 · **Dart:** >=3.11.0 · **Flutter:** >=3.41.0
**Version:** 0.0.40 · **Dart:** >=3.11.0 · **Flutter:** >=3.41.0

## Commands

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Stop rebuilding authentication, profile management, and team features from scrat

```yaml
dependencies:
magic_starter: ^0.0.39
magic_starter: ^0.0.40
```

### 2. Install configuration
Expand Down
2 changes: 1 addition & 1 deletion doc/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Or add it manually to `pubspec.yaml`:

```yaml
dependencies:
magic_starter: ^0.0.39
magic_starter: ^0.0.40
```

Then fetch dependencies:
Expand Down
2 changes: 1 addition & 1 deletion lib/src/cli/commands/magic_starter_install_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import '../helpers/magic_starter_config_helper.dart';
/// disagree. They describe one dependency from two files, so a disagreement
/// leaves pub no intersection to solve, and pub answers that by walking
/// magic_starter backwards to a release that fits rather than by failing.
const String magicNotificationsConstraint = '^0.3.6';
const String magicNotificationsConstraint = '^0.3.8';

/// Installs and configures Magic Starter inside a host Magic application.
///
Expand Down
2 changes: 1 addition & 1 deletion lib/src/cli/starter_artisan_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import 'commands/magic_starter_uninstall_command.dart';
/// both and fails when they disagree, so a banner cannot drift behind a release
/// the way the two hand-written `'0.0.1'` literals did: they were written before
/// the first alpha and were still claiming 0.0.1 twenty-four releases later.
const String magicStarterVersion = '0.0.39';
const String magicStarterVersion = '0.0.40';

/// Magic Starter's contribution to the host application's artisan registry.
///
Expand Down
31 changes: 18 additions & 13 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: magic_starter
description: Starter kit for Magic Framework. Auth, Profile, Teams, Notifications — 14 opt-in features with overridable views.
version: 0.0.39
version: 0.0.40
homepage: https://magic.fluttersdk.com/starter
documentation: https://magic.fluttersdk.com/packages/starter/getting-started/installation
repository: https://github.com/fluttersdk/magic_starter
Expand Down Expand Up @@ -32,10 +32,11 @@ dependencies:
# inside a package they do not own, rather than a version-solve message naming
# magic. `SessionScope`, `SessionScoped`, the keyed `LatestRead` and
# `BaseGuard.cacheUser`, which the team switch and the billing reads call,
# first ship in 0.0.22. It names 0.0.24 because the restore listener reads
# `AuthRestored.changed`, which first ships there.
magic: ^0.0.24
fluttersdk_artisan: ^0.0.17
# first ship in 0.0.22, and the restore listener reads `AuthRestored.changed`,
# which first ships in 0.0.24. The floor itself names 0.0.27, the release the
# 2026-10-09 batch verified this package against.
magic: ^0.0.27
fluttersdk_artisan: ^0.0.19
# This is a FLOOR for an API, not an upper-bound fix, and the API is
# `Notify.view`: the notification screens, the bell dropdown and the
# preferences controller live in that package now, and this package's routes
Expand Down Expand Up @@ -70,9 +71,9 @@ dependencies:
# error at `notification_routes.dart` instead of a version-solve message
# naming the package. Raising it is the difference between a readable refusal
# and a broken build. `Notify.pushState`, which the provider registers as a
# before-logout hook, first ships in 0.3.5. The floor itself names 0.3.6, the
# release the 2026-09-29 batch verified this package against.
magic_notifications: ^0.3.6
# before-logout hook, first ships in 0.3.5. The floor itself names 0.3.8, the
# release the 2026-10-09 batch verified this package against.
magic_notifications: ^0.3.8
# Direct rather than transitive, and this is the point of declaring it:
# `fluttersdk_wind` reaches this package through `magic`, so without an entry
# here there is no floor to raise when this package starts calling a new Wind
Expand All @@ -82,9 +83,9 @@ dependencies:
# `pubspec.lock` already pins 1.5.3 and upgrades this package would otherwise
# get `undefined_named_parameter` inside a package they do not own, with
# nothing saying why; with the floor they get a version-solve message naming
# wind. The floor itself names 1.8.0, the release the 2026-09-29 batch
# wind. The floor itself names 1.8.1, the release the 2026-10-09 batch
# verified this package against.
fluttersdk_wind: ^1.8.0
fluttersdk_wind: ^1.8.1
# Published, and carrying what the billing screen needs: magic_payments 0.0.2
# is on pub.dev and ships both `BillingCycle` and `PlanStatus.isDunning`. This
# comment used to say the package had no release at all and that those two
Expand All @@ -104,9 +105,13 @@ dependencies:
# `Notify.view`, `hasOverride` and `forgetView`. The `Published graph` CI job
# is what says so out loud, by resolving the graph a third party actually gets
# rather than the local path overrides. `StoreIdentitySync`, which
# `switchTeam` re-identifies the store rail through, first ships in 0.0.5;
# the floor names 0.0.7, the release the 2026-09-29 batch verified against.
magic_payments: ^0.0.7
# `switchTeam` re-identifies the store rail through, first ships in 0.0.5.
# The floor names 0.0.8 because the billing screen purchases by catalogue
# product key on both rails (`checkout(productKey:)`,
# `purchase(productKey, context:)`) and reads `PurchaseContext` and
# `StoreBillingService.lastChangeTiming`, which first ship there; below it
# this package does not compile.
magic_payments: ^0.0.8
args: ^2.7.0
path: ^1.9.0

Expand Down
Loading