Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f01dd17
ci: add github workflows and gemfile
Fury3K Mar 17, 2026
22ae749
feat: implement bridge server for mobile-agent communication
Fury3K Mar 17, 2026
24a6b4e
feat: add claude-code plugin for event forwarding
Fury3K Mar 17, 2026
07ff191
feat: implement initial recursor mobile application
Fury3K Mar 17, 2026
894565d
chore(tool): add development helper scripts for bridge and mobile
MasuRii Mar 20, 2026
d5af08d
chore(githooks): add pre-commit hook for format and check enforcement
MasuRii Mar 20, 2026
14f84a6
chore(bridge): add prettier for code formatting
MasuRii Mar 20, 2026
09e64b4
style(bridge): apply prettier formatting to source files
MasuRii Mar 20, 2026
791d81c
chore(mobile): configure analyzer lints and pre-build checks
MasuRii Mar 20, 2026
a81fbc7
test(mobile): update widget test to placeholder shell
MasuRii Mar 20, 2026
18d9b3b
build(mobile): update generated plugin registrants for new dependencies
MasuRii Mar 20, 2026
3a81b29
refactor(branding): replace png logos with svg assets
MasuRii Mar 20, 2026
57bce69
refactor(mobile): replace auth flow with startup sequence
MasuRii Mar 20, 2026
64d2788
refactor(mobile): simplify router and home shell after auth removal
MasuRii Mar 20, 2026
37e2444
feat(mobile): enhance core network, storage and sync infrastructure
MasuRii Mar 20, 2026
afcf92f
feat(mobile): enhance chat functionality and tool rendering
MasuRii Mar 20, 2026
30cee7d
feat(bridge): enhance agent SDK integration and protocol handling
MasuRii Mar 20, 2026
cc4a09e
test(bridge): add jest testing infrastructure and unit tests
MasuRii Mar 20, 2026
2c0da71
chore(mobile): add flutter_svg dependency for branding assets
MasuRii Mar 20, 2026
7bb6309
test(mobile): add unit and integration tests for core features
MasuRii Mar 20, 2026
db5cef1
docs: update architecture and wireframes for startup flow
MasuRii Mar 20, 2026
e21ea7c
feat(docs): add documentation site with GitHub Pages deployment
Fury3K Mar 20, 2026
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
70 changes: 70 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -euo pipefail

REPO_ROOT="$(git rev-parse --show-toplevel)"
cd "$REPO_ROOT"

mapfile -t STAGED_DART_FILES < <(
git diff --cached --name-only --diff-filter=ACMR \
| grep -E '^apps/mobile/.*\.dart$' \
| grep -Ev '\.(g|freezed)\.dart$' \
|| true
)

mapfile -t STAGED_BRIDGE_FILES < <(
git diff --cached --name-only --diff-filter=ACMR \
| grep -E '^packages/bridge/' \
| grep -Ev '^packages/bridge/(dist|node_modules)/' \
| grep -E '\.(ts|js|cjs|mjs|json)$' \
|| true
)

