@bretwardjames/ghp-cli 0.6.0 → 0.7.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 +25 -12
- package/dist/commands/add-issue.d.ts.map +1 -1
- package/dist/commands/add-issue.js +16 -12
- package/dist/commands/add-issue.js.map +1 -1
- package/dist/commands/add-issue.test.d.ts +5 -0
- package/dist/commands/add-issue.test.d.ts.map +1 -0
- package/dist/commands/add-issue.test.js +237 -0
- package/dist/commands/add-issue.test.js.map +1 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +10 -6
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/assign.d.ts.map +1 -1
- package/dist/commands/assign.js +5 -4
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +2 -1
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/comment.d.ts.map +1 -1
- package/dist/commands/comment.js +6 -5
- package/dist/commands/comment.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -5
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard-hooks.d.ts.map +1 -1
- package/dist/commands/dashboard-hooks.js +9 -8
- package/dist/commands/dashboard-hooks.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +6 -2
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/done.d.ts.map +1 -1
- package/dist/commands/done.js +32 -11
- package/dist/commands/done.js.map +1 -1
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +7 -6
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/event-hooks.d.ts.map +1 -1
- package/dist/commands/event-hooks.js +12 -11
- package/dist/commands/event-hooks.js.map +1 -1
- package/dist/commands/install-commands.d.ts.map +1 -1
- package/dist/commands/install-commands.js +2 -1
- package/dist/commands/install-commands.js.map +1 -1
- package/dist/commands/label.d.ts.map +1 -1
- package/dist/commands/label.js +6 -5
- package/dist/commands/label.js.map +1 -1
- package/dist/commands/link-branch.d.ts.map +1 -1
- package/dist/commands/link-branch.js +7 -6
- package/dist/commands/link-branch.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +4 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/merge.d.ts.map +1 -1
- package/dist/commands/merge.js +22 -11
- package/dist/commands/merge.js.map +1 -1
- package/dist/commands/move.d.ts.map +1 -1
- package/dist/commands/move.js +8 -7
- package/dist/commands/move.js.map +1 -1
- package/dist/commands/open.d.ts.map +1 -1
- package/dist/commands/open.js +17 -9
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/plan-epic.d.ts.map +1 -1
- package/dist/commands/plan-epic.js +9 -8
- package/dist/commands/plan-epic.js.map +1 -1
- package/dist/commands/plan.d.ts +17 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +27 -15
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +13 -10
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/progress.d.ts.map +1 -1
- package/dist/commands/progress.js +5 -4
- package/dist/commands/progress.js.map +1 -1
- package/dist/commands/set-field.d.ts.map +1 -1
- package/dist/commands/set-field.js +13 -12
- package/dist/commands/set-field.js.map +1 -1
- package/dist/commands/set-parent.d.ts.map +1 -1
- package/dist/commands/set-parent.js +10 -9
- package/dist/commands/set-parent.js.map +1 -1
- package/dist/commands/slice.d.ts.map +1 -1
- package/dist/commands/slice.js +3 -2
- package/dist/commands/slice.js.map +1 -1
- package/dist/commands/start.d.ts +2 -5
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +44 -27
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/start.test.d.ts +5 -0
- package/dist/commands/start.test.d.ts.map +1 -0
- package/dist/commands/start.test.js +296 -0
- package/dist/commands/start.test.js.map +1 -0
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +30 -8
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/switch.d.ts.map +1 -1
- package/dist/commands/switch.js +11 -7
- package/dist/commands/switch.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +3 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/unlink-branch.d.ts.map +1 -1
- package/dist/commands/unlink-branch.js +5 -4
- package/dist/commands/unlink-branch.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +25 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +25 -10
- package/dist/commands/work.js.map +1 -1
- package/dist/commands/worktree.d.ts.map +1 -1
- package/dist/commands/worktree.js +10 -6
- package/dist/commands/worktree.js.map +1 -1
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +38 -11
- package/dist/config.js.map +1 -1
- package/dist/config.test.d.ts +5 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +221 -0
- package/dist/config.test.js.map +1 -0
- package/dist/exit.d.ts +49 -0
- package/dist/exit.d.ts.map +1 -0
- package/dist/exit.js +142 -0
- package/dist/exit.js.map +1 -0
- package/dist/exit.test.d.ts +5 -0
- package/dist/exit.test.d.ts.map +1 -0
- package/dist/exit.test.js +241 -0
- package/dist/exit.test.js.map +1 -0
- package/dist/git-utils.d.ts +1 -1
- package/dist/git-utils.d.ts.map +1 -1
- package/dist/git-utils.js +3 -1
- package/dist/git-utils.js.map +1 -1
- package/dist/github-api.d.ts.map +1 -1
- package/dist/github-api.js +2 -1
- package/dist/github-api.js.map +1 -1
- package/dist/index.js +14 -14
- package/dist/index.js.map +1 -1
- package/dist/validation.d.ts +94 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +169 -0
- package/dist/validation.js.map +1 -0
- package/dist/validation.test.d.ts +5 -0
- package/dist/validation.test.d.ts.map +1 -0
- package/dist/validation.test.js +230 -0
- package/dist/validation.test.js.map +1 -0
- package/dist/worktree-utils.d.ts.map +1 -1
- package/dist/worktree-utils.js +6 -2
- package/dist/worktree-utils.js.map +1 -1
- package/package.json +7 -4
- package/slash-commands/claude/create-pr.md +25 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Flag Validation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides validation functions for CLI flags that accept specific values.
|
|
5
|
+
* Used to provide clear error messages when invalid values are provided.
|
|
6
|
+
*
|
|
7
|
+
* ## Usage
|
|
8
|
+
*
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { validateEnum, validateMutualExclusion, validatePositiveNumber } from './validation.js';
|
|
11
|
+
*
|
|
12
|
+
* // In command handler:
|
|
13
|
+
* validateEnum(options.branchAction, BRANCH_ACTIONS, '--branch-action');
|
|
14
|
+
* validateMutualExclusion(['--squash', '--rebase'], [options.squash, options.rebase]);
|
|
15
|
+
* validatePositiveNumber(options.timeout, '--timeout');
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { exit } from './exit.js';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Valid Values
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/** Valid values for --branch-action flag in start command */
|
|
24
|
+
export const BRANCH_ACTIONS = ['create', 'link', 'skip'];
|
|
25
|
+
/** Valid values for --assign flag (action mode) in start command */
|
|
26
|
+
export const ASSIGN_ACTIONS = ['reassign', 'add', 'skip'];
|
|
27
|
+
/** Valid values for --group flag in work/plan commands */
|
|
28
|
+
export const GROUP_FIELDS = ['status', 'type', 'assignee', 'priority', 'size', 'labels'];
|
|
29
|
+
/** Valid values for --mode flag in event hooks */
|
|
30
|
+
export const HOOK_MODES = ['fire-and-forget', 'blocking', 'interactive'];
|
|
31
|
+
/**
|
|
32
|
+
* Note: HOOK_MODES is defined here for documentation but validation is handled
|
|
33
|
+
* by getValidModes() from @bretwardjames/ghp-core in event-hooks.ts.
|
|
34
|
+
* Terminal modes are validated via mutual exclusion of --nvim/--claude/--terminal-only flags.
|
|
35
|
+
*/
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Validation Functions
|
|
38
|
+
// =============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Validate that a value is one of the allowed options.
|
|
41
|
+
* Exits with helpful error message if invalid.
|
|
42
|
+
*
|
|
43
|
+
* @param value - The value to validate (may be undefined)
|
|
44
|
+
* @param allowed - Array of valid values
|
|
45
|
+
* @param flagName - Name of the flag (for error messages)
|
|
46
|
+
* @param exitOnError - Whether to exit on error (default: true)
|
|
47
|
+
* @returns true if valid, false if invalid (only when exitOnError is false)
|
|
48
|
+
*/
|
|
49
|
+
export function validateEnum(value, allowed, flagName, exitOnError = true) {
|
|
50
|
+
if (value === undefined) {
|
|
51
|
+
return true; // undefined is valid (flag not provided)
|
|
52
|
+
}
|
|
53
|
+
if (!allowed.includes(value)) {
|
|
54
|
+
console.error(chalk.red('Error:'), `Invalid value for ${flagName}: "${value}"`);
|
|
55
|
+
console.log('Valid values:', allowed.join(', '));
|
|
56
|
+
if (exitOnError) {
|
|
57
|
+
exit(1);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate that mutually exclusive flags aren't used together.
|
|
65
|
+
* Exits with helpful error message if multiple are set.
|
|
66
|
+
*
|
|
67
|
+
* @param flagNames - Names of the mutually exclusive flags
|
|
68
|
+
* @param flagValues - Corresponding values (truthy means flag is set)
|
|
69
|
+
* @param exitOnError - Whether to exit on error (default: true)
|
|
70
|
+
* @returns true if valid, false if invalid (only when exitOnError is false)
|
|
71
|
+
*/
|
|
72
|
+
export function validateMutualExclusion(flagNames, flagValues, exitOnError = true) {
|
|
73
|
+
const setFlags = flagNames.filter((_, i) => flagValues[i]);
|
|
74
|
+
if (setFlags.length > 1) {
|
|
75
|
+
console.error(chalk.red('Error:'), `Flags ${setFlags.join(' and ')} cannot be used together`);
|
|
76
|
+
console.log('These flags are mutually exclusive. Use only one.');
|
|
77
|
+
if (exitOnError) {
|
|
78
|
+
exit(1);
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate that a numeric value is positive.
|
|
86
|
+
* Exits with helpful error message if invalid.
|
|
87
|
+
*
|
|
88
|
+
* @param value - The value to validate (may be undefined or string)
|
|
89
|
+
* @param flagName - Name of the flag (for error messages)
|
|
90
|
+
* @param min - Minimum allowed value (default: 1)
|
|
91
|
+
* @param max - Maximum allowed value (optional)
|
|
92
|
+
* @param exitOnError - Whether to exit on error (default: true)
|
|
93
|
+
* @returns The parsed number if valid, undefined if not provided
|
|
94
|
+
*/
|
|
95
|
+
export function validatePositiveNumber(value, flagName, min = 1, max, exitOnError = true) {
|
|
96
|
+
if (value === undefined) {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
const num = typeof value === 'string' ? parseInt(value, 10) : value;
|
|
100
|
+
if (isNaN(num)) {
|
|
101
|
+
console.error(chalk.red('Error:'), `${flagName} must be a number`);
|
|
102
|
+
if (exitOnError) {
|
|
103
|
+
exit(1);
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
if (num < min) {
|
|
108
|
+
console.error(chalk.red('Error:'), `${flagName} must be at least ${min}`);
|
|
109
|
+
if (exitOnError) {
|
|
110
|
+
exit(1);
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
if (max !== undefined && num > max) {
|
|
115
|
+
console.error(chalk.red('Error:'), `${flagName} must be at most ${max}`);
|
|
116
|
+
if (exitOnError) {
|
|
117
|
+
exit(1);
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return num;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate that a required value is provided.
|
|
125
|
+
* Exits with helpful error message if missing.
|
|
126
|
+
*
|
|
127
|
+
* @param value - The value to check
|
|
128
|
+
* @param flagName - Name of the flag (for error messages)
|
|
129
|
+
* @param exitOnError - Whether to exit on error (default: true)
|
|
130
|
+
* @returns true if valid, false if missing (only when exitOnError is false)
|
|
131
|
+
*/
|
|
132
|
+
export function validateRequired(value, flagName, exitOnError = true) {
|
|
133
|
+
if (value === undefined || value === null || value === '') {
|
|
134
|
+
console.error(chalk.red('Error:'), `${flagName} is required`);
|
|
135
|
+
if (exitOnError) {
|
|
136
|
+
exit(1);
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a commander argParser that validates enum values.
|
|
144
|
+
* Use this with .argParser() to validate during option parsing.
|
|
145
|
+
*
|
|
146
|
+
* @param allowed - Array of valid values
|
|
147
|
+
* @param flagName - Name of the flag (for error messages)
|
|
148
|
+
* @returns A parser function for commander
|
|
149
|
+
*/
|
|
150
|
+
export function enumArgParser(allowed, flagName) {
|
|
151
|
+
return (value) => {
|
|
152
|
+
if (!allowed.includes(value)) {
|
|
153
|
+
console.error(chalk.red('Error:'), `Invalid value for ${flagName}: "${value}"`);
|
|
154
|
+
console.log('Valid values:', allowed.join(', '));
|
|
155
|
+
exit(1);
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Print a deprecation warning for a renamed flag.
|
|
162
|
+
*
|
|
163
|
+
* @param oldFlag - The deprecated flag name
|
|
164
|
+
* @param newFlag - The new flag name to use
|
|
165
|
+
*/
|
|
166
|
+
export function warnDeprecatedFlag(oldFlag, newFlag) {
|
|
167
|
+
console.warn(chalk.yellow('Warning:'), `${oldFlag} is deprecated, use ${newFlag} instead`);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.d.ts","sourceRoot":"","sources":["../src/validation.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for CLI flag validation utilities
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { validateEnum, validateMutualExclusion, validatePositiveNumber, validateRequired, enumArgParser, warnDeprecatedFlag, BRANCH_ACTIONS, ASSIGN_ACTIONS, GROUP_FIELDS, HOOK_MODES, } from './validation.js';
|
|
6
|
+
// Mock the exit function to throw instead of exiting
|
|
7
|
+
vi.mock('./exit.js', () => ({
|
|
8
|
+
exit: vi.fn((code) => {
|
|
9
|
+
throw new Error(`exit(${code})`);
|
|
10
|
+
}),
|
|
11
|
+
}));
|
|
12
|
+
// Capture console output
|
|
13
|
+
let consoleOutput = [];
|
|
14
|
+
const originalConsoleError = console.error;
|
|
15
|
+
const originalConsoleLog = console.log;
|
|
16
|
+
const originalConsoleWarn = console.warn;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
consoleOutput = [];
|
|
19
|
+
console.error = vi.fn((...args) => {
|
|
20
|
+
consoleOutput.push(args.join(' '));
|
|
21
|
+
});
|
|
22
|
+
console.log = vi.fn((...args) => {
|
|
23
|
+
consoleOutput.push(args.join(' '));
|
|
24
|
+
});
|
|
25
|
+
console.warn = vi.fn((...args) => {
|
|
26
|
+
consoleOutput.push(args.join(' '));
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
console.error = originalConsoleError;
|
|
31
|
+
console.log = originalConsoleLog;
|
|
32
|
+
console.warn = originalConsoleWarn;
|
|
33
|
+
vi.clearAllMocks();
|
|
34
|
+
});
|
|
35
|
+
// =============================================================================
|
|
36
|
+
// validateEnum tests
|
|
37
|
+
// =============================================================================
|
|
38
|
+
describe('validateEnum', () => {
|
|
39
|
+
it('should return true for undefined value (flag not provided)', () => {
|
|
40
|
+
expect(validateEnum(undefined, BRANCH_ACTIONS, '--branch-action')).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
it('should return true for valid enum value', () => {
|
|
43
|
+
expect(validateEnum('create', BRANCH_ACTIONS, '--branch-action')).toBe(true);
|
|
44
|
+
expect(validateEnum('link', BRANCH_ACTIONS, '--branch-action')).toBe(true);
|
|
45
|
+
expect(validateEnum('skip', BRANCH_ACTIONS, '--branch-action')).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it('should exit with error for invalid enum value', () => {
|
|
48
|
+
expect(() => {
|
|
49
|
+
validateEnum('invalid', BRANCH_ACTIONS, '--branch-action');
|
|
50
|
+
}).toThrow('exit(1)');
|
|
51
|
+
expect(consoleOutput.some(line => line.includes('Invalid value for --branch-action'))).toBe(true);
|
|
52
|
+
expect(consoleOutput.some(line => line.includes('create, link, skip'))).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
it('should return false for invalid value when exitOnError is false', () => {
|
|
55
|
+
const result = validateEnum('invalid', BRANCH_ACTIONS, '--branch-action', false);
|
|
56
|
+
expect(result).toBe(false);
|
|
57
|
+
expect(consoleOutput.some(line => line.includes('Invalid value'))).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it('should validate all ASSIGN_ACTIONS', () => {
|
|
60
|
+
for (const action of ASSIGN_ACTIONS) {
|
|
61
|
+
expect(validateEnum(action, ASSIGN_ACTIONS, '--assign')).toBe(true);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
it('should validate all GROUP_FIELDS', () => {
|
|
65
|
+
for (const field of GROUP_FIELDS) {
|
|
66
|
+
expect(validateEnum(field, GROUP_FIELDS, '--group')).toBe(true);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
it('should validate all HOOK_MODES', () => {
|
|
70
|
+
for (const mode of HOOK_MODES) {
|
|
71
|
+
expect(validateEnum(mode, HOOK_MODES, '--mode')).toBe(true);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// validateMutualExclusion tests
|
|
77
|
+
// =============================================================================
|
|
78
|
+
describe('validateMutualExclusion', () => {
|
|
79
|
+
it('should return true when no flags are set', () => {
|
|
80
|
+
const result = validateMutualExclusion(['--squash', '--rebase'], [undefined, undefined]);
|
|
81
|
+
expect(result).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it('should return true when only one flag is set', () => {
|
|
84
|
+
const result = validateMutualExclusion(['--squash', '--rebase'], [true, undefined]);
|
|
85
|
+
expect(result).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('should exit with error when multiple flags are set', () => {
|
|
88
|
+
expect(() => {
|
|
89
|
+
validateMutualExclusion(['--squash', '--rebase'], [true, true]);
|
|
90
|
+
}).toThrow('exit(1)');
|
|
91
|
+
expect(consoleOutput.some(line => line.includes('--squash and --rebase cannot be used together'))).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
it('should return false when multiple flags are set and exitOnError is false', () => {
|
|
94
|
+
const result = validateMutualExclusion(['--squash', '--rebase'], [true, true], false);
|
|
95
|
+
expect(result).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('should handle three mutually exclusive flags', () => {
|
|
98
|
+
// Only one set - valid
|
|
99
|
+
expect(validateMutualExclusion(['--nvim', '--claude', '--terminal-only'], [true, undefined, undefined])).toBe(true);
|
|
100
|
+
// Two set - invalid
|
|
101
|
+
expect(() => {
|
|
102
|
+
validateMutualExclusion(['--nvim', '--claude', '--terminal-only'], [true, true, undefined]);
|
|
103
|
+
}).toThrow('exit(1)');
|
|
104
|
+
// All three set - invalid
|
|
105
|
+
expect(() => {
|
|
106
|
+
validateMutualExclusion(['--nvim', '--claude', '--terminal-only'], [true, true, true]);
|
|
107
|
+
}).toThrow('exit(1)');
|
|
108
|
+
});
|
|
109
|
+
it('should treat string values as truthy', () => {
|
|
110
|
+
expect(() => {
|
|
111
|
+
validateMutualExclusion(['--flag1', '--flag2'], ['value1', 'value2']);
|
|
112
|
+
}).toThrow('exit(1)');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// =============================================================================
|
|
116
|
+
// validatePositiveNumber tests
|
|
117
|
+
// =============================================================================
|
|
118
|
+
describe('validatePositiveNumber', () => {
|
|
119
|
+
it('should return undefined for undefined value', () => {
|
|
120
|
+
expect(validatePositiveNumber(undefined, '--timeout')).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
it('should return parsed number for valid string', () => {
|
|
123
|
+
expect(validatePositiveNumber('5000', '--timeout')).toBe(5000);
|
|
124
|
+
});
|
|
125
|
+
it('should return number for valid number', () => {
|
|
126
|
+
expect(validatePositiveNumber(5000, '--timeout')).toBe(5000);
|
|
127
|
+
});
|
|
128
|
+
it('should exit with error for non-numeric string', () => {
|
|
129
|
+
expect(() => {
|
|
130
|
+
validatePositiveNumber('abc', '--timeout');
|
|
131
|
+
}).toThrow('exit(1)');
|
|
132
|
+
expect(consoleOutput.some(line => line.includes('--timeout must be a number'))).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
it('should exit with error for number below minimum', () => {
|
|
135
|
+
expect(() => {
|
|
136
|
+
validatePositiveNumber(0, '--timeout', 1);
|
|
137
|
+
}).toThrow('exit(1)');
|
|
138
|
+
expect(consoleOutput.some(line => line.includes('--timeout must be at least 1'))).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
it('should exit with error for number above maximum', () => {
|
|
141
|
+
expect(() => {
|
|
142
|
+
validatePositiveNumber(200000, '--max-diff-lines', 1, 100000);
|
|
143
|
+
}).toThrow('exit(1)');
|
|
144
|
+
expect(consoleOutput.some(line => line.includes('--max-diff-lines must be at most 100000'))).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
it('should accept number at boundary', () => {
|
|
147
|
+
expect(validatePositiveNumber(1, '--timeout', 1)).toBe(1);
|
|
148
|
+
expect(validatePositiveNumber(100000, '--max-diff-lines', 1, 100000)).toBe(100000);
|
|
149
|
+
});
|
|
150
|
+
it('should return undefined for invalid value when exitOnError is false', () => {
|
|
151
|
+
const result = validatePositiveNumber('abc', '--timeout', 1, undefined, false);
|
|
152
|
+
expect(result).toBeUndefined();
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
// =============================================================================
|
|
156
|
+
// validateRequired tests
|
|
157
|
+
// =============================================================================
|
|
158
|
+
describe('validateRequired', () => {
|
|
159
|
+
it('should return true for truthy values', () => {
|
|
160
|
+
expect(validateRequired('value', '--flag')).toBe(true);
|
|
161
|
+
expect(validateRequired(123, '--flag')).toBe(true);
|
|
162
|
+
expect(validateRequired(['item'], '--flag')).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it('should exit with error for undefined', () => {
|
|
165
|
+
expect(() => {
|
|
166
|
+
validateRequired(undefined, '--flag');
|
|
167
|
+
}).toThrow('exit(1)');
|
|
168
|
+
expect(consoleOutput.some(line => line.includes('--flag is required'))).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
it('should exit with error for null', () => {
|
|
171
|
+
expect(() => {
|
|
172
|
+
validateRequired(null, '--flag');
|
|
173
|
+
}).toThrow('exit(1)');
|
|
174
|
+
});
|
|
175
|
+
it('should exit with error for empty string', () => {
|
|
176
|
+
expect(() => {
|
|
177
|
+
validateRequired('', '--flag');
|
|
178
|
+
}).toThrow('exit(1)');
|
|
179
|
+
});
|
|
180
|
+
it('should return false for missing value when exitOnError is false', () => {
|
|
181
|
+
const result = validateRequired(undefined, '--flag', false);
|
|
182
|
+
expect(result).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
// =============================================================================
|
|
186
|
+
// enumArgParser tests
|
|
187
|
+
// =============================================================================
|
|
188
|
+
describe('enumArgParser', () => {
|
|
189
|
+
it('should return valid value unchanged', () => {
|
|
190
|
+
const parser = enumArgParser(BRANCH_ACTIONS, '--branch-action');
|
|
191
|
+
expect(parser('create')).toBe('create');
|
|
192
|
+
expect(parser('link')).toBe('link');
|
|
193
|
+
expect(parser('skip')).toBe('skip');
|
|
194
|
+
});
|
|
195
|
+
it('should exit with error for invalid value', () => {
|
|
196
|
+
const parser = enumArgParser(BRANCH_ACTIONS, '--branch-action');
|
|
197
|
+
expect(() => {
|
|
198
|
+
parser('invalid');
|
|
199
|
+
}).toThrow('exit(1)');
|
|
200
|
+
expect(consoleOutput.some(line => line.includes('Invalid value for --branch-action'))).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// warnDeprecatedFlag tests
|
|
205
|
+
// =============================================================================
|
|
206
|
+
describe('warnDeprecatedFlag', () => {
|
|
207
|
+
it('should print deprecation warning with old and new flag names', () => {
|
|
208
|
+
warnDeprecatedFlag('--old-flag', '--new-flag');
|
|
209
|
+
expect(consoleOutput.some(line => line.includes('--old-flag is deprecated'))).toBe(true);
|
|
210
|
+
expect(consoleOutput.some(line => line.includes('--new-flag'))).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// =============================================================================
|
|
214
|
+
// Integration tests - flag value exports
|
|
215
|
+
// =============================================================================
|
|
216
|
+
describe('Flag value constants', () => {
|
|
217
|
+
it('should export BRANCH_ACTIONS with correct values', () => {
|
|
218
|
+
expect(BRANCH_ACTIONS).toEqual(['create', 'link', 'skip']);
|
|
219
|
+
});
|
|
220
|
+
it('should export ASSIGN_ACTIONS with correct values', () => {
|
|
221
|
+
expect(ASSIGN_ACTIONS).toEqual(['reassign', 'add', 'skip']);
|
|
222
|
+
});
|
|
223
|
+
it('should export GROUP_FIELDS with correct values', () => {
|
|
224
|
+
expect(GROUP_FIELDS).toEqual(['status', 'type', 'assignee', 'priority', 'size', 'labels']);
|
|
225
|
+
});
|
|
226
|
+
it('should export HOOK_MODES with correct values', () => {
|
|
227
|
+
expect(HOOK_MODES).toEqual(['fire-and-forget', 'blocking', 'interactive']);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../src/validation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-utils.d.ts","sourceRoot":"","sources":["../src/worktree-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,
|
|
1
|
+
{"version":3,"file":"worktree-utils.d.ts","sourceRoot":"","sources":["../src/worktree-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAOH,KAAK,YAAY,EACjB,KAAK,QAAQ,EAChB,MAAM,gBAAgB,CAAC;AAIxB;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC3F;AAED,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CAC3B,GAAG;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CACxC,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAoF/B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAMxF"}
|
package/dist/worktree-utils.js
CHANGED
|
@@ -8,7 +8,7 @@ import { promisify } from 'util';
|
|
|
8
8
|
import { existsSync, copyFileSync, mkdirSync } from 'fs';
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { getWorktreeConfig, getConfig } from './config.js';
|
|
11
|
-
import { createWorktree as coreCreateWorktree, generateWorktreePath, getWorktreeForBranch, getRepositoryRoot, checkoutBranch, } from './git-utils.js';
|
|
11
|
+
import { createWorktree as coreCreateWorktree, generateWorktreePath, getWorktreeForBranch, getRepositoryRoot, checkoutBranch, GitError, } from './git-utils.js';
|
|
12
12
|
const execAsync = promisify(exec);
|
|
13
13
|
/**
|
|
14
14
|
* Setup a worktree for parallel work: copy configured files and run setup command.
|
|
@@ -118,9 +118,13 @@ export async function createParallelWorktree(repo, issueNumber, branchName, issu
|
|
|
118
118
|
alreadyExisted: true,
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
|
+
// Include stderr from GitError for better diagnostics
|
|
122
|
+
const errorMessage = error instanceof GitError && error.stderr
|
|
123
|
+
? `${error.message}\n${error.stderr}`
|
|
124
|
+
: error instanceof Error ? error.message : String(error);
|
|
121
125
|
return {
|
|
122
126
|
success: false,
|
|
123
|
-
error:
|
|
127
|
+
error: errorMessage,
|
|
124
128
|
};
|
|
125
129
|
}
|
|
126
130
|
console.log(chalk.green('✓'), `Created worktree: ${wtPath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-utils.js","sourceRoot":"","sources":["../src/worktree-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACH,cAAc,IAAI,kBAAkB,EACpC,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,
|
|
1
|
+
{"version":3,"file":"worktree-utils.js","sourceRoot":"","sources":["../src/worktree-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bretwardjames/ghp-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "GitHub Projects CLI - manage project boards from your terminal",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -32,16 +32,19 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"chalk": "^5.3.0",
|
|
34
34
|
"commander": "^12.0.0",
|
|
35
|
-
"@bretwardjames/ghp-core": "0.
|
|
35
|
+
"@bretwardjames/ghp-core": "0.6.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^20.10.0",
|
|
39
|
-
"typescript": "^5.3.2"
|
|
39
|
+
"typescript": "^5.3.2",
|
|
40
|
+
"vitest": "^3.0.5"
|
|
40
41
|
},
|
|
41
42
|
"scripts": {
|
|
42
43
|
"build": "tsc",
|
|
43
44
|
"dev": "tsc --watch",
|
|
44
45
|
"start": "node dist/index.js",
|
|
45
|
-
"lint": "eslint src --ext ts"
|
|
46
|
+
"lint": "eslint src --ext ts",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest"
|
|
46
49
|
}
|
|
47
50
|
}
|
|
@@ -2,10 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
Create a pull request for the current branch using `gh pr create`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Before Creating the PR
|
|
6
|
+
|
|
7
|
+
1. **Check for branch context** - Ensure `.ragtime/branches/{branch}/context.md` exists
|
|
8
|
+
2. **Stage ragtime files** - Branch context should be committed with the PR
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
BRANCH=$(git branch --show-current)
|
|
12
|
+
BRANCH_SLUG=$(echo "$BRANCH" | tr '/' '-')
|
|
13
|
+
|
|
14
|
+
# Check for branch context
|
|
15
|
+
CONTEXT_FILE=".ragtime/branches/$BRANCH_SLUG/context.md"
|
|
16
|
+
if [ -f "$CONTEXT_FILE" ]; then
|
|
17
|
+
echo "✓ Found branch context: $CONTEXT_FILE"
|
|
18
|
+
git add "$CONTEXT_FILE"
|
|
19
|
+
else
|
|
20
|
+
echo "⚠ No branch context found (consider running /handoff first)"
|
|
21
|
+
fi
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Include in the PR
|
|
25
|
+
|
|
6
26
|
- A clear title summarizing the changes
|
|
7
27
|
- Link to the related issue
|
|
8
28
|
- Summary of what was changed and why
|
|
9
29
|
- Any notes for reviewers
|
|
10
30
|
|
|
31
|
+
## Important
|
|
32
|
+
|
|
33
|
+
**Commit the branch context with your PR.** The `.ragtime/branches/{branch}/context.md` file contains the implementation plan and decisions - reviewers benefit from seeing this alongside the code changes.
|
|
34
|
+
|
|
11
35
|
$ARGUMENTS
|