mcpocket 0.4.0 → 0.4.1
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 +412 -358
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/cleanup.d.ts +34 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +338 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/cleanup.test.d.ts +8 -0
- package/dist/commands/cleanup.test.d.ts.map +1 -0
- package/dist/commands/cleanup.test.js +170 -0
- package/dist/commands/cleanup.test.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,7 @@ const init_js_1 = require("./commands/init.js");
|
|
|
6
6
|
const push_js_1 = require("./commands/push.js");
|
|
7
7
|
const pull_js_1 = require("./commands/pull.js");
|
|
8
8
|
const dedupe_js_1 = require("./commands/dedupe.js");
|
|
9
|
+
const cleanup_js_1 = require("./commands/cleanup.js");
|
|
9
10
|
const status_js_1 = require("./commands/status.js");
|
|
10
11
|
const set_js_1 = require("./commands/set.js");
|
|
11
12
|
const providers_js_1 = require("./clients/providers.js");
|
|
@@ -47,6 +48,13 @@ program
|
|
|
47
48
|
.alias('dedupe')
|
|
48
49
|
.description('Clean stale synced files from your pocket and local folders')
|
|
49
50
|
.action(() => (0, dedupe_js_1.dedupeCommand)().catch(die));
|
|
51
|
+
program
|
|
52
|
+
.command('cleanup')
|
|
53
|
+
.description('Remove unwanted files from your pocket (interactive or pattern-based)')
|
|
54
|
+
.option('-l, --local', 'Operate on local pocket only — no pull/push; uses patterns from mcpocket.json')
|
|
55
|
+
.option('--dry-run', 'Preview which files would be deleted without making any changes')
|
|
56
|
+
.option('-y, --yes', 'Skip the confirmation prompt and delete immediately')
|
|
57
|
+
.action((options) => (0, cleanup_js_1.cleanupCommand)(options).catch(die));
|
|
50
58
|
program
|
|
51
59
|
.command('set <pocketUrl>')
|
|
52
60
|
.description('Point mcpocket at a different pocket (gist URL, gist ID, repo URL, or owner/repo)')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface CleanupOptions {
|
|
2
|
+
local?: boolean;
|
|
3
|
+
dryRun?: boolean;
|
|
4
|
+
yes?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function cleanupCommand(options?: CleanupOptions): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Return all files inside the pocket staging directory as forward-slash
|
|
9
|
+
* relative paths, excluding the `.git` directory.
|
|
10
|
+
*/
|
|
11
|
+
export declare function listPocketFiles(repoDir: string): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Determine which files from `allFiles` should be kept after applying
|
|
14
|
+
* include (whitelist) and exclude (blacklist) glob patterns.
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* 1. If `include` patterns are provided, only files matching at least one
|
|
18
|
+
* include pattern are candidates.
|
|
19
|
+
* 2. If `exclude` patterns are provided, any remaining candidate that also
|
|
20
|
+
* matches an exclude pattern is removed.
|
|
21
|
+
* 3. When both sets are provided the effective set is (include ∩ ¬exclude).
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeFilesToKeep(allFiles: string[], include?: string[], exclude?: string[]): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Match a forward-slash relative file path against a simple glob pattern.
|
|
26
|
+
*
|
|
27
|
+
* Supported syntax:
|
|
28
|
+
* `*` — any sequence of characters within a single path segment
|
|
29
|
+
* `**` — any sequence of characters across path segments
|
|
30
|
+
* `dir/` — matches all files inside `dir/` (shorthand for `dir/**`)
|
|
31
|
+
* Literal characters otherwise.
|
|
32
|
+
*/
|
|
33
|
+
export declare function matchesGlob(filePath: string, pattern: string): boolean;
|
|
34
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAqMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAOzD;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,MAAM,EAAE,CAYV;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAuBtE"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.cleanupCommand = cleanupCommand;
|
|
37
|
+
exports.listPocketFiles = listPocketFiles;
|
|
38
|
+
exports.computeFilesToKeep = computeFilesToKeep;
|
|
39
|
+
exports.matchesGlob = matchesGlob;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const config_js_1 = require("../config.js");
|
|
43
|
+
const github_js_1 = require("../storage/github.js");
|
|
44
|
+
const gist_js_1 = require("../storage/gist.js");
|
|
45
|
+
const prompt_js_1 = require("../utils/prompt.js");
|
|
46
|
+
const sparkle_js_1 = require("../utils/sparkle.js");
|
|
47
|
+
async function cleanupCommand(options = {}) {
|
|
48
|
+
const config = (0, config_js_1.readConfig)();
|
|
49
|
+
const repoDir = (0, config_js_1.getLocalRepoDir)();
|
|
50
|
+
(0, sparkle_js_1.section)('Cleanup');
|
|
51
|
+
if (options.local) {
|
|
52
|
+
await localCleanup(config, repoDir, options);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await remoteCleanup(config, repoDir, options);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ── Remote cleanup ────────────────────────────────────────────────────────────
|
|
59
|
+
async function remoteCleanup(config, repoDir, options) {
|
|
60
|
+
// 1. Pull pocket from remote
|
|
61
|
+
(0, sparkle_js_1.sparkle)('Pulling pocket from remote…');
|
|
62
|
+
await pullPocketToLocal(config, repoDir);
|
|
63
|
+
// 2. List pocket files
|
|
64
|
+
const pocketFiles = listPocketFiles(repoDir);
|
|
65
|
+
if (pocketFiles.length === 0) {
|
|
66
|
+
(0, sparkle_js_1.sparkle)('No pocket files found. Nothing to clean up.');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// 3. Interactive selection — choose which files to KEEP
|
|
70
|
+
const toKeep = await (0, prompt_js_1.askMultiSelect)('Which pocket files would you like to keep?', pocketFiles.map((f) => ({ label: f, value: f })));
|
|
71
|
+
const toDelete = pocketFiles.filter((f) => !toKeep.includes(f));
|
|
72
|
+
if (toDelete.length === 0) {
|
|
73
|
+
(0, sparkle_js_1.sparkle)('Nothing to delete — all files kept!');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// 4. Preview
|
|
77
|
+
printFilesToDelete(toDelete);
|
|
78
|
+
// 5. Confirm
|
|
79
|
+
if (!options.yes && !options.dryRun) {
|
|
80
|
+
const answer = await (0, prompt_js_1.ask)(`\n ${sparkle_js_1.c.yellow('⚠')} Delete ${toDelete.length} file(s) from pocket? ${sparkle_js_1.c.dim('(y/N)')} `);
|
|
81
|
+
if (!isYes(answer)) {
|
|
82
|
+
(0, sparkle_js_1.sparkle)('Cleanup cancelled.');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (options.dryRun) {
|
|
87
|
+
(0, sparkle_js_1.heads_up)(`[dry-run] Would delete ${toDelete.length} file(s) from pocket.`);
|
|
88
|
+
(0, sparkle_js_1.heads_up)('[dry-run] No files were changed and nothing was pushed.');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// 6. Delete
|
|
92
|
+
const deleted = deleteFiles(repoDir, toDelete);
|
|
93
|
+
removeEmptyDirs(repoDir);
|
|
94
|
+
// 7. Push updated pocket back to remote
|
|
95
|
+
(0, sparkle_js_1.sparkle)('Pushing updated pocket to remote…');
|
|
96
|
+
await pushPocketToRemote(config, repoDir);
|
|
97
|
+
// 8. Summary
|
|
98
|
+
(0, sparkle_js_1.celebrate)('Pocket cleaned up!');
|
|
99
|
+
(0, sparkle_js_1.section)('Summary');
|
|
100
|
+
(0, sparkle_js_1.stat)('Files kept', toKeep.length);
|
|
101
|
+
(0, sparkle_js_1.stat)('Files deleted', deleted);
|
|
102
|
+
console.log('');
|
|
103
|
+
}
|
|
104
|
+
// ── Local cleanup ─────────────────────────────────────────────────────────────
|
|
105
|
+
async function localCleanup(config, repoDir, options) {
|
|
106
|
+
const pocketFiles = listPocketFiles(repoDir);
|
|
107
|
+
if (pocketFiles.length === 0) {
|
|
108
|
+
(0, sparkle_js_1.sparkle)('No local pocket files found. Nothing to clean up.');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const hasInclude = config.cleanupInclude && config.cleanupInclude.length > 0;
|
|
112
|
+
const hasExclude = config.cleanupExclude && config.cleanupExclude.length > 0;
|
|
113
|
+
const hasPatterns = hasInclude || hasExclude;
|
|
114
|
+
let toDelete;
|
|
115
|
+
if (hasPatterns) {
|
|
116
|
+
// Pattern-based filtering (whitelist / blacklist from mcpocket.json)
|
|
117
|
+
(0, sparkle_js_1.section)('Pattern-based filtering');
|
|
118
|
+
if (hasInclude) {
|
|
119
|
+
(0, sparkle_js_1.sparkle)(`Include patterns: ${config.cleanupInclude.join(', ')}`);
|
|
120
|
+
}
|
|
121
|
+
if (hasExclude) {
|
|
122
|
+
(0, sparkle_js_1.sparkle)(`Exclude patterns: ${config.cleanupExclude.join(', ')}`);
|
|
123
|
+
}
|
|
124
|
+
const toKeep = computeFilesToKeep(pocketFiles, config.cleanupInclude, config.cleanupExclude);
|
|
125
|
+
toDelete = pocketFiles.filter((f) => !toKeep.includes(f));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// No patterns configured — fall back to interactive selection
|
|
129
|
+
const toKeep = await (0, prompt_js_1.askMultiSelect)('Which local pocket files would you like to keep?', pocketFiles.map((f) => ({ label: f, value: f })));
|
|
130
|
+
toDelete = pocketFiles.filter((f) => !toKeep.includes(f));
|
|
131
|
+
}
|
|
132
|
+
if (toDelete.length === 0) {
|
|
133
|
+
(0, sparkle_js_1.sparkle)('Nothing to delete — all files kept!');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Preview
|
|
137
|
+
printFilesToDelete(toDelete);
|
|
138
|
+
// Confirm
|
|
139
|
+
if (!options.yes && !options.dryRun) {
|
|
140
|
+
const answer = await (0, prompt_js_1.ask)(`\n ${sparkle_js_1.c.yellow('⚠')} Delete ${toDelete.length} local pocket file(s)? ${sparkle_js_1.c.dim('(y/N)')} `);
|
|
141
|
+
if (!isYes(answer)) {
|
|
142
|
+
(0, sparkle_js_1.sparkle)('Cleanup cancelled.');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (options.dryRun) {
|
|
147
|
+
(0, sparkle_js_1.heads_up)(`[dry-run] Would delete ${toDelete.length} local pocket file(s).`);
|
|
148
|
+
(0, sparkle_js_1.heads_up)('[dry-run] No files were changed.');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const deleted = deleteFiles(repoDir, toDelete);
|
|
152
|
+
removeEmptyDirs(repoDir);
|
|
153
|
+
(0, sparkle_js_1.celebrate)('Local pocket cleaned up!');
|
|
154
|
+
(0, sparkle_js_1.section)('Summary');
|
|
155
|
+
(0, sparkle_js_1.stat)('Files kept', pocketFiles.length - deleted);
|
|
156
|
+
(0, sparkle_js_1.stat)('Files deleted', deleted);
|
|
157
|
+
console.log('');
|
|
158
|
+
}
|
|
159
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
160
|
+
/** Pull the remote pocket into the local staging directory. */
|
|
161
|
+
async function pullPocketToLocal(config, repoDir) {
|
|
162
|
+
if (config.storageType === 'gist') {
|
|
163
|
+
try {
|
|
164
|
+
const { files: gistFiles, truncated } = await (0, gist_js_1.fetchGist)(config.githubToken, config.gistId);
|
|
165
|
+
fs.mkdirSync(repoDir, { recursive: true });
|
|
166
|
+
(0, gist_js_1.writeGistFilesToDir)(repoDir, gistFiles);
|
|
167
|
+
if (truncated) {
|
|
168
|
+
(0, sparkle_js_1.heads_up)('Your gist has more than 300 files — GitHub only returns the first 300 via its API.\n' +
|
|
169
|
+
' Some files may not be synced. Consider switching to repo storage.');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
(0, sparkle_js_1.oops)(err.message);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
(0, github_js_1.pullRepo)(repoDir, config.githubToken, config.repoCloneUrl);
|
|
180
|
+
(0, github_js_1.ensureGitConfig)(repoDir);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
(0, sparkle_js_1.oops)(err.message);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** Push the local staging directory back to the remote pocket. */
|
|
188
|
+
async function pushPocketToRemote(config, repoDir) {
|
|
189
|
+
if (config.storageType === 'gist') {
|
|
190
|
+
try {
|
|
191
|
+
const files = (0, gist_js_1.collectFilesFromDir)(repoDir);
|
|
192
|
+
await (0, gist_js_1.updateGist)(config.githubToken, config.gistId, files);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
(0, sparkle_js_1.oops)(`Gist push failed: ${err.message}`);
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
(0, github_js_1.ensureGitConfig)(repoDir);
|
|
201
|
+
try {
|
|
202
|
+
(0, github_js_1.commitAndPush)(repoDir, config.githubToken, config.repoCloneUrl, 'mcpocket: cleanup');
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
(0, sparkle_js_1.oops)(`Push failed: ${err.message}`);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Return all files inside the pocket staging directory as forward-slash
|
|
211
|
+
* relative paths, excluding the `.git` directory.
|
|
212
|
+
*/
|
|
213
|
+
function listPocketFiles(repoDir) {
|
|
214
|
+
if (!fs.existsSync(repoDir)) {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
const results = [];
|
|
218
|
+
collectFiles(repoDir, '', results);
|
|
219
|
+
return results.sort();
|
|
220
|
+
}
|
|
221
|
+
function collectFiles(dir, prefix, results) {
|
|
222
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
223
|
+
if (entry.name === '.git')
|
|
224
|
+
continue;
|
|
225
|
+
const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
226
|
+
const fullPath = path.join(dir, entry.name);
|
|
227
|
+
if (entry.isDirectory()) {
|
|
228
|
+
collectFiles(fullPath, relPath, results);
|
|
229
|
+
}
|
|
230
|
+
else if (entry.isFile()) {
|
|
231
|
+
results.push(relPath);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Determine which files from `allFiles` should be kept after applying
|
|
237
|
+
* include (whitelist) and exclude (blacklist) glob patterns.
|
|
238
|
+
*
|
|
239
|
+
* Rules:
|
|
240
|
+
* 1. If `include` patterns are provided, only files matching at least one
|
|
241
|
+
* include pattern are candidates.
|
|
242
|
+
* 2. If `exclude` patterns are provided, any remaining candidate that also
|
|
243
|
+
* matches an exclude pattern is removed.
|
|
244
|
+
* 3. When both sets are provided the effective set is (include ∩ ¬exclude).
|
|
245
|
+
*/
|
|
246
|
+
function computeFilesToKeep(allFiles, include, exclude) {
|
|
247
|
+
let result = allFiles;
|
|
248
|
+
if (include && include.length > 0) {
|
|
249
|
+
result = result.filter((f) => include.some((p) => matchesGlob(f, p)));
|
|
250
|
+
}
|
|
251
|
+
if (exclude && exclude.length > 0) {
|
|
252
|
+
result = result.filter((f) => !exclude.some((p) => matchesGlob(f, p)));
|
|
253
|
+
}
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Match a forward-slash relative file path against a simple glob pattern.
|
|
258
|
+
*
|
|
259
|
+
* Supported syntax:
|
|
260
|
+
* `*` — any sequence of characters within a single path segment
|
|
261
|
+
* `**` — any sequence of characters across path segments
|
|
262
|
+
* `dir/` — matches all files inside `dir/` (shorthand for `dir/**`)
|
|
263
|
+
* Literal characters otherwise.
|
|
264
|
+
*/
|
|
265
|
+
function matchesGlob(filePath, pattern) {
|
|
266
|
+
const normalizedFile = filePath.replace(/\\/g, '/');
|
|
267
|
+
let normalizedPattern = pattern.replace(/\\/g, '/');
|
|
268
|
+
// A trailing '/' means "any file inside this directory"
|
|
269
|
+
if (normalizedPattern.endsWith('/')) {
|
|
270
|
+
normalizedPattern += '**';
|
|
271
|
+
}
|
|
272
|
+
// A pattern with no '/' and no '**' is matched against the basename as well
|
|
273
|
+
const isBasenamePattern = !normalizedPattern.includes('/') && !normalizedPattern.includes('**');
|
|
274
|
+
if (isBasenamePattern) {
|
|
275
|
+
// Try matching the full relative path AND just the basename
|
|
276
|
+
const basename = normalizedFile.split('/').pop() ?? normalizedFile;
|
|
277
|
+
return (globToRegex(normalizedPattern).test(normalizedFile) ||
|
|
278
|
+
globToRegex(normalizedPattern).test(basename));
|
|
279
|
+
}
|
|
280
|
+
return globToRegex(normalizedPattern).test(normalizedFile);
|
|
281
|
+
}
|
|
282
|
+
function globToRegex(pattern) {
|
|
283
|
+
const escaped = pattern
|
|
284
|
+
// Escape all regex special chars except * and ?
|
|
285
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
286
|
+
// Replace ** with a placeholder, then * with segment matcher
|
|
287
|
+
.replace(/\*\*/g, '\x00')
|
|
288
|
+
.replace(/\*/g, '[^/]*')
|
|
289
|
+
.replace(/\x00/g, '.*');
|
|
290
|
+
return new RegExp(`^${escaped}$`);
|
|
291
|
+
}
|
|
292
|
+
function deleteFiles(repoDir, relPaths) {
|
|
293
|
+
let deleted = 0;
|
|
294
|
+
for (const relPath of relPaths) {
|
|
295
|
+
const fullPath = path.resolve(path.join(repoDir, relPath));
|
|
296
|
+
// Safety: must stay within pocket root
|
|
297
|
+
if (!isWithinDir(repoDir, fullPath)) {
|
|
298
|
+
(0, sparkle_js_1.oops)(`Refusing to delete file outside pocket root: ${relPath}`);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (fs.existsSync(fullPath)) {
|
|
302
|
+
fs.rmSync(fullPath, { force: true });
|
|
303
|
+
deleted++;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return deleted;
|
|
307
|
+
}
|
|
308
|
+
function removeEmptyDirs(dir, isRoot = true) {
|
|
309
|
+
if (!fs.existsSync(dir))
|
|
310
|
+
return;
|
|
311
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
312
|
+
if (!entry.isDirectory())
|
|
313
|
+
continue;
|
|
314
|
+
if (entry.name === '.git')
|
|
315
|
+
continue;
|
|
316
|
+
const fullPath = path.join(dir, entry.name);
|
|
317
|
+
removeEmptyDirs(fullPath, false);
|
|
318
|
+
if (!isRoot && fs.existsSync(fullPath) && fs.readdirSync(fullPath).length === 0) {
|
|
319
|
+
fs.rmdirSync(fullPath);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function isWithinDir(dir, filePath) {
|
|
324
|
+
const resolvedDir = path.resolve(dir);
|
|
325
|
+
const resolvedFile = path.resolve(filePath);
|
|
326
|
+
return (resolvedFile === resolvedDir ||
|
|
327
|
+
resolvedFile.startsWith(resolvedDir + path.sep));
|
|
328
|
+
}
|
|
329
|
+
function printFilesToDelete(files) {
|
|
330
|
+
(0, sparkle_js_1.section)('Files to be removed');
|
|
331
|
+
for (const f of files) {
|
|
332
|
+
console.log(` ${sparkle_js_1.c.red('✗')} ${f}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function isYes(answer) {
|
|
336
|
+
return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.test.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unit tests for cleanup command core logic.
|
|
4
|
+
* Run with: npm test
|
|
5
|
+
*
|
|
6
|
+
* Uses Node.js built-in test runner (requires Node >= 18).
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
const node_test_1 = require("node:test");
|
|
46
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
47
|
+
const cleanup_js_1 = require("./cleanup.js");
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const os = __importStar(require("node:os"));
|
|
50
|
+
const path = __importStar(require("node:path"));
|
|
51
|
+
// ── matchesGlob ───────────────────────────────────────────────────────────────
|
|
52
|
+
(0, node_test_1.describe)('matchesGlob', () => {
|
|
53
|
+
(0, node_test_1.it)('matches exact relative path', () => {
|
|
54
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/my-agent.md', 'agents/my-agent.md'));
|
|
55
|
+
});
|
|
56
|
+
(0, node_test_1.it)('does not match a different file in same directory', () => {
|
|
57
|
+
strict_1.default.ok(!(0, cleanup_js_1.matchesGlob)('agents/other.md', 'agents/my-agent.md'));
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)('matches wildcard * within a segment', () => {
|
|
60
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/my-agent.md', 'agents/*.md'));
|
|
61
|
+
strict_1.default.ok(!(0, cleanup_js_1.matchesGlob)('skills/my-skill.md', 'agents/*.md'));
|
|
62
|
+
});
|
|
63
|
+
(0, node_test_1.it)('matches ** across segments', () => {
|
|
64
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/sub/deep.md', 'agents/**'));
|
|
65
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('skills/nested/file.js', '**/*.js'));
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)('matches trailing slash as directory prefix', () => {
|
|
68
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/foo.md', 'agents/'));
|
|
69
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/sub/bar.md', 'agents/'));
|
|
70
|
+
strict_1.default.ok(!(0, cleanup_js_1.matchesGlob)('skills/foo.md', 'agents/'));
|
|
71
|
+
});
|
|
72
|
+
(0, node_test_1.it)('matches basename-only pattern against basename and full path', () => {
|
|
73
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('agents/foo.md', '*.md'));
|
|
74
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('foo.md', '*.md'));
|
|
75
|
+
strict_1.default.ok(!(0, cleanup_js_1.matchesGlob)('agents/foo.ts', '*.md'));
|
|
76
|
+
});
|
|
77
|
+
(0, node_test_1.it)('matches exact top-level file', () => {
|
|
78
|
+
strict_1.default.ok((0, cleanup_js_1.matchesGlob)('mcp-config.json', 'mcp-config.json'));
|
|
79
|
+
strict_1.default.ok(!(0, cleanup_js_1.matchesGlob)('other.json', 'mcp-config.json'));
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
// ── computeFilesToKeep ────────────────────────────────────────────────────────
|
|
83
|
+
const SAMPLE_FILES = [
|
|
84
|
+
'mcp-config.json',
|
|
85
|
+
'agents/agent1.md',
|
|
86
|
+
'agents/agent2.md',
|
|
87
|
+
'skills/skill1.js',
|
|
88
|
+
'skills/nested/util.js',
|
|
89
|
+
'plugins/installed_plugins.json',
|
|
90
|
+
];
|
|
91
|
+
(0, node_test_1.describe)('computeFilesToKeep', () => {
|
|
92
|
+
(0, node_test_1.it)('returns all files when no patterns are given', () => {
|
|
93
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES);
|
|
94
|
+
strict_1.default.deepEqual(kept, SAMPLE_FILES);
|
|
95
|
+
});
|
|
96
|
+
(0, node_test_1.it)('applies include whitelist — only matching files are kept', () => {
|
|
97
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, ['agents/']);
|
|
98
|
+
strict_1.default.deepEqual(kept, ['agents/agent1.md', 'agents/agent2.md']);
|
|
99
|
+
});
|
|
100
|
+
(0, node_test_1.it)('applies exclude blacklist — matching files are removed', () => {
|
|
101
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, undefined, ['agents/']);
|
|
102
|
+
strict_1.default.ok(!kept.includes('agents/agent1.md'));
|
|
103
|
+
strict_1.default.ok(!kept.includes('agents/agent2.md'));
|
|
104
|
+
strict_1.default.ok(kept.includes('mcp-config.json'));
|
|
105
|
+
});
|
|
106
|
+
(0, node_test_1.it)('combines include and exclude: include narrows, exclude removes from result', () => {
|
|
107
|
+
// Include skills/, then exclude the nested sub-directory
|
|
108
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, ['skills/'], ['skills/nested/**']);
|
|
109
|
+
strict_1.default.deepEqual(kept, ['skills/skill1.js']);
|
|
110
|
+
});
|
|
111
|
+
(0, node_test_1.it)('exclude is applied after include — file matching both is removed', () => {
|
|
112
|
+
// Include agents/*.md, exclude a specific agent
|
|
113
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, ['agents/'], ['agents/agent2.md']);
|
|
114
|
+
strict_1.default.deepEqual(kept, ['agents/agent1.md']);
|
|
115
|
+
});
|
|
116
|
+
(0, node_test_1.it)('handles empty include array as "no filter"', () => {
|
|
117
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, []);
|
|
118
|
+
strict_1.default.deepEqual(kept, SAMPLE_FILES);
|
|
119
|
+
});
|
|
120
|
+
(0, node_test_1.it)('handles empty exclude array as "remove nothing"', () => {
|
|
121
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, undefined, []);
|
|
122
|
+
strict_1.default.deepEqual(kept, SAMPLE_FILES);
|
|
123
|
+
});
|
|
124
|
+
(0, node_test_1.it)('include with no matches keeps nothing', () => {
|
|
125
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, ['nonexistent/']);
|
|
126
|
+
strict_1.default.deepEqual(kept, []);
|
|
127
|
+
});
|
|
128
|
+
(0, node_test_1.it)('exclude matching all files keeps nothing', () => {
|
|
129
|
+
const kept = (0, cleanup_js_1.computeFilesToKeep)(SAMPLE_FILES, undefined, ['**']);
|
|
130
|
+
strict_1.default.deepEqual(kept, []);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
// ── listPocketFiles ───────────────────────────────────────────────────────────
|
|
134
|
+
(0, node_test_1.describe)('listPocketFiles', () => {
|
|
135
|
+
(0, node_test_1.it)('returns empty array for a non-existent directory', () => {
|
|
136
|
+
const nonExistent = path.join(os.tmpdir(), '__nonexistent_mcpocket_test__');
|
|
137
|
+
const result = (0, cleanup_js_1.listPocketFiles)(nonExistent);
|
|
138
|
+
strict_1.default.deepEqual(result, []);
|
|
139
|
+
});
|
|
140
|
+
(0, node_test_1.it)('lists files recursively, excluding .git', () => {
|
|
141
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mcpocket-cleanup-test-'));
|
|
142
|
+
try {
|
|
143
|
+
fs.mkdirSync(path.join(tmpDir, '.git'));
|
|
144
|
+
fs.writeFileSync(path.join(tmpDir, '.git', 'config'), '');
|
|
145
|
+
fs.mkdirSync(path.join(tmpDir, 'agents'));
|
|
146
|
+
fs.writeFileSync(path.join(tmpDir, 'agents', 'foo.md'), '');
|
|
147
|
+
fs.writeFileSync(path.join(tmpDir, 'mcp-config.json'), '{}');
|
|
148
|
+
const files = (0, cleanup_js_1.listPocketFiles)(tmpDir);
|
|
149
|
+
strict_1.default.ok(files.includes('agents/foo.md'), 'should include agents/foo.md');
|
|
150
|
+
strict_1.default.ok(files.includes('mcp-config.json'), 'should include mcp-config.json');
|
|
151
|
+
strict_1.default.ok(!files.some((f) => f.startsWith('.git')), 'should exclude .git');
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
(0, node_test_1.it)('returns sorted results', () => {
|
|
158
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mcpocket-cleanup-test-'));
|
|
159
|
+
try {
|
|
160
|
+
fs.writeFileSync(path.join(tmpDir, 'b.md'), '');
|
|
161
|
+
fs.writeFileSync(path.join(tmpDir, 'a.md'), '');
|
|
162
|
+
const files = (0, cleanup_js_1.listPocketFiles)(tmpDir);
|
|
163
|
+
strict_1.default.deepEqual(files, ['a.md', 'b.md']);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=cleanup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.test.js","sourceRoot":"","sources":["../../src/commands/cleanup.test.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAyC;AACzC,gEAAwC;AACxC,6CAAgF;AAChF,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAElC,iFAAiF;AAEjF,IAAA,oBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAA,cAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,wBAAW,EAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAAC;QAC5D,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,wBAAW,EAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1D,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACnD,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;QACvD,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,wBAAW,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QAChD,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACzC,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,wBAAW,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,gBAAM,CAAC,EAAE,CAAC,IAAA,wBAAW,EAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC7D,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,wBAAW,EAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,MAAM,YAAY,GAAG;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,uBAAuB;IACvB,gCAAgC;CACjC,CAAC;AAEF,IAAA,oBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,cAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,CAAC,CAAC;QAC9C,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3D,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACtE,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC9C,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC9C,gBAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,yDAAyD;QACzD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACjF,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,gDAAgD;QAChD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACjF,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAClD,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC7D,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;QAChE,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,IAAA,+BAAkB,EAAC,YAAY,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,gBAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAA,cAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAA,4BAAe,EAAC,WAAW,CAAC,CAAC;QAC5C,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACxC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC1C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,CAAC;YAE7D,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,MAAM,CAAC,CAAC;YACtC,gBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAC3E,gBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gCAAgC,CAAC,CAAC;YAC/E,gBAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC7E,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,IAAA,4BAAe,EAAC,MAAM,CAAC,CAAC;YACtC,gBAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface McpocketConfig {
|
|
|
11
11
|
gistUrl?: string;
|
|
12
12
|
syncCategories?: SyncCategory[];
|
|
13
13
|
syncProviders?: string[];
|
|
14
|
+
cleanupInclude?: string[];
|
|
15
|
+
cleanupExclude?: string[];
|
|
14
16
|
}
|
|
15
17
|
export declare function configExists(): boolean;
|
|
16
18
|
export declare function readConfig(): McpocketConfig;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpE,eAAO,MAAM,mBAAmB,EAAE,YAAY,EAA4C,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IAEzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpE,eAAO,MAAM,mBAAmB,EAAE,YAAY,EAA4C,CAAC;AAE3F,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IAEzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,UAAU,IAAI,cAAc,CAa3C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAQxD;AAED,yDAAyD;AACzD,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|