← 返回
效率工具 中文

Cancorteaw App

Manage Expo React Native apps on OpenClaw: create apps, add screens, start web previews on localhost, and check preview status safely within /home/patron/apps.
在 OpenClaw 管理 Expo React Native 应用:创建应用、添加页面、启动本地 Web 预览,并在 /home/patron/apps 安全查看预览状态。
cancorleone
效率工具 clawhub v0.1.1 1 版本 100000 Key: 无需
★ 0
Stars
📥 1,030
下载
💾 6
安装
1
版本
#latest

概述

cancorteaw-app

Local Expo / React Native app builder runner for my OpenClaw server.

This skill is a controlled runner that only executes an allowlisted script:

/home/patron/apps/_bin/appctl

and that script is restricted to operate under:

/home/patron/apps/.

What it does

This skill wraps appctl to provide a safe, repeatable workflow:

  • Create a new Expo app scaffold under /home/patron/apps/
  • Add a screen file under /home/patron/apps//app/.tsx
  • Start a web preview (expo start --web) bound to 127.0.0.1 on a chosen port
  • Check status of the preview process

Commands

1) Create a new app

Command:

  • new

Example:

  • new demoapp

Result:

  • Creates /home/patron/apps/demoapp
  • Initializes git (best-effort)
  • Uses npx create-expo-app in non-interactive mode

2) Add a screen

Command:

  • add-screen </code></li></ul><p><strong>Example:</strong></p><ul><li><code>add-screen demoapp Settings "Settings"</code></li></ul><p><strong>Result:</strong></p><ul><li>Writes: <code>/home/patron/apps/demoapp/app/Settings.tsx</code></li><li>Makes a git commit (best-effort)</li></ul><hr><h3>3) Start web preview</h3><p><strong>Command:</strong></p><ul><li><code>preview <name></code></li></ul><p><strong>Environment:</strong></p><ul><li><code>EXPO_PORT</code> (optional): override preview port </li></ul><p> Default: <code>19006</code></p><p><strong>Example:</strong></p><ul><li><code>preview demoapp</code></li><li><code>EXPO_PORT=19010 preview demoapp</code></li></ul><p><strong>Result:</strong></p><ul><li>Starts <code>npx expo start --web --port <port></code></li><li>Writes logs to: <code>/home/patron/apps/_logs/<name>.preview.log</code></li><li>Writes pid to: <code>/home/patron/apps/_state/<name>.pid</code></li><li>Writes port to: <code>/home/patron/apps/_state/<name>.port</code></li></ul><hr><h3>4) Status</h3><p><strong>Command:</strong></p><ul><li><code>status <name></code></li></ul><p><strong>Example:</strong></p><ul><li><code>status demoapp</code></li></ul><p><strong>Result:</strong></p><ul><li>Prints RUNNING with URL if process is alive</li><li>Otherwise prints STOPPED</li></ul><h2>Safety / Guardrails</h2><ul><li>The runner is <strong>allowlisted</strong>: only <code>node</code>, <code>npm</code>, <code>npx</code>, <code>git</code>, <code>bash</code>, <code>python3</code> can be invoked.</li><li>All project paths are constrained to <code>/home/patron/apps</code>.</li><li>Preview binds to <code>127.0.0.1</code> (loopback). Expose it externally only via explicit SSH tunnel if desired.</li><li>Telemetry is disabled for Expo in preview (<code>EXPO_NO_TELEMETRY=1</code>).</li></ul><h2>Troubleshooting</h2><ul><li>If <code>preview</code> says running but page doesn’t load: check the log file in <code>/home/patron/apps/_logs/</code>.</li><li>If a port is busy: set <code>EXPO_PORT</code> to a free port and re-run <code>preview</code>.</li><li>To stop preview: <code>kill $(cat /home/patron/apps/_state/<name>.pid)</code> (if pid exists).</li></ul></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 1 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v0.1.1</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-03-29 15:50 安全 安全 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <div class="sec-grid"> <div class="sec-card"> <h4>腾讯云安全 (Keen)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://tix.qq.com/search/skill?keyword=bcd2c4df120ebc04795a59628279df28" target="_blank">查看报告</a> </div> <div class="sec-card"> <h4>腾讯云安全 (Sanbu)</h4> <div class="sec-status sec-safe"> 安全,无风险 </div> <a href="https://static.cloudsec.tencent.com/html-report-v2/2026/05/25/400055_71ec82faf83050c6b64cfad3e6243e87.html?q-sign-algorithm=sha1&q-ak=AKID8JMG1bzBC1dz96qNhssfFftujT1NCoFi&q-sign-time=1781389833%3B1812925833&q-key-time=1781389833%3B1812925833&q-header-list=host&q-url-param-list=&q-signature=a737a9856a1d21103963a8ec198ead7607c9de28" target="_blank">查看报告</a> </div> </div> </div> </div> <!-- Recommended Skills --> <div style="margin-top:24px;"> <h2 style="font-size:18px;font-weight:600;margin-bottom:16px;">🔗 相关推荐</h2> <div class="rec-grid"> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">productivity</span> <h3><a href="/s/word-docx">Word / DOCX</a></h3> <div class="rec-owner">ivangdavila</div> <div class="rec-desc">创建、检查和编辑 Microsoft Word 文档及 DOCX 文件,支持样式、编号、修订记录、表格、分节符及兼容性检查等功能。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 440</span> <span style="color:#5b6abf;">📥 147,888</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">productivity</span> <h3><a href="/s/weather">Weather</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">获取当前天气和预报(无需API密钥)</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 446</span> <span style="color:#5b6abf;">📥 226,382</span> </div> </div> <div class="rec-card"> <span class="badge-cat" style="margin-bottom:8px;display:inline-block;">productivity</span> <h3><a href="/s/obsidian">Obsidian</a></h3> <div class="rec-owner">steipete</div> <div class="rec-desc">操作 Obsidian 仓库(纯 Markdown 笔记)并通过 obsidian-cli 自动化。</div> <div class="rec-stats"> <span style="color:#f39c12;">★ 432</span> <span style="color:#5b6abf;">📥 103,815</span> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>