@assertrx/dino
A friendly purple dinosaur pi package with a custom TUI header, theme, and Playwright skills.
Package details
Install @assertrx/dino from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@assertrx/dino- Package
@assertrx/dino- Version
1.0.1- Published
- Aug 26, 2026
- Downloads
- 141/mo · 141/wk
- Author
- andyrocks54
- License
- MIT
- Types
- extension, skill, theme, prompt
- Size
- 1.8 MB
- Dependencies
- 9 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./extensions"
],
"prompts": [
"./prompts"
],
"skills": [
"./skills"
],
"themes": [
"./themes"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
Dino
An Automated Verification agent based on Pi Harness
What's Inside
| Type | Name | What it does |
|---|---|---|
| Extension | dino |
Replaces the pi TUI header with a Dino-themed ASCII header and provides a /dino-header command to restore the built-in header |
| Extension | playwright-mcp |
Bridges Microsoft Playwright MCP tools into pi.dev so the agent can drive a browser for live page inspection, POM generation, and web verification |
| Extension | mabl-mcp |
Bridges the mabl MCP server into pi.dev so the agent can query tests, runs, plans, and workspaces via mabl's official CLI using OAuth authentication |
| Skill | acli |
Interact with Atlassian Cloud (Jira and Confluence) via the acli CLI — search work items, manage sprints/boards, create Confluence pages, and more |
| Skill | bdd-gherkin |
Generate domain-driven Gherkin/Cucumber BDD scenarios focused on business requirements with minimal technical details |
| Skill | playwright-cli |
Automates browser interactions via playwright-cli for terminal-first browser control, navigation, screenshots, tracing, and test generation |
| Skill | playwright-core |
Battle-tested Playwright patterns for writing and debugging reliable E2E, API, component, visual, accessibility, and security tests |
| Skill | playwright-pom |
Page Object Model patterns for Playwright — when to use POM, how to structure page objects, and when fixtures or helpers are a better fit |
| Skill | mabl-mcp |
Guidance for using the mabl MCP bridge — workspace context, running tests, retrieving results, and handling OAuth auth |
| Prompt | create-pr |
Create a GitHub pull request for changes in the current workspace, installing gh and setting up git if needed |
| Prompt | generate-bdd-from-url |
Generate exhaustive Gherkin BDD scenarios for a single page by inspecting it with playwright-cli or Playwright MCP |
| Prompt | generate-pom-from-url |
Generate Playwright Page Object Models from a live URL using the Playwright MCP bridge (browser_* tools) |
| Prompt | generate-pom-from-url-cli |
Generate Playwright Page Object Models from a live URL using playwright-cli commands |
| Prompt | generate-spec-from-feature |
Generate a Playwright test spec from a Gherkin feature file, reusing existing POMs |
| Prompt | heal-playwright-failures |
Detect, diagnose, and auto-heal failed Playwright tests by updating selectors, waits, and assertions, then re-run to verify |
| Prompt | setup-playwright |
Set up a vanilla Playwright project in the current workspace with TypeScript, config, and a starter test |
AI Evals Skills
These skills help design, run, and validate evaluations for LLM-powered systems.
| Skill | Description |
|---|---|
build-review-interface |
Build a custom browser-based annotation interface for reviewing LLM traces and collecting structured human labels. |
error-analysis |
Systematically identify and categorize failure modes in an LLM pipeline by reading traces. |
eval-audit |
Audit an LLM eval pipeline for problems such as unvalidated judges, vanity metrics, and missing error analysis. |
evaluate-rag |
Evaluate retrieval-augmented generation pipelines, including retrieval quality, generation faithfulness, and relevance. |
generate-synthetic-data |
Create diverse synthetic test inputs for LLM evaluation using dimension-based tuple generation. |
validate-evaluator |
Calibrate an LLM-as-judge against human labels using metrics like TPR/TNR and bias correction. |
write-judge-prompt |
Design LLM-as-judge evaluators for subjective criteria that code-based checks cannot handle. |
Prompts
Dino includes reusable slash-command prompts for common verification workflows.
Choosing a browser automation prompt
For browser-based tasks, prefer the playwright-cli prompts. They are more token-efficient because the agent reads compact terminal output instead of full MCP tool-result payloads.
Use the Playwright MCP prompts only as a fallback when the playwright-cli prompt fails, the page cannot be reached via the CLI, or you need richer live-browser introspection.
| Prompt | What it does | Example usage |
|---|---|---|
/create-pr |
Create a GitHub pull request for changes in the current workspace, installing gh if needed. |
/create-pr |
/generate-bdd-from-url |
Inspect a page and generate exhaustive Gherkin BDD scenarios for that page only. | /generate-bdd-from-url https://example.com tests/features |
/generate-pom-from-url-cli |
Generate Playwright Page Object Models from a live URL using playwright-cli (preferred). |
/generate-pom-from-url-cli https://example.com tests/pom |
/generate-pom-from-url |
Generate Page Object Models from a live URL using the Playwright MCP bridge (fallback only). | /generate-pom-from-url https://example.com tests/pom |
/generate-spec-from-feature |
Generate a Playwright test spec from a Gherkin feature file, reusing existing POMs. | /generate-spec-from-feature https://example.com tests/features/login.feature tests/pom tests/specs |
/heal-playwright-failures |
Run the Playwright suite, detect failures, diagnose root causes, apply safe fixes, and re-run to verify. | /heal-playwright-failures or /heal-playwright-failures tests/login.spec.ts 3 |
/setup-playwright |
Set up a vanilla Playwright project in the current workspace with TypeScript, config, and a starter test. | /setup-playwright |
Prerequisite
Dino requires the pi CLI to be installed. If pi is not present, install it globally via npm:
npm install -g @earendil-works/pi-coding-agent
Verify the installation:
pi --version
Install
Dino is installed per-project using the -l flag. This records the package entry in the project's .pi/settings.json instead of the global ~/.pi/agent/settings.json, so Dino is only loaded when you start pi inside that project.
Why install locally instead of globally?
We recommend installing Dino as a local pi package rather than a global one for two important reasons:
Avoid overwriting other pi agents. Installing Dino globally would replace the active global
piagent, which can overwrite or conflict with existing pi packages. Installing locally keeps Dino scoped to the current project without affecting your globalpisetup or other agents.Allow postinstall scripts to run. Dino relies on npm
postinstallscripts to set up required runtime dependencies — for example, installing the Playwright browser binaries and writing extension/configuration files needed by the test verification agent. When Dino is installed locally in a project, its ownnpm installruns fully and these postinstall steps execute as intended. Global installation paths or shared package managers may suppress or skip these scripts, leaving browser tooling incomplete.
In short, a local install keeps Dino isolated to the project that needs it, protects your other pi agents, and ensures the Playwright-based verification tooling is fully configured.
Example: install Dino into a YourTesting project
Assume you are starting fresh with an empty project folder. The goal is to have this layout:
~/work/
├── YourTesting/ # your project
└── dino/ # Dino package clone
Create your project folder and navigate into it:
mkdir -p ~/work/YourTesting cd ~/work/YourTestingClone the Dino repository next to your project folder:
git clone https://github.com/testdino-hq/dino.git ../dinoYour folder structure should now look like:
~/work/ ├── YourTesting/ └── dino/Install Dino's npm dependencies. Pi does not run
npm installautomatically for local-path packages, so you must do this once in the Dino directory:cd ../dino npm install cd - # returns you to ~/work/YourTestingThis installs Dino's dependencies (including
@playwright/mcp,@playwright/cli, and the MCP SDK) and runs the packagepostinstallscript.Install Dino into the current project only:
pi install ../dino --approve -lThe
-lflag tells pi to write the package reference to.pi/settings.jsoninsideYourTesting.Verify the install. You should now have a
.pi/settings.jsonfile in your project, and Dino will load automatically the next time you start pi from~/work/YourTesting:pi list
Note: If you want to try Dino once without persisting it anywhere, use
--extension(or-e) for a temporary install:pi -e ../dino
Remove
If Dino was installed with the -l flag, remove it from the current project's .pi/settings.json:
pi uninstall dino -l
Or remove the local path entry manually from .pi/settings.json.
Playwright MCP bridge
Dino can expose the official Microsoft Playwright MCP server (@playwright/mcp) as pi.dev tools. This lets the agent navigate, snapshot, click, fill, and otherwise control a browser — useful for live page inspection when generating Page Object Models or verifying web behavior.
Setup
In the Dino directory, install the package dependencies (this pulls in
@playwright/mcpand the MCP SDK and also installs the Chromium browser via thepostinstallscript):cd /path/to/dino npm installIf the Chromium binary was not installed by the
postinstallscript, install it manually:npx playwright install chromiumMake sure Dino is installed as a project-local pi package so the extension is loaded (run this from your project directory, e.g.
YourTesting):pi install ../dino --approve -lIf already installed, reload the package:
pi update --extension ../dino # or just reinstall pi install ../dino --approve -lStart pi in a project where you want to use the browser tools. On startup you should see:
[playwright-mcp] Registered 24 Playwright MCP tool(s).
Available tools
Once loaded, tools such as these are available to the model:
browser_navigate— navigate to a URLbrowser_snapshot— capture accessibility tree of the current pagebrowser_click,browser_type,browser_fill_form— interact with elementsbrowser_take_screenshot— capture a screenshotbrowser_console_messages,browser_network_requests— inspect page activity
Using with the playwright-pom skill
The playwright-pom skill now includes an MCP-driven workflow:
- User asks for a POM for a page/URL.
- The agent calls
browser_navigateto open the page. - The agent calls
browser_snapshotto inspect the accessibility tree. - The agent generates a page object using resilient locators (
getByRole,getByLabel,getByTestId).
See skills/playwright-pom/SKILL.md for the full workflow and example.
mabl MCP bridge
Dino can expose the official mabl MCP server as pi.dev tools using OAuth authentication. This lets the agent query mabl workspaces, tests, plans, runs, results, and other mabl resources directly from the conversation.
Setup
In the Dino directory, install the package dependencies (this pulls in
@mablhq/mabl-cliand the MCP SDK):cd /path/to/dino npm installMake sure Dino is installed as a project-local pi package so the extension is loaded (run this from your project directory, e.g.
YourTesting):pi install ../dino --approve -lIf already installed, reload the package:
pi update --extension ../dino # or just reinstall pi install ../dino --approve -lStart pi in a project where you want to use the mabl tools. The extension no longer runs the OAuth check automatically on startup. To check authentication, run the OAuth flow, and load the mabl MCP tools, use the extension command:
/mabl-authIf you are not already authenticated with mabl, the command runs
mabl auth login --autoto perform the OAuth flow. Follow the on-screen prompts (open the authorization URL in a browser and approve access). After authentication succeeds you should see:[mabl-mcp] Registered N mabl MCP tool(s).Note:
mabl auth login --autois designed for headless/agent environments. It captures the OAuth authorization code automatically, but you still need to approve the login in a browser the first time.
Manual OAuth (if the automatic flow is blocked)
If the automatic OAuth flow cannot complete inside pi (for example, because no browser is available), authenticate outside of pi and then run the command inside pi:
cd /path/to/dino
npx @mablhq/mabl-cli auth login --auto
# approve the login in your browser, then:
pi start
Once pi is running, invoke /mabl-auth to load the mabl MCP tools.
Available tools
Once loaded, the mabl MCP tools exposed by the server become available to the model. Tool names and capabilities depend on the current mabl MCP server version; examples include:
- Querying workspaces, applications, environments, and plans
- Listing tests and test runs
- Retrieving run results and diagnostics
The extension discovers the tool list dynamically from the server, so new tools are automatically available after updating @mablhq/mabl-cli.
Authentication note
The extension stores no credentials itself. It relies on the mabl CLI's own OAuth token storage (managed by @mablhq/mabl-cli). To sign out, run:
npx @mablhq/mabl-cli auth clear
Command reference
/mabl-auth— Check mabl OAuth status, runmabl auth login --autoif needed, and start the mabl MCP server so the model can use the mabl tools.
Dino API Server
Dino ships with a Fastify API server that exposes every prompt workflow as REST endpoints. This lets you trigger Dino prompts from CI pipelines, web UIs, or any HTTP client.
Quick start (fresh system)
# Windows — double-click or run:
scripts\setup-dino-api.bat
# macOS / Linux — run:
chmod +x scripts/setup-dino-api.sh
./scripts/setup-dino-api.sh
This single script:
- Checks that Node.js is installed
- Installs
piglobally if missing - Installs
@assertrx/dinoviapi installif missing - Starts the API server on port 3000
Manual setup
# 1. Install pi (if not already installed)
npm install -g @earendil-works/pi-coding-agent
# 2. Install Dino via pi
pi install npm:@assertrx/dino --approve
# 3. Set API key
export ANTHROPIC_API_KEY=sk-ant-...
# 4. Start the server
node ~/.pi/agent/npm/node_modules/@assertrx/dino/scripts/api-server.mjs
Endpoints
| Method | Path | Description |
|---|---|---|
GET |
/api/health |
Health check |
GET |
/api/prompts |
List all available prompts with parameters |
GET |
/api/prompts/:name |
Get raw markdown content of a prompt |
POST |
/api/prompts/:name |
Execute a prompt via the pi agent |
Prompt execution endpoints
All POST bodies accept apiKey (optional, falls back to ANTHROPIC_API_KEY env var), cwd (workspace directory, defaults to current), and stream (default: true for SSE).
| Prompt name | Required params |
|---|---|
setup-playwright |
none |
create-pr |
none |
generate-pom-from-url |
url |
generate-pom-from-url-cli |
url |
generate-bdd-from-url |
url |
generate-spec-from-feature |
url, featureFile, pomDir |
heal-playwright-failures |
none (optional: testPattern, maxIterations) |
Example requests
# List all prompts
curl http://localhost:3000/api/prompts
# Get prompt details
curl http://localhost:3000/api/prompts/setup-playwright
# Execute a prompt (SSE streaming)
curl -X POST http://localhost:3000/api/prompts/setup-playwright \
-H "Content-Type: application/json" \
-d '{"cwd": "/path/to/workspace"}'
# Execute with URL parameter (non-streaming JSON response)
curl -X POST http://localhost:3000/api/prompts/generate-pom-from-url-cli \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "outputDir": "tests/pom", "stream": false}'
Response formats
SSE streaming (stream: true, default):
event: start → {"prompt": "..."}
event: text → {"delta": "..."} # response tokens
event: thinking → {"delta": "..."} # thinking output
event: tool_start → {"tool": "bash"} # tool execution started
event: tool_end → {"tool": "bash", ...} # tool execution finished
event: done → {} # session complete
event: error → {"message": "..."} # error
Non-streaming (stream: false):
{
"prompt": "setup-playwright",
"response": "...full agent response text...",
"toolCalls": [{"name": "bash", "status": "success"}]
}
Environment variables
| Variable | Default | Description |
|---|---|---|
PORT |
3000 |
Server port |
HOST |
0.0.0.0 |
Server host |
ANTHROPIC_API_KEY |
— | API key (or pass apiKey in request body) |