Skip to content
Merged

V2 #1

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
f104344
try1
Arenukvern Nov 21, 2025
56f0c6f
try 2
Arenukvern Nov 21, 2025
585d069
fix: assets
Arenukvern Nov 21, 2025
92ff70b
wip: true android
Arenukvern Jul 18, 2026
bed01c7
wip: true android build
Arenukvern Jul 18, 2026
ef24651
feat: complete no-Gradle plugin packaging and multi-dex support
Arenukvern Jul 30, 2026
2cfc74c
feat: it works!
Arenukvern Aug 24, 2026
23af7db
feat: assets
Arenukvern Aug 24, 2026
a4b9a15
feat: assets
Arenukvern Aug 24, 2026
b14b9dd
wip: aar
Arenukvern Aug 24, 2026
152cd90
feat: aar
Arenukvern Aug 24, 2026
29ac075
wip: aab
Arenukvern Aug 24, 2026
640d978
feat: aab
Arenukvern Aug 24, 2026
e43ddf3
feat: aab
Arenukvern Aug 24, 2026
b19a7ca
feat: oss setup
Arenukvern Aug 24, 2026
b9340d9
wip: oss
Arenukvern Aug 24, 2026
6d047cb
feat: prepared for oss
Arenukvern Aug 24, 2026
b2115fc
cleanup
Arenukvern Aug 24, 2026
6488013
fat: sdk for android
Arenukvern Sep 5, 2026
976fdf8
wip: safeguard & ux improvements
Arenukvern Sep 5, 2026
129cebb
feat(explain): dependency-plan dry-run via oka explain --deps (ADR-0008)
Arenukvern Sep 5, 2026
764ca6a
docs(checklist): extract open work only; archive completed phases
Arenukvern Sep 5, 2026
63a800a
refactor!: remove demoted cargo-apk hybrid completely (ADR-0009)
Arenukvern Sep 5, 2026
4569aa7
docs(adr): propose typed per-project Dart config (ADR-0010)
Arenukvern Sep 5, 2026
8d905c6
feat!: typed per-project Dart config — oka.yaml optional (ADR-0010)
Arenukvern Sep 5, 2026
1799a73
feat: adopt last_answer on full-Dart config; adoption hardening (ADR-…
Arenukvern Sep 6, 2026
05e27fd
feat(init): full-Dart scaffold by default; multi-dex determinism; OSS…
Arenukvern Sep 6, 2026
96af0f3
docs: north-star framing — declarative, compositional, AI-native; And…
Arenukvern Sep 6, 2026
e0370ed
docs: reframe the why — lock-in and unmanageability, not slowness
Arenukvern Sep 6, 2026
41c6fb8
chore(steward): adopt Skill Steward; contract smoke scenario; build b…
Arenukvern Sep 6, 2026
5ccebb3
docs(evidence): record first steward smoke + build benchmark runs; AG…
Arenukvern Sep 6, 2026
85497fe
chore(lint): zero analyzer warnings — just lint gate passes clean
Arenukvern Sep 6, 2026
bde52db
wip: lints issues
Arenukvern Sep 6, 2026
9449713
wip: lint fixes
Arenukvern Sep 6, 2026
ad4c950
fix lints
Arenukvern Sep 6, 2026
0a567a1
cleanup
Arenukvern Sep 6, 2026
9e3bd3f
feat: cleanup
Arenukvern Sep 6, 2026
f5a5cf1
fix: apk and aab
Arenukvern Sep 6, 2026
bab2cb6
docs: toolchain
Arenukvern Sep 6, 2026
0fc8018
feat: maven resolver
Arenukvern Sep 6, 2026
337b913
feat: stewarship
Arenukvern Sep 6, 2026
92a11b7
docs: ADR-0015 CLI verb/target split; C0-C2 phase items, FAQ, north star
Arenukvern Sep 6, 2026
c300e26
feat: artifact store + cache unification (T0), Target contract + oka …
Arenukvern Sep 7, 2026
d52aea4
feat: toolchain resolution as data (T1), platform leakage folded behi…
Arenukvern Sep 7, 2026
3fbef4c
feat: device layer through the store (T2)
Arenukvern Sep 7, 2026
47b67ac
docs: ADR-0014 distribution targets + three-tier secrets model; P0-P2…
Arenukvern Sep 7, 2026
bd75c80
feat: PublishTarget contract + credential-path policy + doctor secret…
Arenukvern Sep 7, 2026
0d7d07e
feat: oka_play + oka_conformance (P1), oka_huawei + GMS-exclusion val…
Arenukvern Sep 7, 2026
05b57e0
feat: H0-H2 hot-reload prerequisites, run session manifest, device-la…
Arenukvern Sep 7, 2026
922b291
wip: play and huawei + hot reload
Arenukvern Sep 7, 2026
9e06800
wip: hard reload
Arenukvern Sep 7, 2026
0a201a7
feat: H3-H5 dev loop — daemon session, watch classification, hot rest…
Arenukvern Sep 7, 2026
c99c355
fix: license an analysis
Arenukvern Sep 7, 2026
c8021f3
fix: device serial selection across the device layer (multi-device ho…
Arenukvern Sep 7, 2026
0aaaffe
wip: hot reload
Arenukvern Sep 7, 2026
f3d4dbe
wip: hot reload
Arenukvern Sep 7, 2026
09116dc
feat: dev-session vm.uri artifact + hot-restart relaunch fallback (AD…
Arenukvern Sep 7, 2026
9af5d61
feat: EmulatorTarget — emulator lifecycle in the composition API (ADR…
Arenukvern Sep 8, 2026
e87d12f
docs: roadmap — oka dev control-port prerequisite for mcp_flutter del…
Arenukvern Sep 8, 2026
16fdc12
feat: web configs
Arenukvern Sep 8, 2026
452fd8d
fix: VM-service ws endpoint normalization (+/ws) for http-only announ…
Arenukvern Sep 8, 2026
4af27f2
chore: example title restored after delegation smoke
Arenukvern Sep 8, 2026
0562943
docs: oka_web dartdoc polish
Arenukvern Sep 8, 2026
eea654e
feat: conform to Dart dev session contract spec v2 (.flutter_mcp/runn…
Arenukvern Sep 8, 2026
d1d8d15
feat: web target
Arenukvern Sep 8, 2026
e666846
feat: web + crazygames
Arenukvern Sep 8, 2026
197d853
wip: readme
Arenukvern Sep 8, 2026
c0e7cd5
feat: web target docs
Arenukvern Sep 8, 2026
6ee4753
fix: ci — skip example resolution under plain dart, allow-list synthe…
Arenukvern Sep 8, 2026
3428975
refactor: move the published CLI into packages/oka; workspace root is…
Arenukvern Sep 8, 2026
0dd91e1
fix: add packages/oka README (pub validation requires one)
Arenukvern Sep 8, 2026
84178af
fix: skip adb/emulator-dependent BootEmulatorStep tests when binaries…
Arenukvern Sep 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 28 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "oka",
"owner": {
"name": "Arenukvern",
"url": "https://github.com/Arenukvern/oka"
},
"plugins": [
{
"name": "oka",
"source": "./plugin",
"description": "No-Gradle Flutter Android build system: flutter assemble + direct Android SDK tools for 3-5x faster incremental builds, with plugin packaging, AAB support, and dependency recovery. Bundles agent skills.",
"version": "0.1.6",
"keywords": [
"flutter",
"android",
"build-system",
"gradle",
"apk",
"aab",
"dart",
"cli"
],
"skills": [
"./skills"
]
}
]
}
12 changes: 12 additions & 0 deletions .cursor/commands/update-faq.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Update FAQ

After a code change, sync documentation. Stay short & smart.

1. Classify the change:
- Architectural / internal trade-off → `docs/guides/design_faq.md` (edit existing Q&A first) or new ADR in `docs/decisions/`
- Command / API usage pattern → `docs/guides/build_and_config.md`
- Both → both, but never duplicate paragraphs between them
2. Verify against the actual codebase — document what exists, not wishful APIs.
3. Remove or supersede Q&As that no longer apply.
4. Keep answers ≤3 sentences; long examples belong in code/examples.
5. If a design fork was decided, ensure an accepted ADR exists in `docs/decisions/` and update its `index.md`.
23 changes: 23 additions & 0 deletions .cursor/rules/faq_usage.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
description: Router for oka docs — when to read the design FAQ vs build guide vs ADRs
alwaysApply: true
---

# FAQ usage — oka

Before answering questions about this repo, route to the right doc:

| Question type | Read |
|---|---|
| **Why** is it designed this way? | `docs/guides/design_faq.md`, then `docs/decisions/` |
| **How** do I run/build/test? | `docs/guides/build_and_config.md` |
| What does oka own / not own? | `docs/start_here/why_this_repo_matters.md` |
| Phase status / evidence | `docs/PHASE_CHECKLIST.md` |
| Behavior of code | The code and tests themselves — docs only link |

Rules:

- Never paraphrase implementation in answers; link to the authoritative file.
- After changing architecture → add/update a Q&A in `docs/guides/design_faq.md` (or ADR).
- After changing commands/API usage → update `docs/guides/build_and_config.md`.
- Design forks require a decision checkpoint + ADR before coding.
65 changes: 65 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: CI

on:
push:
branches: [main]
pull_request:

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dart-lang/setup-dart@v1
with:
sdk: stable
# --no-example: example/ is a Flutter app; plain-dart resolution of it
# fails (flutter_test is sdk-sourced). Dart >= 3.13 resolves example/
# by default. The root suite (ADR conformance + real-pipeline evidence)
# skips gracefully without the Flutter/Android SDKs.
- run: dart pub get --no-example
- run: dart analyze --fatal-infos
- name: Root test suite (cross-package conformance)
run: dart test
- name: Package test suites
run: |
set -e
for pkg in packages/*/; do
if [ -d "$pkg/test" ]; then
echo "=== $pkg"
(cd "$pkg" && dart test)
fi
done

contracts:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dart-lang/setup-dart@v1
with:
sdk: stable
- name: Contract gates (version sync, docs drift, changelog hygiene)
env:
OKA_ROOT: ${{ github.workspace }}
run: bash tool/contracts/check_contracts.sh

validate:
# pub.dev dry-run for every publishable package (the workspace root is
# publish_to: none). Runs on PRs touching packaging.
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- uses: dart-lang/setup-dart@v1
with:
sdk: stable
- run: dart pub get --no-example
- name: Publish dry-runs
run: |
set -e
for pkg in packages/*/; do
if [ -f "$pkg/pubspec.yaml" ] && ! grep -q "publish_to: none" "$pkg/pubspec.yaml"; then
echo "=== $pkg"
(cd "$pkg" && dart pub publish --dry-run)
fi
done
69 changes: 69 additions & 0 deletions .github/workflows/pub_publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Publish to pub.dev

on:
push:
tags:
- 'v*'
workflow_dispatch:

permissions:
contents: read
id-token: write

concurrency:
group: pub-dev-${{ github.ref_name }}
cancel-in-progress: false

jobs:
publish:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4

- uses: dart-lang/setup-dart@v1
with:
sdk: stable

- name: Assert release tag matches VERSION
if: github.event_name == 'push'
run: |
tag="${{ github.ref_name }}"
version="$(tr -d '[:space:]' < VERSION)"
tag_version="${tag#v}"
if [[ "$tag_version" != "$version" ]]; then
echo "FAIL: tag ($tag) does not match VERSION ($version)" >&2
exit 1
fi
bash tool/release/check_version_sync.sh

# --no-example: example/ is a Flutter app; dart >= 3.13 resolves it by
# default, which fails under plain Dart (flutter_test is sdk-sourced).
- run: dart pub get --no-example

# Split packages (ADR-0006) publish in dependency order:
# oka_core -> oka_android -> oka (the CLI, packages/oka). Hosted deps
# resolve against pub.dev, so the first release trains publish core
# before android/cli.
- name: Publish oka_core (dry-run preflight)
working-directory: packages/oka_core
run: dart pub publish --dry-run
- name: Publish oka_android (dry-run preflight)
working-directory: packages/oka_android
run: dart pub publish --dry-run
- name: Publish oka (dry-run preflight)
working-directory: packages/oka
run: dart pub publish --dry-run

- name: Publish oka_core
if: github.event_name == 'push'
working-directory: packages/oka_core
run: dart pub publish --force
- name: Publish oka_android
if: github.event_name == 'push'
working-directory: packages/oka_android
run: dart pub publish --force
- name: Publish oka
if: github.event_name == 'push'
working-directory: packages/oka
run: dart pub publish --force
21 changes: 21 additions & 0 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Release Please

on:
push:
branches:
- main

permissions:
contents: write
pull-requests: write

jobs:
release-please:
runs-on: ubuntu-latest
steps:
- name: Release Please
uses: googleapis/release-please-action@v4
with:
token: ${{ secrets.RELEASE_PLEASE_TOKEN || secrets.GITHUB_TOKEN }}
config-file: release-please-config.json
manifest-file: .release-please-manifest.json
82 changes: 82 additions & 0 deletions .github/workflows/release_pr_sync_versions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
name: Release PR — sync versions

on:
pull_request:
types: [opened, synchronize, reopened]
branches: [main]

permissions:
contents: write
pull-requests: write

concurrency:
group: release-pr-sync-versions-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
detect-release-pr:
runs-on: ubuntu-latest
outputs:
is_release_pr: ${{ steps.check.outputs.is_release_pr }}
steps:
- id: check
name: Detect release-please PR
run: |
title="${{ github.event.pull_request.title }}"
head="${{ github.head_ref }}"
if [[ "$head" == release-please--* ]] || [[ "$title" == *": release "* ]]; then
echo "is_release_pr=true" >> "$GITHUB_OUTPUT"
else
echo "is_release_pr=false" >> "$GITHUB_OUTPUT"
fi

auto-sync-versions:
needs: detect-release-pr
if: needs.detect-release-pr.outputs.is_release_pr == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0

- uses: dart-lang/setup-dart@v1
with:
sdk: stable

- name: Sync release version touchpoints
run: bash tool/release/sync_version.sh

- name: Commit and push if changed
run: |
if git diff --quiet; then
echo "release version touchpoints already in sync"
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add \
VERSION \
pubspec.yaml \
.claude-plugin/marketplace.json \
plugin/.cursor-plugin/plugin.json \
plugin/.codex-plugin/plugin.json \
plugin/.claude-plugin/plugin.json
git commit -m "chore: sync release version touchpoints"
git push origin "HEAD:${{ github.event.pull_request.head.ref }}"

contract-gates:
needs: detect-release-pr
if: needs.detect-release-pr.outputs.is_release_pr == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: dart-lang/setup-dart@v1
with:
sdk: stable

- name: Run contract gates
env:
OKA_ROOT: ${{ github.workspace }}
run: bash tool/contracts/check_contracts.sh
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pubspec.lock
*.iml
*.ipr
*.iws

rust_wrapper/flutter_assets/
# Build cache
.oka_cache/

Expand All @@ -26,4 +26,8 @@ coverage/

# Local configuration
*.local.yaml
example/pubspec_overrides.yaml


# Skill Steward benchmark evidence (machine-local)
.steward/benchmark-summaries/*.json
3 changes: 3 additions & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
".": "0.1.6"
}
20 changes: 20 additions & 0 deletions .scratch/discover_app.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'dart:io';
import 'package:oka/src/build/plugin_discovery.dart';

void main() async {
final path = '${Platform.environment['HOME']}/xs/vitamins_quiz_bot/vitamin_shippic_app';
final d = PluginDiscovery(verbose: true);
final r = await d.discover(path);
print('plugins total: ${r.plugins.length}');
print('android: ${r.androidPlugins.length}');
print('unsupported: ${r.unsupported.length}');
for (final p in r.androidPlugins) {
print(' ${p.name} class=${p.qualifiedClass} unsupported=${p.unsupportedNative} reason=${p.unsupportedReason ?? "-"}');
}
try {
d.ensureSupported(r, strict: true);
print('ensureSupported: OK');
} catch (e) {
print('ensureSupported: FAIL\n$e');
}
}
Loading
Loading