AminetAminet
Search:
85481 packages online
About
Recent
Browse
Search
Upload
Setup
Services

util/misc/amipilot.lha

Mirror:Random
Showing: ppc-amigaos icongeneric icon
No screenshot available
Short:Object-level AmigaOS GUI automation
Author: simond at irrelevant.org (Simon Dick)
Uploader:simond irrelevant org (Simon Dick)
Type:util/misc
Version:1.1
Architecture:m68k-amigaos
Date:2026-08-10
Distribution:Aminet
Download:util/misc/amipilot.lha - View contents
Readme:util/misc/amipilot.readme
Downloads:54

AmiPilot is an object-level GUI automation system for classic AmigaOS:
find a window or gadget by ID, label, or role; act on it with genuinely
synthesised input (real input.device events, not coordinate guessing);
assert on the result. This archive has two pieces:

  - AmiInspect: a standalone Shell command that walks any window's
    gadget tree and prints its roles, labels, classes, IDs, positions,
    and states - the platform's first UIA-Inspect / browser element-
    picker equivalent. No host machine, server, or session required.
  - AmiPilotServer: a commodity that hosts the same walker plus a real
    action engine (click, type, drag, read state, launch a subject
    under test, move files, walk menus) behind a public ARexx port
    and, from 0.3, the same command set over a host-facing wire
    protocol - serial.device, or (from 0.4) TCP - so a script running
    on the SAME Amiga, or a Python client on a host machine (over the
    wire, or now a real serial port directly), can drive another
    program's GUI. See "Documentation" below for the full command/wire
    reference.

