zerocheck 0.0.1 → 0.1.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 CHANGED
@@ -1,56 +1,172 @@
1
- # Zerocheck CLI
1
+ # Zerocheck
2
2
 
3
- AI-powered end-to-end testing from your terminal. Point it at a staging URL, get a recorded browser replay back.
3
+ Zerocheck turns your team’s manual release checklist into repeatable browser tests.
4
4
 
5
- Tests run in Zerocheck cloud no local Playwright, no API keys to manage. Your source code, secrets, and git history stay on your machine.
5
+ Paste a checklist, review one drafted check and browser verification result per actionable item, then save readable YAML in your repository. Run those same files locally, in GitHub Actions, or in a hosted browser. Results, recordings, attempts and healing history are available in the web app, with screenshots and a summary in your pull request.
6
6
 
7
- ## Install
7
+ ## Setup
8
8
 
9
- Requires Node 20+.
9
+ Requires Node.js 20.19 or newer and a Zerocheck project/account. Create a project in the web app’s Settings, then authorize a device or create a project token.
10
10
 
11
11
  ```sh
12
- npx zerocheck@latest login
13
- npx zerocheck@latest run --url https://staging.yourapp.com
12
+ npm install --save-dev zerocheck@0.1.1
13
+ npx zerocheck login
14
+ npx zerocheck init --project your-project-id --url http://localhost:3000
15
+ npx zerocheck install
14
16
  ```
15
17
 
16
- Or install globally:
18
+ `install` downloads Chromium for local execution. Linux CI can use `zerocheck install --with-deps`. Hosted execution does not require a browser on your machine, but still uses the CLI and your Zerocheck account.
19
+
20
+ For unattended use, set `ZEROCHECK_TOKEN` to the project token. It overrides the device token saved in `~/.zerocheck/config.json`. `ZEROCHECK_API` selects your Zerocheck server and defaults to `https://app.tryzerocheck.com`. Never commit tokens or resolved test credentials.
21
+
22
+ ## Import your release checklist
17
23
 
18
24
  ```sh
19
- npm install -g zerocheck
20
- zerocheck login
25
+ npx zerocheck import release-checklist.md --env dev
26
+ cat release-checklist.md | npx zerocheck import - --env staging
27
+ npx zerocheck import --env dev
21
28
  ```
22
29
 
23
- ## Commands
30
+ The last command accepts an interactive paste; finish with Ctrl+D on a new line. Import supports text and Markdown. Each item retains its source line and one of these states:
31
+
32
+ - **Verified passing:** the exact draft completed in a browser and its expected outcome passed.
33
+ - **Check failed:** the requested outcome failed. Review the check and captured result; this alone does not diagnose a product bug.
34
+ - **Needs input:** an essential outcome, account, route or fixture is missing, or the item still needs a browser-executable interpretation.
35
+ - **Could not run:** execution could not complete; inspect the recorded reason.
24
36
 
25
- | Command | What it does |
26
- | --- | --- |
27
- | `zerocheck login` | Device-code auth. Opens a browser for approval; token stored at `~/.zerocheck/config.json` (mode 0600). |
28
- | `zerocheck logout` | Revoke the current device's token. |
29
- | `zerocheck whoami` | Show auth state + linked project. |
30
- | `zerocheck run [file] --url <url>` | Run tests. Auto-generates starter tests on an empty project unless `--no-bootstrap`. |
31
- | `zerocheck generate --url <url>` | AI-generate tests against a URL. `--save` to write them to `./zerocheck/tests/`. |
32
- | `zerocheck discover --url <url>` | Crawl the app and draft an initial suite. |
33
- | `zerocheck validate [path]` | Lint `.zc` files server-side. |
34
- | `zerocheck doctor` | Config, token, backend reachability, version compat. |
37
+ Headings, notes, duplicates and unsupported items remain visible. Import does not silently discard difficult items or weaken a failed expectation.
35
38
 
36
- ## MCP server (coming soon)
39
+ The command prints the exact YAML for review. Save it with the single adoption command displayed at the end, or use `--save` when you want the import to save its displayed drafts immediately:
37
40
 
