git-it-done 1.0.1 → 1.1.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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +26 -29
  4. package/dist/index.js.map +1 -1
  5. package/dist/utils/checkGitStatus.d.ts +1 -1
  6. package/dist/utils/checkGitStatus.js +40 -26
  7. package/dist/utils/checkGitStatus.js.map +1 -1
  8. package/dist/utils/commitMessage.d.ts +1 -1
  9. package/dist/utils/commitMessage.js +17 -23
  10. package/dist/utils/commitMessage.js.map +1 -1
  11. package/dist/utils/diffSignals.d.ts +22 -0
  12. package/dist/utils/diffSignals.js +75 -0
  13. package/dist/utils/diffSignals.js.map +1 -0
  14. package/dist/utils/displayStatus.d.ts +1 -1
  15. package/dist/utils/displayStatus.js +10 -16
  16. package/dist/utils/displayStatus.js.map +1 -1
  17. package/dist/utils/fileStaging.d.ts +1 -1
  18. package/dist/utils/fileStaging.js +84 -44
  19. package/dist/utils/fileStaging.js.map +1 -1
  20. package/dist/utils/formatFileStatus.js +14 -14
  21. package/dist/utils/formatFileStatus.js.map +1 -1
  22. package/dist/utils/generateCommitMessage.d.ts +13 -1
  23. package/dist/utils/generateCommitMessage.js +179 -90
  24. package/dist/utils/generateCommitMessage.js.map +1 -1
  25. package/dist/utils/getFileChanges.d.ts +15 -1
  26. package/dist/utils/getFileChanges.js +60 -22
  27. package/dist/utils/getFileChanges.js.map +1 -1
  28. package/dist/utils/gitCommand.d.ts +27 -1
  29. package/dist/utils/gitCommand.js +53 -13
  30. package/dist/utils/gitCommand.js.map +1 -1
  31. package/dist/utils/performCommit.js +39 -50
  32. package/dist/utils/performCommit.js.map +1 -1
  33. package/dist/utils/process_interruption.js +23 -17
  34. package/dist/utils/process_interruption.js.map +1 -1
  35. package/dist/utils/push_to_remote.js +56 -46
  36. package/dist/utils/push_to_remote.js.map +1 -1
  37. package/dist/utils/repoRoot.d.ts +6 -0
  38. package/dist/utils/repoRoot.js +10 -0
  39. package/dist/utils/repoRoot.js.map +1 -0
  40. package/dist/utils/types/types.d.ts +11 -1
  41. package/dist/utils/types/types.js +1 -2
  42. package/package.json +39 -8
  43. package/readme.md +298 -9
  44. package/dist/utils/isGitrepo.d.ts +0 -1
  45. package/dist/utils/isGitrepo.js +0 -9
  46. package/dist/utils/isGitrepo.js.map +0 -1
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,25 +7,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
8
  });
