v1.9.40: add Codex integration — skill setup, deploy, GUI buttons

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
IPGO Developer
2026-03-07 07:27:22 +00:00
parent ddd6951610
commit e2bdffb41e
14 changed files with 1067 additions and 130 deletions

View File

@@ -1,5 +1,5 @@
"""
Setup tab — one-click installation for Claude Code integration.
Setup tab — one-click installation for local AI agent integration.
Includes configuration path management and backup/restore.
"""
@@ -8,7 +8,14 @@ import threading
from datetime import datetime
from tkinter import filedialog, messagebox
import customtkinter as ctk
from core.claude_setup import check_status, install_all, install_ssh_script, install_skill, generate_ssh_key
from core.claude_setup import (
check_status,
generate_ssh_key,
install_all,
install_claude_skill,
install_codex_skill,
install_ssh_script,
)
from core.i18n import t
from core.icons import icon_text, make_icon_button
from core.logger import log
@@ -25,13 +32,13 @@ class SetupTab(ctk.CTkFrame):
# Header
self.header_label = ctk.CTkLabel(
self._scroll, text=t("claude_integration"),
self._scroll, text=t("agent_integration"),
font=ctk.CTkFont(size=20, weight="bold")
)
self.header_label.pack(padx=20, pady=(20, 5))
self.desc_label = ctk.CTkLabel(
self._scroll, text=t("claude_desc"),
self._scroll, text=t("agent_desc"),
text_color="#9ca3af", justify="center"
)
self.desc_label.pack(padx=20, pady=(0, 15))
@@ -53,7 +60,9 @@ class SetupTab(ctk.CTkFrame):
("servers_json", "status_servers_json"),
("ssh_script", "status_ssh_script"),
("encryption", "status_encryption"),
("skill_installed", "status_skill"),
("claude_skill_installed", "status_claude_skill"),
("codex_skill_installed", "status_codex_skill"),
("codex_wrapper_installed", "status_codex_wrapper"),
("ssh_key_exists", "status_ssh_key"),
]
for key, i18n_key in status_items:
@@ -82,17 +91,40 @@ class SetupTab(ctk.CTkFrame):
ind_frame = ctk.CTkFrame(btn_frame, fg_color="transparent")
ind_frame.pack(fill="x")
self.ssh_py_btn = make_icon_button(ind_frame, "confirm", t("install_ssh_py"), width=110, fg_color="#6b7280",
command=self._install_script)
top_btn_row = ctk.CTkFrame(ind_frame, fg_color="transparent")
top_btn_row.pack(fill="x", pady=(0, 5))
self.ssh_py_btn = make_icon_button(
top_btn_row, "confirm", t("install_ssh_py"), width=120, fg_color="#6b7280",
command=self._install_script
)
self.ssh_py_btn.pack(side="left", padx=(0, 5))
self.skill_btn = make_icon_button(ind_frame, "confirm", t("install_skill"), width=110, fg_color="#6b7280",
command=self._install_skill)
self.skill_btn.pack(side="left", padx=5)
self.ssh_key_btn = make_icon_button(ind_frame, "confirm", t("install_ssh_key"), width=110, fg_color="#6b7280",
command=self._gen_key)
self.ssh_key_btn.pack(side="left", padx=5)
self.refresh_btn = make_icon_button(ind_frame, "refresh", t("refresh"), width=90, fg_color="#3b82f6",
command=self._refresh_status)
self.claude_skill_btn = make_icon_button(
top_btn_row, "confirm", t("install_claude_skill"), width=130, fg_color="#6b7280",
command=self._install_claude_skill
)
self.claude_skill_btn.pack(side="left", padx=5)
self.codex_skill_btn = make_icon_button(
top_btn_row, "confirm", t("install_codex_skill"), width=130, fg_color="#6b7280",
command=self._install_codex_skill
)
self.codex_skill_btn.pack(side="left", padx=5)
bottom_btn_row = ctk.CTkFrame(ind_frame, fg_color="transparent")
bottom_btn_row.pack(fill="x")
self.ssh_key_btn = make_icon_button(
bottom_btn_row, "confirm", t("install_ssh_key"), width=120, fg_color="#6b7280",
command=self._gen_key
)
self.ssh_key_btn.pack(side="left", padx=(0, 5))
self.refresh_btn = make_icon_button(
bottom_btn_row, "refresh", t("refresh"), width=90, fg_color="#3b82f6",
command=self._refresh_status
)
self.refresh_btn.pack(side="right")
# ── Monitoring section ─────────────────────────
@@ -328,8 +360,18 @@ class SetupTab(ctk.CTkFrame):
self._log(msg)
self._refresh_status()
def _install_claude_skill(self):
msg = install_claude_skill()
self._log(msg)
self._refresh_status()
def _install_codex_skill(self):
msg = install_codex_skill()
self._log(msg)
self._refresh_status()
def _install_skill(self):
msg = install_skill()
msg = install_claude_skill()
self._log(msg)
self._refresh_status()