188 lines
6.7 KiB
Python
188 lines
6.7 KiB
Python
|
|
import os
|
|
import re
|
|
import json
|
|
|
|
BASE = "/opt/agent-jae-cli"
|
|
|
|
# ============================================================
|
|
# Ordered replacement pairs (most specific first!)
|
|
# ============================================================
|
|
REPLACEMENTS = [
|
|
# === Package scope & names (must be first - most specific) ===
|
|
("@mariozechner/pi-coding-agent", "@jaeswift/jae-coding-agent"),
|
|
("@mariozechner/pi-agent-core", "@jaeswift/jae-agent-core"),
|
|
("@mariozechner/pi-web-ui", "@jaeswift/jae-web-ui"),
|
|
("@mariozechner/pi-ai", "@jaeswift/jae-ai"),
|
|
("@mariozechner/pi-tui", "@jaeswift/jae-tui"),
|
|
("@mariozechner/pi-mom", "@jaeswift/jae-mom"),
|
|
("@mariozechner/pi", "@jaeswift/jae"), # pods package name
|
|
|
|
# === GitHub / repo references ===
|
|
("badlogic/pi-mono", "jae/agent-jae-cli"),
|
|
|
|
# === npm registry URL ===
|
|
("registry.npmjs.org/@mariozechner/pi-coding-agent", "registry.npmjs.org/@jaeswift/jae-coding-agent"),
|
|
|
|
# === Monorepo name ===
|
|
("pi-monorepo", "jae-monorepo"),
|
|
("pi-web-ui-example", "jae-web-ui-example"),
|
|
|
|
# === piConfig block ===
|
|
('"piConfig"', '"jaeConfig"'),
|
|
("'piConfig'", "'jaeConfig'"),
|
|
("piConfig", "jaeConfig"), # catch any other references
|
|
|
|
# === configDir ===
|
|
('"configDir": ".pi"', '"configDir": ".jae"'),
|
|
("configDir: \".pi\"", 'configDir: ".jae"'),
|
|
|
|
# === Environment variables ===
|
|
("PI_PACKAGE_DIR", "JAE_PACKAGE_DIR"),
|
|
("PI_SKIP_VERSION_CHECK", "JAE_SKIP_VERSION_CHECK"),
|
|
("PI_OFFLINE", "JAE_OFFLINE"),
|
|
("PI_STARTUP_BENCHMARK", "JAE_STARTUP_BENCHMARK"),
|
|
|
|
# === Binary names in bin fields ===
|
|
('"pi-ai": ', '"jae-ai": '),
|
|
('"pi-pods": ', '"jae-pods": '),
|
|
|
|
# === Build script: bun outfile ===
|
|
("--outfile dist/pi ", "--outfile dist/jae "),
|
|
("--outfile dist/pi\n", "--outfile dist/jae\n"),
|
|
|
|
# === Temp file prefixes ===
|
|
("pi-clipboard-", "jae-clipboard-"),
|
|
("pi-editor-", "jae-editor-"),
|
|
|
|
# === Workspace / script file references ===
|
|
("pi-mono.code-workspace", "jae-mono.code-workspace"),
|
|
("pi-test.sh", "jae-test.sh"),
|
|
("pi-mono", "jae-mono"), # catch any remaining pi-mono refs
|
|
|
|
# === process.title ===
|
|
('process.title = "pi"', 'process.title = "jae"'),
|
|
("process.title = 'pi'", "process.title = 'jae'"),
|
|
|
|
# === System prompt - specific phrases ===
|
|
("operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.",
|
|
"Agent JAE, an expert AI coding assistant. You help users write, edit, debug, and understand code."),
|
|
("Pi documentation (read only when the user asks about pi itself",
|
|
"Agent JAE documentation (read only when the user asks about Agent JAE itself"),
|
|
("pi itself, its SDK", "Agent JAE itself, its SDK"),
|
|
("pi topics", "Agent JAE topics"),
|
|
("pi .md files", "Agent JAE .md files"),
|
|
("pi packages (docs/packages.md)", "Agent JAE packages (docs/packages.md)"),
|
|
("about pi itself", "about Agent JAE itself"),
|
|
("When working on pi", "When working on Agent JAE"),
|
|
("read pi .md", "read Agent JAE .md"),
|
|
("read the pi docs", "read the Agent JAE docs"),
|
|
|
|
# === settings references to .pi/ paths in help text ===
|
|
(".pi/settings.json", ".jae/settings.json"),
|
|
(".pi/extensions", ".jae/extensions"),
|
|
(".pi/prompts", ".jae/prompts"),
|
|
(".pi/skills", ".jae/skills"),
|
|
|
|
# === tmux message mentioning Pi ===
|
|
("Pi works best with", "Agent JAE works best with"),
|
|
]
|
|
|
|
# Files/dirs to skip
|
|
SKIP_DIRS = {"node_modules", ".git", "dist", "package-lock.json"}
|
|
TARGET_EXTS = {".ts", ".json", ".md", ".sh", ".mjs", ".js", ".mts"}
|
|
|
|
def should_process(filepath):
|
|
"""Check if file should be processed."""
|
|
# Skip package-lock.json - will be regenerated
|
|
if os.path.basename(filepath) == "package-lock.json":
|
|
return False
|
|
_, ext = os.path.splitext(filepath)
|
|
return ext in TARGET_EXTS
|
|
|
|
def apply_replacements(content):
|
|
"""Apply all replacements in order."""
|
|
for old, new in REPLACEMENTS:
|
|
content = content.replace(old, new)
|
|
return content
|
|
|
|
def process_file(filepath):
|
|
"""Process a single file."""
|
|
try:
|
|
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
|
|
original = f.read()
|
|
except Exception as e:
|
|
print(f" SKIP (read error): {filepath}: {e}")
|
|
return False
|
|
|
|
modified = apply_replacements(original)
|
|
|
|
if modified != original:
|
|
with open(filepath, "w", encoding="utf-8") as f:
|
|
f.write(modified)
|
|
return True
|
|
return False
|
|
|
|
def walk_and_process(base_dir):
|
|
"""Walk directory tree and process all matching files."""
|
|
changed = 0
|
|
total = 0
|
|
for root, dirs, files in os.walk(base_dir):
|
|
# Filter out skip dirs
|
|
dirs[:] = [d for d in dirs if d not in SKIP_DIRS]
|
|
for fname in files:
|
|
filepath = os.path.join(root, fname)
|
|
if should_process(filepath):
|
|
total += 1
|
|
if process_file(filepath):
|
|
changed += 1
|
|
print(f" CHANGED: {filepath[len(base_dir):]}")
|
|
print(f"\nProcessed {total} files, changed {changed} files")
|
|
|
|
# === Handle bin field "pi": carefully in coding-agent package.json ===
|
|
def fix_coding_agent_bin():
|
|
"""Fix the bin field in coding-agent/package.json - needs special regex."""
|
|
pkg_path = os.path.join(BASE, "packages/coding-agent/package.json")
|
|
with open(pkg_path, "r") as f:
|
|
content = f.read()
|
|
# Replace "pi": "dist/cli.js" in bin section
|
|
# This is tricky - the bin field has "pi": "dist/cli.js"
|
|
content = content.replace('"pi": "dist/cli.js"', '"jae": "dist/cli.js"')
|
|
with open(pkg_path, "w") as f:
|
|
f.write(content)
|
|
print(" FIXED: coding-agent bin field pi -> jae")
|
|
|
|
print("=== Starting rebrand ===")
|
|
print(f"Base: {BASE}")
|
|
print()
|
|
|
|
# Step 1: Apply all text replacements
|
|
print("--- Applying text replacements ---")
|
|
walk_and_process(BASE)
|
|
|
|
# Step 2: Fix coding-agent bin field specifically
|
|
print("\n--- Fixing coding-agent bin field ---")
|
|
fix_coding_agent_bin()
|
|
|
|
# Step 3: Rename .pi directory to .jae
|
|
pi_dir = os.path.join(BASE, ".pi")
|
|
jae_dir = os.path.join(BASE, ".jae")
|
|
if os.path.isdir(pi_dir):
|
|
os.rename(pi_dir, jae_dir)
|
|
print(f" RENAMED: .pi -> .jae")
|
|
|
|
# Step 4: Rename pi-mono.code-workspace
|
|
old_ws = os.path.join(BASE, "pi-mono.code-workspace")
|
|
new_ws = os.path.join(BASE, "jae-mono.code-workspace")
|
|
if os.path.exists(old_ws):
|
|
os.rename(old_ws, new_ws)
|
|
print(f" RENAMED: pi-mono.code-workspace -> jae-mono.code-workspace")
|
|
|
|
# Step 5: Rename pi-test.sh
|
|
old_test = os.path.join(BASE, "pi-test.sh")
|
|
new_test = os.path.join(BASE, "jae-test.sh")
|
|
if os.path.exists(old_test):
|
|
os.rename(old_test, new_test)
|
|
print(f" RENAMED: pi-test.sh -> jae-test.sh")
|
|
|
|
print("\n=== Rebrand complete ===")
|