icopilot 2.2.1 → 2.3.2

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,214 +1,372 @@
1
- # iCopilot
1
+ <h1 align="center">
2
+ <img src="https://raw.githubusercontent.com/i4Edu/icli/main/docs/screenshots/repl.svg" alt="" width="1" height="1">
3
+ iCopilot · icli
4
+ </h1>
2
5
 
3
- A terminal-native, agentic CLI assistant — fully replicating and enhancing
4
- the modern GitHub Copilot CLI experience, powered exclusively by the
5
- **GitHub Models API**.
6
+ <p align="center">
7
+ <strong>Terminal-native agentic AI assistant powered by GitHub Models</strong><br>
8
+ <em>Interactive REPL · Plan Mode · Autopilot · Multi-Agent · IDE Bridge · API Server</em>
9
+ </p>
6
10
 
7
- **Version 2.0** — The Complete Agentic OS.
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/icopilot"><img src="https://img.shields.io/npm/v/icopilot?color=0078d4&label=npm&style=flat-square" alt="npm"></a>
13
+ <a href="https://www.npmjs.com/package/icopilot"><img src="https://img.shields.io/npm/dm/icopilot?color=28a745&style=flat-square" alt="downloads"></a>
14
+ <img src="https://img.shields.io/badge/node-%3E%3D18.17-brightgreen?style=flat-square" alt="node">
15
+ <img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="license">
16
+ </p>
17
+
18
+ ---
19
+
20
+ ## Screenshots
8
21
 
9
22
  <p align="center">
10
- <img src="./docs/screenshots/repl.svg" alt="iCopilot REPL with streaming response, shell proposal, and file write" width="820">
23
+ <img src="./docs/screenshots/repl.svg" alt="iCopilot interactive REPL" width="820">
24
+ <br><em>Interactive REPL with live streaming responses and tool confirmations</em>
11
25
  </p>
12
26
 
