@radkode/neo 0.6.1 → 0.8.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 (34) hide show
  1. package/dist/commands/alias/setup/index.d.ts.map +1 -1
  2. package/dist/commands/alias/setup/index.js +13 -1
  3. package/dist/commands/alias/setup/index.js.map +1 -1
  4. package/dist/commands/config/index.d.ts.map +1 -1
  5. package/dist/commands/config/index.js +33 -32
  6. package/dist/commands/config/index.js.map +1 -1
  7. package/dist/commands/git/branch/index.d.ts +3 -0
  8. package/dist/commands/git/branch/index.d.ts.map +1 -0
  9. package/dist/commands/git/branch/index.js +447 -0
  10. package/dist/commands/git/branch/index.js.map +1 -0
  11. package/dist/commands/git/index.d.ts.map +1 -1
  12. package/dist/commands/git/index.js +3 -1
  13. package/dist/commands/git/index.js.map +1 -1
  14. package/dist/commands/git/pull/index.d.ts.map +1 -1
  15. package/dist/commands/git/pull/index.js +161 -12
  16. package/dist/commands/git/pull/index.js.map +1 -1
  17. package/dist/commands/git/push/index.d.ts.map +1 -1
  18. package/dist/commands/git/push/index.js +23 -11
  19. package/dist/commands/git/push/index.js.map +1 -1
  20. package/dist/commands/init/index.d.ts.map +1 -1
  21. package/dist/commands/init/index.js +14 -2
  22. package/dist/commands/init/index.js.map +1 -1
  23. package/dist/commands/update/index.d.ts.map +1 -1
  24. package/dist/commands/update/index.js +18 -6
  25. package/dist/commands/update/index.js.map +1 -1
  26. package/dist/types/schemas.d.ts +95 -0
  27. package/dist/types/schemas.d.ts.map +1 -0
  28. package/dist/types/schemas.js +60 -0
  29. package/dist/types/schemas.js.map +1 -0
  30. package/dist/utils/validation.d.ts +16 -0
  31. package/dist/utils/validation.d.ts.map +1 -0
  32. package/dist/utils/validation.js +65 -0
  33. package/dist/utils/validation.js.map +1 -0
  34. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/alias/setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAiDtD,wBAAgB,kBAAkB,IAAI,OAAO,CA2E5C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/alias/setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAgDtD,wBAAgB,kBAAkB,IAAI,OAAO,CAqF5C"}
@@ -2,6 +2,8 @@ import { Command } from '@commander-js/extra-typings';
2
2
  import inquirer from 'inquirer';
3
3
  import { ZshIntegration } from '../../../utils/shell.js';
4
4
  import { ui } from '../../../utils/ui.js';
