Files
yao-meta-skill/scripts/yao_cli_parser.py
T
YAO 31ce04c655 Split meta skill CLI and review gates
Merge the beta-ready Yao Meta Skill architecture, report, evidence gate, and release-boundary updates.\n\nRelease boundary: beta/public testing is allowed; formal world-class, fully reviewed, or superiority claims remain blocked until the pending evidence gates are accepted.
2026-06-17 18:43:02 +08:00

507 lines
28 KiB
Python

#!/usr/bin/env python3
"""Argparse surface for the Yao CLI."""
import argparse
from collections.abc import Callable
from yao_cli_parser_evidence import add_evidence_commands
from yao_cli_parser_operations import add_operating_loop_commands
SCRIPT_INTERFACE = "internal-module"
SCRIPT_INTERFACE_REASON = "Imported by yao.py to keep CLI parser declarations separate from command orchestration."
def _handler(command_handlers: dict[str, Callable[[argparse.Namespace], int]], name: str) -> Callable[[argparse.Namespace], int]:
if name not in command_handlers:
raise KeyError(f"Missing CLI command handler: {name}")
return command_handlers[name]
def build_parser(command_handlers: dict[str, Callable[[argparse.Namespace], int]]) -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Unified authoring CLI for yao-meta-skill.")
subparsers = parser.add_subparsers(dest="command", required=True)
init_cmd = subparsers.add_parser("init", help="Initialize a minimal skill package.")
init_cmd.add_argument("name")
init_cmd.add_argument("--description", default="Describe what the skill does and when to use it.")
init_cmd.add_argument("--title")
init_cmd.add_argument("--output-dir", default=".")
init_cmd.add_argument("--mode", choices=["scaffold", "production", "library", "governed"], default="scaffold")
init_cmd.add_argument("--archetype", choices=["scaffold", "production", "library", "governed"], default="scaffold")
init_cmd.add_argument("--external-reference", action="append", default=[])
init_cmd.add_argument("--user-reference", action="append", default=[])
init_cmd.add_argument("--local-constraint", action="append", default=[])
init_cmd.add_argument("--github-query")
init_cmd.add_argument("--github-top-n", type=int, default=3)
init_cmd.add_argument("--github-fixture-dir")
init_cmd.add_argument("--intent-job")
init_cmd.add_argument("--intent-real-input", action="append", default=[])
init_cmd.add_argument("--intent-primary-output")
init_cmd.add_argument("--intent-exclusion", action="append", default=[])
init_cmd.add_argument("--intent-constraint", action="append", default=[])
init_cmd.add_argument("--intent-standard", action="append", default=[])
init_cmd.add_argument("--intent-correction")
init_cmd.set_defaults(func=_handler(command_handlers, "command_init"))
quickstart_cmd = subparsers.add_parser(
"quickstart",
help="Interactive fast path for creating a scaffold-first skill package.",
)
quickstart_cmd.add_argument("--name")
quickstart_cmd.add_argument("--job")
quickstart_cmd.add_argument("--real-input", action="append", default=[])
quickstart_cmd.add_argument("--primary-output")
quickstart_cmd.add_argument("--description")
quickstart_cmd.add_argument("--title")
quickstart_cmd.add_argument("--output-dir", default=".")
quickstart_cmd.add_argument("--mode", choices=["scaffold", "production", "library", "governed"])
quickstart_cmd.add_argument("--archetype", choices=["scaffold", "production", "library", "governed"])
quickstart_cmd.add_argument("--external-reference", action="append", default=[])
quickstart_cmd.add_argument("--user-reference", action="append", default=[])
quickstart_cmd.add_argument("--local-constraint", action="append", default=[])
quickstart_cmd.add_argument("--constraint", action="append", default=[])
quickstart_cmd.add_argument("--github-query")
quickstart_cmd.add_argument("--github-top-n", type=int, default=3)
quickstart_cmd.add_argument("--github-fixture-dir")
quickstart_cmd.add_argument("--no-update-check", action="store_true")
quickstart_cmd.set_defaults(func=_handler(command_handlers, "command_quickstart"))
validate_cmd = subparsers.add_parser("validate", help="Run validate, lint, governance, and resource checks.")
validate_cmd.add_argument("skill_dir", nargs="?", default=".")
validate_cmd.add_argument("--require-manifest", action="store_true")
validate_cmd.set_defaults(func=_handler(command_handlers, "command_validate"))
optimize_cmd = subparsers.add_parser("optimize-description", help="Optimize description candidates for a target.")
optimize_cmd.add_argument(
"--target",
choices=["root", "team-frontend-review", "governed-incident-command", "all"],
default="root",
)
optimize_cmd.add_argument("--write", action="store_true", help="Write default report artifacts for the target.")
optimize_cmd.set_defaults(func=_handler(command_handlers, "command_optimize_description"))
promote_cmd = subparsers.add_parser("promote-check", help="Apply promotion policy and build iteration bundles.")
promote_cmd.set_defaults(func=_handler(command_handlers, "command_promote_check"))
python_compat_cmd = subparsers.add_parser(
"python-compat",
help="Check Python source compatibility for the supported CI/runtime interpreter.",
)
python_compat_cmd.add_argument("skill_dir", nargs="?", default=".")
python_compat_cmd.add_argument("--path", action="append", default=[])
python_compat_cmd.add_argument("--target-python", default="3.11")
python_compat_cmd.add_argument("--output-json")
python_compat_cmd.add_argument("--output-md")
python_compat_cmd.add_argument("--generated-at")
python_compat_cmd.set_defaults(func=_handler(command_handlers, "command_python_compat"))
architecture_audit_cmd = subparsers.add_parser(
"architecture-audit",
help="Render maintainability evidence for large Python files and CLI command surface.",
)
architecture_audit_cmd.add_argument("skill_dir", nargs="?", default=".")
architecture_audit_cmd.add_argument("--output-json")
architecture_audit_cmd.add_argument("--output-md")
architecture_audit_cmd.add_argument("--warn-lines", type=int, default=900)
architecture_audit_cmd.add_argument("--block-lines", type=int, default=1500)
architecture_audit_cmd.add_argument("--generated-at")
architecture_audit_cmd.set_defaults(func=_handler(command_handlers, "command_architecture_audit"))
review_cmd = subparsers.add_parser("review", help="Locate the current bundle and human review stub for a target.")
review_cmd.add_argument(
"--target",
choices=["root", "team-frontend-review", "governed-incident-command"],
default="root",
)
review_cmd.set_defaults(func=_handler(command_handlers, "command_review"))
snapshot_cmd = subparsers.add_parser("release-snapshot", help="Create a versioned snapshot from current promotion outputs.")
snapshot_cmd.add_argument(
"--target",
choices=["root", "team-frontend-review", "governed-incident-command"],
default="root",
)
snapshot_cmd.add_argument("--label", default="manual")
snapshot_cmd.set_defaults(func=_handler(command_handlers, "command_release_snapshot"))
flow_cmd = subparsers.add_parser(
"workspace-flow",
help="Run optimize, promotion, review refresh, and release snapshots as one authoring flow.",
)
flow_cmd.add_argument(
"--target",
choices=["root", "team-frontend-review", "governed-incident-command", "all"],
default="root",
)
flow_cmd.add_argument("--label", default="manual")
flow_cmd.set_defaults(func=_handler(command_handlers, "command_workspace_flow"))
report_cmd = subparsers.add_parser("report", help="Render route, iteration, regression, and context reports.")
report_cmd.add_argument("--refresh-optimization", action="store_true")
report_cmd.set_defaults(func=_handler(command_handlers, "command_report"))
skill_report_cmd = subparsers.add_parser("skill-report", help="Render the HTML skill report for a skill package.")
skill_report_cmd.add_argument("skill_dir", nargs="?", default=".")
skill_report_cmd.add_argument("--output-html")
skill_report_cmd.add_argument("--output-json")
skill_report_cmd.set_defaults(func=_handler(command_handlers, "command_skill_report"))
skill_interpretation_cmd = subparsers.add_parser(
"skill-interpretation",
help="Render the first-class skill interpretation report for a skill package.",
)
skill_interpretation_cmd.add_argument("skill_dir", nargs="?", default=".")
skill_interpretation_cmd.add_argument("--output-html")
skill_interpretation_cmd.add_argument("--output-json")
skill_interpretation_cmd.set_defaults(func=_handler(command_handlers, "command_skill_interpretation"))
review_viewer_cmd = subparsers.add_parser("review-viewer", help="Render a compact HTML review page for a skill package.")
review_viewer_cmd.add_argument("skill_dir", nargs="?", default=".")
review_viewer_cmd.add_argument("--output-html")
review_viewer_cmd.add_argument("--output-json")
review_viewer_cmd.set_defaults(func=_handler(command_handlers, "command_review_viewer"))
review_studio_cmd = subparsers.add_parser("review-studio", help="Render Review Studio 2.0 for a skill package.")
review_studio_cmd.add_argument("skill_dir", nargs="?", default=".")
review_studio_cmd.add_argument("--output-html")
review_studio_cmd.add_argument("--output-json")
review_studio_cmd.set_defaults(func=_handler(command_handlers, "command_review_studio"))
skill_os2_audit_cmd = subparsers.add_parser(
"skill-os2-audit",
help="Render a requirement-by-requirement Skill OS 2.0 completion audit.",
)
skill_os2_audit_cmd.add_argument("skill_dir", nargs="?", default=".")
skill_os2_audit_cmd.add_argument("--output-json")
skill_os2_audit_cmd.add_argument("--output-md")
skill_os2_audit_cmd.add_argument("--generated-at")
skill_os2_audit_cmd.set_defaults(func=_handler(command_handlers, "command_skill_os2_audit"))
skill_os2_coverage_cmd = subparsers.add_parser(
"skill-os2-coverage",
help="Render Skill OS 2.0 blueprint-to-evidence coverage.",
)
skill_os2_coverage_cmd.add_argument("skill_dir", nargs="?", default=".")
skill_os2_coverage_cmd.add_argument("--output-json")
skill_os2_coverage_cmd.add_argument("--output-md")
skill_os2_coverage_cmd.add_argument("--generated-at")
skill_os2_coverage_cmd.set_defaults(func=_handler(command_handlers, "command_skill_os2_coverage"))
add_evidence_commands(subparsers, command_handlers)
reference_scan_cmd = subparsers.add_parser(
"reference-scan",
help="Render a controlled benchmark scan report for a skill package.",
)
reference_scan_cmd.add_argument("skill_dir", nargs="?", default=".")
reference_scan_cmd.add_argument("--reference", action="append", default=[])
reference_scan_cmd.add_argument("--external-reference", action="append", default=[])
reference_scan_cmd.add_argument("--user-reference", action="append", default=[])
reference_scan_cmd.add_argument("--local-constraint", action="append", default=[])
reference_scan_cmd.add_argument("--output-md")
reference_scan_cmd.add_argument("--output-json")
reference_scan_cmd.set_defaults(func=_handler(command_handlers, "command_reference_scan"))
github_scan_cmd = subparsers.add_parser(
"github-benchmark-scan",
help="Search top public GitHub repositories and extract borrow or avoid patterns for a skill.",
)
github_scan_cmd.add_argument("skill_dir", nargs="?", default=".")
github_scan_cmd.add_argument("--query", required=True)
github_scan_cmd.add_argument("--top-n", type=int, default=3)
github_scan_cmd.add_argument("--fixture-dir")
github_scan_cmd.add_argument("--output-md")
github_scan_cmd.add_argument("--output-json")
github_scan_cmd.set_defaults(func=_handler(command_handlers, "command_github_benchmark_scan"))
intent_confidence_cmd = subparsers.add_parser(
"intent-confidence",
help="Render a confidence report for how well the real job, inputs, outputs, and exclusions are understood.",
)
intent_confidence_cmd.add_argument("skill_dir", nargs="?", default=".")
intent_confidence_cmd.add_argument("--context-json")
intent_confidence_cmd.add_argument("--output-md")
intent_confidence_cmd.add_argument("--output-json")
intent_confidence_cmd.set_defaults(func=_handler(command_handlers, "command_intent_confidence"))
intent_dialogue_cmd = subparsers.add_parser(
"intent-dialogue",
help="Render a front-loaded intent dialogue guide for a skill package.",
)
intent_dialogue_cmd.add_argument("skill_dir", nargs="?", default=".")
intent_dialogue_cmd.add_argument("--output-md")
intent_dialogue_cmd.add_argument("--output-json")
intent_dialogue_cmd.set_defaults(func=_handler(command_handlers, "command_intent_dialogue"))
reference_synthesis_cmd = subparsers.add_parser(
"reference-synthesis",
help="Render a multi-source reference synthesis report for a skill package.",
)
reference_synthesis_cmd.add_argument("skill_dir", nargs="?", default=".")
reference_synthesis_cmd.add_argument("--output-md")
reference_synthesis_cmd.add_argument("--output-json")
reference_synthesis_cmd.set_defaults(func=_handler(command_handlers, "command_reference_synthesis"))
output_risk_cmd = subparsers.add_parser(
"output-risk-profile",
help="Render predicted output failure modes and self-repair checks for a skill package.",
)
output_risk_cmd.add_argument("skill_dir", nargs="?", default=".")
output_risk_cmd.add_argument("--output-md")
output_risk_cmd.add_argument("--output-json")
output_risk_cmd.set_defaults(func=_handler(command_handlers, "command_output_risk_profile"))
artifact_design_cmd = subparsers.add_parser(
"artifact-design-profile",
help="Render artifact design direction and visual quality gates for a skill package.",
)
artifact_design_cmd.add_argument("skill_dir", nargs="?", default=".")
artifact_design_cmd.add_argument("--output-md")
artifact_design_cmd.add_argument("--output-json")
artifact_design_cmd.set_defaults(func=_handler(command_handlers, "command_artifact_design_profile"))
prompt_quality_cmd = subparsers.add_parser(
"prompt-quality-profile",
help="Render prompt-facing need model, RTF mapping, complexity, and quality checks for a skill package.",
)
prompt_quality_cmd.add_argument("skill_dir", nargs="?", default=".")
prompt_quality_cmd.add_argument("--output-md")
prompt_quality_cmd.add_argument("--output-json")
prompt_quality_cmd.set_defaults(func=_handler(command_handlers, "command_prompt_quality_profile"))
system_model_cmd = subparsers.add_parser(
"system-model",
help="Render a systems-thinking model for boundaries, feedback loops, drift, and leverage points.",
)
system_model_cmd.add_argument("skill_dir", nargs="?", default=".")
system_model_cmd.add_argument("--output-md")
system_model_cmd.add_argument("--output-json")
system_model_cmd.set_defaults(func=_handler(command_handlers, "command_system_model"))
iteration_directions_cmd = subparsers.add_parser(
"iteration-directions",
help="Render the top three next iteration directions for a skill package.",
)
iteration_directions_cmd.add_argument("skill_dir", nargs="?", default=".")
iteration_directions_cmd.add_argument("--output-md")
iteration_directions_cmd.add_argument("--output-json")
iteration_directions_cmd.set_defaults(func=_handler(command_handlers, "command_iteration_directions"))
feedback_cmd = subparsers.add_parser(
"feedback",
help="Capture lightweight reviewer feedback without running the full promotion flow.",
)
feedback_cmd.add_argument("skill_dir", nargs="?", default=".")
feedback_cmd.add_argument("--note")
feedback_cmd.add_argument("--rating", type=int, default=3)
feedback_cmd.add_argument("--category", default="general")
feedback_cmd.add_argument("--recommended-action", default="review")
feedback_cmd.set_defaults(func=_handler(command_handlers, "command_feedback"))
add_operating_loop_commands(subparsers, command_handlers)
baseline_compare_cmd = subparsers.add_parser(
"baseline-compare",
help="Render a lightweight with-skill vs baseline comparison across tracked targets.",
)
baseline_compare_cmd.set_defaults(func=_handler(command_handlers, "command_baseline_compare"))
skill_ir_cmd = subparsers.add_parser("skill-ir", help="Export platform-neutral Skill IR for a skill package.")
skill_ir_cmd.add_argument("skill_dir", nargs="?", default=".")
skill_ir_cmd.add_argument("--output-json")
skill_ir_cmd.add_argument("--validate-only", action="store_true")
skill_ir_cmd.set_defaults(func=_handler(command_handlers, "command_skill_ir"))
compile_skill_cmd = subparsers.add_parser(
"compile-skill",
help="Compile Skill IR into target-specific semantic contracts.",
)
compile_skill_cmd.add_argument("skill_dir", nargs="?", default=".")
compile_skill_cmd.add_argument("--target", action="append")
compile_skill_cmd.add_argument("--output-json")
compile_skill_cmd.add_argument("--output-md")
compile_skill_cmd.add_argument("--generated-at")
compile_skill_cmd.set_defaults(func=_handler(command_handlers, "command_compile_skill"))
output_eval_cmd = subparsers.add_parser("output-eval", help="Run Output Eval Lab assertion grading.")
output_eval_cmd.add_argument("--cases")
output_eval_cmd.add_argument("--output-json")
output_eval_cmd.add_argument("--output-md")
output_eval_cmd.add_argument("--blind-pack-json")
output_eval_cmd.add_argument("--blind-pack-md")
output_eval_cmd.add_argument("--blind-answer-key-json")
output_eval_cmd.set_defaults(func=_handler(command_handlers, "command_output_eval"))
output_review_kit_cmd = subparsers.add_parser(
"output-review-kit",
help="Prepare a reviewer-facing blind A/B output review kit without exposing the answer key.",
)
output_review_kit_cmd.add_argument("--blind-pack-json")
output_review_kit_cmd.add_argument("--blind-pack-md")
output_review_kit_cmd.add_argument("--decisions")
output_review_kit_cmd.add_argument("--output-json")
output_review_kit_cmd.add_argument("--output-md")
output_review_kit_cmd.add_argument("--output-html")
output_review_kit_cmd.add_argument("--write-template", action="store_true")
output_review_kit_cmd.set_defaults(func=_handler(command_handlers, "command_output_review_kit"))
output_execution_cmd = subparsers.add_parser(
"output-exec",
help="Record output-eval execution evidence, timing, and token usage.",
)
output_execution_cmd.add_argument("--cases")
output_execution_cmd.add_argument("--output-json")
output_execution_cmd.add_argument("--output-md")
output_execution_cmd.add_argument("--runner-command")
output_execution_cmd.add_argument(
"--provider-runner",
choices=["openai", "deepseek"],
help="Use the bundled provider-backed runner instead of a custom runner command.",
)
output_execution_cmd.add_argument("--provider-model", help="Model for --provider-runner; otherwise use YAO_OUTPUT_EVAL_MODEL.")
output_execution_cmd.add_argument("--provider-base-url", help="Override provider endpoint for compatible APIs.")
output_execution_cmd.add_argument(
"--provider-api-format",
choices=["responses", "chat-completions"],
help="Provider API shape used by the bundled provider runner. Defaults are selected from --provider-runner.",
)
output_execution_cmd.add_argument(
"--provider-thinking",
choices=["enabled", "disabled"],
help="Optional thinking mode override for chat-completions providers that support it.",
)
output_execution_cmd.add_argument(
"--provider-temperature",
type=float,
help="Sampling temperature for the bundled provider runner. Defaults to 0 for reproducibility.",
)
output_execution_cmd.add_argument("--api-key-env")
output_execution_cmd.add_argument("--allow-insecure-localhost", action="store_true")
output_execution_cmd.add_argument("--allow-custom-base-url", action="store_true")
output_execution_cmd.add_argument("--timeout-seconds", type=float)
output_execution_cmd.set_defaults(func=_handler(command_handlers, "command_output_execution"))
output_review_cmd = subparsers.add_parser(
"output-review",
help="Adjudicate blind A/B output review decisions against the answer key.",
)
output_review_cmd.add_argument("--blind-pack")
output_review_cmd.add_argument("--answer-key")
output_review_cmd.add_argument("--decisions")
output_review_cmd.add_argument("--output-json")
output_review_cmd.add_argument("--output-md")
output_review_cmd.add_argument("--write-template", action="store_true")
output_review_cmd.set_defaults(func=_handler(command_handlers, "command_output_review"))
output_review_import_cmd = subparsers.add_parser(
"output-review-import",
help="Import human blind A/B reviewer decisions into the canonical decision file.",
)
output_review_import_cmd.add_argument("--input", required=True)
output_review_import_cmd.add_argument("--format", choices=["auto", "json", "jsonl", "csv"], default="auto")
output_review_import_cmd.add_argument("--blind-pack")
output_review_import_cmd.add_argument("--output-json")
output_review_import_cmd.add_argument("--reviewer")
output_review_import_cmd.add_argument("--reviewed-at")
output_review_import_cmd.add_argument("--blind-review-attested", action="store_true")
output_review_import_cmd.add_argument("--run-adjudication", action="store_true")
output_review_import_cmd.add_argument("--answer-key")
output_review_import_cmd.add_argument("--adjudication-json")
output_review_import_cmd.add_argument("--adjudication-md")
output_review_import_cmd.set_defaults(func=_handler(command_handlers, "command_output_review_import"))
conformance_cmd = subparsers.add_parser("conformance", help="Run runtime conformance checks for Skill OS targets.")
conformance_cmd.add_argument("skill_dir", nargs="?", default=".")
conformance_cmd.add_argument("--target", action="append", choices=["openai", "claude", "agent-skills", "vscode", "generic"])
conformance_cmd.add_argument("--output-json")
conformance_cmd.add_argument("--output-md")
conformance_cmd.set_defaults(func=_handler(command_handlers, "command_conformance"))
runtime_permissions_cmd = subparsers.add_parser(
"runtime-permissions",
help="Probe generated target adapters for runtime permission enforcement metadata.",
)
runtime_permissions_cmd.add_argument("skill_dir", nargs="?", default=".")
runtime_permissions_cmd.add_argument("--package-dir", default="dist")
runtime_permissions_cmd.add_argument("--target", action="append", choices=["openai", "claude", "generic", "vscode"])
runtime_permissions_cmd.add_argument("--install-simulation-json")
runtime_permissions_cmd.add_argument("--output-json")
runtime_permissions_cmd.add_argument("--output-md")
runtime_permissions_cmd.set_defaults(func=_handler(command_handlers, "command_runtime_permissions"))
trust_cmd = subparsers.add_parser("trust", help="Run trust and security checks for a skill package.")
trust_cmd.add_argument("skill_dir", nargs="?", default=".")
trust_cmd.add_argument("--output-json")
trust_cmd.add_argument("--output-md")
trust_cmd.set_defaults(func=_handler(command_handlers, "command_trust"))
skill_atlas_cmd = subparsers.add_parser("skill-atlas", help="Build a portfolio-level Skill Atlas for a workspace.")
skill_atlas_cmd.add_argument("--workspace-root", default=".")
skill_atlas_cmd.add_argument("--output-dir")
skill_atlas_cmd.add_argument("--report-html")
skill_atlas_cmd.add_argument("--report-json")
skill_atlas_cmd.add_argument("--overlap-threshold", type=float)
skill_atlas_cmd.add_argument("--today")
skill_atlas_cmd.set_defaults(func=_handler(command_handlers, "command_skill_atlas"))
registry_audit_cmd = subparsers.add_parser("registry-audit", help="Build and audit Skill OS registry package metadata.")
registry_audit_cmd.add_argument("skill_dir", nargs="?", default=".")
registry_audit_cmd.add_argument("--registry-dir")
registry_audit_cmd.add_argument("--output-json")
registry_audit_cmd.add_argument("--output-md")
registry_audit_cmd.add_argument("--generated-at")
registry_audit_cmd.set_defaults(func=_handler(command_handlers, "command_registry_audit"))
package_cmd = subparsers.add_parser("package", help="Export compatibility artifacts for selected targets.")
package_cmd.add_argument("skill_dir", nargs="?", default=".")
package_cmd.add_argument("--platform", action="append")
package_cmd.add_argument("--output-dir", default="dist")
package_cmd.add_argument("--expectations")
package_cmd.add_argument("--zip", action="store_true")
package_cmd.set_defaults(func=_handler(command_handlers, "command_package"))
package_verify_cmd = subparsers.add_parser("package-verify", help="Verify generated package artifacts, archive safety, and registry parity.")
package_verify_cmd.add_argument("skill_dir", nargs="?", default=".")
package_verify_cmd.add_argument("--package-dir", default="dist")
package_verify_cmd.add_argument("--expectations", default="evals/packaging_expectations.json")
package_verify_cmd.add_argument("--registry-json", default="reports/registry_audit.json")
package_verify_cmd.add_argument("--output-json")
package_verify_cmd.add_argument("--output-md")
package_verify_cmd.add_argument("--require-zip", action="store_true")
package_verify_cmd.add_argument("--generated-at")
package_verify_cmd.set_defaults(func=_handler(command_handlers, "command_package_verify"))
install_simulate_cmd = subparsers.add_parser("install-simulate", help="Simulate installing a generated package into a temporary local skill root.")
install_simulate_cmd.add_argument("skill_dir", nargs="?", default=".")
install_simulate_cmd.add_argument("--package-dir", default="dist")
install_simulate_cmd.add_argument("--install-root")
install_simulate_cmd.add_argument("--output-json")
install_simulate_cmd.add_argument("--output-md")
install_simulate_cmd.add_argument("--generated-at")
install_simulate_cmd.set_defaults(func=_handler(command_handlers, "command_install_simulate"))
upgrade_check_cmd = subparsers.add_parser("upgrade-check", help="Compare current and previous registry package metadata for upgrade readiness.")
upgrade_check_cmd.add_argument("skill_dir", nargs="?", default=".")
upgrade_check_cmd.add_argument("--previous-package-json", required=True)
upgrade_check_cmd.add_argument("--current-package-json", default="reports/registry_audit.json")
upgrade_check_cmd.add_argument("--output-json")
upgrade_check_cmd.add_argument("--output-md")
upgrade_check_cmd.add_argument("--generated-at")
upgrade_check_cmd.set_defaults(func=_handler(command_handlers, "command_upgrade_check"))
test_cmd = subparsers.add_parser("test", help="Run a Makefile test target.")
test_cmd.add_argument("--target", default="test")
test_cmd.set_defaults(func=_handler(command_handlers, "command_test"))
update_cmd = subparsers.add_parser("check-update", help="Check whether a newer yao-meta-skill version is available.")
update_cmd.add_argument("--force", action="store_true")
update_cmd.add_argument("--no-cache", action="store_true")
update_cmd.add_argument("--version-url")
update_cmd.add_argument("--manifest-url")
update_cmd.add_argument("--timeout", type=float, default=3.0)
update_cmd.add_argument("--allow-custom-update-url", action="store_true")
update_cmd.set_defaults(func=_handler(command_handlers, "command_check_update"))
return parser