@camaradesuk/git-worktree-tools 1.0.3

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/cli/cleanpr.d.ts +13 -0
  4. package/dist/cli/cleanpr.d.ts.map +1 -0
  5. package/dist/cli/cleanpr.js +441 -0
  6. package/dist/cli/cleanpr.js.map +1 -0
  7. package/dist/cli/lswt.d.ts +11 -0
  8. package/dist/cli/lswt.d.ts.map +1 -0
  9. package/dist/cli/lswt.js +313 -0
  10. package/dist/cli/lswt.js.map +1 -0
  11. package/dist/cli/newpr.d.ts +11 -0
  12. package/dist/cli/newpr.d.ts.map +1 -0
  13. package/dist/cli/newpr.js +888 -0
  14. package/dist/cli/newpr.js.map +1 -0
  15. package/dist/cli/wtlink.d.ts +15 -0
  16. package/dist/cli/wtlink.d.ts.map +1 -0
  17. package/dist/cli/wtlink.js +124 -0
  18. package/dist/cli/wtlink.js.map +1 -0
  19. package/dist/e2e/cli.e2e.test.d.ts +2 -0
  20. package/dist/e2e/cli.e2e.test.d.ts.map +1 -0
  21. package/dist/e2e/cli.e2e.test.js +215 -0
  22. package/dist/e2e/cli.e2e.test.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/integration/git.integration.test.d.ts +2 -0
  28. package/dist/integration/git.integration.test.d.ts.map +1 -0
  29. package/dist/integration/git.integration.test.js +333 -0
  30. package/dist/integration/git.integration.test.js.map +1 -0
  31. package/dist/lib/colors.d.ts +59 -0
  32. package/dist/lib/colors.d.ts.map +1 -0
  33. package/dist/lib/colors.js +145 -0
  34. package/dist/lib/colors.js.map +1 -0
  35. package/dist/lib/colors.test.d.ts +2 -0
  36. package/dist/lib/colors.test.d.ts.map +1 -0
  37. package/dist/lib/colors.test.js +69 -0
  38. package/dist/lib/colors.test.js.map +1 -0
  39. package/dist/lib/config.d.ts +58 -0
  40. package/dist/lib/config.d.ts.map +1 -0
  41. package/dist/lib/config.js +91 -0
  42. package/dist/lib/config.js.map +1 -0
  43. package/dist/lib/config.test.d.ts +2 -0
  44. package/dist/lib/config.test.d.ts.map +1 -0
  45. package/dist/lib/config.test.js +84 -0
  46. package/dist/lib/config.test.js.map +1 -0
  47. package/dist/lib/constants.d.ts +37 -0
  48. package/dist/lib/constants.d.ts.map +1 -0
  49. package/dist/lib/constants.js +37 -0
  50. package/dist/lib/constants.js.map +1 -0
  51. package/dist/lib/errors.d.ts +88 -0
  52. package/dist/lib/errors.d.ts.map +1 -0
  53. package/dist/lib/errors.js +112 -0
  54. package/dist/lib/errors.js.map +1 -0
  55. package/dist/lib/errors.test.d.ts +2 -0
  56. package/dist/lib/errors.test.d.ts.map +1 -0
  57. package/dist/lib/errors.test.js +117 -0
  58. package/dist/lib/errors.test.js.map +1 -0
  59. package/dist/lib/git.d.ts +224 -0
  60. package/dist/lib/git.d.ts.map +1 -0
  61. package/dist/lib/git.js +524 -0
  62. package/dist/lib/git.js.map +1 -0
  63. package/dist/lib/git.test.d.ts +2 -0
  64. package/dist/lib/git.test.d.ts.map +1 -0
  65. package/dist/lib/git.test.js +402 -0
  66. package/dist/lib/git.test.js.map +1 -0
  67. package/dist/lib/github.d.ts +82 -0
  68. package/dist/lib/github.d.ts.map +1 -0
  69. package/dist/lib/github.js +254 -0
  70. package/dist/lib/github.js.map +1 -0
  71. package/dist/lib/github.test.d.ts +2 -0
  72. package/dist/lib/github.test.d.ts.map +1 -0
  73. package/dist/lib/github.test.js +258 -0
  74. package/dist/lib/github.test.js.map +1 -0
  75. package/dist/lib/prompts.d.ts +39 -0
  76. package/dist/lib/prompts.d.ts.map +1 -0
  77. package/dist/lib/prompts.js +213 -0
  78. package/dist/lib/prompts.js.map +1 -0
  79. package/dist/lib/prompts.test.d.ts +2 -0
  80. package/dist/lib/prompts.test.d.ts.map +1 -0
  81. package/dist/lib/prompts.test.js +250 -0
  82. package/dist/lib/prompts.test.js.map +1 -0
  83. package/dist/lib/state-detection.d.ts +65 -0
  84. package/dist/lib/state-detection.d.ts.map +1 -0
  85. package/dist/lib/state-detection.js +186 -0
  86. package/dist/lib/state-detection.js.map +1 -0
  87. package/dist/lib/state-detection.test.d.ts +2 -0
  88. package/dist/lib/state-detection.test.d.ts.map +1 -0
  89. package/dist/lib/state-detection.test.js +164 -0
  90. package/dist/lib/state-detection.test.js.map +1 -0
  91. package/dist/lib/wtlink/index.d.ts +5 -0
  92. package/dist/lib/wtlink/index.d.ts.map +1 -0
  93. package/dist/lib/wtlink/index.js +7 -0
  94. package/dist/lib/wtlink/index.js.map +1 -0
  95. package/dist/lib/wtlink/link-configs.d.ts +10 -0
  96. package/dist/lib/wtlink/link-configs.d.ts.map +1 -0
  97. package/dist/lib/wtlink/link-configs.js +411 -0
  98. package/dist/lib/wtlink/link-configs.js.map +1 -0
  99. package/dist/lib/wtlink/link-configs.test.d.ts +2 -0
  100. package/dist/lib/wtlink/link-configs.test.d.ts.map +1 -0
  101. package/dist/lib/wtlink/link-configs.test.js +179 -0
  102. package/dist/lib/wtlink/link-configs.test.js.map +1 -0
  103. package/dist/lib/wtlink/main-menu.d.ts +2 -0
  104. package/dist/lib/wtlink/main-menu.d.ts.map +1 -0
  105. package/dist/lib/wtlink/main-menu.js +149 -0
  106. package/dist/lib/wtlink/main-menu.js.map +1 -0
  107. package/dist/lib/wtlink/manage-manifest.d.ts +9 -0
  108. package/dist/lib/wtlink/manage-manifest.d.ts.map +1 -0
  109. package/dist/lib/wtlink/manage-manifest.js +1262 -0
  110. package/dist/lib/wtlink/manage-manifest.js.map +1 -0
  111. package/dist/lib/wtlink/validate-manifest.d.ts +6 -0
  112. package/dist/lib/wtlink/validate-manifest.d.ts.map +1 -0
  113. package/dist/lib/wtlink/validate-manifest.js +51 -0
  114. package/dist/lib/wtlink/validate-manifest.js.map +1 -0
  115. package/dist/lib/wtlink/validate-manifest.test.d.ts +2 -0
  116. package/dist/lib/wtlink/validate-manifest.test.d.ts.map +1 -0
  117. package/dist/lib/wtlink/validate-manifest.test.js +115 -0
  118. package/dist/lib/wtlink/validate-manifest.test.js.map +1 -0
  119. package/package.json +84 -0
