orcommit 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/cli.d.ts +70 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +391 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +18 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +21 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/modules/api.d.ts +48 -0
  12. package/dist/modules/api.d.ts.map +1 -0
  13. package/dist/modules/api.js +286 -0
  14. package/dist/modules/api.js.map +1 -0
  15. package/dist/modules/cache.d.ts +74 -0
  16. package/dist/modules/cache.d.ts.map +1 -0
  17. package/dist/modules/cache.js +284 -0
  18. package/dist/modules/cache.js.map +1 -0
  19. package/dist/modules/config.d.ts +53 -0
  20. package/dist/modules/config.d.ts.map +1 -0
  21. package/dist/modules/config.js +180 -0
  22. package/dist/modules/config.js.map +1 -0
  23. package/dist/modules/core.d.ts +54 -0
  24. package/dist/modules/core.d.ts.map +1 -0
  25. package/dist/modules/core.js +474 -0
  26. package/dist/modules/core.js.map +1 -0
  27. package/dist/modules/diff-filter.d.ts +71 -0
  28. package/dist/modules/diff-filter.d.ts.map +1 -0
  29. package/dist/modules/diff-filter.js +332 -0
  30. package/dist/modules/diff-filter.js.map +1 -0
  31. package/dist/modules/git.d.ts +61 -0
  32. package/dist/modules/git.d.ts.map +1 -0
  33. package/dist/modules/git.js +362 -0
  34. package/dist/modules/git.js.map +1 -0
  35. package/dist/modules/logger.d.ts +67 -0
  36. package/dist/modules/logger.d.ts.map +1 -0
  37. package/dist/modules/logger.js +212 -0
  38. package/dist/modules/logger.js.map +1 -0
  39. package/dist/modules/tokenizer.d.ts +43 -0
  40. package/dist/modules/tokenizer.d.ts.map +1 -0
  41. package/dist/modules/tokenizer.js +200 -0
  42. package/dist/modules/tokenizer.js.map +1 -0
  43. package/dist/types/index.d.ts +141 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +70 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/index.d.ts +64 -0
  48. package/dist/utils/index.d.ts.map +1 -0
  49. package/dist/utils/index.js +154 -0
  50. package/dist/utils/index.js.map +1 -0
  51. package/package.json +75 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Utility functions for OpenRouter Commit
