diff --git a/README.md b/README.md index 28206db..30b4f92 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,6 @@ mytoolkit --help | `ssh` | `list` / `connect` / `tunnel` / `cmd` | | `git` | `proxy` (set/unset/list/status) | | `server` | Manage dev/serve servers | -| `preflight` | Pre-flight checks for work-order execution | -| `utils` | `albany-cleanup` | | `update` | Reinstall from local repo | | `uninstall` | Uninstall | diff --git a/bin/cli.py b/bin/cli.py index 8eff44c..a5cb909 100644 --- a/bin/cli.py +++ b/bin/cli.py @@ -4,7 +4,7 @@ from pathlib import Path import click -from bin.commands import pdf, image, latex, video, bib, utils +from bin.commands import pdf, image, latex, video, bib from bin.commands.convert import convert_cmd from bin.commands.env import env_cmd from bin.commands.templates import templates_cmd @@ -13,9 +13,7 @@ from bin.commands.git import git_cmd from bin.commands.server import server_cmd from bin.commands.webpage import webpage_cmd from bin.commands.mail import mail -from bin.commands.preflight import preflight_cmd -from bin.commands.self_mgmt import update_cmd, uninstall_cmd, self_cmd -from bin.utils import handle_errors +from bin.commands.self_mgmt import update_cmd, uninstall_cmd @click.group() @@ -32,7 +30,6 @@ cli.add_command(image.image) cli.add_command(latex.latex) cli.add_command(video.video) cli.add_command(bib.bib) -cli.add_command(utils.utils) cli.add_command(env_cmd) cli.add_command(templates_cmd) cli.add_command(ssh_cmd) @@ -40,10 +37,8 @@ cli.add_command(git_cmd) cli.add_command(server_cmd) cli.add_command(webpage_cmd) cli.add_command(mail) -cli.add_command(preflight_cmd) cli.add_command(update_cmd) cli.add_command(uninstall_cmd) -cli.add_command(self_cmd) def main(): diff --git a/bin/commands/__init__.py b/bin/commands/__init__.py index a628508..a6c7570 100644 --- a/bin/commands/__init__.py +++ b/bin/commands/__init__.py @@ -1,11 +1,11 @@ """MyCLI subcommands.""" -from . import pdf, image, latex, video, bib, utils +from . import pdf, image, latex, video, bib from .env import env_cmd from .ssh import ssh_cmd from .git import git_cmd from .server import server_cmd from .webpage import webpage_cmd -from .self_mgmt import self_cmd, update_cmd, uninstall_cmd +from .self_mgmt import update_cmd, uninstall_cmd -__all__ = ["pdf", "image", "latex", "video", "bib", "utils", "env_cmd", "ssh_cmd", "git_cmd", "server_cmd", "webpage_cmd", "self_cmd", "update_cmd", "uninstall_cmd"] +__all__ = ["pdf", "image", "latex", "video", "bib", "env_cmd", "ssh_cmd", "git_cmd", "server_cmd", "webpage_cmd", "update_cmd", "uninstall_cmd"] diff --git a/bin/commands/preflight.py b/bin/commands/preflight.py deleted file mode 100644 index 0490b9a..0000000 --- a/bin/commands/preflight.py +++ /dev/null @@ -1,119 +0,0 @@ -"""Pre-flight check for work-order consistency and system health.""" - -import json -import os -import re -import sys -from pathlib import Path - -import click - - -@click.command(name="preflight") -def preflight_cmd(): - """Run pre-flight checks before executing work orders.""" - issues = [] - warnings = [] - - click.secho("Running pre-flight checks...", fg="cyan") - click.echo("") - - # === Check 1: work-order.md vs checkpoint JSON consistency === - work_order = Path.home() / "workspace/assistant/work-order.md" - - if work_order.exists(): - content = work_order.read_text() - - # Find progress numbers like "进度: X/Y 步骤" - progress_match = re.search(r"进度[::]\s*(\d+)/(\d+)\s*步骤", content) - if progress_match: - wo_current = int(progress_match.group(1)) - wo_total = int(progress_match.group(2)) - - # Find checkpoint files referenced in work-order - cp_match = re.search(r"进度档[::]\s*(\S+)", content) - if cp_match: - cp_path = Path.home() / "workspace" / cp_match.group(1) - if cp_path.exists(): - try: - cp = json.loads(cp_path.read_text()) - cp_current = cp.get("currentStep", 0) - cp_total = cp.get("totalSteps", 0) - cp_completed = len(cp.get("completedSteps", [])) - - if wo_current != cp_current or wo_total != cp_total: - issues.append( - f"进度不一致: 工作单 {wo_current}/{wo_total} vs 进度档 {cp_current}/{cp_total}" - ) - elif cp_current != cp_completed + 1 and cp_current <= cp_total: - # currentStep should be next step to do (completed + 1) - # unless all completed - pass - except json.JSONDecodeError: - warnings.append(f"进度档 JSON 损坏: {cp_path}") - - # Check for duplicate step numbers in step list - step_lines = re.findall(r"-\s*\[[x ]\]\s*\d+\.", content) - step_nums = [] - for line in step_lines: - m = re.search(r"(\d+)\.", line) - if m: - step_nums.append(int(m.group(1))) - - seen = set() - for num in step_nums: - if num in seen: - issues.append(f"步骤 {num} 在清单中重复出现") - seen.add(num) - - # Check for gaps in step numbering - if step_nums: - expected = list(range(1, max(step_nums) + 1)) - missing = [n for n in expected if n not in seen] - if missing: - warnings.append(f"步骤编号缺失: {missing}") - else: - warnings.append("工作单文件不存在") - - # === Check 2: .zshrc PATH references === - zshrc = Path.home() / ".zshrc" - if zshrc.exists(): - zshrc_content = zshrc.read_text() - # Find paths in PATH exports (lines starting with export PATH=) - for line in zshrc_content.splitlines(): - if not line.strip().startswith("export PATH="): - continue - refs = re.findall(r"/Users/\S+", line) - for ref in refs: - full_path = Path(ref).expanduser() - if not full_path.exists(): - issues.append(f".zshrc PATH 引用失效: {ref}") - else: - warnings.append(".zshrc 不存在") - - # === Check 3: Workspace symlink health === - workspace = Path.home() / "workspace" - if workspace.exists(): - for item in workspace.iterdir(): - if item.is_symlink(): - if not item.exists(): - issues.append(f"符号链接失效: {item.name} -> {os.readlink(item)}") - - # === Report === - click.echo("-" * 50) - if issues: - click.secho(f"发现 {len(issues)} 个问题:", fg="red") - for issue in issues: - click.secho(f" [x] {issue}", fg="red") - else: - click.secho("未发现严重问题", fg="green") - - if warnings: - click.secho(f"\n{len(warnings)} 个警告:", fg="yellow") - for w in warnings: - click.secho(f" [!] {w}", fg="yellow") - - click.echo("-" * 50) - - if issues: - sys.exit(1) diff --git a/bin/commands/self_mgmt.py b/bin/commands/self_mgmt.py index b48c651..db9ef31 100644 --- a/bin/commands/self_mgmt.py +++ b/bin/commands/self_mgmt.py @@ -107,12 +107,3 @@ def uninstall_cmd(): click.secho("mytoolkit removed.", fg="green") -# Backward compatibility: keep self_cmd group for any existing scripts -@click.group(name="self") -def self_cmd(): - """Manage mytoolkit itself (legacy, use 'update'/'uninstall' directly).""" - pass - - -self_cmd.add_command(update_cmd, name="update") -self_cmd.add_command(uninstall_cmd, name="uninstall") diff --git a/bin/commands/utils.py b/bin/commands/utils.py deleted file mode 100644 index 5ed79c6..0000000 --- a/bin/commands/utils.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Utility commands.""" - -from pathlib import Path - -import click - -from bin.utils import handle_errors - - -@click.group() -def utils(): - """Miscellaneous utilities.""" - pass - - -@utils.command("albany-cleanup") -@click.option("--dry-run", "-n", is_flag=True, help="Show what would be done") -@handle_errors -def albany_cleanup(dry_run): - """Clean up Albany temporary files (phalanx_*).""" - count = 0 - for file in Path(".").glob("phalanx_*"): - if dry_run: - click.echo(f"Would remove: {file}") - else: - file.unlink() - count += 1 - - if dry_run: - click.echo("Dry run completed") - else: - click.echo(f"Removed {count} Albany temporary files")