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
package/dist/index.js CHANGED
@@ -11,50 +11,40 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  import { intro, outro, cancel } from '@clack/prompts';
12
12
  import chalk from 'chalk';
13
13
  import { checkGitStatus } from './utils/checkGitStatus.js';
14
- import { getChanges } from './utils/getFileChanges.js';
15
- import { displayRepositoryStatus } from './utils/displayStatus.js';
16
- import { handleFileStaging } from './utils/fileStaging.js';
17
- import { handleCommitMessage } from './utils/commitMessage.js';
18
- import { performCommit } from './utils/performCommit.js';
19
- import { handlePushToRemote } from './utils/push_to_remote.js';
14
+ import { runCommitWorkflow } from './utils/commitWorkflow.js';
15
+ import { runWorkspace } from './utils/workspace.js';
16
+ import { getRepositoryState } from './utils/repository.js';
17
+ import { handleInProgressOperation } from './utils/conflicts.js';
18
+ import { runInitialSetup } from './utils/setup.js';
20
19
  import start from './utils/process_interruption.js';
21
20
  function main() {
22
21
  return __awaiter(this, void 0, void 0, function* () {
23
22
  var _a;
23
+ if (process.argv.slice(2).some(argument => argument === '--help' || argument === '-h')) {
24
+ console.log(`Git-it-Done — a guided Git workspace\n\nUsage:\n git-it-done Open the interactive workspace\n git-it-done commit Start the direct commit workflow\n git-it-done --help Show this help\n\nChoose actions in the terminal UI; no Git command memorization is required.`);
25
+ return;
26
+ }
24
27
  console.clear();
25
28
  intro(chalk.bgBlue(' Auto Commit Tool '));
26
29
  // 1. Validate git repository and configuration
27
30
  const gitStatus = checkGitStatus();
28
31
  if (!gitStatus.valid) {
32
+ if (gitStatus.reason === 'Not in a Git repository') {
33
+ yield runInitialSetup();
34
+ outro(chalk.green('Setup complete.'));
35
+ return;
36
+ }
29
37
  cancel(gitStatus.reason);
30
38
  process.exit(1);
31
39
  }
32
40
  (_a = gitStatus.warnings) === null || _a === void 0 ? void 0 : _a.forEach(warning => console.log(chalk.yellow.bold(`\n⚠️ ${warning}`)));
33
- // 2. Get current repository changes
34
- const changes = getChanges();
35
- const allFiles = [...changes.staged, ...changes.unstaged, ...changes.untracked];
36
- // 3. Handle no changes case
37
- if (allFiles.length === 0) {
38
- outro(chalk.green('✨ Working directory is clean. Nothing to commit! 🎉'));
39
- process.exit(0);
40
- }
41
- // 4. Display current repository status
42
- displayRepositoryStatus(changes);
43
- // 5. Handle file staging if needed
44
- const filesToCommit = yield handleFileStaging(changes);
45
- if (filesToCommit.length === 0) {
46
- outro(chalk.yellow('ℹ️ No files to commit after staging process.'));
47
- process.exit(0);
48
- }
49
- // 6. Handle commit message creation
50
- const commitMessage = yield handleCommitMessage(filesToCommit);
51
- // 7. Perform the commit
52
- const commitSuccess = yield performCommit(commitMessage);
53
- if (!commitSuccess) {
54
- process.exit(1);
41
+ if (process.argv[2] === 'commit' && getRepositoryState().operation) {
42
+ yield handleInProgressOperation();
55
43
  }
56
- // 8. Handle push to remote
57
- yield handlePushToRemote();
44
+ else if (process.argv[2] === 'commit')
45
+ yield runCommitWorkflow();
46
+ else
47
+ yield runWorkspace();
58
48
  outro(chalk.green('🎉 All done!'));
59
49
  });
60
50
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;AAEA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,MAAM,iCAAiC,CAAC;AAEpD,SAAe,IAAI;;;QACjB,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAE1C,+CAA+C;QAC/C,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAA,SAAS,CAAC,QAAQ,0CAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3F,oCAAoC;QACpC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhF,4BAA4B;QAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uCAAuC;QACvC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEjC,mCAAmC;QACnC,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAEvD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oCAAoC;QACpC,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAE/D,wBAAwB;QACxB,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;QAEzD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,2BAA2B;QAC3B,MAAM,kBAAkB,EAAE,CAAC;QAE3B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACrC,CAAC;CAAA;AAED,KAAK,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;AAEA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,MAAM,iCAAiC,CAAC;AAEpD,SAAe,IAAI;;;QACjB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,sRAAsR,CAAC,CAAC;YACpS,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAE1C,+CAA+C;QAC/C,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,SAAS,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC;gBACnD,MAAM,eAAe,EAAE,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAA,SAAS,CAAC,QAAQ,0CAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,kBAAkB,EAAE,CAAC,SAAS,EAAE,CAAC;YACnE,MAAM,yBAAyB,EAAE,CAAC;QACpC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,MAAM,iBAAiB,EAAE,CAAC;;YAC9D,MAAM,YAAY,EAAE,CAAC;QAE1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACrC,CAAC;CAAA;AAED,KAAK,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function buildCreateBranchArgs(name: string): string[];
2
+ export declare function manageBranches(): Promise<void>;
@@ -0,0 +1,60 @@
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 { validateBranchName } from './validation.js';
14
+ import { ui } from './ui.js';
15
+ export function buildCreateBranchArgs(name) { return ['switch', '-c', name]; }
16
+ export function manageBranches() {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ const action = yield select({ message: 'Branch action:', options: [{ value: 'switch', label: 'Switch branch' }, { value: 'create', label: 'Create branch' }, { value: 'list', label: 'List branches' }] });
19
+ if (isCancel(action))
20
+ return;
21
+ if (action === 'list') {
22
+ ui.title('Branches', '⑂');
23
+ const output = gitOutput(['branch', '--verbose', '--no-abbrev']);
24
+ return output ? ui.branchList(output, getRepositoryState().branch) : ui.warning('No branches found.');
25
+ }
26
+ if (action === 'create')
27
+ return void (yield createBranch());
28
+ yield switchBranch();
29
+ });
30
+ }
31
+ function createBranch() {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ const name = yield text({ message: 'New branch name:', placeholder: 'feature/my-change', validate: value => validateBranchName(value) });
34
+ if (isCancel(name))
35
+ return;
36
+ const confirmed = yield confirm({ message: `Create and switch to "${name}"?` });
37
+ if (isCancel(confirmed) || !confirmed)
38
+ return;
39
+ const result = gitCommand(buildCreateBranchArgs(name));
40
+ result.ok ? ui.success(`Now on ${name}.`) : ui.error(gitErrorText(result));
41
+ });
42
+ }
43
+ function switchBranch() {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ var _a;
46
+ const state = getRepositoryState();
47
+ if (hasLocalChanges(state.changes))
48
+ return void ui.warning('Commit or stash local changes before switching branches.');
49
+ const branches = ((_a = gitOutput(['branch', '--format=%(refname:short)'])) !== null && _a !== void 0 ? _a : '').split('\n').filter(Boolean);
50
+ const target = yield select({ message: 'Switch to:', options: branches.filter(branch => branch !== state.branch).map(branch => ({ value: branch, label: branch })) });
51
+ if (isCancel(target))
52
+ return;
53
+ const confirmed = yield confirm({ message: `Switch to "${target}"?` });
54
+ if (isCancel(confirmed) || !confirmed)
55
+ return;
56
+ const result = gitCommand(['switch', target]);
57
+ result.ok ? ui.success(`Now on ${target}.`) : ui.error(gitErrorText(result));
58
+ });
59
+ }
60
+ //# sourceMappingURL=branches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branches.js","sourceRoot":"","sources":["../../src/utils/branches.ts"],"names":[],"mappings":"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"}
@@ -23,13 +23,11 @@ export function checkGitStatus() {
23
23
  if (!gitDir) {
24
24
  return { valid: false, reason: 'Not in a Git repository' };
25
25
  }
26
- // Step 3: Refuse to commit into a half-finished merge/rebase/cherry-pick
26
+ // An in-progress operation is recoverable from the workspace conflict UI.
27
27
  for (const { entry, reason } of IN_PROGRESS) {
28
28
  if (existsSync(path.join(gitDir, entry))) {
29
- return {
30
- valid: false,
31
- reason: `${reason}. Finish or abort it first (e.g. \`git merge --abort\`, \`git rebase --abort\`).`
32
- };
29
+ warnings.push(`${reason}. Select “Resolve in-progress operation” for guided recovery.`);
30
+ break;
33
31
  }
34
32
  }
35
33
  // Step 4: Warn loudly about a detached HEAD (commits there are easy to lose)
@@ -1 +1 @@
1
- {"version":3,"file":"checkGitStatus.js","sourceRoot":"","sources":["../../src/utils/checkGitStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGxD,uDAAuD;AACvD,MAAM,WAAW,GAA6C;IAC5D,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,wBAAwB,EAAE;IACzD,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC3D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC5D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,qCAAqC,EAAE;IACxE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,8BAA8B,EAAE;IACrE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC3D,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,iCAAiC,EAAE;CACnE,CAAC;AAEF,MAAM,UAAU,cAAc;;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,oCAAoC;IACpC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACzE,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC7D,CAAC;IAED,yEAAyE;IACzE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,GAAG,MAAM,kFAAkF;aACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAA,SAAS,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,mCAAI,SAAS,CAAC;QACtE,QAAQ,CAAC,IAAI,CACX,uBAAuB,IAAI,mGAAmG,CAC/H,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,gIAAgI;SACzI,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"checkGitStatus.js","sourceRoot":"","sources":["../../src/utils/checkGitStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGxD,uDAAuD;AACvD,MAAM,WAAW,GAA6C;IAC5D,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,wBAAwB,EAAE;IACzD,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC3D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC5D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,qCAAqC,EAAE;IACxE,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,8BAA8B,EAAE;IACrE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB,EAAE;IAC3D,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,iCAAiC,EAAE;CACnE,CAAC;AAEF,MAAM,UAAU,cAAc;;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,oCAAoC;IACpC,IAAI,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACzE,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC7D,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,+DAA+D,CAAC,CAAC;YACxF,MAAM;QACR,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAA,SAAS,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,mCAAI,SAAS,CAAC;QACtE,QAAQ,CAAC,IAAI,CACX,uBAAuB,IAAI,mGAAmG,CAC/H,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,gIAAgI;SACzI,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runCommitWorkflow(): Promise<void>;
@@ -0,0 +1,33 @@
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 { outro } from '@clack/prompts';
11
+ import chalk from 'chalk';
12
+ import { getChanges } from './getFileChanges.js';
13
+ import { displayRepositoryStatus } from './displayStatus.js';
14
+ import { handleFileStaging } from './fileStaging.js';
15
+ import { handleCommitMessage } from './commitMessage.js';
16
+ import { performCommit } from './performCommit.js';
17
+ import { handlePushToRemote } from './push_to_remote.js';
18
+ export function runCommitWorkflow() {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ const changes = getChanges();
21
+ const allFiles = [...changes.staged, ...changes.unstaged, ...changes.untracked];
22
+ if (!allFiles.length)
23
+ return void outro(chalk.green('Working directory is clean. Nothing to commit.'));
24
+ displayRepositoryStatus(changes);
25
+ const files = yield handleFileStaging(changes);
26
+ if (!files.length)
27
+ return;
28
+ const message = yield handleCommitMessage(files);
29
+ if (yield performCommit(message))
30
+ yield handlePushToRemote();
31
+ });
32
+ }
33
+ //# sourceMappingURL=commitWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitWorkflow.js","sourceRoot":"","sources":["../../src/utils/commitWorkflow.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAgB,iBAAiB;;QACrC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACvG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,MAAM,aAAa,CAAC,OAAO,CAAC;YAAE,MAAM,kBAAkB,EAAE,CAAC;IAC/D,CAAC;CAAA"}
@@ -0,0 +1,7 @@
1
+ import { GitOperation } from './repository.js';
2
+ export interface OperationCommands {
3
+ continueArgs: string[] | null;
4
+ abortArgs: string[];
5
+ }
6
+ export declare function operationCommands(operation: GitOperation): OperationCommands;
7
+ export declare function handleInProgressOperation(): Promise<void>;
@@ -0,0 +1,96 @@
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 { spawnSync } from 'child_process';
11
+ import { confirm, isCancel, select } from '@clack/prompts';
12
+ import chalk from 'chalk';
13
+ import { gitCommand, gitErrorText } from './gitCommand.js';
14
+ import { getRepositoryState } from './repository.js';
15
+ export function operationCommands(operation) {
16
+ switch (operation) {
17
+ case 'merge': return { continueArgs: ['commit', '--no-edit'], abortArgs: ['merge', '--abort'] };
18
+ case 'rebase': return { continueArgs: ['rebase', '--continue'], abortArgs: ['rebase', '--abort'] };
19
+ case 'am': return { continueArgs: ['am', '--continue'], abortArgs: ['am', '--abort'] };
20
+ case 'cherry-pick': return { continueArgs: ['cherry-pick', '--continue'], abortArgs: ['cherry-pick', '--abort'] };
21
+ case 'revert': return { continueArgs: ['revert', '--continue'], abortArgs: ['revert', '--abort'] };
22
+ case 'bisect': return { continueArgs: null, abortArgs: ['bisect', 'reset'] };
23
+ }
24
+ }
25
+ function operationLabel(operation) { return operation === 'cherry-pick' ? 'cherry-pick' : operation; }
26
+ export function handleInProgressOperation() {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ const state = getRepositoryState();
29
+ if (!state.operation)
30
+ return void console.log(chalk.green('No merge, rebase, cherry-pick, revert, or bisect is in progress.'));
31
+ const { operation, conflicts } = state;
32
+ console.log(chalk.yellow(`\n${operationLabel(operation)} in progress.`));
33
+ if (conflicts.length)
34
+ console.log(chalk.red(`Conflicted files:\n${conflicts.map(file => ` • ${file}`).join('\n')}`));
35
+ else
36
+ console.log('No unresolved files detected. You can continue or abort the operation.');
37
+ const commands = operationCommands(operation);
38
+ const action = yield select({ message: `Resolve ${operationLabel(operation)}:`, options: [
39
+ ...(conflicts.length ? [{ value: 'edit', label: 'Open a conflicted file in my editor' }, { value: 'resolved', label: 'Mark a resolved file as staged' }] : []),
40
+ ...(commands.continueArgs ? [{ value: 'continue', label: `Continue ${operationLabel(operation)}` }] : []),
41
+ { value: 'abort', label: `Abort ${operationLabel(operation)}` },
42
+ { value: 'back', label: 'Back to workspace' }
43
+ ] });
44
+ if (isCancel(action) || action === 'back')
45
+ return;
46
+ if (action === 'edit')
47
+ return void (yield editConflict(conflicts));
48
+ if (action === 'resolved')
49
+ return void (yield stageResolved(conflicts));
50
+ yield finishOperation(operation, action);
51
+ });
52
+ }
53
+ function editConflict(files) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const file = yield select({ message: 'Open which file?', options: files.map(value => ({ value, label: value })) });
56
+ if (isCancel(file))
57
+ return;
58
+ const editor = process.env.GIT_EDITOR || process.env.VISUAL || process.env.EDITOR;
59
+ if (!editor)
60
+ return void console.log(chalk.yellow(`No editor is configured. Resolve ${file} in your editor, then return here to mark it resolved.`));
61
+ const [command, ...args] = editor.split(/\s+/).filter(Boolean);
62
+ const result = spawnSync(command, [...args, file], { stdio: 'inherit' });
63
+ if (result.error)
64
+ console.log(chalk.red(`Could not open ${command}: ${result.error.message}`));
65
+ else
66
+ console.log('Editor closed. Select “Mark a resolved file as staged” after removing conflict markers.');
67
+ });
68
+ }
69
+ function stageResolved(files) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ const file = yield select({ message: 'Which resolved file should be staged?', options: files.map(value => ({ value, label: value })) });
72
+ if (isCancel(file))
73
+ return;
74
+ const confirmed = yield confirm({ message: `Mark ${file} as resolved by staging it?` });
75
+ if (isCancel(confirmed) || !confirmed)
76
+ return;
77
+ const result = gitCommand(['add', '--', file]);
78
+ console.log(result.ok ? chalk.green(`${file} staged. Resolve remaining files, then continue.`) : chalk.red(gitErrorText(result)));
79
+ });
80
+ }
81
+ function finishOperation(operation, action) {
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ const state = getRepositoryState();
84
+ if (action === 'continue' && state.conflicts.length)
85
+ return void console.log(chalk.yellow('Resolve and stage every conflicted file before continuing.'));
86
+ const confirmed = yield confirm({ message: `${action === 'abort' ? 'Abort' : 'Continue'} this ${operationLabel(operation)}?` });
87
+ if (isCancel(confirmed) || !confirmed)
88
+ return;
89
+ const commands = operationCommands(operation);
90
+ if (action === 'continue' && !commands.continueArgs)
91
+ return;
92
+ const result = gitCommand(action === 'continue' ? commands.continueArgs : commands.abortArgs);
93
+ console.log(result.ok ? chalk.green(`${operationLabel(operation)} ${action === 'abort' ? 'aborted' : 'completed'}.`) : chalk.red(gitErrorText(result)));
94
+ });
95
+ }
96
+ //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/utils/conflicts.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,17 @@
1
- import chalk from 'chalk';
2
- import { formatFileStatus } from './formatFileStatus.js';
1
+ import { ui } from './ui.js';
3
2
  export function displayRepositoryStatus(changes) {
4
- console.log(chalk.bold('\n📁 Repository Status:'));
3
+ ui.title('Repository Status', '◈');
5
4
  if (changes.staged.length > 0) {
6
- console.log(chalk.green('\nStaged files:'));
7
- changes.staged.forEach(({ status, file }) => console.log(` ${formatFileStatus(status)} ${file}`));
5
+ ui.section('Staged files', '✓');
6
+ ui.files(changes.staged);
8
7
  }
9
8
  if (changes.unstaged.length > 0) {
10
- console.log(chalk.yellow('\nUnstaged files:'));
11
- changes.unstaged.forEach(({ status, file }) => console.log(` ${formatFileStatus(status)} ${file}`));
9
+ ui.section('Unstaged files', '!');
10
+ ui.files(changes.unstaged);
12
11
  }
13
12
  if (changes.untracked.length > 0) {
14
- console.log(chalk.cyan('\nUntracked files:'));
15
- changes.untracked.forEach(({ status, file }) => console.log(` ${formatFileStatus(status)} ${file}`));
13
+ ui.section('Untracked files', '?');
14
+ ui.files(changes.untracked);
16
15
  }
17
16
  }