38
- An MCP server for Claude Code, Cursor, Codex, and Amp is on the roadmap — see [tryzerocheck.com/cli](https://tryzerocheck.com/cli).
41
+ ```sh
42
+ npx zerocheck import --draft IMPORT_ID
43
+ npx zerocheck import release-checklist.md --env dev --save
44
+ ```
39
45
 
40
- ## Privacy boundary
46
+ The same `--draft` command adopts a reviewed import from the web app. Drafted checks are saved in a unique import folder beneath the configured test directory. Their YAML bytes and revision are preserved. Existing conflicting files are never overwritten. Partial imports may be saved, but unresolved/failed items remain in the import report and the command exits nonzero.
41
47
 
42
- **Leaves your machine:** target URLs, rendered screenshots, accessibility tree, `.zc` file contents.
48
+ Answer missing inputs together in a JSON file keyed by the displayed item IDs:
43
49
 
44
- **Stays local:** source code, environment variables, secrets, git history beyond explicit diffs.
50
+ ```json
51
+ {"item-3":"Use the existing demo product with SKU DEMO-1; expect a total of $12.00."}
52
+ ```
53
+
54
+ ```sh
55
+ npx zerocheck import --draft IMPORT_ID --answers answers.json
56
+ ```
57
+
58
+ Only the answered unresolved items are drafted/verified again. Already completed items are preserved. Edit a drafted test’s expected behavior as a reviewed YAML change; changed YAML needs a new verification.
59
+
60
+ ## One repository format, named environments
61
+
62
+ `zerocheck.yaml` configures the project. It is separate from the readable check files:
63
+
64
+ ```yaml
65
+ project: your-project-id
66
+ default_environment: dev
67
+ test_directory: zerocheck/tests
68
+ environments:
69
+ dev:
70
+ url: http://localhost:3000
71
+ staging:
72
+ url: https://staging.example.com
73
+ secrets:
74
+ EMAIL: ${ZEROCHECK_EMAIL}
75
+ PASSWORD: ${ZEROCHECK_PASSWORD}
76
+ login_steps:
77
+ - Navigate to /login
78
+ - Enter "${EMAIL}" into the Email field
79
+ - Enter "${PASSWORD}" into the Password field
80
+ - Click the Sign in button
81
+ - Verify the dashboard is visible
82
+ production:
83
+ url: https://example.com
84
+ execution:
85
+ retries: 1
86
+ ```
45
87
 
46
- ## Configuration
88
+ Only explicitly referenced secret variables are read for execution. Missing variables fail clearly. Listing, reading, saving and validating checks do not require execution secrets.
47
89
 
48
- Override the API endpoint (for self-hosted Zerocheck):
90
+ Each check is one `zerocheck/v1` YAML file:
91
+
92
+ ```yaml
93
+ version: zerocheck/v1
94
+ name: Release notes are available
95
+ blocks_merge: true
96
+ steps:
97
+ - Navigate to /releases
98
+ - Verify the Release notes heading is visible
99
+ ```
100
+
101
+ Repository files are authoritative. The web app shows synced revisions and exact run snapshots; it does not maintain a second independently edited suite. A run always uses the selected files’ current contents. Empty, missing, duplicate or invalid selections fail before execution; `run` never invents starter checks.
102
+
103
+ ## Run and inspect
49
104
 
50
105
  ```sh
51
- ZEROCHECK_API=https://api.example.com zerocheck login
106
+ npx zerocheck validate
107
+ npx zerocheck run --env dev
108
+ npx zerocheck run zerocheck/tests/release.yaml --env staging --runner hosted
109
+ npx zerocheck run --env production --runner local --fail-on-flaky
110
+ npx zerocheck run --env staging --json .zerocheck/latest-run.json --junit .zerocheck/junit.xml
111
+ npx zerocheck results RUN_ID
112
+ npx zerocheck doctor --env staging
52
113
  ```
53
114
 
54
- ## License
115
+ `local` is the default runner and can reach localhost and private networks available to your machine/CI job. `hosted` uses Zerocheck’s existing hosted browser and can reach targets available to that worker; it cannot reach your laptop’s localhost, and Zerocheck does not create a network tunnel. Runner location, environment and trigger are independent. Hosted interruptions produce an explicit error and require a new user-triggered run.
116
+
117
+ Results retain every attempt. A failed attempt followed by a pass, or a transient grounding failure recovered in the same browser, is **flaky / passed on retry**, even when CI succeeds. Step recovery details remain visible. `--fail-on-flaky` makes blocking flaky checks fail CI. `blocks_merge: false` explicitly makes a check non-blocking; setup errors and incomplete execution still fail the command.
118
+
119
+ Exit codes: **0** completed within the selected merge policy; **1** blocking test failure (or strict flaky result); **2** setup, incomplete execution or infrastructure error. Import exits nonzero while any actionable item remains unverified.
120
+
121
+ Learned targets persist in `.zerocheck/cache`. Local CLI and MCP share this cache; hosted execution uses its own persistent cache. A healed target is separate from a retry, and the result records target changes and their validation. Forms and login do not block target repairs. The engine saves only independently validated targets after a complete unchanged check; model-only outcomes leave repairs pending. It never reruns a submission solely to validate healing. Recovery before dispatch stays in the current browser. A full restart after application activity needs a trusted isolated-state integration; `retries: 1` does not itself establish safe replay. Include `.zerocheck/` in `.gitignore`; `init` adds it.
122
+
123
+ ## GitHub Actions and PR comments
124
+
125
+ ```sh
126
+ npx zerocheck init --github-actions
127
+ ```
128
+
129
+ The generated `.github/workflows/zerocheck.yml` pins the CLI version, restores the local target cache, runs staging checks, and runs the reporter and artifact upload even if checks fail. Set the repository secret `ZEROCHECK_TOKEN`, configure staging in `zerocheck.yaml`, and add only the test-secret variables referenced there. For localhost testing, add your app startup and fixture setup before the run step.
130
+
131
+ The workflow uses `pull_request`, not `pull_request_target`. It grants `contents: read` and `pull-requests: write`; it does not execute fork code with elevated secrets. Fork or read-only-token jobs keep their job summary and explain why a PR comment could not be posted.
132
+
133
+ The comment contains pass/fail/flaky results, failing steps, selected screenshots, recordings, environment, commit and a link to full results. One Zerocheck bot comment is updated per PR. Results from older commits cannot replace the current comment. `report` explicitly creates unguessable share links for the selected PR screenshots/recordings, so GitHub can render them without a Zerocheck login; other artifacts retain normal access controls.
134
+
135
+ ```sh
136
+ npx zerocheck report --file .zerocheck/latest-run.json
137
+ ```
138
+
139
+ `GITHUB_TOKEN`, `GITHUB_EVENT_PATH` and `GITHUB_STEP_SUMMARY` come from Actions. Outside Actions, supply `--repo owner/repository --pr NUMBER` and `GITHUB_TOKEN`. Without PR context the same formatter produces a job summary.
140
+
141
+ The template also supports a manual choice of runner and environment. Uncomment its schedule to run the same checks against staging on weekdays, or edit that explicit environment for a production schedule. Schedules do not enable a separate monitoring product.
142
+
143
+ ## MCP for coding agents
144
+
145
+ Use the installed CLI as a stdio MCP server, with an explicit project directory:
146
+
147
+ ```json
148
+ {
149
+ "mcpServers": {
150
+ "zerocheck": {
151
+ "command": "npx",
152
+ "args": ["--yes", "zerocheck@0.1.1", "mcp", "--project-dir", "/absolute/path/to/project"]
153
+ }
154
+ }
155
+ }
156
+ ```
157
+
158
+ Authenticate with `zerocheck login` first or provide `ZEROCHECK_TOKEN` through the MCP host’s environment/secret settings. stdout contains only MCP protocol messages; diagnostics use stderr.
159
+
160
+ Tools: `list_checks`, `read_check`, `save_check`, `import_checklist`, `answer_import`, `adopt_import`, `verify_check`, `run_checks`, `get_results`, and `cancel`. Existing check replacements require their current `expectedRevision`. File operations stay within the configured project, including symbolic-link checks.
161
+
162
+ Browser operations return job handles. Poll `get_results` with `kind: "job"` and `waitMs` up to 30000; inspect the returned run/draft ID for durable retrieval. `kind: "run"` reads a saved run after process restart; `kind: "import"` reads an uploaded import. Cancel with the job ID. Each MCP process permits one active browser job. Closing it cancels that job; cancellation cannot undo actions already performed.
163
+
164
+ ## Data sent to Zerocheck
165
+
166
+ Local execution sends selected check YAML, the page context needed for AI (including screenshots/accessibility content), and run results/artifacts to Zerocheck. The browser still runs on your machine. Hosted execution additionally sends the URL, login steps and explicitly configured test secrets needed to run the check. The CLI never uploads your entire process environment. Browser screenshots may contain visible application data, and `report` shares the selected PR assets as described above.
167
+
168
+ ## Repository development
169
+
170
+ The CLI bundles the shared engine source into `dist/index.js`; it has no unpublished engine-package dependency. From this repository, run `npm run build`, `npm run check`, and `npm test` in `packages/cli`. Tests include a real MCP client communicating with the bundled CLI over stdio. The generated workflow and documentation use version `0.1.1`; update that pin together with the package version for a release.
55
171
 
56
- MIT see [LICENSE](./LICENSE).
172
+ Hosted runs and imports return a queued handle when browsers are occupied; CLI and MCP keep polling until they finish. The queue holds 20 waiting jobs for up to five minutes and never automatically resumes interrupted jobs after restart. Recent imports is available in the web app’s Checks page.
@@ -0,0 +1,179 @@
1
+ Third-party code bundled into the Zerocheck CLI
2
+
3
+
4
+ @modelcontextprotocol/sdk
5
+ =========================
6
+ MIT License
7
+
8
+ Copyright (c) 2024 Anthropic, PBC
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+
29
+ ajv
30
+ ===
31
+ The MIT License (MIT)
32
+
33
+ Copyright (c) 2015-2021 Evgeny Poberezkin
34
+
35
+ Permission is hereby granted, free of charge, to any person obtaining a copy
36
+ of this software and associated documentation files (the "Software"), to deal
37
+ in the Software without restriction, including without limitation the rights
38
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39
+ copies of the Software, and to permit persons to whom the Software is
40
+ furnished to do so, subject to the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be included in all
43
+ copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
51
+ SOFTWARE.
52
+
53
+
54
+
55
+ ajv-formats
56
+ ===========
57
+ MIT License
58
+
59
+ Copyright (c) 2020 Evgeny Poberezkin
60
+
61
+ Permission is hereby granted, free of charge, to any person obtaining a copy
62
+ of this software and associated documentation files (the "Software"), to deal
63
+ in the Software without restriction, including without limitation the rights
64
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
65
+ copies of the Software, and to permit persons to whom the Software is
66
+ furnished to do so, subject to the following conditions:
67
+
68
+ The above copyright notice and this permission notice shall be included in all
69
+ copies or substantial portions of the Software.
70
+
71
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
72
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
73
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
74
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
75
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
76
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
77
+ SOFTWARE.
78
+
79
+
80
+ fast-deep-equal
81
+ ===============
82
+ MIT License
83
+
84
+ Copyright (c) 2017 Evgeny Poberezkin
85
+
86
+ Permission is hereby granted, free of charge, to any person obtaining a copy
87
+ of this software and associated documentation files (the "Software"), to deal
88
+ in the Software without restriction, including without limitation the rights
89
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
90
+ copies of the Software, and to permit persons to whom the Software is
91
+ furnished to do so, subject to the following conditions:
92
+
93
+ The above copyright notice and this permission notice shall be included in all
94
+ copies or substantial portions of the Software.
95
+
96
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
97
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
98
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
99
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
100
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
101
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
102
+ SOFTWARE.
103
+
104
+
105
+ fast-uri
106
+ ========
107
+ Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
108
+ Copyright (c) 2021-present The Fastify team <https://github.com/fastify/fastify#team>
109
+ All rights reserved.
110
+
111
+ Redistribution and use in source and binary forms, with or without
112
+ modification, are permitted provided that the following conditions are met:
113
+ * Redistributions of source code must retain the above copyright
114
+ notice, this list of conditions and the following disclaimer.
115
+ * Redistributions in binary form must reproduce the above copyright
116
+ notice, this list of conditions and the following disclaimer in the
117
+ documentation and/or other materials provided with the distribution.
118
+ * The names of any contributors may not be used to endorse or promote
119
+ products derived from this software without specific prior written
120
+ permission.
121
+
122
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
123
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
124
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
125
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
126
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
127
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
128
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
129
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
130
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
131
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
132
+
133
+ * * *
134
+
135
+ The complete list of contributors can be found at:
136
+ - https://github.com/garycourt/uri-js/graphs/contributors
137
+
138
+ json-schema-traverse
139
+ ====================
140
+ MIT License
141
+
142
+ Copyright (c) 2017 Evgeny Poberezkin
143
+
144
+ Permission is hereby granted, free of charge, to any person obtaining a copy
145
+ of this software and associated documentation files (the "Software"), to deal
146
+ in the Software without restriction, including without limitation the rights
147
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
148
+ copies of the Software, and to permit persons to whom the Software is
149
+ furnished to do so, subject to the following conditions:
150
+
151
+ The above copyright notice and this permission notice shall be included in all
152
+ copies or substantial portions of the Software.
153
+
154
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
155
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
156
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
157
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
158
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
159
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
160
+ SOFTWARE.
161
+
162
+
163
+ zod-to-json-schema
164
+ ==================
165
+ ISC License
166
+
167
+ Copyright (c) 2020, Stefan Terdell
168
+
169
+ Permission to use, copy, modify, and/or distribute this software for any
170
+ purpose with or without fee is hereby granted, provided that the above
171
+ copyright notice and this permission notice appear in all copies.
172
+
173
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
174
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
175
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
176
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
177
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
178
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
179
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.