3
+ */
4
+ /**
5
+ * Truncate text to specified length with ellipsis
6
+ */
7
+ export function truncateText(text, maxLength) {
8
+ if (text.length <= maxLength) {
9
+ return text;
10
+ }
11
+ return text.substring(0, maxLength - 3) + '...';
12
+ }
13
+ /**
14
+ * Sanitize commit message to ensure it's valid
15
+ */
16
+ export function sanitizeCommitMessage(message) {
17
+ return message
18
+ .trim()
19
+ .replace(/\n+/g, ' ') // Replace newlines with spaces
20
+ .replace(/\s+/g, ' ') // Replace multiple spaces with single space
21
+ .replace(/[^\x20-\x7E]/g, '') // Remove non-printable characters
22
+ .trim();
23
+ }
24
+ /**
25
+ * Calculate delay for exponential backoff
26
+ */
27
+ export function calculateBackoffDelay(attempt, baseDelay = 1000, maxDelay = 30000, factor = 2) {
28
+ const delay = baseDelay * Math.pow(factor, attempt - 1);
29
+ return Math.min(delay, maxDelay);
30
+ }
31
+ /**
32
+ * Format file size in human-readable format
33
+ */
34
+ export function formatFileSize(bytes) {
35
+ const units = ['B', 'KB', 'MB', 'GB'];
36
+ let size = bytes;
37
+ let unitIndex = 0;
38
+ while (size >= 1024 && unitIndex < units.length - 1) {
39
+ size /= 1024;
40
+ unitIndex++;
41
+ }
42
+ return `${size.toFixed(1)} ${units[unitIndex]}`;
43
+ }
44
+ /**
45
+ * Format duration in human-readable format
46
+ */
47
+ export function formatDuration(ms) {
48
+ if (ms < 1000) {
49
+ return `${ms}ms`;
50
+ }
51
+ const seconds = Math.floor(ms / 1000);
52
+ if (seconds < 60) {
53
+ return `${seconds}s`;
54
+ }
55
+ const minutes = Math.floor(seconds / 60);
56
+ const remainingSeconds = seconds % 60;
57
+ return `${minutes}m ${remainingSeconds}s`;
58
+ }
59
+ /**
60
+ * Debounce function calls
61
+ */
62
+ export function debounce(func, wait) {
63
+ let timeout;
64
+ return (...args) => {
65
+ const later = () => {
66
+ timeout = undefined;
67
+ func(...args);
68
+ };
69
+ if (timeout) {
70
+ clearTimeout(timeout);
71
+ }
72
+ timeout = setTimeout(later, wait);
73
+ };
74
+ }
75
+ /**
76
+ * Create a promise that resolves after specified delay
77
+ */
78
+ export function sleep(ms) {
79
+ return new Promise(resolve => setTimeout(resolve, ms));
80
+ }
81
+ /**
82
+ * Validate if a string is a valid commit type
83
+ */
84
+ export function isValidCommitType(type) {
85
+ const validTypes = [
86
+ 'feat', 'fix', 'docs', 'style', 'refactor',
87
+ 'test', 'chore', 'perf', 'ci', 'build', 'revert'
88
+ ];
89
+ return validTypes.includes(type);
90
+ }
91
+ export function parseConventionalCommit(message) {
92
+ // Simplified conventional commit parser
93
+ const conventionalRegex = /^(\w+)(\(([^)]+)\))?(!)?\s*:\s*(.+)$/;
94
+ const match = message.match(conventionalRegex);
95
+ if (!match) {
96
+ return null;
97
+ }
98
+ const [, type, , scope, breaking, description] = match;
99
+ return {
100
+ type: type || '',
101
+ scope: scope || undefined,
102
+ description: description || '',
103
+ breaking: Boolean(breaking),
104
+ };
105
+ }
106
+ /**
107
+ * Format bytes as human readable
108
+ */
109
+ export function humanFileSize(bytes, si = false, dp = 1) {
110
+ const thresh = si ? 1000 : 1024;
111
+ if (Math.abs(bytes) < thresh) {
112
+ return bytes + ' B';
113
+ }
114
+ const units = si
115
+ ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
116
+ : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
117
+ let u = -1;
118
+ const r = 10 ** dp;
119
+ do {
120
+ bytes /= thresh;
121
+ ++u;
122
+ } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);
123
+ return bytes.toFixed(dp) + ' ' + units[u];
124
+ }
125
+ /**
126
+ * Check if running in CI environment
127
+ */
128
+ export function isCI() {
129
+ return Boolean(process.env.CI ||
130
+ process.env.CONTINUOUS_INTEGRATION ||
131
+ process.env.BUILD_NUMBER ||
132
+ process.env.GITHUB_ACTIONS ||
133
+ process.env.GITLAB_CI ||
134
+ process.env.JENKINS_URL);
135
+ }
136
+ /**
137
+ * Get safe environment variable
138
+ */
139
+ export function getEnvVar(name, defaultValue = '') {
140
+ return process.env[name] || defaultValue;
141
+ }
142
+ /**
143
+ * Mask sensitive information in strings
144
+ */
145
+ export function maskSensitive(value, visibleChars = 4) {
146
+ if (value.length <= visibleChars * 2) {
147
+ return '*'.repeat(value.length);
148
+ }
149
+ const start = value.substring(0, visibleChars);
150
+ const end = value.substring(value.length - visibleChars);
151
+ const middle = '*'.repeat(Math.max(0, value.length - visibleChars * 2));
152
+ return start + middle + end;
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "orcommit",
3
+ "version": "1.0.0",
4
+ "description": "Efficient CLI tool for generating commit messages using OpenRouter and OpenAI APIs with chunked processing for large files",
5
+ "keywords": [
6
+ "git",
7
+ "commit",
8
+ "ai",
9
+ "openrouter",
10
+ "openai",
11
+ "cli",
12
+ "typescript",
13
+ "automation"
14
+ ],
15
+ "main": "dist/index.js",
16
+ "bin": {
17
+ "orc": "dist/cli.js"
18
+ },
19
+ "type": "module",
20
+ "scripts": {
21
+ "build": "tsc && chmod +x dist/cli.js",
22
+ "dev": "tsx src/cli.ts",
23
+ "test": "jest",
24
+ "test:unit": "jest tests/unit",
25
+ "test:integration": "jest tests/integration",
26
+ "test:watch": "jest --watch",
27
+ "test:coverage": "jest --coverage",
28
+ "test:ci": "jest --ci --coverage --watchAll=false",
29
+ "lint": "eslint src --ext .ts",
30
+ "lint:fix": "eslint src --ext .ts --fix",
31
+ "format": "prettier --write src/**/*.ts",
32
+ "format:check": "prettier --check src/**/*.ts",
33
+ "prepublishOnly": "npm run build",
34
+ "clean": "rimraf dist",
35
+ "commit": "git add . && orc commit"
36
+ },
37
+ "files": [
38
+ "dist/**/*",
39
+ "README.md",
40
+ "LICENSE"
41
+ ],
42
+ "engines": {
43
+ "node": ">=16.0.0"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/markolofsen/openrouter-commit.git"
48
+ },
49
+ "author": "Mark Olofsen",
50
+ "license": "MIT",
51
+ "devDependencies": {
52
+ "@types/jest": "^29.5.8",
53
+ "@types/node": "^20.9.0",
54
+ "@types/update-notifier": "^6.0.8",
55
+ "@typescript-eslint/eslint-plugin": "^6.12.0",
56
+ "@typescript-eslint/parser": "^6.12.0",
57
+ "eslint": "^8.54.0",
58
+ "jest": "^29.7.0",
59
+ "prettier": "^3.1.0",
60
+ "rimraf": "^5.0.5",
61
+ "ts-jest": "^29.1.1",
62
+ "tsx": "^4.6.0",
63
+ "typescript": "^5.3.2"
64
+ },
65
+ "dependencies": {
66
+ "@clack/prompts": "^0.11.0",
67
+ "axios": "^1.6.2",
68
+ "axios-retry": "^4.0.0",
69
+ "chalk": "^5.3.0",
70
+ "commander": "^11.1.0",
71
+ "p-queue": "^7.4.1",
72
+ "tiktoken": "^1.0.10",
73
+ "update-notifier": "^7.0.0"
74
+ }
75
+ }