termify-agent 1.0.45 → 1.0.46
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/mcp/nanobanana-mcp-bundle.mjs +107851 -0
- package/package.json +1 -1
- package/scripts/package.sh +59 -2
- package/scripts/publish-bundles.sh +153 -0
package/package.json
CHANGED
package/scripts/package.sh
CHANGED
|
@@ -13,13 +13,15 @@ set -euo pipefail
|
|
|
13
13
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
14
14
|
PACKAGE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
15
15
|
BUILD_DIR="$PACKAGE_DIR/build/releases"
|
|
16
|
+
NODE_CACHE_DIR="$PACKAGE_DIR/build/node-cache"
|
|
16
17
|
|
|
17
18
|
# Read version from package.json
|
|
18
|
-
VERSION=$(node -e "console.log(require('
|
|
19
|
+
VERSION=$(node -e "console.log(require('$PACKAGE_DIR/package.json').version)" 2>/dev/null) || {
|
|
19
20
|
echo "ERROR: Cannot read version from package.json"
|
|
20
21
|
exit 1
|
|
21
22
|
}
|
|
22
23
|
|
|
24
|
+
NODE_VERSION="20.18.3"
|
|
23
25
|
PLATFORMS="darwin-arm64 darwin-x64 linux-x64 linux-arm64"
|
|
24
26
|
|
|
25
27
|
# Parse args
|
|
@@ -102,7 +104,52 @@ find "$SHARED_STAGING/node_modules" -type d \( \
|
|
|
102
104
|
find "$SHARED_STAGING/dist" -name "*.js.map" -delete 2>/dev/null || true
|
|
103
105
|
find "$SHARED_STAGING/dist" -name "*.d.ts" -delete 2>/dev/null || true
|
|
104
106
|
|
|
107
|
+
# ─── Download Node.js binaries ─────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
download_node() {
|
|
110
|
+
local plat="$1"
|
|
111
|
+
local node_os node_arch
|
|
112
|
+
|
|
113
|
+
case "$plat" in
|
|
114
|
+
darwin-arm64) node_os="darwin"; node_arch="arm64" ;;
|
|
115
|
+
darwin-x64) node_os="darwin"; node_arch="x64" ;;
|
|
116
|
+
linux-arm64) node_os="linux"; node_arch="arm64" ;;
|
|
117
|
+
linux-x64) node_os="linux"; node_arch="x64" ;;
|
|
118
|
+
esac
|
|
119
|
+
|
|
120
|
+
local cache_file="$NODE_CACHE_DIR/node-v${NODE_VERSION}-${node_os}-${node_arch}"
|
|
121
|
+
if [ -f "$cache_file/bin/node" ]; then
|
|
122
|
+
echo " Node.js $NODE_VERSION (cached)"
|
|
123
|
+
return 0
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
local tarball_name="node-v${NODE_VERSION}-${node_os}-${node_arch}.tar.xz"
|
|
127
|
+
local url="https://nodejs.org/dist/v${NODE_VERSION}/${tarball_name}"
|
|
128
|
+
local tmp_dir=$(mktemp -d)
|
|
129
|
+
|
|
130
|
+
echo " Downloading Node.js $NODE_VERSION for ${node_os}-${node_arch}..."
|
|
131
|
+
curl -fsSL "$url" -o "$tmp_dir/$tarball_name" || {
|
|
132
|
+
rm -rf "$tmp_dir"
|
|
133
|
+
echo " ERROR: Failed to download Node.js for $plat"
|
|
134
|
+
return 1
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
tar xJf "$tmp_dir/$tarball_name" -C "$tmp_dir"
|
|
138
|
+
local extracted=$(find "$tmp_dir" -maxdepth 1 -type d -name "node-v*" | head -1)
|
|
139
|
+
|
|
140
|
+
mkdir -p "$cache_file"
|
|
141
|
+
# Only keep bin/node (and bin/npm, bin/npx for postinstall)
|
|
142
|
+
mkdir -p "$cache_file/bin"
|
|
143
|
+
cp "$extracted/bin/node" "$cache_file/bin/"
|
|
144
|
+
chmod +x "$cache_file/bin/node"
|
|
145
|
+
|
|
146
|
+
rm -rf "$tmp_dir"
|
|
147
|
+
echo " Node.js $NODE_VERSION downloaded"
|
|
148
|
+
}
|
|
149
|
+
|
|
105
150
|
# Build per platform
|
|
151
|
+
mkdir -p "$NODE_CACHE_DIR"
|
|
152
|
+
|
|
106
153
|
for PLAT in $PLATFORMS; do
|
|
107
154
|
echo ""
|
|
108
155
|
echo " Building $PLAT..."
|
|
@@ -121,9 +168,18 @@ for PLAT in $PLATFORMS; do
|
|
|
121
168
|
fi
|
|
122
169
|
done
|
|
123
170
|
|
|
171
|
+
# Bundle Node.js
|
|
172
|
+
download_node "$PLAT"
|
|
173
|
+
PLAT_OS="${PLAT%%-*}"
|
|
174
|
+
PLAT_ARCH="${PLAT##*-}"
|
|
175
|
+
mkdir -p "$STAGING/node/bin"
|
|
176
|
+
cp "$NODE_CACHE_DIR/node-v${NODE_VERSION}-${PLAT_OS}-${PLAT_ARCH}/bin/node" "$STAGING/node/bin/"
|
|
177
|
+
chmod +x "$STAGING/node/bin/node"
|
|
178
|
+
|
|
124
179
|
# Count binaries
|
|
125
180
|
BIN_COUNT=$(ls "$STAGING/binaries/" 2>/dev/null | wc -l | tr -d ' ')
|
|
126
181
|
echo " Binaries included: $BIN_COUNT"
|
|
182
|
+
echo " Node.js bundled: yes"
|
|
127
183
|
|
|
128
184
|
# Create tarball
|
|
129
185
|
TARBALL_NAME="termify-agent-${VERSION}-${PLAT}.tar.gz"
|
|
@@ -147,7 +203,8 @@ for PLAT in $PLATFORMS; do
|
|
|
147
203
|
TARBALL_NAME="termify-agent-${VERSION}-${PLAT}.tar.gz"
|
|
148
204
|
if [ -f "$BUILD_DIR/$TARBALL_NAME" ]; then
|
|
149
205
|
SIZE=$(wc -c < "$BUILD_DIR/$TARBALL_NAME" | tr -d ' ')
|
|
150
|
-
SHA=$(shasum -a 256 "$BUILD_DIR/$TARBALL_NAME"
|
|
206
|
+
SHA=$(sha256sum "$BUILD_DIR/$TARBALL_NAME" 2>/dev/null || shasum -a 256 "$BUILD_DIR/$TARBALL_NAME")
|
|
207
|
+
SHA=$(echo "$SHA" | cut -d' ' -f1)
|
|
151
208
|
if [ "$FIRST" = true ]; then
|
|
152
209
|
FIRST=false
|
|
153
210
|
else
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# publish-bundles.sh — Copia MCPs y hooks al servidor y genera manifest.json
|
|
4
|
+
#
|
|
5
|
+
# Uso: ./scripts/publish-bundles.sh
|
|
6
|
+
# Ejecutar desde packages/termify-agent/
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
+
PKG_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
12
|
+
DEST_DIR="$(cd "$PKG_ROOT/../../apps/server/public/downloads/bundles" && pwd)"
|
|
13
|
+
|
|
14
|
+
MCP_DIR="$PKG_ROOT/mcp"
|
|
15
|
+
HOOKS_DIR="$PKG_ROOT/hooks"
|
|
16
|
+
|
|
17
|
+
echo "📦 Publishing bundles..."
|
|
18
|
+
echo " Source MCPs: $MCP_DIR"
|
|
19
|
+
echo " Source hooks: $HOOKS_DIR"
|
|
20
|
+
echo " Destination: $DEST_DIR"
|
|
21
|
+
echo ""
|
|
22
|
+
|
|
23
|
+
# Ensure destination exists
|
|
24
|
+
mkdir -p "$DEST_DIR"
|
|
25
|
+
|
|
26
|
+
# Copy MCP bundles
|
|
27
|
+
for f in "$MCP_DIR"/*.mjs; do
|
|
28
|
+
[ -f "$f" ] || continue
|
|
29
|
+
cp "$f" "$DEST_DIR/"
|
|
30
|
+
echo " ✓ $(basename "$f")"
|
|
31
|
+
done
|
|
32
|
+
|
|
33
|
+
# Copy hooks
|
|
34
|
+
for f in "$HOOKS_DIR"/*.js; do
|
|
35
|
+
[ -f "$f" ] || continue
|
|
36
|
+
cp "$f" "$DEST_DIR/"
|
|
37
|
+
echo " ✓ $(basename "$f")"
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
echo ""
|
|
41
|
+
echo "📝 Generating manifest.json..."
|
|
42
|
+
|
|
43
|
+
# Generate manifest
|
|
44
|
+
MANIFEST="$DEST_DIR/manifest.json"
|
|
45
|
+
|
|
46
|
+
# Build MCPs array
|
|
47
|
+
mcps_json="["
|
|
48
|
+
first=true
|
|
49
|
+
for f in "$MCP_DIR"/*.mjs; do
|
|
50
|
+
[ -f "$f" ] || continue
|
|
51
|
+
filename="$(basename "$f")"
|
|
52
|
+
sha256="$(shasum -a 256 "$f" | awk '{print $1}')"
|
|
53
|
+
size="$(stat -f%z "$f" 2>/dev/null || stat -c%s "$f" 2>/dev/null)"
|
|
54
|
+
|
|
55
|
+
# Derive install dir and filename from bundle name
|
|
56
|
+
case "$filename" in
|
|
57
|
+
termify-mcp-bundle.mjs)
|
|
58
|
+
install_dir="termify-mcp"
|
|
59
|
+
install_filename="index.mjs"
|
|
60
|
+
mcp_id="termify-status"
|
|
61
|
+
;;
|
|
62
|
+
memsearch-mcp-server.mjs)
|
|
63
|
+
install_dir="memsearch-mcp"
|
|
64
|
+
install_filename="server.mjs"
|
|
65
|
+
mcp_id="memsearch"
|
|
66
|
+
;;
|
|
67
|
+
nanobanana-mcp-bundle.mjs)
|
|
68
|
+
install_dir="nanobanana-mcp"
|
|
69
|
+
install_filename="index.mjs"
|
|
70
|
+
mcp_id="nanobanana"
|
|
71
|
+
;;
|
|
72
|
+
*)
|
|
73
|
+
install_dir="${filename%.mjs}-mcp"
|
|
74
|
+
install_filename="index.mjs"
|
|
75
|
+
mcp_id="${filename%.mjs}"
|
|
76
|
+
;;
|
|
77
|
+
esac
|
|
78
|
+
|
|
79
|
+
if [ "$first" = true ]; then first=false; else mcps_json+=","; fi
|
|
80
|
+
mcps_json+=$(cat <<ENTRY
|
|
81
|
+
{
|
|
82
|
+
"id": "$mcp_id",
|
|
83
|
+
"file": "$filename",
|
|
84
|
+
"sha256": "$sha256",
|
|
85
|
+
"size": $size,
|
|
86
|
+
"installDir": "$install_dir",
|
|
87
|
+
"installFilename": "$install_filename"
|
|
88
|
+
}
|
|
89
|
+
ENTRY
|
|
90
|
+
)
|
|
91
|
+
done
|
|
92
|
+
mcps_json+="]"
|
|
93
|
+
|
|
94
|
+
# Build hooks array
|
|
95
|
+
hooks_json="["
|
|
96
|
+
first=true
|
|
97
|
+
for f in "$HOOKS_DIR"/*.js; do
|
|
98
|
+
[ -f "$f" ] || continue
|
|
99
|
+
filename="$(basename "$f")"
|
|
100
|
+
sha256="$(shasum -a 256 "$f" | awk '{print $1}')"
|
|
101
|
+
size="$(stat -f%z "$f" 2>/dev/null || stat -c%s "$f" 2>/dev/null)"
|
|
102
|
+
|
|
103
|
+
if [ "$first" = true ]; then first=false; else hooks_json+=","; fi
|
|
104
|
+
hooks_json+=$(cat <<ENTRY
|
|
105
|
+
{ "file": "$filename", "sha256": "$sha256", "size": $size }
|
|
106
|
+
ENTRY
|
|
107
|
+
)
|
|
108
|
+
done
|
|
109
|
+
hooks_json+="]"
|
|
110
|
+
|
|
111
|
+
generated_at="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
|
112
|
+
|
|
113
|
+
cat > "$MANIFEST" <<MANIFEST_EOF
|
|
114
|
+
{
|
|
115
|
+
"version": 1,
|
|
116
|
+
"generatedAt": "$generated_at",
|
|
117
|
+
"mcps": $mcps_json,
|
|
118
|
+
"hooks": $hooks_json,
|
|
119
|
+
"hookDefinitions": {
|
|
120
|
+
"claude": {
|
|
121
|
+
"UserPromptSubmit": ["termify-sync.js"],
|
|
122
|
+
"Stop": ["termify-response.js"],
|
|
123
|
+
"PreToolUse": [
|
|
124
|
+
{ "file": "termify-tool-hook.js" },
|
|
125
|
+
{ "file": "termify-question-hook.js", "matcher": "AskUserQuestion" },
|
|
126
|
+
{ "file": "termify-needs-input-hook.js", "matcher": "ExitPlanMode" },
|
|
127
|
+
{ "file": "termify-needs-input-hook.js", "matcher": "EnterPlanMode" }
|
|
128
|
+
],
|
|
129
|
+
"PostToolUse": ["termify-tool-hook.js"]
|
|
130
|
+
},
|
|
131
|
+
"gemini": {
|
|
132
|
+
"BeforeAgent": ["termify-sync.js"],
|
|
133
|
+
"AfterAgent": ["termify-response.js"]
|
|
134
|
+
},
|
|
135
|
+
"codex": {
|
|
136
|
+
"notify": ["termify-codex-notify.js"]
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"mcpRegistrations": {
|
|
140
|
+
"claude": { "termify-status": {}, "nanobanana": {} },
|
|
141
|
+
"codex": { "termify-status": {}, "memsearch": {}, "nanobanana": {} },
|
|
142
|
+
"gemini": { "memsearch": {}, "nanobanana": {} },
|
|
143
|
+
"mcpConfig": { "termify-status": {}, "memsearch": {}, "nanobanana": {} }
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
MANIFEST_EOF
|
|
147
|
+
|
|
148
|
+
echo " ✓ manifest.json generated"
|
|
149
|
+
echo ""
|
|
150
|
+
|
|
151
|
+
# Count files
|
|
152
|
+
total=$(ls -1 "$DEST_DIR" | wc -l | tr -d ' ')
|
|
153
|
+
echo "✅ Published $total files to $DEST_DIR"
|