ralphctl 0.14.1 → 0.15.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/README.md +74 -66
- package/THIRD-PARTY-NOTICES.md +92 -0
- package/dist/cli-CKPJ5SY4.mjs +43941 -0
- package/dist/cli.mjs +3 -42323
- package/dist/manifest.json +6 -1
- package/dist/prompts/_partials/conventions-claude-md.md +2 -1
- package/dist/prompts/_partials/validation-checklist.md +4 -0
- package/dist/prompts/detect-scripts/template.md +2 -2
- package/dist/prompts/evaluate/template.md +56 -22
- package/dist/prompts/evaluate-continuation/template.md +110 -8
- package/dist/prompts/ideate/template.md +16 -0
- package/dist/prompts/implement/template.md +13 -6
- package/dist/prompts/plan/template.md +21 -6
- package/dist/prompts/readiness/template.md +5 -3
- package/dist/skills/ralphctl-alignment/SKILL.md +1 -1
- package/dist/skills/ralphctl-cherny-workflow/SKILL.md +61 -0
- package/dist/skills/ralphctl-debugging-and-error-recovery/SKILL.md +1 -1
- package/dist/skills/ralphctl-domain-driven-design/SKILL.md +113 -0
- package/dist/skills/ralphctl-idea-refinement/SKILL.md +107 -0
- package/dist/skills/ralphctl-iterative-review/SKILL.md +1 -1
- package/dist/skills/ralphctl-karpathy-guidelines/SKILL.md +76 -0
- package/dist/skills/ralphctl-minimal-scaffolding/SKILL.md +1 -1
- package/dist/skills/ralphctl-ponytail/SKILL.md +86 -0
- package/dist/skills/ralphctl-surgical-simplicity/SKILL.md +1 -1
- package/dist/skills/ralphctl-test-driven-development/SKILL.md +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
[](https://www.typescriptlang.org/)
|
|
6
6
|
[](https://nodejs.org/)
|
|
7
7
|
[](./CONTRIBUTING.md)
|
|
8
|
-
[](https://docs.anthropic.com/en/docs/claude-code)
|
|
9
|
+
[](https://docs.github.com/en/copilot/github-copilot-in-the-cli)
|
|
10
|
+
[](https://github.com/openai/codex)
|
|
11
11
|
[](https://github.com/lukas-grigis/ralphctl)
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
@@ -16,17 +16,18 @@
|
|
|
16
16
|
|
|
17
17
|
# ralphctl
|
|
18
18
|
|
|
19
|
-
**A ralph harness for long-running AI coding tasks — a hardened ralph loop that
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
[OpenAI Codex](https://github.com/openai/codex)
|
|
19
|
+
**A ralph harness for long-running AI coding tasks — a hardened ralph loop that drives your coding agent of choice
|
|
20
|
+
([Claude Code](https://docs.anthropic.com/en/docs/claude-code),
|
|
21
|
+
[GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli), or
|
|
22
|
+
[OpenAI Codex CLI](https://github.com/openai/codex)) across one or more repositories.**
|
|
23
23
|
|
|
24
24
|
> _"I'm helping!"_ — Ralph Wiggum
|
|
25
25
|
|
|
26
26
|
> [!NOTE]
|
|
27
|
-
> **Active development.** New features and polish ship regularly.
|
|
28
|
-
>
|
|
29
|
-
>
|
|
27
|
+
> **Active development.** New features and polish ship regularly. All three providers — Claude Code,
|
|
28
|
+
> GitHub Copilot CLI, and OpenAI Codex CLI — are supported; pick one per flow or mix them, in one command,
|
|
29
|
+
> from a preset matrix of 20 presets across five families (`standard`, `economic`, `strong-gate`, `fast`,
|
|
30
|
+
> `frontier`), each in `mixed` / `claude-only` / `copilot-only` / `codex-only` variants.
|
|
30
31
|
> Upgrades are best-effort: install the latest version, redo your config, proceed.
|
|
31
32
|
> See [Upgrading](#upgrading) and [CHANGELOG](./CHANGELOG.md).
|
|
32
33
|
|
|
@@ -36,18 +37,20 @@ with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-c
|
|
|
36
37
|
|
|
37
38
|
The "Ralph" technique comes from Geoffrey Huntley's [Ralph Wiggum as a software engineer](https://ghuntley.com/ralph/):
|
|
38
39
|
point a coding agent at a task and run it in a loop until the work is done. The bare version
|
|
39
|
-
(`while :; do cat PROMPT.md | claude
|
|
40
|
+
(`while :; do cat PROMPT.md | claude; done`) loops blindly — it re-runs the same prompt and hopes each pass lands.
|
|
40
41
|
ralphctl is a ralph harness around that idea: instead of blind repetition it runs a generator-evaluator loop, where one
|
|
41
42
|
pass writes the change and a second independent pass reviews it against the task spec before the loop advances. Same
|
|
42
|
-
loop, with a verification gate on every step.
|
|
43
|
+
loop, with a verification gate on every step. For the wider picture — what an agent harness is, and how the
|
|
44
|
+
plan → generate → evaluate → verify loop turns one-shot prompting into a repeatable workflow — see
|
|
45
|
+
[AI Agent Harnesses: A Field Guide](https://lukasgrigis.dev/blog/guides/agent-harnesses/).
|
|
43
46
|
|
|
44
47
|
---
|
|
45
48
|
|
|
46
49
|
## What is ralphctl?
|
|
47
50
|
|
|
48
51
|
AI coding agents are powerful but lose context on long tasks, need babysitting when things break, and have no way to
|
|
49
|
-
coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code,
|
|
50
|
-
|
|
52
|
+
coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, GitHub Copilot CLI,
|
|
53
|
+
or OpenAI Codex CLI — in a
|
|
51
54
|
structured harness that decomposes your work into dependency-ordered tasks, drives each one through
|
|
52
55
|
a [generator-evaluator loop](https://www.anthropic.com/engineering/harness-design-long-running-apps) that catches issues
|
|
53
56
|
before moving on, and persists context across sessions so nothing gets lost.
|
|
@@ -64,8 +67,9 @@ npm install -g ralphctl
|
|
|
64
67
|
|
|
65
68
|
> Needs [Node.js](https://nodejs.org/) ≥ 24 — `mise use node@24` or `nvm install 24`.
|
|
66
69
|
|
|
67
|
-
Install [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
|
|
68
|
-
|
|
70
|
+
Install one of the supported CLIs — [Claude Code](https://docs.anthropic.com/en/docs/claude-code),
|
|
71
|
+
[GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli), or
|
|
72
|
+
[OpenAI Codex CLI](https://github.com/openai/codex) — and authenticate it, then confirm ralphctl can see it:
|
|
69
73
|
|
|
70
74
|
```bash
|
|
71
75
|
ralphctl doctor # verifies your provider CLI is installed + authenticated — the #1 first-run failure
|
|
@@ -99,7 +103,7 @@ ralphctl sprint show <sprint-id>
|
|
|
99
103
|
ralphctl sprint progress <sprint-id>
|
|
100
104
|
|
|
101
105
|
# Add / inspect tickets
|
|
102
|
-
ralphctl ticket add
|
|
106
|
+
ralphctl ticket add --title "<title>"
|
|
103
107
|
ralphctl ticket list
|
|
104
108
|
|
|
105
109
|
# Manage sprint state
|
|
@@ -131,23 +135,26 @@ ralphctl settings set ai.implement.evaluator.model <model-id>
|
|
|
131
135
|
## How It Works
|
|
132
136
|
|
|
133
137
|
```
|
|
134
|
-
You describe what to build
|
|
135
|
-
─────────────────────────
|
|
136
|
-
┌──────────┐ ┌──────────┐ ┌────────┐ ┌──────┐ ┌───────────┐
|
|
137
|
-
│ Create │──>│ Add │───────>│ Refine │──>│ Plan │──>│ Implement
|
|
138
|
-
│ Sprint │ │ Tickets │ │ (WHAT) │ │(HOW) │ │ Loop │
|
|
139
|
-
└──────────┘ └──────────┘ └────────┘ └──────┘ └───────────┘
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
138
|
+
You describe what to build ralphctl drives it to done
|
|
139
|
+
───────────────────────── ────────────────────────────────────────────
|
|
140
|
+
┌──────────┐ ┌──────────┐ ┌────────┐ ┌──────┐ ┌───────────┐ ┌────────┐
|
|
141
|
+
│ Create │──>│ Add │───────>│ Refine │──>│ Plan │──>│ Implement │──>│ Review │──> done
|
|
142
|
+
│ Sprint │ │ Tickets │ │ (WHAT) │ │(HOW) │ │ Loop │ │ Loop │
|
|
143
|
+
└──────────┘ └──────────┘ └────────┘ └──────┘ └───────────┘ └────────┘
|
|
144
|
+
│ │ │ │
|
|
145
|
+
AI clarifies AI builds AI implements you steer
|
|
146
|
+
requirements the task + AI reviews revisions,
|
|
147
|
+
with you graph each task close to done
|
|
144
148
|
```
|
|
145
149
|
|
|
146
150
|
**Refine** is implementation-agnostic: the AI clarifies requirements with you, ticket by ticket, and flips each one from
|
|
147
151
|
`pending` to `approved`. **Plan** requires every ticket approved — the AI explores the affected repos and generates a
|
|
148
152
|
dependency-ordered task graph. **Implement** drives those tasks in dependency order through a generator-evaluator cycle:
|
|
149
153
|
a second AI pass reviews each task against its spec before the harness marks it done and moves on. Independent tasks in
|
|
150
|
-
the same dependency wave can run in parallel (opt-in) when you want a sprint to finish faster.
|
|
154
|
+
the same dependency wave can run in parallel (opt-in) when you want a sprint to finish faster. **Review** closes the
|
|
155
|
+
loop — once every task lands, the sprint enters `review` and you run human-steered feedback rounds: you flag what's off,
|
|
156
|
+
the AI revises, and the sprint flips to `done` when you're satisfied. Opening a PR (`ralphctl create-pr`) is separate
|
|
157
|
+
and optional.
|
|
151
158
|
|
|
152
159
|
Key properties:
|
|
153
160
|
|
|
@@ -165,24 +172,24 @@ For the full architectural picture see [`.claude/docs/ARCHITECTURE.md`](./.claud
|
|
|
165
172
|
|
|
166
173
|
---
|
|
167
174
|
|
|
168
|
-
##
|
|
175
|
+
## Providers
|
|
169
176
|
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
ralphctl drives three AI coding CLIs. Choose one per flow — or mix them, say plan with one and implement with
|
|
178
|
+
another — through a [preset](#configuration) or per-row settings. All three are supported and in everyday use.
|
|
172
179
|
|
|
173
|
-
| Provider |
|
|
174
|
-
| ----------------------------------------- |
|
|
175
|
-
| **Claude Code** (`claude-code`) |
|
|
176
|
-
| **GitHub Copilot CLI** (`github-copilot`) |
|
|
177
|
-
| **OpenAI Codex** (`openai-codex`)
|
|
180
|
+
| Provider | CLI | Headless permission mapping | Native context file |
|
|
181
|
+
| ----------------------------------------- | --------- | ----------------------------------------------------------------------------------------------- | --------------------------------- |
|
|
182
|
+
| **Claude Code** (`claude-code`) | `claude` | `--permission-mode bypassPermissions` + per-tool deny list | `CLAUDE.md` at repo root |
|
|
183
|
+
| **GitHub Copilot CLI** (`github-copilot`) | `copilot` | `--autopilot --max-autopilot-continues=200` + `--allow-all` (per-tool deny list when read-only) | `.github/copilot-instructions.md` |
|
|
184
|
+
| **OpenAI Codex CLI** (`openai-codex`) | `codex` | `-s workspace-write` (topology-scoped) | `AGENTS.md` |
|
|
178
185
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
Claude Code has the most end-to-end mileage inside the harness — it's the most battle-tested of the three — but Copilot
|
|
187
|
+
and Codex run every flow and are supported first-class. Two small differences worth knowing: bundled skill injection
|
|
188
|
+
and `bodyFile` forensic artifacts currently no-op on Copilot and Codex, and Codex's sandbox has only two modes
|
|
189
|
+
(read-only / workspace-write), so path scope (cwd + `--add-dir`) is its fine-grained safety envelope rather than a
|
|
190
|
+
per-tool deny list. Parallel execution is provider-agnostic — it works with whichever provider each implement role is
|
|
191
|
+
configured to use. Hit a rough edge with any provider? Please [open an
|
|
192
|
+
issue](https://github.com/lukas-grigis/ralphctl/issues).
|
|
186
193
|
|
|
187
194
|
One-shot configuration for any provider: `ralphctl settings apply-preset <name>` where `<name>` is one of
|
|
188
195
|
20 presets across five families — `standard`, `economic`, `strong-gate`, `fast`, and `frontier`, each in
|
|
@@ -225,8 +232,8 @@ Configure via the TUI `Settings` view or one-shot CLI commands.
|
|
|
225
232
|
# Standard — flagship model per flow
|
|
226
233
|
ralphctl settings apply-preset mixed # best-fit provider per flow
|
|
227
234
|
ralphctl settings apply-preset claude-only # every flow on Claude Code
|
|
228
|
-
ralphctl settings apply-preset copilot-only # every flow on GitHub Copilot
|
|
229
|
-
ralphctl settings apply-preset codex-only # every flow on OpenAI Codex
|
|
235
|
+
ralphctl settings apply-preset copilot-only # every flow on GitHub Copilot CLI
|
|
236
|
+
ralphctl settings apply-preset codex-only # every flow on OpenAI Codex CLI
|
|
230
237
|
|
|
231
238
|
# Economic — implement starts one tier below flagship; escalation ladder climbs only on plateau
|
|
232
239
|
ralphctl settings apply-preset mixed-economic
|
|
@@ -364,20 +371,20 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
|
|
|
364
371
|
|
|
365
372
|
### Project & Sprint Inspection
|
|
366
373
|
|
|
367
|
-
| Command
|
|
368
|
-
|
|
|
369
|
-
| `ralphctl project list`
|
|
370
|
-
| `ralphctl project show <id>`
|
|
371
|
-
| `ralphctl project remove <id>`
|
|
372
|
-
| `ralphctl sprint list`
|
|
373
|
-
| `ralphctl sprint show <id>`
|
|
374
|
-
| `ralphctl sprint progress <id>`
|
|
375
|
-
| `ralphctl sprint set-current <id>`
|
|
376
|
-
| `ralphctl ticket add
|
|
377
|
-
| `ralphctl ticket list / show <id>`
|
|
378
|
-
| `ralphctl ticket remove <id>`
|
|
379
|
-
| `ralphctl task list / show <id>`
|
|
380
|
-
| `ralphctl task unblock <id>`
|
|
374
|
+
| Command | Description |
|
|
375
|
+
| ------------------------------------- | ----------------------------------------------------------------------------------- |
|
|
376
|
+
| `ralphctl project list` | List registered projects |
|
|
377
|
+
| `ralphctl project show <id>` | Show one project (incl. repositories) |
|
|
378
|
+
| `ralphctl project remove <id>` | Delete a project registration |
|
|
379
|
+
| `ralphctl sprint list` | List all sprints |
|
|
380
|
+
| `ralphctl sprint show <id>` | Show one sprint (tickets, status, branch) |
|
|
381
|
+
| `ralphctl sprint progress <id>` | Sprint progress with blocker diagnostics |
|
|
382
|
+
| `ralphctl sprint set-current <id>` | Switch the current sprint pointer |
|
|
383
|
+
| `ralphctl ticket add --title <title>` | Add a ticket to the current sprint (`--sprint`, `--description`, `--link` optional) |
|
|
384
|
+
| `ralphctl ticket list / show <id>` | Inspect tickets |
|
|
385
|
+
| `ralphctl ticket remove <id>` | Remove a ticket from a draft sprint |
|
|
386
|
+
| `ralphctl task list / show <id>` | Inspect tasks (planning generates them) |
|
|
387
|
+
| `ralphctl task unblock <id>` | Reset a blocked task to `todo` |
|
|
381
388
|
|
|
382
389
|
### Sprint Lifecycle
|
|
383
390
|
|
|
@@ -419,14 +426,15 @@ Run `ralphctl <command> --help` for flag-level detail.
|
|
|
419
426
|
| [Migration](./MIGRATION.md) | Per-version upgrade context for big version jumps |
|
|
420
427
|
| [Changelog](./CHANGELOG.md) | Version history |
|
|
421
428
|
|
|
422
|
-
**
|
|
423
|
-
|
|
424
|
-
deep-dive)
|
|
429
|
+
**From the author** ([Lukas Grigis](https://lukasgrigis.dev/)):
|
|
430
|
+
[Building ralphctl](https://lukasgrigis.dev/blog/building-ralphctl) (backstory)
|
|
431
|
+
| [From task CLI to ralph harness](https://lukasgrigis.dev/blog/ralphctl-agent-harness/) (evaluator deep-dive)
|
|
432
|
+
| [The harness era caught up](https://lukasgrigis.dev/blog/ralphctl-harness-era/) (the field converges on the harness bet)
|
|
425
433
|
|
|
426
|
-
**Further reading
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
Anthropic Engineering
|
|
434
|
+
**Further reading:**
|
|
435
|
+
[AI Agent Harnesses: A Field Guide](https://lukasgrigis.dev/blog/guides/agent-harnesses/) — Lukas Grigis
|
|
436
|
+
| [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Martin Fowler (April 2026)
|
|
437
|
+
| [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) — Anthropic Engineering
|
|
430
438
|
|
|
431
439
|
---
|
|
432
440
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
ralphctl bundles skill content adapted from the following MIT-licensed upstream projects. The
|
|
4
|
+
adapted copies live under `src/integration/ai/skills/bundled/` (shipped as `dist/skills/`);
|
|
5
|
+
verbatim upstream snapshots used for drift review live under `scripts/vendor/skills/`. Each
|
|
6
|
+
upstream's license and copyright notice is reproduced in full below, as the MIT license requires.
|
|
7
|
+
|
|
8
|
+
- `ralphctl-debugging-and-error-recovery`, `ralphctl-code-review-and-quality`,
|
|
9
|
+
`ralphctl-test-driven-development`, `ralphctl-idea-refinement` — from
|
|
10
|
+
[addyosmani/agent-skills](https://github.com/addyosmani/agent-skills)
|
|
11
|
+
- `ralphctl-ponytail` — from [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail)
|
|
12
|
+
- `ralphctl-domain-driven-design` — from [wondelai/skills](https://github.com/wondelai/skills)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## addyosmani/agent-skills
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
MIT License
|
|
20
|
+
|
|
21
|
+
Copyright (c) 2025 Addy Osmani
|
|
22
|
+
|
|
23
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
24
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
25
|
+
in the Software without restriction, including without limitation the rights
|
|
26
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
27
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
28
|
+
furnished to do so, subject to the following conditions:
|
|
29
|
+
|
|
30
|
+
The above copyright notice and this permission notice shall be included in all
|
|
31
|
+
copies or substantial portions of the Software.
|
|
32
|
+
|
|
33
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
34
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
35
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
36
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
37
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
38
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
39
|
+
SOFTWARE.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## DietrichGebert/ponytail
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
MIT License
|
|
46
|
+
|
|
47
|
+
Copyright (c) 2026 DietrichGebert
|
|
48
|
+
|
|
49
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
50
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
51
|
+
in the Software without restriction, including without limitation the rights
|
|
52
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
53
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
54
|
+
furnished to do so, subject to the following conditions:
|
|
55
|
+
|
|
56
|
+
The above copyright notice and this permission notice shall be included in all
|
|
57
|
+
copies or substantial portions of the Software.
|
|
58
|
+
|
|
59
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
60
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
61
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
62
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
63
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
64
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
65
|
+
SOFTWARE.
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## wondelai/skills
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
MIT License
|
|
72
|
+
|
|
73
|
+
Copyright (c) 2025 Wondel.ai sp. z o.o.
|
|
74
|
+
|
|
75
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
76
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
77
|
+
in the Software without restriction, including without limitation the rights
|
|
78
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
79
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
80
|
+
furnished to do so, subject to the following conditions:
|
|
81
|
+
|
|
82
|
+
The above copyright notice and this permission notice shall be included in all
|
|
83
|
+
copies or substantial portions of the Software.
|
|
84
|
+
|
|
85
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
86
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
87
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
88
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
89
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
90
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
91
|
+
SOFTWARE.
|
|
92
|
+
```
|