Features
--------
  - Prints any window's gadget tree by role, label, class, ID, position,
    and state - target the active window, or any window by a substring
    of its title.
  - Plain GadTools gadgets: correctly distinguishes a checkbox from a
    button even though both produce the identical underlying gadget
    type, using GadTools' own documented attribute-probing contract
    rather than a guess.
  - BOOPSI/ReAction gadgets: reads the real, live class name
    (button.gadget, checkbox.gadget, layout.gadget, and more) via a
    documented NDK mechanism, and maps known classes to a role.
  - Genuine input.device event synthesis for clicks, typed text, and
    (from 0.4) drags (IECLASS_NEWPOINTERPOS/RAWKEY/RAWMOUSE), not
    coordinate-level or posted-message shortcuts - driven from an
    ARexx port (AmiPilotServer) or the same commands over serial.device
    or TCP from a host Python client.
  - From 0.4: locate a gadget by role and label text, or by position
    among several matches (ROLE=/LABEL=/INDEX=), not just by numeric ID
    or a manifest name; drag a gadget by a pixel offset (for a
    slider/scroller) or onto a second gadget (drag-and-drop/reorder);
    launch the test subject itself over the wire (LAUNCH); read and
    manage files inside an allowlisted directory (the file API); walk
    and select a window's live menu strip (MENU/MENUPICK).
  - Verified against real, unmodified stock AmigaOS software (including
    a real crash-causing bug found and fixed this way) and purpose-built
    conformance fixtures, not just software built for this project.
  - Honest, documented limits rather than silent gaps: a few specific,
    well-understood cases (PLACETEXT_IN and PLACETEXT_RIGHT button
    labels, a window.class window's layout.gadget-nested children) are
    genuinely unreadable at this tier, and AmiInspect says so rather
    than guessing - see the included guide's "Locator Tiers and
    Limits" page, including a table of which locator tier reaches
    which kind of UI and why.
  - From 0.5: wait for a real condition (a window appearing/closing, a
    gadget's text matching) instead of a guessed sleep, closing the
    classic click-then-check race (WAITFOR, CLICK's EXPECT=); community-
    authored "quirk profiles" for third-party applications you don't
    control, using the same manifest file format; a golden-tree
    mechanism for catching structural UI drift as a regression; and a
    bridge into MUI (Magic User Interface) applications through their
    own built-in ARexx port (MUIREXX).
  - From 1.0: push files from the host onto the Amiga, not just read
    them back (FSPUT); launch a program the way Workbench itself does
    - a genuine WBStartup message with tooltype overrides and project
    arguments (WBLAUNCH); capture a screen or window as a screenshot,
    on classic planar screens or genuine Picasso96/RTG boards, decoded
    host-side to PNG and IFF ILBM (SCREENSHOT); move and resize whole
    windows via the same synthesized drags gadgets already get
    (WINDOWMOVE/WINDOWSIZE); and wait for an Intuition Requester to
    appear (WAITFOR REQUESTER, detection only).
  - From 1.1: point at a gadget on the real screen and get back its
    exact locator interactively, no batch dump needed (PICK), reachable
    standing at the machine (AmiInspect PICK), from an ARexx script, or
    over the wire; CLICK now genuinely dismisses Intuition Requesters
    too, both window-owned and system-wide (e.g. a real disk-swap
    prompt); menu items with no keyboard shortcut are now picked via a
    genuine synthesized pointer sequence instead of being rejected
    outright; a cooperative escape hatch (WHERE/WHEREGADGET) reaches
    gadgets nested inside a window.class window's layout.gadget -
    permanently invisible to plain structural walking - via a small,
    optional ARexx port the target application itself exposes;
    INTEGER_KIND GadTools gadgets are now told apart from STRING_KIND;
    and twelve more WB3.2-era BOOPSI/ReAction gadget classes
    (clicktab, colorwheel, datebrowser, fuelgauge, four get*.gadget
    choosers, gradientslider, palette, sketchboard, speedbar,
    texteditor) get a real role instead of reporting as custom.

Requirements
------------
  - AmigaOS 2.04 (V37) or later. Plain 68000, no FPU - nothing here does
    float work or needs anything newer than a stock CPU.
  - gadtools.library (any version) is optional but recommended - without
    it, gadget classification degrades gracefully rather than failing.
  - rexxsyslib.library is required to run AmiPilotServer's ARexx port
    (AmiInspect needs neither this nor gadtools.library to run at all).

Installation
------------
  Copy "AmiInspect" and/or "AmiPilotServer" to C: (or anywhere on your
  command Path). No reboot, no configuration.

Quick start
-----------
  AmiInspect                  inspect the active window
  AmiInspect WINDOW=Prefs     inspect the first window whose title
                               contains "Prefs"
  Run AmiPilotServer           start the commodity; opens an ARexx port
                               named AMIPILOT.1 (or the next free slot)
  Run AmiPilotServer SERIAL    also carry the same commands over
                               serial.device, for a host Python client
  Run AmiPilotServer TCP       also carry the same commands over TCP
   TCPPORT=6800                (bsdsocket.library), for real hardware
                               or an emulator with no serial bridge

AI disclosure
-------------
  Be aware: AmiPilot was written largely by an AI coding agent
  (Anthropic's Claude, via Claude Code), working under human direction,
  review, and on-target testing. Every feature in this release was
  verified on-target under the Copperline emulator against real AmigaOS
  3.2.3 before being considered done. The entire source is BSD-licensed
  and open for review.

Documentation
-------------
  The full command reference (Shell, ARexx, and wire protocol),
  locator-tier/limits documentation, and troubleshooting notes are
  online at https://sidick.github.io/amipilot/ and included as
  amipilot.guide in this archive (AmigaGuide/MultiView, OS 2.x+) for
  offline/on-Amiga reading - same source, both forms. See the
  Changelog there for what's new in each release.

Source and licence
-------------------
  Free and open source, BSD 2-Clause. Full source, documentation and
  issue tracker: https://github.com/sidick/amipilot


Contents of util/misc/amipilot.lha
 PERMSSN    UID  GID    PACKED    SIZE  RATIO METHOD CRC     STAMP          NAME
---------- ----------- ------- ------- ------ ---------- ------------ -------------
drwxr-xr-x     0/0           0       0 ****** -lhd- 0000 Aug 10 21:18 amipilot/
-rwxr-xr-x     0/0       11446   20216  56.6% -lh5- 48dd Aug 10 21:18 amipilot/AmiInspect
-rwxr-xr-x     0/0       39720   74576  53.3% -lh5- 8316 Aug 10 21:18 amipilot/AmiPilotServer
-rw-r--r--     0/0         680    1298  52.4% -lh5- 965d Aug 10 21:18 amipilot/LICENSE
-rw-r--r--     0/0       39221  100917  38.9% -lh5- 0619 Aug 10 21:18 amipilot/amipilot.guide
-rw-r--r--     0/0        3636    7814  46.5% -lh5- 7640 Aug 10 21:18 amipilot/amipilot.readme
---------- ----------- ------- ------- ------ ---------- ------------ -------------
 Total         6 files   94703  204821  46.2%            Aug 10 21:25
Page generated in 0.02 seconds
Aminet © 1992-2024 Urban Müller and the Aminet team. Aminet contact address: <aminetaminet net>