{"id":50779711,"url":"https://github.com/bahamut45/pyclifer","last_synced_at":"2026-06-12T02:04:14.351Z","repository":{"id":352231349,"uuid":"1214370415","full_name":"bahamut45/pyclifer","owner":"bahamut45","description":"Structured Python CLI framework with rich output, auto-configuration, and built-in project scaffolding.","archived":false,"fork":false,"pushed_at":"2026-06-07T10:58:24.000Z","size":6746,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T11:22:07.986Z","etag":null,"topics":["cli","click","framework","python","rich"],"latest_commit_sha":null,"homepage":"https://bahamut45.github.io/pyclifer/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bahamut45.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T13:36:28.000Z","updated_at":"2026-06-07T10:57:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bahamut45/pyclifer","commit_stats":null,"previous_names":["bahamut45/pyclif","bahamut45/pyclifer"],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/bahamut45/pyclifer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bahamut45%2Fpyclifer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bahamut45%2Fpyclifer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bahamut45%2Fpyclifer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bahamut45%2Fpyclifer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bahamut45","download_url":"https://codeload.github.com/bahamut45/pyclifer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bahamut45%2Fpyclifer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34225367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","click","framework","python","rich"],"created_at":"2026-06-12T02:04:13.384Z","updated_at":"2026-06-12T02:04:14.332Z","avatar_url":"https://github.com/bahamut45.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/bahamut45/pyclifer/main/docs/assets/logo.png\" alt=\"pyclifer logo\" width=\"200\"\u003e\n\u003c/p\u003e\n\n# pyclifer\n\n[![PyPI](https://img.shields.io/pypi/v/pyclifer)](https://pypi.org/project/pyclifer/)\n[![codecov](https://codecov.io/gh/bahamut45/pyclifer/graph/badge.svg)](https://codecov.io/gh/bahamut45/pyclifer)\n\n**PY**thon **C**ommand **L**ine **I**nterface **F**ram**E**wo**R**k — a decorator-driven CLI framework built on\n[click-extra](https://github.com/kdeldycke/click-extra) and [rich-click](https://github.com/ewels/rich-click).\n\npyclifer provides four decorators (`@app_group`, `@group`, `@command`, `@option`) that give\nyour CLI applications automatic configuration management, environment variable binding,\nRich-enhanced logging, global option propagation, and standardized output formatting —\nwith zero boilerplate.\n\n## Installation\n\n```bash\npip install pyclifer\n```\n\nRequires Python 3.10+.\n\n## Development\n\nRequires [Task](https://taskfile.dev/#/installation).\n\n```bash\ntask install       # install dev + docs dependencies\npre-commit install # activate git hooks (ruff check + format on every commit)\n```\n\n```bash\ntask check         # lint + test\ntask test          # run test suite\ntask tox           # run tests across Python 3.10–3.13\n```\n\n```bash\ntask release:patch # bump patch version, commit, tag and push\ntask release:minor\ntask release:major\n```\n\nRun `task --list` to see all available tasks.\n\n## Quick Start\n\n```python\n\"\"\"CLI application using pyclifer.\"\"\"\nfrom pyclifer import app_group, command, option, Response\n\n\n@app_group(handle_response=True)\ndef main():\n    \"\"\"My CLI application.\"\"\"\n    pass\n\n\n@main.command()\n@option(\"--name\", \"-n\", default=\"World\", help=\"Your name\")\ndef hello(name: str) -\u003e Response:\n    \"\"\"Say hello.\"\"\"\n    return Response(success=True, message=f\"Hello {name}!\")\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n```bash\n$ python app.py --help\n Usage: app.py [OPTIONS] COMMAND [ARGS]...\n\n My CLI application.\n\n╭─ Options ────────────────────────────────────────────────────────────────────╮\n│     --version                                    Show the version and exit.  │\n│     --log-file       FILE                        Path to the log file (with  │\n│                                                  daily automatic rotation).  │\n│                                                  [env var: MYAPP_LOG_FILE]   │\n│ -v  --verbosity      LEVEL                       Either TRACE, DEBUG, INFO,  │\n│                                                  WARNING, ERROR, CRITICAL.   │\n│                                                  [env var: MYAPP_VERBOSITY]  │\n│                                                  [default: WARNING]          │\n│ -C  --config         CONFIG_PATH                 Configuration file          │\n│                                                  location. Supports glob     │\n│                                                  patterns and remote URLs.   │\n│                                                  [env var: MYAPP_CONFIG]     │\n│                                                  [default:                   │\n│                                                  /etc/myapp/*.{toml,yaml,    │\n│                                                  yml,json,ini,xml},          │\n│                                                  ~/.config/myapp/*.{toml,    │\n│                                                  yaml,yml,json,ini,xml}]     │\n│ -o  --output-format  [json|yaml|table|rich|raw]  Specify the output format   │\n│                                                  for the command. [env var:  │\n│                                                  MYAPP_OUTPUT_FORMAT]        │\n│                                                  [default: table]            │\n│ -h  --help                                       Show this message and exit. │\n╰──────────────────────────────────────────────────────────────────────────────╯\n╭─ Commands ───────────────────────────────────────────────────────────────────╮\n│ hello                       Say hello.                                       │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n$ python app.py hello --name Alice\nHello Alice!\n\n$ python app.py hello --help\n Usage: app.py hello [OPTIONS]\n\n Say hello.\n\n╭─ Options ────────────────────────────────────────────────────────────────────╮\n│ -n  --name           TEXT                        Your name [env var:         │\n│                                                  MYAPP_HELLO_NAME] [default: │\n│                                                  World]                      │\n│ -v  --verbosity      LEVEL                       Either TRACE, DEBUG, INFO,  │\n│                                                  WARNING, ERROR, CRITICAL.   │\n│                                                  [env var:                   │\n│                                                  MYAPP_HELLO_VERBOSITY]      │\n│                                                  [default: WARNING]          │\n│ -o  --output-format  [json|yaml|table|rich|raw]  Specify the output format   │\n│                                                  for the command. [env var:  │\n│                                                  MYAPP_HELLO_OUTPUT_FORMAT]  │\n│                                                  [default: table]            │\n│ -h  --help                                       Show this message and exit. │\n╰──────────────────────────────────────────────────────────────────────────────╯\n```\n\n## Features\n\n- **Decorator-driven** — four decorators (`@app_group`, `@group`, `@command`, `@option`) cover the full CLI surface\n- **Autoconfiguration** — TOML/YAML/JSON/XML config files with Linux path conventions (`/etc/\u003capp\u003e/`, `~/.config/\u003capp\u003e/`)\n- **Environment variables** — automatic prefix-based binding for every option\n- **Rich logging** — colored output, custom `TRACE` level, secret masking, rotating log files\n- **Structured output** — `Response` + `OperationResult` with JSON/YAML/Table/Rich/Raw formatters via `--output-format`\n- **Renderer system** — declarative `BaseRenderer` controls all output formats from a single class; streaming generators drive a Live Rich display via `rich_on_item` hooks\n- **Service layer** — `BaseInterface.respond()` auto-detects list vs generator, picks the right renderer, and builds the `Response` — commands stay thin\n- **Global options** — options marked `is_global=True` propagate automatically to all subcommands\n- **Pagination** — built-in `PaginatedResponse` with page/limit/total in JSON and YAML output\n- **Project scaffolding** — `pyclifer project init / add app / add command / add integration` generates a ready-to-use project structure\n\n## Documentation\n\nFull documentation at **[bahamut45.github.io/pyclifer](https://bahamut45.github.io/pyclifer/)**.\n\n## License\n\nMIT — see [LICENSE](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbahamut45%2Fpyclifer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbahamut45%2Fpyclifer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbahamut45%2Fpyclifer/lists"}