@amirdaraee/namewise 0.6.1 → 0.7.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/CHANGELOG.md +43 -1
- package/README.md +258 -9
- package/dist/cli/apply.d.ts +4 -0
- package/dist/cli/apply.d.ts.map +1 -0
- package/dist/cli/apply.js +66 -0
- package/dist/cli/apply.js.map +1 -0
- package/dist/cli/clean-empty.d.ts +4 -0
- package/dist/cli/clean-empty.d.ts.map +1 -0
- package/dist/cli/clean-empty.js +48 -0
- package/dist/cli/clean-empty.js.map +1 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +299 -14
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/config-cmd.d.ts +2 -0
- package/dist/cli/config-cmd.d.ts.map +1 -0
- package/dist/cli/config-cmd.js +71 -0
- package/dist/cli/config-cmd.js.map +1 -0
- package/dist/cli/dedup.d.ts +5 -0
- package/dist/cli/dedup.d.ts.map +1 -0
- package/dist/cli/dedup.js +58 -0
- package/dist/cli/dedup.js.map +1 -0
- package/dist/cli/diff.d.ts +6 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +75 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/find.d.ts +11 -0
- package/dist/cli/find.d.ts.map +1 -0
- package/dist/cli/find.js +63 -0
- package/dist/cli/find.js.map +1 -0
- package/dist/cli/flatten.d.ts +4 -0
- package/dist/cli/flatten.d.ts.map +1 -0
- package/dist/cli/flatten.js +79 -0
- package/dist/cli/flatten.js.map +1 -0
- package/dist/cli/info.d.ts +2 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +65 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +139 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/organize.d.ts +7 -0
- package/dist/cli/organize.d.ts.map +1 -0
- package/dist/cli/organize.js +39 -0
- package/dist/cli/organize.js.map +1 -0
- package/dist/cli/rename.d.ts +12 -1
- package/dist/cli/rename.d.ts.map +1 -1
- package/dist/cli/rename.js +143 -14
- package/dist/cli/rename.js.map +1 -1
- package/dist/cli/sanitize.d.ts +7 -0
- package/dist/cli/sanitize.d.ts.map +1 -0
- package/dist/cli/sanitize.js +49 -0
- package/dist/cli/sanitize.js.map +1 -0
- package/dist/cli/stats.d.ts +4 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +35 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/tree.d.ts +4 -0
- package/dist/cli/tree.d.ts.map +1 -0
- package/dist/cli/tree.js +65 -0
- package/dist/cli/tree.js.map +1 -0
- package/dist/cli/undo.d.ts +1 -0
- package/dist/cli/undo.d.ts.map +1 -1
- package/dist/cli/undo.js +40 -2
- package/dist/cli/undo.js.map +1 -1
- package/dist/cli/watch.d.ts +2 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +128 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/index.js +14 -10
- package/dist/index.js.map +1 -1
- package/dist/parsers/pdf-parser.js +2 -2
- package/dist/parsers/pdf-parser.js.map +1 -1
- package/dist/services/claude-service.d.ts +1 -1
- package/dist/services/claude-service.d.ts.map +1 -1
- package/dist/services/claude-service.js +9 -5
- package/dist/services/claude-service.js.map +1 -1
- package/dist/services/file-renamer.d.ts +1 -0
- package/dist/services/file-renamer.d.ts.map +1 -1
- package/dist/services/file-renamer.js +17 -5
- package/dist/services/file-renamer.js.map +1 -1
- package/dist/services/lmstudio-service.d.ts +1 -1
- package/dist/services/lmstudio-service.d.ts.map +1 -1
- package/dist/services/lmstudio-service.js +6 -5
- package/dist/services/lmstudio-service.js.map +1 -1
- package/dist/services/ollama-service.d.ts +1 -1
- package/dist/services/ollama-service.d.ts.map +1 -1
- package/dist/services/ollama-service.js +6 -5
- package/dist/services/ollama-service.js.map +1 -1
- package/dist/services/openai-service.d.ts +1 -1
- package/dist/services/openai-service.d.ts.map +1 -1
- package/dist/services/openai-service.js +9 -5
- package/dist/services/openai-service.js.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/ai-prompts.d.ts +1 -0
- package/dist/utils/ai-prompts.d.ts.map +1 -1
- package/dist/utils/ai-prompts.js +3 -2
- package/dist/utils/ai-prompts.js.map +1 -1
- package/dist/utils/batch-rename.d.ts +8 -0
- package/dist/utils/batch-rename.d.ts.map +1 -0
- package/dist/utils/batch-rename.js +36 -0
- package/dist/utils/batch-rename.js.map +1 -0
- package/dist/utils/config-loader.d.ts +3 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/dedup.d.ts +3 -0
- package/dist/utils/dedup.d.ts.map +1 -0
- package/dist/utils/dedup.js +29 -0
- package/dist/utils/dedup.js.map +1 -0
- package/dist/utils/fs-collect.d.ts +7 -0
- package/dist/utils/fs-collect.d.ts.map +1 -0
- package/dist/utils/fs-collect.js +28 -0
- package/dist/utils/fs-collect.js.map +1 -0
- package/dist/utils/naming-conventions.d.ts +7 -0
- package/dist/utils/naming-conventions.d.ts.map +1 -1
- package/dist/utils/naming-conventions.js +9 -0
- package/dist/utils/naming-conventions.js.map +1 -1
- package/dist/utils/organize.d.ts +8 -0
- package/dist/utils/organize.d.ts.map +1 -0
- package/dist/utils/organize.js +41 -0
- package/dist/utils/organize.js.map +1 -0
- package/dist/utils/pattern-rename.d.ts +6 -0
- package/dist/utils/pattern-rename.d.ts.map +1 -0
- package/dist/utils/pattern-rename.js +23 -0
- package/dist/utils/pattern-rename.js.map +1 -0
- package/dist/utils/sanitizer.d.ts +3 -0
- package/dist/utils/sanitizer.d.ts.map +1 -0
- package/dist/utils/sanitizer.js +11 -0
- package/dist/utils/sanitizer.js.map +1 -0
- package/dist/utils/stats.d.ts +16 -0
- package/dist/utils/stats.d.ts.map +1 -0
- package/dist/utils/stats.js +26 -0
- package/dist/utils/stats.js.map +1 -0
- package/package.json +2 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
-
import { applyNamingConvention } from '../utils/naming-conventions.js';
|
|
2
|
+
import { applyNamingConvention, stripWindowsIllegalChars } from '../utils/naming-conventions.js';
|
|
3
3
|
import { buildFileNamePrompt } from '../utils/ai-prompts.js';
|
|
4
4
|
export class OpenAIService {
|
|
5
5
|
name = 'OpenAI';
|
|
@@ -9,7 +9,7 @@ export class OpenAIService {
|
|
|
9
9
|
this.client = new OpenAI({ apiKey });
|
|
10
10
|
this.model = model ?? 'gpt-4o';
|
|
11
11
|
}
|
|
12
|
-
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo) {
|
|
12
|
+
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language) {
|
|
13
13
|
const convention = namingConvention;
|
|
14
14
|
const fileCategory = category;
|
|
15
15
|
// Check if this is a scanned PDF image
|
|
@@ -27,7 +27,8 @@ export class OpenAIService {
|
|
|
27
27
|
originalName,
|
|
28
28
|
namingConvention: convention,
|
|
29
29
|
category: fileCategory,
|
|
30
|
-
fileInfo
|
|
30
|
+
fileInfo,
|
|
31
|
+
language
|
|
31
32
|
});
|
|
32
33
|
response = await this.client.chat.completions.create({
|
|
33
34
|
model: this.model,
|
|
@@ -59,7 +60,8 @@ export class OpenAIService {
|
|
|
59
60
|
originalName,
|
|
60
61
|
namingConvention: convention,
|
|
61
62
|
category: fileCategory,
|
|
62
|
-
fileInfo
|
|
63
|
+
fileInfo,
|
|
64
|
+
language
|
|
63
65
|
});
|
|
64
66
|
response = await this.client.chat.completions.create({
|
|
65
67
|
model: this.model,
|
|
@@ -85,8 +87,10 @@ export class OpenAIService {
|
|
|
85
87
|
sanitizeFileName(name, convention) {
|
|
86
88
|
// Remove any potential file extensions from the suggestion
|
|
87
89
|
const nameWithoutExt = name.replace(/\.[^/.]+$/, '');
|
|
90
|
+
// Strip Windows-illegal characters before applying the naming convention
|
|
91
|
+
const safeForWindows = stripWindowsIllegalChars(nameWithoutExt);
|
|
88
92
|
// Apply the naming convention
|
|
89
|
-
let cleaned = applyNamingConvention(
|
|
93
|
+
let cleaned = applyNamingConvention(safeForWindows, convention);
|
|
90
94
|
// Ensure it's not empty and not too long
|
|
91
95
|
if (!cleaned) {
|
|
92
96
|
cleaned = applyNamingConvention('untitled document', convention);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAoB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ export interface RenameResult {
|
|
|
31
31
|
}
|
|
32
32
|
export interface AIProvider {
|
|
33
33
|
name: string;
|
|
34
|
-
generateFileName: (content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo) => Promise<string>;
|
|
34
|
+
generateFileName: (content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string) => Promise<string>;
|
|
35
35
|
}
|
|
36
36
|
export type NamingConvention = 'kebab-case' | 'snake_case' | 'camelCase' | 'PascalCase' | 'lowercase' | 'UPPERCASE';
|
|
37
37
|
export type FileCategory = 'document' | 'movie' | 'music' | 'series' | 'photo' | 'book' | 'general' | 'auto';
|
|
@@ -57,6 +57,9 @@ export interface Config {
|
|
|
57
57
|
depth?: number;
|
|
58
58
|
concurrency?: number;
|
|
59
59
|
outputPath?: string;
|
|
60
|
+
patterns?: string[];
|
|
61
|
+
noAi?: boolean;
|
|
62
|
+
language?: string;
|
|
60
63
|
}
|
|
61
64
|
export interface ParseResult {
|
|
62
65
|
content: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IAEjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IAErB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAyB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAA2B,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAyB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAA2B,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAwDlE;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,0KAA0K,CAAC"}
|
package/dist/utils/ai-prompts.js
CHANGED
|
@@ -5,7 +5,7 @@ import { getTemplateInstructions } from './file-templates.js';
|
|
|
5
5
|
* This prompt is used across all AI providers (Claude, OpenAI, LMStudio, Ollama)
|
|
6
6
|
*/
|
|
7
7
|
export function buildFileNamePrompt(context) {
|
|
8
|
-
const { content, originalName, namingConvention, category, fileInfo } = context;
|
|
8
|
+
const { content, originalName, namingConvention, category, fileInfo, language } = context;
|
|
9
9
|
const namingInstructions = getNamingInstructions(namingConvention);
|
|
10
10
|
const templateInstructions = getTemplateInstructions(category);
|
|
11
11
|
// Build comprehensive context from all metadata
|
|
@@ -42,13 +42,14 @@ Document Properties:`;
|
|
|
42
42
|
metadataContext += `\n- Word count: ${meta.wordCount}`;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
+
const languageInstruction = language ? `- Generate the filename in ${language}, regardless of the document's original language` : '';
|
|
45
46
|
return `Based on the following document information, generate a descriptive filename that captures the main topic/purpose of the document. The filename should be:
|
|
46
47
|
- Descriptive and meaningful
|
|
47
48
|
- Professional and clean
|
|
48
49
|
- Between 3-10 words
|
|
49
50
|
- ${namingInstructions}
|
|
50
51
|
- ${templateInstructions}
|
|
51
|
-
- Do not include file extension
|
|
52
|
+
- Do not include file extension${languageInstruction ? `\n- ${languageInstruction.slice(2)}` : ''}
|
|
52
53
|
- If the document is specifically for/about a person (based on content), include their name at the beginning
|
|
53
54
|
- Include dates only if they are essential to the document's identity (e.g., contracts, certificates)
|
|
54
55
|
- Ignore irrelevant folder names that don't describe the document content
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompts.js","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAoB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAgB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-prompts.js","sourceRoot":"","sources":["../../src/utils/ai-prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAoB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAgB,MAAM,qBAAqB,CAAC;AAW5E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1F,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACnE,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,QAAQ,EAAE,CAAC;QACb,eAAe,IAAI;uBACA,YAAY;eACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;aAClC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE;cACtC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,EAAE;mBACnC,QAAQ,CAAC,YAAY;iBACvB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAE/C,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,CAAC;YACvC,eAAe,IAAI;qBACJ,CAAC;YAChB,IAAI,IAAI,CAAC,KAAK;gBAAE,eAAe,IAAI,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM;gBAAE,eAAe,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,OAAO;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,OAAO;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM;gBAAE,eAAe,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,IAAI,IAAI,CAAC,YAAY;gBAAE,eAAe,IAAI,gBAAgB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACnG,IAAI,IAAI,CAAC,gBAAgB;gBAAE,eAAe,IAAI,iBAAiB,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC5G,IAAI,IAAI,CAAC,KAAK;gBAAE,eAAe,IAAI,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,SAAS;gBAAE,eAAe,IAAI,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,QAAQ,CAAC,CAAC,CAAC,8BAA8B,QAAQ,kDAAkD,CAAC,CAAC,CAAC,EAAE,CAAC;IAErI,OAAO;;;;IAIL,kBAAkB;IAClB,oBAAoB;iCACS,mBAAmB,CAAC,CAAC,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;EAO/F,eAAe;;;EAGf,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;;;;sFAI0D,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uKAAuK,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DateFormat } from '../types/index.js';
|
|
2
|
+
export declare function applySequence(index: number, total: number, prefix?: string): string;
|
|
3
|
+
export declare function applyPrefix(stem: string, prefix: string): string;
|
|
4
|
+
export declare function applySuffix(stem: string, suffix: string): string;
|
|
5
|
+
export declare function applyDateStamp(stem: string, date: Date, format: DateFormat): string;
|
|
6
|
+
export declare function applyStrip(stem: string, pattern: string): string;
|
|
7
|
+
export declare function applyTruncate(stem: string, maxLen: number): string;
|
|
8
|
+
//# sourceMappingURL=batch-rename.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-rename.d.ts","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAIR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAWnF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function applySequence(index, total, prefix) {
|
|
2
|
+
const pad = Math.max(String(total).length, 3);
|
|
3
|
+
const num = String(index + 1).padStart(pad, '0');
|
|
4
|
+
return prefix ? `${prefix}-${num}` : num;
|
|
5
|
+
}
|
|
6
|
+
export function applyPrefix(stem, prefix) {
|
|
7
|
+
return `${prefix}${stem}`;
|
|
8
|
+
}
|
|
9
|
+
export function applySuffix(stem, suffix) {
|
|
10
|
+
return `${stem}${suffix}`;
|
|
11
|
+
}
|
|
12
|
+
export function applyDateStamp(stem, date, format) {
|
|
13
|
+
const y = date.getUTCFullYear();
|
|
14
|
+
const m = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
15
|
+
const d = String(date.getUTCDate()).padStart(2, '0');
|
|
16
|
+
let stamp;
|
|
17
|
+
switch (format) {
|
|
18
|
+
case 'YYYY':
|
|
19
|
+
stamp = `${y}`;
|
|
20
|
+
break;
|
|
21
|
+
case 'YYYYMMDD':
|
|
22
|
+
stamp = `${y}${m}${d}`;
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
stamp = `${y}-${m}-${d}`;
|
|
26
|
+
break; // 'YYYY-MM-DD' and 'none'
|
|
27
|
+
}
|
|
28
|
+
return `${stamp}-${stem}`;
|
|
29
|
+
}
|
|
30
|
+
export function applyStrip(stem, pattern) {
|
|
31
|
+
return stem.replace(new RegExp(pattern, 'g'), '');
|
|
32
|
+
}
|
|
33
|
+
export function applyTruncate(stem, maxLen) {
|
|
34
|
+
return stem.slice(0, maxLen);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=batch-rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-rename.js","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,KAAa,EACb,MAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAU,EAAE,MAAkB;IACzE,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAa,CAAC;IAClB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YAAE,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QACnC,KAAK,UAAU;YAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QAC/C;YAAS,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,0BAA0B;IACtE,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface NamiwiseFileConfig {
|
|
2
2
|
provider?: 'claude' | 'openai' | 'ollama' | 'lmstudio';
|
|
3
|
+
apiKey?: string;
|
|
3
4
|
case?: string;
|
|
4
5
|
template?: string;
|
|
5
6
|
name?: string;
|
|
@@ -11,6 +12,8 @@ export interface NamiwiseFileConfig {
|
|
|
11
12
|
recursive?: boolean;
|
|
12
13
|
depth?: number;
|
|
13
14
|
output?: string;
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
language?: string;
|
|
14
17
|
}
|
|
15
18
|
export declare function loadConfig(targetDir: string): Promise<NamiwiseFileConfig>;
|
|
16
19
|
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAI/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAoBpB,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QAC/C,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,KAAM,UAA0B,CAAC,OAAO,EAAE,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAClE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB;IAChD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACjG,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,aAAa,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["../../src/utils/dedup.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhE;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAgBhC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { createReadStream } from 'fs';
|
|
3
|
+
import { collectFiles } from './fs-collect.js';
|
|
4
|
+
export async function hashFile(filePath) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const hash = createHash('sha256');
|
|
7
|
+
const stream = createReadStream(filePath);
|
|
8
|
+
stream.on('data', (chunk) => hash.update(chunk));
|
|
9
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
10
|
+
stream.on('error', reject);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export async function findDuplicates(directory, recursive = false) {
|
|
14
|
+
const files = await collectFiles(directory, { recursive });
|
|
15
|
+
const hashMap = new Map();
|
|
16
|
+
for (const filePath of files) {
|
|
17
|
+
const hash = await hashFile(filePath);
|
|
18
|
+
const group = hashMap.get(hash) ?? [];
|
|
19
|
+
group.push(filePath);
|
|
20
|
+
hashMap.set(hash, group);
|
|
21
|
+
}
|
|
22
|
+
const duplicates = new Map();
|
|
23
|
+
for (const [hash, paths] of hashMap) {
|
|
24
|
+
if (paths.length > 1)
|
|
25
|
+
duplicates.set(hash, paths);
|
|
26
|
+
}
|
|
27
|
+
return duplicates;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["../../src/utils/dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,YAAqB,KAAK;IAE1B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE5C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface CollectOptions {
|
|
2
|
+
recursive?: boolean;
|
|
3
|
+
maxDepth?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function collectFiles(dir: string, options?: CollectOptions): Promise<string[]>;
|
|
6
|
+
export declare function formatBytes(bytes: number): string;
|
|
7
|
+
//# sourceMappingURL=fs-collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-collect.d.ts","sourceRoot":"","sources":["../../src/utils/fs-collect.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB;AAqBD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export async function collectFiles(dir, options = {}) {
|
|
4
|
+
const { recursive = false, maxDepth = Infinity } = options;
|
|
5
|
+
return _collect(dir, recursive, maxDepth, 0);
|
|
6
|
+
}
|
|
7
|
+
async function _collect(dir, recursive, maxDepth, depth) {
|
|
8
|
+
const files = [];
|
|
9
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
10
|
+
for (const entry of entries) {
|
|
11
|
+
const entryPath = path.join(dir, entry.name);
|
|
12
|
+
if (entry.isDirectory() && recursive && depth < maxDepth) {
|
|
13
|
+
files.push(...await _collect(entryPath, recursive, maxDepth, depth + 1));
|
|
14
|
+
}
|
|
15
|
+
else if (entry.isFile()) {
|
|
16
|
+
files.push(entryPath);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return files;
|
|
20
|
+
}
|
|
21
|
+
export function formatBytes(bytes) {
|
|
22
|
+
if (bytes >= 1024 * 1024)
|
|
23
|
+
return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
|
|
24
|
+
if (bytes >= 1024)
|
|
25
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
26
|
+
return `${bytes} B`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=fs-collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-collect.js","sourceRoot":"","sources":["../../src/utils/fs-collect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAOxB,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,UAA0B,EAAE;IAE5B,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC3D,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,GAAW,EACX,SAAkB,EAClB,QAAgB,EAChB,KAAa;IAEb,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,SAAS,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1E,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export type NamingConvention = 'kebab-case' | 'snake_case' | 'camelCase' | 'PascalCase' | 'lowercase' | 'UPPERCASE';
|
|
2
2
|
export declare function applyNamingConvention(text: string, convention: NamingConvention): string;
|
|
3
|
+
/**
|
|
4
|
+
* Replaces Windows-illegal filename characters (< > : " / \ | ? *)
|
|
5
|
+
* with spaces so the subsequent naming-convention pass can normalise them
|
|
6
|
+
* into hyphens, underscores, or remove them as appropriate.
|
|
7
|
+
* Safe to call on all platforms — acts as a no-op when none are present.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stripWindowsIllegalChars(name: string): string;
|
|
3
10
|
export declare function getNamingInstructions(convention: NamingConvention): string;
|
|
4
11
|
//# sourceMappingURL=naming-conventions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming-conventions.d.ts","sourceRoot":"","sources":["../../src/utils/naming-conventions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAmDxF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAW1E"}
|
|
1
|
+
{"version":3,"file":"naming-conventions.d.ts","sourceRoot":"","sources":["../../src/utils/naming-conventions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAEpH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAmDxF;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAW1E"}
|
|
@@ -41,6 +41,15 @@ export function applyNamingConvention(text, convention) {
|
|
|
41
41
|
return normalized.replace(/\s+/g, '-').toLowerCase(); // Default to kebab-case
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Replaces Windows-illegal filename characters (< > : " / \ | ? *)
|
|
46
|
+
* with spaces so the subsequent naming-convention pass can normalise them
|
|
47
|
+
* into hyphens, underscores, or remove them as appropriate.
|
|
48
|
+
* Safe to call on all platforms — acts as a no-op when none are present.
|
|
49
|
+
*/
|
|
50
|
+
export function stripWindowsIllegalChars(name) {
|
|
51
|
+
return name.replace(/[<>:"/\\|?*]/g, ' ');
|
|
52
|
+
}
|
|
44
53
|
export function getNamingInstructions(convention) {
|
|
45
54
|
const instructions = {
|
|
46
55
|
'kebab-case': 'Use lowercase with hyphens between words (e.g., "meeting-notes-2024")',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naming-conventions.js","sourceRoot":"","sources":["../../src/utils/naming-conventions.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,UAA4B;IAC9E,4EAA4E;IAC5E,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,2CAA2C;SACpE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM,mBAAmB;SAC7C,IAAI,EAAE,CAAC;IAEV,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1B,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1B,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,KAAK,CAAC,UAAU,CAAC;iBACjB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnB,KAAK,KAAK,CAAC;gBACT,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAC/D;iBACA,IAAI,CAAC,EAAE,CAAC,CAAC;QAEd,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,KAAK,CAAC,UAAU,CAAC;iBACjB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBACvE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEd,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE1B,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE1B;YACE,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,wBAAwB;IAClF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA4B;IAChE,MAAM,YAAY,GAAG;QACnB,YAAY,EAAE,uEAAuE;QACrF,YAAY,EAAE,2EAA2E;QACzF,WAAW,EAAE,yEAAyE;QACtF,YAAY,EAAE,0EAA0E;QACxF,WAAW,EAAE,yEAAyE;QACtF,WAAW,EAAE,yEAAyE;KACvF,CAAC;IAEF,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"naming-conventions.js","sourceRoot":"","sources":["../../src/utils/naming-conventions.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,UAA4B;IAC9E,4EAA4E;IAC5E,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,2CAA2C;SACpE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM,mBAAmB;SAC7C,IAAI,EAAE,CAAC;IAEV,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1B,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE1B,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,KAAK,CAAC,UAAU,CAAC;iBACjB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnB,KAAK,KAAK,CAAC;gBACT,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAC/D;iBACA,IAAI,CAAC,EAAE,CAAC,CAAC;QAEd,KAAK,YAAY;YACf,OAAO,UAAU;iBACd,KAAK,CAAC,UAAU,CAAC;iBACjB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBACvE,IAAI,CAAC,EAAE,CAAC,CAAC;QAEd,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE1B,KAAK,WAAW;YACd,OAAO,UAAU;iBACd,WAAW,EAAE;iBACb,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;iBACnB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE1B;YACE,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,wBAAwB;IAClF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA4B;IAChE,MAAM,YAAY,GAAG;QACnB,YAAY,EAAE,uEAAuE;QACrF,YAAY,EAAE,2EAA2E;QACzF,WAAW,EAAE,yEAAyE;QACtF,YAAY,EAAE,0EAA0E;QACxF,WAAW,EAAE,yEAAyE;QACtF,WAAW,EAAE,yEAAyE;KACvF,CAAC;IAEF,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type OrganizeBy = 'ext' | 'date' | 'size';
|
|
2
|
+
export interface OrganizeMapping {
|
|
3
|
+
sourcePath: string;
|
|
4
|
+
destPath: string;
|
|
5
|
+
reason: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function computeOrganizeMappings(directory: string, by: OrganizeBy, recursive: boolean): Promise<OrganizeMapping[]>;
|
|
8
|
+
//# sourceMappingURL=organize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organize.d.ts","sourceRoot":"","sources":["../../src/utils/organize.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,eAAe,EAAE,CAAC,CAiB5B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { collectFiles } from './fs-collect.js';
|
|
4
|
+
export async function computeOrganizeMappings(directory, by, recursive) {
|
|
5
|
+
const files = await collectFiles(directory, { recursive });
|
|
6
|
+
const mappings = [];
|
|
7
|
+
for (const filePath of files) {
|
|
8
|
+
const stat = await fs.stat(filePath);
|
|
9
|
+
const subDir = getSubDir(filePath, by, stat);
|
|
10
|
+
const destDir = path.join(directory, subDir);
|
|
11
|
+
const destPath = path.join(destDir, path.basename(filePath));
|
|
12
|
+
// Skip if the file is already directly inside the correct subfolder
|
|
13
|
+
if (path.dirname(filePath) === destDir)
|
|
14
|
+
continue;
|
|
15
|
+
mappings.push({ sourcePath: filePath, destPath, reason: subDir });
|
|
16
|
+
}
|
|
17
|
+
return mappings;
|
|
18
|
+
}
|
|
19
|
+
function getSubDir(filePath, by, stat) {
|
|
20
|
+
switch (by) {
|
|
21
|
+
case 'ext': {
|
|
22
|
+
const ext = path.extname(filePath).toLowerCase().slice(1);
|
|
23
|
+
return ext || 'other';
|
|
24
|
+
}
|
|
25
|
+
case 'date': {
|
|
26
|
+
const d = stat.mtime;
|
|
27
|
+
const y = d.getUTCFullYear();
|
|
28
|
+
const m = String(d.getUTCMonth() + 1).padStart(2, '0');
|
|
29
|
+
return path.join(String(y), m);
|
|
30
|
+
}
|
|
31
|
+
case 'size': {
|
|
32
|
+
const bytes = stat.size ?? 0;
|
|
33
|
+
if (bytes < 1024 * 1024)
|
|
34
|
+
return 'small';
|
|
35
|
+
if (bytes < 50 * 1024 * 1024)
|
|
36
|
+
return 'medium';
|
|
37
|
+
return 'large';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=organize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organize.js","sourceRoot":"","sources":["../../src/utils/organize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,EAAc,EACd,SAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7D,oEAAoE;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO;YAAE,SAAS;QAEjD,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAChB,QAAgB,EAChB,EAAc,EACd,IAAyC;IAEzC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,IAAI,OAAO,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAI,IAAY,CAAC,IAAI,IAAI,CAAC,CAAC;YACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO,OAAO,CAAC;YACxC,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-rename.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAOtE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function parsePattern(pattern) {
|
|
2
|
+
const sedMatch = pattern.match(/^s\/((?:[^/\\]|\\.)*)\/((?:[^/\\]|\\.)*)\/([gimu]*)$/);
|
|
3
|
+
if (sedMatch) {
|
|
4
|
+
const [, find, replace, flags] = sedMatch;
|
|
5
|
+
return { find: new RegExp(find, flags || undefined), replace };
|
|
6
|
+
}
|
|
7
|
+
const colonIdx = pattern.indexOf(':');
|
|
8
|
+
if (colonIdx > 0) {
|
|
9
|
+
const find = pattern.slice(0, colonIdx);
|
|
10
|
+
const replace = pattern.slice(colonIdx + 1);
|
|
11
|
+
return { find: new RegExp(find.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), replace };
|
|
12
|
+
}
|
|
13
|
+
throw new Error(`Invalid pattern format: "${pattern}". Use s/find/replace/flags or find:replace`);
|
|
14
|
+
}
|
|
15
|
+
export function applyPatterns(stem, patterns) {
|
|
16
|
+
let result = stem;
|
|
17
|
+
for (const pattern of patterns) {
|
|
18
|
+
const { find, replace } = parsePattern(pattern);
|
|
19
|
+
result = result.replace(find, replace);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=pattern-rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-rename.js","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACvF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,6CAA6C,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAkB;IAC5D,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.d.ts","sourceRoot":"","sources":["../../src/utils/sanitizer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,gBAA+B,GAAG,MAAM,CAOlG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { applyNamingConvention, stripWindowsIllegalChars } from './naming-conventions.js';
|
|
2
|
+
export function sanitizeFilename(stem, convention = 'kebab-case') {
|
|
3
|
+
let result = stem.normalize('NFC');
|
|
4
|
+
result = stripWindowsIllegalChars(result);
|
|
5
|
+
result = result.replace(/[\x00-\x1F\x7F]/g, '');
|
|
6
|
+
result = applyNamingConvention(result, convention);
|
|
7
|
+
if (result.length > 200)
|
|
8
|
+
result = result.slice(0, 200);
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../src/utils/sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAG1F,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,aAA+B,YAAY;IACxF,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TypeStats {
|
|
2
|
+
ext: string;
|
|
3
|
+
count: number;
|
|
4
|
+
bytes: number;
|
|
5
|
+
}
|
|
6
|
+
export interface DirStats {
|
|
7
|
+
totalFiles: number;
|
|
8
|
+
totalBytes: number;
|
|
9
|
+
byType: TypeStats[];
|
|
10
|
+
largest: Array<{
|
|
11
|
+
path: string;
|
|
12
|
+
bytes: number;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare function computeStats(directory: string, recursive?: boolean): Promise<DirStats>;
|
|
16
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,QAAQ,CAAC,CAyBnB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { collectFiles } from './fs-collect.js';
|
|
4
|
+
export async function computeStats(directory, recursive = false) {
|
|
5
|
+
const filePaths = await collectFiles(directory, { recursive });
|
|
6
|
+
const typeMap = new Map();
|
|
7
|
+
const allFiles = [];
|
|
8
|
+
for (const filePath of filePaths) {
|
|
9
|
+
const stat = await fs.stat(filePath);
|
|
10
|
+
const ext = path.extname(filePath).toLowerCase() || '(no ext)';
|
|
11
|
+
const entry = typeMap.get(ext) ?? { count: 0, bytes: 0 };
|
|
12
|
+
typeMap.set(ext, { count: entry.count + 1, bytes: entry.bytes + stat.size });
|
|
13
|
+
allFiles.push({ path: filePath, bytes: stat.size });
|
|
14
|
+
}
|
|
15
|
+
allFiles.sort((a, b) => b.bytes - a.bytes);
|
|
16
|
+
const byType = [...typeMap.entries()]
|
|
17
|
+
.map(([ext, { count, bytes }]) => ({ ext, count, bytes }))
|
|
18
|
+
.sort((a, b) => b.bytes - a.bytes);
|
|
19
|
+
return {
|
|
20
|
+
totalFiles: filePaths.length,
|
|
21
|
+
totalBytes: byType.reduce((sum, t) => sum + t.bytes, 0),
|
|
22
|
+
byType,
|
|
23
|
+
largest: allFiles.slice(0, 10)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAe/C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,YAAqB,KAAK;IAE1B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4C,CAAC;IACpE,MAAM,QAAQ,GAA2C,EAAE,CAAC;IAE5D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAgB,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,MAAM;QAC5B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM;QACN,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amirdaraee/namewise",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@anthropic-ai/sdk": "^0.61.0",
|
|
67
67
|
"canvas": "3.2.3",
|
|
68
|
+
"chokidar": "5.0.0",
|
|
68
69
|
"commander": "14.0.3",
|
|
69
70
|
"exceljs": "^4.4.0",
|
|
70
71
|
"fs-extra": "11.3.4",
|