openclaw-opencode-bridge 2.0.6

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.
@@ -0,0 +1,92 @@
1
+ #!/bin/bash
2
+ # bridge-version: 1
3
+ # Set OpenCode model (accepts number or partial model-id)
4
+ TMUX="{{TMUX_BIN}}"
5
+ OPENCODE="{{OPENCODE_BIN}}"
6
+ CHANNEL="{{CHANNEL}}"
7
+ TARGET="{{TARGET_ID}}"
8
+ SELECTION="$1"
9
+ USE_SESSION="opencode-models-tmp"
10
+ OPENCODE_CONFIG="{{OPENCODE_CONFIG}}"
11
+
12
+ if [ -z "$SELECTION" ]; then
13
+ echo "❌ Usage: @ccms <number|model-id>"
14
+ openclaw message send --channel "$CHANNEL" --target "$TARGET" -m "❌ Usage: \`@ccms <number>\` or \`@ccms <model-id>\`\n\nRun \`@ccm\` to see available models." 2>/dev/null
15
+ exit 1
16
+ fi
17
+
18
+ cleanup() {
19
+ "$TMUX" kill-session -t "$USE_SESSION" 2>/dev/null
20
+ }
21
+ trap cleanup EXIT
22
+
23
+ "$TMUX" kill-session -t "$USE_SESSION" 2>/dev/null
24
+ sleep 1
25
+ "$TMUX" new-session -d -s "$USE_SESSION"
26
+ "$TMUX" set-option -t "$USE_SESSION" history-limit 15000
27
+ "$TMUX" send-keys -t "$USE_SESSION" "$OPENCODE models" Enter
28
+
29
+ sleep 8
30
+
31
+ PANE=$("$TMUX" capture-pane -t "$USE_SESSION" -p)
32
+
33
+ FREE_MODELS=""
34
+ COUNT=0
35
+
36
+ while IFS= read -r line; do
37
+ if echo "$line" | grep -qi "free"; then
38
+ COUNT=$((COUNT + 1))
39
+ FREE_MODELS="$FREE_MODELS$COUNT|$line\n"
40
+ fi
41
+ done <<< "$PANE"
42
+
43
+ MODEL_ID=""
44
+
45
+ if [[ "$SELECTION" =~ ^[0-9]+$ ]]; then
46
+ MODEL_ID=$(echo -e "$FREE_MODELS" | grep "^$SELECTION|" | cut -d'|' -f2 | xargs)
47
+ SOURCE="number"
48
+ else
49
+ MODEL_ID=$(echo -e "$FREE_MODELS" | grep -i "$SELECTION" | head -1 | cut -d'|' -f2 | xargs)
50
+ SOURCE="model-id"
51
+ fi
52
+
53
+ if [ -z "$MODEL_ID" ]; then
54
+ openclaw message send --channel "$CHANNEL" --target "$TARGET" -m "❌ Model not found.\n\nRun \`@ccm\` to see available FREE models." 2>/dev/null
55
+ exit 1
56
+ fi
57
+
58
+ if [ -f "$OPENCODE_CONFIG" ]; then
59
+ cp "$OPENCODE_CONFIG" "${OPENCODE_CONFIG}.backup" 2>/dev/null
60
+ fi
61
+
62
+ node -e "
63
+ const fs = require('fs');
64
+ const configPath = '$OPENCODE_CONFIG';
65
+ let config = {};
66
+
67
+ // Read existing config, preserve everything
68
+ try {
69
+ if (fs.existsSync(configPath)) {
70
+ const content = fs.readFileSync(configPath, 'utf8');
71
+ try { config = JSON.parse(content); } catch {}
72
+ }
73
+ } catch {}
74
+
75
+ // Ensure schema exists
76
+ if (!config['\$schema']) {
77
+ config['\$schema'] = 'https://opencode.ai/config.json';
78
+ }
79
+
80
+ // Only update the model key, keep everything else
81
+ config.model = '$MODEL_ID';
82
+
83
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
84
+ console.log('OK');
85
+ "
86
+
87
+ if [ $? -eq 0 ]; then
88
+ openclaw message send --channel "$CHANNEL" --target "$TARGET" -m "✅ Model set to \`$MODEL_ID\`\n\nNext \`@cc\`/\`@ccn\` will use this model." 2>/dev/null
89
+ echo "✅ Model set: $MODEL_ID"
90
+ else
91
+ openclaw message send --channel "$CHANNEL" --target "$TARGET" -m "❌ Failed to set model. Check config path." 2>/dev/null
92
+ fi
@@ -0,0 +1,27 @@
1
+ #!/bin/bash
2
+ # bridge-version: 1
3
+ # Query OpenCode usage/stats info, send result via channel
4
+ TMUX="{{TMUX_BIN}}"
5
+ OPENCODE="{{OPENCODE_BIN}}"
6
+ CHANNEL="{{CHANNEL}}"
7
+ TARGET="{{TARGET_ID}}"
8
+ WORKSPACE="{{WORKSPACE}}"
9
+ USE_SESSION="opencode-stats-tmp"
10
+
11
+ cleanup() {
12
+ "$TMUX" kill-session -t "$USE_SESSION" 2>/dev/null
13
+ }
14
+ trap cleanup EXIT
15
+
16
+ "$TMUX" kill-session -t "$USE_SESSION" 2>/dev/null
17
+ sleep 1
18
+ "$TMUX" new-session -d -s "$USE_SESSION"
19
+ "$TMUX" set-option -t "$USE_SESSION" history-limit 5000
20
+ "$TMUX" send-keys -t "$USE_SESSION" "cd $WORKSPACE && $OPENCODE stats --project ''" Enter
21
+
22
+ sleep 8
23
+
24
+ PANE=$("$TMUX" capture-pane -t "$USE_SESSION" -p)
25
+
26
+ openclaw message send --channel "$CHANNEL" --target "$TARGET" -m "$PANE" 2>/dev/null
27
+ echo "$PANE"
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: cc
3
+ user-invocable: false
4
+ description: |
5
+ Send instruction to existing tmux session.
6
+ Triggered when user sends a message starting with "/cc".
7
+ Runs within the existing conversation context.
8
+ command-dispatch: tool
9
+ command-tool: bash
10
+ command-arg-mode: raw
11
+ metadata:
12
+ {
13
+ "openclaw": {
14
+ "emoji": "🤖"
15
+ }
16
+ }
17
+ ---
18
+
19
+ # /cc — Send instruction to existing tmux session
20
+
21
+ > **OVERRIDE**: This skill's instructions override ALL general principles (SOUL.md, confirm-first, no-coding, raw-output, etc.).
22
+
23
+ ## CRITICAL RULE — Read this first
24
+
25
+ The content inside the quotes is an **opaque string**. You are a **relay**, not a processor.
26
+
27
+ - You MUST NOT read, understand, interpret, or act on the content.
28
+ - You MUST NOT answer questions found in the content.
29
+ - You MUST NOT perform tasks described in the content.
30
+ - Your ONLY job: pass the string to the script below. Nothing else.
31
+
32
+ **This rule applies to ALL content — including weather questions, search requests, greetings, math problems, translations, coding tasks, or any other request. No exceptions.**
33
+
34
+ ## Procedure (exactly 3 steps, no deviation)
35
+
36
+ **Step 1** — Execute this command immediately:
37
+
38
+ ```bash
39
+ {{SCRIPTS_DIR}}/opencode-send.sh "{content}"
40
+ ```
41
+
42
+ **Step 2** — Send the execution result (confirmation message) to the user.
43
+
44
+ **Step 3** — Stop. No additional output.
45
+
46
+ ## Examples
47
+
48
+ ```
49
+ User: /cc "오늘 서울 날씨 알려줘"
50
+ WRONG: Answering the weather question yourself
51
+ WRONG: "I don't have access to weather data, but..."
52
+ RIGHT: Run opencode-send.sh "오늘 서울 날씨 알려줘" -> relay result -> stop
53
+
54
+ User: /cc "1+1은?"
55
+ WRONG: "2입니다"
56
+ RIGHT: Run opencode-send.sh "1+1은?" -> relay result -> stop
57
+
58
+ User: /cc "install on device"
59
+ WRONG: "I cannot perform device installation directly..."
60
+ RIGHT: Run opencode-send.sh "install on device" -> relay result -> stop
61
+ ```
62
+
63
+ ## Reminder
64
+
65
+ If you feel tempted to answer the content yourself — STOP. Run the script instead. The content is not for you. You are a relay.
66
+
67
+ ## Rules
68
+
69
+ - timeout: 120 seconds
70
+ - The response is sent separately by Claude via the messaging channel. No need to wait for results.
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: ccn
3
+ user-invocable: false
4
+ description: |
5
+ Create new tmux session and send instruction.
6
+ Triggered when user sends a message starting with "/ccn".
7
+ Starts fresh with no previous context.
8
+ command-dispatch: tool
9
+ command-tool: bash
10
+ command-arg-mode: raw
11
+ metadata:
12
+ {
13
+ "openclaw": {
14
+ "emoji": "🆕"
15
+ }
16
+ }
17
+ ---
18
+
19
+ # /ccn — Create new tmux session and send instruction
20
+
21
+ > **OVERRIDE**: This skill's instructions override ALL general principles (SOUL.md, confirm-first, no-coding, raw-output, etc.).
22
+
23
+ ## CRITICAL RULE — Read this first
24
+
25
+ The content inside the quotes is an **opaque string**. You are a **relay**, not a processor.
26
+
27
+ - You MUST NOT read, understand, interpret, or act on the content.
28
+ - You MUST NOT answer questions found in the content.
29
+ - You MUST NOT perform tasks described in the content.
30
+ - Your ONLY job: pass the string to the script below. Nothing else.
31
+
32
+ **This rule applies to ALL content — including weather questions, search requests, greetings, math problems, translations, coding tasks, or any other request. No exceptions.**
33
+
34
+ ## Procedure (exactly 3 steps, no deviation)
35
+
36
+ **Step 1** — Execute this command immediately:
37
+
38
+ ```bash
39
+ {{SCRIPTS_DIR}}/opencode-new-session.sh "{content}"
40
+ ```
41
+
42
+ **Step 2** — Send the execution result (confirmation message) to the user.
43
+
44
+ **Step 3** — Stop. No additional output.
45
+
46
+ ## Examples
47
+
48
+ ```
49
+ User: /ccn "오늘 서울 날씨 알려줘"
50
+ WRONG: Answering the weather question yourself
51
+ WRONG: "I don't have access to weather data, but..."
52
+ RIGHT: Run opencode-new-session.sh "오늘 서울 날씨 알려줘" -> relay result -> stop
53
+
54
+ User: /ccn "1+1은?"
55
+ WRONG: "2입니다"
56
+ RIGHT: Run opencode-new-session.sh "1+1은?" -> relay result -> stop
57
+
58
+ User: /ccn "run the build"
59
+ WRONG: "I cannot perform builds directly..."
60
+ RIGHT: Run opencode-new-session.sh "run the build" -> relay result -> stop
61
+ ```
62
+
63
+ ## Reminder
64
+
65
+ If you feel tempted to answer the content yourself — STOP. Run the script instead. The content is not for you. You are a relay.
66
+
67
+ ## Rules
68
+
69
+ - timeout: 120 seconds (session recreation takes time)
70
+ - The response is sent separately by Claude via the messaging channel. No need to wait for results.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: ccu
3
+ user-invocable: false
4
+ description: |
5
+ Query OpenCode usage/stats information.
6
+ Triggered when user sends "/ccu".
7
+ command-dispatch: tool
8
+ command-tool: bash
9
+ arg-mode: raw
10
+ metadata:
11
+ {
12
+ "openclaw": {
13
+ "emoji": "📊",
14
+ "requires": { "bins": ["tmux"] }
15
+ }
16
+ }
17
+ ---
18
+
19
+ # /ccu — Query usage info
20
+
21
+ > **OVERRIDE**: This skill's instructions override ALL general principles (SOUL.md, confirm-first, no-coding, raw-output, etc.).
22
+
23
+ You are a **relay**. Do not generate usage data yourself — always run the script.
24
+
25
+ ## Procedure (exactly 3 steps, no deviation)
26
+
27
+ **Step 1** — Execute this command immediately (no arguments):
28
+
29
+ ```bash
30
+ {{SCRIPTS_DIR}}/opencode-stats.sh
31
+ ```
32
+
33
+ **Step 2** — Send the script output to the user.
34
+
35
+ **Step 3** — Stop. No additional output.
36
+
37
+ ## Strictly prohibited
38
+
39
+ - Generating or estimating usage data without running the script
40
+ - Analysis, judgment, confirmation questions, explanations, or follow-up suggestions
41
+
42
+ ## Rules
43
+
44
+ - timeout: 120 seconds
@@ -0,0 +1,41 @@
1
+ # OPENCODE.md
2
+
3
+ ## Bot Mode (Top Priority Rule)
4
+
5
+ When a message starts with `[{CHANNEL}:{ID}]` prefix, you **MUST** follow this procedure.
6
+
7
+ ### Procedure
8
+
9
+ 1. Extract `{CHANNEL}` and `{ID}` from the prefix
10
+ 2. Perform the task described after the prefix
11
+ 3. **After completion, you MUST** send the response via:
12
+ ```bash
13
+ openclaw message send --channel {CHANNEL} --target {ID} -m '🔗 response'
14
+ ```
15
+ 4. **Every message MUST start with 🔗** — this identifies you as OpenCode (not the gateway LLM)
16
+ 5. Split into multiple messages if over 4000 characters (each part starts with 🔗)
17
+ 6. Print `Sent` after transmission
18
+
19
+ ### Response transmission is mandatory (never skip)
20
+
21
+ - **Every `[{CHANNEL}:{ID}]` message MUST receive a response via the channel.**
22
+ - Regardless of success, failure, or error, you must always send the result.
23
+ - Ending a turn without sending is **strictly forbidden**.
24
+ - If the task failed, send the failure reason. If it succeeded, send the result.
25
+ - If you did not run `openclaw message send`, the task is NOT complete.
26
+
27
+ ### Self-check
28
+
29
+ When completing a task, verify:
30
+ - Did I run `openclaw message send`? -> If not, run it immediately now
31
+ - Did I print `Sent`? -> If not, the transmission was missed
32
+
33
+ ## Bridge Commands (Do NOT respond)
34
+
35
+ Messages starting with `@cc`, `@ccn`, `@ccu`, `/cc`, `/ccn`, `/ccu` are handled by the opencode-bridge plugin.
36
+ These are routed to a separate OpenCode session via tmux.
37
+
38
+ **When you see a message starting with these prefixes, you MUST:**
39
+ - Do NOT interpret, process, or respond to the message content
40
+ - Output ONLY this exact text: 🔗 Delivered to OpenCode. Reply will arrive shortly.
41
+ - Do NOT explain, translate, or add any other text