shipfolio 1.0.2 → 1.0.4

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.
@@ -1,40 +1,168 @@
1
1
  // src/orchestrator/prompt-builder.ts
2
- import { readFile } from "fs/promises";
3
- import { join, dirname } from "path";
4
- import { fileURLToPath } from "url";
5
- function getPromptsDir() {
6
- const currentDir = dirname(fileURLToPath(import.meta.url));
7
- const candidates = [
8
- join(currentDir, "../../prompts"),
9
- join(currentDir, "../prompts"),
10
- join(currentDir, "../../../prompts")
11
- ];
12
- return candidates[0];
13
- }
14
- async function loadTemplate(filename) {
15
- const promptsDir = getPromptsDir();
16
- const candidates = [
17
- join(promptsDir, filename),
18
- join(dirname(fileURLToPath(import.meta.url)), "../../prompts", filename),
19
- join(dirname(fileURLToPath(import.meta.url)), "../../../prompts", filename)
20
- ];
21
- for (const candidate of candidates) {
22
- try {
23
- return await readFile(candidate, "utf-8");
24
- } catch {
25
- continue;
26
- }
27
- }
28
- throw new Error(`Prompt template not found: ${filename}`);
29
- }
2
+ var FRESH_BUILD_TEMPLATE = `# Task
3
+
4
+ Generate a complete, production-ready personal portfolio website.
5
+ All data and design preferences are provided in the spec below.
6
+ Output a fully working Next.js project that builds and deploys as a static site.
7
+
8
+ # Spec
9
+
10
+ {{SPEC_JSON}}
11
+
12
+ # Technical Requirements
13
+
14
+ - Next.js 15 with App Router and TypeScript
15
+ - Tailwind CSS v4 for styling
16
+ - shadcn/ui components (initialize with \`npx shadcn@latest init --yes\`)
17
+ - Static export: set \`output: 'export'\` in next.config.ts
18
+ - Build command: \`npm run build\` producing \`out/\` directory
19
+ - Zero external API calls at runtime -- all data is embedded in source
20
+ - All project data in \`src/data/projects.ts\` as typed constants
21
+ - Include \`@media print\` stylesheet in \`src/app/globals.css\` for PDF export
22
+ - Responsive: mobile-first with Tailwind breakpoints (sm, md, lg, xl)
23
+ - Lighthouse performance score 95+
24
+ - Semantic HTML with ARIA labels and keyboard navigation
25
+ - No emoji anywhere in text, UI, code, or comments
26
+ - Use lucide-react for icons
27
+
28
+ # Design Direction
29
+
30
+ - Theme: {{THEME}}
31
+ - Accent color: {{ACCENT_COLOR}}
32
+ - Animation level: {{ANIMATION_LEVEL}}
33
+ - Font: {{FONT}}
34
+
35
+ Design guidelines:
36
+ - Typography-driven layout with large, bold headings
37
+ - Generous whitespace between sections
38
+ - Single accent color for interactive elements and highlights only
39
+ - Project cards should feel substantial but clean
40
+ - The site must look hand-crafted, not template-generated
41
+ - Dark themes: use zinc/slate backgrounds, not pure black
42
+ - Light themes: use warm whites and subtle grays
43
+
44
+ # Content Generation
45
+
46
+ For each project in the spec:
47
+ - Write a 2-3 sentence narrative description based on the README content and tech stack
48
+ - Focus on what it does and why it matters
49
+ - If user provided an override description, use that instead
50
+ - Maintain consistent voice across all descriptions
51
+
52
+ For the bio (if set to "auto"):
53
+ - Generate a professional, authentic bio based on the project portfolio
54
+ - Emphasize shipping velocity and breadth
55
+ - Tone: confident, direct, no buzzwords or fluff
56
+
57
+ # Sections to Include
58
+
59
+ {{SECTIONS_LIST}}
60
+
61
+ Hero and Projects are always included. Additional sections as specified.
62
+
63
+ # Print / PDF Styles
64
+
65
+ In globals.css, add @media print rules:
66
+ - Single-column layout
67
+ - Hide navigation, footer, animations
68
+ - Preserve background colors (user will print with backgrounds enabled)
69
+ - Show link URLs inline: \`a[href]::after { content: " (" attr(href) ")"; }\`
70
+ - Avoid page breaks inside project cards
71
+ - A4-friendly margins and font sizes
72
+
73
+ # File Structure to Generate
74
+
75
+ \`\`\`
76
+ next.config.ts
77
+ package.json
78
+ tailwind.config.ts
79
+ tsconfig.json
80
+ postcss.config.mjs
81
+ components.json
82
+ src/app/layout.tsx
83
+ src/app/page.tsx
84
+ src/app/globals.css
85
+ src/components/ui/ (shadcn components as needed)
86
+ src/components/hero.tsx
87
+ src/components/project-card.tsx
88
+ src/components/project-grid.tsx
89
+ src/components/skills.tsx
90
+ src/components/about.tsx
91
+ src/components/timeline.tsx
92
+ src/components/contact.tsx
93
+ src/components/navigation.tsx
94
+ src/components/footer.tsx
95
+ src/data/projects.ts
96
+ src/data/owner.ts
97
+ src/lib/utils.ts
98
+ public/favicon.svg
99
+ shipfolio.config.json
100
+ \`\`\`
101
+
102
+ # Important
103
+
104
+ - Generate ALL files needed for the project to build successfully
105
+ - Include all shadcn/ui component files that are referenced
106
+ - The \`package.json\` must include all dependencies
107
+ - \`npm install && npm run build\` must succeed without errors
108
+ - Do not use next/image (incompatible with static export) -- use standard <img> tags
109
+ - Do not use features that require a server (API routes, middleware, ISR)
110
+ `;
111
+ var UPDATE_TEMPLATE = `# Task
112
+
113
+ Update an existing portfolio website previously generated by shipfolio.
114
+ You must preserve the existing design system, layout structure, component
115
+ architecture, and any custom modifications the user has made.
116
+
117
+ # Existing Site Configuration
118
+
119
+ {{EXISTING_CONFIG_JSON}}
120
+
121
+ # Changes to Apply
122
+
123
+ ## New Projects to Add
124
+ {{NEW_PROJECTS}}
125
+
126
+ ## Projects to Update (new commits since last scan)
127
+ {{UPDATED_PROJECTS}}
128
+
129
+ ## Projects to Remove
130
+ {{REMOVED_PROJECTS}}
131
+
132
+ ## Updated Personal Info
133
+ {{PERSONAL_INFO_DIFF}}
134
+
135
+ # Rules
136
+
137
+ 1. Do NOT change the overall layout, color scheme, or design system
138
+ 2. Do NOT reorganize existing components or rename files
139
+ 3. Only modify files that need changes for the specified updates
140
+ 4. For new projects: follow the exact same card format and component pattern
141
+ as existing project cards
142
+ 5. Preserve all custom CSS, custom components, and manual edits
143
+ 6. Update src/data/projects.ts with new/changed/removed project data
144
+ 7. Update src/data/owner.ts if personal info changed
145
+ 8. Update shipfolio.config.json with new timestamps and project list
146
+ 9. If a new section type is needed, create it following the existing
147
+ component patterns and design tokens in the codebase
148
+ 10. No emoji anywhere
149
+
150
+ # Technical Notes
151
+
152
+ - The site uses Next.js 15 + Tailwind CSS + shadcn/ui
153
+ - Static export via \`output: 'export'\` in next.config.ts
154
+ - Do not break the build -- \`npm run build\` must succeed
155
+ - Do not add new dependencies unless absolutely necessary
156
+ - Keep the existing @media print styles working
157
+ `;
30
158
  async function buildFreshPrompt(spec) {
31
- let template = await loadTemplate("fresh-build.md");
159
+ let template = FRESH_BUILD_TEMPLATE;
32
160
  const sectionsText = spec.sections.map((s) => `- ${s}`).join("\n");
33
161
  template = template.replace("{{SPEC_JSON}}", JSON.stringify(spec, null, 2)).replace("{{THEME}}", spec.style.theme).replace("{{ACCENT_COLOR}}", spec.style.accentColor).replace("{{ANIMATION_LEVEL}}", spec.style.animationLevel).replace("{{FONT}}", spec.style.font).replace("{{SECTIONS_LIST}}", sectionsText);
34
162
  return template;
35
163
  }
