Agent skill

Tir Test Generator

by totvs in totvs/engpro-advpl-tlpp-skills

Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens.

MITAuto-check passedTesting & QA

Install Tir Test Generator

skills CLI
$ npx skills add totvs/engpro-advpl-tlpp-skills --skill tir-test-generator -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install totvs/engpro-advpl-tlpp-skills tir-test-generator --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/totvs/engpro-advpl-tlpp-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/advpl-tlpp/tir-test-generator .claude/skills/tir-test-generator && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
tir-test-generator
GitHub stars
143
Token cost
~4.8k tokens
SKILL.md length
1,747 words
Files
4 (incl. references)
Skills in repo
19
Repo updated
First seen
Licence
MIT

At a glance

Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens.

  • Works in 5 steps: Identify the Screen Type → Map Screen Elements → Define Test Scenarios → …
  • A user says TIR test
  • SKILL.md covers Overview, When to Use, Which TIR Class to Use? and TIR Three-File Architecture…, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Tir Test Generator is an agent skill from totvs/engpro-advpl-tlpp-skills. Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens. Supports CRUD screen tests, MVC screen tests, grid interaction, report tests, field validation, and message box assertions. Use when a user says "TIR test", "interface test", "e2e test Protheus", "SmartClient test", "Webapp test", "screen test", "create Python test for Protheus screen", or "automate Protheus UI test".

Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/tir-setup-and-best-practices.md`, `references/tir-test-patterns.md` and `references/tir-webapp-methods-reference.md`).

It sits in Testing & QA, covering End-to-end testing. It works with Python. The repository describes itself as: Repositório contendo skills para orientar desenvolvimento ADVPL/TLPP com agentes de IA. The licence is MIT.

When your agent uses it

  • A user says TIR test
  • E2e test Protheus
  • SmartClient test
  • Create Python test for Protheus screen

Example prompts

  • “TIR test”
  • “interface test”
  • “e2e test Protheus”
  • “/tir-test-generator”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Identify the Screen Type
  2. Map Screen Elements
  3. Define Test Scenarios
  4. Handle Common Screen Interactions
  5. Build the TESTSUITE

What it can do on your machine

Read from SKILL.md and the folder at commit 3908e4e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Tir Test Generator loads about 4.8k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 113 tokens; SKILL.md has 1,747 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~113
When it runs · the whole SKILL.md, loaded when a task matches
~4.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~12k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from totvs/engpro-advpl-tlpp-skills at commit 3908e4e, republished under its MIT licence (© totvs). 1,747 words, ~4,780 tokens.

Download SKILL.mdSave it as .claude/skills/tir-test-generator/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
tir-test-generator
description
Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens. Supports CRUD screen tests, MVC screen tests, grid interaction, report tests, field validation, and message box assertions. Use when a user says "TIR test", "interface test", "e2e test Protheus", "SmartClient test", "Webapp test", "screen test", "create Python test for Protheus screen", or "automate Protheus UI test".
license
MIT
metadata.domain
Protheus
metadata.maintainer
Customizações ADVPL/TLPP
metadata.author
Thalion Starforge
metadata.version
5.0.0
metadata.category
Testing

Protheus TIR Test Generator

Overview

Generate end-to-end interface test scripts in Python for the TOTVS Protheus ERP using the TIR (TOTVS Interface Robot) framework. TIR automates Protheus screens through the SmartClient/Webapp interface, validating complete user workflows including screen navigation, field interaction, grid manipulation, button clicks, and result assertions.

TIR tests use Python's unittest framework combined with the tir.Webapp class to:

  1. Connect to a running Protheus Webapp environment
  2. Navigate to specific routines via Program()
  3. Interact with screen elements (fields, grids, buttons, folders)
  4. Assert field values, screen states, and data integrity
  5. Tear down the session cleanly

When to Use

Use this skill when:

  • Creating end-to-end UI tests for Protheus screens (CRUD, workflows)
  • Testing MVC-generated screens via the SmartClient/Webapp interface → use Webapp class
  • Validating critical user journeys (complete business flows)
  • Testing screen navigation, menu access, and dialog handling
  • Validating field interactions (fill, check, read values)
  • Testing grid operations (add rows, edit cells, scroll, select)
  • Validating reports via parameter screens
  • Needing visual/interface-level regression tests
When NOT to Use
  • TLPP unit tests → Use ProBat (@TestFixture)

Which TIR Class to Use?

Routine typeTIR classImport
MVC (ModelDef/ViewDef/MenuDef)Webappfrom tir import Webapp
Legacy Browse (MBrowse, AxCadastro)Webappfrom tir import Webapp

TIR Three-File Architecture (MANDATORY)

Every TIR test project requires three files:

FileResponsibility
{ROUTINE}TESTCASE.pyTest class with unittest.TestCase, setUpClass, test methods (test_*), tearDownClass
{ROUTINE}TESTSUITE.pyRunner: imports TESTCASE, builds unittest.TestSuite, executes with TextTestRunner
config.jsonEnvironment configuration — URL, browser, credentials, Protheus environment name

Without config.json in the same directory, TIR cannot connect to Protheus.

{test_directory}/
├── {ROUTINE}TESTCASE.py    ← test class
├── {ROUTINE}TESTSUITE.py   ← runner (CI/CD entry point)
└── config.json             ← environment config (REQUIRED)
config.json — Webapp (MVC/Legacy)
json
{
    "Url": "http://{server}:{port}/",
    "Browser": "Chrome",
    "Environment": "{environment_name}",
    "User": "{username}",
    "Password": "{password}",
    "Language": "pt-br"
}

For the complete config.json parameter reference (all sections: Required, Additional, Logging, Database, Chrome), see tir-setup-and-best-practices.md.


Complete File Templates

TESTCASE Template — Webapp (MVC/Legacy)
python
from tir import Webapp
import unittest

class {ROUTINE}(unittest.TestCase):
    """
    TIR E2E Tests for {ROUTINE} - {Description}
    Module: {MODULE}
    Tables: {TABLE_ALIASES}
    """

    @classmethod
    def setUpClass(inst):
        """Setup: Initialize Webapp, configure environment, open routine"""
        inst.oHelper = Webapp()
        inst.oHelper.Setup('{MODULE}', '{DATE}', 'T1', '{BRANCH}')
        inst.oHelper.Program('{ROUTINE}')

    def test_{ROUTINE}_CT001(self):
        """CT001 — Include record with required fields"""
        self.oHelper.SetButton('Incluir')
        self.oHelper.SetBranch('{BRANCH}')
        self.oHelper.SetValue('{Field Label 1}', '{value1}')
        self.oHelper.SetValue('{Field Label 2}', '{value2}')
        self.oHelper.SetButton('Salvar')
        self.oHelper.SearchBrowse(f'{BRANCH}{search_key}', key='Filial+{Search Column}')
        self.oHelper.SetButton('Visualizar')
        self.oHelper.CheckResult('{FIELD_NAME}', '{expected_value}')
        self.oHelper.SetButton('Cancelar')
        self.oHelper.AssertTrue()

    def test_{ROUTINE}_CT002(self):
        """CT002 — Edit existing record"""
        self.oHelper.SearchBrowse(f'{BRANCH}{search_key}', key='Filial+{Search Column}')
        self.oHelper.SetButton('Alterar')
        self.oHelper.SetValue('{Field Label}', '{new_value}')
        self.oHelper.SetButton('Salvar')
        self.oHelper.AssertTrue()

    def test_{ROUTINE}_CT003(self):
        """CT003 — Delete record"""
        self.oHelper.SearchBrowse(f'{BRANCH}{search_key}', key='Filial+{Search Column}')
        self.oHelper.SetButton('Outras Ações', sub_item='Excluir')
        self.oHelper.SetButton('Confirmar')
        self.oHelper.AssertTrue()

    def test_{ROUTINE}_CT004(self):
        """CT004 — Validate required field rule (negative)"""
        self.oHelper.SetButton('Incluir')
        self.oHelper.SetButton('Salvar')
        self.oHelper.CheckHelp(text_help='{HELP_ID}', button='Fechar')
        self.oHelper.SetButton('Cancelar')
        self.oHelper.AssertFalse()

    @classmethod
    def tearDownClass(inst):
        """Teardown: Close session and collect results"""
        inst.oHelper.TearDown()

if __name__ == '__main__':
    unittest.main()
TESTSUITE Template
python
import unittest

from {ROUTINE}TESTCASE import {ROUTINE}

suite = unittest.TestSuite()

suite.addTest({ROUTINE}('test_{ROUTINE}_CT001'))
suite.addTest({ROUTINE}('test_{ROUTINE}_CT002'))
suite.addTest({ROUTINE}('test_{ROUTINE}_CT003'))
suite.addTest({ROUTINE}('test_{ROUTINE}_CT004'))

runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

TIR Webapp Key Methods Reference

For the complete TIR Webapp API reference (Setup & Lifecycle, Field Interaction, Browse & Navigation, Grid Operations, Assertions & Validation, Dialog Handling, Parameters & Configuration), see tir-webapp-methods-reference.md.


Test Script Patterns

For all complete test script templates (Standard CRUD, Master-Detail with Grid, Tabs/Folders, View/Validate, Validation Error, Other Actions Menu, Report with Parameters, Grid Checkbox Selection), see tir-test-patterns.md.


Step-by-Step Process

When generating TIR test scripts, follow this process:

1. Identify the Screen Type
Screen TypeCharacteristicsKey Methods
Simple CRUDSingle form, no gridSetValue, SetButton, CheckResult
Master-DetailForm + grid (e.g., invoice header + items)SetValue (grid=True), LoadGrid, ClickGridCell
Tabbed ScreenMultiple folders/tabsClickFolder, SetValue per tab
Browse + ActionsBrowse grid with action menuSearchBrowse, SetButton('Outras Ações', sub_item=...)
ReportParameter screen + outputSetValue for params, SetButton('OK'), WaitProcessing
WizardMulti-step dialog flowSetButton('Avançar'), SetButton('Finalizar')
2. Map Screen Elements

For each test, identify:

  • Field labels as they appear on screen (used by SetValue)
  • Field technical names (used by CheckResult, e.g., 'A1_COD', 'B1_DESC')
  • Button labels (e.g., 'Incluir', 'Alterar', 'Salvar', 'Cancelar')
  • Grid columns and their headers
  • Tab/folder names
  • Search key format for SearchBrowse — see UI Conventions & Pitfalls below for the right rule

UI Conventions & Pitfalls (LEARNED FROM REAL RUNS)

These are the details that separate a TIR script that runs from a script that fails at the first click. They are not negotiable — they came from running against real Protheus environments.

SearchBrowse — key name and padding

The key= argument must match the browse column header as rendered on screen, not a generic pattern. Two common headers in MVC routines:

Routine traitkey valueSearch term example
Browse keyed only by {ALIAS}_COD'Filial+codigo''D MG 01000033'
Browse keyed by {ALIAS}_COD + {ALIAS}_LOJA (customers, suppliers)'Filial+codigo + Loja'f'D MG 01{cod+loja}'
Modern routines with composite semantic headerCopy the header verbatim—

Rule of thumb: the browse header is the source of truth. If in doubt, open the browse in a real session and read the sort-selector label. Do not invent 'Filial+codigo + Loja' for a routine that browses only by code — SearchBrowse will scroll past the record and never find it.

Sub-menus with multiple levels

When "Outras Ações" opens a sub-menu that opens another sub-menu (e.g., Outras Ações → Oportunidades → Nova Oportunidade), TIR requires pipe-separated sub-items:

python
# Correct — nested sub-menu with pipe
self.oHelper.SetButton('Outras Ações', sub_item='Oportunidades|Nova Oportunidade')

# Wrong — loses the intermediate level, click never registers
self.oHelper.SetButton('Outras Ações', sub_item='Nova Oportunidade')

If the spec path has → X → Y (two arrows after the main menu), use sub_item='X|Y'.

Close buttons — Cancelar vs Fechar vs Sair

Different screens use different close labels. The convention in Protheus MVC is:

Screen contextButton to close
Form opened by Visualizar, Incluir, Alterar'Cancelar'
Related-action screen (sub-window) that only lists or reads data'Fechar'
Wizard last step that only confirms'Concluir' or 'Finalizar'
Main browse sessionTearDown() closes it — never click manually

Never use 'Sair' unless you have verified on the real screen. 'Sair' is rare in modern MVC and most of the time produces a ghost click that TIR reports as success while nothing happened.

CheckResult — technical name vs label
SituationUse
The field has a clear {ALIAS}_{NAME} in the dictionary and the screen is the main form (Visualizar/Alterar of the routine being tested)Technical name ('A1_COD', 'C5_CLIENTE')
The field belongs to a related screen called as an action (Nova Oportunidade, Novo Apontamento, Facilitador) — you may not know the alias of that secondary modelScreen label ('Cliente', 'Nome')

Do not guess technical names for related screens. If the spec only gives a label and the routine alias is different (UA_*, AE_*, etc.), use the label. A wrong technical name fails silently or — worse — matches a different field with the same prefix.

Validation of "screen opened"

Validating that a related screen opened is best done by asserting content, not just presence:

python
# Weak — asserts something appeared but doesn't prove it's the right thing
self.oHelper.WaitShow('Subclientes')

# Strong — confirms the expected child record is listed
self.oHelper.SearchBrowse(f'D MG 01{filho+loja}', key='Filial+codigo + Loja')

Use WaitShow as a safety net before the content assertion, not as a replacement for it.

Setup branch padding

The Setup() branch string and the SearchBrowse branch prefix must be character-for-character identical, including trailing spaces. 'D MG 01' (no space) and 'D MG 01 ' (trailing space) are different keys in the browse. Match what the live environment renders.

3. Define Test Scenarios
ScenarioPatternAssertion
Include with required fieldsFill fields → Salvar → SearchBrowse → Visualizar → CheckResult → CancelarAssertTrue()
Edit existing recordSearchBrowse → Alterar → SetValue → SalvarAssertTrue()
Delete recordSearchBrowse → Outras Ações/Excluir → ConfirmarAssertTrue()
Required field validationIncluir → Salvar (empty) → CheckHelp → CancelarAssertFalse()
Business rule validationFill invalid values → Salvar → CheckHelp → CancelarAssertFalse()
4. Handle Common Screen Interactions
InteractionMethod
Open routineProgram('{ROUTINE}')
Set branch after IncluirSetBranch('{BRANCH}')
Click a buttonSetButton('{Label}')
Click sub-menu buttonSetButton('{Main}', sub_item='{Sub}')
Fill a form fieldSetValue('{Label}', '{value}')
Fill a grid cellSetValue('{Column}', '{value}', grid=True, grid_number=1, row=N)
Refresh gridLoadGrid()
Switch tabClickFolder('{Tab Name}')
Search in browseSearchBrowse(f'{BRANCH}{key}', 'Filial+{Column}')
Check field valueCheckResult('{FIELD_NAME}', '{expected}')
Handle error dialogCheckHelp(text_help='{ID}', button='Fechar')
Wait for processingWaitProcessing('{message}')
Send keyboard keySetKey('{KEY}', grid=True/False)
Show full SKILL.md (689 more words)Show less
5. Build the TESTSUITE

After generating the TESTCASE, always generate the TESTSUITE that:

  1. Imports the test class from the TESTCASE file
  2. Creates a unittest.TestSuite()
  3. Adds each test method with suite.addTest()
  4. Runs with unittest.TextTestRunner(verbosity=2)

Rationalization Guard

The moments the generator is most tempted to cut corners — and what actually happens.

TemptationReality
"I don't know the alias of the secondary screen, but UA_CLIENTE looks right for an opportunity, let me guess."Wrong alias = silent failure or wrong field matched. Use the screen label ('Cliente') when the secondary screen's model is not in your context. Guessing propagates to every future test of that routine.
"The spec says Outras Ações → Oportunidades → Nova Oportunidade, but I'll just pass 'Nova Oportunidade' — TIR will find it."No. Sub-menu navigation is literal. Drop the middle level and the click never happens. Use pipes: sub_item='Oportunidades|Nova Oportunidade'.
"The browse header might be 'Filial+codigo + Loja' — that's the MATA030 pattern, CRMA980 must be the same."Not guaranteed. Different browses, different headers. Look at the real screen or the MenuDef before committing to key=.
"'Sair', 'Fechar', 'Cancelar' — whatever, they all close the window."They close different windows. A wrong label produces a TIR warning that most CI pipelines swallow. See Close buttons above.
"WaitShow('SubClientes') is enough — if the screen appeared, the test passes."No. WaitShow only confirms a string is on the page. Assert content (the expected child record, a specific field value).
"The spec references pre-existing customers 000033, 000050... I'll just use them. If they don't exist, TIR will create an error and we catch it later."The error is SearchBrowse did not find. The test marks as failure, not as missing-data. Ensure the required records exist in the environment before running the suite — add a setUpClass step that creates them via ExecAuto, or document them as a manual prerequisite in the test file header.
"I'll leave {server} or {port} in config.json — the user will fix it."config.json without real values fails at connection, the test never starts, the user debugs the wrong layer. Either fill with sensible defaults (localhost, 8080) or explicitly mark the file with a TODO comment.

Setup Requirements & Best Practices

For environment setup (Python, Webapp, tir.json configuration) and best practices (test independence, naming conventions, screen interactions, assertions, environment isolation), see tir-setup-and-best-practices.md.


Checklist

Before finalizing generated TIR test scripts, verify:

config.json:

  • File present in the same directory as the test scripts
  • Url, Browser, Environment, User, Password, Language all set
  • No placeholder values like {server}, {username} remaining

TESTCASE file ({ROUTINE}TESTCASE.py):

  • File named {ROUTINE}TESTCASE.py
  • Class named {ROUTINE} inheriting from unittest.TestCase
  • Correct class imported: from tir import Webapp
  • setUpClass(inst) contains the correct class instantiation, Setup(), and Program() calls
  • tearDownClass(inst) contains TearDown() call
  • Setup() has correct module, date, group, and branch (4 args — 5th module is optional)
  • Each test method starts with test_ prefix and has a docstring
  • Positive tests end with self.oHelper.AssertTrue() — NO parameters
  • Negative tests end with self.oHelper.AssertFalse() — NO parameters

Webapp-specific (MVC/Legacy):

  • SetBranch() called after SetButton('Incluir') when needed
  • SearchBrowse(term, key=...) uses key= kwarg with branch-prefixed term
  • key= value matches the real browse header — single-key routines use 'Filial+codigo', composite-key routines use 'Filial+codigo + Loja' (verify, don't assume)
  • Branch padding in Setup() matches exactly the branch padding in SearchBrowse (trailing space matters)
  • Sub-menus with 2+ levels use pipe: sub_item='Level1\|Level2'
  • Close buttons: 'Cancelar' for Visualizar/Alterar/Incluir forms; 'Fechar' for related-action sub-windows; 'Concluir'/'Finalizar' for wizard endings; never 'Sair' without verifying on the real screen
  • CheckResult uses technical names ('A1_COD') only for the routine's own form; uses screen labels ('Cliente', 'Nome') for secondary screens whose model alias is unknown — do NOT guess aliases
  • When a test validates "screen X opened", assert content (child record via SearchBrowse, specific field via CheckResult) — WaitShow alone is not enough
  • CheckHelp(text_help=..., button=...) for error dialogs
  • LoadGrid() called after grid SetValue operations

TESTSUITE file ({ROUTINE}TESTSUITE.py):

  • File named {ROUTINE}TESTSUITE.py
  • import unittest present
  • from {ROUTINE}TESTCASE import {ROUTINE} present
  • suite = unittest.TestSuite() created
  • suite.addTest({ROUTINE}('test_{ROUTINE}_CT00N')) for each test method
  • runner = unittest.TextTestRunner(verbosity=2) present
  • runner.run(suite) present

Both files:

  • No placeholder tokens like {ROUTINE}, {VALUE}, {FIELD} remaining
  • No AssertTrue(value, msg) with parameters — TIR does not accept parameters

SkillWhen to Use Instead
mvc-generatorCreating MVC routines (the screens being tested)
tlpp-rest-endpoint-generatorCreating REST endpoints

© totvs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (references) in skills/advpl-tlpp/tir-test-generator of totvs/engpro-advpl-tlpp-skills.

  • SKILL.md
  • references/tir-setup-and-best-practices.md
  • references/tir-test-patterns.md
  • references/tir-webapp-methods-reference.md

Open the folder on GitHubat commit 3908e4e

Compare with similar skills

Tir Test Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Tir Test Generator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Tir Test Generator this skilltotvs/engpro-advpl-tlpp-skills143—~4.8kAutomated safety check: PassMIT
Web Application Testinganthropics/skills180k51 repos~966Automated safety check: PassApache-2.0
OpenHarness End-to-End EvalsHKUDS/OpenHarness16k1 repos~2.1kAutomated safety check: NotesMIT
JSON Repair Docs Demo Local Testmangiucugna/json_repair5.1k—~549Automated safety check: PassMIT
RStudio Selenium to Playwright Migrationrstudio/rstudio5.1k—~3.6kAutomated safety check: PassCustom licence
Godot E2ERandallLiuXin/GodotMaker5501 repos~3.9kAutomated safety check: PassCustom licence

Similar skills

  • Web Application Testing

    anthropics/skills

    Official

    Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.

    180k GitHub starsUsed in 51 repos~966 tokens
    Testing & QAAuto-check passed
  • Validates OpenHarness features by running real multi-turn agent loops with live LLM calls against an unfamiliar codebase, checking actual tool execution.

    16k GitHub starsUsed in 1 repo~2.1k tokens
    Testing & QAAuto-check: notes
  • JSON Repair Docs Demo Local Test

    mangiucugna/json_repair

    Runs the json_repair docs demo against a local Flask API and static server, so changes to docs/app.py or the docs UI are checked end to end before publishing.

    5.1k GitHub stars~549 tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Converts RStudio Python Selenium electron tests into TypeScript Playwright tests, checking each against a live RStudio before counting it as migrated.

    5.1k GitHub stars~3.6k tokensUpdated today
    Testing & QAAuto-check passed
  • Godot E2E

    RandallLiuXin/GodotMaker

    Write and run E2E (end-to-end) game tests using the godot-e2e framework.

    550 GitHub starsUsed in 1 repo~3.9k tokens
    Testing & QAAuto-check passed
  • Codex E2E Trace Validation

    liaohch3/claude-tap

    Runs a real Codex CLI session through claude-tap and produces trace evidence and viewer screenshots for pull requests that touch capture, proxying or the viewer.

    3.3k GitHub stars~3k tokensUpdated 17 days ago
    Testing & QAAuto-check passed

More from totvs/engpro-advpl-tlpp-skills

All 19 skills in this repo
  • AdvPL UTF-8 to CP1252 Converter

    totvs/engpro-advpl-tlpp-skills

    Converts AdvPL and TLPP source files from UTF-8 to Windows-1252 in place after code generation, because the Protheus compiler accepts only CP1252 files.

    143 GitHub stars~2.6k tokensUpdated 4 days ago
    Auto-check passed
  • AdvPL/TLPP Compile in VS Code

    totvs/engpro-advpl-tlpp-skills

    Compiles AdvPL and TLPP sources from VS Code with the TOTVS Developer Studio extension, handling server setup, connection and compile result reporting.

    143 GitHub stars~3.7k tokensUpdated 4 days ago
    Auto-check passed
  • Protheus Spec-Driven Development

    totvs/engpro-advpl-tlpp-skills

    Plans and builds Protheus AdvPL/TLPP features through Specify, Design, Tasks and Execute phases whose depth scales with the size of the change.

    143 GitHub stars~3.6k tokensUpdated 4 days ago
    Auto-check passed
  • AdvPL and TLPP Code Review

    totvs/engpro-advpl-tlpp-skills

    Reviews AdvPL and TLPP source against SonarQube rules, ProtheusDOC requirements, security, performance and Protheus conventions, and reports findings by severity.

    143 GitHub stars~2.5k tokensUpdated 4 days ago
    Auto-check passed
  • Protheus Data Dictionary Lookup

    totvs/engpro-advpl-tlpp-skills

    Queries the TOTVS Protheus ERP data dictionary for tables, fields, indexes, parameters, triggers and lookups, including impact checks during refactoring.

    143 GitHub stars~1.5k tokensUpdated 4 days ago
    Auto-check passed
  • Protheus MVC Generator

    totvs/engpro-advpl-tlpp-skills

    Generates Protheus MVC screens in ADVPL/TLPP, with ModelDef, ViewDef, MenuDef and Browse functions for single-entity and master-detail layouts.

    143 GitHub stars~2.2k tokensUpdated 4 days ago
    Auto-check passed

Works with

Categories

Questions about Tir Test Generator

What does Tir Test Generator do?

Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens. Tir Test Generator is an agent skill from totvs/engpro-advpl-tlpp-skills. Generate TIR (TOTVS Interface Robot) end-to-end test scripts in Python for Protheus SmartClient/Webapp screens.

When should I use Tir Test Generator?

Tir Test Generator fits situations like: A user says TIR test; E2e test Protheus; smartClient test; create Python test for Protheus screen.

How do I install Tir Test Generator in Claude Code?

Run `npx skills add totvs/engpro-advpl-tlpp-skills --skill tir-test-generator -a claude-code`. Or copy the skill folder (skills/advpl-tlpp/tir-test-generator in totvs/engpro-advpl-tlpp-skills) into .claude/skills/tir-test-generator in your project. Claude Code loads it when a task matches its description.

How do I install Tir Test Generator in Codex?

Run `npx skills add totvs/engpro-advpl-tlpp-skills --skill tir-test-generator -a codex`. Or copy the skill folder (skills/advpl-tlpp/tir-test-generator in totvs/engpro-advpl-tlpp-skills) into .agents/skills/tir-test-generator in your project. Codex loads it when a task matches its description.

Can I use Tir Test Generator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add totvs/engpro-advpl-tlpp-skills --skill tir-test-generator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/tir-test-generator, .gemini/skills/tir-test-generator, .github/skills/tir-test-generator and .opencode/skills/tir-test-generator in your project.

What does Tir Test Generator need to run?

SKILL.md names no scripts, command-line tools or credentials: Tir Test Generator is instructions for the agent only. Our summary lists: Python 3.

Does Tir Test Generator access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Tir Test Generator safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Tir Test Generator use?

Tir Test Generator is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Tir Test Generator use?

About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.1k tokens, read only when the agent opens those files.

What are the alternatives to Tir Test Generator?

Skills that share tags, products or a category with Tir Test Generator: Web Application Testing (anthropics/skills, 180k stars), OpenHarness End-to-End Evals (HKUDS/OpenHarness, 16k stars), JSON Repair Docs Demo Local Test (mangiucugna/json_repair, 5.1k stars) and RStudio Selenium to Playwright Migration (rstudio/rstudio, 5.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Tir Test Generator?

totvs (a GitHub organization) maintains it in totvs/engpro-advpl-tlpp-skills, which has 143 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 5, 2026.

Source: totvs/engpro-advpl-tlpp-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.