testeiya 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -151
- package/assets/testeiya-logo-dark.svg +16 -0
- package/assets/testeiya-logo.svg +15 -0
- package/package.json +2 -1
- package/src/loader-style.ts +9 -9
- package/src/theme.ts +4 -4
- package/src/welcome.ts +73 -6
package/README.md
CHANGED
|
@@ -1,211 +1,245 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://testomat.ai/testeiya/">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.jsdelivr.net/npm/testeiya/assets/testeiya-logo-dark.svg">
|
|
5
|
+
<img src="https://cdn.jsdelivr.net/npm/testeiya/assets/testeiya-logo.svg" alt="Testeiya logo" width="140">
|
|
6
|
+
</picture>
|
|
7
|
+
</a>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<h1 align="center">Testeiya CLI</h1>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
A QA-focused AI agent for your terminal and CI.<br>
|
|
14
|
+
Built on the <a href="https://github.com/can1357/oh-my-pi">oh-my-pi</a> harness (a fork of <a href="https://github.com/badlogic/pi-mono">Pi</a>).
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="https://testomat.ai/testeiya/">Website</a> ·
|
|
19
|
+
<a href="https://www.npmjs.com/package/testeiya">npm</a> ·
|
|
20
|
+
<a href="https://testomat.io">Testomat.io</a>
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
████████ ███████ ███████ ████████ ███████ ██████ ██ ██ █████
|
|
25
|
+
██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
|
26
|
+
██ █████ ███████ ██ █████ ██ ████ ███████
|
|
27
|
+
██ ██ ██ ██ ██ ██ ██ ██ ██
|
|
28
|
+
██ ███████ ███████ ██ ███████ ██████ ██ ██ ██
|
|
29
|
+
|
|
30
|
+
AI Testing Agent · Testomat.io
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## What is Testeiya CLI?
|
|
2
34
|
|
|
3
|
-
AI
|
|
35
|
+
Testeiya is an AI testing agent: point it at a project and it analyzes test suites, finds coverage gaps, writes and improves test cases, and syncs them with [Testomat.io](https://testomat.io).
|
|
4
36
|
|
|
5
|
-
|
|
37
|
+
**Testeiya CLI** is the terminal edition of that agent. It is made to:
|
|
6
38
|
|
|
7
|
-
|
|
39
|
+
- **run in your terminal** — an interactive agent in the current working directory
|
|
40
|
+
- **run in non-interactive environments like CI** — everything is configurable through environment variables and config files, with no GUI required
|
|
8
41
|
|
|
9
|
-
It
|
|
42
|
+
It reads your codebase freely while keeping writes and destructive commands locked down by default, so you can safely point it at any project.
|
|
10
43
|
|
|
11
|
-
|
|
44
|
+
> Looking for a visual app instead? **Testeiya Desktop** is a separate chat application built on the same agent. Testeiya CLI is the official name of this terminal tool — the two are not the same thing. Learn about both at [testomat.ai/testeiya](https://testomat.ai/testeiya/).
|
|
12
45
|
|
|
13
|
-
|
|
14
|
-
- Read-permissive / write-restricted permission model
|
|
15
|
-
- Safe bash commands (git log, cat, grep...) auto-allowed; destructive commands blocked
|
|
16
|
-
- Testomat.io skills: test generation, duplicate detection, test improvement, reporter setup
|
|
17
|
-
- Markdown-rendered output in terminal
|
|
18
|
-
- Multi-line paste support
|
|
19
|
-
- Configurable LLM provider and model (OpenRouter by default; any OpenAI-compatible endpoint)
|
|
46
|
+
## Quick start
|
|
20
47
|
|
|
21
|
-
|
|
48
|
+
Requires [Bun](https://bun.sh) 1.3+.
|
|
22
49
|
|
|
23
50
|
```bash
|
|
24
|
-
|
|
25
|
-
testeiya
|
|
51
|
+
bunx testeiya
|
|
26
52
|
```
|
|
27
53
|
|
|
28
|
-
Or
|
|
54
|
+
Or install it globally:
|
|
29
55
|
|
|
30
56
|
```bash
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
bun install
|
|
34
|
-
bun src/cli.ts
|
|
57
|
+
bun add -g testeiya
|
|
58
|
+
testeiya
|
|
35
59
|
```
|
|
36
60
|
|
|
37
|
-
|
|
61
|
+
Bring an API key for your LLM provider, or sign in with an AI coding subscription you already have — see [Providers](#providers) below.
|
|
38
62
|
|
|
39
|
-
|
|
40
|
-
- An API key for whatever you set as `provider.name` in config (default is OpenRouter; see [API keys](#api-keys) below)
|
|
63
|
+
Then ask it things like:
|
|
41
64
|
|
|
42
|
-
|
|
65
|
+
- "Analyze the test suite in this project"
|
|
66
|
+
- "Find untested code paths in src/controllers"
|
|
67
|
+
- "Generate test cases for the auth module"
|
|
68
|
+
- "Find duplicate test cases and suggest which to remove"
|
|
43
69
|
|
|
44
|
-
|
|
70
|
+
Multi-line pastes (API docs, specs, requirements) go straight into the prompt.
|
|
45
71
|
|
|
46
|
-
|
|
47
|
-
# Build the container
|
|
48
|
-
make build
|
|
72
|
+
## Providers
|
|
49
73
|
|
|
50
|
-
|
|
51
|
-
cp .env.example .env
|
|
52
|
-
# Edit .env with your API keys
|
|
74
|
+
Testeiya is not tied to a single LLM vendor, and it takes two kinds of access: pay-as-you-go API keys, or the AI coding subscription you may already have.
|
|
53
75
|
|
|
54
|
-
|
|
55
|
-
make run
|
|
76
|
+
### API platform access
|
|
56
77
|
|
|
57
|
-
|
|
58
|
-
make stop
|
|
78
|
+
Pick whichever provider your team already uses, export its API key, and go:
|
|
59
79
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
80
|
+
| Provider | `provider.name` | API key variable |
|
|
81
|
+
| -------------------- | ------------ | -------------------- |
|
|
82
|
+
| OpenRouter (default) | `openrouter` | `OPENROUTER_API_KEY` |
|
|
83
|
+
| OpenAI | `openai` | `OPENAI_API_KEY` |
|
|
84
|
+
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY` |
|
|
85
|
+
| Google Gemini | `google` | `GEMINI_API_KEY` |
|
|
86
|
+
| Groq | `groq` | `GROQ_API_KEY` |
|
|
87
|
+
| Mistral | `mistral` | `MISTRAL_API_KEY` |
|
|
88
|
+
| xAI | `xai` | `XAI_API_KEY` |
|
|
89
|
+
| Azure OpenAI | `azure-openai-responses` | `AZURE_OPENAI_API_KEY` + `AZURE_OPENAI_BASE_URL` |
|
|
90
|
+
| Ollama (local) | `ollama` | not required |
|
|
63
91
|
|
|
64
|
-
|
|
92
|
+
Many more work out of the box (Together, Cerebras, Moonshot, LM Studio, …), and any OpenAI-compatible endpoint — a vLLM or LiteLLM gateway, a corporate proxy — can be plugged in through `provider.baseUrl`.
|
|
65
93
|
|
|
66
|
-
|
|
94
|
+
Keys can also live in a `.env` file in the working directory or in `~/.testeiya/.env`.
|
|
67
95
|
|
|
68
|
-
|
|
96
|
+
### Subscriptions
|
|
69
97
|
|
|
70
|
-
|
|
71
|
-
2. Add your Testomat.io credentials:
|
|
98
|
+
Already paying for an AI coding plan? Sign in with it instead of managing API keys — type `/login` inside the agent and pick the account:
|
|
72
99
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
100
|
+
| Subscription | `provider.name` |
|
|
101
|
+
| ---------------------------- | ---------------- |
|
|
102
|
+
| Claude Pro / Max (Anthropic) | `anthropic` |
|
|
103
|
+
| ChatGPT / Codex (OpenAI) | `openai-codex` |
|
|
104
|
+
| GitHub Copilot | `github-copilot` |
|
|
105
|
+
| Gemini (Google account) | `google-gemini-cli` |
|
|
106
|
+
| Cursor | `cursor` |
|
|
107
|
+
| Kimi Code | `kimi-code` |
|
|
80
108
|
|
|
81
|
-
|
|
109
|
+
…plus GitLab Duo, Qwen, Z.ai and other coding plans — `/login` shows everything available. Credentials are stored locally and refreshed automatically.
|
|
82
110
|
|
|
83
|
-
|
|
111
|
+
To switch providers or models at any time, type `/model` inside the agent, or set `provider.name` and `provider.model` in the config file (see [Configuration](#configuration)).
|
|
84
112
|
|
|
85
|
-
|
|
86
|
-
export OPENROUTER_API_KEY=sk-or-your-key-here
|
|
87
|
-
bun src/cli.ts
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Or build and run with Node:
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
npm run build
|
|
94
|
-
node dist/cli.js
|
|
95
|
-
```
|
|
113
|
+
## Connect to Testomat.io
|
|
96
114
|
|
|
97
|
-
|
|
115
|
+
Testeiya works standalone, but connecting a [Testomat.io](https://testomat.io) project unlocks test management: pulling and pushing test cases, browsing runs, and the Testomat.io MCP tools.
|
|
98
116
|
|
|
99
|
-
|
|
100
|
-
Model: openrouter/anthropic/claude-sonnet-4
|
|
101
|
-
Skills: analyze-tests, find-duplicate-cases, generate-test-cases, ...
|
|
117
|
+
Interactively, type `/connect` inside the agent and pick a project.
|
|
102
118
|
|
|
103
|
-
|
|
119
|
+
In CI or scripts, pass the project token via environment variables:
|
|
104
120
|
|
|
105
|
-
|
|
121
|
+
```bash
|
|
122
|
+
export TESTOMATIO=tstmt_your-project-token
|
|
106
123
|
```
|
|
107
124
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
- "Analyze the test suite in this project"
|
|
111
|
-
- "Find untested code paths in src/controllers"
|
|
112
|
-
- "Generate test cases for the auth module"
|
|
113
|
-
|
|
114
|
-
Paste multi-line text (API docs, specs, requirements) directly into the prompt.
|
|
115
|
-
|
|
116
|
-
## Configuration
|
|
117
|
-
|
|
118
|
-
Edit `testeiya.config.json` in the project root:
|
|
119
|
-
|
|
120
|
-
```json
|
|
121
|
-
{
|
|
122
|
-
"provider": {
|
|
123
|
-
"name": "openrouter",
|
|
124
|
-
"baseUrl": "https://openrouter.ai/api/v1",
|
|
125
|
-
"model": "anthropic/claude-sonnet-4",
|
|
126
|
-
"contextWindow": 200000,
|
|
127
|
-
"maxTokens": 16384
|
|
128
|
-
},
|
|
129
|
-
"permissions": {
|
|
130
|
-
"autoAllowRead": true,
|
|
131
|
-
"blockWrites": true,
|
|
132
|
-
"blockBash": true
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
```
|
|
125
|
+
## Skills
|
|
136
126
|
|
|
137
|
-
|
|
138
|
-
- **permissions.blockWrites** - When `true`, edit/write tools are blocked
|
|
139
|
-
- **permissions.blockBash** - When `true`, only read-only bash commands are allowed
|
|
127
|
+
Testeiya ships with a curated skill library, loaded automatically:
|
|
140
128
|
|
|
141
|
-
|
|
129
|
+
- **Test management** (Testomat.io) — write and improve test cases, detect duplicates, analyze coverage, review requirements, sync cases with the TMS
|
|
130
|
+
- **Test automation** (Testomat.io) — automate manual test cases, debug flaky tests, set up reporters and PR testing
|
|
131
|
+
- **Frameworks** — CodeceptJS (writing, debugging, migrations from Cypress/Protractor/TestCafe/Selenium), Playwright best practices and the Playwright browser CLI
|
|
132
|
+
- **Testomat.io docs** — the full product documentation, bundled and searchable, so platform questions are answered from the docs
|
|
142
133
|
|
|
143
|
-
|
|
134
|
+
Add your own: drop a folder with a `SKILL.md` into `~/.testeiya/skills/` (all projects) or `<project>/.testeiya/skills/` (one project). Type `/skills` in the agent to list what's loaded.
|
|
144
135
|
|
|
145
|
-
|
|
136
|
+
## Slash commands
|
|
146
137
|
|
|
147
|
-
|
|
138
|
+
| Command | Purpose |
|
|
139
|
+
| ---------- | ------------------------------------------------ |
|
|
140
|
+
| `/connect` | Link a Testomat.io project and load its MCP tools |
|
|
141
|
+
| `/project` | Switch the active Testomat.io project |
|
|
142
|
+
| `/model` | Switch the LLM provider and model |
|
|
143
|
+
| `/login` | Sign in with an AI subscription account |
|
|
144
|
+
| `/skills` | List loaded skills |
|
|
145
|
+
| `/help` | Show all commands |
|
|
148
146
|
|
|
149
|
-
|
|
150
|
-
| --------------- | ---------------------- |
|
|
151
|
-
| `openrouter` | `OPENROUTER_API_KEY` |
|
|
152
|
-
| `openai` | `OPENAI_API_KEY` |
|
|
153
|
-
| `anthropic` | `ANTHROPIC_API_KEY` |
|
|
154
|
-
| `groq` | `GROQ_API_KEY` |
|
|
147
|
+
## Running in CI
|
|
155
148
|
|
|
156
|
-
|
|
149
|
+
Testeiya CLI is built to run where no human is watching. The default permission model (reads allowed, writes and bash blocked) makes it safe to run against a checked-out repository.
|
|
157
150
|
|
|
158
|
-
|
|
151
|
+
Each example below uses a different LLM provider — any provider works on any CI; just export the matching API key variable.
|
|
159
152
|
|
|
160
|
-
|
|
153
|
+
### GitHub Actions
|
|
161
154
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
| sync-cases | Synchronize test cases with Testomat.io |
|
|
155
|
+
```yaml
|
|
156
|
+
- uses: oven-sh/setup-bun@v2
|
|
157
|
+
- run: bunx testeiya
|
|
158
|
+
env:
|
|
159
|
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
|
160
|
+
TESTOMATIO: ${{ secrets.TESTOMATIO_TOKEN }}
|
|
161
|
+
```
|
|
170
162
|
|
|
171
|
-
|
|
163
|
+
### GitLab CI
|
|
172
164
|
|
|
173
|
-
```
|
|
174
|
-
|
|
165
|
+
```yaml
|
|
166
|
+
testeiya:
|
|
167
|
+
image: oven/bun:1
|
|
168
|
+
script:
|
|
169
|
+
- bunx testeiya
|
|
170
|
+
variables:
|
|
171
|
+
OPENAI_API_KEY: $OPENAI_API_KEY
|
|
172
|
+
TESTOMATIO: $TESTOMATIO_TOKEN
|
|
175
173
|
```
|
|
176
174
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
175
|
+
### Bitbucket Pipelines
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
pipelines:
|
|
179
|
+
default:
|
|
180
|
+
- step:
|
|
181
|
+
name: testeiya
|
|
182
|
+
image: oven/bun:1
|
|
183
|
+
script:
|
|
184
|
+
# ANTHROPIC_API_KEY and TESTOMATIO are set as secured repository variables
|
|
185
|
+
- bunx testeiya
|
|
186
|
+
```
|
|
180
187
|
|
|
181
|
-
|
|
182
|
-
- **`@oh-my-pi/pi-ai`** - Multi-provider LLM abstraction
|
|
183
|
-
- **`@oh-my-pi/pi-tui`** - Markdown rendering
|
|
188
|
+
### Jenkins
|
|
184
189
|
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
190
|
+
```groovy
|
|
191
|
+
pipeline {
|
|
192
|
+
agent { docker { image 'oven/bun:1' } }
|
|
193
|
+
environment {
|
|
194
|
+
MISTRAL_API_KEY = credentials('mistral-api-key')
|
|
195
|
+
TESTOMATIO = credentials('testomatio-token')
|
|
196
|
+
}
|
|
197
|
+
stages {
|
|
198
|
+
stage('testeiya') {
|
|
199
|
+
steps {
|
|
200
|
+
sh 'bunx testeiya'
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
195
205
|
```
|
|
196
206
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
|
|
207
|
+
### Azure Pipelines
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
steps:
|
|
211
|
+
- script: |
|
|
212
|
+
curl -fsSL https://bun.sh/install | bash
|
|
213
|
+
export PATH="$HOME/.bun/bin:$PATH"
|
|
214
|
+
bunx testeiya
|
|
215
|
+
env:
|
|
216
|
+
AZURE_OPENAI_API_KEY: $(AZURE_OPENAI_API_KEY)
|
|
217
|
+
AZURE_OPENAI_BASE_URL: $(AZURE_OPENAI_BASE_URL)
|
|
218
|
+
TESTOMATIO: $(TESTOMATIO_TOKEN)
|
|
219
|
+
```
|
|
202
220
|
|
|
203
|
-
|
|
204
|
-
npx tsc --noEmit
|
|
221
|
+
## Configuration
|
|
205
222
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
223
|
+
Configuration is layered, lowest to highest priority: built-in defaults, then `testeiya.config.json` in the working directory, then `~/.testeiya/config.json`. The in-app `/model` selection writes to the home file, so it persists across runs.
|
|
224
|
+
|
|
225
|
+
All options:
|
|
226
|
+
|
|
227
|
+
| Option | Default | Purpose |
|
|
228
|
+
| ------------------------- | ------------ | ------- |
|
|
229
|
+
| `provider.name` | `openrouter` | LLM provider id (see [Providers](#providers)) |
|
|
230
|
+
| `provider.model` | — | Model id, as your provider names it |
|
|
231
|
+
| `provider.baseUrl` | provider's own | API endpoint override, for gateways and self-hosted OpenAI-compatible servers |
|
|
232
|
+
| `provider.contextWindow` | `200000` | Context window size the agent budgets against |
|
|
233
|
+
| `provider.maxTokens` | `16384` | Maximum output tokens per response |
|
|
234
|
+
| `thinkingLevel` | `medium` | Reasoning effort: `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
|
235
|
+
| `permissions.autoAllowRead` | `true` | Auto-approve read-only tools |
|
|
236
|
+
| `permissions.blockWrites` | `true` | Block edit and write tools |
|
|
237
|
+
| `permissions.blockBash` | `true` | Allow only read-only bash commands |
|
|
238
|
+
| `memoryEnabled` | `true` | Per-project agent memory |
|
|
239
|
+
| `testomatioHost` | `https://app.testomat.io` | Testomat.io base URL, for self-hosted instances |
|
|
240
|
+
| `toolGate.activeTools` | — | Per-MCP-server glob patterns of tool names to keep active; the rest load on demand |
|
|
241
|
+
|
|
242
|
+
API keys are never stored in these files — they come from environment variables or `.env` files (working directory or `~/.testeiya/.env`).
|
|
209
243
|
|
|
210
244
|
## License
|
|
211
245
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<svg width="341" height="351" viewBox="0 0 341 351" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M61.7988 107.701C61.7988 48.7012 109.628 0 168.628 0V0C227.628 0 275.457 48.7012 275.457 107.701V107.701C275.457 166.702 227.628 215.403 168.628 215.403V215.403C109.628 215.403 61.7988 166.702 61.7988 107.701V107.701Z" fill="#7E33FF"/>
|
|
3
|
+
<path d="M277.202 107.701C277.202 167.183 228.982 215.403 169.5 215.403C110.018 215.403 61.7988 167.183 61.7988 107.701C61.7988 48.2195 110.018 0 169.5 0C228.982 0 277.202 48.2195 277.202 107.701Z" fill="#9E66FF"/>
|
|
4
|
+
<path d="M277.202 107.701C277.202 148.801 254.181 184.523 220.33 202.678C205.19 210.797 205.712 155.168 187.33 155.168C127.848 155.168 129.331 167.183 129.331 107.701C129.331 48.2195 110.019 0 169.501 0C228.982 0 277.202 48.2195 277.202 107.701Z" fill="#7E33FF"/>
|
|
5
|
+
<path d="M286.502 31.2659C286.769 31.244 287.039 31.225 287.306 31.2089C288.598 31.1318 288.926 31.0811 289.82 31.8605C290 33.7624 287.727 35.3908 286.377 36.5786C279.73 42.4245 273.28 48.5825 267.146 54.9706C257.428 65.1786 248.351 75.9697 239.968 87.2823C235.457 93.2874 231.05 100.104 226.182 105.697C224.815 107.268 222.728 107.689 220.751 108.168C214.589 106.653 211.442 101.182 207.482 96.5565C204.385 92.9502 201.215 89.4033 197.979 85.9183C195.976 83.6268 189.021 77.6128 188.838 75.0299C188.51 70.408 198.568 66.3341 202.342 68.9159C208.574 73.1772 214.353 79.4383 219.648 84.9298C223.599 81.4528 226.371 77.3908 229.866 73.8006C243.442 59.8516 266.775 34.7412 286.502 31.2659Z" fill="#F5F3FF"/>
|
|
6
|
+
<path d="M288.02 24.6289C288.483 24.6219 289.216 24.6346 290.066 24.8144C291.786 25.1782 293.012 26.0141 293.805 26.665L294.119 26.9306L296.087 28.6455L296.332 31.2441C296.69 35.0307 294.565 37.7187 293.533 38.8642C292.481 40.0325 290.945 41.2721 290.699 41.4882L290.697 41.4902C284.184 47.2182 277.867 53.2496 271.865 59.5009C262.339 69.5088 253.441 80.0875 245.223 91.1767L245.211 91.1933L245.198 91.2109C241.364 96.3145 236.775 103.262 232.061 108.885L231.117 109.991C228.091 113.468 223.558 114.219 222.291 114.525L220.74 114.9L219.19 114.519C214.468 113.359 211.107 110.695 208.575 108.06C207.33 106.765 206.218 105.402 205.25 104.19C204.229 102.912 203.412 101.859 202.521 100.817C199.48 97.2764 196.367 93.7928 193.187 90.3691L193.12 90.2968L193.055 90.2226C192.747 89.8703 192.137 89.2576 191.132 88.2636C190.216 87.3572 189.077 86.2354 187.99 85.0937C186.922 83.9721 185.75 82.6724 184.796 81.3769C184.318 80.728 183.802 79.9564 183.372 79.1103C182.98 78.3394 182.425 77.0621 182.314 75.4931L182.296 75.1484C182.167 71.6115 183.965 68.8889 185.571 67.2226C187.278 65.4522 189.416 64.1508 191.457 63.2685C193.52 62.3763 195.861 61.7489 198.189 61.6044C200.376 61.4688 203.398 61.7131 206.036 63.5175H206.035C210.954 66.8813 215.572 71.3284 219.654 75.5087C219.754 75.3922 219.856 75.2758 219.958 75.1572C221.46 73.4001 223.24 71.2318 225.18 69.2382C231.868 62.3674 241.357 52.3226 251.654 43.6122C261.755 35.0677 273.663 26.8861 285.368 24.8242L285.667 24.7714L285.968 24.747C286.285 24.721 286.602 24.6994 286.913 24.6806L286.917 24.6796C287.14 24.6663 287.606 24.6351 288.02 24.6289ZM289.821 31.8603C288.927 31.0809 288.599 31.1318 287.307 31.2089C287.04 31.2251 286.77 31.2437 286.503 31.2656C266.775 34.7409 243.443 59.8517 229.867 73.8007L229.219 74.4794C226.021 77.8965 223.353 81.6701 219.649 84.9296L215.588 80.7099C211.609 76.6108 207.384 72.4719 202.925 69.3212L202.342 68.916C198.569 66.3342 188.511 70.4084 188.839 75.0302C189.022 77.6132 195.976 83.6263 197.979 85.9179C201.216 89.4029 204.386 92.9503 207.483 96.5566C211.442 101.182 214.589 106.653 220.752 108.168C222.605 107.719 224.556 107.321 225.919 105.978L226.183 105.697C230.747 100.454 234.905 94.1345 239.124 88.4169L239.968 87.2822C248.352 75.9696 257.429 65.1786 267.147 54.9706C273.281 48.5826 279.73 42.424 286.378 36.5781C287.685 35.4274 289.86 33.8637 289.831 32.038L289.821 31.8603Z" fill="#7E33FF"/>
|
|
7
|
+
<path d="M146.866 2.15332C144.544 13.9258 142.307 42.7632 151.921 64.0635L142.528 64.8291L122.177 66.4893L129.797 72.9697L146.37 68.4609L155.763 67.6953L161.429 79.4746C162.357 81.4046 161.06 83.6657 158.926 83.8398L136.084 85.7031C134.801 85.8078 134.425 87.5088 135.545 88.1445L141.152 91.3281C142.131 91.8835 142.998 92.6147 143.711 93.4844L147.004 97.499L163.783 88.7402C173.997 104.478 173.829 117.668 224.829 165.531C232.181 172.431 237.62 180.44 241.83 187.764C231.441 197.202 219.314 204.44 205.83 209.264C202.46 189.434 190.004 179.631 182.965 168.106C182.11 166.706 180.327 166.127 178.849 166.839C161.349 175.269 147.962 178.118 142.632 169.547C136.998 160.489 131.902 147.909 129.469 141.514C128.481 138.917 126.519 136.793 123.977 135.673L114.124 131.332C111.732 130.278 111.002 127.214 112.447 125.037C120.358 113.124 128.245 91.5566 122.525 71.4521C120.862 65.604 119.45 59.5734 120.075 53.5254L122.861 26.585C123.892 21.5035 126.684 10.6495 129.61 7.88574C129.997 7.52106 130.503 7.16688 131.101 6.82324C136.182 4.88164 141.449 3.31366 146.866 2.15332Z" fill="#F5F3FF"/>
|
|
8
|
+
<path d="M328.876 287.819H340.036V332.819H328.876V328.139C325.516 332.099 321.166 334.079 315.826 334.079C311.326 334.079 307.366 333.059 303.946 331.019C300.526 328.979 297.886 326.159 296.026 322.559C294.166 318.959 293.236 314.909 293.236 310.409C293.236 305.909 294.166 301.859 296.026 298.259C297.886 294.659 300.526 291.839 303.946 289.799C307.366 287.699 311.326 286.649 315.826 286.649C321.046 286.649 325.396 288.629 328.876 292.589V287.819ZM316.096 323.639C319.756 323.639 322.786 322.379 325.186 319.859C327.646 317.339 328.876 314.159 328.876 310.319C328.876 306.479 327.676 303.329 325.276 300.869C322.876 298.409 319.816 297.179 316.096 297.179C312.616 297.179 309.766 298.469 307.546 301.049C305.326 303.629 304.216 306.749 304.216 310.409C304.216 314.129 305.326 317.279 307.546 319.859C309.766 322.379 312.616 323.639 316.096 323.639Z" fill="#F5F3FF"/>
|
|
9
|
+
<path d="M279.95 287.819H291.65L275.9 332.909C273.56 339.089 270.32 343.709 266.18 346.769C262.1 349.889 257.27 351.239 251.69 350.819V340.019C252.05 340.079 252.59 340.109 253.31 340.109C258.11 340.109 261.86 337.199 264.56 331.379L244.76 287.819H256.73L269.96 316.439L279.95 287.819Z" fill="#F5F3FF"/>
|
|
10
|
+
<path d="M226.749 332.819V287.819H237.819V332.819H226.749ZM232.329 277.379C230.709 277.379 229.299 276.809 228.099 275.669C226.959 274.529 226.389 273.119 226.389 271.439C226.389 269.759 226.959 268.349 228.099 267.209C229.299 266.009 230.709 265.409 232.329 265.409C233.949 265.409 235.329 266.009 236.469 267.209C237.669 268.349 238.269 269.759 238.269 271.439C238.269 273.119 237.669 274.529 236.469 275.669C235.329 276.809 233.949 277.379 232.329 277.379Z" fill="#F5F3FF"/>
|
|
11
|
+
<path d="M196.235 286.649C200.555 286.649 204.425 287.729 207.845 289.889C211.325 291.989 214.025 294.839 215.945 298.439C217.865 302.039 218.825 306.029 218.825 310.409C218.825 311.849 218.705 313.169 218.465 314.369H183.635C184.415 317.429 186.005 319.889 188.405 321.749C190.805 323.549 193.715 324.449 197.135 324.449C199.355 324.449 201.455 323.969 203.435 323.009C205.475 322.049 207.005 320.819 208.025 319.319L216.575 324.359C214.475 327.479 211.745 329.879 208.385 331.559C205.085 333.179 201.275 333.989 196.955 333.989C192.155 333.989 187.895 332.969 184.175 330.929C180.455 328.889 177.575 326.069 175.535 322.469C173.495 318.869 172.475 314.819 172.475 310.319C172.475 305.879 173.465 301.859 175.445 298.259C177.485 294.659 180.305 291.839 183.905 289.799C187.565 287.699 191.675 286.649 196.235 286.649ZM208.295 305.639C207.875 302.759 206.555 300.509 204.335 298.889C202.115 297.209 199.355 296.369 196.055 296.369C193.775 296.369 191.675 296.789 189.755 297.629C187.895 298.469 186.395 299.609 185.255 301.049C184.115 302.489 183.515 304.019 183.455 305.639H208.295Z" fill="#F5F3FF"/>
|
|
12
|
+
<path d="M156.114 317.429C156.114 319.469 156.594 320.879 157.554 321.659C158.514 322.439 160.044 322.829 162.144 322.829C163.404 322.829 164.784 322.739 166.284 322.559V332.819C163.464 333.119 161.124 333.269 159.264 333.269C154.464 333.269 150.864 332.189 148.464 330.029C146.124 327.809 144.954 323.849 144.954 318.149V297.809H136.494V287.819H144.954V276.749L156.114 272.969V287.819H166.104V297.809H156.114V317.429Z" fill="#F5F3FF"/>
|
|
13
|
+
<path d="M106.061 300.419C106.061 301.679 106.751 302.639 108.131 303.299C109.571 303.899 111.821 304.529 114.881 305.189C118.361 305.909 121.271 306.719 123.611 307.619C125.951 308.519 127.961 309.959 129.641 311.939C131.381 313.859 132.251 316.469 132.251 319.769C132.251 322.709 131.351 325.259 129.551 327.419C127.811 329.579 125.441 331.229 122.441 332.369C119.501 333.449 116.291 333.989 112.811 333.989C108.131 333.989 104.081 333.089 100.661 331.289C97.3014 329.489 94.8114 326.909 93.1914 323.549L102.371 318.779C103.871 322.919 107.351 324.989 112.811 324.989C115.151 324.989 117.161 324.539 118.841 323.639C120.581 322.739 121.451 321.449 121.451 319.769C121.451 318.329 120.671 317.279 119.111 316.619C117.611 315.899 115.151 315.119 111.731 314.279C108.191 313.439 105.311 312.599 103.091 311.759C100.871 310.919 98.9514 309.629 97.3314 307.889C95.7114 306.089 94.9014 303.719 94.9014 300.779C94.9014 297.899 95.7114 295.409 97.3314 293.309C98.9514 291.149 101.111 289.499 103.811 288.359C106.571 287.219 109.601 286.649 112.901 286.649C116.801 286.649 120.311 287.459 123.431 289.079C126.551 290.699 128.951 293.009 130.631 296.009L121.541 300.599C119.981 297.239 117.101 295.559 112.901 295.559C110.801 295.559 109.121 296.009 107.861 296.909C106.661 297.749 106.061 298.919 106.061 300.419Z" fill="#F5F3FF"/>
|
|
14
|
+
<path d="M65.4534 286.649C69.7734 286.649 73.6434 287.729 77.0634 289.889C80.5434 291.989 83.2434 294.839 85.1634 298.439C87.0834 302.039 88.0434 306.029 88.0434 310.409C88.0434 311.849 87.9234 313.169 87.6834 314.369H52.8534C53.6334 317.429 55.2234 319.889 57.6234 321.749C60.0234 323.549 62.9334 324.449 66.3534 324.449C68.5734 324.449 70.6734 323.969 72.6534 323.009C74.6934 322.049 76.2234 320.819 77.2434 319.319L85.7934 324.359C83.6934 327.479 80.9634 329.879 77.6034 331.559C74.3034 333.179 70.4934 333.989 66.1734 333.989C61.3734 333.989 57.1134 332.969 53.3934 330.929C49.6734 328.889 46.7934 326.069 44.7534 322.469C42.7134 318.869 41.6934 314.819 41.6934 310.319C41.6934 305.879 42.6834 301.859 44.6634 298.259C46.7034 294.659 49.5234 291.839 53.1234 289.799C56.7834 287.699 60.8934 286.649 65.4534 286.649ZM77.5134 305.639C77.0934 302.759 75.7734 300.509 73.5534 298.889C71.3334 297.209 68.5734 296.369 65.2734 296.369C62.9934 296.369 60.8934 296.789 58.9734 297.629C57.1134 298.469 55.6134 299.609 54.4734 301.049C53.3334 302.489 52.7334 304.019 52.6734 305.639H77.5134Z" fill="#F5F3FF"/>
|
|
15
|
+
<path d="M46.35 269.819V280.979H28.98V332.819H17.19V280.979H0V269.819H46.35Z" fill="#F5F3FF"/>
|
|
16
|
+
</svg>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg width="341" height="351" viewBox="0 0 341 351" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect x="61.7988" width="213.659" height="215.403" rx="106.829" fill="#7E33FF"/>
|
|
3
|
+
<circle cx="169.5" cy="107.701" r="107.701" fill="#9E66FF"/>
|
|
4
|
+
<path d="M277.202 107.701C277.202 148.801 254.181 184.523 220.33 202.678C205.19 210.797 205.712 155.168 187.33 155.168C127.848 155.168 129.331 167.183 129.331 107.701C129.331 48.2195 110.019 0 169.501 0C228.982 0 277.202 48.2195 277.202 107.701Z" fill="#7E33FF"/>
|
|
5
|
+
<path d="M287.111 27.9443C287.527 27.9195 288.49 27.8237 289.389 28.0137C290.404 28.2284 291.154 28.7204 291.731 29.1943L291.969 29.3955L292.953 30.2529L293.076 31.5527C293.3 33.9212 291.976 35.7064 291.103 36.6758C290.219 37.6565 288.998 38.6283 288.538 39.0332L288.537 39.0342C281.96 44.8182 275.579 50.9084 269.514 57.2246L269.515 57.2256C259.889 67.3365 250.898 78.0249 242.595 89.2295L242.589 89.2383L242.582 89.2461C238.282 94.9705 233.605 102.15 228.649 107.844C226.453 110.368 223.142 110.954 221.521 111.347L220.745 111.534L219.971 111.344C216.069 110.385 213.225 108.179 210.933 105.794C209.797 104.612 208.762 103.349 207.804 102.149C206.818 100.916 205.94 99.7835 204.998 98.6836V98.6826C201.93 95.1105 198.789 91.5966 195.582 88.1436L195.549 88.1074L195.517 88.0703C195.112 87.6077 194.402 86.8986 193.432 85.9385C192.505 85.0221 191.404 83.9379 190.357 82.8389C189.32 81.7498 188.26 80.5667 187.429 79.4375C187.013 78.8724 186.607 78.259 186.286 77.6279C185.984 77.0345 185.643 76.2076 185.576 75.2617L185.563 75.0352C185.479 72.7081 186.659 70.8056 187.925 69.4922C189.256 68.1113 190.997 67.0291 192.754 66.2695C194.522 65.5052 196.492 64.986 198.391 64.8682C200.218 64.7548 202.398 64.9919 204.188 66.2168H204.188C209.829 70.074 215.084 75.4556 219.736 80.3018C220.657 79.34 221.544 78.3334 222.442 77.2822C224.005 75.4543 225.678 73.4138 227.522 71.5195L233.038 65.8359C238.988 59.7272 246.155 52.5458 253.766 46.1084C263.814 37.6084 275.151 29.9447 285.935 28.0449L286.084 28.0186L286.235 28.0068C286.527 27.9829 286.821 27.9618 287.109 27.9443H287.111Z" fill="#F5F3FF" stroke="#7E33FF" stroke-width="6.54057"/>
|
|
6
|
+
<path d="M146.866 2.15332C144.544 13.9258 142.307 42.7632 151.921 64.0635L142.528 64.8291L122.177 66.4893L129.797 72.9697L146.37 68.4609L155.763 67.6953L161.429 79.4746C162.357 81.4046 161.06 83.6657 158.926 83.8398L136.084 85.7031C134.801 85.8078 134.425 87.5088 135.545 88.1445L141.152 91.3281C142.131 91.8835 142.998 92.6147 143.711 93.4844L147.004 97.499L163.783 88.7402C173.997 104.478 173.829 117.668 224.829 165.531C232.181 172.431 237.62 180.44 241.83 187.764C231.441 197.202 219.314 204.44 205.83 209.264C202.46 189.434 190.004 179.631 182.965 168.106C182.11 166.706 180.327 166.127 178.849 166.839C161.349 175.269 147.962 178.118 142.632 169.547C136.998 160.489 131.902 147.909 129.469 141.514C128.481 138.917 126.519 136.793 123.977 135.673L114.124 131.332C111.732 130.278 111.002 127.214 112.447 125.037C120.358 113.124 128.245 91.5566 122.525 71.4521C120.862 65.604 119.45 59.5734 120.075 53.5254L122.861 26.585C123.892 21.5035 126.684 10.6495 129.61 7.88574C129.997 7.52106 130.503 7.16688 131.101 6.82324C136.182 4.88164 141.449 3.31366 146.866 2.15332Z" fill="#F5F3FF"/>
|
|
7
|
+
<path d="M328.876 287.819H340.036V332.819H328.876V328.139C325.516 332.099 321.166 334.079 315.826 334.079C311.326 334.079 307.366 333.059 303.946 331.019C300.526 328.979 297.886 326.159 296.026 322.559C294.166 318.959 293.236 314.909 293.236 310.409C293.236 305.909 294.166 301.859 296.026 298.259C297.886 294.659 300.526 291.839 303.946 289.799C307.366 287.699 311.326 286.649 315.826 286.649C321.046 286.649 325.396 288.629 328.876 292.589V287.819ZM316.096 323.639C319.756 323.639 322.786 322.379 325.186 319.859C327.646 317.339 328.876 314.159 328.876 310.319C328.876 306.479 327.676 303.329 325.276 300.869C322.876 298.409 319.816 297.179 316.096 297.179C312.616 297.179 309.766 298.469 307.546 301.049C305.326 303.629 304.216 306.749 304.216 310.409C304.216 314.129 305.326 317.279 307.546 319.859C309.766 322.379 312.616 323.639 316.096 323.639Z" fill="#021520"/>
|
|
8
|
+
<path d="M279.95 287.819H291.65L275.9 332.909C273.56 339.089 270.32 343.709 266.18 346.769C262.1 349.889 257.27 351.239 251.69 350.819V340.019C252.05 340.079 252.59 340.109 253.31 340.109C258.11 340.109 261.86 337.199 264.56 331.379L244.76 287.819H256.73L269.96 316.439L279.95 287.819Z" fill="#021520"/>
|
|
9
|
+
<path d="M226.749 332.819V287.819H237.819V332.819H226.749ZM232.329 277.379C230.709 277.379 229.299 276.809 228.099 275.669C226.959 274.529 226.389 273.119 226.389 271.439C226.389 269.759 226.959 268.349 228.099 267.209C229.299 266.009 230.709 265.409 232.329 265.409C233.949 265.409 235.329 266.009 236.469 267.209C237.669 268.349 238.269 269.759 238.269 271.439C238.269 273.119 237.669 274.529 236.469 275.669C235.329 276.809 233.949 277.379 232.329 277.379Z" fill="#021520"/>
|
|
10
|
+
<path d="M196.235 286.649C200.555 286.649 204.425 287.729 207.845 289.889C211.325 291.989 214.025 294.839 215.945 298.439C217.865 302.039 218.825 306.029 218.825 310.409C218.825 311.849 218.705 313.169 218.465 314.369H183.635C184.415 317.429 186.005 319.889 188.405 321.749C190.805 323.549 193.715 324.449 197.135 324.449C199.355 324.449 201.455 323.969 203.435 323.009C205.475 322.049 207.005 320.819 208.025 319.319L216.575 324.359C214.475 327.479 211.745 329.879 208.385 331.559C205.085 333.179 201.275 333.989 196.955 333.989C192.155 333.989 187.895 332.969 184.175 330.929C180.455 328.889 177.575 326.069 175.535 322.469C173.495 318.869 172.475 314.819 172.475 310.319C172.475 305.879 173.465 301.859 175.445 298.259C177.485 294.659 180.305 291.839 183.905 289.799C187.565 287.699 191.675 286.649 196.235 286.649ZM208.295 305.639C207.875 302.759 206.555 300.509 204.335 298.889C202.115 297.209 199.355 296.369 196.055 296.369C193.775 296.369 191.675 296.789 189.755 297.629C187.895 298.469 186.395 299.609 185.255 301.049C184.115 302.489 183.515 304.019 183.455 305.639H208.295Z" fill="#021520"/>
|
|
11
|
+
<path d="M156.114 317.429C156.114 319.469 156.594 320.879 157.554 321.659C158.514 322.439 160.044 322.829 162.144 322.829C163.404 322.829 164.784 322.739 166.284 322.559V332.819C163.464 333.119 161.124 333.269 159.264 333.269C154.464 333.269 150.864 332.189 148.464 330.029C146.124 327.809 144.954 323.849 144.954 318.149V297.809H136.494V287.819H144.954V276.749L156.114 272.969V287.819H166.104V297.809H156.114V317.429Z" fill="#021520"/>
|
|
12
|
+
<path d="M106.061 300.419C106.061 301.679 106.751 302.639 108.131 303.299C109.571 303.899 111.821 304.529 114.881 305.189C118.361 305.909 121.271 306.719 123.611 307.619C125.951 308.519 127.961 309.959 129.641 311.939C131.381 313.859 132.251 316.469 132.251 319.769C132.251 322.709 131.351 325.259 129.551 327.419C127.811 329.579 125.441 331.229 122.441 332.369C119.501 333.449 116.291 333.989 112.811 333.989C108.131 333.989 104.081 333.089 100.661 331.289C97.3014 329.489 94.8114 326.909 93.1914 323.549L102.371 318.779C103.871 322.919 107.351 324.989 112.811 324.989C115.151 324.989 117.161 324.539 118.841 323.639C120.581 322.739 121.451 321.449 121.451 319.769C121.451 318.329 120.671 317.279 119.111 316.619C117.611 315.899 115.151 315.119 111.731 314.279C108.191 313.439 105.311 312.599 103.091 311.759C100.871 310.919 98.9514 309.629 97.3314 307.889C95.7114 306.089 94.9014 303.719 94.9014 300.779C94.9014 297.899 95.7114 295.409 97.3314 293.309C98.9514 291.149 101.111 289.499 103.811 288.359C106.571 287.219 109.601 286.649 112.901 286.649C116.801 286.649 120.311 287.459 123.431 289.079C126.551 290.699 128.951 293.009 130.631 296.009L121.541 300.599C119.981 297.239 117.101 295.559 112.901 295.559C110.801 295.559 109.121 296.009 107.861 296.909C106.661 297.749 106.061 298.919 106.061 300.419Z" fill="#021520"/>
|
|
13
|
+
<path d="M65.4534 286.649C69.7734 286.649 73.6434 287.729 77.0634 289.889C80.5434 291.989 83.2434 294.839 85.1634 298.439C87.0834 302.039 88.0434 306.029 88.0434 310.409C88.0434 311.849 87.9234 313.169 87.6834 314.369H52.8534C53.6334 317.429 55.2234 319.889 57.6234 321.749C60.0234 323.549 62.9334 324.449 66.3534 324.449C68.5734 324.449 70.6734 323.969 72.6534 323.009C74.6934 322.049 76.2234 320.819 77.2434 319.319L85.7934 324.359C83.6934 327.479 80.9634 329.879 77.6034 331.559C74.3034 333.179 70.4934 333.989 66.1734 333.989C61.3734 333.989 57.1134 332.969 53.3934 330.929C49.6734 328.889 46.7934 326.069 44.7534 322.469C42.7134 318.869 41.6934 314.819 41.6934 310.319C41.6934 305.879 42.6834 301.859 44.6634 298.259C46.7034 294.659 49.5234 291.839 53.1234 289.799C56.7834 287.699 60.8934 286.649 65.4534 286.649ZM77.5134 305.639C77.0934 302.759 75.7734 300.509 73.5534 298.889C71.3334 297.209 68.5734 296.369 65.2734 296.369C62.9934 296.369 60.8934 296.789 58.9734 297.629C57.1134 298.469 55.6134 299.609 54.4734 301.049C53.3334 302.489 52.7334 304.019 52.6734 305.639H77.5134Z" fill="#021520"/>
|
|
14
|
+
<path d="M46.35 269.819V280.979H28.98V332.819H17.19V280.979H0V269.819H46.35Z" fill="#021520"/>
|
|
15
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testeiya",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "AI Testing Agent - QA and testing focused AI assistant",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"testeiya": "src/cli.ts"
|
|
13
13
|
},
|
|
14
14
|
"files": [
|
|
15
|
+
"assets",
|
|
15
16
|
"src",
|
|
16
17
|
"skills",
|
|
17
18
|
"skills.yaml",
|
package/src/loader-style.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// Testeiya branded loader: gradient shimmer + rotating QA-themed verbs.
|
|
2
2
|
// Hooks an InteractiveMode instance — when its loadingAnimation appears,
|
|
3
|
-
// we replace its messageColorFn with a
|
|
3
|
+
// we replace its messageColorFn with a violet shimmer and start cycling verbs.
|
|
4
4
|
|
|
5
5
|
import { visibleWidth } from "@oh-my-pi/pi-tui";
|
|
6
6
|
|
|
7
7
|
const PALETTE = [
|
|
8
|
-
[
|
|
9
|
-
[
|
|
10
|
-
[
|
|
11
|
-
[
|
|
12
|
-
[
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
8
|
+
[0x6d, 0x28, 0xd9], // #6d28d9 deep violet
|
|
9
|
+
[0x7c, 0x3a, 0xed],
|
|
10
|
+
[0x8b, 0x5c, 0xf6], // #8b5cf6 brand primary
|
|
11
|
+
[0xa7, 0x8b, 0xfa],
|
|
12
|
+
[0xdd, 0xd6, 0xfe], // #ddd6fe pale violet
|
|
13
|
+
[0xa7, 0x8b, 0xfa],
|
|
14
|
+
[0x8b, 0x5c, 0xf6],
|
|
15
|
+
[0x7c, 0x3a, 0xed],
|
|
16
16
|
];
|
|
17
17
|
|
|
18
18
|
const RESET = "\x1b[0m";
|
package/src/theme.ts
CHANGED
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
import { setTheme } from "@oh-my-pi/pi-coding-agent";
|
|
5
5
|
import { theme as themeSingleton } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const TC_VIOLET = "\x1b[38;2;139;92;246m"; // #8b5cf6 brand primary
|
|
8
8
|
const TC_RESET = "\x1b[0m";
|
|
9
9
|
|
|
10
|
-
/** Colorize a string in the Testeiya input-border
|
|
11
|
-
export const testeiyaBorder = (s: string): string => `${
|
|
10
|
+
/** Colorize a string in the Testeiya input-border violet. */
|
|
11
|
+
export const testeiyaBorder = (s: string): string => `${TC_VIOLET}${s}${TC_RESET}`;
|
|
12
12
|
|
|
13
13
|
interface ThemableInteractive {
|
|
14
14
|
editor: { setBorderVisible(v: boolean): void; borderColor: (s: string) => string };
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
* Apply the Testeiya look: obsidian base theme +
|
|
18
|
+
* Apply the Testeiya look: obsidian base theme + violet input border that
|
|
19
19
|
* survives bash/python mode exits (the SDK restores the "off" thinking border).
|
|
20
20
|
*/
|
|
21
21
|
export function applyTesteiyaTheme(interactive: ThemableInteractive): void {
|
package/src/welcome.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type Component, padding, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
|
|
2
2
|
|
|
3
|
-
const BRIGHT = "\x1b[38;2;
|
|
4
|
-
const SHADOW = "\x1b[38;2;
|
|
5
|
-
const PALE = "\x1b[38;2;
|
|
3
|
+
const BRIGHT = "\x1b[38;2;158;102;255m"; // #9e66ff — brand light violet
|
|
4
|
+
const SHADOW = "\x1b[38;2;46;16;101m"; // #2e1065 — deep violet
|
|
5
|
+
const PALE = "\x1b[38;2;221;214;254m"; // #ddd6fe — pale violet
|
|
6
6
|
|
|
7
7
|
// Top-to-bottom gradient: brightest at the first row, darkening downward.
|
|
8
|
-
const GRAD_TOP = [
|
|
9
|
-
const GRAD_BOT = [
|
|
8
|
+
const GRAD_TOP = [196, 181, 253]; // #c4b5fd light violet
|
|
9
|
+
const GRAD_BOT = [109, 40, 217]; // #6d28d9 deep violet
|
|
10
10
|
|
|
11
11
|
function gradientFg(row: number, rows: number): string {
|
|
12
12
|
const t = rows <= 1 ? 0 : row / (rows - 1);
|
|
@@ -60,6 +60,66 @@ function buildShadowedWordmark(): { lines: string[]; width: number } {
|
|
|
60
60
|
const SHADOWED = buildShadowedWordmark();
|
|
61
61
|
const WORDMARK_WIDTH = SHADOWED.width;
|
|
62
62
|
|
|
63
|
+
// The Testeiya logo mark (violet circle + white check) as a 12×12 pixel bitmap.
|
|
64
|
+
// L = light violet #9e66ff, P = deep violet #7e33ff, W = white #f5f3ff, . = transparent.
|
|
65
|
+
const LOGO_PIXELS = [
|
|
66
|
+
"....LLLP....",
|
|
67
|
+
"..LLLLLPPPWW",
|
|
68
|
+
".LLLLLLPPWW.",
|
|
69
|
+
".LLLLLLPWWP.",
|
|
70
|
+
"LLLLLLLWWPPP",
|
|
71
|
+
"LWWLLLWWPPPP",
|
|
72
|
+
"LLWWLWWPPPPP",
|
|
73
|
+
"LLLWWWLPPPPP",
|
|
74
|
+
".LLWWLLPPPP.",
|
|
75
|
+
".LLLLLLPPPP.",
|
|
76
|
+
"..LLLLLPPP..",
|
|
77
|
+
"....LLLP....",
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
const LOGO_FG: Record<string, string> = {
|
|
81
|
+
L: "\x1b[38;2;158;102;255m",
|
|
82
|
+
P: "\x1b[38;2;126;51;255m",
|
|
83
|
+
W: "\x1b[38;2;245;243;255m",
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const LOGO_BG: Record<string, string> = {
|
|
87
|
+
L: "\x1b[48;2;158;102;255m",
|
|
88
|
+
P: "\x1b[48;2;126;51;255m",
|
|
89
|
+
W: "\x1b[48;2;245;243;255m",
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// Renders the bitmap with half-blocks: each character cell stacks two pixel
|
|
93
|
+
// rows (▀ fg = top pixel, bg = bottom pixel), so the 12×12 logo takes 6 lines.
|
|
94
|
+
function buildLogo(): { lines: string[]; width: number } {
|
|
95
|
+
const lines: string[] = [];
|
|
96
|
+
for (let r = 0; r < LOGO_PIXELS.length; r += 2) {
|
|
97
|
+
const top = LOGO_PIXELS[r];
|
|
98
|
+
const bot = LOGO_PIXELS[r + 1] ?? "";
|
|
99
|
+
let out = "";
|
|
100
|
+
for (let c = 0; c < top.length; c++) {
|
|
101
|
+
const t = top[c] ?? ".";
|
|
102
|
+
const b = bot[c] ?? ".";
|
|
103
|
+
if (t === "." && b === ".") {
|
|
104
|
+
out += " ";
|
|
105
|
+
} else if (b === ".") {
|
|
106
|
+
out += `${LOGO_FG[t]}▀${RESET}`;
|
|
107
|
+
} else if (t === ".") {
|
|
108
|
+
out += `${LOGO_FG[b]}▄${RESET}`;
|
|
109
|
+
} else if (t === b) {
|
|
110
|
+
out += `${LOGO_FG[t]}█${RESET}`;
|
|
111
|
+
} else {
|
|
112
|
+
out += `${LOGO_FG[t]}${LOGO_BG[b]}▀${RESET}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
lines.push(out);
|
|
116
|
+
}
|
|
117
|
+
return { lines, width: LOGO_PIXELS[0].length };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const LOGO = buildLogo();
|
|
121
|
+
const LOGO_GAP = 1;
|
|
122
|
+
|
|
63
123
|
const COMPACT_MARK = "▰ TESTEIYA ▰";
|
|
64
124
|
|
|
65
125
|
export class TesteiyaWelcome implements Component {
|
|
@@ -85,7 +145,14 @@ export class TesteiyaWelcome implements Component {
|
|
|
85
145
|
|
|
86
146
|
const lines: string[] = [""];
|
|
87
147
|
|
|
88
|
-
|
|
148
|
+
const combinedWidth = LOGO.width + LOGO_GAP + WORDMARK_WIDTH;
|
|
149
|
+
if (width >= combinedWidth) {
|
|
150
|
+
const leftPad = padding(Math.floor((width - combinedWidth) / 2));
|
|
151
|
+
for (let i = 0; i < SHADOWED.lines.length; i++) {
|
|
152
|
+
const logoRow = LOGO.lines[i] ?? padding(LOGO.width);
|
|
153
|
+
lines.push(this.#fit(`${leftPad}${logoRow}${padding(LOGO_GAP)}${SHADOWED.lines[i]}`, width));
|
|
154
|
+
}
|
|
155
|
+
} else if (width >= WORDMARK_WIDTH + 2) {
|
|
89
156
|
const leftPad = padding(Math.floor((width - WORDMARK_WIDTH) / 2));
|
|
90
157
|
for (const row of SHADOWED.lines) {
|
|
91
158
|
lines.push(this.#fit(`${leftPad}${row}`, width));
|