Skip to content

Commit 8fef33d

Browse files
authored
Merge pull request #9 from mertkayacs/feature/mcp-onboarding-windows-native
Onboarding: reliable MCP attach, a setup wizard everywhere, and reevesagents-win (1.5.0)
2 parents f641c94 + 6273ea7 commit 8fef33d

65 files changed

Lines changed: 4676 additions & 84 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/publish.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,20 @@ jobs:
5252
run: npm publish --provenance --access public
5353
env:
5454
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
55+
56+
# The native-Windows sibling ships from the same tag. It needs its own npm
57+
# trusted publisher (or an NPM_TOKEN scoped to reevesagents-win); until that
58+
# is set up, continue-on-error keeps a failure here from blocking the main
59+
# package above. The version must match the tag, so bump both together.
60+
- name: Publish reevesagents-win to npm
61+
continue-on-error: true
62+
run: |
63+
WIN_VER="$(node -p "require('./packages/reevesagents-win/package.json').version")"
64+
if [ "${GITHUB_REF_NAME#v}" != "$WIN_VER" ]; then
65+
echo "tag $GITHUB_REF_NAME does not match reevesagents-win version $WIN_VER; skipping"
66+
exit 1
67+
fi
68+
pnpm --filter reevesagents-win build
69+
cd packages/reevesagents-win && npm publish --provenance --access public
70+
env:
71+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

