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
8 changes: 1 addition & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,9 @@ jobs:
- uses: actions/checkout@v7
with:
repository: push-in/pam-native
ref: v0.5.34
ref: v0.6.1
path: pam-native
persist-credentials: false
- uses: actions/checkout@v7
with:
repository: push-in/pam-mobile-ui-php
ref: v0.2.1
path: pam-mobile-ui
persist-credentials: false
- uses: dtolnay/rust-toolchain@1.97.1
with:
components: clippy,rustfmt
Expand Down
10 changes: 2 additions & 8 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- uses: actions/checkout@v7
with:
repository: push-in/pam-native
ref: v0.5.88
ref: v0.6.1
path: pam-native
persist-credentials: false
- name: Install pinned Android NDK
Expand Down Expand Up @@ -128,15 +128,9 @@ jobs:
- uses: actions/checkout@v7
with:
repository: push-in/pam-native
ref: v0.5.88
ref: v0.6.1
path: pam-native
persist-credentials: false
- uses: actions/checkout@v7
with:
repository: push-in/pam-mobile-ui-php
ref: v0.2.1
path: pam-mobile-ui
persist-credentials: false
- uses: actions/download-artifact@v8
with:
name: pam-android-runtime
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 0.1.44 - 2026-08-01

- Autolink official and community PAM Native plugins on iOS, including typed
module/view registries, Swift Package dependencies, Apple frameworks,
resources, usage descriptions, entitlements and app extensions.
- Validate plugin compatibility and paths before generation, and emit a
reproducible iOS integration plan alongside the plugin lockfile.
- Bundle PAM Native 0.6.1 as the ecosystem plugin foundation.

## 0.1.43 - 2026-07-30

- Bundle PAM Native 0.5.88 so mobile plugins can react to package-restricted
Expand Down
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pam"
version = "0.1.43"
version = "0.1.44"
edition = "2024"
rust-version = "1.94"
description = "Pam — PHP, Always in Memory: a persistent PHP runtime powered by Rust and the Embed SAPI"
Expand Down
18 changes: 5 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,24 +210,16 @@ The executable [SaaS API reference](examples/laravel-saas-api) demonstrates the
recommended controller, request, service, repository, resource, enum, migration
and endpoint-test boundaries.

### Mobile presets
### Mobile preset

The CLI offers two native mobile starting points:
Create a native mobile app backed by PAM Native:

```bash
pam init native-core --template mobile
pam init native-ui --template mobile-ui
```

`mobile` starts with the explicit PAM Native PHP tree and no component-library
dependency. `mobile-ui` installs `pushinbr/pam-mobile-ui`, enables its system
theme and generates a `Hello.pam.php` screen using the official accessible
components. Both presets render through the same PAM Native element tree, Rust
diff engine and Android UI-thread commit path.

See the complete [PAM Mobile guide](docs/mobile.md) for project structure,
screen generation, tags, typed PHP trees, reusable components, state, forms,
navigation, layout rules, builds, and device testing.
The `mobile` preset starts with the explicit PAM Native PHP tree and renders
through the native element tree, Rust diff engine, and platform UI thread.

### Desktop applications with Servo

Expand Down Expand Up @@ -795,7 +787,7 @@ pam rpc validate|generate|wasi [arguments] typed SDK and WASI RPC bound
pam top [admin URL] live cluster metrics
pam doctor [directory] compare CLI, Embed, and Composer
pam benchmark http://host/path built-in HTTP benchmark
pam init [directory] --template raw|api|laravel|desktop|mobile|mobile-ui
pam init [directory] --template raw|api|laravel|desktop|mobile
scaffold and install a project
pam init [directory] --template api --socket add native Socket support
pam init [directory] --no-interaction accept the default API preset
Expand Down
11 changes: 1 addition & 10 deletions docs/mobile.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,10 @@ API or dynamically built trees. Both styles can coexist in one application.

## Create and run an application

Choose one preset:
Create a project from the native preset:

```bash
# PAM Native primitives only
pam init my-mobile-app --template mobile

# PAM Native plus the official PAM UI component library
pam init my-mobile-app --template mobile-ui
```

Connect an Android device with USB debugging enabled, then run:
Expand Down Expand Up @@ -537,11 +533,6 @@ the native RecyclerView window rather than mounting the entire data set.
| Presentation | `Modal`, `ActivityIndicator`, `StatusBar`, `KeyboardAvoidingView` |
| Android | `DrawerLayoutAndroid`, `TouchableNativeFeedback`, `InputAccessoryView` |

