@cliwatch/cli-bench 0.4.0
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/LICENSE +21 -0
- package/README.md +145 -0
- package/dist/assertions.d.ts +14 -0
- package/dist/assertions.d.ts.map +1 -0
- package/dist/assertions.js +161 -0
- package/dist/assertions.js.map +1 -0
- package/dist/ci.d.ts +29 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +75 -0
- package/dist/ci.js.map +1 -0
- package/dist/client/client/client.gen.d.ts +3 -0
- package/dist/client/client/client.gen.d.ts.map +1 -0
- package/dist/client/client/client.gen.js +235 -0
- package/dist/client/client/client.gen.js.map +1 -0
- package/dist/client/client/index.d.ts +9 -0
- package/dist/client/client/index.d.ts.map +1 -0
- package/dist/client/client/index.js +7 -0
- package/dist/client/client/index.js.map +1 -0
- package/dist/client/client/types.gen.d.ts +118 -0
- package/dist/client/client/types.gen.d.ts.map +1 -0
- package/dist/client/client/types.gen.js +3 -0
- package/dist/client/client/types.gen.js.map +1 -0
- package/dist/client/client/utils.gen.d.ts +34 -0
- package/dist/client/client/utils.gen.d.ts.map +1 -0
- package/dist/client/client/utils.gen.js +229 -0
- package/dist/client/client/utils.gen.js.map +1 -0
- package/dist/client/client.gen.d.ts +13 -0
- package/dist/client/client.gen.d.ts.map +1 -0
- package/dist/client/client.gen.js +4 -0
- package/dist/client/client.gen.js.map +1 -0
- package/dist/client/core/auth.gen.d.ts +19 -0
- package/dist/client/core/auth.gen.d.ts.map +1 -0
- package/dist/client/core/auth.gen.js +15 -0
- package/dist/client/core/auth.gen.js.map +1 -0
- package/dist/client/core/bodySerializer.gen.d.ts +26 -0
- package/dist/client/core/bodySerializer.gen.d.ts.map +1 -0
- package/dist/client/core/bodySerializer.gen.js +58 -0
- package/dist/client/core/bodySerializer.gen.js.map +1 -0
- package/dist/client/core/params.gen.d.ts +44 -0
- package/dist/client/core/params.gen.d.ts.map +1 -0
- package/dist/client/core/params.gen.js +101 -0
- package/dist/client/core/params.gen.js.map +1 -0
- package/dist/client/core/pathSerializer.gen.d.ts +34 -0
- package/dist/client/core/pathSerializer.gen.d.ts.map +1 -0
- package/dist/client/core/pathSerializer.gen.js +107 -0
- package/dist/client/core/pathSerializer.gen.js.map +1 -0
- package/dist/client/core/queryKeySerializer.gen.d.ts +19 -0
- package/dist/client/core/queryKeySerializer.gen.d.ts.map +1 -0
- package/dist/client/core/queryKeySerializer.gen.js +93 -0
- package/dist/client/core/queryKeySerializer.gen.js.map +1 -0
- package/dist/client/core/serverSentEvents.gen.d.ts +72 -0
- package/dist/client/core/serverSentEvents.gen.d.ts.map +1 -0
- package/dist/client/core/serverSentEvents.gen.js +134 -0
- package/dist/client/core/serverSentEvents.gen.js.map +1 -0
- package/dist/client/core/types.gen.d.ts +79 -0
- package/dist/client/core/types.gen.d.ts.map +1 -0
- package/dist/client/core/types.gen.js +3 -0
- package/dist/client/core/types.gen.js.map +1 -0
- package/dist/client/core/utils.gen.d.ts +20 -0
- package/dist/client/core/utils.gen.d.ts.map +1 -0
- package/dist/client/core/utils.gen.js +88 -0
- package/dist/client/core/utils.gen.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/sdk.gen.d.ts +45 -0
- package/dist/client/sdk.gen.d.ts.map +1 -0
- package/dist/client/sdk.gen.js +47 -0
- package/dist/client/sdk.gen.js.map +1 -0
- package/dist/client/types.gen.d.ts +694 -0
- package/dist/client/types.gen.d.ts.map +1 -0
- package/dist/client/types.gen.js +3 -0
- package/dist/client/types.gen.js.map +1 -0
- package/dist/client/zod.gen.d.ts +492 -0
- package/dist/client/zod.gen.d.ts.map +1 -0
- package/dist/client/zod.gen.js +413 -0
- package/dist/client/zod.gen.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +94 -0
- package/dist/config.js.map +1 -0
- package/dist/exec.d.ts +18 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +30 -0
- package/dist/exec.js.map +1 -0
- package/dist/help-loader.d.ts +13 -0
- package/dist/help-loader.d.ts.map +1 -0
- package/dist/help-loader.js +135 -0
- package/dist/help-loader.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +5 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +62 -0
- package/dist/init.js.map +1 -0
- package/dist/models.d.ts +158 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +8 -0
- package/dist/models.js.map +1 -0
- package/dist/project.d.ts +26 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +101 -0
- package/dist/project.js.map +1 -0
- package/dist/prompt.d.ts +12 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +88 -0
- package/dist/prompt.js.map +1 -0
- package/dist/providers.d.ts +26 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +55 -0
- package/dist/providers.js.map +1 -0
- package/dist/runner.d.ts +34 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +434 -0
- package/dist/runner.js.map +1 -0
- package/dist/schemas.d.ts +256 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +59 -0
- package/dist/schemas.js.map +1 -0
- package/dist/suite-generator.d.ts +8 -0
- package/dist/suite-generator.d.ts.map +1 -0
- package/dist/suite-generator.js +100 -0
- package/dist/suite-generator.js.map +1 -0
- package/dist/thresholds.d.ts +10 -0
- package/dist/thresholds.d.ts.map +1 -0
- package/dist/thresholds.js +57 -0
- package/dist/thresholds.js.map +1 -0
- package/package.json +41 -0
- package/task_suites/curl.yaml +138 -0
- package/task_suites/docker.yaml +163 -0
- package/task_suites/gh.yaml +118 -0
- package/task_suites/jq.yaml +172 -0
- package/task_suites/kubectl.yaml +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CLIWatch
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# @cliwatch/cli-bench
|
|
2
|
+
|
|
3
|
+
LLM CLI agent testing framework — benchmark how well AI models use your CLI tool. Runs tasks directly on the host (no Docker required), has models execute commands via tool-calling, and validates results with assertions.
|
|
4
|
+
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. Scaffold a config file
|
|
9
|
+
npx @cliwatch/cli-bench init
|
|
10
|
+
|
|
11
|
+
# 2. Edit cli-bench.yaml (define your CLI, providers, tasks)
|
|
12
|
+
|
|
13
|
+
# 3. Run (locally or in CI)
|
|
14
|
+
npx @cliwatch/cli-bench
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Config file (`cli-bench.yaml`)
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
cli: docker
|
|
21
|
+
version_command: "docker --version"
|
|
22
|
+
|
|
23
|
+
providers:
|
|
24
|
+
- anthropic/claude-sonnet-4-20250514
|
|
25
|
+
- openai/gpt-4o
|
|
26
|
+
|
|
27
|
+
tasks:
|
|
28
|
+
- id: pull-image
|
|
29
|
+
intent: "Pull the latest nginx image"
|
|
30
|
+
assert:
|
|
31
|
+
- ran: "docker pull.*nginx"
|
|
32
|
+
- verify:
|
|
33
|
+
run: "docker images nginx --format '{{.Repository}}'"
|
|
34
|
+
output_contains: "nginx"
|
|
35
|
+
|
|
36
|
+
- id: create-project
|
|
37
|
+
intent: "Create a new project called my-app"
|
|
38
|
+
setup:
|
|
39
|
+
- "mkdir -p /tmp/bench-workspace"
|
|
40
|
+
assert:
|
|
41
|
+
- ran: "mycli create.*my-app"
|
|
42
|
+
- exit_code: 0
|
|
43
|
+
- file_exists: "/tmp/bench-workspace/my-app/package.json"
|
|
44
|
+
- verify:
|
|
45
|
+
run: "mycli list --json"
|
|
46
|
+
output_contains: "my-app"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Split tasks across files
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
cli: docker
|
|
53
|
+
providers: [anthropic/claude-sonnet-4-20250514]
|
|
54
|
+
tasks:
|
|
55
|
+
- file://tasks/basics.yaml
|
|
56
|
+
- file://tasks/advanced/*.yaml
|
|
57
|
+
- file://tasks/**/*.yaml # recursive glob
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Each referenced file is a plain array of tasks:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
# tasks/basics.yaml
|
|
64
|
+
- id: list-containers
|
|
65
|
+
intent: "List all running containers"
|
|
66
|
+
assert:
|
|
67
|
+
- ran: "docker ps"
|
|
68
|
+
- exit_code: 0
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Config fields
|
|
72
|
+
|
|
73
|
+
| Field | Required | Description |
|
|
74
|
+
|-------|----------|-------------|
|
|
75
|
+
| `cli` | Yes | CLI name (must be in PATH) |
|
|
76
|
+
| `version_command` | No | e.g. "mycli --version", for tracking |
|
|
77
|
+
| `providers` | No | Model IDs (default: claude-sonnet-4) |
|
|
78
|
+
| `help_modes` | No | injected, discoverable, none (default: [injected]) |
|
|
79
|
+
| `concurrency` | No | Max concurrent API calls (default: 3) |
|
|
80
|
+
| `workdir` | No | Working directory (default: temp dir per task) |
|
|
81
|
+
| `upload` | No | auto, always, never (default: auto) |
|
|
82
|
+
| `backend_url` | No | Dashboard URL (default: https://api.cliwatch.dev) |
|
|
83
|
+
| `tasks` | Yes | Array of tasks or `file://` references |
|
|
84
|
+
|
|
85
|
+
## Assertion types
|
|
86
|
+
|
|
87
|
+
| Assertion | Example | Description |
|
|
88
|
+
|-----------|---------|-------------|
|
|
89
|
+
| `ran` | `ran: "docker ps"` | Agent ran a command matching regex |
|
|
90
|
+
| `not_ran` | `not_ran: "rm -rf"` | No command matched regex |
|
|
91
|
+
| `run_count` | `run_count: {pattern: "curl", min: 1, max: 3}` | Count of matching commands |
|
|
92
|
+
| `output_contains` | `output_contains: "hello"` | Last command stdout contains |
|
|
93
|
+
| `output_equals` | `output_equals: "ok"` | Last command stdout exact match |
|
|
94
|
+
| `error_contains` | `error_contains: "warning"` | Last command stderr contains |
|
|
95
|
+
| `exit_code` | `exit_code: 0` | Last command exit code |
|
|
96
|
+
| `file_exists` | `file_exists: "./my-app/package.json"` | File exists |
|
|
97
|
+
| `file_contains` | `file_contains: {path: "...", text: "..."}` | File content check |
|
|
98
|
+
| `verify` | `verify: {run: "cmd", output_contains: "ok"}` | Run post-agent command, check output |
|
|
99
|
+
|
|
100
|
+
`verify` is the universal escape hatch — runs any command after the agent finishes.
|
|
101
|
+
|
|
102
|
+
## GitHub Actions
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
steps:
|
|
106
|
+
- uses: actions/checkout@v4
|
|
107
|
+
- uses: actions/setup-node@v4
|
|
108
|
+
with: { node-version: 22 }
|
|
109
|
+
- run: npm install -g my-cli
|
|
110
|
+
- run: npx @cliwatch/cli-bench
|
|
111
|
+
env:
|
|
112
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
113
|
+
CLIWATCH_API_KEY: ${{ secrets.CLIWATCH_API_KEY }} # optional, uploads to dashboard
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
No Docker required. Commands run directly on the CI runner.
|
|
117
|
+
|
|
118
|
+
## Environment variables
|
|
119
|
+
|
|
120
|
+
| Variable | Description |
|
|
121
|
+
|----------|-------------|
|
|
122
|
+
| `ANTHROPIC_API_KEY` | Anthropic API key (for `anthropic/*` models) |
|
|
123
|
+
| `OPENAI_API_KEY` | OpenAI API key (for `openai/*` models) |
|
|
124
|
+
| `GOOGLE_GENERATIVE_AI_API_KEY` | Google AI API key (for `google/*` models) |
|
|
125
|
+
| `CLIWATCH_API_KEY` | API key for uploading results to cliwatch.dev |
|
|
126
|
+
| `CLIWATCH_BACKEND_URL` | Override backend URL (default: `https://api.cliwatch.dev`) |
|
|
127
|
+
|
|
128
|
+
## Uploading results
|
|
129
|
+
|
|
130
|
+
Results upload automatically when `CLIWATCH_API_KEY` is set (default `upload: auto`). Override with `upload: always` or `upload: never` in your config, or pass `--upload` on the CLI.
|
|
131
|
+
|
|
132
|
+
## Available models
|
|
133
|
+
|
|
134
|
+
| Model ID | Provider |
|
|
135
|
+
|----------|----------|
|
|
136
|
+
| `anthropic/claude-sonnet-4-20250514` | Anthropic |
|
|
137
|
+
| `anthropic/claude-haiku-4-5-20251001` | Anthropic |
|
|
138
|
+
| `openai/gpt-4o` | OpenAI |
|
|
139
|
+
| `google/gemini-2.5-pro` | Google |
|
|
140
|
+
|
|
141
|
+
Any model supported by the Vercel AI SDK gateway can be used — just pass the full `provider/model-id`.
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assertion engine for @cliwatch/cli-bench.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates assertions against the agent's execution trace.
|
|
5
|
+
*/
|
|
6
|
+
import type { Assertion, AssertionResult } from './models.js';
|
|
7
|
+
export interface ExecutionTrace {
|
|
8
|
+
commandsRun: string[];
|
|
9
|
+
lastStdout: string;
|
|
10
|
+
lastStderr: string;
|
|
11
|
+
lastExitCode: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function runAssertions(assertions: Assertion[], trace: ExecutionTrace, workdir?: string): Promise<AssertionResult[]>;
|
|
14
|
+
//# sourceMappingURL=assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assertion engine for @cliwatch/cli-bench.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates assertions against the agent's execution trace.
|
|
5
|
+
*/
|
|
6
|
+
import { execCommand } from './exec.js';
|
|
7
|
+
export async function runAssertions(assertions, trace, workdir) {
|
|
8
|
+
const results = [];
|
|
9
|
+
for (const assertion of assertions) {
|
|
10
|
+
results.push(await evaluateAssertion(assertion, trace, workdir));
|
|
11
|
+
}
|
|
12
|
+
return results;
|
|
13
|
+
}
|
|
14
|
+
async function evaluateAssertion(assertion, trace, workdir) {
|
|
15
|
+
if ('output_contains' in assertion) {
|
|
16
|
+
const expected = assertion.output_contains;
|
|
17
|
+
const passed = trace.lastStdout.includes(expected);
|
|
18
|
+
return {
|
|
19
|
+
assertion,
|
|
20
|
+
passed,
|
|
21
|
+
actual: truncate(trace.lastStdout),
|
|
22
|
+
expected,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if ('output_equals' in assertion) {
|
|
26
|
+
const expected = assertion.output_equals;
|
|
27
|
+
const passed = trace.lastStdout.trim() === expected.trim();
|
|
28
|
+
return {
|
|
29
|
+
assertion,
|
|
30
|
+
passed,
|
|
31
|
+
actual: truncate(trace.lastStdout.trim()),
|
|
32
|
+
expected: expected.trim(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if ('error_contains' in assertion) {
|
|
36
|
+
const expected = assertion.error_contains;
|
|
37
|
+
const passed = trace.lastStderr.includes(expected);
|
|
38
|
+
return {
|
|
39
|
+
assertion,
|
|
40
|
+
passed,
|
|
41
|
+
actual: truncate(trace.lastStderr),
|
|
42
|
+
expected,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if ('exit_code' in assertion) {
|
|
46
|
+
const expected = assertion.exit_code;
|
|
47
|
+
const passed = trace.lastExitCode === expected;
|
|
48
|
+
return {
|
|
49
|
+
assertion,
|
|
50
|
+
passed,
|
|
51
|
+
actual: String(trace.lastExitCode),
|
|
52
|
+
expected: String(expected),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if ('file_exists' in assertion) {
|
|
56
|
+
const path = assertion.file_exists;
|
|
57
|
+
const result = await execCommand(`test -e '${shellEscape(path)}'`, { cwd: workdir });
|
|
58
|
+
const passed = result.exitCode === 0;
|
|
59
|
+
return {
|
|
60
|
+
assertion,
|
|
61
|
+
passed,
|
|
62
|
+
actual: passed ? 'exists' : 'not found',
|
|
63
|
+
expected: path,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if ('file_contains' in assertion) {
|
|
67
|
+
const { path, text } = assertion.file_contains;
|
|
68
|
+
const result = await execCommand(`cat '${shellEscape(path)}'`, { cwd: workdir });
|
|
69
|
+
const passed = result.exitCode === 0 && result.stdout.includes(text);
|
|
70
|
+
return {
|
|
71
|
+
assertion,
|
|
72
|
+
passed,
|
|
73
|
+
actual: truncate(result.stdout),
|
|
74
|
+
expected: text,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if ('ran' in assertion) {
|
|
78
|
+
const pattern = assertion.ran;
|
|
79
|
+
let passed;
|
|
80
|
+
try {
|
|
81
|
+
const re = new RegExp(pattern);
|
|
82
|
+
passed = trace.commandsRun.some((c) => re.test(c));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
passed = trace.commandsRun.some((c) => c.includes(pattern));
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
assertion,
|
|
89
|
+
passed,
|
|
90
|
+
actual: trace.commandsRun.join(' | '),
|
|
91
|
+
expected: pattern,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if ('not_ran' in assertion) {
|
|
95
|
+
const pattern = assertion.not_ran;
|
|
96
|
+
let matched;
|
|
97
|
+
try {
|
|
98
|
+
const re = new RegExp(pattern);
|
|
99
|
+
matched = trace.commandsRun.some((c) => re.test(c));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
matched = trace.commandsRun.some((c) => c.includes(pattern));
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
assertion,
|
|
106
|
+
passed: !matched,
|
|
107
|
+
actual: trace.commandsRun.join(' | '),
|
|
108
|
+
expected: `NOT ${pattern}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if ('run_count' in assertion) {
|
|
112
|
+
const { pattern, min, max } = assertion.run_count;
|
|
113
|
+
let count;
|
|
114
|
+
try {
|
|
115
|
+
const re = new RegExp(pattern);
|
|
116
|
+
count = trace.commandsRun.filter((c) => re.test(c)).length;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
count = trace.commandsRun.filter((c) => c.includes(pattern)).length;
|
|
120
|
+
}
|
|
121
|
+
const passMin = min === undefined || count >= min;
|
|
122
|
+
const passMax = max === undefined || count <= max;
|
|
123
|
+
return {
|
|
124
|
+
assertion,
|
|
125
|
+
passed: passMin && passMax,
|
|
126
|
+
actual: String(count),
|
|
127
|
+
expected: `${min ?? '*'}..${max ?? '*'}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if ('verify' in assertion) {
|
|
131
|
+
const { run, output_contains, output_equals } = assertion.verify;
|
|
132
|
+
const result = await execCommand(run, { cwd: workdir });
|
|
133
|
+
let passed = result.exitCode === 0;
|
|
134
|
+
if (passed && output_contains) {
|
|
135
|
+
passed = result.stdout.includes(output_contains);
|
|
136
|
+
}
|
|
137
|
+
if (passed && output_equals) {
|
|
138
|
+
passed = result.stdout.trim() === output_equals.trim();
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
assertion,
|
|
142
|
+
passed,
|
|
143
|
+
actual: truncate(result.stdout),
|
|
144
|
+
expected: output_contains ?? output_equals ?? 'exit 0',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
assertion,
|
|
149
|
+
passed: false,
|
|
150
|
+
actual: 'unknown assertion type',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function truncate(s, max = 200) {
|
|
154
|
+
if (s.length <= max)
|
|
155
|
+
return s;
|
|
156
|
+
return s.slice(0, max) + '...';
|
|
157
|
+
}
|
|
158
|
+
function shellEscape(s) {
|
|
159
|
+
return s.replace(/'/g, "'\\''");
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"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"}
|
package/dist/ci.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CI environment auto-detection and task suite hashing.
|
|
3
|
+
*/
|
|
4
|
+
import type { Task } from './models.js';
|
|
5
|
+
export interface CIMetadata {
|
|
6
|
+
gitSha?: string;
|
|
7
|
+
gitRef?: string;
|
|
8
|
+
gitBaseRef?: string;
|
|
9
|
+
commitMessage?: string;
|
|
10
|
+
gitAuthor?: string;
|
|
11
|
+
ciProvider?: string;
|
|
12
|
+
ciBuildUrl?: string;
|
|
13
|
+
ciEvent?: string;
|
|
14
|
+
prNumber?: number;
|
|
15
|
+
repository?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Detect CI environment from environment variables.
|
|
19
|
+
* Falls back to local git info when not running in CI.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectCI(): CIMetadata;
|
|
22
|
+
/**
|
|
23
|
+
* Compute a fingerprint for a set of tasks so only runs with
|
|
24
|
+
* the same task suite can be compared in trend views.
|
|
25
|
+
*
|
|
26
|
+
* Sort task IDs, concatenate id+intent+assertions, SHA256, take first 12 chars.
|
|
27
|
+
*/
|
|
28
|
+
export declare function computeTaskSuiteHash(tasks: Task[]): string;
|
|
29
|
+
//# sourceMappingURL=ci.d.ts.map
|
package/dist/ci.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,UAAU,CAOrC;AAqDD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAM1D"}
|
package/dist/ci.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CI environment auto-detection and task suite hashing.
|
|
3
|
+
*/
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
/**
|
|
7
|
+
* Detect CI environment from environment variables.
|
|
8
|
+
* Falls back to local git info when not running in CI.
|
|
9
|
+
*/
|
|
10
|
+
export function detectCI() {
|
|
11
|
+
if (process.env['GITHUB_ACTIONS']) {
|
|
12
|
+
return detectGitHubActions();
|
|
13
|
+
}
|
|
14
|
+
// Fallback: local git info
|
|
15
|
+
return detectLocalGit();
|
|
16
|
+
}
|
|
17
|
+
function detectGitHubActions() {
|
|
18
|
+
const env = process.env;
|
|
19
|
+
const serverUrl = env['GITHUB_SERVER_URL'] ?? 'https://github.com';
|
|
20
|
+
const repository = env['GITHUB_REPOSITORY'];
|
|
21
|
+
const runId = env['GITHUB_RUN_ID'];
|
|
22
|
+
const gitRef = env['GITHUB_REF'];
|
|
23
|
+
let prNumber;
|
|
24
|
+
if (gitRef) {
|
|
25
|
+
const match = gitRef.match(/^refs\/pull\/(\d+)\/merge$/);
|
|
26
|
+
if (match) {
|
|
27
|
+
prNumber = parseInt(match[1], 10);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
gitSha: env['GITHUB_SHA'],
|
|
32
|
+
gitRef,
|
|
33
|
+
gitBaseRef: env['GITHUB_BASE_REF'] || undefined,
|
|
34
|
+
gitAuthor: env['GITHUB_ACTOR'],
|
|
35
|
+
ciProvider: 'github-actions',
|
|
36
|
+
ciBuildUrl: repository && runId
|
|
37
|
+
? `${serverUrl}/${repository}/actions/runs/${runId}`
|
|
38
|
+
: undefined,
|
|
39
|
+
ciEvent: env['GITHUB_EVENT_NAME'],
|
|
40
|
+
repository,
|
|
41
|
+
prNumber,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function detectLocalGit() {
|
|
45
|
+
const meta = {};
|
|
46
|
+
try {
|
|
47
|
+
meta.gitSha = execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Not a git repo or git not available
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
meta.gitRef = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
54
|
+
encoding: 'utf-8',
|
|
55
|
+
}).trim();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore
|
|
59
|
+
}
|
|
60
|
+
return meta;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Compute a fingerprint for a set of tasks so only runs with
|
|
64
|
+
* the same task suite can be compared in trend views.
|
|
65
|
+
*
|
|
66
|
+
* Sort task IDs, concatenate id+intent+assertions, SHA256, take first 12 chars.
|
|
67
|
+
*/
|
|
68
|
+
export function computeTaskSuiteHash(tasks) {
|
|
69
|
+
const sorted = [...tasks].sort((a, b) => a.id.localeCompare(b.id));
|
|
70
|
+
const content = sorted
|
|
71
|
+
.map((t) => `${t.id}:${t.intent}:${JSON.stringify(t.assert)}`)
|
|
72
|
+
.join('|');
|
|
73
|
+
return createHash('sha256').update(content).digest('hex').slice(0, 12);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ci.js.map
|
package/dist/ci.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.gen.d.ts","sourceRoot":"","sources":["../../../src/client/client/client.gen.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAA0C,MAAM,gBAAgB,CAAC;AAgB7F,eAAO,MAAM,YAAY,GAAI,SAAQ,MAAW,KAAG,MA0QlD,CAAC"}
|