@xwss/agentbell 0.1.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/CHANGELOG.md +18 -0
- package/LICENSE +21 -0
- package/README.md +969 -0
- package/RELEASE.md +31 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +106 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.js +159 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +92 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/initHooks.d.ts +9 -0
- package/dist/commands/initHooks.js +455 -0
- package/dist/commands/initHooks.js.map +1 -0
- package/dist/commands/project.d.ts +14 -0
- package/dist/commands/project.js +62 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/send.d.ts +5 -0
- package/dist/commands/send.js +70 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/setup.d.ts +13 -0
- package/dist/commands/setup.js +270 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/test.d.ts +9 -0
- package/dist/commands/test.js +40 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/verify.d.ts +78 -0
- package/dist/commands/verify.js +725 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config.d.ts +123 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks/claudeCode.d.ts +5 -0
- package/dist/hooks/claudeCode.js +88 -0
- package/dist/hooks/claudeCode.js.map +1 -0
- package/dist/hooks/codex.d.ts +4 -0
- package/dist/hooks/codex.js +74 -0
- package/dist/hooks/codex.js.map +1 -0
- package/dist/hooks/vscodeAgent.d.ts +3 -0
- package/dist/hooks/vscodeAgent.js +45 -0
- package/dist/hooks/vscodeAgent.js.map +1 -0
- package/dist/notify/index.d.ts +3 -0
- package/dist/notify/index.js +8 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/local.d.ts +2 -0
- package/dist/notify/local.js +34 -0
- package/dist/notify/local.js.map +1 -0
- package/dist/notify/ntfy.d.ts +10 -0
- package/dist/notify/ntfy.js +57 -0
- package/dist/notify/ntfy.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/context.d.ts +92 -0
- package/dist/utils/context.js +198 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +12 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mask.d.ts +1 -0
- package/dist/utils/mask.js +10 -0
- package/dist/utils/mask.js.map +1 -0
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.js +93 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/shell.d.ts +1 -0
- package/dist/utils/shell.js +21 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/topic.d.ts +2 -0
- package/dist/utils/topic.js +20 -0
- package/dist/utils/topic.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { copyFile, mkdir, readFile, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { claudeCodeHookTemplate, claudeCodeWindowsHookTemplate, claudeWrapperContent } from '../hooks/claudeCode.js';
|
|
4
|
+
import { codexHookSnippet, codexHookTemplate, codexStopWrapperContent, codexWindowsHookTemplate } from '../hooks/codex.js';
|
|
5
|
+
import { copilotStopWrapperContent, vscodeAgentHookTemplate, vscodeAgentWindowsHookTemplate } from '../hooks/vscodeAgent.js';
|
|
6
|
+
import { claudeSettingsPath, claudeNotificationWrapperPath, claudeStopWrapperPath, codexHooksPath, codexStopWrapperPath, copilotStopWrapperPath, currentCliScriptPath, currentCliInvocation, projectRoot, snippetsDir, vscodeAgentHookPath } from '../utils/paths.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { maskSecret } from '../utils/mask.js';
|
|
9
|
+
function timestamp() {
|
|
10
|
+
return new Date().toISOString().replaceAll(':', '-').replaceAll('.', '-');
|
|
11
|
+
}
|
|
12
|
+
function isRecord(value) {
|
|
13
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
function stableStringify(value) {
|
|
16
|
+
return JSON.stringify(value);
|
|
17
|
+
}
|
|
18
|
+
function containsAgentBellTarget(value, target) {
|
|
19
|
+
const text = JSON.stringify(value);
|
|
20
|
+
if (!text) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (target === 'claude-code') {
|
|
24
|
+
return text.includes('claude-code') || text.includes('claude-stop') || text.includes('claude-notification');
|
|
25
|
+
}
|
|
26
|
+
if (target === 'codex') {
|
|
27
|
+
return text.includes('codex') || text.includes('codex-stop');
|
|
28
|
+
}
|
|
29
|
+
if (target === 'vscode-agent') {
|
|
30
|
+
return text.includes('vscode-agent') || text.includes('copilot-stop');
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
function removeExistingAgentBellHooks(existing, target) {
|
|
35
|
+
if (!isRecord(existing) || !isRecord(existing.hooks)) {
|
|
36
|
+
return existing;
|
|
37
|
+
}
|
|
38
|
+
const cleanedHooks = { ...existing.hooks };
|
|
39
|
+
for (const eventName of Object.keys(cleanedHooks)) {
|
|
40
|
+
const value = cleanedHooks[eventName];
|
|
41
|
+
if (Array.isArray(value)) {
|
|
42
|
+
const filtered = value.filter((item) => !containsAgentBellTarget(item, target));
|
|
43
|
+
const obsoleteEmptyVscodeStop = target === 'vscode-agent' && eventName === 'stop' && filtered.length === 0;
|
|
44
|
+
if ((value.length > 0 && filtered.length === 0) || obsoleteEmptyVscodeStop) {
|
|
45
|
+
delete cleanedHooks[eventName];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
cleanedHooks[eventName] = filtered;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
...existing,
|
|
54
|
+
hooks: cleanedHooks
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function mergeJson(base, addition) {
|
|
58
|
+
if (Array.isArray(base) && Array.isArray(addition)) {
|
|
59
|
+
const seen = new Set(base.map(stableStringify));
|
|
60
|
+
const merged = [...base];
|
|
61
|
+
for (const item of addition) {
|
|
62
|
+
const key = stableStringify(item);
|
|
63
|
+
if (!seen.has(key)) {
|
|
64
|
+
merged.push(item);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return merged;
|
|
68
|
+
}
|
|
69
|
+
if (isRecord(base) && isRecord(addition)) {
|
|
70
|
+
const output = { ...base };
|
|
71
|
+
for (const [key, value] of Object.entries(addition)) {
|
|
72
|
+
output[key] = key in output ? mergeJson(output[key], value) : value;
|
|
73
|
+
}
|
|
74
|
+
return output;
|
|
75
|
+
}
|
|
76
|
+
return base ?? addition;
|
|
77
|
+
}
|
|
78
|
+
async function writeJson(filePath, value) {
|
|
79
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
80
|
+
await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
81
|
+
}
|
|
82
|
+
async function writeTextWithBackup(filePath, content) {
|
|
83
|
+
let backedUpTo;
|
|
84
|
+
try {
|
|
85
|
+
await readFile(filePath, 'utf8');
|
|
86
|
+
backedUpTo = `${filePath}.bak-${timestamp()}`;
|
|
87
|
+
await mkdir(path.dirname(backedUpTo), { recursive: true });
|
|
88
|
+
await copyFile(filePath, backedUpTo);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const nodeError = error;
|
|
92
|
+
if (nodeError.code !== 'ENOENT') {
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
97
|
+
await writeFile(filePath, content, 'utf8');
|
|
98
|
+
return backedUpTo;
|
|
99
|
+
}
|
|
100
|
+
function hookTemplateBundle(target) {
|
|
101
|
+
const commandBase = currentCliInvocation();
|
|
102
|
+
if (target === 'claude-code') {
|
|
103
|
+
const stopWrapperPath = claudeStopWrapperPath();
|
|
104
|
+
const notificationWrapperPath = claudeNotificationWrapperPath();
|
|
105
|
+
const claudeLogPath = path.join(projectRoot(), '.agentbell-hooks', 'claude-hook-fired.log');
|
|
106
|
+
const template = process.platform === 'win32'
|
|
107
|
+
? claudeCodeWindowsHookTemplate(stopWrapperPath, notificationWrapperPath)
|
|
108
|
+
: claudeCodeHookTemplate(commandBase);
|
|
109
|
+
return {
|
|
110
|
+
target,
|
|
111
|
+
configPath: claudeSettingsPath(),
|
|
112
|
+
template,
|
|
113
|
+
extraFiles: process.platform === 'win32'
|
|
114
|
+
? [
|
|
115
|
+
{
|
|
116
|
+
path: stopWrapperPath,
|
|
117
|
+
label: 'Claude Code Stop .sh wrapper',
|
|
118
|
+
content: claudeWrapperContent(process.execPath, currentCliScriptPath(), 'stop', claudeLogPath, projectRoot())
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
path: notificationWrapperPath,
|
|
122
|
+
label: 'Claude Code Notification .sh wrapper',
|
|
123
|
+
content: claudeWrapperContent(process.execPath, currentCliScriptPath(), 'notification', claudeLogPath, projectRoot())
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
: undefined,
|
|
127
|
+
manualVerification: [
|
|
128
|
+
'Verify Claude Code Stop hook with a small task.',
|
|
129
|
+
'Verify Claude Code Notification hook by triggering a user-input notification.',
|
|
130
|
+
'On Windows, Claude Code hooks run through Git Bash; check .agentbell-hooks/claude-hook-fired.log if a hook does not appear to fire.'
|
|
131
|
+
]
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (target === 'codex') {
|
|
135
|
+
const wrapperPath = codexStopWrapperPath();
|
|
136
|
+
const template = process.platform === 'win32' ? codexWindowsHookTemplate(wrapperPath) : codexHookTemplate(commandBase);
|
|
137
|
+
const wrapperContent = codexStopWrapperContent(process.execPath, currentCliScriptPath());
|
|
138
|
+
return {
|
|
139
|
+
target,
|
|
140
|
+
configPath: codexHooksPath(),
|
|
141
|
+
template,
|
|
142
|
+
snippetPath: path.join(snippetsDir(), 'codex-hooks.json'),
|
|
143
|
+
snippet: codexHookSnippet(commandBase, template),
|
|
144
|
+
extraFiles: [
|
|
145
|
+
{
|
|
146
|
+
path: wrapperPath,
|
|
147
|
+
label: process.platform === 'win32' ? 'Codex Stop .cmd wrapper' : 'Codex Stop shell wrapper',
|
|
148
|
+
content: wrapperContent
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
manualVerification: [
|
|
152
|
+
'Verified on Windows VS Code Codex extension with Stop hook -> .cmd wrapper -> AgentBell -> ntfy.',
|
|
153
|
+
'If Codex asks to trust hooks again after changes, approve the updated hook.',
|
|
154
|
+
'Run a small Codex task and confirm the stop notification arrives.'
|
|
155
|
+
]
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const wrapperPath = copilotStopWrapperPath();
|
|
159
|
+
const workspaceRoot = projectRoot();
|
|
160
|
+
const template = process.platform === 'win32'
|
|
161
|
+
? vscodeAgentWindowsHookTemplate(wrapperPath)
|
|
162
|
+
: vscodeAgentHookTemplate(commandBase);
|
|
163
|
+
return {
|
|
164
|
+
target,
|
|
165
|
+
configPath: vscodeAgentHookPath(),
|
|
166
|
+
template,
|
|
167
|
+
extraFiles: process.platform === 'win32'
|
|
168
|
+
? [
|
|
169
|
+
{
|
|
170
|
+
path: wrapperPath,
|
|
171
|
+
label: 'VS Code Copilot Stop .cmd wrapper',
|
|
172
|
+
content: copilotStopWrapperContent(process.execPath, currentCliScriptPath(), workspaceRoot)
|
|
173
|
+
}
|
|
174
|
+
]
|
|
175
|
+
: undefined,
|
|
176
|
+
manualVerification: [
|
|
177
|
+
'VS Code Agent hooks are Preview; verify your VS Code / Copilot version reads .github/hooks/agentbell.json.',
|
|
178
|
+
'Verified on Windows VS Code Copilot Agent Stop hook with project-local .cmd wrapper.',
|
|
179
|
+
'Run a small Copilot Agent task and check .agentbell-hooks/copilot-hook-fired.log if the notification does not arrive.'
|
|
180
|
+
]
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async function installJsonTemplate(target, filePath, template, snippetPath, snippet) {
|
|
184
|
+
const notes = [];
|
|
185
|
+
let backedUpTo;
|
|
186
|
+
let mode = 'written';
|
|
187
|
+
try {
|
|
188
|
+
const existingText = await readFile(filePath, 'utf8');
|
|
189
|
+
backedUpTo = `${filePath}.bak-${timestamp()}`;
|
|
190
|
+
await mkdir(path.dirname(backedUpTo), { recursive: true });
|
|
191
|
+
await copyFile(filePath, backedUpTo);
|
|
192
|
+
const existing = removeExistingAgentBellHooks(JSON.parse(existingText), target);
|
|
193
|
+
const merged = mergeJson(existing, template);
|
|
194
|
+
await writeJson(filePath, merged);
|
|
195
|
+
mode = 'merged';
|
|
196
|
+
notes.push(`Existing config was backed up before merge: ${backedUpTo}`);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
const nodeError = error;
|
|
200
|
+
if (nodeError.code === 'ENOENT') {
|
|
201
|
+
await writeJson(filePath, template);
|
|
202
|
+
notes.push('Config file did not exist, so AgentBell created it.');
|
|
203
|
+
}
|
|
204
|
+
else if (error instanceof SyntaxError) {
|
|
205
|
+
mode = 'snippet-only';
|
|
206
|
+
notes.push(`Could not parse existing JSON safely: ${error.message}`);
|
|
207
|
+
notes.push('Generated a snippet file for manual merge instead.');
|
|
208
|
+
await writeJson(snippetPath ?? `${filePath}.agentbell-snippet.json`, snippet ?? template);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (snippetPath && snippet) {
|
|
215
|
+
await writeJson(snippetPath, snippet);
|
|
216
|
+
notes.push(`Snippet written: ${snippetPath}`);
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
target,
|
|
220
|
+
configPath: filePath,
|
|
221
|
+
snippetPath,
|
|
222
|
+
backedUpTo,
|
|
223
|
+
mode,
|
|
224
|
+
notes,
|
|
225
|
+
manualVerification: []
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
async function isGitRepository(cwd) {
|
|
229
|
+
try {
|
|
230
|
+
await stat(path.join(cwd, '.git'));
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export async function installHookTarget(target) {
|
|
238
|
+
const bundle = hookTemplateBundle(target);
|
|
239
|
+
const result = await installJsonTemplate(bundle.target, bundle.configPath, bundle.template, bundle.snippetPath, bundle.snippet);
|
|
240
|
+
result.manualVerification = bundle.manualVerification;
|
|
241
|
+
result.extraFiles = [];
|
|
242
|
+
for (const file of bundle.extraFiles ?? []) {
|
|
243
|
+
const backedUpTo = await writeTextWithBackup(file.path, file.content);
|
|
244
|
+
result.extraFiles.push({
|
|
245
|
+
path: file.path,
|
|
246
|
+
label: file.label,
|
|
247
|
+
backedUpTo
|
|
248
|
+
});
|
|
249
|
+
result.notes.push(`${file.label} written: ${file.path}`);
|
|
250
|
+
if (backedUpTo) {
|
|
251
|
+
result.notes.push(`${file.label} backup: ${backedUpTo}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (target === 'vscode-agent' && !(await isGitRepository(process.cwd()))) {
|
|
255
|
+
result.notes.push('This is a workspace hook file. It was generated even if the current directory is not a git repository.');
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
export async function previewHookTarget(target) {
|
|
260
|
+
const bundle = hookTemplateBundle(target);
|
|
261
|
+
const notes = [];
|
|
262
|
+
const extraFiles = [];
|
|
263
|
+
let configExists = false;
|
|
264
|
+
let mode = 'written';
|
|
265
|
+
let mergePreview = bundle.template;
|
|
266
|
+
try {
|
|
267
|
+
const existingText = await readFile(bundle.configPath, 'utf8');
|
|
268
|
+
configExists = true;
|
|
269
|
+
const existing = removeExistingAgentBellHooks(JSON.parse(existingText), target);
|
|
270
|
+
mergePreview = mergeJson(existing, bundle.template);
|
|
271
|
+
mode = 'merged';
|
|
272
|
+
notes.push('Existing config detected. A real run would create a .bak timestamp backup and merge JSON.');
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
const nodeError = error;
|
|
276
|
+
if (nodeError.code === 'ENOENT') {
|
|
277
|
+
notes.push('No existing config detected. A real run would create this file.');
|
|
278
|
+
}
|
|
279
|
+
else if (error instanceof SyntaxError) {
|
|
280
|
+
configExists = true;
|
|
281
|
+
mode = 'snippet-only';
|
|
282
|
+
mergePreview = bundle.snippet ?? bundle.template;
|
|
283
|
+
notes.push('Existing config is not valid JSON. A real run would write a snippet for manual merge.');
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (bundle.snippetPath) {
|
|
290
|
+
notes.push(`A real run would write snippet: ${bundle.snippetPath}`);
|
|
291
|
+
}
|
|
292
|
+
for (const file of bundle.extraFiles ?? []) {
|
|
293
|
+
const exists = await fileExists(file.path);
|
|
294
|
+
extraFiles.push({
|
|
295
|
+
path: file.path,
|
|
296
|
+
label: file.label,
|
|
297
|
+
content: file.content,
|
|
298
|
+
exists,
|
|
299
|
+
wouldBackup: exists
|
|
300
|
+
});
|
|
301
|
+
notes.push(`A real run would write ${file.label}: ${file.path}`);
|
|
302
|
+
}
|
|
303
|
+
if (target === 'vscode-agent' && !(await isGitRepository(process.cwd()))) {
|
|
304
|
+
notes.push('Current directory is not a git repository; this is still a workspace hook preview.');
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
target,
|
|
308
|
+
configPath: bundle.configPath,
|
|
309
|
+
snippetPath: bundle.snippetPath,
|
|
310
|
+
configExists,
|
|
311
|
+
mode,
|
|
312
|
+
template: bundle.template,
|
|
313
|
+
snippet: bundle.snippet,
|
|
314
|
+
extraFiles,
|
|
315
|
+
mergePreview: sanitizeDryRunValue(mergePreview),
|
|
316
|
+
wouldBackup: configExists && mode === 'merged',
|
|
317
|
+
notes,
|
|
318
|
+
manualVerification: bundle.manualVerification
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
async function fileExists(filePath) {
|
|
322
|
+
try {
|
|
323
|
+
await stat(filePath);
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function selectedTargets(target) {
|
|
331
|
+
return target === 'all' ? ['claude-code', 'codex', 'vscode-agent'] : [target];
|
|
332
|
+
}
|
|
333
|
+
function sanitizeDryRunString(value) {
|
|
334
|
+
const tokenPrefix = ['s', 'k'].join('') + '-';
|
|
335
|
+
const tokenPattern = new RegExp(tokenPrefix + '[A-Za-z0-9._-]{8,}', 'g');
|
|
336
|
+
return value.replace(tokenPattern, (match) => maskSecret(match));
|
|
337
|
+
}
|
|
338
|
+
function sanitizeDryRunValue(value) {
|
|
339
|
+
if (typeof value === 'string') {
|
|
340
|
+
return sanitizeDryRunString(value);
|
|
341
|
+
}
|
|
342
|
+
if (Array.isArray(value)) {
|
|
343
|
+
return value.map((item) => sanitizeDryRunValue(item));
|
|
344
|
+
}
|
|
345
|
+
if (!isRecord(value)) {
|
|
346
|
+
return value;
|
|
347
|
+
}
|
|
348
|
+
const sanitized = {};
|
|
349
|
+
for (const [key, item] of Object.entries(value)) {
|
|
350
|
+
if (/token|secret|auth|password|key/i.test(key) && typeof item === 'string') {
|
|
351
|
+
sanitized[key] = maskSecret(item);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
sanitized[key] = sanitizeDryRunValue(item);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return sanitized;
|
|
358
|
+
}
|
|
359
|
+
function formatJson(value) {
|
|
360
|
+
return JSON.stringify(sanitizeDryRunValue(value), null, 2);
|
|
361
|
+
}
|
|
362
|
+
function indent(value, prefix) {
|
|
363
|
+
return value
|
|
364
|
+
.split(/\r?\n/)
|
|
365
|
+
.map((line) => `${prefix}${line}`)
|
|
366
|
+
.join('\n');
|
|
367
|
+
}
|
|
368
|
+
export async function runInitHooks(options) {
|
|
369
|
+
const targets = selectedTargets(options.target);
|
|
370
|
+
if (options.dryRun) {
|
|
371
|
+
const previews = [];
|
|
372
|
+
for (const target of targets) {
|
|
373
|
+
previews.push(await previewHookTarget(target));
|
|
374
|
+
}
|
|
375
|
+
const lines = ['AgentBell hook dry run', '======================', 'No files were written.', ''];
|
|
376
|
+
for (const preview of previews) {
|
|
377
|
+
lines.push(`[${preview.target}]`);
|
|
378
|
+
lines.push(`target config: ${preview.configPath}`);
|
|
379
|
+
lines.push(`existing config detected: ${preview.configExists ? 'yes' : 'no'}`);
|
|
380
|
+
lines.push(`real run mode: ${preview.mode}`);
|
|
381
|
+
lines.push(`would create backup: ${preview.wouldBackup ? 'yes' : 'no'}`);
|
|
382
|
+
if (preview.snippetPath) {
|
|
383
|
+
lines.push(`snippet path: ${preview.snippetPath}`);
|
|
384
|
+
}
|
|
385
|
+
if (preview.extraFiles && preview.extraFiles.length > 0) {
|
|
386
|
+
lines.push('extra files:');
|
|
387
|
+
for (const file of preview.extraFiles) {
|
|
388
|
+
lines.push(` - ${file.label}: ${file.path}`);
|
|
389
|
+
lines.push(` existing file detected: ${file.exists ? 'yes' : 'no'}`);
|
|
390
|
+
lines.push(` would create backup: ${file.wouldBackup ? 'yes' : 'no'}`);
|
|
391
|
+
lines.push(' wrapper content:');
|
|
392
|
+
lines.push(indent(file.content, ' '));
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
lines.push('hook template:');
|
|
396
|
+
lines.push(formatJson(preview.template));
|
|
397
|
+
if (preview.snippet) {
|
|
398
|
+
lines.push('hook snippet:');
|
|
399
|
+
lines.push(formatJson(preview.snippet));
|
|
400
|
+
}
|
|
401
|
+
lines.push('merge preview:');
|
|
402
|
+
lines.push(formatJson(preview.mergePreview));
|
|
403
|
+
if (preview.notes.length > 0) {
|
|
404
|
+
lines.push('notes:');
|
|
405
|
+
for (const note of preview.notes) {
|
|
406
|
+
lines.push(` - ${note}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
lines.push('');
|
|
410
|
+
}
|
|
411
|
+
lines.push('Next: run the same command without --dry-run to write hook files.');
|
|
412
|
+
logger.info(lines.join('\n'));
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const results = [];
|
|
416
|
+
for (const target of targets) {
|
|
417
|
+
results.push(await installHookTarget(target));
|
|
418
|
+
}
|
|
419
|
+
const lines = ['AgentBell hook setup complete.', ''];
|
|
420
|
+
for (const result of results) {
|
|
421
|
+
lines.push(`[${result.target}] ${result.mode}: ${result.configPath}`);
|
|
422
|
+
lines.push(` written/modified: ${result.configPath}`);
|
|
423
|
+
if (result.backedUpTo) {
|
|
424
|
+
lines.push(` backup: ${result.backedUpTo}`);
|
|
425
|
+
}
|
|
426
|
+
if (result.snippetPath) {
|
|
427
|
+
lines.push(` snippet: ${result.snippetPath}`);
|
|
428
|
+
}
|
|
429
|
+
if (result.extraFiles) {
|
|
430
|
+
for (const file of result.extraFiles) {
|
|
431
|
+
lines.push(` ${file.label}: ${file.path}`);
|
|
432
|
+
if (file.backedUpTo) {
|
|
433
|
+
lines.push(` ${file.label} backup: ${file.backedUpTo}`);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
for (const note of result.notes) {
|
|
438
|
+
lines.push(` - ${note}`);
|
|
439
|
+
}
|
|
440
|
+
if (result.manualVerification && result.manualVerification.length > 0) {
|
|
441
|
+
lines.push(' manual verification:');
|
|
442
|
+
for (const item of result.manualVerification) {
|
|
443
|
+
lines.push(` - ${item}`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
lines.push('');
|
|
447
|
+
}
|
|
448
|
+
lines.push('Next steps:');
|
|
449
|
+
lines.push('1. Run agentbell doctor and review warnings/errors.');
|
|
450
|
+
lines.push('2. Run agentbell test and confirm your phone receives the notification.');
|
|
451
|
+
lines.push('3. Restart or reload the target AI coding tool so it reads the hook config.');
|
|
452
|
+
lines.push('4. Trigger a small agent task and confirm the expected hook notification arrives.');
|
|
453
|
+
logger.info(lines.join('\n'));
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=initHooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initHooks.js","sourceRoot":"","sources":["../../src/commands/initHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ProjectConfig } from '../utils/context.js';
|
|
2
|
+
export interface ProjectInitOptions {
|
|
3
|
+
name?: string;
|
|
4
|
+
task?: string;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function projectConfigPath(cwd?: string): string;
|
|
9
|
+
export declare function writeProjectConfig(options?: ProjectInitOptions): Promise<{
|
|
10
|
+
path: string;
|
|
11
|
+
backedUpTo?: string;
|
|
12
|
+
config: ProjectConfig;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function runProjectInit(options: ProjectInitOptions): Promise<void>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { access, copyFile, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { getProjectName, projectConfigSchema } from '../utils/context.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
export function projectConfigPath(cwd = process.cwd()) {
|
|
7
|
+
return path.join(cwd, '.agentbell.json');
|
|
8
|
+
}
|
|
9
|
+
async function exists(filePath) {
|
|
10
|
+
try {
|
|
11
|
+
await access(filePath, constants.F_OK);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function timestamp() {
|
|
19
|
+
return new Date().toISOString().replace(/[:.]/g, '-');
|
|
20
|
+
}
|
|
21
|
+
async function readExistingConfig(filePath) {
|
|
22
|
+
try {
|
|
23
|
+
const text = await readFile(filePath, 'utf8');
|
|
24
|
+
return projectConfigSchema.parse(JSON.parse(text));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function writeProjectConfig(options = {}) {
|
|
31
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
32
|
+
const filePath = projectConfigPath(cwd);
|
|
33
|
+
const fileExists = await exists(filePath);
|
|
34
|
+
if (fileExists && !options.force) {
|
|
35
|
+
throw new Error(`.agentbell.json already exists at ${filePath}. Use --force to overwrite.`);
|
|
36
|
+
}
|
|
37
|
+
let backedUpTo;
|
|
38
|
+
let existing = {};
|
|
39
|
+
if (fileExists) {
|
|
40
|
+
existing = await readExistingConfig(filePath);
|
|
41
|
+
backedUpTo = `${filePath}.bak-${timestamp()}`;
|
|
42
|
+
await copyFile(filePath, backedUpTo);
|
|
43
|
+
}
|
|
44
|
+
const config = projectConfigSchema.parse({
|
|
45
|
+
...existing,
|
|
46
|
+
projectName: options.name ?? existing.projectName ?? (await getProjectName(cwd, existing)),
|
|
47
|
+
defaultTaskName: options.task ?? existing.defaultTaskName ?? 'AI coding 任务'
|
|
48
|
+
});
|
|
49
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
50
|
+
await writeFile(filePath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
51
|
+
return { path: filePath, backedUpTo, config };
|
|
52
|
+
}
|
|
53
|
+
export async function runProjectInit(options) {
|
|
54
|
+
const result = await writeProjectConfig(options);
|
|
55
|
+
logger.info(`Project config written: ${result.path}`);
|
|
56
|
+
if (result.backedUpTo) {
|
|
57
|
+
logger.info(`Backup written: ${result.backedUpTo}`);
|
|
58
|
+
}
|
|
59
|
+
logger.info(`projectName: ${result.config.projectName ?? ''}`);
|
|
60
|
+
logger.info(`defaultTaskName: ${result.config.defaultTaskName ?? ''}`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NotificationInput, SendOptions } from '../types.js';
|
|
2
|
+
export declare function defaultTitle(tool: string, event: string): string;
|
|
3
|
+
export declare function defaultMessage(tool: string, event: string, includeContext: NotificationInput['config']['includeContext'], machineName?: string): string;
|
|
4
|
+
export declare function parseTags(tags?: string): string[] | undefined;
|
|
5
|
+
export declare function runSend(options: SendOptions): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { loadConfig } from '../config.js';
|
|
3
|
+
import { createProvider } from '../notify/index.js';
|
|
4
|
+
import { sendLocalNotification } from '../notify/local.js';
|
|
5
|
+
import { buildNotificationContext, eventDisplayLabel, renderNotification, toolDisplayName } from '../utils/context.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
export function defaultTitle(tool, event) {
|
|
8
|
+
const readableTool = toolDisplayName(tool || 'custom');
|
|
9
|
+
const label = eventDisplayLabel(event || 'custom');
|
|
10
|
+
return `${readableTool} ${label}`;
|
|
11
|
+
}
|
|
12
|
+
export function defaultMessage(tool, event, includeContext, machineName) {
|
|
13
|
+
const lines = machineName ? [`Machine: ${machineName}`] : [];
|
|
14
|
+
lines.push(`Tool: ${tool || 'custom'}`, `Event: ${event || 'custom'}`);
|
|
15
|
+
if (includeContext.hostname) {
|
|
16
|
+
lines.push(`hostname: ${os.hostname()}`);
|
|
17
|
+
}
|
|
18
|
+
if (includeContext.cwd) {
|
|
19
|
+
lines.push(`cwd: ${process.cwd()}`);
|
|
20
|
+
}
|
|
21
|
+
if (includeContext.timestamp) {
|
|
22
|
+
lines.push(`timestamp: ${new Date().toISOString()}`);
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
export function parseTags(tags) {
|
|
27
|
+
if (!tags) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return tags
|
|
31
|
+
.split(',')
|
|
32
|
+
.map((tag) => tag.trim())
|
|
33
|
+
.filter(Boolean);
|
|
34
|
+
}
|
|
35
|
+
export async function runSend(options) {
|
|
36
|
+
const loaded = await loadConfig(options.config);
|
|
37
|
+
const tool = options.tool ?? 'custom';
|
|
38
|
+
const event = options.event ?? 'custom';
|
|
39
|
+
const contextResult = await buildNotificationContext({
|
|
40
|
+
config: loaded.config,
|
|
41
|
+
tool,
|
|
42
|
+
event,
|
|
43
|
+
cwd: options.cwd,
|
|
44
|
+
project: options.project,
|
|
45
|
+
task: options.task,
|
|
46
|
+
branch: options.branch,
|
|
47
|
+
titleTemplate: options.templateTitle,
|
|
48
|
+
messageTemplate: options.templateMessage
|
|
49
|
+
});
|
|
50
|
+
const rendered = renderNotification(contextResult, loaded.config, {
|
|
51
|
+
titleTemplate: options.templateTitle,
|
|
52
|
+
messageTemplate: options.templateMessage
|
|
53
|
+
});
|
|
54
|
+
for (const warning of rendered.warnings) {
|
|
55
|
+
logger.warn(`Warning: ${warning}`);
|
|
56
|
+
}
|
|
57
|
+
const input = {
|
|
58
|
+
tool,
|
|
59
|
+
event,
|
|
60
|
+
title: options.title ?? rendered.title,
|
|
61
|
+
message: options.message ?? rendered.message,
|
|
62
|
+
priority: options.priority,
|
|
63
|
+
tags: parseTags(options.tags),
|
|
64
|
+
config: loaded.config
|
|
65
|
+
};
|
|
66
|
+
await createProvider(loaded.config).send(input);
|
|
67
|
+
await sendLocalNotification(input);
|
|
68
|
+
logger.info('Notification sent.');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
|