mirror of
https://github.com/hanzoai/dev.git
synced 2026-10-25 03:32:32 +00:00
Our history is just-every's with author emails rewritten, so the graphs are
disjoint and git finds no merge base. Supplied one by hand: d1f1f51a41, the
just-every commit matching our Oct-2025 fork point (22 files apart). 9618
upstream commits, 7004 files, +1.81M/-159k, 37 conflicts.
Resolution:
- Upstream code where our side was the Oct-2025 prototype of a feature they
have since reimplemented 3-5x larger (agent_runs, browser_sessions,
history_cell/{agent,browser}, the vt100 harness and its snapshots).
- Upstream's config.rs module split (builder/defaults/sources/validation)
kept; zen5-coder and the provider-follows-model rule re-applied on top.
- Ours where the file IS the identity: README, package.json, postinstall,
release notes pipeline, integration-zed.
- Hybrid where upstream improved a file we had branded: updates.rs (their
release-repo migration, our hanzoai/dev), release.yml (their fail-fast npm
auth check, our package name), chatwidget.rs (their turn handling, our
HANZO_USER_KEY hint), exec human output (their 237 lines, our banner).
Superseded and dropped deliberately: our resume_command_name() coder-alias
hack — upstream's derive_resume_command_name() reads the invocation basename
generically, which yields "dev" for us.
LLM.md now records the real topology and the sync point; AGENTS.md and
CLAUDE.md are symlinks to it again. Single parent on purpose: adopting
jecode/main as a second parent would re-import 13,742 commits carrying the
upstream author emails a prior rewrite deliberately removed.
Version 0.2.188 -> 0.2.189.
Co-authored-by: Hanzo Dev <[email protected]>
114 lines
2.4 KiB
Python
114 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Post-install configuration for the Codex devcontainer."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def ensure_history_files() -> None:
|
|
command_history_dir = Path("/commandhistory")
|
|
command_history_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
for filename in (".bash_history", ".zsh_history"):
|
|
(command_history_dir / filename).touch(exist_ok=True)
|
|
|
|
|
|
def fix_directory_ownership() -> None:
|
|
uid = os.getuid()
|
|
gid = os.getgid()
|
|
|
|
paths = [
|
|
Path.home() / ".codex",
|
|
Path.home() / ".config" / "gh",
|
|
Path.home() / ".cargo",
|
|
Path.home() / ".rustup",
|
|
Path("/commandhistory"),
|
|
]
|
|
|
|
for path in paths:
|
|
if not path.exists():
|
|
continue
|
|
|
|
stat_info = path.stat()
|
|
if stat_info.st_uid == uid and stat_info.st_gid == gid:
|
|
continue
|
|
|
|
try:
|
|
subprocess.run(
|
|
["sudo", "chown", "-R", f"{uid}:{gid}", str(path)],
|
|
check=True,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
print(f"[post_install] fixed ownership: {path}", file=sys.stderr)
|
|
except subprocess.CalledProcessError as err:
|
|
print(
|
|
f"[post_install] warning: could not fix ownership of {path}: {err.stderr.strip()}",
|
|
file=sys.stderr,
|
|
)
|
|
|
|
|
|
def setup_git_config() -> None:
|
|
home = Path.home()
|
|
host_gitconfig = home / ".gitconfig"
|
|
local_gitconfig = home / ".gitconfig.local"
|
|
gitignore_global = home / ".gitignore_global"
|
|
|
|
gitignore_global.write_text(
|
|
"""# Codex
|
|
.codex/
|
|
|
|
# Rust
|
|
/target/
|
|
|
|
# Node
|
|
node_modules/
|
|
|
|
# Python
|
|
__pycache__/
|
|
*.pyc
|
|
|
|
# Editors
|
|
.vscode/
|
|
.idea/
|
|
|
|
# macOS
|
|
.DS_Store
|
|
""",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
include_line = (
|
|
f"[include]\n path = {host_gitconfig}\n\n" if host_gitconfig.exists() else ""
|
|
)
|
|
|
|
local_gitconfig.write_text(
|
|
f"""# Container-local git configuration
|
|
{include_line}[core]
|
|
excludesfile = {gitignore_global}
|
|
|
|
[merge]
|
|
conflictstyle = diff3
|
|
|
|
[diff]
|
|
colorMoved = default
|
|
""",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
|
|
def main() -> None:
|
|
print("[post_install] configuring devcontainer...", file=sys.stderr)
|
|
ensure_history_files()
|
|
fix_directory_ownership()
|
|
setup_git_config()
|
|
print("[post_install] complete", file=sys.stderr)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|