astro-dev-mcp 0.3.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -0
  3. package/dist/editors/commonEditor.d.ts +47 -0
  4. package/dist/editors/commonEditor.d.ts.map +1 -0
  5. package/dist/editors/commonEditor.js +108 -0
  6. package/dist/editors/commonEditor.js.map +1 -0
  7. package/dist/editors/scssVariablesEditor.d.ts +64 -0
  8. package/dist/editors/scssVariablesEditor.d.ts.map +1 -0
  9. package/dist/editors/scssVariablesEditor.js +105 -0
  10. package/dist/editors/scssVariablesEditor.js.map +1 -0
  11. package/dist/generators/astroGenerator.d.ts +15 -0
  12. package/dist/generators/astroGenerator.d.ts.map +1 -0
  13. package/dist/generators/astroGenerator.js +192 -0
  14. package/dist/generators/astroGenerator.js.map +1 -0
  15. package/dist/generators/scssGenerator.d.ts +15 -0
  16. package/dist/generators/scssGenerator.d.ts.map +1 -0
  17. package/dist/generators/scssGenerator.js +70 -0
  18. package/dist/generators/scssGenerator.js.map +1 -0
  19. package/dist/generators/typeGenerator.d.ts +5 -0
  20. package/dist/generators/typeGenerator.d.ts.map +1 -0
  21. package/dist/generators/typeGenerator.js +45 -0
  22. package/dist/generators/typeGenerator.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +285 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/parsers/excelParser.d.ts +5 -0
  28. package/dist/parsers/excelParser.d.ts.map +1 -0
  29. package/dist/parsers/excelParser.js +55 -0
  30. package/dist/parsers/excelParser.js.map +1 -0
  31. package/dist/parsers/markdownParser.d.ts +5 -0
  32. package/dist/parsers/markdownParser.d.ts.map +1 -0
  33. package/dist/parsers/markdownParser.js +69 -0
  34. package/dist/parsers/markdownParser.js.map +1 -0
  35. package/dist/templates/pageTemplates.d.ts +24 -0
  36. package/dist/templates/pageTemplates.d.ts.map +1 -0
  37. package/dist/templates/pageTemplates.js +69 -0
  38. package/dist/templates/pageTemplates.js.map +1 -0
  39. package/dist/templates/sectionTemplates.d.ts +14 -0
  40. package/dist/templates/sectionTemplates.d.ts.map +1 -0
  41. package/dist/templates/sectionTemplates.js +199 -0
  42. package/dist/templates/sectionTemplates.js.map +1 -0
  43. package/dist/templates/uiPatterns.d.ts +23 -0
  44. package/dist/templates/uiPatterns.d.ts.map +1 -0
  45. package/dist/templates/uiPatterns.js +330 -0
  46. package/dist/templates/uiPatterns.js.map +1 -0
  47. package/dist/tools/generateComponent.d.ts +10 -0
  48. package/dist/tools/generateComponent.d.ts.map +1 -0
  49. package/dist/tools/generateComponent.js +40 -0
  50. package/dist/tools/generateComponent.js.map +1 -0
  51. package/dist/tools/generatePage.d.ts +10 -0
  52. package/dist/tools/generatePage.d.ts.map +1 -0
  53. package/dist/tools/generatePage.js +95 -0
  54. package/dist/tools/generatePage.js.map +1 -0
  55. package/dist/tools/generateSchema.d.ts +10 -0
  56. package/dist/tools/generateSchema.d.ts.map +1 -0
  57. package/dist/tools/generateSchema.js +70 -0
  58. package/dist/tools/generateSchema.js.map +1 -0
  59. package/dist/tools/generateSection.d.ts +10 -0
  60. package/dist/tools/generateSection.d.ts.map +1 -0
  61. package/dist/tools/generateSection.js +50 -0
  62. package/dist/tools/generateSection.js.map +1 -0
  63. package/dist/utils/formatter.d.ts +6 -0
  64. package/dist/utils/formatter.d.ts.map +1 -0
  65. package/dist/utils/formatter.js +11 -0
  66. package/dist/utils/formatter.js.map +1 -0
  67. package/dist/utils/promptParser.d.ts +58 -0
  68. package/dist/utils/promptParser.d.ts.map +1 -0
  69. package/dist/utils/promptParser.js +200 -0
  70. package/dist/utils/promptParser.js.map +1 -0
  71. package/package.json +54 -0