36
164
  async function buildUpdatePrompt(existingConfig, diff) {
37
- let template = await loadTemplate("update.md");
165
+ let template = UPDATE_TEMPLATE;
38
166
  const newProjectsText = diff.newProjects.length > 0 ? diff.newProjects.map(
39
167
  (p) => `- ${p.name}: ${p.description}
40
168
  Tech: ${p.techStack.join(", ")}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/orchestrator/prompt-builder.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ShipfolioSpec, ShipfolioConfig, SiteDiff } from \"../spec/schema.js\";\n\nfunction getPromptsDir(): string {\n // In development: relative to src/orchestrator/\n // In built: relative to dist/\n const currentDir = dirname(fileURLToPath(import.meta.url));\n // Try multiple possible locations\n const candidates = [\n join(currentDir, \"../../prompts\"),\n join(currentDir, \"../prompts\"),\n join(currentDir, \"../../../prompts\"),\n ];\n return candidates[0]; // Default; will fail gracefully if not found\n}\n\nasync function loadTemplate(filename: string): Promise<string> {\n const promptsDir = getPromptsDir();\n // Try each candidate path\n const candidates = [\n join(promptsDir, filename),\n join(dirname(fileURLToPath(import.meta.url)), \"../../prompts\", filename),\n join(dirname(fileURLToPath(import.meta.url)), \"../../../prompts\", filename),\n ];\n\n for (const candidate of candidates) {\n try {\n return await readFile(candidate, \"utf-8\");\n } catch {\n continue;\n }\n }\n\n throw new Error(`Prompt template not found: ${filename}`);\n}\n\nexport async function buildFreshPrompt(spec: ShipfolioSpec): Promise<string> {\n let template = await loadTemplate(\"fresh-build.md\");\n\n const sectionsText = spec.sections\n .map((s) => `- ${s}`)\n .join(\"\\n\");\n\n template = template\n .replace(\"{{SPEC_JSON}}\", JSON.stringify(spec, null, 2))\n .replace(\"{{THEME}}\", spec.style.theme)\n .replace(\"{{ACCENT_COLOR}}\", spec.style.accentColor)\n .replace(\"{{ANIMATION_LEVEL}}\", spec.style.animationLevel)\n .replace(\"{{FONT}}\", spec.style.font)\n .replace(\"{{SECTIONS_LIST}}\", sectionsText);\n\n return template;\n}\n\nexport async function buildUpdatePrompt(\n existingConfig: ShipfolioConfig,\n diff: SiteDiff\n): Promise<string> {\n let template = await loadTemplate(\"update.md\");\n\n const newProjectsText =\n diff.newProjects.length > 0\n ? diff.newProjects\n .map(\n (p) =>\n `- ${p.name}: ${p.description}\\n Tech: ${p.techStack.join(\", \")}\\n README excerpt: ${(p.readmeContent || \"\").slice(0, 500)}`\n )\n .join(\"\\n\\n\")\n : \"None\";\n\n const updatedProjectsText =\n diff.updatedProjects.length > 0\n ? diff.updatedProjects\n .map(\n (u) =>\n `- ${u.project.name}: ${u.newCommits} new commits\\n README changed: ${u.readmeChanged}\\n Dependencies changed: ${u.depsChanged}`\n )\n .join(\"\\n\\n\")\n : \"None\";\n\n const removedProjectsText =\n diff.removedProjects.length > 0\n ? diff.removedProjects.map((p) => `- ${p.name}`).join(\"\\n\")\n : \"None\";\n\n template = template\n .replace(\n \"{{EXISTING_CONFIG_JSON}}\",\n JSON.stringify(existingConfig, null, 2)\n )\n .replace(\"{{NEW_PROJECTS}}\", newProjectsText)\n .replace(\"{{UPDATED_PROJECTS}}\", updatedProjectsText)\n .replace(\"{{REMOVED_PROJECTS}}\", removedProjectsText)\n .replace(\"{{PERSONAL_INFO_DIFF}}\", \"No changes\");\n\n return template;\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAG9B,SAAS,gBAAwB;AAG/B,QAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEzD,QAAM,aAAa;AAAA,IACjB,KAAK,YAAY,eAAe;AAAA,IAChC,KAAK,YAAY,YAAY;AAAA,IAC7B,KAAK,YAAY,kBAAkB;AAAA,EACrC;AACA,SAAO,WAAW,CAAC;AACrB;AAEA,eAAe,aAAa,UAAmC;AAC7D,QAAM,aAAa,cAAc;AAEjC,QAAM,aAAa;AAAA,IACjB,KAAK,YAAY,QAAQ;AAAA,IACzB,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,iBAAiB,QAAQ;AAAA,IACvE,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,oBAAoB,QAAQ;AAAA,EAC5E;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,aAAO,MAAM,SAAS,WAAW,OAAO;AAAA,IAC1C,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,8BAA8B,QAAQ,EAAE;AAC1D;AAEA,eAAsB,iBAAiB,MAAsC;AAC3E,MAAI,WAAW,MAAM,aAAa,gBAAgB;AAElD,QAAM,eAAe,KAAK,SACvB,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EACnB,KAAK,IAAI;AAEZ,aAAW,SACR,QAAQ,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,EACtD,QAAQ,aAAa,KAAK,MAAM,KAAK,EACrC,QAAQ,oBAAoB,KAAK,MAAM,WAAW,EAClD,QAAQ,uBAAuB,KAAK,MAAM,cAAc,EACxD,QAAQ,YAAY,KAAK,MAAM,IAAI,EACnC,QAAQ,qBAAqB,YAAY;AAE5C,SAAO;AACT;AAEA,eAAsB,kBACpB,gBACA,MACiB;AACjB,MAAI,WAAW,MAAM,aAAa,WAAW;AAE7C,QAAM,kBACJ,KAAK,YAAY,SAAS,IACtB,KAAK,YACF;AAAA,IACC,CAAC,MACC,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW;AAAA,UAAa,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,qBAAwB,EAAE,iBAAiB,IAAI,MAAM,GAAG,GAAG,CAAC;AAAA,EAChI,EACC,KAAK,MAAM,IACd;AAEN,QAAM,sBACJ,KAAK,gBAAgB,SAAS,IAC1B,KAAK,gBACF;AAAA,IACC,CAAC,MACC,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,UAAU;AAAA,oBAAmC,EAAE,aAAa;AAAA,0BAA6B,EAAE,WAAW;AAAA,EACpI,EACC,KAAK,MAAM,IACd;AAEN,QAAM,sBACJ,KAAK,gBAAgB,SAAS,IAC1B,KAAK,gBAAgB,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,IACxD;AAEN,aAAW,SACR;AAAA,IACC;AAAA,IACA,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EACxC,EACC,QAAQ,oBAAoB,eAAe,EAC3C,QAAQ,wBAAwB,mBAAmB,EACnD,QAAQ,wBAAwB,mBAAmB,EACnD,QAAQ,0BAA0B,YAAY;AAEjD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/orchestrator/prompt-builder.ts"],"sourcesContent":["import type { ShipfolioSpec, ShipfolioConfig, SiteDiff } from \"../spec/schema.js\";\n\nconst FRESH_BUILD_TEMPLATE = `# Task\n\nGenerate a complete, production-ready personal portfolio website.\nAll data and design preferences are provided in the spec below.\nOutput a fully working Next.js project that builds and deploys as a static site.\n\n# Spec\n\n{{SPEC_JSON}}\n\n# Technical Requirements\n\n- Next.js 15 with App Router and TypeScript\n- Tailwind CSS v4 for styling\n- shadcn/ui components (initialize with \\`npx shadcn@latest init --yes\\`)\n- Static export: set \\`output: 'export'\\` in next.config.ts\n- Build command: \\`npm run build\\` producing \\`out/\\` directory\n- Zero external API calls at runtime -- all data is embedded in source\n- All project data in \\`src/data/projects.ts\\` as typed constants\n- Include \\`@media print\\` stylesheet in \\`src/app/globals.css\\` for PDF export\n- Responsive: mobile-first with Tailwind breakpoints (sm, md, lg, xl)\n- Lighthouse performance score 95+\n- Semantic HTML with ARIA labels and keyboard navigation\n- No emoji anywhere in text, UI, code, or comments\n- Use lucide-react for icons\n\n# Design Direction\n\n- Theme: {{THEME}}\n- Accent color: {{ACCENT_COLOR}}\n- Animation level: {{ANIMATION_LEVEL}}\n- Font: {{FONT}}\n\nDesign guidelines:\n- Typography-driven layout with large, bold headings\n- Generous whitespace between sections\n- Single accent color for interactive elements and highlights only\n- Project cards should feel substantial but clean\n- The site must look hand-crafted, not template-generated\n- Dark themes: use zinc/slate backgrounds, not pure black\n- Light themes: use warm whites and subtle grays\n\n# Content Generation\n\nFor each project in the spec:\n- Write a 2-3 sentence narrative description based on the README content and tech stack\n- Focus on what it does and why it matters\n- If user provided an override description, use that instead\n- Maintain consistent voice across all descriptions\n\nFor the bio (if set to \"auto\"):\n- Generate a professional, authentic bio based on the project portfolio\n- Emphasize shipping velocity and breadth\n- Tone: confident, direct, no buzzwords or fluff\n\n# Sections to Include\n\n{{SECTIONS_LIST}}\n\nHero and Projects are always included. Additional sections as specified.\n\n# Print / PDF Styles\n\nIn globals.css, add @media print rules:\n- Single-column layout\n- Hide navigation, footer, animations\n- Preserve background colors (user will print with backgrounds enabled)\n- Show link URLs inline: \\`a[href]::after { content: \" (\" attr(href) \")\"; }\\`\n- Avoid page breaks inside project cards\n- A4-friendly margins and font sizes\n\n# File Structure to Generate\n\n\\`\\`\\`\nnext.config.ts\npackage.json\ntailwind.config.ts\ntsconfig.json\npostcss.config.mjs\ncomponents.json\nsrc/app/layout.tsx\nsrc/app/page.tsx\nsrc/app/globals.css\nsrc/components/ui/ (shadcn components as needed)\nsrc/components/hero.tsx\nsrc/components/project-card.tsx\nsrc/components/project-grid.tsx\nsrc/components/skills.tsx\nsrc/components/about.tsx\nsrc/components/timeline.tsx\nsrc/components/contact.tsx\nsrc/components/navigation.tsx\nsrc/components/footer.tsx\nsrc/data/projects.ts\nsrc/data/owner.ts\nsrc/lib/utils.ts\npublic/favicon.svg\nshipfolio.config.json\n\\`\\`\\`\n\n# Important\n\n- Generate ALL files needed for the project to build successfully\n- Include all shadcn/ui component files that are referenced\n- The \\`package.json\\` must include all dependencies\n- \\`npm install && npm run build\\` must succeed without errors\n- Do not use next/image (incompatible with static export) -- use standard <img> tags\n- Do not use features that require a server (API routes, middleware, ISR)\n`;\n\nconst UPDATE_TEMPLATE = `# Task\n\nUpdate an existing portfolio website previously generated by shipfolio.\nYou must preserve the existing design system, layout structure, component\narchitecture, and any custom modifications the user has made.\n\n# Existing Site Configuration\n\n{{EXISTING_CONFIG_JSON}}\n\n# Changes to Apply\n\n## New Projects to Add\n{{NEW_PROJECTS}}\n\n## Projects to Update (new commits since last scan)\n{{UPDATED_PROJECTS}}\n\n## Projects to Remove\n{{REMOVED_PROJECTS}}\n\n## Updated Personal Info\n{{PERSONAL_INFO_DIFF}}\n\n# Rules\n\n1. Do NOT change the overall layout, color scheme, or design system\n2. Do NOT reorganize existing components or rename files\n3. Only modify files that need changes for the specified updates\n4. For new projects: follow the exact same card format and component pattern\n as existing project cards\n5. Preserve all custom CSS, custom components, and manual edits\n6. Update src/data/projects.ts with new/changed/removed project data\n7. Update src/data/owner.ts if personal info changed\n8. Update shipfolio.config.json with new timestamps and project list\n9. If a new section type is needed, create it following the existing\n component patterns and design tokens in the codebase\n10. No emoji anywhere\n\n# Technical Notes\n\n- The site uses Next.js 15 + Tailwind CSS + shadcn/ui\n- Static export via \\`output: 'export'\\` in next.config.ts\n- Do not break the build -- \\`npm run build\\` must succeed\n- Do not add new dependencies unless absolutely necessary\n- Keep the existing @media print styles working\n`;\n\nexport async function buildFreshPrompt(spec: ShipfolioSpec): Promise<string> {\n let template = FRESH_BUILD_TEMPLATE;\n\n const sectionsText = spec.sections\n .map((s) => `- ${s}`)\n .join(\"\\n\");\n\n template = template\n .replace(\"{{SPEC_JSON}}\", JSON.stringify(spec, null, 2))\n .replace(\"{{THEME}}\", spec.style.theme)\n .replace(\"{{ACCENT_COLOR}}\", spec.style.accentColor)\n .replace(\"{{ANIMATION_LEVEL}}\", spec.style.animationLevel)\n .replace(\"{{FONT}}\", spec.style.font)\n .replace(\"{{SECTIONS_LIST}}\", sectionsText);\n\n return template;\n}\n\nexport async function buildUpdatePrompt(\n existingConfig: ShipfolioConfig,\n diff: SiteDiff\n): Promise<string> {\n let template = UPDATE_TEMPLATE;\n\n const newProjectsText =\n diff.newProjects.length > 0\n ? diff.newProjects\n .map(\n (p) =>\n `- ${p.name}: ${p.description}\\n Tech: ${p.techStack.join(\", \")}\\n README excerpt: ${(p.readmeContent || \"\").slice(0, 500)}`\n )\n .join(\"\\n\\n\")\n : \"None\";\n\n const updatedProjectsText =\n diff.updatedProjects.length > 0\n ? diff.updatedProjects\n .map(\n (u) =>\n `- ${u.project.name}: ${u.newCommits} new commits\\n README changed: ${u.readmeChanged}\\n Dependencies changed: ${u.depsChanged}`\n )\n .join(\"\\n\\n\")\n : \"None\";\n\n const removedProjectsText =\n diff.removedProjects.length > 0\n ? diff.removedProjects.map((p) => `- ${p.name}`).join(\"\\n\")\n : \"None\";\n\n template = template\n .replace(\n \"{{EXISTING_CONFIG_JSON}}\",\n JSON.stringify(existingConfig, null, 2)\n )\n .replace(\"{{NEW_PROJECTS}}\", newProjectsText)\n .replace(\"{{UPDATED_PROJECTS}}\", updatedProjectsText)\n .replace(\"{{REMOVED_PROJECTS}}\", removedProjectsText)\n .replace(\"{{PERSONAL_INFO_DIFF}}\", \"No changes\");\n\n return template;\n}\n"],"mappings":";AAEA,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8G7B,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDxB,eAAsB,iBAAiB,MAAsC;AAC3E,MAAI,WAAW;AAEf,QAAM,eAAe,KAAK,SACvB,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EACnB,KAAK,IAAI;AAEZ,aAAW,SACR,QAAQ,iBAAiB,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,EACtD,QAAQ,aAAa,KAAK,MAAM,KAAK,EACrC,QAAQ,oBAAoB,KAAK,MAAM,WAAW,EAClD,QAAQ,uBAAuB,KAAK,MAAM,cAAc,EACxD,QAAQ,YAAY,KAAK,MAAM,IAAI,EACnC,QAAQ,qBAAqB,YAAY;AAE5C,SAAO;AACT;AAEA,eAAsB,kBACpB,gBACA,MACiB;AACjB,MAAI,WAAW;AAEf,QAAM,kBACJ,KAAK,YAAY,SAAS,IACtB,KAAK,YACF;AAAA,IACC,CAAC,MACC,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW;AAAA,UAAa,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,qBAAwB,EAAE,iBAAiB,IAAI,MAAM,GAAG,GAAG,CAAC;AAAA,EAChI,EACC,KAAK,MAAM,IACd;AAEN,QAAM,sBACJ,KAAK,gBAAgB,SAAS,IAC1B,KAAK,gBACF;AAAA,IACC,CAAC,MACC,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,UAAU;AAAA,oBAAmC,EAAE,aAAa;AAAA,0BAA6B,EAAE,WAAW;AAAA,EACpI,EACC,KAAK,MAAM,IACd;AAEN,QAAM,sBACJ,KAAK,gBAAgB,SAAS,IAC1B,KAAK,gBAAgB,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,IACxD;AAEN,aAAW,SACR;AAAA,IACC;AAAA,IACA,KAAK,UAAU,gBAAgB,MAAM,CAAC;AAAA,EACxC,EACC,QAAQ,oBAAoB,eAAe,EAC3C,QAAQ,wBAAwB,mBAAmB,EACnD,QAAQ,wBAAwB,mBAAmB,EACnD,QAAQ,0BAA0B,YAAY;AAEjD,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shipfolio",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Generate and deploy your personal portfolio site from local projects using AI",
5
5
  "type": "module",
6
6
  "bin": {