@chorded/chord 0.0.0-stage → 0.54.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/LICENSE +21 -0
- package/README.md +173 -2
- package/bin/chord.js +39 -0
- package/package.json +34 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Igor Katsuba
|
|
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,174 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align="center">chord</h1>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>One terminal for every coding agent.</strong><br>
|
|
5
|
+
Claude Code, Codex, Gemini CLI, Cursor, OpenCode and 30 more, in one
|
|
6
|
+
keyboard-driven window, side by side, working as a team.
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/@chorded/chord"><img alt="npm" src="https://img.shields.io/npm/v/@chorded/chord?color=47e7a5&label=npm"></a>
|
|
11
|
+
<a href="https://github.com/IKatsuba/chord/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/IKatsuba/chord/actions/workflows/ci.yml/badge.svg"></a>
|
|
12
|
+
<a href="LICENSE"><img alt="MIT licence" src="https://img.shields.io/badge/licence-MIT-blue"></a>
|
|
13
|
+
<img alt="macOS and Linux" src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux-lightgrey">
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img src="docs/images/team.png" alt="chord handing an issue to a team: a lead, a tester on Claude and a coder on Codex, each with its state in the list under the prompt" width="900">
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
Claude Code's terminal interface is the best one there is for working with a
|
|
21
|
+
coding agent, and it only talks to Claude. chord is that interface for any
|
|
22
|
+
agent that speaks the [Agent Client Protocol](https://agentclientprotocol.com):
|
|
23
|
+
the same transcript, diffs, permission prompts, slash commands, `@` mentions
|
|
24
|
+
and plans, on whichever agent you start, and more than one of them at once.
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
npm install -g @chorded/chord
|
|
28
|
+
chord # Claude Code, here
|
|
29
|
+
chord codex # or any other agent
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Why chord
|
|
33
|
+
|
|
34
|
+
- **Any agent, one interface.** 35 agents out of the box, from the
|
|
35
|
+
[ACP Registry](https://agentclientprotocol.com) and their own CLIs. Switch
|
|
36
|
+
agents without relearning keys.
|
|
37
|
+
- **Agents that work together.** Open a second agent beside the one you talk
|
|
38
|
+
to, hand a job to a saved team, and watch each of them in a list under the
|
|
39
|
+
prompt. Messages go between them; permissions still come to you.
|
|
40
|
+
- **Every action has a key.** Nothing on screen needs a mouse. `?` lists them
|
|
41
|
+
all, and a keybindings file moves them.
|
|
42
|
+
- **Nothing to set up.** One binary, no account, no daemon. chord starts the
|
|
43
|
+
agent, keeps the session, and gives it back with `chord --continue`.
|
|
44
|
+
- **Open source.** MIT, built on [OpenTUI](https://github.com/anomalyco/opentui)
|
|
45
|
+
and the [ACP SDK](https://github.com/agentclientprotocol/typescript-sdk).
|
|
46
|
+
|
|
47
|
+
## A tour
|
|
48
|
+
|
|
49
|
+
### Diffs you can read
|
|
50
|
+
|
|
51
|
+
Edits arrive as numbered, highlighted diffs, folded until you want the whole
|
|
52
|
+
thing (`ctrl+o`).
|
|
53
|
+
|
|
54
|
+
<img src="docs/images/edit.png" alt="An Edit tool call drawn as a coloured diff" width="900">
|
|
55
|
+
|
|
56
|
+
### You stay in charge
|
|
57
|
+
|
|
58
|
+
Each permission the agent asks for is a choice under the transcript, answered
|
|
59
|
+
with a number or the arrows. `shift+tab` cycles the agent's permission modes.
|
|
60
|
+
|
|
61
|
+
<img src="docs/images/permission.png" alt="The permission prompt: Allow, Always allow, Deny" width="900">
|
|
62
|
+
|
|
63
|
+
### Many agents in one window
|
|
64
|
+
|
|
65
|
+
Up to nine sessions as tabs, each with its own agent, transcript and draft.
|
|
66
|
+
A tab in the background marks what it waits for, and `ctrl+x a` takes you
|
|
67
|
+
there.
|
|
68
|
+
|
|
69
|
+
<img src="docs/images/tabs.png" alt="Two tabs, claude waiting on a permission behind, codex in front" width="900">
|
|
70
|
+
|
|
71
|
+
### Subagents, folded
|
|
72
|
+
|
|
73
|
+
When the agent fans out, its subagents run as one tree with their latest call
|
|
74
|
+
each, and their full work is a key away.
|
|
75
|
+
|
|
76
|
+
<img src="docs/images/subagents.png" alt="Two subagents running in parallel under one block" width="900">
|
|
77
|
+
|
|
78
|
+
### Teams
|
|
79
|
+
|
|
80
|
+
Describe how you work and the agent proposes a team: a lead and its members,
|
|
81
|
+
each on the runtime, model and mode you want. Save it once, then hand it any
|
|
82
|
+
job with `/team run bugfix <job>`.
|
|
83
|
+
|
|
84
|
+
<img src="docs/images/proposal.png" alt="A proposed team as a table of agents, with a box asking where to save it" width="900">
|
|
85
|
+
|
|
86
|
+
### Pick up where you left off
|
|
87
|
+
|
|
88
|
+
`/resume` lists this directory's earlier sessions and saved windows; quit a
|
|
89
|
+
window of several tabs and chord prints the one command that brings them all
|
|
90
|
+
back.
|
|
91
|
+
|
|
92
|
+
<img src="docs/images/resume.png" alt="The resume picker listing earlier sessions" width="900">
|
|
93
|
+
|
|
94
|
+
## Install
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
npm install -g @chorded/chord # or bun, pnpm, yarn
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The package is a small shim around a prebuilt binary for macOS and Linux,
|
|
101
|
+
arm64 and x64; the macOS binaries are signed and notarised. `chord upgrade`
|
|
102
|
+
updates it through the package manager that installed it.
|
|
103
|
+
|
|
104
|
+
chord starts each agent for you (through `npx` or `uvx`, or the agent's own
|
|
105
|
+
CLI where it has one), so the agent's own login is all it needs: sign in to
|
|
106
|
+
Claude Code, Codex or Gemini as you normally would.
|
|
107
|
+
|
|
108
|
+
To build from source, with [Bun](https://bun.sh) 1.4.2 or newer:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
git clone https://github.com/IKatsuba/chord && cd chord
|
|
112
|
+
bun install
|
|
113
|
+
bun run compile --install # into ~/.local/bin/chord
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Use
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
chord # your default agent in this directory
|
|
120
|
+
chord gemini -C ~/src/app
|
|
121
|
+
chord agents # every agent chord can start, and whether it is installed
|
|
122
|
+
chord --continue # the latest session here, again
|
|
123
|
+
chord --resume # pick an earlier session or window
|
|
124
|
+
chord -p "Explain src/main.tsx" # one reply on stdout, for scripts
|
|
125
|
+
git diff | chord -p "Review this" --output-format json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Inside the window:
|
|
129
|
+
|
|
130
|
+
| Key | Does |
|
|
131
|
+
| ----------------- | -------------------------------------------- |
|
|
132
|
+
| `?` | every key, on an empty prompt |
|
|
133
|
+
| `/` | slash commands, chord's and the agent's |
|
|
134
|
+
| `@` | mention a file |
|
|
135
|
+
| `!` | run a shell command, its output for the agent |
|
|
136
|
+
| `shift+tab` | cycle the permission mode |
|
|
137
|
+
| `ctrl+o` | expand tool calls and subagents |
|
|
138
|
+
| `ctrl+x c` / `/new codex` | open another session as a tab |
|
|
139
|
+
| `ctrl+x 1`…`9` | go to a tab |
|
|
140
|
+
| `esc` | interrupt the turn |
|
|
141
|
+
|
|
142
|
+
Settings live in `~/.config/chord/settings.json` and the project's
|
|
143
|
+
`.chord/settings.json`: the default agent, each agent's model, effort and
|
|
144
|
+
mode, MCP servers, theme and notifications.
|
|
145
|
+
|
|
146
|
+
**[The guide](docs/guide.md)** has everything else: every flag, setting, key,
|
|
147
|
+
the team file format, chord's MCP tools for agents, and how sessions are
|
|
148
|
+
recorded.
|
|
149
|
+
|
|
150
|
+
## Supported agents
|
|
151
|
+
|
|
152
|
+
Claude Code, Codex, Gemini CLI, GitHub Copilot, Cursor, OpenCode, Cline, Qwen
|
|
153
|
+
Code, Kimi Code, Kiro, Goose, Junie, Factory Droid, Auggie, Kilo, Devin, fx
|
|
154
|
+
and more: `chord agents` prints the full list, and any other ACP agent runs
|
|
155
|
+
with `chord --agent-command "my-agent --acp"`.
|
|
156
|
+
|
|
157
|
+
## Contributing
|
|
158
|
+
|
|
159
|
+
Issues and pull requests are welcome. [CONTRIBUTING.md](CONTRIBUTING.md) has
|
|
160
|
+
how to run chord from source against its scripted test agent, the one check
|
|
161
|
+
every change passes, and how the code is written. Found a security issue?
|
|
162
|
+
See [SECURITY.md](SECURITY.md).
|
|
163
|
+
|
|
164
|
+
The screenshots above are chord itself, run against that test agent and
|
|
165
|
+
captured by `bun run screenshots`.
|
|
166
|
+
|
|
167
|
+
## Licence
|
|
168
|
+
|
|
169
|
+
chord's code is [MIT](LICENSE). The Chorded name and the chevron mark are
|
|
170
|
+
trademarks of Igor Katsuba and are not covered by the licence; a fork should
|
|
171
|
+
draw its own ([TRADEMARKS.md](TRADEMARKS.md)).
|
|
172
|
+
|
|
173
|
+
chord is the open sibling of [Chorded](https://chorded.app), a native macOS
|
|
174
|
+
workspace for agent sessions driven by key chords.
|
package/bin/chord.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// The `chord` command npm installs: it runs the binary of this machine's
|
|
3
|
+
// platform package with the same arguments and stdio, and leaves as the
|
|
4
|
+
// binary left. A Node script, because npm runs `bin` with the user's Node
|
|
5
|
+
// and the user need not have Bun.
|
|
6
|
+
const { spawn } = require("node:child_process");
|
|
7
|
+
|
|
8
|
+
const pkg = `@chorded/chord-${process.platform}-${process.arch}`;
|
|
9
|
+
let bin;
|
|
10
|
+
try {
|
|
11
|
+
bin = require.resolve(`${pkg}/bin/chord`);
|
|
12
|
+
} catch {
|
|
13
|
+
process.stderr.write(
|
|
14
|
+
`chord: no ${pkg} is installed. chord runs on macOS and Linux, arm64 and x64; reinstall @chorded/chord on one of those, with optional dependencies.\n`,
|
|
15
|
+
);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// spawn, not spawnSync: a blocked event loop cannot forward a signal, and a
|
|
20
|
+
// SIGTERM to this process alone would leave the binary running.
|
|
21
|
+
const child = spawn(bin, process.argv.slice(2), { stdio: "inherit" });
|
|
22
|
+
const forwarded = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
23
|
+
for (const signal of forwarded) {
|
|
24
|
+
process.on(signal, () => child.kill(signal));
|
|
25
|
+
}
|
|
26
|
+
child.on("error", (error) => {
|
|
27
|
+
process.stderr.write(`chord: ${bin} did not start: ${error.message}\n`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
});
|
|
30
|
+
child.on("exit", (status, signal) => {
|
|
31
|
+
if (signal) {
|
|
32
|
+
// Re-raise the child's signal, so a chord ended by one still ends by it
|
|
33
|
+
// as the shell sees it; the handlers go first, or they would catch it.
|
|
34
|
+
for (const name of forwarded) process.removeAllListeners(name);
|
|
35
|
+
process.kill(process.pid, signal);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
process.exit(status ?? 1);
|
|
39
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorded/chord",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.54.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/IKatsuba/chord.git"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/IKatsuba/chord#readme",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/IKatsuba/chord/issues"
|
|
12
|
+
},
|
|
13
|
+
"description": "A full-screen terminal client for ACP coding agents.",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"acp",
|
|
16
|
+
"agent-client-protocol",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"codex",
|
|
19
|
+
"gemini-cli",
|
|
20
|
+
"coding-agent",
|
|
21
|
+
"terminal",
|
|
22
|
+
"tui"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"chord": "bin/chord.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"bin/"
|
|
29
|
+
],
|
|
30
|
+
"optionalDependencies": {
|
|
31
|
+
"@chorded/chord-darwin-arm64": "0.54.1",
|
|
32
|
+
"@chorded/chord-darwin-x64": "0.54.1",
|
|
33
|
+
"@chorded/chord-linux-x64": "0.54.1",
|
|
34
|
+
"@chorded/chord-linux-arm64": "0.54.1"
|
|
35
|
+
}
|
|
36
|
+
}
|