281 lines
12 KiB
Markdown
281 lines
12 KiB
Markdown
---
|
|
name: re:init
|
|
description: Initialize a GitHub Project for requirements management with custom fields and views
|
|
allowed-tools: [Bash, AskUserQuestion]
|
|
---
|
|
|
|
# Initialize Requirements Project
|
|
|
|
Initialize a GitHub Project for requirements management. This command is **idempotent** - safe to run multiple times without creating duplicates.
|
|
|
|
## Prerequisites Validation
|
|
|
|
1. **Check GitHub CLI:**
|
|
- Verify `gh` command exists: `command -v gh`
|
|
- If not found: "GitHub CLI (gh) is not installed. Install it:"
|
|
- macOS: `brew install gh`
|
|
- Other: <https://cli.github.com/>
|
|
|
|
2. **Check Authentication:**
|
|
- Run: `gh auth status`
|
|
- If command fails: "Not authenticated with GitHub. Run: `gh auth login`"
|
|
- Check output for required scopes: `repo` and `project`
|
|
- If missing `project` scope: "Refresh authentication with: `gh auth refresh -s project`"
|
|
- Note: Output could show "Token scopes: 'gist', 'project', 'read:org', 'repo', 'workflow'" format
|
|
|
|
3. **Detect Repository:**
|
|
- Get repository info: `gh repo view --json nameWithOwner`
|
|
- If fails: "Not in a git repository with GitHub remote. Navigate to your project repository."
|
|
- Parse JSON to extract nameWithOwner (format: `{"nameWithOwner":"owner/repo"}`)
|
|
- Split nameWithOwner on "/" to get the owner (before the "/")
|
|
- Example: "sjnims/requirements-expert" → owner="sjnims"
|
|
|
|
## Project Setup
|
|
|
|
4. **Get Project Name:**
|
|
- Use AskUserQuestion:
|
|
- question: "What should we name the GitHub Project for requirements tracking?"
|
|
- header: "Project Name"
|
|
- multiSelect: false
|
|
- options:
|
|
- label: "[Repository Name] Requirements"
|
|
description: "Standard naming convention following best practices (recommended)"
|
|
- label: "[Repository Name] Backlog"
|
|
description: "Alternative naming for backlog-style requirements tracking"
|
|
- label: "[Repository Name] Roadmap"
|
|
description: "Emphasizes long-term planning and feature roadmap view"
|
|
- Note: User can select "Other" to provide a custom project name
|
|
- Replace [Repository Name] placeholder with the repository name (the part after the "/" in `nameWithOwner` from step 3). For example, if `nameWithOwner` is "sjnims/requirements-expert", use "requirements-expert"
|
|
- Store the user's choice for project creation
|
|
|
|
5. **Check for Existing Project (Idempotency):**
|
|
- List existing projects: `gh project list --owner [owner] --format json`
|
|
- Parse JSON response: `{"projects":[{"id":"...","number":4,"title":"...","url":"..."}]}`
|
|
- Search the `projects` array for a project where `title` matches the chosen name
|
|
- If found:
|
|
- Inform user: "Found existing project '[title]' at [url]"
|
|
- Capture project `number` (not `id`) for subsequent commands
|
|
- Note: Project number is the sequential number (1, 2, 3...) visible in the URL
|
|
- Skip to step 7 (field creation)
|
|
- If not found:
|
|
- Proceed to create project
|
|
|
|
6. **Create GitHub Project:**
|
|
- Create project: `gh project create --owner [owner] --title "[name]" --format json`
|
|
- Parse JSON response to extract `number` and `url`
|
|
- If creation fails:
|
|
- Display the actual error message from gh CLI
|
|
- Use AskUserQuestion for interactive recovery:
|
|
- question: "Project creation failed. How would you like to proceed?"
|
|
- header: "Recovery"
|
|
- multiSelect: false
|
|
- options:
|
|
- label: "Retry"
|
|
description: "Try creating the project again"
|
|
- label: "Check permissions"
|
|
description: "Show commands to verify and fix GitHub CLI permissions"
|
|
- label: "Exit"
|
|
description: "Stop and let me fix the issue manually"
|
|
- Handle user choice:
|
|
- If "Retry": Re-execute the project creation command (line 64). If creation fails again, present the recovery options again (allowing user to continue trying, check permissions, or exit)
|
|
- If "Check permissions":
|
|
- Run: `gh auth status`
|
|
- Display the output
|
|
- Show refresh command: `gh auth refresh -s project`
|
|
- Explain: "Projects require 'repo' and 'project' scopes"
|
|
- Note: Projects are owner-scoped (user/org), not repository-scoped
|
|
- After showing diagnostics, present the same recovery options again (Retry, Check permissions, or Exit)
|
|
- If "Exit": Exit gracefully with message:
|
|
```
|
|
Project creation failed. Manual steps to resolve:
|
|
|
|
1. Check authentication: `gh auth status`
|
|
2. Verify scopes include 'repo' and 'project'
|
|
3. Refresh token if needed: `gh auth refresh -s project`
|
|
4. Ensure you have permission to create projects for owner: [owner]
|
|
5. Retry the command: `/re:init`
|
|
|
|
Error details: [show original error message]
|
|
```
|
|
- If creation succeeds:
|
|
- Inform user: "Created project: [name] at [url]"
|
|
- Capture project `number` for subsequent commands
|
|
|
|
## Custom Fields Setup
|
|
|
|
7. **Check Existing Fields:**
|
|
- List all existing fields once: `gh project field-list [project-number] --owner [owner] --format json`
|
|
- If command fails:
|
|
- Log warning: "Could not retrieve existing fields, will attempt to create all fields"
|
|
- Set field names list to empty (this ensures subsequent steps will attempt creation)
|
|
- Continue to step 8
|
|
- If command succeeds:
|
|
- Parse JSON response to extract field names
|
|
- Store the list of existing field names for use in subsequent steps
|
|
- Example: If response contains fields with names "Title", "Status", "Assignees", store these names
|
|
- This single query replaces multiple redundant field-list calls
|
|
|
|
8. **Create Type Field (If Missing):**
|
|
- Check if "Type" exists in the stored field names list from step 7
|
|
- If exists:
|
|
- Inform user: "Type field already exists, skipping creation"
|
|
- If not exists:
|
|
- Create field with all options in one command:
|
|
```
|
|
gh project field-create [project-number] --owner [owner] \
|
|
--name "Type" \
|
|
--data-type SINGLE_SELECT \
|
|
--single-select-options "Vision,Epic,Story,Task" \
|
|
--format json
|
|
```
|
|
- If command fails: Note the failure but continue (user can add field manually)
|
|
- Inform user: "Created Type field with options: Vision, Epic, Story, Task"
|
|
|
|
9. **Create Priority Field (If Missing):**
|
|
- Check if "Priority" exists in the stored field names list from step 7
|
|
- If exists:
|
|
- Inform user: "Priority field already exists, skipping creation"
|
|
- If not exists:
|
|
- Create field with all options:
|
|
```
|
|
gh project field-create [project-number] --owner [owner] \
|
|
--name "Priority" \
|
|
--data-type SINGLE_SELECT \
|
|
--single-select-options "Must Have,Should Have,Could Have,Won't Have" \
|
|
--format json
|
|
```
|
|
- If command fails: Note the failure but continue
|
|
- Inform user: "Created Priority field with MoSCoW options"
|
|
|
|
10. **Create Status Field (If Missing):**
|
|
- Check if "Status" exists in the stored field names list from step 7
|
|
- If exists:
|
|
- Inform user: "Status field already exists, skipping creation"
|
|
- If not exists:
|
|
- Create field with all options:
|
|
```
|
|
gh project field-create [project-number] --owner [owner] \
|
|
--name "Status" \
|
|
--data-type SINGLE_SELECT \
|
|
--single-select-options "Not Started,In Progress,Completed" \
|
|
--format json
|
|
```
|
|
- If command fails: Note the failure but continue
|
|
- Inform user: "Created Status field with workflow states"
|
|
|
|
## Views Setup (Manual Configuration Required)
|
|
|
|
11. **Views Setup - Manual Instructions:**
|
|
- Note: GitHub CLI does not support view creation or configuration
|
|
- All views must be created manually via the GitHub web interface
|
|
- Inform user: "Project views require manual setup in the GitHub web interface"
|
|
- Display project URL: [project-url]
|
|
|
|
**Manual Setup Instructions:**
|
|
|
|
1. **Access the project**:
|
|
- Open the project in your browser: [project-url]
|
|
- Or navigate to: Repository → Projects → [Project Name]
|
|
|
|
2. **Create recommended views**:
|
|
|
|
**View 1: "By Type" (Board View)**
|
|
- Click "+ New view" → Board
|
|
- Name: "By Type"
|
|
- Layout: Board
|
|
- Group by: Type
|
|
- Shows: All items grouped by Vision/Epic/Story/Task
|
|
|
|
**View 2: "By Priority" (Board View)**
|
|
- Click "+ New view" → Board
|
|
- Name: "By Priority"
|
|
- Layout: Board
|
|
- Group by: Priority
|
|
- Shows: All items grouped by Must Have/Should Have/Could Have/Won't Have
|
|
|
|
**View 3: "Active Work" (Table View)**
|
|
- Click "+ New view" → Table
|
|
- Name: "Active Work"
|
|
- Layout: Table
|
|
- Filter: Status = "In Progress"
|
|
- Shows: Only items currently being worked on
|
|
|
|
**View 4: "Backlog" (Table View)**
|
|
- Click "+ New view" → Table
|
|
- Name: "Backlog"
|
|
- Layout: Table
|
|
- Filter: Status = "Not Started"
|
|
- Shows: Work ready to be started
|
|
|
|
3. **Set default view** (optional):
|
|
- Click "..." menu on preferred view
|
|
- Select "Set as default"
|
|
|
|
## Success Reporting
|
|
|
|
12. **Display Success Message:**
|
|
```
|
|
✅ GitHub Project initialized successfully!
|
|
|
|
Project: [Project Name]
|
|
URL: [Project URL]
|
|
|
|
Custom Fields Created:
|
|
- Type (Vision, Epic, Story, Task)
|
|
- Priority (Must Have, Should Have, Could Have, Won't Have)
|
|
- Status (Not Started, In Progress, Completed)
|
|
|
|
Next Steps:
|
|
1. Run `/re:discover-vision` to create your product vision
|
|
2. Then `/re:identify-epics` to identify major capabilities
|
|
3. Use `/re:status` anytime to see project overview
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
- Exit gracefully on any validation failure (steps 1-3)
|
|
- Display clear, actionable error messages
|
|
- If project creation fails: Show gh error output and suggest remedies
|
|
- If field creation fails: Note which fields failed but continue
|
|
- Views require manual setup: Provide comprehensive manual instructions
|
|
|
|
## Implementation Notes
|
|
|
|
**Key Architectural Points:**
|
|
|
|
- **Projects are owner-scoped, not repository-scoped**: Use `--owner [owner]` not `--repo`
|
|
- **Use project number, not project ID**: Commands expect the sequential number (1, 2, 3...) visible in URLs, not the GraphQL ID (PVT_xxx)
|
|
- **Field creation supports comma-separated options**: Use `--single-select-options "option1,option2,option3"` to create field and options in one command
|
|
- **Idempotency is critical**: Always check for existing resources before creating
|
|
|
|
**State Management:**
|
|
|
|
This command intentionally does NOT persist local state (e.g., project number in a `.local.md` file). Design rationale:
|
|
|
|
1. **GitHub is the source of truth**: All requirements data lives in GitHub Issues and Projects
|
|
2. **Idempotency**: Commands query GitHub directly, ensuring they always reflect current state
|
|
3. **Multi-machine support**: No local state means the plugin works identically across machines
|
|
4. **No sync issues**: Local state could become stale; direct queries are always accurate
|
|
|
|
Other `/re:*` commands will query GitHub to discover the project rather than relying on cached references.
|
|
|
|
**Command Execution:**
|
|
|
|
- All operations should be non-interactive (use `--format json` where available)
|
|
- Parse JSON output using `jq` or similar tools
|
|
- Use `--owner [owner]` for all project and field commands
|
|
- Project number is extracted from JSON response during creation or listing
|
|
|
|
**Error Handling:**
|
|
|
|
- Exit gracefully on validation failures (steps 1-3)
|
|
- Continue on non-critical failures (field/view creation)
|
|
- Provide clear, actionable error messages
|
|
- Include fallback manual instructions when CLI lacks functionality
|
|
|
|
**Testing Notes:**
|
|
|
|
- Verified with gh CLI version 2.x on macOS
|
|
- Commands tested: `gh project list`, `gh project create`, `gh project field-list`, `gh project field-create`
|
|
- View creation is not supported via CLI; manual setup via web interface is required
|