بنقرة واحدة
weave-issue
// Create a well-formed GitHub issue for the weave project with all fields populated (labels, type, milestone, assignee, blocked-by relationships). Pass a title and optional description as arguments.
// Create a well-formed GitHub issue for the weave project with all fields populated (labels, type, milestone, assignee, blocked-by relationships). Pass a title and optional description as arguments.
Run multi-persona code review (PO, Senior Eng, Security, Docs) on open PRs. Pass PR numbers or omit to auto-detect from recent branches. Runs 2 rounds by default.
Run the manual E2E validation checklist against real CLI installations on this machine. Tests weave against actual ~/.claude.json, ~/.gemini/settings.json, ~/.codex/config.toml — not mocks. Pass a flow name to run a targeted subset (install, profiles, search, remove, diagnose), or omit for the full suite.
Full Weave workflow from working changes to open PR. Runs quality gates, commits, pushes, and opens a PR with the correct assignee. Use when ready to ship a change. Pass the commit message as the argument.
Review all comments and reviews on a GitHub PR — inline code annotations, review verdicts (APPROVED / CHANGES_REQUESTED), and conversation threads. Classifies each as stale/valid/deferred/skip, fixes valid ones in the working tree, creates GitHub issues for deferred ones. Pass a PR number or omit to auto-detect from the current branch.
Run the Weave quality gate (cargo fmt, clippy, tests) before committing. Use when you want to verify the working tree is clean and CI-ready.
| name | weave-issue |
| description | Create a well-formed GitHub issue for the weave project with all fields populated (labels, type, milestone, assignee, blocked-by relationships). Pass a title and optional description as arguments. |
| allowed-tools | Bash, Read, Grep, Glob |
| argument-hint | <title> [--- <description>] |
!git branch --show-current
!git log --oneline -5
!gh issue list --state open --json number,title --jq '.[] | "#\(.number) \(.title)"' 2>/dev/null | head -20
!gh api repos/PackWeave/weave/milestones --jq '.[] | "\(.title)"' 2>/dev/null
!gh api graphql -f query='{ repository(owner: "PackWeave", name: "weave") { issueTypes(first: 10) { nodes { id name } } } }' --jq '.data.repository.issueTypes.nodes[] | "\(.name) = \(.id)"' 2>/dev/null
Create a GitHub issue with all fields filled: label, issue type, milestone, assignee, and blocked-by relationships.
Parse $ARGUMENTS:
--- (or the entire input if no separator) is the title--- is the body/descriptionBased on the title prefix and content, determine:
Issue type (exactly one):
Bug — title starts with fix: or fix(, or describes something brokenFeature — title starts with feat: or feat(, or describes new functionalityTask — title starts with test:, ci:, docs:, refactor:, chore:, or describes internal workLabel (exactly one):
bug — for Bug typeenhancement — for Feature and Task typesdocumentation — for docs-only issuesAsk the user which milestone this belongs to, showing the available milestones from context above. If the user has already specified a milestone in their description, use that. Options:
M6 - 0.5 (security hardening)M7 - 0.6 (ecosystem depth)M8 - 0.7 (power features)Ask: "Does this issue depend on any open issue being completed first?"
gh issue create \
--title "<title>" \
--body "<body>" \
--assignee $(gh api user --jq .login) \
--label "<label>" \
--milestone "<milestone>" # omit flag entirely if no milestone
Do not create duplicate issues — check the open issues list above first. No "Built with Claude Code" taglines.
Get the new issue's node ID and set the type in a single Bash call (variables don't persist across calls):
NODE_ID=$(gh api graphql -f query='{ repository(owner: "PackWeave", name: "weave") { issue(number: <NUMBER>) { id } } }' --jq '.data.repository.issue.id') && \
gh api graphql -f query='mutation { updateIssue(input: {id: "'$NODE_ID'", issueTypeId: "<TYPE_ID>"}) { issue { number } } }'
If blocking issues were identified in Step 4, for each blocker run in a single Bash call (NODE_ID from Step 6 won't persist — re-fetch it, or chain all steps together):
NODE_ID=$(gh api graphql -f query='{ repository(owner: "PackWeave", name: "weave") { issue(number: <NUMBER>) { id } } }' --jq '.data.repository.issue.id') && \
BLOCKER_ID=$(gh api graphql -f query='{ repository(owner: "PackWeave", name: "weave") { issue(number: <BLOCKER_NUMBER>) { id } } }' --jq '.data.repository.issue.id') && \
gh api graphql -f query='mutation { addBlockedBy(input: {issueId: "'$NODE_ID'", blockingIssueId: "'$BLOCKER_ID'"}) { issue { number } blockingIssue { number } } }' && \
gh issue edit <NUMBER> --add-label "blocked"
Repeat for each additional blocker, or loop:
for BLOCKER_NUM in <NUM1> <NUM2>; do
BLOCKER_ID=$(gh api graphql -f query='{ repository(owner: "PackWeave", name: "weave") { issue(number: '$BLOCKER_NUM') { id } } }' --jq '.data.repository.issue.id') && \
gh api graphql -f query='mutation { addBlockedBy(input: {issueId: "'$NODE_ID'", blockingIssueId: "'$BLOCKER_ID'"}) { issue { number } blockingIssue { number } } }'
done
gh issue edit <NUMBER> --add-label "blocked"
Print a summary:
Created: #<number> <title>
Type: <Bug|Feature|Task>
Label: <label>
Milestone: <milestone>
Blocked by: #X, #Y (if any)
URL: <url>