@reservine/dx 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +22 -0
- package/README.md +303 -0
- package/bin/cli.ts +549 -0
- package/package.json +26 -0
- package/plugins/reservine-dx/.claude-plugin/plugin.json +8 -0
- package/plugins/reservine-dx/commands/cherry-pick-pr.md +221 -0
- package/plugins/reservine-dx/commands/cleanup.md +297 -0
- package/plugins/reservine-dx/commands/commit.md +118 -0
- package/plugins/reservine-dx/docker/worktree/docker-compose.isolated.template.yaml +144 -0
- package/plugins/reservine-dx/docker/worktree/seed-snapshot.sh +74 -0
- package/plugins/reservine-dx/scripts/_core.sh +330 -0
- package/plugins/reservine-dx/scripts/setup-worktree-be.sh +501 -0
- package/plugins/reservine-dx/scripts/setup-worktree-fe.sh +244 -0
- package/plugins/reservine-dx/scripts/setup-worktree.sh +59 -0
- package/plugins/reservine-dx/skills/cross-plan/SKILL.md +339 -0
- package/plugins/reservine-dx/skills/implement-plan/SKILL.md +512 -0
- package/plugins/reservine-dx/skills/implement-plan/references/plugin-contract.md +82 -0
- package/plugins/reservine-dx/skills/new-feature-planning/SKILL.md +544 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reservine-dx:new-feature-planning
|
|
3
|
+
description: >
|
|
4
|
+
Plan a new feature for the Reservine ecosystem. Supports three scopes:
|
|
5
|
+
FE-only, BE-only, or Full (both repos). Use prefix syntax to set scope:
|
|
6
|
+
"fe: description", "be: description", "full: description", or omit to choose.
|
|
7
|
+
Creates GitHub issues with questionnaire, milestone, and sub-issue linking.
|
|
8
|
+
Works from either repo (auto-detects FE vs BE).
|
|
9
|
+
Triggers: "plan new feature", "create feature issues", "new feature".
|
|
10
|
+
argument-hint: "[fe:|be:|full:] <feature-description>"
|
|
11
|
+
allowed-tools:
|
|
12
|
+
- Bash
|
|
13
|
+
- Read
|
|
14
|
+
- Write
|
|
15
|
+
- AskUserQuestion
|
|
16
|
+
- Agent
|
|
17
|
+
- Skill
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Reservine — New Feature Planning
|
|
21
|
+
|
|
22
|
+
Creates structured GitHub issues for a new feature. Supports three scopes:
|
|
23
|
+
|
|
24
|
+
| Prefix | Scope | What happens |
|
|
25
|
+
|--------|-------|-------------|
|
|
26
|
+
| `fe:` | FE-only | Issue in FE repo, FE questionnaire only |
|
|
27
|
+
| `be:` | BE-only | Issue in BE repo, BE questionnaire only |
|
|
28
|
+
| `full:` | Both repos | Linked parent-child issues, all questions |
|
|
29
|
+
| *(none)* | Ask user | Presents scope selection with recommendation |
|
|
30
|
+
|
|
31
|
+
**Repo-agnostic** — works from either the FE or BE repo. Auto-detects which repo
|
|
32
|
+
it's running in and resolves the sibling repo from `.claude/config`.
|
|
33
|
+
|
|
34
|
+
**Questionnaire style** — follows `my:interactive-questionnaire` pattern: one question
|
|
35
|
+
per message, rich tradeoff descriptions, recommended option marked, acknowledge each
|
|
36
|
+
answer before moving to the next question.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Step 1: Load Config & Resolve Repos
|
|
41
|
+
|
|
42
|
+
1. Read `.claude/config` + `.claude/config.local`:
|
|
43
|
+
```bash
|
|
44
|
+
cat .claude/config 2>/dev/null
|
|
45
|
+
cat .claude/config.local 2>/dev/null
|
|
46
|
+
```
|
|
47
|
+
Extract: `GITHUB_REPO`, `DEVELOPMENT_BRANCH`
|
|
48
|
+
|
|
49
|
+
2. **Auto-detect repo context** — determine if we're in FE or BE:
|
|
50
|
+
```bash
|
|
51
|
+
if [[ -f "angular.json" ]] || [[ -f "nx.json" ]]; then
|
|
52
|
+
CURRENT_REPO="FE"
|
|
53
|
+
FE_GITHUB_REPO=$GITHUB_REPO
|
|
54
|
+
SIBLING_DIR=$(grep 'BACKEND_DIR' .claude/config | cut -d= -f2)
|
|
55
|
+
SIBLING_DIR_ABS=$(grep 'BACKEND_DIR_ABSOLUTE' .claude/config.local 2>/dev/null | cut -d= -f2)
|
|
56
|
+
[[ -n "$SIBLING_DIR_ABS" ]] && SIBLING_DIR="$SIBLING_DIR_ABS"
|
|
57
|
+
BE_GITHUB_REPO=$(grep 'GITHUB_REPO' "$SIBLING_DIR/.claude/config" 2>/dev/null | cut -d= -f2)
|
|
58
|
+
else
|
|
59
|
+
CURRENT_REPO="BE"
|
|
60
|
+
BE_GITHUB_REPO=$GITHUB_REPO
|
|
61
|
+
SIBLING_DIR=$(grep 'FRONTEND_DIR' .claude/config | cut -d= -f2)
|
|
62
|
+
SIBLING_DIR_ABS=$(grep 'FRONTEND_DIR_ABSOLUTE' .claude/config.local 2>/dev/null | cut -d= -f2)
|
|
63
|
+
[[ -n "$SIBLING_DIR_ABS" ]] && SIBLING_DIR="$SIBLING_DIR_ABS"
|
|
64
|
+
FE_GITHUB_REPO=$(grep 'GITHUB_REPO' "$SIBLING_DIR/.claude/config" 2>/dev/null | cut -d= -f2)
|
|
65
|
+
fi
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. **Fallback defaults** (if sibling config unreadable):
|
|
69
|
+
- `FE_GITHUB_REPO` defaults to `LEFTEQ/reservine`
|
|
70
|
+
- `BE_GITHUB_REPO` defaults to `genesiscz/ReservineBack`
|
|
71
|
+
|
|
72
|
+
## Step 2: Parse Arguments & Determine Scope
|
|
73
|
+
|
|
74
|
+
1. **Parse prefix** from `$ARGUMENTS` using pattern `^(fe|be|full):\s*(.+)$` (case-insensitive):
|
|
75
|
+
- Match found → set `SCOPE` and `FEATURE_DESCRIPTION`
|
|
76
|
+
- No match → set `FEATURE_DESCRIPTION = $ARGUMENTS` (or null), `SCOPE = null`
|
|
77
|
+
|
|
78
|
+
2. **If SCOPE is null**, `AskUserQuestion` with three options.
|
|
79
|
+
Mark the option matching `CURRENT_REPO` as "(Recommended)":
|
|
80
|
+
|
|
81
|
+
**FE-only** *(Recommended if running from FE repo)* — Creates a single issue in the
|
|
82
|
+
Angular/FE repo. Only asks UI/UX architecture questions (page layout, state management,
|
|
83
|
+
forms, etc.). Best for features that don't need new API endpoints or data model changes:
|
|
84
|
+
UI polish, new admin pages consuming existing APIs, layout refactors. If backend changes
|
|
85
|
+
are discovered later, you can create a cross-plan intent file as a follow-up.
|
|
86
|
+
|
|
87
|
+
**BE-only** *(Recommended if running from BE repo)* — Creates a single issue in the
|
|
88
|
+
Laravel/BE repo. Only asks data model and API architecture questions (models, endpoints,
|
|
89
|
+
permissions, etc.). Best for new endpoints, migrations, background jobs, or API-only
|
|
90
|
+
features: webhook systems, cron jobs, data exports. If frontend changes are discovered
|
|
91
|
+
later, you can create a cross-plan intent file as a follow-up.
|
|
92
|
+
|
|
93
|
+
**Full (both repos)** — Creates linked parent-child issues in both repos (FE = parent,
|
|
94
|
+
BE = child with sub-issue link). Asks all architecture questions for both stacks (BE
|
|
95
|
+
first, then FE — because data model constrains UI decisions). Best for complete features
|
|
96
|
+
spanning both repos: new CRUD modules, new settings pages with new APIs. Most thorough
|
|
97
|
+
but takes longer to complete.
|
|
98
|
+
|
|
99
|
+
3. Acknowledge the choice: "Scope: **<scope>**. I'll create issue(s) in <repo(s)> and ask
|
|
100
|
+
<FE/BE/all> architecture questions."
|
|
101
|
+
|
|
102
|
+
4. **If FEATURE_DESCRIPTION is still null**, `AskUserQuestion` for:
|
|
103
|
+
- Feature name (short, kebab-case-friendly)
|
|
104
|
+
- Business problem it solves
|
|
105
|
+
- Desired outcome / success criteria
|
|
106
|
+
|
|
107
|
+
5. Search for existing related issues in the relevant repo(s):
|
|
108
|
+
- `fe` scope: search FE repo only
|
|
109
|
+
- `be` scope: search BE repo only
|
|
110
|
+
- `full` scope: search both repos
|
|
111
|
+
```bash
|
|
112
|
+
gh search issues "<feature-keyword>" --repo $REPO --json number,title,state --limit 5
|
|
113
|
+
```
|
|
114
|
+
If related issues found, present them and ask if this is a duplicate.
|
|
115
|
+
|
|
116
|
+
## Step 3: Complexity Assessment
|
|
117
|
+
|
|
118
|
+
`AskUserQuestion` with scope-specific complexity indicators:
|
|
119
|
+
|
|
120
|
+
### If SCOPE == "fe"
|
|
121
|
+
|
|
122
|
+
- **Simple** (1-2 days, single component/page, consuming existing API endpoints) —
|
|
123
|
+
Skip questionnaire, create minimal issue directly
|
|
124
|
+
- **Medium** (3-5 days, 2-3 components, new state management or form flows) —
|
|
125
|
+
Abbreviated FE questionnaire (questions 1-5)
|
|
126
|
+
- **Complex** (1+ weeks, multiple pages/layers, new UI patterns or complex state) —
|
|
127
|
+
Full FE questionnaire (all 10 questions)
|
|
128
|
+
|
|
129
|
+
### If SCOPE == "be"
|
|
130
|
+
|
|
131
|
+
- **Simple** (1-2 days, single endpoint, extending existing model) —
|
|
132
|
+
Skip questionnaire, create minimal issue directly
|
|
133
|
+
- **Medium** (3-5 days, CRUD set, new model with 1-2 relationships) —
|
|
134
|
+
Abbreviated BE questionnaire (questions 1-5)
|
|
135
|
+
- **Complex** (1+ weeks, multiple models, events, jobs, cross-service logic) —
|
|
136
|
+
Full BE questionnaire (all 10 questions)
|
|
137
|
+
|
|
138
|
+
### If SCOPE == "full"
|
|
139
|
+
|
|
140
|
+
- **Simple** (1-2 days per side, straightforward CRUD with UI) —
|
|
141
|
+
Skip questionnaire, create issues directly
|
|
142
|
+
- **Medium** (3-5 days total, new model + new page) —
|
|
143
|
+
Abbreviated questionnaire (5 key questions per side, BE first)
|
|
144
|
+
- **Complex** (1+ weeks, multiple modules on both sides) —
|
|
145
|
+
Full questionnaire (all 20 questions, BE first then FE)
|
|
146
|
+
|
|
147
|
+
## Step 4: Interactive Questionnaire (Medium/Complex only)
|
|
148
|
+
|
|
149
|
+
Present questions one-at-a-time via `AskUserQuestion`. Follow the `my:interactive-questionnaire`
|
|
150
|
+
pattern for every question:
|
|
151
|
+
|
|
152
|
+
1. **One question per message** — never batch
|
|
153
|
+
2. **Rich option descriptions** — each option explains WHY and tradeoffs, not just the label
|
|
154
|
+
3. **Mark recommended option** — add "(Recommended)" to the best default choice
|
|
155
|
+
4. **Acknowledge each answer** — after the user picks, briefly explain how it constrains the next decision
|
|
156
|
+
5. **Show question progress** — format as `**N/M — Topic**`
|
|
157
|
+
|
|
158
|
+
### Scope filtering
|
|
159
|
+
|
|
160
|
+
| Scope | Questions asked |
|
|
161
|
+
|-------|----------------|
|
|
162
|
+
| `fe` | FE Questions only (Q1-Q10 or Q1-Q5 for Medium) |
|
|
163
|
+
| `be` | BE Questions only (Q1-Q10 or Q1-Q5 for Medium) |
|
|
164
|
+
| `full` | BE Questions first (Q1-Q10), then FE Questions (Q1-Q10). BE first because data model/API constrains UI decisions. |
|
|
165
|
+
|
|
166
|
+
### FE Questions
|
|
167
|
+
|
|
168
|
+
| # | Topic | Options (present with rich descriptions + tradeoffs) |
|
|
169
|
+
|---|-------|---------|
|
|
170
|
+
| 1 | **Page Architecture** | **New admin page** (Recommended) — top-level route with sidebar entry, best for distinct domains. Tradeoff: adds nav complexity / **New tab on existing page** — extends an existing settings/detail page, keeps nav clean. Tradeoff: existing page grows / **Extension of existing component** — modifies existing component, best for small additions. Tradeoff: component complexity / **Layer/drawer only** — modal or side drawer from contextual triggers. Tradeoff: not directly URL-navigable |
|
|
171
|
+
| 2 | **Layout Pattern** | **List + detail layer** (Recommended) — table/list with slide-in detail panel, most common admin pattern / **Card grid** — visual grid with filtering, good for media-heavy / **Split view** — side-by-side panels / **Dashboard widgets** — metric cards + charts / **Wizard/stepper** — multi-step linear flow |
|
|
172
|
+
| 3 | **Data Display** | **CDK table with sort/paginate** (Recommended) — full-featured table with column sorting, pagination, best for data-heavy lists / **Card grid with filters** — visual cards with filter sidebar / **Timeline/feed** — chronological entries / **Kanban board** — drag-and-drop columns |
|
|
173
|
+
| 4 | **Form Strategy** | **Single form section** — one `ui-form-section`, simplest / **Multi-section with tabs** — grouped settings-style / **Wizard steps** — multi-step with validation / **Inline editing** — click-to-edit cells / **Settings-style** — multiple independent sections with individual save |
|
|
174
|
+
| 5 | **State Management** | **TanStack Query** (Recommended) — automatic caching, invalidation, loading states. Best for API data / **Signal-based service** — manual signals for local component state / **RxJS streams** — for complex async orchestration / **resource() API** — Angular 21 resource primitive for simple fetch |
|
|
175
|
+
| 6 | **Empty States** | Illustration + CTA / Simple text + button / Onboarding guide / Contextual tips |
|
|
176
|
+
| 7 | **Loading Strategy** | Skeleton screens / Spinner / Progressive loading / Optimistic UI |
|
|
177
|
+
| 8 | **Mobile Approach** | Responsive table-to-cards / Dedicated mobile layout / Bottom sheet / Drawer navigation |
|
|
178
|
+
| 9 | **Interaction Patterns** | Click-to-edit / Drag-and-drop / Bulk select + actions / Inline quick actions |
|
|
179
|
+
| 10 | **Animation & Transitions** | None / Subtle (fade, slide) / Rich (stagger, spring) / Micro-interactions |
|
|
180
|
+
|
|
181
|
+
### BE Questions
|
|
182
|
+
|
|
183
|
+
| # | Topic | Options (present with rich descriptions + tradeoffs) |
|
|
184
|
+
|---|-------|---------|
|
|
185
|
+
| 1 | **Data Model Strategy** | **New standalone model** (Recommended) — clean separation, own migration + factory. Best for new domain concepts / **Extend existing model** — add columns to existing table, reuse existing factory. Best for enhancements / **Polymorphic** — shared interface across types (morphMany). More flexible but complex queries / **JSON extras on existing model** — store in model's `extra` JSON column. Fast to add, but no query indexing |
|
|
186
|
+
| 2 | **API Scope** | **Admin-only** (Recommended) — behind auth + permission check. Most features start here / **Public-only** — no auth required, customer-facing / **Both** — separate admin + public endpoints / **Tenant-scoped public** — public but filtered by tenant context |
|
|
187
|
+
| 3 | **CRUD Operations** | (Multi-select) List / Detail / Create / Update (PATCH) / Delete / Bulk operations |
|
|
188
|
+
| 4 | **Authentication & Permissions** | **Existing permission** (Recommended) — reuse an existing PermissionEnum case / **New permission enum case** — add new case to PermissionEnum + seed / **Public (no auth)** — no guard / **Role-based guard** — check user role, not specific permission |
|
|
189
|
+
| 5 | **Relationship Complexity** | **Simple belongsTo/hasMany** (Recommended) — standard FK relationships / **Many-to-many pivot** — pivot table with optional extra columns / **Polymorphic morphMany** — shared ownership across types / **Self-referencing tree** — parent-child within same table |
|
|
190
|
+
| 6 | **Event-Driven Side Effects** | None / Queue job (email, SMS) / Event + Listener / Webhook / Real-time Pusher |
|
|
191
|
+
| 7 | **File/Media Handling** | None / Single file upload / Multiple files / Image with crop / Documents with categories |
|
|
192
|
+
| 8 | **Money & Pricing** | None / MoneyFactory pattern / Stripe integration / Custom pricing rules |
|
|
193
|
+
| 9 | **Multi-tenant Scope** | **Standard BelongsToTenant** (Recommended) / Cross-tenant (SuperAdmin) / Tenant + Branch scoped |
|
|
194
|
+
| 10 | **Migration Strategy** | **Fresh migration** (Recommended) — new table, clean start / Alter existing table / Seeder needed / Feature flag for rollout |
|
|
195
|
+
|
|
196
|
+
After all questions, compile into a **Technical Assessment** and present to user for confirmation.
|
|
197
|
+
|
|
198
|
+
## Step 5: Priority, Effort & Milestone
|
|
199
|
+
|
|
200
|
+
`AskUserQuestion`:
|
|
201
|
+
- **Priority**: P0 (critical) / P1 (high) / P2 (medium) / P3 (low)
|
|
202
|
+
- **Impact**: Low / Medium / High
|
|
203
|
+
- **Effort**: Low / Medium / High
|
|
204
|
+
|
|
205
|
+
Then **select milestone** from the primary repo:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# fe scope or full scope: milestones from FE repo
|
|
209
|
+
# be scope: milestones from BE repo
|
|
210
|
+
MILESTONE_REPO=$FE_GITHUB_REPO # default
|
|
211
|
+
if [[ "$SCOPE" == "be" ]]; then
|
|
212
|
+
MILESTONE_REPO=$BE_GITHUB_REPO
|
|
213
|
+
fi
|
|
214
|
+
gh api repos/$MILESTONE_REPO/milestones --jq '.[].title'
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
`AskUserQuestion` with the available milestones as options + "No milestone" + "Other" (free text).
|
|
218
|
+
|
|
219
|
+
## Step 6: Create Issues
|
|
220
|
+
|
|
221
|
+
### 6a: FE-only Issue (SCOPE == "fe")
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
gh issue create --repo $FE_GITHUB_REPO --title "<feature-title>" --body "$(cat <<'ISSUE_EOF'
|
|
225
|
+
- [ ] @LEFTEQ read this
|
|
226
|
+
- [ ] @genesiscz read this
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
**Priority**: <priority> | **Impact**: <impact> | **Effort**: <effort>
|
|
231
|
+
**Scope**: FE-only
|
|
232
|
+
|
|
233
|
+
## Problem
|
|
234
|
+
<business problem>
|
|
235
|
+
|
|
236
|
+
## Current State
|
|
237
|
+
<what exists today>
|
|
238
|
+
|
|
239
|
+
## Implementation Plan
|
|
240
|
+
|
|
241
|
+
### Phase 1: <phase-name>
|
|
242
|
+
- [ ] <task 1>
|
|
243
|
+
- [ ] <task 2>
|
|
244
|
+
|
|
245
|
+
### Phase 2: <phase-name> (if applicable)
|
|
246
|
+
<description>
|
|
247
|
+
|
|
248
|
+
## Technical Assessment
|
|
249
|
+
<compiled FE questionnaire answers — page architecture, layout, state management, etc.>
|
|
250
|
+
|
|
251
|
+
## Success Criteria
|
|
252
|
+
- [ ] <criterion 1>
|
|
253
|
+
- [ ] <criterion 2>
|
|
254
|
+
|
|
255
|
+
## Implementation Checklist
|
|
256
|
+
- [ ] Build passes (0 errors)
|
|
257
|
+
- [ ] Lint passes (0 warnings added)
|
|
258
|
+
- [ ] E2E tests written and passing
|
|
259
|
+
- [ ] Responsive (desktop + tablet + mobile)
|
|
260
|
+
- [ ] Accessibility (keyboard nav + ARIA)
|
|
261
|
+
- [ ] i18n keys added (no hardcoded text)
|
|
262
|
+
- [ ] Loading states implemented
|
|
263
|
+
- [ ] Empty states implemented
|
|
264
|
+
- [ ] Error states implemented
|
|
265
|
+
- [ ] PR created and linked
|
|
266
|
+
ISSUE_EOF
|
|
267
|
+
)" --label "feature"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 6b: BE-only Issue (SCOPE == "be")
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
gh issue create --repo $BE_GITHUB_REPO --title "<feature-title>" --body "$(cat <<'ISSUE_EOF'
|
|
274
|
+
- [ ] @LEFTEQ read this
|
|
275
|
+
- [ ] @genesiscz read this
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
**Priority**: <priority> | **Impact**: <impact> | **Effort**: <effort>
|
|
280
|
+
**Scope**: BE-only
|
|
281
|
+
|
|
282
|
+
## Problem
|
|
283
|
+
<business problem>
|
|
284
|
+
|
|
285
|
+
## Current State
|
|
286
|
+
<what exists today>
|
|
287
|
+
|
|
288
|
+
## API Endpoints
|
|
289
|
+
| Method | Path | Description | Auth |
|
|
290
|
+
|--------|------|-------------|------|
|
|
291
|
+
| GET | `/api/...` | ... | Bearer |
|
|
292
|
+
| POST | `/api/...` | ... | Bearer |
|
|
293
|
+
|
|
294
|
+
## Data Model
|
|
295
|
+
<new models, relationships, migrations — from questionnaire>
|
|
296
|
+
|
|
297
|
+
## Technical Decisions
|
|
298
|
+
<from questionnaire — permissions, caching, events, multi-tenant scope>
|
|
299
|
+
|
|
300
|
+
## Implementation Plan
|
|
301
|
+
|
|
302
|
+
### Phase 1: <phase-name>
|
|
303
|
+
- [ ] <task 1>
|
|
304
|
+
- [ ] <task 2>
|
|
305
|
+
|
|
306
|
+
### Phase 2: <phase-name> (if applicable)
|
|
307
|
+
<description>
|
|
308
|
+
|
|
309
|
+
## Success Criteria
|
|
310
|
+
- [ ] <criterion 1>
|
|
311
|
+
- [ ] <criterion 2>
|
|
312
|
+
|
|
313
|
+
## Implementation Checklist
|
|
314
|
+
- [ ] Migration created (reversible)
|
|
315
|
+
- [ ] Model + Factory created
|
|
316
|
+
- [ ] Service layer implemented
|
|
317
|
+
- [ ] Controller + Routes created
|
|
318
|
+
- [ ] DTOs (request + response) created
|
|
319
|
+
- [ ] PHPStan passes (0 errors)
|
|
320
|
+
- [ ] Tests passing (happy + edge + error paths)
|
|
321
|
+
- [ ] Code review passed
|
|
322
|
+
- [ ] Security audit passed (OWASP + GDPR + multi-tenant)
|
|
323
|
+
- [ ] PR created and linked
|
|
324
|
+
ISSUE_EOF
|
|
325
|
+
)" --label "feature"
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 6c: Full Mode — Both Issues (SCOPE == "full")
|
|
329
|
+
|
|
330
|
+
Create FE issue (parent) using the template from 6a but with **both** FE and BE sections in
|
|
331
|
+
the Implementation Plan:
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
**Backend:**
|
|
335
|
+
- [ ] <task 1>
|
|
336
|
+
|
|
337
|
+
**Frontend:**
|
|
338
|
+
- [ ] <task 2>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Then create BE issue (child) with the 6b template, adding a parent reference:
|
|
342
|
+
|
|
343
|
+
```
|
|
344
|
+
> **Parent:** $FE_GITHUB_REPO#<fe-issue>
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
And including cross-repo tasks in the checklist:
|
|
348
|
+
```
|
|
349
|
+
- [ ] Generate TypeScript types (`sail a app:types` + `./bin/types`)
|
|
350
|
+
- [ ] Create FE intent file (cross-plan)
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Assign milestone (all scopes):
|
|
354
|
+
```bash
|
|
355
|
+
if [[ -n "$MILESTONE" ]]; then
|
|
356
|
+
# fe scope: FE repo only
|
|
357
|
+
# be scope: BE repo only
|
|
358
|
+
# full scope: both repos
|
|
359
|
+
gh issue edit <issue> --repo $REPO --milestone "$MILESTONE"
|
|
360
|
+
fi
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Step 7: Link Issues via Sub-Issues (SCOPE == "full" only)
|
|
364
|
+
|
|
365
|
+
> **Skip entirely for `fe` and `be` scopes.**
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
FE_OWNER=$(echo $FE_GITHUB_REPO | cut -d/ -f1)
|
|
369
|
+
FE_NAME=$(echo $FE_GITHUB_REPO | cut -d/ -f2)
|
|
370
|
+
FE_NODE_ID=$(gh api graphql -f query='
|
|
371
|
+
{ repository(owner:"'"$FE_OWNER"'", name:"'"$FE_NAME"'") {
|
|
372
|
+
issue(number:<fe-issue>) { id }
|
|
373
|
+
} }' --jq '.data.repository.issue.id')
|
|
374
|
+
|
|
375
|
+
BE_OWNER=$(echo $BE_GITHUB_REPO | cut -d/ -f1)
|
|
376
|
+
BE_NAME=$(echo $BE_GITHUB_REPO | cut -d/ -f2)
|
|
377
|
+
BE_NODE_ID=$(gh api graphql -f query='
|
|
378
|
+
{ repository(owner:"'"$BE_OWNER"'", name:"'"$BE_NAME"'") {
|
|
379
|
+
issue(number:<be-issue>) { id }
|
|
380
|
+
} }' --jq '.data.repository.issue.id')
|
|
381
|
+
|
|
382
|
+
gh api graphql -f query='
|
|
383
|
+
mutation {
|
|
384
|
+
addSubIssue(input: {
|
|
385
|
+
issueId: "'"$FE_NODE_ID"'"
|
|
386
|
+
subIssueId: "'"$BE_NODE_ID"'"
|
|
387
|
+
}) {
|
|
388
|
+
issue { id }
|
|
389
|
+
subIssue { id }
|
|
390
|
+
}
|
|
391
|
+
}'
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
If the sub-issue API fails, fall back to cross-reference comments only.
|
|
395
|
+
|
|
396
|
+
## Step 8: Cross-Reference Comments (SCOPE == "full" only)
|
|
397
|
+
|
|
398
|
+
> **Skip entirely for `fe` and `be` scopes.**
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
gh issue comment <fe-issue> --repo $FE_GITHUB_REPO \
|
|
402
|
+
--body "**BE Issue:** $BE_GITHUB_REPO#<be-issue>
|
|
403
|
+
Linked as sub-issue for implementation tracking."
|
|
404
|
+
|
|
405
|
+
gh issue comment <be-issue> --repo $BE_GITHUB_REPO \
|
|
406
|
+
--body "**FE Parent:** $FE_GITHUB_REPO#<fe-issue>
|
|
407
|
+
This issue tracks the backend implementation."
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
## Step 9: Ensure Labels Exist
|
|
411
|
+
|
|
412
|
+
Create status labels (idempotent) in the **affected repos only**:
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
declare -A LABELS=(
|
|
416
|
+
["status:planning"]="FBCA04"
|
|
417
|
+
["status:in-progress"]="1D76DB"
|
|
418
|
+
["status:blocked"]="D93F0B"
|
|
419
|
+
["status:architecture-decided"]="1D76DB"
|
|
420
|
+
["status:design-decided"]="0E8A16"
|
|
421
|
+
["status:build-passing"]="0E8A16"
|
|
422
|
+
["status:tests-passing"]="0E8A16"
|
|
423
|
+
["status:pr-ready"]="FBCA04"
|
|
424
|
+
["status:review-passed"]="0E8A16"
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
# fe scope: FE repo only | be scope: BE repo only | full scope: both
|
|
428
|
+
for repo in <affected-repos>; do
|
|
429
|
+
for label in "${!LABELS[@]}"; do
|
|
430
|
+
gh label create "$label" --repo "$repo" --color "${LABELS[$label]}" 2>/dev/null || true
|
|
431
|
+
done
|
|
432
|
+
done
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Apply `status:planning` to the created issue(s).
|
|
436
|
+
|
|
437
|
+
## Step 10: Output Summary
|
|
438
|
+
|
|
439
|
+
### 10a: FE-only Summary (SCOPE == "fe")
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
Feature Planning Complete
|
|
443
|
+
=========================
|
|
444
|
+
|
|
445
|
+
Scope: FE-only
|
|
446
|
+
FE Issue: $FE_GITHUB_REPO#<number> — <title>
|
|
447
|
+
https://github.com/$FE_GITHUB_REPO/issues/<number>
|
|
448
|
+
|
|
449
|
+
Milestone: <milestone or "None">
|
|
450
|
+
Labels: status:planning
|
|
451
|
+
Priority: <priority> | Impact: <impact> | Effort: <effort>
|
|
452
|
+
|
|
453
|
+
Next steps:
|
|
454
|
+
1. Both @LEFTEQ and @genesiscz should read the issue and check their boxes
|
|
455
|
+
2. To implement:
|
|
456
|
+
cd <FRONTEND_DIR>
|
|
457
|
+
/reservine-dx:implement-plan <fe-issue-number>
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
Then `AskUserQuestion`:
|
|
461
|
+
- **Done** — finish here
|
|
462
|
+
- **Create BE cross-plan** — create a `.intent.md` in the BE repo if backend changes are needed later (invokes `reservine-dx:cross-plan`)
|
|
463
|
+
- **Run Apple Design Director critique** — screenshot related screens via Playwright MCP
|
|
464
|
+
|
|
465
|
+
### 10b: BE-only Summary (SCOPE == "be")
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
Feature Planning Complete
|
|
469
|
+
=========================
|
|
470
|
+
|
|
471
|
+
Scope: BE-only
|
|
472
|
+
BE Issue: $BE_GITHUB_REPO#<number> — <title>
|
|
473
|
+
https://github.com/$BE_GITHUB_REPO/issues/<number>
|
|
474
|
+
|
|
475
|
+
Milestone: <milestone or "None">
|
|
476
|
+
Labels: status:planning
|
|
477
|
+
Priority: <priority> | Impact: <impact> | Effort: <effort>
|
|
478
|
+
|
|
479
|
+
Next steps:
|
|
480
|
+
1. Both @LEFTEQ and @genesiscz should read the issue and check their boxes
|
|
481
|
+
2. To implement:
|
|
482
|
+
cd <BACKEND_DIR>
|
|
483
|
+
/reservine-dx:implement-plan <be-issue-number>
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
Then `AskUserQuestion`:
|
|
487
|
+
- **Done** — finish here
|
|
488
|
+
- **Create FE cross-plan** — create a `.intent.md` in the FE repo if frontend changes are needed later (invokes `reservine-dx:cross-plan`)
|
|
489
|
+
|
|
490
|
+
### 10c: Full Summary (SCOPE == "full")
|
|
491
|
+
|
|
492
|
+
```
|
|
493
|
+
Feature Planning Complete
|
|
494
|
+
=========================
|
|
495
|
+
|
|
496
|
+
Scope: Full (both repos)
|
|
497
|
+
FE Issue (Parent): $FE_GITHUB_REPO#<number> — <title>
|
|
498
|
+
https://github.com/$FE_GITHUB_REPO/issues/<number>
|
|
499
|
+
|
|
500
|
+
BE Issue (Child): $BE_GITHUB_REPO#<number> — <title>
|
|
501
|
+
https://github.com/$BE_GITHUB_REPO/issues/<number>
|
|
502
|
+
|
|
503
|
+
Relationship: FE is parent, BE is sub-issue
|
|
504
|
+
Milestone: <milestone or "None">
|
|
505
|
+
Labels: status:planning (both repos)
|
|
506
|
+
Priority: <priority> | Impact: <impact> | Effort: <effort>
|
|
507
|
+
|
|
508
|
+
Next steps:
|
|
509
|
+
1. Both @LEFTEQ and @genesiscz should read the issues and check their boxes
|
|
510
|
+
2. To implement BE first:
|
|
511
|
+
cd <BACKEND_DIR>
|
|
512
|
+
/reservine-dx:implement-plan <be-issue-number>
|
|
513
|
+
3. To implement FE:
|
|
514
|
+
cd <FRONTEND_DIR>
|
|
515
|
+
/reservine-dx:implement-plan <fe-issue-number>
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
Then `AskUserQuestion`:
|
|
519
|
+
- **Done** — finish here
|
|
520
|
+
- **Run Apple Design Director critique** — screenshot related screens via Playwright MCP
|
|
521
|
+
- **Create intent file** — write a `.intent.md` cross-plan file for the BE repo
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## Config Variables
|
|
526
|
+
|
|
527
|
+
| Variable | Source | Purpose |
|
|
528
|
+
|----------|--------|---------|
|
|
529
|
+
| `GITHUB_REPO` | `.claude/config` | Current repo for `gh` commands |
|
|
530
|
+
| `FRONTEND_DIR` / `BACKEND_DIR` | `.claude/config` | Path to sibling repo |
|
|
531
|
+
| `*_ABSOLUTE` variants | `.claude/config.local` | Worktree-safe absolute paths |
|
|
532
|
+
| Sibling `GITHUB_REPO` | `<sibling>/.claude/config` | Other repo for `gh` commands |
|
|
533
|
+
|
|
534
|
+
## Error Recovery
|
|
535
|
+
|
|
536
|
+
| Step | Failure | Recovery |
|
|
537
|
+
|------|---------|----------|
|
|
538
|
+
| 1 | Sibling config not found | Use defaults: `LEFTEQ/reservine` (FE), `genesiscz/ReservineBack` (BE) |
|
|
539
|
+
| 1 | Can't detect FE vs BE | `AskUserQuestion`: "Which repo is this?" |
|
|
540
|
+
| 2 | Invalid scope prefix | Ignore prefix, treat entire string as description, ask for scope |
|
|
541
|
+
| 5 | No milestones found | Skip milestone assignment |
|
|
542
|
+
| 6 | Issue creation fails | Check `gh auth status`, verify repo access |
|
|
543
|
+
| 7 | Sub-issues API not available | Fall back to cross-reference comments only |
|
|
544
|
+
| 9 | Label creation fails | Labels may already exist — this is fine (idempotent) |
|