git-it-done 1.1.0 → 1.1.1

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 (47) hide show
  1. package/dist/index.js +20 -30
  2. package/dist/index.js.map +1 -1
  3. package/dist/utils/branches.d.ts +2 -0
  4. package/dist/utils/branches.js +60 -0
  5. package/dist/utils/branches.js.map +1 -0
  6. package/dist/utils/checkGitStatus.js +3 -5
  7. package/dist/utils/checkGitStatus.js.map +1 -1
  8. package/dist/utils/commitWorkflow.d.ts +1 -0
  9. package/dist/utils/commitWorkflow.js +33 -0
  10. package/dist/utils/commitWorkflow.js.map +1 -0
  11. package/dist/utils/conflicts.d.ts +7 -0
  12. package/dist/utils/conflicts.js +96 -0
  13. package/dist/utils/conflicts.js.map +1 -0
  14. package/dist/utils/displayStatus.js +8 -9
  15. package/dist/utils/displayStatus.js.map +1 -1
  16. package/dist/utils/help.d.ts +7 -0
  17. package/dist/utils/help.js +35 -0
  18. package/dist/utils/help.js.map +1 -0
  19. package/dist/utils/inspect.d.ts +2 -0
  20. package/dist/utils/inspect.js +37 -0
  21. package/dist/utils/inspect.js.map +1 -0
  22. package/dist/utils/push_to_remote.d.ts +14 -0
  23. package/dist/utils/push_to_remote.js +33 -9
  24. package/dist/utils/push_to_remote.js.map +1 -1
  25. package/dist/utils/repository.d.ts +21 -0
  26. package/dist/utils/repository.js +60 -0
  27. package/dist/utils/repository.js.map +1 -0
  28. package/dist/utils/setup.d.ts +2 -0
  29. package/dist/utils/setup.js +77 -0
  30. package/dist/utils/setup.js.map +1 -0
  31. package/dist/utils/stash.d.ts +2 -0
  32. package/dist/utils/stash.js +64 -0
  33. package/dist/utils/stash.js.map +1 -0
  34. package/dist/utils/sync.d.ts +3 -0
  35. package/dist/utils/sync.js +55 -0
  36. package/dist/utils/sync.js.map +1 -0
  37. package/dist/utils/ui.d.ts +15 -0
  38. package/dist/utils/ui.js +28 -0
  39. package/dist/utils/ui.js.map +1 -0
  40. package/dist/utils/validation.d.ts +4 -0
  41. package/dist/utils/validation.js +26 -0
  42. package/dist/utils/validation.js.map +1 -0
  43. package/dist/utils/workspace.d.ts +1 -0
  44. package/dist/utils/workspace.js +61 -0
  45. package/dist/utils/workspace.js.map +1 -0
  46. package/package.json +3 -3
  47. package/readme.md +40 -268
