open-computer-use 0.1.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/.agents/plugins/marketplace.json +20 -0
- package/LICENSE +21 -0
- package/README.md +32 -0
- package/bin/open-codex-computer-use-mcp +18 -0
- package/bin/open-computer-use +18 -0
- package/bin/open-computer-use-mcp +18 -0
- package/dist/OpenComputerUse.app/Contents/Info.plist +30 -0
- package/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse +0 -0
- package/package.json +53 -0
- package/plugins/open-computer-use/.codex-plugin/plugin.json +44 -0
- package/plugins/open-computer-use/.mcp.json +8 -0
- package/plugins/open-computer-use/assets/open-computer-use-small.svg +14 -0
- package/plugins/open-computer-use/assets/open-computer-use.svg +14 -0
- package/plugins/open-computer-use/scripts/launch-open-computer-use.sh +25 -0
- package/scripts/install-codex-plugin.sh +151 -0
- package/scripts/postinstall.mjs +13 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "open-computer-use-local",
|
|
3
|
+
"interface": {
|
|
4
|
+
"displayName": "Open Computer Use Local"
|
|
5
|
+
},
|
|
6
|
+
"plugins": [
|
|
7
|
+
{
|
|
8
|
+
"name": "open-computer-use",
|
|
9
|
+
"source": {
|
|
10
|
+
"source": "local",
|
|
11
|
+
"path": "./plugins/open-computer-use"
|
|
12
|
+
},
|
|
13
|
+
"policy": {
|
|
14
|
+
"installation": "AVAILABLE",
|
|
15
|
+
"authentication": "ON_INSTALL"
|
|
16
|
+
},
|
|
17
|
+
"category": "Productivity"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Leo
|
|
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
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# open-computer-use
|
|
2
|
+
|
|
3
|
+
Prebuilt macOS npm distribution for the open-source **Open Computer Use** MCP server.
|
|
4
|
+
|
|
5
|
+
This package bundles a ready-to-run `OpenComputerUse.app`, the Codex plugin metadata, and three global command aliases:
|
|
6
|
+
|
|
7
|
+
- `open-computer-use`
|
|
8
|
+
- `open-computer-use-mcp`
|
|
9
|
+
- `open-codex-computer-use-mcp`
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install -g open-computer-use
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Use
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
open-computer-use doctor
|
|
21
|
+
open-computer-use mcp
|
|
22
|
+
open-computer-use install-codex-plugin
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Notes
|
|
26
|
+
|
|
27
|
+
- Version: `0.1.2`
|
|
28
|
+
- Platform: macOS 14+
|
|
29
|
+
- Architectures: `arm64` and `x64` via a universal app bundle
|
|
30
|
+
- The host terminal or app still needs macOS `Accessibility` and `Screen Recording` permissions
|
|
31
|
+
|
|
32
|
+
Source repository: https://github.com/iFurySt/open-codex-computer-use
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
package_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
+
app_binary="${package_root}/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
6
|
+
install_script="${package_root}/scripts/install-codex-plugin.sh"
|
|
7
|
+
|
|
8
|
+
if [[ "${1:-}" == "install-codex-plugin" ]]; then
|
|
9
|
+
shift
|
|
10
|
+
exec "${install_script}" "$@"
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
if [[ ! -x "${app_binary}" ]]; then
|
|
14
|
+
echo "open-computer-use could not find a runnable app bundle at ${app_binary}." >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
exec "${app_binary}" "$@"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
package_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
+
app_binary="${package_root}/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
6
|
+
install_script="${package_root}/scripts/install-codex-plugin.sh"
|
|
7
|
+
|
|
8
|
+
if [[ "${1:-}" == "install-codex-plugin" ]]; then
|
|
9
|
+
shift
|
|
10
|
+
exec "${install_script}" "$@"
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
if [[ ! -x "${app_binary}" ]]; then
|
|
14
|
+
echo "open-computer-use could not find a runnable app bundle at ${app_binary}." >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
exec "${app_binary}" "$@"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
package_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
+
app_binary="${package_root}/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
6
|
+
install_script="${package_root}/scripts/install-codex-plugin.sh"
|
|
7
|
+
|
|
8
|
+
if [[ "${1:-}" == "install-codex-plugin" ]]; then
|
|
9
|
+
shift
|
|
10
|
+
exec "${install_script}" "$@"
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
if [[ ! -x "${app_binary}" ]]; then
|
|
14
|
+
echo "open-computer-use could not find a runnable app bundle at ${app_binary}." >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
exec "${app_binary}" "$@"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>en</string>
|
|
7
|
+
<key>CFBundleExecutable</key>
|
|
8
|
+
<string>OpenComputerUse</string>
|
|
9
|
+
<key>CFBundleIdentifier</key>
|
|
10
|
+
<string>dev.opencodex.OpenComputerUse</string>
|
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
12
|
+
<string>6.0</string>
|
|
13
|
+
<key>CFBundleName</key>
|
|
14
|
+
<string>Open Computer Use</string>
|
|
15
|
+
<key>CFBundleDisplayName</key>
|
|
16
|
+
<string>Open Computer Use</string>
|
|
17
|
+
<key>CFBundlePackageType</key>
|
|
18
|
+
<string>APPL</string>
|
|
19
|
+
<key>CFBundleShortVersionString</key>
|
|
20
|
+
<string>0.1.2</string>
|
|
21
|
+
<key>CFBundleVersion</key>
|
|
22
|
+
<string>16</string>
|
|
23
|
+
<key>LSMinimumSystemVersion</key>
|
|
24
|
+
<string>14.0</string>
|
|
25
|
+
<key>LSUIElement</key>
|
|
26
|
+
<true/>
|
|
27
|
+
<key>NSPrincipalClass</key>
|
|
28
|
+
<string>NSApplication</string>
|
|
29
|
+
</dict>
|
|
30
|
+
</plist>
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "open-computer-use",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Prebuilt macOS Computer Use MCP server with Codex plugin installer.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/iFurySt/open-codex-computer-use",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/iFurySt/open-codex-computer-use.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/iFurySt/open-codex-computer-use/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"computer-use",
|
|
16
|
+
"codex",
|
|
17
|
+
"mcp",
|
|
18
|
+
"macos",
|
|
19
|
+
"automation"
|
|
20
|
+
],
|
|
21
|
+
"os": [
|
|
22
|
+
"darwin"
|
|
23
|
+
],
|
|
24
|
+
"cpu": [
|
|
25
|
+
"arm64",
|
|
26
|
+
"x64"
|
|
27
|
+
],
|
|
28
|
+
"preferGlobal": true,
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"open-computer-use": "./bin/open-computer-use",
|
|
34
|
+
"open-computer-use-mcp": "./bin/open-computer-use-mcp",
|
|
35
|
+
"open-codex-computer-use-mcp": "./bin/open-codex-computer-use-mcp"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"postinstall": "node ./scripts/postinstall.mjs"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
".agents/plugins/marketplace.json",
|
|
42
|
+
"bin/",
|
|
43
|
+
"dist/OpenComputerUse.app/",
|
|
44
|
+
"plugins/open-computer-use/.codex-plugin/",
|
|
45
|
+
"plugins/open-computer-use/.mcp.json",
|
|
46
|
+
"plugins/open-computer-use/assets/",
|
|
47
|
+
"plugins/open-computer-use/scripts/",
|
|
48
|
+
"scripts/install-codex-plugin.sh",
|
|
49
|
+
"scripts/postinstall.mjs",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "open-computer-use",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Open-source macOS Computer Use MCP server packaged as a Codex plugin.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Leo",
|
|
7
|
+
"url": "https://github.com/iFurySt"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/iFurySt/open-codex-computer-use",
|
|
10
|
+
"repository": "https://github.com/iFurySt/open-codex-computer-use",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"computer-use",
|
|
14
|
+
"macos",
|
|
15
|
+
"automation",
|
|
16
|
+
"mcp",
|
|
17
|
+
"codex"
|
|
18
|
+
],
|
|
19
|
+
"mcpServers": "./.mcp.json",
|
|
20
|
+
"interface": {
|
|
21
|
+
"displayName": "Open Computer Use",
|
|
22
|
+
"shortDescription": "Control macOS apps from Codex with the open local server",
|
|
23
|
+
"longDescription": "Open Computer Use packages this repository's open-source macOS automation server as a Codex plugin. It exposes the same nine desktop-control MCP tools through the locally built OpenComputerUse app bundle, with an AX-first and keyboard-first strategy that tries to avoid stealing focus until global pointer input is truly required.",
|
|
24
|
+
"developerName": "Leo",
|
|
25
|
+
"category": "Productivity",
|
|
26
|
+
"capabilities": [
|
|
27
|
+
"Interactive",
|
|
28
|
+
"Read",
|
|
29
|
+
"Write"
|
|
30
|
+
],
|
|
31
|
+
"websiteURL": "https://github.com/iFurySt/open-codex-computer-use",
|
|
32
|
+
"privacyPolicyURL": "https://github.com/iFurySt/open-codex-computer-use/blob/main/SECURITY.md",
|
|
33
|
+
"termsOfServiceURL": "https://github.com/iFurySt/open-codex-computer-use/blob/main/LICENSE",
|
|
34
|
+
"defaultPrompt": [
|
|
35
|
+
"Inspect the current UI state of this Mac app without stealing focus when possible",
|
|
36
|
+
"Open a new local document with keyboard shortcuts first, then type content without moving my real pointer unless required",
|
|
37
|
+
"Drive the fixture app and verify the nine computer-use tools still behave correctly"
|
|
38
|
+
],
|
|
39
|
+
"brandColor": "#0E7490",
|
|
40
|
+
"composerIcon": "./assets/open-computer-use-small.svg",
|
|
41
|
+
"logo": "./assets/open-computer-use.svg",
|
|
42
|
+
"screenshots": []
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Open Computer Use">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#1FABFC"/>
|
|
5
|
+
<stop offset="100%" stop-color="#F0BDEF"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect x="0" y="0" width="64" height="64" fill="url(#bg)"/>
|
|
9
|
+
<g transform="translate(-5.9259 -5.9259) scale(1.1851852)">
|
|
10
|
+
<path d="M18.5 39A18.5 18.5 0 0 1 45.5 22" fill="none" stroke="#FFFFFF" stroke-opacity="0.72" stroke-width="3" stroke-linecap="round"/>
|
|
11
|
+
<path d="M32.25 25.5L32.25 45.25L37.25 40.5L40.25 48.25L44 46.5L41 39.25L48 38Z" fill="#FFFFFF" fill-opacity="0.14"/>
|
|
12
|
+
<path d="M31.5 24.5L31.5 44.25L36.5 39.5L39.5 47.25L43.25 45.5L40.25 38.25L47.25 37Z" fill="#FFFFFF" fill-opacity="0.94" stroke="#FFFFFF" stroke-width="1.5" stroke-linejoin="round"/>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" role="img" aria-label="Open Computer Use">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#1FABFC"/>
|
|
5
|
+
<stop offset="100%" stop-color="#F0BDEF"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect x="0" y="0" width="256" height="256" fill="url(#bg)"/>
|
|
9
|
+
<g transform="translate(-23.7037 -23.7037) scale(1.1851852)">
|
|
10
|
+
<path d="M74 156A74 74 0 0 1 182 88" fill="none" stroke="#FFFFFF" stroke-opacity="0.72" stroke-width="12" stroke-linecap="round"/>
|
|
11
|
+
<path d="M129 102L129 181L149 162L161 193L176 186L164 157L192 152Z" fill="#FFFFFF" fill-opacity="0.14"/>
|
|
12
|
+
<path d="M126 98L126 177L146 158L158 189L173 182L161 153L189 148Z" fill="#FFFFFF" fill-opacity="0.94" stroke="#FFFFFF" stroke-width="6" stroke-linejoin="round"/>
|
|
13
|
+
</g>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
plugin_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
bundled_app_binary="${plugin_root}/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
7
|
+
repo_root="$(cd "${plugin_root}/../.." && pwd)"
|
|
8
|
+
repo_app_binary="${repo_root}/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
9
|
+
|
|
10
|
+
if [[ -x "${bundled_app_binary}" ]]; then
|
|
11
|
+
cd "${plugin_root}"
|
|
12
|
+
exec "${bundled_app_binary}" mcp
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if [[ -x "${repo_app_binary}" ]]; then
|
|
16
|
+
cd "${repo_root}"
|
|
17
|
+
exec "${repo_app_binary}" mcp
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo "open-computer-use could not find a runnable app bundle." >&2
|
|
21
|
+
echo "Checked:" >&2
|
|
22
|
+
echo " - ${bundled_app_binary}" >&2
|
|
23
|
+
echo " - ${repo_app_binary}" >&2
|
|
24
|
+
echo "Run ./scripts/install-codex-plugin.sh to populate the Codex plugin cache." >&2
|
|
25
|
+
exit 1
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
6
|
+
codex_home="${CODEX_HOME:-${HOME}/.codex}"
|
|
7
|
+
config_path="${codex_home}/config.toml"
|
|
8
|
+
marketplace_name="open-computer-use-local"
|
|
9
|
+
plugin_name="open-computer-use"
|
|
10
|
+
plugin_source_root="${repo_root}/plugins/${plugin_name}"
|
|
11
|
+
plugin_manifest="${plugin_source_root}/.codex-plugin/plugin.json"
|
|
12
|
+
build_script="${repo_root}/scripts/build-open-computer-use-app.sh"
|
|
13
|
+
configuration="debug"
|
|
14
|
+
rebuild="false"
|
|
15
|
+
|
|
16
|
+
while [[ $# -gt 0 ]]; do
|
|
17
|
+
case "$1" in
|
|
18
|
+
--rebuild)
|
|
19
|
+
rebuild="true"
|
|
20
|
+
shift
|
|
21
|
+
;;
|
|
22
|
+
--configuration)
|
|
23
|
+
configuration="${2:-}"
|
|
24
|
+
if [[ -z "${configuration}" ]]; then
|
|
25
|
+
echo "--configuration requires a value" >&2
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
shift 2
|
|
29
|
+
;;
|
|
30
|
+
*)
|
|
31
|
+
echo "Unknown argument: $1" >&2
|
|
32
|
+
echo "Usage: $0 [--rebuild] [--configuration debug|release]" >&2
|
|
33
|
+
exit 1
|
|
34
|
+
;;
|
|
35
|
+
esac
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
app_binary="${repo_root}/dist/OpenComputerUse.app/Contents/MacOS/OpenComputerUse"
|
|
39
|
+
|
|
40
|
+
if [[ "${rebuild}" == "true" || ! -x "${app_binary}" ]]; then
|
|
41
|
+
if [[ -x "${build_script}" ]]; then
|
|
42
|
+
"${build_script}" "${configuration}"
|
|
43
|
+
else
|
|
44
|
+
echo "Missing runnable app bundle at ${app_binary} and no local build script is available." >&2
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
if [[ ! -f "${repo_root}/.agents/plugins/marketplace.json" ]]; then
|
|
50
|
+
echo "Missing ${repo_root}/.agents/plugins/marketplace.json" >&2
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if [[ ! -f "${plugin_manifest}" ]]; then
|
|
55
|
+
echo "Missing ${plugin_manifest}" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if [[ ! -x "${app_binary}" ]]; then
|
|
60
|
+
echo "Missing runnable app binary at ${app_binary}" >&2
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
plugin_version="$(
|
|
65
|
+
python3 - "${plugin_manifest}" <<'PY'
|
|
66
|
+
import json
|
|
67
|
+
import sys
|
|
68
|
+
|
|
69
|
+
with open(sys.argv[1], "r", encoding="utf-8") as fh:
|
|
70
|
+
manifest = json.load(fh)
|
|
71
|
+
|
|
72
|
+
print(manifest["version"])
|
|
73
|
+
PY
|
|
74
|
+
)"
|
|
75
|
+
|
|
76
|
+
if [[ -z "${plugin_version}" ]]; then
|
|
77
|
+
echo "Failed to read plugin version from ${plugin_manifest}" >&2
|
|
78
|
+
exit 1
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
plugin_cache_root="${codex_home}/plugins/cache/${marketplace_name}/${plugin_name}"
|
|
82
|
+
plugin_install_root="${plugin_cache_root}/${plugin_version}"
|
|
83
|
+
|
|
84
|
+
mkdir -p "${codex_home}" "${plugin_cache_root}"
|
|
85
|
+
rm -rf "${plugin_install_root}"
|
|
86
|
+
mkdir -p "${plugin_install_root}"
|
|
87
|
+
|
|
88
|
+
rsync -a "${plugin_source_root}/" "${plugin_install_root}/"
|
|
89
|
+
rsync -a "${repo_root}/dist/OpenComputerUse.app" "${plugin_install_root}/"
|
|
90
|
+
|
|
91
|
+
python3 - "${config_path}" "${repo_root}" "${marketplace_name}" "${plugin_name}" <<'PY'
|
|
92
|
+
import json
|
|
93
|
+
import re
|
|
94
|
+
import sys
|
|
95
|
+
from pathlib import Path
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def section_pattern(header: str) -> re.Pattern[str]:
|
|
99
|
+
return re.compile(rf'(?ms)^\[{re.escape(header)}\]\n.*?(?=^\[|\Z)')
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def remove_section(text: str, header: str) -> str:
|
|
103
|
+
return section_pattern(header).sub("", text)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def upsert_section(text: str, header: str, body: str) -> str:
|
|
107
|
+
section = f'[{header}]\n{body.rstrip()}\n'
|
|
108
|
+
pattern = section_pattern(header)
|
|
109
|
+
if pattern.search(text):
|
|
110
|
+
return pattern.sub(section, text, count=1)
|
|
111
|
+
|
|
112
|
+
if text and not text.endswith("\n"):
|
|
113
|
+
text += "\n"
|
|
114
|
+
if text and not text.endswith("\n\n"):
|
|
115
|
+
text += "\n"
|
|
116
|
+
return text + section
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
config_path = Path(sys.argv[1])
|
|
120
|
+
repo_root = Path(sys.argv[2]).resolve()
|
|
121
|
+
marketplace_name = sys.argv[3]
|
|
122
|
+
plugin_name = sys.argv[4]
|
|
123
|
+
|
|
124
|
+
text = config_path.read_text() if config_path.exists() else ""
|
|
125
|
+
|
|
126
|
+
for header in (
|
|
127
|
+
'mcp_servers."open-codex-computer-use"',
|
|
128
|
+
'mcp_servers."open-computer-use"',
|
|
129
|
+
):
|
|
130
|
+
text = remove_section(text, header)
|
|
131
|
+
|
|
132
|
+
text = upsert_section(
|
|
133
|
+
text,
|
|
134
|
+
f"marketplaces.{marketplace_name}",
|
|
135
|
+
f'source_type = "local"\nsource = {json.dumps(str(repo_root))}',
|
|
136
|
+
)
|
|
137
|
+
text = upsert_section(
|
|
138
|
+
text,
|
|
139
|
+
f'plugins."{plugin_name}@{marketplace_name}"',
|
|
140
|
+
"enabled = true",
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
text = re.sub(r"\n{3,}", "\n\n", text).rstrip() + "\n"
|
|
144
|
+
config_path.write_text(text)
|
|
145
|
+
PY
|
|
146
|
+
|
|
147
|
+
echo "Installed ${plugin_name}@${marketplace_name}"
|
|
148
|
+
echo "Marketplace source: ${repo_root}"
|
|
149
|
+
echo "Plugin cache: ${plugin_install_root}"
|
|
150
|
+
echo "Updated Codex config: ${config_path}"
|
|
151
|
+
echo "Restart Codex to load the plugin marketplace."
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const lines = [
|
|
3
|
+
"",
|
|
4
|
+
"Installed open-computer-use.",
|
|
5
|
+
"Commands: open-computer-use, open-computer-use-mcp, open-codex-computer-use-mcp",
|
|
6
|
+
"Start MCP: open-computer-use mcp",
|
|
7
|
+
"Grant permissions / diagnose: open-computer-use doctor",
|
|
8
|
+
"Install into Codex plugin cache: open-computer-use install-codex-plugin",
|
|
9
|
+
"",
|
|
10
|
+
];
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
console.log(line);
|
|
13
|
+
}
|