The `mobile-ui` preset adds PAM UI providers, cards, headings, badges, composed
inputs, checkboxes, radio groups, drawers, popovers, menus, tabs, and other
accessible controls. Prefer library components for product UI and core
primitives for custom layout or low-level integration.

## Lifecycle

Override only the hooks a component needs:
Expand Down
25 changes: 2 additions & 23 deletions scripts/package-runtime.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ pam_target=$3
output_directory=$4
package="pam-${pam_version}-${pam_target}"
package_root="${output_directory}/${package}"
expected_native_version=0.5.88
expected_mobile_ui_version=0.2.1
expected_native_version=0.6.1

test -x "${pam_binary}" || {
echo "PAM binary is not executable: ${pam_binary}" >&2
Expand Down Expand Up @@ -42,8 +41,7 @@ mkdir -p \
"${package_root}/etc/conf.d" \
"${package_root}/lib/php/extensions" \
"${package_root}/share/pam/runtime" \
"${package_root}/share/pam/native" \
"${package_root}/share/pam/mobile-ui"
"${package_root}/share/pam/native"

cp "${pam_binary}" "${package_root}/bin/pam"
cp "${php_library}" "${package_root}/lib/libphp.so"
Expand All @@ -52,23 +50,14 @@ test -f pam-native/Cargo.toml || {
echo "Pam Native SDK source is missing from the release checkout." >&2
exit 66
}
test -f pam-mobile-ui/composer.json || {
echo "PAM Mobile UI source is missing from the release checkout." >&2
exit 66
}
native_version=$(
sed -n 's/^version = "\([^"]*\)"$/\1/p' pam-native/Cargo.toml |
head -n 1
)
mobile_ui_version=$(tr -d '\r\n' <pam-mobile-ui/VERSION)
test "${native_version}" = "${expected_native_version}" || {
echo "Expected PAM Native ${expected_native_version}, found ${native_version}." >&2
exit 66
}
test "${mobile_ui_version}" = "${expected_mobile_ui_version}" || {
echo "Expected PAM Mobile UI ${expected_mobile_ui_version}, found ${mobile_ui_version}." >&2
exit 66
}
test -f runtime/catalog.json || {
echo "PAM runtime catalog is missing." >&2
exit 66
Expand Down Expand Up @@ -126,16 +115,6 @@ for rust_target in aarch64-linux-android x86_64-linux-android; do
"pam-native/target/${rust_target}/release/libpam_native_engine.a" \
"${engine_directory}/"
done
tar \
--exclude='./.git' \
--exclude='./.build' \
--exclude='./examples' \
--exclude='./tools/phpstan/vendor' \
--exclude='*/build' \
--exclude='*/.gradle' \
-C pam-mobile-ui -cf - . |
tar -C "${package_root}/share/pam/mobile-ui" -xf -

copy_dependencies() {
ldd "$1" | awk '$2 == "=>" { print $1 "|" $3 }' |
while IFS='|' read -r library_name library_path; do
Expand Down
9 changes: 1 addition & 8 deletions src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ impl InitTemplate {
"mobile" | "android" | "mobile-pure" => Ok(Self::Mobile),
"mobile-ui" | "android-ui" | "mobile+ui" => Ok(Self::MobileUi),
_ => Err(format!(
"unknown init template {value:?}; expected raw, api, laravel, desktop, mobile, or mobile-ui"
"unknown init template {value:?}; expected raw, api, laravel, desktop, or mobile"
)),
}
}
Expand Down Expand Up @@ -1991,12 +1991,6 @@ fn choose_template(
ui.heading(format!("{:<25}", "Mobile · Core")),
ui.muted("Pure PAM Native primitives")
);
println!(
" {} {} {}",
ui.accent("08"),
ui.heading(format!("{:<25}", "Mobile · Official UI")),
ui.muted("PAM Mobile UI design system · recommended for apps")
);
print!("\n{} ", ui.command("Choose a preset [02] ›"));
std::io::stdout()
.flush()
Expand All @@ -2013,7 +2007,6 @@ fn choose_template(
"5" => Ok((InitTemplate::Laravel, true)),
"6" => Ok((InitTemplate::Desktop, false)),
"7" => Ok((InitTemplate::Mobile, false)),
"8" => Ok((InitTemplate::MobileUi, false)),
value => Err(format!("invalid init preset {value:?}")),
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -638,8 +638,7 @@ fn run() -> Result<u8, CliError> {
"--template" => {
let value = raw_args.next().ok_or_else(|| {
CliError::Commands(
"--template requires raw, api, laravel, desktop, mobile, or mobile-ui"
.to_owned(),
"--template requires raw, api, laravel, desktop, or mobile".to_owned(),
)
})?;
template = Some(
Expand Down
Loading