運営: 進捗管理ダッシュボード配布版を更新

Made-with: Cursor
This commit is contained in:
ADS Admin
2026-04-03 19:28:30 +09:00
commit 30afda7196
18 changed files with 4391 additions and 0 deletions
+142
View File
@@ -0,0 +1,142 @@
# AI提案プロンプト(統合版)
あなたはマガジン制作プロジェクトマネージャーのアシスタントです。以下の健康度データに基づいて、具体的なアクションを提案してください。
## 現在の状況
{{CONTEXT}}
## 指示
現在の状況を踏まえて**最も重要な3つの提案を生成**し、それぞれに適切な優先度(高・中・低)を割り振ってください。
**重要**: 同じ優先度が複数あっても構いません。状況に応じて柔軟に判断してください。
- 緊急課題が3つある場合 → 「高・高・高」でもOK
- 緊急課題が2つある場合 → 「高・高・中」でもOK
- 緊急課題がない場合 → 「中・中・低」や「低・低・低」でもOK
### 優先度の基準
#### 優先度:高(今日・明日中に対応すべき緊急課題)
- **対象**: 2日以上遅延しているマガジン、期限未設定の重要タスク、緊急対応が必要な状況
- **アクション**: 今日・明日中に実行すべき具体的な次のステップ(3つ以内)
- **ポイント**: 放置すると大きな影響が出るもの
#### 優先度:中(今週中に対応すべき改善課題)
- **対象**: 2日以内の軽微な遅延、リソース配分の偏り、ワークフロー改善の機会
- **アクション**: 今週中に実行すべき具体的な次のステップ(3つ以内)
- **ポイント**: 早めに対処すれば悪化を防げるもの
#### 優先度:低(長期的な改善提案)
- **対象**: 現状は順調だが、さらに効率化・品質向上できる領域
- **アクション**: 長期的な改善につながる具体的な次のステップ(3つ以内)
- **ポイント**: 今すぐでなくても良いが、やればプラスになるもの
## 出力形式
以下のJSON配列形式で、**必ず3つの提案**を出力してください:
```json
[
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "問題の説明(1-2文)",
"action": "• アクション1\n• アクション2\n• アクション3"
},
{
"priority": "medium",
"priorityLabel": "優先度:中",
"problem": "問題の説明(1-2文)",
"action": "• アクション1\n• アクション2\n• アクション3"
},
{
"priority": "low",
"priorityLabel": "優先度:低",
"problem": "改善機会の説明(1-2文)",
"action": "• アクション1\n• アクション2\n• アクション3"
}
]
```
## 重要な注意事項
1. **必ず3つの提案を生成**してください
2. **状況に応じて優先度を柔軟に割り振る**:同じ優先度が複数あっても構いません
3. **アクションは具体的に**:「検討する」ではなく「〇〇を実施し、△△を確認する」のように具体的に
4. **JSON形式を厳守**:余計なテキストを含めず、純粋なJSON配列のみを出力
## 例1: 緊急課題が複数ある場合(高・高・中)
```json
[
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "「AIエージェント入門」が期限を5日超過し、原稿執筆中のまま停滞しています。",
"action": "• 担当者に即日ヒアリングし、ブロッカーを特定\n• 必要に応じてライター追加またはスコープ縮小を検討\n• 48時間以内に初稿完了の再計画を立てる"
},
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "原稿期限が未設定のマガジンが2件あり、進捗管理が不可能な状態です。",
"action": "• 本日中に担当者2名に連絡し、進捗と完了見込みをヒアリング\n• ヒアリング結果に基づき、明日中に両マガジンの期限を設定\n• 期限設定ルールを再通知し、今後の未設定を防ぐ"
},
{
"priority": "medium",
"priorityLabel": "優先度:中",
"problem": "原稿執筆中のマガジンが7本に対し、動画編集中は2本のみで、リソース配分に偏りがあります。",
"action": "• 原稿完了が近いマガジン3本を特定し、動画チームに事前共有\n• 動画編集のボトルネックを洗い出し、外注可否を検討\n• 来週の原稿→動画の引き継ぎ計画を明確化"
}
]
```
## 例2: 非常事態(高・高・高)
```json
[
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "3件のマガジンが期限を3日以上超過し、公開スケジュールに深刻な影響が出ています。",
"action": "• 本日中に緊急ミーティングを開催し、全体状況を共有\n• 各マガジンの完了見込みを明確化し、公開スケジュールを再調整\n• 必要に応じてリソースを一時的に集中投入"
},
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "企画ストックが2本まで減少し、2週間後にコンテンツ供給が途絶える危機的状況です。",
"action": "• 今日明日で緊急企画会議を開催し、最低5件の企画を立案\n• 過去の人気コンテンツのリメイク企画を3件追加\n• 外部ライターに緊急依頼し、企画を補充"
},
{
"priority": "high",
"priorityLabel": "優先度:高",
"problem": "5件のマガジンで期限が未設定のまま放置され、全体の進捗把握が不可能になっています。",
"action": "• 本日中に全担当者へ緊急連絡し、各マガジンの状況をヒアリング\n• 明日までに全マガジンの期限を設定し、進捗管理を再開\n• 期限設定を必須とする運用ルールを策定し、全員に徹底"
}
]
```
## 例3: 全体が順調な場合(中・低・低)
```json
[
{
"priority": "medium",
"priorityLabel": "優先度:中",
"problem": "現在は順調ですが、期限未設定のサブイシューが3件あり、今後の遅延リスクがあります。",
"action": "• 期限未設定の3件のサブイシューに期限を設定\n• 各担当者と進捗確認ミーティングを今週中に実施\n• 期限設定ルールを明文化し、チームで共有"
},
{
"priority": "low",
"priorityLabel": "優先度:低",
"problem": "全体的に順調ですが、動画編集の完了ペースが原稿執筆に比べてやや遅い傾向があります。",
"action": "• 動画編集の平均所要日数を計測し、標準化を検討\n• 編集テンプレートやガイドラインを整備し、効率化\n• 外注パートナーの追加を検討し、繁忙期に備える"
},
{
"priority": "low",
"priorityLabel": "優先度:低",
"problem": "企画ストックは十分ですが、トピックの多様性を高めることで読者満足度をさらに向上できます。",
"action": "• 過去6ヶ月のマガジンテーマを分析し、カテゴリの偏りを確認\n• 新規カテゴリ候補を3つリストアップし、企画会議で議論\n• 読者アンケートを実施し、需要の高いテーマを特定"
}
]
```
+792
View File
@@ -0,0 +1,792 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background: linear-gradient(20deg, #D60C52 0%, #24609E 100%);
padding: 20px;
display: flex;
justify-content: center;
align-items: flex-start;
min-height: 100vh;
}
.container {
width: 1200px;
max-width: 95vw;
background:
repeating-linear-gradient(
20deg,
transparent,
transparent 10px,
rgba(214, 12, 82, 0.015) 10px,
rgba(214, 12, 82, 0.015) 11px,
transparent 11px,
transparent 21px,
rgba(36, 96, 158, 0.015) 21px,
rgba(36, 96, 158, 0.015) 22px
),
rgba(255, 255, 255, 0.95);
border-radius: 24px;
padding: 40px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
}
h1 {
color: #333;
font-size: 2.5em;
margin-bottom: 10px;
text-align: center;
}
.subtitle {
text-align: center;
color: #666;
margin-bottom: 40px;
font-size: 1em;
}
/* 進捗健康度(最上部) */
.health-status {
margin-bottom: 40px;
position: relative;
}
.health-status::after {
content: '';
display: block;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(214, 12, 82, 0.35), rgba(36, 96, 158, 0.35), transparent);
margin-top: 40px;
border-radius: 2px;
}
.health-status h2 {
color: #333;
font-size: 1.8em;
margin-bottom: 20px;
text-align: center;
position: relative;
text-shadow: 0 2px 12px rgba(214, 12, 82, 0.12);
}
/* 全体カード */
.health-overall {
background: white;
border-radius: 20px;
padding: 30px;
box-shadow: 0 8px 24px rgba(214, 12, 82, 0.15);
text-align: center;
margin-bottom: 20px;
border: 3px solid transparent;
background-image:
linear-gradient(white, white),
linear-gradient(20deg, #D60C52, #24609E);
background-origin: padding-box, border-box;
background-clip: padding-box, border-box;
}
.health-overall h3 {
color: #D60C52;
font-size: 1.3em;
margin-bottom: 15px;
font-weight: bold;
}
.health-overall .health-indicator {
font-size: 5em;
margin-bottom: 10px;
}
.health-overall .health-label {
font-size: 1.5em;
font-weight: bold;
margin-bottom: 10px;
}
.health-overall .health-detail {
color: #666;
font-size: 1em;
line-height: 1.6;
}
/* 判断基準ボックス */
.health-criteria {
background: #F8FAFC;
border-radius: 12px;
padding: 15px;
margin-bottom: 15px;
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
font-size: 0.9em;
}
.health-criteria-item {
display: flex;
align-items: center;
gap: 8px;
color: #555;
font-weight: 500;
}
.health-criteria-icon {
font-size: 1.2em;
}
/* カテゴリ別カード (2x2) */
.health-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
}
@media (max-width: 1024px) {
.health-grid {
grid-template-columns: 1fr;
}
}
.health-card {
background: white;
border-radius: 20px;
padding: 25px;
box-shadow: 0 4px 16px rgba(214, 12, 82, 0.08), 0 2px 8px rgba(36, 96, 158, 0.06);
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease, border 0.3s ease;
border: 2px solid transparent;
position: relative;
overflow: hidden;
}
.health-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, #D60C52, #24609E);
opacity: 0;
transition: opacity 0.3s ease;
}
.health-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 24px rgba(214, 12, 82, 0.2);
border-color: rgba(214, 12, 82, 0.2);
}
.health-card:hover::before {
opacity: 1;
}
.health-card h3 {
color: #666;
font-size: 1.1em;
margin-bottom: 15px;
}
.health-indicator {
font-size: 4em;
margin-bottom: 10px;
}
.health-label {
font-size: 1.3em;
font-weight: bold;
margin-bottom: 10px;
}
.health-label.good {
color: #27ae60;
}
.health-label.warning {
color: #f39c12;
}
.health-label.danger {
color: #e74c3c;
}
.health-detail {
color: #999;
font-size: 0.9em;
line-height: 1.6;
}
/* AIサジェストエリア */
.ai-suggestions {
margin-bottom: 40px;
position: relative;
}
.ai-suggestions::after {
content: '';
display: block;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(214, 12, 82, 0.35), rgba(36, 96, 158, 0.35), transparent);
margin-top: 40px;
border-radius: 2px;
}
.ai-suggestions h2 {
color: #333;
font-size: 1.8em;
margin-bottom: 30px;
text-align: center;
position: relative;
text-shadow: 0 2px 12px rgba(214, 12, 82, 0.12);
}
.ai-suggestions h2::before {
content: '🤖 ';
}
.ai-suggestions-meta {
display: flex;
justify-content: center;
gap: 20px;
font-size: 0.9em;
color: #555;
margin-bottom: 15px;
flex-wrap: wrap;
}
.ai-suggestions-note {
background: #fff8f1;
border-left: 4px solid #ffa94d;
padding: 10px 15px;
border-radius: 8px;
color: #8c4b16;
margin-bottom: 20px;
font-size: 0.9em;
}
.suggestion-item {
background: white;
border-radius: 20px;
padding: 25px;
margin-bottom: 20px;
box-shadow: 0 4px 16px rgba(214, 12, 82, 0.08), 0 2px 8px rgba(36, 96, 158, 0.06);
display: flex;
align-items: flex-start;
gap: 15px;
transition: transform 0.3s ease, box-shadow 0.3s ease;
position: relative;
}
.suggestion-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(180deg, #D60C52, #24609E);
border-radius: 20px 0 0 20px;
opacity: 0;
transition: opacity 0.3s ease;
}
.suggestion-item:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(214, 12, 82, 0.15);
}
.suggestion-item:hover::before {
opacity: 1;
}
.suggestion-item:last-child {
margin-bottom: 0;
}
.suggestion-icon {
font-size: 2em;
flex-shrink: 0;
}
.suggestion-content {
flex: 1;
}
.suggestion-content h3 {
color: #333;
font-size: 1.2em;
margin-bottom: 8px;
}
.suggestion-content p {
color: #666;
line-height: 1.6;
margin-bottom: 10px;
}
.suggestion-action {
background: #F8FAFC;
border-left: 4px solid #D60C52;
padding: 10px 15px;
border-radius: 8px;
margin-top: 10px;
}
.suggestion-action strong {
color: #D60C52;
display: block;
margin-bottom: 5px;
}
.suggestion-action p {
font-size: 0.95em;
color: #555;
margin: 0;
}
.suggestion-action ul {
margin: 0;
padding-left: 18px;
color: #555;
}
.suggestion-action li {
margin-bottom: 4px;
}
.suggestion-priority {
display: inline-block;
padding: 4px 12px;
border-radius: 20px;
font-size: 0.85em;
font-weight: bold;
margin-bottom: 8px;
}
.priority-high {
background: #fee;
color: #c33;
}
.priority-medium {
background: #fff3cd;
color: #8a6d3b;
}
.priority-info {
background: #dfe6e9;
color: #2d3436;
}
.priority-low {
background: #e8f5e9;
color: #2e7d32;
}
/* マガジン別ステータスセクション */
.details-section {
margin-bottom: 40px;
position: relative;
}
.details-section::after {
content: '';
display: block;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(214, 12, 82, 0.35), rgba(36, 96, 158, 0.35), transparent);
margin-top: 40px;
border-radius: 2px;
}
.details-section h2 {
color: #333;
font-size: 1.8em;
margin-bottom: 30px;
text-align: center;
position: relative;
text-shadow: 0 2px 12px rgba(214, 12, 82, 0.12);
}
/* 凡例 */
.status-legend {
background: #F8FAFC;
border-radius: 12px;
padding: 15px;
margin-bottom: 25px;
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
}
.legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.9em;
}
.legend-dot {
width: 12px;
height: 12px;
border-radius: 50%;
}
.legend-dot.good {
background: #d4edda;
border: 2px solid #155724;
}
.legend-dot.warning {
background: #fff3cd;
border: 2px solid #856404;
}
.legend-dot.overdue {
background: #f8d7da;
border: 2px solid #721c24;
}
.legend-label {
color: #555;
font-weight: 500;
}
.process-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 30px;
margin-bottom: 40px;
}
@media (max-width: 768px) {
.process-grid {
grid-template-columns: 1fr;
}
}
.process-section {
background: white;
border-radius: 20px;
padding: 25px;
box-shadow: 0 4px 16px rgba(214, 12, 82, 0.08), 0 2px 8px rgba(36, 96, 158, 0.06);
position: relative;
border: 2px solid transparent;
transition: border 0.3s ease, box-shadow 0.3s ease;
}
.process-section::before {
content: '';
position: absolute;
top: 2px;
left: 2px;
right: 2px;
height: 4px;
background: linear-gradient(90deg, #D60C52, #24609E);
border-radius: 18px 18px 0 0;
}
.process-section:hover {
border-color: rgba(214, 12, 82, 0.15);
box-shadow: 0 6px 20px rgba(214, 12, 82, 0.12);
}
.process-section h3 {
font-size: 1.5em;
margin-bottom: 20px;
color: #333;
display: flex;
align-items: center;
gap: 10px;
}
.status-group {
margin-bottom: 25px;
}
.status-group:last-child {
margin-bottom: 0;
}
.status-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 2px solid #eee;
}
.status-dot {
width: 12px;
height: 12px;
border-radius: 50%;
}
.status-name {
font-weight: bold;
color: #333;
flex: 1;
}
.status-count {
background: #F8FAFC;
padding: 4px 12px;
border-radius: 12px;
font-size: 0.9em;
color: #666;
}
.task-list {
padding-left: 0;
list-style: none;
}
.task-item {
padding: 10px 0;
border-bottom: 1px solid #f5f5f5;
transition: padding-left 0.2s ease, background 0.2s ease;
border-radius: 8px;
}
.task-item:hover {
padding-left: 10px;
background: linear-gradient(90deg, rgba(214, 12, 82, 0.02), transparent);
}
.task-item:last-child {
border-bottom: none;
}
.task-title {
color: #333;
font-weight: 500;
margin-bottom: 5px;
}
.task-meta {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.task-assignee,
.task-due {
font-size: 0.85em;
padding: 3px 10px;
border-radius: 10px;
}
.task-assignee {
background: #e3f2fd;
color: #1976d2;
}
.task-due {
background: #fff3cd;
color: #856404;
display: inline-flex;
align-items: center;
}
.task-due.good {
background: #d4edda;
color: #155724;
}
.task-due.warning {
background: #fff3cd;
color: #856404;
}
.task-due.overdue {
background: #f8d7da;
color: #721c24;
font-weight: bold;
}
.task-current-process {
font-size: 0.85em;
color: #555;
background: #F8FAFC;
padding: 3px 10px;
border-radius: 10px;
font-weight: 500;
}
.task-detail {
font-size: 0.8em;
color: #d63031;
margin-top: 5px;
padding-left: 10px;
border-left: 3px solid #d63031;
font-weight: 500;
}
.due-label {
font-size: 0.75em;
color: #999;
margin-right: 3px;
}
/* カレンダー */
.calendar-section {
margin-bottom: 40px;
}
.calendar-section h2 {
color: #333;
font-size: 1.8em;
margin-bottom: 20px;
text-align: center;
position: relative;
text-shadow: 0 2px 12px rgba(214, 12, 82, 0.12);
}
.calendar-legend {
background: #F8FAFC;
border-radius: 12px;
padding: 15px;
margin-bottom: 25px;
display: flex;
justify-content: center;
gap: 30px;
flex-wrap: wrap;
}
.calendar-legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.9em;
}
.calendar-legend-box {
width: 20px;
height: 16px;
border-radius: 4px;
}
.calendar-legend-box.manuscript {
background: linear-gradient(135deg, #3B82F6, #60A5FA);
}
.calendar-legend-box.video {
background: linear-gradient(135deg, #F59E0B, #FBBF24);
}
.calendar-legend-box.published {
background: linear-gradient(135deg, #10B981, #34D399);
}
.calendar-legend-label {
color: #555;
font-weight: 500;
}
.calendar-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 8px;
margin-bottom: 20px;
}
.calendar-header {
text-align: center;
font-weight: 600;
padding: 10px;
background: linear-gradient(20deg, rgba(214, 12, 82, 0.15), rgba(36, 96, 158, 0.15));
color: #666;
border-radius: 12px;
font-size: 0.9em;
}
.calendar-day {
border: 2px solid #e0e0e0;
border-radius: 12px;
padding: 8px;
min-height: 100px;
background: white;
position: relative;
}
.calendar-day.today {
border-color: #D60C52;
border-width: 3px;
background: #fff3e0;
}
.calendar-day-number {
font-weight: bold;
color: #333;
margin-bottom: 5px;
font-size: 0.85em;
}
.calendar-task {
padding: 4px 8px;
border-radius: 8px;
font-size: 0.7em;
margin: 4px 0;
color: white;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 600;
max-width: 100%;
box-sizing: border-box;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.calendar-task:hover {
transform: scale(1.05);
}
/* 原稿執筆中 - 青系 */
.calendar-task.phase-manuscript {
background: linear-gradient(135deg, #3B82F6, #60A5FA);
box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);
}
.calendar-task.phase-manuscript:hover {
box-shadow: 0 4px 8px rgba(59, 130, 246, 0.4);
}
/* 動画制作中 - オレンジ系 */
.calendar-task.phase-video {
background: linear-gradient(135deg, #F59E0B, #FBBF24);
box-shadow: 0 2px 4px rgba(245, 158, 11, 0.3);
}
.calendar-task.phase-video:hover {
box-shadow: 0 4px 8px rgba(245, 158, 11, 0.4);
}
/* 公開済み - 緑系 */
.calendar-task.phase-published {
background: linear-gradient(135deg, #10B981, #34D399);
box-shadow: 0 2px 4px rgba(16, 185, 129, 0.3);
}
.calendar-task.phase-published:hover {
box-shadow: 0 4px 8px rgba(16, 185, 129, 0.4);
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.container > * {
animation: fadeIn 0.5s ease forwards;
}
+16
View File
@@ -0,0 +1,16 @@
# Health Indicator Thresholds
# マガジンステータスダッシュボードの健康度判定閾値
stock:
healthy: 8 # ≥8本 = 🟢 順調
warning: 5 # 5-7本 = 🟡 注意
# <5本 = 🔴 危険
delay:
healthy: 0 # 遅延なし = 🟢 順調
warning: 1 # 1日 = 🟡 注意
# ≥2日 = 🔴 危険
unset_deadline:
status: warning # 期限未設定 = 🟡 注意
show_tag: true # 「期限未設定」タグを表示
+51
View File
@@ -0,0 +1,51 @@
import { TITLE_EMOJI_RULES } from './settings.js';
// 部分一致で判定(ユーザー名のどこかに含まれればマッチ)
// あなたのチームメンバーに合わせて変更してください
export const ASSIGNEE_MAPPINGS_INCLUDE = {
'taro_yamada': '山田',
'hanako_sato': '佐藤',
};
// 前方一致で判定(ユーザー名の先頭が一致すればマッチ)
export const ASSIGNEE_MAPPINGS_STARTS_WITH = {
'jiro': '田中',
};
/**
* 担当者名を表示名に変換
*/
export function convertAssigneeName(assigneeName) {
if (!assigneeName) {
return '未割当';
}
const lowerName = assigneeName.toLowerCase();
// 部分一致チェック
for (const [key, displayName] of Object.entries(ASSIGNEE_MAPPINGS_INCLUDE)) {
if (lowerName.includes(key)) {
return displayName;
}
}
// 前方一致チェック
for (const [key, displayName] of Object.entries(ASSIGNEE_MAPPINGS_STARTS_WITH)) {
if (lowerName.startsWith(key)) {
return displayName;
}
}
return assigneeName;
}
/**
* タイトルの装飾をルールに基づいて絵文字に変換
*/
export function convertTitleEmoji(title) {
let converted = title;
for (const rule of TITLE_EMOJI_RULES) {
converted = converted.replace(rule.pattern, rule.emoji);
}
return converted;
}
+27
View File
@@ -0,0 +1,27 @@
import 'dotenv/config';
export const LINEAR_API_URL = 'https://api.linear.app/graphql';
export const LINEAR_TEAM_KEY = process.env.MAGAZINE_LINEAR_TEAM_KEY || 'YOUR_TEAM';
export const LABEL_GROUPS = {
parentStatus: 'マガジン作成ステータス(イシュー)',
// Linear 上のラベル名が「スタータス」表記のため、そのまま記載
subIssueStatus: 'マガジン作成スタータス詳細(サブイシュー)',
};
export const STATUS_LABELS = {
stock: '1.企画案ストック',
composition: '2.構成作成中',
manuscript: '3.原稿執筆中',
video: '4.動画編集中',
};
// 隔週サイクル計算の基準日(月曜日)。自分のプロジェクトに合わせて変更してください
export const BIWEEKLY_EPOCH = new Date(2026, 0, 5);
// タイトルの装飾変換ルール。自分のプロジェクトに合わせて変更してください
export const TITLE_EMOJI_RULES = [
{ pattern: /【通常[^】]*】/g, emoji: '☕' },
{ pattern: /【(トピック|ニュース)[^】]*】/g, emoji: '🌐' },
{ pattern: /【教養[^】]*】/g, emoji: '🌐' },
];