Skip to content

Commit 977260c

Browse files
Merge pull request #10 from RyosukeDTomita/feature/sigma-markdown-preview
feat: markdown preview
2 parents ba24569 + 6478dcf commit 977260c

File tree

17 files changed

+2691
-33
lines changed

17 files changed

+2691
-33
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ URLのクエリ文字列にテキストを保存する、最小構成のメモ
4949
### Local environment
5050

5151
```shell
52-
cd url-memo-app
52+
cd url-query-memo/url-memo-app
5353
npm install
5454
```
5555

5656
```shell
5757
npm run dev
5858
```
5959

60-
go to http://localhost:3000/MyActivity/
60+
go to http://localhost:3000/url-query-memo
6161

6262

6363
### GitHub settings

prompt.md

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
# Kiroスタイル ドキュメント生成プロンプト
2+
3+
## 概要
4+
このプロンプトテンプレートは、Kiroのspec-driven開発アプローチに基づいて、プロジェクトのドキュメントを生成するためのガイドラインです。Kiroは要件定義、設計、タスクを3つのマークダウンファイル(requirements.md、design.md、tasks.md)として管理し、コードベースと同期した「生きたドキュメント」を維持します。
5+
6+
## プロンプトテンプレート
7+
8+
### 1. Requirements.md 生成プロンプト
9+
10+
```
11+
以下の情報を基に、Kiroスタイルのrequirements.mdを作成してください:
12+
13+
プロジェクト名: [プロジェクト名]
14+
プロジェクトの概要: [プロジェクトの目的と基本的な説明]
15+
16+
以下の形式に従ってください:
17+
18+
1. **Introduction**セクション
19+
- プロジェクトの背景と目的を日本語で詳細に説明
20+
- ユーザーに提供する価値を明確に記述
21+
- 技術的なアプローチの概要を含める
22+
23+
2. **Requirements**セクション
24+
各要件について以下を含める:
25+
- 要件番号とタイトル(日本語)
26+
- User Story形式:「ユーザーとして、[目的]したいので、[機能]が必要です。」
27+
- Acceptance Criteria(受け入れ条件):
28+
- WHEN/THEN形式で具体的な動作を記述
29+
- IF/THEN形式で条件分岐を記述
30+
- 各条件は番号付きリストで整理
31+
32+
重要な要件カテゴリ:
33+
- 基本機能要件
34+
- ユーザーインターフェース要件
35+
- データ管理要件
36+
- セキュリティ/プライバシー要件
37+
- パフォーマンス要件
38+
- アクセシビリティ要件
39+
40+
各要件は測定可能で具体的な条件を含めてください。
41+
```
42+
43+
### 2. Design.md 生成プロンプト
44+
45+
```
46+
以下の要件定義を基に、Kiroスタイルのdesign.mdを作成してください:
47+
48+
[requirements.mdの内容を貼り付け]
49+
50+
技術スタック: [使用する技術]
51+
52+
以下の形式に従ってください:
53+
54+
1. **概要**
55+
- プロジェクトの技術的な説明
56+
- 主要な設計決定の理由
57+
58+
2. **アーキテクチャ**
59+
- システム全体の構成
60+
- 技術スタックの詳細と選定理由
61+
- デプロイメント戦略
62+
63+
3. **アプリケーション構造**
64+
- ディレクトリ構造をtreeコマンド形式で表示
65+
- 各ディレクトリの役割を説明
66+
67+
4. **コンポーネントとインターフェース**
68+
- 主要コンポーネントのTypeScriptインターフェース定義
69+
- プロパティの説明
70+
- コンポーネント間の関係
71+
72+
5. **カスタムフック**(該当する場合)
73+
- フックの目的と使用方法
74+
- TypeScript型定義
75+
76+
6. **データモデル**
77+
- アプリケーションで使用するデータ構造
78+
- TypeScriptインターフェース定義
79+
80+
7. **エラー処理**
81+
- 想定されるエラーシナリオ
82+
- エラー処理戦略
83+
84+
8. **テスト戦略**
85+
- ユニットテスト、統合テスト、E2Eテストの計画
86+
- 使用するツールと重点領域
87+
88+
9. **パフォーマンス最適化**
89+
- 最適化のポイントと手法
90+
91+
10. **セキュリティ考慮事項**
92+
- セキュリティリスクと対策
93+
94+
11. **アクセシビリティ**
95+
- WCAG準拠のための施策
96+
97+
コード例は実際に動作するTypeScriptコードとして記述してください。
98+
```
99+
100+
### 3. Tasks.md 生成プロンプト
101+
102+
```
103+
以下の要件定義と設計ドキュメントを基に、Kiroスタイルのtasks.mdを作成してください:
104+
105+
[requirements.mdの内容]
106+
[design.mdの内容]
107+
108+
以下の形式に従ってください:
109+
110+
1. タスクはチェックボックス形式(- [ ])で記述
111+
2. 階層構造で整理(大タスク、サブタスク)
112+
3. 各タスクに関連する要件番号を記載(_要件: X.X_)
113+
4. 実装順序を考慮した番号付け
114+
115+
タスクカテゴリの例:
116+
- プロジェクトセットアップ
117+
- 基礎インフラ実装
118+
- コアコンポーネント開発
119+
- 機能実装
120+
- テスト実装
121+
- パフォーマンス最適化
122+
- デプロイメント設定
123+
- ドキュメント作成
124+
125+
各タスクは:
126+
- 具体的で実行可能な内容
127+
- 1-3時間で完了できる粒度
128+
- 依存関係を考慮した順序
129+
- テスト作成を含める
130+
131+
プログレッシブな開発を促進するため、最小動作可能な製品(MVP)から始めて、段階的に機能を追加する順序にしてください。
132+
```
133+
134+
## 使用方法
135+
136+
1. **新規プロジェクト開始時**
137+
- まずrequirements.mdプロンプトを使用して要件を定義
138+
- 次にdesign.mdプロンプトで技術設計を作成
139+
- 最後にtasks.mdプロンプトで実装計画を立てる
140+
141+
2. **既存プロジェクトのドキュメント化**
142+
- 現在のコードベースを分析
143+
- 上記のプロンプトを使用して各ドキュメントを生成
144+
- 実際の実装と整合性を確認
145+
146+
3. **ドキュメントの更新**
147+
- 機能追加や変更時に、関連する全てのドキュメントを更新
148+
- タスクの完了状況を反映
149+
- 新しい要件や設計変更を追記
150+
151+
## ベストプラクティス
152+
153+
1. **一貫性の維持**
154+
- 要件、設計、タスクの間で用語や参照を統一
155+
- 要件番号を一貫して使用
156+
157+
2. **具体性**
158+
- 曖昧な表現を避け、測定可能な条件を記述
159+
- 実装可能なレベルまで詳細化
160+
161+
3. **段階的な詳細化**
162+
- 最初は高レベルの概要から始める
163+
- 実装が進むにつれて詳細を追加
164+
165+
4. **コードとの同期**
166+
- 実装の変更をドキュメントに反映
167+
- ドキュメントの変更を実装に反映
168+
169+
5. **日本語での記述**
170+
- 要件と概要は日本語で記述
171+
- コード例とインターフェースは英語
172+
- 技術用語は適切に使い分ける
173+
174+
このプロンプトテンプレートを使用することで、Kiroのようなspec-driven開発アプローチを採用し、プロジェクトの全体像を明確に保ちながら、効率的な開発を進めることができます。
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const DOMPurify = {
2+
sanitize: jest.fn((html) => html),
3+
};
4+
5+
module.exports = DOMPurify;
6+
module.exports.default = DOMPurify;

