Consolidate to single code path with state file approach

- opencode-start.sh: checks for state file, injects omoa via OPENCODE_CONFIG_CONTENT
- omoa-post-upgrade.sh: removes omoa plugin from opencode.json after upstream install
- omoa-toggle.mjs: single Telegram skill to toggle on/off/status
- No file mutation of opencode.json, compatible with upstream updates
This commit is contained in:
Twentyninehairs_bot 2026-05-03 21:37:33 -07:00
parent a998c3975c
commit e1a965db4e
Signed by: Twentyninehairs_bot
GPG Key ID: CC558AA42F05E387
4 changed files with 235 additions and 38 deletions

View File

@ -8,51 +8,81 @@ oh-my-openagent adds multi-model orchestration, LSP tools, and other advanced fe
## How It Works ## How It Works
The solution uses the `OPENCODE_CONFIG_CONTENT` environment variable, which has higher runtime precedence than the config file. This means: The solution uses:
1. **State file** (`~/.config/opencode/omoa-enabled`) — determines if omoa should be active
2. **`OPENCODE_CONFIG_CONTENT` environment variable** — injects the plugin at runtime (higher precedence than config file)
3. **Post-upgrade script** — removes plugin entry from `opencode.json` after running upstream installer
- The base `opencode.json` stays clean (no plugin entry) This approach:
- The plugin is only injected at runtime when needed - Keeps `opencode.json` clean (no plugin entry)
- Is compatible with upstream install script
- No file mutation, no backups, no restore - No file mutation, no backups, no restore
## Files ## Files
- `opencode-start.sh` — Wrapper script that starts OpenCode with/without omoa - `opencode-start.sh` — Wrapper script that starts OpenCode with/without omoa
- `omoa-restart.mjs` — OpenCode skill for Telegram bot integration - `omoa-post-upgrade.sh` — Removes omoa plugin from `opencode.json` after upstream install
- `omoa-toggle.mjs` — OpenCode skill for Telegram bot integration
- `README.md` — This file - `README.md` — This file
## Usage
### Shell Script
```bash
./opencode-start.sh # Start without omoa (vanilla)
./opencode-start.sh --omoa # Start with omoa enabled
```
### Telegram Bot
When registered in `opencode.json` under "skills", use `/commands` in Telegram:
- `restart_with_omoa` — Restart OpenCode with omoa enabled
- `restart_without_omoa` — Restart OpenCode without omoa (vanilla)
## Installation ## Installation
1. Copy files to `~/.config/opencode/` 1. Copy files to `~/.config/opencode/`
2. Update systemd service to use `opencode-start.sh`: 2. Make scripts executable:
```bash
chmod +x ~/.config/opencode/opencode-start.sh
chmod +x ~/.config/opencode/omoa-post-upgrade.sh
```
3. Symlink to PATH:
```bash
ln -sf ~/.config/opencode/opencode-start.sh ~/.local/bin/opencode-start
ln -sf ~/.config/opencode/omoa-post-upgrade.sh ~/.local/bin/omoa-post-upgrade
```
4. Update systemd service to use wrapper:
```ini ```ini
[Service] [Service]
ExecStart=/home/kenny/.config/opencode/opencode-start.sh ExecStart=/home/kenny/.config/opencode/opencode-start.sh
``` ```
3. Add skill to `opencode.json`: 5. Add skill to `opencode.json`:
```json ```json
"skills": { "skills": {
"omoa-restart": { "omoa-toggle": {
"description": "Restart OpenCode with/without oh-my-openagent", "description": "Toggle oh-my-openagent on/off",
"path": "/home/kenny/.config/opencode/skills/omoa-restart.mjs" "path": "/home/kenny/.config/opencode/skills/omoa-toggle.mjs"
} }
} }
``` ```
4. Restart services 6. Restart services
## Usage
### Shell
```bash
# Start without omoa (vanilla)
opencode-start
# Start with omoa enabled
opencode-start --omoa
# After running upstream install script
omoa-post-upgrade
```
### Telegram Bot
Use `/commands``omoa_toggle`:
- `on` — Enable omoa (creates state file, restarts server)
- `off` — Disable omoa (deletes state file, restarts server)
- `status` — Check if omoa is enabled
### After Upstream Updates
When you run the upstream install script:
```bash
npx oh-my-openagent@latest install
omoa-post-upgrade # Clean the plugin entry from opencode.json
```
## Author ## Author

