@335g/pi-git 0.0.1
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 -0
- package/README.ja.md +121 -0
- package/README.md +121 -0
- package/dist/commands/agg-commit.d.ts +9 -0
- package/dist/commands/agg-commit.d.ts.map +1 -0
- package/dist/commands/agg-commit.js +144 -0
- package/dist/commands/agg-commit.js.map +1 -0
- package/dist/commands/auto-agg-commit.d.ts +9 -0
- package/dist/commands/auto-agg-commit.d.ts.map +1 -0
- package/dist/commands/auto-agg-commit.js +113 -0
- package/dist/commands/auto-agg-commit.js.map +1 -0
- package/dist/commands/branch.d.ts +8 -0
- package/dist/commands/branch.d.ts.map +1 -0
- package/dist/commands/branch.js +197 -0
- package/dist/commands/branch.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +234 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/git-diff.d.ts +10 -0
- package/dist/commands/git-diff.d.ts.map +1 -0
- package/dist/commands/git-diff.js +228 -0
- package/dist/commands/git-diff.js.map +1 -0
- package/dist/commands/git-log.d.ts +8 -0
- package/dist/commands/git-log.d.ts.map +1 -0
- package/dist/commands/git-log.js +100 -0
- package/dist/commands/git-log.js.map +1 -0
- package/dist/core/auto-commit-message.d.ts +15 -0
- package/dist/core/auto-commit-message.d.ts.map +1 -0
- package/dist/core/auto-commit-message.js +121 -0
- package/dist/core/auto-commit-message.js.map +1 -0
- package/dist/core/auto-commit.d.ts +12 -0
- package/dist/core/auto-commit.d.ts.map +1 -0
- package/dist/core/auto-commit.js +67 -0
- package/dist/core/auto-commit.js.map +1 -0
- package/dist/core/commit-message.d.ts +25 -0
- package/dist/core/commit-message.d.ts.map +1 -0
- package/dist/core/commit-message.js +127 -0
- package/dist/core/commit-message.js.map +1 -0
- package/dist/core/diff-analyzer.d.ts +23 -0
- package/dist/core/diff-analyzer.d.ts.map +1 -0
- package/dist/core/diff-analyzer.js +245 -0
- package/dist/core/diff-analyzer.js.map +1 -0
- package/dist/core/git.d.ts +50 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +152 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/resolve-model.d.ts +18 -0
- package/dist/core/resolve-model.d.ts.map +1 -0
- package/dist/core/resolve-model.js +33 -0
- package/dist/core/resolve-model.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/tui/hunk-review.d.ts +49 -0
- package/dist/tui/hunk-review.d.ts.map +1 -0
- package/dist/tui/hunk-review.js +300 -0
- package/dist/tui/hunk-review.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/footer-manager.d.ts +68 -0
- package/dist/utils/footer-manager.d.ts.map +1 -0
- package/dist/utils/footer-manager.js +138 -0
- package/dist/utils/footer-manager.js.map +1 -0
- package/dist/utils/lang.d.ts +12 -0
- package/dist/utils/lang.d.ts.map +1 -0
- package/dist/utils/lang.js +16 -0
- package/dist/utils/lang.js.map +1 -0
- package/dist/utils/settings.d.ts +47 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +151 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /git-diff command
|
|
3
|
+
*
|
|
4
|
+
* Interactive diff review with sequential hunk approval.
|
|
5
|
+
* Allows reviewing AI-generated hunks, viewing diffs, editing messages,
|
|
6
|
+
* and committing approved hunks one at a time.
|
|
7
|
+
*/
|
|
8
|
+
import { analyzeDiff, parseDiffStats, processHunks, splitDiffByFile, } from "../core/diff-analyzer.js";
|
|
9
|
+
import { collectDiff, ensureReadyToCommit, resetStaging, stageFiles, } from "../core/git.js";
|
|
10
|
+
import { isJapanese } from "../utils/lang.js";
|
|
11
|
+
import { getLanguage } from "../utils/settings.js";
|
|
12
|
+
import { footerManager } from "../utils/footer-manager.js";
|
|
13
|
+
import { HunkReviewComponent, } from "../tui/hunk-review.js";
|
|
14
|
+
/**
|
|
15
|
+
* Review a single hunk using the TUI component
|
|
16
|
+
*/
|
|
17
|
+
async function reviewHunk(ctx, hunk, hunkIndex, totalHunks, fileStats, fileDiffs) {
|
|
18
|
+
if (!ctx.hasUI) {
|
|
19
|
+
return { type: "quit" };
|
|
20
|
+
}
|
|
21
|
+
return await ctx.ui.custom((tui, theme, _keybindings, done) => {
|
|
22
|
+
const component = new HunkReviewComponent(hunk, hunkIndex, totalHunks, fileStats, fileDiffs, tui, theme, done);
|
|
23
|
+
return component;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export async function handleGitDiff(pi, ctx, args) {
|
|
27
|
+
const lang = getLanguage(ctx.cwd);
|
|
28
|
+
const ja = isJapanese(lang);
|
|
29
|
+
if (/--help/.test(args)) {
|
|
30
|
+
const lines = ja
|
|
31
|
+
? [
|
|
32
|
+
"/git-diff [--help]",
|
|
33
|
+
"",
|
|
34
|
+
"AIが生成したhunkを対話的にレビューし、承認したものをコミットします。",
|
|
35
|
+
"",
|
|
36
|
+
"オプション:",
|
|
37
|
+
" --help このヘルプを表示",
|
|
38
|
+
"",
|
|
39
|
+
"操作:",
|
|
40
|
+
" ↑↓ ファイル間を移動",
|
|
41
|
+
" Enter 選択したファイルのdiffを表示",
|
|
42
|
+
" a hunkを承認してコミット",
|
|
43
|
+
" e コミットメッセージを編集",
|
|
44
|
+
" s hunkをスキップ",
|
|
45
|
+
" x 選択したファイルをhunkから除外",
|
|
46
|
+
" q 終了",
|
|
47
|
+
]
|
|
48
|
+
: [
|
|
49
|
+
"/git-diff [--help]",
|
|
50
|
+
"",
|
|
51
|
+
"Interactively review AI-generated hunks and commit approved ones.",
|
|
52
|
+
"",
|
|
53
|
+
"Options:",
|
|
54
|
+
" --help Show this help message",
|
|
55
|
+
"",
|
|
56
|
+
"Controls:",
|
|
57
|
+
" ↑↓ Navigate between files",
|
|
58
|
+
" Enter View diff for selected file",
|
|
59
|
+
" a Approve and commit hunk",
|
|
60
|
+
" e Edit commit message",
|
|
61
|
+
" s Skip hunk",
|
|
62
|
+
" x Exclude selected file from hunk",
|
|
63
|
+
" q Quit",
|
|
64
|
+
];
|
|
65
|
+
if (ctx.hasUI) {
|
|
66
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (!ctx.hasUI) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Check if agg-commit is running
|
|
74
|
+
if (footerManager.isRunning()) {
|
|
75
|
+
ctx.ui.notify(ja
|
|
76
|
+
? "git-agg-commit 実行中です。完了してから再度実行してください。"
|
|
77
|
+
: "git-agg-commit is already running. Please wait for it to complete.", "warning");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
await footerManager.setRunning("diff", "prepare");
|
|
81
|
+
try {
|
|
82
|
+
const preCheck = await ensureReadyToCommit(pi, ctx.cwd);
|
|
83
|
+
if (preCheck) {
|
|
84
|
+
await footerManager.clearRunning();
|
|
85
|
+
ctx.ui.notify(preCheck === "not_git_repo"
|
|
86
|
+
? ja ? "Gitリポジトリではありません" : "Not a git repository"
|
|
87
|
+
: ja ? "コミットする変更がありません" : "No changes to commit", preCheck === "not_git_repo" ? "warning" : "info");
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Collect diff via stash to freeze the working tree
|
|
91
|
+
await footerManager.setPhase("collectDiff");
|
|
92
|
+
const diff = await collectDiff(pi, ctx.cwd);
|
|
93
|
+
if (diff === null) {
|
|
94
|
+
await footerManager.clearRunning();
|
|
95
|
+
ctx.ui.notify(ja ? "変更のstashに失敗しました" : "Failed to stash changes", "warning");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (!diff.trim()) {
|
|
99
|
+
await footerManager.clearRunning();
|
|
100
|
+
ctx.ui.notify(ja ? "コミットする変更がありません" : "No changes to commit", "info");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Parse diff by file
|
|
104
|
+
const fileDiffs = splitDiffByFile(diff);
|
|
105
|
+
const fileStats = parseDiffStats(diff);
|
|
106
|
+
// Analyze diff into hunks
|
|
107
|
+
await footerManager.setPhase("analyze");
|
|
108
|
+
let hunks = await analyzeDiff(pi, ctx, diff);
|
|
109
|
+
if (hunks.length === 0) {
|
|
110
|
+
await footerManager.clearRunning();
|
|
111
|
+
ctx.ui.notify(ja ? "コミット可能なhunkがありません" : "No hunks found to commit", "info");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Sanitize, deduplicate, and filter hunks
|
|
115
|
+
hunks = processHunks(hunks);
|
|
116
|
+
await footerManager.clearRunning();
|
|
117
|
+
// Review each hunk sequentially
|
|
118
|
+
const unassignedFiles = [];
|
|
119
|
+
let committedCount = 0;
|
|
120
|
+
let skippedCount = 0;
|
|
121
|
+
let quitRequested = false;
|
|
122
|
+
for (let i = 0; i < hunks.length; i++) {
|
|
123
|
+
const hunk = hunks[i];
|
|
124
|
+
let currentMessage = hunk.message;
|
|
125
|
+
// Review loop (for message editing)
|
|
126
|
+
while (true) {
|
|
127
|
+
const action = await reviewHunk(ctx, { ...hunk, message: currentMessage }, i, hunks.length, fileStats, fileDiffs);
|
|
128
|
+
if (action.type === "quit") {
|
|
129
|
+
// Add current and remaining hunks' files to unassigned
|
|
130
|
+
for (let j = i; j < hunks.length; j++) {
|
|
131
|
+
unassignedFiles.push(...hunks[j].files);
|
|
132
|
+
}
|
|
133
|
+
quitRequested = true;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (action.type === "edit_message") {
|
|
137
|
+
// Edit message using pi's built-in input dialog (IME-supported)
|
|
138
|
+
const newMessage = await ctx.ui.input(ja ? "コミットメッセージを編集:" : "Edit commit message:", action.currentMessage);
|
|
139
|
+
if (newMessage && newMessage.trim()) {
|
|
140
|
+
currentMessage = newMessage.trim();
|
|
141
|
+
}
|
|
142
|
+
// Continue loop to re-show the hunk with updated message
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (action.type === "skip") {
|
|
146
|
+
// Add non-excluded files to unassigned
|
|
147
|
+
const files = hunk.files.filter((f) => !action.excludedFiles.includes(f));
|
|
148
|
+
unassignedFiles.push(...files, ...action.excludedFiles);
|
|
149
|
+
skippedCount++;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
if (action.type === "approve") {
|
|
153
|
+
// Stage and commit non-excluded files
|
|
154
|
+
const files = hunk.files.filter((f) => !action.excludedFiles.includes(f));
|
|
155
|
+
if (files.length === 0) {
|
|
156
|
+
ctx.ui.notify(ja
|
|
157
|
+
? "コミットするファイルがありません"
|
|
158
|
+
: "No files to commit", "warning");
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
await stageFiles(pi, files, ctx.cwd);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
ctx.ui.notify(ja
|
|
166
|
+
? `ファイルのステージに失敗しました: ${error instanceof Error ? error.message : String(error)}`
|
|
167
|
+
: `Failed to stage files: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
const { code: exitCode, stderr } = await pi.exec("git", ["commit", "-m", action.message], { cwd: ctx.cwd });
|
|
171
|
+
if (exitCode !== 0) {
|
|
172
|
+
try {
|
|
173
|
+
await resetStaging(pi, ctx.cwd);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Ignore reset errors
|
|
177
|
+
}
|
|
178
|
+
const detail = stderr.trim() ? ` — ${stderr.trim()}` : "";
|
|
179
|
+
ctx.ui.notify(ja
|
|
180
|
+
? `コミットに失敗しました: "${action.message}" (exit code ${exitCode})${detail}。ステージをリセットしました。`
|
|
181
|
+
: `Commit failed for "${action.message}" (exit code ${exitCode}).${detail} Staging has been reset.`, "warning");
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
committedCount++;
|
|
185
|
+
// Add excluded files to unassigned
|
|
186
|
+
unassignedFiles.push(...action.excludedFiles);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (quitRequested)
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
// Show summary
|
|
194
|
+
const parts = [];
|
|
195
|
+
if (committedCount > 0) {
|
|
196
|
+
parts.push(ja
|
|
197
|
+
? `${committedCount}個のhunkをコミットしました`
|
|
198
|
+
: `Committed ${committedCount} hunk${committedCount > 1 ? "s" : ""}`);
|
|
199
|
+
}
|
|
200
|
+
if (skippedCount > 0) {
|
|
201
|
+
parts.push(ja
|
|
202
|
+
? `${skippedCount}個のhunkをスキップしました`
|
|
203
|
+
: `Skipped ${skippedCount} hunk${skippedCount > 1 ? "s" : ""}`);
|
|
204
|
+
}
|
|
205
|
+
if (parts.length > 0) {
|
|
206
|
+
ctx.ui.notify(parts.join(", "), "info");
|
|
207
|
+
}
|
|
208
|
+
// Show unassigned files
|
|
209
|
+
if (unassignedFiles.length > 0) {
|
|
210
|
+
const lines = ja
|
|
211
|
+
? [
|
|
212
|
+
"",
|
|
213
|
+
`⚠ ${unassignedFiles.length}個のファイルが未割り当てです:`,
|
|
214
|
+
...unassignedFiles.map((f) => ` ${f}`),
|
|
215
|
+
]
|
|
216
|
+
: [
|
|
217
|
+
"",
|
|
218
|
+
`⚠ ${unassignedFiles.length} file${unassignedFiles.length > 1 ? "s" : ""} remain unassigned:`,
|
|
219
|
+
...unassignedFiles.map((f) => ` ${f}`),
|
|
220
|
+
];
|
|
221
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
await footerManager.clearRunning();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=git-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../src/commands/git-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /git-log command
|
|
3
|
+
*
|
|
4
|
+
* Display git log in oneline format.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
export declare function handleGitLog(pi: ExtensionAPI, ctx: ExtensionCommandContext, args: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=git-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-log.d.ts","sourceRoot":"","sources":["../../src/commands/git-log.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AAOzC,wBAAsB,YAAY,CAChC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,uBAAuB,EAC5B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CA0Gf"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /git-log command
|
|
3
|
+
*
|
|
4
|
+
* Display git log in oneline format.
|
|
5
|
+
*/
|
|
6
|
+
import { getLog, isGitRepository } from "../core/git.js";
|
|
7
|
+
import { isJapanese } from "../utils/lang.js";
|
|
8
|
+
import { getSettings } from "../utils/settings.js";
|
|
9
|
+
const DEFAULT_MAX_COUNT = 20;
|
|
10
|
+
export async function handleGitLog(pi, ctx, args) {
|
|
11
|
+
if (!ctx.hasUI) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const lang = getSettings(ctx.cwd).lang ?? "en";
|
|
15
|
+
const ja = isJapanese(lang);
|
|
16
|
+
const tokens = args.trim().split(/\s+/).filter(Boolean);
|
|
17
|
+
// Parse flags
|
|
18
|
+
let all = false;
|
|
19
|
+
let graph = false;
|
|
20
|
+
let help = false;
|
|
21
|
+
let maxCount = DEFAULT_MAX_COUNT;
|
|
22
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
23
|
+
const token = tokens[i];
|
|
24
|
+
if (token === "--all") {
|
|
25
|
+
all = true;
|
|
26
|
+
}
|
|
27
|
+
else if (token === "--graph") {
|
|
28
|
+
graph = true;
|
|
29
|
+
}
|
|
30
|
+
else if (token === "--help" || token === "-h") {
|
|
31
|
+
help = true;
|
|
32
|
+
}
|
|
33
|
+
else if (token === "-n") {
|
|
34
|
+
const next = tokens[i + 1];
|
|
35
|
+
if (!next) {
|
|
36
|
+
ctx.ui.notify(ja ? "-n には数値が必要です" : "-n requires a number", "warning");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (next === "all") {
|
|
40
|
+
maxCount = "all";
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const parsed = Number.parseInt(next, 10);
|
|
44
|
+
if (Number.isNaN(parsed) || parsed <= 0) {
|
|
45
|
+
ctx.ui.notify(ja
|
|
46
|
+
? `-n の値が不正です: ${next}`
|
|
47
|
+
: `Invalid -n value: ${next}`, "warning");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
maxCount = parsed;
|
|
51
|
+
}
|
|
52
|
+
i++; // skip next token
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (help) {
|
|
56
|
+
const lines = ja
|
|
57
|
+
? [
|
|
58
|
+
"/git-log [-n <count>] [--all] [--graph] [--help]",
|
|
59
|
+
"",
|
|
60
|
+
"git log を oneline 形式で表示します。",
|
|
61
|
+
"",
|
|
62
|
+
"フラグ:",
|
|
63
|
+
" -n <count> 表示するコミット数 (デフォルト: 20, 'all' で全件)",
|
|
64
|
+
" --all 全ブランチのログを表示",
|
|
65
|
+
" --graph ASCII グラフを表示",
|
|
66
|
+
" --help, -h このヘルプを表示",
|
|
67
|
+
]
|
|
68
|
+
: [
|
|
69
|
+
"/git-log [-n <count>] [--all] [--graph] [--help]",
|
|
70
|
+
"",
|
|
71
|
+
"Display git log in oneline format.",
|
|
72
|
+
"",
|
|
73
|
+
"Flags:",
|
|
74
|
+
" -n <count> Number of commits to show (default: 20, 'all' for all)",
|
|
75
|
+
" --all Show logs from all branches",
|
|
76
|
+
" --graph Show ASCII graph",
|
|
77
|
+
" --help, -h Show this help message",
|
|
78
|
+
];
|
|
79
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!(await isGitRepository(pi, ctx.cwd))) {
|
|
83
|
+
ctx.ui.notify(ja ? "Gitリポジトリではありません" : "Not a git repository", "warning");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const log = await getLog(pi, { maxCount, all, graph }, ctx.cwd);
|
|
88
|
+
if (!log.trim()) {
|
|
89
|
+
ctx.ui.notify(ja ? "コミット履歴がありません" : "No commit history", "info");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
ctx.ui.notify(log.trimEnd(), "info");
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
ctx.ui.notify(ja
|
|
96
|
+
? `git log の取得に失敗しました: ${error instanceof Error ? error.message : String(error)}`
|
|
97
|
+
: `Failed to get git log: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=git-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-log.js","sourceRoot":"","sources":["../../src/commands/git-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-commit message generation from conversation history.
|
|
3
|
+
*
|
|
4
|
+
* When auto-agg-commit triggers after agent_end, skips hunk analysis
|
|
5
|
+
* and instead generates a commit message from the user's prompt
|
|
6
|
+
* and assistant's response for speed.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
interface SimpleMessage {
|
|
10
|
+
role: string;
|
|
11
|
+
content: string | unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function generateAutoCommitMessage(_pi: ExtensionAPI, ctx: ExtensionContext, messages: SimpleMessage[], changedFiles: string[]): Promise<string>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=auto-commit-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-commit-message.d.ts","sourceRoot":"","sources":["../../src/core/auto-commit-message.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AAMzC,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC3B;AAmFD,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,aAAa,EAAE,EACzB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,CAqDjB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-commit message generation from conversation history.
|
|
3
|
+
*
|
|
4
|
+
* When auto-agg-commit triggers after agent_end, skips hunk analysis
|
|
5
|
+
* and instead generates a commit message from the user's prompt
|
|
6
|
+
* and assistant's response for speed.
|
|
7
|
+
*/
|
|
8
|
+
import { completeSimple } from "@earendil-works/pi-ai";
|
|
9
|
+
import { isJapanese } from "../utils/lang.js";
|
|
10
|
+
import { getLanguage } from "../utils/settings.js";
|
|
11
|
+
import { sanitizeCommitMessage } from "./commit-message.js";
|
|
12
|
+
import { resolveModel } from "./resolve-model.js";
|
|
13
|
+
function getSystemPrompt(lang) {
|
|
14
|
+
if (isJapanese(lang)) {
|
|
15
|
+
return `あなたはコミットメッセージ生成ツールです。ユーザーのリクエストとアシスタントの応答内容から、変更の意図を推測して Conventional Commit メッセージを1つ生成してください。
|
|
16
|
+
|
|
17
|
+
ルール:
|
|
18
|
+
- type は feat, fix, docs, style, refactor, test, chore から選択
|
|
19
|
+
- サブジェクトは50文字以内
|
|
20
|
+
- 命令形を使用する
|
|
21
|
+
- スコープは推測できる場合のみ含める
|
|
22
|
+
- 日本語で記述
|
|
23
|
+
|
|
24
|
+
返答はメッセージ文字列のみ。説明やコードフェンスは不要。`;
|
|
25
|
+
}
|
|
26
|
+
return `You are a commit message generator. Based on the user's request and the assistant's response, infer the intent of the changes and generate a single Conventional Commit message.
|
|
27
|
+
|
|
28
|
+
Rules:
|
|
29
|
+
- Choose type from: feat, fix, docs, style, refactor, test, chore
|
|
30
|
+
- Keep subject under 50 characters
|
|
31
|
+
- Use imperative mood
|
|
32
|
+
- Include scope only if clearly inferable
|
|
33
|
+
|
|
34
|
+
Return ONLY the commit message string. No explanations or code fences.`;
|
|
35
|
+
}
|
|
36
|
+
function extractTextContent(content) {
|
|
37
|
+
if (typeof content === "string")
|
|
38
|
+
return content;
|
|
39
|
+
if (Array.isArray(content)) {
|
|
40
|
+
return content
|
|
41
|
+
.filter((c) => typeof c === "object" && c !== null)
|
|
42
|
+
.map((c) => c.text || "")
|
|
43
|
+
.join("");
|
|
44
|
+
}
|
|
45
|
+
return "";
|
|
46
|
+
}
|
|
47
|
+
function findLastMessageByRole(messages, role) {
|
|
48
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
49
|
+
if (messages[i].role === role) {
|
|
50
|
+
return extractTextContent(messages[i].content);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return "";
|
|
54
|
+
}
|
|
55
|
+
function buildPrompt(lastUserMessage, lastAssistantMessage, changedFiles, lang) {
|
|
56
|
+
const filesStr = changedFiles.join(", ");
|
|
57
|
+
if (isJapanese(lang)) {
|
|
58
|
+
return `ユーザーのリクエスト:
|
|
59
|
+
${lastUserMessage}
|
|
60
|
+
|
|
61
|
+
アシスタントの応答:
|
|
62
|
+
${lastAssistantMessage}
|
|
63
|
+
|
|
64
|
+
変更されたファイル: ${filesStr}
|
|
65
|
+
|
|
66
|
+
上記から変更の意図を推測し、Conventional Commit メッセージを1つ生成してください。`;
|
|
67
|
+
}
|
|
68
|
+
return `User request:
|
|
69
|
+
${lastUserMessage}
|
|
70
|
+
|
|
71
|
+
Assistant response:
|
|
72
|
+
${lastAssistantMessage}
|
|
73
|
+
|
|
74
|
+
Changed files: ${filesStr}
|
|
75
|
+
|
|
76
|
+
Based on the above, infer the intent of the changes and generate a single Conventional Commit message.`;
|
|
77
|
+
}
|
|
78
|
+
export async function generateAutoCommitMessage(_pi, ctx, messages, changedFiles) {
|
|
79
|
+
const model = resolveModel(ctx);
|
|
80
|
+
if (!model) {
|
|
81
|
+
return sanitizeCommitMessage("chore: apply changes", changedFiles);
|
|
82
|
+
}
|
|
83
|
+
const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
|
|
84
|
+
if (!auth.ok) {
|
|
85
|
+
return sanitizeCommitMessage("chore: apply changes", changedFiles);
|
|
86
|
+
}
|
|
87
|
+
const lang = getLanguage(ctx.cwd);
|
|
88
|
+
const lastUserMessage = findLastMessageByRole(messages, "user");
|
|
89
|
+
const lastAssistantMessage = findLastMessageByRole(messages, "assistant");
|
|
90
|
+
if (!lastUserMessage) {
|
|
91
|
+
return sanitizeCommitMessage("chore: apply changes", changedFiles);
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
const promptContext = {
|
|
95
|
+
systemPrompt: getSystemPrompt(lang),
|
|
96
|
+
messages: [
|
|
97
|
+
{
|
|
98
|
+
role: "user",
|
|
99
|
+
content: buildPrompt(lastUserMessage, lastAssistantMessage, changedFiles, lang),
|
|
100
|
+
timestamp: Date.now(),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
};
|
|
104
|
+
const result = await completeSimple(model, promptContext, {
|
|
105
|
+
apiKey: auth.apiKey,
|
|
106
|
+
headers: auth.headers,
|
|
107
|
+
signal: ctx.signal,
|
|
108
|
+
reasoning: "minimal",
|
|
109
|
+
});
|
|
110
|
+
const text = result.content
|
|
111
|
+
.filter((c) => c.type === "text")
|
|
112
|
+
.map((c) => c.text)
|
|
113
|
+
.join("")
|
|
114
|
+
.trim();
|
|
115
|
+
return sanitizeCommitMessage(text || "chore: apply changes", changedFiles);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return sanitizeCommitMessage("chore: apply changes", changedFiles);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=auto-commit-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-commit-message.js","sourceRoot":"","sources":["../../src/core/auto-commit-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-commit logic for agent_end event handler
|
|
3
|
+
*
|
|
4
|
+
* Automatically commits changes after assistant response when enabled.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
import type { AgentEndEvent } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Handle auto-commit after agent response
|
|
10
|
+
*/
|
|
11
|
+
export declare function handleAutoCommit(pi: ExtensionAPI, ctx: ExtensionContext, event: AgentEndEvent): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=auto-commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-commit.d.ts","sourceRoot":"","sources":["../../src/core/auto-commit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,IAAI,CAAC,CAoFf"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-commit logic for agent_end event handler
|
|
3
|
+
*
|
|
4
|
+
* Automatically commits changes after assistant response when enabled.
|
|
5
|
+
*/
|
|
6
|
+
import { isJapanese } from "../utils/lang.js";
|
|
7
|
+
import { getAutoAggCommit, getLanguage } from "../utils/settings.js";
|
|
8
|
+
import { footerManager } from "../utils/footer-manager.js";
|
|
9
|
+
import { generateAutoCommitMessage } from "./auto-commit-message.js";
|
|
10
|
+
import { hasChanges, isGitRepository, resetStaging, stageFiles, } from "./git.js";
|
|
11
|
+
/**
|
|
12
|
+
* Handle auto-commit after agent response
|
|
13
|
+
*/
|
|
14
|
+
export async function handleAutoCommit(pi, ctx, event) {
|
|
15
|
+
if (!ctx.hasUI) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (footerManager.isRunning()) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const autoCommitEnabled = getAutoAggCommit(ctx.cwd);
|
|
22
|
+
// Always update footer with clean/changed status (even when disabled)
|
|
23
|
+
await footerManager.refresh();
|
|
24
|
+
// If auto-commit is disabled, we're done
|
|
25
|
+
if (!autoCommitEnabled) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (!(await isGitRepository(pi))) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (!(await hasChanges(pi))) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const lang = getLanguage(ctx.cwd);
|
|
35
|
+
const ja = isJapanese(lang);
|
|
36
|
+
await footerManager.setRunning("auto-commit", "generateMessage");
|
|
37
|
+
try {
|
|
38
|
+
const { stdout: statusOutput } = await pi.exec("git", ["status", "--short"], { cwd: ctx.cwd });
|
|
39
|
+
const changedFiles = statusOutput
|
|
40
|
+
.split("\n")
|
|
41
|
+
.filter(Boolean)
|
|
42
|
+
.map((line) => line.slice(3).trim())
|
|
43
|
+
.filter(Boolean);
|
|
44
|
+
if (changedFiles.length === 0) {
|
|
45
|
+
await footerManager.clearRunning();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const messages = event.messages || [];
|
|
49
|
+
const commitMessage = await generateAutoCommitMessage(pi, ctx, messages, changedFiles);
|
|
50
|
+
await footerManager.setPhase("commit");
|
|
51
|
+
await stageFiles(pi, changedFiles, ctx.cwd);
|
|
52
|
+
const { code: exitCode, stderr } = await pi.exec("git", ["commit", "-m", commitMessage], { cwd: ctx.cwd });
|
|
53
|
+
if (exitCode !== 0) {
|
|
54
|
+
await resetStaging(pi, ctx.cwd);
|
|
55
|
+
ctx.ui.notify(ja ? `コミットに失敗しました: ${stderr}` : `Commit failed: ${stderr}`, "warning");
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
ctx.ui.notify(ja
|
|
59
|
+
? `コミットを作成しました: ${commitMessage}`
|
|
60
|
+
: `Created commit: ${commitMessage}`, "info");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await footerManager.clearRunning();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=auto-commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-commit.js","sourceRoot":"","sources":["../../src/core/auto-commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conventional Commits message validation and sanitization
|
|
3
|
+
*
|
|
4
|
+
* Since diff-analyzer.ts already generates Conventional Commits messages via AI,
|
|
5
|
+
* this module focuses on post-processing: validation, cleanup, and fallback.
|
|
6
|
+
*/
|
|
7
|
+
import type { Hunk } from "../types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Check if a message follows Conventional Commits format.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isConventionalCommit(message: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Sanitize and validate a commit message.
|
|
14
|
+
* Returns a clean, valid Conventional Commits message.
|
|
15
|
+
*/
|
|
16
|
+
export declare function sanitizeCommitMessage(message: string, files?: string[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a fallback message when AI generation fails entirely.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateFallbackMessage(files: string[]): string;
|
|
21
|
+
/**
|
|
22
|
+
* Sanitize a hunk's message in place.
|
|
23
|
+
*/
|
|
24
|
+
export declare function sanitizeHunk(hunk: Hunk): Hunk;
|
|
25
|
+
//# sourceMappingURL=commit-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-message.d.ts","sourceRoot":"","sources":["../../src/core/commit-message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAsBxC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAK7D;AAuCD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,MAAM,CAgDR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAO/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAK7C"}
|