chore(workflow): add AI-assisted workflow commands and configurations

Add comprehensive workflow commands for AI-assisted development:
- Claude commands: analyze, clarify, plan
- Kilocode workflows: full feature development lifecycle
- Opencode commands: specification and implementation workflows
- Roo MCP configuration for tool integration

Update .gitignore to exclude .astro build cache directories.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-07 01:06:10 +08:00
parent cf0f779ad4
commit c2d4c8d0a0
122 changed files with 5376 additions and 107 deletions

View File

@@ -0,0 +1,31 @@
---
import Layout from '../layouts/Layout.astro';
---
<Layout>
<section class="about-section">
<div class="container">
<h1>關於恩群</h1>
<div class="prose prose-custom max-w-none">
<p>恩群數位行銷有限公司成立於2018年專注於數位行銷服務。</p>
<p>我們擁有豐富的廣告行銷操作經驗,提供全方位行銷解決方案。</p>
<!-- Add more content from HTML -->
</div>
</div>
</section>
</Layout>
<style>
.about-section {
padding: 40px 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
</style>

View File

@@ -0,0 +1,30 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout>
<div class="cms-section">
<h1>Payload CMS</h1>
<p>The CMS is hosted on a separate subdomain for security.</p>
<a href="https://cms.enchun.tw/admin" class="btn" target="_blank">Open CMS</a>
</div>
</AdminLayout>
<style>
.cms-section {
text-align: center;
padding: 40px 0;
}
.btn {
display: inline-block;
background: #007bff;
color: white;
padding: 15px 30px;
text-decoration: none;
border-radius: 4px;
font-size: 18px;
}
.btn:hover {
background: #0056b3;
}
</style>

View File

@@ -0,0 +1,56 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout>
<div class="dashboard">
<h1>Admin Dashboard</h1>
<div class="dashboard-grid">
<div class="dashboard-card">
<h2>Content Management</h2>
<p>Manage blog posts, portfolios, and categories.</p>
<a href="/admin/cms" class="btn">Go to CMS</a>
</div>
<div class="dashboard-card">
<h2>Analytics</h2>
<p>View site analytics and performance metrics.</p>
<a href="#" class="btn">View Analytics</a>
</div>
</div>
</div>
</AdminLayout>
<style>
.dashboard {
max-width: 1200px;
margin: 0 auto;
}
h1 {
margin-bottom: 30px;
}
.dashboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.dashboard-card {
border: 1px solid #ddd;
padding: 20px;
border-radius: 8px;
background: #f9f9f9;
}
.dashboard-card h2 {
margin-top: 0;
}
.btn {
display: inline-block;
background: #007bff;
color: white;
padding: 10px 15px;
text-decoration: none;
border-radius: 4px;
}
.btn:hover {
background: #0056b3;
}
</style>

View File

@@ -0,0 +1,6 @@
---
// Admin login page - redirects to CMS subdomain
---
<meta http-equiv="refresh" content="0; url=https://cms.enchun.tw/admin/login" />
<p>Redirecting to login...</p>

View File

@@ -0,0 +1,85 @@
---
import Layout from '../layouts/Layout.astro';
---
<Layout>
<section class="contact-section">
<div class="container">
<h1>聯絡我們</h1>
<form id="contact-form">
<div class="form-group">
<label for="name">姓名</label>
<input type="text" id="name" name="name" required />
</div>
<div class="form-group">
<label for="email">電子郵件</label>
<input type="email" id="email" name="email" required />
</div>
<div class="form-group">
<label for="message">訊息</label>
<textarea id="message" name="message" required></textarea>
</div>
<button type="submit">送出</button>
</form>
<div class="contact-info">
<p>諮詢電話: 02 5570 0527</p>
<p>電子郵件: <a href="mailto:enchuntaiwan@gmail.com">enchuntaiwan@gmail.com</a></p>
</div>
</div>
</section>
</Layout>
<script>
// Basic form handler - would integrate with Cloudflare Worker
document.getElementById('contact-form')?.addEventListener('submit', async (e) => {
e.preventDefault();
// Submit to Cloudflare Worker
alert('Form submitted (placeholder)');
});
</script>
<style>
.contact-section {
padding: 40px 0;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 5px;
}
input, textarea {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
}
textarea {
height: 150px;
}
button {
background: #007bff;
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background: #0056b3;
}
.contact-info {
margin-top: 40px;
text-align: center;
}
</style>

View File

@@ -1,16 +1,47 @@
---
import '../styles/tailwind.css';
import Layout from '../layouts/Layout.astro';
---
<html lang="en">
<head>
<meta charset="utf-8" />
<title>enchun.tw</title>
</head>
<body class="bg-surface text-text">
<main class="mx-auto flex min-h-screen max-w-4xl flex-col items-center justify-center gap-6 px-4 text-center">
<h1 class="text-4xl font-semibold text-primary">enchun.tw migration scaffold</h1>
<p class="text-lg text-secondary">Astro SSR frontend is ready for development.</p>
</main>
</body>
</html>
<Layout>
<!-- Hero Section -->
<section class="bg-gradient-to-r from-primary to-secondary text-white py-20">
<div class="max-w-6xl mx-auto px-4 text-center">
<h1 class="text-4xl md:text-6xl font-bold mb-6">恩群數位行銷</h1>
<p class="text-xl md:text-2xl mb-8">累積多年廣告行銷操作經驗,全方位行銷人才,為您精準規劃每一分廣告預算</p>
<a href="/contact-us" class="bg-white text-primary px-8 py-3 rounded-lg font-semibold hover:bg-gray-100 transition-colors">聯絡我們</a>
</div>
</section>
<!-- Services Section -->
<section class="py-16 bg-surface">
<div class="max-w-6xl mx-auto px-4">
<h2 class="text-3xl font-bold text-center text-text mb-12">我們的服務</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="bg-white p-6 rounded-lg shadow-md">
<h3 class="text-xl font-semibold text-primary mb-4">Google Ads</h3>
<p class="text-text">專業的Google廣告投放服務幫助您的品牌觸及目標客戶。</p>
</div>
<div class="bg-white p-6 rounded-lg shadow-md">
<h3 class="text-xl font-semibold text-primary mb-4">社群行銷</h3>
<p class="text-text">全方位社群媒體經營,從內容策劃到數據分析,一站式服務。</p>
</div>
<div class="bg-white p-6 rounded-lg shadow-md">
<h3 class="text-xl font-semibold text-primary mb-4">網站設計</h3>
<p class="text-text">現代化響應式網站設計,提升品牌形象和用戶體驗。</p>
</div>
</div>
</div>
</section>
<!-- About Section -->
<section class="py-16">
<div class="max-w-6xl mx-auto px-4 text-center">
<h2 class="text-3xl font-bold text-text mb-8">關於恩群</h2>
<p class="text-lg text-text max-w-3xl mx-auto">
恩群數位行銷團隊擁有豐富的數位行銷經驗,我們相信在地化優先、高投資轉換率、數據優先、關係優於銷售。
每一個客戶都是我們重視的夥伴,我們珍惜與客戶的合作關係。
</p>
<a href="/about-enchun" class="inline-block mt-6 bg-primary text-white px-6 py-3 rounded-lg font-semibold hover:bg-primary/90 transition-colors">了解更多</a>
</div>
</section>
</Layout>

View File

@@ -0,0 +1,43 @@
---
import Layout from '../layouts/Layout.astro';
---
<Layout>
<section class="solutions-section">
<div class="container">
<h1>行銷方案</h1>
<p>我們提供多樣化的行銷方案,幫助您的品牌深入人心。</p>
<ul>
<li>Google 商家關鍵字</li>
<li>Google Ads</li>
<li>社群代操</li>
<li>論壇行銷</li>
<li>網紅行銷</li>
<li>形象影片</li>
</ul>
</div>
</section>
</Layout>
<style>
.solutions-section {
padding: 40px 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
ul {
list-style: none;
padding: 0;
}
li {
padding: 10px 0;
border-bottom: 1px solid #eee;
}
</style>

View File

@@ -0,0 +1,61 @@
---
import Layout from '../layouts/Layout.astro';
// Placeholder for blog posts - would fetch from CMS
const posts = [
{ slug: 'en-qun-shu-wei-zui-xin-gong-gao', title: '恩群數位最新公告', date: '2023-01-01' },
{ slug: 'google-xiao-xue-tang', title: 'Google小學堂', date: '2023-01-02' },
// Add more
];
---
<Layout>
<section class="news-section">
<div class="container">
<h1>行銷放大鏡</h1>
<div class="posts-grid">
{posts.map(post => (
<article class="post-card">
<h2><a href={`/wen-zhang-fen-lei/${post.slug}`}>{post.title}</a></h2>
<p>{post.date}</p>
</article>
))}
</div>
</div>
</section>
</Layout>
<style>
.news-section {
padding: 40px 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
.posts-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
.post-card {
border: 1px solid #ddd;
padding: 20px;
border-radius: 8px;
}
.post-card h2 {
margin-top: 0;
}
.post-card a {
text-decoration: none;
color: #333;
}
.post-card a:hover {
color: #007bff;
}
</style>

View File

@@ -0,0 +1,28 @@
---
import Layout from '../layouts/Layout.astro';
---
<Layout>
<section class="teams-section">
<div class="container">
<h1>恩群大本營</h1>
<p>認識我們的團隊成員。</p>
<!-- Team members would be listed here -->
</div>
</section>
</Layout>
<style>
.teams-section {
padding: 40px 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
</style>

View File

@@ -0,0 +1,52 @@
---
import Layout from '../../layouts/Layout.astro';
export async function getStaticPaths() {
// Portfolio slugs from sitemap
const slugs = [
'web-design-project-2',
'web-design-project-3',
'web-design-project-4',
'web-design-project-5'
];
return slugs.map(slug => ({
params: { slug },
props: { slug }
}));
}
const { slug } = Astro.props;
// Placeholder content
const project = {
title: 'Web Design Project',
description: 'Project description...',
images: []
};
---
<Layout>
<section class="project-section">
<div class="container">
<h1>{project.title}</h1>
<p>{project.description}</p>
<!-- Images and details -->
</div>
</section>
</Layout>
<style>
.project-section {
padding: 40px 0;
}
.container {
max-width: 1000px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
</style>

View File

@@ -0,0 +1,57 @@
---
import Layout from '../layouts/Layout.astro';
// Placeholder portfolios
const portfolios = [
{ slug: 'web-design-project-2', title: 'Project 2', description: 'Description...' },
// Add more
];
---
<Layout>
<section class="portfolio-section">
<div class="container">
<h1>網站設計作品</h1>
<div class="portfolio-grid">
{portfolios.map(item => (
<div class="portfolio-item">
<h2><a href={`/webdesign-profolio/${item.slug}`}>{item.title}</a></h2>
<p>{item.description}</p>
</div>
))}
</div>
</div>
</section>
</Layout>
<style>
.portfolio-section {
padding: 40px 0;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
.portfolio-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
.portfolio-item {
border: 1px solid #ddd;
padding: 20px;
border-radius: 8px;
}
.portfolio-item a {
text-decoration: none;
color: #333;
}
.portfolio-item a:hover {
color: #007bff;
}
</style>

View File

@@ -0,0 +1,79 @@
---
import Layout from '../../layouts/Layout.astro';
export async function getStaticPaths() {
// Category slugs
const slugs = [
'en-qun-shu-wei-zui-xin-gong-gao',
'xing-xiao-shi-shi-zui-qian-xian',
'meta-xiao-xue-tang',
'google-xiao-xue-tang'
];
return slugs.map(slug => ({
params: { slug },
props: { slug }
}));
}
const { slug } = Astro.props;
// Placeholder - would fetch category and posts from CMS
const category = {
name: 'Category Name',
posts: [
{ slug: 'post1', title: 'Post 1', date: '2023-01-01' }
]
};
---
<Layout>
<section class="category-section">
<div class="container">
<h1>{category.name}</h1>
<div class="posts-list">
{category.posts.map(post => (
<article class="post-item">
<h2><a href={`/xing-xiao-fang-da-jing/${post.slug}`}>{post.title}</a></h2>
<p>{post.date}</p>
</article>
))}
</div>
</div>
</section>
</Layout>
<style>
.category-section {
padding: 40px 0;
}
.container {
max-width: 1000px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
.posts-list {
display: flex;
flex-direction: column;
gap: 20px;
}
.post-item {
border: 1px solid #ddd;
padding: 20px;
border-radius: 8px;
}
.post-item h2 {
margin-top: 0;
}
.post-item a {
text-decoration: none;
color: #333;
}
.post-item a:hover {
color: #007bff;
}
</style>

View File

@@ -0,0 +1,66 @@
---
import Layout from '../../layouts/Layout.astro';
export async function getStaticPaths() {
// Placeholder slugs - would fetch from CMS
const slugs = [
'2-zhao-yao-kong-xiao-fei-zhe-de-xin',
'2022-jie-qing-xing-xiao-quan-gong-lue',
// Add all from sitemap
];
return slugs.map(slug => ({
params: { slug },
props: { slug }
}));
}
const { slug } = Astro.props;
// Placeholder content - would fetch from CMS
const post = {
title: 'Sample Post Title',
date: 'January 20, 2022',
content: 'Sample content...'
};
---
<Layout>
<section class="post-section">
<div class="container">
<a href="/news" class="back-link">回到文章列表</a>
<article>
<h1>{post.title}</h1>
<p class="post-date">文章發布日期:{post.date}</p>
<div class="post-content prose prose-custom max-w-none">
<p>{post.content}</p>
<!-- More content would be rendered here with markdown -->
</div>
</article>
</div>
</section>
</Layout>
<style>
.post-section {
padding: 40px 0;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
}
.back-link {
display: inline-block;
margin-bottom: 20px;
color: #007bff;
text-decoration: none;
}
.post-date {
color: #666;
margin-bottom: 20px;
}
.post-content {
/* Prose styles handle typography */
}
</style>