{"id":50789687,"url":"https://github.com/thecodedaniel/mopot","last_synced_at":"2026-06-12T10:02:40.701Z","repository":{"id":361926237,"uuid":"1256127465","full_name":"TheCodeDaniel/mopot","owner":"TheCodeDaniel","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-01T20:28:35.000Z","size":359,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T22:14:23.499Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TheCodeDaniel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T13:40:36.000Z","updated_at":"2026-06-01T20:29:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/TheCodeDaniel/mopot","commit_stats":null,"previous_names":["thecodedaniel/mopot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/TheCodeDaniel/mopot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fmopot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fmopot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fmopot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fmopot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TheCodeDaniel","download_url":"https://codeload.github.com/TheCodeDaniel/mopot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeDaniel%2Fmopot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34238715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-12T10:02:39.760Z","updated_at":"2026-06-12T10:02:40.692Z","avatar_url":"https://github.com/TheCodeDaniel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mopot\n\n**Push code. Mopot finds the bugs and opens the PR.**\n\nMopot is an autonomous mobile test + fix pipeline agent. A developer pushes code to GitHub and Mopot handles the hard parts — it builds the Flutter/Android app, navigates it with Claude AI vision to find bugs, writes code fixes, and opens a Pull Request. Humans stay in control through two approval gates powered by UiPath Action Center.\n\nBuilt for **UiPath AgentHack 2026 — Track 3: UiPath Test Cloud**.\n\n---\n\n## How It Works\n\n```\nGitHub push\n    │\n    ▼ UiPath Maestro triggers pipeline\n    │\n    ├─ flutter build apk\n    ├─ Claude vision navigates app → finds bugs → BugReport\n    │\n    ├─ HUMAN GATE 1: Approve auto-fix? (UiPath Action Center)\n    │\n    ├─ Claude writes code fixes → commits → opens GitHub PR\n    ├─ Retest on fixed build\n    │\n    └─ HUMAN GATE 2: Fix PR is ready for review.\n                     All tests passing. Merge the PR?\n```\n\n---\n\n## Prerequisites\n\n| Tool | Version | Purpose |\n|---|---|---|\n| Python | 3.11+ | Agent runtime |\n| Node.js | 18+ | CLI |\n| Flutter | 3.x | Build + test |\n| Android SDK | API 34 | ADB + emulator |\n| UiPath Robot | Community+ | Pipeline orchestration |\n\n---\n\n## Quick Start\n\n### 1. Clone and install\n\n```bash\ngit clone https://github.com/thecodedaniel/mopot.git\ncd mopot\npip install -r requirements.txt\nnpm install\nnpm install -g .\n```\n\n### 2. Run the setup wizard\n\n```bash\nmopot init\n```\n\nThis opens a browser UI at `http://localhost:3420` where you configure all credentials in 4 steps. The wizard auto-detects your installed Android emulators, reads your git default branch from the selected project folder, and provides a native OS folder picker — so most of Step 4 fills itself in.\n\n### 3. Start the pipeline server\n\n```bash\nuvicorn webhook.main:app --port 7432\n```\n\n### 4. Configure your GitHub webhook\n\nIn your Flutter repo's Settings → Webhooks, add:\n- **Payload URL**: `http://your-machine-ip:7432/webhook/github`\n- **Content type**: `application/json`\n- **Secret**: your `WEBHOOK_SECRET` value\n- **Events**: Just the push event\n\n### 5. Push code — Mopot runs\n\n```bash\ngit push origin main\n# Pipeline starts automatically\nmopot logs --follow\n```\n\n---\n\n## CLI Commands\n\n```bash\nmopot init        # First-time setup wizard (browser UI)\nmopot config      # Update credentials\nmopot status      # Health check all connections\nmopot run         # Manually trigger pipeline\nmopot logs        # View recent runs\nmopot logs --follow \u003crun-id\u003e  # Live tail a specific run\nmopot --version\n```\n\n---\n\n## Environment Variables\n\nAll secrets are injected at runtime. Copy `.env.example` to `.env` and fill in your values.\n\n```bash\nANTHROPIC_API_KEY=sk-ant-api03-...\nGITHUB_TOKEN=ghp_...\nFLUTTER_PROJECT_PATH=/path/to/flutter/project\nGITHUB_REPO=owner/repo-name\nGITHUB_DEFAULT_BRANCH=main\nWEBHOOK_SECRET=your-webhook-secret\nMOPOT_PORT=7432\nMOPOT_AVD=Pixel_9_Pro\n```\n\nIn production, store all secrets in **UiPath Orchestrator Assets** — Mopot's setup wizard (`mopot init`) handles this automatically.\n\n---\n\n## Repository Structure\n\n```\nmopot/\n├── cli/                        Node.js CLI (mopot command)\n│   ├── index.js\n│   ├── commands/               init, config, status, run, logs\n│   └── server/                 Express setup wizard + HTML UI\n├── agents/                     Python agents (Claude)\n│   ├── tester_agent.py         Claude vision loop — finds bugs\n│   └── fixer_agent.py          Claude fixes code — opens PR\n├── platforms/                  Mobile platform adapter layer\n│   ├── base_adapter.py         Abstract interface (do not modify)\n│   ├── android_adapter.py      ADB + Flutter CLI (active)\n│   ├── ios_adapter.py          Stub — v2.0\n│   └── react_native_adapter.py Stub — v2.0\n├── uipath/                     UiPath config templates\n│   ├── maestro_process.json    BPMN pipeline definition\n│   ├── test_cloud_config.json  Test Cloud integration\n│   └── agent_builder/          Agent Builder action definitions\n├── webhook/\n│   └── main.py                 FastAPI server — receives push events\n├── tests/\n│   └── sample_flutter_app/     Demo Flutter app with 3 intentional bugs\n├── Dockerfile\n├── docker-compose.yml\n└── requirements.txt\n```\n\n---\n\n## UiPath Components\n\n| Component | Purpose |\n|---|---|\n| **Maestro BPMN** | Pipeline coordination — import `uipath/maestro_process.json` |\n| **Test Cloud** | Formal test execution — import `uipath/test_cloud_config.json` |\n| **Action Center** | Human approval gates (Gate 1: fix? Gate 2: merge PR?) |\n| **Orchestrator Assets** | Encrypted secret storage for all API keys |\n| **Robot** | Executes Python agents on your local machine |\n| **Agent Builder** | Action definitions — import `uipath/agent_builder/agent_config.json` |\n\n---\n\n## Docker (Linux only for emulator)\n\n```bash\ncp .env.example .env  # fill in your values\ndocker-compose up\n```\n\n\u003e **macOS note:** The Android emulator requires KVM hardware acceleration, which is only available on Linux. On macOS, run the pipeline server natively and let it connect to an emulator running on the host. The `Dockerfile` is production-ready for Linux CI environments.\n\n---\n\n## Demo App\n\n`tests/sample_flutter_app/` is a Flutter todo app with three intentional bugs for hackathon demos:\n\n1. **Null crash** — `_items.length` on an uninitialised nullable list\n2. **Row overflow** — `Text` in a `Row` without `Expanded` wrapper\n3. **Broken route** — `Navigator.pushNamed(context, '/details')` with no `/details` route registered\n\nRun `flutter test` inside that directory to see all three tests fail before Mopot fixes them.\n\n---\n\n## Hackathon Submission\n\n- **Event**: UiPath AgentHack 2026\n- **Track**: Track 3 — UiPath Test Cloud\n- **Builder**: Daniel Ainoko / thecodedaniel\n- **Deadline**: June 29, 2026\n\n---\n\n## License\n\nMIT © Daniel Ainoko / thecodedaniel\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodedaniel%2Fmopot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthecodedaniel%2Fmopot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodedaniel%2Fmopot/lists"}