astro-dev-mcp 0.6.0 → 0.7.1
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/editors/appJsEditor.d.ts.map +1 -1
- package/dist/editors/appJsEditor.js +4 -2
- package/dist/editors/appJsEditor.js.map +1 -1
- package/dist/editors/commonEditor.d.ts +0 -4
- package/dist/editors/commonEditor.d.ts.map +1 -1
- package/dist/editors/commonEditor.js +3 -2
- package/dist/editors/commonEditor.js.map +1 -1
- package/dist/editors/scssVariablesEditor.d.ts +0 -4
- package/dist/editors/scssVariablesEditor.d.ts.map +1 -1
- package/dist/editors/scssVariablesEditor.js +3 -2
- package/dist/editors/scssVariablesEditor.js.map +1 -1
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/excelParser.d.ts.map +1 -1
- package/dist/parsers/excelParser.js +29 -6
- package/dist/parsers/excelParser.js.map +1 -1
- package/dist/templates/pageTemplates.js +6 -2
- package/dist/templates/pageTemplates.js.map +1 -1
- package/dist/templates/sectionTemplates.js +21 -21
- package/dist/templates/sectionTemplates.js.map +1 -1
- package/dist/templates/uiPatterns.js +76 -1
- package/dist/templates/uiPatterns.js.map +1 -1
- package/dist/tools/generateComponent.d.ts.map +1 -1
- package/dist/tools/generateComponent.js +8 -2
- package/dist/tools/generateComponent.js.map +1 -1
- package/dist/tools/generatePage.d.ts.map +1 -1
- package/dist/tools/generatePage.js +18 -4
- package/dist/tools/generatePage.js.map +1 -1
- package/dist/tools/generateSchema.d.ts.map +1 -1
- package/dist/tools/generateSchema.js +9 -1
- package/dist/tools/generateSchema.js.map +1 -1
- package/dist/tools/generateSection.d.ts.map +1 -1
- package/dist/tools/generateSection.js +10 -1
- package/dist/tools/generateSection.js.map +1 -1
- package/dist/tools/getComponentInterface.d.ts +11 -0
- package/dist/tools/getComponentInterface.d.ts.map +1 -0
- package/dist/tools/getComponentInterface.js +111 -0
- package/dist/tools/getComponentInterface.js.map +1 -0
- package/dist/tools/getProjectContext.d.ts +10 -0
- package/dist/tools/getProjectContext.d.ts.map +1 -0
- package/dist/tools/getProjectContext.js +175 -0
- package/dist/tools/getProjectContext.js.map +1 -0
- package/dist/utils/projectContext.d.ts +6 -0
- package/dist/utils/projectContext.d.ts.map +1 -0
- package/dist/utils/projectContext.js +72 -0
- package/dist/utils/projectContext.js.map +1 -0
- package/dist/utils/security.d.ts +16 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +37 -0
- package/dist/utils/security.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { resolve } from "path";
|
|
3
|
+
import { escapeRegExp } from "./security.js";
|
|
4
|
+
/**
|
|
5
|
+
* generate-* ツール実行時にレスポンスへ自動注入するプロジェクト規約を取得
|
|
6
|
+
* get-project-context の完全版とは異なり、生成に直接関わる最小限の情報のみ返す
|
|
7
|
+
*/
|
|
8
|
+
export function getGenerationContext(projectRoot) {
|
|
9
|
+
const sections = [];
|
|
10
|
+
// 1. コーディング規約の読み込み
|
|
11
|
+
const rules = readProjectRules(projectRoot);
|
|
12
|
+
if (rules) {
|
|
13
|
+
sections.push(rules);
|
|
14
|
+
}
|
|
15
|
+
// 2. SCSS変数の要約
|
|
16
|
+
const scssVars = readScssVariablesSummary(projectRoot);
|
|
17
|
+
if (scssVars) {
|
|
18
|
+
sections.push(`### SCSS変数\n${scssVars}`);
|
|
19
|
+
}
|
|
20
|
+
if (sections.length === 0)
|
|
21
|
+
return "";
|
|
22
|
+
return `\n\n---\n### プロジェクト規約(自動注入)\n${sections.join("\n\n")}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ai-context.md または .cursorrules からプロジェクト規約を読み込む
|
|
26
|
+
*/
|
|
27
|
+
function readProjectRules(projectRoot) {
|
|
28
|
+
const files = ["ai-context.md", ".cursorrules"];
|
|
29
|
+
for (const file of files) {
|
|
30
|
+
const filePath = resolve(projectRoot, file);
|
|
31
|
+
if (existsSync(filePath)) {
|
|
32
|
+
try {
|
|
33
|
+
return readFileSync(filePath, "utf-8")
|
|
34
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
35
|
+
.trim();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* _variables.scss からカラー・レイアウト変数の要約を抽出
|
|
46
|
+
*/
|
|
47
|
+
function readScssVariablesSummary(projectRoot) {
|
|
48
|
+
const filePath = resolve(projectRoot, "src/scss/abstracts/_variables.scss");
|
|
49
|
+
if (!existsSync(filePath))
|
|
50
|
+
return null;
|
|
51
|
+
try {
|
|
52
|
+
const content = readFileSync(filePath, "utf-8");
|
|
53
|
+
const lines = [];
|
|
54
|
+
// カラー変数
|
|
55
|
+
const colors = content.match(/\$color-[\w-]+:\s*[^;]+;/g);
|
|
56
|
+
if (colors) {
|
|
57
|
+
lines.push(...colors.map((m) => m.trim()));
|
|
58
|
+
}
|
|
59
|
+
// レイアウト変数
|
|
60
|
+
const layoutVars = ["$brakePoint", "$containerSize", "$containerPadding"];
|
|
61
|
+
for (const v of layoutVars) {
|
|
62
|
+
const match = content.match(new RegExp(`${escapeRegExp(v)}:\\s*[^;]+;`));
|
|
63
|
+
if (match)
|
|
64
|
+
lines.push(match[0].trim());
|
|
65
|
+
}
|
|
66
|
+
return lines.length > 0 ? lines.join("\n") : null;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=projectContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectContext.js","sourceRoot":"","sources":["../../src/utils/projectContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* パスがプロジェクトルート内に収まっているか検証
|
|
3
|
+
* パストラバーサル攻撃を防ぐ
|
|
4
|
+
*/
|
|
5
|
+
export declare function assertPathWithinProject(resolvedPath: string, projectRoot: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* ファイル名として安全な文字列か検証
|
|
8
|
+
* コンポーネント名、ページ名、セクション名に使用
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateName(name: string, label: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* 正規表現の特殊文字をエスケープ
|
|
13
|
+
* ユーザー入力を RegExp パターンに使用する際の安全対策
|
|
14
|
+
*/
|
|
15
|
+
export declare function escapeRegExp(str: string): string;
|
|
16
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAe9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { resolve, relative } from "path";
|
|
2
|
+
/**
|
|
3
|
+
* パスがプロジェクトルート内に収まっているか検証
|
|
4
|
+
* パストラバーサル攻撃を防ぐ
|
|
5
|
+
*/
|
|
6
|
+
export function assertPathWithinProject(resolvedPath, projectRoot) {
|
|
7
|
+
const normalizedRoot = resolve(projectRoot);
|
|
8
|
+
const normalizedPath = resolve(resolvedPath);
|
|
9
|
+
const rel = relative(normalizedRoot, normalizedPath);
|
|
10
|
+
if (rel.startsWith("..") || resolve(normalizedRoot, rel) !== normalizedPath) {
|
|
11
|
+
throw new Error(`セキュリティエラー: パスがプロジェクト外を参照しています: ${resolvedPath}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* ファイル名として安全な文字列か検証
|
|
16
|
+
* コンポーネント名、ページ名、セクション名に使用
|
|
17
|
+
*/
|
|
18
|
+
export function validateName(name, label) {
|
|
19
|
+
if (!name || !name.trim()) {
|
|
20
|
+
throw new Error(`${label}が空です`);
|
|
21
|
+
}
|
|
22
|
+
if (name.length > 255) {
|
|
23
|
+
throw new Error(`${label}が長すぎます(最大255文字)`);
|
|
24
|
+
}
|
|
25
|
+
// 英数字、ハイフン、アンダースコアのみ許可(先頭は英字)
|
|
26
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
|
|
27
|
+
throw new Error(`${label}に無効な文字が含まれています: "${name}"(英数字・ハイフン・アンダースコアのみ、先頭は英字)`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 正規表現の特殊文字をエスケープ
|
|
32
|
+
* ユーザー入力を RegExp パターンに使用する際の安全対策
|
|
33
|
+
*/
|
|
34
|
+
export function escapeRegExp(str) {
|
|
35
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,WAAmB;IAEnB,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAErD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,cAAc,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,kCAAkC,YAAY,EAAE,CACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,oBAAoB,IAAI,6BAA6B,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "astro-dev-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "MCP server for generating Astro components, sections, and pages from design data and content",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"homepage": "https://github.com/YoshiokaY/astro-dev-mcp#readme",
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
42
|
-
"
|
|
43
|
-
"xlsx": "^0.18.5",
|
|
42
|
+
"exceljs": "^4.4.0",
|
|
44
43
|
"gray-matter": "^4.0.3",
|
|
45
|
-
"prettier": "^3.5.3"
|
|
44
|
+
"prettier": "^3.5.3",
|
|
45
|
+
"zod": "^3.23.8"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^22.15.3",
|