@amirdaraee/namewise 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +6 -6
  3. package/dist/cli/clean-empty.d.ts.map +1 -1
  4. package/dist/cli/clean-empty.js +2 -3
  5. package/dist/cli/clean-empty.js.map +1 -1
  6. package/dist/cli/commands.d.ts.map +1 -1
  7. package/dist/cli/commands.js +1 -20
  8. package/dist/cli/commands.js.map +1 -1
  9. package/dist/cli/config-cmd.d.ts.map +1 -1
  10. package/dist/cli/config-cmd.js +4 -3
  11. package/dist/cli/config-cmd.js.map +1 -1
  12. package/dist/cli/dedup.d.ts.map +1 -1
  13. package/dist/cli/dedup.js +3 -11
  14. package/dist/cli/dedup.js.map +1 -1
  15. package/dist/cli/diff.d.ts.map +1 -1
  16. package/dist/cli/diff.js +3 -7
  17. package/dist/cli/diff.js.map +1 -1
  18. package/dist/cli/find.d.ts.map +1 -1
  19. package/dist/cli/find.js +2 -3
  20. package/dist/cli/find.js.map +1 -1
  21. package/dist/cli/flatten.d.ts.map +1 -1
  22. package/dist/cli/flatten.js +4 -11
  23. package/dist/cli/flatten.js.map +1 -1
  24. package/dist/cli/handle-cli-error.d.ts +7 -0
  25. package/dist/cli/handle-cli-error.d.ts.map +1 -0
  26. package/dist/cli/handle-cli-error.js +25 -0
  27. package/dist/cli/handle-cli-error.js.map +1 -0
  28. package/dist/cli/init.js +2 -2
  29. package/dist/cli/init.js.map +1 -1
  30. package/dist/cli/organize.d.ts.map +1 -1
  31. package/dist/cli/organize.js +4 -11
  32. package/dist/cli/organize.js.map +1 -1
  33. package/dist/cli/rename.d.ts +4 -2
  34. package/dist/cli/rename.d.ts.map +1 -1
  35. package/dist/cli/rename.js +166 -227
  36. package/dist/cli/rename.js.map +1 -1
  37. package/dist/cli/sanitize.d.ts.map +1 -1
  38. package/dist/cli/sanitize.js +4 -12
  39. package/dist/cli/sanitize.js.map +1 -1
  40. package/dist/cli/shared-config.d.ts +60 -0
  41. package/dist/cli/shared-config.d.ts.map +1 -0
  42. package/dist/cli/shared-config.js +64 -0
  43. package/dist/cli/shared-config.js.map +1 -0
  44. package/dist/cli/stats.d.ts.map +1 -1
  45. package/dist/cli/stats.js +2 -4
  46. package/dist/cli/stats.js.map +1 -1
  47. package/dist/cli/tree.d.ts.map +1 -1
  48. package/dist/cli/tree.js +2 -3
  49. package/dist/cli/tree.js.map +1 -1
  50. package/dist/cli/watch.d.ts +3 -1
  51. package/dist/cli/watch.d.ts.map +1 -1
  52. package/dist/cli/watch.js +19 -63
  53. package/dist/cli/watch.js.map +1 -1
  54. package/dist/parsers/pdf-parser.d.ts.map +1 -1
  55. package/dist/parsers/pdf-parser.js +39 -24
  56. package/dist/parsers/pdf-parser.js.map +1 -1
  57. package/dist/services/base-cloud-service.d.ts +32 -0
  58. package/dist/services/base-cloud-service.d.ts.map +1 -0
  59. package/dist/services/base-cloud-service.js +73 -0
  60. package/dist/services/base-cloud-service.js.map +1 -0
  61. package/dist/services/base-local-service.d.ts +18 -0
  62. package/dist/services/base-local-service.d.ts.map +1 -0
  63. package/dist/services/base-local-service.js +81 -0
  64. package/dist/services/base-local-service.js.map +1 -0
  65. package/dist/services/claude-service.d.ts +8 -6
  66. package/dist/services/claude-service.d.ts.map +1 -1
  67. package/dist/services/claude-service.js +40 -98
  68. package/dist/services/claude-service.js.map +1 -1
  69. package/dist/services/lmstudio-service.d.ts +35 -9
  70. package/dist/services/lmstudio-service.d.ts.map +1 -1
  71. package/dist/services/lmstudio-service.js +23 -101
  72. package/dist/services/lmstudio-service.js.map +1 -1
  73. package/dist/services/ollama-service.d.ts +23 -9
  74. package/dist/services/ollama-service.d.ts.map +1 -1
  75. package/dist/services/ollama-service.js +16 -87
  76. package/dist/services/ollama-service.js.map +1 -1
  77. package/dist/services/openai-service.d.ts +8 -6
  78. package/dist/services/openai-service.d.ts.map +1 -1
  79. package/dist/services/openai-service.js +36 -94
  80. package/dist/services/openai-service.js.map +1 -1
  81. package/dist/utils/ai-name-sanitizer.d.ts +14 -0
  82. package/dist/utils/ai-name-sanitizer.d.ts.map +1 -0
  83. package/dist/utils/ai-name-sanitizer.js +39 -0
  84. package/dist/utils/ai-name-sanitizer.js.map +1 -0
  85. package/dist/utils/assert-directory.d.ts +9 -0
  86. package/dist/utils/assert-directory.d.ts.map +1 -0
  87. package/dist/utils/assert-directory.js +15 -0
  88. package/dist/utils/assert-directory.js.map +1 -0
  89. package/dist/utils/file-info.d.ts +8 -0
  90. package/dist/utils/file-info.d.ts.map +1 -0
  91. package/dist/utils/file-info.js +25 -0
  92. package/dist/utils/file-info.js.map +1 -0
  93. package/dist/utils/record-session.d.ts +18 -0
  94. package/dist/utils/record-session.d.ts.map +1 -0
  95. package/dist/utils/record-session.js +24 -0
  96. package/dist/utils/record-session.js.map +1 -0
  97. package/dist/utils/ui.d.ts.map +1 -1
  98. package/dist/utils/ui.js +1 -7
  99. package/dist/utils/ui.js.map +1 -1
  100. package/package.json +17 -18
