mdjournal 1.0.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 (62) hide show
  1. package/README.md +209 -0
  2. package/dist/cli.d.ts +12 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +601 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.d.ts +8 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +100 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/routes/calendar.d.ts +8 -0
  11. package/dist/routes/calendar.d.ts.map +1 -0
  12. package/dist/routes/calendar.js +115 -0
  13. package/dist/routes/calendar.js.map +1 -0
  14. package/dist/routes/config.d.ts +9 -0
  15. package/dist/routes/config.d.ts.map +1 -0
  16. package/dist/routes/config.js +75 -0
  17. package/dist/routes/config.js.map +1 -0
  18. package/dist/routes/gcal.d.ts +10 -0
  19. package/dist/routes/gcal.d.ts.map +1 -0
  20. package/dist/routes/gcal.js +100 -0
  21. package/dist/routes/gcal.js.map +1 -0
  22. package/dist/routes/index.d.ts +8 -0
  23. package/dist/routes/index.d.ts.map +1 -0
  24. package/dist/routes/index.js +8 -0
  25. package/dist/routes/index.js.map +1 -0
  26. package/dist/routes/reports.d.ts +10 -0
  27. package/dist/routes/reports.d.ts.map +1 -0
  28. package/dist/routes/reports.js +175 -0
  29. package/dist/routes/reports.js.map +1 -0
  30. package/dist/types/index.d.ts +190 -0
  31. package/dist/types/index.d.ts.map +1 -0
  32. package/dist/types/index.js +5 -0
  33. package/dist/types/index.js.map +1 -0
  34. package/dist/utils/configValidator.d.ts +43 -0
  35. package/dist/utils/configValidator.d.ts.map +1 -0
  36. package/dist/utils/configValidator.js +435 -0
  37. package/dist/utils/configValidator.js.map +1 -0
  38. package/dist/utils/fileManager.d.ts +101 -0
  39. package/dist/utils/fileManager.d.ts.map +1 -0
  40. package/dist/utils/fileManager.js +295 -0
  41. package/dist/utils/fileManager.js.map +1 -0
  42. package/dist/utils/git.d.ts +42 -0
  43. package/dist/utils/git.d.ts.map +1 -0
  44. package/dist/utils/git.js +130 -0
  45. package/dist/utils/git.js.map +1 -0
  46. package/dist/utils/index.d.ts +8 -0
  47. package/dist/utils/index.d.ts.map +1 -0
  48. package/dist/utils/index.js +8 -0
  49. package/dist/utils/index.js.map +1 -0
  50. package/dist/utils/markdown.d.ts +23 -0
  51. package/dist/utils/markdown.d.ts.map +1 -0
  52. package/dist/utils/markdown.js +378 -0
  53. package/dist/utils/markdown.js.map +1 -0
  54. package/dist/utils/slack.d.ts +24 -0
  55. package/dist/utils/slack.d.ts.map +1 -0
  56. package/dist/utils/slack.js +90 -0
  57. package/dist/utils/slack.js.map +1 -0
  58. package/dist/utils/validator.d.ts +66 -0
  59. package/dist/utils/validator.d.ts.map +1 -0
  60. package/dist/utils/validator.js +359 -0
  61. package/dist/utils/validator.js.map +1 -0
  62. package/package.json +64 -0
