@wnzzer/tendly 0.0.0-stage → 0.1.75

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wnzzer
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 CHANGED
@@ -1,3 +1,185 @@
1
- # Temporary Holding Version
1
+ <p align="center">
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/banner-dark.png">
4
+ <img src="docs/assets/banner-light.png" alt="Tendly: one canvas for the official Claude Code and Codex CLIs, on your own machine." width="100%">
5
+ </picture>
6
+ </p>
2
7
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
8
+ <p align="center">
9
+ <a href="https://github.com/wnzzer/tendly/actions/workflows/check.yml"><img src="https://img.shields.io/github/actions/workflow/status/wnzzer/tendly/check.yml?branch=main&style=flat-square&label=CI&color=0f7f70" alt="CI status"></a>
10
+ <a href="https://github.com/wnzzer/tendly/releases"><img src="https://img.shields.io/github/v/release/wnzzer/tendly?style=flat-square&label=release&color=0f7f70" alt="Latest release"></a>
11
+ <a href="https://www.npmjs.com/package/@wnzzer/tendly"><img src="https://img.shields.io/npm/v/%40wnzzer%2Ftendly?style=flat-square&label=npm&color=0f7f70" alt="npm version"></a>
12
+ <img src="https://img.shields.io/badge/node-%E2%89%A5%2024-0f7f70?style=flat-square" alt="Node.js 24 or newer">
13
+ <img src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-7760b5?style=flat-square" alt="Platforms: macOS, Linux and Windows">
14
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-7760b5?style=flat-square" alt="License: MIT"></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <a href="#quick-start">Quick start</a> ·
19
+ <a href="#highlights">Highlights</a> ·
20
+ <a href="#how-it-works">How it works</a> ·
21
+ <a href="#documentation">Documentation</a> ·
22
+ <a href="README.zh-CN.md">简体中文</a>
23
+ </p>
24
+
25
+ <br>
26
+
27
+ Tendly is a browser workspace for the official **Claude Code** and **Codex** CLIs. It runs where your code lives and puts agent sessions, files, Git diffs and terminals on one canvas you can split and dock, from any browser, phone included.
28
+
29
+ It has no agent of its own: Codex runs through its official `app-server` and Claude Code through `stream-json`, so logins, models, hooks, `CLAUDE.md` and permission prompts stay native.
30
+
31
+ <p align="center">
32
+ <img src="docs/assets/screenshot-canvas.png" alt="The Tendly canvas: two agent sessions side by side, and Git changes with a diff bottom right." width="100%">
33
+ </p>
34
+
35
+ ## Highlights
36
+
37
+ <table>
38
+ <tr>
39
+ <td width="33%" valign="top">
40
+ <b>The real clients</b><br><br>
41
+ Every session is the <code>claude</code> or <code>codex</code> you already have installed. Sign-in, MCP servers, slash commands and permission prompts behave as in the terminal, and new models appear as soon as you upgrade the CLI.
42
+ </td>
43
+ <td width="33%" valign="top">
44
+ <b>Steer while it works</b><br><br>
45
+ <kbd>Enter</kbd> steers the running turn without stopping it, <kbd>Alt</kbd>+<kbd>Enter</kbd> queues the next turn, and <i>Interrupt and send</i> changes course.
46
+ </td>
47
+ <td width="33%" valign="top">
48
+ <b>Every project on one canvas</b><br><br>
49
+ Split, tab and dock sessions, files, diffs and terminals from different repositories. Closing a pane never ends its process, and the layout follows you to any browser.
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td width="33%" valign="top">
54
+ <b>One branch per session</b><br><br>
55
+ Give a session its own branch and it works in a Git worktree, so two agents can build two features at once.
56
+ </td>
57
+ <td width="33%" valign="top">
58
+ <b>Accounts and endpoints, kept apart</b><br><br>
59
+ Each session picks an official account, the host's sign-in, a custom gateway or an isolated client home, with remaining 5-hour and weekly quota at a glance. Hand a conversation from Claude Code to Codex, or back.
60
+ </td>
61
+ <td width="33%" valign="top">
62
+ <b>Any screen</b><br><br>
63
+ Splits fold into tabs when space runs out. On a phone you get a drawer sidebar, bottom-sheet menus and long-press for right-click.
64
+ </td>
65
+ </tr>
66
+ </table>
67
+
68
+ <br>
69
+
70
+ <p align="center">
71
+ <img src="docs/assets/screenshot-steer.png" alt="A steered message in the middle of a running turn, with the send menu open." width="70%">
72
+ &nbsp;
73
+ <img src="docs/assets/screenshot-mobile.png" alt="Tendly on a phone: the split folded into tabs and the composer." width="26%">
74
+ </p>
75
+ <p align="center">
76
+ <sub>Left: a steered message joins the running turn, with the send menu open. Right: the same canvas on a phone.</sub>
77
+ </p>
78
+
79
+ <table>
80
+ <tr>
81
+ <td width="33%"><img src="docs/assets/screenshot-accounts.png" alt="Official accounts with 5-hour and weekly quota rings."></td>
82
+ <td width="33%"><img src="docs/assets/screenshot-endpoints.png" alt="The endpoint menu: host sign-in, a team gateway or an isolated client home, and hand-off to Codex."></td>
83
+ <td width="33%"><img src="docs/assets/screenshot-models.png" alt="The model menu in the message box."></td>
84
+ </tr>
85
+ <tr>
86
+ <td align="center"><sub>Official accounts, with 5-hour and weekly quota</sub></td>
87
+ <td align="center"><sub>Endpoints: host sign-in, gateway or isolated home</sub></td>
88
+ <td align="center"><sub>Model and thinking depth from the message box</sub></td>
89
+ </tr>
90
+ </table>
91
+
92
+ <details>
93
+ <summary><b>All features</b></summary>
94
+ <br>
95
+
96
+ **Canvas**: recursive splits, drag-to-edge docking, tabs and `1:1` / `2×2` / `1:2:1` presets; each file and Git pane stays bound to its repository; layouts saved on the server; right-click menus throughout.
97
+
98
+ **Agent sessions**: structured view with grouped tool cards, native approval and question cards, a context-usage ring and turn status. Model, thinking depth, permission mode and endpoint are switchable from the message box (or type any model ID). Resume native Claude Code and Codex history per workspace. File references such as `src/app.ts:42` open at that line. Images open in a lightbox; tables and code render properly. *Interrupt* and *End session* are separate, and input is never replayed after a disconnect. Sessions can be archived, multi-selected and deleted, and temporary sessions handle throwaway questions.
99
+
100
+ **Files and Git**: file tree and editor that follow changes on disk live; `.gitignore`-aware search; `@path` completion; conflict-checked saves; Markdown, image, video, audio and PDF previews. The Git pane covers status, diff, stage, discard and commit, plus branches and worktrees.
101
+
102
+ **Accounts and environment**: official account sign-in and quota; import the host's configuration or create isolated endpoint profiles; per-session environment variables with secret references; per-client defaults stored on the server.
103
+
104
+ **Host and appearance**: CPU and memory in the status bar; English and Chinese UI; light and dark with three palettes, separate interface and conversation fonts, and a text size.
105
+
106
+ </details>
107
+
108
+ ## Quick start
109
+
110
+ Requires Node.js 24+ and [Claude Code](https://www.npmjs.com/package/@anthropic-ai/claude-code) and/or [Codex](https://www.npmjs.com/package/@openai/codex) on the same machine.
111
+
112
+ ```bash
113
+ npm install -g @wnzzer/tendly
114
+ tendly # starts in the background → http://127.0.0.1:28789/
115
+ ```
116
+
117
+ Then **pick a workspace** (any directory on the host), reuse your sign-in from *Settings → Official accounts → Import existing configuration*, and **create a session** or **load an existing one**.
118
+
119
+ Prebuilt for macOS (arm64, x64), Linux (x64, arm64, static musl) and Windows (x64), with no postinstall step. Other platforms can [build from source](docs/development.md). On Windows, terminals open PowerShell (`TENDLY_SHELL` picks another shell).
120
+
121
+ | Command | Description |
122
+ | --- | --- |
123
+ | `tendly` / `tendly --lan` | Start in the background, on loopback or on every interface |
124
+ | `tendly status` · `logs` | URL, access token and server log |
125
+ | `tendly restart` · `stop` | Restart or stop the background server |
126
+ | `tendly update` · `--check` | Install the latest npm release (or only check); Settings → Updates does the same |
127
+ | `tendly serve` | Run in the foreground, for systemd or another supervisor |
128
+
129
+ ## Configuration and remote access
130
+
131
+ State lives in `~/.tendly/` (SQLite, settings, logs), with no telemetry. Settings are read from `config.toml` there, and matching `TENDLY_*` environment variables win:
132
+
133
+ ```toml
134
+ lan = true # same as --lan
135
+ port = 28789 # or addr = "192.168.0.9:28789"
136
+ token = "..." # TENDLY_TOKEN
137
+ allowed-origins = ["https://dock.example.com"]
138
+ ```
139
+
140
+ To reach it from another device, prefer **SSH forwarding** (`ssh -L 28789:127.0.0.1:28789 user@server`). `--lan` is plain HTTP for trusted networks only, and an **HTTPS reverse proxy** must keep `Host` and WebSocket upgrades. See [Configuration](docs/configuration.md) and [remote access](docs/security.md#private-remote-access).
141
+
142
+ > [!WARNING]
143
+ > Tendly is for **a single trusted user**. Anyone who can reach it has your user's permissions, and `claude` / `codex` run **unsandboxed**. Read [Security and boundaries](docs/security.md) before exposing it beyond localhost.
144
+
145
+ ## How it works
146
+
147
+ ```mermaid
148
+ flowchart LR
149
+ browser["<b>Browser</b><br/>Vue 3 canvas<br/>sessions · files · Git · terminals"]
150
+ server["<b>tendly-server</b> · Rust<br/>workspaces · files · Git<br/>auth · PTY supervisor"]
151
+ db[("SQLite<br/>~/.tendly")]
152
+ bridge["<b>Native bridge</b> · Node<br/>JSONL"]
153
+ claude["claude<br/>stream-json"]
154
+ codex["codex<br/>app-server"]
155
+ shell["Host shell"]
156
+
157
+ browser <-- "HTTP + WebSocket<br/>same origin" --> server
158
+ server --- db
159
+ server --> shell
160
+ server <--> bridge
161
+ bridge <--> claude
162
+ bridge <--> codex
163
+ ```
164
+
165
+ The Rust server handles the protocol, auth, persistence and process supervision, and runs no agent loop itself. The Node bridge maps each client's official interface to session events.
166
+
167
+ ## Documentation
168
+
169
+ [Configuration](docs/configuration.md) · [Endpoint profiles](docs/endpoint-profiles.md) · [Official accounts](docs/official-accounts.md) · [Sessions and canvas](docs/sessions-and-canvas.md) · [Structured agent UI](docs/structured-agent-ui.md) · [Agent tools](docs/agent-tools.md) · [Security](docs/security.md) · [Permission boundary](docs/permission-boundary.md) · [API](docs/api.md) · [Architecture](docs/architecture.md) · [Upgrading](docs/settings-update.md) · [Development](docs/development.md)
170
+
171
+ ## Development
172
+
173
+ Requires Rust 1.89+, Node.js 24+ and pnpm 10.30.3.
174
+
175
+ ```bash
176
+ pnpm install --frozen-lockfile
177
+ pnpm run dev # → http://127.0.0.1:5173/
178
+ pnpm run check && cargo test --workspace
179
+ ```
180
+
181
+ See [Development](docs/development.md) for the full check list and repository layout.
182
+
183
+ ## License
184
+
185
+ [MIT](LICENSE). Third-party material is listed in [third-party notices](docs/third-party-notices.md). Claude Code and Codex are products of Anthropic and OpenAI respectively. Tendly is an independent project and is not affiliated with or endorsed by either company.
@@ -0,0 +1,72 @@
1
+ # Third-party brand vectors
2
+
3
+ Claude asterisk and OpenAI knot paths are sourced from `@lobehub/icons-static-svg@1.95.0` ([LobeHub Icons](https://github.com/lobehub/lobe-icons)). Codex is identified with the OpenAI mark **and the Codex text label**; this does not claim a distinct official Codex logo or any endorsement. Pi's mark is the shape of the logo pi.dev publishes (`https://pi.dev/logo-auto.svg`), redrawn in one colour at icon size. Brand trademarks remain their owners' property.
4
+
5
+ MIT License
6
+
7
+ Copyright (c) 2023 LobeHub
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+
27
+
28
+ # Symbols Nerd Font Mono
29
+
30
+ `apps/web/src/assets/fonts/symbols-nerd-font-mono.woff2` is `SymbolsNerdFontMono-Regular.ttf` from [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts) v3.5.1 (`NerdFontsSymbolsOnly`), converted to WOFF2 without other changes. It is used only as a fallback font for shell-prompt icons in the terminal pane.
31
+
32
+ The patcher and font are MIT licensed (below). The glyphs come from the icon sets listed here, each under its own license:
33
+
34
+ | Icon set name | upstream | version | license |
35
+ |------------------------|-------------------------------------------------------|-----------------|-------------|
36
+ | Codicons | https://github.com/microsoft/vscode-codicons | 0.0.45 | CC BY 4.0 |
37
+ | Devicons | https://github.com/devicons/devicon | 2.17.0 | MIT |
38
+ | extraglyphs | https://github.com/source-foundry/Hack | - | MIT |
39
+ | Font Awesome | https://github.com/FortAwesome/Font-Awesome | 6.5.1 | CC BY 4.0 |
40
+ | Font Awesome Extension | https://github.com/AndreLZGava/font-awesome-extension | 0.0.3 | MIT |
41
+ | Font Logos | https://github.com/lukas-w/font-logos | 1.3.0 | unlicensed |
42
+ | MaterialDesign | https://github.com/Templarian/MaterialDesign-Font | Oct 6, 2022 | Apache 2.0 |
43
+ | Octicons | https://github.com/primer/octicons | 18.3.0 | MIT |
44
+ | Seti and original | https://github.com/jesseweed/seti-ui | 0.8.1 | MIT |
45
+ | Pomicons | https://github.com/gabrielelana/pomicons | 1.001 | OFL 1.1 RFN |
46
+ | Powerline Extra | https://github.com/ryanoasis/powerline-extra-symbols | 1.200 | MIT |
47
+ | Powerline Symbols | https://github.com/powerline/powerline | 1.000 (ca 2013) | MIT |
48
+ | Power Symbols IEC | https://github.com/jloughry/Unicode | Feb 2015 | MIT |
49
+ | Weather Icons | https://github.com/erikflowers/weather-icons | 2.0.10 (1.100) | OFL 1.1 |
50
+
51
+
52
+ The MIT License (MIT)
53
+
54
+ Copyright (c) 2014 Ryan L McIntyre
55
+
56
+ Permission is hereby granted, free of charge, to any person obtaining a copy
57
+ of this software and associated documentation files (the "Software"), to deal
58
+ in the Software without restriction, including without limitation the rights
59
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
60
+ copies of the Software, and to permit persons to whom the Software is
61
+ furnished to do so, subject to the following conditions:
62
+
63
+ The above copyright notice and this permission notice shall be included in all
64
+ copies or substantial portions of the Software.
65
+
66
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
67
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
68
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
69
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
70
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
71
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
72
+ SOFTWARE.
package/bin/tendly.js ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+ // Entry point for `@wnzzer/tendly`. The real program is a Rust binary that
3
+ // ships in a per-platform package; npm installs only the one matching this
4
+ // machine, via the `os`/`cpu` fields on those packages. This file finds it and
5
+ // hands over.
6
+ //
7
+ // CommonJS on purpose: `require.resolve` is how a sibling optional dependency
8
+ // is located, and the package deliberately declares no `type`, so `.js`/`.cjs`
9
+ // here is CJS regardless of what any parent directory says.
10
+ 'use strict';
11
+
12
+ const { spawn } = require('node:child_process');
13
+ const path = require('node:path');
14
+
15
+ // Keys are `${process.platform}-${process.arch}`, which is what npm itself
16
+ // matches `os`/`cpu` against, so this table and the published packages cannot
17
+ // disagree about what a platform is called.
18
+ const PACKAGES = {
19
+ 'darwin-arm64': '@wnzzer/tendly-darwin-arm64',
20
+ 'darwin-x64': '@wnzzer/tendly-darwin-x64',
21
+ 'linux-x64': '@wnzzer/tendly-linux-x64',
22
+ 'linux-arm64': '@wnzzer/tendly-linux-arm64',
23
+ 'win32-x64': '@wnzzer/tendly-win32-x64',
24
+ };
25
+
26
+ const BINARY = process.platform === 'win32' ? 'tendly-server.exe' : 'tendly-server';
27
+
28
+ function fail(message) {
29
+ process.stderr.write(`tendly: ${message}\n`);
30
+ process.exit(1);
31
+ }
32
+
33
+ function locate() {
34
+ const key = `${process.platform}-${process.arch}`;
35
+ const pkg = PACKAGES[key];
36
+ if (!pkg) {
37
+ fail(
38
+ `no prebuilt binary for ${key}.\n` +
39
+ ` Supported: ${Object.keys(PACKAGES).join(', ')}.\n` +
40
+ ' Build from source instead: https://github.com/wnzzer/tendly',
41
+ );
42
+ }
43
+ // Resolve the manifest rather than the binary: a package.json is resolvable
44
+ // whatever the file layout, and the error it throws names the missing
45
+ // package instead of a path inside it.
46
+ let manifest;
47
+ try {
48
+ manifest = require.resolve(`${pkg}/package.json`);
49
+ } catch {
50
+ fail(
51
+ `${pkg} is not installed.\n` +
52
+ ' It is an optional dependency, so npm skips it silently when the\n' +
53
+ ' install ran on a different platform or with a lockfile from one.\n' +
54
+ ` Reinstall on this machine, or add it directly: npm i ${pkg}`,
55
+ );
56
+ }
57
+ return path.join(path.dirname(manifest), 'bin', BINARY);
58
+ }
59
+
60
+ const child = spawn(locate(), process.argv.slice(2), { stdio: 'inherit' });
61
+
62
+ // A terminal delivers Ctrl+C to the whole foreground group, so the server
63
+ // already sees it. Forwarding covers the other caller — a process manager
64
+ // signalling this pid alone, which would otherwise leave the server orphaned.
65
+ const FORWARDED = ['SIGINT', 'SIGTERM', 'SIGHUP', 'SIGQUIT'];
66
+ for (const signal of FORWARDED) {
67
+ process.on(signal, () => {
68
+ if (child.exitCode === null && child.signalCode === null) child.kill(signal);
69
+ });
70
+ }
71
+
72
+ child.on('error', (error) => fail(`could not start the server: ${error.message}`));
73
+ child.on('exit', (code, signal) => {
74
+ // Report a signalled death as a shell does, so `$?` still distinguishes
75
+ // "killed" from "exited with that number".
76
+ process.exit(signal ? 128 + (require('node:os').constants.signals[signal] ?? 0) : (code ?? 0));
77
+ });
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@wnzzer/tendly",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.75",
4
+ "description": "Remote multi-agent development workspace for the official Claude Code and Codex CLIs",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/wnzzer/tendly",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/wnzzer/tendly.git"
10
+ },
11
+ "engines": {
12
+ "node": ">=20"
13
+ },
14
+ "keywords": [
15
+ "claude-code",
16
+ "codex",
17
+ "agent",
18
+ "workspace",
19
+ "cli"
20
+ ],
21
+ "bin": {
22
+ "tendly": "bin/tendly.js"
23
+ },
24
+ "optionalDependencies": {
25
+ "@wnzzer/tendly-darwin-arm64": "0.1.75",
26
+ "@wnzzer/tendly-darwin-x64": "0.1.75",
27
+ "@wnzzer/tendly-linux-x64": "0.1.75",
28
+ "@wnzzer/tendly-linux-arm64": "0.1.75",
29
+ "@wnzzer/tendly-win32-x64": "0.1.75"
30
+ },
31
+ "files": [
32
+ "bin/",
33
+ "LICENSE",
34
+ "THIRD-PARTY-NOTICES.md",
35
+ "README.md"
36
+ ]
37
+ }