55
omoa-post-upgrade.sh Executable file
View File

@ -0,0 +1,55 @@
#!/bin/bash
# =============================================================================
# omoa-post-upgrade.sh — Clean oh-my-openagent plugin from opencode.json
# =============================================================================
#
# PURPOSE:
# After running the upstream oh-my-openagent install script, this script
# removes the plugin entry from opencode.json. This keeps the config clean
# so that omoa can be injected at runtime via OPENCODE_CONFIG_CONTENT.
#
# WHY THIS EXISTS:
# The upstream install script adds "oh-my-openagent@latest" to the plugin
# array in opencode.json. This conflicts with our runtime injection approach
# because:
# - If the plugin is in both opencode.json AND OPENCODE_CONFIG_CONTENT,
# it may be loaded twice
# - Our toggle approach uses OPENCODE_CONFIG_CONTENT to inject the plugin
# only when needed, so the config file should stay clean
#
# USAGE:
# ./omoa-post-upgrade.sh — Remove omoa plugin from opencode.json
#
# WHEN TO RUN:
# After running: npx oh-my-openagent@latest install
# This script is idempotent — safe to run multiple times
#
# UPSTREAM REPO:
# https://git.hibbhome.com/Hibbhome/opencode-omoa-toggle
#
# CREATED: 2026-05-03
# =============================================================================
CONFIG_FILE="$HOME/.config/opencode/opencode.json"
# Use python3 to remove oh-my-openagent from the plugin array
python3 -c "
import json
with open('$CONFIG_FILE', 'r') as f:
config = json.load(f)
# Remove oh-my-openagent from plugin array if present
if 'plugin' in config:
original = config['plugin'][:]
config['plugin'] = [p for p in config['plugin'] if 'oh-my-openagent' not in p]
if original != config['plugin']:
with open('$CONFIG_FILE', 'w') as f:
json.dump(config, f, indent=2)
print('Removed oh-my-openagent from opencode.json')
else:
print('oh-my-openagent not found in opencode.json — no changes needed')
else:
print('No plugin array in opencode.json — no changes needed')
"

86
omoa-toggle.mjs Normal file
View File

@ -0,0 +1,86 @@
/**
* omoa-toggle.mjs OpenCode skill to toggle oh-my-openagent on/off
*
* PURPOSE:
* Provides a single Telegram command to toggle oh-my-openagent on/off.
* Creates or deletes a state file, then restarts the OpenCode server.
*
* HOW IT WORKS:
* - State file: ~/.config/opencode/omoa-enabled
* - If state file exists omoa is enabled
* - If state file does not exist omoa is disabled
* - The opencode-start.sh script checks for this state file at startup
* - If present, it injects omoa via OPENCODE_CONFIG_CONTENT
* - If absent, it starts OpenCode vanilla (no omoa)
*
* USAGE:
* In Telegram: /commands omoa_toggle
* Actions:
* - on: Create state file, restart server (enables omoa)
* - off: Delete state file, restart server (disables omoa)
* - status: Check if state file exists
*
* UPSTREAM COMPATIBILITY:
* This approach does NOT modify opencode.json directly.
* The upstream install script can run safely use omoa-post-upgrade.sh
* to clean the plugin entry from opencode.json after running the installer.
*
* UPSTREAM REPO:
* https://git.hibbhome.com/Hibbhome/opencode-omoa-toggle
*
* CREATED: 2026-05-03
*/
import { tool } from "@opencode-ai/plugin/tool";
import { execSync } from "node:child_process";
import { existsSync, writeFileSync, unlinkSync } from "node:fs";
const STATE_FILE = "/home/kenny/.config/opencode/omoa-enabled";
export const OmoaTogglePlugin = async (_ctx) => {
return {
tool: {
omoa_toggle: tool({
description: "Toggle oh-my-openagent on or off",
args: {
action: tool.schema.enum(["on", "off", "status"]).describe("Action: on, off, or status"),
},
async execute(args) {
try {
if (args.action === "status") {
return existsSync(STATE_FILE)
? "oh-my-openagent is ENABLED (state file exists)"
: "oh-my-openagent is DISABLED (no state file)";
}
if (args.action === "on") {
// Create state file to enable omoa
writeFileSync(STATE_FILE, new Date().toISOString());
// Restart the OpenCode server
execSync("systemctl --user restart opencode-serve.service");
return "oh-my-openagent ENABLED. Server restarting...";
}
if (args.action === "off") {
// Delete state file to disable omoa
if (existsSync(STATE_FILE)) {
unlinkSync(STATE_FILE);
}
// Restart the OpenCode server
execSync("systemctl --user restart opencode-serve.service");
return "oh-my-openagent DISABLED. Server restarting...";
}
return "Invalid action. Use: on, off, or status";
} catch (err) {
return `Error: ${err.message}`;
}
},
}),
},
};
};

