@epiccontext/mcp 0.1.16 → 0.1.18
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/dist/cli/files.d.ts.map +1 -1
- package/dist/cli/files.js +536 -134
- package/dist/cli/files.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/cli/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmCjE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,GAAE,YAAiB,GACzB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAsC9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/cli/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmCjE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,GAAE,YAAiB,GACzB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAsC9D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAsgC7D;AA4BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAO5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOpD"}
|
package/dist/cli/files.js
CHANGED
|
@@ -364,57 +364,105 @@ A journey map showing how new users get started with our product.
|
|
|
364
364
|
|
|
365
365
|
### Information Architecture Block (ia_tree)
|
|
366
366
|
|
|
367
|
-
IA tree blocks document the application's page hierarchy and
|
|
367
|
+
IA tree blocks document the application's page hierarchy, navigation structure, and connections between pages. They use embedded JSON in a \`sync:data\` block with a \`tree\` (hierarchy) and \`links\` (connections) structure.
|
|
368
368
|
|
|
369
369
|
#### Purpose
|
|
370
|
-
- Map out the complete site/app structure
|
|
370
|
+
- Map out the complete site/app structure visually
|
|
371
371
|
- Show parent-child relationships between pages
|
|
372
372
|
- Document modals, sections, and components within pages
|
|
373
|
-
- Define
|
|
374
|
-
- Track page types
|
|
373
|
+
- **Define connections/links between pages and components**
|
|
374
|
+
- Track page types with visual differentiation
|
|
375
375
|
|
|
376
|
-
####
|
|
376
|
+
#### Data Structure
|
|
377
377
|
|
|
378
|
-
|
|
378
|
+
The sync:data block contains two top-level properties:
|
|
379
|
+
|
|
380
|
+
\`\`\`json
|
|
381
|
+
{
|
|
382
|
+
"tree": { ... }, // The page/node hierarchy (IATreeNode)
|
|
383
|
+
"links": [ ... ] // Connections between nodes (IALink[])
|
|
384
|
+
}
|
|
385
|
+
\`\`\`
|
|
386
|
+
|
|
387
|
+
#### Node Structure (IATreeNode)
|
|
379
388
|
|
|
380
389
|
| Property | Required | Description |
|
|
381
390
|
|----------|----------|-------------|
|
|
382
391
|
| \`id\` | Yes | Unique identifier (use kebab-case, e.g., "user-settings") |
|
|
383
392
|
| \`label\` | Yes | Display name shown in the UI |
|
|
384
|
-
| \`type\` | Yes | Node type
|
|
393
|
+
| \`type\` | Yes | Node type: \`page\`, \`modal\`, \`external\`, or \`node\` |
|
|
385
394
|
| \`url\` | No | Route path for navigable pages (e.g., "/dashboard") |
|
|
386
395
|
| \`description\` | No | Brief description of the page/section purpose |
|
|
387
|
-
| \`
|
|
396
|
+
| \`position\` | Yes | Visual position: \`{ "x": number, "y": number }\` |
|
|
397
|
+
| \`children\` | No | Array of child nodes |
|
|
388
398
|
| \`subNodes\` | No | Sections/components within this page |
|
|
389
|
-
| \`isNew\` | No | Flag to show "
|
|
399
|
+
| \`isNew\` | No | Flag to show "NEW" badge on the node |
|
|
400
|
+
|
|
401
|
+
#### Node Types (Visual Shapes)
|
|
402
|
+
|
|
403
|
+
| Type | Visual | Description |
|
|
404
|
+
|------|--------|-------------|
|
|
405
|
+
| \`page\` | Square (sharp corners) | A routable page/screen |
|
|
406
|
+
| \`modal\` | Rounded (large radius) | Modal/dialog overlay |
|
|
407
|
+
| \`external\` | Dashed border | External link |
|
|
408
|
+
| \`node\` | Rounded corners | Generic structural node |
|
|
409
|
+
|
|
410
|
+
#### Sub-Node Types (Content Areas Within Nodes)
|
|
390
411
|
|
|
391
|
-
|
|
412
|
+
| Type | Description |
|
|
413
|
+
|------|-------------|
|
|
414
|
+
| \`section\` | A major content section |
|
|
415
|
+
| \`component\` | A reusable UI component |
|
|
416
|
+
| \`widget\` | Interactive widget/feature |
|
|
392
417
|
|
|
393
|
-
|
|
394
|
-
|------|-------|-------------|---------|
|
|
395
|
-
| \`page\` | Square | A navigable route/URL | Dashboard, Settings, Profile |
|
|
396
|
-
| \`modal\` | Rounded | Overlay dialog (no direct URL) | Confirmation dialogs, Preferences popup |
|
|
397
|
-
| \`external\` | Diamond | Link to external site | Documentation, Support portal |
|
|
418
|
+
Sub-nodes appear inside their parent node and can be the source of links to other nodes.
|
|
398
419
|
|
|
399
|
-
####
|
|
420
|
+
#### Link Structure (IALink)
|
|
400
421
|
|
|
401
|
-
|
|
422
|
+
Links define relationships and navigation paths between nodes. **IMPORTANT:** You MUST include the \`links\` array to show connections.
|
|
402
423
|
|
|
424
|
+
| Property | Required | Description |
|
|
425
|
+
|----------|----------|-------------|
|
|
426
|
+
| \`id\` | Yes | Unique ID for the link (e.g., "link-login-to-dashboard") |
|
|
427
|
+
| \`sourceId\` | Yes | ID of the source node |
|
|
428
|
+
| \`targetId\` | Yes | ID of the target node |
|
|
429
|
+
| \`sourceSubNodeId\` | No | If link starts from a sub-node, its ID |
|
|
430
|
+
| \`type\` | Yes | Link type (see below) |
|
|
431
|
+
| \`label\` | No | Description of the connection |
|
|
432
|
+
|
|
433
|
+
#### Link Types
|
|
434
|
+
|
|
435
|
+
| Type | Color | Style | Use Case |
|
|
436
|
+
|------|-------|-------|----------|
|
|
437
|
+
| \`action\` | Green (#22c55e) | Solid | User action that navigates (clicks, taps) |
|
|
438
|
+
| \`related\` | Purple (#8b5cf6) | Solid | Related content connection |
|
|
439
|
+
| \`parent\` | Blue (#3b82f6) | Solid | Parent-child hierarchy |
|
|
440
|
+
| \`references\` | Amber (#f59e0b) | Dashed | Content reference/link |
|
|
441
|
+
|
|
442
|
+
#### Connection Types
|
|
443
|
+
|
|
444
|
+
**1. Node → Node Connection:**
|
|
403
445
|
\`\`\`json
|
|
404
446
|
{
|
|
405
|
-
"id": "
|
|
406
|
-
"
|
|
407
|
-
"
|
|
408
|
-
"
|
|
409
|
-
"
|
|
410
|
-
{ "id": "metrics-panel", "label": "Metrics Panel", "type": "section" },
|
|
411
|
-
{ "id": "quick-actions", "label": "Quick Actions", "type": "component" }
|
|
412
|
-
],
|
|
413
|
-
"children": []
|
|
447
|
+
"id": "link-home-to-settings",
|
|
448
|
+
"sourceId": "home-page",
|
|
449
|
+
"targetId": "settings-modal",
|
|
450
|
+
"type": "action",
|
|
451
|
+
"label": "Opens settings"
|
|
414
452
|
}
|
|
415
453
|
\`\`\`
|
|
416
454
|
|
|
417
|
-
Sub-
|
|
455
|
+
**2. Sub-Node → Node Connection:**
|
|
456
|
+
\`\`\`json
|
|
457
|
+
{
|
|
458
|
+
"id": "link-cta-to-signup",
|
|
459
|
+
"sourceId": "home-page",
|
|
460
|
+
"sourceSubNodeId": "hero-cta-button",
|
|
461
|
+
"targetId": "signup-page",
|
|
462
|
+
"type": "action",
|
|
463
|
+
"label": "Sign up CTA click"
|
|
464
|
+
}
|
|
465
|
+
\`\`\`
|
|
418
466
|
|
|
419
467
|
#### Complete Example
|
|
420
468
|
|
|
@@ -429,109 +477,81 @@ status: draft
|
|
|
429
477
|
|
|
430
478
|
# Application Structure
|
|
431
479
|
|
|
432
|
-
Complete information architecture
|
|
433
|
-
|
|
434
|
-
## Design Principles
|
|
435
|
-
- Maximum 3 levels of navigation depth
|
|
436
|
-
- All key actions accessible within 2 clicks
|
|
437
|
-
- Consistent navigation patterns across sections
|
|
480
|
+
Complete information architecture showing pages, modals, and navigation flows.
|
|
438
481
|
|
|
439
482
|
<!-- sync:data -->
|
|
440
483
|
\\\`\`\`json
|
|
441
484
|
{
|
|
442
|
-
"
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
485
|
+
"tree": {
|
|
486
|
+
"id": "app-root",
|
|
487
|
+
"label": "Application",
|
|
488
|
+
"type": "node",
|
|
489
|
+
"description": "Root application node",
|
|
490
|
+
"position": { "x": 50, "y": 50 },
|
|
491
|
+
"children": [
|
|
492
|
+
{
|
|
493
|
+
"id": "login",
|
|
494
|
+
"label": "Login",
|
|
495
|
+
"type": "page",
|
|
496
|
+
"url": "/login",
|
|
497
|
+
"position": { "x": 50, "y": 200 },
|
|
498
|
+
"subNodes": [
|
|
499
|
+
{ "id": "login-form", "name": "Login Form", "type": "component" },
|
|
500
|
+
{ "id": "forgot-link", "name": "Forgot Password Link", "type": "component" }
|
|
501
|
+
]
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
"id": "dashboard",
|
|
505
|
+
"label": "Dashboard",
|
|
506
|
+
"type": "page",
|
|
507
|
+
"url": "/dashboard",
|
|
508
|
+
"description": "Main workspace",
|
|
509
|
+
"position": { "x": 400, "y": 200 },
|
|
510
|
+
"subNodes": [
|
|
511
|
+
{ "id": "project-grid", "name": "Project Grid", "type": "section" },
|
|
512
|
+
{ "id": "create-btn", "name": "Create Project Button", "type": "component" }
|
|
513
|
+
]
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
"id": "new-project",
|
|
517
|
+
"label": "New Project",
|
|
518
|
+
"type": "modal",
|
|
519
|
+
"description": "Create project dialog",
|
|
520
|
+
"position": { "x": 750, "y": 200 }
|
|
521
|
+
}
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
"links": [
|
|
448
525
|
{
|
|
449
|
-
"id": "dashboard",
|
|
450
|
-
"
|
|
451
|
-
"
|
|
452
|
-
"
|
|
453
|
-
"
|
|
454
|
-
"
|
|
455
|
-
{ "id": "metrics-overview", "label": "Metrics Overview", "type": "section" },
|
|
456
|
-
{ "id": "recent-activity", "label": "Recent Activity", "type": "section" },
|
|
457
|
-
{ "id": "quick-actions", "label": "Quick Actions", "type": "component" }
|
|
458
|
-
],
|
|
459
|
-
"children": [
|
|
460
|
-
{
|
|
461
|
-
"id": "analytics",
|
|
462
|
-
"label": "Analytics",
|
|
463
|
-
"type": "page",
|
|
464
|
-
"url": "/dashboard/analytics",
|
|
465
|
-
"isNew": true,
|
|
466
|
-
"children": []
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
"id": "reports",
|
|
470
|
-
"label": "Reports",
|
|
471
|
-
"type": "page",
|
|
472
|
-
"url": "/dashboard/reports",
|
|
473
|
-
"children": []
|
|
474
|
-
}
|
|
475
|
-
]
|
|
526
|
+
"id": "link-login-form-to-dashboard",
|
|
527
|
+
"sourceId": "login",
|
|
528
|
+
"sourceSubNodeId": "login-form",
|
|
529
|
+
"targetId": "dashboard",
|
|
530
|
+
"type": "action",
|
|
531
|
+
"label": "Successful login"
|
|
476
532
|
},
|
|
477
533
|
{
|
|
478
|
-
"id": "
|
|
479
|
-
"
|
|
480
|
-
"
|
|
481
|
-
"
|
|
482
|
-
"
|
|
483
|
-
"
|
|
484
|
-
{
|
|
485
|
-
"id": "project-detail",
|
|
486
|
-
"label": "Project Detail",
|
|
487
|
-
"type": "page",
|
|
488
|
-
"url": "/projects/:id",
|
|
489
|
-
"children": []
|
|
490
|
-
},
|
|
491
|
-
{
|
|
492
|
-
"id": "create-project",
|
|
493
|
-
"label": "Create Project",
|
|
494
|
-
"type": "modal",
|
|
495
|
-
"description": "Modal dialog for creating new projects",
|
|
496
|
-
"children": []
|
|
497
|
-
}
|
|
498
|
-
]
|
|
534
|
+
"id": "link-forgot-to-reset",
|
|
535
|
+
"sourceId": "login",
|
|
536
|
+
"sourceSubNodeId": "forgot-link",
|
|
537
|
+
"targetId": "password-reset",
|
|
538
|
+
"type": "action",
|
|
539
|
+
"label": "Forgot password flow"
|
|
499
540
|
},
|
|
500
541
|
{
|
|
501
|
-
"id": "
|
|
502
|
-
"
|
|
503
|
-
"
|
|
504
|
-
"
|
|
505
|
-
"
|
|
506
|
-
|
|
507
|
-
"id": "profile",
|
|
508
|
-
"label": "Profile",
|
|
509
|
-
"type": "page",
|
|
510
|
-
"url": "/settings/profile",
|
|
511
|
-
"children": []
|
|
512
|
-
},
|
|
513
|
-
{
|
|
514
|
-
"id": "preferences",
|
|
515
|
-
"label": "Preferences",
|
|
516
|
-
"type": "modal",
|
|
517
|
-
"children": []
|
|
518
|
-
},
|
|
519
|
-
{
|
|
520
|
-
"id": "billing",
|
|
521
|
-
"label": "Billing",
|
|
522
|
-
"type": "page",
|
|
523
|
-
"url": "/settings/billing",
|
|
524
|
-
"children": []
|
|
525
|
-
}
|
|
526
|
-
]
|
|
542
|
+
"id": "link-create-btn-to-modal",
|
|
543
|
+
"sourceId": "dashboard",
|
|
544
|
+
"sourceSubNodeId": "create-btn",
|
|
545
|
+
"targetId": "new-project",
|
|
546
|
+
"type": "action",
|
|
547
|
+
"label": "Opens create dialog"
|
|
527
548
|
},
|
|
528
549
|
{
|
|
529
|
-
"id": "
|
|
530
|
-
"
|
|
531
|
-
"
|
|
532
|
-
"
|
|
533
|
-
"
|
|
534
|
-
"children": []
|
|
550
|
+
"id": "link-modal-to-dashboard",
|
|
551
|
+
"sourceId": "new-project",
|
|
552
|
+
"targetId": "dashboard",
|
|
553
|
+
"type": "action",
|
|
554
|
+
"label": "After creation, returns to dashboard"
|
|
535
555
|
}
|
|
536
556
|
]
|
|
537
557
|
}
|
|
@@ -541,35 +561,417 @@ Complete information architecture for our SaaS application, showing all pages, m
|
|
|
541
561
|
|
|
542
562
|
#### Best Practices
|
|
543
563
|
|
|
544
|
-
1. **
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
564
|
+
1. **Always include positions for nodes:**
|
|
565
|
+
Space nodes ~300-400px apart horizontally, ~150-200px vertically to avoid overlap.
|
|
566
|
+
|
|
567
|
+
2. **Create meaningful connections:**
|
|
568
|
+
- Every sub-node that leads somewhere should have a link
|
|
569
|
+
- Data flows should show input → processing → output
|
|
570
|
+
- User journeys should connect in logical sequence
|
|
571
|
+
|
|
572
|
+
3. **Use descriptive IDs:**
|
|
573
|
+
- Node IDs: \`home-page\`, \`settings-modal\`, \`auth-flow\`
|
|
574
|
+
- Sub-node IDs: \`nav-menu\`, \`hero-cta\`, \`project-list\`
|
|
575
|
+
- Link IDs: \`link-nav-to-dashboard\`, \`link-cta-to-signup\`
|
|
576
|
+
|
|
577
|
+
4. **Group related nodes visually:**
|
|
578
|
+
- Authentication pages together (x: 50-300)
|
|
579
|
+
- Dashboard pages together (x: 400-700)
|
|
580
|
+
- Settings/admin together (x: 800-1100)
|
|
581
|
+
|
|
582
|
+
5. **Choose appropriate link types:**
|
|
583
|
+
- \`action\`: User clicks/taps to navigate
|
|
584
|
+
- \`related\`: Content is related but not direct navigation
|
|
585
|
+
- \`parent\`: Hierarchical relationship
|
|
586
|
+
- \`references\`: One content references another
|
|
551
587
|
|
|
552
588
|
#### Common Mistakes
|
|
553
589
|
|
|
554
|
-
WRONG: Missing
|
|
590
|
+
WRONG: Missing links array
|
|
591
|
+
\`\`\`json
|
|
592
|
+
{ "tree": { "id": "root", ... } }
|
|
593
|
+
\`\`\`
|
|
594
|
+
|
|
595
|
+
CORRECT: Always include links (even if empty)
|
|
596
|
+
\`\`\`json
|
|
597
|
+
{ "tree": { "id": "root", ... }, "links": [] }
|
|
598
|
+
\`\`\`
|
|
599
|
+
|
|
600
|
+
WRONG: Missing position for nodes
|
|
555
601
|
\`\`\`json
|
|
556
|
-
{ "id": "
|
|
602
|
+
{ "id": "dashboard", "label": "Dashboard", "type": "page" }
|
|
557
603
|
\`\`\`
|
|
558
604
|
|
|
559
|
-
CORRECT: Always include
|
|
605
|
+
CORRECT: Always include position
|
|
560
606
|
\`\`\`json
|
|
561
|
-
{ "id": "
|
|
607
|
+
{ "id": "dashboard", "label": "Dashboard", "type": "page", "position": { "x": 400, "y": 200 } }
|
|
562
608
|
\`\`\`
|
|
563
609
|
|
|
564
|
-
WRONG:
|
|
610
|
+
WRONG: Link without type
|
|
565
611
|
\`\`\`json
|
|
566
|
-
{ "id": "
|
|
612
|
+
{ "id": "link-1", "sourceId": "a", "targetId": "b" }
|
|
613
|
+
\`\`\`
|
|
614
|
+
|
|
615
|
+
CORRECT: Always specify link type
|
|
616
|
+
\`\`\`json
|
|
617
|
+
{ "id": "link-1", "sourceId": "a", "targetId": "b", "type": "action" }
|
|
618
|
+
\`\`\`
|
|
619
|
+
|
|
620
|
+
### Development Section Blocks (Epic → Story → Task)
|
|
621
|
+
|
|
622
|
+
The development section uses a hierarchical structure to plan and track work. This creates a clear flow from high-level initiatives down to specific implementation tasks.
|
|
623
|
+
|
|
624
|
+
#### Hierarchy Flow
|
|
625
|
+
|
|
626
|
+
\`\`\`
|
|
627
|
+
Epic (Large initiative)
|
|
628
|
+
└── User Story (User-facing feature)
|
|
629
|
+
└── Task / Agent Plan (Technical implementation)
|
|
630
|
+
\`\`\`
|
|
631
|
+
|
|
632
|
+
**How AI/Developers Should Use This:**
|
|
633
|
+
1. **Product Owner/User** creates Epics for major initiatives
|
|
634
|
+
2. **Product Owner/User** breaks Epics into User Stories
|
|
635
|
+
3. **AI Agent/Developer** reads Stories and creates Tasks with implementation plans
|
|
636
|
+
4. **AI Agent/Developer** executes Tasks and updates outcomes
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
#### Epic Block
|
|
641
|
+
|
|
642
|
+
An Epic represents a large body of work that delivers significant value. It groups related User Stories.
|
|
643
|
+
|
|
644
|
+
**Required Fields:**
|
|
645
|
+
- \`summary\` - One-line description
|
|
646
|
+
- \`status\` - todo, in_progress, done
|
|
647
|
+
|
|
648
|
+
**Key Fields:**
|
|
649
|
+
- \`description\` - Detailed explanation
|
|
650
|
+
- \`priority\` - highest, high, medium, low, lowest
|
|
651
|
+
- \`story_refs\` - Links to child User Stories
|
|
652
|
+
- \`impact_score\` / \`effort_score\` - 1-5 scale for prioritization
|
|
653
|
+
- \`start_date\` / \`due_date\` - Timeline
|
|
654
|
+
- \`labels\` - Comma-separated tags
|
|
655
|
+
|
|
656
|
+
**Example:**
|
|
657
|
+
\`\`\`markdown
|
|
658
|
+
---
|
|
659
|
+
type: epic
|
|
660
|
+
section: development
|
|
661
|
+
key: user-authentication
|
|
662
|
+
name: User Authentication System
|
|
663
|
+
status: draft
|
|
664
|
+
priority: high
|
|
665
|
+
start_date: 2025-01-15
|
|
666
|
+
due_date: 2025-02-28
|
|
667
|
+
labels: security, mvp, phase-1
|
|
668
|
+
story_refs:
|
|
669
|
+
- email-login
|
|
670
|
+
- oauth-integration
|
|
671
|
+
- password-reset
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
# User Authentication System
|
|
675
|
+
|
|
676
|
+
Implement a complete authentication system allowing users to securely access their accounts.
|
|
677
|
+
|
|
678
|
+
## Summary
|
|
679
|
+
Build secure user authentication with email/password and OAuth support.
|
|
680
|
+
|
|
681
|
+
## Description
|
|
682
|
+
This epic covers all authentication-related features including registration, login, logout, password management, and third-party OAuth integration. The goal is to provide a frictionless yet secure authentication experience.
|
|
683
|
+
|
|
684
|
+
### Goals
|
|
685
|
+
- Enable secure user registration with email verification
|
|
686
|
+
- Support login via email/password and OAuth (Google, GitHub)
|
|
687
|
+
- Implement password reset flow with secure tokens
|
|
688
|
+
- Add session management with JWT
|
|
689
|
+
|
|
690
|
+
### Success Criteria
|
|
691
|
+
- Users can create accounts and verify email
|
|
692
|
+
- Login works with email/password and OAuth providers
|
|
693
|
+
- Password reset emails arrive within 30 seconds
|
|
694
|
+
- Sessions expire after 24 hours of inactivity
|
|
695
|
+
|
|
696
|
+
### Out of Scope
|
|
697
|
+
- Two-factor authentication (planned for Phase 2)
|
|
698
|
+
- Social login beyond Google/GitHub
|
|
699
|
+
\`\`\`
|
|
700
|
+
|
|
701
|
+
---
|
|
702
|
+
|
|
703
|
+
#### User Story Block
|
|
704
|
+
|
|
705
|
+
A User Story describes a feature from the user's perspective. It belongs to an Epic and can have Tasks.
|
|
706
|
+
|
|
707
|
+
**Required Fields:**
|
|
708
|
+
- \`summary\` - Brief description
|
|
709
|
+
- \`status\` - todo, in_progress, in_review, done
|
|
710
|
+
|
|
711
|
+
**Key Fields:**
|
|
712
|
+
- \`user_story\` - "As a [role], I want [goal], so that [benefit]" format
|
|
713
|
+
- \`acceptance_criteria\` - Testable conditions (Given/When/Then)
|
|
714
|
+
- \`epic_ref\` - Link to parent Epic
|
|
715
|
+
- \`story_points\` - 1, 2, 3, 5, 8, 13, 21 (Fibonacci)
|
|
716
|
+
- \`priority\` - highest, high, medium, low, lowest
|
|
717
|
+
- \`impact_score\` / \`effort_score\` - 1-5 scale
|
|
718
|
+
- \`sprint\` - Sprint assignment
|
|
719
|
+
|
|
720
|
+
**Example:**
|
|
721
|
+
\`\`\`markdown
|
|
722
|
+
---
|
|
723
|
+
type: user_story
|
|
724
|
+
section: development
|
|
725
|
+
key: email-login
|
|
726
|
+
name: Email Login
|
|
727
|
+
status: draft
|
|
728
|
+
priority: high
|
|
729
|
+
story_points: 5
|
|
730
|
+
impact_score: 5
|
|
731
|
+
effort_score: 3
|
|
732
|
+
epic_ref: user-authentication
|
|
733
|
+
sprint: Sprint 1
|
|
734
|
+
---
|
|
735
|
+
|
|
736
|
+
# Email Login
|
|
737
|
+
|
|
738
|
+
Allow users to securely log in with their email and password.
|
|
739
|
+
|
|
740
|
+
## Summary
|
|
741
|
+
Implement email/password authentication with proper security measures.
|
|
742
|
+
|
|
743
|
+
## User Story
|
|
744
|
+
As a registered user, I want to log in with my email and password, so that I can access my account securely and quickly.
|
|
745
|
+
|
|
746
|
+
## Description
|
|
747
|
+
Users need a fast and secure way to access their accounts. The login form should validate input, show helpful error messages, and redirect to the dashboard on success.
|
|
748
|
+
|
|
749
|
+
## Acceptance Criteria
|
|
750
|
+
|
|
751
|
+
### Scenario: Successful login
|
|
752
|
+
- Given I am on the login page
|
|
753
|
+
- When I enter a valid email and correct password
|
|
754
|
+
- Then I am redirected to the dashboard
|
|
755
|
+
- And I see a welcome message with my name
|
|
756
|
+
|
|
757
|
+
### Scenario: Invalid credentials
|
|
758
|
+
- Given I am on the login page
|
|
759
|
+
- When I enter an invalid email or wrong password
|
|
760
|
+
- Then I see an error message "Invalid email or password"
|
|
761
|
+
- And I remain on the login page
|
|
762
|
+
- And the password field is cleared
|
|
763
|
+
|
|
764
|
+
### Scenario: Rate limiting
|
|
765
|
+
- Given I have failed login 5 times in 5 minutes
|
|
766
|
+
- When I try to login again
|
|
767
|
+
- Then I see "Too many attempts. Please try again in 15 minutes"
|
|
768
|
+
|
|
769
|
+
## Technical Notes
|
|
770
|
+
- Use bcrypt for password hashing (cost factor 12)
|
|
771
|
+
- Implement rate limiting: 5 attempts per 5 minutes per IP
|
|
772
|
+
- Generate JWT with 24h expiry
|
|
773
|
+
- Store refresh token in httpOnly cookie
|
|
567
774
|
\`\`\`
|
|
568
775
|
|
|
569
|
-
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
#### Task / Agent Plan Block
|
|
779
|
+
|
|
780
|
+
A Task contains the technical implementation plan. AI coding agents (Claude Code, Cursor, etc.) should create Tasks when planning work.
|
|
781
|
+
|
|
782
|
+
**Required Fields:**
|
|
783
|
+
- \`description\` - What needs to be done
|
|
784
|
+
- \`status\` - planned, todo, in_progress, in_review, done, abandoned
|
|
785
|
+
|
|
786
|
+
**Key Fields:**
|
|
787
|
+
- \`story_ref\` - Link to parent User Story
|
|
788
|
+
- \`plan_steps\` - Step-by-step implementation plan
|
|
789
|
+
- \`agent_source\` - manual, claude_code, cursor, copilot, windsurf, aider, other_ai
|
|
790
|
+
- \`files_affected\` - List of files to create/modify
|
|
791
|
+
- \`codebase_context\` - Relevant architecture notes
|
|
792
|
+
- \`technical_notes\` - Implementation details
|
|
793
|
+
- \`dependencies\` - Prerequisites or packages needed
|
|
794
|
+
- \`estimated_hours\` - Time estimate
|
|
795
|
+
- \`outcome\` - Results after completion
|
|
796
|
+
|
|
797
|
+
**Example (AI Agent Plan):**
|
|
798
|
+
\`\`\`markdown
|
|
799
|
+
---
|
|
800
|
+
type: task
|
|
801
|
+
section: development
|
|
802
|
+
key: implement-login-api
|
|
803
|
+
name: Implement Login API Endpoint
|
|
804
|
+
status: planned
|
|
805
|
+
priority: high
|
|
806
|
+
agent_source: claude_code
|
|
807
|
+
story_ref: email-login
|
|
808
|
+
estimated_hours: 4
|
|
809
|
+
---
|
|
810
|
+
|
|
811
|
+
# Implement Login API Endpoint
|
|
812
|
+
|
|
813
|
+
Create the POST /api/auth/login endpoint that validates credentials and returns JWT tokens.
|
|
814
|
+
|
|
815
|
+
## Description
|
|
816
|
+
Implement the login API endpoint with proper validation, rate limiting, and token generation.
|
|
817
|
+
|
|
818
|
+
## Implementation Plan
|
|
819
|
+
|
|
820
|
+
### Step 1: Create Login Route Handler
|
|
821
|
+
Create \`app/api/auth/login/route.ts\` with POST handler:
|
|
822
|
+
- Accept email and password in request body
|
|
823
|
+
- Validate input format using zod schema
|
|
824
|
+
- Return 400 for invalid input with specific error messages
|
|
825
|
+
|
|
826
|
+
### Step 2: Implement User Lookup
|
|
827
|
+
Query the users table by email:
|
|
828
|
+
- Use Supabase client with service role for server-side
|
|
829
|
+
- Return generic "Invalid credentials" to prevent email enumeration
|
|
830
|
+
- Handle case-insensitive email matching
|
|
831
|
+
|
|
832
|
+
### Step 3: Password Verification
|
|
833
|
+
Compare provided password with stored hash:
|
|
834
|
+
- Use bcrypt.compare() for timing-safe comparison
|
|
835
|
+
- Log failed attempts for security monitoring
|
|
836
|
+
- Increment rate limit counter on failure
|
|
837
|
+
|
|
838
|
+
### Step 4: Generate JWT Tokens
|
|
839
|
+
On successful authentication:
|
|
840
|
+
- Generate access token (24h expiry) with user ID and email
|
|
841
|
+
- Generate refresh token (7d expiry) stored in httpOnly cookie
|
|
842
|
+
- Include minimal claims to reduce token size
|
|
843
|
+
|
|
844
|
+
### Step 5: Implement Rate Limiting
|
|
845
|
+
Add rate limiting middleware:
|
|
846
|
+
- Use Redis or in-memory store for attempt tracking
|
|
847
|
+
- Key by IP address + email combination
|
|
848
|
+
- Block after 5 failed attempts for 15 minutes
|
|
849
|
+
- Return 429 with Retry-After header
|
|
850
|
+
|
|
851
|
+
### Step 6: Add Tests
|
|
852
|
+
Create \`app/api/auth/login/route.test.ts\`:
|
|
853
|
+
- Test successful login returns tokens
|
|
854
|
+
- Test invalid email format returns 400
|
|
855
|
+
- Test wrong password returns 401
|
|
856
|
+
- Test rate limiting blocks after 5 attempts
|
|
857
|
+
|
|
858
|
+
## Files Affected
|
|
859
|
+
- \`app/api/auth/login/route.ts\` (create)
|
|
860
|
+
- \`lib/auth/jwt.ts\` (create)
|
|
861
|
+
- \`lib/auth/password.ts\` (create)
|
|
862
|
+
- \`lib/middleware/rate-limit.ts\` (create)
|
|
863
|
+
- \`app/api/auth/login/route.test.ts\` (create)
|
|
864
|
+
|
|
865
|
+
## Codebase Context
|
|
866
|
+
- Using Next.js 14 App Router
|
|
867
|
+
- Supabase for database and auth
|
|
868
|
+
- JWT library: jose
|
|
869
|
+
- Password hashing: bcrypt
|
|
870
|
+
- Validation: zod
|
|
871
|
+
|
|
872
|
+
## Dependencies
|
|
873
|
+
- jose (JWT handling)
|
|
874
|
+
- bcrypt (password hashing)
|
|
875
|
+
- zod (validation)
|
|
876
|
+
|
|
877
|
+
## Technical Notes
|
|
878
|
+
- Follow existing API patterns in \`app/api/\` folder
|
|
879
|
+
- Use \`@/lib/supabase/server\` for database access
|
|
880
|
+
- Error responses should match the ErrorResponse type in \`types/api.ts\`
|
|
881
|
+
\`\`\`
|
|
882
|
+
|
|
883
|
+
---
|
|
884
|
+
|
|
885
|
+
#### Roadmap Block
|
|
886
|
+
|
|
887
|
+
A Roadmap provides a timeline view of Epics across time periods (quarters, months, sprints).
|
|
888
|
+
|
|
889
|
+
**Key Fields:**
|
|
890
|
+
- \`description\` - Purpose of this roadmap
|
|
891
|
+
- \`timeline\` - Visual timeline data with columns and epic placements
|
|
892
|
+
- \`notes\` - Additional context, risks, assumptions
|
|
893
|
+
|
|
894
|
+
**Timeline Structure:**
|
|
570
895
|
\`\`\`json
|
|
571
|
-
{
|
|
896
|
+
{
|
|
897
|
+
"columns": [
|
|
898
|
+
{ "id": "q1-2025", "name": "Q1 2025", "period": "quarter" },
|
|
899
|
+
{ "id": "q2-2025", "name": "Q2 2025", "period": "quarter" }
|
|
900
|
+
],
|
|
901
|
+
"items": [
|
|
902
|
+
{
|
|
903
|
+
"epicRef": "user-authentication",
|
|
904
|
+
"startColumn": "q1-2025",
|
|
905
|
+
"spanColumns": 1,
|
|
906
|
+
"row": 0
|
|
907
|
+
}
|
|
908
|
+
],
|
|
909
|
+
"settings": { "defaultPeriod": "quarter" }
|
|
910
|
+
}
|
|
911
|
+
\`\`\`
|
|
912
|
+
|
|
913
|
+
---
|
|
914
|
+
|
|
915
|
+
#### Workflow: From User Request to Implementation
|
|
916
|
+
|
|
917
|
+
**1. User/Product Owner Creates Epic:**
|
|
572
918
|
\`\`\`
|
|
919
|
+
"We need user authentication for the MVP"
|
|
920
|
+
→ Create Epic: user-authentication
|
|
921
|
+
→ Set priority: high
|
|
922
|
+
→ Set dates: Q1 2025
|
|
923
|
+
\`\`\`
|
|
924
|
+
|
|
925
|
+
**2. User/Product Owner Breaks Down Stories:**
|
|
926
|
+
\`\`\`
|
|
927
|
+
Epic: user-authentication
|
|
928
|
+
→ Story: email-login (5 points)
|
|
929
|
+
→ Story: oauth-integration (8 points)
|
|
930
|
+
→ Story: password-reset (3 points)
|
|
931
|
+
\`\`\`
|
|
932
|
+
|
|
933
|
+
**3. AI Agent Reads Story and Plans:**
|
|
934
|
+
\`\`\`
|
|
935
|
+
AI reads: email-login story
|
|
936
|
+
→ Creates Task: implement-login-api (4 hours)
|
|
937
|
+
→ Creates Task: build-login-form (3 hours)
|
|
938
|
+
→ Creates Task: add-login-tests (2 hours)
|
|
939
|
+
\`\`\`
|
|
940
|
+
|
|
941
|
+
**4. AI Agent Executes and Documents:**
|
|
942
|
+
\`\`\`
|
|
943
|
+
Task: implement-login-api
|
|
944
|
+
→ Status: in_progress
|
|
945
|
+
→ [AI implements code]
|
|
946
|
+
→ Status: done
|
|
947
|
+
→ Outcome: "Completed. Added rate limiting as discussed."
|
|
948
|
+
\`\`\`
|
|
949
|
+
|
|
950
|
+
---
|
|
951
|
+
|
|
952
|
+
#### Best Practices for AI Agents
|
|
953
|
+
|
|
954
|
+
1. **Read the Story First**: Before creating tasks, fully understand the user story and acceptance criteria.
|
|
955
|
+
|
|
956
|
+
2. **Break Down Thoughtfully**: Create tasks that are:
|
|
957
|
+
- Independently testable
|
|
958
|
+
- 2-8 hours of work each
|
|
959
|
+
- Clearly scoped with specific files
|
|
960
|
+
|
|
961
|
+
3. **Document Your Plan**: In \`plan_steps\`, explain:
|
|
962
|
+
- What you'll do in each step
|
|
963
|
+
- Why you're making certain choices
|
|
964
|
+
- What files you'll touch
|
|
965
|
+
|
|
966
|
+
4. **Track Codebase Context**: Note relevant:
|
|
967
|
+
- Existing patterns to follow
|
|
968
|
+
- Related code to reference
|
|
969
|
+
- Constraints or dependencies
|
|
970
|
+
|
|
971
|
+
5. **Update Outcomes**: After completing a task, document:
|
|
972
|
+
- What was actually done
|
|
973
|
+
- Any deviations from the plan
|
|
974
|
+
- Issues encountered and how they were resolved
|
|
573
975
|
|
|
574
976
|
## Block References
|
|
575
977
|
|
package/dist/cli/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/cli/files.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/cli/files.ts"],"names":[],"mappings":"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"}
|