testeiya 0.3.9 → 0.3.14
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 +353 -27
- package/dist/prompt/index.js +6 -2
- package/dist/prompt/index.js.map +1 -1
- package/dist/prompt/print.js +8 -0
- package/dist/prompt/print.js.map +1 -1
- package/dist/prompt/system-prompt.js +14 -4
- package/dist/prompt/system-prompt.js.map +1 -1
- package/dist/prompt/testomatio.js +3 -3
- package/dist/prompt/tools.js +28 -7
- package/dist/prompt/tools.js.map +1 -1
- package/dist/src/args.js +198 -46
- package/dist/src/args.js.map +1 -1
- package/dist/src/cli.js +64 -20
- package/dist/src/cli.js.map +1 -1
- package/dist/src/doctor.js +171 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/env.js +39 -5
- package/dist/src/env.js.map +1 -1
- package/dist/src/mcp.js +3 -3
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/model.js +15 -10
- package/dist/src/model.js.map +1 -1
- package/dist/src/models.js +38 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/output.js +216 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/run.js +141 -27
- package/dist/src/run.js.map +1 -1
- package/dist/src/session.js +46 -25
- package/dist/src/session.js.map +1 -1
- package/dist/src/sessions.js +72 -0
- package/dist/src/sessions.js.map +1 -0
- package/dist/src/skills.js +130 -0
- package/dist/src/skills.js.map +1 -0
- package/package.json +7 -3
- package/prompt/index.ts +11 -2
- package/prompt/print.ts +9 -0
- package/prompt/system-prompt.ts +18 -4
- package/prompt/testomatio.ts +3 -3
- package/prompt/tools.ts +30 -7
- package/skills/codeceptjs/ci-fix-tests/SKILL.md +119 -0
- package/skills/codeceptjs/codeceptjs-auth/SKILL.md +141 -0
- package/skills/codeceptjs/codeceptjs-exploration/SKILL.md +100 -0
- package/skills/codeceptjs/codeceptjs-fundamentals/SKILL.md +196 -0
- package/skills/codeceptjs/codeceptjs-run-analysis/SKILL.md +83 -0
- package/skills/codeceptjs/debugging-codeceptjs-tests/SKILL.md +126 -0
- package/skills/codeceptjs/migrate-codeceptjs-4/SKILL.md +109 -0
- package/skills/codeceptjs/migrate-cypress-to-codeceptjs/SKILL.md +295 -0
- package/skills/codeceptjs/migrate-protractor-to-codeceptjs/SKILL.md +339 -0
- package/skills/codeceptjs/migrate-selenium-java-to-codeceptjs/SKILL.md +459 -0
- package/skills/codeceptjs/migrate-testcafe-to-codeceptjs/SKILL.md +338 -0
- package/skills/codeceptjs/refactoring-codeceptjs-tests/SKILL.md +78 -0
- package/skills/codeceptjs/writing-codeceptjs-tests/SKILL.md +102 -0
- package/skills/playwright/playwright-best-practices/SKILL.md +303 -0
- package/skills/playwright/playwright-best-practices/advanced/authentication-flows.md +360 -0
- package/skills/playwright/playwright-best-practices/advanced/authentication.md +871 -0
- package/skills/playwright/playwright-best-practices/advanced/clock-mocking.md +364 -0
- package/skills/playwright/playwright-best-practices/advanced/mobile-testing.md +409 -0
- package/skills/playwright/playwright-best-practices/advanced/multi-context.md +288 -0
- package/skills/playwright/playwright-best-practices/advanced/multi-user.md +393 -0
- package/skills/playwright/playwright-best-practices/advanced/network-advanced.md +452 -0
- package/skills/playwright/playwright-best-practices/advanced/third-party.md +464 -0
- package/skills/playwright/playwright-best-practices/architecture/pom-vs-fixtures.md +363 -0
- package/skills/playwright/playwright-best-practices/architecture/test-architecture.md +369 -0
- package/skills/playwright/playwright-best-practices/architecture/when-to-mock.md +383 -0
- package/skills/playwright/playwright-best-practices/browser-apis/browser-apis.md +391 -0
- package/skills/playwright/playwright-best-practices/browser-apis/iframes.md +403 -0
- package/skills/playwright/playwright-best-practices/browser-apis/service-workers.md +504 -0
- package/skills/playwright/playwright-best-practices/browser-apis/websockets.md +403 -0
- package/skills/playwright/playwright-best-practices/core/annotations.md +424 -0
- package/skills/playwright/playwright-best-practices/core/assertions-waiting.md +361 -0
- package/skills/playwright/playwright-best-practices/core/configuration.md +452 -0
- package/skills/playwright/playwright-best-practices/core/fixtures-hooks.md +417 -0
- package/skills/playwright/playwright-best-practices/core/global-setup.md +434 -0
- package/skills/playwright/playwright-best-practices/core/locators.md +242 -0
- package/skills/playwright/playwright-best-practices/core/page-object-model.md +315 -0
- package/skills/playwright/playwright-best-practices/core/projects-dependencies.md +453 -0
- package/skills/playwright/playwright-best-practices/core/test-data.md +492 -0
- package/skills/playwright/playwright-best-practices/core/test-suite-structure.md +361 -0
- package/skills/playwright/playwright-best-practices/core/test-tags.md +298 -0
- package/skills/playwright/playwright-best-practices/debugging/console-errors.md +420 -0
- package/skills/playwright/playwright-best-practices/debugging/debugging.md +504 -0
- package/skills/playwright/playwright-best-practices/debugging/error-testing.md +360 -0
- package/skills/playwright/playwright-best-practices/debugging/flaky-tests.md +496 -0
- package/skills/playwright/playwright-best-practices/frameworks/angular.md +530 -0
- package/skills/playwright/playwright-best-practices/frameworks/nextjs.md +469 -0
- package/skills/playwright/playwright-best-practices/frameworks/react.md +531 -0
- package/skills/playwright/playwright-best-practices/frameworks/vue.md +574 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +468 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/docker.md +283 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/github-actions.md +546 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/gitlab.md +397 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/other-providers.md +521 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +371 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/performance.md +453 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/reporting.md +424 -0
- package/skills/playwright/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +497 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/accessibility.md +359 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/api-testing.md +719 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/browser-extensions.md +506 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/canvas-webgl.md +493 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/component-testing.md +500 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/drag-drop.md +576 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/electron.md +509 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/file-operations.md +377 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/file-upload-download.md +562 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/forms-validation.md +561 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/graphql-testing.md +331 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/i18n.md +508 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/performance-testing.md +476 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/security-testing.md +430 -0
- package/skills/playwright/playwright-best-practices/testing-patterns/visual-regression.md +634 -0
- package/skills/playwright/playwright-cli/SKILL.md +420 -0
- package/skills/playwright/playwright-cli/references/element-attributes.md +23 -0
- package/skills/playwright/playwright-cli/references/playwright-tests.md +39 -0
- package/skills/playwright/playwright-cli/references/request-mocking.md +87 -0
- package/skills/playwright/playwright-cli/references/running-code.md +241 -0
- package/skills/playwright/playwright-cli/references/session-management.md +225 -0
- package/skills/playwright/playwright-cli/references/storage-state.md +275 -0
- package/skills/playwright/playwright-cli/references/test-generation.md +433 -0
- package/skills/playwright/playwright-cli/references/tracing.md +139 -0
- package/skills/playwright/playwright-cli/references/video-recording.md +143 -0
- package/skills/skills.lock.json +41 -37
- package/skills/skills.yaml +1 -0
- package/skills/testomatio/explorbot/explorbot-fundamentals/SKILL.md +76 -0
- package/skills/testomatio/explorbot/explorbot-fundamentals/references/no-install.md +36 -0
- package/skills/testomatio/explorbot/explorbot-plan/SKILL.md +108 -0
- package/skills/testomatio/explorbot/explorbot-setup/SKILL.md +86 -0
- package/skills/testomatio/explorbot/prima/SKILL.md +87 -0
- package/skills/testomatio/qa-process/qa-explain-behavior/SKILL.md +111 -0
- package/skills/testomatio/qa-process/qa-explain-behavior/references/answer-shapes.md +116 -0
- package/skills/testomatio/qa-process/qa-explain-behavior/references/examples.md +157 -0
- package/skills/testomatio/qa-process/qa-lead-strategy-advisor/SKILL.md +91 -0
- package/skills/testomatio/qa-process/qa-lead-strategy-advisor/references/output-format.md +71 -0
- package/skills/testomatio/qa-process/testing-workflow/SKILL.md +227 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/CLAUDE.md +56 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/SKILL.md +242 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/CODECEPTJS_BEST_PRACTICES.md +182 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/FINAL_SUMMARY_TEMPLATE.md +22 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/PLAYWRIGHT_BEST_PRACTICES.md +90 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/POM_BEST_PRACTICES.md +53 -0
- package/skills/testomatio/test-automation/automate-manual-test-cases/references/TEST_DATA_MANAGEMENT.md +52 -0
- package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/SKILL.md +107 -0
- package/skills/testomatio/test-automation/debug-fix-failed-flaky-autotests/references/DEBUGGING_QUICK_REFERENCE.md +113 -0
- package/skills/testomatio/test-automation/qa-automation-test-consolidation/SKILL.md +29 -0
- package/skills/testomatio/test-automation/qa-data-seeder/SKILL.md +83 -0
- package/skills/testomatio/test-automation/run-tests-with-testomatio-reporter/SKILL.md +153 -0
- package/skills/testomatio/test-automation/setup-change-aware-pr-testing/SKILL.md +190 -0
- package/skills/testomatio/test-automation/setup-ci-automation/SKILL.md +76 -0
- package/skills/testomatio/test-automation/testomat-allure-adapter/SKILL.md +289 -0
- package/skills/testomatio/test-management/detect-duplicate-test-cases/SKILL.md +86 -0
- package/skills/testomatio/test-management/detect-duplicate-test-cases/references/DUPLICATE_INSTRUCTIONS.md +54 -0
- package/skills/testomatio/test-management/improve-test-cases/SKILL.md +114 -0
- package/skills/testomatio/test-management/improve-test-cases/references/TESTOMAT_MARKDOWN_EXAMPLE.md +66 -0
- package/skills/testomatio/test-management/pull-request-diff-analyzer/SKILL.md +141 -0
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/SKILL.md +354 -0
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_ARTIFACTS.md +82 -0
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_HTML_REPORT.md +37 -0
- package/skills/testomatio/test-management/qa-e2e-tests-reporting/references/TESTOMATIO_REPORTERS_CONFIG.md +118 -0
- package/skills/testomatio/test-management/qa-pr-requirements-analyzer/SKILL.md +149 -0
- package/skills/testomatio/test-management/qa-pr-requirements-analyzer/references/summary-example.md +54 -0
- package/skills/testomatio/test-management/qa-requirement-reviewer/SKILL.md +126 -0
- package/skills/testomatio/test-management/qa-requirement-reviewer/references/requirements_reviewer_examples.md +128 -0
- package/skills/testomatio/test-management/qa-split-testing-levels-pyramid/SKILL.md +55 -0
- package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/SKILL.md +220 -0
- package/skills/testomatio/test-management/qa-sprint-report-by-testomatio/references/qa-sprint-report.md +126 -0
- package/skills/testomatio/test-management/qa-test-code-coverage/SKILL.md +174 -0
- package/skills/testomatio/test-management/qa-test-code-coverage/references/COVERAGE_FILE_FORMAT.md +138 -0
- package/skills/testomatio/test-management/qa-test-code-coverage/references/E2E_FRAMEWORKS.md +65 -0
- package/skills/testomatio/test-management/qa-test-code-coverage/scripts/check-coverage.mjs +40 -0
- package/skills/testomatio/test-management/qa-thinking/SKILL.md +36 -0
- package/skills/testomatio/test-management/qa-write-test-cases/SKILL.md +267 -0
- package/skills/testomatio/test-management/qa-write-test-cases/references/test-case-format.md +387 -0
- package/skills/testomatio/test-management/qa-write-test-cases/references/testomat-tms-guide.md +72 -0
- package/skills/testomatio/test-management/qa-write-test-cases/references/writing-rule.md +159 -0
- package/skills/testomatio/test-management/scan-automation-project/SKILL.md +152 -0
- package/skills/testomatio/test-management/sync-test-cases-with-tms/SKILL.md +107 -0
- package/skills/testomatio/test-management/sync-test-cases-with-tms/references/TESTOMATIO_CLI.md +140 -0
- package/skills/testomatio/test-management/testomatio-mcp/SKILL.md +195 -0
- package/skills/testomatio/test-management/testomatio-mcp/references/MCP_SETUP.md +177 -0
package/dist/src/args.js
CHANGED
|
@@ -1,72 +1,224 @@
|
|
|
1
1
|
import { parseArgs } from "node:util";
|
|
2
|
-
export const
|
|
2
|
+
export const WELCOME = `
|
|
3
|
+
Testeiya, an AI testing agent.
|
|
4
|
+
|
|
5
|
+
testeiya task "analyze this pr and find inconsistencies"
|
|
6
|
+
testeiya ask "is this feature ready"
|
|
7
|
+
|
|
8
|
+
testeiya doctor check your setup
|
|
9
|
+
testeiya --help options and environment
|
|
10
|
+
testeiya help the full guide
|
|
11
|
+
`;
|
|
12
|
+
export const USAGE = `testeiya, an AI testing agent
|
|
3
13
|
|
|
4
14
|
Usage:
|
|
5
|
-
testeiya "<task>"
|
|
6
|
-
|
|
15
|
+
testeiya task "<task>" run one task and write a report
|
|
16
|
+
testeiya ask "<question>" answer a question
|
|
17
|
+
testeiya doctor check what a run would resolve
|
|
18
|
+
testeiya models [pattern] list the models your key can reach
|
|
19
|
+
testeiya skills [pattern] list the skills bundled with this package
|
|
20
|
+
testeiya sessions list saved sessions for this folder
|
|
7
21
|
|
|
8
22
|
Options:
|
|
9
|
-
-o, --output <
|
|
10
|
-
|
|
11
|
-
--
|
|
12
|
-
|
|
13
|
-
|
|
23
|
+
-o, --output <dest> report destination, repeatable: file.md, file.json, gh:pr-comment
|
|
24
|
+
--model <id> provider/model to run
|
|
25
|
+
--project <id> Testomat.io project id
|
|
26
|
+
-c, --continue continue the last session in this folder
|
|
27
|
+
--resume <id> continue that session
|
|
28
|
+
--session <label> continue the session with that name, or start it
|
|
29
|
+
--name <label> name the session
|
|
30
|
+
--no-session do not save the session
|
|
31
|
+
--exit-zero a negative verdict exits 0
|
|
32
|
+
--header <text> line added above the report
|
|
33
|
+
--footer <text> line added under the report
|
|
34
|
+
--no-default-footer do not sign the report
|
|
35
|
+
--json machine-readable output
|
|
36
|
+
--probe doctor only: test the key with one request
|
|
37
|
+
-h, --help show this
|
|
14
38
|
-v, --version show version
|
|
15
39
|
|
|
16
|
-
|
|
17
|
-
|
|
40
|
+
Environment:
|
|
41
|
+
TESTEIYA_MODEL model to run, e.g. openrouter/anthropic/claude-sonnet-5
|
|
42
|
+
TESTEIYA_NO_DEFAULT_FOOTER do not sign the report
|
|
43
|
+
OPENROUTER_API_KEY provider key, also ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY
|
|
44
|
+
TESTOMATIO Testomat.io project API key
|
|
45
|
+
TESTOMATIO_PROJECT_ID Testomat.io project id, same as --project
|
|
46
|
+
TESTOMATIO_URL Testomat.io base url, for self-hosted
|
|
47
|
+
|
|
48
|
+
Run "testeiya help" for the full guide.`;
|
|
49
|
+
export const HELP = `${USAGE}
|
|
50
|
+
|
|
51
|
+
Running a task
|
|
52
|
+
|
|
53
|
+
The agent runs one task and exits. There is no interactive mode. Progress and
|
|
54
|
+
errors go to stderr, so a run drops into CI as-is.
|
|
55
|
+
|
|
56
|
+
A task can also come from stdin: cat task.md | testeiya task
|
|
57
|
+
A task starting with "-" must follow "--": testeiya task -- "-weird task"
|
|
58
|
+
|
|
59
|
+
Exit codes: 0 pass, 1 failed run or negative verdict, 2 bad usage, 130 interrupted.
|
|
60
|
+
|
|
61
|
+
--exit-zero keeps a negative verdict from failing the command: a broken run
|
|
62
|
+
still exits 1 and bad usage still exits 2. The verdict is still in the report
|
|
63
|
+
and in the run envelope, so a pipeline can gate on it when it wants to.
|
|
64
|
+
|
|
65
|
+
Where the report goes
|
|
66
|
+
|
|
67
|
+
--output names a destination and can repeat. Without one the report goes to
|
|
68
|
+
stdout. --json prints the run envelope to stdout instead.
|
|
69
|
+
|
|
70
|
+
report.md the agent writes the report there
|
|
71
|
+
run.json the run envelope: verdict, reason, report, tokens, session id
|
|
72
|
+
gh:pr-comment posted on this branch's pull request, through the GitHub CLI
|
|
73
|
+
gh:pr#123 posted on that pull request
|
|
74
|
+
|
|
75
|
+
--footer adds a line under the report and --header adds one above. Both go
|
|
76
|
+
wherever the report goes: stdout, the file, the posted comment. Use --footer
|
|
77
|
+
to say how to answer a comment, e.g. --footer "> Reply with /testeiya".
|
|
78
|
+
|
|
79
|
+
The report is signed, unless you write your own footer:
|
|
18
80
|
|
|
19
|
-
|
|
20
|
-
The provider API key comes from the environment, ~/.testeiya/.env, or
|
|
21
|
-
~/.testeiya/auth.json.
|
|
81
|
+
*🧚🏻♀️ Provided by [Testeiya QA Agent](https://testomat.ai/testeiya) & <model>*
|
|
22
82
|
|
|
23
|
-
|
|
24
|
-
the project id (--project or TESTOMATIO_PROJECT_ID) and the agent also gets the
|
|
25
|
-
Testomat.io tools; with the token alone it uses check-tests and the REST API.
|
|
83
|
+
--no-default-footer drops the signature, so does TESTEIYA_NO_DEFAULT_FOOTER.
|
|
26
84
|
|
|
27
|
-
|
|
85
|
+
Every destination is checked before the run starts, so a missing gh costs no
|
|
86
|
+
tokens.
|
|
28
87
|
|
|
29
|
-
|
|
88
|
+
Models and keys
|
|
89
|
+
|
|
90
|
+
There is no default model. Pass --model or set TESTEIYA_MODEL. A resumed run
|
|
91
|
+
reuses its session's model. "testeiya models" lists what your key can reach.
|
|
92
|
+
|
|
93
|
+
The provider key comes from the environment, from ~/.testeiya/.env, or from
|
|
94
|
+
~/.testeiya/auth.json, which is the file the desktop app's Settings dialog
|
|
95
|
+
writes.
|
|
96
|
+
|
|
97
|
+
Sessions
|
|
98
|
+
|
|
99
|
+
Runs are saved under ~/.testeiya, so a follow-up picks up where the last one
|
|
100
|
+
stopped. -c continues the last session in this folder, --resume <id> picks
|
|
101
|
+
another, --name labels one, and --no-session saves nothing.
|
|
102
|
+
|
|
103
|
+
--session <label> is the one for a job that runs again and again: it continues
|
|
104
|
+
the session with that name, and starts it the first time. Give each thread its
|
|
105
|
+
own label and they never mix.
|
|
106
|
+
|
|
107
|
+
Skills
|
|
108
|
+
|
|
109
|
+
The package ships the skills the agent reads, and only those: skills found in
|
|
110
|
+
the folder it runs in are ignored, so a checkout cannot hand it its own.
|
|
111
|
+
"testeiya skills" lists them. Name one in the task with a slash and it is
|
|
112
|
+
loaded before the run, e.g. "/qa-thinking". A name we do not ship is left
|
|
113
|
+
alone, so a stray "/word" in the task is just a word.
|
|
114
|
+
|
|
115
|
+
Testomat.io
|
|
116
|
+
|
|
117
|
+
Set TESTOMATIO to a project API key and the agent reads and writes that
|
|
118
|
+
project's tests, suites, runs and plans through check-tests and the REST API.
|
|
119
|
+
Add the project id, with --project or TESTOMATIO_PROJECT_ID, and it also gets
|
|
120
|
+
the Testomat.io tools. The MCP server needs the id: a token alone does not say
|
|
121
|
+
which project to talk to.`;
|
|
122
|
+
export const COMMANDS = ["task", "ask", "models", "skills", "doctor", "sessions", "help"];
|
|
30
123
|
export function parseCliArgs(argv) {
|
|
124
|
+
const first = argv[0];
|
|
125
|
+
if (!first)
|
|
126
|
+
return { command: "welcome" };
|
|
127
|
+
if (first === "-h" || first === "--help")
|
|
128
|
+
return { command: "usage" };
|
|
129
|
+
if (first === "-v" || first === "--version")
|
|
130
|
+
return { command: "version" };
|
|
131
|
+
if (!isCommand(first))
|
|
132
|
+
return { error: unknownCommand(first) };
|
|
133
|
+
if (first === "help")
|
|
134
|
+
return { command: "help" };
|
|
135
|
+
const options = OPTIONS[first];
|
|
31
136
|
let parsed;
|
|
32
137
|
try {
|
|
33
|
-
parsed = parseArgs({
|
|
34
|
-
args: argv,
|
|
35
|
-
options: {
|
|
36
|
-
output: { type: "string", short: "o" },
|
|
37
|
-
print: { type: "string", short: "p" },
|
|
38
|
-
model: { type: "string" },
|
|
39
|
-
project: { type: "string" },
|
|
40
|
-
help: { type: "boolean", short: "h" },
|
|
41
|
-
version: { type: "boolean", short: "v" },
|
|
42
|
-
},
|
|
43
|
-
allowPositionals: true,
|
|
44
|
-
strict: true,
|
|
45
|
-
});
|
|
138
|
+
parsed = parseArgs({ args: argv.slice(1), options, allowPositionals: true, strict: true });
|
|
46
139
|
}
|
|
47
140
|
catch (err) {
|
|
48
141
|
if (err instanceof Error)
|
|
49
142
|
return { error: err.message };
|
|
50
143
|
return { error: String(err) };
|
|
51
144
|
}
|
|
52
|
-
const
|
|
145
|
+
const values = parsed.values;
|
|
53
146
|
if (values.help)
|
|
54
|
-
return {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
147
|
+
return { command: "usage" };
|
|
148
|
+
const args = { command: first };
|
|
149
|
+
const text = parsed.positionals.join(" ").trim();
|
|
150
|
+
if ((first === "task" || first === "ask") && text)
|
|
151
|
+
args.prompt = text;
|
|
152
|
+
if ((first === "models" || first === "skills") && text)
|
|
153
|
+
args.pattern = text;
|
|
154
|
+
if (Array.isArray(values.output))
|
|
155
|
+
args.outputs = values.output;
|
|
156
|
+
if (values.json)
|
|
157
|
+
args.json = true;
|
|
158
|
+
if (values.probe)
|
|
159
|
+
args.probe = true;
|
|
160
|
+
if (typeof values.model === "string")
|
|
67
161
|
args.model = values.model;
|
|
68
|
-
if (values.project)
|
|
162
|
+
if (typeof values.project === "string")
|
|
69
163
|
args.project = values.project;
|
|
164
|
+
if (values.continue)
|
|
165
|
+
args.continueLast = true;
|
|
166
|
+
if (typeof values.resume === "string")
|
|
167
|
+
args.resume = values.resume;
|
|
168
|
+
if (typeof values.session === "string")
|
|
169
|
+
args.session = values.session;
|
|
170
|
+
if (typeof values.name === "string")
|
|
171
|
+
args.name = values.name;
|
|
172
|
+
if (values["no-session"])
|
|
173
|
+
args.noSession = true;
|
|
174
|
+
if (values["exit-zero"])
|
|
175
|
+
args.exitZero = true;
|
|
176
|
+
if (typeof values.header === "string")
|
|
177
|
+
args.header = values.header;
|
|
178
|
+
if (typeof values.footer === "string")
|
|
179
|
+
args.footer = values.footer;
|
|
180
|
+
if (values["no-default-footer"])
|
|
181
|
+
args.noDefaultFooter = true;
|
|
182
|
+
if (args.session && (args.continueLast || args.resume || args.name || args.noSession)) {
|
|
183
|
+
return { error: "--session already names and continues a session" };
|
|
184
|
+
}
|
|
70
185
|
return args;
|
|
71
186
|
}
|
|
187
|
+
const HELP_FLAG = { type: "boolean", short: "h" };
|
|
188
|
+
const JSON_FLAG = { type: "boolean" };
|
|
189
|
+
const RUN_OPTIONS = {
|
|
190
|
+
output: { type: "string", short: "o", multiple: true },
|
|
191
|
+
json: JSON_FLAG,
|
|
192
|
+
model: { type: "string" },
|
|
193
|
+
project: { type: "string" },
|
|
194
|
+
continue: { type: "boolean", short: "c" },
|
|
195
|
+
resume: { type: "string" },
|
|
196
|
+
session: { type: "string" },
|
|
197
|
+
name: { type: "string" },
|
|
198
|
+
"no-session": { type: "boolean" },
|
|
199
|
+
"exit-zero": { type: "boolean" },
|
|
200
|
+
header: { type: "string" },
|
|
201
|
+
footer: { type: "string" },
|
|
202
|
+
"no-default-footer": { type: "boolean" },
|
|
203
|
+
help: HELP_FLAG,
|
|
204
|
+
};
|
|
205
|
+
const OPTIONS = {
|
|
206
|
+
task: RUN_OPTIONS,
|
|
207
|
+
ask: RUN_OPTIONS,
|
|
208
|
+
models: { json: JSON_FLAG, help: HELP_FLAG },
|
|
209
|
+
skills: { json: JSON_FLAG, help: HELP_FLAG },
|
|
210
|
+
doctor: { json: JSON_FLAG, probe: { type: "boolean" }, model: { type: "string" }, help: HELP_FLAG },
|
|
211
|
+
sessions: { json: JSON_FLAG, help: HELP_FLAG },
|
|
212
|
+
help: {},
|
|
213
|
+
};
|
|
214
|
+
function isCommand(value) {
|
|
215
|
+
return COMMANDS.includes(value);
|
|
216
|
+
}
|
|
217
|
+
// The task used to be the first positional, so a bare prompt is the mistake to
|
|
218
|
+
// expect. Name the fix rather than printing the whole usage at them.
|
|
219
|
+
function unknownCommand(value) {
|
|
220
|
+
if (value.startsWith("-"))
|
|
221
|
+
return `unknown option "${value}"`;
|
|
222
|
+
return `unknown command "${value}" — did you mean: testeiya task "${value}"`;
|
|
223
|
+
}
|
|
72
224
|
//# sourceMappingURL=args.js.map
|
package/dist/src/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { loadEnvFiles } from "./env.js";
|
|
2
|
+
import { HELP, parseCliArgs, USAGE, WELCOME } from "./args.js";
|
|
3
|
+
import { runDoctor } from "./doctor.js";
|
|
4
|
+
import { loadEnvFiles, VERSION } from "./env.js";
|
|
6
5
|
import { UsageError } from "./model.js";
|
|
6
|
+
import { runModels } from "./models.js";
|
|
7
|
+
import { runSkills } from "./skills.js";
|
|
8
|
+
import { parseDestinations, preflight } from "./output.js";
|
|
7
9
|
import { runPrint } from "./run.js";
|
|
10
|
+
import { openSessionManager, runSessions } from "./sessions.js";
|
|
8
11
|
main(process.argv.slice(2)).catch((err) => {
|
|
9
12
|
process.stderr.write(`${err?.message ?? err}\n`);
|
|
10
13
|
process.exit(1);
|
|
@@ -16,28 +19,38 @@ async function main(argv) {
|
|
|
16
19
|
process.stderr.write(`${args.error}\n\n${USAGE}\n`);
|
|
17
20
|
process.exit(2);
|
|
18
21
|
}
|
|
19
|
-
if (args.
|
|
22
|
+
if (args.command === "welcome") {
|
|
23
|
+
process.stdout.write(`${WELCOME}\n`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (args.command === "usage") {
|
|
20
27
|
process.stdout.write(`${USAGE}\n`);
|
|
21
28
|
return;
|
|
22
29
|
}
|
|
23
|
-
if (args.
|
|
24
|
-
process.stdout.write(`${
|
|
30
|
+
if (args.command === "help") {
|
|
31
|
+
process.stdout.write(`${HELP}\n`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (args.command === "version") {
|
|
35
|
+
process.stdout.write(`${VERSION}\n`);
|
|
25
36
|
return;
|
|
26
37
|
}
|
|
27
|
-
loadEnvFiles();
|
|
38
|
+
const envSources = loadEnvFiles();
|
|
28
39
|
// --project is a spelling of the env var the MCP server needs, so the rest of
|
|
29
40
|
// the CLI only ever reads the environment.
|
|
30
41
|
if (args.project)
|
|
31
42
|
process.env.TESTOMATIO_PROJECT_ID = args.project;
|
|
32
|
-
// No task and nothing piped in: there is no interactive mode, so this is a
|
|
33
|
-
// usage error rather than a prompt.
|
|
34
|
-
const prompt = args.prompt ?? (await readStdin());
|
|
35
|
-
if (!prompt.trim()) {
|
|
36
|
-
process.stderr.write(`${USAGE}\n`);
|
|
37
|
-
process.exit(2);
|
|
38
|
-
}
|
|
39
43
|
try {
|
|
40
|
-
|
|
44
|
+
if (args.command === "models")
|
|
45
|
+
process.exit(await runModels(args.pattern, args.json));
|
|
46
|
+
if (args.command === "skills")
|
|
47
|
+
process.exit(await runSkills(args.pattern, args.json));
|
|
48
|
+
if (args.command === "doctor") {
|
|
49
|
+
process.exit(await runDoctor({ envSources, json: args.json, probe: args.probe, model: args.model }));
|
|
50
|
+
}
|
|
51
|
+
if (args.command === "sessions")
|
|
52
|
+
process.exit(await runSessions(process.cwd(), args.json));
|
|
53
|
+
process.exit(await task(args));
|
|
41
54
|
}
|
|
42
55
|
catch (err) {
|
|
43
56
|
if (!(err instanceof UsageError))
|
|
@@ -46,6 +59,41 @@ async function main(argv) {
|
|
|
46
59
|
process.exit(2);
|
|
47
60
|
}
|
|
48
61
|
}
|
|
62
|
+
async function task(args) {
|
|
63
|
+
const prompt = args.prompt ?? (await readStdin());
|
|
64
|
+
if (!prompt.trim()) {
|
|
65
|
+
process.stderr.write(` ${args.command} needs something to work on\n\n${USAGE}\n`);
|
|
66
|
+
process.exit(2);
|
|
67
|
+
}
|
|
68
|
+
const destinations = parseDestinations(args.outputs ?? [], args.json);
|
|
69
|
+
if (typeof destinations === "string")
|
|
70
|
+
throw new UsageError(destinations);
|
|
71
|
+
// Everything a destination needs is checked before a single token is spent.
|
|
72
|
+
const unreachable = await preflight(destinations);
|
|
73
|
+
if (unreachable)
|
|
74
|
+
throw new UsageError(unreachable);
|
|
75
|
+
const sessionManager = await openSessionManager(process.cwd(), args);
|
|
76
|
+
if (typeof sessionManager === "string")
|
|
77
|
+
throw new UsageError(sessionManager);
|
|
78
|
+
if (args.name)
|
|
79
|
+
sessionManager.appendSessionInfo(args.name);
|
|
80
|
+
let sessionId = null;
|
|
81
|
+
if (!args.noSession)
|
|
82
|
+
sessionId = sessionManager.getSessionId();
|
|
83
|
+
const brief = args.command === "ask";
|
|
84
|
+
return runPrint({
|
|
85
|
+
prompt,
|
|
86
|
+
destinations,
|
|
87
|
+
sessionManager,
|
|
88
|
+
sessionId,
|
|
89
|
+
brief,
|
|
90
|
+
model: args.model,
|
|
91
|
+
exitZero: args.exitZero,
|
|
92
|
+
header: args.header,
|
|
93
|
+
footer: args.footer,
|
|
94
|
+
noDefaultFooter: args.noDefaultFooter,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
49
97
|
async function readStdin() {
|
|
50
98
|
if (process.stdin.isTTY)
|
|
51
99
|
return "";
|
|
@@ -54,8 +102,4 @@ async function readStdin() {
|
|
|
54
102
|
chunks.push(chunk);
|
|
55
103
|
return Buffer.concat(chunks).toString("utf8");
|
|
56
104
|
}
|
|
57
|
-
function version() {
|
|
58
|
-
const pkg = JSON.parse(readFileSync(join(import.meta.dirname, "..", "..", "package.json"), "utf8"));
|
|
59
|
-
return pkg.version;
|
|
60
|
-
}
|
|
61
105
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { relative } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { TESTEIYA_HOME } from "./env.js";
|
|
5
|
+
import { hasMcp, hasTestomatio, metadataCachePath, vendorBundle } from "./mcp.js";
|
|
6
|
+
import { PROVIDER_KEYS, resolveModel, UsageError } from "./model.js";
|
|
7
|
+
import { loadBundledSkills } from "./skills.js";
|
|
8
|
+
import { BUNDLED_SKILLS_DIR, createRuntime } from "./session.js";
|
|
9
|
+
const MIN_NODE = [22, 19];
|
|
10
|
+
/**
|
|
11
|
+
* Everything a run resolves silently: which key file won, whether skills loaded,
|
|
12
|
+
* whether MCP is on. Reads config only — `--probe` is the one check that spends.
|
|
13
|
+
*/
|
|
14
|
+
export async function runDoctor(options) {
|
|
15
|
+
const checks = [nodeCheck(), homeCheck()];
|
|
16
|
+
const runtime = await createRuntime();
|
|
17
|
+
checks.push(keyCheck(runtime, options.envSources));
|
|
18
|
+
const model = modelCheck(runtime, options.model);
|
|
19
|
+
checks.push(model.check);
|
|
20
|
+
const skills = await skillsChecks();
|
|
21
|
+
checks.push(...skills.checks);
|
|
22
|
+
checks.push(testomatioCheck(), mcpCacheCheck());
|
|
23
|
+
if (options.probe)
|
|
24
|
+
checks.push(await probeCheck(runtime, model.resolved));
|
|
25
|
+
if (options.json) {
|
|
26
|
+
const report = {
|
|
27
|
+
checks: checks.filter((check) => check.status !== "list"),
|
|
28
|
+
skills: skills.groups,
|
|
29
|
+
};
|
|
30
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
31
|
+
return worst(checks) === "fail" ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
process.stdout.write("\n");
|
|
34
|
+
for (const check of checks) {
|
|
35
|
+
process.stdout.write(` ${MARK[check.status]} ${check.name.padEnd(12)} ${check.detail}\n`);
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write("\n");
|
|
38
|
+
return worst(checks) === "fail" ? 1 : 0;
|
|
39
|
+
}
|
|
40
|
+
function nodeCheck() {
|
|
41
|
+
const version = process.versions.node;
|
|
42
|
+
const [major = 0, minor = 0] = version.split(".").map(Number);
|
|
43
|
+
if (major > MIN_NODE[0] || (major === MIN_NODE[0] && minor >= MIN_NODE[1])) {
|
|
44
|
+
return { name: "node", status: "ok", detail: `v${version}` };
|
|
45
|
+
}
|
|
46
|
+
return { name: "node", status: "fail", detail: `v${version}, needs v22.19 or newer` };
|
|
47
|
+
}
|
|
48
|
+
function homeCheck() {
|
|
49
|
+
if (!existsSync(TESTEIYA_HOME)) {
|
|
50
|
+
return { name: "home", status: "warn", detail: `${TESTEIYA_HOME} (not created yet)` };
|
|
51
|
+
}
|
|
52
|
+
return { name: "home", status: "ok", detail: TESTEIYA_HOME };
|
|
53
|
+
}
|
|
54
|
+
// The key can come from four places and nothing else ever says which one won.
|
|
55
|
+
function keyCheck(runtime, sources) {
|
|
56
|
+
const found = [];
|
|
57
|
+
for (const { provider, env } of PROVIDER_KEYS) {
|
|
58
|
+
if (process.env[env]) {
|
|
59
|
+
found.push(`${provider} from ${sources.get(env) ?? "environment"}`);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (runtime.hasConfiguredAuth(provider))
|
|
63
|
+
found.push(`${provider} from auth.json`);
|
|
64
|
+
}
|
|
65
|
+
if (found.length === 0) {
|
|
66
|
+
return { name: "key", status: "fail", detail: "none — set OPENROUTER_API_KEY or similar" };
|
|
67
|
+
}
|
|
68
|
+
return { name: "key", status: "ok", detail: found.join(", ") };
|
|
69
|
+
}
|
|
70
|
+
function modelCheck(runtime, explicit) {
|
|
71
|
+
try {
|
|
72
|
+
const model = resolveModel(runtime, explicit);
|
|
73
|
+
return {
|
|
74
|
+
check: { name: "model", status: "ok", detail: `${model.provider}/${model.id}` },
|
|
75
|
+
resolved: model,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
const detail = err instanceof UsageError ? err.message : String(err);
|
|
80
|
+
return { check: { name: "model", status: "warn", detail } };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function skillsChecks() {
|
|
84
|
+
const { count, groups, diagnostics } = await loadBundledSkills();
|
|
85
|
+
const checks = [];
|
|
86
|
+
if (count === 0) {
|
|
87
|
+
checks.push({ name: "skills", status: "warn", detail: "none loaded" });
|
|
88
|
+
}
|
|
89
|
+
if (count > 0) {
|
|
90
|
+
checks.push({ name: "skills", status: "ok", detail: `${count} loaded` });
|
|
91
|
+
for (const { group, skills } of groups) {
|
|
92
|
+
const names = skills.map((skill) => skill.name);
|
|
93
|
+
checks.push({ name: "", status: "list", detail: `${group.padEnd(28)} ${summarize(names)}` });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Collisions and parse errors were dropped on the floor before this command.
|
|
97
|
+
for (const diagnostic of diagnostics) {
|
|
98
|
+
const status = diagnostic.type === "error" ? "fail" : "warn";
|
|
99
|
+
let detail = diagnostic.message;
|
|
100
|
+
if (diagnostic.path)
|
|
101
|
+
detail = `${detail} — ${shorten(diagnostic.path)}`;
|
|
102
|
+
checks.push({ name: "skills", status, detail });
|
|
103
|
+
}
|
|
104
|
+
const listed = groups.map(({ group, skills }) => ({
|
|
105
|
+
group,
|
|
106
|
+
skills: skills.map((skill) => skill.name),
|
|
107
|
+
}));
|
|
108
|
+
return { checks, groups: listed };
|
|
109
|
+
}
|
|
110
|
+
function shorten(path) {
|
|
111
|
+
const inBundle = relative(BUNDLED_SKILLS_DIR, path);
|
|
112
|
+
if (inBundle.startsWith(".."))
|
|
113
|
+
return path;
|
|
114
|
+
return inBundle;
|
|
115
|
+
}
|
|
116
|
+
// The full list is `testeiya skills`; this line only proves the right set loaded.
|
|
117
|
+
function summarize(names) {
|
|
118
|
+
if (names.length <= 6)
|
|
119
|
+
return names.join(", ");
|
|
120
|
+
return `${names.slice(0, 6).join(", ")}, +${names.length - 6}`;
|
|
121
|
+
}
|
|
122
|
+
function testomatioCheck() {
|
|
123
|
+
if (!hasTestomatio()) {
|
|
124
|
+
return { name: "testomatio", status: "warn", detail: "no TESTOMATIO token, not connected" };
|
|
125
|
+
}
|
|
126
|
+
if (!hasMcp()) {
|
|
127
|
+
return {
|
|
128
|
+
name: "testomatio",
|
|
129
|
+
status: "warn",
|
|
130
|
+
detail: "token set, no project id — check-tests and REST only",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return { name: "testomatio", status: "ok", detail: "token and project id, MCP tools on" };
|
|
134
|
+
}
|
|
135
|
+
function mcpCacheCheck() {
|
|
136
|
+
if (!hasMcp())
|
|
137
|
+
return { name: "mcp", status: "ok", detail: "off" };
|
|
138
|
+
const bundle = fileURLToPath(vendorBundle());
|
|
139
|
+
if (!existsSync(bundle)) {
|
|
140
|
+
return { name: "mcp", status: "fail", detail: "vendor bundle missing — run npm run build" };
|
|
141
|
+
}
|
|
142
|
+
if (!existsSync(metadataCachePath())) {
|
|
143
|
+
return { name: "mcp", status: "warn", detail: "tool cache empty, first run is proxy-only" };
|
|
144
|
+
}
|
|
145
|
+
return { name: "mcp", status: "ok", detail: "direct tools and proxy" };
|
|
146
|
+
}
|
|
147
|
+
async function probeCheck(runtime, model) {
|
|
148
|
+
if (!model)
|
|
149
|
+
return { name: "probe", status: "warn", detail: "skipped, no model to probe" };
|
|
150
|
+
const message = await runtime
|
|
151
|
+
.completeSimple(model, { messages: [{ role: "user", content: "ping", timestamp: Date.now() }] })
|
|
152
|
+
.catch((err) => ({ stopReason: "error", errorMessage: String(err) }));
|
|
153
|
+
if (message.stopReason === "error") {
|
|
154
|
+
return { name: "probe", status: "fail", detail: message.errorMessage ?? "request failed" };
|
|
155
|
+
}
|
|
156
|
+
return { name: "probe", status: "ok", detail: "the key works" };
|
|
157
|
+
}
|
|
158
|
+
function worst(checks) {
|
|
159
|
+
if (checks.some((check) => check.status === "fail"))
|
|
160
|
+
return "fail";
|
|
161
|
+
if (checks.some((check) => check.status === "warn"))
|
|
162
|
+
return "warn";
|
|
163
|
+
return "ok";
|
|
164
|
+
}
|
|
165
|
+
const MARK = {
|
|
166
|
+
ok: "✓",
|
|
167
|
+
warn: "!",
|
|
168
|
+
fail: "✗",
|
|
169
|
+
list: " ",
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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"}
|