specweave 1.0.60 → 1.0.62
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.md +142 -540
- package/dist/src/cli/commands/refresh-marketplace.d.ts +1 -1
- package/dist/src/cli/commands/refresh-marketplace.d.ts.map +1 -1
- package/dist/src/cli/commands/refresh-marketplace.js +1 -14
- package/dist/src/cli/commands/refresh-marketplace.js.map +1 -1
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<!-- SW:META template="claude" version="1.0.
|
|
1
|
+
<!-- SW:META template="claude" version="1.0.60" sections="header,start,autodetect,metarule,rules,workflow,context,lsp,structure,taskformat,secrets,syncing,mapping,testing,api,limits,troubleshooting,principles,linking,mcp,autoexecute,auto,docs" -->
|
|
2
2
|
|
|
3
|
-
<!-- SW:SECTION:header version="1.0.
|
|
3
|
+
<!-- SW:SECTION:header version="1.0.60" -->
|
|
4
4
|
**Framework**: SpecWeave | **Truth**: `spec.md` + `tasks.md`
|
|
5
5
|
<!-- SW:END:header -->
|
|
6
6
|
|
|
7
|
-
<!-- SW:SECTION:start version="1.0.
|
|
7
|
+
<!-- SW:SECTION:start version="1.0.60" -->
|
|
8
8
|
## Getting Started
|
|
9
9
|
|
|
10
10
|
**Initial increment**: `0001-project-setup` (auto-created by `specweave init`)
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
2. **Customize**: Edit spec.md and use for setup tasks
|
|
15
15
|
<!-- SW:END:start -->
|
|
16
16
|
|
|
17
|
-
<!-- SW:SECTION:autodetect version="1.0.
|
|
17
|
+
<!-- SW:SECTION:autodetect version="1.0.60" -->
|
|
18
18
|
## Auto-Detection
|
|
19
19
|
|
|
20
20
|
SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
@@ -24,7 +24,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
24
24
|
**Opt-out phrases**: "Just brainstorm first" | "Don't plan yet" | "Quick discussion" | "Let's explore ideas"
|
|
25
25
|
<!-- SW:END:autodetect -->
|
|
26
26
|
|
|
27
|
-
<!-- SW:SECTION:metarule version="1.0.
|
|
27
|
+
<!-- SW:SECTION:metarule version="1.0.60" -->
|
|
28
28
|
## Meta-Rule: Think-Before-Act
|
|
29
29
|
|
|
30
30
|
**Satisfy dependencies BEFORE dependent operations.**
|
|
@@ -35,7 +35,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
35
35
|
```
|
|
36
36
|
<!-- SW:END:metarule -->
|
|
37
37
|
|
|
38
|
-
<!-- SW:SECTION:rules version="1.0.
|
|
38
|
+
<!-- SW:SECTION:rules version="1.0.60" -->
|
|
39
39
|
## Rules
|
|
40
40
|
|
|
41
41
|
1. **Files** → `.specweave/increments/####-name/` (spec.md, plan.md, tasks.md at root; reports/, scripts/, logs/ subfolders)
|
|
@@ -45,7 +45,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
45
45
|
5. **Root clean**: NEVER create .md/reports/scripts in project root → use increment folders
|
|
46
46
|
<!-- SW:END:rules -->
|
|
47
47
|
|
|
48
|
-
<!-- SW:SECTION:workflow version="1.0.
|
|
48
|
+
<!-- SW:SECTION:workflow version="1.0.60" -->
|
|
49
49
|
## Workflow
|
|
50
50
|
|
|
51
51
|
`/sw:increment "X"` → `/sw:do` → `/sw:progress` → `/sw:done 0001`
|
|
@@ -65,7 +65,7 @@ SpecWeave auto-detects product descriptions and routes to `/sw:increment`:
|
|
|
65
65
|
**Natural language**: "Let's build X" → `/sw:increment` | "What's status?" → `/sw:progress` | "We're done" → `/sw:done` | "Ship while sleeping" → `/sw:auto`
|
|
66
66
|
<!-- SW:END:workflow -->
|
|
67
67
|
|
|
68
|
-
<!-- SW:SECTION:context version="1.0.
|
|
68
|
+
<!-- SW:SECTION:context version="1.0.60" -->
|
|
69
69
|
## Living Docs Context
|
|
70
70
|
|
|
71
71
|
**Before implementing features**: Check existing docs for patterns and decisions.
|
|
@@ -85,7 +85,7 @@ grep -ril "keyword" .specweave/docs/internal/
|
|
|
85
85
|
**Use `/sw:context <topic>`** to load relevant living docs into conversation.
|
|
86
86
|
<!-- SW:END:context -->
|
|
87
87
|
|
|
88
|
-
<!-- SW:SECTION:lsp version="1.0.
|
|
88
|
+
<!-- SW:SECTION:lsp version="1.0.60" -->
|
|
89
89
|
## LSP-Enhanced Exploration (DEFAULT - Claude Code 2.0.74+)
|
|
90
90
|
|
|
91
91
|
**LSP is ENABLED BY DEFAULT** for all SpecWeave operations - 100x faster than grep for symbol resolution.
|
|
@@ -150,7 +150,7 @@ rustup component add rust-analyzer
|
|
|
150
150
|
- Combine with Explore agent for comprehensive codebase understanding
|
|
151
151
|
<!-- SW:END:lsp -->
|
|
152
152
|
|
|
153
|
-
<!-- SW:SECTION:structure version="1.0.
|
|
153
|
+
<!-- SW:SECTION:structure version="1.0.60" -->
|
|
154
154
|
## Structure
|
|
155
155
|
|
|
156
156
|
```
|
|
@@ -206,7 +206,7 @@ The implementation path is ALWAYS: `repositories/my-api/` (NOT `my-api/` in root
|
|
|
206
206
|
**Path syntax**: `//path` = absolute | `/path` = relative to settings file | `**` = recursive | `additionalDirectories` = explicit working dirs
|
|
207
207
|
<!-- SW:END:structure -->
|
|
208
208
|
|
|
209
|
-
<!-- SW:SECTION:taskformat version="1.0.
|
|
209
|
+
<!-- SW:SECTION:taskformat version="1.0.60" -->
|
|
210
210
|
## Task Format
|
|
211
211
|
|
|
212
212
|
```markdown
|
|
@@ -216,7 +216,7 @@ The implementation path is ALWAYS: `repositories/my-api/` (NOT `my-api/` in root
|
|
|
216
216
|
```
|
|
217
217
|
<!-- SW:END:taskformat -->
|
|
218
218
|
|
|
219
|
-
<!-- SW:SECTION:secrets version="1.0.
|
|
219
|
+
<!-- SW:SECTION:secrets version="1.0.60" -->
|
|
220
220
|
## Secrets Check
|
|
221
221
|
|
|
222
222
|
**BEFORE CLI tools**: Check existing config first!
|
|
@@ -227,7 +227,7 @@ gh auth status
|
|
|
227
227
|
```
|
|
228
228
|
<!-- SW:END:secrets -->
|
|
229
229
|
|
|
230
|
-
<!-- SW:SECTION:syncing version="1.0.
|
|
230
|
+
<!-- SW:SECTION:syncing version="1.0.60" -->
|
|
231
231
|
## External Sync (GitHub/JIRA/ADO)
|
|
232
232
|
|
|
233
233
|
**After increment creation**: Run `/sw-github:sync {id}` to create issues!
|
|
@@ -255,7 +255,7 @@ Living docs sync ≠ External sync. They are separate:
|
|
|
255
255
|
**Verify tokens**: `grep GITHUB_TOKEN .env` | `gh auth status`
|
|
256
256
|
<!-- SW:END:syncing -->
|
|
257
257
|
|
|
258
|
-
<!-- SW:SECTION:mapping version="1.0.
|
|
258
|
+
<!-- SW:SECTION:mapping version="1.0.60" -->
|
|
259
259
|
## GitHub Mapping
|
|
260
260
|
|
|
261
261
|
| SpecWeave | GitHub |
|
|
@@ -265,7 +265,7 @@ Living docs sync ≠ External sync. They are separate:
|
|
|
265
265
|
| Task T-XXX | Checkbox |
|
|
266
266
|
<!-- SW:END:mapping -->
|
|
267
267
|
|
|
268
|
-
<!-- SW:SECTION:testing version="1.0.
|
|
268
|
+
<!-- SW:SECTION:testing version="1.0.60" -->
|
|
269
269
|
## Testing
|
|
270
270
|
|
|
271
271
|
BDD in tasks.md | Unit >80% | `.test.ts` (Vitest)
|
|
@@ -277,7 +277,7 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
277
277
|
```
|
|
278
278
|
<!-- SW:END:testing -->
|
|
279
279
|
|
|
280
|
-
<!-- SW:SECTION:api version="1.0.
|
|
280
|
+
<!-- SW:SECTION:api version="1.0.60" -->
|
|
281
281
|
## API Development (OpenAPI-First)
|
|
282
282
|
|
|
283
283
|
**For API projects only.** Skip this section if your project has no REST/GraphQL endpoints.
|
|
@@ -314,21 +314,21 @@ vi.mock('fs', () => ({ readFile: vi.fn() }));
|
|
|
314
314
|
|-----------|-----------------|-------|
|
|
315
315
|
| **NestJS** | `@nestjs/swagger` | Decorators auto-generate OpenAPI |
|
|
316
316
|
| **FastAPI** | Built-in | Auto-generates at `/openapi.json` |
|
|
317
|
-
| **Express** | `swagger-jsdoc` | JSDoc comments
|
|
317
|
+
| **Express** | `swagger-jsdoc` | JSDoc comments → OpenAPI |
|
|
318
318
|
| **Spring Boot** | `springdoc-openapi` | Annotations auto-generate |
|
|
319
|
-
| **Go/Gin** | `swag` | Comments
|
|
319
|
+
| **Go/Gin** | `swag` | Comments → OpenAPI |
|
|
320
320
|
|
|
321
321
|
### Workflow
|
|
322
322
|
|
|
323
323
|
```
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
openapi.yaml (SOURCE OF TRUTH - version controlled)
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
324
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
325
|
+
│ Code (decorators/annotations) │
|
|
326
|
+
│ ↓ (auto-generated or manual) │
|
|
327
|
+
│ openapi.yaml (SOURCE OF TRUTH - version controlled) │
|
|
328
|
+
│ ↓ (derived on /sw:done or /sw:api-docs) │
|
|
329
|
+
│ ├── postman-collection.json (requests with {{baseUrl}}) │
|
|
330
|
+
│ └── postman-environment.json (variables from .env) │
|
|
331
|
+
└─────────────────────────────────────────────────────────────┘
|
|
332
332
|
```
|
|
333
333
|
|
|
334
334
|
### Commands
|
|
@@ -350,7 +350,7 @@ openapi.yaml (SOURCE OF TRUTH - version controlled)
|
|
|
350
350
|
/sw:api-docs --validate
|
|
351
351
|
|
|
352
352
|
# Generate on increment close (automatic if enabled)
|
|
353
|
-
/sw:done 0001 #
|
|
353
|
+
/sw:done 0001 # → triggers API doc generation
|
|
354
354
|
```
|
|
355
355
|
|
|
356
356
|
### Postman Import
|
|
@@ -370,13 +370,13 @@ After generation:
|
|
|
370
370
|
| `manual` | Only via `/sw:api-docs` command |
|
|
371
371
|
<!-- SW:END:api -->
|
|
372
372
|
|
|
373
|
-
<!-- SW:SECTION:limits version="1.0.
|
|
373
|
+
<!-- SW:SECTION:limits version="1.0.60" -->
|
|
374
374
|
## Limits
|
|
375
375
|
|
|
376
376
|
**Max 1500 lines/file** — extract before adding
|
|
377
377
|
<!-- SW:END:limits -->
|
|
378
378
|
|
|
379
|
-
<!-- SW:SECTION:troubleshooting version="1.0.
|
|
379
|
+
<!-- SW:SECTION:troubleshooting version="1.0.60" -->
|
|
380
380
|
## Troubleshooting
|
|
381
381
|
|
|
382
382
|
| Issue | Fix |
|
|
@@ -395,7 +395,7 @@ After generation:
|
|
|
395
395
|
| Path patterns not working | `//path` = absolute, `/path` = relative to settings file, `additionalDirectories` for explicit working dirs |
|
|
396
396
|
<!-- SW:END:troubleshooting -->
|
|
397
397
|
|
|
398
|
-
<!-- SW:SECTION:principles version="1.0.
|
|
398
|
+
<!-- SW:SECTION:principles version="1.0.60" -->
|
|
399
399
|
## Principles
|
|
400
400
|
|
|
401
401
|
1. **Spec-first**: `/sw:increment` before coding
|
|
@@ -405,7 +405,7 @@ After generation:
|
|
|
405
405
|
5. **Clean**: All files in increment folders
|
|
406
406
|
<!-- SW:END:principles -->
|
|
407
407
|
|
|
408
|
-
<!-- SW:SECTION:linking version="1.0.
|
|
408
|
+
<!-- SW:SECTION:linking version="1.0.60" -->
|
|
409
409
|
## Bidirectional Linking
|
|
410
410
|
|
|
411
411
|
Tasks ↔ User Stories auto-linked via AC-IDs: `AC-US1-01` → `US-001`
|
|
@@ -413,366 +413,93 @@ Tasks ↔ User Stories auto-linked via AC-IDs: `AC-US1-01` → `US-001`
|
|
|
413
413
|
Task format: `**AC**: AC-US1-01, AC-US1-02` (CRITICAL for linking)
|
|
414
414
|
<!-- SW:END:linking -->
|
|
415
415
|
|
|
416
|
-
<!-- SW:SECTION:mcp version="1.0.
|
|
417
|
-
## External Service Connection (
|
|
416
|
+
<!-- SW:SECTION:mcp version="1.0.60" -->
|
|
417
|
+
## External Service Connection (MCP + Smart Fallbacks)
|
|
418
418
|
|
|
419
|
-
**Core principle:
|
|
419
|
+
**Core principle: Never fight connection issues. Use the path of least resistance.**
|
|
420
420
|
|
|
421
|
-
### Connection Priority
|
|
421
|
+
### Connection Priority (ALWAYS follow this order)
|
|
422
422
|
|
|
423
423
|
```
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
```
|
|
428
|
-
|
|
429
|
-
**Why CLI-first?** LLMs can invoke CLIs directly, parse output, handle errors, and chain commands efficiently.
|
|
430
|
-
|
|
431
|
-
### Pre-Flight Check (MANDATORY)
|
|
432
|
-
|
|
433
|
-
**Run this BEFORE any external service operation:**
|
|
434
|
-
|
|
435
|
-
```bash
|
|
436
|
-
# Check all CLI auth at once
|
|
437
|
-
supabase projects list 2>/dev/null && echo "✓ Supabase"
|
|
438
|
-
wrangler whoami 2>/dev/null && echo "✓ Cloudflare"
|
|
439
|
-
gh auth status 2>/dev/null && echo "✓ GitHub"
|
|
440
|
-
vercel whoami 2>/dev/null && echo "✓ Vercel"
|
|
441
|
-
aws sts get-caller-identity 2>/dev/null && echo "✓ AWS"
|
|
442
|
-
|
|
443
|
-
# Check .env for API keys
|
|
444
|
-
grep -E "(SUPABASE_|GITHUB_TOKEN|CF_|VERCEL_|AWS_)" .env 2>/dev/null
|
|
424
|
+
MCP Server → REST API → SDK/Client → CLI → Direct Connection
|
|
425
|
+
↑ ↓
|
|
426
|
+
BEST WORST
|
|
445
427
|
```
|
|
446
428
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
### Supabase
|
|
429
|
+
### Service Connection Matrix
|
|
450
430
|
|
|
451
|
-
|
|
431
|
+
| Service | BEST Method | Fallback | AVOID |
|
|
432
|
+
|---------|-------------|----------|-------|
|
|
433
|
+
| **Supabase** | MCP Server | REST API / JS Client | Direct `psql` (IPv6 issues) |
|
|
434
|
+
| **Cloudflare** | `wrangler` + OAuth | REST API | Manual curl |
|
|
435
|
+
| **PostgreSQL** | MCP / Pooler (6543) | `psql` with pooler | Direct port 5432 |
|
|
436
|
+
| **MongoDB** | Atlas Data API | MCP / Driver | Direct connection |
|
|
437
|
+
| **Redis** | Upstash REST | MCP | `redis-cli` (TCP issues) |
|
|
438
|
+
| **AWS** | CLI with SSO | SDK | Hardcoded keys |
|
|
439
|
+
| **Vercel** | CLI with OAuth | REST API | Manual deploys |
|
|
452
440
|
|
|
453
|
-
|
|
454
|
-
|------------|---------------|--------|
|
|
455
|
-
| **Project Ref** | Dashboard → Settings → General → "Reference ID" | `abcdefghijkl` (12 chars) |
|
|
456
|
-
| **Access Token** | Dashboard → Account (top-right) → Access Tokens → Generate | `sbp_xxxxxxxxxxxxxxxx` |
|
|
457
|
-
| **Org ID** (optional) | Dashboard → Org Settings → General | `org-xxxxx` |
|
|
458
|
-
| **Database Password** | Dashboard → Settings → Database → Connection string | In the URI |
|
|
459
|
-
| **API URL** | Dashboard → Settings → API → "Project URL" | `https://xxx.supabase.co` |
|
|
460
|
-
| **Anon Key** | Dashboard → Settings → API → "anon public" | `eyJhbGc...` (JWT) |
|
|
461
|
-
| **Service Role Key** | Dashboard → Settings → API → "service_role" (secret!) | `eyJhbGc...` (JWT) |
|
|
441
|
+
### Quick Setup Commands
|
|
462
442
|
|
|
463
|
-
**CLI Setup (PREFERRED):**
|
|
464
443
|
```bash
|
|
465
|
-
#
|
|
466
|
-
supabase
|
|
444
|
+
# MCP Servers (one-time, restart Claude Code after)
|
|
445
|
+
npx @anthropic-ai/claude-code-mcp add supabase
|
|
446
|
+
npx @anthropic-ai/claude-code-mcp add postgres
|
|
467
447
|
|
|
468
|
-
#
|
|
469
|
-
|
|
470
|
-
#
|
|
448
|
+
# CLI Auth (persistent OAuth sessions)
|
|
449
|
+
wrangler login # Cloudflare
|
|
450
|
+
vercel login # Vercel
|
|
451
|
+
aws configure sso # AWS
|
|
452
|
+
supabase login # Supabase CLI
|
|
471
453
|
|
|
472
|
-
#
|
|
473
|
-
|
|
454
|
+
# Verify auth status
|
|
455
|
+
wrangler whoami && vercel whoami && aws sts get-caller-identity
|
|
474
456
|
```
|
|
475
457
|
|
|
476
|
-
|
|
477
|
-
```bash
|
|
478
|
-
supabase db push # Apply migrations
|
|
479
|
-
supabase db pull # Pull remote schema
|
|
480
|
-
supabase db reset # Reset to migrations
|
|
481
|
-
supabase functions deploy <name> # Deploy edge function
|
|
482
|
-
supabase secrets set KEY=value # Set secrets
|
|
483
|
-
supabase gen types typescript # Generate types
|
|
484
|
-
supabase migration new <name> # Create migration
|
|
485
|
-
```
|
|
458
|
+
### Supabase (Most Common Issues)
|
|
486
459
|
|
|
487
|
-
**If CLI has network issues, use Access Token:**
|
|
488
460
|
```bash
|
|
489
|
-
|
|
490
|
-
|
|
461
|
+
# ❌ DON'T: Direct psql or supabase db push (IPv6 fails)
|
|
462
|
+
supabase db push # Often fails with connection errors
|
|
491
463
|
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
SUPABASE_URL
|
|
495
|
-
SUPABASE_ANON_KEY
|
|
496
|
-
SUPABASE_SERVICE_ROLE_KEY=eyJhbGc... # For admin operations
|
|
497
|
-
```
|
|
464
|
+
# ✅ DO: Use REST API or MCP
|
|
465
|
+
# REST API works everywhere - no network issues
|
|
466
|
+
curl "${SUPABASE_URL}/rest/v1/table" \
|
|
467
|
+
-H "apikey: ${SUPABASE_ANON_KEY}"
|
|
498
468
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
DATABASE_URL="postgresql://postgres.
|
|
469
|
+
# For migrations: Use Supabase Dashboard SQL Editor
|
|
470
|
+
# OR use connection pooler (port 6543, NOT 5432)
|
|
471
|
+
DATABASE_URL="postgresql://postgres.[ref]:[pass]@aws-0-region.pooler.supabase.com:6543/postgres"
|
|
502
472
|
```
|
|
503
473
|
|
|
504
|
-
|
|
474
|
+
### Cloudflare Workers
|
|
505
475
|
|
|
506
|
-
### Cloudflare (Wrangler)
|
|
507
|
-
|
|
508
|
-
**Credentials needed:**
|
|
509
|
-
|
|
510
|
-
| Credential | Where to find | Format |
|
|
511
|
-
|------------|---------------|--------|
|
|
512
|
-
| **Account ID** | Dashboard → any domain → Overview → right sidebar | `32-char hex` |
|
|
513
|
-
| **API Token** | Dashboard → My Profile → API Tokens → Create | `xxxxx` (40+ chars) |
|
|
514
|
-
| **Zone ID** (per domain) | Dashboard → domain → Overview → right sidebar | `32-char hex` |
|
|
515
|
-
|
|
516
|
-
**CLI Setup (PREFERRED - uses OAuth):**
|
|
517
476
|
```bash
|
|
518
|
-
#
|
|
477
|
+
# One-time login (saves OAuth session)
|
|
519
478
|
wrangler login
|
|
520
479
|
|
|
521
|
-
#
|
|
522
|
-
wrangler
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
```bash
|
|
527
|
-
wrangler deploy # Deploy worker
|
|
528
|
-
wrangler dev # Local dev server
|
|
529
|
-
wrangler kv namespace list # List KV namespaces
|
|
530
|
-
wrangler kv key put --binding=KV k "v" # KV write
|
|
531
|
-
wrangler d1 list # List D1 databases
|
|
532
|
-
wrangler d1 execute DB --command "SQL" # D1 query
|
|
533
|
-
wrangler r2 bucket list # List R2 buckets
|
|
534
|
-
echo "secret" | wrangler secret put NAME # Set secret (non-interactive)
|
|
535
|
-
wrangler tail # Live logs
|
|
536
|
-
wrangler pages deploy ./dist # Deploy Pages
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
**API Token Fallback (.env):**
|
|
540
|
-
```bash
|
|
541
|
-
CLOUDFLARE_API_TOKEN=xxxxx
|
|
542
|
-
CLOUDFLARE_ACCOUNT_ID=xxxxx
|
|
543
|
-
# Per-domain operations:
|
|
544
|
-
CLOUDFLARE_ZONE_ID=xxxxx
|
|
480
|
+
# All operations then work:
|
|
481
|
+
wrangler deploy # Deploy worker
|
|
482
|
+
echo "value" | wrangler secret put KEY # Set secret
|
|
483
|
+
wrangler kv:key put --binding=KV k v # KV operations
|
|
484
|
+
wrangler d1 execute DB --command "SQL" # D1 database
|
|
545
485
|
```
|
|
546
486
|
|
|
547
|
-
|
|
548
|
-
```toml
|
|
549
|
-
name = "my-worker"
|
|
550
|
-
main = "src/index.ts"
|
|
551
|
-
compatibility_date = "2024-01-01"
|
|
552
|
-
account_id = "YOUR_ACCOUNT_ID" # Optional if logged in
|
|
553
|
-
|
|
554
|
-
[[kv_namespaces]]
|
|
555
|
-
binding = "KV"
|
|
556
|
-
id = "xxxxx"
|
|
557
|
-
|
|
558
|
-
[[d1_databases]]
|
|
559
|
-
binding = "DB"
|
|
560
|
-
database_name = "my-db"
|
|
561
|
-
database_id = "xxxxx"
|
|
562
|
-
```
|
|
487
|
+
### Auto-Detection (Run Before External Ops)
|
|
563
488
|
|
|
564
|
-
---
|
|
565
|
-
|
|
566
|
-
### GitHub (gh CLI)
|
|
567
|
-
|
|
568
|
-
**Credentials needed:**
|
|
569
|
-
|
|
570
|
-
| Credential | Where to find | Format |
|
|
571
|
-
|------------|---------------|--------|
|
|
572
|
-
| **Personal Access Token** | Settings → Developer settings → Personal access tokens → Fine-grained | `github_pat_xxx` |
|
|
573
|
-
| **Classic Token** | Same location, "Tokens (classic)" | `ghp_xxxxx` |
|
|
574
|
-
|
|
575
|
-
**CLI Setup (PREFERRED):**
|
|
576
489
|
```bash
|
|
577
|
-
#
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
gh auth login --with-token < token.txt
|
|
582
|
-
# Or: export GITHUB_TOKEN=ghp_xxx && gh auth status
|
|
583
|
-
|
|
584
|
-
# Verify
|
|
585
|
-
gh auth status
|
|
490
|
+
# Check configured services
|
|
491
|
+
grep -E "SUPABASE_|DATABASE_URL|MONGODB|UPSTASH|CF_API" .env 2>/dev/null
|
|
492
|
+
wrangler whoami 2>/dev/null
|
|
493
|
+
aws sts get-caller-identity 2>/dev/null
|
|
586
494
|
```
|
|
587
495
|
|
|
588
|
-
**
|
|
589
|
-
```bash
|
|
590
|
-
gh repo clone owner/repo # Clone
|
|
591
|
-
gh issue list # List issues
|
|
592
|
-
gh issue create --title "X" --body "Y" # Create issue
|
|
593
|
-
gh pr create --fill # Create PR
|
|
594
|
-
gh pr merge --auto --squash # Auto-merge
|
|
595
|
-
gh workflow list # List workflows
|
|
596
|
-
gh workflow run deploy.yml # Trigger workflow
|
|
597
|
-
gh api repos/{owner}/{repo}/issues # Raw API call
|
|
598
|
-
gh release create v1.0.0 # Create release
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
**Token Fallback (.env):**
|
|
602
|
-
```bash
|
|
603
|
-
GITHUB_TOKEN=ghp_xxxxx
|
|
604
|
-
# Or for GitHub Apps:
|
|
605
|
-
GITHUB_APP_ID=xxxxx
|
|
606
|
-
GITHUB_PRIVATE_KEY="-----BEGIN RSA..."
|
|
607
|
-
```
|
|
608
|
-
|
|
609
|
-
---
|
|
610
|
-
|
|
611
|
-
### Vercel
|
|
612
|
-
|
|
613
|
-
**Credentials needed:**
|
|
614
|
-
|
|
615
|
-
| Credential | Where to find | Format |
|
|
616
|
-
|------------|---------------|--------|
|
|
617
|
-
| **Token** | Settings → Tokens → Create | `xxxxx` |
|
|
618
|
-
| **Org ID** | Settings → General → "Vercel ID" | `team_xxxxx` |
|
|
619
|
-
| **Project ID** | Project → Settings → General | `prj_xxxxx` |
|
|
620
|
-
|
|
621
|
-
**CLI Setup (PREFERRED):**
|
|
622
|
-
```bash
|
|
623
|
-
# Login via browser
|
|
624
|
-
vercel login
|
|
625
|
-
|
|
626
|
-
# Or with token
|
|
627
|
-
vercel login --token xxxxx
|
|
628
|
-
|
|
629
|
-
# Verify
|
|
630
|
-
vercel whoami
|
|
631
|
-
```
|
|
632
|
-
|
|
633
|
-
**CLI Operations:**
|
|
634
|
-
```bash
|
|
635
|
-
vercel # Deploy (interactive)
|
|
636
|
-
vercel --prod # Production deploy
|
|
637
|
-
vercel env pull .env.local # Pull env vars
|
|
638
|
-
vercel env add SECRET production # Add env var
|
|
639
|
-
vercel logs # View logs
|
|
640
|
-
vercel domains ls # List domains
|
|
641
|
-
vercel link # Link to project
|
|
642
|
-
```
|
|
643
|
-
|
|
644
|
-
**Token Fallback (.env):**
|
|
645
|
-
```bash
|
|
646
|
-
VERCEL_TOKEN=xxxxx
|
|
647
|
-
VERCEL_ORG_ID=team_xxxxx
|
|
648
|
-
VERCEL_PROJECT_ID=prj_xxxxx
|
|
649
|
-
```
|
|
650
|
-
|
|
651
|
-
---
|
|
652
|
-
|
|
653
|
-
### AWS
|
|
654
|
-
|
|
655
|
-
**Credentials needed:**
|
|
656
|
-
|
|
657
|
-
| Credential | Where to find | Format |
|
|
658
|
-
|------------|---------------|--------|
|
|
659
|
-
| **Access Key ID** | IAM → Users → Security credentials → Create access key | `AKIA...` (20 chars) |
|
|
660
|
-
| **Secret Access Key** | Same (shown once at creation) | `xxxxx` (40 chars) |
|
|
661
|
-
| **Region** | Choose based on location | `us-east-1`, `eu-west-1`, etc. |
|
|
662
|
-
| **SSO Start URL** | AWS SSO config (if using SSO) | `https://xxx.awsapps.com/start` |
|
|
663
|
-
|
|
664
|
-
**CLI Setup:**
|
|
665
|
-
```bash
|
|
666
|
-
# Option 1: Configure with keys
|
|
667
|
-
aws configure
|
|
668
|
-
# Prompts for: Access Key, Secret Key, Region, Output format
|
|
669
|
-
|
|
670
|
-
# Option 2: SSO (recommended for orgs)
|
|
671
|
-
aws configure sso
|
|
672
|
-
# Prompts for: SSO start URL, SSO region, account, role
|
|
673
|
-
|
|
674
|
-
# Login (SSO)
|
|
675
|
-
aws sso login --profile your-profile
|
|
676
|
-
|
|
677
|
-
# Verify
|
|
678
|
-
aws sts get-caller-identity
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
**CLI Operations:**
|
|
682
|
-
```bash
|
|
683
|
-
aws s3 ls # List buckets
|
|
684
|
-
aws s3 cp file.txt s3://bucket/ # Upload
|
|
685
|
-
aws lambda list-functions # List Lambdas
|
|
686
|
-
aws lambda invoke --function-name X out # Invoke Lambda
|
|
687
|
-
aws logs tail /aws/lambda/X --follow # Tail logs
|
|
688
|
-
aws secretsmanager get-secret-value --secret-id X # Get secret
|
|
689
|
-
aws ecr get-login-password | docker login # ECR login
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
**Credentials Fallback (.env):**
|
|
693
|
-
```bash
|
|
694
|
-
AWS_ACCESS_KEY_ID=AKIA...
|
|
695
|
-
AWS_SECRET_ACCESS_KEY=xxxxx
|
|
696
|
-
AWS_REGION=us-east-1
|
|
697
|
-
# Or for assumed roles:
|
|
698
|
-
AWS_ROLE_ARN=arn:aws:iam::xxx:role/xxx
|
|
699
|
-
```
|
|
700
|
-
|
|
701
|
-
---
|
|
702
|
-
|
|
703
|
-
### MongoDB Atlas
|
|
704
|
-
|
|
705
|
-
**Credentials needed:**
|
|
706
|
-
|
|
707
|
-
| Credential | Where to find | Format |
|
|
708
|
-
|------------|---------------|--------|
|
|
709
|
-
| **Connection String** | Cluster → Connect → Drivers | `mongodb+srv://user:pass@cluster.xxx.mongodb.net/` |
|
|
710
|
-
| **Data API Key** | Data API → Create API Key | `xxxxx` |
|
|
711
|
-
| **App ID** | Data API → App ID | `data-xxxxx` |
|
|
712
|
-
|
|
713
|
-
**Data API (.env):**
|
|
714
|
-
```bash
|
|
715
|
-
MONGODB_DATA_API_KEY=xxxxx
|
|
716
|
-
MONGODB_APP_ID=data-xxxxx
|
|
717
|
-
MONGODB_CLUSTER=Cluster0
|
|
718
|
-
MONGODB_DATABASE=mydb
|
|
719
|
-
```
|
|
720
|
-
|
|
721
|
-
---
|
|
722
|
-
|
|
723
|
-
### Upstash Redis
|
|
724
|
-
|
|
725
|
-
**Credentials needed:**
|
|
726
|
-
|
|
727
|
-
| Credential | Where to find | Format |
|
|
728
|
-
|------------|---------------|--------|
|
|
729
|
-
| **REST URL** | Database → REST API → UPSTASH_REDIS_REST_URL | `https://xxx.upstash.io` |
|
|
730
|
-
| **REST Token** | Same section → UPSTASH_REDIS_REST_TOKEN | `AXxx...` |
|
|
731
|
-
|
|
732
|
-
**REST API (.env):**
|
|
733
|
-
```bash
|
|
734
|
-
UPSTASH_REDIS_REST_URL=https://xxx.upstash.io
|
|
735
|
-
UPSTASH_REDIS_REST_TOKEN=AXxx...
|
|
736
|
-
```
|
|
737
|
-
|
|
738
|
-
---
|
|
739
|
-
|
|
740
|
-
### When to Use MCP
|
|
741
|
-
|
|
742
|
-
Use MCP servers when CLI is unavailable or you need structured responses:
|
|
743
|
-
|
|
744
|
-
```bash
|
|
745
|
-
npx @anthropic-ai/claude-code-mcp add supabase
|
|
746
|
-
npx @anthropic-ai/claude-code-mcp add postgres
|
|
747
|
-
# Restart Claude Code after adding
|
|
748
|
-
```
|
|
749
|
-
|
|
750
|
-
---
|
|
751
|
-
|
|
752
|
-
### Smart Credential Request Template
|
|
753
|
-
|
|
754
|
-
**When credentials are missing, ask specifically:**
|
|
755
|
-
|
|
756
|
-
```markdown
|
|
757
|
-
🔐 **[Service] Setup Needed**
|
|
758
|
-
|
|
759
|
-
I need to connect to your [Service]. Please provide:
|
|
760
|
-
|
|
761
|
-
| What I need | Where to find it |
|
|
762
|
-
|-------------|------------------|
|
|
763
|
-
| **[Credential 1]** | [Exact path in dashboard] |
|
|
764
|
-
| **[Credential 2]** | [Exact path in dashboard] |
|
|
765
|
-
|
|
766
|
-
**Or run:** `[cli login command]`
|
|
767
|
-
|
|
768
|
-
[I'll configure and execute automatically]
|
|
769
|
-
```
|
|
496
|
+
**Full reference**: See `/sw:service-connect` skill for complete patterns.
|
|
770
497
|
<!-- SW:END:mcp -->
|
|
771
498
|
|
|
772
499
|
<!-- SW:SECTION:autoexecute version="1.0.60" -->
|
|
773
500
|
## Auto-Execute Rule (CRITICAL)
|
|
774
501
|
|
|
775
|
-
**NEVER output "Manual Step Required" or "Next Steps" when
|
|
502
|
+
**NEVER output "Manual Step Required" or "Next Steps" when credentials are available.**
|
|
776
503
|
|
|
777
504
|
### The Golden Rule
|
|
778
505
|
|
|
@@ -780,97 +507,68 @@ I need to connect to your [Service]. Please provide:
|
|
|
780
507
|
❌ FORBIDDEN: "Manual Step Required: Open Supabase SQL Editor..."
|
|
781
508
|
❌ FORBIDDEN: "Next Steps: 1. Run wrangler deploy..."
|
|
782
509
|
❌ FORBIDDEN: "Execute this SQL in your database console..."
|
|
783
|
-
❌ FORBIDDEN: "Please run this command manually..."
|
|
784
510
|
|
|
785
|
-
✅ REQUIRED:
|
|
786
|
-
✅ REQUIRED: Ask for specific credentials if missing, then execute
|
|
511
|
+
✅ REQUIRED: Execute commands directly using available credentials
|
|
787
512
|
```
|
|
788
513
|
|
|
789
514
|
### Decision Tree
|
|
790
515
|
|
|
791
516
|
```
|
|
792
|
-
|
|
517
|
+
Credentials in .env? ──YES──→ EXECUTE IMMEDIATELY
|
|
793
518
|
│
|
|
794
519
|
NO
|
|
795
520
|
│
|
|
796
521
|
▼
|
|
797
|
-
|
|
798
|
-
│
|
|
799
|
-
NO
|
|
800
|
-
│
|
|
801
|
-
▼
|
|
802
|
-
ASK for SPECIFIC credentials needed
|
|
522
|
+
ASK for credentials (don't show manual steps!)
|
|
803
523
|
│
|
|
804
524
|
▼
|
|
805
|
-
|
|
525
|
+
Save to .env → EXECUTE IMMEDIATELY → Continue
|
|
806
526
|
```
|
|
807
527
|
|
|
808
|
-
###
|
|
528
|
+
### Credential Lookup (MANDATORY before any external operation)
|
|
809
529
|
|
|
810
530
|
```bash
|
|
811
|
-
# Check
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
531
|
+
# 1. Check .env
|
|
532
|
+
grep -E "(SUPABASE_|DATABASE_URL|CF_API_|GITHUB_TOKEN)" .env 2>/dev/null
|
|
533
|
+
|
|
534
|
+
# 2. Check CLI auth
|
|
535
|
+
supabase status 2>/dev/null # Supabase
|
|
536
|
+
wrangler whoami 2>/dev/null # Cloudflare
|
|
537
|
+
gh auth status 2>/dev/null # GitHub
|
|
538
|
+
aws sts get-caller-identity 2>/dev/null # AWS
|
|
818
539
|
|
|
819
|
-
#
|
|
820
|
-
|
|
540
|
+
# 3. Use MCP server if available
|
|
541
|
+
# MCP servers provide direct API access
|
|
821
542
|
```
|
|
822
543
|
|
|
823
544
|
### Auto-Execute Examples
|
|
824
545
|
|
|
825
546
|
```bash
|
|
826
|
-
# Supabase
|
|
827
|
-
if
|
|
828
|
-
|
|
829
|
-
else
|
|
830
|
-
# Fallback to REST API with tokens
|
|
831
|
-
curl "${SUPABASE_URL}/rest/v1/..." -H "apikey: ${SUPABASE_ANON_KEY}"
|
|
547
|
+
# Supabase SQL execution
|
|
548
|
+
if [ -n "$DATABASE_URL" ]; then
|
|
549
|
+
psql "$DATABASE_URL" -f schema.sql # ✅ Execute directly
|
|
832
550
|
fi
|
|
833
551
|
|
|
834
|
-
#
|
|
552
|
+
# Wrangler secrets
|
|
835
553
|
if wrangler whoami 2>/dev/null; then
|
|
836
|
-
wrangler
|
|
837
|
-
|
|
838
|
-
wrangler d1 execute DB --command "SQL" # ✅ Database
|
|
839
|
-
fi
|
|
840
|
-
|
|
841
|
-
# GitHub - gh CLI is extremely capable
|
|
842
|
-
if gh auth status 2>/dev/null; then
|
|
843
|
-
gh issue create --title "..." --body "..."
|
|
844
|
-
gh pr create --fill
|
|
845
|
-
gh api repos/{owner}/{repo}/actions/workflows
|
|
554
|
+
echo "$SECRET" | wrangler secret put MY_SECRET # ✅ Execute directly
|
|
555
|
+
wrangler deploy # ✅ Deploy directly
|
|
846
556
|
fi
|
|
847
557
|
```
|
|
848
558
|
|
|
849
|
-
### If Credentials Missing → ASK
|
|
850
|
-
|
|
851
|
-
**Don't ask vaguely. Ask for EXACTLY what you need:**
|
|
559
|
+
### If Credentials Missing → ASK, Don't Show Manual Steps
|
|
852
560
|
|
|
853
561
|
```markdown
|
|
854
|
-
🔐 **
|
|
855
|
-
|
|
856
|
-
To push migrations, I need your Supabase project linked. Either:
|
|
857
|
-
|
|
858
|
-
**Option A** (Recommended): Run these commands:
|
|
859
|
-
\`\`\`bash
|
|
860
|
-
supabase login
|
|
861
|
-
supabase link --project-ref YOUR_PROJECT_REF
|
|
862
|
-
\`\`\`
|
|
863
|
-
Your project ref is at: Dashboard → Settings → General
|
|
562
|
+
🔐 **Credential Required**
|
|
864
563
|
|
|
865
|
-
|
|
866
|
-
- SUPABASE_URL: `____________`
|
|
867
|
-
- SUPABASE_SERVICE_ROLE_KEY: `____________`
|
|
564
|
+
I need your DATABASE_URL to execute the migration.
|
|
868
565
|
|
|
869
|
-
|
|
566
|
+
**Paste your connection string:**
|
|
567
|
+
[I will save to .env and execute automatically]
|
|
870
568
|
```
|
|
871
569
|
<!-- SW:END:autoexecute -->
|
|
872
570
|
|
|
873
|
-
<!-- SW:SECTION:auto version="1.0.
|
|
571
|
+
<!-- SW:SECTION:auto version="1.0.60" -->
|
|
874
572
|
## Auto Mode (Autonomous Execution)
|
|
875
573
|
|
|
876
574
|
**Auto mode enables continuous autonomous execution** until all tasks are complete.
|
|
@@ -884,11 +582,10 @@ Which would you prefer?
|
|
|
884
582
|
- Click buttons in UIs
|
|
885
583
|
|
|
886
584
|
**If you need external access:**
|
|
887
|
-
1. Check
|
|
888
|
-
2. Use
|
|
889
|
-
3.
|
|
890
|
-
4.
|
|
891
|
-
5. If credentials missing → ASK for them, save to `.env`, then EXECUTE
|
|
585
|
+
1. Check for credentials in `.env`
|
|
586
|
+
2. Use CLI tools (`supabase`, `wrangler`, `gh`, `aws`)
|
|
587
|
+
3. Use MCP servers for direct API access
|
|
588
|
+
4. If credentials missing → ASK for them, save to `.env`, then EXECUTE
|
|
892
589
|
|
|
893
590
|
### 🧪 Test Execution Loop (MANDATORY)
|
|
894
591
|
|
|
@@ -1007,152 +704,57 @@ test.use({ storageState: 'playwright/.auth/user.json' });
|
|
|
1007
704
|
|
|
1008
705
|
### 🔐 E2E Authentication (CRITICAL - Avoid Flaky Tests!)
|
|
1009
706
|
|
|
1010
|
-
**Auth is the #1 cause of flaky E2E tests. Be ULTRASMART
|
|
707
|
+
**Auth is the #1 cause of flaky E2E tests. Be ULTRASMART:**
|
|
1011
708
|
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
│ - Login ONCE in global setup │
|
|
1018
|
-
│ - Reuse session across all tests │
|
|
1019
|
-
│ - 10x faster, zero flakiness │
|
|
1020
|
-
│ │
|
|
1021
|
-
│ 2. GOOD: API-based auth (bypass UI) │
|
|
1022
|
-
│ - Call auth API directly │
|
|
1023
|
-
│ - Set cookies/tokens programmatically │
|
|
1024
|
-
│ - Faster than UI login │
|
|
1025
|
-
│ │
|
|
1026
|
-
│ 3. AVOID: UI login per test │
|
|
1027
|
-
│ - Slow (3-5s per test) │
|
|
1028
|
-
│ - Flaky (timing, captcha, rate limits) │
|
|
1029
|
-
│ - Only for testing login flow itself │
|
|
1030
|
-
└─────────────────────────────────────────────────────────────┘
|
|
1031
|
-
```
|
|
709
|
+
| Strategy | Speed | Reliability | Use When |
|
|
710
|
+
|----------|-------|-------------|----------|
|
|
711
|
+
| **storageState** | ⚡⚡⚡ | ⭐⭐⭐ | Default - login ONCE, reuse |
|
|
712
|
+
| **API auth** | ⚡⚡ | ⭐⭐⭐ | When UI is unstable |
|
|
713
|
+
| **UI login per test** | ⚡ | ⭐ | Only testing login flow |
|
|
1032
714
|
|
|
1033
|
-
**Playwright Auth Setup (MANDATORY
|
|
715
|
+
**Playwright Auth Setup (MANDATORY):**
|
|
1034
716
|
|
|
1035
717
|
```typescript
|
|
1036
|
-
// playwright/auth.setup.ts - Global setup
|
|
718
|
+
// playwright/auth.setup.ts - Global setup
|
|
1037
719
|
import { test as setup } from '@playwright/test';
|
|
1038
720
|
|
|
1039
|
-
const authFile = 'playwright/.auth/user.json';
|
|
1040
|
-
|
|
1041
721
|
setup('authenticate', async ({ page }) => {
|
|
1042
|
-
// Option 1: UI login (only in setup, not per test!)
|
|
1043
722
|
await page.goto('/login');
|
|
1044
723
|
await page.fill('[name="email"]', 'test@example.com');
|
|
1045
724
|
await page.fill('[name="password"]', 'testpass123');
|
|
1046
725
|
await page.click('button[type="submit"]');
|
|
1047
726
|
await page.waitForURL('/dashboard');
|
|
1048
|
-
|
|
1049
|
-
// Save auth state for reuse
|
|
1050
|
-
await page.context().storageState({ path: authFile });
|
|
1051
|
-
});
|
|
1052
|
-
|
|
1053
|
-
// Option 2: API-based auth (PREFERRED - faster, more reliable)
|
|
1054
|
-
setup('authenticate via API', async ({ request }) => {
|
|
1055
|
-
const response = await request.post('/api/auth/login', {
|
|
1056
|
-
data: { email: 'test@example.com', password: 'testpass123' }
|
|
1057
|
-
});
|
|
1058
|
-
|
|
1059
|
-
// Extract and save cookies/tokens
|
|
1060
|
-
await request.storageState({ path: authFile });
|
|
1061
|
-
});
|
|
1062
|
-
```
|
|
1063
|
-
|
|
1064
|
-
```typescript
|
|
1065
|
-
// playwright.config.ts
|
|
1066
|
-
export default defineConfig({
|
|
1067
|
-
projects: [
|
|
1068
|
-
// Setup project - runs first
|
|
1069
|
-
{ name: 'setup', testMatch: /.*\.setup\.ts/ },
|
|
1070
|
-
|
|
1071
|
-
// Tests use auth state from setup
|
|
1072
|
-
{
|
|
1073
|
-
name: 'chromium',
|
|
1074
|
-
use: {
|
|
1075
|
-
storageState: 'playwright/.auth/user.json',
|
|
1076
|
-
},
|
|
1077
|
-
dependencies: ['setup'],
|
|
1078
|
-
},
|
|
1079
|
-
],
|
|
1080
|
-
});
|
|
1081
|
-
```
|
|
1082
|
-
|
|
1083
|
-
```typescript
|
|
1084
|
-
// tests/dashboard.spec.ts - NO LOGIN CODE NEEDED!
|
|
1085
|
-
test('user can view dashboard', async ({ page }) => {
|
|
1086
|
-
// Already authenticated via storageState!
|
|
1087
|
-
await page.goto('/dashboard');
|
|
1088
|
-
await expect(page.locator('h1')).toContainText('Dashboard');
|
|
727
|
+
await page.context().storageState({ path: 'playwright/.auth/user.json' });
|
|
1089
728
|
});
|
|
1090
729
|
```
|
|
1091
730
|
|
|
1092
|
-
**Handling Auth Edge Cases:**
|
|
1093
|
-
|
|
1094
731
|
```typescript
|
|
1095
|
-
//
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
}
|
|
1103
|
-
|
|
1104
|
-
// For tests that need NO auth (login page testing):
|
|
1105
|
-
test.describe('login flow', () => {
|
|
1106
|
-
test.use({ storageState: { cookies: [], origins: [] } });
|
|
1107
|
-
|
|
1108
|
-
test('shows login form', async ({ page }) => {
|
|
1109
|
-
await page.goto('/login');
|
|
1110
|
-
// Test the actual login UI
|
|
1111
|
-
});
|
|
1112
|
-
});
|
|
732
|
+
// playwright.config.ts - Reuse auth state
|
|
733
|
+
projects: [
|
|
734
|
+
{ name: 'setup', testMatch: /.*\.setup\.ts/ },
|
|
735
|
+
{
|
|
736
|
+
name: 'chromium',
|
|
737
|
+
use: { storageState: 'playwright/.auth/user.json' },
|
|
738
|
+
dependencies: ['setup'],
|
|
739
|
+
},
|
|
740
|
+
]
|
|
1113
741
|
```
|
|
1114
742
|
|
|
1115
|
-
**Common Auth
|
|
743
|
+
**Common Auth Fixes:**
|
|
1116
744
|
|
|
1117
745
|
| Problem | Solution |
|
|
1118
746
|
|---------|----------|
|
|
1119
|
-
| Session expires
|
|
1120
|
-
| Rate limited
|
|
1121
|
-
| Captcha blocks
|
|
1122
|
-
| OAuth
|
|
1123
|
-
| Token not persisted | Wait for storage to complete before saving state |
|
|
1124
|
-
| Different auth per test | Use separate storageState files per user role |
|
|
1125
|
-
|
|
1126
|
-
**Test Database Strategy:**
|
|
1127
|
-
|
|
1128
|
-
```typescript
|
|
1129
|
-
// global-setup.ts - Seed ONCE before all tests
|
|
1130
|
-
async function globalSetup() {
|
|
1131
|
-
// 1. Reset test database to known state
|
|
1132
|
-
await resetTestDatabase();
|
|
1133
|
-
|
|
1134
|
-
// 2. Seed test users (with KNOWN passwords!)
|
|
1135
|
-
await seedTestUsers([
|
|
1136
|
-
{ email: 'user@test.local', password: 'Test123!', role: 'user' },
|
|
1137
|
-
{ email: 'admin@test.local', password: 'Admin123!', role: 'admin' },
|
|
1138
|
-
]);
|
|
1139
|
-
|
|
1140
|
-
// 3. Seed test data
|
|
1141
|
-
await seedTestData();
|
|
1142
|
-
}
|
|
1143
|
-
|
|
1144
|
-
// DON'T create users per test - use seeded users!
|
|
1145
|
-
```
|
|
747
|
+
| Session expires | Increase TTL for test env |
|
|
748
|
+
| Rate limited | Use API auth, seed users |
|
|
749
|
+
| Captcha blocks | Disable in test env |
|
|
750
|
+
| OAuth fails | Mock provider |
|
|
1146
751
|
|
|
1147
752
|
**Auto Mode E2E Checklist:**
|
|
1148
753
|
```
|
|
1149
|
-
|
|
1150
|
-
✅
|
|
1151
|
-
✅
|
|
1152
|
-
✅
|
|
1153
|
-
✅ Individual tests DON'T login (except login flow tests)
|
|
1154
|
-
✅ Test env has relaxed rate limits
|
|
1155
|
-
✅ Captcha/2FA disabled or bypassed in test env
|
|
754
|
+
✅ Test users seeded with known passwords
|
|
755
|
+
✅ Auth state files generated
|
|
756
|
+
✅ Tests DON'T login (except login flow tests)
|
|
757
|
+
✅ Captcha/2FA disabled in test env
|
|
1156
758
|
```
|
|
1157
759
|
|
|
1158
760
|
### 🔄 Continuous Refactoring (Part of Auto Loop)
|
|
@@ -1303,7 +905,7 @@ done
|
|
|
1303
905
|
**Circuit Breaker Pattern**: If external API (GitHub, JIRA) fails 3+ times, queue operations and continue.
|
|
1304
906
|
<!-- SW:END:auto -->
|
|
1305
907
|
|
|
1306
|
-
<!-- SW:SECTION:docs version="1.0.
|
|
908
|
+
<!-- SW:SECTION:docs version="1.0.60" -->
|
|
1307
909
|
## Docs
|
|
1308
910
|
|
|
1309
911
|
[spec-weave.com](https://spec-weave.com) | `.specweave/docs/internal/`
|
|
@@ -19,6 +19,6 @@ interface RefreshOptions {
|
|
|
19
19
|
github?: boolean;
|
|
20
20
|
verbose?: boolean;
|
|
21
21
|
}
|
|
22
|
-
export declare function refreshMarketplaceCommand(options
|
|
22
|
+
export declare function refreshMarketplaceCommand(options?: RefreshOptions): Promise<void>;
|
|
23
23
|
export {};
|
|
24
24
|
//# sourceMappingURL=refresh-marketplace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-marketplace.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/refresh-marketplace.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"refresh-marketplace.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/refresh-marketplace.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAYH,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0ED,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK3F"}
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @since 1.0.60
|
|
16
16
|
*/
|
|
17
|
-
import { Command } from 'commander';
|
|
18
17
|
import chalk from 'chalk';
|
|
19
18
|
import { execSync } from 'child_process';
|
|
20
19
|
import * as fs from 'fs';
|
|
@@ -80,7 +79,7 @@ function installPlugin(pluginName) {
|
|
|
80
79
|
}
|
|
81
80
|
return { name: pluginName, success: false, error: result.output };
|
|
82
81
|
}
|
|
83
|
-
export async function refreshMarketplaceCommand(options) {
|
|
82
|
+
export async function refreshMarketplaceCommand(options = {}) {
|
|
84
83
|
// Determine mode - GitHub is default per CLAUDE.md rules
|
|
85
84
|
const mode = options.local ? 'local' : 'github';
|
|
86
85
|
console.log(chalk.blue.bold('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
@@ -218,16 +217,4 @@ export async function refreshMarketplaceCommand(options) {
|
|
|
218
217
|
console.log(` 3. Check ${chalk.yellow('~/.claude/plugins/installed_plugins.json')}`);
|
|
219
218
|
console.log('');
|
|
220
219
|
}
|
|
221
|
-
// Standalone execution
|
|
222
|
-
const program = new Command();
|
|
223
|
-
program
|
|
224
|
-
.name('refresh-marketplace')
|
|
225
|
-
.description('Refresh SpecWeave marketplace and install all plugins')
|
|
226
|
-
.option('--local', 'Use local development version (ONLY for active dev)')
|
|
227
|
-
.option('--github', 'Pull latest from GitHub (default, recommended)')
|
|
228
|
-
.option('-v, --verbose', 'Show detailed error messages')
|
|
229
|
-
.action(async (options) => {
|
|
230
|
-
await refreshMarketplaceCommand(options);
|
|
231
|
-
});
|
|
232
|
-
program.parse();
|
|
233
220
|
//# sourceMappingURL=refresh-marketplace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-marketplace.js","sourceRoot":"","sources":["../../../../src/cli/commands/refresh-marketplace.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"refresh-marketplace.js","sourceRoot":"","sources":["../../../../src/cli/commands/refresh-marketplace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.62",
|
|
4
4
|
"description": "Spec-driven development framework for Claude Code. AI-native workflow with living documentation, intelligent agents, and multilingual support (9 languages). Enterprise-grade traceability with permanent specs and temporary increments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|