@camaradesuk/git-worktree-tools 1.8.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -27
- package/dist/cli/cleanpr.js +74 -53
- package/dist/cli/cleanpr.js.map +1 -1
- package/dist/cli/cleanpr.test.js +2 -0
- package/dist/cli/cleanpr.test.js.map +1 -1
- package/dist/cli/lswt.js +32 -56
- package/dist/cli/lswt.js.map +1 -1
- package/dist/cli/lswt.test.js +17 -27
- package/dist/cli/lswt.test.js.map +1 -1
- package/dist/cli/newpr.d.ts +13 -1
- package/dist/cli/newpr.d.ts.map +1 -1
- package/dist/cli/newpr.js +350 -151
- package/dist/cli/newpr.js.map +1 -1
- package/dist/cli/newpr.test.js +314 -5
- package/dist/cli/newpr.test.js.map +1 -1
- package/dist/cli/prs.d.ts +3 -10
- package/dist/cli/prs.d.ts.map +1 -1
- package/dist/cli/prs.js +6 -168
- package/dist/cli/prs.js.map +1 -1
- package/dist/cli/prs.test.js +55 -0
- package/dist/cli/prs.test.js.map +1 -1
- package/dist/cli/wt/clean.d.ts +6 -2
- package/dist/cli/wt/clean.d.ts.map +1 -1
- package/dist/cli/wt/clean.js +401 -20
- package/dist/cli/wt/clean.js.map +1 -1
- package/dist/cli/wt/clean.test.d.ts +8 -0
- package/dist/cli/wt/clean.test.d.ts.map +1 -0
- package/dist/cli/wt/clean.test.js +624 -0
- package/dist/cli/wt/clean.test.js.map +1 -0
- package/dist/cli/wt/completion.d.ts +3 -0
- package/dist/cli/wt/completion.d.ts.map +1 -1
- package/dist/cli/wt/completion.js +80 -9
- package/dist/cli/wt/completion.js.map +1 -1
- package/dist/cli/wt/completion.test.js +102 -0
- package/dist/cli/wt/completion.test.js.map +1 -1
- package/dist/cli/wt/config.d.ts +3 -1
- package/dist/cli/wt/config.d.ts.map +1 -1
- package/dist/cli/wt/config.js +323 -32
- package/dist/cli/wt/config.js.map +1 -1
- package/dist/cli/wt/config.test.d.ts +2 -0
- package/dist/cli/wt/config.test.d.ts.map +1 -1
- package/dist/cli/wt/config.test.js +206 -26
- package/dist/cli/wt/config.test.js.map +1 -1
- package/dist/cli/wt/interactive-menu.d.ts +2 -0
- package/dist/cli/wt/interactive-menu.d.ts.map +1 -1
- package/dist/cli/wt/interactive-menu.js +346 -73
- package/dist/cli/wt/interactive-menu.js.map +1 -1
- package/dist/cli/wt/interactive-menu.test.d.ts +4 -2
- package/dist/cli/wt/interactive-menu.test.d.ts.map +1 -1
- package/dist/cli/wt/interactive-menu.test.js +383 -323
- package/dist/cli/wt/interactive-menu.test.js.map +1 -1
- package/dist/cli/wt/link.d.ts +3 -1
- package/dist/cli/wt/link.d.ts.map +1 -1
- package/dist/cli/wt/link.js +125 -38
- package/dist/cli/wt/link.js.map +1 -1
- package/dist/cli/wt/list.d.ts +4 -1
- package/dist/cli/wt/list.d.ts.map +1 -1
- package/dist/cli/wt/list.js +85 -16
- package/dist/cli/wt/list.js.map +1 -1
- package/dist/cli/wt/list.test.d.ts +10 -0
- package/dist/cli/wt/list.test.d.ts.map +1 -0
- package/dist/cli/wt/list.test.js +157 -0
- package/dist/cli/wt/list.test.js.map +1 -0
- package/dist/cli/wt/new.d.ts +8 -2
- package/dist/cli/wt/new.d.ts.map +1 -1
- package/dist/cli/wt/new.js +91 -46
- package/dist/cli/wt/new.js.map +1 -1
- package/dist/cli/wt/prs.d.ts +2 -1
- package/dist/cli/wt/prs.d.ts.map +1 -1
- package/dist/cli/wt/prs.js +3 -164
- package/dist/cli/wt/prs.js.map +1 -1
- package/dist/cli/wt/run-command.d.ts +4 -2
- package/dist/cli/wt/run-command.d.ts.map +1 -1
- package/dist/cli/wt/run-command.js +6 -4
- package/dist/cli/wt/run-command.js.map +1 -1
- package/dist/cli/wt/state.d.ts +3 -1
- package/dist/cli/wt/state.d.ts.map +1 -1
- package/dist/cli/wt/state.js +74 -10
- package/dist/cli/wt/state.js.map +1 -1
- package/dist/cli/wt/state.test.d.ts +9 -0
- package/dist/cli/wt/state.test.d.ts.map +1 -0
- package/dist/cli/wt/state.test.js +127 -0
- package/dist/cli/wt/state.test.js.map +1 -0
- package/dist/cli/wt/wt.test.d.ts +2 -2
- package/dist/cli/wt/wt.test.js +430 -212
- package/dist/cli/wt/wt.test.js.map +1 -1
- package/dist/cli/wt.d.ts.map +1 -1
- package/dist/cli/wt.js +50 -36
- package/dist/cli/wt.js.map +1 -1
- package/dist/cli/wt.unit.test.js +16 -38
- package/dist/cli/wt.unit.test.js.map +1 -1
- package/dist/cli/wtconfig.d.ts +1 -0
- package/dist/cli/wtconfig.d.ts.map +1 -1
- package/dist/cli/wtconfig.js +213 -21
- package/dist/cli/wtconfig.js.map +1 -1
- package/dist/cli/wtconfig.test.js +3 -0
- package/dist/cli/wtconfig.test.js.map +1 -1
- package/dist/cli/wtlink.js +116 -73
- package/dist/cli/wtlink.js.map +1 -1
- package/dist/cli/wtstate.js +21 -2
- package/dist/cli/wtstate.js.map +1 -1
- package/dist/e2e/wt/interactive-menu.e2e.test.js +17 -17
- package/dist/e2e/wt/interactive-menu.e2e.test.js.map +1 -1
- package/dist/lib/ai/types.d.ts +12 -0
- package/dist/lib/ai/types.d.ts.map +1 -1
- package/dist/lib/ai/types.js.map +1 -1
- package/dist/lib/cleanpr/args.d.ts.map +1 -1
- package/dist/lib/cleanpr/args.js +20 -0
- package/dist/lib/cleanpr/args.js.map +1 -1
- package/dist/lib/cleanpr/types.d.ts +6 -0
- package/dist/lib/cleanpr/types.d.ts.map +1 -1
- package/dist/lib/cleanpr/worktree-info.d.ts.map +1 -1
- package/dist/lib/cleanpr/worktree-info.js +1 -6
- package/dist/lib/cleanpr/worktree-info.js.map +1 -1
- package/dist/lib/cleanpr/worktree-info.test.js +10 -13
- package/dist/lib/cleanpr/worktree-info.test.js.map +1 -1
- package/dist/lib/colors.d.ts +5 -0
- package/dist/lib/colors.d.ts.map +1 -1
- package/dist/lib/colors.js +13 -6
- package/dist/lib/colors.js.map +1 -1
- package/dist/lib/config-editor.d.ts.map +1 -1
- package/dist/lib/config-editor.js.map +1 -1
- package/dist/lib/config-migration/detector.d.ts +25 -0
- package/dist/lib/config-migration/detector.d.ts.map +1 -0
- package/dist/lib/config-migration/detector.js +372 -0
- package/dist/lib/config-migration/detector.js.map +1 -0
- package/dist/lib/config-migration/detector.test.d.ts +5 -0
- package/dist/lib/config-migration/detector.test.d.ts.map +1 -0
- package/dist/lib/config-migration/detector.test.js +201 -0
- package/dist/lib/config-migration/detector.test.js.map +1 -0
- package/dist/lib/config-migration/index.d.ts +29 -0
- package/dist/lib/config-migration/index.d.ts.map +1 -0
- package/dist/lib/config-migration/index.js +33 -0
- package/dist/lib/config-migration/index.js.map +1 -0
- package/dist/lib/config-migration/reporter.d.ts +53 -0
- package/dist/lib/config-migration/reporter.d.ts.map +1 -0
- package/dist/lib/config-migration/reporter.js +257 -0
- package/dist/lib/config-migration/reporter.js.map +1 -0
- package/dist/lib/config-migration/reporter.test.d.ts +5 -0
- package/dist/lib/config-migration/reporter.test.d.ts.map +1 -0
- package/dist/lib/config-migration/reporter.test.js +305 -0
- package/dist/lib/config-migration/reporter.test.js.map +1 -0
- package/dist/lib/config-migration/runner.d.ts +46 -0
- package/dist/lib/config-migration/runner.d.ts.map +1 -0
- package/dist/lib/config-migration/runner.js +364 -0
- package/dist/lib/config-migration/runner.js.map +1 -0
- package/dist/lib/config-migration/runner.test.d.ts +5 -0
- package/dist/lib/config-migration/runner.test.d.ts.map +1 -0
- package/dist/lib/config-migration/runner.test.js +235 -0
- package/dist/lib/config-migration/runner.test.js.map +1 -0
- package/dist/lib/config-migration/types.d.ts +120 -0
- package/dist/lib/config-migration/types.d.ts.map +1 -0
- package/dist/lib/config-migration/types.js +70 -0
- package/dist/lib/config-migration/types.js.map +1 -0
- package/dist/lib/config-validation.d.ts.map +1 -1
- package/dist/lib/config-validation.js +6 -0
- package/dist/lib/config-validation.js.map +1 -1
- package/dist/lib/config-validation.test.js +25 -0
- package/dist/lib/config-validation.test.js.map +1 -1
- package/dist/lib/config.d.ts +31 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.js +3 -15
- package/dist/lib/config.test.js.map +1 -1
- package/dist/lib/constants.d.ts +12 -4
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +24 -5
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/constants.test.js +88 -29
- package/dist/lib/constants.test.js.map +1 -1
- package/dist/lib/deprecation.d.ts +18 -0
- package/dist/lib/deprecation.d.ts.map +1 -0
- package/dist/lib/deprecation.js +28 -0
- package/dist/lib/deprecation.js.map +1 -0
- package/dist/lib/deprecation.test.d.ts +2 -0
- package/dist/lib/deprecation.test.d.ts.map +1 -0
- package/dist/lib/deprecation.test.js +71 -0
- package/dist/lib/deprecation.test.js.map +1 -0
- package/dist/lib/hooks/confirmation.d.ts +49 -0
- package/dist/lib/hooks/confirmation.d.ts.map +1 -0
- package/dist/lib/hooks/confirmation.js +147 -0
- package/dist/lib/hooks/confirmation.js.map +1 -0
- package/dist/lib/hooks/confirmation.test.d.ts +7 -0
- package/dist/lib/hooks/confirmation.test.d.ts.map +1 -0
- package/dist/lib/hooks/confirmation.test.js +300 -0
- package/dist/lib/hooks/confirmation.test.js.map +1 -0
- package/dist/lib/hooks/executor.d.ts +16 -1
- package/dist/lib/hooks/executor.d.ts.map +1 -1
- package/dist/lib/hooks/executor.js +53 -4
- package/dist/lib/hooks/executor.js.map +1 -1
- package/dist/lib/hooks/index.d.ts +4 -2
- package/dist/lib/hooks/index.d.ts.map +1 -1
- package/dist/lib/hooks/index.js +3 -2
- package/dist/lib/hooks/index.js.map +1 -1
- package/dist/lib/hooks/types.d.ts +16 -0
- package/dist/lib/hooks/types.d.ts.map +1 -1
- package/dist/lib/hooks/types.js +12 -0
- package/dist/lib/hooks/types.js.map +1 -1
- package/dist/lib/logger.d.ts +40 -155
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +349 -420
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/logger.test.d.ts +10 -1
- package/dist/lib/logger.test.d.ts.map +1 -1
- package/dist/lib/logger.test.js +658 -258
- package/dist/lib/logger.test.js.map +1 -1
- package/dist/lib/lswt/action-executors.d.ts +2 -0
- package/dist/lib/lswt/action-executors.d.ts.map +1 -1
- package/dist/lib/lswt/action-executors.js +4 -3
- package/dist/lib/lswt/action-executors.js.map +1 -1
- package/dist/lib/lswt/action-executors.test.js +7 -0
- package/dist/lib/lswt/action-executors.test.js.map +1 -1
- package/dist/lib/lswt/args.d.ts.map +1 -1
- package/dist/lib/lswt/args.js +15 -1
- package/dist/lib/lswt/args.js.map +1 -1
- package/dist/lib/lswt/environment.d.ts +21 -2
- package/dist/lib/lswt/environment.d.ts.map +1 -1
- package/dist/lib/lswt/environment.js +73 -32
- package/dist/lib/lswt/environment.js.map +1 -1
- package/dist/lib/lswt/environment.test.js +79 -1
- package/dist/lib/lswt/environment.test.js.map +1 -1
- package/dist/lib/lswt/index.d.ts +1 -0
- package/dist/lib/lswt/index.d.ts.map +1 -1
- package/dist/lib/lswt/index.js +2 -0
- package/dist/lib/lswt/index.js.map +1 -1
- package/dist/lib/lswt/table.d.ts +15 -0
- package/dist/lib/lswt/table.d.ts.map +1 -0
- package/dist/lib/lswt/table.js +61 -0
- package/dist/lib/lswt/table.js.map +1 -0
- package/dist/lib/lswt/table.test.d.ts +5 -0
- package/dist/lib/lswt/table.test.d.ts.map +1 -0
- package/dist/lib/lswt/table.test.js +262 -0
- package/dist/lib/lswt/table.test.js.map +1 -0
- package/dist/lib/lswt/types.d.ts +4 -0
- package/dist/lib/lswt/types.d.ts.map +1 -1
- package/dist/lib/lswt/worktree-info.d.ts.map +1 -1
- package/dist/lib/lswt/worktree-info.js +1 -6
- package/dist/lib/lswt/worktree-info.js.map +1 -1
- package/dist/lib/lswt/worktree-info.test.js +5 -17
- package/dist/lib/lswt/worktree-info.test.js.map +1 -1
- package/dist/lib/newpr/args.d.ts.map +1 -1
- package/dist/lib/newpr/args.js +36 -1
- package/dist/lib/newpr/args.js.map +1 -1
- package/dist/lib/newpr/hook-runner.d.ts +11 -0
- package/dist/lib/newpr/hook-runner.d.ts.map +1 -1
- package/dist/lib/newpr/hook-runner.js +49 -1
- package/dist/lib/newpr/hook-runner.js.map +1 -1
- package/dist/lib/newpr/hook-runner.test.js +121 -0
- package/dist/lib/newpr/hook-runner.test.js.map +1 -1
- package/dist/lib/newpr/plan-generator.d.ts +121 -0
- package/dist/lib/newpr/plan-generator.d.ts.map +1 -0
- package/dist/lib/newpr/plan-generator.js +185 -0
- package/dist/lib/newpr/plan-generator.js.map +1 -0
- package/dist/lib/newpr/plan-generator.test.d.ts +7 -0
- package/dist/lib/newpr/plan-generator.test.d.ts.map +1 -0
- package/dist/lib/newpr/plan-generator.test.js +387 -0
- package/dist/lib/newpr/plan-generator.test.js.map +1 -0
- package/dist/lib/newpr/types.d.ts +12 -0
- package/dist/lib/newpr/types.d.ts.map +1 -1
- package/dist/lib/prs/actions.d.ts +5 -1
- package/dist/lib/prs/actions.d.ts.map +1 -1
- package/dist/lib/prs/actions.js +12 -10
- package/dist/lib/prs/actions.js.map +1 -1
- package/dist/lib/prs/actions.test.js +48 -5
- package/dist/lib/prs/actions.test.js.map +1 -1
- package/dist/lib/prs/command.d.ts +21 -0
- package/dist/lib/prs/command.d.ts.map +1 -0
- package/dist/lib/prs/command.js +175 -0
- package/dist/lib/prs/command.js.map +1 -0
- package/dist/lib/prs/command.test.d.ts +11 -0
- package/dist/lib/prs/command.test.d.ts.map +1 -0
- package/dist/lib/prs/command.test.js +409 -0
- package/dist/lib/prs/command.test.js.map +1 -0
- package/dist/lib/prs/interactive.d.ts.map +1 -1
- package/dist/lib/prs/interactive.js +15 -2
- package/dist/lib/prs/interactive.js.map +1 -1
- package/dist/lib/prs/interactive.test.js +153 -0
- package/dist/lib/prs/interactive.test.js.map +1 -1
- package/dist/lib/prs/types.d.ts +15 -0
- package/dist/lib/prs/types.d.ts.map +1 -1
- package/dist/lib/ui/error.d.ts +31 -0
- package/dist/lib/ui/error.d.ts.map +1 -0
- package/dist/lib/ui/error.js +47 -0
- package/dist/lib/ui/error.js.map +1 -0
- package/dist/lib/ui/error.test.d.ts +2 -0
- package/dist/lib/ui/error.test.d.ts.map +1 -0
- package/dist/lib/ui/error.test.js +143 -0
- package/dist/lib/ui/error.test.js.map +1 -0
- package/dist/lib/ui/index.d.ts +15 -0
- package/dist/lib/ui/index.d.ts.map +1 -0
- package/dist/lib/ui/index.js +19 -0
- package/dist/lib/ui/index.js.map +1 -0
- package/dist/lib/ui/output.d.ts +18 -0
- package/dist/lib/ui/output.d.ts.map +1 -0
- package/dist/lib/ui/output.js +31 -0
- package/dist/lib/ui/output.js.map +1 -0
- package/dist/lib/ui/output.test.d.ts +2 -0
- package/dist/lib/ui/output.test.d.ts.map +1 -0
- package/dist/lib/ui/output.test.js +59 -0
- package/dist/lib/ui/output.test.js.map +1 -0
- package/dist/lib/ui/spinner.d.ts +10 -0
- package/dist/lib/ui/spinner.d.ts.map +1 -0
- package/dist/lib/ui/spinner.js +10 -0
- package/dist/lib/ui/spinner.js.map +1 -0
- package/dist/lib/ui/status.d.ts +65 -0
- package/dist/lib/ui/status.d.ts.map +1 -0
- package/dist/lib/ui/status.js +100 -0
- package/dist/lib/ui/status.js.map +1 -0
- package/dist/lib/ui/status.test.d.ts +2 -0
- package/dist/lib/ui/status.test.d.ts.map +1 -0
- package/dist/lib/ui/status.test.js +158 -0
- package/dist/lib/ui/status.test.js.map +1 -0
- package/dist/lib/ui/table.d.ts +39 -0
- package/dist/lib/ui/table.d.ts.map +1 -0
- package/dist/lib/ui/table.js +45 -0
- package/dist/lib/ui/table.js.map +1 -0
- package/dist/lib/ui/table.test.d.ts +2 -0
- package/dist/lib/ui/table.test.d.ts.map +1 -0
- package/dist/lib/ui/table.test.js +115 -0
- package/dist/lib/ui/table.test.js.map +1 -0
- package/dist/lib/ui/theme.d.ts +34 -0
- package/dist/lib/ui/theme.d.ts.map +1 -0
- package/dist/lib/ui/theme.js +37 -0
- package/dist/lib/ui/theme.js.map +1 -0
- package/dist/lib/ui/theme.test.d.ts +2 -0
- package/dist/lib/ui/theme.test.d.ts.map +1 -0
- package/dist/lib/ui/theme.test.js +76 -0
- package/dist/lib/ui/theme.test.js.map +1 -0
- package/dist/lib/wtconfig/environment.d.ts +18 -1
- package/dist/lib/wtconfig/environment.d.ts.map +1 -1
- package/dist/lib/wtconfig/environment.js +60 -24
- package/dist/lib/wtconfig/environment.js.map +1 -1
- package/dist/lib/wtconfig/environment.test.js +45 -1
- package/dist/lib/wtconfig/environment.test.js.map +1 -1
- package/dist/lib/wtlink/config-manifest.test.js +26 -0
- package/dist/lib/wtlink/config-manifest.test.js.map +1 -1
- package/dist/lib/wtlink/link-configs.js +7 -7
- package/dist/lib/wtlink/link-configs.js.map +1 -1
- package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -1
- package/dist/lib/wtlink/validate-manifest.js +5 -5
- package/dist/lib/wtlink/validate-manifest.js.map +1 -1
- package/dist/lib/wtstate/args.d.ts.map +1 -1
- package/dist/lib/wtstate/args.js +2 -0
- package/dist/lib/wtstate/args.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +264 -44
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/server.test.js +111 -0
- package/dist/mcp/server.test.js.map +1 -1
- package/package.json +3 -1
- package/schemas/worktreerc.schema.json +23 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Confirmation Module
|
|
3
|
+
*
|
|
4
|
+
* Provides interactive confirmation prompts for hook execution,
|
|
5
|
+
* allowing users to review, skip, or edit hooks before they run.
|
|
6
|
+
*/
|
|
7
|
+
import type { HookName, HookDefinition } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Action to take for a hook
|
|
10
|
+
*/
|
|
11
|
+
export type HookConfirmAction = 'run' | 'skip' | 'edit';
|
|
12
|
+
/**
|
|
13
|
+
* Result from hook confirmation prompt
|
|
14
|
+
*/
|
|
15
|
+
export interface HookConfirmResult {
|
|
16
|
+
/** Action user selected */
|
|
17
|
+
action: HookConfirmAction;
|
|
18
|
+
/** Modified command if user chose to edit */
|
|
19
|
+
editedCommand?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract commands from a hook definition for display
|
|
23
|
+
*/
|
|
24
|
+
export declare function getHookCommands(definition: HookDefinition): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Check if hook can be edited (simple command or complex with command property)
|
|
27
|
+
* Script-based hooks and multiple command hooks cannot be edited inline
|
|
28
|
+
*/
|
|
29
|
+
export declare function isHookEditable(definition: HookDefinition): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Check if running in an interactive environment
|
|
32
|
+
* Returns false in CI, non-TTY, or when common CI environment variables are set
|
|
33
|
+
*/
|
|
34
|
+
export declare function isInteractiveEnvironment(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Display hook details and prompt for confirmation
|
|
37
|
+
*
|
|
38
|
+
* Shows the user what the hook will do and lets them choose to:
|
|
39
|
+
* - Run the hook as-is
|
|
40
|
+
* - Skip the hook
|
|
41
|
+
* - Edit the command (if editable)
|
|
42
|
+
*/
|
|
43
|
+
export declare function promptHookConfirmation(hookName: HookName, definition: HookDefinition, cwd: string): Promise<HookConfirmResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a temporary hook definition with an edited command
|
|
46
|
+
* Used when user edits a command inline
|
|
47
|
+
*/
|
|
48
|
+
export declare function createEditedHookDefinition(original: HookDefinition, editedCommand: string): HookDefinition;
|
|
49
|
+
//# sourceMappingURL=confirmation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAqB3E;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,EAAE,CAYpE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CASlE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAclD;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,CAAC,CAwD5B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,cAAc,EACxB,aAAa,EAAE,MAAM,GACpB,cAAc,CAahB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Confirmation Module
|
|
3
|
+
*
|
|
4
|
+
* Provides interactive confirmation prompts for hook execution,
|
|
5
|
+
* allowing users to review, skip, or edit hooks before they run.
|
|
6
|
+
*/
|
|
7
|
+
import * as colors from '../colors.js';
|
|
8
|
+
import { promptChoice, promptInput } from '../prompts.js';
|
|
9
|
+
import { isSimpleHook, isMultipleHook, isComplexHook } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Environment variables that indicate a CI/CD environment.
|
|
12
|
+
* When any of these are set, interactive prompts are skipped.
|
|
13
|
+
*/
|
|
14
|
+
const CI_ENVIRONMENT_VARIABLES = [
|
|
15
|
+
'CI',
|
|
16
|
+
'GITHUB_ACTIONS',
|
|
17
|
+
'GITLAB_CI',
|
|
18
|
+
'JENKINS_URL',
|
|
19
|
+
'CIRCLECI',
|
|
20
|
+
'TRAVIS',
|
|
21
|
+
'BUILDKITE',
|
|
22
|
+
'TEAMCITY_VERSION',
|
|
23
|
+
'TF_BUILD', // Azure DevOps
|
|
24
|
+
'CODEBUILD_BUILD_ID', // AWS CodeBuild
|
|
25
|
+
'BITBUCKET_BUILD_NUMBER', // Bitbucket Pipelines
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Extract commands from a hook definition for display
|
|
29
|
+
*/
|
|
30
|
+
export function getHookCommands(definition) {
|
|
31
|
+
if (isSimpleHook(definition)) {
|
|
32
|
+
return [definition];
|
|
33
|
+
}
|
|
34
|
+
if (isMultipleHook(definition)) {
|
|
35
|
+
return definition;
|
|
36
|
+
}
|
|
37
|
+
if (isComplexHook(definition)) {
|
|
38
|
+
if (definition.command)
|
|
39
|
+
return [definition.command];
|
|
40
|
+
if (definition.script)
|
|
41
|
+
return [`[script: ${definition.script}]`];
|
|
42
|
+
}
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if hook can be edited (simple command or complex with command property)
|
|
47
|
+
* Script-based hooks and multiple command hooks cannot be edited inline
|
|
48
|
+
*/
|
|
49
|
+
export function isHookEditable(definition) {
|
|
50
|
+
if (isSimpleHook(definition)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (isComplexHook(definition)) {
|
|
54
|
+
return !!definition.command && !definition.script;
|
|
55
|
+
}
|
|
56
|
+
// Multiple commands cannot be edited inline
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if running in an interactive environment
|
|
61
|
+
* Returns false in CI, non-TTY, or when common CI environment variables are set
|
|
62
|
+
*/
|
|
63
|
+
export function isInteractiveEnvironment() {
|
|
64
|
+
// Check if stdin is a TTY
|
|
65
|
+
if (!process.stdin.isTTY) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// Check for CI environment variables
|
|
69
|
+
for (const envVar of CI_ENVIRONMENT_VARIABLES) {
|
|
70
|
+
if (process.env[envVar]) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Display hook details and prompt for confirmation
|
|
78
|
+
*
|
|
79
|
+
* Shows the user what the hook will do and lets them choose to:
|
|
80
|
+
* - Run the hook as-is
|
|
81
|
+
* - Skip the hook
|
|
82
|
+
* - Edit the command (if editable)
|
|
83
|
+
*/
|
|
84
|
+
export async function promptHookConfirmation(hookName, definition, cwd) {
|
|
85
|
+
const commands = getHookCommands(definition);
|
|
86
|
+
const canEdit = isHookEditable(definition);
|
|
87
|
+
// Display hook information
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(colors.bold(`Hook: ${hookName}`));
|
|
90
|
+
console.log(colors.dim(`Working directory: ${cwd}`));
|
|
91
|
+
console.log(colors.dim('Command(s):'));
|
|
92
|
+
for (const cmd of commands) {
|
|
93
|
+
console.log(` ${colors.cyan(cmd)}`);
|
|
94
|
+
}
|
|
95
|
+
// Show additional info for complex hooks
|
|
96
|
+
if (isComplexHook(definition)) {
|
|
97
|
+
const complex = definition;
|
|
98
|
+
if (complex.timeout) {
|
|
99
|
+
console.log(colors.dim(`Timeout: ${complex.timeout}ms`));
|
|
100
|
+
}
|
|
101
|
+
if (complex.failOnError === false) {
|
|
102
|
+
console.log(colors.dim('Non-fatal: continues on error'));
|
|
103
|
+
}
|
|
104
|
+
if (complex.if) {
|
|
105
|
+
console.log(colors.dim(`Condition: ${complex.if}`));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.log();
|
|
109
|
+
const choices = [
|
|
110
|
+
{ label: 'Run hook', value: 'run' },
|
|
111
|
+
{ label: 'Skip hook', value: 'skip' },
|
|
112
|
+
];
|
|
113
|
+
if (canEdit) {
|
|
114
|
+
choices.push({ label: 'Edit command', value: 'edit' });
|
|
115
|
+
}
|
|
116
|
+
const action = await promptChoice('How would you like to proceed?', choices);
|
|
117
|
+
// Handle edit action
|
|
118
|
+
if (action === 'edit') {
|
|
119
|
+
const originalCommand = commands[0] || '';
|
|
120
|
+
const editedCommand = await promptInput('Enter modified command:', originalCommand);
|
|
121
|
+
// Empty edit treated as skip
|
|
122
|
+
if (!editedCommand.trim()) {
|
|
123
|
+
return { action: 'skip' };
|
|
124
|
+
}
|
|
125
|
+
return { action: 'run', editedCommand: editedCommand.trim() };
|
|
126
|
+
}
|
|
127
|
+
return { action };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a temporary hook definition with an edited command
|
|
131
|
+
* Used when user edits a command inline
|
|
132
|
+
*/
|
|
133
|
+
export function createEditedHookDefinition(original, editedCommand) {
|
|
134
|
+
if (isSimpleHook(original)) {
|
|
135
|
+
return editedCommand;
|
|
136
|
+
}
|
|
137
|
+
if (isComplexHook(original)) {
|
|
138
|
+
return {
|
|
139
|
+
...original,
|
|
140
|
+
command: editedCommand,
|
|
141
|
+
script: undefined, // Clear script if present
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// For multiple hooks, replace with single edited command
|
|
145
|
+
return editedCommand;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=confirmation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.test.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook Confirmation Module Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the hook confirmation prompts and utilities.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { getHookCommands, isHookEditable, isInteractiveEnvironment, createEditedHookDefinition, promptHookConfirmation, } from './confirmation.js';
|
|
8
|
+
// Mock colors to avoid ANSI codes in tests
|
|
9
|
+
vi.mock('../colors.js', () => ({
|
|
10
|
+
dim: (s) => s,
|
|
11
|
+
bold: (s) => s,
|
|
12
|
+
cyan: (s) => s,
|
|
13
|
+
error: (s) => s,
|
|
14
|
+
warning: (s) => s,
|
|
15
|
+
info: (s) => s,
|
|
16
|
+
success: (s) => s,
|
|
17
|
+
}));
|
|
18
|
+
// Mock prompts module
|
|
19
|
+
const mockPromptChoice = vi.fn();
|
|
20
|
+
const mockPromptInput = vi.fn();
|
|
21
|
+
vi.mock('../prompts.js', () => ({
|
|
22
|
+
promptChoice: (...args) => mockPromptChoice(...args),
|
|
23
|
+
promptInput: (...args) => mockPromptInput(...args),
|
|
24
|
+
}));
|
|
25
|
+
describe('getHookCommands', () => {
|
|
26
|
+
it('extracts command from simple string hook', () => {
|
|
27
|
+
const definition = 'npm install';
|
|
28
|
+
const commands = getHookCommands(definition);
|
|
29
|
+
expect(commands).toEqual(['npm install']);
|
|
30
|
+
});
|
|
31
|
+
it('extracts commands from array hook', () => {
|
|
32
|
+
const definition = ['npm install', 'npm run build'];
|
|
33
|
+
const commands = getHookCommands(definition);
|
|
34
|
+
expect(commands).toEqual(['npm install', 'npm run build']);
|
|
35
|
+
});
|
|
36
|
+
it('extracts command from complex hook with command property', () => {
|
|
37
|
+
const definition = {
|
|
38
|
+
command: 'npm test',
|
|
39
|
+
timeout: 60000,
|
|
40
|
+
};
|
|
41
|
+
const commands = getHookCommands(definition);
|
|
42
|
+
expect(commands).toEqual(['npm test']);
|
|
43
|
+
});
|
|
44
|
+
it('extracts script from complex hook with script property', () => {
|
|
45
|
+
const definition = {
|
|
46
|
+
script: './scripts/setup.sh',
|
|
47
|
+
};
|
|
48
|
+
const commands = getHookCommands(definition);
|
|
49
|
+
expect(commands).toEqual(['[script: ./scripts/setup.sh]']);
|
|
50
|
+
});
|
|
51
|
+
it('returns empty array for complex hook without command or script', () => {
|
|
52
|
+
const definition = {
|
|
53
|
+
timeout: 30000,
|
|
54
|
+
};
|
|
55
|
+
const commands = getHookCommands(definition);
|
|
56
|
+
expect(commands).toEqual([]);
|
|
57
|
+
});
|
|
58
|
+
it('returns empty array for empty object', () => {
|
|
59
|
+
const definition = {};
|
|
60
|
+
const commands = getHookCommands(definition);
|
|
61
|
+
expect(commands).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('isHookEditable', () => {
|
|
65
|
+
it('returns true for simple string hook', () => {
|
|
66
|
+
const definition = 'npm install';
|
|
67
|
+
expect(isHookEditable(definition)).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('returns false for array hook', () => {
|
|
70
|
+
const definition = ['npm install', 'npm run build'];
|
|
71
|
+
expect(isHookEditable(definition)).toBe(false);
|
|
72
|
+
});
|
|
73
|
+
it('returns true for complex hook with command only', () => {
|
|
74
|
+
const definition = {
|
|
75
|
+
command: 'npm test',
|
|
76
|
+
};
|
|
77
|
+
expect(isHookEditable(definition)).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('returns false for complex hook with script', () => {
|
|
80
|
+
const definition = {
|
|
81
|
+
script: './scripts/setup.sh',
|
|
82
|
+
};
|
|
83
|
+
expect(isHookEditable(definition)).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('returns false for complex hook with both command and script', () => {
|
|
86
|
+
const definition = {
|
|
87
|
+
command: 'npm test',
|
|
88
|
+
script: './scripts/setup.sh',
|
|
89
|
+
};
|
|
90
|
+
expect(isHookEditable(definition)).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
it('returns false for empty complex hook', () => {
|
|
93
|
+
const definition = {};
|
|
94
|
+
expect(isHookEditable(definition)).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('isInteractiveEnvironment', () => {
|
|
98
|
+
const originalIsTTY = process.stdin.isTTY;
|
|
99
|
+
const originalEnv = { ...process.env };
|
|
100
|
+
beforeEach(() => {
|
|
101
|
+
// Reset environment variables
|
|
102
|
+
delete process.env.CI;
|
|
103
|
+
delete process.env.GITHUB_ACTIONS;
|
|
104
|
+
delete process.env.GITLAB_CI;
|
|
105
|
+
delete process.env.JENKINS_URL;
|
|
106
|
+
delete process.env.CIRCLECI;
|
|
107
|
+
delete process.env.TRAVIS;
|
|
108
|
+
delete process.env.BUILDKITE;
|
|
109
|
+
delete process.env.TEAMCITY_VERSION;
|
|
110
|
+
delete process.env.TF_BUILD;
|
|
111
|
+
});
|
|
112
|
+
afterEach(() => {
|
|
113
|
+
// Restore original state
|
|
114
|
+
Object.defineProperty(process.stdin, 'isTTY', {
|
|
115
|
+
value: originalIsTTY,
|
|
116
|
+
writable: true,
|
|
117
|
+
});
|
|
118
|
+
process.env = { ...originalEnv };
|
|
119
|
+
});
|
|
120
|
+
it('returns false when stdin is not a TTY', () => {
|
|
121
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: false, writable: true });
|
|
122
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
123
|
+
});
|
|
124
|
+
it('returns false when CI environment variable is set', () => {
|
|
125
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
126
|
+
process.env.CI = 'true';
|
|
127
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
it('returns false when GITHUB_ACTIONS is set', () => {
|
|
130
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
131
|
+
process.env.GITHUB_ACTIONS = 'true';
|
|
132
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
it('returns false when GITLAB_CI is set', () => {
|
|
135
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
136
|
+
process.env.GITLAB_CI = 'true';
|
|
137
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('returns false when JENKINS_URL is set', () => {
|
|
140
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
141
|
+
process.env.JENKINS_URL = 'http://jenkins.example.com';
|
|
142
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
it('returns false when CIRCLECI is set', () => {
|
|
145
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
146
|
+
process.env.CIRCLECI = 'true';
|
|
147
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
it('returns false when TRAVIS is set', () => {
|
|
150
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
151
|
+
process.env.TRAVIS = 'true';
|
|
152
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
it('returns false when BUILDKITE is set', () => {
|
|
155
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
156
|
+
process.env.BUILDKITE = 'true';
|
|
157
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
158
|
+
});
|
|
159
|
+
it('returns false when TEAMCITY_VERSION is set', () => {
|
|
160
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
161
|
+
process.env.TEAMCITY_VERSION = '2023.1';
|
|
162
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
it('returns false when TF_BUILD is set (Azure DevOps)', () => {
|
|
165
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
166
|
+
process.env.TF_BUILD = 'True';
|
|
167
|
+
expect(isInteractiveEnvironment()).toBe(false);
|
|
168
|
+
});
|
|
169
|
+
it('returns true when TTY is available and no CI variables set', () => {
|
|
170
|
+
Object.defineProperty(process.stdin, 'isTTY', { value: true, writable: true });
|
|
171
|
+
// All CI env vars should be cleared by beforeEach
|
|
172
|
+
expect(isInteractiveEnvironment()).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('createEditedHookDefinition', () => {
|
|
176
|
+
it('replaces simple string hook with edited command', () => {
|
|
177
|
+
const original = 'npm install';
|
|
178
|
+
const result = createEditedHookDefinition(original, 'npm ci');
|
|
179
|
+
expect(result).toBe('npm ci');
|
|
180
|
+
});
|
|
181
|
+
it('replaces command in complex hook', () => {
|
|
182
|
+
const original = {
|
|
183
|
+
command: 'npm install',
|
|
184
|
+
timeout: 60000,
|
|
185
|
+
failOnError: false,
|
|
186
|
+
};
|
|
187
|
+
const result = createEditedHookDefinition(original, 'npm ci');
|
|
188
|
+
expect(result).toEqual({
|
|
189
|
+
command: 'npm ci',
|
|
190
|
+
timeout: 60000,
|
|
191
|
+
failOnError: false,
|
|
192
|
+
script: undefined,
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
it('clears script property when editing complex hook', () => {
|
|
196
|
+
const original = {
|
|
197
|
+
script: './setup.sh',
|
|
198
|
+
timeout: 30000,
|
|
199
|
+
};
|
|
200
|
+
const result = createEditedHookDefinition(original, 'bash ./setup.sh --force');
|
|
201
|
+
expect(result).toEqual({
|
|
202
|
+
script: undefined,
|
|
203
|
+
timeout: 30000,
|
|
204
|
+
command: 'bash ./setup.sh --force',
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
it('replaces array hook with single edited command', () => {
|
|
208
|
+
const original = ['npm install', 'npm run build'];
|
|
209
|
+
const result = createEditedHookDefinition(original, 'npm ci && npm run build');
|
|
210
|
+
expect(result).toBe('npm ci && npm run build');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe('promptHookConfirmation', () => {
|
|
214
|
+
let consoleSpy;
|
|
215
|
+
beforeEach(() => {
|
|
216
|
+
vi.clearAllMocks();
|
|
217
|
+
consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
218
|
+
});
|
|
219
|
+
afterEach(() => {
|
|
220
|
+
consoleSpy.mockRestore();
|
|
221
|
+
});
|
|
222
|
+
it('returns run action when user selects Run hook', async () => {
|
|
223
|
+
mockPromptChoice.mockResolvedValue('run');
|
|
224
|
+
const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
225
|
+
expect(result).toEqual({ action: 'run' });
|
|
226
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Hook: post-worktree'));
|
|
227
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Working directory:'));
|
|
228
|
+
});
|
|
229
|
+
it('returns skip action when user selects Skip hook', async () => {
|
|
230
|
+
mockPromptChoice.mockResolvedValue('skip');
|
|
231
|
+
const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
232
|
+
expect(result).toEqual({ action: 'skip' });
|
|
233
|
+
});
|
|
234
|
+
it('returns run with edited command when user edits', async () => {
|
|
235
|
+
mockPromptChoice.mockResolvedValue('edit');
|
|
236
|
+
mockPromptInput.mockResolvedValue('npm ci --legacy-peer-deps');
|
|
237
|
+
const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
238
|
+
expect(result).toEqual({
|
|
239
|
+
action: 'run',
|
|
240
|
+
editedCommand: 'npm ci --legacy-peer-deps',
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
it('returns skip when edited command is empty', async () => {
|
|
244
|
+
mockPromptChoice.mockResolvedValue('edit');
|
|
245
|
+
mockPromptInput.mockResolvedValue(' ');
|
|
246
|
+
const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
247
|
+
expect(result).toEqual({ action: 'skip' });
|
|
248
|
+
});
|
|
249
|
+
it('trims edited command whitespace', async () => {
|
|
250
|
+
mockPromptChoice.mockResolvedValue('edit');
|
|
251
|
+
mockPromptInput.mockResolvedValue(' npm ci ');
|
|
252
|
+
const result = await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
253
|
+
expect(result).toEqual({
|
|
254
|
+
action: 'run',
|
|
255
|
+
editedCommand: 'npm ci',
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
it('displays complex hook details', async () => {
|
|
259
|
+
mockPromptChoice.mockResolvedValue('run');
|
|
260
|
+
const complexHook = {
|
|
261
|
+
command: 'npm install',
|
|
262
|
+
timeout: 120000,
|
|
263
|
+
failOnError: false,
|
|
264
|
+
if: 'exists:package.json',
|
|
265
|
+
};
|
|
266
|
+
await promptHookConfirmation('post-worktree', complexHook, '/path/to/worktree');
|
|
267
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Timeout:'));
|
|
268
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Non-fatal:'));
|
|
269
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Condition:'));
|
|
270
|
+
});
|
|
271
|
+
it('does not offer edit option for non-editable hooks', async () => {
|
|
272
|
+
mockPromptChoice.mockResolvedValue('run');
|
|
273
|
+
const scriptHook = {
|
|
274
|
+
script: './setup.sh',
|
|
275
|
+
};
|
|
276
|
+
await promptHookConfirmation('post-worktree', scriptHook, '/path/to/worktree');
|
|
277
|
+
// Check that promptChoice was called with only run and skip options
|
|
278
|
+
expect(mockPromptChoice).toHaveBeenCalledWith(expect.any(String), expect.arrayContaining([
|
|
279
|
+
expect.objectContaining({ value: 'run' }),
|
|
280
|
+
expect.objectContaining({ value: 'skip' }),
|
|
281
|
+
]));
|
|
282
|
+
// Verify no edit option was included
|
|
283
|
+
const choices = mockPromptChoice.mock.calls[0][1];
|
|
284
|
+
expect(choices.find((c) => c.value === 'edit')).toBeUndefined();
|
|
285
|
+
});
|
|
286
|
+
it('offers edit option for editable hooks', async () => {
|
|
287
|
+
mockPromptChoice.mockResolvedValue('run');
|
|
288
|
+
await promptHookConfirmation('post-worktree', 'npm install', '/path/to/worktree');
|
|
289
|
+
// Verify edit option was included
|
|
290
|
+
const choices = mockPromptChoice.mock.calls[0][1];
|
|
291
|
+
expect(choices.find((c) => c.value === 'edit')).toBeDefined();
|
|
292
|
+
});
|
|
293
|
+
it('displays array of commands', async () => {
|
|
294
|
+
mockPromptChoice.mockResolvedValue('skip');
|
|
295
|
+
await promptHookConfirmation('post-worktree', ['npm install', 'npm run build'], '/path');
|
|
296
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('npm install'));
|
|
297
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('npm run build'));
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
//# sourceMappingURL=confirmation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirmation.test.js","sourceRoot":"","sources":["../../../src/lib/hooks/confirmation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,22 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Executes lifecycle hooks with proper context and error handling.
|
|
5
5
|
*/
|
|
6
|
-
import type { HookName, HookContext, HookResult, HookExecutorOptions, HooksConfig } from './types.js';
|
|
6
|
+
import type { HookName, HookDefinition, HookContext, HookResult, HookExecutorOptions, HooksConfig } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve the working directory for a hook
|
|
9
|
+
*
|
|
10
|
+
* Priority:
|
|
11
|
+
* 1. Explicit cwd in complex hook definition (with template expansion)
|
|
12
|
+
* 2. Smart default for WORKTREE_CWD_HOOKS when worktreePath is available
|
|
13
|
+
* 3. Fallback to executor options cwd or context repoRoot
|
|
14
|
+
*
|
|
15
|
+
* @param hookName - The hook being executed
|
|
16
|
+
* @param definition - The hook definition
|
|
17
|
+
* @param context - The hook execution context
|
|
18
|
+
* @param options - The executor options
|
|
19
|
+
* @returns The resolved working directory path
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveHookCwd(hookName: HookName, definition: HookDefinition, context: HookContext, options: HookExecutorOptions): string;
|
|
7
22
|
/**
|
|
8
23
|
* Hook executor class for managing hook execution
|
|
9
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAiKpB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,mBAAmB,GAC3B,MAAM,CAiBR;AAuPD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAsB;gBAEzB,MAAM,GAAE,WAAgB,EAAE,OAAO,GAAE,mBAAwB;IAKvE;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIpC;;OAEG;IACH,kBAAkB,IAAI,QAAQ,EAAE;IAIhC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BhF;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAevF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,GAAE,WAAgB,EACxB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CAEd"}
|