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.
Files changed (107) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/.clinerules +24 -0
  3. package/.cursor/rules/sheldonify.md +24 -0
  4. package/.github/copilot-instructions.md +16 -0
  5. package/.kiro/steering/sheldonify.md +24 -0
  6. package/.openclaw/skills/sheldonify +83 -0
  7. package/.windsurf/rules/sheldonify.md +24 -0
  8. package/AGENTS.md +56 -0
  9. package/LICENSE +191 -0
  10. package/README.md +388 -0
  11. package/bin/sheldonify.js +2 -0
  12. package/codex.md +32 -0
  13. package/dist/classifier.d.ts +7 -0
  14. package/dist/classifier.d.ts.map +1 -0
  15. package/dist/classifier.js +19 -0
  16. package/dist/classifier.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +158 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +10 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +121 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/duplicates.d.ts +3 -0
  26. package/dist/duplicates.d.ts.map +1 -0
  27. package/dist/duplicates.js +59 -0
  28. package/dist/duplicates.js.map +1 -0
  29. package/dist/executor.d.ts +3 -0
  30. package/dist/executor.d.ts.map +1 -0
  31. package/dist/executor.js +99 -0
  32. package/dist/executor.js.map +1 -0
  33. package/dist/index-generator.d.ts +3 -0
  34. package/dist/index-generator.d.ts.map +1 -0
  35. package/dist/index-generator.js +22 -0
  36. package/dist/index-generator.js.map +1 -0
  37. package/dist/index.d.ts +12 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +11 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/output.d.ts +7 -0
  42. package/dist/output.d.ts.map +1 -0
  43. package/dist/output.js +129 -0
  44. package/dist/output.js.map +1 -0
  45. package/dist/planner.d.ts +3 -0
  46. package/dist/planner.d.ts.map +1 -0
  47. package/dist/planner.js +83 -0
  48. package/dist/planner.js.map +1 -0
  49. package/dist/protected.d.ts +4 -0
  50. package/dist/protected.d.ts.map +1 -0
  51. package/dist/protected.js +74 -0
  52. package/dist/protected.js.map +1 -0
  53. package/dist/scanner.d.ts +8 -0
  54. package/dist/scanner.d.ts.map +1 -0
  55. package/dist/scanner.js +65 -0
  56. package/dist/scanner.js.map +1 -0
  57. package/dist/strategies/by-context.d.ts +9 -0
  58. package/dist/strategies/by-context.d.ts.map +1 -0
  59. package/dist/strategies/by-context.js +104 -0
  60. package/dist/strategies/by-context.js.map +1 -0
  61. package/dist/strategies/by-date.d.ts +6 -0
  62. package/dist/strategies/by-date.d.ts.map +1 -0
  63. package/dist/strategies/by-date.js +23 -0
  64. package/dist/strategies/by-date.js.map +1 -0
  65. package/dist/strategies/by-type.d.ts +6 -0
  66. package/dist/strategies/by-type.d.ts.map +1 -0
  67. package/dist/strategies/by-type.js +65 -0
  68. package/dist/strategies/by-type.js.map +1 -0
  69. package/dist/strategies/custom.d.ts +7 -0
  70. package/dist/strategies/custom.d.ts.map +1 -0
  71. package/dist/strategies/custom.js +31 -0
  72. package/dist/strategies/custom.js.map +1 -0
  73. package/dist/strategies/index.d.ts +3 -0
  74. package/dist/strategies/index.d.ts.map +1 -0
  75. package/dist/strategies/index.js +18 -0
  76. package/dist/strategies/index.js.map +1 -0
  77. package/dist/types.d.ts +125 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +2 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/undo-generator.d.ts +4 -0
  82. package/dist/undo-generator.d.ts.map +1 -0
  83. package/dist/undo-generator.js +65 -0
  84. package/dist/undo-generator.js.map +1 -0
  85. package/dist/utils/fs-helpers.d.ts +6 -0
  86. package/dist/utils/fs-helpers.d.ts.map +1 -0
  87. package/dist/utils/fs-helpers.js +54 -0
  88. package/dist/utils/fs-helpers.js.map +1 -0
  89. package/dist/utils/hash.d.ts +2 -0
  90. package/dist/utils/hash.d.ts.map +1 -0
  91. package/dist/utils/hash.js +12 -0
  92. package/dist/utils/hash.js.map +1 -0
  93. package/dist/utils/media.d.ts +6 -0
  94. package/dist/utils/media.d.ts.map +1 -0
  95. package/dist/utils/media.js +63 -0
  96. package/dist/utils/media.js.map +1 -0
  97. package/dist/utils/platform.d.ts +5 -0
  98. package/dist/utils/platform.d.ts.map +1 -0
  99. package/dist/utils/platform.js +15 -0
  100. package/dist/utils/platform.js.map +1 -0
  101. package/hooks/check-install.js +32 -0
  102. package/hooks/hooks.json +17 -0
  103. package/package.json +67 -0
  104. package/skills/sheldonify/SKILL.md +110 -0
  105. package/skills/sheldonify/references/config-format.md +55 -0
  106. package/skills/sheldonify-scan/SKILL.md +87 -0
  107. 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
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/cli.js');
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGtG,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,OAAO,CAAC;KAChB,QAAQ,CAAC,aAAa,EAAE,8BAA8B,EAAE,GAAG,CAAC;KAC5D,MAAM,CAAC,uBAAuB,EAAE,6CAA6C,EAAE,MAAM,CAAC;KACtF,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,CAAC;KACtD,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;KACrD,MAAM,CAAC,GAAG,CAAC,CAAC;AAEf,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,yEAAyE,CAAC;KACtF,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,GAAG,CAAC;KACtD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACtC,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,mCAAmC,CAAC;KACrD,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpB,KAAK,UAAU,GAAG,CAAC,SAAiB,EAAE,OAAqD;IACzF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,YAAY,CAAC,2BAA2B,MAAM,CAAC,QAAQ,WAAW,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE1F,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACnD,YAAY,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QACnC,YAAY,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,WAAW,QAAQ,CAAC,eAAe,CAAC,MAAM,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,UAAU,CAAC,6BAA6B,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9E,YAAY,CAAC,cAAc,eAAe,CAAC,IAAI,WAAW,cAAc,CAAC,MAAM,YAAY,EAAE,MAAM,CAAC,CAAC;QAErG,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,mBAAmB,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAChR,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QACpD,YAAY,CAAC,SAAS,eAAe,CAAC,MAAM,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAEzE,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAE5F,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,SAAiB,EAAE,OAAqD;IAC7F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE;YACzC,GAAG,OAAO;YACV,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAEzE,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE;gBACtC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;gBACpC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,cAAc,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,IAAI;aAC5D,CAAC,CAAC;YACH,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;gBACzB,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB,CAAC,CAAC;SACJ,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAqD;IAC9F,IAAI,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,UAAU,CAAC,kDAAkD,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE;YACzC,GAAG,OAAO;YACV,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAc,CAAC;QACxC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAEzE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoE,CAAC;QACpG,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,IAAI,EAAE,CAAC;gBACT,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;oBACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,qBAAqB;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QAEhF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -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"}