@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.
Files changed (74) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +969 -0
  4. package/RELEASE.md +31 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +106 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/doctor.d.ts +4 -0
  9. package/dist/commands/doctor.js +159 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.js +92 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/initHooks.d.ts +9 -0
  15. package/dist/commands/initHooks.js +455 -0
  16. package/dist/commands/initHooks.js.map +1 -0
  17. package/dist/commands/project.d.ts +14 -0
  18. package/dist/commands/project.js +62 -0
  19. package/dist/commands/project.js.map +1 -0
  20. package/dist/commands/send.d.ts +5 -0
  21. package/dist/commands/send.js +70 -0
  22. package/dist/commands/send.js.map +1 -0
  23. package/dist/commands/setup.d.ts +13 -0
  24. package/dist/commands/setup.js +270 -0
  25. package/dist/commands/setup.js.map +1 -0
  26. package/dist/commands/test.d.ts +9 -0
  27. package/dist/commands/test.js +40 -0
  28. package/dist/commands/test.js.map +1 -0
  29. package/dist/commands/verify.d.ts +78 -0
  30. package/dist/commands/verify.js +725 -0
  31. package/dist/commands/verify.js.map +1 -0
  32. package/dist/config.d.ts +123 -0
  33. package/dist/config.js +72 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/hooks/claudeCode.d.ts +5 -0
  36. package/dist/hooks/claudeCode.js +88 -0
  37. package/dist/hooks/claudeCode.js.map +1 -0
  38. package/dist/hooks/codex.d.ts +4 -0
  39. package/dist/hooks/codex.js +74 -0
  40. package/dist/hooks/codex.js.map +1 -0
  41. package/dist/hooks/vscodeAgent.d.ts +3 -0
  42. package/dist/hooks/vscodeAgent.js +45 -0
  43. package/dist/hooks/vscodeAgent.js.map +1 -0
  44. package/dist/notify/index.d.ts +3 -0
  45. package/dist/notify/index.js +8 -0
  46. package/dist/notify/index.js.map +1 -0
  47. package/dist/notify/local.d.ts +2 -0
  48. package/dist/notify/local.js +34 -0
  49. package/dist/notify/local.js.map +1 -0
  50. package/dist/notify/ntfy.d.ts +10 -0
  51. package/dist/notify/ntfy.js +57 -0
  52. package/dist/notify/ntfy.js.map +1 -0
  53. package/dist/types.d.ts +65 -0
  54. package/dist/types.js +2 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/context.d.ts +92 -0
  57. package/dist/utils/context.js +198 -0
  58. package/dist/utils/context.js.map +1 -0
  59. package/dist/utils/logger.d.ts +5 -0
  60. package/dist/utils/logger.js +12 -0
  61. package/dist/utils/logger.js.map +1 -0
  62. package/dist/utils/mask.d.ts +1 -0
  63. package/dist/utils/mask.js +10 -0
  64. package/dist/utils/mask.js.map +1 -0
  65. package/dist/utils/paths.d.ts +16 -0
  66. package/dist/utils/paths.js +93 -0
  67. package/dist/utils/paths.js.map +1 -0
  68. package/dist/utils/shell.d.ts +1 -0
  69. package/dist/utils/shell.js +21 -0
  70. package/dist/utils/shell.js.map +1 -0
  71. package/dist/utils/topic.d.ts +2 -0
  72. package/dist/utils/topic.js +20 -0
  73. package/dist/utils/topic.js.map +1 -0
  74. package/package.json +57 -0