18
17
  //# sourceMappingURL=displayStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"displayStatus.js","sourceRoot":"","sources":["../../src/utils/displayStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,uBAAuB,CAAC,OAAmB;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CACrD,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"displayStatus.js","sourceRoot":"","sources":["../../src/utils/displayStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,MAAM,UAAU,uBAAuB,CAAC,OAAmB;IACzD,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface HelpEntry {
2
+ title: string;
3
+ command: string;
4
+ description: string;
5
+ }
6
+ export declare function helpEntry(action: string): HelpEntry | undefined;
7
+ export declare function showHelp(): Promise<void>;
@@ -0,0 +1,35 @@
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 { select, isCancel } from '@clack/prompts';
11
+ import chalk from 'chalk';
12
+ import { ui } from './ui.js';
13
+ const ENTRIES = {
14
+ commit: { title: 'Commit changes', command: 'git add … && git commit -m "…"', description: 'Stage selected changes and create a commit.' },
15
+ sync: { title: 'Sync with remote', command: 'git fetch --prune && git pull --ff-only / git push', description: 'Fetch first, then safely bring your branch up to date or publish it.' },
16
+ push: { title: 'Push current branch', command: 'git push [--set-upstream <remote> <branch>]', description: 'Publish the current branch after a confirmation.' },
17
+ branches: { title: 'Manage branches', command: 'git branch / git switch / git switch -c <name>', description: 'List, switch, or create branches without deleting or merging them.' },
18
+ stash: { title: 'Save or restore work', command: 'git stash push / list / apply / pop / drop', description: 'Put work aside and restore it when you are ready.' },
19
+ conflicts: { title: 'Resolve an in-progress operation', command: 'git add <file> && git merge --continue', description: 'Inspect conflicts, open files in your editor, then continue or abort safely.' },
20
+ inspect: { title: 'Inspect repository', command: 'git status / log / remote -v', description: 'See a readable summary of repository state and recent activity.' }
21
+ };
22
+ export function helpEntry(action) { return ENTRIES[action]; }
23
+ export function showHelp() {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const action = yield select({ message: 'What would you like explained?', options: Object.entries(ENTRIES).map(([value, entry]) => ({ value, label: entry.title, hint: entry.description })) });
26
+ if (isCancel(action))
27
+ return;
28
+ const entry = helpEntry(action);
29
+ if (entry) {
30
+ ui.title(entry.title, '?');
31
+ console.log(`${chalk.white(entry.description)}\n\n${chalk.dim('NATIVE GIT')} ${chalk.magenta(entry.command)}`);
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/utils/help.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAI7B,MAAM,OAAO,GAA8B;IACzC,MAAM,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,gCAAgC,EAAE,WAAW,EAAE,6CAA6C,EAAE;IAC1I,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,oDAAoD,EAAE,WAAW,EAAE,sEAAsE,EAAE;IACvL,IAAI,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,6CAA6C,EAAE,WAAW,EAAE,kDAAkD,EAAE;IAC/J,QAAQ,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,gDAAgD,EAAE,WAAW,EAAE,oEAAoE,EAAE;IACpL,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,4CAA4C,EAAE,WAAW,EAAE,mDAAmD,EAAE;IACjK,SAAS,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,OAAO,EAAE,wCAAwC,EAAE,WAAW,EAAE,8EAA8E,EAAE;IACxM,OAAO,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,iEAAiE,EAAE;CAClK,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,MAAc,IAA2B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE5F,MAAM,UAAgB,QAAQ;;QAC5B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/L,IAAI,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAgB,CAAC,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC7J,CAAC;CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function showRepositorySummary(): void;
2
+ export declare function inspectRepository(): void;
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { getRepositoryState, hasLocalChanges } from './repository.js';
3
+ import { gitOutput } from './gitCommand.js';
4
+ import { ui } from './ui.js';
5
+ export function showRepositorySummary() {
6
+ var _a, _b;
7
+ const state = getRepositoryState();
8
+ const fileCount = state.changes.staged.length + state.changes.unstaged.length + state.changes.untracked.length;
9
+ ui.title('Repository Overview', '◈');
10
+ ui.key('BRANCH', chalk.cyan.bold((_a = state.branch) !== null && _a !== void 0 ? _a : 'detached HEAD'));
11
+ ui.key('WORKING TREE', hasLocalChanges(state.changes) ? chalk.yellow(`${fileCount} changed file(s)`) : chalk.green('clean'));
12
+ ui.key('REMOTE', chalk.blue((_b = state.upstream) !== null && _b !== void 0 ? _b : (state.remotes[0] ? `${state.remotes[0]} (no upstream)` : 'none configured')));
13
+ if (state.aheadBehind)
14
+ ui.key('SYNC', chalk.magenta(`${state.aheadBehind.ahead} ahead · ${state.aheadBehind.behind} behind`));
15
+ if (state.operation)
16
+ ui.warning(`${state.operation} is in progress${state.conflicts.length ? ` — ${state.conflicts.length} conflict(s)` : ''}`);
17
+ }
18
+ export function inspectRepository() {
19
+ var _a, _b;
20
+ const state = getRepositoryState();
21
+ showRepositorySummary();
22
+ const recent = (_a = gitOutput(['log', '-5', '--oneline'])) !== null && _a !== void 0 ? _a : '';
23
+ if (recent) {
24
+ ui.section('Recent commits', '↳');
25
+ ui.commitList(recent);
26
+ }
27
+ const remotes = (_b = gitOutput(['remote', '-v'])) !== null && _b !== void 0 ? _b : '';
28
+ if (remotes) {
29
+ ui.section('Remotes', '↗');
30
+ ui.remoteList(remotes);
31
+ }
32
+ if (state.conflicts.length) {
33
+ ui.section('Conflicted files', '✕');
34
+ state.conflicts.forEach(file => console.log(` ${chalk.red('✕')} ${chalk.white(file)}`));
35
+ }
36
+ }
37
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/utils/inspect.ts"],"names":[],"mappings":"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"}
@@ -1 +1,15 @@
1
+ interface PushTarget {
2
+ branch: string;
3
+ remote: string;
4
+ /** Upstream ref as `<remote>/<branch>`, or null when none is configured. */
5
+ upstream: string | null;
6
+ }
7
+ export declare function parseUpstream(upstream: string, remotes: string[]): {
8
+ remote: string;
9
+ branch: string;
10
+ } | null;
11
+ export declare function resolvePushTarget(currentBranch: string, upstream: string | null, remotes: string[]): PushTarget | null;
12
+ /** Always name the reviewed remote and branch; user push.default settings must not redirect it. */
13
+ export declare function buildPushArgs(upstream: string | null, remote: string, branch: string): string[];
1
14
  export declare function handlePushToRemote(): Promise<void>;
15
+ export {};
@@ -11,6 +11,29 @@ import { confirm, spinner, isCancel } from '@clack/prompts';
11
11
  import chalk from 'chalk';
12
12
  import { gitCommand, gitErrorText, gitOutput } from './gitCommand.js';
13
13
  const PROTECTED_BRANCHES = new Set(['main', 'master', 'production', 'release']);
14
+ export function parseUpstream(upstream, remotes) {
15
+ const remote = remotes
16
+ .filter(candidate => upstream.startsWith(`${candidate}/`))
17
+ .sort((a, b) => b.length - a.length)[0];
18
+ if (!remote)
19
+ return null;
20
+ const branch = upstream.slice(remote.length + 1);
21
+ return branch ? { remote, branch } : null;
22
+ }
23
+ export function resolvePushTarget(currentBranch, upstream, remotes) {
24
+ if (upstream) {
25
+ const target = parseUpstream(upstream, remotes);
26
+ return target ? { branch: target.branch, remote: target.remote, upstream } : null;
27
+ }
28
+ const remote = remotes.includes('origin') ? 'origin' : remotes[0];
29
+ return remote ? { branch: currentBranch, remote, upstream: null } : null;
30
+ }
31
+ /** Always name the reviewed remote and branch; user push.default settings must not redirect it. */
32
+ export function buildPushArgs(upstream, remote, branch) {
33
+ return upstream
34
+ ? ['push', remote, `HEAD:${branch}`]
35
+ : ['push', '--set-upstream', remote, `HEAD:${branch}`];
36
+ }
14
37
  export function handlePushToRemote() {
15
38
  return __awaiter(this, void 0, void 0, function* () {
16
39
  var _a;
@@ -25,18 +48,21 @@ export function handlePushToRemote() {
25
48
  return;
26
49
  }
27
50
  const upstream = gitOutput(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}']);
28
- const remote = upstream ? upstream.split('/')[0] : remotes.includes('origin') ? 'origin' : remotes[0];
29
- const target = { branch, remote, upstream };
30
- if (PROTECTED_BRANCHES.has(branch.toLowerCase())) {
31
- console.log(chalk.yellow.bold(`\n⚠️ You are about to push directly to "${branch}".`));
51
+ const target = resolvePushTarget(branch, upstream, remotes);
52
+ if (!target) {
53
+ console.log(chalk.yellow('Your configured upstream remote no longer exists. Repair it with `git branch --unset-upstream` or configure a valid remote before pushing.'));
54
+ return;
55
+ }
56
+ if (PROTECTED_BRANCHES.has(target.branch.toLowerCase())) {
57
+ console.log(chalk.yellow.bold(`\n⚠️ You are about to push directly to "${target.branch}".`));
32
58
  }
33
59
  if (!upstream) {
34
- console.log(chalk.yellow(`ℹ️ "${branch}" has no upstream; it will be created as ${remote}/${branch}.`));
60
+ console.log(chalk.yellow(`ℹ️ "${branch}" has no upstream; it will be created as ${target.remote}/${target.branch}.`));
35
61
  }
36
62
  const shouldPush = yield confirm({
37
63
  message: upstream
38
64
  ? `Push to ${upstream}?`
39
- : `Push to ${remote}/${branch} and set it as upstream?`
65
+ : `Push to ${target.remote}/${target.branch} and set it as upstream?`
40
66
  });
41
67
  if (isCancel(shouldPush) || !shouldPush) {
42
68
  return;
@@ -47,9 +73,7 @@ export function handlePushToRemote() {
47
73
  function executePush(target) {
48
74
  const pushSpinner = spinner();
49
75
  pushSpinner.start(`Pushing to ${target.remote}/${target.branch}...`);
50
- const args = target.upstream
51
- ? ['push']
52
- : ['push', '--set-upstream', target.remote, target.branch];
76
+ const args = buildPushArgs(target.upstream, target.remote, target.branch);
53
77
  const result = gitCommand(args);
54
78
  if (result.ok) {
55
79
  pushSpinner.stop('🚀 Changes pushed successfully!');
@@ -1 +1 @@
1
- {"version":3,"file":"push_to_remote.js","sourceRoot":"","sources":["../../src/utils/push_to_remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push_to_remote.js","sourceRoot":"","sources":["../../src/utils/push_to_remote.ts"],"names":[],"mappings":"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"}