Releases: nexiouscaliver/OmniForge
Release list
3.4.0 — Round-2 Latency: Deterministic Pre-Dispatch, Judgment-Only Adjudication, Fix Brief, Cost-Weighted Partition
What's New
Round-2 latency release, validated GO by the R2-E A/B run (round2-validation.md): the review lead-in, adjudication, and reviewer balance are now deterministic scripts, and every posting run ends with a paste-ready fix brief for the developer's coding agent.
Added
omni_prepare.pydeterministic pre-dispatch (R2-A, PR #34) — one stdlib-only invocation runs the whole Phase-1 lead-in (gather file, partition, digest, per-agent dispatch briefs) and emitsprepare.json+ one-line machine receipts withphases.jsonlpreparerows. Pre-dispatch: 827 s fleet median → 265 s raw / ~193 s production-equivalent (prepare itself is O(seconds) at any MR size — 3.73 s / 4.05 s measured). Exit codes are a soft-fail contract: a nonzero exit falls back to the improvised Phase-1 path immediately — no retry, no STOP — proven end-to-end by the R2-E force-exit-1 fallback probe.omni_adjudicate.pymechanical pre-pass + judgment-only Phase 5 (R2-B, PR #33) — the worklist's mechanical rows (single-agent autos, near-dup merges, prior matches) are decided script-final without the LLM; only cross-finding and validity rows reach judgment. Adjudication: 461 s / 40 turns fleet median → 239 s / 22 turns — best ever measured on a real MR (17 of 26 rows auto-decided, 9-row judgment core).- Fix-brief note (R2-P, PR #32) — the poster's last artifact is a self-contained "OmniForge fix brief — paste this into your coding agent" general MR note (template v1): frozen guard clause first, MR-intent line, then one
FIXED in <short-sha> —/SKIPPED —/QUESTION —line per finding linking its exact#note_<id>thread. R2-E verified 20/20 links map 1:1 to posted artifacts (0 dead links, set-equality with the new-adjudicated set); poster stdout gainsfix_brief: true.
Changed
- Cost-weighted 3-agent partition (R2-D, PR #35) —
omni_partition.pybalances reviewer assignments by a per-file cost model (1.25× cap, security spill) instead of file count: real-MR per-agent balance 1288/1296/417‰ → 1000/1000/1000‰ (76/75/76 cost units) — deterministic, ending the 2× reviewer wall skew; dispatch briefs trimmed −51.4 % with tripwire tests against over-trimming. - SKILL.md Phases 1–3 rewritten script-first — prepare is the primary lead-in; the fetcher executes only inside prepare and at the two sanctioned
--verify-headcheckpoints (R2-E gate 2: zero double-fetch on the knob-on path).
Tests
- Full suite at the release commit: 560 passed + 128 subtests (was 383 + 19 at 3.3.3) —
python3 -m pytest plugins/omniforge/tests.
Validation
- R2-E A/B verdict: GO (frozen head of MR !21; A = 3.3.3 dry vs B = Round-2 real-posting). Every functional, safety, and quality gate passed: prepare-first structure with machine receipts, zero double-fetch, script-final auto rows, 8/8 planned threads anchored first-try, poster
failures: 0, zero sleeps, zero MCP on the data path (MCP remains only for the Phase-2/7 worktree lifecycle), waiter unchanged; findings 21 vs 21 (≥70 % of baseline), every verdict flip attributed to reviewer nondeterminism — 0 attributable to the Round-2 levers. - Fallback probe PASS (gate 6) —
omni_prepare.pystubbed to exit 1 → improvised-path fallback invoked 9 s later (no retry, no STOP); the run completed engine exit 0 with a full 23,806-byte report, harness SUCCESS. - Fix-brief checks PASS (gate 5) — guard clause first, MR-intent line, 20/20 exact
#note_<id>links, listed set == new-adjudicated set, FIXED/SKIPPED/QUESTION vocabulary verbatim, posted last (note 3790163250). - Two turn-count calibration misses, disclosed — pre-dispatch 45 turns vs ≤10 and adjudication 22 turns vs ≤12: decomposition shows harness-only token friction (≈12 turns), retrospective re-render absent on first reviews (≈8), and agent inspection verbosity (≈25) — not lever regressions (the 3.3.3 baseline measured 42 pre-dispatch turns under the same harness). R2-F fleet telemetry is the production confirmation — watch
phases.jsonlpreparerows and Phase-5 walls.
Known limitations (stated honestly)
- The ≤10/≤12 turn targets are unreachable under the local A/B harness for ANY arm including the 3.3.3 baseline; they are re-anchored to production telemetry for R2-F.
- 3.4.x backlog (disclosed):
ADJ_ARGSsnippet ↔ argparse first-call hiccup (2-turn self-correcting tax per run), retrospective prepare double-gather (+4 s), fix-brief >25-findings cap path awaits its first real >25-findings MR (unit-covered only).
Contributors
- @nexiouscaliver (Shahil Kadia) — Round-2 levers, tests, and R2-E validation.
Full changelog: see CHANGELOG.md § 3.4.0.
3.3.3 — fix release: poster full-path projects, deletion-MR pre-filter, reply-preference
[3.3.3] - 2026-09-04
Fix release — resolves the three findings from the 3.3.2 production canary (re-review of MR !1388, pure-deletion +0/−16).
Fixed
- Poster full-path project 404 —
omni_post_review.pyURL-encodes non-numeric--projectvalues on EVERY request path it builds (guard notes GET, refs GET, summary/thread/reply/note POSTs) via the sharedomni_glab_api.encode_project; the CLI help now accepts and documents the bare full path. Production motive (canary, session e18dbabb):omni_post_review.py --project regenai-gitlab/regenai-digital/cleo→ guard GET 404 — the FETCHER gotencode_projectin 3.3.2 but the poster never did; the run recovered only by switching to the numeric ID. Live-proven first-try on scratch MR !21 with the full path (note-only batch, exit 0,notes: 1, note re-fetched by id then deleted 204)
Added
- Deletion-MR / unanchorable-loci pre-filter (SKILL.md Phase 4 + posting-guide) — BEFORE building the findings payload, check the gather data for anchorability: an MR with zero added lines (pure-deletion, e.g. +0/−16) or a finding whose locus has no anchorable line plans as a note entry or a reply on the matching prior thread — never as a thread entry. Production motive (canary, MR !1388): 4 inline threads planned on a pure-deletion MR → GitLab
400 Bad request — Note {:line_code=>["can't be blank"]}→ fail-fast aborted the batch (correct) but the threads were burned; the poster docstring now says theline_code-400 remedy is planning (note/reply), not retrying - Reply-preference routing rule (SKILL.md Phase 4) — follow-ups to an existing OmniForge thread MUST be posted as replies on that thread (
reply_to_thread_id); note entries are ONLY for genuinely anchorless NEW findings with no existing thread — never substitute a note where a reply belongs. Production motive (canary): two prior-thread follow-ups ("Prior thread X is confirmed…") posted as top-level NOTES because the note path had become the path of least resistance
Changed
encode_projectis ONE shared helper — moved fromomni_fetch_mr.pyintoomni_glab_api.py(same semantics: numeric digits-only passthrough, already-%-encoded passthrough, elsequote(safe="")); the fetcher now calls the shared helper (behavior identical — its 3 encoding tests unchanged and green) and the poster uses it on every path builder- Test suite 383 + 19 subtests (was 376 + 19)
- Version bumped to 3.3.3
Deferred to 3.3.4+
- line_range positions (needs nested-param dev validation), adjudication-turns lever, dead-subagent watchdog automation — unchanged from 3.3.2
3.3.2 — perf + reliability mini release
[3.3.2] - 2026-09-04
Added
- Note entries on
omni_post_review.py— findings objects carrying ONLY{"body": ...}(nofile_path/line_number) post as top-level MR notes (execution order: summary → threads → replies → notes), counted in the additive stdout keynotes; mixed batches fine; a body-only entry that also carries anchor keys is an ambiguous-shape usage error (exit 2 — never silently skipped). Replaces the raw-glab general-notes path:glab api --input -silently drops note bodies — production !1388 lost 5/5 MR-meta notes to it. Live-proven on scratch MR !21: note-only batch (no--summary, no--skip-summary) exit 0 withnotes: 1, the note re-fetched by id, then deleted (204) --hostonomni_post_review.py— same resolution order as the fetch script (flag > GITLAB_HOST > CI_API_V4_URL > https://gitlab.com), threaded through EVERY API call including the guard's notes listing and the note posts (parity withomni_fetch_mr.py)- Auto-summary-skip for no-new-thread batches —
--summaryis required ONLY when the batch has at least one new-thread entry; reply-only and note-only batches proceed without it (implied skip: no summary, guard not evaluated — same as reply-only today). Removes the production friction of reply-only batches dying on argparse exit 2 (seen twice in production, one wasted turn each);--skip-summarykeeps its current meaning
Changed
- Duplicate-summary guard paginates — the guard's notes listing now goes through
omni_glab_api.get_all(per_page=100, page-following), so a busy MR (100+ notes) can no longer hide an OmniForge summary beyond page 1; a single page still costs exactly ONE notes GET (pinned by test) omni_fetch_mr.pyaccepts bare full-path projects — non-numeric--projectvalues are URL-encoded (urllib.parse.quote(safe="")) on every endpoint the script builds; numeric IDs and pre-encoded values pass through unchanged, and the CLI help says so. Production motive: the 3.3.1 A/B arm passedregenai-gitlab/regenai/regenai-baseunencoded → 3× HTTP 404 ≈ 72 s before retreating to the numeric ID. Live-proven first-try on MR !21 with the full path (6 API calls, 4.1 s)- SKILL.md + posting-guide document note entries — Phase 6 posting instructions and the guide's findings-shape section name note entries as the poster's general-notes path (with the
glab api --input -body-drop hazard as the reason); Phase 3 gains the stalled-subagent rule: attempt exactly ONE SendMessage resume before harvesting partials — never loop - Test suite 376 + 19 subtests (was 362 + 19)
- Version bumped to 3.3.2
Fixed
- Headless MCP −32000 — the
.mcp.jsonlaunch arg is pinned tomcp[cli]>=1.0.0,<2.0.0: the unpinneduv run --with mcp[cli]resolves mcp 2.x, wherefrom mcp.server.fastmcp import FastMCPdies at import and every tool call returns −32000 (diagnosed end-to-end in 3.3.1 with this exact pin proven locally; now shipped under the operator's keep-MCP decision)
Deferred to 3.3.3+
- line_range positions (needs nested-param dev validation), adjudication-turns lever, dead-subagent watchdog automation
3.3.1 — W4 GLAB I/O
[3.3.1] - 2026-09-03
Added
omni_fetch_mr.pyone-shot MR gather (skills/omnireview-gitlab/scripts/) — ONE stdlib-only invocation gathers everything review Phase 1 needs into ONE JSON file (MR metadata, paginated diffs, unified-diff headers synthesized where the API omits them, diff_line_map, commits, discussions envelope, versions, notes) with bounded retry/backoff (2 s / 4 s on 5xx/429/network, fail-fast on 400/401/403/404), atomic write, and a one-line stdout JSON receipt (elapsed_ms,api_calls); replaces the improvised dozens-of-calls Phase-1 gather--verify-headmid-run STOP guard onomni_fetch_mr.py+ the deterministic STOP protocol pinned in SKILL.md (Phase 3 after the waiter, and again immediately before Phase 6 posting): a moveddiff_refs.head_sha→ exit 4, no re-partition/re-dispatch/re-gather, one flat top-level addendum note, no inline threads on stale anchors — fixes the !1403 class (3 passes / 9 dispatches, watchdog kill, nothing posted)- Gather-file shims —
omni_partition.pyandomni_digest.pydetect the gather file's shape (data+discussionsat top level) and operate on the embedded envelope; legacy single-/two-file invocations byte-identical --skip-summaryonomni_post_review.py— threads/replies-only resume path for mid-batch failures (--skip-summary --force), closing the guide's old unanchored raw-command escape hatchomni_glab_api.pyshared direct REST transport (skills/omnireview-gitlab/scripts/) — one tested host/token/auth/retry/pagination contract (stdlib urllib, Bearer auth, token redaction) used by both scripts
Changed
omni_post_review.pyposts via the direct GitLab Discussions API — everyglabsubprocess call replaced withomni_glab_api.request; inline threads carry the full documentedposition[...]payload, so every thread posts ANCHORED first-try (live-proven on scratch MR !21: the probe thread's first note carriesposition.new_path; seew4-glab-io-validation.md); all 3.3.0 poster contracts preserved (exit codes 0/1/2/3, stdout JSON +elapsed_ms, duplicate-summary guard, reply routing,--dry-runexecutes nothing and works without a token, refs fetched once per invocation)- SKILL.md is script-first — Phase 1 names
omni_fetch_mr.pyas the primary gather (MCP fetch demoted to optional-interactive); posting-guide names the shipped poster script as the Implementation path (MCP posting tools optional in interactive installs) - Test suite 362 (was 325)
- Version bumped to 3.3.1
Fixed
- Unanchored inline threads — root cause:
glab api --raw-field "position[base_sha]=..."drops nestedposition[…]keys, so threads landed as unanchored general notes (measured ~209 s / 27 turns of delete+repost anchor repair per review); the direct-API transport sends literal bracket keys form-encoded and the guide's unanchored raw fallback command is removed - Headless MCP −32000 diagnosed (record-only) — the
.mcp.jsonlaunch lineuv run --with mcp[cli]resolves the latest mcp (2.x), wherefrom mcp.server.fastmcp import FastMCPdies at import; proven end-to-end, and a one-line pin (mcp[cli]>=1.0.0,<2.0.0) fixes it locally — NOT shipped in 3.3.1 (operator keep/drop decision pending; the standalone script path is primary either way, so headless runs are unaffected). Full evidence:w4-mcp-diagnosis.md - posting-guide's trailing "MCP
post_full_reviewremains the recommended primary" claim removed — contradicted the script-first Implementation line
A/B
- A/B e2e (same MR !21, same head, both arms real-posting, inter-arm reset, w4 arm first): total wall 1335 s vs 1380 s (−45 s, within single-pair noise); gather = 6 API calls / 4.3 s once parameterized vs 5 improvised calls + 7 inline heredocs (~104 s); posting = ~48 s (dry-run validation + one 20.8 s real post) vs ~86 s + an ~80 s token detour + 1 failed post; threads anchored first-try 24/24 (100%) vs 0/30 (3.3.0 posted every finding as an unanchored top-level note and never repaired — silent anchor loss, worse than the known delete+repost loop); improvised /tmp executables 0 in both arms; sleeps 0 (w4, main + all subs) vs 2 in one 3.3.0 subagent; STOP-guard
--verify-headran at both checkpoints, exit 0 both. Honest misses: 3 failed fetch invocations (~72 s — unencoded full-path 404s + a token detour) before the run settled on the numeric project ID (3.3.2 candidate: accept/URL-encode full project paths); adjudication turns 31 vs 24 (the ≤12 target remains unmet — unchanged lever, not a W4 regression). Full tables:w4-glab-io-validation.md
v3.3.0 — Tail Compression: Findings Contract, Deterministic Consolidator, Stable Posting
What's New
Added
- Structured findings JSON contract +
omni_validate_findings.py(skills/omnireview-gitlab/scripts/) — each reviewer agent emits a machine-readable findings block; the validator checks all three blocks and passes malformed output through verbatim (never fails the run). omni_consolidate.pydeterministic consolidation (skills/omnireview-gitlab/scripts/) — merges only near-identical findings (same file+lines+category, Jaccard ≥ 0.30); same-locus non-identical pairs classify as clusters, not merges, with per-agent verbatim entries in the worklist; corroboration is recorded as metadata; confidence values are never adjusted or recomputed; emits one 6-section single-pass adjudication worklist;--priorretrospective guard marks prior-matched locialready_adjudicated— prior posted findings are authoritative and new input is routed as replies on their existing threads.omni_post_review.pyshipped posting fallback (skills/omnireview-gitlab/scripts/) — standaloneglab-based posting with retry/backoff (2 s / 4 s on 5xx/429), a duplicate-summary guard that refuses to post a second default## OmniForgesummary, and--reply-to/reply_to_thread_idthread routing; no MCP dependency (if the MCP server breaks, posting still works).omni_partition.pydiff load balancing (skills/omnireview-gitlab/scripts/) — security-affinity assignment first, then greedy balancing across the codebase and analyst reviewers; plus reviewer-brief tightening and the "Never sleep-poll — not even sub-60 s sleeps" rule.omni_digest.pycontext digest (skills/omnireview-gitlab/scripts/) — script-built digest where bot artifacts are carried byte-verbatim, human prose is capped, and diffs are reduced to hunk headers; retrospective wiring in Phases 1/3/4 replaces raw comment dumps.
Changed
- One-dispatch-per-reviewer rule in the three reviewer briefs — fixes the 9-vs-3 dispatch-file churn observed on retrospective re-reviews (A/B retrospective arm:
sub_count== 3). - Test suite 325 + 9 (was 231).
Measured (A/B e2e — same MR, same head, same provider hour)
- Tail −28.2 % (339.5 → 243.7 s — real, beyond the ±75 s single-pair noise band); output tokens −24.4 %.
- Dispatch files: 3 (retrospective re-reviews previously produced 9); 3 prior loci marked
already_adjudicatedwith replies routed on their recorded threads.
Known limitations (stated honestly)
- Adjudication turns: 20 vs the ≤12 target — miss (baseline 10; per-call API time fell 32.5 → 10.9 s, so the tail dropped anyway — the single-pass worklist produces more, much shorter turns).
- Sub-agent wall skew (2×) unimproved by this release.
- Measurements are from the local A/B harness; fleet (VPS) verification follows the production rollout.
Full changelog: see CHANGELOG.md § 3.3.0.
v3.2.0 — Chunked Reviewer Waiter (omni_wait.py) + Phase 3 Completion Rewrite
What's New
Added
omni_wait.pychunked completion waiter (skills/omnireview-gitlab/scripts/) — waits on the 3 reviewer subagents' transcripts with exit-code semantics (0 = all terminal, 3 = still running — re-invoke, 2 = degraded: budget exhausted / every remaining agent stalled / transcript count mismatch). One-line JSON status on stdout with per-agent state andfinal_textharvest; mtime-stability fallback when theStatus: DONEmarker is absent (the marker never blocks completion); dead-agent stall detection (>300 s) with partial harvest while the others are still waited on; scan-dir fallback with a 15 s spawn-grace window (count_pending); and--reports-dirwriting a pretty-printedstatus.jsonplus one markdown report file per agent (omni_wait-<basename>.md, collision-suffixed) — the lossless Read-channel for the reviewers' reports.- Chunked SIGALRM deadline strictly inside the chunk budget (default 480 s, under the 600 s Bash-tool ceiling) with fail-fast degraded exits for platforms without POSIX timers (
sigalrm_unsupported).
Changed
- omnireview-gitlab Phase 3 completion detection rewritten — the waiter's exit code is now the sole completion authority; improvised
sleep-polling and hand-written collect/wait helper scripts are explicitly forbidden (retired a pattern with a measured worst case of 503 s of dead wait after all agents finished); background-agent task notifications are informational only. - Degraded runs (stalled/missing agents) proceed to consolidation with an explicit "coverage degraded (N/3 reviewers)" report note naming the missing perspectives.
- Post-parse validation of numeric flags (non-positive durations,
--expect < 1) fail fast on the usage path instead of breaking the JSON contract mid-wait. - Version bumped to 3.2.0.
Tests
- 31 waiter tests (subprocess-driven, deterministic via faked mtimes and tiny clamped windows), runnable under both
python3 -m unittestandpytest; full plugin suite 231 passed. TDD red→green receipts with verified lineage for every review round. - Reviewed across 4 adversarial review rounds (1 human-commissioned code review + Copilot rounds on this PR), all findings fixed red→green.
Validation
- Staggered-completion e2e: last-terminal → exit-0 latency 0.17 s; evaluation overhead 0.036 s.
- Local A/B dry-runs via the engine harness on a scratch MR: 3.1.0 tag run and 3.2.0 tree run both SUCCESS (engine exit 0, conforming report, content-sha install proof); the 3.2.0 transcript shows waiter chunks bounded at 465 s < 480, the marker fast-path firing, full
final_textharvest, and zero improvisedsleepcommands. - Tag installability proven from a fresh scratch config:
plugin listreports 3.2.0 andinstalled_plugins.jsonrecordsgitCommitSha = 65bb872d7f0a681621ce5c98a6b86d3fedac4fe4(this release's tagged commit).
Contributors
- @nexiouscaliver (W2A workstream: waiter implementation, Phase 3 rewrite, review rounds)
Full Changelog: v3.1.0...v3.2.0
v3.1.0 — OmniCheck Auto-Approval + OmniCreate Authoring Guidelines
What's New
Added
omnicheck-gitlabauto-approval via bot user — newapprove_mrMCP tool that approves a GitLab MR as a dedicated OmniCheck bot whenOMNICHECK_BOT_TOKENis set (falls back to the current glab user). Approval is pinned to the MR HEAD sha so it goes stale on new commits. The skill now branches into nudge (Branch A) or approve (Branch B), with Branch B appearing only whenNOT_APPLIED + NEEDS_HUMAN = 0and firing only on explicit user confirmation.approve_mrMCP tool — MCP server now exposes 14 tools (was 13).run_subprocessgains an optionalenvparam so the bot token is scoped to the single approval call only.omnicreate-gitlabauthoring guidelines — explicit rules for MR titles (conventional commit format, ≤72 chars, imperative tense) and structured descriptions (Summary, Changes, Testing, Related sections). Enforcesfill=falsewith crafted content.
Fixed
- Event loop hygiene in test fixture —
conftest.pyautouse fixture now owns one loop per test and closes it in teardown. Full suite passes with-W error::ResourceWarning. - Plugin manifest version bump —
plugin.jsonversion field now correctly reads3.1.0(was stale at 3.0.0 despite the git tag)./pluginnow reports the correct version.
Tests
- 9 new tests for
approve_mr(bot-token approval, fallback, sha pinning, error cases, no-head-sha guard).
Contributors
- @Abhishek-2004-17 (feat/omnicheck-gitlab branch, conftest fix)
- @nexiouscaliver (approve_mr implementation, merge + review)
Full Changelog: v3.0.0...v3.1.0
OmniForge v3.0.0 — Full GitHub Support + Worktree Fixes
What's New
GitHub Support (NEW)
OmniForge now supports both GitLab and GitHub with full feature parity:
- omnireview-github — 7-phase PR review with 3 parallel adversarial agents
- omnifix-github — 7-phase PR fix with parallel triage
- omnicreate-github — PR creation via
ghCLI - omnicheck-github — 5-phase diff verification
6 new MCP tools: fetch_pr_data, create_github_pr, post_pr_review_summary, post_pr_inline_thread, fetch_pr_discussions, reply_to_pr_comment
Platform auto-detection via _detect_platform() — checks git remote -v to determine GitLab vs GitHub.
Worktree Support (FIXED)
All worktree creation/cleanup tools now resolve the main repo root when called from a linked worktree (e.g. .claude/worktrees/...). Uses git rev-parse --git-common-dir for reliable resolution.
All bash fallbacks in SKILL.md files include a worktree-awareness preamble.
Stats
- 19 MCP tools (13 GitLab + 6 GitHub)
- 8 skills (4 GitLab + 4 GitHub)
- 188 tests (135 GitLab + 18 worktree + 35 GitHub)
v2.0.0 — OmniForge
OmniReview is now OmniForge
The project has been renamed to OmniForge to reflect its evolution from a code review tool to a full merge request lifecycle toolkit.
What changed
- Plugin name:
omnireview→omniforge - Marketplace:
omnireview-marketplace→omniforge-marketplace - MCP tool prefix:
mcp__omnireview__*→mcp__omniforge__* - Plugin directory:
plugins/omnireview/→plugins/omniforge/ - MCP server:
omnireview_mcp_server.py→omniforge_mcp_server.py - README fully rewritten for OmniForge brand and all 3 skills
Migration
Existing users must uninstall and reinstall:
# Remove old
claude plugin uninstall omnireview
claude plugin marketplace remove omnireview-marketplace
# Install new
claude plugin marketplace add https://github.com/nexiouscaliver/OmniForge.git
claude plugin install omniforge@omniforge-marketplaceSkills (unchanged)
/omnireview-gitlab— Multi-agent adversarial MR review/omnifix-gitlab— Automated review finding fixer/omnicreate-gitlab— MR creation from commits
v1.5.0 — OmniCreate: Automated MR Creation
What's New
omnicreate — a new skill that automates GitLab merge request creation.
New Skill: /omnicreate
- Auto-populates MR title from first commit message
- Auto-populates description from all commit messages (including bodies)
- Pushes branch if needed
- Supports draft MRs, labels, assignees, reviewers, and more
/omnicreate # Create MR from current branch
/omnicreate --draft -l bug,needs-review # Draft MR with labels
/omnicreate -i 42 --copy-issue-labels # MR for a specific issue
/omnicreate -b staging -a john # Target staging, assign to johnNew MCP Tool
create_gitlab_mr— safe MR creation via MCP server with input validation and structured response
Stats
- 13 MCP tools (was 12)
- 116 tests (was 99)
- 3 skills: omnireview, omnifix, omnicreate
Full Changelog: v1.4.0...v1.5.0