@@ -0,0 +1,333 @@
1
+ import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import * as git from '../lib/git.js';
7
+ /**
8
+ * Integration tests for git operations using a real git repository.
9
+ * These tests create a temporary git repo and perform actual git operations.
10
+ */
11
+ /**
12
+ * Normalize a path for cross-platform comparison.
13
+ * Handles: macOS symlinks (/var -> /private/var), Windows short paths (RUNNER~1 -> runneradmin)
14
+ */
15
+ function normalizePath(p) {
16
+ try {
17
+ // fs.realpathSync resolves symlinks and normalizes paths
18
+ return path.normalize(fs.realpathSync(p)).toLowerCase();
19
+ }
20
+ catch {
21
+ // If path doesn't exist, just normalize it
22
+ return path.normalize(p).toLowerCase();
23
+ }
24
+ }
25
+ describe('git integration', () => {
26
+ let tempDir;
27
+ let repoDir;
28
+ // Create temp directory and git repo before all tests
29
+ beforeAll(() => {
30
+ // Use realpathSync to resolve symlinks (e.g., /var -> /private/var on macOS)
31
+ tempDir = fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'git-worktree-tools-test-')));
32
+ repoDir = path.join(tempDir, 'test-repo');
33
+ fs.mkdirSync(repoDir);
34
+ // Initialize git repo
35
+ execSync('git init', { cwd: repoDir });
36
+ execSync('git config user.email "test@test.com"', { cwd: repoDir });
37
+ execSync('git config user.name "Test User"', { cwd: repoDir });
38
+ // Create initial commit
39
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Test Repo\n');
40
+ execSync('git add .', { cwd: repoDir });
41
+ execSync('git commit -m "Initial commit"', { cwd: repoDir });
42
+ });
43
+ // Clean up after all tests
44
+ afterAll(() => {
45
+ // Remove worktrees first
46
+ try {
47
+ execSync('git worktree prune', { cwd: repoDir, stdio: 'ignore' });
48
+ }
49
+ catch {
50
+ // Ignore errors
51
+ }
52
+ // Remove temp directory
53
+ fs.rmSync(tempDir, { recursive: true, force: true });
54
+ });
55
+ describe('getRepoRoot', () => {
56
+ it('returns repo root directory', () => {
57
+ const result = git.getRepoRoot(repoDir);
58
+ expect(normalizePath(result)).toBe(normalizePath(repoDir));
59
+ });
60
+ it('works from subdirectory', () => {
61
+ const subDir = path.join(repoDir, 'subdir');
62
+ fs.mkdirSync(subDir, { recursive: true });
63
+ const result = git.getRepoRoot(subDir);
64
+ expect(normalizePath(result)).toBe(normalizePath(repoDir));
65
+ });
66
+ it('throws for non-repo directory', () => {
67
+ expect(() => git.getRepoRoot(tempDir)).toThrow();
68
+ });
69
+ });
70
+ describe('getRepoName', () => {
71
+ it('returns directory name when no remote', () => {
72
+ const result = git.getRepoName(repoDir);
73
+ expect(result).toBe('test-repo');
74
+ });
75
+ });
76
+ describe('getCurrentBranch', () => {
77
+ it('returns current branch name', () => {
78
+ // Ensure we're on a known branch
79
+ try {
80
+ execSync('git checkout -b main 2>/dev/null || git checkout main', {
81
+ cwd: repoDir,
82
+ stdio: 'ignore',
83
+ });
84
+ }
85
+ catch {
86
+ // Branch might already exist
87
+ }
88
+ const result = git.getCurrentBranch(repoDir);
89
+ // Could be 'main' or 'master' depending on git default
90
+ expect(result).toMatch(/^(main|master)$/);
91
+ });
92
+ });
93
+ describe('getWorkingTreeStatus', () => {
94
+ beforeEach(() => {
95
+ // Reset working tree
96
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
97
+ execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
98
+ });
99
+ it('returns clean for clean working tree', () => {
100
+ const result = git.getWorkingTreeStatus(repoDir);
101
+ expect(result).toBe('clean');
102
+ });
103
+ it('returns staged_only for staged changes', () => {
104
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Updated\n');
105
+ execSync('git add README.md', { cwd: repoDir });
106
+ const result = git.getWorkingTreeStatus(repoDir);
107
+ expect(result).toBe('staged_only');
108
+ // Reset
109
+ execSync('git reset HEAD README.md', { cwd: repoDir, stdio: 'ignore' });
110
+ execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
111
+ });
112
+ it('returns unstaged_only for unstaged changes', () => {
113
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Modified\n');
114
+ const result = git.getWorkingTreeStatus(repoDir);
115
+ expect(result).toBe('unstaged_only');
116
+ // Reset
117
+ execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
118
+ });
119
+ it('returns unstaged_only for untracked files', () => {
120
+ fs.writeFileSync(path.join(repoDir, 'new-file.txt'), 'content');
121
+ const result = git.getWorkingTreeStatus(repoDir);
122
+ expect(result).toBe('unstaged_only');
123
+ // Clean up
124
+ fs.unlinkSync(path.join(repoDir, 'new-file.txt'));
125
+ });
126
+ it('returns both for staged and unstaged changes', () => {
127
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# First change\n');
128
+ execSync('git add README.md', { cwd: repoDir });
129
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Second change\n');
130
+ const result = git.getWorkingTreeStatus(repoDir);
131
+ expect(result).toBe('both');
132
+ // Reset
133
+ execSync('git reset HEAD README.md', { cwd: repoDir, stdio: 'ignore' });
134
+ execSync('git checkout -- README.md', { cwd: repoDir, stdio: 'ignore' });
135
+ });
136
+ });
137
+ describe('getStagedFiles and getUnstagedFiles', () => {
138
+ beforeEach(() => {
139
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
140
+ execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
141
+ });
142
+ it('returns staged files correctly', () => {
143
+ fs.writeFileSync(path.join(repoDir, 'staged.txt'), 'content');
144
+ execSync('git add staged.txt', { cwd: repoDir });
145
+ const result = git.getStagedFiles(repoDir);
146
+ expect(result).toContain('staged.txt');
147
+ // Clean up
148
+ execSync('git reset HEAD staged.txt', { cwd: repoDir, stdio: 'ignore' });
149
+ fs.unlinkSync(path.join(repoDir, 'staged.txt'));
150
+ });
151
+ it('returns unstaged files correctly', () => {
152
+ fs.writeFileSync(path.join(repoDir, 'unstaged.txt'), 'content');
153
+ const result = git.getUnstagedFiles(repoDir);
154
+ expect(result).toContain('unstaged.txt');
155
+ // Clean up
156
+ fs.unlinkSync(path.join(repoDir, 'unstaged.txt'));
157
+ });
158
+ });
159
+ describe('branch operations', () => {
160
+ it('creates and deletes branches', () => {
161
+ git.createBranch('test-branch', undefined, repoDir);
162
+ expect(git.branchExists('test-branch', repoDir)).toBe(true);
163
+ git.deleteBranch('test-branch', { cwd: repoDir });
164
+ expect(git.branchExists('test-branch', repoDir)).toBe(false);
165
+ });
166
+ it('checks if branch exists', () => {
167
+ expect(git.branchExists('nonexistent-branch', repoDir)).toBe(false);
168
+ });
169
+ });
170
+ describe('commit operations', () => {
171
+ beforeEach(() => {
172
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
173
+ execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
174
+ });
175
+ it('creates commit with message', () => {
176
+ fs.writeFileSync(path.join(repoDir, 'commit-test.txt'), 'test content');
177
+ execSync('git add commit-test.txt', { cwd: repoDir });
178
+ const sha = git.commit({ message: 'Test commit message' }, repoDir);
179
+ expect(sha).toMatch(/^[a-f0-9]{40}$/);
180
+ // Verify commit exists
181
+ const log = execSync('git log --oneline -1', { cwd: repoDir, encoding: 'utf8' });
182
+ expect(log).toContain('Test commit message');
183
+ });
184
+ it('creates empty commit when allowed', () => {
185
+ const beforeSha = git.getHeadCommit(repoDir);
186
+ const afterSha = git.commit({ message: 'Empty commit', allowEmpty: true }, repoDir);
187
+ expect(afterSha).not.toBe(beforeSha);
188
+ });
189
+ });
190
+ describe('worktree operations', () => {
191
+ let worktreePath;
192
+ beforeEach(() => {
193
+ worktreePath = path.join(tempDir, 'worktree-test');
194
+ });
195
+ afterEach(() => {
196
+ // Clean up worktree
197
+ try {
198
+ execSync(`git worktree remove --force "${worktreePath}"`, {
199
+ cwd: repoDir,
200
+ stdio: 'ignore',
201
+ });
202
+ }
203
+ catch {
204
+ // Ignore errors
205
+ }
206
+ // Also try to delete the branch
207
+ try {
208
+ execSync('git branch -D worktree-branch', { cwd: repoDir, stdio: 'ignore' });
209
+ }
210
+ catch {
211
+ // Ignore errors
212
+ }
213
+ });
214
+ it('lists worktrees', () => {
215
+ const worktrees = git.listWorktrees(repoDir);
216
+ expect(worktrees.length).toBeGreaterThanOrEqual(1);
217
+ expect(worktrees[0].isMain).toBe(true);
218
+ expect(normalizePath(worktrees[0].path)).toBe(normalizePath(repoDir));
219
+ });
220
+ it('creates and removes worktree', () => {
221
+ git.addWorktree(worktreePath, 'worktree-branch', {
222
+ createBranch: true,
223
+ cwd: repoDir,
224
+ });
225
+ // Verify worktree exists
226
+ expect(fs.existsSync(worktreePath)).toBe(true);
227
+ const worktrees = git.listWorktrees(repoDir);
228
+ const newWorktree = worktrees.find((w) => normalizePath(w.path) === normalizePath(worktreePath));
229
+ expect(newWorktree).toBeDefined();
230
+ expect(newWorktree?.branch).toBe('worktree-branch');
231
+ // Remove worktree
232
+ git.removeWorktree(worktreePath, { cwd: repoDir });
233
+ // Verify worktree removed
234
+ const afterWorktrees = git.listWorktrees(repoDir);
235
+ const removed = afterWorktrees.find((w) => normalizePath(w.path) === normalizePath(worktreePath));
236
+ expect(removed).toBeUndefined();
237
+ });
238
+ it('gets main worktree', () => {
239
+ const mainWorktree = git.getMainWorktree(repoDir);
240
+ expect(mainWorktree).toBeDefined();
241
+ expect(mainWorktree?.isMain).toBe(true);
242
+ expect(normalizePath(mainWorktree.path)).toBe(normalizePath(repoDir));
243
+ });
244
+ it('detects if current directory is a worktree', () => {
245
+ // Main repo should not be considered "a worktree" (it's the main worktree)
246
+ expect(git.isWorktree(repoDir)).toBe(false);
247
+ // Create a secondary worktree
248
+ git.addWorktree(worktreePath, 'worktree-branch', {
249
+ createBranch: true,
250
+ cwd: repoDir,
251
+ });
252
+ // Secondary worktree should be detected as a worktree
253
+ expect(git.isWorktree(worktreePath)).toBe(true);
254
+ });
255
+ });
256
+ describe('stash operations', () => {
257
+ beforeEach(() => {
258
+ // Reset index and working tree completely
259
+ execSync('git reset HEAD', { cwd: repoDir, stdio: 'ignore' });
260
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
261
+ execSync('git clean -fd', { cwd: repoDir, stdio: 'ignore' });
262
+ // Clear any existing stashes
263
+ try {
264
+ execSync('git stash clear', { cwd: repoDir, stdio: 'ignore' });
265
+ }
266
+ catch {
267
+ // Ignore
268
+ }
269
+ });
270
+ it('stashes changes and returns reference', () => {
271
+ fs.writeFileSync(path.join(repoDir, 'stash-test.txt'), 'stash content');
272
+ execSync('git add stash-test.txt', { cwd: repoDir });
273
+ const stashRef = git.stash({}, repoDir);
274
+ expect(stashRef).toBe('stash@{0}');
275
+ // Verify file is no longer present
276
+ expect(fs.existsSync(path.join(repoDir, 'stash-test.txt'))).toBe(false);
277
+ // Clean up - apply and reset
278
+ git.stashPop(stashRef, repoDir);
279
+ execSync('git reset HEAD stash-test.txt', { cwd: repoDir, stdio: 'ignore' });
280
+ fs.unlinkSync(path.join(repoDir, 'stash-test.txt'));
281
+ });
282
+ it('returns null when nothing to stash', () => {
283
+ const stashRef = git.stash({}, repoDir);
284
+ expect(stashRef).toBeNull();
285
+ });
286
+ it('stashes with keep-index', () => {
287
+ // Create a staged file
288
+ fs.writeFileSync(path.join(repoDir, 'staged.txt'), 'staged content');
289
+ execSync('git add staged.txt', { cwd: repoDir });
290
+ // Create an unstaged modification to a tracked file
291
+ fs.writeFileSync(path.join(repoDir, 'README.md'), '# Modified README\n');
292
+ git.stash({ keepIndex: true }, repoDir);
293
+ // Staged file should still be present (keep-index preserves staged changes)
294
+ expect(fs.existsSync(path.join(repoDir, 'staged.txt'))).toBe(true);
295
+ // README should be reverted to its last committed state (unstaged changes stashed)
296
+ const readmeContent = fs.readFileSync(path.join(repoDir, 'README.md'), 'utf8');
297
+ // Normalize line endings for cross-platform compatibility
298
+ expect(readmeContent.replace(/\r\n/g, '\n')).toBe('# Test Repo\n');
299
+ // Clean up
300
+ git.stashDrop(undefined, repoDir);
301
+ execSync('git reset HEAD', { cwd: repoDir, stdio: 'ignore' });
302
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
303
+ if (fs.existsSync(path.join(repoDir, 'staged.txt'))) {
304
+ fs.unlinkSync(path.join(repoDir, 'staged.txt'));
305
+ }
306
+ });
307
+ });
308
+ describe('checkout', () => {
309
+ beforeEach(() => {
310
+ execSync('git checkout -- .', { cwd: repoDir, stdio: 'ignore' });
311
+ });
312
+ it('switches branches', () => {
313
+ git.createBranch('checkout-test', undefined, repoDir);
314
+ git.checkout('checkout-test', repoDir);
315
+ expect(git.getCurrentBranch(repoDir)).toBe('checkout-test');
316
+ // Switch back
317
+ git.checkout('main', repoDir);
318
+ // Clean up
319
+ git.deleteBranch('checkout-test', { cwd: repoDir });
320
+ });
321
+ });
322
+ describe('getHeadCommit and getShortCommit', () => {
323
+ it('returns full commit SHA', () => {
324
+ const sha = git.getHeadCommit(repoDir);
325
+ expect(sha).toMatch(/^[a-f0-9]{40}$/);
326
+ });
327
+ it('returns short commit SHA', () => {
328
+ const shortSha = git.getShortCommit(repoDir);
329
+ expect(shortSha).toMatch(/^[a-f0-9]{7,8}$/);
330
+ });
331
+ });
332
+ });
333
+ //# sourceMappingURL=git.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.integration.test.js","sourceRoot":"","sources":["../../src/integration/git.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ANSI color codes for terminal output
3
+ */
4
+ export declare const codes: {
5
+ readonly reset: "\u001B[0m";
6
+ readonly bold: "\u001B[1m";
7
+ readonly dim: "\u001B[2m";
8
+ readonly italic: "\u001B[3m";
9
+ readonly underline: "\u001B[4m";
10
+ readonly black: "\u001B[30m";
11
+ readonly red: "\u001B[31m";
12
+ readonly green: "\u001B[32m";
13
+ readonly yellow: "\u001B[33m";
14
+ readonly blue: "\u001B[34m";
15
+ readonly magenta: "\u001B[35m";
16
+ readonly cyan: "\u001B[36m";
17
+ readonly white: "\u001B[37m";
18
+ readonly brightBlack: "\u001B[90m";
19
+ readonly brightRed: "\u001B[91m";
20
+ readonly brightGreen: "\u001B[92m";
21
+ readonly brightYellow: "\u001B[93m";
22
+ readonly brightBlue: "\u001B[94m";
23
+ readonly brightMagenta: "\u001B[95m";
24
+ readonly brightCyan: "\u001B[96m";
25
+ readonly brightWhite: "\u001B[97m";
26
+ readonly bgBlack: "\u001B[40m";
27
+ readonly bgRed: "\u001B[41m";
28
+ readonly bgGreen: "\u001B[42m";
29
+ readonly bgYellow: "\u001B[43m";
30
+ readonly bgBlue: "\u001B[44m";
31
+ readonly bgMagenta: "\u001B[45m";
32
+ readonly bgCyan: "\u001B[46m";
33
+ readonly bgWhite: "\u001B[47m";
34
+ };
35
+ export declare function red(text: string): string;
36
+ export declare function green(text: string): string;
37
+ export declare function yellow(text: string): string;
38
+ export declare function blue(text: string): string;
39
+ export declare function cyan(text: string): string;
40
+ export declare function magenta(text: string): string;
41
+ export declare function white(text: string): string;
42
+ export declare function gray(text: string): string;
43
+ export declare function black(text: string): string;
44
+ export declare function bgBlue(text: string): string;
45
+ export declare function bgYellow(text: string): string;
46
+ export declare function bgRed(text: string): string;
47
+ export declare function bgGreen(text: string): string;
48
+ export declare function bold(text: string): string;
49
+ export declare function dim(text: string): string;
50
+ export declare function italic(text: string): string;
51
+ export declare function underline(text: string): string;
52
+ export declare function success(text: string): string;
53
+ export declare function warning(text: string): string;
54
+ export declare function error(text: string): string;
55
+ export declare function info(text: string): string;
56
+ export declare function debug(text: string): string;
57
+ export declare function header(text: string): string;
58
+ export declare function highlight(text: string): string;
59
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCR,CAAC;AAiCX,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAGD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAGD,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAGD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * ANSI color codes for terminal output
3
+ */
4
+ export const codes = {
5
+ reset: '\x1b[0m',
6
+ bold: '\x1b[1m',
7
+ dim: '\x1b[2m',
8
+ italic: '\x1b[3m',
9
+ underline: '\x1b[4m',
10
+ // Foreground colors
11
+ black: '\x1b[30m',
12
+ red: '\x1b[31m',
13
+ green: '\x1b[32m',
14
+ yellow: '\x1b[33m',
15
+ blue: '\x1b[34m',
16
+ magenta: '\x1b[35m',
17
+ cyan: '\x1b[36m',
18
+ white: '\x1b[37m',
19
+ // Bright foreground colors
20
+ brightBlack: '\x1b[90m',
21
+ brightRed: '\x1b[91m',
22
+ brightGreen: '\x1b[92m',
23
+ brightYellow: '\x1b[93m',
24
+ brightBlue: '\x1b[94m',
25
+ brightMagenta: '\x1b[95m',
26
+ brightCyan: '\x1b[96m',
27
+ brightWhite: '\x1b[97m',
28
+ // Background colors
29
+ bgBlack: '\x1b[40m',
30
+ bgRed: '\x1b[41m',
31
+ bgGreen: '\x1b[42m',
32
+ bgYellow: '\x1b[43m',
33
+ bgBlue: '\x1b[44m',
34
+ bgMagenta: '\x1b[45m',
35
+ bgCyan: '\x1b[46m',
36
+ bgWhite: '\x1b[47m',
37
+ };
38
+ /**
39
+ * Check if colors should be enabled based on environment
40
+ */
41
+ function shouldUseColors() {
42
+ // Respect NO_COLOR environment variable
43
+ if (process.env.NO_COLOR !== undefined) {
44
+ return false;
45
+ }
46
+ // Respect FORCE_COLOR environment variable
47
+ if (process.env.FORCE_COLOR !== undefined) {
48
+ return true;
49
+ }
50
+ // Check if stdout is a TTY
51
+ return process.stdout.isTTY ?? false;
52
+ }
53
+ const useColors = shouldUseColors();
54
+ /**
55
+ * Wrap text with ANSI color codes
56
+ */
57
+ function colorize(text, code) {
58
+ if (!useColors) {
59
+ return text;
60
+ }
61
+ return `${code}${text}${codes.reset}`;
62
+ }
63
+ // Color functions
64
+ export function red(text) {
65
+ return colorize(text, codes.red);
66
+ }
67
+ export function green(text) {
68
+ return colorize(text, codes.green);
69
+ }
70
+ export function yellow(text) {
71
+ return colorize(text, codes.yellow);
72
+ }
73
+ export function blue(text) {
74
+ return colorize(text, codes.blue);
75
+ }
76
+ export function cyan(text) {
77
+ return colorize(text, codes.cyan);
78
+ }
79
+ export function magenta(text) {
80
+ return colorize(text, codes.magenta);
81
+ }
82
+ export function white(text) {
83
+ return colorize(text, codes.white);
84
+ }
85
+ export function gray(text) {
86
+ return colorize(text, codes.brightBlack);
87
+ }
88
+ export function black(text) {
89
+ return colorize(text, codes.black);
90
+ }
91
+ // Background color functions
92
+ export function bgBlue(text) {
93
+ return colorize(text, codes.bgBlue);
94
+ }
95
+ export function bgYellow(text) {
96
+ return colorize(text, codes.bgYellow);
97
+ }
98
+ export function bgRed(text) {
99
+ return colorize(text, codes.bgRed);
100
+ }
101
+ export function bgGreen(text) {
102
+ return colorize(text, codes.bgGreen);
103
+ }
104
+ // Style functions
105
+ export function bold(text) {
106
+ return colorize(text, codes.bold);
107
+ }
108
+ export function dim(text) {
109
+ return colorize(text, codes.dim);
110
+ }
111
+ export function italic(text) {
112
+ return colorize(text, codes.italic);
113
+ }
114
+ export function underline(text) {
115
+ return colorize(text, codes.underline);
116
+ }
117
+ // Semantic output functions with icons
118
+ export function success(text) {
119
+ const icon = useColors ? '✓' : '[OK]';
120
+ return `${green(icon)} ${text}`;
121
+ }
122
+ export function warning(text) {
123
+ const icon = useColors ? '⚠' : '[WARN]';
124
+ return `${yellow(icon)} ${yellow(text)}`;
125
+ }
126
+ export function error(text) {
127
+ const icon = useColors ? '✗' : '[ERROR]';
128
+ return `${red(icon)} ${red(text)}`;
129
+ }
130
+ export function info(text) {
131
+ const icon = useColors ? 'ℹ' : '[INFO]';
132
+ return `${blue(icon)} ${text}`;
133
+ }
134
+ export function debug(text) {
135
+ return dim(`[DEBUG] ${text}`);
136
+ }
137
+ // Utility for headers/titles
138
+ export function header(text) {
139
+ return bold(cyan(text));
140
+ }
141
+ // Utility for highlighting values
142
+ export function highlight(text) {
143
+ return bold(white(text));
144
+ }
145
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/lib/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=colors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.test.d.ts","sourceRoot":"","sources":["../../src/lib/colors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import * as colors from './colors.js';
3
+ describe('colors', () => {
4
+ describe('codes', () => {
5
+ it('should export ANSI color codes', () => {
6
+ expect(colors.codes.red).toBe('\x1b[31m');
7
+ expect(colors.codes.green).toBe('\x1b[32m');
8
+ expect(colors.codes.yellow).toBe('\x1b[33m');
9
+ expect(colors.codes.blue).toBe('\x1b[34m');
10
+ expect(colors.codes.cyan).toBe('\x1b[36m');
11
+ expect(colors.codes.reset).toBe('\x1b[0m');
12
+ expect(colors.codes.bold).toBe('\x1b[1m');
13
+ expect(colors.codes.dim).toBe('\x1b[2m');
14
+ });
15
+ });
16
+ describe('color functions', () => {
17
+ // In CI/test environments, colors are typically disabled (no TTY)
18
+ // So we test that the functions return strings containing the input
19
+ it('red should return text', () => {
20
+ const result = colors.red('test');
21
+ expect(result).toContain('test');
22
+ });
23
+ it('green should return text', () => {
24
+ const result = colors.green('test');
25
+ expect(result).toContain('test');
26
+ });
27
+ it('yellow should return text', () => {
28
+ const result = colors.yellow('test');
29
+ expect(result).toContain('test');
30
+ });
31
+ it('blue should return text', () => {
32
+ const result = colors.blue('test');
33
+ expect(result).toContain('test');
34
+ });
35
+ it('cyan should return text', () => {
36
+ const result = colors.cyan('test');
37
+ expect(result).toContain('test');
38
+ });
39
+ it('bold should return text', () => {
40
+ const result = colors.bold('test');
41
+ expect(result).toContain('test');
42
+ });
43
+ it('dim should return text', () => {
44
+ const result = colors.dim('test');
45
+ expect(result).toContain('test');
46
+ });
47
+ });
48
+ describe('semantic functions', () => {
49
+ it('success should include the text and a marker', () => {
50
+ const result = colors.success('done');
51
+ expect(result).toContain('done');
52
+ // Should have some marker (either checkmark or [OK])
53
+ expect(result.length).toBeGreaterThan('done'.length);
54
+ });
55
+ it('warning should include the text', () => {
56
+ const result = colors.warning('caution');
57
+ expect(result).toContain('caution');
58
+ });
59
+ it('error should include the text', () => {
60
+ const result = colors.error('failed');
61
+ expect(result).toContain('failed');
62
+ });
63
+ it('info should include the text', () => {
64
+ const result = colors.info('note');
65
+ expect(result).toContain('note');
66
+ });
67
+ });
68
+ });
69
+ //# sourceMappingURL=colors.test.js.map