@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.
Files changed (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -2
  3. package/bin/chord.js +39 -0
  4. 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
- # Temporary Holding Version
1
+ <h1 align="center">chord</h1>
2
2
 
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.
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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
+ }