package/dist/index.js ADDED
@@ -0,0 +1,100 @@
1
+ /**
2
+ * 日報管理ダッシュボード バックエンドサーバー
3
+ *
4
+ * Express.jsベースのREST APIサーバー
5
+ */
6
+ import express from 'express';
7
+ import cors from 'cors';
8
+ import path from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ import fs from 'fs';
11
+ import reportsRouter from './routes/reports.js';
12
+ import calendarRouter from './routes/calendar.js';
13
+ import configRouter from './routes/config.js';
14
+ import gcalRouter from './routes/gcal.js';
15
+ import { initConfigPaths, getConfigPaths } from './utils/fileManager.js';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ // 設定パスを初期化(環境変数から読み込み)
19
+ initConfigPaths();
20
+ // 環境変数
21
+ const PORT = parseInt(process.env.PORT || '3001', 10);
22
+ // Express アプリケーション
23
+ const app = express();
24
+ // ミドルウェア
25
+ app.use(cors({
26
+ origin: process.env.CORS_ORIGIN || 'http://localhost:5173', // Vite default
27
+ credentials: true,
28
+ }));
29
+ app.use(express.json());
30
+ // リクエストログ
31
+ app.use((req, _res, next) => {
32
+ console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
33
+ next();
34
+ });
35
+ // ヘルスチェック
36
+ app.get('/api/health', (_req, res) => {
37
+ const paths = getConfigPaths();
38
+ res.json({
39
+ status: 'ok',
40
+ timestamp: new Date().toISOString(),
41
+ config: {
42
+ projects: paths.projects,
43
+ routines: paths.routines,
44
+ reports: paths.reports,
45
+ },
46
+ });
47
+ });
48
+ // APIルーター
49
+ app.use('/api/reports', reportsRouter);
50
+ app.use('/api/calendar', calendarRouter);
51
+ app.use('/api/config', configRouter);
52
+ app.use('/api/gcal', gcalRouter);
53
+ // 404ハンドラー (API)
54
+ app.use('/api/*', (_req, res) => {
55
+ const error = {
56
+ code: 'NOT_FOUND',
57
+ message: 'APIエンドポイントが見つかりません',
58
+ };
59
+ res.status(404).json(error);
60
+ });
61
+ // 静的ファイルの配信(クライアントビルド)
62
+ const clientDistPath = process.env.CLIENT_DIST || path.join(__dirname, '..', '..', 'client', 'dist');
63
+ if (fs.existsSync(clientDistPath)) {
64
+ console.log(`クライアント配信: ${clientDistPath}`);
65
+ app.use(express.static(clientDistPath));
66
+ // SPA対応: API以外のルートはindex.htmlを返す
67
+ app.get('*', (_req, res) => {
68
+ res.sendFile(path.join(clientDistPath, 'index.html'));
69
+ });
70
+ }
71
+ // エラーハンドラー
72
+ app.use((err, _req, res, _next) => {
73
+ console.error('Unhandled error:', err);
74
+ const error = {
75
+ code: 'INTERNAL_ERROR',
76
+ message: 'サーバー内部エラーが発生しました',
77
+ };
78
+ res.status(500).json(error);
79
+ });
80
+ // サーバー起動
81
+ const paths = getConfigPaths();
82
+ const hasClient = fs.existsSync(clientDistPath);
83
+ app.listen(PORT, () => {
84
+ console.log(`
85
+ ╔═══════════════════════════════════════════════════════════╗
86
+ ║ 日報管理ダッシュボード ║
87
+ ╠═══════════════════════════════════════════════════════════╣
88
+ ║ URL: http://localhost:${String(PORT).padEnd(27)}║
89
+ ║ API: http://localhost:${PORT}/api ║
90
+ ║ Client: ${hasClient ? '配信中'.padEnd(43) : '未ビルド(npm run build in client)'.padEnd(43)}║
91
+ ╠═══════════════════════════════════════════════════════════╣
92
+ ║ 設定ファイル: ║
93
+ ║ projects: ${paths.projects.slice(-42).padEnd(42)}║
94
+ ║ routines: ${paths.routines.slice(-42).padEnd(42)}║
95
+ ║ reports: ${paths.reports.slice(-42).padEnd(42)}║
96
+ ╚═══════════════════════════════════════════════════════════╝
97
+ `);
98
+ });
99
+ export default app;
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * カレンダーAPI ルーター
3
+ *
4
+ * GET /api/calendar - カレンダー用集計データ取得
5
+ */
6
+ declare const router: import("express-serve-static-core").Router;
7
+ export default router;
8
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/routes/calendar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsHxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * カレンダーAPI ルーター
3
+ *
4
+ * GET /api/calendar - カレンダー用集計データ取得
5
+ */
6
+ import { Router } from 'express';
7
+ import { getMonthReportStats, getAvailableYearMonths } from '../utils/fileManager.js';
8
+ const router = Router();
9
+ /**
10
+ * 指定年月の日数を取得
11
+ */
12
+ function getDaysInMonth(year, month) {
13
+ return new Date(year, month, 0).getDate();
14
+ }
15
+ /**
16
+ * GET /api/calendar - カレンダー用集計データ取得
17
+ */
18
+ router.get('/', async (req, res) => {
19
+ const year = parseInt(req.query.year, 10);
20
+ const month = parseInt(req.query.month, 10);
21
+ // バリデーション
22
+ if (isNaN(year) || year < 2000 || year > 2100) {
23
+ const error = {
24
+ code: 'INVALID_YEAR',
25
+ message: 'yearは2000〜2100の範囲で指定してください',
26
+ };
27
+ return res.status(400).json(error);
28
+ }
29
+ if (isNaN(month) || month < 1 || month > 12) {
30
+ const error = {
31
+ code: 'INVALID_MONTH',
32
+ message: 'monthは1〜12の範囲で指定してください',
33
+ };
34
+ return res.status(400).json(error);
35
+ }
36
+ try {
37
+ // frontmatterから統計情報を取得
38
+ const reportStats = await getMonthReportStats(year, month);
39
+ // 日別データを生成
40
+ const daysInMonth = getDaysInMonth(year, month);
41
+ const days = [];
42
+ for (let day = 1; day <= daysInMonth; day++) {
43
+ const dateStr = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
44
+ const stats = reportStats.get(dateStr);
45
+ if (stats) {
46
+ days.push({
47
+ date: dateStr,
48
+ hasReport: true,
49
+ planHours: stats.planHours,
50
+ resultHours: stats.resultHours,
51
+ todoCount: stats.todoCount,
52
+ todoCompleted: stats.todoCompleted,
53
+ });
54
+ }
55
+ else {
56
+ days.push({
57
+ date: dateStr,
58
+ hasReport: false,
59
+ });
60
+ }
61
+ }
62
+ // 月間サマリーを計算
63
+ const summary = {
64
+ totalPlanHours: 0,
65
+ totalResultHours: 0,
66
+ workDays: 0,
67
+ todoCompleted: 0,
68
+ projectHours: {},
69
+ };
70
+ for (const stats of reportStats.values()) {
71
+ summary.totalPlanHours += stats.planHours;
72
+ summary.totalResultHours += stats.resultHours;
73
+ summary.workDays += 1;
74
+ summary.todoCompleted += stats.todoCompleted;
75
+ // プロジェクト別時間を集計
76
+ for (const [project, hours] of Object.entries(stats.projectHours)) {
77
+ summary.projectHours[project] = (summary.projectHours[project] || 0) + hours;
78
+ }
79
+ }
80
+ const response = {
81
+ year,
82
+ month,
83
+ days,
84
+ summary,
85
+ };
86
+ res.json(response);
87
+ }
88
+ catch (error) {
89
+ console.error('Error getting calendar data:', error);
90
+ const apiError = {
91
+ code: 'INTERNAL_ERROR',
92
+ message: 'カレンダーデータの取得中にエラーが発生しました',
93
+ };
94
+ res.status(500).json(apiError);
95
+ }
96
+ });
97
+ /**
98
+ * GET /api/calendar/months - 日報が存在する年月リストを取得
99
+ */
100
+ router.get('/months', async (_req, res) => {
101
+ try {
102
+ const yearMonths = await getAvailableYearMonths();
103
+ res.json({ yearMonths });
104
+ }
105
+ catch (error) {
106
+ console.error('Error getting available year months:', error);
107
+ const apiError = {
108
+ code: 'INTERNAL_ERROR',
109
+ message: '年月リストの取得中にエラーが発生しました',
110
+ };
111
+ res.status(500).json(apiError);
112
+ }
113
+ });
114
+ export default router;
115
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/routes/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 設定API ルーター
3
+ *
4
+ * GET /api/config - 設定取得
5
+ * PUT /api/config - 設定更新
6
+ */
7
+ declare const router: import("express-serve-static-core").Router;
8
+ export default router;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAsExB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 設定API ルーター
3
+ *
4
+ * GET /api/config - 設定取得
5
+ * PUT /api/config - 設定更新
6
+ */
7
+ import { Router } from 'express';
8
+ import { readConfig, writeConfig } from '../utils/fileManager.js';
9
+ const router = Router();
10
+ /**
11
+ * GET /api/config - 設定取得
12
+ */
13
+ router.get('/', async (_req, res) => {
14
+ try {
15
+ const config = await readConfig();
16
+ res.json(config);
17
+ }
18
+ catch (error) {
19
+ console.error('Error reading config:', error);
20
+ const apiError = {
21
+ code: 'INTERNAL_ERROR',
22
+ message: '設定の読み込み中にエラーが発生しました',
23
+ };
24
+ res.status(500).json(apiError);
25
+ }
26
+ });
27
+ /**
28
+ * PUT /api/config - 設定更新
29
+ */
30
+ router.put('/', async (req, res) => {
31
+ const config = req.body;
32
+ // バリデーション
33
+ if (config.projects) {
34
+ for (const project of config.projects) {
35
+ if (!project.code || !project.name || !project.color || !project.category) {
36
+ const error = {
37
+ code: 'INVALID_PROJECT',
38
+ message: 'プロジェクトにはcode, name, color, categoryが必須です',
39
+ };
40
+ return res.status(400).json(error);
41
+ }
42
+ // カラーフォーマットチェック
43
+ if (!/^#[0-9A-Fa-f]{6}$/.test(project.color)) {
44
+ const error = {
45
+ code: 'INVALID_COLOR',
46
+ message: 'colorは#RRGGBB形式で指定してください',
47
+ };
48
+ return res.status(400).json(error);
49
+ }
50
+ // カテゴリチェック
51
+ if (!['internal', 'client', 'personal'].includes(project.category)) {
52
+ const error = {
53
+ code: 'INVALID_CATEGORY',
54
+ message: 'categoryはinternal, client, personalのいずれかを指定してください',
55
+ };
56
+ return res.status(400).json(error);
57
+ }
58
+ }
59
+ }
60
+ try {
61
+ await writeConfig(config);
62
+ const updatedConfig = await readConfig();
63
+ res.json(updatedConfig);
64
+ }
65
+ catch (error) {
66
+ console.error('Error updating config:', error);
67
+ const apiError = {
68
+ code: 'INTERNAL_ERROR',
69
+ message: '設定の更新中にエラーが発生しました',
70
+ };
71
+ res.status(500).json(apiError);
72
+ }
73
+ });
74
+ export default router;
75
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGlE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,qBAAqB;SAC/B,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAuB,CAAC;IAE3C,UAAU;IACV,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1E,MAAM,KAAK,GAAa;oBACtB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,0CAA0C;iBACpD,CAAC;gBACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,gBAAgB;YAChB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAa;oBACtB,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE,0BAA0B;iBACpC,CAAC;gBACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,WAAW;YACX,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnE,MAAM,KAAK,GAAa;oBACtB,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,mDAAmD;iBAC7D,CAAC;gBACF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,aAAa,GAAG,MAAM,UAAU,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,mBAAmB;SAC7B,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Googleカレンダー連携API ルーター
3
+ *
4
+ * GET /api/gcal/events - Googleカレンダー予定取得
5
+ *
6
+ * 注: 現在はモック実装。実際のGoogle Calendar API連携は将来実装予定。
7
+ */
8
+ declare const router: import("express-serve-static-core").Router;
9
+ export default router;
10
+ //# sourceMappingURL=gcal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcal.d.ts","sourceRoot":"","sources":["../../src/routes/gcal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2GxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Googleカレンダー連携API ルーター
3
+ *
4
+ * GET /api/gcal/events - Googleカレンダー予定取得
5
+ *
6
+ * 注: 現在はモック実装。実際のGoogle Calendar API連携は将来実装予定。
7
+ */
8
+ import { Router } from 'express';
9
+ const router = Router();
10
+ /**
11
+ * 日付形式のバリデーション
12
+ */
13
+ function isValidDate(date) {
14
+ return /^\d{4}-\d{2}-\d{2}$/.test(date);
15
+ }
16
+ /**
17
+ * GET /api/gcal/events - Googleカレンダー予定取得
18
+ */
19
+ router.get('/events', async (req, res) => {
20
+ const date = req.query.date;
21
+ if (!date || !isValidDate(date)) {
22
+ const error = {
23
+ code: 'INVALID_DATE',
24
+ message: '日付形式が不正です(YYYY-MM-DD形式で指定してください)',
25
+ };
26
+ return res.status(400).json(error);
27
+ }
28
+ // TODO: Google Calendar API 連携の実装
29
+ // 現在はモックデータを返す
30
+ // 環境変数でGoogleカレンダー連携が設定されているかチェック
31
+ const isConfigured = !!process.env.GOOGLE_CLIENT_ID && !!process.env.GOOGLE_CLIENT_SECRET;
32
+ if (!isConfigured) {
33
+ // モックデータを返す
34
+ const mockEvents = generateMockEvents(date);
35
+ res.json({
36
+ date,
37
+ events: mockEvents,
38
+ });
39
+ return;
40
+ }
41
+ // 実際のGoogle Calendar API呼び出し(未実装)
42
+ const error = {
43
+ code: 'NOT_IMPLEMENTED',
44
+ message: 'Googleカレンダー連携は準備中です',
45
+ };
46
+ res.status(503).json(error);
47
+ });
48
+ /**
49
+ * モックイベントを生成
50
+ */
51
+ function generateMockEvents(date) {
52
+ // 曜日に応じてモックイベントを生成
53
+ const dayOfWeek = new Date(date).getDay();
54
+ // 土日はイベントなし
55
+ if (dayOfWeek === 0 || dayOfWeek === 6) {
56
+ return [];
57
+ }
58
+ const events = [];
59
+ // 月曜日: 週次定例
60
+ if (dayOfWeek === 1) {
61
+ events.push({
62
+ id: `gcal-${date}-1`,
63
+ summary: '週次定例MTG',
64
+ description: 'チームの週次定例ミーティング',
65
+ start: `${date}T10:00:00+09:00`,
66
+ end: `${date}T11:00:00+09:00`,
67
+ meetingUrl: 'https://meet.google.com/xxx-yyyy-zzz',
68
+ });
69
+ }
70
+ // 毎日: 朝会(平日のみ)
71
+ events.push({
72
+ id: `gcal-${date}-2`,
73
+ summary: '朝会',
74
+ start: `${date}T09:00:00+09:00`,
75
+ end: `${date}T09:15:00+09:00`,
76
+ });
77
+ // 水曜日: 1on1
78
+ if (dayOfWeek === 3) {
79
+ events.push({
80
+ id: `gcal-${date}-3`,
81
+ summary: '1on1 マネージャー',
82
+ description: '週次1on1',
83
+ start: `${date}T14:00:00+09:00`,
84
+ end: `${date}T14:30:00+09:00`,
85
+ meetingUrl: 'https://meet.google.com/aaa-bbbb-ccc',
86
+ });
87
+ }
88
+ // 金曜日: 週報
89
+ if (dayOfWeek === 5) {
90
+ events.push({
91
+ id: `gcal-${date}-4`,
92
+ summary: '週報作成',
93
+ start: `${date}T17:00:00+09:00`,
94
+ end: `${date}T18:00:00+09:00`,
95
+ });
96
+ }
97
+ return events;
98
+ }
99
+ export default router;
100
+ //# sourceMappingURL=gcal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcal.js","sourceRoot":"","sources":["../../src/routes/gcal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * APIルーターのエクスポート
3
+ */
4
+ export { default as reportsRouter } from './reports.js';
5
+ export { default as calendarRouter } from './calendar.js';
6
+ export { default as configRouter } from './config.js';
7
+ export { default as gcalRouter } from './gcal.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * APIルーターのエクスポート
3
+ */
4
+ export { default as reportsRouter } from './reports.js';
5
+ export { default as calendarRouter } from './calendar.js';
6
+ export { default as configRouter } from './config.js';
7
+ export { default as gcalRouter } from './gcal.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 日報API ルーター
3
+ *
4
+ * GET /api/reports/:date - 日報取得
5
+ * PUT /api/reports/:date - 日報保存
6
+ * DELETE /api/reports/:date - 日報削除
7
+ */
8
+ declare const router: import("express-serve-static-core").Router;
9
+ export default router;
10
+ //# sourceMappingURL=reports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/routes/reports.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAuLxB,eAAe,MAAM,CAAC"}