@@ -0,0 +1,60 @@
1
+ import { Config } from '../types/index.js';
2
+ import { NamiwiseFileConfig } from '../utils/config-loader.js';
3
+ /**
4
+ * CLI options shared by the `rename` and `watch` subcommands, as parsed by
5
+ * Commander. Numeric flags arrive as strings (`--max-size 10` → `'10'`).
6
+ */
7
+ export interface SharedRenameOptions {
8
+ provider?: string;
9
+ apiKey?: string;
10
+ case?: string;
11
+ template?: string;
12
+ name?: string;
13
+ date?: string;
14
+ dryRun?: boolean;
15
+ maxSize?: string;
16
+ baseUrl?: string;
17
+ model?: string;
18
+ recursive?: boolean;
19
+ depth?: string;
20
+ concurrency?: string;
21
+ output?: string;
22
+ pattern?: string | string[];
23
+ /** Commander sets `ai: false` when --no-ai is passed. */
24
+ ai?: boolean;
25
+ log?: boolean;
26
+ language?: string;
27
+ context?: string;
28
+ }
29
+ /** Options for the `rename` subcommand (adds the batch-rename flags). */
30
+ export interface RenameOptions extends SharedRenameOptions {
31
+ sequence?: boolean;
32
+ sequencePrefix?: string;
33
+ prefix?: string;
34
+ suffix?: string;
35
+ dateStamp?: 'created' | 'modified';
36
+ strip?: string;
37
+ truncate?: string;
38
+ }
39
+ /** Options for the `watch` subcommand. */
40
+ export type WatchOptions = SharedRenameOptions;
41
+ /** Resolve the AI provider: CLI flag > config file > default (claude). */
42
+ export declare function resolveProvider(options: SharedRenameOptions, fileConfig: NamiwiseFileConfig): Config['aiProvider'];
43
+ /** Whether the provider needs an API key (cloud providers, unless --no-ai). */
44
+ export declare function providerRequiresApiKey(provider: Config['aiProvider'], aiDisabled: boolean): boolean;
45
+ /**
46
+ * Resolve the API key for a provider. Returns `initialKey` unchanged when it
47
+ * is set or when no key is required; otherwise falls back to the environment
48
+ * (CLAUDE_API_KEY/ANTHROPIC_API_KEY for claude, OPENAI_API_KEY for openai).
49
+ *
50
+ * Never prompts — `rename` layers its interactive prompt on top of this,
51
+ * `watch` deliberately does not.
52
+ */
53
+ export declare function resolveApiKey(provider: Config['aiProvider'], initialKey: string | undefined, aiDisabled: boolean): string | undefined;
54
+ /**
55
+ * Build the runtime Config from CLI options and the cascading file config
56
+ * (CLI flags override file config which overrides defaults). Shared by
57
+ * `rename` and `watch`, which previously each copy-pasted this literal.
58
+ */
59
+ export declare function buildConfig(options: SharedRenameOptions, fileConfig: NamiwiseFileConfig, provider: Config['aiProvider'], apiKey: string | undefined): Config;
60
+ //# sourceMappingURL=shared-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-config.d.ts","sourceRoot":"","sources":["../../src/cli/shared-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4B,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,yDAAyD;IACzD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAE/C,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAAC,YAAY,CAAC,CAEtB;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,UAAU,EAAE,OAAO,GAClB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,OAAO,GAClB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,CA0BR"}
@@ -0,0 +1,64 @@
1
+ import { DocumentParserFactory } from '../parsers/factory.js';
2
+ /** Resolve the AI provider: CLI flag > config file > default (claude). */
3
+ export function resolveProvider(options, fileConfig) {
4
+ return (options.provider ?? fileConfig.provider ?? 'claude');
5
+ }
6
+ /** Whether the provider needs an API key (cloud providers, unless --no-ai). */
7
+ export function providerRequiresApiKey(provider, aiDisabled) {
8
+ return ['claude', 'openai'].includes(provider) && !aiDisabled;
9
+ }
10
+ /**
11
+ * Resolve the API key for a provider. Returns `initialKey` unchanged when it
12
+ * is set or when no key is required; otherwise falls back to the environment
13
+ * (CLAUDE_API_KEY/ANTHROPIC_API_KEY for claude, OPENAI_API_KEY for openai).
14
+ *
15
+ * Never prompts — `rename` layers its interactive prompt on top of this,
16
+ * `watch` deliberately does not.
17
+ */
18
+ export function resolveApiKey(provider, initialKey, aiDisabled) {
19
+ if (!providerRequiresApiKey(provider, aiDisabled) || initialKey) {
20
+ return initialKey;
21
+ }
22
+ if (provider === 'claude') {
23
+ const envKey = process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY;
24
+ if (envKey)
25
+ return envKey;
26
+ }
27
+ else if (provider === 'openai' && process.env.OPENAI_API_KEY) {
28
+ return process.env.OPENAI_API_KEY;
29
+ }
30
+ return initialKey;
31
+ }
32
+ /**
33
+ * Build the runtime Config from CLI options and the cascading file config
34
+ * (CLI flags override file config which overrides defaults). Shared by
35
+ * `rename` and `watch`, which previously each copy-pasted this literal.
36
+ */
37
+ export function buildConfig(options, fileConfig, provider, apiKey) {
38
+ return {
39
+ aiProvider: provider,
40
+ apiKey,
41
+ maxFileSize: parseInt(options.maxSize ?? String(fileConfig.maxSize ?? '10')) * 1024 * 1024,
42
+ supportedExtensions: new DocumentParserFactory().getSupportedExtensions(),
43
+ dryRun: options.dryRun ?? fileConfig.dryRun ?? false,
44
+ namingConvention: (options.case ?? fileConfig.case ?? 'kebab-case'),
45
+ templateOptions: {
46
+ category: (options.template ?? fileConfig.template ?? 'general'),
47
+ personalName: options.name ?? fileConfig.name,
48
+ dateFormat: (options.date ?? fileConfig.date ?? 'none')
49
+ },
50
+ localLLMConfig: {
51
+ baseUrl: options.baseUrl ?? fileConfig.baseUrl,
52
+ model: options.model ?? fileConfig.model
53
+ },
54
+ recursive: options.recursive ?? fileConfig.recursive ?? false,
55
+ depth: options.depth !== undefined ? parseInt(options.depth) : fileConfig.depth,
56
+ concurrency: parseInt(options.concurrency ?? String(fileConfig.concurrency ?? '3')),
57
+ outputPath: options.output ?? fileConfig.output,
58
+ patterns: Array.isArray(options.pattern) ? options.pattern : (options.pattern ? [options.pattern] : []),
59
+ noAi: options.ai === false,
60
+ language: options.language ?? fileConfig.language,
61
+ context: options.context ?? fileConfig.context
62
+ };
63
+ }
64
+ //# sourceMappingURL=shared-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-config.js","sourceRoot":"","sources":["../../src/cli/shared-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAiCf"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
package/dist/cli/stats.js CHANGED
@@ -1,12 +1,10 @@
1
- import { promises as fs } from 'fs';
2
1
  import path from 'path';