@@ -0,0 +1,95 @@
1
+ import { generatePageTemplate } from "../templates/pageTemplates.js";
2
+ import { formatCode } from "../utils/formatter.js";
3
+ import { parsePageIntent } from "../utils/promptParser.js";
4
+ import { updateCommonAstro, } from "../editors/commonEditor.js";
5
+ import { updateScssVariables, } from "../editors/scssVariablesEditor.js";
6
+ import { readFileSync, writeFileSync, existsSync } from "fs";
7
+ import { resolve } from "path";
8
+ /**
9
+ * ページ生成ツール(サイト設定更新統合版)
10
+ */
11
+ export async function generatePage(args) {
12
+ const { pageName, prompt, pageData, sections, siteConfig, scssConfig, projectRoot = process.cwd(), } = args;
13
+ try {
14
+ const updateLogs = [];
15
+ // ページタイプ自動判定
16
+ let pageType;
17
+ if (prompt) {
18
+ const parsed = parsePageIntent(prompt, pageName);
19
+ pageType = parsed.pageType;
20
+ if (parsed.confidence < 0.7) {
21
+ updateLogs.push(`⚠️ ページタイプ判定の信頼度が低い(${parsed.confidence}): "${prompt}"`);
22
+ }
23
+ }
24
+ // 1. Common.astro の更新(サイト設定が指定されている場合)
25
+ if (siteConfig) {
26
+ const commonPath = resolve(projectRoot, "src/layouts/Common.astro");
27
+ if (existsSync(commonPath)) {
28
+ const originalContent = readFileSync(commonPath, "utf-8");
29
+ const updatedContent = updateCommonAstro(originalContent, siteConfig);
30
+ writeFileSync(commonPath, updatedContent, "utf-8");
31
+ updateLogs.push("✅ Common.astro を更新しました");
32
+ if (siteConfig.head) {
33
+ const updatedFields = Object.keys(siteConfig.head).join(", ");
34
+ updateLogs.push(` - head: ${updatedFields}`);
35
+ }
36
+ if (siteConfig.menu) {
37
+ updateLogs.push(` - menu: ${siteConfig.menu.length}項目`);
38
+ }
39
+ }
40
+ else {
41
+ updateLogs.push(`⚠️ Common.astro が見つかりません: ${commonPath}`);
42
+ }
43
+ }
44
+ // 2. _variables.scss の更新(SCSS設定が指定されている場合)
45
+ if (scssConfig) {
46
+ const scssPath = resolve(projectRoot, "src/scss/abstracts/_variables.scss");
47
+ if (existsSync(scssPath)) {
48
+ const originalContent = readFileSync(scssPath, "utf-8");
49
+ const updatedContent = updateScssVariables(originalContent, scssConfig);
50
+ writeFileSync(scssPath, updatedContent, "utf-8");
51
+ updateLogs.push("✅ _variables.scss を更新しました");
52
+ if (scssConfig.colors) {
53
+ const updatedColors = Object.keys(scssConfig.colors).join(", ");
54
+ updateLogs.push(` - colors: ${updatedColors}`);
55
+ }
56
+ if (scssConfig.layout) {
57
+ const updatedLayout = Object.keys(scssConfig.layout).join(", ");
58
+ updateLogs.push(` - layout: ${updatedLayout}`);
59
+ }
60
+ if (scssConfig.fontSizes) {
61
+ const updatedFonts = Object.keys(scssConfig.fontSizes).join(", ");
62
+ updateLogs.push(` - fontSizes: ${updatedFonts}`);
63
+ }
64
+ }
65
+ else {
66
+ updateLogs.push(`⚠️ _variables.scss が見つかりません: ${scssPath}`);
67
+ }
68
+ }
69
+ // 3. ページテンプレート生成
70
+ const pageCode = generatePageTemplate({
71
+ pageName,
72
+ pageType,
73
+ pageData,
74
+ sections,
75
+ });
76
+ // コード整形
77
+ const formatted = await formatCode(pageCode, "astro");
78
+ // 結果メッセージの構築
79
+ const updateSection = updateLogs.length > 0
80
+ ? `### サイト設定更新\n${updateLogs.join("\n")}\n\n`
81
+ : "";
82
+ return {
83
+ content: [
84
+ {
85
+ type: "text",
86
+ text: `${updateSection}### ページ生成\n✅ ページ「${pageName}」を生成しました\n\n\`\`\`astro\n${formatted}\n\`\`\`\n\n### 配置先\n- \`src/pages/${pageName}/index.astro\`\n\n### 必要なセクション\n${sections.map((s) => `- \`src/pages/_parts/_${pageName}/_${s}.astro\``).join("\n")}`,
87
+ },
88
+ ],
89
+ };
90
+ }
91
+ catch (error) {
92
+ throw new Error(`ページ生成エラー: ${error}`);
93
+ }
94
+ }
95
+ //# sourceMappingURL=generatePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generatePage.js","sourceRoot":"","sources":["../../src/tools/generatePage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * スキーマ生成ツール
3
+ */
4
+ export declare function generateSchema(args: any): Promise<{
5
+ content: {
6
+ type: string;
7
+ text: string;
8
+ }[];
9
+ }>;
10
+ //# sourceMappingURL=generateSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSchema.d.ts","sourceRoot":"","sources":["../../src/tools/generateSchema.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG;;;;;GA0C7C"}
@@ -0,0 +1,70 @@
1
+ import { parseExcel } from "../parsers/excelParser.js";
2
+ import { parseMarkdown } from "../parsers/markdownParser.js";
3
+ import { generateTypeDefinition } from "../generators/typeGenerator.js";
4
+ import { formatCode } from "../utils/formatter.js";
5
+ /**
6
+ * スキーマ生成ツール
7
+ */
8
+ export async function generateSchema(args) {
9
+ const { sourceType, sourceData, schemaName } = args;
10
+ try {
11
+ let parsedData;
12
+ // データソースに応じてパース
13
+ switch (sourceType) {
14
+ case "excel":
15
+ parsedData = await parseExcel(sourceData);
16
+ break;
17
+ case "markdown":
18
+ parsedData = await parseMarkdown(sourceData);
19
+ break;
20
+ case "json":
21
+ parsedData = JSON.parse(sourceData);
22
+ break;
23
+ case "text":
24
+ // テキストから構造を推測
25
+ parsedData = inferStructureFromText(sourceData);
26
+ break;
27
+ default:
28
+ throw new Error(`Unsupported source type: ${sourceType}`);
29
+ }
30
+ // TypeScript型定義生成
31
+ const typeDefinition = generateTypeDefinition(schemaName, parsedData);
32
+ // コード整形
33
+ const formatted = await formatCode(typeDefinition, "typescript");
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: `✅ スキーマ「${schemaName}」を生成しました\n\n\`\`\`typescript\n${formatted}\n\`\`\`\n\n### 使用例\n\`\`\`typescript\nconst page: ${schemaName} = {\n // データを記述\n};\n\`\`\``,
39
+ },
40
+ ],
41
+ };
42
+ }
43
+ catch (error) {
44
+ throw new Error(`スキーマ生成エラー: ${error}`);
45
+ }
46
+ }
47
+ function inferStructureFromText(text) {
48
+ // シンプルなテキスト解析(改善の余地あり)
49
+ const lines = text.split("\n").filter((line) => line.trim());
50
+ const structure = {};
51
+ for (const line of lines) {
52
+ if (line.includes(":")) {
53
+ const [key, value] = line.split(":").map((s) => s.trim());
54
+ structure[key] = inferType(value);
55
+ }
56
+ }
57
+ return structure;
58
+ }
59
+ function inferType(value) {
60
+ if (!isNaN(Number(value)))
61
+ return "number";
62
+ if (value === "true" || value === "false")
63
+ return "boolean";
64
+ if (value.startsWith("[") && value.endsWith("]"))
65
+ return "array";
66
+ if (value.startsWith("{") && value.endsWith("}"))
67
+ return "object";
68
+ return "string";
69
+ }
70
+ //# sourceMappingURL=generateSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSchema.js","sourceRoot":"","sources":["../../src/tools/generateSchema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * セクション生成ツール
3
+ */
4
+ export declare function generateSection(args: any): Promise<{
5
+ content: {
6
+ type: string;
7
+ text: string;
8
+ }[];
9
+ }>;
10
+ //# sourceMappingURL=generateSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSection.d.ts","sourceRoot":"","sources":["../../src/tools/generateSection.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,GAAG;;;;;GAuD9C"}
@@ -0,0 +1,50 @@
1
+ import { generateSectionTemplate } from '../templates/sectionTemplates.js';
2
+ import { formatCode } from '../utils/formatter.js';
3
+ import { parseSectionIntent } from '../utils/promptParser.js';
4
+ /**
5
+ * セクション生成ツール
6
+ */
7
+ export async function generateSection(args) {
8
+ const { prompt, sectionType, uiPattern, pageName, content, components = [], } = args;
9
+ try {
10
+ let finalSectionType;
11
+ let finalUIPattern;
12
+ // プロンプトが指定されている場合は解析
13
+ if (prompt) {
14
+ const parsed = parseSectionIntent(prompt);
15
+ finalSectionType = parsed.contentType;
16
+ finalUIPattern = parsed.uiPattern;
17
+ // 低信頼度の場合は警告
18
+ if (parsed.confidence < 0.7) {
19
+ console.warn(`⚠️ プロンプト解析の信頼度が低い(${parsed.confidence}): "${prompt}"`);
20
+ }
21
+ }
22
+ else {
23
+ // 構造化データが指定されている場合
24
+ finalSectionType = sectionType;
25
+ finalUIPattern = uiPattern;
26
+ }
27
+ // セクションテンプレート生成
28
+ const sectionCode = generateSectionTemplate({
29
+ type: finalSectionType,
30
+ uiPattern: finalUIPattern,
31
+ pageName,
32
+ content: content || {},
33
+ components,
34
+ });
35
+ // コード整形
36
+ const formatted = await formatCode(sectionCode, 'astro');
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: `✅ セクション「${finalSectionType}」(UI: ${finalUIPattern || 'デフォルト'})を生成しました\n\n\`\`\`astro\n${formatted}\n\`\`\`\n\n### 配置先\n- \`src/pages/_parts/_${pageName}/_${finalSectionType}.astro\``,
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ catch (error) {
47
+ throw new Error(`セクション生成エラー: ${error}`);
48
+ }
49
+ }
50
+ //# sourceMappingURL=generateSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSection.js","sourceRoot":"","sources":["../../src/tools/generateSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAa9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAS;IAC9C,MAAM,EACL,MAAM,EACN,WAAW,EACX,SAAS,EACT,QAAQ,EACR,OAAO,EACP,UAAU,GAAG,EAAE,GACf,GAAG,IAAmB,CAAC;IAExB,IAAI,CAAC;QACJ,IAAI,gBAAwB,CAAC;QAC7B,IAAI,cAAkC,CAAC;QAEvC,qBAAqB;QACrB,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC1C,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC;YACtC,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC;YAElC,aAAa;YACb,IAAI,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CACX,qBAAqB,MAAM,CAAC,UAAU,OAAO,MAAM,GAAG,CACtD,CAAC;YACH,CAAC;QACF,CAAC;aAAM,CAAC;YACP,mBAAmB;YACnB,gBAAgB,GAAG,WAAY,CAAC;YAChC,cAAc,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,uBAAuB,CAAC;YAC3C,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,cAAqB;YAChC,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,UAAU;SACV,CAAC,CAAC;QAEH,QAAQ;QACR,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEzD,OAAO;YACN,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW,gBAAgB,SAAS,cAAc,IAAI,OAAO,4BAA4B,SAAS,8CAA8C,QAAQ,KAAK,gBAAgB,UAAU;iBAC7L;aACD;SACD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * コード整形ユーティリティ(簡易版)
3
+ * 基本的な整形のみ実施
4
+ */
5
+ export declare function formatCode(code: string, parser: "astro" | "scss" | "typescript"): Promise<string>;
6
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,GACtC,OAAO,CAAC,MAAM,CAAC,CAKjB"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * コード整形ユーティリティ(簡易版)
3
+ * 基本的な整形のみ実施
4
+ */
5
+ export async function formatCode(code, parser) {
6
+ // 簡易的な整形処理
7
+ // 生成されたコードをそのまま返す
8
+ // 実際のプロジェクトではPrettierで整形することを推奨
9
+ return code;
10
+ }
11
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,MAAuC;IAEvC,WAAW;IACX,kBAAkB;IAClB,gCAAgC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * プロンプト解析ユーティリティ
3
+ * 自然言語からUIパターンとコンテンツタイプを抽出
4
+ */
5
+ import type { UIPattern } from '../templates/uiPatterns.js';
6
+ export interface ParsedSectionIntent {
7
+ contentType: string;
8
+ uiPattern: UIPattern;
9
+ confidence: number;
10
+ }
11
+ export interface ParsedPageIntent {
12
+ pageType: 'top' | 'lower';
13
+ confidence: number;
14
+ }
15
+ /**
16
+ * プロンプトからセクション意図を解析
17
+ */
18
+ export declare function parseSectionIntent(prompt: string): ParsedSectionIntent;
19
+ /**
20
+ * プロンプト例と期待される結果のテスト用サンプル
21
+ */
22
+ export declare const PROMPT_EXAMPLES: {
23
+ 記事一覧をカード形式で表示: {
24
+ contentType: string;
25
+ uiPattern: string;
26
+ confidence: number;
27
+ };
28
+ カテゴリをタブで表示: {
29
+ contentType: string;
30
+ uiPattern: string;
31
+ confidence: number;
32
+ };
33
+ 'Q&A\u3092\u30A2\u30B3\u30FC\u30C7\u30A3\u30AA\u30F3\u5F62\u5F0F\u3067': {
34
+ contentType: string;
35
+ uiPattern: string;
36
+ confidence: number;
37
+ };
38
+ 技術スタックをグリッドで: {
39
+ contentType: string;
40
+ uiPattern: string;
41
+ confidence: number;
42
+ };
43
+ 動画ギャラリーをモーダルで: {
44
+ contentType: string;
45
+ uiPattern: string;
46
+ confidence: number;
47
+ };
48
+ 記事をカルーセルで表示: {
49
+ contentType: string;
50
+ uiPattern: string;
51
+ confidence: number;
52
+ };
53
+ };
54
+ /**
55
+ * プロンプトからページタイプ(トップ/下層)を判定
56
+ */
57
+ export declare function parsePageIntent(prompt: string, pageName?: string): ParsedPageIntent;
58
+ //# sourceMappingURL=promptParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptParser.d.ts","sourceRoot":"","sources":["../../src/utils/promptParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAiBtE;AAwGD;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B3B,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GACf,gBAAgB,CAiDlB"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * プロンプト解析ユーティリティ
3
+ * 自然言語からUIパターンとコンテンツタイプを抽出
4
+ */
5
+ /**
6
+ * プロンプトからセクション意図を解析
7
+ */
8
+ export function parseSectionIntent(prompt) {
9
+ const normalizedPrompt = prompt.toLowerCase();
10
+ // UIパターンキーワード検出
11
+ const uiPattern = detectUIPattern(normalizedPrompt);
12
+ // コンテンツタイプ検出
13
+ const contentType = detectContentType(normalizedPrompt);
14
+ // 信頼度計算
15
+ const confidence = calculateConfidence(normalizedPrompt, uiPattern, contentType);
16
+ return {
17
+ contentType,
18
+ uiPattern,
19
+ confidence,
20
+ };
21
+ }
22
+ /**
23
+ * UIパターンキーワード検出
24
+ */
25
+ function detectUIPattern(prompt) {
26
+ const patterns = {
27
+ タブ: 'tab',
28
+ tab: 'tab',
29
+ アコーディオン: 'accordion',
30
+ accordion: 'accordion',
31
+ グリッド: 'grid',
32
+ grid: 'grid',
33
+ カード: 'grid',
34
+ card: 'grid',
35
+ カルーセル: 'carousel',
36
+ carousel: 'carousel',
37
+ スライダー: 'carousel',
38
+ slider: 'carousel',
39
+ リスト: 'list',
40
+ list: 'list',
41
+ モーダル: 'modal',
42
+ modal: 'modal',
43
+ ギャラリー: 'modal',
44
+ gallery: 'modal',
45
+ };
46
+ for (const [keyword, pattern] of Object.entries(patterns)) {
47
+ if (prompt.includes(keyword)) {
48
+ return pattern;
49
+ }
50
+ }
51
+ // デフォルト: グリッド
52
+ return 'grid';
53
+ }
54
+ /**
55
+ * コンテンツタイプ検出
56
+ */
57
+ function detectContentType(prompt) {
58
+ const contentTypes = {
59
+ 記事: 'articles',
60
+ article: 'articles',
61
+ ブログ: 'articles',
62
+ blog: 'articles',
63
+ カテゴリ: 'categories',
64
+ category: 'categories',
65
+ カテゴリー: 'categories',
66
+ categories: 'categories',
67
+ 'q&a': 'qa',
68
+ qa: 'qa',
69
+ 質問: 'qa',
70
+ faq: 'qa',
71
+ 機能: 'features',
72
+ feature: 'features',
73
+ 技術: 'tech',
74
+ tech: 'tech',
75
+ technology: 'tech',
76
+ 動画: 'videos',
77
+ video: 'videos',
78
+ 画像: 'gallery',
79
+ image: 'gallery',
80
+ ギャラリー: 'gallery',
81
+ gallery: 'gallery',
82
+ };
83
+ for (const [keyword, type] of Object.entries(contentTypes)) {
84
+ if (prompt.includes(keyword)) {
85
+ return type;
86
+ }
87
+ }
88
+ // デフォルト: カスタム
89
+ return 'custom';
90
+ }
91
+ /**
92
+ * 信頼度計算
93
+ */
94
+ function calculateConfidence(prompt, uiPattern, contentType) {
95
+ let confidence = 0.5; // 基準値
96
+ // UIパターンのキーワードがあれば +0.3
97
+ if (prompt.includes('タブ') || prompt.includes('tab'))
98
+ confidence += 0.3;
99
+ if (prompt.includes('アコーディオン') || prompt.includes('accordion'))
100
+ confidence += 0.3;
101
+ if (prompt.includes('グリッド') || prompt.includes('grid'))
102
+ confidence += 0.3;
103
+ if (prompt.includes('カード') || prompt.includes('card'))
104
+ confidence += 0.3;
105
+ if (prompt.includes('カルーセル') || prompt.includes('carousel'))
106
+ confidence += 0.3;
107
+ if (prompt.includes('スライダー') || prompt.includes('slider'))
108
+ confidence += 0.3;
109
+ if (prompt.includes('リスト') || prompt.includes('list'))
110
+ confidence += 0.3;
111
+ if (prompt.includes('モーダル') || prompt.includes('modal'))
112
+ confidence += 0.3;
113
+ if (prompt.includes('ギャラリー') || prompt.includes('gallery'))
114
+ confidence += 0.3;
115
+ // コンテンツタイプのキーワードがあれば +0.2
116
+ if (contentType !== 'custom')
117
+ confidence += 0.2;
118
+ return Math.min(confidence, 1.0);
119
+ }
120
+ /**
121
+ * プロンプト例と期待される結果のテスト用サンプル
122
+ */
123
+ export const PROMPT_EXAMPLES = {
124
+ 記事一覧をカード形式で表示: {
125
+ contentType: 'articles',
126
+ uiPattern: 'grid',
127
+ confidence: 0.8,
128
+ },
129
+ カテゴリをタブで表示: {
130
+ contentType: 'categories',
131
+ uiPattern: 'tab',
132
+ confidence: 1.0,
133
+ },
134
+ 'Q&Aをアコーディオン形式で': {
135
+ contentType: 'qa',
136
+ uiPattern: 'accordion',
137
+ confidence: 1.0,
138
+ },
139
+ 技術スタックをグリッドで: {
140
+ contentType: 'tech',
141
+ uiPattern: 'grid',
142
+ confidence: 1.0,
143
+ },
144
+ 動画ギャラリーをモーダルで: {
145
+ contentType: 'videos',
146
+ uiPattern: 'modal',
147
+ confidence: 1.0,
148
+ },
149
+ 記事をカルーセルで表示: {
150
+ contentType: 'articles',
151
+ uiPattern: 'carousel',
152
+ confidence: 1.0,
153
+ },
154
+ };
155
+ /**
156
+ * プロンプトからページタイプ(トップ/下層)を判定
157
+ */
158
+ export function parsePageIntent(prompt, pageName) {
159
+ const normalizedPrompt = prompt.toLowerCase();
160
+ let confidence = 0.5;
161
+ // 下層ページキーワード
162
+ const lowerKeywords = [
163
+ '下層',
164
+ 'サブ',
165
+ '詳細',
166
+ '子ページ',
167
+ 'about',
168
+ 'service',
169
+ 'contact',
170
+ 'company',
171
+ 'news',
172
+ 'blog',
173
+ 'products',
174
+ 'recruit',
175
+ ];
176
+ // トップページキーワード
177
+ const topKeywords = ['トップ', 'ホーム', 'top', 'home', 'index', 'メイン'];
178
+ // プロンプトから判定
179
+ const hasLowerKeyword = lowerKeywords.some((k) => normalizedPrompt.includes(k));
180
+ const hasTopKeyword = topKeywords.some((k) => normalizedPrompt.includes(k));
181
+ // ページ名から判定(補助的)
182
+ const isTopPageName = pageName === 'top' || pageName === 'index' || pageName === 'home';
183
+ // 判定ロジック
184
+ if (hasTopKeyword || isTopPageName) {
185
+ confidence = hasTopKeyword ? 0.9 : 0.7;
186
+ return { pageType: 'top', confidence };
187
+ }
188
+ if (hasLowerKeyword) {
189
+ confidence = 0.9;
190
+ return { pageType: 'lower', confidence };
191
+ }
192
+ // デフォルト: ページ名がtop/index/home以外は下層と判定
193
+ if (pageName && !isTopPageName) {
194
+ confidence = 0.6;
195
+ return { pageType: 'lower', confidence };
196
+ }
197
+ // 完全にわからない場合はトップページとする
198
+ return { pageType: 'top', confidence: 0.3 };
199
+ }
200
+ //# sourceMappingURL=promptParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptParser.js","sourceRoot":"","sources":["../../src/utils/promptParser.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "astro-dev-mcp",
3
+ "version": "0.3.0",
4
+ "description": "MCP server for generating Astro components, sections, and pages from design data and content",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "astro-dev-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "inspector": "npx @modelcontextprotocol/inspector dist/index.js",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "astro",
25
+ "generator",
26
+ "code-generation",
27
+ "design-to-code",
28
+ "model-context-protocol"
29
+ ],
30
+ "author": "",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/YoshiokaY/astro-dev-mcp.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/YoshiokaY/astro-dev-mcp/issues"
38
+ },
39
+ "homepage": "https://github.com/YoshiokaY/astro-dev-mcp#readme",
40
+ "dependencies": {
41
+ "@modelcontextprotocol/sdk": "^1.0.4",
42
+ "zod": "^3.23.8",
43
+ "xlsx": "^0.18.5",
44
+ "gray-matter": "^4.0.3",
45
+ "prettier": "^3.5.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^22.15.3",
49
+ "typescript": "^5.8.3"
50
+ },
51
+ "engines": {
52
+ "node": ">=18.0.0"
53
+ }
54
+ }