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.
- package/README.md +209 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +601 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/calendar.d.ts +8 -0
- package/dist/routes/calendar.d.ts.map +1 -0
- package/dist/routes/calendar.js +115 -0
- package/dist/routes/calendar.js.map +1 -0
- package/dist/routes/config.d.ts +9 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +75 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/gcal.d.ts +10 -0
- package/dist/routes/gcal.d.ts.map +1 -0
- package/dist/routes/gcal.js +100 -0
- package/dist/routes/gcal.js.map +1 -0
- package/dist/routes/index.d.ts +8 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +8 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/reports.d.ts +10 -0
- package/dist/routes/reports.d.ts.map +1 -0
- package/dist/routes/reports.js +175 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/types/index.d.ts +190 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/configValidator.d.ts +43 -0
- package/dist/utils/configValidator.d.ts.map +1 -0
- package/dist/utils/configValidator.js +435 -0
- package/dist/utils/configValidator.js.map +1 -0
- package/dist/utils/fileManager.d.ts +101 -0
- package/dist/utils/fileManager.d.ts.map +1 -0
- package/dist/utils/fileManager.js +295 -0
- package/dist/utils/fileManager.js.map +1 -0
- package/dist/utils/git.d.ts +42 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +130 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/markdown.d.ts +23 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +378 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/slack.d.ts +24 -0
- package/dist/utils/slack.d.ts.map +1 -0
- package/dist/utils/slack.js +90 -0
- package/dist/utils/slack.js.map +1 -0
- package/dist/utils/validator.d.ts +66 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +359 -0
- package/dist/utils/validator.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ファイル管理ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* 日報ファイルとYAML設定ファイルの読み書きを担当
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs/promises';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import matter from 'gray-matter';
|
|
9
|
+
import yaml from 'js-yaml';
|
|
10
|
+
let configPaths = {
|
|
11
|
+
projects: './sample/config/projects.yaml',
|
|
12
|
+
routines: './sample/config/routines.yaml',
|
|
13
|
+
reports: './sample/reports',
|
|
14
|
+
};
|
|
15
|
+
// タイムライン設定(ルート設定ファイルから読み込み)
|
|
16
|
+
let timelineConfig = {
|
|
17
|
+
hourHeight: 60,
|
|
18
|
+
maxHours: 36,
|
|
19
|
+
defaultStartHour: 8,
|
|
20
|
+
defaultEndHour: 20,
|
|
21
|
+
snapMinutes: 15,
|
|
22
|
+
};
|
|
23
|
+
// ルート設定ファイルの内容を保持
|
|
24
|
+
let rootConfig = {};
|
|
25
|
+
/**
|
|
26
|
+
* タイムライン設定をセット
|
|
27
|
+
*/
|
|
28
|
+
export function setTimelineConfig(config) {
|
|
29
|
+
timelineConfig = { ...timelineConfig, ...config };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* タイムライン設定を取得
|
|
33
|
+
*/
|
|
34
|
+
export function getTimelineConfig() {
|
|
35
|
+
return { ...timelineConfig };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ルート設定をセット
|
|
39
|
+
*/
|
|
40
|
+
export function setRootConfig(config) {
|
|
41
|
+
rootConfig = { ...config };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* ルート設定を取得
|
|
45
|
+
*/
|
|
46
|
+
export function getRootConfig() {
|
|
47
|
+
return { ...rootConfig };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 設定パスを初期化(環境変数から読み込み)
|
|
51
|
+
*/
|
|
52
|
+
export function initConfigPaths() {
|
|
53
|
+
if (process.env.CONFIG_PROJECTS)
|
|
54
|
+
configPaths.projects = process.env.CONFIG_PROJECTS;
|
|
55
|
+
if (process.env.CONFIG_ROUTINES)
|
|
56
|
+
configPaths.routines = process.env.CONFIG_ROUTINES;
|
|
57
|
+
if (process.env.CONFIG_REPORTS)
|
|
58
|
+
configPaths.reports = process.env.CONFIG_REPORTS;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 設定パスを設定
|
|
62
|
+
*/
|
|
63
|
+
export function setConfigPaths(paths) {
|
|
64
|
+
configPaths = { ...configPaths, ...paths };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 設定パスを取得
|
|
68
|
+
*/
|
|
69
|
+
export function getConfigPaths() {
|
|
70
|
+
return { ...configPaths };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 日報ディレクトリを取得
|
|
74
|
+
*/
|
|
75
|
+
export function getReportsPath() {
|
|
76
|
+
return configPaths.reports;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 日報ファイルパスを生成
|
|
80
|
+
*/
|
|
81
|
+
export function getReportFilePath(date) {
|
|
82
|
+
const [year, month] = date.split('-');
|
|
83
|
+
return path.join(configPaths.reports, year, month, `${date}.md`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 日報ファイルを読み込み
|
|
87
|
+
* @returns { content: Markdown本文, stats: frontmatterから取得した統計情報 } | null
|
|
88
|
+
*/
|
|
89
|
+
export async function readReport(date) {
|
|
90
|
+
const filePath = getReportFilePath(date);
|
|
91
|
+
try {
|
|
92
|
+
const fileContent = await fs.readFile(filePath, 'utf-8');
|
|
93
|
+
const { content, data } = matter(fileContent);
|
|
94
|
+
const stats = data.planHours !== undefined ? {
|
|
95
|
+
planHours: data.planHours || 0,
|
|
96
|
+
resultHours: data.resultHours || 0,
|
|
97
|
+
todoCount: data.todoCount || 0,
|
|
98
|
+
todoCompleted: data.todoCompleted || 0,
|
|
99
|
+
todoInProgress: data.todoInProgress || 0,
|
|
100
|
+
projectHours: data.projectHours || {},
|
|
101
|
+
updatedAt: data.updatedAt || new Date().toISOString(),
|
|
102
|
+
} : null;
|
|
103
|
+
return { content: content.trim(), stats };
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (error.code === 'ENOENT') {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 日報ファイルを保存(frontmatter付き)
|
|
114
|
+
*/
|
|
115
|
+
export async function writeReport(date, content, stats) {
|
|
116
|
+
const filePath = getReportFilePath(date);
|
|
117
|
+
const dir = path.dirname(filePath);
|
|
118
|
+
// ディレクトリを作成
|
|
119
|
+
await fs.mkdir(dir, { recursive: true });
|
|
120
|
+
// frontmatter付きコンテンツを生成
|
|
121
|
+
const frontmatter = {
|
|
122
|
+
planHours: stats.planHours,
|
|
123
|
+
resultHours: stats.resultHours,
|
|
124
|
+
todoCount: stats.todoCount,
|
|
125
|
+
todoCompleted: stats.todoCompleted,
|
|
126
|
+
todoInProgress: stats.todoInProgress,
|
|
127
|
+
projectHours: stats.projectHours,
|
|
128
|
+
updatedAt: stats.updatedAt,
|
|
129
|
+
};
|
|
130
|
+
const fileContent = matter.stringify(content.trim(), frontmatter);
|
|
131
|
+
// アトミック書き込み(一時ファイル経由)
|
|
132
|
+
const tempPath = `${filePath}.tmp`;
|
|
133
|
+
await fs.writeFile(tempPath, fileContent, 'utf-8');
|
|
134
|
+
await fs.rename(tempPath, filePath);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 日報ファイルを削除
|
|
138
|
+
*/
|
|
139
|
+
export async function deleteReport(date) {
|
|
140
|
+
const filePath = getReportFilePath(date);
|
|
141
|
+
try {
|
|
142
|
+
await fs.unlink(filePath);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (error.code === 'ENOENT') {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 指定年月の全日報のfrontmatter(統計情報)を取得
|
|
154
|
+
*/
|
|
155
|
+
export async function getMonthReportStats(year, month) {
|
|
156
|
+
const monthStr = month.toString().padStart(2, '0');
|
|
157
|
+
const dirPath = path.join(configPaths.reports, year.toString(), monthStr);
|
|
158
|
+
const stats = new Map();
|
|
159
|
+
try {
|
|
160
|
+
const files = await fs.readdir(dirPath);
|
|
161
|
+
for (const file of files) {
|
|
162
|
+
if (!file.endsWith('.md'))
|
|
163
|
+
continue;
|
|
164
|
+
const date = file.replace('.md', '');
|
|
165
|
+
const filePath = path.join(dirPath, file);
|
|
166
|
+
try {
|
|
167
|
+
const fileContent = await fs.readFile(filePath, 'utf-8');
|
|
168
|
+
const { data } = matter(fileContent);
|
|
169
|
+
if (data.planHours !== undefined) {
|
|
170
|
+
stats.set(date, {
|
|
171
|
+
planHours: data.planHours || 0,
|
|
172
|
+
resultHours: data.resultHours || 0,
|
|
173
|
+
todoCount: data.todoCount || 0,
|
|
174
|
+
todoCompleted: data.todoCompleted || 0,
|
|
175
|
+
todoInProgress: data.todoInProgress || 0,
|
|
176
|
+
projectHours: data.projectHours || {},
|
|
177
|
+
updatedAt: data.updatedAt || '',
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// ファイル読み込みエラーは無視
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// ディレクトリが存在しない場合は空のMapを返す
|
|
188
|
+
}
|
|
189
|
+
return stats;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 設定ファイルを読み込み
|
|
193
|
+
*/
|
|
194
|
+
export async function readConfig() {
|
|
195
|
+
// プロジェクト設定を読み込み
|
|
196
|
+
let projects = [];
|
|
197
|
+
try {
|
|
198
|
+
const projectsContent = await fs.readFile(configPaths.projects, 'utf-8');
|
|
199
|
+
const projectsData = yaml.load(projectsContent);
|
|
200
|
+
projects = projectsData?.projects || [];
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// ファイルがない場合はデフォルト値
|
|
204
|
+
}
|
|
205
|
+
// ルーチン設定を読み込み
|
|
206
|
+
let routines = {};
|
|
207
|
+
try {
|
|
208
|
+
const routinesContent = await fs.readFile(configPaths.routines, 'utf-8');
|
|
209
|
+
const routinesData = yaml.load(routinesContent);
|
|
210
|
+
routines = routinesData?.routines || {};
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// ファイルがない場合はデフォルト値
|
|
214
|
+
}
|
|
215
|
+
// Slack設定をルート設定から取得
|
|
216
|
+
const slackConfig = rootConfig.slack;
|
|
217
|
+
const slack = slackConfig ? { enabled: !!slackConfig.enabled } : undefined;
|
|
218
|
+
return { projects, routines, timeline: getTimelineConfig(), slack };
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 設定ファイルを保存
|
|
222
|
+
*/
|
|
223
|
+
export async function writeConfig(config) {
|
|
224
|
+
if (config.projects) {
|
|
225
|
+
const dir = path.dirname(configPaths.projects);
|
|
226
|
+
await fs.mkdir(dir, { recursive: true });
|
|
227
|
+
const projectsContent = yaml.dump({ projects: config.projects });
|
|
228
|
+
await fs.writeFile(configPaths.projects, projectsContent, 'utf-8');
|
|
229
|
+
}
|
|
230
|
+
if (config.routines) {
|
|
231
|
+
const dir = path.dirname(configPaths.routines);
|
|
232
|
+
await fs.mkdir(dir, { recursive: true });
|
|
233
|
+
const routinesContent = yaml.dump({ routines: config.routines });
|
|
234
|
+
await fs.writeFile(configPaths.routines, routinesContent, 'utf-8');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* ファイルが存在するかチェック
|
|
239
|
+
*/
|
|
240
|
+
export async function fileExists(filePath) {
|
|
241
|
+
try {
|
|
242
|
+
await fs.access(filePath);
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 日報が存在する年月のリストを取得
|
|
251
|
+
*/
|
|
252
|
+
export async function getAvailableYearMonths() {
|
|
253
|
+
const result = [];
|
|
254
|
+
try {
|
|
255
|
+
// 年ディレクトリを一覧
|
|
256
|
+
const years = await fs.readdir(configPaths.reports);
|
|
257
|
+
for (const yearStr of years) {
|
|
258
|
+
const year = parseInt(yearStr, 10);
|
|
259
|
+
if (isNaN(year))
|
|
260
|
+
continue;
|
|
261
|
+
const yearPath = path.join(configPaths.reports, yearStr);
|
|
262
|
+
const yearStat = await fs.stat(yearPath);
|
|
263
|
+
if (!yearStat.isDirectory())
|
|
264
|
+
continue;
|
|
265
|
+
// 月ディレクトリを一覧
|
|
266
|
+
const months = await fs.readdir(yearPath);
|
|
267
|
+
for (const monthStr of months) {
|
|
268
|
+
const month = parseInt(monthStr, 10);
|
|
269
|
+
if (isNaN(month) || month < 1 || month > 12)
|
|
270
|
+
continue;
|
|
271
|
+
const monthPath = path.join(yearPath, monthStr);
|
|
272
|
+
const monthStat = await fs.stat(monthPath);
|
|
273
|
+
if (!monthStat.isDirectory())
|
|
274
|
+
continue;
|
|
275
|
+
// .mdファイルが存在するか確認
|
|
276
|
+
const files = await fs.readdir(monthPath);
|
|
277
|
+
const hasReports = files.some(f => f.endsWith('.md'));
|
|
278
|
+
if (hasReports) {
|
|
279
|
+
result.push({ year, month });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// ディレクトリが存在しない場合は空配列を返す
|
|
286
|
+
}
|
|
287
|
+
// 年月でソート(降順:新しい順)
|
|
288
|
+
result.sort((a, b) => {
|
|
289
|
+
if (a.year !== b.year)
|
|
290
|
+
return b.year - a.year;
|
|
291
|
+
return b.month - a.month;
|
|
292
|
+
});
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=fileManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/utils/fileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git連携ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* simple-gitを使用してGit操作を行う
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Git ルートからの相対パスを取得
|
|
8
|
+
*/
|
|
9
|
+
export declare function getRelativePathFromGitRoot(absolutePath: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Git commit
|
|
12
|
+
*/
|
|
13
|
+
export declare function gitCommit(filePath: string, message?: string): Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
commitHash?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Git push
|
|
20
|
+
*/
|
|
21
|
+
export declare function gitPush(): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Git ステータス取得
|
|
27
|
+
*/
|
|
28
|
+
export declare function getGitStatus(): Promise<{
|
|
29
|
+
branch: string;
|
|
30
|
+
uncommittedChanges: number;
|
|
31
|
+
modifiedFiles: string[];
|
|
32
|
+
lastCommit?: {
|
|
33
|
+
hash: string;
|
|
34
|
+
message: string;
|
|
35
|
+
date: string;
|
|
36
|
+
};
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Gitリポジトリが初期化されているかチェック
|
|
40
|
+
*/
|
|
41
|
+
export declare function isGitRepository(): Promise<boolean>;
|
|
42
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2CH;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CASvE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY7E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC,CAwBD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CASxD"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git連携ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* simple-gitを使用してGit操作を行う
|
|
5
|
+
*/
|
|
6
|
+
import { simpleGit } from 'simple-git';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import { getReportsPath } from './fileManager.js';
|
|
10
|
+
/**
|
|
11
|
+
* Gitリポジトリのルートを探す
|
|
12
|
+
*/
|
|
13
|
+
function findGitRoot(startPath) {
|
|
14
|
+
let currentPath = path.resolve(startPath);
|
|
15
|
+
while (currentPath !== '/') {
|
|
16
|
+
const gitDir = path.join(currentPath, '.git');
|
|
17
|
+
if (fs.existsSync(gitDir)) {
|
|
18
|
+
return currentPath;
|
|
19
|
+
}
|
|
20
|
+
currentPath = path.dirname(currentPath);
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Git インスタンスを取得
|
|
26
|
+
*/
|
|
27
|
+
function getGit() {
|
|
28
|
+
const reportsPath = getReportsPath();
|
|
29
|
+
const gitRoot = findGitRoot(reportsPath);
|
|
30
|
+
if (!gitRoot) {
|
|
31
|
+
console.warn(`Git repository not found from: ${reportsPath}`);
|
|
32
|
+
}
|
|
33
|
+
const options = {
|
|
34
|
+
baseDir: gitRoot || reportsPath,
|
|
35
|
+
binary: 'git',
|
|
36
|
+
maxConcurrentProcesses: 1,
|
|
37
|
+
};
|
|
38
|
+
return simpleGit(options);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Git ルートからの相対パスを取得
|
|
42
|
+
*/
|
|
43
|
+
export function getRelativePathFromGitRoot(absolutePath) {
|
|
44
|
+
const reportsPath = getReportsPath();
|
|
45
|
+
const gitRoot = findGitRoot(reportsPath);
|
|
46
|
+
if (!gitRoot) {
|
|
47
|
+
return absolutePath;
|
|
48
|
+
}
|
|
49
|
+
return path.relative(gitRoot, absolutePath);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Git commit
|
|
53
|
+
*/
|
|
54
|
+
export async function gitCommit(filePath, message) {
|
|
55
|
+
const git = getGit();
|
|
56
|
+
try {
|
|
57
|
+
// ファイルをステージング
|
|
58
|
+
await git.add(filePath);
|
|
59
|
+
// コミット
|
|
60
|
+
const commitMessage = message || `日報更新: ${new Date().toISOString().split('T')[0]}`;
|
|
61
|
+
const result = await git.commit(commitMessage);
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
commitHash: result.commit,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Git push
|
|
76
|
+
*/
|
|
77
|
+
export async function gitPush() {
|
|
78
|
+
const git = getGit();
|
|
79
|
+
try {
|
|
80
|
+
await git.push();
|
|
81
|
+
return { success: true };
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Git ステータス取得
|
|
92
|
+
*/
|
|
93
|
+
export async function getGitStatus() {
|
|
94
|
+
const git = getGit();
|
|
95
|
+
try {
|
|
96
|
+
const status = await git.status();
|
|
97
|
+
const log = await git.log({ maxCount: 1 });
|
|
98
|
+
return {
|
|
99
|
+
branch: status.current || 'unknown',
|
|
100
|
+
uncommittedChanges: status.files.length,
|
|
101
|
+
modifiedFiles: status.files.map(f => f.path),
|
|
102
|
+
lastCommit: log.latest ? {
|
|
103
|
+
hash: log.latest.hash,
|
|
104
|
+
message: log.latest.message,
|
|
105
|
+
date: log.latest.date,
|
|
106
|
+
} : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return {
|
|
111
|
+
branch: 'unknown',
|
|
112
|
+
uncommittedChanges: 0,
|
|
113
|
+
modifiedFiles: [],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Gitリポジトリが初期化されているかチェック
|
|
119
|
+
*/
|
|
120
|
+
export async function isGitRepository() {
|
|
121
|
+
const git = getGit();
|
|
122
|
+
try {
|
|
123
|
+
await git.status();
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown パーサー・ジェネレーター
|
|
3
|
+
*
|
|
4
|
+
* 日報のMarkdown形式を解析・生成する
|
|
5
|
+
*/
|
|
6
|
+
import type { DailyReport, ReportStats } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Markdownコンテンツをパースして DailyReport オブジェクトに変換
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseMarkdown(date: string, content: string): DailyReport;
|
|
11
|
+
/**
|
|
12
|
+
* DailyReport オブジェクトからMarkdownコンテンツを生成
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateMarkdown(report: DailyReport): string;
|
|
15
|
+
/**
|
|
16
|
+
* 統計情報を計算
|
|
17
|
+
*/
|
|
18
|
+
export declare function calculateStats(report: DailyReport): ReportStats;
|
|
19
|
+
/**
|
|
20
|
+
* frontmatter付きMarkdownを生成
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateMarkdownWithFrontmatter(report: DailyReport, stats: ReportStats): string;
|
|
23
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAsC,MAAM,mBAAmB,CAAC;AAEtG;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CA0IxE;AAkKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuD5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAwB/D;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAgB/F"}
|