3
2
  import { computeStats } from '../utils/stats.js';
4
3
  import { formatBytes } from '../utils/fs-collect.js';
4
+ import { assertDirectory } from '../utils/assert-directory.js';
5
5
  import * as ui from '../utils/ui.js';
6
6
  export async function statsCommand(directory, options = {}) {
7
- const stat = await fs.stat(directory);
8
- if (!stat.isDirectory())
9
- throw new Error(`${directory} is not a directory`);
7
+ await assertDirectory(directory);
10
8
  const stats = await computeStats(directory, options.recursive ?? false);
11
9
  if (stats.totalFiles === 0) {
12
10
  ui.info('No files found.');
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/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,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,UAAmC,EAAE;IAErC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,EAAE,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,UAAU,cAAc,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEnF,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC;YAC9B,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI;YACzD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,UAAmC,EAAE;IAErC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,EAAE,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,UAAU,cAAc,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEnF,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC;YAC9B,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI;YACzD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAMf"}
package/dist/cli/tree.js CHANGED
@@ -1,11 +1,10 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import path from 'path';
3
3
  import { formatBytes } from '../utils/fs-collect.js';
4
+ import { assertDirectory } from '../utils/assert-directory.js';
4
5
  import * as ui from '../utils/ui.js';
5
6
  export async function treeCommand(directory, options = {}) {
6
- const stat = await fs.stat(directory);
7
- if (!stat.isDirectory())
8
- throw new Error(`${directory} is not a directory`);
7
+ await assertDirectory(directory);
9
8
  const maxDepth = options.depth ?? Infinity;
10
9
  ui.info(`\n${path.resolve(directory)}`);
11
10
  await printTree(directory, '', 0, maxDepth);
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,UAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC3C,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,GAAW,EACX,MAAc,EACd,KAAa,EACb,QAAgB;IAEhB,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO;IAE9B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,uCAAuC;QACvC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,OAAO,OAAO,CAAC,SAAS,aAAa,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvH,MAAM,SAAS,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;gBAC3B,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,SAAS,EAAE,CAAC;gBACZ,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
- export declare function watchDirectory(directory: string, options: any): Promise<void>;
1
+ import { WatchOptions } from './shared-config.js';
2
+ export type { WatchOptions } from './shared-config.js';
3
+ export declare function watchDirectory(directory: string, options: WatchOptions): Promise<void>;
2
4
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAWA,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAkInF"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAA+C,MAAM,oBAAoB,CAAC;AAE/F,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF5F"}
package/dist/cli/watch.js CHANGED
@@ -1,57 +1,33 @@
1
1
  import path from 'path';
2
- import { promises as fs } from 'fs';
3
2
  import chokidar from 'chokidar';
4
3
  import * as ui from '../utils/ui.js';
5
4
  import { DocumentParserFactory } from '../parsers/factory.js';
6
5
  import { AIServiceFactory } from '../services/ai-factory.js';
7
6
  import { FileRenamer } from '../services/file-renamer.js';
8
7
  import { loadConfig } from '../utils/config-loader.js';
9
- import { appendHistory } from '../utils/history.js';
8
+ import { recordSession } from '../utils/record-session.js';
9
+ import { assertDirectory } from '../utils/assert-directory.js';
10
+ import { statToFileInfo } from '../utils/file-info.js';
11
+ import { resolveProvider, resolveApiKey, buildConfig } from './shared-config.js';
10
12
  export async function watchDirectory(directory, options) {
11
13
  // Validate directory
12
- const stats = await fs.stat(directory);
13
- if (!stats.isDirectory()) {
14
- throw new Error(`${directory} is not a directory`);
15
- }
14
+ await assertDirectory(directory);
16
15
  const absDir = path.resolve(directory);
17
16
  // Load cascading config file
18
17
  const fileConfig = await loadConfig(absDir);
19
18
  // Resolve provider
20
- const provider = (options.provider ?? fileConfig.provider ?? 'claude');
21
- // Get API key for cloud providers
22
- let apiKey = options.apiKey;
23
- const requiresApiKey = ['claude', 'openai'].includes(provider) && options.ai !== false;
24
- if (requiresApiKey && !apiKey) {
25
- if (provider === 'claude' && (process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY)) {
26
- apiKey = process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY;
27
- }
28
- else if (provider === 'openai' && process.env.OPENAI_API_KEY) {
29
- apiKey = process.env.OPENAI_API_KEY;
30
- }
31
- }
32
- // Build config (mirrors renameFiles logic)
19
+ const provider = resolveProvider(options, fileConfig);
20
+ // Get API key for cloud providers. Unlike `rename`, watch never prompts for
21
+ // a missing key and does not read an apiKey from the config file.
22
+ const apiKey = resolveApiKey(provider, options.apiKey, options.ai === false);
23
+ // Build config (shared with renameFiles)
33
24
  const config = {
34
- aiProvider: provider,
35
- apiKey,
36
- maxFileSize: parseInt(options.maxSize ?? String(fileConfig.maxSize ?? '10')) * 1024 * 1024,
37
- supportedExtensions: new DocumentParserFactory().getSupportedExtensions(),
25
+ ...buildConfig(options, fileConfig, provider, apiKey),
26
+ // watch historically ignores the config-file dryRun default and the
27
+ // language/context settings preserve that behaviour.
38
28
  dryRun: options.dryRun ?? false,
39
- namingConvention: (options.case ?? fileConfig.case ?? 'kebab-case'),
40
- templateOptions: {
41
- category: (options.template ?? fileConfig.template ?? 'general'),
42
- personalName: options.name ?? fileConfig.name,
43
- dateFormat: (options.date ?? fileConfig.date ?? 'none')
44
- },
45
- localLLMConfig: {
46
- baseUrl: options.baseUrl ?? fileConfig.baseUrl,
47
- model: options.model ?? fileConfig.model
48
- },
49
- recursive: options.recursive ?? fileConfig.recursive ?? false,
50
- depth: options.depth !== undefined ? parseInt(options.depth) : fileConfig.depth,
51
- concurrency: parseInt(options.concurrency ?? String(fileConfig.concurrency ?? '3')),
52
- outputPath: options.output ?? fileConfig.output,
53
- patterns: Array.isArray(options.pattern) ? options.pattern : (options.pattern ? [options.pattern] : []),
54
- noAi: options.ai === false
29
+ language: undefined,
30
+ context: undefined
55
31
  };
56
32
  // Determine supported extensions from the parser factory
57
33
  const parserFactory = new DocumentParserFactory(config);
@@ -77,35 +53,15 @@ export async function watchDirectory(directory, options) {
77
53
  const fileName = path.basename(filePath);
78
54
  ui.dim(`Detected: ${fileName}`);
79
55
  try {
80
- const fileStat = await fs.stat(filePath);
81
- const extension = path.extname(fileName).toLowerCase();
82
- const parentFolder = path.basename(path.dirname(filePath));
83
- const fullPath = path.resolve(filePath);
84
- const folderPath = path.dirname(fullPath).split(path.sep).filter(p => p);
85
- const fileInfo = {
86
- path: filePath,
87
- name: fileName,
88
- extension,
89
- size: fileStat.size,
90
- createdAt: fileStat.birthtime,
91
- modifiedAt: fileStat.mtime,
92
- accessedAt: fileStat.atime,
93
- parentFolder,
94
- folderPath: folderPath.slice(-3),
95
- documentMetadata: undefined
96
- };
56
+ const fileInfo = await statToFileInfo(filePath);
97
57
  const { results } = await renamer.renameFiles([fileInfo]);
98
58
  const result = results[0];
99
59
  if (result?.success && result.newPath !== result.originalPath) {
100
60
  const newName = path.basename(result.newPath);
101
61
  ui.success(`${fileName} → ${newName}`);
102
- await appendHistory({
103
- id: new Date().toISOString(),
104
- timestamp: new Date().toISOString(),
105
- directory: absDir,
106
- dryRun: config.dryRun,
107
- renames: [{ originalPath: result.originalPath, newPath: result.newPath }]
108
- });
62
+ await recordSession(absDir, config.dryRun, [
63
+ { originalPath: result.originalPath, newPath: result.newPath }
64
+ ]);
109
65
  }
110
66
  else if (result?.success) {
111
67
  ui.dim(`No rename needed for: ${fileName}`);
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAgB,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAI/F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAqB;IAC3E,qBAAqB;IACrB,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAE5C,mBAAmB;IACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEtD,4EAA4E;IAC5E,kEAAkE;IAClE,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAE7E,yCAAyC;IACzC,MAAM,MAAM,GAAW;QACrB,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;QACrD,oEAAoE;QACpE,uDAAuD;QACvD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,SAAS;KACnB,CAAC;IAEF,yDAAyD;IACzD,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,mBAAmB,GAAG,aAAa,CAAC,sBAAsB,EAAE,CAAC;IAEnE,oDAAoD;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACtH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAElE,8BAA8B;IAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,2EAA2E;YAC3E,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YACvB,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,YAAY,MAAM,iBAAiB,CAAC,CAAC;IAE7C,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,EAAE,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAEhD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9C,EAAE,CAAC,OAAO,CAAC,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC;gBACzC,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;oBACzC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;iBAC/D,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC3B,EAAE,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,EAAE,CAAC,KAAK,CAAC,oBAAoB,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC9B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAIlF,qBAAa,SAAU,YAAW,cAAc;;IAK9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA4DnD,OAAO,CAAC,SAAS;CAmBlB"}
1
+ {"version":3,"file":"pdf-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAIlF,qBAAa,SAAU,YAAW,cAAc;;IAK9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA8EnD,OAAO,CAAC,SAAS;CAmBlB"}
@@ -11,24 +11,44 @@ export class PDFParser {
11
11
  }
12
12
  async parse(filePath) {
13
13
  try {
14
- const pdfExtraction = await import('pdf-extraction');
15
- const extract = pdfExtraction.default;
16
- const dataBuffer = fs.readFileSync(filePath);
14
+ const { getDocument } = await import('pdfjs-dist/legacy/build/pdf.mjs');
15
+ const raw = fs.readFileSync(filePath);
16
+ // pdfjs may transfer the buffer to its (fake) worker, so hand it a copy
17
+ // rather than the fs buffer.
18
+ const data = new Uint8Array(raw);
17
19
  // Suppress pdfjs noise (both stderr and console.warn) for the entire PDF
18
- // pipeline — the "TT: undefined function" warning can come from either
19
- // pdf-extraction (text path) or pdf-to-png-converter (scanned path).
20
+ // pipeline — warnings can come from either the text-extraction path or
21
+ // pdf-to-png-converter (scanned path).
20
22
  const origStderrWrite = process.stderr.write?.bind(process.stderr);
21
23
  const origConsoleWarn = console.warn;
22
24
  process.stderr.write = () => true;
23
25
  console.warn = () => { };
24
- let data;
25
26
  let content = '';
27
+ let numPages = 0;
28
+ let info = {};
26
29
  try {
27
- data = await extract(dataBuffer, {});
28
- content = data.text?.trim() || '';
30
+ const loadingTask = getDocument({ data, verbosity: 0 });
31
+ const doc = await loadingTask.promise;
32
+ try {
33
+ numPages = doc.numPages;
34
+ const meta = await doc.getMetadata().catch(() => undefined);
35
+ info = meta?.info ?? {};
36
+ const pageTexts = [];
37
+ for (let i = 1; i <= numPages; i++) {
38
+ const page = await doc.getPage(i);
39
+ const textContent = await page.getTextContent();
40
+ pageTexts.push(textContent.items
41
+ .map((item) => (typeof item.str === 'string' ? item.str : ''))
42
+ .join(' '));
43
+ }
44
+ content = pageTexts.join('\n\n').trim();
45
+ }
46
+ finally {
47
+ await loadingTask.destroy();
48
+ }
29
49
  if (PDFToImageConverter.isScannedPDF(content)) {
30
50
  try {
31
- const imageBase64 = await PDFToImageConverter.convertFirstPageToBase64(dataBuffer);
51
+ const imageBase64 = await PDFToImageConverter.convertFirstPageToBase64(raw);
32
52
  content = `[SCANNED_PDF_IMAGE]:${imageBase64}`;
33
53
  }
34
54
  catch {
@@ -42,21 +62,16 @@ export class PDFParser {
42
62
  console.warn = origConsoleWarn;
43
63
  }
44
64
  const metadata = {};
45
- const pdfData = data;
46
- if (pdfData.meta) {
47
- if (pdfData.meta.info) {
48
- metadata.title = pdfData.meta.info.Title;
49
- metadata.author = pdfData.meta.info.Author;
50
- metadata.creator = pdfData.meta.info.Creator;
51
- metadata.subject = pdfData.meta.info.Subject;
52
- if (pdfData.meta.info.CreationDate)
53
- metadata.creationDate = this.parseDate(pdfData.meta.info.CreationDate);
54
- if (pdfData.meta.info.ModDate)
55
- metadata.modificationDate = this.parseDate(pdfData.meta.info.ModDate);
56
- }
57
- if (pdfData.numpages)
58
- metadata.pages = pdfData.numpages;
59
- }
65
+ metadata.title = info.Title;
66
+ metadata.author = info.Author;
67
+ metadata.creator = info.Creator;
68
+ metadata.subject = info.Subject;
69
+ if (info.CreationDate)
70
+ metadata.creationDate = this.parseDate(info.CreationDate);
71
+ if (info.ModDate)
72
+ metadata.modificationDate = this.parseDate(info.ModDate);
73
+ if (numPages)
74
+ metadata.pages = numPages;
60
75
  if (content)
61
76
  metadata.wordCount = content.split(/\s+/).filter((w) => w.length > 0).length;
62
77
  return { content, metadata };
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-parser.js","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdf-parser.js","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
+ /** Shape shared by the Anthropic and OpenAI SDK error classes. */
3
+ export interface CloudApiError {
4
+ status?: number;
5
+ message: string;
6
+ }
7
+ export interface TokenUsage {
8
+ inputTokens?: number;
9
+ outputTokens?: number;
10
+ }
11
+ /**
12
+ * Shared skeleton for cloud AI providers (Claude, OpenAI): image-data
13
+ * validation, prompt building, filename sanitization, and error mapping.
14
+ * Subclasses supply the SDK calls and response/token extraction.
15
+ */
16
+ export declare abstract class BaseCloudService<TResponse> implements AIProvider {
17
+ readonly name: string;
18
+ protected model: string;
19
+ protected constructor(name: string, model: string);
20
+ generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
21
+ /** Sends a text-only completion request to the provider SDK. */
22
+ protected abstract createTextCompletion(prompt: string): Promise<TResponse>;
23
+ /** Sends a vision completion request (prompt + image) to the provider SDK. */
24
+ protected abstract createImageCompletion(prompt: string, imageData: string): Promise<TResponse>;
25
+ /** Extracts the suggested filename text from the SDK response. */
26
+ protected abstract extractSuggestedName(response: TResponse): string;
27
+ /** Extracts token usage from the SDK response. */
28
+ protected abstract extractTokenUsage(response: TResponse): TokenUsage;
29
+ /** Returns the error if it is the provider SDK's APIError, otherwise undefined. */
30
+ protected abstract asApiError(error: unknown): CloudApiError | undefined;
31
+ }
32
+ //# sourceMappingURL=base-cloud-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-cloud-service.d.ts","sourceRoot":"","sources":["../../src/services/base-cloud-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMvE,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,8BAAsB,gBAAgB,CAAC,SAAS,CAAE,YAAW,UAAU;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IAExB,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK3C,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,GAAE,MAAqB,EACvC,QAAQ,GAAE,MAAkB,EAC5B,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IA6DxB,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAE3E,8EAA8E;IAC9E,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAE/F,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM;IAEpE,kDAAkD;IAClD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,GAAG,UAAU;IAErE,mFAAmF;IACnF,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS;CACzE"}
@@ -0,0 +1,73 @@
1
+ import { AuthError, NetworkError, RateLimitError } from '../errors.js';
2
+ import { buildFileNamePrompt } from '../utils/ai-prompts.js';
3
+ import { sanitizeCloudFileName } from '../utils/ai-name-sanitizer.js';
4
+ /**
5
+ * Shared skeleton for cloud AI providers (Claude, OpenAI): image-data
6
+ * validation, prompt building, filename sanitization, and error mapping.
7
+ * Subclasses supply the SDK calls and response/token extraction.
8
+ */
9
+ export class BaseCloudService {
10
+ name;
11
+ model;
12
+ constructor(name, model) {
13
+ this.name = name;
14
+ this.model = model;
15
+ }
16
+ async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language, context, imageData) {
17
+ const convention = namingConvention;
18
+ const fileCategory = category;
19
+ try {
20
+ let response;
21
+ if (imageData) {
22
+ if (!imageData.startsWith('data:image/') || !imageData.includes(',')) {
23
+ throw new NetworkError('Invalid image data format');
24
+ }
25
+ const prompt = buildFileNamePrompt({
26
+ content: 'Analyze this image and generate an appropriate filename based on what you see.',
27
+ originalName,
28
+ namingConvention: convention,
29
+ category: fileCategory,
30
+ fileInfo,
31
+ language,
32
+ context
33
+ });
34
+ response = await this.createImageCompletion(prompt, imageData);
35
+ }
36
+ else {
37
+ const prompt = buildFileNamePrompt({
38
+ content,
39
+ originalName,
40
+ namingConvention: convention,
41
+ category: fileCategory,
42
+ fileInfo,
43
+ language,
44
+ context
45
+ });
46
+ response = await this.createTextCompletion(prompt);
47
+ }
48
+ const suggestedName = this.extractSuggestedName(response);
49
+ const { inputTokens, outputTokens } = this.extractTokenUsage(response);
50
+ return {
51
+ name: sanitizeCloudFileName(suggestedName, convention),
52
+ inputTokens,
53
+ outputTokens
54
+ };
55
+ }
56
+ catch (error) {
57
+ if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError)
58
+ throw error;
59
+ const apiError = this.asApiError(error);
60
+ if (apiError) {
61
+ if (apiError.status === 401 || apiError.status === 403) {
62
+ throw new AuthError(`${this.name} authentication failed: ${apiError.message}`, { details: { status: apiError.status } });
63
+ }
64
+ if (apiError.status === 429) {
65
+ throw new RateLimitError(`${this.name} rate limit exceeded: ${apiError.message}`, { details: { status: apiError.status } });
66
+ }
67
+ throw new NetworkError(`${this.name} API error (${apiError.status}): ${apiError.message}`, { details: { status: apiError.status } });
68
+ }
69
+ throw new NetworkError(`Failed to generate filename with ${this.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=base-cloud-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-cloud-service.js","sourceRoot":"","sources":["../../src/services/base-cloud-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAatE;;;;GAIG;AACH,MAAM,OAAgB,gBAAgB;IAC3B,IAAI,CAAS;IACZ,KAAK,CAAS;IAExB,YAAsB,IAAY,EAAE,KAAa;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAe,EACf,YAAoB,EACpB,mBAA2B,YAAY,EACvC,WAAmB,SAAS,EAC5B,QAAmB,EACnB,QAAiB,EACjB,OAAgB,EAChB,SAAkB;QAElB,MAAM,UAAU,GAAG,gBAAoC,CAAC;QACxD,MAAM,YAAY,GAAG,QAAwB,CAAC;QAE9C,IAAI,CAAC;YACH,IAAI,QAAmB,CAAC;YAExB,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrE,MAAM,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAAC;gBACtD,CAAC;gBAED,MAAM,MAAM,GAAG,mBAAmB,CAAC;oBACjC,OAAO,EAAE,gFAAgF;oBACzF,YAAY;oBACZ,gBAAgB,EAAE,UAAU;oBAC5B,QAAQ,EAAE,YAAY;oBACtB,QAAQ;oBACR,QAAQ;oBACR,OAAO;iBACR,CAAC,CAAC;gBAEH,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,mBAAmB,CAAC;oBACjC,OAAO;oBACP,YAAY;oBACZ,gBAAgB,EAAE,UAAU;oBAC5B,QAAQ,EAAE,YAAY;oBACtB,QAAQ;oBACR,QAAQ;oBACR,OAAO;iBACR,CAAC,CAAC;gBAEH,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAEvE,OAAO;gBACL,IAAI,EAAE,qBAAqB,CAAC,aAAa,EAAE,UAAU,CAAC;gBACtD,WAAW;gBACX,YAAY;aACb,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,cAAc;gBAAE,MAAM,KAAK,CAAC;YAChH,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACvD,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,2BAA2B,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3H,CAAC;gBACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,CAAC,IAAI,yBAAyB,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9H,CAAC;gBACD,MAAM,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvI,CAAC;YACD,MAAM,IAAI,YAAY,CAAC,oCAAoC,IAAI,CAAC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzJ,CAAC;IACH,CAAC;CAgBF"}
@@ -0,0 +1,18 @@
1
+ import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
+ /**
3
+ * Shared skeleton for local AI providers (Ollama, LMStudio): localhost URL
4
+ * validation, HTTP request/status mapping, and the generateFileName flow.
5
+ * Subclasses supply the chat request payload and response extraction.
6
+ */
7
+ export declare abstract class BaseLocalService<TRequest, TResponse> implements AIProvider {
8
+ readonly name: string;
9
+ protected baseUrl: string;
10
+ protected model: string;
11
+ protected constructor(name: string, baseUrl: string, model: string);
12
+ private validateLocalUrl;
13
+ generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
14
+ /** Sends the chat request and returns the raw response content, if any. */
15
+ protected abstract requestCompletion(prompt: string, imageData?: string): Promise<string | undefined>;
16
+ protected makeRequest(endpoint: string, payload: TRequest): Promise<TResponse>;
17
+ }
18
+ //# sourceMappingURL=base-local-service.d.ts.map