sheldonify 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/.claude-plugin/plugin.json +8 -0
- package/.clinerules +24 -0
- package/.cursor/rules/sheldonify.md +24 -0
- package/.github/copilot-instructions.md +16 -0
- package/.kiro/steering/sheldonify.md +24 -0
- package/.openclaw/skills/sheldonify +83 -0
- package/.windsurf/rules/sheldonify.md +24 -0
- package/AGENTS.md +56 -0
- package/LICENSE +191 -0
- package/README.md +388 -0
- package/bin/sheldonify.js +2 -0
- package/codex.md +32 -0
- package/dist/classifier.d.ts +7 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +19 -0
- package/dist/classifier.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +158 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +121 -0
- package/dist/config.js.map +1 -0
- package/dist/duplicates.d.ts +3 -0
- package/dist/duplicates.d.ts.map +1 -0
- package/dist/duplicates.js +59 -0
- package/dist/duplicates.js.map +1 -0
- package/dist/executor.d.ts +3 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +99 -0
- package/dist/executor.js.map +1 -0
- package/dist/index-generator.d.ts +3 -0
- package/dist/index-generator.d.ts.map +1 -0
- package/dist/index-generator.js +22 -0
- package/dist/index-generator.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +7 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +129 -0
- package/dist/output.js.map +1 -0
- package/dist/planner.d.ts +3 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +83 -0
- package/dist/planner.js.map +1 -0
- package/dist/protected.d.ts +4 -0
- package/dist/protected.d.ts.map +1 -0
- package/dist/protected.js +74 -0
- package/dist/protected.js.map +1 -0
- package/dist/scanner.d.ts +8 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +65 -0
- package/dist/scanner.js.map +1 -0
- package/dist/strategies/by-context.d.ts +9 -0
- package/dist/strategies/by-context.d.ts.map +1 -0
- package/dist/strategies/by-context.js +104 -0
- package/dist/strategies/by-context.js.map +1 -0
- package/dist/strategies/by-date.d.ts +6 -0
- package/dist/strategies/by-date.d.ts.map +1 -0
- package/dist/strategies/by-date.js +23 -0
- package/dist/strategies/by-date.js.map +1 -0
- package/dist/strategies/by-type.d.ts +6 -0
- package/dist/strategies/by-type.d.ts.map +1 -0
- package/dist/strategies/by-type.js +65 -0
- package/dist/strategies/by-type.js.map +1 -0
- package/dist/strategies/custom.d.ts +7 -0
- package/dist/strategies/custom.d.ts.map +1 -0
- package/dist/strategies/custom.js +31 -0
- package/dist/strategies/custom.js.map +1 -0
- package/dist/strategies/index.d.ts +3 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +18 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/undo-generator.d.ts +4 -0
- package/dist/undo-generator.d.ts.map +1 -0
- package/dist/undo-generator.js +65 -0
- package/dist/undo-generator.js.map +1 -0
- package/dist/utils/fs-helpers.d.ts +6 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +54 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/hash.d.ts +2 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +12 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/media.d.ts +6 -0
- package/dist/utils/media.d.ts.map +1 -0
- package/dist/utils/media.js +63 -0
- package/dist/utils/media.js.map +1 -0
- package/dist/utils/platform.d.ts +5 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +15 -0
- package/dist/utils/platform.js.map +1 -0
- package/hooks/check-install.js +32 -0
- package/hooks/hooks.json +17 -0
- package/package.json +67 -0
- package/skills/sheldonify/SKILL.md +110 -0
- package/skills/sheldonify/references/config-format.md +55 -0
- package/skills/sheldonify-scan/SKILL.md +87 -0
- package/skills/sheldonify-undo/SKILL.md +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
```
|
|
2
|
+
|
|
3
|
+
██████╗ █████╗ ███████╗███████╗██╗███╗ ██╗ ██████╗ █████╗ ██╗
|
|
4
|
+
██╔══██╗██╔══██╗╚══███╔╝╚══███╔╝██║████╗ ██║██╔════╝ ██╔══██╗██║
|
|
5
|
+
██████╔╝███████║ ███╔╝ ███╔╝ ██║██╔██╗ ██║██║ ███╗███████║██║
|
|
6
|
+
██╔══██╗██╔══██║ ███╔╝ ███╔╝ ██║██║╚██╗██║██║ ██║██╔══██║╚═╝
|
|
7
|
+
██████╔╝██║ ██║███████╗███████╗██║██║ ╚████║╚██████╔╝██║ ██║██╗
|
|
8
|
+
╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
|
|
9
|
+
|
|
10
|
+
⚡ "In a world of messy directories, be the Sheldon." ⚡
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
# sheldonify
|
|
14
|
+
|
|
15
|
+
CLI tool to organize messy directories into clean folders. Sort by file type, context, date, or custom rules. Detects duplicates, skips protected folders (.git, node_modules), generates undo scripts. Works standalone or as an AI agent plugin with structured JSON output. Never deletes data — only moves and organizes.
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
### Standalone CLI
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g sheldonify
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or run directly without installing:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx sheldonify ./Downloads
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Claude Code
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
/plugin marketplace add maxdj007/sheldonify
|
|
35
|
+
/plugin install sheldonify@sheldonify
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
(Send as two separate prompts.) The desktop app has no `/plugin` command — install from the UI: Customize > + by personal plugins > Add from repository > enter `https://github.com/maxdj007/sheldonify`.
|
|
39
|
+
|
|
40
|
+
Adds `/sheldonify`, `/sheldonify-scan`, and `/sheldonify-undo` skills. A lifecycle hook checks that the CLI is installed and nudges you if it isn't.
|
|
41
|
+
|
|
42
|
+
### Codex
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
codex plugin marketplace add maxdj007/sheldonify
|
|
46
|
+
codex
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Open `/plugins`, select the sheldonify marketplace, and install. Then open `/hooks`, review and trust the lifecycle hook, and start a new thread.
|
|
50
|
+
|
|
51
|
+
### GitHub Copilot CLI
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
copilot plugin marketplace add maxdj007/sheldonify
|
|
55
|
+
copilot plugin install sheldonify@sheldonify
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Or in an interactive session:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
/plugin marketplace add maxdj007/sheldonify
|
|
62
|
+
/plugin install sheldonify@sheldonify
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Gemini CLI / Antigravity CLI
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gemini extensions install https://github.com/maxdj007/sheldonify
|
|
69
|
+
# or
|
|
70
|
+
agy plugin install https://github.com/maxdj007/sheldonify
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### OpenClaw
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
clawhub install sheldonify
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Without ClawHub, copy `.openclaw/skills/sheldonify` into `~/.openclaw/skills/`.
|
|
80
|
+
|
|
81
|
+
### Cursor / Windsurf / Cline / Kiro
|
|
82
|
+
|
|
83
|
+
Ships with agent-specific rule files. Copy from this repo or clone it:
|
|
84
|
+
|
|
85
|
+
| Agent | Rule file |
|
|
86
|
+
|-------|-----------|
|
|
87
|
+
| Cursor | `.cursor/rules/sheldonify.md` |
|
|
88
|
+
| Windsurf | `.windsurf/rules/sheldonify.md` |
|
|
89
|
+
| Cline | `.clinerules` |
|
|
90
|
+
| Kiro | `.kiro/steering/sheldonify.md` |
|
|
91
|
+
| GitHub Copilot (editor) | `.github/copilot-instructions.md` |
|
|
92
|
+
|
|
93
|
+
### CodeWhale
|
|
94
|
+
|
|
95
|
+
Reads `AGENTS.md` from the project root — zero setup. Clone this repo or copy `AGENTS.md` to your project.
|
|
96
|
+
|
|
97
|
+
### Any other agent
|
|
98
|
+
|
|
99
|
+
If your agent has terminal access, just install the CLI globally (`npm i -g sheldonify`) and tell the agent to use it. The `--json` flag gives structured output any agent can parse.
|
|
100
|
+
|
|
101
|
+
## Quick Start
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Preview what will happen (dry run)
|
|
105
|
+
sheldonify ./Downloads --dry-run
|
|
106
|
+
|
|
107
|
+
# Organize by file type (default)
|
|
108
|
+
sheldonify ./Downloads
|
|
109
|
+
|
|
110
|
+
# Organize by date
|
|
111
|
+
sheldonify ./Documents --strategy date
|
|
112
|
+
|
|
113
|
+
# Organize by context (uses filename heuristics)
|
|
114
|
+
sheldonify ./Desktop --strategy context
|
|
115
|
+
|
|
116
|
+
# Use custom rules
|
|
117
|
+
sheldonify . --strategy custom --config rules.json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Strategies
|
|
121
|
+
|
|
122
|
+
### Type (default)
|
|
123
|
+
|
|
124
|
+
Groups files by extension into folders like `Images/`, `Documents/`, `Code/`, `Videos/`, `Audio/`, `Archives/`, `Fonts/`, `Executables/`, `Data/`, `Design/`.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
sheldonify . --strategy type
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
Before: After:
|
|
132
|
+
├── photo.jpg ├── Images/
|
|
133
|
+
├── report.pdf │ └── photo.jpg
|
|
134
|
+
├── app.ts ├── Documents/
|
|
135
|
+
├── song.mp3 │ └── report.pdf
|
|
136
|
+
└── backup.zip ├── Code/
|
|
137
|
+
│ └── app.ts
|
|
138
|
+
├── Audio/
|
|
139
|
+
│ └── song.mp3
|
|
140
|
+
└── Archives/
|
|
141
|
+
└── backup.zip
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Context
|
|
145
|
+
|
|
146
|
+
Classifies files by their purpose using filename keywords, parent folder names, and file metadata. Uses a hybrid approach: heuristics for confident matches, and an LLM bridge for ambiguous files when used with AI agents.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
sheldonify . --strategy context
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Recognizes: Screenshots, Receipts, Resumes, Contracts, Photos, Backups, Logs, Config, Design, Notes, Presentations, Spreadsheets, Templates, Exports, Downloads.
|
|
153
|
+
|
|
154
|
+
### Date
|
|
155
|
+
|
|
156
|
+
Organizes into `Year/Month` folders based on file modification date.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
sheldonify . --strategy date
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
After:
|
|
164
|
+
├── 2026/
|
|
165
|
+
│ ├── 01-January/
|
|
166
|
+
│ ├── 06-June/
|
|
167
|
+
│ └── 12-December/
|
|
168
|
+
└── 2025/
|
|
169
|
+
└── 11-November/
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Custom
|
|
173
|
+
|
|
174
|
+
Define your own sorting rules in a config file.
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
sheldonify . --strategy custom --config rules.json
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{
|
|
182
|
+
"customRules": [
|
|
183
|
+
{
|
|
184
|
+
"name": "Tax Documents",
|
|
185
|
+
"match": { "patterns": ["*tax*", "*w2*"], "extensions": ["pdf"] },
|
|
186
|
+
"priority": 10
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "Work Projects",
|
|
190
|
+
"match": { "regex": "project-.*" },
|
|
191
|
+
"priority": 5
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Unmatched files are moved to `Unsorted/`.
|
|
198
|
+
|
|
199
|
+
## Features
|
|
200
|
+
|
|
201
|
+
### Duplicate Detection
|
|
202
|
+
|
|
203
|
+
Finds files with identical content using SHA-256 hashing. Keeps one copy in place, moves extras to `_duplicates/` with metadata sidecars for traceability.
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Duplicates are automatically detected and handled
|
|
207
|
+
sheldonify ./Downloads --strategy type
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Protected Folders
|
|
211
|
+
|
|
212
|
+
Automatically skips directories that shouldn't be reorganized:
|
|
213
|
+
|
|
214
|
+
- Version control: `.git`, `.svn`, `.hg`
|
|
215
|
+
- Dependencies: `node_modules`, `.venv`, `vendor`
|
|
216
|
+
- IDE config: `.idea`, `.vscode`
|
|
217
|
+
- Build output: `dist`, `build`, `.next`
|
|
218
|
+
- Project roots: any folder containing `package.json`, `Cargo.toml`, `go.mod`, etc.
|
|
219
|
+
- All dotfolders
|
|
220
|
+
|
|
221
|
+
Override via config:
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"protected": {
|
|
226
|
+
"useDefaults": true,
|
|
227
|
+
"include": ["my-special-folder"],
|
|
228
|
+
"exclude": ["dist"]
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Undo
|
|
234
|
+
|
|
235
|
+
Every run generates undo scripts that reverse all changes:
|
|
236
|
+
|
|
237
|
+
- `_sheldonify-undo.sh` — Bash
|
|
238
|
+
- `_sheldonify-undo.ps1` — PowerShell
|
|
239
|
+
- `_sheldonify-index.json` — Machine-readable index with full undo mapping
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Undo the last organization
|
|
243
|
+
bash _sheldonify-undo.sh
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Uncertain File Review
|
|
247
|
+
|
|
248
|
+
When using the `context` strategy, files that match multiple categories with similar confidence are flagged for review instead of being silently misclassified.
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
⚠ The following files need your input:
|
|
252
|
+
|
|
253
|
+
data_backup_v2.xlsx
|
|
254
|
+
→ Backups (40%: filename contains "backup")
|
|
255
|
+
→ Spreadsheets (40%: extension .xlsx suggests Spreadsheets)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Uninstall
|
|
259
|
+
|
|
260
|
+
| Agent | Command |
|
|
261
|
+
|-------|---------|
|
|
262
|
+
| Claude Code | `/plugin remove sheldonify` |
|
|
263
|
+
| Codex | `codex plugin remove sheldonify` |
|
|
264
|
+
| Gemini CLI | `gemini extensions remove sheldonify` |
|
|
265
|
+
| OpenClaw | `clawhub remove sheldonify` |
|
|
266
|
+
| Cursor / Windsurf / Cline / Kiro | Delete the copied rule file |
|
|
267
|
+
| CLI only | `npm uninstall -g sheldonify` |
|
|
268
|
+
|
|
269
|
+
## Agent Integration Details
|
|
270
|
+
|
|
271
|
+
### JSON Output
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
sheldonify . --strategy type --dry-run --json
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
Returns structured JSON to stdout with plan details, stats, and operations. All decorative output goes to stderr, so agents can pipe stdout cleanly.
|
|
278
|
+
|
|
279
|
+
### LLM Bridge (Context Strategy)
|
|
280
|
+
|
|
281
|
+
Two-step workflow for AI agents:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# Step 1: Scan and output file metadata with heuristic guesses
|
|
285
|
+
sheldonify scan ./Downloads --json > scan-results.json
|
|
286
|
+
|
|
287
|
+
# Step 2: Agent's LLM classifies uncertain files, writes plan
|
|
288
|
+
# Step 3: Apply the classification
|
|
289
|
+
sheldonify apply ./Downloads --plan classifications.json
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
The plan file format:
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
{
|
|
296
|
+
"classifications": [
|
|
297
|
+
{ "file": "mystery_file.dat", "category": "Backups", "reason": "appears to be a database backup" }
|
|
298
|
+
]
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Exit Codes
|
|
303
|
+
|
|
304
|
+
| Code | Meaning |
|
|
305
|
+
|------|---------|
|
|
306
|
+
| 0 | Success |
|
|
307
|
+
| 1 | Runtime error |
|
|
308
|
+
| 2 | Invalid arguments/config |
|
|
309
|
+
| 3 | Target not found |
|
|
310
|
+
| 4 | Nothing to do |
|
|
311
|
+
|
|
312
|
+
## CLI Reference
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
sheldonify [directory] [options]
|
|
316
|
+
|
|
317
|
+
Options:
|
|
318
|
+
-s, --strategy <name> Sorting strategy: type|context|date|custom (default: type)
|
|
319
|
+
-d, --depth <number> Recursion depth (default: 1)
|
|
320
|
+
--dry-run Preview changes without executing
|
|
321
|
+
--config <path> Path to config file
|
|
322
|
+
--verbose Detailed output
|
|
323
|
+
--json Structured JSON output for agents
|
|
324
|
+
-V, --version Output version number
|
|
325
|
+
-h, --help Display help
|
|
326
|
+
|
|
327
|
+
Commands:
|
|
328
|
+
scan <directory> Scan and output file metadata (for LLM bridge)
|
|
329
|
+
apply <directory> Apply a classification plan from scan results
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Configuration
|
|
333
|
+
|
|
334
|
+
Place a `sheldonify.config.json` in the target directory or your home directory.
|
|
335
|
+
|
|
336
|
+
```json
|
|
337
|
+
{
|
|
338
|
+
"strategy": "type",
|
|
339
|
+
"depth": 1,
|
|
340
|
+
"protected": {
|
|
341
|
+
"useDefaults": true,
|
|
342
|
+
"include": [],
|
|
343
|
+
"exclude": []
|
|
344
|
+
},
|
|
345
|
+
"typeStrategy": {
|
|
346
|
+
"extraMappings": { "sketch": "Design" },
|
|
347
|
+
"categoryRenames": { "Code": "Source" }
|
|
348
|
+
},
|
|
349
|
+
"contextStrategy": {
|
|
350
|
+
"extraKeywords": { "Tax-Documents": ["tax", "w2", "1099"] }
|
|
351
|
+
},
|
|
352
|
+
"dateStrategy": {
|
|
353
|
+
"dateSource": "modified"
|
|
354
|
+
},
|
|
355
|
+
"customRules": []
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
## Agent Portability
|
|
360
|
+
|
|
361
|
+
Which files map to which agent:
|
|
362
|
+
|
|
363
|
+
| File | Agent |
|
|
364
|
+
|------|-------|
|
|
365
|
+
| `.claude-plugin/` + `skills/` + `hooks/` | Claude Code |
|
|
366
|
+
| `AGENTS.md` + `codex.md` + `skills/` + `hooks/` | Codex, VS Code Codex extension |
|
|
367
|
+
| `.openclaw/skills/sheldonify` | OpenClaw |
|
|
368
|
+
| `.github/copilot-instructions.md` | GitHub Copilot CLI, GitHub Copilot (editor) |
|
|
369
|
+
| `AGENTS.md` | CodeWhale |
|
|
370
|
+
| `.cursor/rules/sheldonify.md` | Cursor |
|
|
371
|
+
| `.windsurf/rules/sheldonify.md` | Windsurf |
|
|
372
|
+
| `.clinerules` | Cline |
|
|
373
|
+
| `.kiro/steering/sheldonify.md` | Kiro |
|
|
374
|
+
|
|
375
|
+
## Requirements
|
|
376
|
+
|
|
377
|
+
- Node.js >= 18
|
|
378
|
+
- Optional: `sharp` (image metadata), `ffprobe` (video/audio metadata)
|
|
379
|
+
|
|
380
|
+
## License
|
|
381
|
+
|
|
382
|
+
Apache 2.0 — see [LICENSE](LICENSE)
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
🖖 Live long and prosper — and keep your directories organized.
|
|
388
|
+
```
|
package/codex.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Sheldonify — Codex Integration
|
|
2
|
+
|
|
3
|
+
Sheldonify is a CLI tool for organizing files in directories. It works as a Codex plugin with skills, hooks, and AGENTS.md support.
|
|
4
|
+
|
|
5
|
+
## Plugin Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
sheldonify/
|
|
9
|
+
├── .claude-plugin/plugin.json # Plugin manifest (shared with Claude Code)
|
|
10
|
+
├── skills/ # Skills (shared with Claude Code)
|
|
11
|
+
│ ├── sheldonify/SKILL.md
|
|
12
|
+
│ ├── sheldonify-scan/SKILL.md
|
|
13
|
+
│ └── sheldonify-undo/SKILL.md
|
|
14
|
+
├── hooks/ # Lifecycle hooks
|
|
15
|
+
│ ├── hooks.json
|
|
16
|
+
│ └── check-install.js # Checks CLI is installed
|
|
17
|
+
└── AGENTS.md # Auto-loaded by Codex
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Lifecycle Hooks
|
|
21
|
+
|
|
22
|
+
### check-install.js (PreToolUse)
|
|
23
|
+
|
|
24
|
+
Triggers before any Bash command containing "sheldonify". If the CLI isn't installed, it returns a system message nudging the agent to run `npm install -g sheldonify`.
|
|
25
|
+
|
|
26
|
+
This hook requires Node.js on your PATH. If Node.js isn't available on the non-interactive shell's PATH (common with nvm/Nix), the skills still work — the hook just stays quiet.
|
|
27
|
+
|
|
28
|
+
## Skills
|
|
29
|
+
|
|
30
|
+
- **sheldonify** — Main skill. Triggered when user asks to organize, sort, clean up, or tidy files/folders.
|
|
31
|
+
- **sheldonify-scan** — Scan skill. Triggered when user wants to analyze a directory or use LLM-assisted classification.
|
|
32
|
+
- **sheldonify-undo** — Undo skill. Triggered when user wants to reverse a previous organization.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FileEntry, SheldonifyConfig, Classification, SortStrategy, UncertainFile } from './types.js';
|
|
2
|
+
export interface ClassifyResult {
|
|
3
|
+
classifications: Map<string, Classification>;
|
|
4
|
+
uncertainFiles: UncertainFile[];
|
|
5
|
+
}
|
|
6
|
+
export declare function classify(files: FileEntry[], strategy: SortStrategy, config: SheldonifyConfig): ClassifyResult;
|
|
7
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAItG,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,gBAAgB,GACvB,cAAc,CAkBhB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const CONFIDENCE_THRESHOLD = 0.5;
|
|
2
|
+
export function classify(files, strategy, config) {
|
|
3
|
+
const classifications = new Map();
|
|
4
|
+
const uncertainFiles = [];
|
|
5
|
+
for (const file of files) {
|
|
6
|
+
const result = strategy.categorize(file, config);
|
|
7
|
+
if (result.confidence >= CONFIDENCE_THRESHOLD) {
|
|
8
|
+
classifications.set(file.absolutePath, result);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
uncertainFiles.push({
|
|
12
|
+
file,
|
|
13
|
+
candidates: [result],
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return { classifications, uncertainFiles };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAEA,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAOjC,MAAM,UAAU,QAAQ,CACtB,KAAkB,EAClB,QAAsB,EACtB,MAAwB;IAExB,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1D,MAAM,cAAc,GAAoB,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,UAAU,IAAI,oBAAoB,EAAE,CAAC;YAC9C,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC;gBAClB,IAAI;gBACJ,UAAU,EAAE,CAAC,MAAM,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
import { scanDirectory, getScanWarnings } from './scanner.js';
|
|
4
|
+
import { createProtectedChecker } from './protected.js';
|
|
5
|
+
import { getStrategy } from './strategies/index.js';
|
|
6
|
+
import { classify } from './classifier.js';
|
|
7
|
+
import { findDuplicates } from './duplicates.js';
|
|
8
|
+
import { buildMovePlan } from './planner.js';
|
|
9
|
+
import { executePlan } from './executor.js';
|
|
10
|
+
import { printDryRun, printResult, printUncertainFiles, printError, printVerbose } from './output.js';
|
|
11
|
+
const program = new Command()
|
|
12
|
+
.name('sheldonify')
|
|
13
|
+
.description('Organize files and folders by type, context, date, or custom rules')
|
|
14
|
+
.version('0.1.0')
|
|
15
|
+
.argument('[directory]', 'target directory to organize', '.')
|
|
16
|
+
.option('-s, --strategy <name>', 'sorting strategy (type|context|date|custom)', 'type')
|
|
17
|
+
.option('-d, --depth <number>', 'recursion depth', '1')
|
|
18
|
+
.option('--dry-run', 'preview changes without executing')
|
|
19
|
+
.option('--config <path>', 'path to config file')
|
|
20
|
+
.option('--verbose', 'detailed output')
|
|
21
|
+
.option('--json', 'structured JSON output for agents')
|
|
22
|
+
.action(run);
|
|
23
|
+
program
|
|
24
|
+
.command('scan <directory>')
|
|
25
|
+
.description('Scan directory and output file metadata (for context strategy with LLM)')
|
|
26
|
+
.option('-d, --depth <number>', 'recursion depth', '1')
|
|
27
|
+
.option('--config <path>', 'path to config file')
|
|
28
|
+
.option('--verbose', 'detailed output')
|
|
29
|
+
.action(runScan);
|
|
30
|
+
program
|
|
31
|
+
.command('apply <directory>')
|
|
32
|
+
.description('Apply a classification plan from scan results')
|
|
33
|
+
.option('--plan <path>', 'path to classification plan JSON')
|
|
34
|
+
.option('--config <path>', 'path to config file')
|
|
35
|
+
.option('--verbose', 'detailed output')
|
|
36
|
+
.option('--json', 'structured JSON output for agents')
|
|
37
|
+
.action(runApply);
|
|
38
|
+
async function run(directory, options) {
|
|
39
|
+
try {
|
|
40
|
+
const config = await loadConfig(directory, options);
|
|
41
|
+
printVerbose(`Config loaded: strategy=${config.strategy}, depth=${config.depth}`, config);
|
|
42
|
+
const isProtected = createProtectedChecker(config);
|
|
43
|
+
printVerbose('Scanning directory...', config);
|
|
44
|
+
const files = await scanDirectory(config.targetDir, config, isProtected);
|
|
45
|
+
const warnings = getScanWarnings();
|
|
46
|
+
printVerbose(`Found ${files.length} files`, config);
|
|
47
|
+
if (warnings.symlinksSkipped.length > 0) {
|
|
48
|
+
printVerbose(`Skipped ${warnings.symlinksSkipped.length} symlinks`, config);
|
|
49
|
+
}
|
|
50
|
+
if (files.length === 0) {
|
|
51
|
+
printError('No files found to organize.', config.jsonOutput);
|
|
52
|
+
process.exit(4);
|
|
53
|
+
}
|
|
54
|
+
const strategy = getStrategy(config.strategy);
|
|
55
|
+
const { classifications, uncertainFiles } = classify(files, strategy, config);
|
|
56
|
+
printVerbose(`Classified ${classifications.size} files, ${uncertainFiles.length} uncertain`, config);
|
|
57
|
+
if (uncertainFiles.length > 0) {
|
|
58
|
+
printUncertainFiles({ uncertainFiles, operations: [], duplicateGroups: [], skippedPaths: [], warnings: [], stats: { totalFiles: files.length, filesToMove: 0, duplicatesFound: 0, foldersToCreate: 0, protectedSkipped: 0, uncertainCount: uncertainFiles.length } }, config);
|
|
59
|
+
}
|
|
60
|
+
const duplicateGroups = await findDuplicates(files);
|
|
61
|
+
printVerbose(`Found ${duplicateGroups.length} duplicate groups`, config);
|
|
62
|
+
const plan = buildMovePlan(files, classifications, duplicateGroups, uncertainFiles, config);
|
|
63
|
+
if (config.dryRun) {
|
|
64
|
+
printDryRun(plan, config);
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
const result = await executePlan(plan, config);
|
|
68
|
+
printResult(result, config);
|
|
69
|
+
process.exit(result.success ? 0 : 1);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
73
|
+
printError(msg, options.json === true);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function runScan(directory, options) {
|
|
78
|
+
try {
|
|
79
|
+
const config = await loadConfig(directory, {
|
|
80
|
+
...options,
|
|
81
|
+
strategy: 'context',
|
|
82
|
+
json: true,
|
|
83
|
+
});
|
|
84
|
+
const isProtected = createProtectedChecker(config);
|
|
85
|
+
const files = await scanDirectory(config.targetDir, config, isProtected);
|
|
86
|
+
const strategy = getStrategy('context');
|
|
87
|
+
const { classifications, uncertainFiles } = classify(files, strategy, config);
|
|
88
|
+
const output = {
|
|
89
|
+
targetDir: config.targetDir,
|
|
90
|
+
totalFiles: files.length,
|
|
91
|
+
files: files.map(f => ({
|
|
92
|
+
relativePath: f.relativePath,
|
|
93
|
+
name: f.name,
|
|
94
|
+
extension: f.extension,
|
|
95
|
+
size: f.size,
|
|
96
|
+
modifiedAt: f.modifiedAt.toISOString(),
|
|
97
|
+
createdAt: f.createdAt.toISOString(),
|
|
98
|
+
media: f.media,
|
|
99
|
+
heuristicGuess: classifications.get(f.absolutePath) ?? null,
|
|
100
|
+
})),
|
|
101
|
+
uncertainFiles: uncertainFiles.map(u => ({
|
|
102
|
+
file: u.file.relativePath,
|
|
103
|
+
candidates: u.candidates,
|
|
104
|
+
})),
|
|
105
|
+
};
|
|
106
|
+
process.stdout.write(JSON.stringify(output, null, 2) + '\n');
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
110
|
+
printError(msg, true);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function runApply(directory, options) {
|
|
115
|
+
try {
|
|
116
|
+
if (!options.plan) {
|
|
117
|
+
printError('--plan <path> is required for the apply command.', options.json === true);
|
|
118
|
+
process.exit(2);
|
|
119
|
+
}
|
|
120
|
+
const config = await loadConfig(directory, {
|
|
121
|
+
...options,
|
|
122
|
+
strategy: 'context',
|
|
123
|
+
});
|
|
124
|
+
const planPath = options.plan;
|
|
125
|
+
const { readFile } = await import('node:fs/promises');
|
|
126
|
+
const raw = await readFile(planPath, 'utf-8');
|
|
127
|
+
const planData = JSON.parse(raw);
|
|
128
|
+
const isProtected = createProtectedChecker(config);
|
|
129
|
+
const files = await scanDirectory(config.targetDir, config, isProtected);
|
|
130
|
+
const classifications = new Map();
|
|
131
|
+
for (const entry of planData.classifications ?? []) {
|
|
132
|
+
const file = files.find(f => f.relativePath === entry.file);
|
|
133
|
+
if (file) {
|
|
134
|
+
classifications.set(file.absolutePath, {
|
|
135
|
+
category: entry.category,
|
|
136
|
+
confidence: 1.0,
|
|
137
|
+
reason: entry.reason ?? 'classified by agent',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const duplicateGroups = await findDuplicates(files);
|
|
142
|
+
const plan = buildMovePlan(files, classifications, duplicateGroups, [], config);
|
|
143
|
+
if (config.dryRun) {
|
|
144
|
+
printDryRun(plan, config);
|
|
145
|
+
process.exit(0);
|
|
146
|
+
}
|
|
147
|
+
const result = await executePlan(plan, config);
|
|
148
|
+
printResult(result, config);
|
|
149
|
+
process.exit(result.success ? 0 : 1);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
153
|
+
printError(msg, options.json === true);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
program.parse();
|
|
158
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SheldonifyConfig } from './types.js';
|
|
2
|
+
export declare function loadConfig(targetDir: string, cliOptions: {
|
|
3
|
+
strategy?: string;
|
|
4
|
+
depth?: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
verbose?: boolean;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
config?: string;
|
|
9
|
+
}): Promise<SheldonifyConfig>;
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AA4D5D,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,gBAAgB,CAAC,CA8B3B"}
|