@mattli/dotmd 0.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.
- package/README.md +77 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +23 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install-hook.d.ts +2 -0
- package/dist/cli/commands/install-hook.d.ts.map +1 -0
- package/dist/cli/commands/install-hook.js +31 -0
- package/dist/cli/commands/install-hook.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +5 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +75 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +4 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +8 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +70 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +13 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +36 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +28 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/dashboard/layout.d.ts +6 -0
- package/dist/dashboard/layout.d.ts.map +1 -0
- package/dist/dashboard/layout.js +47 -0
- package/dist/dashboard/layout.js.map +1 -0
- package/dist/dashboard/server.d.ts +5 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +305 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/settings-client.d.ts +2 -0
- package/dist/dashboard/settings-client.d.ts.map +1 -0
- package/dist/dashboard/settings-client.js +310 -0
- package/dist/dashboard/settings-client.js.map +1 -0
- package/dist/dashboard/settings.d.ts +3 -0
- package/dist/dashboard/settings.d.ts.map +1 -0
- package/dist/dashboard/settings.js +99 -0
- package/dist/dashboard/settings.js.map +1 -0
- package/dist/dashboard/views.d.ts +8 -0
- package/dist/dashboard/views.d.ts.map +1 -0
- package/dist/dashboard/views.js +694 -0
- package/dist/dashboard/views.js.map +1 -0
- package/dist/dashboard/wizard-client.d.ts +2 -0
- package/dist/dashboard/wizard-client.d.ts.map +1 -0
- package/dist/dashboard/wizard-client.js +266 -0
- package/dist/dashboard/wizard-client.js.map +1 -0
- package/dist/dashboard/wizard.d.ts +9 -0
- package/dist/dashboard/wizard.d.ts.map +1 -0
- package/dist/dashboard/wizard.js +236 -0
- package/dist/dashboard/wizard.js.map +1 -0
- package/dist/scanner/git.d.ts +8 -0
- package/dist/scanner/git.d.ts.map +1 -0
- package/dist/scanner/git.js +34 -0
- package/dist/scanner/git.js.map +1 -0
- package/dist/scanner/index.d.ts +10 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +60 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/storage/db.d.ts +3 -0
- package/dist/storage/db.d.ts.map +1 -0
- package/dist/storage/db.js +52 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/snapshots.d.ts +43 -0
- package/dist/storage/snapshots.d.ts.map +1 -0
- package/dist/storage/snapshots.js +102 -0
- package/dist/storage/snapshots.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/dashboard/views.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const WIZARD_CLIENT_SCRIPT = "<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n // --- Chip toggling ---\n document.querySelectorAll('[data-chip]').forEach(function(chip) {\n chip.addEventListener('click', function() {\n var isSelected = chip.getAttribute('data-selected') === 'true';\n chip.setAttribute('data-selected', isSelected ? 'false' : 'true');\n if (isSelected) {\n chip.classList.remove('bg-blue-100', 'text-blue-800', 'border-blue-300');\n chip.classList.add('bg-gray-100', 'text-gray-600', 'border-gray-300');\n } else {\n chip.classList.remove('bg-gray-100', 'text-gray-600', 'border-gray-300');\n chip.classList.add('bg-blue-100', 'text-blue-800', 'border-blue-300');\n }\n });\n });\n\n // --- Folder browser ---\n var openBrowserBtn = document.getElementById('open-browser');\n var folderBrowser = document.getElementById('folder-browser');\n var browserPath = document.getElementById('browser-path');\n var browserList = document.getElementById('browser-list');\n var browserUp = document.getElementById('browser-up');\n var customList = document.getElementById('custom-list');\n var browserAdd = document.getElementById('browser-add');\n var currentBrowseDir = null;\n\n if (browserAdd) {\n browserAdd.addEventListener('click', function() {\n if (currentBrowseDir) addFolderChip(currentBrowseDir);\n });\n }\n\n function addFolderChip(folderPath) {\n if (!customList) return;\n // Don't add duplicates\n var existing = customList.querySelectorAll('[data-custom-value]');\n for (var i = 0; i < existing.length; i++) {\n if (existing[i].getAttribute('data-custom-value') === folderPath) return;\n }\n // Also check if it's already a suggested chip that's selected\n var chips = document.querySelectorAll('[data-chip]');\n for (var i = 0; i < chips.length; i++) {\n if (chips[i].getAttribute('data-value') === folderPath) return;\n }\n\n var tag = document.createElement('span');\n tag.setAttribute('data-custom-value', folderPath);\n tag.className = 'inline-flex items-center gap-1 px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 border border-blue-300';\n tag.innerHTML = folderPath + ' <button type=\"button\" class=\"ml-1 text-blue-500 hover:text-blue-700 font-bold\">×</button>';\n tag.querySelector('button').addEventListener('click', function() {\n tag.remove();\n });\n customList.appendChild(tag);\n }\n\n function loadBrowserDir(dir) {\n fetch('/api/setup/browse?dir=' + encodeURIComponent(dir || '~'))\n .then(function(res) { return res.json(); })\n .then(function(data) {\n if (data.error) return;\n currentBrowseDir = data.current;\n if (browserPath) browserPath.textContent = data.current;\n if (browserUp) {\n browserUp.style.display = data.parent ? '' : 'none';\n browserUp.onclick = function() { loadBrowserDir(data.parent); };\n }\n if (!browserList) return;\n browserList.innerHTML = '';\n\n data.dirs.forEach(function(entry) {\n var row = document.createElement('div');\n row.className = 'px-4 py-2 hover:bg-gray-50 cursor-pointer flex items-center gap-2 text-sm';\n row.innerHTML = '<span class=\"text-gray-400\">📁</span> ' + entry.name;\n row.addEventListener('click', function() {\n loadBrowserDir(entry.path);\n });\n browserList.appendChild(row);\n });\n });\n }\n\n if (openBrowserBtn && folderBrowser) {\n openBrowserBtn.addEventListener('click', function() {\n var isHidden = folderBrowser.classList.contains('hidden');\n if (isHidden) {\n folderBrowser.classList.remove('hidden');\n openBrowserBtn.textContent = 'Hide browser';\n loadBrowserDir('~');\n } else {\n folderBrowser.classList.add('hidden');\n openBrowserBtn.textContent = 'Browse folders...';\n }\n });\n }\n\n // --- Custom input for patterns (step 2) ---\n var addBtn = document.getElementById('add-custom');\n var customInput = document.getElementById('custom-input');\n\n function addCustomItem() {\n if (!customInput || !customList) return;\n var value = customInput.value.trim();\n if (!value) return;\n\n var existing = customList.querySelectorAll('[data-custom-value]');\n for (var i = 0; i < existing.length; i++) {\n if (existing[i].getAttribute('data-custom-value') === value) return;\n }\n\n var tag = document.createElement('span');\n tag.setAttribute('data-custom-value', value);\n tag.className = 'inline-flex items-center gap-1 px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 border border-blue-300';\n tag.innerHTML = value + ' <button type=\"button\" class=\"ml-1 text-blue-500 hover:text-blue-700 font-bold\">×</button>';\n tag.querySelector('button').addEventListener('click', function() {\n tag.remove();\n });\n customList.appendChild(tag);\n customInput.value = '';\n }\n\n if (addBtn) {\n addBtn.addEventListener('click', addCustomItem);\n }\n if (customInput) {\n customInput.addEventListener('keydown', function(e) {\n if (e.key === 'Enter') {\n e.preventDefault();\n addCustomItem();\n }\n });\n }\n\n // --- Collect selected values ---\n function getSelectedValues() {\n var values = [];\n document.querySelectorAll('[data-chip][data-selected=\"true\"]').forEach(function(chip) {\n values.push(chip.getAttribute('data-value'));\n });\n if (customList) {\n customList.querySelectorAll('[data-custom-value]').forEach(function(tag) {\n values.push(tag.getAttribute('data-custom-value'));\n });\n }\n return values;\n }\n\n // --- Step 1: Next button ---\n var nextBtn = document.getElementById('next-btn');\n if (nextBtn && nextBtn.getAttribute('data-step') === '1') {\n nextBtn.addEventListener('click', function() {\n var roots = getSelectedValues();\n if (roots.length === 0) {\n alert('Please select at least one folder.');\n return;\n }\n var params = new URLSearchParams();\n roots.forEach(function(r) { params.append('roots', r); });\n window.location.href = '/setup/step2?' + params.toString();\n });\n }\n\n // --- Step 2: Preview button ---\n if (nextBtn && nextBtn.getAttribute('data-step') === '2') {\n nextBtn.addEventListener('click', function() {\n var patterns = getSelectedValues();\n if (patterns.length === 0) {\n alert('Please select at least one pattern.');\n return;\n }\n // Get roots from URL\n var urlParams = new URLSearchParams(window.location.search);\n var roots = urlParams.getAll('roots');\n var params = new URLSearchParams();\n roots.forEach(function(r) { params.append('roots', r); });\n patterns.forEach(function(p) { params.append('patterns', p); });\n window.location.href = '/setup/step3?' + params.toString();\n });\n }\n\n // --- Step 3: Select/deselect by group ---\n document.querySelectorAll('[data-group-select]').forEach(function(btn) {\n btn.addEventListener('click', function() {\n var group = btn.getAttribute('data-group-select');\n var container = document.querySelector('[data-group=\"' + group + '\"]');\n if (container) {\n container.querySelectorAll('input[name=\"files\"]').forEach(function(cb) {\n cb.checked = true;\n });\n }\n });\n });\n document.querySelectorAll('[data-group-deselect]').forEach(function(btn) {\n btn.addEventListener('click', function() {\n var group = btn.getAttribute('data-group-deselect');\n var container = document.querySelector('[data-group=\"' + group + '\"]');\n if (container) {\n container.querySelectorAll('input[name=\"files\"]').forEach(function(cb) {\n cb.checked = false;\n });\n }\n });\n });\n\n // --- Step 3: Select all / Deselect all ---\n var selectAllBtn = document.getElementById('select-all');\n var deselectAllBtn = document.getElementById('deselect-all');\n\n if (selectAllBtn) {\n selectAllBtn.addEventListener('click', function() {\n document.querySelectorAll('input[name=\"files\"]').forEach(function(cb) {\n cb.checked = true;\n });\n });\n }\n if (deselectAllBtn) {\n deselectAllBtn.addEventListener('click', function() {\n document.querySelectorAll('input[name=\"files\"]').forEach(function(cb) {\n cb.checked = false;\n });\n });\n }\n\n // --- Step 3: Confirm button ---\n var confirmBtn = document.getElementById('confirm-btn');\n if (confirmBtn) {\n confirmBtn.addEventListener('click', function() {\n confirmBtn.disabled = true;\n confirmBtn.textContent = 'Saving...';\n\n var urlParams = new URLSearchParams(window.location.search);\n var roots = urlParams.getAll('roots');\n var patterns = urlParams.getAll('patterns');\n\n var excludedFiles = [];\n document.querySelectorAll('input[name=\"files\"]').forEach(function(cb) {\n if (!cb.checked) {\n excludedFiles.push(cb.value);\n }\n });\n\n fetch('/api/setup/confirm', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ roots: roots, patterns: patterns, excludedFiles: excludedFiles })\n })\n .then(function(res) { return res.json(); })\n .then(function(data) {\n if (data.success) {\n window.location.href = '/setup/complete?count=' + data.trackedCount;\n } else {\n alert('Error saving config. Please try again.');\n confirmBtn.disabled = false;\n confirmBtn.textContent = 'Confirm & Start Tracking';\n }\n })\n .catch(function() {\n alert('Error saving config. Please try again.');\n confirmBtn.disabled = false;\n confirmBtn.textContent = 'Confirm & Start Tracking';\n });\n });\n }\n});\n</script>";
|
|
2
|
+
//# sourceMappingURL=wizard-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-client.d.ts","sourceRoot":"","sources":["../../src/dashboard/wizard-client.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,83TAwQvB,CAAC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
export const WIZARD_CLIENT_SCRIPT = `<script>
|
|
2
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
3
|
+
// --- Chip toggling ---
|
|
4
|
+
document.querySelectorAll('[data-chip]').forEach(function(chip) {
|
|
5
|
+
chip.addEventListener('click', function() {
|
|
6
|
+
var isSelected = chip.getAttribute('data-selected') === 'true';
|
|
7
|
+
chip.setAttribute('data-selected', isSelected ? 'false' : 'true');
|
|
8
|
+
if (isSelected) {
|
|
9
|
+
chip.classList.remove('bg-blue-100', 'text-blue-800', 'border-blue-300');
|
|
10
|
+
chip.classList.add('bg-gray-100', 'text-gray-600', 'border-gray-300');
|
|
11
|
+
} else {
|
|
12
|
+
chip.classList.remove('bg-gray-100', 'text-gray-600', 'border-gray-300');
|
|
13
|
+
chip.classList.add('bg-blue-100', 'text-blue-800', 'border-blue-300');
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// --- Folder browser ---
|
|
19
|
+
var openBrowserBtn = document.getElementById('open-browser');
|
|
20
|
+
var folderBrowser = document.getElementById('folder-browser');
|
|
21
|
+
var browserPath = document.getElementById('browser-path');
|
|
22
|
+
var browserList = document.getElementById('browser-list');
|
|
23
|
+
var browserUp = document.getElementById('browser-up');
|
|
24
|
+
var customList = document.getElementById('custom-list');
|
|
25
|
+
var browserAdd = document.getElementById('browser-add');
|
|
26
|
+
var currentBrowseDir = null;
|
|
27
|
+
|
|
28
|
+
if (browserAdd) {
|
|
29
|
+
browserAdd.addEventListener('click', function() {
|
|
30
|
+
if (currentBrowseDir) addFolderChip(currentBrowseDir);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function addFolderChip(folderPath) {
|
|
35
|
+
if (!customList) return;
|
|
36
|
+
// Don't add duplicates
|
|
37
|
+
var existing = customList.querySelectorAll('[data-custom-value]');
|
|
38
|
+
for (var i = 0; i < existing.length; i++) {
|
|
39
|
+
if (existing[i].getAttribute('data-custom-value') === folderPath) return;
|
|
40
|
+
}
|
|
41
|
+
// Also check if it's already a suggested chip that's selected
|
|
42
|
+
var chips = document.querySelectorAll('[data-chip]');
|
|
43
|
+
for (var i = 0; i < chips.length; i++) {
|
|
44
|
+
if (chips[i].getAttribute('data-value') === folderPath) return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
var tag = document.createElement('span');
|
|
48
|
+
tag.setAttribute('data-custom-value', folderPath);
|
|
49
|
+
tag.className = 'inline-flex items-center gap-1 px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 border border-blue-300';
|
|
50
|
+
tag.innerHTML = folderPath + ' <button type="button" class="ml-1 text-blue-500 hover:text-blue-700 font-bold">×</button>';
|
|
51
|
+
tag.querySelector('button').addEventListener('click', function() {
|
|
52
|
+
tag.remove();
|
|
53
|
+
});
|
|
54
|
+
customList.appendChild(tag);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function loadBrowserDir(dir) {
|
|
58
|
+
fetch('/api/setup/browse?dir=' + encodeURIComponent(dir || '~'))
|
|
59
|
+
.then(function(res) { return res.json(); })
|
|
60
|
+
.then(function(data) {
|
|
61
|
+
if (data.error) return;
|
|
62
|
+
currentBrowseDir = data.current;
|
|
63
|
+
if (browserPath) browserPath.textContent = data.current;
|
|
64
|
+
if (browserUp) {
|
|
65
|
+
browserUp.style.display = data.parent ? '' : 'none';
|
|
66
|
+
browserUp.onclick = function() { loadBrowserDir(data.parent); };
|
|
67
|
+
}
|
|
68
|
+
if (!browserList) return;
|
|
69
|
+
browserList.innerHTML = '';
|
|
70
|
+
|
|
71
|
+
data.dirs.forEach(function(entry) {
|
|
72
|
+
var row = document.createElement('div');
|
|
73
|
+
row.className = 'px-4 py-2 hover:bg-gray-50 cursor-pointer flex items-center gap-2 text-sm';
|
|
74
|
+
row.innerHTML = '<span class="text-gray-400">📁</span> ' + entry.name;
|
|
75
|
+
row.addEventListener('click', function() {
|
|
76
|
+
loadBrowserDir(entry.path);
|
|
77
|
+
});
|
|
78
|
+
browserList.appendChild(row);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (openBrowserBtn && folderBrowser) {
|
|
84
|
+
openBrowserBtn.addEventListener('click', function() {
|
|
85
|
+
var isHidden = folderBrowser.classList.contains('hidden');
|
|
86
|
+
if (isHidden) {
|
|
87
|
+
folderBrowser.classList.remove('hidden');
|
|
88
|
+
openBrowserBtn.textContent = 'Hide browser';
|
|
89
|
+
loadBrowserDir('~');
|
|
90
|
+
} else {
|
|
91
|
+
folderBrowser.classList.add('hidden');
|
|
92
|
+
openBrowserBtn.textContent = 'Browse folders...';
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// --- Custom input for patterns (step 2) ---
|
|
98
|
+
var addBtn = document.getElementById('add-custom');
|
|
99
|
+
var customInput = document.getElementById('custom-input');
|
|
100
|
+
|
|
101
|
+
function addCustomItem() {
|
|
102
|
+
if (!customInput || !customList) return;
|
|
103
|
+
var value = customInput.value.trim();
|
|
104
|
+
if (!value) return;
|
|
105
|
+
|
|
106
|
+
var existing = customList.querySelectorAll('[data-custom-value]');
|
|
107
|
+
for (var i = 0; i < existing.length; i++) {
|
|
108
|
+
if (existing[i].getAttribute('data-custom-value') === value) return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
var tag = document.createElement('span');
|
|
112
|
+
tag.setAttribute('data-custom-value', value);
|
|
113
|
+
tag.className = 'inline-flex items-center gap-1 px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800 border border-blue-300';
|
|
114
|
+
tag.innerHTML = value + ' <button type="button" class="ml-1 text-blue-500 hover:text-blue-700 font-bold">×</button>';
|
|
115
|
+
tag.querySelector('button').addEventListener('click', function() {
|
|
116
|
+
tag.remove();
|
|
117
|
+
});
|
|
118
|
+
customList.appendChild(tag);
|
|
119
|
+
customInput.value = '';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (addBtn) {
|
|
123
|
+
addBtn.addEventListener('click', addCustomItem);
|
|
124
|
+
}
|
|
125
|
+
if (customInput) {
|
|
126
|
+
customInput.addEventListener('keydown', function(e) {
|
|
127
|
+
if (e.key === 'Enter') {
|
|
128
|
+
e.preventDefault();
|
|
129
|
+
addCustomItem();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// --- Collect selected values ---
|
|
135
|
+
function getSelectedValues() {
|
|
136
|
+
var values = [];
|
|
137
|
+
document.querySelectorAll('[data-chip][data-selected="true"]').forEach(function(chip) {
|
|
138
|
+
values.push(chip.getAttribute('data-value'));
|
|
139
|
+
});
|
|
140
|
+
if (customList) {
|
|
141
|
+
customList.querySelectorAll('[data-custom-value]').forEach(function(tag) {
|
|
142
|
+
values.push(tag.getAttribute('data-custom-value'));
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return values;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// --- Step 1: Next button ---
|
|
149
|
+
var nextBtn = document.getElementById('next-btn');
|
|
150
|
+
if (nextBtn && nextBtn.getAttribute('data-step') === '1') {
|
|
151
|
+
nextBtn.addEventListener('click', function() {
|
|
152
|
+
var roots = getSelectedValues();
|
|
153
|
+
if (roots.length === 0) {
|
|
154
|
+
alert('Please select at least one folder.');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
var params = new URLSearchParams();
|
|
158
|
+
roots.forEach(function(r) { params.append('roots', r); });
|
|
159
|
+
window.location.href = '/setup/step2?' + params.toString();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// --- Step 2: Preview button ---
|
|
164
|
+
if (nextBtn && nextBtn.getAttribute('data-step') === '2') {
|
|
165
|
+
nextBtn.addEventListener('click', function() {
|
|
166
|
+
var patterns = getSelectedValues();
|
|
167
|
+
if (patterns.length === 0) {
|
|
168
|
+
alert('Please select at least one pattern.');
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Get roots from URL
|
|
172
|
+
var urlParams = new URLSearchParams(window.location.search);
|
|
173
|
+
var roots = urlParams.getAll('roots');
|
|
174
|
+
var params = new URLSearchParams();
|
|
175
|
+
roots.forEach(function(r) { params.append('roots', r); });
|
|
176
|
+
patterns.forEach(function(p) { params.append('patterns', p); });
|
|
177
|
+
window.location.href = '/setup/step3?' + params.toString();
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// --- Step 3: Select/deselect by group ---
|
|
182
|
+
document.querySelectorAll('[data-group-select]').forEach(function(btn) {
|
|
183
|
+
btn.addEventListener('click', function() {
|
|
184
|
+
var group = btn.getAttribute('data-group-select');
|
|
185
|
+
var container = document.querySelector('[data-group="' + group + '"]');
|
|
186
|
+
if (container) {
|
|
187
|
+
container.querySelectorAll('input[name="files"]').forEach(function(cb) {
|
|
188
|
+
cb.checked = true;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
document.querySelectorAll('[data-group-deselect]').forEach(function(btn) {
|
|
194
|
+
btn.addEventListener('click', function() {
|
|
195
|
+
var group = btn.getAttribute('data-group-deselect');
|
|
196
|
+
var container = document.querySelector('[data-group="' + group + '"]');
|
|
197
|
+
if (container) {
|
|
198
|
+
container.querySelectorAll('input[name="files"]').forEach(function(cb) {
|
|
199
|
+
cb.checked = false;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// --- Step 3: Select all / Deselect all ---
|
|
206
|
+
var selectAllBtn = document.getElementById('select-all');
|
|
207
|
+
var deselectAllBtn = document.getElementById('deselect-all');
|
|
208
|
+
|
|
209
|
+
if (selectAllBtn) {
|
|
210
|
+
selectAllBtn.addEventListener('click', function() {
|
|
211
|
+
document.querySelectorAll('input[name="files"]').forEach(function(cb) {
|
|
212
|
+
cb.checked = true;
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (deselectAllBtn) {
|
|
217
|
+
deselectAllBtn.addEventListener('click', function() {
|
|
218
|
+
document.querySelectorAll('input[name="files"]').forEach(function(cb) {
|
|
219
|
+
cb.checked = false;
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// --- Step 3: Confirm button ---
|
|
225
|
+
var confirmBtn = document.getElementById('confirm-btn');
|
|
226
|
+
if (confirmBtn) {
|
|
227
|
+
confirmBtn.addEventListener('click', function() {
|
|
228
|
+
confirmBtn.disabled = true;
|
|
229
|
+
confirmBtn.textContent = 'Saving...';
|
|
230
|
+
|
|
231
|
+
var urlParams = new URLSearchParams(window.location.search);
|
|
232
|
+
var roots = urlParams.getAll('roots');
|
|
233
|
+
var patterns = urlParams.getAll('patterns');
|
|
234
|
+
|
|
235
|
+
var excludedFiles = [];
|
|
236
|
+
document.querySelectorAll('input[name="files"]').forEach(function(cb) {
|
|
237
|
+
if (!cb.checked) {
|
|
238
|
+
excludedFiles.push(cb.value);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
fetch('/api/setup/confirm', {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
headers: { 'Content-Type': 'application/json' },
|
|
245
|
+
body: JSON.stringify({ roots: roots, patterns: patterns, excludedFiles: excludedFiles })
|
|
246
|
+
})
|
|
247
|
+
.then(function(res) { return res.json(); })
|
|
248
|
+
.then(function(data) {
|
|
249
|
+
if (data.success) {
|
|
250
|
+
window.location.href = '/setup/complete?count=' + data.trackedCount;
|
|
251
|
+
} else {
|
|
252
|
+
alert('Error saving config. Please try again.');
|
|
253
|
+
confirmBtn.disabled = false;
|
|
254
|
+
confirmBtn.textContent = 'Confirm & Start Tracking';
|
|
255
|
+
}
|
|
256
|
+
})
|
|
257
|
+
.catch(function() {
|
|
258
|
+
alert('Error saving config. Please try again.');
|
|
259
|
+
confirmBtn.disabled = false;
|
|
260
|
+
confirmBtn.textContent = 'Confirm & Start Tracking';
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
</script>`;
|
|
266
|
+
//# sourceMappingURL=wizard-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-client.js","sourceRoot":"","sources":["../../src/dashboard/wizard-client.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwQ1B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function setupFoldersPage(suggestedRoots: string[], existingDirs: string[]): string;
|
|
2
|
+
export declare function setupPatternsPage(selectedRoots: string[], suggestedPatterns: string[], defaultPatterns: string[]): string;
|
|
3
|
+
export declare function setupPreviewPage(files: Array<{
|
|
4
|
+
path: string;
|
|
5
|
+
category: string;
|
|
6
|
+
root: string;
|
|
7
|
+
}>, roots: string[], patterns: string[]): string;
|
|
8
|
+
export declare function setupCompletePage(fileCount: number): string;
|
|
9
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/dashboard/wizard.ts"],"names":[],"mappings":"AA0DA,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EAAE,EACxB,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CA0CR;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EAAE,EACvB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,CA0CR;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9D,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,MAAM,CA6FR;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAe3D"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import os from "os";
|
|
2
|
+
import { expandHome } from "../config/defaults.js";
|
|
3
|
+
function escapeHtml(str) {
|
|
4
|
+
return str
|
|
5
|
+
.replace(/&/g, "&")
|
|
6
|
+
.replace(/</g, "<")
|
|
7
|
+
.replace(/>/g, ">")
|
|
8
|
+
.replace(/"/g, """);
|
|
9
|
+
}
|
|
10
|
+
function displayPath(p) {
|
|
11
|
+
return p.replace(os.homedir(), "~");
|
|
12
|
+
}
|
|
13
|
+
function stepIndicator(current) {
|
|
14
|
+
const steps = ["Folders", "Patterns", "Preview"];
|
|
15
|
+
return `<div class="flex items-center justify-center gap-2 mb-8">
|
|
16
|
+
${steps
|
|
17
|
+
.map((label, i) => {
|
|
18
|
+
const num = i + 1;
|
|
19
|
+
const isActive = num === current;
|
|
20
|
+
const isDone = num < current;
|
|
21
|
+
const circleClass = isActive
|
|
22
|
+
? "bg-blue-600 text-white"
|
|
23
|
+
: isDone
|
|
24
|
+
? "bg-blue-200 text-blue-800"
|
|
25
|
+
: "bg-gray-200 text-gray-500";
|
|
26
|
+
const labelClass = isActive
|
|
27
|
+
? "text-blue-600 font-semibold"
|
|
28
|
+
: "text-gray-400";
|
|
29
|
+
const connector = i < steps.length - 1
|
|
30
|
+
? `<div class="w-12 h-px ${num < current ? "bg-blue-300" : "bg-gray-200"}"></div>`
|
|
31
|
+
: "";
|
|
32
|
+
return `<div class="flex items-center gap-2">
|
|
33
|
+
<span class="w-7 h-7 rounded-full flex items-center justify-center text-sm font-medium ${circleClass}">${num}</span>
|
|
34
|
+
<span class="text-sm ${labelClass}">${label}</span>
|
|
35
|
+
</div>${connector}`;
|
|
36
|
+
})
|
|
37
|
+
.join("")}
|
|
38
|
+
</div>`;
|
|
39
|
+
}
|
|
40
|
+
function chipHtml(value, label, selected) {
|
|
41
|
+
const selectedClasses = selected
|
|
42
|
+
? "bg-blue-100 text-blue-800 border-blue-300"
|
|
43
|
+
: "bg-gray-100 text-gray-600 border-gray-300";
|
|
44
|
+
return `<span data-chip data-value="${escapeHtml(value)}" data-selected="${selected}"
|
|
45
|
+
class="inline-flex items-center px-3 py-1.5 rounded-full text-sm font-medium border cursor-pointer select-none transition-colors ${selectedClasses}">
|
|
46
|
+
${escapeHtml(label)}
|
|
47
|
+
</span>`;
|
|
48
|
+
}
|
|
49
|
+
export function setupFoldersPage(suggestedRoots, existingDirs) {
|
|
50
|
+
const chips = existingDirs
|
|
51
|
+
.map((root) => chipHtml(root, root, true))
|
|
52
|
+
.join("\n ");
|
|
53
|
+
return `
|
|
54
|
+
<div class="max-w-2xl mx-auto">
|
|
55
|
+
${stepIndicator(1)}
|
|
56
|
+
<h1 class="text-2xl font-bold mb-2">Where are your projects?</h1>
|
|
57
|
+
<p class="text-gray-500 mb-6">Select the folders where dotmd should look for instruction files. Click to deselect any you don't need.</p>
|
|
58
|
+
|
|
59
|
+
<div class="mb-6">
|
|
60
|
+
<h2 class="text-sm font-semibold text-gray-500 uppercase tracking-wide mb-3">Folders</h2>
|
|
61
|
+
<div id="custom-list" class="flex flex-wrap gap-2">
|
|
62
|
+
${chips}
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<div class="mb-8">
|
|
67
|
+
<button id="open-browser" type="button"
|
|
68
|
+
class="px-4 py-2 bg-gray-100 text-gray-700 rounded-lg text-sm font-medium hover:bg-gray-200 transition-colors border border-gray-300">
|
|
69
|
+
Browse for folder...
|
|
70
|
+
</button>
|
|
71
|
+
<div id="folder-browser" class="hidden mt-3 bg-white border border-gray-200 rounded-lg overflow-hidden">
|
|
72
|
+
<div id="browser-header" class="px-4 py-2 bg-gray-50 border-b border-gray-200 flex items-center justify-between text-sm">
|
|
73
|
+
<div class="flex items-center gap-2">
|
|
74
|
+
<button id="browser-up" type="button" class="text-blue-600 hover:underline font-medium">Up</button>
|
|
75
|
+
<span id="browser-path" class="text-gray-500 font-mono text-xs"></span>
|
|
76
|
+
</div>
|
|
77
|
+
<button id="browser-add" type="button" class="px-3 py-1 bg-blue-600 text-white rounded text-xs font-medium hover:bg-blue-700">Add this folder</button>
|
|
78
|
+
</div>
|
|
79
|
+
<div id="browser-list" class="max-h-64 overflow-y-auto divide-y divide-gray-100"></div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div class="flex justify-end">
|
|
84
|
+
<button id="next-btn" data-step="1" type="button"
|
|
85
|
+
class="px-6 py-2.5 bg-blue-600 text-white rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
|
|
86
|
+
Next
|
|
87
|
+
</button>
|
|
88
|
+
</div>
|
|
89
|
+
</div>`;
|
|
90
|
+
}
|
|
91
|
+
export function setupPatternsPage(selectedRoots, suggestedPatterns, defaultPatterns) {
|
|
92
|
+
const chips = suggestedPatterns
|
|
93
|
+
.map((p) => chipHtml(p, p, defaultPatterns.includes(p)))
|
|
94
|
+
.join("\n ");
|
|
95
|
+
const rootsParam = selectedRoots
|
|
96
|
+
.map((r) => `roots=${encodeURIComponent(r)}`)
|
|
97
|
+
.join("&");
|
|
98
|
+
return `
|
|
99
|
+
<div class="max-w-2xl mx-auto">
|
|
100
|
+
${stepIndicator(2)}
|
|
101
|
+
<h1 class="text-2xl font-bold mb-2">What files should we look for?</h1>
|
|
102
|
+
<p class="text-gray-500 mb-6">Select the filename patterns to search for in your selected folders. Common AI instruction file patterns are pre-selected.</p>
|
|
103
|
+
|
|
104
|
+
<div class="mb-6">
|
|
105
|
+
<h2 class="text-sm font-semibold text-gray-500 uppercase tracking-wide mb-3">Patterns</h2>
|
|
106
|
+
<div id="custom-list" class="flex flex-wrap gap-2">
|
|
107
|
+
${chips}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="mb-8">
|
|
112
|
+
<div class="flex gap-2">
|
|
113
|
+
<input id="custom-input" type="text" placeholder="rules/*.md"
|
|
114
|
+
class="flex-1 px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:border-blue-400">
|
|
115
|
+
<button id="add-custom" type="button"
|
|
116
|
+
class="px-4 py-2 bg-gray-100 text-gray-700 rounded-lg text-sm font-medium hover:bg-gray-200 transition-colors border border-gray-300">Add</button>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div class="flex justify-between">
|
|
121
|
+
<a href="/setup?${rootsParam}"
|
|
122
|
+
class="px-6 py-2.5 bg-gray-100 text-gray-700 rounded-lg text-sm font-medium hover:bg-gray-200 transition-colors">
|
|
123
|
+
Back
|
|
124
|
+
</a>
|
|
125
|
+
<button id="next-btn" data-step="2" type="button"
|
|
126
|
+
class="px-6 py-2.5 bg-blue-600 text-white rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
|
|
127
|
+
Preview Files
|
|
128
|
+
</button>
|
|
129
|
+
</div>
|
|
130
|
+
</div>`;
|
|
131
|
+
}
|
|
132
|
+
export function setupPreviewPage(files, roots, patterns) {
|
|
133
|
+
const rootsParam = roots
|
|
134
|
+
.map((r) => `roots=${encodeURIComponent(r)}`)
|
|
135
|
+
.join("&");
|
|
136
|
+
const patternsParam = patterns
|
|
137
|
+
.map((p) => `patterns=${encodeURIComponent(p)}`)
|
|
138
|
+
.join("&");
|
|
139
|
+
const backParams = `${rootsParam}&${patternsParam}`;
|
|
140
|
+
if (files.length === 0) {
|
|
141
|
+
return `
|
|
142
|
+
<div class="max-w-2xl mx-auto">
|
|
143
|
+
${stepIndicator(3)}
|
|
144
|
+
<h1 class="text-2xl font-bold mb-2">No files found</h1>
|
|
145
|
+
<p class="text-gray-500 mb-6">No matching files were found in the selected folders with the selected patterns. Try going back to adjust your selections.</p>
|
|
146
|
+
<a href="/setup/step2?${rootsParam}"
|
|
147
|
+
class="px-6 py-2.5 bg-gray-100 text-gray-700 rounded-lg text-sm font-medium hover:bg-gray-200 transition-colors">
|
|
148
|
+
Back
|
|
149
|
+
</a>
|
|
150
|
+
</div>`;
|
|
151
|
+
}
|
|
152
|
+
// Group by root (scan folder)
|
|
153
|
+
const groups = {};
|
|
154
|
+
const rootOrder = [];
|
|
155
|
+
for (const file of files) {
|
|
156
|
+
const root = file.root || "Other";
|
|
157
|
+
if (!groups[root]) {
|
|
158
|
+
groups[root] = [];
|
|
159
|
+
rootOrder.push(root);
|
|
160
|
+
}
|
|
161
|
+
groups[root].push(file);
|
|
162
|
+
}
|
|
163
|
+
let fileListHtml = "";
|
|
164
|
+
for (const root of rootOrder) {
|
|
165
|
+
const rootFiles = groups[root];
|
|
166
|
+
if (!rootFiles || rootFiles.length === 0)
|
|
167
|
+
continue;
|
|
168
|
+
fileListHtml += `<div class="mb-6">
|
|
169
|
+
<div class="flex items-center justify-between mb-2">
|
|
170
|
+
<h3 class="text-sm font-semibold text-gray-500 uppercase tracking-wide">${escapeHtml(root)}</h3>
|
|
171
|
+
<div class="flex gap-3">
|
|
172
|
+
<button type="button" data-group-select="${escapeHtml(root)}" class="text-xs text-blue-600 hover:underline">Select all</button>
|
|
173
|
+
<button type="button" data-group-deselect="${escapeHtml(root)}" class="text-xs text-blue-600 hover:underline">Deselect all</button>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="space-y-1" data-group="${escapeHtml(root)}">`;
|
|
177
|
+
for (const file of rootFiles) {
|
|
178
|
+
// Show path relative to root for cleaner display
|
|
179
|
+
const expanded = expandHome(root);
|
|
180
|
+
let relPath = file.path;
|
|
181
|
+
if (file.path.startsWith(expanded + "/")) {
|
|
182
|
+
relPath = file.path.slice(expanded.length + 1);
|
|
183
|
+
}
|
|
184
|
+
fileListHtml += `
|
|
185
|
+
<label class="flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-gray-50 cursor-pointer">
|
|
186
|
+
<input type="checkbox" name="files" value="${escapeHtml(file.path)}" checked
|
|
187
|
+
class="rounded border-gray-300 text-blue-600 focus:ring-blue-500">
|
|
188
|
+
<span class="font-mono text-sm">${escapeHtml(relPath)}</span>
|
|
189
|
+
</label>`;
|
|
190
|
+
}
|
|
191
|
+
fileListHtml += `</div></div>`;
|
|
192
|
+
}
|
|
193
|
+
return `
|
|
194
|
+
<div class="max-w-2xl mx-auto">
|
|
195
|
+
${stepIndicator(3)}
|
|
196
|
+
<h1 class="text-2xl font-bold mb-2">Review discovered files</h1>
|
|
197
|
+
<p class="text-gray-500 mb-4">Found <strong>${files.length}</strong> file${files.length === 1 ? "" : "s"}. Uncheck any files you don't want to track.</p>
|
|
198
|
+
|
|
199
|
+
<div class="flex gap-3 mb-4">
|
|
200
|
+
<button id="select-all" type="button" class="text-sm text-blue-600 hover:underline">Select all</button>
|
|
201
|
+
<button id="deselect-all" type="button" class="text-sm text-blue-600 hover:underline">Deselect all</button>
|
|
202
|
+
</div>
|
|
203
|
+
|
|
204
|
+
<div class="bg-white border border-gray-200 rounded-lg p-4 mb-6">
|
|
205
|
+
${fileListHtml}
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<div class="flex justify-between">
|
|
209
|
+
<a href="/setup/step2?${backParams}"
|
|
210
|
+
class="px-6 py-2.5 bg-gray-100 text-gray-700 rounded-lg text-sm font-medium hover:bg-gray-200 transition-colors">
|
|
211
|
+
Back
|
|
212
|
+
</a>
|
|
213
|
+
<button id="confirm-btn" type="button"
|
|
214
|
+
class="px-6 py-2.5 bg-blue-600 text-white rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
|
|
215
|
+
Confirm & Start Tracking
|
|
216
|
+
</button>
|
|
217
|
+
</div>
|
|
218
|
+
</div>`;
|
|
219
|
+
}
|
|
220
|
+
export function setupCompletePage(fileCount) {
|
|
221
|
+
return `
|
|
222
|
+
<div class="max-w-2xl mx-auto text-center py-16">
|
|
223
|
+
<div class="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-6">
|
|
224
|
+
<svg class="w-8 h-8 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
225
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
|
|
226
|
+
</svg>
|
|
227
|
+
</div>
|
|
228
|
+
<h1 class="text-2xl font-bold mb-2">Setup complete</h1>
|
|
229
|
+
<p class="text-gray-500 mb-8">Now tracking <strong>${fileCount}</strong> file${fileCount === 1 ? "" : "s"}. dotmd will snapshot changes whenever you scan.</p>
|
|
230
|
+
<a href="/"
|
|
231
|
+
class="px-6 py-2.5 bg-blue-600 text-white rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
|
|
232
|
+
Go to Dashboard
|
|
233
|
+
</a>
|
|
234
|
+
</div>`;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/dashboard/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/scanner/git.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAmBhE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYlD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function getGitInfo(filePath) {
|
|
4
|
+
try {
|
|
5
|
+
const dir = path.dirname(filePath);
|
|
6
|
+
const result = execSync(`git log -1 --format="%H%n%an%n%s" -- "${path.basename(filePath)}"`, { cwd: dir, encoding: "utf-8", timeout: 5000, stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
7
|
+
const lines = result.split("\n");
|
|
8
|
+
if (lines.length < 3 || !lines[0])
|
|
9
|
+
return undefined;
|
|
10
|
+
return {
|
|
11
|
+
commit: lines[0],
|
|
12
|
+
author: lines[1],
|
|
13
|
+
message: lines[2],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function isGitRepo(dirPath) {
|
|
21
|
+
try {
|
|
22
|
+
execSync("git rev-parse --is-inside-work-tree", {
|
|
23
|
+
cwd: dirPath,
|
|
24
|
+
encoding: "utf-8",
|
|
25
|
+
timeout: 3000,
|
|
26
|
+
stdio: "pipe",
|
|
27
|
+
});
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/scanner/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CACrB,yCAAyC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EACnE,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAChF,CAAC,IAAI,EAAE,CAAC;QAET,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAEpD,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;SAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC;QACH,QAAQ,CAAC,qCAAqC,EAAE;YAC9C,GAAG,EAAE,OAAO;YACZ,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { DotmdConfig } from "../config/defaults.js";
|
|
3
|
+
import { StoreSnapshotResult } from "../storage/snapshots.js";
|
|
4
|
+
export interface ScanResult {
|
|
5
|
+
path: string;
|
|
6
|
+
result: StoreSnapshotResult;
|
|
7
|
+
}
|
|
8
|
+
export declare function discoverFiles(config: DotmdConfig): string[];
|
|
9
|
+
export declare function scanFiles(db: Database.Database, config: DotmdConfig): ScanResult[];
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|