url-memo-app/__mocks__/marked.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
module.exports = {
2+
marked: {
3+
parse: jest.fn((text) => {
4+
if (!text) return '';
5+
6+
// Handle lists first
7+
let html = text;
8+
9+
// Convert unordered lists
10+
const unorderedListRegex = /^- (.+)$/gm;
11+
const unorderedMatches = [...text.matchAll(unorderedListRegex)];
12+
if (unorderedMatches.length > 0) {
13+
let listItems = '';
14+
unorderedMatches.forEach(match => {
15+
listItems += `<li>${match[1]}</li>`;
16+
});
17+
html = html.replace(unorderedListRegex, '');
18+
html += `<ul>${listItems}</ul>`;
19+
}
20+
21+
// Convert ordered lists
22+
const orderedListRegex = /^\d+\. (.+)$/gm;
23+
const orderedMatches = [...text.matchAll(orderedListRegex)];
24+
if (orderedMatches.length > 0) {
25+
let listItems = '';
26+
orderedMatches.forEach(match => {
27+
listItems += `<li>${match[1]}</li>`;
28+
});
29+
html = html.replace(orderedListRegex, '');
30+
html += `<ol>${listItems}</ol>`;
31+
}
32+
33+
// Other conversions
34+
html = html
35+
.replace(/^### (.*$)/gim, '<h3>$1</h3>')
36+
.replace(/^## (.*$)/gim, '<h2>$1</h2>')
37+
.replace(/^# (.*$)/gim, '<h1>$1</h1>')
38+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
39+
.replace(/\*([^*]+)\*/g, '<em>$1</em>')
40+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>')
41+
.replace(/`([^`]+)`/g, '<code>$1</code>')
42+
.replace(/```javascript\n([^`]+)\n```/g, '<pre><code>$1</code></pre>')
43+
.replace(/^> (.+)$/gm, '<blockquote>$1</blockquote>')
44+
.replace(/^---$/gm, '<hr>');
45+
46+
// Handle tables
47+
if (text.includes('|')) {
48+
const lines = text.split('\n');
49+
let inTable = false;
50+
let tableHtml = '';
51+
52+
lines.forEach((line, index) => {
53+
if (line.includes('|') && !line.includes('---')) {
54+
const cells = line.split('|').map(cell => cell.trim()).filter(cell => cell);
55+
if (!inTable) {
56+
tableHtml = '<table><thead><tr>';
57+
cells.forEach(cell => {
58+
tableHtml += `<th>${cell}</th>`;
59+
});
60+
tableHtml += '</tr></thead><tbody>';
61+
inTable = true;
62+
} else if (index > 1) {
63+
tableHtml += '<tr>';
64+
cells.forEach(cell => {
65+
tableHtml += `<td>${cell}</td>`;
66+
});
67+
tableHtml += '</tr>';
68+
}
69+
}
70+
});
71+
72+
if (inTable) {
73+
tableHtml += '</tbody></table>';
74+
return tableHtml;
75+
}
76+
}
77+
78+
// Wrap non-HTML content in paragraphs
79+
const lines = html.split('\n').filter(line => line.trim());
80+
html = lines.map(line => {
81+
if (!line.match(/^<[^>]+>/)) {
82+
return `<p>${line}</p>`;
83+
}
84+
return line;
85+
}).join('');
86+
87+
return html;
88+
}),
89+
setOptions: jest.fn(),
90+
},
91+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Mock for react-markdown
2+
const React = require('react');
3+
4+
const ReactMarkdown = ({ children, components }) => {
5+
if (!children) return null;
6+
7+
// Simple mock that renders children as plain text
8+
return React.createElement('div', {
9+
'data-testid': 'react-markdown',
10+
dangerouslySetInnerHTML: { __html: children }
11+
});
12+
};
13+
14+
module.exports = ReactMarkdown;
15+
module.exports.default = ReactMarkdown;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// Mock for remark-gfm
2+
module.exports = () => {};

0 commit comments

Comments
 (0)