13
- ## Features
14
-
15
- ### Core Experience
16
- - 🗣️ **Interactive REPL** with live, streaming markdown responses
17
- - 🧭 **Plan Mode** — produces step lists for review before any change
18
- - ⚡ **One-shot mode** — `icopilot -p "..."` for scripting / piping
19
- - 📎 **`@file` references** auto-inject file contents into context
20
- - 🛠️ **Agentic tools** shell + file edits gated by `[Y/n]` confirmation
21
- - 🧠 **Token budget** tracker with auto-suggest `/compact`
22
- - 💾 **Session persistence** — resume via `/sessions`
23
- - 🪶 **Graceful SIGINT** — Ctrl-C aborts a stream, never the app
24
- - 🔁 **HTTP 429 backoff** with cooldown banners
25
-
26
- ### Multi-Agent Orchestration (v1.4)
27
- - 🤖 **Parallel agent runner** — concurrent sub-agent execution with `&` syntax
28
- - 🧩 **Custom agent definitions** — `.icopilot/agents/*.yaml`
29
- - 🎯 **Agent routing** — automatic delegation by query type
30
- - 🔄 **Tool retry logic** — automatic retry on transient failures
31
-
32
- ### Copilot Spaces & Teams (v1.5)
33
- - 📦 **Project spaces** — isolated context sandboxes per project/branch
34
- - 🤝 **Session handoff** — export state for another developer
35
- - 🧠 **Team memory** — shared `.icopilot/team-memory.md`
36
- - 📂 **Smart file selection** — model-driven relevant file picking
37
- - 🌿 **Git-aware context** — auto-include recently modified files
38
-
39
- ### IDE-Grade Intelligence (v1.6)
40
- - 🔍 **Symbol index** — project-wide function/class/type table
41
- - 🧭 **Cross-file navigation** — go-to-definition, find-references
42
- - ✏️ **Multi-file atomic edits** — N-file changes reviewed holistically
43
- - 🧪 **Code generation with tests** — auto-generate test file for new modules
44
- - 👁️ **Live error watching** — monitor build output, auto-suggest fixes
45
- - 🕵️ **Stack trace analysis** — AI-powered root cause diagnosis
46
-
47
- ### Workflow Automation (v1.7)
48
- - ⚙️ **Workflow engine** — `.icopilot/workflows/*.yaml` with conditionals and loops
49
- - 🚀 **GitHub Actions helper** — generate CI YAML from natural language
50
- - 🪝 **Pre-commit hook** — `/review` + `/security` before commit
51
- - 📁 **File watch triggers** — run workflow on file change
52
- - 📦 **Release automation** — version bump → changelog → tag → publish
53
-
54
- ### Knowledge & Learning (v1.8)
55
- - 📚 **Project RAG** — chunk and index all docs for retrieval
56
- - 📝 **Doc generation** — JSDoc/docstring from code
57
- - 📖 **README generation** — scaffold from project analysis
58
- - 🏗️ **Architecture diagrams** — mermaid from code relationships
59
- - 🎨 **Style learning** — adapt to user's coding patterns
60
- - 💡 **Correction memory** — remember and apply user corrections
61
- - 📏 **Project conventions** — learn and enforce patterns
62
-
63
- ### Enterprise & Security (v1.9)
64
- - 🔐 **Role-based access** — restrict tools by user role
65
- - 📋 **Audit logging** — full trail of all tool executions
66
- - 🌐 **Proxy support** — HTTP/HTTPS/SOCKS5
67
- - 🏠 **Air-gapped mode** — local models (Ollama, vLLM)
68
- - 🛡️ **Content filtering** — prevent PII in prompts
69
- - 🗑️ **Retention policies** — auto-delete after N days
70
-
71
- ### The Complete Agentic OS (v2.0)
72
- - 🎯 **Goal-driven development** — describe feature → implement end-to-end
73
- - 🔧 **Self-healing builds** — detect failure → diagnose → fix → retry
74
- - 🧪 **TDD agent** — write tests first, implement until green
75
- - 🌐 **Multi-repo orchestration** — coordinate across repositories
76
- - 🏪 **Plugin marketplace** — `icopilot install <plugin>`
77
- - 🔌 **Custom model providers** — any OpenAI-compatible endpoint
78
- - 🖥️ **IDE bridge** — bidirectional VS Code / Neovim communication
79
- - 🌍 **API server mode** — expose as HTTP API (`--serve`)
80
- - 🐳 **Container sandbox** — Docker-based isolated execution
81
- - ☁️ **Cloud sessions** — run in cloud, access from any terminal
82
-
83
- ### Slash Commands
84
-
85
- ```
86
- /help /clear /model /cwd /diff /context /compact /sessions /export
87
- /commit /pr /review /issue /branch /plan /lint /test /security
88
- /agent /space /workflow /actions /release /doc /readme /diagram
89
- /rag /conventions /corrections /audit /proxy /provider /goal /heal
90
- /tdd /repo /serve /exit
91
- ```
27
+ <p align="center">
28
+ <img src="./docs/screenshots/help.svg" alt="icopilot --help" width="820">
29
+ <br><em>Full CLI reference — <code>icopilot --help</code> or <code>icli --help</code></em>
30
+ </p>
31
+
32
+ <p align="center">
33
+ <img src="./docs/screenshots/oneshot.svg" alt="One-shot mode" width="820">
34
+ <br><em>One-shot mode: pipe-friendly, scriptable AI answers</em>
35
+ </p>
36
+
37
+ <p align="center">
38
+ <img src="./docs/screenshots/missing-token.svg" alt="Friendly auth error" width="820">
39
+ <br><em>Actionable error messages — never silent failures</em>
40
+ </p>
41
+
42
+ ---
92
43
 
93
44
  ## Install
94
45
 
95
46
  ```bash
96
- npm install
97
- npm run build
98
- npm link # exposes `icopilot` / `icli` globally
47
+ npm install -g icopilot
99
48
  ```
100
49
 
101
- ## Auth
50
+ Both `icopilot` and `icli` are installed as identical aliases:
51
+
52
+ ```
53
+ $ icopilot --version
54
+ 2.2.1
55
+
56
+ $ icli --version
57
+ 2.2.1
58
+ ```
102
59
 