@@ -0,0 +1,13 @@
1
+ export interface SetupOptions {
2
+ config?: string;
3
+ topic?: string;
4
+ machineName?: string;
5
+ server?: string;
6
+ targets?: string;
7
+ yes?: boolean;
8
+ noTest?: boolean;
9
+ dryRun?: boolean;
10
+ initProject?: boolean;
11
+ projectName?: string;
12
+ }
13
+ export declare function runSetup(options: SetupOptions): Promise<void>;
@@ -0,0 +1,270 @@
1
+ import os from 'node:os';
2
+ import { createInterface } from 'node:readline/promises';
3
+ import { stdin as input, stdout as output } from 'node:process';
4
+ import { agentBellConfigSchema, writeConfig } from '../config.js';
5
+ import { createProvider } from '../notify/index.js';
6
+ import { sendLocalNotification } from '../notify/local.js';
7
+ import { logger } from '../utils/logger.js';
8
+ import { maskSecret } from '../utils/mask.js';
9
+ import { defaultConfigPath } from '../utils/paths.js';
10
+ import { generateTopic, isWeakTopic } from '../utils/topic.js';
11
+ import { installHookTarget } from './initHooks.js';
12
+ import { writeProjectConfig } from './project.js';
13
+ function yes(value, defaultValue) {
14
+ const normalized = value.trim().toLowerCase();
15
+ if (!normalized) {
16
+ return defaultValue;
17
+ }
18
+ return ['y', 'yes', 'true', '1'].includes(normalized);
19
+ }
20
+ async function createQuestioner() {
21
+ if (input.isTTY) {
22
+ const rl = createInterface({ input, output });
23
+ return {
24
+ question: (prompt) => rl.question(prompt),
25
+ close: () => rl.close()
26
+ };
27
+ }
28
+ return {
29
+ async question(prompt) {
30
+ output.write(prompt);
31
+ output.write('\n');
32
+ return '';
33
+ },
34
+ close: () => undefined
35
+ };
36
+ }
37
+ function parseTargets(inputValue) {
38
+ const value = (inputValue || 'all').trim().toLowerCase();
39
+ if (value === 'none') {
40
+ return [];
41
+ }
42
+ if (value === 'all') {
43
+ return ['codex', 'claude-code', 'vscode-agent'];
44
+ }
45
+ const targets = value
46
+ .split(',')
47
+ .map((target) => target.trim())
48
+ .filter(Boolean);
49
+ const allowed = new Set(['codex', 'claude-code', 'vscode-agent']);
50
+ for (const target of targets) {
51
+ if (!allowed.has(target)) {
52
+ throw new Error(`Invalid setup target: ${target}. Expected all, none, codex, claude-code, or vscode-agent.`);
53
+ }
54
+ }
55
+ return [...new Set(targets)];
56
+ }
57
+ async function chooseTopic(rl, options, generatedTopic, hideGeneratedTopic = false) {
58
+ if (options.topic) {
59
+ return confirmWeakTopic(rl, options.topic, options.yes ?? false);
60
+ }
61
+ logger.info('Generated topic:');
62
+ logger.info(hideGeneratedTopic ? maskSecret(generatedTopic) : generatedTopic);
63
+ logger.info(hideGeneratedTopic
64
+ ? 'Full topic hidden in dry-run. A real setup run will show it so you can subscribe on Android.'
65
+ : 'Keep this topic private. Anyone who knows it can publish to it.');
66
+ if (options.yes) {
67
+ return generatedTopic;
68
+ }
69
+ const useGenerated = yes(await rl.question('Use this generated topic? [Y/n]: '), true);
70
+ if (useGenerated) {
71
+ return generatedTopic;
72
+ }
73
+ const customTopic = (await rl.question('Enter your custom ntfy topic: ')).trim();
74
+ if (!customTopic) {
75
+ throw new Error('ntfy topic is required.');
76
+ }
77
+ return confirmWeakTopic(rl, customTopic, false);
78
+ }
79
+ async function confirmWeakTopic(rl, topic, assumeYes) {
80
+ const normalized = topic.trim();
81
+ if (!normalized) {
82
+ throw new Error('ntfy topic is required.');
83
+ }
84
+ if (!isWeakTopic(normalized)) {
85
+ return normalized;
86
+ }
87
+ if (assumeYes) {
88
+ logger.warn('Warning: the configured ntfy topic looks easy to guess. Prefer a long random topic.');
89
+ return normalized;
90
+ }
91
+ const proceed = yes(await rl.question('This topic looks easy to guess. Continue anyway? [y/N]: '), false);
92
+ if (!proceed) {
93
+ throw new Error('Setup cancelled because the ntfy topic is weak.');
94
+ }
95
+ return normalized;
96
+ }
97
+ function setupTestMessage(machineName) {
98
+ return `${machineName} is connected. If you see this, AgentBell is ready to install hooks.`;
99
+ }
100
+ async function sendSetupTest(config, machineName) {
101
+ const inputData = {
102
+ tool: 'custom',
103
+ event: 'custom',
104
+ title: 'AgentBell setup test',
105
+ message: setupTestMessage(machineName),
106
+ priority: config.ntfy.priority,
107
+ tags: config.ntfy.tags,
108
+ config
109
+ };
110
+ await createProvider(config).send(inputData);
111
+ await sendLocalNotification(inputData);
112
+ }
113
+ export async function runSetup(options) {
114
+ const rl = await createQuestioner();
115
+ const generatedTopic = generateTopic();
116
+ const configPath = options.config ?? defaultConfigPath();
117
+ const installedTargets = [];
118
+ let skippedHookInstall = false;
119
+ let shouldInitProject = options.initProject ?? false;
120
+ try {
121
+ logger.info('AgentBell setup');
122
+ logger.info('This wizard will:');
123
+ logger.info('- generate a random ntfy topic');
124
+ logger.info('- create your AgentBell config');
125
+ logger.info('- guide you to subscribe on Android');
126
+ logger.info('- send a test notification');
127
+ logger.info('- install AI coding hooks');
128
+ logger.info('');
129
+ const provider = options.yes ? 'ntfy' : ((await rl.question('Notification provider [ntfy]: ')).trim() || 'ntfy');
130
+ if (provider !== 'ntfy') {
131
+ throw new Error('Only ntfy is supported in this MVP.');
132
+ }
133
+ const server = options.server ?? (options.yes ? 'https://ntfy.sh' : ((await rl.question('ntfy server [https://ntfy.sh]: ')).trim() || 'https://ntfy.sh'));
134
+ const topic = await chooseTopic(rl, options, generatedTopic, options.dryRun ?? false);
135
+ const machineName = options.machineName ?? (options.yes ? os.hostname() : ((await rl.question(`Machine display name [${os.hostname()}]: `)).trim() || os.hostname()));
136
+ let localEnabled = false;
137
+ if (process.platform === 'win32') {
138
+ logger.info('Local desktop notifications are skipped on Windows in this MVP. Phone push still works.');
139
+ }
140
+ else if (!options.yes) {
141
+ localEnabled = yes(await rl.question('Enable local desktop notification too? [y/N]: '), false);
142
+ }
143
+ const config = agentBellConfigSchema.parse({
144
+ provider: 'ntfy',
145
+ ntfy: {
146
+ server,
147
+ topic,
148
+ priority: 'high',
149
+ tags: ['computer']
150
+ },
151
+ profile: {
152
+ name: machineName
153
+ },
154
+ localNotification: {
155
+ enabled: localEnabled
156
+ },
157
+ includeContext: {
158
+ hostname: true,
159
+ cwd: true,
160
+ timestamp: true
161
+ }
162
+ });
163
+ if (!options.yes && !options.initProject) {
164
+ const setupProjectContext = yes(await rl.question('Project context template setup? [y/N]: '), false);
165
+ if (setupProjectContext) {
166
+ shouldInitProject = yes(await rl.question('Create .agentbell.json for this project? [y/N]: '), false);
167
+ }
168
+ }
169
+ const targets = parseTargets(options.targets ?? (options.yes ? 'all' : ((await rl.question('Install hooks for which tools? [all]: ')).trim() || 'all')));
170
+ if (options.dryRun) {
171
+ logger.info('AgentBell setup dry run');
172
+ logger.info('No files were written. No notification was sent. No hooks were installed.');
173
+ logger.info(`config path: ${configPath}`);
174
+ logger.info(`provider: ${config.provider}`);
175
+ logger.info(`ntfy server: ${config.ntfy.server}`);
176
+ logger.info(`topic: ${maskSecret(config.ntfy.topic)}`);
177
+ logger.info(`machine name: ${machineName}`);
178
+ logger.info('include context: hostname, cwd, timestamp');
179
+ logger.info(`hook targets: ${targets.length > 0 ? targets.join(', ') : 'none'}`);
180
+ logger.info(`project config: ${shouldInitProject ? '.agentbell.json would be created' : 'skipped'}`);
181
+ logger.info('Next: run the same command without --dry-run to write config and continue setup.');
182
+ return;
183
+ }
184
+ const writtenConfigPath = await writeConfig(config, options.config);
185
+ logger.info(`Config written: ${writtenConfigPath}`);
186
+ let projectConfigPath;
187
+ if (shouldInitProject) {
188
+ const projectResult = await writeProjectConfig({
189
+ name: options.projectName,
190
+ task: 'AI coding \u4efb\u52a1',
191
+ force: true
192
+ });
193
+ projectConfigPath = projectResult.path;
194
+ logger.info(`Project config written: ${projectResult.path}`);
195
+ if (projectResult.backedUpTo) {
196
+ logger.info(`Project config backup: ${projectResult.backedUpTo}`);
197
+ }
198
+ }
199
+ logger.info('include context: hostname, cwd, timestamp');
200
+ logger.info('');
201
+ if (options.noTest) {
202
+ logger.warn('Skipping setup test notification because --no-test was provided.');
203
+ }
204
+ else {
205
+ logger.info('Android setup:');
206
+ logger.info('1. Install ntfy Android.');
207
+ logger.info('2. Open ntfy and subscribe to this topic:');
208
+ logger.info(` ${config.ntfy.topic}`);
209
+ logger.info('3. Allow notifications.');
210
+ logger.info('4. Allow background running / disable battery optimization if needed.');
211
+ if (!options.yes) {
212
+ await rl.question('5. Press Enter here after subscribing.');
213
+ }
214
+ await sendSetupTest(config, machineName);
215
+ logger.info('Setup test notification sent.');
216
+ if (!options.yes) {
217
+ const received = yes(await rl.question('Did you receive the test notification on your phone? [Y/n]: '), true);
218
+ if (!received) {
219
+ logger.warn('Test notification was not confirmed.');
220
+ logger.info('Troubleshooting: check topic, check ntfy server, open the ntfy app, allow notification permission, allow background running, then run agentbell doctor.');
221
+ const continueHooks = yes(await rl.question('Continue to install hooks anyway? [y/N]: '), false);
222
+ if (!continueHooks) {
223
+ skippedHookInstall = true;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ if (!skippedHookInstall && targets.length > 0) {
229
+ for (const target of targets) {
230
+ const result = await installHookTarget(target);
231
+ installedTargets.push(target);
232
+ logger.info(`[${target}] ${result.mode}: ${result.configPath}`);
233
+ for (const file of result.extraFiles ?? []) {
234
+ logger.info(` ${file.label}: ${file.path}`);
235
+ }
236
+ }
237
+ }
238
+ logger.info('');
239
+ logger.info('Setup complete.');
240
+ logger.info('');
241
+ logger.info('Config:');
242
+ logger.info(`- config path: ${writtenConfigPath}`);
243
+ logger.info(`- provider: ${config.provider}`);
244
+ logger.info(`- topic: ${maskSecret(config.ntfy.topic)}`);
245
+ logger.info(`- machine name: ${machineName}`);
246
+ if (projectConfigPath) {
247
+ logger.info(`- project config: ${projectConfigPath}`);
248
+ }
249
+ logger.info('');
250
+ logger.info('Hooks:');
251
+ logger.info(`- Codex: ${installedTargets.includes('codex') ? 'installed' : 'skipped'}`);
252
+ logger.info(`- Claude Code: ${installedTargets.includes('claude-code') ? 'installed' : 'skipped'}`);
253
+ logger.info(`- VS Code Copilot Agent: ${installedTargets.includes('vscode-agent') ? 'installed' : 'skipped'}`);
254
+ logger.info('');
255
+ logger.info('Next steps:');
256
+ logger.info('1. Restart VS Code / target AI tools.');
257
+ logger.info('2. Trust hooks if prompted.');
258
+ logger.info('3. Run a small task in your AI coding tool.');
259
+ logger.info('4. Check logs if no notification arrives.');
260
+ logger.info('');
261
+ logger.info('Log paths:');
262
+ logger.info('- Codex: ~/.agentbell/codex-hook-fired.log');
263
+ logger.info('- Claude Code: <projectRoot>/.agentbell-hooks/claude-hook-fired.log');
264
+ logger.info('- Copilot Agent: <projectRoot>/.agentbell-hooks/copilot-hook-fired.log');
265
+ }
266
+ finally {
267
+ rl.close();
268
+ }
269
+ }
270
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface TestOptions {
2
+ config?: string;
3
+ task?: string;
4
+ project?: string;
5
+ cwd?: string;
6
+ branch?: string;
7
+ }
8
+ export declare function defaultTestMessage(machineName?: string): string;
9
+ export declare function runTest(options: TestOptions): Promise<void>;
@@ -0,0 +1,40 @@
1
+ import { loadConfig } from '../config.js';
2
+ import { createProvider } from '../notify/index.js';
3
+ import { sendLocalNotification } from '../notify/local.js';
4
+ import { buildNotificationContext, renderNotification } from '../utils/context.js';
5
+ import { logger } from '../utils/logger.js';
6
+ export function defaultTestMessage(machineName) {
7
+ if (machineName) {
8
+ return `${machineName} is connected. If you see this, AgentBell is configured successfully.`;
9
+ }
10
+ return '如果你看到了这条通知,说明 AgentBell 已经配置成功。';
11
+ }
12
+ export async function runTest(options) {
13
+ const loaded = await loadConfig(options.config);
14
+ const contextResult = await buildNotificationContext({
15
+ config: loaded.config,
16
+ tool: 'custom',
17
+ event: 'test',
18
+ cwd: options.cwd,
19
+ project: options.project,
20
+ task: options.task,
21
+ branch: options.branch
22
+ });
23
+ const rendered = renderNotification(contextResult, loaded.config, { testMode: true });
24
+ for (const warning of rendered.warnings) {
25
+ logger.warn(`Warning: ${warning}`);
26
+ }
27
+ const input = {
28
+ tool: 'custom',
29
+ event: 'test',
30
+ title: rendered.title,
31
+ message: rendered.message,
32
+ priority: loaded.config.ntfy.priority,
33
+ tags: loaded.config.ntfy.tags,
34
+ config: loaded.config
35
+ };
36
+ await createProvider(loaded.config).send(input);
37
+ await sendLocalNotification(input);
38
+ logger.info('Test notification sent.');
39
+ }
40
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,UAAU,kBAAkB,CAAC,WAAoB;IACrD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,GAAG,WAAW,uEAAuE,CAAC;IAC/F,CAAC;IAED,OAAO,iCAAiC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAAC;QACnD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtF,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ;QACrC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,78 @@
1
+ type VerifyTarget = 'codex' | 'claude-code' | 'vscode-agent';
2
+ type VerifyStatus = 'ok' | 'warning' | 'error';
3
+ export interface VerifyOptions {
4
+ target?: VerifyTarget | 'all';
5
+ config?: string;
6
+ sendTest?: boolean;
7
+ runWrapper?: boolean;
8
+ dryRun?: boolean;
9
+ json?: boolean;
10
+ }
11
+ export interface VerifyTargetReport {
12
+ target: VerifyTarget;
13
+ status: VerifyStatus;
14
+ checks: Record<string, VerifyStatus>;
15
+ details: Record<string, unknown>;
16
+ warnings: string[];
17
+ errors: string[];
18
+ suggestedFixes: string[];
19
+ }
20
+ export interface VerifyReport {
21
+ overallStatus: VerifyStatus;
22
+ platform: NodeJS.Platform;
23
+ cwd: string;
24
+ nodePath: string;
25
+ cliInvocation: string;
26
+ expectedCliPath: string;
27
+ config: {
28
+ path: string;
29
+ exists: boolean;
30
+ readable: boolean;
31
+ provider?: string;
32
+ ntfyServer?: string;
33
+ topicPresent?: boolean;
34
+ topicMasked?: string;
35
+ profileName?: string;
36
+ };
37
+ provider: {
38
+ supported: boolean;
39
+ ntfyServerReachable?: boolean;
40
+ };
41
+ localNotification: {
42
+ windowsSkipped: boolean;
43
+ };
44
+ targets: Partial<Record<VerifyTarget, VerifyTargetReport>>;
45
+ warnings: string[];
46
+ errors: string[];
47
+ suggestedFixes: string[];
48
+ }
49
+ interface RunnerResult {
50
+ exitCode: number;
51
+ stdout: string;
52
+ stderr: string;
53
+ command?: string;
54
+ args?: string[];
55
+ }
56
+ export interface VerifyBuildOptions extends VerifyOptions {
57
+ runner?: (target: VerifyTarget, wrapperPath: string, runnerOptions?: {
58
+ bashPath?: string;
59
+ }) => Promise<RunnerResult>;
60
+ bashResolver?: () => Promise<{
61
+ path?: string;
62
+ error?: string;
63
+ }>;
64
+ }
65
+ export interface BashResolverOptions {
66
+ env?: NodeJS.ProcessEnv;
67
+ platform?: NodeJS.Platform;
68
+ exists?: (filePath: string) => boolean | Promise<boolean>;
69
+ findOnPath?: (command: string) => string | undefined | Promise<string | undefined>;
70
+ commonPaths?: string[];
71
+ }
72
+ export declare function resolveBashPath(options?: BashResolverOptions): Promise<{
73
+ path?: string;
74
+ error?: string;
75
+ }>;
76
+ export declare function buildVerifyReport(options?: VerifyBuildOptions): Promise<VerifyReport>;
77
+ export declare function runVerify(options: VerifyOptions): Promise<void>;
78
+ export {};