ralphctl 0.14.0 → 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 CHANGED
@@ -1,14 +1,13 @@
1
1
  [![npm version](https://img.shields.io/npm/v/ralphctl?style=flat&logo=npm&logoColor=white&color=cb3837)](https://www.npmjs.com/package/ralphctl)
2
2
  [![npm downloads](https://img.shields.io/npm/dm/ralphctl?style=flat&logo=npm&logoColor=white&color=cb3837)](https://www.npmjs.com/package/ralphctl)
3
3
  [![CI](https://github.com/lukas-grigis/ralphctl/actions/workflows/ci.yml/badge.svg)](https://github.com/lukas-grigis/ralphctl/actions/workflows/ci.yml)
4
- [![codecov](https://codecov.io/gh/lukas-grigis/ralphctl/graph/badge.svg)](https://codecov.io/gh/lukas-grigis/ralphctl)
5
4
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue?style=flat&logo=opensourceinitiative&logoColor=white)](./LICENSE)
6
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-6.0-3178c6?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
7
6
  [![Node.js](https://img.shields.io/badge/node-%E2%89%A5_24-5fa04e?style=flat&logo=nodedotjs&logoColor=white)](https://nodejs.org/)
8
7
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat&logo=git&logoColor=white)](./CONTRIBUTING.md)
9
- [![Claude Code](https://img.shields.io/badge/Claude_Code-stable-191919?style=flat&logo=anthropic&logoColor=white)](https://docs.anthropic.com/en/docs/claude-code)
10
- [![OpenAI Codex](https://img.shields.io/badge/OpenAI_Codex-preview-412991?style=flat&logo=openai&logoColor=white)](https://github.com/openai/codex)
11
- [![GitHub Copilot](https://img.shields.io/badge/GitHub_Copilot-preview-000?style=flat&logo=githubcopilot&logoColor=white)](https://docs.github.com/en/copilot/github-copilot-in-the-cli)
8
+ [![Claude Code](https://img.shields.io/badge/Claude_Code-supported-191919?style=flat&logo=anthropic&logoColor=white)](https://docs.anthropic.com/en/docs/claude-code)
9
+ [![GitHub Copilot CLI](https://img.shields.io/badge/GitHub_Copilot_CLI-supported-000?style=flat&logo=githubcopilot&logoColor=white)](https://docs.github.com/en/copilot/github-copilot-in-the-cli)
10
+ [![OpenAI Codex CLI](https://img.shields.io/badge/OpenAI_Codex_CLI-supported-412991?style=flat&logo=openai&logoColor=white)](https://github.com/openai/codex)
12
11
  [![Built with Donuts](https://img.shields.io/badge/%F0%9F%8D%A9-Built_with_Donuts-ff6f00?style=flat)](https://github.com/lukas-grigis/ralphctl)
13
12
 
14
13
  <p align="center">
@@ -17,17 +16,18 @@
17
16
 
18
17
  # ralphctl
19
18
 
20
- **A ralph harness for long-running AI coding tasks — a hardened ralph loop that
21
- orchestrates [Claude Code](https://docs.anthropic.com/en/docs/claude-code) across repositories,
22
- with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-cli) and
23
- [OpenAI Codex](https://github.com/openai/codex) available in preview.**
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.**
24
23
 
25
24
  > _"I'm helping!"_ — Ralph Wiggum
26
25
 
27
26
  > [!NOTE]
28
- > **Active development.** New features and polish ship regularly. The latest release expands the preset
29
- > matrix to 20 presets across five families (`standard`, `economic`, `strong-gate`, `fast`, `frontier`),
30
- > each in `mixed` / `claude-only` / `copilot-only` / `codex-only` variants.
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.
31
31
  > Upgrades are best-effort: install the latest version, redo your config, proceed.
32
32
  > See [Upgrading](#upgrading) and [CHANGELOG](./CHANGELOG.md).
33
33
 
@@ -37,18 +37,20 @@ with [GitHub Copilot](https://docs.github.com/en/copilot/github-copilot-in-the-c
37
37
 
38
38
  The "Ralph" technique comes from Geoffrey Huntley's [Ralph Wiggum as a software engineer](https://ghuntley.com/ralph/):
39
39
  point a coding agent at a task and run it in a loop until the work is done. The bare version
40
- (`while :; do cat PROMPT.md | claude-code; done`) loops blindly — it re-runs the same prompt and hopes each pass lands.
40
+ (`while :; do cat PROMPT.md | claude; done`) loops blindly — it re-runs the same prompt and hopes each pass lands.
41
41
  ralphctl is a ralph harness around that idea: instead of blind repetition it runs a generator-evaluator loop, where one
42
42
  pass writes the change and a second independent pass reviews it against the task spec before the loop advances. Same
43
- 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/).
44
46
 
45
47
  ---
46
48
 
47
49
  ## What is ralphctl?
48
50
 
49
51
  AI coding agents are powerful but lose context on long tasks, need babysitting when things break, and have no way to
50
- coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, with GitHub Copilot
51
- and OpenAI Codex in preview — in a
52
+ coordinate changes across multiple repositories. ralphctl wraps your chosen AI CLI — Claude Code, GitHub Copilot CLI,
53
+ or OpenAI Codex CLI — in a
52
54
  structured harness that decomposes your work into dependency-ordered tasks, drives each one through
53
55
  a [generator-evaluator loop](https://www.anthropic.com/engineering/harness-design-long-running-apps) that catches issues
54
56
  before moving on, and persists context across sessions so nothing gets lost.
@@ -65,8 +67,9 @@ npm install -g ralphctl
65
67
 
66
68
  > Needs [Node.js](https://nodejs.org/) ≥ 24 — `mise use node@24` or `nvm install 24`.
67
69
 
68
- Install [Claude Code](https://docs.anthropic.com/en/docs/claude-code) (or a preview provider — see below) and
69
- authenticate it, then confirm ralphctl can see it:
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:
70
73
 
71
74
  ```bash
72
75
  ralphctl doctor # verifies your provider CLI is installed + authenticated — the #1 first-run failure
@@ -100,7 +103,7 @@ ralphctl sprint show <sprint-id>
100
103
  ralphctl sprint progress <sprint-id>
101
104
 
102
105
  # Add / inspect tickets
103
- ralphctl ticket add
106
+ ralphctl ticket add --title "<title>"
104
107
  ralphctl ticket list
105
108
 
106
109
  # Manage sprint state
@@ -132,23 +135,26 @@ ralphctl settings set ai.implement.evaluator.model <model-id>
132
135
  ## How It Works
133
136
 
134
137
  ```
135
- You describe what to build ralphctl handles the rest
136
- ───────────────────────── ─────────────────────────────────
137
- ┌──────────┐ ┌──────────┐ ┌────────┐ ┌──────┐ ┌───────────┐
138
- │ Create │──>│ Add │───────>│ Refine │──>│ Plan │──>│ Implement │
139
- │ Sprint │ │ Tickets │ │ (WHAT) │ │(HOW) │ │ Loop │
140
- └──────────┘ └──────────┘ └────────┘ └──────┘ └───────────┘
141
- │ │ │
142
- AI clarifies AI generates AI implements
143
- requirements task graph + AI reviews
144
- with you from specs each task
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
145
148
  ```
146
149
 
147
150
  **Refine** is implementation-agnostic: the AI clarifies requirements with you, ticket by ticket, and flips each one from
148
151
  `pending` to `approved`. **Plan** requires every ticket approved — the AI explores the affected repos and generates a
149
152
  dependency-ordered task graph. **Implement** drives those tasks in dependency order through a generator-evaluator cycle:
150
153
  a second AI pass reviews each task against its spec before the harness marks it done and moves on. Independent tasks in
151
- 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.
152
158
 
153
159
  Key properties:
154
160
 
@@ -166,24 +172,24 @@ For the full architectural picture see [`.claude/docs/ARCHITECTURE.md`](./.claud
166
172
 
167
173
  ---
168
174
 
169
- ## Provider Status
175
+ ## Providers
170
176
 
171
- > [!IMPORTANT]
172
- > Not all three AI providers are equally production-ready inside ralphctl.
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.
173
179
 
174
- | Provider | Status | Headless flag | Native context file |
175
- | ----------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------- | --------------------------------- |
176
- | **Claude Code** (`claude-code`) | **Stable — primary verified provider** | `--permission-mode bypassPermissions` + per-tool deny list | `CLAUDE.md` at repo root |
177
- | **GitHub Copilot CLI** (`github-copilot`) | Preview — maturing; works well day-to-day, not yet formally verified end-to-end | `--autopilot --allow-all` + `--max-autopilot-continues=200` | `.github/copilot-instructions.md` |
178
- | **OpenAI Codex** (`openai-codex`) | Preview — maturing; works well day-to-day, not yet formally verified end-to-end | `-s workspace-write` (topology-scoped) | `AGENTS.md` |
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` |
179
185
 
180
- "Preview" means the integration is in active use and increasingly solid — recent releases run Copilot and Codex well
181
- across the everyday flows — but harness behaviour against them hasn't been put through the same formal end-to-end
182
- verification as Claude Code. A couple of features still no-op on them (bundled skill injection, `bodyFile` forensic
183
- artifacts), and Codex can't fine-grained-deny edits on existing repo files — its sandbox modes are binary, so path
184
- scope (cwd + `--add-dir`) is the only safety envelope. Parallel execution is provider-agnostic: it works with whichever
185
- provider each implement role is configured to use, under the same per-provider caveats. If you hit a rough edge on a
186
- preview provider, please [open an issue](https://github.com/lukas-grigis/ralphctl/issues).
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).
187
193
 
188
194
  One-shot configuration for any provider: `ralphctl settings apply-preset <name>` where `<name>` is one of
189
195
  20 presets across five families — `standard`, `economic`, `strong-gate`, `fast`, and `frontier`, each in
@@ -226,8 +232,8 @@ Configure via the TUI `Settings` view or one-shot CLI commands.
226
232
  # Standard — flagship model per flow
227
233
  ralphctl settings apply-preset mixed # best-fit provider per flow
228
234
  ralphctl settings apply-preset claude-only # every flow on Claude Code
229
- ralphctl settings apply-preset copilot-only # every flow on GitHub Copilot
230
- 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
231
237
 
232
238
  # Economic — implement starts one tier below flagship; escalation ladder climbs only on plateau
233
239
  ralphctl settings apply-preset mixed-economic
@@ -365,20 +371,20 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
365
371
 
366
372
  ### Project & Sprint Inspection
367
373
 
368
- | Command | Description |
369
- | ---------------------------------- | ----------------------------------------- |
370
- | `ralphctl project list` | List registered projects |
371
- | `ralphctl project show <id>` | Show one project (incl. repositories) |
372
- | `ralphctl project remove <id>` | Delete a project registration |
373
- | `ralphctl sprint list` | List all sprints |
374
- | `ralphctl sprint show <id>` | Show one sprint (tickets, status, branch) |
375
- | `ralphctl sprint progress <id>` | Sprint progress with blocker diagnostics |
376
- | `ralphctl sprint set-current <id>` | Switch the current sprint pointer |
377
- | `ralphctl ticket add` | Add a ticket to the current sprint |
378
- | `ralphctl ticket list / show <id>` | Inspect tickets |
379
- | `ralphctl ticket remove <id>` | Remove a ticket from a draft sprint |
380
- | `ralphctl task list / show <id>` | Inspect tasks (planning generates them) |
381
- | `ralphctl task unblock <id>` | Reset a blocked task to `todo` |
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` |
382
388
 
383
389
  ### Sprint Lifecycle
384
390
 
@@ -390,11 +396,11 @@ readiness / create sprint) stay TUI-only by design. The CLI exposes inspection +
390
396
 
391
397
  ### Export & PR
392
398
 
393
- | Command | Description |
394
- | ---------------------------------------------------------------------- | -------------------------------------------------------------- |
395
- | `ralphctl export-requirements --sprint <id> --output <path>` | Render approved-ticket requirements to markdown |
396
- | `ralphctl export-context --sprint <id> --project <id> --output <path>` | Render harness context (sprint + project + tasks) to markdown |
397
- | `ralphctl create-pr --sprint <id> [--base <branch>] [--draft]` | Open a PR/MR via `gh` or `glab`, persist the URL on the sprint |
399
+ | Command | Description |
400
+ | -------------------------------------------------------------------------- | -------------------------------------------------------------- |
401
+ | `ralphctl export-requirements [--sprint <id>] --output <path>` | Render approved-ticket requirements to markdown |
402
+ | `ralphctl export-context [--sprint <id>] [--project <id>] --output <path>` | Render harness context (sprint + project + tasks) to markdown |
403
+ | `ralphctl create-pr --sprint <id> [--base <branch>] [--draft]` | Open a PR/MR via `gh` or `glab`, persist the URL on the sprint |
398
404
 
399
405
  ### Maintenance
400
406
 
@@ -420,14 +426,15 @@ Run `ralphctl <command> --help` for flag-level detail.
420
426
  | [Migration](./MIGRATION.md) | Per-version upgrade context for big version jumps |
421
427
  | [Changelog](./CHANGELOG.md) | Version history |
422
428
 
423
- **Blog posts:** [Building ralphctl](https://lukasgrigis.dev/blog/building-ralphctl) (
424
- backstory) | [From task CLI to ralph harness](https://lukasgrigis.dev/blog/ralphctl-agent-harness/) (evaluator
425
- 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)
426
433
 
427
- **Further reading:
428
- ** [Harness Engineering for Coding Agent Users](https://martinfowler.com/articles/harness-engineering.html) — Martin
429
- Fowler (April 2026) | [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) —
430
- 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
431
438
 
432
439
  ---
433
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
+ ```