{"id":51719763,"url":"https://github.com/elvisbrevi/yitpush","last_synced_at":"2026-07-17T09:01:25.225Z","repository":{"id":332150487,"uuid":"1132708687","full_name":"elvisbrevi/yitpush","owner":"elvisbrevi","description":"AI-powered Git commit tool that automates the entire git workflow with AI.","archived":false,"fork":false,"pushed_at":"2026-07-10T16:55:38.000Z","size":961,"stargazers_count":1,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-10T17:10:03.644Z","etag":null,"topics":["azure","cli","git","skills-sh"],"latest_commit_sha":null,"homepage":"https://yp.elvisbrevi.cl","language":"C#","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/elvisbrevi.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-12T10:44:54.000Z","updated_at":"2026-07-10T16:57:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/elvisbrevi/yitpush","commit_stats":null,"previous_names":["elvisbrevi/yitpush"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/elvisbrevi/yitpush","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvisbrevi%2Fyitpush","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvisbrevi%2Fyitpush/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvisbrevi%2Fyitpush/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvisbrevi%2Fyitpush/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elvisbrevi","download_url":"https://codeload.github.com/elvisbrevi/yitpush/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvisbrevi%2Fyitpush/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35351426,"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-07-11T02:00:05.354Z","response_time":104,"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":["azure","cli","git","skills-sh"],"created_at":"2026-07-17T09:00:37.377Z","updated_at":"2026-07-17T09:01:25.180Z","avatar_url":"https://github.com/elvisbrevi.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 yp (YitPush)\n\nAI-Powered Git Commit and Azure DevOps Management Tool — now with multi-provider AI support.\n\n## 🛠️ Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/elvisbrevi/yitpush.git\ncd yitpush\n\n# Build and install globally\ndotnet pack -c Release\ndotnet tool install --global --add-source ./nupkg YitPush\n```\n\n\u003e **Note:** The command is **`yp`**. If you've previously installed it as `yitpush`, uninstall it first: `dotnet tool uninstall -g YitPush`.\n\nAfter installing, run `yp setup` to configure your AI provider. The setup wizard will also offer to add the `yitpush` alias to your shell automatically (`.zshrc`, `.bashrc`, or `.profile` depending on your OS).\n\n### Install as an Agent Skill\n\nIf you use Claude Code, Cursor, Gemini CLI, or any [Agent Skills](https://agentskills.io)-compatible agent, install the `yp` skill so your agent knows how to use it automatically.\n\nVia `yp` (recommended — also offered during `yp setup`):\n```bash\nyp skill\n```\n\nOr directly with the skills CLI:\n```bash\nnpx skills add elvisbrevi/yitpush\n```\n\nListed on [skills.sh/elvisbrevi/yitpush](https://skills.sh/elvisbrevi/yitpush).\n\n## 🔑 Configuration\n\n### Interactive Setup (Recommended)\nRun the setup TUI to configure your preferred AI provider:\n```bash\nyp setup                # launches the TUI (default in a real terminal)\nyp setup --wizard       # forces the legacy 5-step wizard (auto-selected in CI)\nyp setup --tui          # forces the TUI even if the routing would otherwise pick --wizard\n```\n\nThe **TUI** shows a two-column live layout: the left column lists the providers (with a green dot for the ones you've already tested), the right column shows the API key status, endpoint, and the model picker. Keyboard: `←/→` switch provider, `↑/↓` switch model, `T` test connection, `Enter` save, `Esc` cancel. The TUI auto-falls-back to the wizard when stdin/stdout is redirected (CI), so scripts and pipes keep working without any change.\n\nThe **legacy wizard** (`--wizard`) guides you through:\n1. Selecting a provider: **OpenAI**, **Anthropic**, **Google Gemini**, **DeepSeek**, **OpenRouter**, or **NVIDIA NIM**\n2. Entering your API key (masked input)\n3. Selecting a model from a curated list or entering a custom one\n4. Validating the key with a test call\n5. Saving to `~/.yitpush/config.json`\n\n### Manual / Environment Variable (Backward Compatible)\nYou can still use environment variables. If no config file is found, `DEEPSEEK_API_KEY` is used automatically:\n```bash\nexport DEEPSEEK_API_KEY='your-api-key-here'\n```\n\nOther supported environment variables (override the config file):\n```bash\nexport OPENAI_API_KEY='...'\nexport ANTHROPIC_API_KEY='...'\nexport GOOGLE_API_KEY='...'\nexport DEEPSEEK_API_KEY='...'\nexport OPENROUTER_API_KEY='...'\n```\n\n## 📖 Usage\n\n### Git Commands\n| Command | Description |\n|---------|-------------|\n| `yp setup` | Configure your AI provider in the TUI (pass `--wizard` for the legacy 5-step flow) |\n| `yp skill` | Install the yp skill for your AI agent |\n| `yp commit` | Stage, commit and push with an AI-generated message |\n| `yp checkout` | Interactive branch checkout |\n| `yp pr` | Generate a pull request description between two branches |\n| `yp diff` | Show working-tree or branch-to-branch diff (supports `--files`, `--hunks`, `--stat`, `--json`) |\n| `yp --version` / `yp -V` | Print the assembly version (e.g. `2.3.0`) and exit 0 — safe to pipe |\n\n#### `yp diff` — friendly diff viewer\n\n`yp diff` wraps `git diff` with flags for the common agent and human workflows. The `--json` output is stable and safe to pipe into `jq` or any other tool:\n\n```bash\nyp diff                                       # working-tree diff, syntax-colored\nyp diff --files                               # just the file list with +N -M per file\nyp diff --hunks                               # changed lines only, no context (git diff -U0)\nyp diff feature/abc main --stat               # branch-to-branch stat\nyp diff --json | jq '.files[0].hunks[0].afterLine'        # first added line of the first hunk\nyp diff --json | jq '.files[] | select(.additions \u003e 0) | .path'  # only added paths\n```\n\nFlags: `--files` / `--stat` (file list), `--hunks` (changed lines only), `--json` (stable JSON: `{ files: [{ path, oldPath?, additions, deletions, isBinary, isRename, hunks: [{ beforeLine, afterLine, content }] }] }`), `--no-color` (auto-applied when stdout is redirected), and an optional `\u003crefA\u003e \u003crefB\u003e` positional pair for `git diff \u003crefA\u003e..\u003crefB\u003e`.\n\n### Azure DevOps Commands\n| Command | Description |\n|---------|-------------|\n| `yp azure-devops` | Enter interactive Azure DevOps menu |\n| `yp azure-devops repo new` | Create a new repository |\n| `yp azure-devops repo checkout` | Clone/Checkout a repository |\n| `yp azure-devops variable-group list` | List and inspect variable groups |\n| `yp azure-devops hu task` | Create tasks for a User Story |\n| `yp azure-devops hu list` | List tasks of a User Story and manage them |\n| `yp azure-devops hu show` | Show details of a User Story (title, effort, links) |\n| `yp azure-devops task show` | Show details of a Task (effort, remaining, description) |\n| `yp azure-devops task update` | Update task fields (effort, state, comments) |\n| `yp azure-devops task delete` | Move a work item to the recycle bin (prompts by default; pass `--yes` in CI) |\n| `yp azure-devops task attach` | Upload a local file as an `AttachedFile` on a work item |\n| `yp azure-devops hu link` | Link a repository branch to a User Story |\n| `yp azure-devops link` | Add a link (branch/commit/PR) to any work item — supports `--repo \u003cr\u003e --branch \u003cb\u003e` quick mode for both HUs and Tasks |\n\n#### 🧰 Stable Output for Agents and Scripts\nThe `hu show`, `task show`, and `hu list` commands accept a `--json` flag that emits a flat JSON object on stdout (no ANSI escapes), so the output is safe to pipe into `jq`:\n\n```bash\nyp azure-devops hu show MyOrg 12345 --json | jq '.title'\nyp azure-devops task show MyOrg 67890 --json | jq '.state'\nyp azure-devops hu list MyOrg MyProj 12345 --json | jq '.value | length'\n```\n\nWhen stdout is piped, the trailing interactive prompt is automatically skipped, so `yp ... | jq ...` never crashes with the Spectre \"isn't interactive\" error.\n\n## 🚀 Detailed Features\n\n### 🤖 Multi-Provider AI Support\n\n`yp` supports six AI providers. Run `yp setup` to switch between them at any time.\n\n| Provider | Models |\n|----------|--------|\n| OpenAI | gpt-4o, gpt-4o-mini, o1, o1-mini, ... |\n| Anthropic | claude-opus-4-6-20250514, claude-sonnet-4-6-20250514, claude-haiku-4-5-20251008 |\n| Google Gemini | gemini-2.0-flash, gemini-1.5-pro, ... |\n| DeepSeek | deepseek-chat, deepseek-reasoner |\n| OpenRouter | 100+ models (google/gemini-2.0-flash, openai/gpt-4o, ...) |\n| NVIDIA NIM | meta/llama-3.1-70b-instruct, nvidia/nemotron-4-340b-instruct, ... |\n\nThe `NVIDIA_API_KEY` environment variable overrides the stored API key for the NVIDIA NIM provider (same convention as `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, etc.).\n\n### 📝 Smart Commits\n`yp commit` analyzes your staged changes and generates a professional commit message. With `--conventional` the output follows the `\u003ctype\u003e(\u003cscope\u003e)?!?: \u003csubject\u003e` format; with `--amend` the last commit is rewritten in place from `git diff HEAD~1`.\n\n```bash\nyp commit                                # Auto commit and push\nyp commit --confirm                      # Review before committing\nyp commit --detailed                     # Generate title + body\nyp commit --language spanish             # Output in Spanish\nyp commit -l french                      # Short flag for language\nyp commit --conventional --type feat --scope wcf           # Conventional Commits, forced type/scope\nyp commit --conventional --detect-breaking                # Conventional + scan diff for breaking changes\nyp commit --amend                        # Regenerate last commit's message (no push)\nyp commit --template ~/.yitpush/commit.md                 # Render output through a custom template\n```\n\n| Flag | Description |\n|------|-------------|\n| `--confirm` | Ask for confirmation before committing |\n| `--detailed` | Generate detailed commit with title + body |\n| `--language \u003clang\u003e`, `--lang`, `-l` | Output language (default: english) |\n| `--save` | Save commit message to a markdown file |\n| `--conventional` | Format as Conventional Commits `\u003ctype\u003e(\u003cscope\u003e)?!?: \u003csubject\u003e` (with optional `BREAKING CHANGE:` footer) |\n| `--type \u003cfeat\\|fix\\|chore\\|refactor\\|docs\\|test\\|perf\\|build\\|ci\\|style\u003e` | Force the Conventional Commits type (overrides AI inference) |\n| `--scope \u003cscope\u003e` | Force the Conventional Commits scope (e.g. `api`, `wcf`) |\n| `--detect-breaking` | Scan the diff for breaking changes (removed C# public symbol, removed TS/JS export, JSON major bump, `#major.bump` marker) and feed them to the AI / append as footer |\n| `--amend` | Regenerate the LAST commit's message from `git diff HEAD~1` via `git commit --amend` — no `git add`, no push |\n| `--template \u003cpath-to-md\u003e` | Render the AI output through a Handlebars-ish template (`{{type}}`, `{{scope}}`, `{{subject}}`, `{{body}}`, `{{refs}}`); exits 6 if the file is missing |\n\nThe default commit format can also be set per project in `~/.yitpush/config.json` under the `\"commitFormat\"` key (`\"conventional\"`, `\"plain\"`, `\"gitmoji\"`, or a path to a template file). An explicit `--conventional` or `--template` flag on a single invocation overrides the stored default.\n\n### 📋 Pull Request Management\nTriage and act on Azure DevOps PRs from the terminal. Running `yp pr` with no args opens an interactive menu with six options: generate an AI description, list, show, comments, reply, or create a PR.\n\n```bash\nyp pr                                                       # interactive menu\nyp pr list                                                  # list open PRs\nyp pr show 12345                                            # show PR details (title, description, reviewers)\nyp pr comments 12345                                        # list discussion threads with file/line context\nyp pr reply 12345 678 --body \"Fixed in commit abc\"         # reply to a thread (REST API)\nyp pr create --source feature/x --target main --title \"feat: x\" --body-file desc.md  # open a PR (REST API)\nyp pr create --source feature/x --target main --title \"feat: x\" --body-file desc.md --auto-complete  # + auto-complete\nyp pr --detailed                                            # AI description (backward compat)\n```\n\n| Subcommand | Description |\n|-----------|-------------|\n| `list` | List open PRs in a Spectre table — `--json` for a stable envelope (`{ exitCode, count, pullRequests: [...] }`) |\n| `show \u003cpr-id\u003e` | Show title, description, source/target, status, author, reviewers — `--json` supported |\n| `comments \u003cpr-id\u003e` | List all discussion threads (REST API: `az repos pr thread` does not exist) with author, date, body, file path, line — `--json` supported |\n| `reply \u003cpr-id\u003e \u003cthread-id\u003e --body \"...\"` | Post a reply to a specific thread via the REST API — `--json` supported |\n| `create --source \u003cb\u003e --target \u003cb\u003e --title \u003ct\u003e [--body-file \u003cpath\u003e] [--auto-complete]` | Open a new PR via the REST API so the description can be larger than `az`'s argv limit. Without `--body-file` the description is read from stdin. `--auto-complete` sets `completionOptions` (`deleteSourceBranch: true`). `--json` supported |\n\n**Exit codes**: `0` success, `1` not-found (404), `2` auth/error, `3` validation.\n\nRead operations (`list`, `show`) go through `az repos pr` so the CLI's auth + defaults are reused; write operations (`reply`, `create`) and threads (`comments`) go through the Azure DevOps REST API so the description can be larger than `az`'s argv limit and because `az repos pr thread` does not exist.\n\nThe original AI-description flow (`yp pr --detailed -l spanish --save`) is preserved as a backward-compatible escape hatch.\n\n### 🔷 Azure DevOps Integration\n\n#### 📋 Task Management\n- **List \u0026 Update**: Use `yp azure-devops hu list` to see all tasks of a HU. Select a task to:\n    - View full **Description**.\n    - See **Effort (HH)**, **Esfuerzo Real (HH)** and **Remaining Work**.\n    - Inspect **Links** (Branches, Commits, PRs).\n    - **Update** fields interactively.\n\n#### ⚡ Quick Mode (CLI)\nUpdate work items directly from your terminal:\n```bash\n# Update multiple fields\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --state \"Active\" --effort-real \"5\" --remaining \"2\"\n\n# Add a comment (posts to the Discussion tab; use --history for the legacy History field)\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --comment \"Progress update: logic refactored\"\n\n# Edit title, description, or evidence (project-specific \"Evidencias de finalización\" field, resolved by name)\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --title \"New title\" --description \"New description\"\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --evidence \"curl http://localhost:3333/api/v1/comunas ...\"\n\n# Reassign the task (accepts UPN, display name, or empty to clear)\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --assigned-to \"elvis.brevi@sag.gob.cl\"\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --assigned-to \"Elvis Brevi\"\nyp azure-devops task update \u003corg\u003e \u003cid\u003e --assigned-to \"\"\n\n# Create tasks with info\nyp azure-devops hu task \u003corg\u003e \u003cproj\u003e \u003chu-id\u003e --description \"Task info\" --effort \"4\" --task-titles \"Desarrollo, Pruebas Unitarias\" --no-link\n```\n\n#### 🔗 Deep Linking\nLink your local branch to an Azure DevOps work item natively:\n```bash\n# Link a User Story to a branch\nyp azure-devops hu link \u003corg\u003e \u003cproj\u003e \u003cid\u003e --repo \u003cname\u003e --branch \u003cname\u003e\n\n# Link any work item (HU or Task) to a branch — quick mode (issue #9)\nyp azure-devops link \u003corg\u003e \u003cproj\u003e \u003cid\u003e --repo \u003cname\u003e --branch \u003cname\u003e\n```\nThis uses `ArtifactLink`, making the branch appear in the **Development** section of the Azure Boards UI. When the target work item is a Task, the `Custom.URLCommit` field is also written as a navigation fallback for legacy `az` scripts (no-op if the field doesn't exist). Omit `--repo` / `--branch` to fall back to the interactive picker.\n\n## 📝 Navigation\n- Every interactive menu includes a **`← Back`** option.\n- All lists (HUs, Tasks, Projects, Repos) are sorted by **Recency First** (ID Descending).\n- **Auto-detection**: The tool automatically detects your organizations and projects.\n\n---\n*Created with ❤️ by Elvis Brevi*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvisbrevi%2Fyitpush","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felvisbrevi%2Fyitpush","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvisbrevi%2Fyitpush/lists"}