kaddidlehopper 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +7 -0
- package/add-ons/ai/assets/AGENTS.md.append +24 -0
- package/add-ons/ai/info.json +12 -17
- package/add-ons/db/assets/AGENTS.md.append +22 -0
- package/add-ons/db/info.json +11 -10
- package/add-ons/forms/assets/AGENTS.md.append +13 -0
- package/add-ons/forms/info.json +7 -10
- package/dist/agents-md.js +103 -0
- package/dist/cli.js +4 -0
- package/dist/types/agents-md.d.ts +5 -0
- package/examples/ai-chat/assets/AGENTS.md.append +24 -0
- package/examples/ai-chat/info.json +12 -11
- package/examples/blog/assets/AGENTS.md.append +18 -0
- package/examples/blog/info.json +26 -29
- package/examples/calculator/assets/AGENTS.md.append +9 -0
- package/examples/calculator/info.json +9 -8
- package/examples/dashboard/assets/AGENTS.md.append +12 -0
- package/examples/dashboard/info.json +8 -8
- package/examples/ecommerce/assets/AGENTS.md.append +22 -0
- package/examples/ecommerce/info.json +25 -27
- package/examples/events/assets/AGENTS.md.append +21 -0
- package/examples/events/info.json +47 -60
- package/examples/marketing/assets/AGENTS.md.append +15 -0
- package/examples/marketing/info.json +18 -23
- package/examples/portfolio/assets/AGENTS.md.append +21 -0
- package/examples/portfolio/info.json +38 -44
- package/examples/resume/assets/AGENTS.md.append +19 -0
- package/examples/resume/info.json +25 -15
- package/examples/saas/assets/AGENTS.md.append +9 -0
- package/examples/saas/info.json +10 -13
- package/examples/survey/assets/AGENTS.md.append +9 -0
- package/examples/survey/info.json +8 -8
- package/package.json +1 -1
- package/project/base/AGENTS.md +86 -0
- package/project/info.json +17 -0
- package/src/agents-md.ts +139 -0
- package/src/cli.ts +5 -0
|
@@ -7,68 +7,55 @@
|
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
9
|
"routes": [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
|
|
17
|
-
"path": "src/routes/schedule.index.tsx",
|
|
18
|
-
"jsName": "SchedulePage"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"url": "/speakers",
|
|
22
|
-
"path": "src/routes/speakers.index.tsx",
|
|
23
|
-
"jsName": "SpeakersPage"
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"url": "/speakers/$slug",
|
|
27
|
-
"path": "src/routes/speakers.$slug.tsx",
|
|
28
|
-
"jsName": "SpeakerDetail"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"url": "/talks",
|
|
32
|
-
"path": "src/routes/talks.index.tsx",
|
|
33
|
-
"jsName": "TalksPage"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"url": "/talks/$slug",
|
|
37
|
-
"path": "src/routes/talks.$slug.tsx",
|
|
38
|
-
"jsName": "TalkDetail"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"url": "/api/remy-chat",
|
|
42
|
-
"path": "src/routes/api.remy-chat.ts",
|
|
43
|
-
"jsName": "RemyChatAPI"
|
|
44
|
-
}
|
|
45
|
-
],
|
|
46
|
-
"integrations": [
|
|
47
|
-
{
|
|
48
|
-
"type": "vite-plugin",
|
|
49
|
-
"import": "import contentCollections from '@content-collections/vite'",
|
|
50
|
-
"code": "contentCollections()"
|
|
51
|
-
}
|
|
10
|
+
{"url": "/", "path": "src/routes/index.tsx", "jsName": "EventsHome"},
|
|
11
|
+
{"url": "/schedule", "path": "src/routes/schedule.index.tsx", "jsName": "SchedulePage"},
|
|
12
|
+
{"url": "/speakers", "path": "src/routes/speakers.index.tsx", "jsName": "SpeakersPage"},
|
|
13
|
+
{"url": "/speakers/$slug", "path": "src/routes/speakers.$slug.tsx", "jsName": "SpeakerDetail"},
|
|
14
|
+
{"url": "/talks", "path": "src/routes/talks.index.tsx", "jsName": "TalksPage"},
|
|
15
|
+
{"url": "/talks/$slug", "path": "src/routes/talks.$slug.tsx", "jsName": "TalkDetail"},
|
|
16
|
+
{"url": "/api/remy-chat", "path": "src/routes/api.remy-chat.ts", "jsName": "RemyChatAPI"}
|
|
52
17
|
],
|
|
18
|
+
"features": ["tanstack-start", "content-collections", "tanstack-ai"],
|
|
19
|
+
"integrations": [{"type": "vite-plugin", "import": "import contentCollections from '@content-collections/vite'", "code": "contentCollections()"}],
|
|
53
20
|
"dependsOn": [],
|
|
54
21
|
"variables": [],
|
|
55
|
-
"bareBones": {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
22
|
+
"bareBones": {"deleteFiles": ["public/background-2.jpg", "public/background-3.jpg", "public/background-4.jpg", "public/speakers/hans-mueller.jpg", "public/speakers/isabella-martinez.jpg", "public/speakers/kenji-nakamura.jpg", "public/speakers/marie-dubois.jpg", "public/speakers/priya-sharma.jpg", "public/talks/french-macaron-mastery.jpg", "public/talks/neapolitan-pizza-tradition-meets-innovation.jpg", "public/talks/savory-breads-of-the-mediterranean.jpg", "public/talks/sourdough-from-starter-to-masterpiece.jpg", "public/talks/the-art-of-the-perfect-tart.jpg", "public/talks/the-science-of-sugar.jpg", "public/talks/umami-in-pastry-east-meets-west.jpg"]},
|
|
23
|
+
"packageFileDescriptions": {
|
|
24
|
+
"content-collections.ts": "Content Collections: speakers, talks schemas.",
|
|
25
|
+
"content/speakers/andre-costa.md": "Speaker content: Andre Costa.",
|
|
26
|
+
"content/speakers/hans-mueller.md.ejs": "Speaker template: Hans Mueller.",
|
|
27
|
+
"content/speakers/isabella-martinez.md.ejs": "Speaker template: Isabella Martinez.",
|
|
28
|
+
"content/speakers/kenji-nakamura.md.ejs": "Speaker template: Kenji Nakamura.",
|
|
29
|
+
"content/speakers/marie-dubois.md.ejs": "Speaker template: Marie Dubois.",
|
|
30
|
+
"content/speakers/priya-sharma.md.ejs": "Speaker template: Priya Sharma.",
|
|
31
|
+
"content/talks/croissant-lamination-secrets.md": "Talk content: Croissant Lamination Secrets.",
|
|
32
|
+
"content/talks/french-macaron-mastery.md.ejs": "Talk template: French Macaron Mastery.",
|
|
33
|
+
"content/talks/neapolitan-pizza-tradition-meets-innovation.md.ejs": "Talk template.",
|
|
34
|
+
"content/talks/savory-breads-of-the-mediterranean.md.ejs": "Talk template.",
|
|
35
|
+
"content/talks/sourdough-from-starter-to-masterpiece.md.ejs": "Talk template.",
|
|
36
|
+
"content/talks/the-art-of-the-perfect-tart.md.ejs": "Talk template.",
|
|
37
|
+
"content/talks/the-science-of-sugar.md.ejs": "Talk template.",
|
|
38
|
+
"content/talks/umami-in-pastry-east-meets-west.md.ejs": "Talk template.",
|
|
39
|
+
"src/styles.css": "Global styles: Tailwind, prose.",
|
|
40
|
+
"src/routes/index.tsx": "Conference home: hero carousel, RemyAssistant.",
|
|
41
|
+
"src/routes/schedule.index.tsx": "Schedule page.",
|
|
42
|
+
"src/routes/speakers.index.tsx": "Speakers list.",
|
|
43
|
+
"src/routes/speakers.$slug.tsx": "Speaker detail by slug.",
|
|
44
|
+
"src/routes/talks.index.tsx": "Talks list.",
|
|
45
|
+
"src/routes/talks.$slug.tsx": "Talk detail by slug.",
|
|
46
|
+
"src/routes/api.remy-chat.ts": "POST handler for Remy AI chat with conference tools.",
|
|
47
|
+
"src/routes/__root.tsx": "Root layout: HeaderNav, styles.",
|
|
48
|
+
"src/lib/utils.ts": "cn() helper.",
|
|
49
|
+
"src/lib/model-selection.ts": "AI model selection utilities.",
|
|
50
|
+
"src/lib/conference-tools.ts": "AI tools for speakers, talks, schedule.",
|
|
51
|
+
"src/lib/conference-ai-hook.ts": "useRemyChat hook.",
|
|
52
|
+
"src/components/Header.tsx": "Header component.",
|
|
53
|
+
"src/components/HeaderNav.tsx": "Navigation component.",
|
|
54
|
+
"src/components/HeroCarousel.tsx": "Hero image carousel.",
|
|
55
|
+
"src/components/RemyAssistant.tsx": "Remy AI assistant for conference Q&A.",
|
|
56
|
+
"src/components/SpeakerCard.tsx": "Speaker card display.",
|
|
57
|
+
"src/components/TalkCard.tsx": "Talk card display.",
|
|
58
|
+
"src/components/ui/card.tsx": "Card UI component.",
|
|
59
|
+
"public/tanstack-word-logo-white.svg": "TanStack logo."
|
|
73
60
|
}
|
|
74
61
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
### Marketing Site with AI Assistant
|
|
2
|
+
|
|
3
|
+
Motorcycle marketing site with TanStack AI chat assistant. No Stripe checkout.
|
|
4
|
+
|
|
5
|
+
**AI tools available:**
|
|
6
|
+
- `getMotorcycles` - Get all motorcycles from catalog
|
|
7
|
+
- `recommendMotorcycle` - Display motorcycle recommendation card (MUST use for recommendations)
|
|
8
|
+
|
|
9
|
+
**Components:** MotorcycleAIAssistant, MotorcycleRecommendation
|
|
10
|
+
|
|
11
|
+
**Dependencies:** @tanstack/ai, streamdown
|
|
12
|
+
|
|
13
|
+
## Environment Variables
|
|
14
|
+
|
|
15
|
+
For AI: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OLLAMA_BASE_URL (same as ai add-on).
|
|
@@ -7,32 +7,27 @@
|
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
9
|
"routes": [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"path": "src/routes/index.tsx",
|
|
14
|
-
"jsName": "MotorcyclesIndex"
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"url": "/motorcycles/$motorcycleId",
|
|
18
|
-
"path": "src/routes/motorcycles/$motorcycleId.tsx",
|
|
19
|
-
"jsName": "MotorcycleDetail"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"url": "/api/motorcycle-chat",
|
|
23
|
-
"path": "src/routes/api.motorcycle-chat.ts",
|
|
24
|
-
"jsName": "MotorcycleChatAPI"
|
|
25
|
-
}
|
|
10
|
+
{"url": "/", "name": "Home", "path": "src/routes/index.tsx", "jsName": "MotorcyclesIndex"},
|
|
11
|
+
{"url": "/motorcycles/$motorcycleId", "path": "src/routes/motorcycles/$motorcycleId.tsx", "jsName": "MotorcycleDetail"},
|
|
12
|
+
{"url": "/api/motorcycle-chat", "path": "src/routes/api.motorcycle-chat.ts", "jsName": "MotorcycleChatAPI"}
|
|
26
13
|
],
|
|
14
|
+
"features": ["tanstack-start", "tanstack-ai"],
|
|
27
15
|
"integrations": [],
|
|
28
16
|
"dependsOn": [],
|
|
29
17
|
"variables": [],
|
|
30
|
-
"bareBones": {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
"bareBones": {"deleteFiles": ["public/motorcycle-adventure.jpg", "public/motorcycle-cruiser.jpg", "public/motorcycle-sport.jpg", "public/motorcycle-supersport.jpg"]},
|
|
19
|
+
"packageFileDescriptions": {
|
|
20
|
+
"src/routes/index.tsx": "Marketing home: motorcycle showcase, MotorcycleAIAssistant.",
|
|
21
|
+
"src/routes/motorcycles/$motorcycleId.tsx": "Motorcycle detail page with recommendation.",
|
|
22
|
+
"src/routes/api.motorcycle-chat.ts": "POST handler for motorcycle AI chat.",
|
|
23
|
+
"src/routes/__root.tsx": "Root layout: Header, styles.",
|
|
24
|
+
"src/styles.css": "Global styles.",
|
|
25
|
+
"src/data/motorcycles.ts.ejs": "Motorcycle catalog data template.",
|
|
26
|
+
"src/lib/motorcycle-tools.ts": "AI tools: getMotorcycles, recommendMotorcycle.",
|
|
27
|
+
"src/lib/motorcycle-ai-hook.ts": "useMotorcycleChat hook.",
|
|
28
|
+
"src/store/motorcycle-assistant.ts": "Zustand store for assistant state.",
|
|
29
|
+
"src/components/Header.tsx": "Header.",
|
|
30
|
+
"src/components/MotorcycleAIAssistant.tsx": "AI marketing assistant.",
|
|
31
|
+
"src/components/MotorcycleRecommendation.tsx": "Motorcycle recommendation card."
|
|
37
32
|
}
|
|
38
33
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
### Portfolio Integration
|
|
2
|
+
|
|
3
|
+
Developer portfolio with Content Collections (jobs, education, blog, projects) and ResumeAssistant.
|
|
4
|
+
|
|
5
|
+
**Content Collections:**
|
|
6
|
+
- `jobs` - jobTitle, company, startDate, endDate, location, tags, content
|
|
7
|
+
- `education` - school, summary, startDate, endDate, tags, content
|
|
8
|
+
- `blog` - title, date, summary, tags, author, content
|
|
9
|
+
- `projects` - title, description, tags, github, liveUrl, image, content
|
|
10
|
+
|
|
11
|
+
**AI tools available (ResumeAssistant):**
|
|
12
|
+
- `getJobsBySkill` - Query jobs by skill tag
|
|
13
|
+
- `getAllJobs` - Get all work experience
|
|
14
|
+
- `getAllEducation` - Get education history
|
|
15
|
+
- `searchExperience` - Full-text search across resume
|
|
16
|
+
|
|
17
|
+
**Routes:** /, /resume, /projects, /contact, /blog/$slug
|
|
18
|
+
|
|
19
|
+
## Environment Variables
|
|
20
|
+
|
|
21
|
+
For AI: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OLLAMA_BASE_URL (same as ai add-on).
|
|
@@ -7,50 +7,44 @@
|
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
9
|
"routes": [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"url": "/resume",
|
|
17
|
-
"name": "Resume",
|
|
18
|
-
"icon": "FileText",
|
|
19
|
-
"path": "src/routes/resume.tsx",
|
|
20
|
-
"jsName": "Resume"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"url": "/projects",
|
|
24
|
-
"name": "Projects",
|
|
25
|
-
"icon": "FolderGit2",
|
|
26
|
-
"path": "src/routes/projects.tsx",
|
|
27
|
-
"jsName": "Projects"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"url": "/contact",
|
|
31
|
-
"name": "Contact",
|
|
32
|
-
"icon": "Mail",
|
|
33
|
-
"path": "src/routes/contact.tsx",
|
|
34
|
-
"jsName": "Contact"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"url": "/blog/$slug",
|
|
38
|
-
"path": "src/routes/blog/$slug.tsx",
|
|
39
|
-
"jsName": "BlogPost"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"url": "/api/resume-chat",
|
|
43
|
-
"path": "src/routes/api.resume-chat.ts",
|
|
44
|
-
"jsName": "ResumeChatAPI"
|
|
45
|
-
}
|
|
46
|
-
],
|
|
47
|
-
"integrations": [
|
|
48
|
-
{
|
|
49
|
-
"type": "vite-plugin",
|
|
50
|
-
"import": "import contentCollections from '@content-collections/vite'",
|
|
51
|
-
"code": "contentCollections()"
|
|
52
|
-
}
|
|
10
|
+
{"url": "/", "path": "src/routes/index.tsx", "jsName": "BlogIndex"},
|
|
11
|
+
{"url": "/resume", "name": "Resume", "icon": "FileText", "path": "src/routes/resume.tsx", "jsName": "Resume"},
|
|
12
|
+
{"url": "/projects", "name": "Projects", "icon": "FolderGit2", "path": "src/routes/projects.tsx", "jsName": "Projects"},
|
|
13
|
+
{"url": "/contact", "name": "Contact", "icon": "Mail", "path": "src/routes/contact.tsx", "jsName": "Contact"},
|
|
14
|
+
{"url": "/blog/$slug", "path": "src/routes/blog/$slug.tsx", "jsName": "BlogPost"},
|
|
15
|
+
{"url": "/api/resume-chat", "path": "src/routes/api.resume-chat.ts", "jsName": "ResumeChatAPI"}
|
|
53
16
|
],
|
|
17
|
+
"features": ["tanstack-start", "content-collections", "netlify-forms"],
|
|
18
|
+
"integrations": [{"type": "vite-plugin", "import": "import contentCollections from '@content-collections/vite'", "code": "contentCollections()"}],
|
|
54
19
|
"dependsOn": [],
|
|
55
|
-
"variables": []
|
|
20
|
+
"variables": [],
|
|
21
|
+
"packageFileDescriptions": {
|
|
22
|
+
"content-collections.ts": "Content Collections: jobs, education, blog, projects schemas.",
|
|
23
|
+
"content/jobs/initech-junior.md": "Job content: Initech Junior.",
|
|
24
|
+
"content/education/code-school.md": "Education content: Code School.",
|
|
25
|
+
"content/blog/getting-started-with-tanstack.md": "Blog post.",
|
|
26
|
+
"content/blog/react-19-features.md": "Blog post.",
|
|
27
|
+
"content/blog/tailwind-css-v4-guide.md": "Blog post.",
|
|
28
|
+
"content/projects/portfolio-site.md": "Project content.",
|
|
29
|
+
"content/projects/task-manager.md": "Project content.",
|
|
30
|
+
"src/styles.css": "Global styles.",
|
|
31
|
+
"src/routes/index.tsx": "Portfolio home: blog index.",
|
|
32
|
+
"src/routes/resume.tsx": "Resume page with ResumeAssistant.",
|
|
33
|
+
"src/routes/projects.tsx": "Projects page.",
|
|
34
|
+
"src/routes/contact.tsx": "Contact page.",
|
|
35
|
+
"src/routes/blog/$slug.tsx": "Blog post detail.",
|
|
36
|
+
"src/routes/api.resume-chat.ts": "POST handler for resume AI chat with getJobsBySkill, getAllJobs, etc.",
|
|
37
|
+
"src/routes/__root.tsx": "Root layout.",
|
|
38
|
+
"src/lib/utils.ts": "cn() helper.",
|
|
39
|
+
"src/lib/resume-tools.ts": "AI tools: getJobsBySkill, getAllJobs, getAllEducation, searchExperience.",
|
|
40
|
+
"src/lib/resume-ai-hook.ts": "useResumeChat hook.",
|
|
41
|
+
"src/components/Header.tsx": "Header.",
|
|
42
|
+
"src/components/ResumeAssistant.tsx": "Resume AI assistant.",
|
|
43
|
+
"src/components/ui/badge.tsx": "Badge component.",
|
|
44
|
+
"src/components/ui/card.tsx": "Card component.",
|
|
45
|
+
"src/components/ui/checkbox.tsx": "Checkbox component.",
|
|
46
|
+
"src/components/ui/hover-card.tsx": "HoverCard component.",
|
|
47
|
+
"src/components/ui/separator.tsx": "Separator component.",
|
|
48
|
+
"public/contact.html": "Static contact form."
|
|
49
|
+
}
|
|
56
50
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
### Resume Integration
|
|
2
|
+
|
|
3
|
+
Professional resume template with Content Collections and shadcn-style Radix UI.
|
|
4
|
+
|
|
5
|
+
**Content Collections:**
|
|
6
|
+
- `jobs` - jobTitle, company, startDate, endDate, location, tags, content
|
|
7
|
+
- `education` - school, summary, startDate, endDate, tags, content
|
|
8
|
+
|
|
9
|
+
**AI tools available (ResumeAssistant):**
|
|
10
|
+
- `getJobsBySkill` - Query jobs by skill tag
|
|
11
|
+
- `getAllJobs` - Get all work experience
|
|
12
|
+
- `getAllEducation` - Get education history
|
|
13
|
+
- `searchExperience` - Full-text search across resume
|
|
14
|
+
|
|
15
|
+
**UI components:** Radix Checkbox, HoverCard, Separator, Badge, Card
|
|
16
|
+
|
|
17
|
+
## Environment Variables
|
|
18
|
+
|
|
19
|
+
For AI: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, or OLLAMA_BASE_URL (same as ai add-on).
|
|
@@ -6,20 +6,30 @@
|
|
|
6
6
|
"type": "example",
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
|
-
"routes": [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"path": "src/routes/index.tsx",
|
|
13
|
-
"jsName": "ResumeHome"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"integrations": [
|
|
17
|
-
{
|
|
18
|
-
"type": "vite-plugin",
|
|
19
|
-
"import": "import contentCollections from '@content-collections/vite'",
|
|
20
|
-
"code": "contentCollections()"
|
|
21
|
-
}
|
|
22
|
-
],
|
|
9
|
+
"routes": [{"url": "/", "path": "src/routes/index.tsx", "jsName": "ResumeHome"}],
|
|
10
|
+
"features": ["tanstack-start", "content-collections", "tanstack-ai"],
|
|
11
|
+
"integrations": [{"type": "vite-plugin", "import": "import contentCollections from '@content-collections/vite'", "code": "contentCollections()"}],
|
|
23
12
|
"dependsOn": [],
|
|
24
|
-
"variables": []
|
|
13
|
+
"variables": [],
|
|
14
|
+
"packageFileDescriptions": {
|
|
15
|
+
"content-collections.ts": "Content Collections: jobs, education schemas.",
|
|
16
|
+
"content/jobs/initech-junior.md": "Job content: Initech Junior.",
|
|
17
|
+
"content/jobs/freelance.md.ejs": "Job template: Freelance.",
|
|
18
|
+
"content/jobs/initech-lead.md.ejs": "Job template: Initech Lead.",
|
|
19
|
+
"content/jobs/initrode-senior.md.ejs": "Job template: Initrode Senior.",
|
|
20
|
+
"content/education/code-school.md": "Education content: Code School.",
|
|
21
|
+
"src/styles.css": "Global styles.",
|
|
22
|
+
"src/routes/index.tsx": "Resume home: full resume with ResumeAssistant.",
|
|
23
|
+
"src/routes/api.resume-chat.ts": "POST handler for resume AI chat.",
|
|
24
|
+
"src/lib/utils.ts": "cn() helper.",
|
|
25
|
+
"src/lib/resume-tools.ts": "AI tools: getJobsBySkill, getAllJobs, getAllEducation, searchExperience.",
|
|
26
|
+
"src/lib/resume-ai-hook.ts": "useResumeChat hook.",
|
|
27
|
+
"src/components/Header.tsx": "Header.",
|
|
28
|
+
"src/components/ResumeAssistant.tsx": "Resume AI assistant.",
|
|
29
|
+
"src/components/ui/badge.tsx": "Badge component.",
|
|
30
|
+
"src/components/ui/card.tsx": "Card component.",
|
|
31
|
+
"src/components/ui/checkbox.tsx": "Checkbox component.",
|
|
32
|
+
"src/components/ui/hover-card.tsx": "HoverCard component.",
|
|
33
|
+
"src/components/ui/separator.tsx": "Separator component."
|
|
34
|
+
}
|
|
25
35
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
### SaaS Landing Page
|
|
2
|
+
|
|
3
|
+
Landing page with pricing tiers, features section, and FAQ accordion.
|
|
4
|
+
|
|
5
|
+
**Routes:** / (hero, pricing, features), /faq (accordion Q&A)
|
|
6
|
+
|
|
7
|
+
**FAQ:** ChevronDown accordion with expand/collapse; pricing tiers: Starter (free), Pro, Enterprise
|
|
8
|
+
|
|
9
|
+
No special dependencies or environment variables beyond base TanStack Start.
|
package/examples/saas/info.json
CHANGED
|
@@ -7,20 +7,17 @@
|
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
9
|
"routes": [
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
"path": "src/routes/index.tsx",
|
|
13
|
-
"jsName": "Home"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"url": "/faq",
|
|
17
|
-
"name": "FAQ",
|
|
18
|
-
"icon": "HelpCircle",
|
|
19
|
-
"path": "src/routes/faq.tsx",
|
|
20
|
-
"jsName": "FAQ"
|
|
21
|
-
}
|
|
10
|
+
{"url": "/", "path": "src/routes/index.tsx", "jsName": "Home"},
|
|
11
|
+
{"url": "/faq", "name": "FAQ", "icon": "HelpCircle", "path": "src/routes/faq.tsx", "jsName": "FAQ"}
|
|
22
12
|
],
|
|
13
|
+
"features": ["tanstack-start"],
|
|
23
14
|
"integrations": [],
|
|
24
15
|
"dependsOn": [],
|
|
25
|
-
"variables": []
|
|
16
|
+
"variables": [],
|
|
17
|
+
"packageFileDescriptions": {
|
|
18
|
+
"src/routes/index.tsx": "Landing page: hero, pricing, features.",
|
|
19
|
+
"src/routes/faq.tsx": "FAQ page: accordion with Acme SaaS Q&A.",
|
|
20
|
+
"src/routes/__root.tsx": "Root layout: Header, styles.",
|
|
21
|
+
"src/components/Header.tsx": "Header with nav links."
|
|
22
|
+
}
|
|
26
23
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
### Netlify Forms Survey
|
|
2
|
+
|
|
3
|
+
Movie survey form using Netlify Forms.
|
|
4
|
+
|
|
5
|
+
**Form:** `best-movie-survey` - name, movie select, reason textarea
|
|
6
|
+
**Spam protection:** `netlify-honeypot="bot-field"` + hidden bot-field input
|
|
7
|
+
**Detection:** `public/form-survey.html` declares the form (hidden) for Netlify build detection
|
|
8
|
+
|
|
9
|
+
No environment variables. Works after deploy to Netlify.
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
"type": "example",
|
|
7
7
|
"priority": 10,
|
|
8
8
|
"link": "",
|
|
9
|
-
"routes": [
|
|
10
|
-
|
|
11
|
-
"url": "/",
|
|
12
|
-
"path": "src/routes/index.tsx",
|
|
13
|
-
"jsName": "Home"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
9
|
+
"routes": [{"url": "/", "path": "src/routes/index.tsx", "jsName": "Home"}],
|
|
10
|
+
"features": ["tanstack-start", "netlify-forms"],
|
|
16
11
|
"integrations": [],
|
|
17
12
|
"dependsOn": [],
|
|
18
|
-
"variables": []
|
|
13
|
+
"variables": [],
|
|
14
|
+
"packageFileDescriptions": {
|
|
15
|
+
"src/routes/index.tsx": "Survey home: renders SurveyForm.",
|
|
16
|
+
"src/components/SurveyForm.tsx": "Movie survey: favorite pick, Netlify Forms with honeypot.",
|
|
17
|
+
"public/form-survey.html": "Static HTML form declaration for Netlify Forms."
|
|
18
|
+
}
|
|
19
19
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This document provides an overview of the project structure for developers and AI agents working on this codebase.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
An interactive resume/portfolio application with an AI-powered assistant. Built with TanStack Start and deployed on Netlify.
|
|
8
|
+
|
|
9
|
+
### Tech Stack
|
|
10
|
+
|
|
11
|
+
| Layer | Technology |
|
|
12
|
+
|-------|------------|
|
|
13
|
+
| Framework | TanStack Start |
|
|
14
|
+
| Frontend | React 19, TanStack Router v1 |
|
|
15
|
+
| Build | Vite 7 |
|
|
16
|
+
| Styling | Tailwind CSS 4 |
|
|
17
|
+
| UI Components | Radix UI + custom components |
|
|
18
|
+
| Content | Content Collections (type-safe markdown) |
|
|
19
|
+
| AI | TanStack AI with multi-provider support |
|
|
20
|
+
| Language | TypeScript 5.7 (strict mode) |
|
|
21
|
+
| Deployment | Netlify |
|
|
22
|
+
|
|
23
|
+
## Directory Structure
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
[[[DIRECTORY STRUCTURE]]]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Key Concepts
|
|
30
|
+
|
|
31
|
+
### File-Based Routing (TanStack Router)
|
|
32
|
+
|
|
33
|
+
Routes are defined by files in `src/routes/`:
|
|
34
|
+
|
|
35
|
+
- `__root.tsx` - Root layout wrapping all pages
|
|
36
|
+
- `index.tsx` - Route for `/`
|
|
37
|
+
- `api.*.ts` - Server API endpoints (e.g., `api.resume-chat.ts` → `/api/resume-chat`)
|
|
38
|
+
|
|
39
|
+
### Component Architecture
|
|
40
|
+
|
|
41
|
+
**UI Primitives** (`src/components/ui/`):
|
|
42
|
+
- Radix UI-based, Tailwind-styled
|
|
43
|
+
- Card, Badge, Checkbox, Separator, HoverCard
|
|
44
|
+
|
|
45
|
+
**Feature Components** (`src/components/`):
|
|
46
|
+
- Header, HeaderNav, ResumeAssistant
|
|
47
|
+
|
|
48
|
+
## Configuration Files
|
|
49
|
+
|
|
50
|
+
| File | Purpose |
|
|
51
|
+
|------|---------|
|
|
52
|
+
| `vite.config.ts` | Vite plugins: TanStack Start, Netlify, Tailwind, Content Collections |
|
|
53
|
+
| `tsconfig.json` | TypeScript config with `@/*` path alias for `src/*` |
|
|
54
|
+
| `netlify.toml` | Build command, output directory, dev server settings |
|
|
55
|
+
| `content-collections.ts` | Zod schemas for jobs and education frontmatter |
|
|
56
|
+
| `styles.css` | Tailwind imports + CSS custom properties (oklch colors) |
|
|
57
|
+
|
|
58
|
+
## Development Commands
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm run dev # Start dev server
|
|
62
|
+
npm run build # Production build
|
|
63
|
+
npm run preview # Preview production build
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Conventions
|
|
67
|
+
|
|
68
|
+
### Naming
|
|
69
|
+
- Components: PascalCase
|
|
70
|
+
- Utilities/hooks: camelCase
|
|
71
|
+
- Routes: kebab-case files
|
|
72
|
+
|
|
73
|
+
### Styling
|
|
74
|
+
- Tailwind CSS utility classes
|
|
75
|
+
- `cn()` helper for conditional class merging
|
|
76
|
+
- CSS variables for theme tokens in `styles.css`
|
|
77
|
+
|
|
78
|
+
### TypeScript
|
|
79
|
+
- Strict mode enabled
|
|
80
|
+
- Import paths use `@/` alias
|
|
81
|
+
- Zod for runtime validation
|
|
82
|
+
- Type-only imports with `type` keyword
|
|
83
|
+
|
|
84
|
+
### State Management
|
|
85
|
+
- React hooks for local state
|
|
86
|
+
- Zustand if you need it for global state
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packageFileDescriptions": {
|
|
3
|
+
"AGENTS.md": "This document provides an overview of the project structure for developers and AI agents working on this codebase.",
|
|
4
|
+
"netlify.toml": "Netlify deployment config: build command (vite build), publish directory (dist/client), and dev server settings (port 8888, target 3000).",
|
|
5
|
+
"package.json": "Project manifest with TanStack Start, React 19, Vite 7, Tailwind CSS 4, and Netlify plugin dependencies; defines dev and build scripts.",
|
|
6
|
+
"vite.config.ts.ejs": "Vite config template: TanStack Start, React, Tailwind, Netlify plugin, and optional add-on integrations; processed by EJS.",
|
|
7
|
+
"tsconfig.json": "TypeScript config: ES2022 target, strict mode, @/* path alias for src/*, bundler module resolution.",
|
|
8
|
+
"src/styles.css": "Global styles: Tailwind import plus base body/code font styling.",
|
|
9
|
+
"src/routes/index.tsx": "Home route (/) with TanStack Start welcome/landing page and links to docs.",
|
|
10
|
+
"src/routes/__root.tsx": "Root layout: HTML shell, HeadContent, Header, styles, TanStack Devtools, and child route outlet.",
|
|
11
|
+
"src/router.tsx": "TanStack Router setup: creates router from generated routeTree with scroll restoration.",
|
|
12
|
+
"src/components/HeaderNav.tsx.ejs": "Navigation sidebar template: mobile menu, Home link, add-on routes; EJS-driven for dynamic route generation.",
|
|
13
|
+
"src/components/Header.tsx": "Header component wrapping HeaderNav and site title link.",
|
|
14
|
+
"public/tanstack-word-logo-white.svg": "TanStack wordmark logo (white) used in header/nav.",
|
|
15
|
+
"_dot_gitignore": "Template for .gitignore: node_modules, dist, .env, .netlify, .tanstack, etc."
|
|
16
|
+
}
|
|
17
|
+
}
|