@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,186 @@
1
+ import * as git from './git.js';
2
+ import { DEFAULT_BASE_BRANCH } from './constants.js';
3
+ /**
4
+ * Detect worktree type based on directory path pattern
5
+ */
6
+ export function detectWorktreeType(repoRoot) {
7
+ // Check if path matches PR worktree pattern: *.pr[0-9]+
8
+ if (/\.pr\d+/.test(repoRoot)) {
9
+ return 'pr_worktree';
10
+ }
11
+ // Check if this is the main worktree using git
12
+ const worktrees = git.listWorktrees(repoRoot);
13
+ const current = worktrees.find((w) => w.path === repoRoot);
14
+ if (current?.isMain) {
15
+ return 'main_worktree';
16
+ }
17
+ // If we're in a worktree but not main, it's a PR or other worktree
18
+ if (git.isWorktree(repoRoot)) {
19
+ return 'pr_worktree';
20
+ }
21
+ return 'main_worktree';
22
+ }
23
+ /**
24
+ * Detect branch type
25
+ */
26
+ export function detectBranchType(baseBranch, cwd) {
27
+ if (git.isDetachedHead(cwd)) {
28
+ return 'detached';
29
+ }
30
+ const currentBranch = git.getCurrentBranch(cwd);
31
+ if (currentBranch === baseBranch) {
32
+ return 'main';
33
+ }
34
+ return 'other';
35
+ }
36
+ /**
37
+ * Analyze complete git state
38
+ */
39
+ export function analyzeGitState(baseBranch = DEFAULT_BASE_BRANCH, cwd) {
40
+ const repoRoot = git.getRepoRoot(cwd);
41
+ const repoName = git.getRepoName(repoRoot);
42
+ const worktreeType = detectWorktreeType(repoRoot);
43
+ const branchType = detectBranchType(baseBranch, cwd);
44
+ const currentBranch = git.getCurrentBranch(cwd);
45
+ const commitRelationship = git.getCommitRelationship(baseBranch, cwd);
46
+ const workingTreeStatus = git.getWorkingTreeStatus(cwd);
47
+ const localCommits = git.getCommitsAhead(baseBranch, cwd);
48
+ const stagedFiles = git.getStagedFiles(cwd);
49
+ const unstagedFiles = git.getUnstagedFiles(cwd);
50
+ return {
51
+ worktreeType,
52
+ branchType,
53
+ currentBranch,
54
+ commitRelationship,
55
+ workingTreeStatus,
56
+ localCommits,
57
+ stagedFiles,
58
+ unstagedFiles,
59
+ repoRoot,
60
+ repoName,
61
+ };
62
+ }
63
+ /**
64
+ * Detect scenario from git state
65
+ */
66
+ export function detectScenario(state) {
67
+ const { worktreeType, branchType, commitRelationship, workingTreeStatus } = state;
68
+ // Scenario 10: PR worktree
69
+ if (worktreeType === 'pr_worktree') {
70
+ return 'pr_worktree';
71
+ }
72
+ // Scenario 9: Detached HEAD
73
+ if (branchType === 'detached') {
74
+ return 'detached_head';
75
+ }
76
+ // On main branch scenarios (1-4)
77
+ if (branchType === 'main') {
78
+ if (commitRelationship === 'same') {
79
+ // Same as origin/main
80
+ switch (workingTreeStatus) {
81
+ case 'clean':
82
+ return 'main_clean_same'; // Scenario 1
83
+ case 'staged_only':
84
+ return 'main_staged_same'; // Scenario 2a
85
+ case 'unstaged_only':
86
+ return 'main_unstaged_same'; // Scenario 2b
87
+ case 'both':
88
+ return 'main_both_same'; // Scenario 2c
89
+ }
90
+ }
91
+ else if (commitRelationship === 'ahead') {
92
+ // Ahead of origin/main
93
+ if (workingTreeStatus === 'clean') {
94
+ return 'main_clean_ahead'; // Scenario 3
95
+ }
96
+ else {
97
+ return 'main_changes_ahead'; // Scenario 4
98
+ }
99
+ }
100
+ // Behind or divergent on main - treat like same (unusual state)
101
+ return 'main_clean_same';
102
+ }
103
+ // On different branch scenarios (5-8)
104
+ if (branchType === 'other') {
105
+ // Has uncommitted changes
106
+ if (workingTreeStatus !== 'clean') {
107
+ return 'branch_with_changes'; // Scenario 8
108
+ }
109
+ // Clean working tree
110
+ switch (commitRelationship) {
111
+ case 'same':
112
+ return 'branch_same_as_main'; // Scenario 5
113
+ case 'ancestor':
114
+ return 'branch_ancestor'; // Scenario 6
115
+ case 'ahead':
116
+ case 'divergent':
117
+ return 'branch_divergent'; // Scenario 7
118
+ case 'behind':
119
+ return 'branch_same_as_main'; // Treat behind like same
120
+ }
121
+ }
122
+ // Default fallback
123
+ return 'main_clean_same';
124
+ }
125
+ /**
126
+ * Get human-readable description of scenario
127
+ */
128
+ export function getScenarioDescription(scenario) {
129
+ switch (scenario) {
130
+ case 'main_clean_same':
131
+ return 'On main branch, same as origin/main, no uncommitted changes';
132
+ case 'main_staged_same':
133
+ return 'On main branch, same as origin/main, staged changes only';
134
+ case 'main_unstaged_same':
135
+ return 'On main branch, same as origin/main, unstaged changes only';
136
+ case 'main_both_same':
137
+ return 'On main branch, same as origin/main, both staged and unstaged changes';
138
+ case 'main_clean_ahead':
139
+ return 'On main branch, ahead of origin/main, no uncommitted changes';
140
+ case 'main_changes_ahead':
141
+ return 'On main branch, ahead of origin/main, with uncommitted changes';
142
+ case 'branch_same_as_main':
143
+ return 'On feature branch at same commit as main';
144
+ case 'branch_ancestor':
145
+ return 'On feature branch that is already merged into main';
146
+ case 'branch_divergent':
147
+ return 'On feature branch with commits not in main';
148
+ case 'branch_with_changes':
149
+ return 'On feature branch with uncommitted changes';
150
+ case 'detached_head':
151
+ return 'In detached HEAD state';
152
+ case 'pr_worktree':
153
+ return 'Running from a PR worktree';
154
+ }
155
+ }
156
+ /**
157
+ * Check if state has any uncommitted changes
158
+ */
159
+ export function hasChanges(state) {
160
+ return state.workingTreeStatus !== 'clean';
161
+ }
162
+ /**
163
+ * Check if state has local commits not pushed
164
+ */
165
+ export function hasLocalCommits(state) {
166
+ return state.localCommits.length > 0;
167
+ }
168
+ /**
169
+ * Format file list for display
170
+ */
171
+ export function formatFileList(files, prefix = '') {
172
+ if (files.length === 0) {
173
+ return '';
174
+ }
175
+ return files.map((f) => `${prefix}${f}`).join('\n');
176
+ }
177
+ /**
178
+ * Format commit list for display
179
+ */
180
+ export function formatCommitList(commits) {
181
+ if (commits.length === 0) {
182
+ return '';
183
+ }
184
+ return commits.map((c) => ` ${c}`).join('\n');
185
+ }
186
+ //# sourceMappingURL=state-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-detection.js","sourceRoot":"","sources":["../../src/lib/state-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state-detection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-detection.test.d.ts","sourceRoot":"","sources":["../../src/lib/state-detection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,164 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectScenario, getScenarioDescription, hasChanges, hasLocalCommits, formatFileList, formatCommitList, } from './state-detection.js';
3
+ describe('state-detection', () => {
4
+ // Helper to create a minimal GitState for testing
5
+ function createState(overrides = {}) {
6
+ return {
7
+ worktreeType: 'main_worktree',
8
+ branchType: 'main',
9
+ currentBranch: 'main',
10
+ commitRelationship: 'same',
11
+ workingTreeStatus: 'clean',
12
+ localCommits: [],
13
+ stagedFiles: [],
14
+ unstagedFiles: [],
15
+ repoRoot: '/home/user/repo',
16
+ repoName: 'repo',
17
+ ...overrides,
18
+ };
19
+ }
20
+ describe('detectScenario', () => {
21
+ it('should detect main_clean_same scenario', () => {
22
+ const state = createState();
23
+ expect(detectScenario(state)).toBe('main_clean_same');
24
+ });
25
+ it('should detect main_staged_same scenario', () => {
26
+ const state = createState({
27
+ workingTreeStatus: 'staged_only',
28
+ });
29
+ expect(detectScenario(state)).toBe('main_staged_same');
30
+ });
31
+ it('should detect main_unstaged_same scenario', () => {
32
+ const state = createState({
33
+ workingTreeStatus: 'unstaged_only',
34
+ });
35
+ expect(detectScenario(state)).toBe('main_unstaged_same');
36
+ });
37
+ it('should detect main_both_same scenario', () => {
38
+ const state = createState({
39
+ workingTreeStatus: 'both',
40
+ });
41
+ expect(detectScenario(state)).toBe('main_both_same');
42
+ });
43
+ it('should detect main_clean_ahead scenario', () => {
44
+ const state = createState({
45
+ commitRelationship: 'ahead',
46
+ localCommits: ['abc123 Some commit'],
47
+ });
48
+ expect(detectScenario(state)).toBe('main_clean_ahead');
49
+ });
50
+ it('should detect main_changes_ahead scenario', () => {
51
+ const state = createState({
52
+ commitRelationship: 'ahead',
53
+ workingTreeStatus: 'staged_only',
54
+ localCommits: ['abc123 Some commit'],
55
+ });
56
+ expect(detectScenario(state)).toBe('main_changes_ahead');
57
+ });
58
+ it('should detect branch_same_as_main scenario', () => {
59
+ const state = createState({
60
+ branchType: 'other',
61
+ currentBranch: 'feature-branch',
62
+ });
63
+ expect(detectScenario(state)).toBe('branch_same_as_main');
64
+ });
65
+ it('should detect branch_ancestor scenario', () => {
66
+ const state = createState({
67
+ branchType: 'other',
68
+ currentBranch: 'feature-branch',
69
+ commitRelationship: 'ancestor',
70
+ });
71
+ expect(detectScenario(state)).toBe('branch_ancestor');
72
+ });
73
+ it('should detect branch_divergent scenario', () => {
74
+ const state = createState({
75
+ branchType: 'other',
76
+ currentBranch: 'feature-branch',
77
+ commitRelationship: 'divergent',
78
+ localCommits: ['abc123 Some commit'],
79
+ });
80
+ expect(detectScenario(state)).toBe('branch_divergent');
81
+ });
82
+ it('should detect branch_with_changes scenario', () => {
83
+ const state = createState({
84
+ branchType: 'other',
85
+ currentBranch: 'feature-branch',
86
+ workingTreeStatus: 'both',
87
+ });
88
+ expect(detectScenario(state)).toBe('branch_with_changes');
89
+ });
90
+ it('should detect detached_head scenario', () => {
91
+ const state = createState({
92
+ branchType: 'detached',
93
+ currentBranch: null,
94
+ });
95
+ expect(detectScenario(state)).toBe('detached_head');
96
+ });
97
+ it('should detect pr_worktree scenario', () => {
98
+ const state = createState({
99
+ worktreeType: 'pr_worktree',
100
+ branchType: 'other',
101
+ currentBranch: 'claude/feature-abc123',
102
+ });
103
+ expect(detectScenario(state)).toBe('pr_worktree');
104
+ });
105
+ });
106
+ describe('getScenarioDescription', () => {
107
+ it('should return description for each scenario', () => {
108
+ expect(getScenarioDescription('main_clean_same')).toContain('main branch');
109
+ expect(getScenarioDescription('detached_head')).toContain('detached');
110
+ expect(getScenarioDescription('pr_worktree')).toContain('PR worktree');
111
+ });
112
+ });
113
+ describe('hasChanges', () => {
114
+ it('should return false for clean state', () => {
115
+ const state = createState();
116
+ expect(hasChanges(state)).toBe(false);
117
+ });
118
+ it('should return true for staged changes', () => {
119
+ const state = createState({ workingTreeStatus: 'staged_only' });
120
+ expect(hasChanges(state)).toBe(true);
121
+ });
122
+ it('should return true for unstaged changes', () => {
123
+ const state = createState({ workingTreeStatus: 'unstaged_only' });
124
+ expect(hasChanges(state)).toBe(true);
125
+ });
126
+ it('should return true for both staged and unstaged', () => {
127
+ const state = createState({ workingTreeStatus: 'both' });
128
+ expect(hasChanges(state)).toBe(true);
129
+ });
130
+ });
131
+ describe('hasLocalCommits', () => {
132
+ it('should return false when no local commits', () => {
133
+ const state = createState();
134
+ expect(hasLocalCommits(state)).toBe(false);
135
+ });
136
+ it('should return true when there are local commits', () => {
137
+ const state = createState({ localCommits: ['abc123 feat: add feature'] });
138
+ expect(hasLocalCommits(state)).toBe(true);
139
+ });
140
+ });
141
+ describe('formatFileList', () => {
142
+ it('should return empty string for empty list', () => {
143
+ expect(formatFileList([])).toBe('');
144
+ });
145
+ it('should format file list with default prefix', () => {
146
+ const result = formatFileList(['file1.ts', 'file2.ts']);
147
+ expect(result).toBe('file1.ts\nfile2.ts');
148
+ });
149
+ it('should format file list with custom prefix', () => {
150
+ const result = formatFileList(['file1.ts', 'file2.ts'], ' ');
151
+ expect(result).toBe(' file1.ts\n file2.ts');
152
+ });
153
+ });
154
+ describe('formatCommitList', () => {
155
+ it('should return empty string for empty list', () => {
156
+ expect(formatCommitList([])).toBe('');
157
+ });
158
+ it('should format commit list with indentation', () => {
159
+ const result = formatCommitList(['abc123 First commit', 'def456 Second commit']);
160
+ expect(result).toBe(' abc123 First commit\n def456 Second commit');
161
+ });
162
+ });
163
+ });
164
+ //# sourceMappingURL=state-detection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-detection.test.js","sourceRoot":"","sources":["../../src/lib/state-detection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { run as runLink, LinkArgv } from './link-configs.js';
2
+ export { run as runValidate, ValidateArgv } from './validate-manifest.js';
3
+ export { run as runManage, ManageArgv } from './manage-manifest.js';
4
+ export { showMainMenu } from './main-menu.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/wtlink/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,GAAG,IAAI,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // wtlink - Worktree Config Link Manager
2
+ // Manages linking of configuration files between git worktrees
3
+ export { run as runLink } from './link-configs.js';
4
+ export { run as runValidate } from './validate-manifest.js';
5
+ export { run as runManage } from './manage-manifest.js';
6
+ export { showMainMenu } from './main-menu.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/wtlink/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,+DAA+D;AAE/D,OAAO,EAAE,GAAG,IAAI,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,GAAG,IAAI,WAAW,EAAgB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,GAAG,IAAI,SAAS,EAAc,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface LinkArgv {
2
+ source?: string;
3
+ destination?: string;
4
+ dryRun: boolean;
5
+ manifestFile: string;
6
+ type: 'hard' | 'symbolic';
7
+ yes: boolean;
8
+ }
9
+ export declare function run(argv: LinkArgv): Promise<void>;
10
+ //# sourceMappingURL=link-configs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-configs.d.ts","sourceRoot":"","sources":["../../../src/lib/wtlink/link-configs.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,GAAG,EAAE,OAAO,CAAC;CACd;AAwVD,wBAAsB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiNvD"}