git_context.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. Git and Session Context utilities.
  5. Entry shim — delegates to session_context and packages_context.
  6. Provides:
  7. output_json - Output context in JSON format
  8. output_text - Output context in text format
  9. """
  10. from __future__ import annotations
  11. import json
  12. from .git import run_git
  13. from .session_context import (
  14. get_context_json,
  15. get_context_text,
  16. get_context_record_json,
  17. get_context_text_record,
  18. output_json,
  19. output_text,
  20. )
  21. from .packages_context import (
  22. get_context_packages_text,
  23. get_context_packages_json,
  24. )
  25. from .trellis_config import read_trellis_config
  26. from .workflow_phase import (
  27. filter_platform,
  28. get_phase_index,
  29. get_step,
  30. resolve_effective_platform,
  31. )
  32. # Backward-compatible alias — external modules import this name
  33. _run_git_command = run_git
  34. # =============================================================================
  35. # Main Entry
  36. # =============================================================================
  37. def main() -> None:
  38. """CLI entry point."""
  39. import argparse
  40. parser = argparse.ArgumentParser(description="Get Session Context for AI Agent")
  41. parser.add_argument(
  42. "--json",
  43. "-j",
  44. action="store_true",
  45. help="Output in JSON format (works with any --mode)",
  46. )
  47. parser.add_argument(
  48. "--mode",
  49. "-m",
  50. choices=["default", "record", "packages", "phase"],
  51. default="default",
  52. help="Output mode: default (full context), record (for record-session), packages (package info only), phase (workflow step extraction)",
  53. )
  54. parser.add_argument(
  55. "--step",
  56. help="Step id for --mode phase, e.g. 1.1, 2.2. Omit to get the Phase Index.",
  57. )
  58. parser.add_argument(
  59. "--platform",
  60. help="Platform name for --mode phase, e.g. cursor, claude-code. Filters platform-tagged blocks.",
  61. )
  62. args = parser.parse_args()
  63. if args.mode == "record":
  64. if args.json:
  65. print(json.dumps(get_context_record_json(), indent=2, ensure_ascii=False))
  66. else:
  67. print(get_context_text_record())
  68. elif args.mode == "packages":
  69. if args.json:
  70. print(json.dumps(get_context_packages_json(), indent=2, ensure_ascii=False))
  71. else:
  72. print(get_context_packages_text())
  73. elif args.mode == "phase":
  74. content = get_step(args.step) if args.step else get_phase_index()
  75. if not content.strip():
  76. if args.step:
  77. parser.exit(2, f"Step not found: {args.step}\n")
  78. else:
  79. parser.exit(2, "Phase Index section not found in workflow.md\n")
  80. if args.platform:
  81. effective = resolve_effective_platform(
  82. args.platform, read_trellis_config()
  83. )
  84. content = filter_platform(content, effective)
  85. print(content, end="")
  86. else:
  87. if args.json:
  88. output_json()
  89. else:
  90. output_text()
  91. if __name__ == "__main__":
  92. main()