platforms/android/skills/tasker-xml/SKILL.md
Create Tasker profiles and tasks via XML for Android automation. Use when adding new Tasker functionality, creating Intent Received handlers, or building automation that integrates with the rho.tasker extension.
npx skillsauth add mikeyobrien/rho tasker-xmlInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create importable Tasker profiles and tasks via XML files.
Write XML files to /storage/emulated/0/Download/ for easy import:
/storage/emulated/0/Download/MyProfile.prf.xml
.prf.xml - Profile with linked task(s).tsk.xml - Standalone task.prj.xml - Full project<?xml version="1.0" encoding="UTF-8"?>
<TaskerData sr="" dvi="1" tv="6.3.13">
<Profile sr="prof1" ve="2">
<cdate>1706900000000</cdate>
<edate>1706900000000</edate>
<id>1</id>
<mid0>1</mid0>
<nme>Profile Name</nme>
<!-- Event/State goes here -->
</Profile>
<Task sr="task1">
<cdate>1706900000000</cdate>
<edate>1706900000000</edate>
<id>1</id>
<nme>Task Name</nme>
<pri>6</pri>
<!-- Actions go here -->
</Task>
</TaskerData>
Important: Profile <mid0> must match Task <id>.
Use inside <Profile> with <Event sr="con0" ve="2">:
| Code | Event | |------|-------| | 599 | Intent Received | | 461 | Notification | | 463 | New Window | | 2078 | App Changed | | 3050 | Variable Set |
<Event sr="con0" ve="2">
<code>599</code>
<Str sr="arg0" ve="3">rho.tasker.my_action</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
</Event>
arg0: Intent action name (e.g., rho.tasker.open_app)arg1: Priority (0 = normal)arg2: Stop event (0 = no)arg3: Cat (category filter, usually empty)arg4: Data filter (usually empty)Use inside <Task> with <Action sr="actN" ve="7">:
| Code | Action | Key Args | |------|--------|----------| | 20 | Launch App | arg0=app name | | 25 | Go Home | (none) | | 30 | Wait | arg0=hours, arg1=mins, arg2=ms, arg3=secs | | 37 | If | arg0=condition | | 38 | End If | (none) | | 43 | Else | (none) | | 104 | Browse URL | arg0=url | | 123 | Run Shell | arg0=command, arg1=use root, arg2=timeout | | 126 | Return | (stops task) | | 130 | Perform Task | arg0=task name | | 137 | Stop | (stops task) | | 410 | Write File | arg0=path, arg1=content | | 547 | Variable Set | arg0=name, arg1=value | | 548 | Variable Clear | arg0=name | | 549 | Variable Add | arg0=name, arg1=value | | 550 | Variable Subtract | arg0=name, arg1=value | | 559 | Flash | arg0=text |
AutoInput uses plugin action code -1 with Bundle configuration.
<Action sr="act0" ve="7">
<code>-1</code>
<Bundle sr="arg0">
<Vals sr="val">
<com.twofortyfouram.locale.intent.extra.BLURB>Check Screen
Configuration: Check Screen</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigUIQuery</Str>
<Int sr="arg3" val="600"/>
</Action>
After this action, these variables are available:
%aitext() - Array of visible text%aiid() - Array of element IDs%aicoords() - Array of x,y coordinates%aiapp - Current app package<Action sr="act0" ve="7">
<code>-1</code>
<Bundle sr="arg0">
<Vals sr="val">
<com.twofortyfouram.locale.intent.extra.BLURB>Action: Click [ Type:Text Value:%target ]</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<action_type>click</action_type>
<action_type-type>java.lang.String</action_type-type>
<value>%target</value>
<value-type>java.lang.String</value-type>
<type>text</type>
<type-type>java.lang.String</type-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigAction</Str>
<Int sr="arg3" val="600"/>
</Action>
<Action sr="act0" ve="7">
<code>-1</code>
<Bundle sr="arg0">
<Vals sr="val">
<com.twofortyfouram.locale.intent.extra.BLURB>Action: Click [ Type:Point Value:%xcoord,%ycoord ]</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<action_type>click</action_type>
<action_type-type>java.lang.String</action_type-type>
<value>%xcoord,%ycoord</value>
<value-type>java.lang.String</value-type>
<type>point</type>
<type-type>java.lang.String</type-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigAction</Str>
<Int sr="arg3" val="600"/>
</Action>
<Action sr="act0" ve="7">
<code>547</code>
<Str sr="arg0" ve="3">%my_var</Str>
<Str sr="arg1" ve="3">my value</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
<Int sr="arg5" val="3"/>
<Int sr="arg6" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>20</code>
<Str sr="arg0" ve="3">Telegram</Str>
<Str sr="arg1" ve="3"/>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>30</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="500"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>410</code>
<Str sr="arg0" ve="3">/storage/emulated/0/rho/result.txt</Str>
<Str sr="arg1" ve="3">Content to write
Can be multiline
Variables work: %myvar</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>559</code>
<Str sr="arg0" ve="3">Toast message here</Str>
<Int sr="arg1" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>25</code>
<Int sr="arg0" val="0"/>
<Int sr="arg1" val="0"/>
</Action>
<Action sr="act0" ve="7">
<code>123</code>
<Str sr="arg0" ve="3">echo "Hello"</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="10"/>
<Str sr="arg3" ve="3">%output</Str>
<Str sr="arg4" ve="3">%err_output</Str>
<Str sr="arg5" ve="3"/>
</Action>
<!-- If %direction equals "down" -->
<Action sr="act0" ve="7">
<code>37</code>
<Str sr="arg0" ve="3">%direction</Str>
<Int sr="arg1" val="0"/>
<Str sr="arg2" ve="3">down</Str>
<Int sr="arg3" val="0"/>
</Action>
<!-- Actions for down -->
<Action sr="act1" ve="7">
<code>43</code>
</Action>
<!-- Else actions -->
<Action sr="act2" ve="7">
<code>38</code>
</Action>
For rho.tasker.* handlers, use this standard pattern:
<?xml version="1.0" encoding="UTF-8"?>
<TaskerData sr="" dvi="1" tv="6.3.13">
<Profile sr="prof1" ve="2">
<cdate>1706900000000</cdate>
<edate>1706900000000</edate>
<id>1</id>
<mid0>1</mid0>
<nme>Rho Action Name</nme>
<Event sr="con0" ve="2">
<code>599</code>
<Str sr="arg0" ve="3">rho.tasker.action_name</Str>
<Int sr="arg1" val="0"/>
<Int sr="arg2" val="0"/>
<Str sr="arg3" ve="3"/>
<Str sr="arg4" ve="3"/>
</Event>
</Profile>
<Task sr="task1">
<cdate>1706900000000</cdate>
<edate>1706900000000</edate>
<id>1</id>
<nme>Rho Action Handler</nme>
<pri>6</pri>
<!-- A1: Get result_file from intent -->
<Action sr="act0" ve="7">
<code>547</code>
<Str sr="arg0" ve="3">%result_file</Str>
<Str sr="arg1" ve="3">%result_file</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
<Int sr="arg5" val="3"/>
<Int sr="arg6" val="0"/>
</Action>
<!-- A2: Do the actual work here -->
<!-- A3: AutoInput UI Query to get screen state -->
<Action sr="act1" ve="7">
<code>-1</code>
<Bundle sr="arg0">
<Vals sr="val">
<com.twofortyfouram.locale.intent.extra.BLURB>Check Screen
Configuration: Check Screen</com.twofortyfouram.locale.intent.extra.BLURB>
<com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type>
<net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled>
<net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type>
</Vals>
</Bundle>
<Str sr="arg1" ve="3">com.joaomgcd.autoinput</Str>
<Str sr="arg2" ve="3">com.joaomgcd.autoinput.activity.ActivityConfigUIQuery</Str>
<Int sr="arg3" val="600"/>
</Action>
<!-- A4: Write result file in standard format -->
<Action sr="act2" ve="7">
<code>410</code>
<Str sr="arg0" ve="3">%result_file</Str>
<Str sr="arg1" ve="3">%aiapp
~~~
%aicoords()
~~~
%aiid()
~~~
%aitext()
~~~
%err</Str>
<Int sr="arg2" val="0"/>
<Int sr="arg3" val="0"/>
<Int sr="arg4" val="0"/>
</Action>
</Task>
</TaskerData>
The rho.tasker extension expects results in this format:
app_name
~~~
x1,y1,x2,y2,...
~~~
id1,id2,...
~~~
text1|||text2|||...
~~~
error_message_or_empty
Use %aiapp, %aicoords(), %aiid(), %aitext() from AutoInput.
Action numbering: Actions use sr="act0", sr="act1", etc. Sequential.
Profile/Task IDs: Use unique IDs (100+) to avoid conflicts with existing Tasker config.
Intent extras: Variables from intent extras are automatically available with same name (e.g., %app_name from intent extra app_name).
Test incrementally: Start with a Flash action to verify the profile triggers, then add complexity.
Debugging: Add Flash actions to show variable values during development.
data-ai
Install and configure Rho from scratch (Doom-style init.toml + sync). Only prereq: a coding agent that can run shell commands.
documentation
Detect and resolve orphaned notes in the vault. Use during heartbeat maintenance or when vault status shows orphans. Finds notes with no inbound wikilinks and either connects them to the graph or flags them for cleanup.
testing
Update the pi-coding-agent npm package to the latest version. Use when the user wants to update pi, upgrade pi, or get the latest version of the coding agent.
development
Run a curiosity-driven explore-and-build loop to ship one useful improvement.