# 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.

- Skill: `breferrari/weave-issue` (Agent Skill)
- Install (CLI): `npx skillmds@latest add breferrari/weave-issue`
- Raw SKILL.md: https://api.skillmd.com/api/skills/breferrari/weave-issue/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: breferrari (https://skillmd.com/u/breferrari)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/breferrari/weave-issue

---


## Context

### Current branch
!`git branch --show-current`

### Recent commits
!`git log --oneline -5`

### Open issues (for dedup check)
!`gh issue list --state open --json number,title --jq '.[] | "#\(.number) \(.title)"' 2>/dev/null | head -20`

### Available milestones
!`gh api repos/PackWeave/weave/milestones --jq '.[] | "\(.title)"' 2>/dev/null`

### Issue type IDs (for GraphQL)
!`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`

## Task

Create a GitHub issue with **all fields filled**: label, issue type, milestone, assignee, and blocked-by relationships.

### Step 1 — Parse arguments

Parse `$ARGUMENTS`:
- Everything before `---` (or the entire input if no separator) is the **title**
- Everything after `---` is the **body/description**
- If no arguments, ask the user for a title

### Step 2 — Classify the issue

Based on the title prefix and content, determine:

**Issue type** (exactly one):
- `Bug` — title starts with `fix:` or `fix(`, or describes something broken
- `Feature` — title starts with `feat:` or `feat(`, or describes new functionality
- `Task` — title starts with `test:`, `ci:`, `docs:`, `refactor:`, `chore:`, or describes internal work

**Label** (exactly one):
- `bug` — for Bug type
- `enhancement` — for Feature and Task types
- `documentation` — for docs-only issues

### Step 3 — Determine milestone

Ask 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)
- None (explicitly deferred)

### Step 4 — Check for blockers

Ask: "Does this issue depend on any open issue being completed first?"
- If yes, collect the blocking issue numbers
- If the user says no or doesn't specify, skip this step

### Step 5 — Create the issue

```sh
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.

### Step 6 — Set issue type

Get the new issue's node ID and set the type **in a single Bash call** (variables don't persist across calls):

```sh
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 } } }'
```

### Step 7 — Set blocked-by relationships

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):

```sh
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:
```sh
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"
```

### Step 8 — Report

Print a summary:
```
Created: #<number> <title>
Type:    <Bug|Feature|Task>
Label:   <label>
Milestone: <milestone>
Blocked by: #X, #Y (if any)
URL:     <url>
```

