@k2works/claude-code-booster 1.10.0 → 1.11.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/LICENSE +21 -21
- package/README.md +42 -42
- package/bin/claude-code-booster +79 -79
- package/lib/assets/.claude/README.md +162 -162
- package/lib/assets/.claude/SKILLS_TEMPLATE.md +100 -100
- package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
- package/lib/assets/.claude/settings.json +11 -11
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +119 -119
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +87 -87
- package/lib/assets/.claude/skills/analyzing-business/SKILL.md +117 -117
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +80 -80
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +88 -88
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +137 -137
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +89 -87
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +102 -102
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +87 -87
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +86 -86
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +87 -87
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +115 -115
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +106 -106
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +96 -96
- package/lib/assets/.claude/skills/developing-release/SKILL.md +154 -154
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +136 -136
- package/lib/assets/.claude/skills/git-commit/SKILL.md +106 -106
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +98 -98
- package/lib/assets/.claude/skills/managing-docs/SKILL.md +200 -200
- package/lib/assets/.claude/skills/managing-operations/DEPLOY.md +77 -77
- package/lib/assets/.claude/skills/managing-operations/SETUP_CSHARP.md +80 -80
- package/lib/assets/.claude/skills/managing-operations/SETUP_FRONTEND.md +84 -84
- package/lib/assets/.claude/skills/managing-operations/SETUP_JAVA.md +75 -75
- package/lib/assets/.claude/skills/managing-operations/SKILL.md +156 -156
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +134 -134
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +243 -243
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +193 -193
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +222 -222
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +164 -164
- package/lib/assets/.devcontainer/devcontainer.json +34 -34
- package/lib/assets/.env.example +17 -17
- package/lib/assets/.gitattributes +4 -4
- package/lib/assets/.github/workflows/docker-publish.yml +77 -77
- package/lib/assets/.github/workflows/mkdocs.yml +39 -39
- package/lib/assets/AGENTS.md +94 -94
- package/lib/assets/CLAUDE.md +162 -162
- package/lib/assets/README.md +285 -269
- package/lib/assets/docker-compose.yml +33 -33
- package/lib/assets/docs/assets/css/extra.css +29 -29
- package/lib/assets/docs/assets/js/extra.js +44 -44
- package/lib/assets/docs/index.md +14 -14
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +532 -532
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +341 -341
- package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +578 -578
- package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +465 -465
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +448 -448
- package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +242 -242
- package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +2216 -2216
- package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +1878 -1878
- package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +554 -554
- package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +705 -705
- package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +1313 -1313
- package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +311 -311
- package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +599 -599
- package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +528 -528
- package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +682 -682
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +442 -442
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +558 -558
- package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +663 -663
- package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1248 -1248
- package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +392 -392
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +235 -235
- package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1236 -1236
- package/lib/assets/docs/template/ADR.md +30 -30
- package/lib/assets/docs/template/README.md +50 -50
- package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +12 -12
- package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +58 -58
- package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +13 -13
- package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +379 -379
- package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +68 -68
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
- package/lib/assets/docs/template//350/250/255/350/250/210.md +163 -163
- package/lib/assets/gulpfile.js +23 -23
- package/lib/assets/mkdocs.yml +65 -65
- package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
- package/lib/assets/ops/scripts/journal.js +180 -180
- package/lib/assets/ops/scripts/mkdocs.js +82 -82
- package/lib/assets/ops/scripts/release.js +431 -431
- package/lib/assets/ops/scripts/ssh.js +190 -190
- package/lib/assets/ops/scripts/vault.js +299 -299
- package/lib/assets/package-lock.json +1653 -1653
- package/lib/assets/package.json +40 -40
- package/lib/gulpfile.js +37 -37
- package/package.json +41 -41
|
@@ -1,180 +1,180 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { execSync } from 'child_process';
|
|
6
|
-
|
|
7
|
-
// Increase buffer to safely handle large diffs/logs
|
|
8
|
-
const MAX_BUFFER = 256 * 1024 * 1024; // 256 MB
|
|
9
|
-
|
|
10
|
-
// Function to register the journal:generate task
|
|
11
|
-
export default function(gulp) {
|
|
12
|
-
// Helper function to generate journal for a specific date
|
|
13
|
-
const generateJournalForDate = (dateStr, journalDir) => {
|
|
14
|
-
// Format date as YYYYMMDD
|
|
15
|
-
const dateObj = new Date(dateStr);
|
|
16
|
-
const formattedDate = dateObj.toISOString().slice(0, 10).replace(/-/g, '');
|
|
17
|
-
|
|
18
|
-
// File path for this date's journal
|
|
19
|
-
const journalFile = path.join(journalDir, `${formattedDate}.md`);
|
|
20
|
-
|
|
21
|
-
// Get commits for this date
|
|
22
|
-
const commits = execSync(`git log --since="${dateStr} 00:00:00" --until="${dateStr} 23:59:59" --format="%h %s%n%b"`, { maxBuffer: MAX_BUFFER }).toString();
|
|
23
|
-
|
|
24
|
-
// Skip if no commits
|
|
25
|
-
if (!commits.trim()) {
|
|
26
|
-
console.log(`No commits found for ${dateStr}`);
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Get detailed changes for each commit on this date
|
|
31
|
-
const commitHashesOutput = execSync(`git log --since="${dateStr} 00:00:00" --until="${dateStr} 23:59:59" --format="%h"`, { maxBuffer: MAX_BUFFER }).toString();
|
|
32
|
-
const commitHashes = commitHashesOutput.split('\n').map(line => line.trim()).filter(Boolean);
|
|
33
|
-
|
|
34
|
-
const detailedCommits = [];
|
|
35
|
-
|
|
36
|
-
commitHashes.forEach(hash => {
|
|
37
|
-
// Get commit details
|
|
38
|
-
const commitMessage = execSync(`git show -s --format="%s%n%b" ${hash}`, { maxBuffer: MAX_BUFFER }).toString().trim();
|
|
39
|
-
|
|
40
|
-
// Get files changed
|
|
41
|
-
const filesChangedOutput = execSync(`git show --name-status ${hash}`, { maxBuffer: MAX_BUFFER }).toString();
|
|
42
|
-
const filesChanged = filesChangedOutput.split('\n')
|
|
43
|
-
.map(line => line.trim())
|
|
44
|
-
.filter(line => /^[AMDRT]\s/.test(line));
|
|
45
|
-
|
|
46
|
-
// Get code changes (diff) with robust handling for large diffs
|
|
47
|
-
let diff = '';
|
|
48
|
-
try {
|
|
49
|
-
diff = execSync(`git show ${hash} --color=never`, { maxBuffer: MAX_BUFFER }).toString();
|
|
50
|
-
} catch (e) {
|
|
51
|
-
// Fallback to a summary if diff is too large or any error occurs
|
|
52
|
-
const summary = execSync(`git show --stat --oneline ${hash} --color=never`, { maxBuffer: MAX_BUFFER }).toString();
|
|
53
|
-
diff = `[Diff too large or failed to load. Showing summary instead.]\n\n${summary}`;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
detailedCommits.push({
|
|
57
|
-
hash,
|
|
58
|
-
message: commitMessage,
|
|
59
|
-
filesChanged,
|
|
60
|
-
diff
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// Create journal content
|
|
65
|
-
let content = `# 作業履歴 ${dateStr}\n\n`;
|
|
66
|
-
content += `## 概要\n\n`;
|
|
67
|
-
content += `${dateStr}の作業内容をまとめています。\n\n`;
|
|
68
|
-
|
|
69
|
-
// Add each commit
|
|
70
|
-
detailedCommits.forEach(commit => {
|
|
71
|
-
content += `## コミット: ${commit.hash}\n\n`;
|
|
72
|
-
content += `### メッセージ\n\n`;
|
|
73
|
-
content += `\`\`\`\n${commit.message}\n\`\`\`\n\n`;
|
|
74
|
-
|
|
75
|
-
content += `### 変更されたファイル\n\n`;
|
|
76
|
-
commit.filesChanged.forEach(file => {
|
|
77
|
-
content += `- ${file}\n`;
|
|
78
|
-
});
|
|
79
|
-
content += `\n`;
|
|
80
|
-
|
|
81
|
-
content += `### 変更内容\n\n`;
|
|
82
|
-
content += `\`\`\`diff\n${commit.diff}\n\`\`\`\n\n`;
|
|
83
|
-
|
|
84
|
-
// Add PlantUML diagram placeholder if there are significant structural changes
|
|
85
|
-
const hasStructuralChanges = commit.filesChanged.some(f =>
|
|
86
|
-
f.endsWith('.rb') &&
|
|
87
|
-
(f.includes('model') || f.includes('controller') || f.includes('service'))
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
if (hasStructuralChanges) {
|
|
91
|
-
content += `### 構造変更\n\n`;
|
|
92
|
-
content += `\`\`\`plantuml\n@startuml\n`;
|
|
93
|
-
content += `' このコミットによる構造変更を表すダイアグラムをここに追加してください\n`;
|
|
94
|
-
content += `' 例:\n`;
|
|
95
|
-
content += `' class NewClass\n`;
|
|
96
|
-
content += `' class ExistingClass\n`;
|
|
97
|
-
content += `' NewClass --> ExistingClass\n`;
|
|
98
|
-
content += `@enduml\n\`\`\`\n\n`;
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Write to file
|
|
103
|
-
fs.writeFileSync(journalFile, content);
|
|
104
|
-
console.log(`Created journal entry for ${dateStr} at ${journalFile}`);
|
|
105
|
-
return true;
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// Journal generation task for a specific date
|
|
109
|
-
gulp.task('journal:generate:date', (done) => {
|
|
110
|
-
// Get date from command line arguments
|
|
111
|
-
const args = process.argv.slice(3);
|
|
112
|
-
const dateArg = args.find(arg => arg.startsWith('--date='));
|
|
113
|
-
|
|
114
|
-
if (!dateArg) {
|
|
115
|
-
console.error('Error: Please provide a date using --date=YYYY-MM-DD format');
|
|
116
|
-
done();
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const dateStr = dateArg.split('=')[1];
|
|
121
|
-
|
|
122
|
-
// Validate date format
|
|
123
|
-
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
|
|
124
|
-
console.error('Error: Date must be in YYYY-MM-DD format');
|
|
125
|
-
done();
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Directory to store journal entries
|
|
130
|
-
const journalDir = path.join('docs', 'journal');
|
|
131
|
-
|
|
132
|
-
// Create directory if it doesn't exist
|
|
133
|
-
if (!fs.existsSync(journalDir)) {
|
|
134
|
-
fs.mkdirSync(journalDir, { recursive: true });
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const result = generateJournalForDate(dateStr, journalDir);
|
|
138
|
-
|
|
139
|
-
if (!result) {
|
|
140
|
-
console.log(`No journal entry was created for ${dateStr}`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
done();
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
// Journal generation task for all dates
|
|
147
|
-
gulp.task('journal:generate', (done) => {
|
|
148
|
-
// Directory to store journal entries
|
|
149
|
-
const journalDir = path.join('docs', 'journal');
|
|
150
|
-
|
|
151
|
-
// Create directory if it doesn't exist
|
|
152
|
-
if (!fs.existsSync(journalDir)) {
|
|
153
|
-
fs.mkdirSync(journalDir, { recursive: true });
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Get all commit dates
|
|
157
|
-
const datesOutput = execSync('git log --format=%ad --date=short', { maxBuffer: MAX_BUFFER }).toString();
|
|
158
|
-
const dates = [...new Set(datesOutput.split('\n').map(line => line.trim()).filter(Boolean))];
|
|
159
|
-
|
|
160
|
-
dates.forEach(dateStr => {
|
|
161
|
-
// Format date as YYYYMMDD
|
|
162
|
-
const dateObj = new Date(dateStr);
|
|
163
|
-
const formattedDate = dateObj.toISOString().slice(0, 10).replace(/-/g, '');
|
|
164
|
-
|
|
165
|
-
// File path for this date's journal
|
|
166
|
-
const journalFile = path.join(journalDir, `${formattedDate}.md`);
|
|
167
|
-
|
|
168
|
-
// Skip if file already exists
|
|
169
|
-
if (fs.existsSync(journalFile)) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Generate journal for this date
|
|
174
|
-
generateJournalForDate(dateStr, journalDir);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
console.log("Journal generation completed.");
|
|
178
|
-
done();
|
|
179
|
-
});
|
|
180
|
-
}
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
|
|
7
|
+
// Increase buffer to safely handle large diffs/logs
|
|
8
|
+
const MAX_BUFFER = 256 * 1024 * 1024; // 256 MB
|
|
9
|
+
|
|
10
|
+
// Function to register the journal:generate task
|
|
11
|
+
export default function(gulp) {
|
|
12
|
+
// Helper function to generate journal for a specific date
|
|
13
|
+
const generateJournalForDate = (dateStr, journalDir) => {
|
|
14
|
+
// Format date as YYYYMMDD
|
|
15
|
+
const dateObj = new Date(dateStr);
|
|
16
|
+
const formattedDate = dateObj.toISOString().slice(0, 10).replace(/-/g, '');
|
|
17
|
+
|
|
18
|
+
// File path for this date's journal
|
|
19
|
+
const journalFile = path.join(journalDir, `${formattedDate}.md`);
|
|
20
|
+
|
|
21
|
+
// Get commits for this date
|
|
22
|
+
const commits = execSync(`git log --since="${dateStr} 00:00:00" --until="${dateStr} 23:59:59" --format="%h %s%n%b"`, { maxBuffer: MAX_BUFFER }).toString();
|
|
23
|
+
|
|
24
|
+
// Skip if no commits
|
|
25
|
+
if (!commits.trim()) {
|
|
26
|
+
console.log(`No commits found for ${dateStr}`);
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Get detailed changes for each commit on this date
|
|
31
|
+
const commitHashesOutput = execSync(`git log --since="${dateStr} 00:00:00" --until="${dateStr} 23:59:59" --format="%h"`, { maxBuffer: MAX_BUFFER }).toString();
|
|
32
|
+
const commitHashes = commitHashesOutput.split('\n').map(line => line.trim()).filter(Boolean);
|
|
33
|
+
|
|
34
|
+
const detailedCommits = [];
|
|
35
|
+
|
|
36
|
+
commitHashes.forEach(hash => {
|
|
37
|
+
// Get commit details
|
|
38
|
+
const commitMessage = execSync(`git show -s --format="%s%n%b" ${hash}`, { maxBuffer: MAX_BUFFER }).toString().trim();
|
|
39
|
+
|
|
40
|
+
// Get files changed
|
|
41
|
+
const filesChangedOutput = execSync(`git show --name-status ${hash}`, { maxBuffer: MAX_BUFFER }).toString();
|
|
42
|
+
const filesChanged = filesChangedOutput.split('\n')
|
|
43
|
+
.map(line => line.trim())
|
|
44
|
+
.filter(line => /^[AMDRT]\s/.test(line));
|
|
45
|
+
|
|
46
|
+
// Get code changes (diff) with robust handling for large diffs
|
|
47
|
+
let diff = '';
|
|
48
|
+
try {
|
|
49
|
+
diff = execSync(`git show ${hash} --color=never`, { maxBuffer: MAX_BUFFER }).toString();
|
|
50
|
+
} catch (e) {
|
|
51
|
+
// Fallback to a summary if diff is too large or any error occurs
|
|
52
|
+
const summary = execSync(`git show --stat --oneline ${hash} --color=never`, { maxBuffer: MAX_BUFFER }).toString();
|
|
53
|
+
diff = `[Diff too large or failed to load. Showing summary instead.]\n\n${summary}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
detailedCommits.push({
|
|
57
|
+
hash,
|
|
58
|
+
message: commitMessage,
|
|
59
|
+
filesChanged,
|
|
60
|
+
diff
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Create journal content
|
|
65
|
+
let content = `# 作業履歴 ${dateStr}\n\n`;
|
|
66
|
+
content += `## 概要\n\n`;
|
|
67
|
+
content += `${dateStr}の作業内容をまとめています。\n\n`;
|
|
68
|
+
|
|
69
|
+
// Add each commit
|
|
70
|
+
detailedCommits.forEach(commit => {
|
|
71
|
+
content += `## コミット: ${commit.hash}\n\n`;
|
|
72
|
+
content += `### メッセージ\n\n`;
|
|
73
|
+
content += `\`\`\`\n${commit.message}\n\`\`\`\n\n`;
|
|
74
|
+
|
|
75
|
+
content += `### 変更されたファイル\n\n`;
|
|
76
|
+
commit.filesChanged.forEach(file => {
|
|
77
|
+
content += `- ${file}\n`;
|
|
78
|
+
});
|
|
79
|
+
content += `\n`;
|
|
80
|
+
|
|
81
|
+
content += `### 変更内容\n\n`;
|
|
82
|
+
content += `\`\`\`diff\n${commit.diff}\n\`\`\`\n\n`;
|
|
83
|
+
|
|
84
|
+
// Add PlantUML diagram placeholder if there are significant structural changes
|
|
85
|
+
const hasStructuralChanges = commit.filesChanged.some(f =>
|
|
86
|
+
f.endsWith('.rb') &&
|
|
87
|
+
(f.includes('model') || f.includes('controller') || f.includes('service'))
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
if (hasStructuralChanges) {
|
|
91
|
+
content += `### 構造変更\n\n`;
|
|
92
|
+
content += `\`\`\`plantuml\n@startuml\n`;
|
|
93
|
+
content += `' このコミットによる構造変更を表すダイアグラムをここに追加してください\n`;
|
|
94
|
+
content += `' 例:\n`;
|
|
95
|
+
content += `' class NewClass\n`;
|
|
96
|
+
content += `' class ExistingClass\n`;
|
|
97
|
+
content += `' NewClass --> ExistingClass\n`;
|
|
98
|
+
content += `@enduml\n\`\`\`\n\n`;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Write to file
|
|
103
|
+
fs.writeFileSync(journalFile, content);
|
|
104
|
+
console.log(`Created journal entry for ${dateStr} at ${journalFile}`);
|
|
105
|
+
return true;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Journal generation task for a specific date
|
|
109
|
+
gulp.task('journal:generate:date', (done) => {
|
|
110
|
+
// Get date from command line arguments
|
|
111
|
+
const args = process.argv.slice(3);
|
|
112
|
+
const dateArg = args.find(arg => arg.startsWith('--date='));
|
|
113
|
+
|
|
114
|
+
if (!dateArg) {
|
|
115
|
+
console.error('Error: Please provide a date using --date=YYYY-MM-DD format');
|
|
116
|
+
done();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const dateStr = dateArg.split('=')[1];
|
|
121
|
+
|
|
122
|
+
// Validate date format
|
|
123
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
|
|
124
|
+
console.error('Error: Date must be in YYYY-MM-DD format');
|
|
125
|
+
done();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Directory to store journal entries
|
|
130
|
+
const journalDir = path.join('docs', 'journal');
|
|
131
|
+
|
|
132
|
+
// Create directory if it doesn't exist
|
|
133
|
+
if (!fs.existsSync(journalDir)) {
|
|
134
|
+
fs.mkdirSync(journalDir, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const result = generateJournalForDate(dateStr, journalDir);
|
|
138
|
+
|
|
139
|
+
if (!result) {
|
|
140
|
+
console.log(`No journal entry was created for ${dateStr}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
done();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Journal generation task for all dates
|
|
147
|
+
gulp.task('journal:generate', (done) => {
|
|
148
|
+
// Directory to store journal entries
|
|
149
|
+
const journalDir = path.join('docs', 'journal');
|
|
150
|
+
|
|
151
|
+
// Create directory if it doesn't exist
|
|
152
|
+
if (!fs.existsSync(journalDir)) {
|
|
153
|
+
fs.mkdirSync(journalDir, { recursive: true });
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Get all commit dates
|
|
157
|
+
const datesOutput = execSync('git log --format=%ad --date=short', { maxBuffer: MAX_BUFFER }).toString();
|
|
158
|
+
const dates = [...new Set(datesOutput.split('\n').map(line => line.trim()).filter(Boolean))];
|
|
159
|
+
|
|
160
|
+
dates.forEach(dateStr => {
|
|
161
|
+
// Format date as YYYYMMDD
|
|
162
|
+
const dateObj = new Date(dateStr);
|
|
163
|
+
const formattedDate = dateObj.toISOString().slice(0, 10).replace(/-/g, '');
|
|
164
|
+
|
|
165
|
+
// File path for this date's journal
|
|
166
|
+
const journalFile = path.join(journalDir, `${formattedDate}.md`);
|
|
167
|
+
|
|
168
|
+
// Skip if file already exists
|
|
169
|
+
if (fs.existsSync(journalFile)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Generate journal for this date
|
|
174
|
+
generateJournalForDate(dateStr, journalDir);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
console.log("Journal generation completed.");
|
|
178
|
+
done();
|
|
179
|
+
});
|
|
180
|
+
}
|
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
import { execSync } from 'child_process';
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
import { cleanDockerEnv, isDockerAvailable, openUrl } from './shared.js';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* docker compose コマンドを実行
|
|
10
|
-
* @param {string} args - docker compose に渡す引数
|
|
11
|
-
*/
|
|
12
|
-
function dockerCompose(args) {
|
|
13
|
-
execSync(`docker compose ${args}`, { stdio: 'inherit', env: cleanDockerEnv() });
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Docker が利用可能か確認し、不可なら警告メッセージを表示して false を返す
|
|
18
|
-
* @returns {boolean} Docker が利用可能なら true
|
|
19
|
-
*/
|
|
20
|
-
function requireDocker() {
|
|
21
|
-
if (isDockerAvailable()) {
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
console.warn('Warning: Docker is not running. Skipping this task.');
|
|
25
|
-
console.warn('Please start Docker Desktop and try again.');
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* MkDocs タスクを gulp に登録する
|
|
31
|
-
* @param {import('gulp').Gulp} gulp - Gulp インスタンス
|
|
32
|
-
*/
|
|
33
|
-
export default function (gulp) {
|
|
34
|
-
gulp.task('mkdocs:serve', (done) => {
|
|
35
|
-
if (!requireDocker()) { done(); return; }
|
|
36
|
-
try {
|
|
37
|
-
console.log('Starting MkDocs server...');
|
|
38
|
-
dockerCompose('up -d mkdocs');
|
|
39
|
-
console.log('\nDocumentation is available at http://localhost:8000');
|
|
40
|
-
done();
|
|
41
|
-
} catch (error) {
|
|
42
|
-
done(error);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
gulp.task('mkdocs:build', (done) => {
|
|
47
|
-
if (!requireDocker()) { done(); return; }
|
|
48
|
-
try {
|
|
49
|
-
console.log('Building MkDocs documentation...');
|
|
50
|
-
const siteDir = path.join(process.cwd(), 'site');
|
|
51
|
-
if (fs.existsSync(siteDir)) {
|
|
52
|
-
fs.rmSync(siteDir, { recursive: true, force: true });
|
|
53
|
-
}
|
|
54
|
-
dockerCompose('run --rm mkdocs mkdocs build');
|
|
55
|
-
console.log('\nBuild completed.');
|
|
56
|
-
done();
|
|
57
|
-
} catch (error) {
|
|
58
|
-
done(error);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
gulp.task('mkdocs:stop', (done) => {
|
|
63
|
-
if (!requireDocker()) { done(); return; }
|
|
64
|
-
try {
|
|
65
|
-
console.log('Stopping MkDocs server...');
|
|
66
|
-
dockerCompose('down');
|
|
67
|
-
console.log('Stopped.');
|
|
68
|
-
done();
|
|
69
|
-
} catch (error) {
|
|
70
|
-
done(error);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
gulp.task('mkdocs:open', (done) => {
|
|
75
|
-
try {
|
|
76
|
-
openUrl('http://localhost:8000');
|
|
77
|
-
done();
|
|
78
|
-
} catch (error) {
|
|
79
|
-
done(error);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { cleanDockerEnv, isDockerAvailable, openUrl } from './shared.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* docker compose コマンドを実行
|
|
10
|
+
* @param {string} args - docker compose に渡す引数
|
|
11
|
+
*/
|
|
12
|
+
function dockerCompose(args) {
|
|
13
|
+
execSync(`docker compose ${args}`, { stdio: 'inherit', env: cleanDockerEnv() });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Docker が利用可能か確認し、不可なら警告メッセージを表示して false を返す
|
|
18
|
+
* @returns {boolean} Docker が利用可能なら true
|
|
19
|
+
*/
|
|
20
|
+
function requireDocker() {
|
|
21
|
+
if (isDockerAvailable()) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
console.warn('Warning: Docker is not running. Skipping this task.');
|
|
25
|
+
console.warn('Please start Docker Desktop and try again.');
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* MkDocs タスクを gulp に登録する
|
|
31
|
+
* @param {import('gulp').Gulp} gulp - Gulp インスタンス
|
|
32
|
+
*/
|
|
33
|
+
export default function (gulp) {
|
|
34
|
+
gulp.task('mkdocs:serve', (done) => {
|
|
35
|
+
if (!requireDocker()) { done(); return; }
|
|
36
|
+
try {
|
|
37
|
+
console.log('Starting MkDocs server...');
|
|
38
|
+
dockerCompose('up -d mkdocs');
|
|
39
|
+
console.log('\nDocumentation is available at http://localhost:8000');
|
|
40
|
+
done();
|
|
41
|
+
} catch (error) {
|
|
42
|
+
done(error);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
gulp.task('mkdocs:build', (done) => {
|
|
47
|
+
if (!requireDocker()) { done(); return; }
|
|
48
|
+
try {
|
|
49
|
+
console.log('Building MkDocs documentation...');
|
|
50
|
+
const siteDir = path.join(process.cwd(), 'site');
|
|
51
|
+
if (fs.existsSync(siteDir)) {
|
|
52
|
+
fs.rmSync(siteDir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
dockerCompose('run --rm mkdocs mkdocs build');
|
|
55
|
+
console.log('\nBuild completed.');
|
|
56
|
+
done();
|
|
57
|
+
} catch (error) {
|
|
58
|
+
done(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
gulp.task('mkdocs:stop', (done) => {
|
|
63
|
+
if (!requireDocker()) { done(); return; }
|
|
64
|
+
try {
|
|
65
|
+
console.log('Stopping MkDocs server...');
|
|
66
|
+
dockerCompose('down');
|
|
67
|
+
console.log('Stopped.');
|
|
68
|
+
done();
|
|
69
|
+
} catch (error) {
|
|
70
|
+
done(error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
gulp.task('mkdocs:open', (done) => {
|
|
75
|
+
try {
|
|
76
|
+
openUrl('http://localhost:8000');
|
|
77
|
+
done();
|
|
78
|
+
} catch (error) {
|
|
79
|
+
done(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|