@atlashub/smartstack-cli 1.14.0 → 1.14.2
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/.documentation/gitflow.html +541 -378
- package/.documentation/installation.html +114 -39
- package/config/default-config.json +10 -1
- package/package.json +1 -1
- package/templates/agents/efcore/migration.md +4 -4
- package/templates/commands/efcore/_shared.md +1 -1
- package/templates/commands/efcore/migration.md +1 -1
- package/templates/commands/efcore/rebase-snapshot.md +1 -1
- package/templates/commands/efcore/squash.md +1 -0
- package/templates/skills/_shared.md +29 -6
- package/templates/skills/apex/SKILL.md +56 -0
- package/templates/skills/apex/steps/step-01-analyze.md +22 -5
- package/templates/skills/apex/steps/step-04-validate.md +32 -6
- package/templates/skills/gitflow/steps/step-start.md +109 -9
- package/templates/skills/ui-components/SKILL.md +167 -5
- package/templates/commands/gitflow/OPTIMIZATIONS.md +0 -206
- package/templates/gitflow/config.json +0 -138
|
@@ -152,20 +152,100 @@ git checkout "$BASE_BRANCH" && git pull origin "$BASE_BRANCH"
|
|
|
152
152
|
git checkout -b "$FULL_BRANCH"
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
-
### 7. Create Local
|
|
155
|
+
### 7. Create Local Environment Config (Backend + Frontend)
|
|
156
156
|
|
|
157
|
-
**
|
|
157
|
+
**Detect project structure:**
|
|
158
158
|
```bash
|
|
159
|
+
# Find API project directory
|
|
160
|
+
API_DIR=$(find "$WORKTREE_PATH" -type d -name "*.Api" -path "*/src/*" | head -1)
|
|
161
|
+
# Find Web project directory
|
|
162
|
+
WEB_DIR=$(find "$WORKTREE_PATH" -type d -name "*-web" -path "*/web/*" | head -1)
|
|
163
|
+
|
|
164
|
+
# Generate unique ports based on branch name hash (to avoid conflicts between worktrees)
|
|
165
|
+
HASH=$(echo "$BRANCH_NAME" | md5sum | cut -c1-4)
|
|
166
|
+
HASH_NUM=$((16#$HASH % 100))
|
|
167
|
+
API_PORT=$((5200 + HASH_NUM))
|
|
168
|
+
WEB_PORT=$((5300 + HASH_NUM))
|
|
169
|
+
|
|
170
|
+
# Project and DB naming
|
|
159
171
|
PROJECT_NAME=$(basename $(pwd) | tr '[:upper:]' '[:lower:]')
|
|
160
|
-
DB_NAME
|
|
172
|
+
DB_NAME=$(echo "${PROJECT_NAME}_${branch_type}_${BRANCH_NAME}" | cut -c1-63)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
#### 7a. Backend: appsettings.Local.json
|
|
161
176
|
|
|
162
|
-
|
|
177
|
+
**If API project detected:**
|
|
178
|
+
```bash
|
|
179
|
+
[ -n "$API_DIR" ] && [ -f "$API_DIR/appsettings.json" ] && {
|
|
180
|
+
cat > "$API_DIR/appsettings.Local.json" << EOF
|
|
163
181
|
{
|
|
164
182
|
"ConnectionStrings": {
|
|
165
183
|
"DefaultConnection": "Server=localhost;Database=${DB_NAME};Trusted_Connection=true;TrustServerCertificate=true"
|
|
184
|
+
},
|
|
185
|
+
"Authentication": {
|
|
186
|
+
"FrontendUrl": "http://localhost:${WEB_PORT}"
|
|
187
|
+
},
|
|
188
|
+
"Kestrel": {
|
|
189
|
+
"Endpoints": {
|
|
190
|
+
"Http": {
|
|
191
|
+
"Url": "http://localhost:${API_PORT}"
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"Serilog": {
|
|
196
|
+
"MinimumLevel": {
|
|
197
|
+
"Default": "Debug"
|
|
198
|
+
}
|
|
166
199
|
}
|
|
167
200
|
}
|
|
168
201
|
EOF
|
|
202
|
+
echo "Created: $API_DIR/appsettings.Local.json (DB: $DB_NAME, Port: $API_PORT)"
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### 7b. Frontend: .env.local + npm script
|
|
207
|
+
|
|
208
|
+
**If Web project detected:**
|
|
209
|
+
```bash
|
|
210
|
+
[ -n "$WEB_DIR" ] && [ -f "$WEB_DIR/package.json" ] && {
|
|
211
|
+
# Create .env.local
|
|
212
|
+
cat > "$WEB_DIR/.env.local" << EOF
|
|
213
|
+
# Local environment configuration
|
|
214
|
+
# Generated by /gitflow:start for branch: ${FULL_BRANCH}
|
|
215
|
+
# Run with: npm run local
|
|
216
|
+
|
|
217
|
+
VITE_API_URL=http://localhost:${API_PORT}
|
|
218
|
+
VITE_APP_ENV=local
|
|
219
|
+
VITE_DEBUG=true
|
|
220
|
+
EOF
|
|
221
|
+
echo "Created: $WEB_DIR/.env.local (API: localhost:$API_PORT)"
|
|
222
|
+
|
|
223
|
+
# Add "local" script to package.json if not exists
|
|
224
|
+
if ! grep -q '"local"' "$WEB_DIR/package.json"; then
|
|
225
|
+
# Use Node.js to safely modify package.json
|
|
226
|
+
node -e "
|
|
227
|
+
const fs = require('fs');
|
|
228
|
+
const pkg = JSON.parse(fs.readFileSync('$WEB_DIR/package.json', 'utf8'));
|
|
229
|
+
if (!pkg.scripts.local) {
|
|
230
|
+
pkg.scripts.local = 'vite --mode local --port ${WEB_PORT}';
|
|
231
|
+
fs.writeFileSync('$WEB_DIR/package.json', JSON.stringify(pkg, null, 2) + '\n');
|
|
232
|
+
console.log('Added script: npm run local');
|
|
233
|
+
}
|
|
234
|
+
"
|
|
235
|
+
fi
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### 7c. Summary of local config
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
243
|
+
│ LOCAL ENVIRONMENT CONFIGURED │
|
|
244
|
+
├─────────────────────────────────────────────────────────────┤
|
|
245
|
+
│ Database: ${DB_NAME} │
|
|
246
|
+
│ API Port: ${API_PORT} → dotnet run --environment Local │
|
|
247
|
+
│ Web Port: ${WEB_PORT} → npm run local │
|
|
248
|
+
└─────────────────────────────────────────────────────────────┘
|
|
169
249
|
```
|
|
170
250
|
|
|
171
251
|
### 8. Store State
|
|
@@ -178,7 +258,14 @@ EOF
|
|
|
178
258
|
"base_branch": "{BASE_BRANCH}",
|
|
179
259
|
"target_branch": "{TARGET}",
|
|
180
260
|
"worktree_path": "{WORKTREE_PATH}",
|
|
181
|
-
"version_current": "{VERSION}"
|
|
261
|
+
"version_current": "{VERSION}",
|
|
262
|
+
"local_config": {
|
|
263
|
+
"database": "{DB_NAME}",
|
|
264
|
+
"api_port": "{API_PORT}",
|
|
265
|
+
"web_port": "{WEB_PORT}",
|
|
266
|
+
"api_dir": "{API_DIR}",
|
|
267
|
+
"web_dir": "{WEB_DIR}"
|
|
268
|
+
}
|
|
182
269
|
}
|
|
183
270
|
```
|
|
184
271
|
|
|
@@ -193,18 +280,29 @@ EOF
|
|
|
193
280
|
║ Target: {TARGET} ║
|
|
194
281
|
║ Worktree: {WORKTREE_PATH} ║
|
|
195
282
|
╠══════════════════════════════════════════════════════════════════╣
|
|
283
|
+
║ LOCAL ENVIRONMENT: ║
|
|
284
|
+
║ Database: {DB_NAME} ║
|
|
285
|
+
║ API: http://localhost:{API_PORT} ║
|
|
286
|
+
║ Web: http://localhost:{WEB_PORT} ║
|
|
287
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
196
288
|
║ NEXT STEPS: ║
|
|
197
289
|
║ ║
|
|
198
290
|
║ 1. Go to worktree: ║
|
|
199
291
|
║ cd {WORKTREE_PATH} ║
|
|
200
292
|
║ ║
|
|
201
|
-
║ 2.
|
|
293
|
+
║ 2. Start local environment: ║
|
|
294
|
+
║ # Terminal 1 - Backend: ║
|
|
295
|
+
║ cd src/SmartStack.Api && dotnet run --environment Local ║
|
|
296
|
+
║ # Terminal 2 - Frontend: ║
|
|
297
|
+
║ cd web/smartstack-web && npm run local ║
|
|
298
|
+
║ ║
|
|
299
|
+
║ 3. Make changes and commit: ║
|
|
202
300
|
║ /gitflow commit ║
|
|
203
301
|
║ ║
|
|
204
|
-
║
|
|
302
|
+
║ 4. Create pull request: ║
|
|
205
303
|
║ /gitflow pr ║
|
|
206
304
|
║ ║
|
|
207
|
-
║
|
|
305
|
+
║ 5. After PR merged, finalize: ║
|
|
208
306
|
║ /gitflow finish ║
|
|
209
307
|
╚══════════════════════════════════════════════════════════════════╝
|
|
210
308
|
```
|
|
@@ -226,7 +324,9 @@ EOF
|
|
|
226
324
|
|
|
227
325
|
- Branch created from correct base
|
|
228
326
|
- Worktree set up (if enabled)
|
|
229
|
-
-
|
|
327
|
+
- Backend local config created: `appsettings.Local.json` (if .NET API detected)
|
|
328
|
+
- Frontend local config created: `.env.local` + `npm run local` script (if web project detected)
|
|
329
|
+
- Ports synchronized between backend and frontend (unique per branch)
|
|
230
330
|
- State stored for subsequent steps
|
|
231
331
|
|
|
232
332
|
## NEXT STEP:
|
|
@@ -70,12 +70,12 @@ import { EntityCard, ProviderCard, TemplateCard } from '@/components/ui/EntityCa
|
|
|
70
70
|
| `links` | `Array<{ icon, label, href?, onClick? }>` |
|
|
71
71
|
| `actions` | `Array<{ label, href?, onClick?, variant, icon?, disabled? }>` |
|
|
72
72
|
|
|
73
|
-
### Action Variants
|
|
73
|
+
### Action Variants (EntityCard)
|
|
74
74
|
| Variant | Style |
|
|
75
75
|
|---------|-------|
|
|
76
|
-
| `primary` | `bg-accent-
|
|
77
|
-
| `secondary` | `bg-
|
|
78
|
-
| `ghost` | `
|
|
76
|
+
| `primary` | `bg-[var(--color-accent-600)] text-white` |
|
|
77
|
+
| `secondary` | `bg-[var(--bg-secondary)] text-[var(--text-secondary)]` |
|
|
78
|
+
| `ghost` | `text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]` (NO border!) |
|
|
79
79
|
|
|
80
80
|
## RESPONSIVE GRID
|
|
81
81
|
|
|
@@ -159,12 +159,174 @@ const canExecute = hasPermission('module.action.execute');
|
|
|
159
159
|
| Catalogs | Cards with complex interactive states |
|
|
160
160
|
| Clickable grids | Cards with integrated forms |
|
|
161
161
|
|
|
162
|
+
## CRITICAL: CSS VARIABLES (NEVER HARDCODE COLORS)
|
|
163
|
+
|
|
164
|
+
**NEVER use hardcoded Tailwind colors.** ALWAYS use CSS variables for theme compliance.
|
|
165
|
+
|
|
166
|
+
### Status Colors
|
|
167
|
+
| Status | Background | Text | Border | Dot (solid) |
|
|
168
|
+
|--------|------------|------|--------|-------------|
|
|
169
|
+
| **Info** (Pending, Business) | `--info-bg` | `--info-text` | `--info-border` | `--info-dot` |
|
|
170
|
+
| **Success** (Active) | `--success-bg` | `--success-text` | `--success-border` | `--success-dot` |
|
|
171
|
+
| **Warning** (Suspended, Owner) | `--warning-bg` | `--warning-text` | `--warning-border` | `--warning-dot` |
|
|
172
|
+
| **Error** (Danger, Archive) | `--error-bg` | `--error-text` | `--error-border` | `--error-dot` |
|
|
173
|
+
| **Accent** (Personal, Primary) | `--accent-bg` | `--accent-text` | `--accent-border` | `--color-accent-500` |
|
|
174
|
+
|
|
175
|
+
### Badge Pattern
|
|
176
|
+
```tsx
|
|
177
|
+
// ✅ CORRECT - Uses CSS variables
|
|
178
|
+
<span className="px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--info-bg)] text-[var(--info-text)]">
|
|
179
|
+
Info Badge
|
|
180
|
+
</span>
|
|
181
|
+
|
|
182
|
+
// ❌ WRONG - Hardcoded Tailwind colors
|
|
183
|
+
<span className="bg-blue-500/10 text-blue-500">Info Badge</span>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Status Config Pattern
|
|
187
|
+
```tsx
|
|
188
|
+
// ✅ CORRECT
|
|
189
|
+
const STATUS_CONFIG = {
|
|
190
|
+
Pending: { bgColor: 'bg-[var(--info-bg)]', color: 'text-[var(--info-text)]', borderColor: 'border-[var(--info-border)]' },
|
|
191
|
+
Active: { bgColor: 'bg-[var(--success-bg)]', color: 'text-[var(--success-text)]', borderColor: 'border-[var(--success-border)]' },
|
|
192
|
+
Suspended: { bgColor: 'bg-[var(--warning-bg)]', color: 'text-[var(--warning-text)]', borderColor: 'border-[var(--warning-border)]' },
|
|
193
|
+
Archived: { bgColor: 'bg-[var(--bg-tertiary)]', color: 'text-[var(--text-tertiary)]', borderColor: 'border-[var(--border-color)]' }
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
// ❌ WRONG - dark: variants are obsolete
|
|
197
|
+
const STATUS_CONFIG = {
|
|
198
|
+
Active: { bgColor: 'bg-emerald-50 dark:bg-emerald-900/20', ... }
|
|
199
|
+
};
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## BUTTON VARIANTS
|
|
203
|
+
|
|
204
|
+
### Action Buttons (Status changes)
|
|
205
|
+
```tsx
|
|
206
|
+
// Success action (Activate)
|
|
207
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--success-dot)] text-white hover:opacity-90">
|
|
208
|
+
Activate
|
|
209
|
+
</button>
|
|
210
|
+
|
|
211
|
+
// Warning action (Suspend)
|
|
212
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--warning-dot)] text-white hover:opacity-90">
|
|
213
|
+
Suspend
|
|
214
|
+
</button>
|
|
215
|
+
|
|
216
|
+
// Danger action (Archive/Delete)
|
|
217
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-dot)] text-white hover:opacity-90">
|
|
218
|
+
Archive
|
|
219
|
+
</button>
|
|
220
|
+
|
|
221
|
+
// Primary action
|
|
222
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]">
|
|
223
|
+
Save
|
|
224
|
+
</button>
|
|
225
|
+
|
|
226
|
+
// Ghost action (NO BORDER!)
|
|
227
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]">
|
|
228
|
+
Refresh
|
|
229
|
+
</button>
|
|
230
|
+
|
|
231
|
+
// Secondary action
|
|
232
|
+
<button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]">
|
|
233
|
+
Cancel
|
|
234
|
+
</button>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Button Rules
|
|
238
|
+
| Variant | Background | Text | Border | Hover |
|
|
239
|
+
|---------|------------|------|--------|-------|
|
|
240
|
+
| **Primary** | `--color-accent-600` | `white` | none | `--color-accent-700` |
|
|
241
|
+
| **Success** | `--success-dot` | `white` | none | `opacity-90` |
|
|
242
|
+
| **Warning** | `--warning-dot` | `white` | none | `opacity-90` |
|
|
243
|
+
| **Danger** | `--error-dot` | `white` | none | `opacity-90` |
|
|
244
|
+
| **Secondary** | `--bg-secondary` | `--text-secondary` | none | `--bg-hover` |
|
|
245
|
+
| **Ghost** | transparent | `--text-secondary` | **NONE** | `--bg-hover` |
|
|
246
|
+
|
|
247
|
+
## DETAIL PAGE TEMPLATE
|
|
248
|
+
|
|
249
|
+
### Structure
|
|
250
|
+
```tsx
|
|
251
|
+
<div className="container mx-auto px-4 py-6 max-w-7xl space-y-6">
|
|
252
|
+
{/* Header */}
|
|
253
|
+
<div className="flex items-center gap-4">
|
|
254
|
+
<button onClick={() => navigate(-1)} className="p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]">
|
|
255
|
+
<ArrowLeft className="w-5 h-5 text-[var(--text-secondary)]" />
|
|
256
|
+
</button>
|
|
257
|
+
<div className="flex-1">
|
|
258
|
+
<h1 className="text-xl sm:text-2xl font-bold text-[var(--text-primary)]">{title}</h1>
|
|
259
|
+
<p className="text-sm text-[var(--text-secondary)]">{subtitle}</p>
|
|
260
|
+
</div>
|
|
261
|
+
<div className="flex items-center gap-2">
|
|
262
|
+
{/* Status badges */}
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
|
|
266
|
+
{/* Pill Tabs */}
|
|
267
|
+
<div className="flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]">
|
|
268
|
+
{tabs.map(tab => (
|
|
269
|
+
<button
|
|
270
|
+
key={tab.id}
|
|
271
|
+
className={`px-4 py-2 rounded-[var(--radius-button)] font-medium ${
|
|
272
|
+
activeTab === tab.id
|
|
273
|
+
? 'bg-[var(--color-accent-600)] text-white'
|
|
274
|
+
: 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'
|
|
275
|
+
}`}
|
|
276
|
+
>
|
|
277
|
+
{tab.label}
|
|
278
|
+
</button>
|
|
279
|
+
))}
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
{/* Tab Content */}
|
|
283
|
+
<div className="min-h-[400px]">{/* ... */}</div>
|
|
284
|
+
</div>
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Info Card Pattern
|
|
288
|
+
```tsx
|
|
289
|
+
<div className="p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]">
|
|
290
|
+
<div className="flex items-center justify-between mb-4">
|
|
291
|
+
<h3 className="text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2">
|
|
292
|
+
<Icon className="w-5 h-5" />
|
|
293
|
+
{title}
|
|
294
|
+
</h3>
|
|
295
|
+
<button className="flex items-center gap-1 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]">
|
|
296
|
+
<Edit3 className="w-4 h-4" />
|
|
297
|
+
{t('common:edit')}
|
|
298
|
+
</button>
|
|
299
|
+
</div>
|
|
300
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
301
|
+
<div className="p-3 rounded-lg bg-[var(--bg-secondary)]">
|
|
302
|
+
<p className="text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1">{label}</p>
|
|
303
|
+
<p className="text-sm text-[var(--text-primary)] font-medium">{value}</p>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Error Display Pattern
|
|
310
|
+
```tsx
|
|
311
|
+
{error && (
|
|
312
|
+
<div className="p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]">
|
|
313
|
+
<div className="flex items-center gap-2 text-[var(--error-text)]">
|
|
314
|
+
<AlertTriangle className="w-5 h-5" />
|
|
315
|
+
<span>{error}</span>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
)}
|
|
319
|
+
```
|
|
320
|
+
|
|
162
321
|
## ABSOLUTE RULES
|
|
163
322
|
|
|
164
323
|
| DO | DON'T |
|
|
165
324
|
|----|-------|
|
|
325
|
+
| CSS variables for ALL colors | Hardcoded Tailwind colors (`bg-blue-500`) |
|
|
326
|
+
| `--success-dot`, `--warning-dot`, `--error-dot` for action buttons | `bg-emerald-500`, `bg-amber-500`, `bg-red-500` |
|
|
327
|
+
| `--info-bg`, `--success-bg`, etc. for badges | `bg-blue-500/10 dark:bg-blue-900/20` |
|
|
328
|
+
| Ghost buttons WITHOUT border | `border border-[var(--border-color)]` on ghost |
|
|
166
329
|
| EntityCard for entities | Custom cards with manual divs |
|
|
167
|
-
| Distinct colored header | rounded-full for avatar (that's table) |
|
|
168
330
|
| Responsive grid 1→2→3→4 | Fixed non-responsive grid |
|
|
169
331
|
| h-full + flex-1 + mt-auto | Unaligned buttons in grid |
|
|
170
332
|
| Empty and loading states | Native HTML tooltip |
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# GitFlow Optimizations - Resume
|
|
2
|
-
|
|
3
|
-
> **Date:** 2026-01-20
|
|
4
|
-
> **Objectif:** Reduire le temps d'execution des commandes GitFlow de ~70%
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Optimisations Implementees
|
|
9
|
-
|
|
10
|
-
### 1. Fonctions Partagees (`_shared.md`)
|
|
11
|
-
|
|
12
|
-
**Fichier cree:** `templates/commands/gitflow/_shared.md`
|
|
13
|
-
|
|
14
|
-
Centralise les fonctions reutilisables pour eviter la duplication:
|
|
15
|
-
|
|
16
|
-
| Fonction | Usage | Gain |
|
|
17
|
-
|----------|-------|------|
|
|
18
|
-
| `get_current_branch()` | Detection robuste de branche | ~66% |
|
|
19
|
-
| `get_version_info()` | Version + tags en 1 appel | ~75% |
|
|
20
|
-
| `get_sync_status()` | Statut sync local/remote | ~70% |
|
|
21
|
-
| `collect_repo_data_parallel()` | Collecte parallele | ~60-70% |
|
|
22
|
-
| `read_gitflow_config()` | Config avec cache | ~90% |
|
|
23
|
-
| `detect_worktree_mode()` | Detection auto structure | Fiabilite |
|
|
24
|
-
| `get_worktree_path()` | Chemin worktree standard | Consistance |
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
### 2. Parallelisation Git (`2-status.md`, `10-start.md`, `11-finish.md`)
|
|
29
|
-
|
|
30
|
-
**Avant:**
|
|
31
|
-
```bash
|
|
32
|
-
# Sequentiel - ~8 secondes
|
|
33
|
-
git fetch --all
|
|
34
|
-
git for-each-ref refs/heads
|
|
35
|
-
git for-each-ref refs/remotes
|
|
36
|
-
git for-each-ref refs/tags
|
|
37
|
-
git worktree list
|
|
38
|
-
git branch -vv
|
|
39
|
-
git status
|
|
40
|
-
# + boucles for pour chaque branche
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
**Apres:**
|
|
44
|
-
```bash
|
|
45
|
-
# Parallele - ~2 secondes
|
|
46
|
-
{
|
|
47
|
-
git for-each-ref refs/heads > /tmp/local &
|
|
48
|
-
git for-each-ref refs/remotes > /tmp/remote &
|
|
49
|
-
git for-each-ref refs/tags > /tmp/tags &
|
|
50
|
-
git worktree list > /tmp/worktrees &
|
|
51
|
-
git status --porcelain > /tmp/status &
|
|
52
|
-
wait
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**Gain:** ~70% du temps de collecte
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
### 3. Mode Fast (`2-status.md`)
|
|
61
|
-
|
|
62
|
-
**Nouveau:** `/gitflow:status --fast`
|
|
63
|
-
|
|
64
|
-
Output compact en ~1 seconde:
|
|
65
|
-
```
|
|
66
|
-
[develop] clean | v1.5.0 | dev->main:+5 | main->dev:+0 | sync:UP-TO-DATE
|
|
67
|
-
-> /gitflow:start release (5 commits prets)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
### 4. Consolidation des Questions (`10-start.md`)
|
|
73
|
-
|
|
74
|
-
**Avant:** 6+ `AskUserQuestion` sequentiels
|
|
75
|
-
- Type de branche
|
|
76
|
-
- Divergence main (release)
|
|
77
|
-
- Migrations EF Core (release)
|
|
78
|
-
- Version (release)
|
|
79
|
-
- Nom de branche
|
|
80
|
-
- Working directory dirty
|
|
81
|
-
|
|
82
|
-
**Apres:** 1-2 questions maximum
|
|
83
|
-
- Question unique avec options dynamiques
|
|
84
|
-
- Execution directe si arguments fournis
|
|
85
|
-
|
|
86
|
-
**Gain:** ~70% du temps d'interaction
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
### 5. Optimisation des Agents
|
|
91
|
-
|
|
92
|
-
| Agent | Avant | Apres | Raison |
|
|
93
|
-
|-------|-------|-------|--------|
|
|
94
|
-
| `gitflow-finish` | sonnet | **haiku** | Actions predefinies |
|
|
95
|
-
| `gitflow-commit` | sonnet | **haiku** | Validation simple |
|
|
96
|
-
| `gitflow-exec` | sonnet | sonnet | Gestion conflits complexe |
|
|
97
|
-
| `gitflow-status` | haiku | haiku | OK |
|
|
98
|
-
| `gitflow-start` | haiku | haiku | OK |
|
|
99
|
-
| `gitflow-pr` | haiku | haiku | OK |
|
|
100
|
-
|
|
101
|
-
**Gain latence:** ~30-50% pour les agents optimises
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Gains Totaux par Commande
|
|
106
|
-
|
|
107
|
-
| Commande | Avant | Apres | Gain |
|
|
108
|
-
|----------|-------|-------|------|
|
|
109
|
-
| `/gitflow:status` | ~8-12s | ~2-3s | **~70%** |
|
|
110
|
-
| `/gitflow:status --fast` | N/A | ~1s | **Nouveau** |
|
|
111
|
-
| `/gitflow:start` (interactif) | ~25s | ~8s | **~65%** |
|
|
112
|
-
| `/gitflow:start feature xxx` | ~15s | ~5s | **~65%** |
|
|
113
|
-
| `/gitflow:finish` | ~15s | ~5s | **~65%** |
|
|
114
|
-
| `/gitflow:commit` | ~8s | ~4s | **~50%** |
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Principes Appliques
|
|
119
|
-
|
|
120
|
-
### 1. Collecte Avant Affichage
|
|
121
|
-
- Executer TOUTES les commandes git AVANT de generer l'output
|
|
122
|
-
- Utiliser des fichiers temporaires ou variables pour stocker
|
|
123
|
-
|
|
124
|
-
### 2. Parallelisation Aggressive
|
|
125
|
-
- Utiliser `&` et `wait` pour les commandes independantes
|
|
126
|
-
- Limiter le parallelisme avec `wait -n` si necessaire
|
|
127
|
-
|
|
128
|
-
### 3. Single-Pass Parsing
|
|
129
|
-
- Parser les donnees une seule fois
|
|
130
|
-
- Stocker en memoire pour reutilisation
|
|
131
|
-
|
|
132
|
-
### 4. Cache des Donnees Frequentes
|
|
133
|
-
- Config GitFlow (variable globale)
|
|
134
|
-
- Tags Git (valide pendant la session)
|
|
135
|
-
- Version (calculee une fois)
|
|
136
|
-
|
|
137
|
-
### 5. Questions Minimales
|
|
138
|
-
- Consolider les questions en 1-2 appels
|
|
139
|
-
- Utiliser les arguments directs quand possible
|
|
140
|
-
- Options dynamiques basees sur le contexte
|
|
141
|
-
|
|
142
|
-
### 6. Modeles Adaptes
|
|
143
|
-
- **haiku** pour les taches simples/predefinies
|
|
144
|
-
- **sonnet** uniquement pour le raisonnement complexe
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## Fichiers Modifies
|
|
149
|
-
|
|
150
|
-
```
|
|
151
|
-
templates/commands/gitflow/
|
|
152
|
-
_shared.md # NOUVEAU - Fonctions partagees
|
|
153
|
-
2-status.md # Parallelisation + mode fast
|
|
154
|
-
10-start.md # Consolidation questions
|
|
155
|
-
11-finish.md # Parallelisation scan + haiku
|
|
156
|
-
OPTIMIZATIONS.md # NOUVEAU - Cette documentation
|
|
157
|
-
|
|
158
|
-
templates/agents/gitflow/
|
|
159
|
-
finish.md # sonnet -> haiku
|
|
160
|
-
commit.md # sonnet -> haiku
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
## Compatibilite
|
|
166
|
-
|
|
167
|
-
**Aucun breaking change:**
|
|
168
|
-
- Les commandes gardent la meme interface
|
|
169
|
-
- Les options existantes fonctionnent
|
|
170
|
-
- Nouveaux modes (`--fast`) sont optionnels
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## Tests Recommandes
|
|
175
|
-
|
|
176
|
-
1. `/gitflow:status` - Verifier temps < 3s
|
|
177
|
-
2. `/gitflow:status --fast` - Verifier temps < 1s
|
|
178
|
-
3. `/gitflow:start feature test` - Verifier temps < 5s
|
|
179
|
-
4. `/gitflow:start` (interactif) - Verifier 1-2 questions max
|
|
180
|
-
5. `/gitflow:finish` - Verifier scan parallele
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## Metriques de Suivi
|
|
185
|
-
|
|
186
|
-
Pour mesurer les performances:
|
|
187
|
-
|
|
188
|
-
```bash
|
|
189
|
-
# Temps d'execution
|
|
190
|
-
time /gitflow:status
|
|
191
|
-
|
|
192
|
-
# Avec mode fast
|
|
193
|
-
time /gitflow:status --fast
|
|
194
|
-
|
|
195
|
-
# Creation directe
|
|
196
|
-
time /gitflow:start feature test-perf --no-worktree
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Ameliorations Futures Possibles
|
|
202
|
-
|
|
203
|
-
1. **Cache persistant** - Stocker tags/config entre sessions
|
|
204
|
-
2. **Pre-fetch** - Fetch en background au demarrage
|
|
205
|
-
3. **Incremental status** - Ne collecter que les changements
|
|
206
|
-
4. **Batch PR checks** - API GitHub/Azure en batch
|