103
- Set a GitHub PAT with `models:read`:
60
+ **Requirements:** Node.js 18.17
61
+
62
+ ---
63
+
64
+ ## Authentication
65
+
66
+ Create a GitHub Personal Access Token with **`models:read`** scope at
67
+ → [github.com/settings/tokens](https://github.com/settings/tokens)
104
68
 
105
69
  ```bash
106
70
  # bash / zsh
107
- export GITHUB_TOKEN=ghp_xxx...
71
+ export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
108
72
 
109
73
  # PowerShell
110
- $env:GITHUB_TOKEN = "ghp_xxx..."
74
+ $env:GITHUB_TOKEN = "ghp_xxxxxxxxxxxx"
75
+
76
+ # Persist in ~/.icopilotrc.json
77
+ echo '{ "token": "ghp_xxxxxxxxxxxx" }' > ~/.icopilotrc.json
111
78
  ```
112
79
 
113
- Optional:
80
+ ---
81
+
82
+ ## Quick Start
114
83
 
115
84
  ```bash
116
- ICOPILOT_MODEL=gpt-4o # default model
117
- ICOPILOT_ENDPOINT=https://models.inference.ai.azure.com
85
+ # Start interactive REPL
86
+ icopilot
87
+
88
+ # One-shot — answer a question and exit
89
+ icopilot -p "What does @src/index.ts export?"
90
+
91
+ # Plan mode — AI explains steps before making changes
92
+ icopilot --plan
93
+
94
+ # Autopilot — no confirmations, fully autonomous
95
+ icopilot --autopilot -p "Add error handling to all API calls"
96
+
97
+ # Use a specific model
98
+ icopilot --model gpt-4o
99
+
100
+ # Use local Ollama
101
+ icopilot --local
102
+
103
+ # Start HTTP API server
104
+ icopilot --serve 3000
105
+
106
+ # icli works exactly the same
107
+ icli --plan
108
+ icli -p "Explain this codebase"
118
109
  ```
119
110
 
120
- ## Usage
111
+ ---
121
112
 
122
- ```bash
123
- icopilot # interactive REPL
124
- icopilot -p "Explain @src/index.ts" # one-shot
125
- icopilot --model gpt-4o # pin model
126
- icopilot --plan # start in plan mode
127
- icopilot --sandbox # restrict tools to cwd
128
- icopilot --local # use local model (Ollama)
129
- icopilot --provider my-provider # custom model provider
130
- icopilot --serve 3000 # start as HTTP API server
131
- icopilot --verbose --log-level debug # structured logs to stderr
132
- icopilot --theme light # light / dark / none
113
+ ## CLI Reference
114
+
115
+ ```
116
+ Usage: icopilot [options] [command]
117
+
118
+ Options:
119
+ -p, --prompt <text> one-shot mode: run a single prompt and exit
120
+ -m, --model <name> model id (default: gpt-4o-mini)
121
+ --local use local Ollama provider
122
+ --provider <name> github | ollama | vllm | lmstudio | openai | anthropic
123
+ --base-url <url> override provider base URL
124
+ --plan start in Plan Mode
125
+ --autopilot run in autopilot mode (no confirmations)
126
+ --architect planner + coder dual-agent mode
127
+ --tui full-screen TUI interface
128
+ --cwd <path> set working directory
129
+ -v, --verbose enable verbose debug logging
130
+ --sandbox restrict tools to current working directory
131
+ --log-level <level> debug | info | warn | error
132
+ --no-color disable colors
133
+ --theme <name> auto | light | dark | none
134
+ --policy <file> load a RBAC policy file
135
+ --json output responses as JSON
136
+ -q, --quiet suppress banners
137
+ -y, --yes auto-approve non-critical confirmations
138
+ --serve [port] start HTTP API server
139
+ --browser [port] start API server and open browser UI
140
+ --perf-trace print cold-start timing
141
+
142
+ Commands:
143
+ install <plugin> install a marketplace plugin
144
+ hook [subcommand] manage the git pre-commit hook
133
145
  ```
134
146
 
135
- <p align="center">
136
- <img src="./docs/screenshots/help.svg" alt="icopilot --help" width="820">
137
- </p>
147
+ ---
148
+
149
+ ## Slash Commands (inside the REPL)
138
150
 
139
- See [`docs/config.md`](./docs/config.md) for the full config-file format,
140
- [`docs/sessions.md`](./docs/sessions.md) for session/memory usage, and
141
- [`docs/mcp.md`](./docs/mcp.md) for MCP server integration.
151
+ Type `/` inside the REPL to trigger any command:
142
152
 
143
- Inside the REPL:
153
+ | Category | Commands |
154
+ |---|---|
155
+ | **Navigation** | `/help` `/clear` `/exit` `/quit` |
156
+ | **Models** | `/model <id>` `/provider <name>` `/reasoning` `/think-tokens` |
157
+ | **Context** | `/context` `/usage` `/compact` `/pin` `/unpin` `/read-only` `/cwd` |
158
+ | **Files** | `/diff` `/changes` `/edit-format` `/editor` |
159
+ | **Session** | `/sessions` `/export` `/share` `/handoff` `/copy` `/paste` `/copy-context` |
160
+ | **Git** | `/commit` `/pr` `/review` `/diff-review` `/issue` `/branch` `/git-log` |
161
+ | **Agents** | `/plan` `/autopilot` `/goal` `/heal` `/tdd` `/architect` |
162
+ | **Code Intel** | `/index` `/search` `/goto` `/refs` `/dead-code` `/error-watch` `/stack-trace` |
163
+ | **Automation** | `/workflow` `/actions` `/release` `/schedule` `/every` `/after` `/trigger` |
164
+ | **Knowledge** | `/rag` `/doc` `/diagram` `/readme` `/conventions` `/corrections` `/memory` `/style` |
165
+ | **Teams** | `/space` `/team-memory` `/repo` `/multi` |
166
+ | **System** | `/settings` `/profile` `/role` `/sandbox` `/serve` `/acp` `/cloud` `/cloud-routine` |
167
+ | **Misc** | `/tokens` `/cost` `/stats` `/metrics` `/snippets` `/feedback` `/voice` `/web` |
144
168
 
169
+ ---
170
+
171
+ ## Modes
172
+
173
+ ### Interactive REPL
174
+ ```bash
175
+ icopilot # or: icli
145
176
  ```
146
- > /help
147
- > /model gpt-4o-mini
148
- > Refactor @src/api/github-models.ts to add caching
149
- > /goal "Add user authentication"
150
- > /heal
151
- > /tdd "Create a rate limiter"
177
+ The default mode. Streams markdown responses, shows tool proposals with `[Y/n]` confirmations,
178
+ tracks token usage, and persists sessions automatically.
179
+
180
+ ```
181
+ > Refactor @src/api/github-models.ts to add retry logic
152
182
  > /review
153
183
  > /commit
154
- > /pr
155
- > /sessions
156
- > /export md
157
- > /exit
158
184
  ```
159
185
 
160
- ### When something goes wrong
186
+ ### Plan Mode
187
+ ```bash
188
+ icopilot --plan # or: icli --plan
189
+ ```
190
+ Before making any changes, the AI produces a numbered plan for your review. Approve each step
191
+ before it executes. Ideal for complex multi-file refactors.
161
192
 
162
- Errors are classified and re-rendered with actionable hints. For example,
163
- running without a token:
193
+ ### Autopilot
194
+ ```bash
195
+ icopilot --autopilot -p "Add input validation to all form handlers"
196
+ ```
197
+ Fully autonomous — the AI plans, implements, tests, and commits without prompts.
198
+ Use `--sandbox` to restrict filesystem access to `cwd`.
164
199
 
165
- <p align="center">
166
- <img src="./docs/screenshots/missing-token.svg" alt="Friendly missing-token error" width="820">
167
- </p>
200
+ ### Architect Mode
201
+ ```bash
202
+ icopilot --architect
203
+ ```
204
+ Dual-agent: a Planner agent produces a spec, then a Coder agent implements it step by step.
168
205
 
169
- ### Version
206
+ ### One-shot (scriptable)
207
+ ```bash
208
+ icopilot -p "What is the cyclomatic complexity of src/index.ts?"
209
+ icopilot -p "Explain @package.json" --json
210
+ git diff | icopilot -p "Summarize these changes"
211
+ ```
170
212
 
171
- <p align="center">
172
- <img src="./docs/screenshots/version.svg" alt="icopilot --version" width="520">
173
- </p>
213
+ ### API Server
214
+ ```bash
215
+ icopilot --serve 3000
216
+ # POST http://localhost:3000/v1/chat/completions
217
+ ```
218
+
219
+ ---
220
+
221
+ ## @file References
222
+
223
+ Mention any file with `@` to inject its content into context:
224
+
225
+ ```
226
+ > Review @src/auth/jwt.ts for security issues
227
+ > Compare @src/v1/api.ts and @src/v2/api.ts
228
+ > What changed in @package.json recently?
229
+ ```
230
+
231
+ Supports glob patterns: `@src/**/*.ts`
174
232
 
175
- > **About the screenshots.** They are deterministic SVG renderings of the
176
- > actual binary's output (ANSI colors preserved). Regenerate them after any
177
- > UX change with `npm run screenshots`.
233
+ ---
234
+
235
+ ## Configuration
236
+
237
+ **`~/.icopilotrc.json`** (user-level defaults):
238
+ ```json
239
+ {
240
+ "token": "ghp_...",
241
+ "defaultModel": "gpt-4o-mini",
242
+ "endpoint": "https://models.inference.ai.azure.com",
243
+ "theme": "auto",
244
+ "verbose": false,
245
+ "sandbox": false
246
+ }
247
+ ```
248
+
249
+ **Environment variables:**
250
+
251
+ | Variable | Description |
252
+ |---|---|
253
+ | `GITHUB_TOKEN` or `ICOPILOT_TOKEN` | API authentication token |
254
+ | `ICOPILOT_MODEL` | Default model ID |
255
+ | `ICOPILOT_ENDPOINT` | API endpoint override |
256
+ | `ICOPILOT_SESSION_DIR` | Custom session storage path |
257
+ | `ICOPILOT_THEME` | `auto` \| `light` \| `dark` \| `none` |
258
+ | `ICOPILOT_LOG_LEVEL` | `debug` \| `info` \| `warn` \| `error` |
259
+ | `ICOPILOT_SANDBOX` | `true` to restrict tools to cwd |
260
+
261
+ **Project memory** — `.icopilot/memory.md` (committed, shared)
262
+ **Global memory** — `~/.icopilot/memory.md` (personal, cross-project)
263
+
264
+ ---
265
+
266
+ ## Agentic Capabilities
267
+
268
+ ### Goal-Driven Development
269
+ Describe a feature at a high level — the AI breaks it down, implements it, runs tests, and iterates:
270
+ ```
271
+ > /goal "Add OAuth2 login with GitHub"
272
+ ```
273
+
274
+ ### Self-Healing Builds
275
+ ```
276
+ > /heal
277
+ ```
278
+ Detects build/test failures, diagnoses root cause, applies fixes, retries automatically.
279
+
280
+ ### TDD Agent
281
+ ```
282
+ > /tdd "Write a rate limiter with sliding window"
283
+ ```
284
+ Writes tests first, implements code until all tests pass.
285
+
286
+ ### Multi-File Atomic Edits
287
+ The AI can read, reason about, and edit N files in a single coherent operation — no context loss.
288
+
289
+ ### Pre-commit Hook
290
+ ```bash
291
+ icopilot hook install
292
+ ```
293
+ Runs `/review` and `/security` scan before every `git commit`.
294
+
295
+ ---
296
+
297
+ ## Model Support
298
+
299
+ | Provider | Models |
300
+ |---|---|
301
+ | **GitHub Models** (default) | `gpt-4o`, `gpt-4o-mini`, `o1`, `o1-mini`, `o3-mini`, `claude-3.5-sonnet`, `Llama-3.3-70B`, and more |
302
+ | **Ollama** | any locally-served model |
303
+ | **vLLM / LM Studio** | any OpenAI-compatible endpoint |
304
+ | **OpenAI** | direct API |
305
+ | **Anthropic** | direct API |
306
+ | **Custom** | any provider in `.icopilot/providers/*.yaml` |
307
+
308
+ Switch models at runtime:
309
+ ```
310
+ > /model gpt-4o
311
+ > /provider anthropic
312
+ ```
313
+
314
+ ---
315
+
316
+ ## Plugin System
317
+
318
+ ```bash
319
+ icopilot install <plugin-name> # install from marketplace
320
+ /plugins list # list installed plugins
321
+ /extension load ./my-plugin.js # load local extension
322
+ ```
323
+
324
+ ---
178
325
 
179
326
  ## Architecture
180
327
 
181
328
  ```
182
329
  src/
183
- ├── index.ts # entry / CLI flag parsing
184
- ├── config.ts # env + rc-file + runtime config
185
- ├── logger.ts # structured logging + secret redaction
186
- ├── api/github-models.ts # OpenAI-SDK client GitHub Models
187
- ├── session/ # history, persistence, multi-session, cloud sessions, handoff
188
- ├── context/ # @file parser, /compact, project memory, smart files, git/dep context
189
- ├── tools/ # shell, file ops, apply_patch, grep, glob, multi-edit, retry, policy
190
- ├── mcp/ # Model Context Protocol client + loader
191
- ├── commands/ # slash dispatcher, git autopilot, 40+ commands
192
- ├── agents/ # parallel runner, router, goal-driven, TDD, self-heal, multi-repo
193
- ├── intelligence/ # symbol index, navigation, error watch, stack trace, dead code
194
- ├── workflows/ # engine, file triggers, built-in workflows
195
- ├── knowledge/ # RAG, style learner, corrections, conventions
196
- ├── security/ # RBAC, audit, content filter, retention, proxy
197
- ├── providers/ # custom model providers, local models
198
- ├── plugins/ # marketplace, plugin loader
199
- ├── server/ # HTTP API server mode
200
- ├── bridge/ # IDE bridge (VS Code, Neovim)
201
- ├── sandbox/ # container-based execution
202
- ├── spaces/ # project spaces, space config
203
- ├── hooks/ # precommit, git hooks
204
- ├── ui/ # streaming markdown render, theme, prompt
205
- └── modes/ # interactive / plan / oneshot
206
- ```
207
-
208
- See [`roadmap.md`](./roadmap.md) for the version plan, [`TODO.md`](./TODO.md)
209
- for the implementation checklist, and [`CHANGELOG.md`](./CHANGELOG.md) for
210
- release notes.
330
+ ├── index.ts CLI entry, flag parsing
331
+ ├── config.ts env + rc-file + runtime config
332
+ ├── api/github-models.ts OpenAI-SDK GitHub Models
333
+ ├── session/ history, persistence, handoff, cloud
334
+ ├── context/ @file, /compact, memory, smart-files, git context
335
+ ├── tools/ shell, file ops, patch, grep, glob, multi-edit
336
+ ├── commands/ 60+ slash command handlers
337
+ ├── agents/ parallel runner, router, goal, TDD, self-heal
338
+ ├── intelligence/ symbol index, navigation, error watch, dead code
339
+ ├── workflows/ YAML engine, file triggers, built-ins
340
+ ├── knowledge/ RAG, style learner, corrections, conventions
341
+ ├── security/ RBAC, audit, content filter, retention, proxy
342
+ ├── providers/ custom providers, local models
343
+ ├── plugins/ marketplace, loader
344
+ ├── server/ HTTP API server
345
+ ├── bridge/ VS Code / Neovim IDE bridge
346
+ ├── sandbox/ container-based isolated execution
347
+ ├── spaces/ project spaces
348
+ ├── hooks/ pre-commit, git hooks
349
+ ├── ui/ streaming markdown, theme, prompt
350
+ └── modes/ interactive / plan / oneshot / TUI
351
+ ```
352
+
353
+ ---
354
+
355
+ ## Documentation
356
+
357
+ | Doc | Description |
358
+ |---|---|
359
+ | [`docs/config.md`](./docs/config.md) | Full config file reference |
360
+ | [`docs/sessions.md`](./docs/sessions.md) | Session management & memory |
361
+ | [`docs/mcp.md`](./docs/mcp.md) | MCP server integration |
362
+ | [`docs/api.md`](./docs/api.md) | HTTP API server reference |
363
+ | [`docs/teams-integration.md`](./docs/teams-integration.md) | Teams & spaces |
364
+ | [`docs/cloud-routines.md`](./docs/cloud-routines.md) | Scheduled cloud routines |
365
+ | [`CHANGELOG.md`](./CHANGELOG.md) | Release notes |
366
+ | [`roadmap.md`](./roadmap.md) | Version roadmap |
367
+
368
+ ---
211
369
 
212
370
  ## License
213
371
 
214
- MIT
372
+ MIT © [i4Edu](https://github.com/i4Edu)