@@ -0,0 +1,21 @@
1
+ import { GitChanges } from './types/types.js';
2
+ export type GitOperation = 'merge' | 'rebase' | 'am' | 'cherry-pick' | 'revert' | 'bisect';
3
+ export interface AheadBehind {
4
+ ahead: number;
5
+ behind: number;
6
+ }
7
+ export interface RepositoryState {
8
+ branch: string | null;
9
+ remotes: string[];
10
+ upstream: string | null;
11
+ aheadBehind: AheadBehind | null;
12
+ operation: GitOperation | null;
13
+ conflicts: string[];
14
+ changes: GitChanges;
15
+ }
16
+ export declare function parseAheadBehind(output: string): AheadBehind | null;
17
+ export declare function parseConflictFiles(output: string): string[];
18
+ export declare function detectOperation(entries: Set<string>): GitOperation | null;
19
+ export declare function getInProgressOperation(gitDir: string | null): GitOperation | null;
20
+ export declare function getRepositoryState(): RepositoryState;
21
+ export declare function hasLocalChanges(changes: GitChanges): boolean;
@@ -0,0 +1,60 @@
1
+ import { existsSync } from 'fs';
2
+ import path from 'path';
3
+ import { getChanges } from './getFileChanges.js';
4
+ import { gitCommand, gitOutput } from './gitCommand.js';
5
+ const OPERATION_MARKERS = ['MERGE_HEAD', 'REBASE_HEAD', 'rebase-merge', 'rebase-apply', 'CHERRY_PICK_HEAD', 'REVERT_HEAD', 'BISECT_LOG', 'applying'];
6
+ export function parseAheadBehind(output) {
7
+ const [ahead, behind] = output.trim().split(/\s+/).map(Number);
8
+ return Number.isInteger(ahead) && ahead >= 0 && Number.isInteger(behind) && behind >= 0
9
+ ? { ahead, behind }
10
+ : null;
11
+ }
12
+ export function parseConflictFiles(output) {
13
+ return output.split('\0').filter(Boolean);
14
+ }
15
+ export function detectOperation(entries) {
16
+ if (entries.has('MERGE_HEAD'))
17
+ return 'merge';
18
+ if (entries.has('REBASE_HEAD') || entries.has('rebase-merge'))
19
+ return 'rebase';
20
+ if (entries.has('rebase-apply'))
21
+ return entries.has('applying') ? 'am' : 'rebase';
22
+ if (entries.has('CHERRY_PICK_HEAD'))
23
+ return 'cherry-pick';
24
+ if (entries.has('REVERT_HEAD'))
25
+ return 'revert';
26
+ if (entries.has('BISECT_LOG'))
27
+ return 'bisect';
28
+ return null;
29
+ }
30
+ export function getInProgressOperation(gitDir) {
31
+ if (!gitDir)
32
+ return null;
33
+ const entries = new Set(OPERATION_MARKERS.filter(entry => existsSync(path.join(gitDir, entry))));
34
+ if (existsSync(path.join(gitDir, 'rebase-apply', 'applying')))
35
+ entries.add('applying');
36
+ return detectOperation(entries);
37
+ }
38
+ export function getRepositoryState() {
39
+ var _a;
40
+ const branch = gitOutput(['branch', '--show-current']) || null;
41
+ const remotes = ((_a = gitOutput(['remote'])) !== null && _a !== void 0 ? _a : '').split('\n').filter(Boolean);
42
+ const upstream = gitOutput(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']);
43
+ // With HEAD on the left, Git emits local-only commits (ahead) first and
44
+ // upstream-only commits (behind) second.
45
+ const counts = upstream ? gitOutput(['rev-list', '--left-right', '--count', `HEAD...${upstream}`]) : null;
46
+ const conflicts = gitCommand(['diff', '--name-only', '--diff-filter=U', '-z']);
47
+ return {
48
+ branch,
49
+ remotes,
50
+ upstream,
51
+ aheadBehind: counts ? parseAheadBehind(counts) : null,
52
+ operation: getInProgressOperation(gitOutput(['rev-parse', '--absolute-git-dir'])),
53
+ conflicts: conflicts.ok ? parseConflictFiles(conflicts.stdout) : [],
54
+ changes: getChanges()
55
+ };
56
+ }
57
+ export function hasLocalChanges(changes) {
58
+ return changes.staged.length + changes.unstaged.length + changes.untracked.length > 0;
59
+ }
60
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/utils/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function buildInitialBranchArgs(): string[];
2
+ export declare function runInitialSetup(): Promise<void>;
@@ -0,0 +1,77 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { writeFileSync } from 'fs';
11
+ import { confirm, isCancel, text } from '@clack/prompts';
12
+ import { gitCommand, gitErrorText, gitOutput } from './gitCommand.js';
13
+ import { runCommitWorkflow } from './commitWorkflow.js';
14
+ import { handlePushToRemote } from './push_to_remote.js';
15
+ import { ui } from './ui.js';
16
+ export function buildInitialBranchArgs() { return ['branch', '-M', 'main']; }
17
+ export function runInitialSetup() {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ ui.title('Set Up This Folder', '✦');
20
+ ui.info('This folder is not a Git repository yet. Git-it-Done can set it up safely.');
21
+ const initialise = yield confirm({ message: 'Initialize Git in this folder?' });
22
+ if (isCancel(initialise) || !initialise)
23
+ return;
24
+ const init = gitCommand(['init']);
25
+ if (!init.ok)
26
+ return void ui.error(gitErrorText(init));
27
+ gitCommand(buildInitialBranchArgs());
28
+ ui.success('Git initialized on the main branch.');
29
+ yield ensureIdentity();
30
+ yield ensureFirstFile();
31
+ yield runCommitWorkflow();
32
+ const addRemote = yield confirm({ message: 'Connect a remote repository now?' });
33
+ if (isCancel(addRemote) || !addRemote)
34
+ return;
35
+ const url = yield text({ message: 'Remote URL:', placeholder: 'https://github.com/you/repository.git', validate: value => value.trim() ? undefined : 'A remote URL is required' });
36
+ if (isCancel(url))
37
+ return;
38
+ const result = gitCommand(['remote', 'add', 'origin', url]);
39
+ if (!result.ok)
40
+ return void ui.error(gitErrorText(result));
41
+ ui.success('Remote origin added.');
42
+ yield handlePushToRemote();
43
+ });
44
+ }
45
+ function ensureIdentity() {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ if (gitOutput(['config', 'user.name']) && gitOutput(['config', 'user.email']))
48
+ return;
49
+ ui.warning('Git author identity is not configured. These settings apply only to this repository.');
50
+ const name = yield text({ message: 'Your name:', validate: value => value.trim() ? undefined : 'Your name is required' });
51
+ if (isCancel(name))
52
+ return;
53
+ const email = yield text({ message: 'Your email:', placeholder: 'you@example.com', validate: value => value.includes('@') ? undefined : 'Enter a valid email address' });
54
+ if (isCancel(email))
55
+ return;
56
+ const result = gitCommand(['config', 'user.name', name]);
57
+ const emailResult = gitCommand(['config', 'user.email', email]);
58
+ if (!result.ok || !emailResult.ok)
59
+ ui.error(gitErrorText(!result.ok ? result : emailResult));
60
+ else
61
+ ui.success('Repository-local Git identity saved.');
62
+ });
63
+ }
64
+ function ensureFirstFile() {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const tracked = gitOutput(['ls-files']);
67
+ const untracked = gitOutput(['ls-files', '--others', '--exclude-standard']);
68
+ if (tracked || untracked)
69
+ return;
70
+ const create = yield confirm({ message: 'This folder is empty. Create a README.md for the initial commit?' });
71
+ if (isCancel(create) || !create)
72
+ return;
73
+ writeFileSync('README.md', '# Project\n');
74
+ ui.success('Created README.md.');
75
+ });
76
+ }
77
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/utils/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function buildStashApplyArgs(ref: string, pop: boolean): string[];
2
+ export declare function manageStash(): Promise<void>;
@@ -0,0 +1,64 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { confirm, isCancel, select, text } from '@clack/prompts';
11
+ import { gitCommand, gitErrorText, gitOutput } from './gitCommand.js';
12
+ import { getRepositoryState, hasLocalChanges } from './repository.js';
13
+ import { ui } from './ui.js';
14
+ export function buildStashApplyArgs(ref, pop) { return ['stash', pop ? 'pop' : 'apply', ref]; }
15
+ export function manageStash() {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ const action = yield select({ message: 'Work-saving action:', options: [{ value: 'save', label: 'Save current work to a stash' }, { value: 'apply', label: 'Apply a stash (keep it)' }, { value: 'pop', label: 'Pop a stash (apply and remove)' }, { value: 'drop', label: 'Drop a stash' }, { value: 'list', label: 'List stashes' }] });
18
+ if (isCancel(action))
19
+ return;
20
+ if (action === 'list') {
21
+ ui.title('Saved Work', '▣');
22
+ const output = gitOutput(['stash', 'list']);
23
+ return output ? ui.stashList(output) : ui.warning('No stashes saved.');
24
+ }
25
+ if (action === 'save')
26
+ return void (yield saveStash());
27
+ yield restoreStash(action);
28
+ });
29
+ }
30
+ function saveStash() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ if (!hasLocalChanges(getRepositoryState().changes))
33
+ return void ui.warning('There is no work to stash.');
34
+ const message = yield text({ message: 'Stash message (optional):', placeholder: 'work in progress' });
35
+ if (isCancel(message))
36
+ return;
37
+ const confirmed = yield confirm({ message: 'Save all tracked and untracked changes to a stash?' });
38
+ if (isCancel(confirmed) || !confirmed)
39
+ return;
40
+ const args = ['stash', 'push', '--include-untracked'];
41
+ if (message.trim())
42
+ args.push('-m', message);
43
+ const result = gitCommand(args);
44
+ result.ok ? ui.success('Work saved to stash.') : ui.error(gitErrorText(result));
45
+ });
46
+ }
47
+ function restoreStash(action) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ var _a;
50
+ if ((action === 'apply' || action === 'pop') && hasLocalChanges(getRepositoryState().changes))
51
+ return void ui.warning('Commit or stash your current work before restoring a stash.');
52
+ const refs = ((_a = gitOutput(['stash', 'list', '--format=%gd'])) !== null && _a !== void 0 ? _a : '').split('\n').filter(Boolean);
53
+ const ref = yield select({ message: 'Choose a stash:', options: refs.map(value => ({ value, label: value })) });
54
+ if (isCancel(ref))
55
+ return;
56
+ const confirmed = yield confirm({ message: `${action === 'drop' ? 'Permanently drop' : action === 'pop' ? 'Apply and remove' : 'Apply'} ${ref}?` });
57
+ if (isCancel(confirmed) || !confirmed)
58
+ return;
59
+ const args = action === 'drop' ? ['stash', 'drop', ref] : buildStashApplyArgs(ref, action === 'pop');
60
+ const result = gitCommand(args);
61
+ result.ok ? ui.success(`Stash ${action} completed.`) : ui.error(gitErrorText(result));
62
+ });
63
+ }
64
+ //# sourceMappingURL=stash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stash.js","sourceRoot":"","sources":["../../src/utils/stash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function buildPullArgs(): string[];
2
+ export declare function buildPushArgs(upstream: string | null, remote?: string, branch?: string): string[];
3
+ export declare function syncWithRemote(): Promise<void>;
@@ -0,0 +1,55 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { confirm, isCancel, spinner } from '@clack/prompts';
11
+ import chalk from 'chalk';
12
+ import { gitCommand, gitErrorText } from './gitCommand.js';
13
+ import { getRepositoryState, hasLocalChanges } from './repository.js';
14
+ import { syncRecommendation } from './validation.js';
15
+ import { handlePushToRemote } from './push_to_remote.js';
16
+ export function buildPullArgs() { return ['pull', '--ff-only']; }
17
+ export function buildPushArgs(upstream, remote, branch) {
18
+ return upstream ? ['push'] : ['push', '--set-upstream', remote !== null && remote !== void 0 ? remote : 'origin', branch !== null && branch !== void 0 ? branch : 'HEAD'];
19
+ }
20
+ export function syncWithRemote() {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ const before = getRepositoryState();
23
+ if (!before.remotes.length)
24
+ return void console.log(chalk.yellow('No remote is configured. Add one before syncing.'));
25
+ const s = spinner();
26
+ s.start('Fetching remote updates…');
27
+ const fetched = gitCommand(['fetch', '--prune']);
28
+ if (!fetched.ok) {
29
+ s.stop('Fetch failed');
30
+ console.log(chalk.red(gitErrorText(fetched)));
31
+ return;
32
+ }
33
+ s.stop('Remote state refreshed');
34
+ const state = getRepositoryState();
35
+ if (!state.upstream || !state.aheadBehind) {
36
+ console.log(chalk.yellow('This branch has no upstream. Use “Push current branch” to publish it.'));
37
+ return;
38
+ }
39
+ const recommendation = syncRecommendation(state.aheadBehind);
40
+ if (recommendation === 'up-to-date')
41
+ return void console.log(chalk.green('Already up to date.'));
42
+ if (recommendation === 'inspect')
43
+ return void console.log(chalk.yellow(`This branch has diverged (${state.aheadBehind.ahead} ahead, ${state.aheadBehind.behind} behind). Inspect and resolve it with Git before syncing.`));
44
+ if (recommendation === 'push')
45
+ return void (yield handlePushToRemote());
46
+ if (hasLocalChanges(state.changes))
47
+ return void console.log(chalk.yellow('Your working tree has changes. Commit or stash them before pulling to avoid overwriting work.'));
48
+ const confirmed = yield confirm({ message: `Pull ${state.upstream} with fast-forward only?` });
49
+ if (isCancel(confirmed) || !confirmed)
50
+ return;
51
+ const pulled = gitCommand(buildPullArgs());
52
+ console.log(pulled.ok ? chalk.green('Pulled successfully.') : chalk.red(`Pull failed:\n${gitErrorText(pulled)}`));
53
+ });
54
+ }
55
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/utils/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { FileChange } from './types/types.js';
2
+ export declare const ui: {
3
+ title: (title: string, icon: string) => void;
4
+ section: (title: string, icon?: string) => void;
5
+ key: (label: string, value: string) => void;
6
+ success: (message: string) => void;
7
+ warning: (message: string) => void;
8
+ error: (message: string) => void;
9
+ info: (message: string) => void;
10
+ files: (files: FileChange[]) => void;
11
+ branchList: (output: string, current: string | null) => void;
12
+ commitList: (output: string) => void;
13
+ stashList: (output: string) => void;
14
+ remoteList: (output: string) => void;
15
+ };
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ import { formatFileStatus } from './formatFileStatus.js';
3
+ const line = chalk.hex('#334155')('─'.repeat(58));
4
+ export const ui = {
5
+ title: (title, icon) => console.log(`\n${chalk.bgHex('#0f3b5d').white.bold(` ${icon} ${title} `)}\n${line}`),
6
+ section: (title, icon = '◆') => console.log(`\n${chalk.cyan.bold(`${icon} ${title}`)} ${chalk.dim('─'.repeat(Math.max(2, 47 - title.length)))}`),
7
+ key: (label, value) => console.log(` ${chalk.dim(label.padEnd(15))}${value}`),
8
+ success: (message) => console.log(`\n${chalk.green.bold('✓ ')}${chalk.green(message)}`),
9
+ warning: (message) => console.log(`\n${chalk.yellow.bold('! ')}${chalk.yellow(message)}`),
10
+ error: (message) => console.log(`\n${chalk.red.bold('✕ ')}${chalk.red(message)}`),
11
+ info: (message) => console.log(`\n${chalk.blue.bold('i ')}${chalk.blue(message)}`),
12
+ files: (files) => files.forEach(({ status, file, from }) => console.log(` ${formatFileStatus(status).padEnd(22)} ${chalk.white(from ? `${from} ${chalk.dim('→')} ${file}` : file)}`)),
13
+ branchList: (output, current) => output.split('\n').filter(Boolean).forEach(row => {
14
+ const active = row.startsWith('*');
15
+ const text = row.replace(/^\*\s*/, '');
16
+ console.log(` ${active ? chalk.green.bold('●') : chalk.dim('○')} ${active ? chalk.cyan.bold(text) : chalk.white(text)}${text === current ? chalk.dim(' current') : ''}`);
17
+ }),
18
+ commitList: (output) => output.split('\n').filter(Boolean).forEach(row => {
19
+ const [hash, ...subject] = row.split(' ');
20
+ console.log(` ${chalk.magenta(hash)} ${chalk.white(subject.join(' '))}`);
21
+ }),
22
+ stashList: (output) => output.split('\n').filter(Boolean).forEach(row => {
23
+ const [ref, ...description] = row.split(': ');
24
+ console.log(` ${chalk.hex('#f59e0b')(ref)} ${chalk.white(description.join(': '))}`);
25
+ }),
26
+ remoteList: (output) => output.split('\n').filter(Boolean).forEach(row => console.log(` ${chalk.blue('↗')} ${chalk.white(row)}`))
27
+ };
28
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { AheadBehind } from './repository.js';
2
+ export type SyncRecommendation = 'up-to-date' | 'push' | 'pull' | 'inspect';
3
+ export declare function validateBranchName(name: string): string | undefined;
4
+ export declare function syncRecommendation(counts: AheadBehind): SyncRecommendation;
@@ -0,0 +1,26 @@
1
+ import { gitCommand } from './gitCommand.js';
2
+ export function validateBranchName(name) {
3
+ const value = name.trim();
4
+ if (!value)
5
+ return 'Branch name is required';
6
+ if (value.startsWith('-'))
7
+ return 'Branch names cannot start with a dash';
8
+ if (/\s/.test(value))
9
+ return 'Branch names cannot contain spaces';
10
+ if (value.includes('..'))
11
+ return 'Branch names cannot contain consecutive dots';
12
+ if (/[@~^:?*\\[\x00-\x1f]/.test(value) || value.endsWith('.') || value.endsWith('/') || !gitCommand(['check-ref-format', '--branch', value]).ok) {
13
+ return 'Use a valid Git branch name';
14
+ }
15
+ return undefined;
16
+ }
17
+ export function syncRecommendation(counts) {
18
+ if (counts.ahead === 0 && counts.behind === 0)
19
+ return 'up-to-date';
20
+ if (counts.ahead > 0 && counts.behind === 0)
21
+ return 'push';
22
+ if (counts.ahead === 0 && counts.behind > 0)
23
+ return 'pull';
24
+ return 'inspect';
25
+ }
26
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK;QAAE,OAAO,yBAAyB,CAAC;IAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,uCAAuC,CAAC;IAC1E,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,oCAAoC,CAAC;IAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,8CAA8C,CAAC;IAChF,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAChJ,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACnE,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runWorkspace(): Promise<void>;
@@ -0,0 +1,61 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { isCancel, select } from '@clack/prompts';
11
+ import chalk from 'chalk';
12
+ import { manageBranches } from './branches.js';
13
+ import { runCommitWorkflow } from './commitWorkflow.js';
14
+ import { handleInProgressOperation } from './conflicts.js';
15
+ import { inspectRepository, showRepositorySummary } from './inspect.js';
16
+ import { getRepositoryState } from './repository.js';
17
+ import { manageStash } from './stash.js';
18
+ import { syncWithRemote } from './sync.js';
19
+ import { handlePushToRemote } from './push_to_remote.js';
20
+ export function runWorkspace() {
21
+ return __awaiter(this, void 0, void 0, function* () {
22
+ let active = true;
23
+ while (active) {
24
+ showRepositorySummary();
25
+ const state = getRepositoryState();
26
+ const options = state.operation ? [
27
+ { value: 'conflicts', label: `Resolve ${state.operation} in progress`, hint: state.conflicts.length ? `${state.conflicts.length} unresolved file(s)` : 'review or finish safely' },
28
+ { value: 'inspect', label: 'Inspect repository', hint: 'Status, recent commits, remotes, and conflicts' },
29
+ { value: 'exit', label: 'Exit' }
30
+ ] : [
31
+ { value: 'commit', label: 'Commit changes', hint: 'Stage files, write a message, and optionally push' },
32
+ { value: 'sync', label: 'Sync with remote', hint: 'Fetch first, then safely pull or push' },
33
+ { value: 'push', label: 'Push current branch', hint: 'Publish commits with branch protection warnings' },
34
+ { value: 'branches', label: 'Manage branches', hint: 'List, switch, or create a branch' },
35
+ { value: 'stash', label: 'Save or restore work', hint: 'Stash current work and restore it later' },
36
+ { value: 'inspect', label: 'Inspect repository', hint: 'Status, recent commits, remotes, and conflicts' },
37
+ { value: 'exit', label: 'Exit' }
38
+ ];
39
+ const action = yield select({ message: 'What do you want to do?', options });
40
+ if (isCancel(action) || action === 'exit')
41
+ return;
42
+ console.log('');
43
+ if (action === 'commit')
44
+ yield runCommitWorkflow();
45
+ else if (action === 'sync')
46
+ yield syncWithRemote();
47
+ else if (action === 'push')
48
+ yield handlePushToRemote();
49
+ else if (action === 'branches')
50
+ yield manageBranches();
51
+ else if (action === 'stash')
52
+ yield manageStash();
53
+ else if (action === 'inspect')
54
+ inspectRepository();
55
+ else if (action === 'conflicts')
56
+ yield handleInProgressOperation();
57
+ console.log(chalk.dim('\nReturning to workspace…'));
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/utils/workspace.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "git-it-done",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Smart auto-commit tool with beautiful CLI interface for streamlined Git workflow",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {
8
- "git-it-done": "./dist/index.js"
8
+ "git-it-done": "dist/index.js"
9
9
  },
10
10
  "scripts": {
11
11
  "dev": "ts-node --esm ./src/index.ts",
@@ -36,7 +36,7 @@
36
36
  "license": "MIT",
37
37
  "repository": {
38
38
  "type": "git",
39
- "url": "https://github.com/sidhxntt/Git-Bundle.git",
39
+ "url": "git+https://github.com/sidhxntt/Git-Bundle.git",
40
40
  "directory": "Git-it-Done"
41
41
  },
42
42
  "bugs": {