Skip to content

Commit 6ac2892

Browse files
ericyangpanclaude
andcommitted
refactor(build): improve type safety in manifest generation
Enhance the manifest index generation script to include proper TypeScript type imports and assertions for all generated files. Refactor manifesto module to use generated exports. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent cdf7bc0 commit 6ac2892

File tree

10 files changed

+79
-25
lines changed

10 files changed

+79
-25
lines changed

scripts/generate-manifest-indexes.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,30 @@ function generateIndexFile(typeName) {
9191
const firstFile = files[0].replace('.json', '');
9292
const firstVarName = toPascalCase(firstFile);
9393

94+
// Add appropriate type import based on manifest type
95+
const typeImportMap = {
96+
'ides': 'ManifestIDE',
97+
'clis': 'ManifestCLI',
98+
'models': 'ManifestModel',
99+
'providers': 'ManifestProvider',
100+
'extensions': 'ManifestExtension',
101+
'vendors': 'ManifestVendor'
102+
};
103+
104+
const manifestType = typeImportMap[typeName];
105+
const typeImport = manifestType ? `import type { ${manifestType} } from '../../types/manifests';\n\n` : '';
106+
94107
const content = `/**
95108
* Auto-generated manifest index for ${typeName}
96109
* Generated by scripts/generate-manifest-indexes.js
97110
* Do not edit manually - run the script to regenerate
98111
*/
99112
100-
${imports}
113+
${typeImport}${imports}
101114
102115
export const ${typeName}Data = [
103116
${arrayItems}
104-
];
117+
]${manifestType ? ` as unknown as ${manifestType}[]` : ''};
105118
106119
export type ${TypeName} = typeof ${firstVarName};
107120

src/lib/generated/clis.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestCLI } from '../../types/manifests';
8+
79
import AmazonQDeveloperCli from '../../../manifests/clis/amazon-q-developer-cli.json';
810
import AmpCli from '../../../manifests/clis/amp-cli.json';
911
import AugmentCodeCli from '../../../manifests/clis/augment-code-cli.json';
@@ -40,7 +42,7 @@ export const clisData = [
4042
NeovateCode,
4143
Opencode,
4244
QoderCli
43-
];
45+
] as unknown as ManifestCLI[];
4446

4547
export type Cli = typeof AmazonQDeveloperCli;
4648

src/lib/generated/extensions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestExtension } from '../../types/manifests';
8+
79
import Amp from '../../../manifests/extensions/amp.json';
810
import AugmentCode from '../../../manifests/extensions/augment-code.json';
911
import ClaudeCode from '../../../manifests/extensions/claude-code.json';
@@ -26,7 +28,7 @@ export const extensionsData = [
2628
KiloCode,
2729
RooCode,
2830
Tabnine
29-
];
31+
] as unknown as ManifestExtension[];
3032

3133
export type Extension = typeof Amp;
3234

src/lib/generated/ides.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestIDE } from '../../types/manifests';
8+
79
import Codebuddy from '../../../manifests/ides/codebuddy.json';
810
import Codeflicker from '../../../manifests/ides/codeflicker.json';
911
import Cursor from '../../../manifests/ides/cursor.json';
@@ -28,7 +30,7 @@ export const idesData = [
2830
Vscode,
2931
Windsurf,
3032
Zed
31-
];
33+
] as unknown as ManifestIDE[];
3234

3335
export type Ide = typeof Codebuddy;
3436

src/lib/generated/manifesto.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// This file is auto-generated by scripts/generate-metadata.mjs
2+
// DO NOT EDIT MANUALLY
3+
4+
/**
5+
* Return the Manifesto MDX React component for a given locale.
6+
* Falls back to the default locale ('en') when the requested locale is missing.
7+
*/
8+
export function getManifestoComponent(locale: string = 'en'): React.ComponentType {
9+
const components: Record<string, React.ComponentType> = {
10+
'en': require('@content/manifesto/en/index.mdx').default,
11+
'zh-Hans': require('@content/manifesto/zh-Hans/index.mdx').default,
12+
'de': require('@content/manifesto/de/index.mdx').default,
13+
};
14+
15+
return components[locale] || components['en'];
16+
}

src/lib/generated/metadata.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ export const faqMetadata: Record<string, FaqItem[]> = {
455455
},
456456
{
457457
"title": "Is AI Coding Stack open source? Can I contribute?",
458-
"content": "Yes, AI Coding Stack is fully open source and released under the Apache 2.0 license. The project welcomes contributions from the community! You can contribute by:\n\n- Adding or updating tool metadata in the manifests directory (ides.json, clis.json, models.json, providers.json)\n- Reporting inaccuracies or outdated information\n- Suggesting new tools to be added\n- Improving documentation and guides\n- Submitting pull requests\n\nVisit the [GitHub repository](https://github.com/ericyangpan/aicodingstack) to get started with contributing to the AI coding ecosystem."
458+
"content": "Yes, AI Coding Stack is fully open source and released under the Apache 2.0 license. The project welcomes contributions from the community! You can contribute by:\n\n- Adding or updating tool metadata in the manifests directory (ides.json, clis.json, models.json, providers.json)\n- Reporting inaccuracies or outdated information\n- Suggesting new tools to be added\n- Improving documentation and guides\n- Submitting pull requests\n\nVisit the [GitHub repository](https://github.com/aicodingstack/aicodingstack) to get started with contributing to the AI coding ecosystem."
459459
},
460460
{
461461
"title": "How does AI Coding Stack help me choose the right tools?",
@@ -477,7 +477,7 @@ export const faqMetadata: Record<string, FaqItem[]> = {
477477
},
478478
{
479479
"title": "AI Coding Stack 是开源的吗? 我可以贡献吗?",
480-
"content": "是的,AI Coding Stack 完全开源,采用 MIT 许可证发布。项目欢迎社区贡献!你可以通过以下方式贡献:\n\n- 在 manifests 目录中添加或更新工具元数据 (ides.json, clis.json, models.json, providers.json)\n- 报告不准确或过时的信息\n- 建议添加新工具\n- 改进文档和指南\n- 提交 pull request\n\n访问 [GitHub 仓库](https://github.com/ericyangpan/aicodingstack) 开始为 AI 编码生态系统做贡献。"
480+
"content": "是的,AI Coding Stack 完全开源,采用 MIT 许可证发布。项目欢迎社区贡献!你可以通过以下方式贡献:\n\n- 在 manifests 目录中添加或更新工具元数据 (ides.json, clis.json, models.json, providers.json)\n- 报告不准确或过时的信息\n- 建议添加新工具\n- 改进文档和指南\n- 提交 pull request\n\n访问 [GitHub 仓库](https://github.com/aicodingstack/aicodingstack) 开始为 AI 编码生态系统做贡献。"
481481
},
482482
{
483483
"title": "AI Coding Stack 如何帮助我选择合适的工具?",
@@ -499,7 +499,7 @@ export const faqMetadata: Record<string, FaqItem[]> = {
499499
},
500500
{
501501
"title": "Ist AI Coding Stack Open Source? Kann ich beitragen?",
502-
"content": "Ja, AI Coding Stack ist vollständig Open Source und unter der Apache 2.0 Lizenz veröffentlicht. Das Projekt begrüßt Beiträge aus der Community! Sie können beitragen, indem Sie:\n\n- Tool-Metadaten im Manifests-Verzeichnis hinzufügen oder aktualisieren (ides.json, clis.json, models.json, providers.json)\n- Ungenauigkeiten oder veraltete Informationen melden\n- Neue Tools vorschlagen, die hinzugefügt werden sollen\n- Dokumentation und Leitfäden verbessern\n- Pull-Requests einreichen\n\nBesuchen Sie das [GitHub-Repository](https://github.com/ericyangpan/aicodingstack), um mit dem Beitragen zum KI-Coding-Ökosystem zu beginnen."
502+
"content": "Ja, AI Coding Stack ist vollständig Open Source und unter der Apache 2.0 Lizenz veröffentlicht. Das Projekt begrüßt Beiträge aus der Community! Sie können beitragen, indem Sie:\n\n- Tool-Metadaten im Manifests-Verzeichnis hinzufügen oder aktualisieren (ides.json, clis.json, models.json, providers.json)\n- Ungenauigkeiten oder veraltete Informationen melden\n- Neue Tools vorschlagen, die hinzugefügt werden sollen\n- Dokumentation und Leitfäden verbessern\n- Pull-Requests einreichen\n\nBesuchen Sie das [GitHub-Repository](https://github.com/aicodingstack/aicodingstack), um mit dem Beitragen zum KI-Coding-Ökosystem zu beginnen."
503503
},
504504
{
505505
"title": "Wie hilft mir AI Coding Stack bei der Auswahl der richtigen Tools?",
@@ -512,7 +512,7 @@ export const stackCounts: Record<string, number> = {
512512
"ides": 11,
513513
"clis": 17,
514514
"extensions": 10,
515-
"models": 11,
515+
"models": 23,
516516
"model-providers": 6,
517517
"vendors": 12
518518
};

src/lib/generated/models.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,57 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestModel } from '../../types/manifests';
8+
79
import Claude37Sonnet from '../../../manifests/models/claude-3-7-sonnet.json';
10+
import ClaudeHaiku45 from '../../../manifests/models/claude-haiku-4-5.json';
811
import ClaudeOpus41 from '../../../manifests/models/claude-opus-4-1.json';
12+
import ClaudeSonnet45 from '../../../manifests/models/claude-sonnet-4-5.json';
13+
import ClaudeSonnet4 from '../../../manifests/models/claude-sonnet-4.json';
914
import DeepseekV3Terminus from '../../../manifests/models/deepseek-v3-terminus.json';
15+
import Gemini25Flash from '../../../manifests/models/gemini-2-5-flash.json';
16+
import Gemini25Pro from '../../../manifests/models/gemini-2-5-pro.json';
1017
import Glm46 from '../../../manifests/models/glm-4-6.json';
1118
import Gpt41 from '../../../manifests/models/gpt-4-1.json';
1219
import Gpt45 from '../../../manifests/models/gpt-4-5.json';
1320
import Gpt4o from '../../../manifests/models/gpt-4o.json';
21+
import Gpt51Codex from '../../../manifests/models/gpt-5-1-codex.json';
22+
import Gpt51 from '../../../manifests/models/gpt-5-1.json';
23+
import Gpt5Codex from '../../../manifests/models/gpt-5-codex.json';
24+
import Gpt5 from '../../../manifests/models/gpt-5.json';
25+
import GrokCodeFast1 from '../../../manifests/models/grok-code-fast-1.json';
1426
import KimiK20905 from '../../../manifests/models/kimi-k2-0905.json';
27+
import Llama4Maverick from '../../../manifests/models/llama-4-maverick.json';
1528
import MinimaxM2 from '../../../manifests/models/minimax-m2.json';
1629
import Qwen3Coder30bA3b from '../../../manifests/models/qwen3-coder-30b-a3b.json';
1730
import Qwen3Coder480bA35b from '../../../manifests/models/qwen3-coder-480b-a35b.json';
31+
import Qwen3CoderPlus from '../../../manifests/models/qwen3-coder-plus.json';
1832

1933
export const modelsData = [
2034
Claude37Sonnet,
35+
ClaudeHaiku45,
2136
ClaudeOpus41,
37+
ClaudeSonnet45,
38+
ClaudeSonnet4,
2239
DeepseekV3Terminus,
40+
Gemini25Flash,
41+
Gemini25Pro,
2342
Glm46,
2443
Gpt41,
2544
Gpt45,
2645
Gpt4o,
46+
Gpt51Codex,
47+
Gpt51,
48+
Gpt5Codex,
49+
Gpt5,
50+
GrokCodeFast1,
2751
KimiK20905,
52+
Llama4Maverick,
2853
MinimaxM2,
2954
Qwen3Coder30bA3b,
30-
Qwen3Coder480bA35b
31-
];
55+
Qwen3Coder480bA35b,
56+
Qwen3CoderPlus
57+
] as unknown as ManifestModel[];
3258

3359
export type Model = typeof Claude37Sonnet;
3460

src/lib/generated/providers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestProvider } from '../../types/manifests';
8+
79
import Deepseek from '../../../manifests/providers/deepseek.json';
810
import Minimax from '../../../manifests/providers/minimax.json';
911
import Moonshot from '../../../manifests/providers/moonshot.json';
@@ -18,7 +20,7 @@ export const providersData = [
1820
Openrouter,
1921
Siliconflow,
2022
ZAi
21-
];
23+
] as unknown as ManifestProvider[];
2224

2325
export type Provider = typeof Deepseek;
2426

src/lib/generated/vendors.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* Do not edit manually - run the script to regenerate
55
*/
66

7+
import type { ManifestVendor } from '../../types/manifests';
8+
79
import Anthropic from '../../../manifests/vendors/anthropic.json';
810
import Augment from '../../../manifests/vendors/augment.json';
911
import Deepseek from '../../../manifests/vendors/deepseek.json';
@@ -30,7 +32,7 @@ export const vendorsData = [
3032
Siliconflow,
3133
Sourcegraph,
3234
ZAi
33-
];
35+
] as unknown as ManifestVendor[];
3436

3537
export type Vendor = typeof Anthropic;
3638

src/lib/manifesto.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1 @@
1-
import React from 'react';
2-
3-
// MDX components mapping for manifesto content by locale
4-
const manifestoComponents: Record<string, React.ComponentType> = {
5-
'en': require('@content/manifesto/en/index.mdx').default,
6-
'zh-Hans': require('@content/manifesto/zh-Hans/index.mdx').default,
7-
};
8-
9-
// Get manifesto component for a specific locale with fallback to English
10-
export function getManifestoComponent(locale: string = 'en'): React.ComponentType {
11-
return manifestoComponents[locale] || manifestoComponents['en'];
12-
}
1+
export { getManifestoComponent } from '@/lib/generated/manifesto';

0 commit comments

Comments
 (0)