ai-devkit 0.4.2 → 0.6.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/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +53 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +112 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/lib/EnvironmentSelector.d.ts +1 -0
- package/dist/lib/EnvironmentSelector.d.ts.map +1 -1
- package/dist/lib/EnvironmentSelector.js +28 -0
- package/dist/lib/EnvironmentSelector.js.map +1 -1
- package/dist/lib/TemplateManager.d.ts +14 -0
- package/dist/lib/TemplateManager.d.ts.map +1 -1
- package/dist/lib/TemplateManager.js +74 -3
- package/dist/lib/TemplateManager.js.map +1 -1
- package/{templates/commands/capture-knowledge.toml → dist/templates/commands/capture-knowledge.md} +10 -4
- package/{templates/commands/check-implementation.toml → dist/templates/commands/check-implementation.md} +9 -0
- package/{templates/commands/code-review.toml → dist/templates/commands/code-review.md} +11 -4
- package/{templates/commands/debug.toml → dist/templates/commands/debug.md} +11 -5
- package/{templates/commands/execute-plan.toml → dist/templates/commands/execute-plan.md} +11 -5
- package/{templates/commands/new-requirement.toml → dist/templates/commands/new-requirement.md} +11 -4
- package/dist/templates/commands/remember.md +27 -0
- package/dist/templates/commands/review-design.md +21 -0
- package/dist/templates/commands/review-requirements.md +19 -0
- package/dist/templates/commands/simplify-implementation.md +153 -0
- package/{templates/commands/update-planning.toml → dist/templates/commands/update-planning.md} +11 -4
- package/{templates/commands/writing-test.toml → dist/templates/commands/writing-test.md} +10 -3
- package/dist/templates/env/base.md +51 -0
- package/dist/templates/phases/deployment.md +72 -0
- package/dist/templates/phases/design.md +60 -0
- package/dist/templates/phases/implementation.md +65 -0
- package/dist/templates/phases/monitoring.md +80 -0
- package/dist/templates/phases/planning.md +60 -0
- package/dist/templates/phases/requirements.md +51 -0
- package/dist/templates/phases/testing.md +81 -0
- package/dist/templates/templates/commands/capture-knowledge.md +55 -0
- package/dist/templates/templates/commands/check-implementation.md +30 -0
- package/dist/templates/templates/commands/code-review.md +90 -0
- package/dist/templates/templates/commands/debug.md +54 -0
- package/dist/templates/templates/commands/execute-plan.md +80 -0
- package/dist/templates/templates/commands/new-requirement.md +136 -0
- package/dist/templates/templates/commands/remember.md +27 -0
- package/dist/templates/templates/commands/review-design.md +21 -0
- package/dist/templates/templates/commands/review-requirements.md +19 -0
- package/dist/templates/templates/commands/simplify-implementation.md +153 -0
- package/dist/templates/templates/commands/update-planning.md +70 -0
- package/dist/templates/templates/commands/writing-test.md +53 -0
- package/dist/templates/templates/env/base.md +51 -0
- package/dist/templates/templates/phases/deployment.md +72 -0
- package/dist/templates/templates/phases/design.md +60 -0
- package/dist/templates/templates/phases/implementation.md +65 -0
- package/dist/templates/templates/phases/monitoring.md +80 -0
- package/dist/templates/templates/phases/planning.md +60 -0
- package/dist/templates/templates/phases/requirements.md +51 -0
- package/dist/templates/templates/phases/testing.md +81 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util/env.d.ts +2 -0
- package/dist/util/env.d.ts.map +1 -1
- package/dist/util/env.js +18 -1
- package/dist/util/env.js.map +1 -1
- package/package.json +5 -2
- package/project.json +29 -0
- package/templates/commands/capture-knowledge.md +9 -0
- package/templates/commands/check-implementation.md +9 -0
- package/templates/commands/code-review.md +9 -0
- package/templates/commands/debug.md +9 -0
- package/templates/commands/execute-plan.md +9 -0
- package/templates/commands/new-requirement.md +9 -0
- package/templates/commands/remember.md +27 -0
- package/templates/commands/review-design.md +10 -0
- package/templates/commands/review-requirements.md +10 -0
- package/templates/commands/simplify-implementation.md +153 -0
- package/templates/commands/update-planning.md +9 -0
- package/templates/commands/writing-test.md +9 -0
- package/CHANGELOG.md +0 -87
- package/README.md +0 -297
- package/dist/__tests__/lib/Config.test.d.ts +0 -2
- package/dist/__tests__/lib/Config.test.d.ts.map +0 -1
- package/dist/__tests__/lib/Config.test.js +0 -281
- package/dist/__tests__/lib/Config.test.js.map +0 -1
- package/dist/__tests__/lib/EnvironmentSelector.test.d.ts +0 -2
- package/dist/__tests__/lib/EnvironmentSelector.test.d.ts.map +0 -1
- package/dist/__tests__/lib/EnvironmentSelector.test.js +0 -117
- package/dist/__tests__/lib/EnvironmentSelector.test.js.map +0 -1
- package/dist/__tests__/lib/PhaseSelector.test.d.ts +0 -2
- package/dist/__tests__/lib/PhaseSelector.test.d.ts.map +0 -1
- package/dist/__tests__/lib/PhaseSelector.test.js +0 -77
- package/dist/__tests__/lib/PhaseSelector.test.js.map +0 -1
- package/dist/__tests__/lib/TemplateManager.test.d.ts +0 -2
- package/dist/__tests__/lib/TemplateManager.test.d.ts.map +0 -1
- package/dist/__tests__/lib/TemplateManager.test.js +0 -351
- package/dist/__tests__/lib/TemplateManager.test.js.map +0 -1
- package/dist/__tests__/util/env.test.d.ts +0 -2
- package/dist/__tests__/util/env.test.d.ts.map +0 -1
- package/dist/__tests__/util/env.test.js +0 -166
- package/dist/__tests__/util/env.test.js.map +0 -1
- package/templates/commands/review-design.toml +0 -13
- package/templates/commands/review-requirements.toml +0 -11
- package/web/.nojekyll +0 -2
- package/web/CNAME +0 -1
- package/web/README.md +0 -100
- package/web/app/favicon.ico +0 -0
- package/web/app/globals.css +0 -122
- package/web/app/layout.tsx +0 -106
- package/web/app/page.tsx +0 -119
- package/web/app/roadmap/page.tsx +0 -150
- package/web/app/robots.ts +0 -16
- package/web/app/sitemap.ts +0 -46
- package/web/app/vision/page.tsx +0 -49
- package/web/components/Footer.tsx +0 -81
- package/web/components/GitHubButton.tsx +0 -49
- package/web/components/GitHubStars.tsx +0 -27
- package/web/components/Header.tsx +0 -108
- package/web/components/MarkdownContent.tsx +0 -35
- package/web/components/SkipToContent.tsx +0 -11
- package/web/content/pages/vision.md +0 -44
- package/web/content/roadmap/1-web.md +0 -9
- package/web/content/roadmap/2-integrations.md +0 -7
- package/web/content/roadmap/3-cli-enhancements.md +0 -8
- package/web/content/roadmap/4-local-memory.md +0 -8
- package/web/eslint.config.mjs +0 -18
- package/web/lib/GitHubContext.tsx +0 -57
- package/web/lib/content/loader.ts +0 -152
- package/web/lib/content/types.ts +0 -37
- package/web/lib/utils.ts +0 -12
- package/web/next.config.ts +0 -11
- package/web/package-lock.json +0 -8837
- package/web/package.json +0 -34
- package/web/postcss.config.mjs +0 -7
- package/web/public/file.svg +0 -1
- package/web/public/globe.svg +0 -1
- package/web/public/next.svg +0 -1
- package/web/public/vercel.svg +0 -1
- package/web/public/window.svg +0 -1
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { MDXRemote } from 'next-mdx-remote/rsc';
|
|
2
|
-
import remarkGfm from 'remark-gfm';
|
|
3
|
-
import rehypeHighlight from 'rehype-highlight';
|
|
4
|
-
import rehypeSlug from 'rehype-slug';
|
|
5
|
-
|
|
6
|
-
interface MarkdownContentProps {
|
|
7
|
-
content: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export default async function MarkdownContent({ content }: MarkdownContentProps) {
|
|
11
|
-
return (
|
|
12
|
-
<div className="prose prose-lg max-w-none
|
|
13
|
-
prose-headings:font-bold
|
|
14
|
-
prose-h1:text-4xl prose-h1:mb-6
|
|
15
|
-
prose-h2:text-3xl prose-h2:mt-12 prose-h2:mb-4
|
|
16
|
-
prose-h3:text-2xl prose-h3:mt-8 prose-h3:mb-3
|
|
17
|
-
prose-p:text-gray-700 prose-p:leading-relaxed
|
|
18
|
-
prose-a:text-black prose-a:underline hover:prose-a:opacity-70
|
|
19
|
-
prose-code:bg-gray-100 prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:text-sm
|
|
20
|
-
prose-pre:bg-gray-900 prose-pre:text-gray-100
|
|
21
|
-
prose-ul:my-6 prose-li:my-2
|
|
22
|
-
prose-strong:font-bold prose-strong:text-black">
|
|
23
|
-
<MDXRemote
|
|
24
|
-
source={content}
|
|
25
|
-
options={{
|
|
26
|
-
mdxOptions: {
|
|
27
|
-
remarkPlugins: [remarkGfm],
|
|
28
|
-
rehypePlugins: [rehypeHighlight, rehypeSlug],
|
|
29
|
-
},
|
|
30
|
-
}}
|
|
31
|
-
/>
|
|
32
|
-
</div>
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export default function SkipToContent() {
|
|
2
|
-
return (
|
|
3
|
-
<a
|
|
4
|
-
href="#main-content"
|
|
5
|
-
className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:z-50 focus:px-4 focus:py-2 focus:bg-black focus:text-white focus:rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-black"
|
|
6
|
-
>
|
|
7
|
-
Skip to main content
|
|
8
|
-
</a>
|
|
9
|
-
);
|
|
10
|
-
}
|
|
11
|
-
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Vision
|
|
3
|
-
description: The vision and purpose behind AI DevKit
|
|
4
|
-
slug: vision
|
|
5
|
-
order: 2
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Vision
|
|
9
|
-
|
|
10
|
-
AI DevKit exists to bridge the gap between AI-assisted development and structured software engineering practices.
|
|
11
|
-
|
|
12
|
-
## Our Purpose
|
|
13
|
-
|
|
14
|
-
It inherits the idea from [The New Engineering Workflow](https://ownthecraftbook.com/chapters/9-the-new-engineering-workflow/) in [AI changes the Tools, you still own the Craft](https://ownthecraftbook.com/): empowering engineers to integrate AI effectively into a structured, test-driven, and craftsmanship-focused development process.
|
|
15
|
-
|
|
16
|
-
We believe that AI coding assistants are most powerful when they work within a well-defined engineering framework where documentation is clear, plans are systematic, and architecture is intentional.
|
|
17
|
-
|
|
18
|
-
AI DevKit provides the scaffolding for that structure. It helps engineers reduce the back-and-forth of prompting, keep context in sync, and share memory between themselves and their AI tools.
|
|
19
|
-
|
|
20
|
-
Our goal is simple:
|
|
21
|
-
To make working with AI feel as natural and reliable as working with your favorite teammate, the one who already knows your project, your style, and your standards.
|
|
22
|
-
|
|
23
|
-
## What We're Building
|
|
24
|
-
|
|
25
|
-
A toolkit that enables developers to:
|
|
26
|
-
|
|
27
|
-
- **Document thoroughly** - Capture requirements, design decisions, and implementation notes in a consistent format
|
|
28
|
-
- **Plan systematically** - Break down complex features into manageable tasks with clear dependencies
|
|
29
|
-
- **Collaborate effectively** - Share context with AI assistants and human teammates through well-organized documentation
|
|
30
|
-
- **Maintain quality** - Ensure testing coverage and code review processes are baked into the workflow
|
|
31
|
-
|
|
32
|
-
## Our Principles
|
|
33
|
-
|
|
34
|
-
1. **Documentation-first development** - Start with clear requirements before writing code
|
|
35
|
-
2. **Phase-based workflow** - Move through requirements, design, planning, implementation, and testing in a structured way
|
|
36
|
-
3. **AI-friendly context** - Organize project knowledge so AI assistants can provide better assistance
|
|
37
|
-
4. **Low friction** - Make it easy to follow best practices without heavy tooling overhead
|
|
38
|
-
|
|
39
|
-
## Looking Forward
|
|
40
|
-
|
|
41
|
-
We envision a future where structured development practices are the default, not the exception. Where every feature starts with clear requirements and ends with comprehensive tests. Where AI assistants amplify human capabilities by working within well-defined frameworks.
|
|
42
|
-
|
|
43
|
-
AI DevKit is our contribution to that future.
|
|
44
|
-
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Coding Agent Integration
|
|
3
|
-
status: in-progress
|
|
4
|
-
order: 2
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Expand AI DevKit’s ecosystem with other AI coding agents such as: ChatGPT Codex, Gemini CLI, etc. The goal is to make AI DevKit the universal bridge between your favorite AI assistants and your development workflow, enabling smoother collaboration, faster iteration, and more consistent results.
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: CLI Enhancements & Workflows
|
|
3
|
-
status: planned
|
|
4
|
-
order: 2
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Expand CLI capabilities with interactive workflows, better error handling, and enhanced command chaining. Focus on improving developer experience and reducing friction in the structured development process.
|
|
8
|
-
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Local Memory & Knowledge based
|
|
3
|
-
status: planned
|
|
4
|
-
order: 4
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Build a local AI memory that learns from your coding habits, preferences, and team knowledge.
|
|
8
|
-
This feature allows AI agents to access your skills, patterns, and project context directly from local, minimizing redundant prompts, speeding up workflows, and keeping your documents lightweight and focused.
|
package/web/eslint.config.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { defineConfig, globalIgnores } from "eslint/config";
|
|
2
|
-
import nextVitals from "eslint-config-next/core-web-vitals";
|
|
3
|
-
import nextTs from "eslint-config-next/typescript";
|
|
4
|
-
|
|
5
|
-
const eslintConfig = defineConfig([
|
|
6
|
-
...nextVitals,
|
|
7
|
-
...nextTs,
|
|
8
|
-
// Override default ignores of eslint-config-next.
|
|
9
|
-
globalIgnores([
|
|
10
|
-
// Default ignores of eslint-config-next:
|
|
11
|
-
".next/**",
|
|
12
|
-
"out/**",
|
|
13
|
-
"build/**",
|
|
14
|
-
"next-env.d.ts",
|
|
15
|
-
]),
|
|
16
|
-
]);
|
|
17
|
-
|
|
18
|
-
export default eslintConfig;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
|
|
4
|
-
|
|
5
|
-
interface GitHubContextType {
|
|
6
|
-
stars: number | null;
|
|
7
|
-
loading: boolean;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const GitHubContext = createContext<GitHubContextType>({
|
|
11
|
-
stars: null,
|
|
12
|
-
loading: true,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export function GitHubProvider({
|
|
16
|
-
children,
|
|
17
|
-
repo
|
|
18
|
-
}: {
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
repo: string;
|
|
21
|
-
}) {
|
|
22
|
-
const [stars, setStars] = useState<number | null>(null);
|
|
23
|
-
const [loading, setLoading] = useState(true);
|
|
24
|
-
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
async function fetchStars() {
|
|
27
|
-
try {
|
|
28
|
-
const response = await fetch(`https://api.github.com/repos/${repo}`);
|
|
29
|
-
if (response.ok) {
|
|
30
|
-
const data = await response.json();
|
|
31
|
-
setStars(data.stargazers_count);
|
|
32
|
-
}
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.error('Failed to fetch GitHub stars:', error);
|
|
35
|
-
} finally {
|
|
36
|
-
setLoading(false);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
fetchStars();
|
|
41
|
-
}, [repo]);
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<GitHubContext.Provider value={{ stars, loading }}>
|
|
45
|
-
{children}
|
|
46
|
-
</GitHubContext.Provider>
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function useGitHubStars() {
|
|
51
|
-
const context = useContext(GitHubContext);
|
|
52
|
-
if (!context) {
|
|
53
|
-
throw new Error('useGitHubStars must be used within a GitHubProvider');
|
|
54
|
-
}
|
|
55
|
-
return context;
|
|
56
|
-
}
|
|
57
|
-
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import matter from 'gray-matter';
|
|
4
|
-
import { Page, PageMetadata, RoadmapItem, RoadmapItemMetadata } from './types';
|
|
5
|
-
|
|
6
|
-
const contentDirectory = path.join(process.cwd(), 'content');
|
|
7
|
-
const docsDirectory = path.join(contentDirectory, 'docs');
|
|
8
|
-
const pagesDirectory = path.join(contentDirectory, 'pages');
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Get all Markdown files from a directory
|
|
12
|
-
*/
|
|
13
|
-
function getMarkdownFiles(dir: string): string[] {
|
|
14
|
-
if (!fs.existsSync(dir)) {
|
|
15
|
-
return [];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const files = fs.readdirSync(dir);
|
|
19
|
-
return files
|
|
20
|
-
.filter(file => file.endsWith('.md') || file.endsWith('.mdx'))
|
|
21
|
-
.map(file => path.join(dir, file));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Parse a Markdown file with frontmatter
|
|
26
|
-
*/
|
|
27
|
-
function parseMarkdownFile<T>(filePath: string): { metadata: T; content: string } {
|
|
28
|
-
const fileContents = fs.readFileSync(filePath, 'utf8');
|
|
29
|
-
const { data, content } = matter(fileContents);
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
metadata: data as T,
|
|
33
|
-
content: content.trim(),
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Get a single page by slug
|
|
39
|
-
*/
|
|
40
|
-
export function getPage(slug: string): Page | null {
|
|
41
|
-
const filePath = path.join(pagesDirectory, `${slug}.md`);
|
|
42
|
-
|
|
43
|
-
if (!fs.existsSync(filePath)) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const parsed = parseMarkdownFile<PageMetadata>(filePath);
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
metadata: {
|
|
51
|
-
...parsed.metadata,
|
|
52
|
-
slug,
|
|
53
|
-
},
|
|
54
|
-
content: parsed.content,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Get all pages
|
|
60
|
-
*/
|
|
61
|
-
export function getAllPages(): Page[] {
|
|
62
|
-
const files = getMarkdownFiles(pagesDirectory);
|
|
63
|
-
|
|
64
|
-
const pages = files.map(filePath => {
|
|
65
|
-
const slug = path.basename(filePath, path.extname(filePath));
|
|
66
|
-
const parsed = parseMarkdownFile<PageMetadata>(filePath);
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
metadata: {
|
|
70
|
-
...parsed.metadata,
|
|
71
|
-
slug,
|
|
72
|
-
},
|
|
73
|
-
content: parsed.content,
|
|
74
|
-
};
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
// Sort by order if specified
|
|
78
|
-
return pages.sort((a, b) => {
|
|
79
|
-
const orderA = a.metadata.order ?? 999;
|
|
80
|
-
const orderB = b.metadata.order ?? 999;
|
|
81
|
-
return orderA - orderB;
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Get a single documentation page by slug
|
|
87
|
-
*/
|
|
88
|
-
export function getDocPage(slug: string): Page | null {
|
|
89
|
-
const filePath = path.join(docsDirectory, `${slug}.md`);
|
|
90
|
-
|
|
91
|
-
if (!fs.existsSync(filePath)) {
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const parsed = parseMarkdownFile<PageMetadata>(filePath);
|
|
96
|
-
|
|
97
|
-
return {
|
|
98
|
-
metadata: {
|
|
99
|
-
...parsed.metadata,
|
|
100
|
-
slug,
|
|
101
|
-
},
|
|
102
|
-
content: parsed.content,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Get all documentation pages
|
|
108
|
-
*/
|
|
109
|
-
export function getAllDocPages(): Page[] {
|
|
110
|
-
const files = getMarkdownFiles(docsDirectory);
|
|
111
|
-
|
|
112
|
-
const pages = files.map(filePath => {
|
|
113
|
-
const slug = path.basename(filePath, path.extname(filePath));
|
|
114
|
-
const parsed = parseMarkdownFile<PageMetadata>(filePath);
|
|
115
|
-
|
|
116
|
-
return {
|
|
117
|
-
metadata: {
|
|
118
|
-
...parsed.metadata,
|
|
119
|
-
slug,
|
|
120
|
-
},
|
|
121
|
-
content: parsed.content,
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Sort by order if specified
|
|
126
|
-
return pages.sort((a, b) => {
|
|
127
|
-
const orderA = a.metadata.order ?? 999;
|
|
128
|
-
const orderB = b.metadata.order ?? 999;
|
|
129
|
-
return orderA - orderB;
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Get all roadmap items
|
|
135
|
-
*/
|
|
136
|
-
export function getRoadmap(): RoadmapItem[] {
|
|
137
|
-
const roadmapDir = path.join(contentDirectory, 'roadmap');
|
|
138
|
-
const files = getMarkdownFiles(roadmapDir);
|
|
139
|
-
|
|
140
|
-
const items = files.map(filePath => {
|
|
141
|
-
const parsed = parseMarkdownFile<RoadmapItemMetadata>(filePath);
|
|
142
|
-
return parsed as RoadmapItem;
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
// Sort by order if specified, then by priority
|
|
146
|
-
return items.sort((a, b) => {
|
|
147
|
-
const orderA = a.metadata.order ?? 999;
|
|
148
|
-
const orderB = b.metadata.order ?? 999;
|
|
149
|
-
return orderA - orderB;
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
package/web/lib/content/types.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export interface PageMetadata {
|
|
2
|
-
title: string;
|
|
3
|
-
description: string;
|
|
4
|
-
slug: string;
|
|
5
|
-
heroImage?: string;
|
|
6
|
-
order?: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface Page {
|
|
10
|
-
metadata: PageMetadata;
|
|
11
|
-
content: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface RoadmapItemMetadata {
|
|
15
|
-
title: string;
|
|
16
|
-
status: 'planned' | 'in-progress' | 'completed' | 'on-hold';
|
|
17
|
-
timeframe?: string;
|
|
18
|
-
priority?: 'low' | 'medium' | 'high';
|
|
19
|
-
order?: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface RoadmapItem {
|
|
23
|
-
metadata: RoadmapItemMetadata;
|
|
24
|
-
content: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface NavigationLink {
|
|
28
|
-
label: string;
|
|
29
|
-
href: string;
|
|
30
|
-
external?: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface NavigationSection {
|
|
34
|
-
title: string;
|
|
35
|
-
links: NavigationLink[];
|
|
36
|
-
}
|
|
37
|
-
|
package/web/lib/utils.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Format star count for display
|
|
3
|
-
* @param count - The number of stars
|
|
4
|
-
* @returns Formatted string (e.g., "1.5k" for 1500)
|
|
5
|
-
*/
|
|
6
|
-
export function formatStars(count: number): string {
|
|
7
|
-
if (count >= 1000) {
|
|
8
|
-
return `${(count / 1000).toFixed(1)}k`;
|
|
9
|
-
}
|
|
10
|
-
return count.toString();
|
|
11
|
-
}
|
|
12
|
-
|