10
9
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.handleFileStaging = handleFileStaging;
16
- const prompts_1 = require("@clack/prompts");
17
- const chalk_1 = __importDefault(require("chalk"));
18
- const gitCommand_1 = require("./gitCommand");
19
- const getFileChanges_1 = require("./getFileChanges");
20
- const formatFileStatus_1 = require("./formatFileStatus");
21
- function handleFileStaging(changes) {
10
+ import { select, multiselect, spinner, cancel, isCancel } from '@clack/prompts';
11
+ import chalk from 'chalk';
12
+ import { gitCommand, gitErrorText } from './gitCommand.js';
13
+ import { getChanges } from './getFileChanges.js';
14
+ import { getRepoRoot } from './repoRoot.js';
15
+ import { formatFileStatus } from './formatFileStatus.js';
16
+ export function handleFileStaging(changes) {
22
17
  return __awaiter(this, void 0, void 0, function* () {
23
- let filesToCommit = changes.staged;
24
- // If files are already staged, return them
25
- if (changes.staged.length > 0) {
26
- return filesToCommit;
18
+ let current = changes;
19
+ // Never silently adopt a pre-existing index — show it and ask.
20
+ if (current.staged.length > 0) {
21
+ const decision = yield confirmExistingIndex(current.staged);
22
+ if (decision === 'keep') {
23
+ return current.staged;
24
+ }
25
+ resetIndex();
26
+ current = getChanges();
27
+ if (current.unstaged.length === 0 && current.untracked.length === 0) {
28
+ return [];
29
+ }
27
30
  }
28
- // Handle unstaged files
29
- const stageOption = yield (0, prompts_1.select)({
31
+ const stageOption = yield select({
30
32
  message: 'No files are staged. What would you like to do?',
31
33
  options: [
32
34
  { value: 'all', label: 'Stage all changes' },
@@ -34,65 +36,103 @@ function handleFileStaging(changes) {
34
36
  { value: 'cancel', label: 'Cancel' }
35
37
  ]
36
38
  });
37
- if ((0, prompts_1.isCancel)(stageOption) || stageOption === 'cancel') {
38
- (0, prompts_1.cancel)('Operation cancelled');
39
+ if (isCancel(stageOption) || stageOption === 'cancel') {
40
+ cancel('Operation cancelled');
39
41
  process.exit(0);
40
42
  }
41
43
  if (stageOption === 'all') {
42
- filesToCommit = yield stageAllFiles();
44
+ return yield stageAllFiles();
45
+ }
46
+ if (stageOption === 'select') {
47
+ return yield stageSelectedFiles(current);
43
48
  }
44
- else if (stageOption === 'select') {
45
- filesToCommit = yield stageSelectedFiles(changes);
49
+ return current.staged;
50
+ });
51
+ }
52
+ function confirmExistingIndex(staged) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ console.log(chalk.bold('\n📦 Already staged (from a previous session or manual `git add`):'));
55
+ staged.forEach(({ status, file, from }) => console.log(` ${formatFileStatus(status)} ${from ? `${from} → ${file}` : file}`));
56
+ const decision = yield select({
57
+ message: `${staged.length} file(s) are already staged. What would you like to do?`,
58
+ options: [
59
+ { value: 'keep', label: 'Commit these staged files' },
60
+ { value: 'reset', label: 'Unstage everything and choose again' },
61
+ { value: 'cancel', label: 'Cancel' }
62
+ ]
63
+ });
64
+ if (isCancel(decision) || decision === 'cancel') {
65
+ cancel('Operation cancelled');
66
+ process.exit(0);
46
67
  }
47
- return filesToCommit;
68
+ return decision;
48
69
  });
49
70
  }
71
+ function resetIndex() {
72
+ const s = spinner();
73
+ s.start('Unstaging files...');
74
+ let result = gitCommand(['reset', '--quiet', '--', ':/']);
75
+ // An unborn branch has no HEAD to reset against; drop the paths from the index.
76
+ if (!result.ok) {
77
+ result = gitCommand(['rm', '--cached', '-r', '-f', '--quiet', '--', ':/']);
78
+ }
79
+ if (!result.ok) {
80
+ s.stop('❌ Failed to unstage files');
81
+ console.log(chalk.red(gitErrorText(result)));
82
+ cancel('Failed to unstage files');
83
+ process.exit(1);
84
+ }
85
+ s.stop('Index cleared');
86
+ }
50
87
  function stageAllFiles() {
51
88
  return __awaiter(this, void 0, void 0, function* () {
52
- const s = (0, prompts_1.spinner)();
89
+ const s = spinner();
53
90
  s.start('Staging all files...');
54
- const result = (0, gitCommand_1.gitCommand)('add .');
55
- if (result === null) {
91
+ // `:/` makes this repo-root-relative, so the staged set matches the status
92
+ // display even when the tool is run from a subdirectory.
93
+ const result = gitCommand(['add', '-A', '--', ':/']);
94
+ if (!result.ok) {
56
95
  s.stop('❌ Failed to stage files');
57
- (0, prompts_1.cancel)('Failed to stage files');
96
+ console.log(chalk.red(gitErrorText(result)));
97
+ cancel('Failed to stage files');
58
98
  process.exit(1);
59
99
  }
60
100
  s.stop('All files staged');
61
- return (0, getFileChanges_1.getChanges)().staged;
101
+ return getChanges().staged;
62
102
  });
63
103
  }
64
104
  function stageSelectedFiles(changes) {
65
105
  return __awaiter(this, void 0, void 0, function* () {
66
106
  const unstaged = [...changes.unstaged, ...changes.untracked];
67
- const selectedFiles = yield (0, prompts_1.multiselect)({
107
+ const selectedFiles = yield multiselect({
68
108
  message: 'Select files to stage:',
69
- options: unstaged.map(({ status, file }) => ({
109
+ options: unstaged.map(({ status, file, from }) => ({
70
110
  value: file,
71
- label: `${(0, formatFileStatus_1.formatFileStatus)(status)} ${file}`
111
+ label: `${formatFileStatus(status)} ${from ? `${from} → ${file}` : file}`
72
112
  })),
73
113
  required: true
74
114
  });
75
- if ((0, prompts_1.isCancel)(selectedFiles)) {
76
- (0, prompts_1.cancel)('Operation cancelled');
115
+ if (isCancel(selectedFiles)) {
116
+ cancel('Operation cancelled');
77
117
  process.exit(0);
78
118
  }
79
- const s = (0, prompts_1.spinner)();
119
+ const files = selectedFiles;
120
+ const s = spinner();
80
121
  s.start('Staging selected files...');
81
- let stagingFailed = false;
82
- selectedFiles.forEach(file => {
83
- const result = (0, gitCommand_1.gitCommand)(`add "${file}"`);
84
- if (result === null) {
85
- stagingFailed = true;
86
- }
122
+ // Paths are repo-root-relative, so run from the repo root; `--literal-pathspecs`
123
+ // stops names containing `*`, `[` or a leading `:` being read as pathspec magic.
124
+ const repoRoot = getRepoRoot();
125
+ const result = gitCommand(['--literal-pathspecs', 'add', '--', ...files], {
126
+ cwd: repoRoot !== null && repoRoot !== void 0 ? repoRoot : undefined
87
127
  });
88
- if (stagingFailed) {
128
+ if (!result.ok) {
89
129
  s.stop('❌ Some files failed to stage');
90
- console.log(chalk_1.default.yellow('Some files may not have been staged properly.'));
130
+ console.log(chalk.red(gitErrorText(result)));
91
131
  }
92
132
  else {
93
133
  s.stop('Files staged');
94
134
  }
95
- return (0, getFileChanges_1.getChanges)().staged;
135
+ return getChanges().staged;
96
136
  });
97
137
  }
98
138
  //# sourceMappingURL=fileStaging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileStaging.js","sourceRoot":"","sources":["../../src/utils/fileStaging.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileStaging.js","sourceRoot":"","sources":["../../src/utils/fileStaging.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,24 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.formatFileStatus = formatFileStatus;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- function formatFileStatus(status) {
1
+ import chalk from 'chalk';
2
+ export function formatFileStatus(status) {
9
3
  switch (status) {
10
4
  case 'A':
11
- return chalk_1.default.green('+ added');
5
+ return chalk.green('+ added');
12
6
  case 'M':
13
- return chalk_1.default.yellow('~ modified');
7
+ return chalk.yellow('~ modified');
14
8
  case 'D':
15
- return chalk_1.default.red('- deleted');
9
+ return chalk.red('- deleted');
16
10
  case 'R':
17
- return chalk_1.default.blue('→ renamed');
11
+ return chalk.blue('→ renamed');
12
+ case 'C':
13
+ return chalk.blue('⧉ copied');
14
+ case 'T':
15
+ return chalk.magenta('± typechange');
16
+ case 'U':
17
+ return chalk.red('! unmerged');
18
18
  case '??':
19
- return chalk_1.default.cyan('? untracked');
19
+ return chalk.cyan('? untracked');
20
20
  default:
21
- return chalk_1.default.gray(status);
21
+ return chalk.gray(status);
22
22
  }
23
23
  }
24
24
  //# sourceMappingURL=formatFileStatus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatFileStatus.js","sourceRoot":"","sources":["../../src/utils/formatFileStatus.ts"],"names":[],"mappings":";;;;;AAEA,4CAeC;AAjBD,kDAA0B;AAE1B,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,eAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,KAAK,GAAG;YACN,OAAO,eAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,KAAK,IAAI;YACP,OAAO,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC;YACE,OAAO,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"formatFileStatus.js","sourceRoot":"","sources":["../../src/utils/formatFileStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACvC,KAAK,GAAG;YACN,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC;YACE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -1,2 +1,14 @@
1
- import { FileChange } from './types/types';
1
+ import { DiffSignals } from './diffSignals.js';
2
+ import { FileChange } from './types/types.js';
3
+ export type FileCategory = 'deps' | 'test' | 'docs' | 'config' | 'style' | 'source';
4
+ export declare function categorizeFile(file: string): FileCategory;
5
+ /** The category the majority of the changed files belong to. */
6
+ export declare function dominantCategory(files: FileChange[]): FileCategory;
7
+ /**
8
+ * Most common directory across the changed files. `packages/x/...` and
9
+ * `apps/x/...` resolve to `x` so a monorepo commit is not scoped `packages`.
10
+ */
11
+ export declare function deriveScope(files: FileChange[]): string;
12
+ /** Pure, testable core: no git access, all inputs explicit. */
13
+ export declare function buildCommitMessage(files: FileChange[], signals?: DiffSignals | null): string;
2
14
  export declare function generateCommitMessage(files: FileChange[]): string;
@@ -1,111 +1,200 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateCommitMessage = generateCommitMessage;
7
- const path_1 = __importDefault(require("path"));
8
- const gitCommand_1 = require("./gitCommand");
9
- // Generate commit message based on changes
10
- function generateCommitMessage(files) {
11
- var _a, _b, _c;
12
- const fileTypes = new Map();
1
+ import path from 'path';
2
+ import chalk from 'chalk';
3
+ import { readStagedDiffSignals } from './diffSignals.js';
4
+ /** Checked in this order, so the more specific category always wins a tie. */
5
+ const CATEGORY_ORDER = ['deps', 'test', 'docs', 'config', 'style', 'source'];
6
+ const DEPS_FILE = /^(package(-lock)?\.json|npm-shrinkwrap\.json|yarn\.lock|pnpm-lock\.yaml|bun\.lockb?|requirements(-[\w.]+)?\.txt|Pipfile(\.lock)?|poetry\.lock|Gemfile(\.lock)?|go\.(mod|sum)|Cargo\.(toml|lock)|composer\.(json|lock))$/i;
7
+ const TEST_DIR = /(^|\/)(tests?|__tests__|__mocks__|spec|e2e|cypress)\//i;
8
+ const TEST_FILE = /(\.(test|spec)\.[cm]?[jt]sx?|_test\.(go|py|rb)|^test_[^/]+\.py)$/i;
9
+ const DOCS_DIR = /(^|\/)docs?\//i;
10
+ const DOCS_FILE = /(\.(md|mdx|rst|adoc)|^(readme|changelog|contributing|authors|license)(\.[a-z]+)?)$/i;
11
+ const STYLE_FILE = /\.(css|scss|sass|less|styl)$/i;
12
+ /** Real configuration files — not "anything ending in .json". */
13
+ const CONFIG_FILE = /^(tsconfig(\.[\w-]+)?\.json|jsconfig\.json|\.editorconfig|\.gitignore|\.gitattributes|\.npmrc|\.npmignore|\.nvmrc|\.node-version|\.eslintrc(\.[\w-]+)?|\.eslintignore|\.prettierrc(\.[\w-]+)?|\.prettierignore|\.babelrc(\.[\w-]+)?|\.dockerignore|\.env(\.[\w-]+)?|Dockerfile(\.[\w-]+)?|docker-compose(\.[\w-]+)?\.ya?ml|Makefile|renovate\.json|netlify\.toml|vercel\.json)$/i;
14
+ const CONFIG_SUFFIX = /\.config\.([cm]?[jt]s|json|ya?ml|toml)$/i;
15
+ const CONFIG_DIR = /^\.(github|circleci|vscode|husky|idea)\//i;
16
+ /** Monorepo container directories whose child directory is the useful scope. */
17
+ const CONTAINER_DIRS = new Set(['packages', 'apps', 'libs', 'services', 'crates', 'modules']);
18
+ export function categorizeFile(file) {
19
+ var _a;
20
+ const base = (_a = file.split('/').pop()) !== null && _a !== void 0 ? _a : file;
21
+ if (DEPS_FILE.test(base))
22
+ return 'deps';
23
+ if (TEST_DIR.test(file) || TEST_FILE.test(base))
24
+ return 'test';
25
+ if (DOCS_DIR.test(file) || DOCS_FILE.test(base))
26
+ return 'docs';
27
+ if (CONFIG_FILE.test(base) || CONFIG_SUFFIX.test(base) || CONFIG_DIR.test(file))
28
+ return 'config';
29
+ if (STYLE_FILE.test(base))
30
+ return 'style';
31
+ return 'source';
32
+ }
33
+ /** The category the majority of the changed files belong to. */
34
+ export function dominantCategory(files) {
35
+ var _a, _b;
36
+ const counts = new Map();
37
+ for (const { file } of files) {
38
+ const category = categorizeFile(file);
39
+ counts.set(category, ((_a = counts.get(category)) !== null && _a !== void 0 ? _a : 0) + 1);
40
+ }
41
+ let winner = 'source';
42
+ let best = 0;
43
+ for (const category of CATEGORY_ORDER) {
44
+ const count = (_b = counts.get(category)) !== null && _b !== void 0 ? _b : 0;
45
+ if (count > best) {
46
+ winner = category;
47
+ best = count;
48
+ }
49
+ }
50
+ return winner;
51
+ }
52
+ /**
53
+ * Most common directory across the changed files. `packages/x/...` and
54
+ * `apps/x/...` resolve to `x` so a monorepo commit is not scoped `packages`.
55
+ */
56
+ export function deriveScope(files) {
57
+ var _a;
58
+ const counts = new Map();
59
+ for (const { file } of files) {
60
+ const segments = file.split('/').filter(Boolean);
61
+ if (segments.length < 2)
62
+ continue;
63
+ let scope = segments[0];
64
+ if (CONTAINER_DIRS.has(scope.toLowerCase()) && segments.length > 2) {
65
+ scope = segments[1];
66
+ }
67
+ scope = scope.replace(/[()\s]/g, '');
68
+ if (!scope)
69
+ continue;
70
+ counts.set(scope, ((_a = counts.get(scope)) !== null && _a !== void 0 ? _a : 0) + 1);
71
+ }
72
+ let winner = '';
73
+ let best = 0;
74
+ for (const [scope, count] of counts) {
75
+ if (count > best) {
76
+ winner = scope;
77
+ best = count;
78
+ }
79
+ }
80
+ return winner;
81
+ }
82
+ function countOperations(files) {
13
83
  const operations = { added: 0, modified: 0, deleted: 0, renamed: 0 };
14
- let scope = '';
15
- // Analyze files
16
- for (const { status, file } of files) {
17
- const ext = path_1.default.extname(file);
18
- fileTypes.set(ext, (fileTypes.get(ext) || 0) + 1);
84
+ for (const { status } of files) {
19
85
  switch (status) {
20
86
  case 'A':
87
+ case '??':
21
88
  operations.added++;
22
89
  break;
23
90
  case 'M':
91
+ case 'T':
24
92
  operations.modified++;
25
93
  break;
26
94
  case 'D':
27
95
  operations.deleted++;
28
96
  break;
29
97
  case 'R':
98
+ case 'C':
30
99
  operations.renamed++;
31
100
  break;
32
101
  }
33
- // Determine scope from top-level directory
34
- if (!scope) {
35
- const dir = file.split('/')[0];
36
- if (dir && dir !== file) {
37
- scope = dir;
38
- }
39
- }
40
102
  }
41
- // Detect content types
42
- const hasPattern = (regex) => files.some(f => regex.test(f.file));
43
- const hasTests = hasPattern(/test|spec/i);
44
- const hasDocs = hasPattern(/readme|doc|\.md$/i);
45
- const hasConfig = hasPattern(/config|\.json$|\.ya?ml$|package\.json/i);
46
- const hasStyles = hasPattern(/\.(css|scss|sass|less)$/i);
47
- const hasDeps = hasPattern(/package(-lock)?\.json|yarn\.lock|requirements\.txt/i);
48
- // Determine type and description
49
- let type = 'chore';
50
- let description = '';
51
- if (hasDeps) {
52
- type = 'deps';
53
- description = 'update dependencies';
54
- }
55
- else if (hasTests) {
56
- type = 'test';
57
- description = 'update tests';
58
- }
59
- else if (hasDocs) {
60
- type = 'docs';
61
- description = 'update documentation';
62
- }
63
- else if (hasConfig) {
64
- type = 'config';
65
- description = 'update configuration';
66
- }
67
- else if (hasStyles) {
68
- type = 'style';
69
- description = 'update styles';
70
- }
71
- else if (operations.added > 0 && operations.modified === 0 && operations.deleted === 0) {
72
- type = 'feat';
73
- description = operations.added === 1
74
- ? `add ${path_1.default.basename(((_a = files.find(f => f.status === 'A')) === null || _a === void 0 ? void 0 : _a.file) || '')}`
75
- : 'add new files';
76
- }
77
- else if (operations.deleted > 0 && operations.added === 0 && operations.modified === 0) {
78
- type = 'remove';
79
- description = operations.deleted === 1
80
- ? `remove ${path_1.default.basename(((_b = files.find(f => f.status === 'D')) === null || _b === void 0 ? void 0 : _b.file) || '')}`
81
- : 'remove files';
82
- }
83
- else if (operations.modified > 0) {
84
- type = 'fix';
85
- description = operations.modified === 1 && operations.added === 0 && operations.deleted === 0
86
- ? `update ${path_1.default.basename(((_c = files.find(f => f.status === 'M')) === null || _c === void 0 ? void 0 : _c.file) || '')}`
87
- : 'update and improve code';
88
- }
89
- // Refine with diff content
90
- try {
91
- const diff = (0, gitCommand_1.gitCommand)('diff --cached') || '';
92
- if (/bug|fix|error|issue/i.test(diff)) {
93
- type = 'fix';
94
- description = 'resolve issues and bugs';
95
- }
96
- else if (/refactor|restructure/i.test(diff)) {
97
- type = 'refactor';
98
- description = 'refactor code structure';
99
- }
100
- else if (/function|def|class|interface/i.test(diff) && type === 'fix') {
101
- type = 'feat';
102
- description = 'implement new functionality';
103
- }
103
+ return operations;
104
+ }
105
+ function firstNameWithStatus(files, statuses) {
106
+ const match = files.find(file => statuses.includes(file.status));
107
+ return match ? path.basename(match.file) : '';
108
+ }
109
+ function classifySource(files, operations) {
110
+ const { added, modified, deleted, renamed } = operations;
111
+ if (added > 0 && modified === 0 && deleted === 0 && renamed === 0) {
112
+ return {
113
+ type: 'feat',
114
+ description: added === 1 ? `add ${firstNameWithStatus(files, ['A', '??'])}` : `add ${added} new files`
115
+ };
116
+ }
117
+ if (deleted > 0 && added === 0 && modified === 0 && renamed === 0) {
118
+ return {
119
+ type: 'refactor',
120
+ description: deleted === 1 ? `remove ${firstNameWithStatus(files, ['D'])}` : `remove ${deleted} files`
121
+ };
122
+ }
123
+ if (renamed > 0 && added === 0 && modified === 0 && deleted === 0) {
124
+ return {
125
+ type: 'refactor',
126
+ description: renamed === 1 ? `rename ${firstNameWithStatus(files, ['R', 'C'])}` : `rename ${renamed} files`
127
+ };
128
+ }
129
+ if (added > 0 && added >= modified + deleted + renamed) {
130
+ return { type: 'feat', description: 'add new functionality' };
104
131
  }
105
- catch (_d) {
106
- // Ignore diff errors
132
+ if (modified === 1 && added === 0 && deleted === 0 && renamed === 0) {
133
+ return { type: 'chore', description: `update ${firstNameWithStatus(files, ['M', 'T'])}` };
134
+ }
135
+ return { type: 'chore', description: 'update and improve code' };
136
+ }
137
+ function classifyByCategory(category, files, operations) {
138
+ switch (category) {
139
+ case 'deps':
140
+ // `deps` is not a Conventional Commits type; dependency bumps are `build`.
141
+ return { type: 'build', description: 'update dependencies' };
142
+ case 'test':
143
+ return {
144
+ type: 'test',
145
+ description: operations.modified === 0 && operations.added > 0 ? 'add tests' : 'update tests'
146
+ };
147
+ case 'docs':
148
+ return { type: 'docs', description: 'update documentation' };
149
+ case 'config':
150
+ // `config` is not a Conventional Commits type either.
151
+ return { type: 'chore', description: 'update configuration' };
152
+ case 'style':
153
+ return { type: 'style', description: 'update styles' };
154
+ default:
155
+ return classifySource(files, operations);
156
+ }
157
+ }
158
+ /**
159
+ * Diff hints only ever break a tie: they refine the vague `chore: update ...`
160
+ * fallback and are never allowed to override a confident classification such as
161
+ * "40 files were added" or "this commit only touches docs".
162
+ */
163
+ function refine(base, signals) {
164
+ if (!signals || signals.oversized || base.type !== 'chore') {
165
+ return base;
107
166
  }
167
+ if (signals.fixIntent) {
168
+ return { type: 'fix', description: 'correct faulty behavior' };
169
+ }
170
+ if (signals.newApi) {
171
+ return { type: 'feat', description: 'implement new functionality' };
172
+ }
173
+ if (signals.refactorIntent) {
174
+ return { type: 'refactor', description: 'restructure code' };
175
+ }
176
+ if (signals.conditionalChurn) {
177
+ return { type: 'fix', description: 'correct conditional handling' };
178
+ }
179
+ return base;
180
+ }
181
+ /** Pure, testable core: no git access, all inputs explicit. */
182
+ export function buildCommitMessage(files, signals = null) {
183
+ const operations = countOperations(files);
184
+ const category = dominantCategory(files);
185
+ const base = classifyByCategory(category, files, operations);
186
+ const { type, description } = category === 'source' ? refine(base, signals) : base;
187
+ // Renames-only commits used to produce an empty description ("chore(src): ").
188
+ const safeDescription = description.trim() || 'update files';
189
+ const scope = deriveScope(files);
108
190
  const scopeStr = scope ? `(${scope})` : '';
109
- return `${type}${scopeStr}: ${description}`;
191
+ return `${type}${scopeStr}: ${safeDescription}`;
192
+ }
193
+ export function generateCommitMessage(files) {
194
+ const signals = readStagedDiffSignals();
195
+ if (signals === null || signals === void 0 ? void 0 : signals.oversized) {
196
+ console.log(chalk.yellow('⚠️ Staged diff is too large to analyse — the message is based on file names only.'));
197
+ }
198
+ return buildCommitMessage(files, signals);
110
199
  }
111
200
  //# sourceMappingURL=generateCommitMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generateCommitMessage.js","sourceRoot":"","sources":["../../src/utils/generateCommitMessage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generateCommitMessage.js","sourceRoot":"","sources":["../../src/utils/generateCommitMessage.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,16 @@
1
- import { GitChanges } from "./types/types";
1
+ import { FileChange, GitChanges } from './types/types.js';
2
+ /**
3
+ * Parse `git diff --name-status -z` output.
4
+ *
5
+ * With `-z` every field is its own NUL-terminated record:
6
+ * `M\0path\0` for ordinary changes
7
+ * `R100\0oldPath\0newPath\0` for renames (and `C###` for copies)
8
+ *
9
+ * The similarity score is stripped from the status and the destination path is
10
+ * used for renames/copies, so downstream code never sees `R100` or a bogus
11
+ * `old\tnew` path.
12
+ */
13
+ export declare function parseNameStatusZ(output: string): FileChange[];
14
+ /** Parse a NUL-separated list of paths (e.g. `git ls-files -z`). */
15
+ export declare function parseNulList(output: string, status: string): FileChange[];
2
16
  export declare function getChanges(): GitChanges;