packages/reevesagents-win/LICENSE

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
Apache License
2+
Version 2.0, January 2004
3+
http://www.apache.org/licenses/
4+
5+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6+
7+
1. Definitions.
8+
9+
"License" shall mean the terms and conditions for use, reproduction,
10+
and distribution as defined by Sections 1 through 9 of this document.
11+
12+
"Licensor" shall mean the copyright owner or entity authorized by
13+
the copyright owner that is granting the License.
14+
15+
"Legal Entity" shall mean the union of the acting entity and all
16+
other entities that control, are controlled by, or are under common
17+
control with that entity. For the purposes of this definition,
18+
"control" means (i) the power, direct or indirect, to cause the
19+
direction or management of such entity, whether by contract or
20+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
21+
outstanding shares, or (iii) beneficial ownership of such entity.
22+
23+
"You" (or "Your") shall mean an individual or Legal Entity
24+
exercising permissions granted by this License.
25+
26+
"Source" form shall mean the preferred form for making modifications,
27+
including but not limited to software source code, documentation
28+
source, and configuration files.
29+
30+
"Object" form shall mean any form resulting from mechanical
31+
transformation or translation of a Source form, including but
32+
not limited to compiled object code, generated documentation,
33+
and conversions to other media types.
34+
35+
"Work" shall mean the work of authorship made available under
36+
the License, as indicated by a copyright notice that is included in
37+
or attached to the work (an example is provided in the Appendix below).
38+
39+
"Derivative Works" shall mean any work, whether in Source or Object
40+
form, that is based on (or derived from) the Work and for which the
41+
editorial revisions, annotations, elaborations, or other modifications
42+
represent, as a whole, an original work of authorship. For the purposes
43+
of this License, Derivative Works shall not include works that remain
44+
separable from, or merely link (or bind by name) to the interfaces of,
45+
the Work and Derivative Works thereof.
46+
47+
"Contribution" shall mean, as submitted to the Licensor for inclusion
48+
in the Work by the copyright owner or by an individual or Legal Entity
49+
authorized to submit on behalf of the copyright owner. For the purposes
50+
of this definition, "submitted" means any form of electronic, verbal,
51+
or written communication sent to the Licensor or its representatives,
52+
including but not limited to communication on electronic mailing lists,
53+
source code control systems, and issue tracking systems that are managed
54+
by, or on behalf of, the Licensor for the purpose of discussing and
55+
improving the Work, but excluding communication that is conspicuously
56+
marked or designated in writing by the copyright owner as "Not a
57+
Contribution."
58+
59+
"Contributor" shall mean Licensor and any Legal Entity on behalf of
60+
whom a Contribution has been received by the Licensor and included
61+
within the Work.
62+
63+
2. Grant of Copyright License. Subject to the terms and conditions of
64+
this License, each Contributor hereby grants to You a perpetual,
65+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
66+
copyright license to reproduce, prepare Derivative Works of,
67+
publicly display, publicly perform, sublicense, and distribute the
68+
Work and such Derivative Works in Source or Object form.
69+
70+
3. Grant of Patent License. Subject to the terms and conditions of
71+
this License, each Contributor hereby grants to You a perpetual,
72+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
73+
(except as stated in this section) patent license to make, have made,
74+
use, offer to sell, sell, import, and otherwise transfer the Work,
75+
where such license applies only to those patent contributions
76+
Licensable by such Contributor that are necessarily infringed by
77+
their Contribution(s) alone or by the combination of their
78+
Contribution(s) with the Work to which such Contribution(s) was
79+
submitted. If You institute patent litigation against any entity
80+
(including a cross-claim or counterclaim in a lawsuit) alleging that
81+
the Work or any one or more Contributions constitutes direct or
82+
contributory patent infringement, then any patent licenses granted to
83+
You under this License for the Work shall terminate as of the date
84+
such litigation is filed.
85+
86+
4. Redistribution. You may reproduce and distribute copies of the
87+
Work or Derivative Works thereof in any medium, with or without
88+
modifications, and in Source or Object form, provided that You
89+
meet the following conditions:
90+
91+
(a) You must give any other recipients of the Work or Derivative
92+
Works a copy of this License; and
93+
94+
(b) You must cause any modified files to carry prominent notices
95+
stating that You changed the files; and
96+
97+
(c) You must retain, in the Source form of any Derivative Works
98+
that You distribute, all copyright, patent, trademark, and
99+
attribution notices from the Source form of the Work,
100+
excluding those notices that do not pertain to any part of
101+
the Derivative Works; and
102+
103+
(d) If the Work includes a "NOTICE" text file as part of its
104+
distribution, You must include a readable copy of the
105+
attribution notices contained within such NOTICE file, in
106+
at least one of the following places: within a NOTICE text
107+
file distributed as part of the Derivative Works; within
108+
the Source form or documentation, if provided along with the
109+
Derivative Works; or, within a display generated by the
110+
Derivative Works, if and wherever such third-party notices
111+
normally appear. The contents of the NOTICE file are for
112+
informational purposes only and do not modify the License.
113+
You may add Your own attribution notices within Derivative
114+
Works that You distribute, alongside or in addition to the
115+
NOTICE text from the Work, provided that such additional
116+
attribution notices cannot be construed as modifying the
117+
License.
118+
119+
You may add Your own license statement for Your modifications and
120+
may provide additional grant of rights to use, copy, modify, merge,
121+
publish, distribute, sublicense, and/or sell copies of the
122+
Contribution, either before or after inclusion in the Work.
123+
124+
5. Submission of Contributions. Unless You explicitly state otherwise,
125+
any Contribution intentionally submitted for inclusion in the Work
126+
by You to the Licensor shall be under the terms and conditions of
127+
this License, without any additional terms or conditions.
128+
Notwithstanding the above, nothing herein shall supersede or modify
129+
the terms of any separate license agreement you may have executed
130+
with Licensor regarding such Contributions.
131+
132+
6. Trademarks. This License does not grant permission to use the trade
133+
names, trademarks, service marks, or product names of the Licensor,
134+
except as required for reasonable and customary use in describing the
135+
origin of the Work and reproducing the content of the NOTICE file.
136+
137+
7. Disclaimer of Warranty. Unless required by applicable law or
138+
agreed to in writing, Licensor provides the Work (and each
139+
Contributor provides its Contributions) on an "AS IS" BASIS,
140+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
141+
implied, including, without limitation, any conditions of TITLE,
142+
MERCHANTIBILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
143+
responsible for determining the appropriateness of using or
144+
reproducing the Work and assume any risks associated with Your
145+
exercise of permissions under this License.
146+
147+
8. Limitation of Liability. In no event and under no legal theory,
148+
whether in tort (including negligence), contract, or otherwise,
149+
unless required by applicable law (such as deliberate and grossly
150+
negligent acts) or agreed to in writing, shall any Contributor be
151+
liable to You for damages, including any direct, indirect, special,
152+
incidental, or exemplary damages of any character arising as a
153+
result of this License or out of the use or inability to use the
154+
Work (including but not limited to damages for loss of goodwill,
155+
work stoppage, computer failure or malfunction, or all other
156+
commercial damages or losses), even if such Contributor has been
157+
advised of the possibility of such damages.
158+
159+
9. Accepting Warranty or Additional Liability. While redistributing
160+
the Work or Derivative Works thereof, You may choose to offer,
161+
and charge a fee for, acceptance of support, warranty, indemnity,
162+
or other liability obligations and/or rights consistent with this
163+
License. However, in accepting such obligations, You may offer only
164+
conditions consistent with this License.
165+
166+
END OF TERMS AND CONDITIONS
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# reevesagents-win
2+
3+
MCP-only, ConPTY-driven agent control for **native Windows**. It lets one AI CLI (Claude Code, Codex, Kimi, Qwen, Hermes) spawn and drive other AI CLIs over MCP, with no tmux and no WSL.
4+
5+
It is the native-Windows sibling of [`reevesagents`](https://www.npmjs.com/package/reevesagents), the tmux-based manager for macOS, Linux, and WSL. Same idea, Windows-native runtime: each agent runs as a provider CLI in its own ConPTY pseudo-console, hosted by the MCP server for the session.
6+
7+
## Install
8+
9+
```
10+
npm install -g reevesagents-win
11+
```
12+
13+
Needs Node 20.19+ and at least one provider CLI installed and signed in.
14+
15+
## Use it
16+
17+
Connect it to a host CLI, then that CLI gains the tools to spawn and steer other agents:
18+
19+
```
20+
reevesagents-win attach claude # or codex, kimi, qwen, hermes
21+
```
22+
23+
Start a new session of the host CLI so it loads the tools, then ask the agent to spawn and drive others. Check your setup any time:
24+
25+
```
26+
reevesagents-win doctor
27+
reevesagents-win setup
28+
```
29+
30+
## Tools
31+
32+
A focused drive loop over MCP: `list_providers`, `spawn`, `read`, `send_text`, `send_key`, `interrupt`, `kill`, `stop`, `list`, `list_hosts`, `attach_host`, `detach_host`, `doctor`, plus a getting-started guide resource and connect-time instructions.
33+
34+
## How it differs from reevesagents
35+
36+
- No tmux. Agents run in ConPTY consoles hosted by the MCP server, so they live for the session (close the host CLI session and they stop).
37+
- MCP only. No TUI or web UI; it is meant to be driven by a host CLI.
38+
39+
Apache-2.0.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// @ts-check
2+
import js from '@eslint/js'
3+
import tsParser from '@typescript-eslint/parser'
4+
5+
export default [
6+
js.configs.recommended,
7+
{
8+
files: ['src/**/*.ts', 'test/**/*.ts'],
9+
rules: {
10+
'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
11+
'no-console': 'off',
12+
},
13+
languageOptions: {
14+
parser: tsParser,
15+
ecmaVersion: 2022,
16+
sourceType: 'module',
17+
globals: {
18+
console: 'readonly',
19+
process: 'readonly',
20+
Buffer: 'readonly',
21+
setTimeout: 'readonly',
22+
clearTimeout: 'readonly',
23+
setInterval: 'readonly',
24+
clearInterval: 'readonly',
25+
},
26+
},
27+
},
28+
{
29+
// Plain-JS test fixtures (a fake provider CLI). Control chars in its regex are
30+
// intentional (it strips terminal escape sequences).
31+
files: ['test/fixtures/**/*.mjs'],
32+
rules: {
33+
'no-control-regex': 'off',
34+
'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }],
35+
},
36+
languageOptions: {
37+
ecmaVersion: 2022,
38+
sourceType: 'module',
39+
globals: {
40+
process: 'readonly',
41+
},
42+
},
43+
},
44+
]
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
{
2+
"name": "reevesagents-win",
3+
"version": "1.5.0",
4+
"description": "MCP-only, ConPTY-driven agent-control server for native Windows: spawn and drive AI CLIs without tmux or WSL",
5+
"type": "module",
6+
"packageManager": "pnpm@10.34.1",
7+
"bin": {
8+
"reevesagents-win": "dist/cli.js"
9+
},
10+
"files": [
11+
"dist",
12+
"!dist/**/*.map"
13+
],
14+
"scripts": {
15+
"build": "tsup",
16+
"dev": "tsup --watch",
17+
"test": "vitest run",
18+
"test:watch": "vitest",
19+
"typecheck": "tsc --noEmit",
20+
"lint": "eslint src test",
21+
"sync:shared": "node scripts/sync-shared.mjs",
22+
"verify": "pnpm typecheck && pnpm lint && pnpm test && pnpm build"
23+
},
24+
"dependencies": {
25+
"@lydell/node-pty": "1.2.0-beta.12",
26+
"@modelcontextprotocol/sdk": "^1.29.0",
27+
"commander": "^14.0.3",
28+
"strip-ansi": "^7.1.0"
29+
},
30+
"devDependencies": {
31+
"@eslint/js": "^10.0.1",
32+
"@types/node": "^25.7.0",
33+
"@typescript-eslint/parser": "^8.59.3",
34+
"eslint": "10.3.0",
35+
"tsup": "^8.5.1",
36+
"typescript": "^6.0.3",
37+
"vitest": "^4.1.6"
38+
},
39+
"engines": {
40+
"node": ">=20.19"
41+
},
42+
"license": "Apache-2.0",
43+
"repository": {
44+
"type": "git",
45+
"url": "https://github.com/mertkayacs/reevesagents",
46+
"directory": "packages/reevesagents-win"
47+
},
48+
"bugs": {
49+
"url": "https://github.com/mertkayacs/reevesagents/issues"
50+
},
51+
"homepage": "https://github.com/mertkayacs/reevesagents/tree/master/packages/reevesagents-win#readme",
52+
"keywords": [
53+
"ai",
54+
"agents",
55+
"cli",
56+
"mcp",
57+
"windows",
58+
"conpty",
59+
"node-pty"
60+
]
61+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Re-copy the drift-guarded catalog files from the unix package's src/core into
2+
// src/shared. These three are byte-identical copies (the provider catalog: types,
3+
// registry, model data) and catalog-drift.test.ts fails if they diverge from the
4+
// originals, so this is the one-command fix when the unix catalog changes.
5+
//
6+
// provider-build.ts and redact.ts are curated subsets kept by hand (they pull only
7+
// the pure helpers we need); the drift test guards those too, but they are not
8+
// mechanical copies, so this script does not touch them.
9+
10+
import { copyFileSync, mkdirSync } from 'node:fs'
11+
import { fileURLToPath } from 'node:url'
12+
import { dirname, join } from 'node:path'
13+
14+
const here = dirname(fileURLToPath(import.meta.url))
15+
const srcCore = join(here, '..', '..', '..', 'src', 'core')
16+
const dstShared = join(here, '..', 'src', 'shared')
17+
18+
const FILES = ['types.ts', 'provider-registry.ts', 'model-data.ts']
19+
20+
mkdirSync(dstShared, { recursive: true })
21+
for (const file of FILES) {
22+
copyFileSync(join(srcCore, file), join(dstShared, file))
23+
console.log(`synced shared/${file}`)
24+
}

0 commit comments

Comments
 (0)