5
+ import { validate, isValidationError } from '../../../utils/validation.js';
6
+ import { aliasSetupOptionsSchema } from '../../../types/schemas.js';
5
7
  const ALIASES = Object.freeze({
6
8
  gp: 'neo git pull',
7
9
  gpu: 'neo git push',
@@ -24,6 +26,16 @@ export function createSetupCommand() {
24
26
  .description('Setup ZSH aliases for Neo CLI (gp, gpu). Backs up ~/.zshrc before modifying.')
25
27
  .option('-f, --force', 'skip confirmation and overwrite conflicting aliases')
26
28
  .action(async (options) => {
29
+ let validatedOptions;
30
+ try {
31
+ validatedOptions = validate(aliasSetupOptionsSchema, options, 'alias setup options');
32
+ }
33
+ catch (error) {
34
+ if (isValidationError(error)) {
35
+ process.exit(1);
36
+ }
37
+ throw error;
38
+ }
27
39
  const shell = new ZshIntegration();
28
40
  try {
29
41
  const rcFile = shell.getRcFile();
@@ -37,7 +49,7 @@ export function createSetupCommand() {
37
49
  }
38
50
  })();
39
51
  const conflicts = findConflictingAliases(rcContent, ALIASES);
40
- if (conflicts.length > 0 && !options.force) {
52
+ if (conflicts.length > 0 && !validatedOptions.force) {
41
53
  ui.warn('The following aliases already exist and will be overwritten:');
42
54
  for (const c of conflicts) {
43
55
  ui.log(` ${c.alias}: currently ${c.current} -> new ${ALIASES[c.alias]}`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/alias/setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAUnC,MAAM,OAAO,GAAoB,MAAM,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,cAAc;IAClB,GAAG,EAAE,cAAc;CACpB,CAAC,CAAC;AASH,SAAS,sBAAsB,CAC7B,OAAe,EACf,OAAwB;IAExB,MAAM,SAAS,GAAyC,EAAE,CAAC;IAG3D,MAAM,UAAU,GAAG,+CAA+C,CAAC;IACnE,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,MAAM,CAAC,EAAE,IAAI,EAAE,AAAD,EAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QAEhC,IAAI,IAAI,IAAI,KAAK,IAAI,OAAO,CAAC,IAA6B,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9F,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAKD,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO;SACJ,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,aAAa,EAAE,qDAAqD,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,OAAqB,EAAiB,EAAE;QACrD,MAAM,KAAK,GAAG,IAAI,cAAc,EAAE,CAAC;QAEnC,IAAI,CAAC;YAEH,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;gBAElC,IAAI,CAAC;oBACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;oBACjD,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAE7D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3C,EAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;gBACxE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,EAAE,CAAC,GAAG,CACJ,KAAK,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,OAAO,WAAW,OAAO,CAAC,CAAC,CAAC,KAA8B,CAAC,EAAE,CAC3F,CAAC;gBACJ,CAAC;gBAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAEtC;oBACD;wBACE,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,yCAAyC;wBAClD,OAAO,EAAE,KAAK;qBACf;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBACzC,OAAO;gBACT,CAAC;YACH,CAAC;YAGD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,UAAU,EAAE,CAAC;gBACf,EAAE,CAAC,IAAI,CAAC,aAAa,MAAM,OAAO,UAAU,EAAE,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;YACnF,CAAC;YAGD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;YAC9C,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAClC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC;YAEhF,EAAE,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,EAAE,CAAC,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/alias/setup/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAKtD,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAOtD,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C"}
@@ -1,6 +1,8 @@
1
1
  import { Command } from '@commander-js/extra-typings';
2
2
  import { ui } from '../../utils/ui.js';
3
3
  import { configManager } from '../../utils/config.js';
4
+ import { validateArgument, validateConfigValue, isValidationError } from '../../utils/validation.js';
5
+ import { configKeySchema } from '../../types/schemas.js';
4
6
  export function createConfigCommand() {
5
7
  const command = new Command('config');
6
8
  command
@@ -15,7 +17,17 @@ function createConfigGetCommand() {
15
17
  command
16
18
  .description('Get a configuration value')
17
19
  .argument('<key>', 'configuration key (supports dot notation, e.g., preferences.banner)')
18
- .action(async (key) => {
20
+ .action(async (rawKey) => {
21
+ let key;
22
+ try {
23
+ key = validateArgument(configKeySchema, rawKey, 'configuration key');
24
+ }
25
+ catch (error) {
26
+ if (isValidationError(error)) {
27
+ process.exit(1);
28
+ }
29
+ throw error;
30
+ }
19
31
  try {
20
32
  const config = await configManager.read();
21
33
  const value = getNestedValue(config, key);
@@ -44,31 +56,30 @@ function createConfigSetCommand() {
44
56
  .description('Set a configuration value')
45
57
  .argument('<key>', 'configuration key (supports dot notation, e.g., preferences.banner)')
46
58
  .argument('<value>', 'configuration value')
47
- .action(async (key, value) => {
59
+ .action(async (rawKey, rawValue) => {
60
+ let key;
48
61
  try {
49
- if (key === 'preferences.banner') {
50
- const validBannerValues = ['full', 'compact', 'none'];
51
- if (!validBannerValues.includes(value)) {
52
- ui.error(`Invalid banner value: ${value}. Must be one of: ${validBannerValues.join(', ')}`);
53
- process.exit(1);
54
- }
55
- }
56
- if (key === 'preferences.theme') {
57
- const validThemeValues = ['dark', 'light', 'auto'];
58
- if (!validThemeValues.includes(value)) {
59
- ui.error(`Invalid theme value: ${value}. Must be one of: ${validThemeValues.join(', ')}`);
60
- process.exit(1);
61
- }
62
+ key = validateArgument(configKeySchema, rawKey, 'configuration key');
63
+ }
64
+ catch (error) {
65
+ if (isValidationError(error)) {
66
+ process.exit(1);
62
67
  }
63
- if (key === 'shell.type') {
64
- const validShellTypes = ['zsh', 'bash', 'fish'];
65
- if (!validShellTypes.includes(value)) {
66
- ui.error(`Invalid shell type: ${value}. Must be one of: ${validShellTypes.join(', ')}`);
67
- process.exit(1);
68
- }
68
+ throw error;
69
+ }
70
+ let value;
71
+ try {
72
+ value = await validateConfigValue(key, rawValue);
73
+ }
74
+ catch (error) {
75
+ if (isValidationError(error)) {
76
+ process.exit(1);
69
77
  }
78
+ throw error;
79
+ }
80
+ try {
70
81
  const config = await configManager.read();
71
- const updated = setNestedValue(config, key, parseValue(value));
82
+ const updated = setNestedValue(config, key, value);
72
83
  await configManager.write(updated);
73
84
  ui.success(`Configuration updated: ${key} = ${value}`);
74
85
  }
@@ -102,16 +113,6 @@ function setNestedValue(obj, path, value) {
102
113
  current[lastKey] = value;
103
114
  return result;
104
115
  }
105
- function parseValue(value) {
106
- if (value === 'true')
107
- return true;
108
- if (value === 'false')
109
- return false;
110
- const num = Number(value);
111
- if (!isNaN(num) && value !== '')
112
- return num;
113
- return value;
114
- }
115
116
  function createConfigListCommand() {
116
117
  const command = new Command('list');
117
118
  command.description('List all configuration values').action(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ export declare function createBranchCommand(): Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/git/branch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AA0CtD,wBAAgB,mBAAmB,IAAI,OAAO,CA4E7C"}
@@ -0,0 +1,447 @@
1
+ import { Command } from '@commander-js/extra-typings';
2
+ import { execa } from 'execa';
3
+ import inquirer from 'inquirer';
4
+ import { logger } from '../../../utils/logger.js';
5
+ import { ui } from '../../../utils/ui.js';
6
+ import { validate, isValidationError } from '../../../utils/validation.js';
7
+ import { gitBranchOptionsSchema } from '../../../types/schemas.js';
8
+ export function createBranchCommand() {
9
+ const command = new Command('branch');
10
+ command
11
+ .description('Analyze and manage local git branches')
12
+ .option('--dry-run', 'show what would be deleted without actually deleting')
13
+ .option('--force', 'force delete branches without confirmation prompts')
14
+ .action(async (options) => {
15
+ let validatedOptions;
16
+ try {
17
+ validatedOptions = validate(gitBranchOptionsSchema, options, 'git branch options');
18
+ }
19
+ catch (error) {
20
+ if (isValidationError(error)) {
21
+ process.exit(1);
22
+ }
23
+ throw error;
24
+ }
25
+ const spinner = ui.spinner('Analyzing local branches');
26
+ spinner.start();
27
+ try {
28
+ await verifyGitRepository();
29
+ const analysis = await analyzeBranches();
30
+ spinner.succeed(`Found ${analysis.totalBranches} local branches`);
31
+ displayBranchSummary(analysis);
32
+ if (analysis.cleanupCandidates.length === 0) {
33
+ ui.success('All branches are either protected or have active remote tracking - nothing to clean up!');
34
+ return;
35
+ }
36
+ displayCleanupCandidates(analysis);
37
+ if (validatedOptions.dryRun) {
38
+ ui.warn('Dry run mode - no branches will be deleted');
39
+ return;
40
+ }
41
+ await interactiveBranchCleanup(analysis.cleanupCandidates, validatedOptions.force);
42
+ }
43
+ catch (error) {
44
+ spinner.fail('Failed to analyze branches');
45
+ if (error instanceof Error) {
46
+ if (error.message.includes('not a git repository')) {
47
+ ui.error('Not a git repository!');
48
+ ui.warn('Make sure you are in a git repository directory');
49
+ process.exit(1);
50
+ }
51
+ if (error.message.includes('no branches found')) {
52
+ ui.error('No local branches found!');
53
+ ui.warn('This repository appears to have no local branches');
54
+ process.exit(1);
55
+ }
56
+ }
57
+ ui.error('An unexpected error occurred');
58
+ ui.muted(error instanceof Error ? error.message : String(error));
59
+ process.exit(1);
60
+ }
61
+ });
62
+ return command;
63
+ }
64
+ async function verifyGitRepository() {
65
+ try {
66
+ await execa('git', ['rev-parse', '--git-dir']);
67
+ }
68
+ catch {
69
+ throw new Error('not a git repository');
70
+ }
71
+ }
72
+ async function analyzeBranches() {
73
+ try {
74
+ const { stdout: branchOutput } = await execa('git', ['branch', '-vv']);
75
+ if (!branchOutput.trim()) {
76
+ throw new Error('no branches found');
77
+ }
78
+ const branchLines = branchOutput.split('\n').filter((line) => line.trim());
79
+ const branches = [];
80
+ let currentBranch = '';
81
+ const protectedBranchNames = [
82
+ 'main',
83
+ 'master',
84
+ 'develop',
85
+ 'dev',
86
+ 'staging',
87
+ 'production',
88
+ 'prod',
89
+ ];
90
+ for (const line of branchLines) {
91
+ const branchInfo = await parseBranchLine(line.trim(), protectedBranchNames);
92
+ if (branchInfo) {
93
+ branches.push(branchInfo);
94
+ if (branchInfo.isCurrent) {
95
+ currentBranch = branchInfo.name;
96
+ }
97
+ }
98
+ }
99
+ const trackedBranches = branches.filter((b) => b.hasRemoteTracking && !b.isRemoteDeleted);
100
+ const untrackedBranches = branches.filter((b) => !b.hasRemoteTracking && !b.isCurrent && !b.isProtected);
101
+ const deletedRemoteBranches = branches.filter((b) => b.isRemoteDeleted && !b.isCurrent && !b.isProtected);
102
+ const cleanupCandidates = [...untrackedBranches, ...deletedRemoteBranches];
103
+ const protectedBranches = branches.filter((b) => b.isProtected);
104
+ logger.debug(`Total branches: ${branches.length}`);
105
+ logger.debug(`Current branch: ${currentBranch}`);
106
+ logger.debug(`Tracked branches: ${trackedBranches.length}`);
107
+ logger.debug(`Untracked branches: ${untrackedBranches.length}`);
108
+ logger.debug(`Deleted remote branches: ${deletedRemoteBranches.length}`);
109
+ logger.debug(`Cleanup candidates: ${cleanupCandidates.length}`);
110
+ logger.debug(`Protected branches: ${protectedBranches.length}`);
111
+ return {
112
+ totalBranches: branches.length,
113
+ currentBranch,
114
+ trackedBranches,
115
+ untrackedBranches,
116
+ deletedRemoteBranches,
117
+ cleanupCandidates,
118
+ protectedBranches,
119
+ };
120
+ }
121
+ catch (error) {
122
+ logger.debug(`Branch analysis failed: ${error}`);
123
+ throw error;
124
+ }
125
+ }
126
+ async function parseBranchLine(line, protectedBranchNames) {
127
+ const isCurrent = line.startsWith('* ');
128
+ const cleanLine = line.replace(/^\*?\s+/, '');
129
+ const parts = cleanLine.split(/\s+/);
130
+ if (parts.length < 2) {
131
+ return null;
132
+ }
133
+ const name = parts[0];
134
+ if (!name) {
135
+ return null;
136
+ }
137
+ const isProtected = protectedBranchNames.includes(name);
138
+ const trackingMatch = cleanLine.match(/\[([^\]]+)\]/);
139
+ const hasRemoteTracking = !!trackingMatch;
140
+ const remoteTrackingBranch = trackingMatch ? trackingMatch[1] : undefined;
141
+ const isRemoteDeleted = hasRemoteTracking && !!remoteTrackingBranch?.includes(': gone');
142
+ return {
143
+ name,
144
+ isCurrent,
145
+ hasRemoteTracking,
146
+ remoteTrackingBranch,
147
+ isProtected,
148
+ isRemoteDeleted,
149
+ };
150
+ }
151
+ function displayBranchSummary(analysis) {
152
+ console.log('');
153
+ ui.section('Branch Analysis');
154
+ ui.keyValue([
155
+ ['Current branch', analysis.currentBranch],
156
+ ['Total branches', analysis.totalBranches.toString()],
157
+ ['With active remote tracking', analysis.trackedBranches.length.toString()],
158
+ ['Without remote tracking', analysis.untrackedBranches.length.toString()],
159
+ ['With deleted remotes', analysis.deletedRemoteBranches.length.toString()],
160
+ ['Available for cleanup', analysis.cleanupCandidates.length.toString()],
161
+ ['Protected branches', analysis.protectedBranches.length.toString()],
162
+ ]);
163
+ if (analysis.trackedBranches.length > 0) {
164
+ console.log('');
165
+ ui.info('Branches with active remote tracking:');
166
+ const trackedList = analysis.trackedBranches.map((b) => `${b.name} → ${b.remoteTrackingBranch}${b.isCurrent ? ' (current)' : ''}`);
167
+ ui.list(trackedList);
168
+ }
169
+ if (analysis.protectedBranches.length > 0) {
170
+ console.log('');
171
+ ui.info('Protected branches (will not be deleted):');
172
+ const protectedList = analysis.protectedBranches.map((b) => `${b.name}${b.isCurrent ? ' (current)' : ''}`);
173
+ ui.list(protectedList);
174
+ }
175
+ }
176
+ function displayCleanupCandidates(analysis) {
177
+ console.log('');
178
+ if (analysis.cleanupCandidates.length === 0) {
179
+ return;
180
+ }
181
+ ui.warn(`Found ${analysis.cleanupCandidates.length} branch(es) available for cleanup:`);
182
+ console.log('');
183
+ const cleanupList = analysis.cleanupCandidates.map((branch) => {
184
+ if (branch.isRemoteDeleted) {
185
+ return `${branch.name} (remote deleted)`;
186
+ }
187
+ else {
188
+ return `${branch.name} (no remote)`;
189
+ }
190
+ });
191
+ ui.list(cleanupList);
192
+ if (analysis.untrackedBranches.length > 0 && analysis.deletedRemoteBranches.length > 0) {
193
+ console.log('');
194
+ ui.muted(`├─ ${analysis.untrackedBranches.length} without remote tracking`);
195
+ ui.muted(`└─ ${analysis.deletedRemoteBranches.length} with deleted remotes`);
196
+ }
197
+ console.log('');
198
+ }
199
+ async function interactiveBranchCleanup(cleanupCandidates, forceMode = false) {
200
+ const { action } = await inquirer.prompt([
201
+ {
202
+ type: 'list',
203
+ name: 'action',
204
+ message: 'What would you like to do with these branches?',
205
+ choices: [
206
+ {
207
+ name: `Delete all ${cleanupCandidates.length} cleanup candidates`,
208
+ value: 'delete_all',
209
+ },
210
+ {
211
+ name: 'Select specific branches to delete',
212
+ value: 'delete_selected',
213
+ },
214
+ {
215
+ name: 'Cancel (no changes)',
216
+ value: 'cancel',
217
+ },
218
+ ],
219
+ },
220
+ ]);
221
+ switch (action) {
222
+ case 'delete_all':
223
+ await deleteBranches(cleanupCandidates, forceMode);
224
+ break;
225
+ case 'delete_selected':
226
+ await selectAndDeleteBranches(cleanupCandidates, forceMode);
227
+ break;
228
+ case 'cancel':
229
+ ui.muted('Operation cancelled. No branches were deleted.');
230
+ return;
231
+ }
232
+ }
233
+ async function selectAndDeleteBranches(cleanupCandidates, forceMode) {
234
+ const { selectedBranches } = await inquirer.prompt({
235
+ type: 'checkbox',
236
+ name: 'selectedBranches',
237
+ message: 'Select branches to delete:',
238
+ choices: cleanupCandidates.map((b) => ({
239
+ name: `${b.name}${b.isRemoteDeleted ? ' (deleted remote)' : ' (no remote)'}`,
240
+ value: b.name,
241
+ })),
242
+ validate: (choices) => {
243
+ if (!choices || choices.length === 0) {
244
+ return 'Please select at least one branch';
245
+ }
246
+ return true;
247
+ },
248
+ });
249
+ const branchesToDelete = cleanupCandidates.filter((b) => selectedBranches.includes(b.name));
250
+ await deleteBranches(branchesToDelete, forceMode);
251
+ }
252
+ async function deleteBranches(branches, forceMode) {
253
+ if (branches.length === 0) {
254
+ ui.info('No branches selected for deletion');
255
+ return;
256
+ }
257
+ if (!forceMode) {
258
+ const { confirm } = await inquirer.prompt([
259
+ {
260
+ type: 'confirm',
261
+ name: 'confirm',
262
+ message: `Are you sure you want to delete ${branches.length} branch(es)?`,
263
+ default: false,
264
+ },
265
+ ]);
266
+ if (!confirm) {
267
+ ui.muted('Operation cancelled. No branches were deleted.');
268
+ return;
269
+ }
270
+ }
271
+ const results = {
272
+ deleted: [],
273
+ failed: [],
274
+ forceDeleted: [],
275
+ };
276
+ for (const branch of branches) {
277
+ try {
278
+ await execa('git', ['branch', '-d', branch.name]);
279
+ results.deleted.push(branch.name);
280
+ ui.success(`Deleted branch "${branch.name}"`);
281
+ }
282
+ catch (error) {
283
+ const errorMessage = error instanceof Error ? error.message : String(error);
284
+ if (errorMessage.includes('not fully merged')) {
285
+ const isSquashMerged = await checkIfSquashMerged(branch.name);
286
+ if (isSquashMerged) {
287
+ await execa('git', ['branch', '-D', branch.name]);
288
+ results.deleted.push(branch.name);
289
+ ui.success(`Deleted branch "${branch.name}" (content was squash-merged)`);
290
+ }
291
+ else {
292
+ try {
293
+ if (forceMode) {
294
+ await execa('git', ['branch', '-D', branch.name]);
295
+ results.forceDeleted.push(branch.name);
296
+ ui.success(`Force deleted branch "${branch.name}"`);
297
+ ui.warn('This branch had unmerged changes');
298
+ }
299
+ else {
300
+ const { forceDelete } = await inquirer.prompt([
301
+ {
302
+ type: 'confirm',
303
+ name: 'forceDelete',
304
+ message: `Branch "${branch.name}" has unmerged changes. Force delete?`,
305
+ default: false,
306
+ },
307
+ ]);
308
+ if (forceDelete) {
309
+ await execa('git', ['branch', '-D', branch.name]);
310
+ results.forceDeleted.push(branch.name);
311
+ ui.success(`Force deleted branch "${branch.name}"`);
312
+ ui.warn('Unmerged changes were lost');
313
+ }
314
+ else {
315
+ results.failed.push({
316
+ name: branch.name,
317
+ reason: 'Has unmerged changes (skipped)',
318
+ });
319
+ ui.info(`Skipped branch "${branch.name}" (unmerged changes)`);
320
+ }
321
+ }
322
+ }
323
+ catch {
324
+ results.failed.push({ name: branch.name, reason: 'Failed to force delete' });
325
+ ui.error(`Failed to force delete branch "${branch.name}"`);
326
+ }
327
+ }
328
+ }
329
+ else {
330
+ results.failed.push({ name: branch.name, reason: errorMessage });
331
+ ui.error(`Failed to delete branch "${branch.name}": ${errorMessage}`);
332
+ }
333
+ }
334
+ }
335
+ displayDeletionSummary(results);
336
+ }
337
+ async function checkIfSquashMerged(branchName) {
338
+ try {
339
+ const defaultBranch = await findDefaultBranch();
340
+ const { stdout: mergeBase } = await execa('git', ['merge-base', branchName, defaultBranch]);
341
+ const { stdout: branchPatch } = await execa('git', [
342
+ 'diff',
343
+ `${mergeBase.trim()}..${branchName}`,
344
+ ]);
345
+ if (!branchPatch.trim()) {
346
+ return true;
347
+ }
348
+ const { stdout: recentCommits } = await execa('git', [
349
+ 'rev-list',
350
+ '--max-count=50',
351
+ defaultBranch,
352
+ ]);
353
+ const commitShas = recentCommits.trim().split('\n');
354
+ for (const commitSha of commitShas) {
355
+ try {
356
+ const { stdout: commitPatch } = await execa('git', ['show', '--format=', commitSha]);
357
+ if (patchesHaveSimilarContent(branchPatch, commitPatch)) {
358
+ return true;
359
+ }
360
+ }
361
+ catch {
362
+ continue;
363
+ }
364
+ }
365
+ return false;
366
+ }
367
+ catch (error) {
368
+ logger.debug(`Failed to check squash merge status for ${branchName}: ${error}`);
369
+ return false;
370
+ }
371
+ }
372
+ function patchesHaveSimilarContent(patch1, patch2) {
373
+ if (!patch1.trim() || !patch2.trim()) {
374
+ return false;
375
+ }
376
+ const getSignificantLines = (patch) => {
377
+ return patch
378
+ .split('\n')
379
+ .filter((line) => line.startsWith('+') || line.startsWith('-'))
380
+ .filter((line) => !line.startsWith('+++') && !line.startsWith('---'))
381
+ .map((line) => line.substring(1).trim())
382
+ .filter((line) => line.length > 0)
383
+ .filter((line) => !line.match(/^\s*(\{|\}|\(|\)|;|,)\s*$/));
384
+ };
385
+ const lines1 = getSignificantLines(patch1);
386
+ const lines2 = getSignificantLines(patch2);
387
+ if (lines1.length === 0 || lines2.length === 0) {
388
+ return false;
389
+ }
390
+ const commonLines = lines1.filter((line) => lines2.includes(line));
391
+ const similarity = commonLines.length / Math.max(lines1.length, lines2.length);
392
+ return similarity > 0.7;
393
+ }
394
+ async function findDefaultBranch() {
395
+ try {
396
+ await execa('git', ['show-ref', '--verify', '--quiet', 'refs/heads/main']);
397
+ return 'main';
398
+ }
399
+ catch {
400
+ try {
401
+ await execa('git', ['show-ref', '--verify', '--quiet', 'refs/heads/master']);
402
+ return 'master';
403
+ }
404
+ catch {
405
+ try {
406
+ const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD']);
407
+ return stdout.replace('refs/remotes/origin/', '').trim();
408
+ }
409
+ catch {
410
+ ui.warn('Could not determine default branch, using "main"');
411
+ return 'main';
412
+ }
413
+ }
414
+ }
415
+ }
416
+ function displayDeletionSummary(results) {
417
+ console.log('');
418
+ ui.section('Cleanup Summary');
419
+ const totalProcessed = results.deleted.length + results.failed.length + results.forceDeleted.length;
420
+ const successCount = results.deleted.length + results.forceDeleted.length;
421
+ ui.keyValue([
422
+ ['Total processed', totalProcessed.toString()],
423
+ ['Successfully deleted', successCount.toString()],
424
+ ['Failed to delete', results.failed.length.toString()],
425
+ ]);
426
+ if (results.deleted.length > 0) {
427
+ console.log('');
428
+ ui.success(`Successfully deleted ${results.deleted.length} branch(es):`);
429
+ ui.list(results.deleted);
430
+ }
431
+ if (results.forceDeleted.length > 0) {
432
+ console.log('');
433
+ ui.warn(`Force deleted ${results.forceDeleted.length} branch(es) with unmerged changes:`);
434
+ ui.list(results.forceDeleted);
435
+ }
436
+ if (results.failed.length > 0) {
437
+ console.log('');
438
+ ui.error(`Failed to delete ${results.failed.length} branch(es):`);
439
+ const failedList = results.failed.map((f) => `${f.name}: ${f.reason}`);
440
+ ui.list(failedList);
441
+ }
442
+ if (successCount > 0) {
443
+ console.log('');
444
+ ui.success('Branch cleanup completed!');
445
+ }
446
+ }
447
+ //# sourceMappingURL=index.js.map