View File

@ -4,21 +4,34 @@
# ============================================================================= # =============================================================================
# #
# PURPOSE: # PURPOSE:
# Wrapper script that starts the OpenCode server, optionally injecting the # Wrapper script that starts the OpenCode server. If a state file exists
# oh-my-openagent plugin at runtime via OPENCODE_CONFIG_CONTENT. # at ~/.config/opencode/omoa-enabled, the oh-my-openagent plugin is injected
# No files are mutated — the base opencode.json stays clean. # at runtime via OPENCODE_CONFIG_CONTENT. Otherwise, OpenCode starts vanilla.
#
# USAGE:
# ./opencode-start.sh — Start without omoa (vanilla)
# ./opencode-start.sh --omoa — Start with omoa enabled
# #
# HOW IT WORKS: # HOW IT WORKS:
# - Reads ~/.config/opencode/opencode.json # - Checks for state file: ~/.config/opencode/omoa-enabled
# - If --omoa flag is set, uses python3 to add oh-my-openagent@latest to the # - If state file exists:
# plugin array and sets OPENCODE_CONFIG_CONTENT with the modified JSON # - Reads opencode.json
# - If --omoa is not set, starts with the clean config file # - Uses python3 to add oh-my-openagent@latest to the plugin array
# - OPENCODE_CONFIG_CONTENT has higher precedence than the config file, # - Sets OPENCODE_CONFIG_CONTENT with the modified JSON
# so the plugin is only active for that process # - OPENCODE_CONFIG_CONTENT has higher precedence than the config file
# - If state file does not exist:
# - Starts OpenCode with the clean config file (no omoa)
# - No files are mutated — the base opencode.json stays clean
#
# STATE FILE:
# ~/.config/opencode/omoa-enabled
# - If this file exists, omoa is enabled
# - If this file does not exist, omoa is disabled
# - Created/deleted by the omoa_toggle Telegram skill
#
# USAGE:
# opencode-start — Start without omoa (vanilla)
# opencode-start --omoa — Start with omoa enabled
#
# SYSTEMD INTEGRATION:
# This script is used as the ExecStart command in the opencode-serve.service.
# The systemd service runs this in the background.
# #
# UPSTREAM REPO: # UPSTREAM REPO:
# https://git.hibbhome.com/Hibbhome/opencode-omoa-toggle # https://git.hibbhome.com/Hibbhome/opencode-omoa-toggle
@ -28,9 +41,22 @@
CONFIG_FILE="$HOME/.config/opencode/opencode.json" CONFIG_FILE="$HOME/.config/opencode/opencode.json"
OPENCODE_BIN="$HOME/.opencode/bin/opencode" OPENCODE_BIN="$HOME/.opencode/bin/opencode"
STATE_FILE="$HOME/.config/opencode/omoa-enabled"
PORT=4096 PORT=4096
# Check if omoa should be enabled
# Either via state file or --omoa flag
ENABLE_OMOA=false
if [ -f "$STATE_FILE" ]; then
ENABLE_OMOA=true
fi
if [[ "$*" == *"--omoa"* ]]; then if [[ "$*" == *"--omoa"* ]]; then
ENABLE_OMOA=true
fi
if [ "$ENABLE_OMOA" = true ]; then
# Inject oh-my-openagent plugin at runtime using python3 # Inject oh-my-openagent plugin at runtime using python3
MODIFIED_CONFIG=$(python3 -c " MODIFIED_CONFIG=$(python3 -c "
import json import json