@programinglive/dev-workflow-mcp-server 1.5.1 → 1.5.2
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/.agent/workflows/dev-workflow-bugfix.md +250 -250
- package/.agent/workflows/dev-workflow-feature.md +201 -201
- package/.agent/workflows/dev-workflow-full-cycle.md +400 -400
- package/.agent/workflows/dev-workflow-refactor.md +238 -238
- package/.github/ISSUE_TEMPLATE/bug_report.md +34 -34
- package/.github/ISSUE_TEMPLATE/feature_request.md +25 -25
- package/.github/pull_request_template.md +22 -22
- package/.github/workflows/npm-publish.yml +50 -50
- package/.husky/commit-msg +0 -0
- package/CHANGELOG.md +749 -739
- package/CODE_OF_CONDUCT.md +79 -79
- package/CONTRIBUTING.md +60 -60
- package/LICENSE +21 -21
- package/README.md +632 -632
- package/SECURITY.md +20 -20
- package/db/index.js +204 -204
- package/docs/NETLIFY_DEPLOYMENT.md +125 -125
- package/docs/PLESK_DEPLOYMENT.md +170 -170
- package/docs/WORKFLOW-BEST-PRACTICES.md +58 -58
- package/docs/antigravity/EXAMPLES.md +535 -535
- package/docs/antigravity/GETTING-STARTED.md +292 -292
- package/docs/antigravity/TROUBLESHOOTING.md +742 -742
- package/docs/antigravity/WALKTHROUGH.md +25 -25
- package/docs/antigravity/WORKFLOW-TEMPLATES.md +670 -670
- package/docs/product/PRD.md +67 -67
- package/docs/release-notes/RELEASE_NOTES.md +226 -226
- package/docs/web-dashboard.md +175 -175
- package/exec.js +49 -49
- package/index.js +279 -279
- package/install.js +73 -73
- package/package.json +4 -4
- package/release-wrapper.js +192 -192
- package/scripts/build-docs.js +63 -63
- package/scripts/hello-world.js +1 -1
- package/scripts/release.cjs +252 -252
- package/scripts/update-release-notes.cjs +178 -178
- package/server.json +23 -23
- package/tailwind.config.js +8 -8
- package/tests/build.test.js +83 -91
- package/tests/exec.test.js +35 -35
- package/tests/handlers.test.js +1058 -1058
- package/tests/hello-world.test.js +13 -13
- package/tests/mcpRegistry.test.js +65 -65
- package/tests/release-wrapper.test.js +107 -107
- package/tests/workflowState.test.js +505 -505
- package/tools/definitions.js +332 -332
- package/tools/handlers.js +1019 -1019
- package/vite.config.js +43 -43
- package/vite.web.config.js +23 -23
- package/web/README.md +36 -36
- package/web/app/docs/page.tsx +202 -202
- package/web/app/globals.css +90 -90
- package/web/app/layout.tsx +36 -36
- package/web/app/page.tsx +15 -15
- package/web/components/ApiReference.tsx +20 -20
- package/web/components/Features.tsx +61 -61
- package/web/components/Footer.tsx +9 -9
- package/web/components/Hero.tsx +96 -97
- package/web/components/History.tsx +143 -143
- package/web/components/Navbar.tsx +64 -64
- package/web/components/Terminal.tsx +114 -114
- package/web/eslint.config.mjs +18 -18
- package/web/lib/db.js +131 -131
- package/web/lib/docs.js +73 -73
- package/web/netlify.toml +3 -6
- package/web/next.config.ts +12 -7
- package/web/package-lock.json +6560 -6560
- package/web/package.json +28 -28
- package/web/postcss.config.mjs +9 -9
- package/web/server.js +31 -31
- package/web/tailwind.config.ts +19 -19
- package/web/tsconfig.json +42 -42
- package/workflow-state.js +612 -612
- package/web/app/api/docs/route.ts +0 -32
- package/web/app/api/history/route.ts +0 -12
- package/web/app/api/npm-downloads/route.ts +0 -21
- package/web/app/api/summary/route.ts +0 -13
- package/web/app/api/version/route.ts +0 -8
package/web/app/globals.css
CHANGED
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
@tailwind base;
|
|
2
|
-
@tailwind components;
|
|
3
|
-
@tailwind utilities;
|
|
4
|
-
|
|
5
|
-
:root {
|
|
6
|
-
--background: #0a0a0f;
|
|
7
|
-
--foreground: #ffffff;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
body {
|
|
11
|
-
color: var(--foreground);
|
|
12
|
-
background: var(--background);
|
|
13
|
-
font-family: Arial, Helvetica, sans-serif;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@layer utilities {
|
|
17
|
-
@keyframes fadeInUp {
|
|
18
|
-
0% {
|
|
19
|
-
opacity: 0;
|
|
20
|
-
transform: translateY(20px);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
100% {
|
|
24
|
-
opacity: 1;
|
|
25
|
-
transform: translateY(0px);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@keyframes fadeInRight {
|
|
30
|
-
0% {
|
|
31
|
-
opacity: 0;
|
|
32
|
-
transform: translateY(-50%) translateX(40px);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
100% {
|
|
36
|
-
opacity: 1;
|
|
37
|
-
transform: translateY(-50%) translateX(0px);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@keyframes fadeIn {
|
|
42
|
-
0% {
|
|
43
|
-
opacity: 0;
|
|
44
|
-
transform: translateX(-10px);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
100% {
|
|
48
|
-
opacity: 1;
|
|
49
|
-
transform: translateX(0px);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.animate-fade-in-up {
|
|
54
|
-
animation: fadeInUp 0.8s ease-out forwards;
|
|
55
|
-
opacity: 0;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
.animate-fade-in-right {
|
|
59
|
-
animation: fadeInRight 0.8s ease-out forwards;
|
|
60
|
-
opacity: 0;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.terminal-line {
|
|
64
|
-
opacity: 0;
|
|
65
|
-
display: flex;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.terminal-line.visible {
|
|
69
|
-
opacity: 1;
|
|
70
|
-
transition: opacity 0.1s;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
.typing-cursor::after {
|
|
74
|
-
content: '▋';
|
|
75
|
-
animation: blink 1s step-end infinite;
|
|
76
|
-
margin-left: 4px;
|
|
77
|
-
color: #a855f7;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
@keyframes blink {
|
|
81
|
-
|
|
82
|
-
0%,
|
|
83
|
-
100% {
|
|
84
|
-
opacity: 1;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
50% {
|
|
88
|
-
opacity: 0;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
:root {
|
|
6
|
+
--background: #0a0a0f;
|
|
7
|
+
--foreground: #ffffff;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
body {
|
|
11
|
+
color: var(--foreground);
|
|
12
|
+
background: var(--background);
|
|
13
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@layer utilities {
|
|
17
|
+
@keyframes fadeInUp {
|
|
18
|
+
0% {
|
|
19
|
+
opacity: 0;
|
|
20
|
+
transform: translateY(20px);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
100% {
|
|
24
|
+
opacity: 1;
|
|
25
|
+
transform: translateY(0px);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes fadeInRight {
|
|
30
|
+
0% {
|
|
31
|
+
opacity: 0;
|
|
32
|
+
transform: translateY(-50%) translateX(40px);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
100% {
|
|
36
|
+
opacity: 1;
|
|
37
|
+
transform: translateY(-50%) translateX(0px);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@keyframes fadeIn {
|
|
42
|
+
0% {
|
|
43
|
+
opacity: 0;
|
|
44
|
+
transform: translateX(-10px);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
100% {
|
|
48
|
+
opacity: 1;
|
|
49
|
+
transform: translateX(0px);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.animate-fade-in-up {
|
|
54
|
+
animation: fadeInUp 0.8s ease-out forwards;
|
|
55
|
+
opacity: 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.animate-fade-in-right {
|
|
59
|
+
animation: fadeInRight 0.8s ease-out forwards;
|
|
60
|
+
opacity: 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.terminal-line {
|
|
64
|
+
opacity: 0;
|
|
65
|
+
display: flex;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.terminal-line.visible {
|
|
69
|
+
opacity: 1;
|
|
70
|
+
transition: opacity 0.1s;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.typing-cursor::after {
|
|
74
|
+
content: '▋';
|
|
75
|
+
animation: blink 1s step-end infinite;
|
|
76
|
+
margin-left: 4px;
|
|
77
|
+
color: #a855f7;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@keyframes blink {
|
|
81
|
+
|
|
82
|
+
0%,
|
|
83
|
+
100% {
|
|
84
|
+
opacity: 1;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
50% {
|
|
88
|
+
opacity: 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
91
|
}
|
package/web/app/layout.tsx
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import type { Metadata } from "next";
|
|
2
|
-
import "./globals.css";
|
|
3
|
-
import Navbar from "@/components/Navbar";
|
|
4
|
-
import Footer from "@/components/Footer";
|
|
5
|
-
|
|
6
|
-
export const metadata: Metadata = {
|
|
7
|
-
title: "Dev Workflow Dashboard",
|
|
8
|
-
description: "Enforce development discipline and best practices",
|
|
9
|
-
icons: {
|
|
10
|
-
icon: [
|
|
11
|
-
{ url: "/assets/favicon-16x16.png", sizes: "16x16", type: "image/png" },
|
|
12
|
-
{ url: "/assets/favicon-32x32.png", sizes: "32x32", type: "image/png" },
|
|
13
|
-
{ url: "/assets/favicon.ico" },
|
|
14
|
-
],
|
|
15
|
-
apple: [
|
|
16
|
-
{ url: "/assets/apple-touch-icon.png", sizes: "180x180", type: "image/png" },
|
|
17
|
-
],
|
|
18
|
-
},
|
|
19
|
-
manifest: "/assets/site.webmanifest",
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
export default function RootLayout({
|
|
23
|
-
children,
|
|
24
|
-
}: Readonly<{
|
|
25
|
-
children: React.ReactNode;
|
|
26
|
-
}>) {
|
|
27
|
-
return (
|
|
28
|
-
<html lang="en" className="scroll-smooth">
|
|
29
|
-
<body className="antialiased bg-[#0a0a0f] text-white">
|
|
30
|
-
<Navbar />
|
|
31
|
-
{children}
|
|
32
|
-
<Footer />
|
|
33
|
-
</body>
|
|
34
|
-
</html>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
1
|
+
import type { Metadata } from "next";
|
|
2
|
+
import "./globals.css";
|
|
3
|
+
import Navbar from "@/components/Navbar";
|
|
4
|
+
import Footer from "@/components/Footer";
|
|
5
|
+
|
|
6
|
+
export const metadata: Metadata = {
|
|
7
|
+
title: "Dev Workflow Dashboard",
|
|
8
|
+
description: "Enforce development discipline and best practices",
|
|
9
|
+
icons: {
|
|
10
|
+
icon: [
|
|
11
|
+
{ url: "/assets/favicon-16x16.png", sizes: "16x16", type: "image/png" },
|
|
12
|
+
{ url: "/assets/favicon-32x32.png", sizes: "32x32", type: "image/png" },
|
|
13
|
+
{ url: "/assets/favicon.ico" },
|
|
14
|
+
],
|
|
15
|
+
apple: [
|
|
16
|
+
{ url: "/assets/apple-touch-icon.png", sizes: "180x180", type: "image/png" },
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
manifest: "/assets/site.webmanifest",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default function RootLayout({
|
|
23
|
+
children,
|
|
24
|
+
}: Readonly<{
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
}>) {
|
|
27
|
+
return (
|
|
28
|
+
<html lang="en" className="scroll-smooth">
|
|
29
|
+
<body className="antialiased bg-[#0a0a0f] text-white">
|
|
30
|
+
<Navbar />
|
|
31
|
+
{children}
|
|
32
|
+
<Footer />
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
35
|
+
);
|
|
36
|
+
}
|
package/web/app/page.tsx
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import Hero from "@/components/Hero";
|
|
2
|
-
import Features from "@/components/Features";
|
|
3
|
-
import History from "@/components/History";
|
|
4
|
-
import ApiReference from "@/components/ApiReference";
|
|
5
|
-
|
|
6
|
-
export default function Home() {
|
|
7
|
-
return (
|
|
8
|
-
<main>
|
|
9
|
-
<Hero />
|
|
10
|
-
<Features />
|
|
11
|
-
<History />
|
|
12
|
-
<ApiReference />
|
|
13
|
-
</main>
|
|
14
|
-
);
|
|
15
|
-
}
|
|
1
|
+
import Hero from "@/components/Hero";
|
|
2
|
+
import Features from "@/components/Features";
|
|
3
|
+
import History from "@/components/History";
|
|
4
|
+
import ApiReference from "@/components/ApiReference";
|
|
5
|
+
|
|
6
|
+
export default function Home() {
|
|
7
|
+
return (
|
|
8
|
+
<main>
|
|
9
|
+
<Hero />
|
|
10
|
+
<Features />
|
|
11
|
+
<History />
|
|
12
|
+
<ApiReference />
|
|
13
|
+
</main>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export default function ApiReference() {
|
|
2
|
-
return (
|
|
3
|
-
<section id="api" className="py-20 px-4">
|
|
4
|
-
<div className="max-w-7xl mx-auto">
|
|
5
|
-
<h2 className="text-3xl md:text-4xl font-bold mb-8">API Reference</h2>
|
|
6
|
-
<p className="text-gray-400 mb-12">Query workflow data programmatically with our JSON API.</p>
|
|
7
|
-
<div className="grid md:grid-cols-2 gap-6">
|
|
8
|
-
<div className="p-6 rounded-xl bg-white/5 border border-white/10">
|
|
9
|
-
<code className="text-indigo-400 font-mono text-sm">GET /api/history</code>
|
|
10
|
-
<p className="text-gray-400 mt-2">Retrieve paginated task history entries.</p>
|
|
11
|
-
</div>
|
|
12
|
-
<div className="p-6 rounded-xl bg-white/5 border border-white/10">
|
|
13
|
-
<code className="text-indigo-400 font-mono text-sm">GET /api/summary</code>
|
|
14
|
-
<p className="text-gray-400 mt-2">Get project health stats and recent tasks.</p>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
</section>
|
|
19
|
-
);
|
|
20
|
-
}
|
|
1
|
+
export default function ApiReference() {
|
|
2
|
+
return (
|
|
3
|
+
<section id="api" className="py-20 px-4">
|
|
4
|
+
<div className="max-w-7xl mx-auto">
|
|
5
|
+
<h2 className="text-3xl md:text-4xl font-bold mb-8">API Reference</h2>
|
|
6
|
+
<p className="text-gray-400 mb-12">Query workflow data programmatically with our JSON API.</p>
|
|
7
|
+
<div className="grid md:grid-cols-2 gap-6">
|
|
8
|
+
<div className="p-6 rounded-xl bg-white/5 border border-white/10">
|
|
9
|
+
<code className="text-indigo-400 font-mono text-sm">GET /api/history</code>
|
|
10
|
+
<p className="text-gray-400 mt-2">Retrieve paginated task history entries.</p>
|
|
11
|
+
</div>
|
|
12
|
+
<div className="p-6 rounded-xl bg-white/5 border border-white/10">
|
|
13
|
+
<code className="text-indigo-400 font-mono text-sm">GET /api/summary</code>
|
|
14
|
+
<p className="text-gray-400 mt-2">Get project health stats and recent tasks.</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</section>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
import { ShieldCheck, TestTube, FileText, GitBranch, History, Zap } from "lucide-react";
|
|
2
|
-
|
|
3
|
-
export default function Features() {
|
|
4
|
-
return (
|
|
5
|
-
<section id="features" className="py-20 px-4">
|
|
6
|
-
<div className="max-w-7xl mx-auto">
|
|
7
|
-
<h2 className="text-3xl md:text-4xl font-bold text-center mb-16">Your Coding Conscience</h2>
|
|
8
|
-
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
9
|
-
<FeatureCard
|
|
10
|
-
icon={<ShieldCheck className="w-6 h-6 text-indigo-400" />}
|
|
11
|
-
title="Enforced Discipline"
|
|
12
|
-
description="Won't let you skip important steps. Follows a strict, proven development workflow."
|
|
13
|
-
bg="bg-indigo-500/20"
|
|
14
|
-
/>
|
|
15
|
-
<FeatureCard
|
|
16
|
-
icon={<TestTube className="w-6 h-6 text-purple-400" />}
|
|
17
|
-
title="Test-Driven"
|
|
18
|
-
description="Blocks commits if tests fail. Encourages writing tests before marking tasks complete."
|
|
19
|
-
bg="bg-purple-500/20"
|
|
20
|
-
/>
|
|
21
|
-
<FeatureCard
|
|
22
|
-
icon={<FileText className="w-6 h-6 text-emerald-400" />}
|
|
23
|
-
title="Documentation"
|
|
24
|
-
description="Reminds you to update documentation (README, docs, changelog) for every change."
|
|
25
|
-
bg="bg-emerald-500/20"
|
|
26
|
-
/>
|
|
27
|
-
<FeatureCard
|
|
28
|
-
icon={<GitBranch className="w-6 h-6 text-orange-400" />}
|
|
29
|
-
title="State Tracking"
|
|
30
|
-
description="Remembers exactly where you are in the workflow, even across sessions."
|
|
31
|
-
bg="bg-orange-500/20"
|
|
32
|
-
/>
|
|
33
|
-
<FeatureCard
|
|
34
|
-
icon={<History className="w-6 h-6 text-blue-400" />}
|
|
35
|
-
title="Task History"
|
|
36
|
-
description="Keeps a detailed log of all completed tasks, commits, and releases."
|
|
37
|
-
bg="bg-blue-500/20"
|
|
38
|
-
/>
|
|
39
|
-
<FeatureCard
|
|
40
|
-
icon={<Zap className="w-6 h-6 text-pink-400" />}
|
|
41
|
-
title="Smart Prompts"
|
|
42
|
-
description="Provides quick reminders and guidance on best practices as you work."
|
|
43
|
-
bg="bg-pink-500/20"
|
|
44
|
-
/>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</section>
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function FeatureCard({ icon, title, description, bg }: { icon: React.ReactNode, title: string, description: string, bg: string }) {
|
|
52
|
-
return (
|
|
53
|
-
<div className="p-6 rounded-xl bg-white/5 border border-white/10 hover:bg-white/10 transition">
|
|
54
|
-
<div className={`w-12 h-12 rounded-lg ${bg} flex items-center justify-center mb-4`}>
|
|
55
|
-
{icon}
|
|
56
|
-
</div>
|
|
57
|
-
<h3 className="text-xl font-semibold mb-2">{title}</h3>
|
|
58
|
-
<p className="text-gray-400">{description}</p>
|
|
59
|
-
</div>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
1
|
+
import { ShieldCheck, TestTube, FileText, GitBranch, History, Zap } from "lucide-react";
|
|
2
|
+
|
|
3
|
+
export default function Features() {
|
|
4
|
+
return (
|
|
5
|
+
<section id="features" className="py-20 px-4">
|
|
6
|
+
<div className="max-w-7xl mx-auto">
|
|
7
|
+
<h2 className="text-3xl md:text-4xl font-bold text-center mb-16">Your Coding Conscience</h2>
|
|
8
|
+
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
9
|
+
<FeatureCard
|
|
10
|
+
icon={<ShieldCheck className="w-6 h-6 text-indigo-400" />}
|
|
11
|
+
title="Enforced Discipline"
|
|
12
|
+
description="Won't let you skip important steps. Follows a strict, proven development workflow."
|
|
13
|
+
bg="bg-indigo-500/20"
|
|
14
|
+
/>
|
|
15
|
+
<FeatureCard
|
|
16
|
+
icon={<TestTube className="w-6 h-6 text-purple-400" />}
|
|
17
|
+
title="Test-Driven"
|
|
18
|
+
description="Blocks commits if tests fail. Encourages writing tests before marking tasks complete."
|
|
19
|
+
bg="bg-purple-500/20"
|
|
20
|
+
/>
|
|
21
|
+
<FeatureCard
|
|
22
|
+
icon={<FileText className="w-6 h-6 text-emerald-400" />}
|
|
23
|
+
title="Documentation"
|
|
24
|
+
description="Reminds you to update documentation (README, docs, changelog) for every change."
|
|
25
|
+
bg="bg-emerald-500/20"
|
|
26
|
+
/>
|
|
27
|
+
<FeatureCard
|
|
28
|
+
icon={<GitBranch className="w-6 h-6 text-orange-400" />}
|
|
29
|
+
title="State Tracking"
|
|
30
|
+
description="Remembers exactly where you are in the workflow, even across sessions."
|
|
31
|
+
bg="bg-orange-500/20"
|
|
32
|
+
/>
|
|
33
|
+
<FeatureCard
|
|
34
|
+
icon={<History className="w-6 h-6 text-blue-400" />}
|
|
35
|
+
title="Task History"
|
|
36
|
+
description="Keeps a detailed log of all completed tasks, commits, and releases."
|
|
37
|
+
bg="bg-blue-500/20"
|
|
38
|
+
/>
|
|
39
|
+
<FeatureCard
|
|
40
|
+
icon={<Zap className="w-6 h-6 text-pink-400" />}
|
|
41
|
+
title="Smart Prompts"
|
|
42
|
+
description="Provides quick reminders and guidance on best practices as you work."
|
|
43
|
+
bg="bg-pink-500/20"
|
|
44
|
+
/>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</section>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function FeatureCard({ icon, title, description, bg }: { icon: React.ReactNode, title: string, description: string, bg: string }) {
|
|
52
|
+
return (
|
|
53
|
+
<div className="p-6 rounded-xl bg-white/5 border border-white/10 hover:bg-white/10 transition">
|
|
54
|
+
<div className={`w-12 h-12 rounded-lg ${bg} flex items-center justify-center mb-4`}>
|
|
55
|
+
{icon}
|
|
56
|
+
</div>
|
|
57
|
+
<h3 className="text-xl font-semibold mb-2">{title}</h3>
|
|
58
|
+
<p className="text-gray-400">{description}</p>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export default function Footer() {
|
|
2
|
-
return (
|
|
3
|
-
<footer className="py-12 px-4 border-t border-white/10">
|
|
4
|
-
<div className="max-w-7xl mx-auto text-center text-gray-400">
|
|
5
|
-
<p>Built with ❤️ for developers who care about quality</p>
|
|
6
|
-
</div>
|
|
7
|
-
</footer>
|
|
8
|
-
);
|
|
9
|
-
}
|
|
1
|
+
export default function Footer() {
|
|
2
|
+
return (
|
|
3
|
+
<footer className="py-12 px-4 border-t border-white/10">
|
|
4
|
+
<div className="max-w-7xl mx-auto text-center text-gray-400">
|
|
5
|
+
<p>Built with ❤️ for developers who care about quality</p>
|
|
6
|
+
</div>
|
|
7
|
+
</footer>
|
|
8
|
+
);
|
|
9
|
+
}
|