Submit structured feedback as GitHub issues from the command line.
gripe turns a YAML schema into an interactive (or fully automated) issue-creation workflow. Define the fields you care about, and gripe handles prompting, validation, formatting, and submission via gh.
brew install agent-clis/gripe/gripecurl -fsSL https://raw.githubusercontent.com/agent-clis/gripe/main/install.sh | shirm https://raw.githubusercontent.com/agent-clis/gripe/main/install.ps1 | iexnpm install -g @agent-clis/gripecargo install --path .Requires the GitHub CLI (gh) to be installed and authenticated.
# Initialize a gripe.yaml in your project
gripe init
# Submit feedback interactively
gripe submit
# Submit programmatically
gripe submit tool=vim summary="cursor jumps on save"
# Preview without creating an issue
gripe submit --dry-run tool=vim summary="cursor jumps"Create a GitHub issue from structured input. Input can come from:
- Interactive prompts (default) — walks through each field
- Key-value args —
gripe submit field1=value1 field2=value2 - JSON flag —
gripe submit --json '{"field1": "value1"}' - Stdin —
echo '{"field1": "value1"}' | gripe submit --stdin
| Flag | Description |
|---|---|
--json <JSON> |
Provide field values as JSON |
--stdin |
Read JSON from stdin |
--dry-run |
Preview the issue without creating |
--output-json |
Output result as JSON |
--repo <REPO> |
Target repository (owner/repo) |
Generate a starter gripe.yaml in the current directory.
| Flag | Description |
|---|---|
--force |
Overwrite existing gripe.yaml |
Display the resolved schema (useful for debugging which config is active).
| Flag | Description |
|---|---|
--json |
Output as JSON |
gripe resolves its schema through a fallback chain:
gripe.yaml— walks up from the current directory.github/ISSUE_TEMPLATE/*.yml— GitHub issue templates in the repo- Built-in default — a generic feedback form
The target repository is auto-detected from the git remote if not specified.
repo: owner/repo # optional, auto-detected from git remote
automated: allow # allow | deny — controls programmatic submissions
labels:
- feedback
title_template: "[{tool}] {summary}"
fields:
- id: tool
label: Tool Name
type: input
required: true
- id: summary
label: Summary
type: input
required: true
- id: severity
label: Severity
type: select
options: [low, medium, high, critical]
default: medium
- id: context
label: Additional Context
type: textarea| Type | Description |
|---|---|
input |
Single-line text |
textarea |
Multi-line text |
select |
Choose from options list |
Repos can set automated: deny in their gripe.yaml to reject non-interactive submissions. gripe checks this before creating issues programmatically.
gripe submit \
--repo owner/repo \
--json '{"tool": "linter", "summary": "false positive on rule X"}' \
--output-jsonThe --output-json flag returns structured output:
{
"url": "https://github.com/owner/repo/issues/42",
"number": 42,
"repo": "owner/repo",
"title": "[linter] false positive on rule X"
}