if [[ ${#STAGED_DART_FILES[@]} -eq 0 && ${#STAGED_BRIDGE_FILES[@]} -eq 0 ]]; then
echo "pre-commit: no staged mobile or bridge source files found; skipping checks."
exit 0
fi

if [[ ${#STAGED_DART_FILES[@]} -gt 0 ]]; then
echo "pre-commit: formatting staged Dart files"
dart format "${STAGED_DART_FILES[@]}"
git add "${STAGED_DART_FILES[@]}"

ANALYZE_TARGETS=()
for file in "${STAGED_DART_FILES[@]}"; do
ANALYZE_TARGETS+=("${file#apps/mobile/}")
done

echo "pre-commit: analyzing staged Dart files"
pushd apps/mobile > /dev/null
flutter analyze "${ANALYZE_TARGETS[@]}"
popd > /dev/null
fi

if [[ ${#STAGED_BRIDGE_FILES[@]} -gt 0 ]]; then
if [[ ! -d packages/bridge/node_modules ]]; then
echo "pre-commit: packages/bridge/node_modules is missing. Run 'cd packages/bridge && npm ci' first." >&2
exit 1
fi

BRIDGE_RELATIVE_FILES=()
for file in "${STAGED_BRIDGE_FILES[@]}"; do
BRIDGE_RELATIVE_FILES+=("${file#packages/bridge/}")
done

echo "pre-commit: formatting staged bridge files"
pushd packages/bridge > /dev/null
npm exec prettier -- --write "${BRIDGE_RELATIVE_FILES[@]}"
popd > /dev/null
git add "${STAGED_BRIDGE_FILES[@]}"

echo "pre-commit: typechecking bridge"
pushd packages/bridge > /dev/null
npm run typecheck

echo "pre-commit: running bridge tests"
npm run test:ci

echo "pre-commit: building bridge"
npm run build
popd > /dev/null
fi
164 changes: 164 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
name: Deploy

on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
environment:
description: "Deployment environment"
required: true
default: staging
type: choice
options:
- staging
- production

jobs:
build-android:
name: Build Android
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/mobile

steps:
- uses: actions/checkout@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: temurin

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.22.x"
channel: stable
cache: true

- name: Install dependencies
run: flutter pub get

- name: Run code generation
run: dart run build_runner build --delete-conflicting-outputs

- name: Decode keystore
run: |
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android/app/keystore.jks

- name: Build App Bundle
env:
KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: flutter build appbundle --release

- name: Upload AAB artifact
uses: actions/upload-artifact@v4
with:
name: android-release
path: apps/mobile/build/app/outputs/bundle/release/app-release.aab

build-ios:
name: Build iOS
runs-on: macos-latest
defaults:
run:
working-directory: apps/mobile

steps:
- uses: actions/checkout@v4

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: "3.22.x"
channel: stable
cache: true

- name: Install Ruby + Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: true

- name: Install dependencies
run: flutter pub get

- name: Run code generation
run: dart run build_runner build --delete-conflicting-outputs

- name: Fastlane — certificates
working-directory: .
env:
MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APP_PASSWORD }}
run: bundle exec fastlane ios certificates

- name: Fastlane — build
working-directory: .
env:
MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
run: bundle exec fastlane ios build

- name: Upload IPA artifact
uses: actions/upload-artifact@v4
with:
name: ios-release
path: apps/mobile/build/ios/iphoneos/Runner.app

deploy-android:
name: Deploy Android
runs-on: ubuntu-latest
needs: build-android
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')

steps:
- uses: actions/checkout@v4

- name: Download AAB
uses: actions/download-artifact@v4
with:
name: android-release

- name: Install Ruby + Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: true

- name: Deploy to Play Store
env:
SUPPLY_JSON_KEY: ${{ secrets.GOOGLE_PLAY_JSON_KEY }}
run: bundle exec fastlane android deploy

deploy-ios:
name: Deploy iOS
runs-on: macos-latest
needs: build-ios
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')

steps:
- uses: actions/checkout@v4

- name: Download IPA
uses: actions/download-artifact@v4
with:
name: ios-release

- name: Install Ruby + Fastlane
uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: true

- name: Deploy to TestFlight
env:
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APP_PASSWORD }}
FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }}
run: bundle exec fastlane ios testflight
56 changes: 56 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Deploy Docs to GitHub Pages

on:
push:
branches: [main]
paths:
- "docs-site/**"
- ".github/workflows/docs.yml"
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: true

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}

steps:
- uses: actions/checkout@v4

- name: Configure GitHub Pages
uses: actions/configure-pages@v5

- name: Upload docs-site as Pages artifact
uses: actions/upload-pages-artifact@v3
with:
path: docs-site

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

update-repo:
name: Update repo metadata
runs-on: ubuntu-latest
needs: deploy
permissions:
contents: read
steps:
- name: Set homepage URL and description
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh repo edit RecursiveDev/ReCursor \
--homepage "https://recursivedev.github.io/ReCursor" \
--description "Mobile-first companion UI for AI coding workflows - Flutter app with OpenCode-like UX, Claude Code Hooks integration, and Agent SDK support"
Loading
Loading