mcpocket 0.4.0 → 0.4.2

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/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":";;;AACA,yCAAoC;AACpC,gDAAiD;AACjD,gDAAiD;AACjD,gDAAiD;AACjD,oDAAqD;AACrD,sDAAuD;AACvD,oDAAqD;AACrD,8CAA+C;AAC/C,yDAA+D;AAC/D,mDAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,IAAA,wBAAW,GAAE,CAAC;AAEd,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,4GAA4G,CAAC;KACzH,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,qBAAW,GAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1C,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAA;AAE7D,KAAK,MAAM,QAAQ,IAAI,oCAAqB,EAAE,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7G,CAAC;AAED,OAAO;KACJ,QAAQ;KACR,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAC7C,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC,CAAA;AAE7D,KAAK,MAAM,QAAQ,IAAI,oCAAqB,EAAE,CAAC;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7G,CAAC;AAED,OAAO;KACJ,QAAQ;KACR,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAC7C,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEzD,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,KAAK,CAAC,QAAQ,CAAC;KACf,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yBAAa,GAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5C,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,aAAa,EAAE,+EAA+E,CAAC;KACtG,MAAM,CAAC,WAAW,EAAE,iEAAiE,CAAC;KACtF,MAAM,CAAC,WAAW,EAAE,qDAAqD,CAAC;KAC1E,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,2BAAc,EAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3D,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,mFAAmF,CAAC;KAChG,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAEvD,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yBAAa,GAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5C,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,SAAS,GAAG,CAAC,GAAU;IACrB,IAAA,iBAAI,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,56 @@
1
+ export interface CleanupOptions {
2
+ local?: boolean;
3
+ dryRun?: boolean;
4
+ yes?: boolean;
5
+ }
6
+ type PocketItemKind = 'agent' | 'skill' | 'mcp' | 'other';
7
+ interface PocketItem {
8
+ kind: PocketItemKind;
9
+ name: string;
10
+ /** Raw pocket-relative file paths covered by this item. Empty for 'mcp' (handled separately). */
11
+ files: string[];
12
+ }
13
+ export declare function cleanupCommand(options?: CleanupOptions): Promise<void>;
14
+ /**
15
+ * Build a list of logical pocket items from raw file paths.
16
+ *
17
+ * - agents/foo.md → { kind: 'agent', name: 'foo' }
18
+ * - skills/my-skill/... → { kind: 'skill', name: 'my-skill' } (all files grouped)
19
+ * - mcp-config.json → one { kind: 'mcp' } item per server key (read without decrypting)
20
+ * - everything else → { kind: 'other', name: <rel-path> }
21
+ */
22
+ export declare function buildPocketItems(repoDir: string, allFiles: string[]): PocketItem[];
23
+ /**
24
+ * Read MCP server names from mcp-config.json without decrypting.
25
+ * Server names (keys) are stored in plaintext; only their env/headers values are encrypted.
26
+ */
27
+ export declare function listPocketMcpServerNames(repoDir: string): string[];
28
+ /**
29
+ * Return all files inside the pocket staging directory as forward-slash
30
+ * relative paths, excluding the `.git` directory.
31
+ */
32
+ export declare function listPocketFiles(repoDir: string): string[];
33
+ /**
34
+ * Determine which files from `allFiles` should be kept after applying
35
+ * include (whitelist) and exclude (blacklist) glob patterns.
36
+ *
37
+ * Rules:
38
+ * 1. If `include` patterns are provided, only files matching at least one
39
+ * include pattern are candidates.
40
+ * 2. If `exclude` patterns are provided, any remaining candidate that also
41
+ * matches an exclude pattern is removed.
42
+ * 3. When both sets are provided the effective set is (include ∩ ¬exclude).
43
+ */
44
+ export declare function computeFilesToKeep(allFiles: string[], include?: string[], exclude?: string[]): string[];
45
+ /**
46
+ * Match a forward-slash relative file path against a simple glob pattern.
47
+ *
48
+ * Supported syntax:
49
+ * `*` — any sequence of characters within a single path segment
50
+ * `**` — any sequence of characters across path segments
51
+ * `dir/` — matches all files inside `dir/` (shorthand for `dir/**`)
52
+ * Literal characters otherwise.
53
+ */
54
+ export declare function matchesGlob(filePath: string, pattern: string): boolean;
55
+ export {};
56
+ //# 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;AAID,KAAK,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;AAE1D,UAAU,UAAU;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AASD,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhF;AAyJD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAqDlF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAUlE;AAgID;;;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,484 @@
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.buildPocketItems = buildPocketItems;
38
+ exports.listPocketMcpServerNames = listPocketMcpServerNames;
39
+ exports.listPocketFiles = listPocketFiles;
40
+ exports.computeFilesToKeep = computeFilesToKeep;
41
+ exports.matchesGlob = matchesGlob;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const config_js_1 = require("../config.js");
45
+ const github_js_1 = require("../storage/github.js");
46
+ const gist_js_1 = require("../storage/gist.js");
47
+ const prompt_js_1 = require("../utils/prompt.js");
48
+ const sparkle_js_1 = require("../utils/sparkle.js");
49
+ // ── Entry point ───────────────────────────────────────────────────────────────
50
+ async function cleanupCommand(options = {}) {
51
+ const config = (0, config_js_1.readConfig)();
52
+ const repoDir = (0, config_js_1.getLocalRepoDir)();
53
+ (0, sparkle_js_1.section)('Cleanup');
54
+ if (options.local) {
55
+ await localCleanup(config, repoDir, options);
56
+ }
57
+ else {
58
+ await remoteCleanup(config, repoDir, options);
59
+ }
60
+ }
61
+ // ── Remote cleanup ────────────────────────────────────────────────────────────
62
+ async function remoteCleanup(config, repoDir, options) {
63
+ // 1. Pull pocket from remote
64
+ (0, sparkle_js_1.sparkle)('Pulling pocket from remote…');
65
+ await pullPocketToLocal(config, repoDir);
66
+ // 2. Build logical item list
67
+ const pocketFiles = listPocketFiles(repoDir);
68
+ if (pocketFiles.length === 0) {
69
+ (0, sparkle_js_1.sparkle)('No pocket files found. Nothing to clean up.');
70
+ return;
71
+ }
72
+ const items = buildPocketItems(repoDir, pocketFiles);
73
+ // 3. Interactive selection — choose which items to KEEP
74
+ const toKeep = await (0, prompt_js_1.askMultiSelect)('Which pocket items would you like to keep?', items.map((item) => ({ label: formatItemLabel(item), value: item })));
75
+ const toDelete = items.filter((item) => !toKeep.includes(item));
76
+ if (toDelete.length === 0) {
77
+ (0, sparkle_js_1.sparkle)('Nothing to delete — all items kept!');
78
+ return;
79
+ }
80
+ // 4. Preview
81
+ printItemsToDelete(toDelete);
82
+ // 5. Confirm
83
+ if (!options.yes && !options.dryRun) {
84
+ const answer = await (0, prompt_js_1.ask)(`\n ${sparkle_js_1.c.yellow('⚠')} Delete ${toDelete.length} item(s) from pocket? ${sparkle_js_1.c.dim('(y/N)')} `);
85
+ if (!isYes(answer)) {
86
+ (0, sparkle_js_1.sparkle)('Cleanup cancelled.');
87
+ return;
88
+ }
89
+ }
90
+ if (options.dryRun) {
91
+ (0, sparkle_js_1.heads_up)(`[dry-run] Would delete ${toDelete.length} item(s) from pocket.`);
92
+ (0, sparkle_js_1.heads_up)('[dry-run] No files were changed and nothing was pushed.');
93
+ return;
94
+ }
95
+ // 6. Delete
96
+ deletePocketItemFiles(repoDir, toDelete);
97
+ removeEmptyDirs(repoDir);
98
+ // 7. Push updated pocket back to remote
99
+ (0, sparkle_js_1.sparkle)('Pushing updated pocket to remote…');
100
+ await pushPocketToRemote(config, repoDir);
101
+ // 8. Summary
102
+ (0, sparkle_js_1.celebrate)('Pocket cleaned up!');
103
+ (0, sparkle_js_1.section)('Summary');
104
+ (0, sparkle_js_1.stat)('Items kept', toKeep.length);
105
+ (0, sparkle_js_1.stat)('Items deleted', toDelete.length);
106
+ console.log('');
107
+ }
108
+ // ── Local cleanup ─────────────────────────────────────────────────────────────
109
+ async function localCleanup(config, repoDir, options) {
110
+ const pocketFiles = listPocketFiles(repoDir);
111
+ if (pocketFiles.length === 0) {
112
+ (0, sparkle_js_1.sparkle)('No local pocket files found. Nothing to clean up.');
113
+ return;
114
+ }
115
+ const hasInclude = config.cleanupInclude && config.cleanupInclude.length > 0;
116
+ const hasExclude = config.cleanupExclude && config.cleanupExclude.length > 0;
117
+ const hasPatterns = hasInclude || hasExclude;
118
+ let toDeleteItems;
119
+ if (hasPatterns) {
120
+ // Pattern-based filtering (whitelist / blacklist from mcpocket.json) — file level
121
+ (0, sparkle_js_1.section)('Pattern-based filtering');
122
+ if (hasInclude) {
123
+ (0, sparkle_js_1.sparkle)(`Include patterns: ${config.cleanupInclude.join(', ')}`);
124
+ }
125
+ if (hasExclude) {
126
+ (0, sparkle_js_1.sparkle)(`Exclude patterns: ${config.cleanupExclude.join(', ')}`);
127
+ }
128
+ const toKeepFiles = computeFilesToKeep(pocketFiles, config.cleanupInclude, config.cleanupExclude);
129
+ const toDeleteFiles = pocketFiles.filter((f) => !toKeepFiles.includes(f));
130
+ // Represent pattern-matched files as 'other' items for consistent deletion
131
+ toDeleteItems = toDeleteFiles.map((f) => ({ kind: 'other', name: f, files: [f] }));
132
+ }
133
+ else {
134
+ // No patterns configured — interactive item-based selection
135
+ const items = buildPocketItems(repoDir, pocketFiles);
136
+ const toKeepItems = await (0, prompt_js_1.askMultiSelect)('Which local pocket items would you like to keep?', items.map((item) => ({ label: formatItemLabel(item), value: item })));
137
+ toDeleteItems = items.filter((item) => !toKeepItems.includes(item));
138
+ }
139
+ if (toDeleteItems.length === 0) {
140
+ (0, sparkle_js_1.sparkle)('Nothing to delete — all items kept!');
141
+ return;
142
+ }
143
+ // Preview
144
+ printItemsToDelete(toDeleteItems);
145
+ // Confirm
146
+ if (!options.yes && !options.dryRun) {
147
+ const answer = await (0, prompt_js_1.ask)(`\n ${sparkle_js_1.c.yellow('⚠')} Delete ${toDeleteItems.length} local pocket item(s)? ${sparkle_js_1.c.dim('(y/N)')} `);
148
+ if (!isYes(answer)) {
149
+ (0, sparkle_js_1.sparkle)('Cleanup cancelled.');
150
+ return;
151
+ }
152
+ }
153
+ if (options.dryRun) {
154
+ (0, sparkle_js_1.heads_up)(`[dry-run] Would delete ${toDeleteItems.length} local pocket item(s).`);
155
+ (0, sparkle_js_1.heads_up)('[dry-run] No files were changed.');
156
+ return;
157
+ }
158
+ const { filesDeleted, mcpServersRemoved } = deletePocketItemFiles(repoDir, toDeleteItems);
159
+ removeEmptyDirs(repoDir);
160
+ (0, sparkle_js_1.celebrate)('Local pocket cleaned up!');
161
+ (0, sparkle_js_1.section)('Summary');
162
+ (0, sparkle_js_1.stat)('Files deleted', filesDeleted);
163
+ if (mcpServersRemoved > 0) {
164
+ (0, sparkle_js_1.stat)('MCP servers removed', mcpServersRemoved);
165
+ }
166
+ console.log('');
167
+ }
168
+ // ── Pocket item helpers ───────────────────────────────────────────────────────
169
+ /**
170
+ * Build a list of logical pocket items from raw file paths.
171
+ *
172
+ * - agents/foo.md → { kind: 'agent', name: 'foo' }
173
+ * - skills/my-skill/... → { kind: 'skill', name: 'my-skill' } (all files grouped)
174
+ * - mcp-config.json → one { kind: 'mcp' } item per server key (read without decrypting)
175
+ * - everything else → { kind: 'other', name: <rel-path> }
176
+ */
177
+ function buildPocketItems(repoDir, allFiles) {
178
+ const items = [];
179
+ // Expand mcp-config.json into individual MCP server items
180
+ let mcpHandled = false;
181
+ if (allFiles.includes('mcp-config.json')) {
182
+ const mcpNames = listPocketMcpServerNames(repoDir);
183
+ if (mcpNames.length > 0) {
184
+ mcpHandled = true;
185
+ for (const name of mcpNames) {
186
+ items.push({ kind: 'mcp', name, files: [] });
187
+ }
188
+ }
189
+ }
190
+ // Group agents and skills; pass everything else through as 'other'
191
+ const agentsByName = new Map();
192
+ const skillsByName = new Map();
193
+ for (const f of allFiles) {
194
+ if (f.startsWith('agents/')) {
195
+ const name = path.basename(f, '.md');
196
+ if (!agentsByName.has(name))
197
+ agentsByName.set(name, []);
198
+ agentsByName.get(name).push(f);
199
+ }
200
+ else if (f.startsWith('skills/')) {
201
+ const parts = f.split('/');
202
+ const topLevel = parts[1];
203
+ if (topLevel) {
204
+ if (!skillsByName.has(topLevel))
205
+ skillsByName.set(topLevel, []);
206
+ skillsByName.get(topLevel).push(f);
207
+ }
208
+ }
209
+ else if (f === 'mcp-config.json' && mcpHandled) {
210
+ // Already expanded above — skip raw file entry
211
+ }
212
+ else {
213
+ items.push({ kind: 'other', name: f, files: [f] });
214
+ }
215
+ }
216
+ for (const [name, files] of agentsByName) {
217
+ items.push({ kind: 'agent', name, files });
218
+ }
219
+ for (const [name, files] of skillsByName) {
220
+ items.push({ kind: 'skill', name, files });
221
+ }
222
+ // Sort: agents → skills → MCPs → other; alphabetical within each group
223
+ const kindOrder = { agent: 0, skill: 1, mcp: 2, other: 3 };
224
+ items.sort((a, b) => {
225
+ if (kindOrder[a.kind] !== kindOrder[b.kind])
226
+ return kindOrder[a.kind] - kindOrder[b.kind];
227
+ return a.name.localeCompare(b.name);
228
+ });
229
+ return items;
230
+ }
231
+ /**
232
+ * Read MCP server names from mcp-config.json without decrypting.
233
+ * Server names (keys) are stored in plaintext; only their env/headers values are encrypted.
234
+ */
235
+ function listPocketMcpServerNames(repoDir) {
236
+ const configPath = path.join(repoDir, 'mcp-config.json');
237
+ if (!fs.existsSync(configPath))
238
+ return [];
239
+ try {
240
+ const raw = fs.readFileSync(configPath, 'utf8');
241
+ const parsed = JSON.parse(raw);
242
+ return Object.keys(parsed.mcpServers ?? {});
243
+ }
244
+ catch {
245
+ return [];
246
+ }
247
+ }
248
+ /**
249
+ * Surgically remove specific MCP servers from mcp-config.json.
250
+ * Deletes the file entirely when all servers are removed.
251
+ * Returns the number of servers removed.
252
+ */
253
+ function removeMcpServersFromPocket(repoDir, serverNames) {
254
+ const configPath = path.join(repoDir, 'mcp-config.json');
255
+ if (!fs.existsSync(configPath) || serverNames.length === 0)
256
+ return 0;
257
+ let parsed;
258
+ try {
259
+ parsed = JSON.parse(fs.readFileSync(configPath, 'utf8'));
260
+ }
261
+ catch {
262
+ return 0;
263
+ }
264
+ const servers = parsed.mcpServers ?? {};
265
+ for (const name of serverNames) {
266
+ delete servers[name];
267
+ }
268
+ if (Object.keys(servers).length === 0) {
269
+ fs.rmSync(configPath);
270
+ }
271
+ else {
272
+ fs.writeFileSync(configPath, JSON.stringify(parsed, null, 2), 'utf8');
273
+ }
274
+ return serverNames.length;
275
+ }
276
+ /**
277
+ * Delete the files/servers represented by the given items.
278
+ * MCP items are handled by rewriting mcp-config.json rather than deleting it wholesale.
279
+ */
280
+ function deletePocketItemFiles(repoDir, items) {
281
+ const filesToDelete = [];
282
+ const mcpNamesToRemove = [];
283
+ for (const item of items) {
284
+ if (item.kind === 'mcp') {
285
+ mcpNamesToRemove.push(item.name);
286
+ }
287
+ else {
288
+ filesToDelete.push(...item.files);
289
+ }
290
+ }
291
+ const filesDeleted = deleteFiles(repoDir, filesToDelete);
292
+ const mcpServersRemoved = mcpNamesToRemove.length > 0 ? removeMcpServersFromPocket(repoDir, mcpNamesToRemove) : 0;
293
+ return { filesDeleted, mcpServersRemoved };
294
+ }
295
+ const KIND_LABEL = {
296
+ agent: '[agent]',
297
+ skill: '[skill]',
298
+ mcp: '[mcp] ',
299
+ other: '[other]',
300
+ };
301
+ function formatItemLabel(item) {
302
+ return `${KIND_LABEL[item.kind]} ${item.name}`;
303
+ }
304
+ function printItemsToDelete(items) {
305
+ (0, sparkle_js_1.section)('Items to be removed');
306
+ for (const item of items) {
307
+ console.log(` ${sparkle_js_1.c.red('✗')} ${formatItemLabel(item)}`);
308
+ }
309
+ }
310
+ // ── Storage helpers ───────────────────────────────────────────────────────────
311
+ /** Pull the remote pocket into the local staging directory. */
312
+ async function pullPocketToLocal(config, repoDir) {
313
+ if (config.storageType === 'gist') {
314
+ try {
315
+ const { files: gistFiles, truncated } = await (0, gist_js_1.fetchGist)(config.githubToken, config.gistId);
316
+ fs.mkdirSync(repoDir, { recursive: true });
317
+ (0, gist_js_1.writeGistFilesToDir)(repoDir, gistFiles);
318
+ if (truncated) {
319
+ (0, sparkle_js_1.heads_up)('Your gist has more than 300 files — GitHub only returns the first 300 via its API.\n' +
320
+ ' Some files may not be synced. Consider switching to repo storage.');
321
+ }
322
+ }
323
+ catch (err) {
324
+ (0, sparkle_js_1.oops)(err.message);
325
+ process.exit(1);
326
+ }
327
+ return;
328
+ }
329
+ try {
330
+ (0, github_js_1.pullRepo)(repoDir, config.githubToken, config.repoCloneUrl);
331
+ (0, github_js_1.ensureGitConfig)(repoDir);
332
+ }
333
+ catch (err) {
334
+ (0, sparkle_js_1.oops)(err.message);
335
+ process.exit(1);
336
+ }
337
+ }
338
+ /** Push the local staging directory back to the remote pocket. */
339
+ async function pushPocketToRemote(config, repoDir) {
340
+ if (config.storageType === 'gist') {
341
+ try {
342
+ const files = (0, gist_js_1.collectFilesFromDir)(repoDir);
343
+ await (0, gist_js_1.updateGist)(config.githubToken, config.gistId, files);
344
+ }
345
+ catch (err) {
346
+ (0, sparkle_js_1.oops)(`Gist push failed: ${err.message}`);
347
+ process.exit(1);
348
+ }
349
+ return;
350
+ }
351
+ (0, github_js_1.ensureGitConfig)(repoDir);
352
+ try {
353
+ (0, github_js_1.commitAndPush)(repoDir, config.githubToken, config.repoCloneUrl, 'mcpocket: cleanup');
354
+ }
355
+ catch (err) {
356
+ (0, sparkle_js_1.oops)(`Push failed: ${err.message}`);
357
+ process.exit(1);
358
+ }
359
+ }
360
+ // ── File utilities ────────────────────────────────────────────────────────────
361
+ /**
362
+ * Return all files inside the pocket staging directory as forward-slash
363
+ * relative paths, excluding the `.git` directory.
364
+ */
365
+ function listPocketFiles(repoDir) {
366
+ if (!fs.existsSync(repoDir)) {
367
+ return [];
368
+ }
369
+ const results = [];
370
+ collectFiles(repoDir, '', results);
371
+ return results.sort();
372
+ }
373
+ function collectFiles(dir, prefix, results) {
374
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
375
+ if (entry.name === '.git')
376
+ continue;
377
+ const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
378
+ const fullPath = path.join(dir, entry.name);
379
+ if (entry.isDirectory()) {
380
+ collectFiles(fullPath, relPath, results);
381
+ }
382
+ else if (entry.isFile()) {
383
+ results.push(relPath);
384
+ }
385
+ }
386
+ }
387
+ /**
388
+ * Determine which files from `allFiles` should be kept after applying
389
+ * include (whitelist) and exclude (blacklist) glob patterns.
390
+ *
391
+ * Rules:
392
+ * 1. If `include` patterns are provided, only files matching at least one
393
+ * include pattern are candidates.
394
+ * 2. If `exclude` patterns are provided, any remaining candidate that also
395
+ * matches an exclude pattern is removed.
396
+ * 3. When both sets are provided the effective set is (include ∩ ¬exclude).
397
+ */
398
+ function computeFilesToKeep(allFiles, include, exclude) {
399
+ let result = allFiles;
400
+ if (include && include.length > 0) {
401
+ result = result.filter((f) => include.some((p) => matchesGlob(f, p)));
402
+ }
403
+ if (exclude && exclude.length > 0) {
404
+ result = result.filter((f) => !exclude.some((p) => matchesGlob(f, p)));
405
+ }
406
+ return result;
407
+ }
408
+ /**
409
+ * Match a forward-slash relative file path against a simple glob pattern.
410
+ *
411
+ * Supported syntax:
412
+ * `*` — any sequence of characters within a single path segment
413
+ * `**` — any sequence of characters across path segments
414
+ * `dir/` — matches all files inside `dir/` (shorthand for `dir/**`)
415
+ * Literal characters otherwise.
416
+ */
417
+ function matchesGlob(filePath, pattern) {
418
+ const normalizedFile = filePath.replace(/\\/g, '/');
419
+ let normalizedPattern = pattern.replace(/\\/g, '/');
420
+ // A trailing '/' means "any file inside this directory"
421
+ if (normalizedPattern.endsWith('/')) {
422
+ normalizedPattern += '**';
423
+ }
424
+ // A pattern with no '/' and no '**' is matched against the basename as well
425
+ const isBasenamePattern = !normalizedPattern.includes('/') && !normalizedPattern.includes('**');
426
+ if (isBasenamePattern) {
427
+ // Try matching the full relative path AND just the basename
428
+ const basename = normalizedFile.split('/').pop() ?? normalizedFile;
429
+ return (globToRegex(normalizedPattern).test(normalizedFile) ||
430
+ globToRegex(normalizedPattern).test(basename));
431
+ }
432
+ return globToRegex(normalizedPattern).test(normalizedFile);
433
+ }
434
+ function globToRegex(pattern) {
435
+ const escaped = pattern
436
+ // Escape all regex special chars except * and ?
437
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
438
+ // Replace ** with a placeholder, then * with segment matcher
439
+ .replace(/\*\*/g, '\x00')
440
+ .replace(/\*/g, '[^/]*')
441
+ .replace(/\x00/g, '.*');
442
+ return new RegExp(`^${escaped}$`);
443
+ }
444
+ function deleteFiles(repoDir, relPaths) {
445
+ let deleted = 0;
446
+ for (const relPath of relPaths) {
447
+ const fullPath = path.resolve(path.join(repoDir, relPath));
448
+ // Safety: must stay within pocket root
449
+ if (!isWithinDir(repoDir, fullPath)) {
450
+ (0, sparkle_js_1.oops)(`Refusing to delete file outside pocket root: ${relPath}`);
451
+ continue;
452
+ }
453
+ if (fs.existsSync(fullPath)) {
454
+ fs.rmSync(fullPath, { force: true });
455
+ deleted++;
456
+ }
457
+ }
458
+ return deleted;
459
+ }
460
+ function removeEmptyDirs(dir, isRoot = true) {
461
+ if (!fs.existsSync(dir))
462
+ return;
463
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
464
+ if (!entry.isDirectory())
465
+ continue;
466
+ if (entry.name === '.git')
467
+ continue;
468
+ const fullPath = path.join(dir, entry.name);
469
+ removeEmptyDirs(fullPath, false);
470
+ if (!isRoot && fs.existsSync(fullPath) && fs.readdirSync(fullPath).length === 0) {
471
+ fs.rmdirSync(fullPath);
472
+ }
473
+ }
474
+ }
475
+ function isWithinDir(dir, filePath) {
476
+ const resolvedDir = path.resolve(dir);
477
+ const resolvedFile = path.resolve(filePath);
478
+ return (resolvedFile === resolvedDir ||
479
+ resolvedFile.startsWith(resolvedDir + path.sep));
480
+ }
481
+ function isYes(answer) {
482
+ return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
483
+ }
484
+ //# 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,8 @@
1
+ /**
2
+ * Unit tests for cleanup command core logic.
3
+ * Run with: npm test
4
+ *
5
+ * Uses Node.js built-in test runner (requires Node >= 18).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=cleanup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.test.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}