@ducky7go/ducky-cli 0.0.4-dev.1 → 0.0.5-dev.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 (61) hide show
  1. package/README.md +47 -199
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/steam/index.d.ts +3 -0
  6. package/dist/commands/steam/index.d.ts.map +1 -0
  7. package/dist/commands/steam/index.js +21 -0
  8. package/dist/commands/steam/index.js.map +1 -0
  9. package/dist/commands/steam/push.d.ts +3 -0
  10. package/dist/commands/steam/push.d.ts.map +1 -0
  11. package/dist/commands/steam/push.js +29 -0
  12. package/dist/commands/steam/push.js.map +1 -0
  13. package/dist/commands/steam/validate.d.ts +3 -0
  14. package/dist/commands/steam/validate.d.ts.map +1 -0
  15. package/dist/commands/steam/validate.js +47 -0
  16. package/dist/commands/steam/validate.js.map +1 -0
  17. package/dist/formats/steam/config.d.ts +23 -0
  18. package/dist/formats/steam/config.d.ts.map +1 -0
  19. package/dist/formats/steam/config.js +32 -0
  20. package/dist/formats/steam/config.js.map +1 -0
  21. package/dist/formats/steam/metadata.d.ts +45 -0
  22. package/dist/formats/steam/metadata.d.ts.map +1 -0
  23. package/dist/formats/steam/metadata.js +293 -0
  24. package/dist/formats/steam/metadata.js.map +1 -0
  25. package/dist/formats/steam/parser.d.ts +20 -0
  26. package/dist/formats/steam/parser.d.ts.map +1 -0
  27. package/dist/formats/steam/parser.js +88 -0
  28. package/dist/formats/steam/parser.js.map +1 -0
  29. package/dist/formats/steam/progress-display.d.ts +38 -0
  30. package/dist/formats/steam/progress-display.d.ts.map +1 -0
  31. package/dist/formats/steam/progress-display.js +123 -0
  32. package/dist/formats/steam/progress-display.js.map +1 -0
  33. package/dist/formats/steam/progress.d.ts +79 -0
  34. package/dist/formats/steam/progress.d.ts.map +1 -0
  35. package/dist/formats/steam/progress.js +126 -0
  36. package/dist/formats/steam/progress.js.map +1 -0
  37. package/dist/formats/steam/push-handler.d.ts +22 -0
  38. package/dist/formats/steam/push-handler.d.ts.map +1 -0
  39. package/dist/formats/steam/push-handler.js +31 -0
  40. package/dist/formats/steam/push-handler.js.map +1 -0
  41. package/dist/formats/steam/upload-standalone.d.ts +20 -0
  42. package/dist/formats/steam/upload-standalone.d.ts.map +1 -0
  43. package/dist/formats/steam/upload-standalone.js +221 -0
  44. package/dist/formats/steam/upload-standalone.js.map +1 -0
  45. package/dist/formats/steam/validator.d.ts +58 -0
  46. package/dist/formats/steam/validator.d.ts.map +1 -0
  47. package/dist/formats/steam/validator.js +136 -0
  48. package/dist/formats/steam/validator.js.map +1 -0
  49. package/dist/formats/steam/workshop.d.ts +72 -0
  50. package/dist/formats/steam/workshop.d.ts.map +1 -0
  51. package/dist/formats/steam/workshop.js +221 -0
  52. package/dist/formats/steam/workshop.js.map +1 -0
  53. package/dist/utils/errors.d.ts +24 -0
  54. package/dist/utils/errors.d.ts.map +1 -1
  55. package/dist/utils/errors.js +51 -0
  56. package/dist/utils/errors.js.map +1 -1
  57. package/dist/utils/fs.d.ts +8 -0
  58. package/dist/utils/fs.d.ts.map +1 -1
  59. package/dist/utils/fs.js +22 -0
  60. package/dist/utils/fs.js.map +1 -1
  61. package/package.json +2 -1
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Workshop upload status enum
3
+ * Mirrors the C# WorkshopUploadStatus from BmlSteamItemManager
4
+ */
5
+ export declare enum WorkshopUploadStatus {
6
+ Pending = 0,
7
+ Preparing = 1,
8
+ RequestingId = 2,
9
+ WritingIni = 3,
10
+ StartingSteamUpload = 4,
11
+ UploadingContent = 5,
12
+ UploadingTitles = 6,
13
+ UploadingTranslations = 7,
14
+ Completed = 8,
15
+ Failed = 9
16
+ }
17
+ /**
18
+ * Workshop upload progress
19
+ */
20
+ export interface WorkshopUploadProgress {
21
+ status: WorkshopUploadStatus;
22
+ bytesProcessed: number;
23
+ bytesTotal: number;
24
+ message: string;
25
+ exception?: Error;
26
+ }
27
+ /**
28
+ * Progress callback type
29
+ */
30
+ export type ProgressCallback = (progress: WorkshopUploadProgress) => void;
31
+ /**
32
+ * Progress tracker for Workshop uploads
33
+ */
34
+ export declare class ProgressTracker {
35
+ private currentProgress;
36
+ private callbacks;
37
+ constructor();
38
+ /**
39
+ * Register a progress callback
40
+ */
41
+ onProgress(callback: ProgressCallback): void;
42
+ /**
43
+ * Report progress
44
+ */
45
+ report(status: WorkshopUploadStatus, message: string, data?: Partial<WorkshopUploadProgress>): void;
46
+ /**
47
+ * Report upload progress
48
+ */
49
+ reportUploadProgress(bytesProcessed: number, bytesTotal: number): void;
50
+ /**
51
+ * Report translation upload progress
52
+ */
53
+ reportTranslationProgress(current: number, total: number): void;
54
+ /**
55
+ * Report completion
56
+ */
57
+ reportSuccess(message: string): void;
58
+ /**
59
+ * Report failure
60
+ */
61
+ reportFailure(message: string, error?: Error): void;
62
+ /**
63
+ * Get current progress
64
+ */
65
+ getCurrentProgress(): WorkshopUploadProgress;
66
+ /**
67
+ * Reset the progress tracker
68
+ */
69
+ reset(): void;
70
+ }
71
+ /**
72
+ * Get status name for display
73
+ */
74
+ export declare function getStatusName(status: WorkshopUploadStatus): string;
75
+ /**
76
+ * Format progress for display
77
+ */
78
+ export declare function formatProgress(progress: WorkshopUploadProgress): string;
79
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../src/formats/steam/progress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,oBAAoB;IAC9B,OAAO,IAAI;IACX,SAAS,IAAI;IACb,YAAY,IAAI;IAChB,UAAU,IAAI;IACd,mBAAmB,IAAI;IACvB,gBAAgB,IAAI;IACpB,eAAe,IAAI;IACnB,qBAAqB,IAAI;IACzB,SAAS,IAAI;IACb,MAAM,IAAI;CACX;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;AAE1E;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,SAAS,CAA0B;;IAW3C;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI5C;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACrC,IAAI;IAmBP;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAWtE;;OAEG;IACH,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO/D;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAMnD;;OAEG;IACH,kBAAkB,IAAI,sBAAsB;IAI5C;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,CAavE"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Workshop upload status enum
3
+ * Mirrors the C# WorkshopUploadStatus from BmlSteamItemManager
4
+ */
5
+ export var WorkshopUploadStatus;
6
+ (function (WorkshopUploadStatus) {
7
+ WorkshopUploadStatus[WorkshopUploadStatus["Pending"] = 0] = "Pending";
8
+ WorkshopUploadStatus[WorkshopUploadStatus["Preparing"] = 1] = "Preparing";
9
+ WorkshopUploadStatus[WorkshopUploadStatus["RequestingId"] = 2] = "RequestingId";
10
+ WorkshopUploadStatus[WorkshopUploadStatus["WritingIni"] = 3] = "WritingIni";
11
+ WorkshopUploadStatus[WorkshopUploadStatus["StartingSteamUpload"] = 4] = "StartingSteamUpload";
12
+ WorkshopUploadStatus[WorkshopUploadStatus["UploadingContent"] = 5] = "UploadingContent";
13
+ WorkshopUploadStatus[WorkshopUploadStatus["UploadingTitles"] = 6] = "UploadingTitles";
14
+ WorkshopUploadStatus[WorkshopUploadStatus["UploadingTranslations"] = 7] = "UploadingTranslations";
15
+ WorkshopUploadStatus[WorkshopUploadStatus["Completed"] = 8] = "Completed";
16
+ WorkshopUploadStatus[WorkshopUploadStatus["Failed"] = 9] = "Failed";
17
+ })(WorkshopUploadStatus || (WorkshopUploadStatus = {}));
18
+ /**
19
+ * Progress tracker for Workshop uploads
20
+ */
21
+ export class ProgressTracker {
22
+ currentProgress;
23
+ callbacks = [];
24
+ constructor() {
25
+ this.currentProgress = {
26
+ status: WorkshopUploadStatus.Pending,
27
+ bytesProcessed: 0,
28
+ bytesTotal: 0,
29
+ message: 'Initializing...',
30
+ };
31
+ }
32
+ /**
33
+ * Register a progress callback
34
+ */
35
+ onProgress(callback) {
36
+ this.callbacks.push(callback);
37
+ }
38
+ /**
39
+ * Report progress
40
+ */
41
+ report(status, message, data) {
42
+ this.currentProgress = {
43
+ ...this.currentProgress,
44
+ status,
45
+ message,
46
+ ...data,
47
+ };
48
+ // Notify all callbacks
49
+ for (const callback of this.callbacks) {
50
+ try {
51
+ callback(this.currentProgress);
52
+ }
53
+ catch (error) {
54
+ // Ignore callback errors
55
+ console.warn('Progress callback error:', error);
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Report upload progress
61
+ */
62
+ reportUploadProgress(bytesProcessed, bytesTotal) {
63
+ this.currentProgress.bytesProcessed = bytesProcessed;
64
+ this.currentProgress.bytesTotal = bytesTotal;
65
+ const percentage = bytesTotal > 0 ? (bytesProcessed / bytesTotal) * 100 : 0;
66
+ this.report(WorkshopUploadStatus.UploadingContent, `Uploading content... ${percentage.toFixed(1)}%`);
67
+ }
68
+ /**
69
+ * Report translation upload progress
70
+ */
71
+ reportTranslationProgress(current, total) {
72
+ this.report(WorkshopUploadStatus.UploadingTranslations, `Uploading translations ${current}/${total}...`);
73
+ }
74
+ /**
75
+ * Report completion
76
+ */
77
+ reportSuccess(message) {
78
+ this.report(WorkshopUploadStatus.Completed, message);
79
+ }
80
+ /**
81
+ * Report failure
82
+ */
83
+ reportFailure(message, error) {
84
+ this.report(WorkshopUploadStatus.Failed, message, {
85
+ exception: error,
86
+ });
87
+ }
88
+ /**
89
+ * Get current progress
90
+ */
91
+ getCurrentProgress() {
92
+ return { ...this.currentProgress };
93
+ }
94
+ /**
95
+ * Reset the progress tracker
96
+ */
97
+ reset() {
98
+ this.currentProgress = {
99
+ status: WorkshopUploadStatus.Pending,
100
+ bytesProcessed: 0,
101
+ bytesTotal: 0,
102
+ message: 'Initializing...',
103
+ };
104
+ }
105
+ }
106
+ /**
107
+ * Get status name for display
108
+ */
109
+ export function getStatusName(status) {
110
+ return WorkshopUploadStatus[status] || 'Unknown';
111
+ }
112
+ /**
113
+ * Format progress for display
114
+ */
115
+ export function formatProgress(progress) {
116
+ const parts = [getStatusName(progress.status)];
117
+ if (progress.bytesTotal > 0) {
118
+ const percentage = (progress.bytesProcessed / progress.bytesTotal) * 100;
119
+ parts.push(`(${percentage.toFixed(1)}%)`);
120
+ }
121
+ if (progress.message) {
122
+ parts.push(`- ${progress.message}`);
123
+ }
124
+ return parts.join(' ');
125
+ }
126
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/formats/steam/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Steam Workshop push handler
3
+ * Orchestrates the entire Workshop upload process
4
+ * Uses a subprocess to ensure proper Steamworks proxy cleanup
5
+ */
6
+ import { Logger } from '../../utils/logger.js';
7
+ /**
8
+ * Push options
9
+ */
10
+ export interface PushOptions {
11
+ updateDescription: boolean;
12
+ changelog?: string;
13
+ skipTail?: boolean;
14
+ logger: Logger;
15
+ }
16
+ /**
17
+ * Steam push action
18
+ * @param modPath - Path to the mod directory
19
+ * @param options - Push options
20
+ */
21
+ export declare function steamPushAction(modPath: string, options: PushOptions): Promise<void>;
22
+ //# sourceMappingURL=push-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-handler.d.ts","sourceRoot":"","sources":["../../../src/formats/steam/push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Steam Workshop push handler
3
+ * Orchestrates the entire Workshop upload process
4
+ * Uses a subprocess to ensure proper Steamworks proxy cleanup
5
+ */
6
+ import { runSteamUploadInChildProcess } from './workshop.js';
7
+ /**
8
+ * Steam push action
9
+ * @param modPath - Path to the mod directory
10
+ * @param options - Push options
11
+ */
12
+ export async function steamPushAction(modPath, options) {
13
+ const { updateDescription, changelog, skipTail = false, logger } = options;
14
+ logger.header('Steam Workshop Upload');
15
+ try {
16
+ // Run the upload in a child process to ensure proper Steamworks proxy cleanup
17
+ await runSteamUploadInChildProcess(modPath, {
18
+ updateDescription,
19
+ changelog,
20
+ skipTail,
21
+ }, logger,
22
+ // Progress callback - progress is handled by the child process and displayed via its logger
23
+ undefined);
24
+ logger.success('Upload completed successfully');
25
+ }
26
+ catch (error) {
27
+ logger.error(error);
28
+ throw error;
29
+ }
30
+ }
31
+ //# sourceMappingURL=push-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-handler.js","sourceRoot":"","sources":["../../../src/formats/steam/push-handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAY7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,OAAoB;IAEpB,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3E,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,8EAA8E;QAC9E,MAAM,4BAA4B,CAChC,OAAO,EACP;YACE,iBAAiB;YACjB,SAAS;YACT,QAAQ;SACT,EACD,MAAM;QACN,4FAA4F;QAC5F,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,KAAuB,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Standalone Steam Workshop uploader script
3
+ * Run as a separate process to ensure proper cleanup of Steamworks proxy
4
+ */
5
+ /**
6
+ * Push options
7
+ */
8
+ interface PushOptions {
9
+ updateDescription: boolean;
10
+ changelog?: string;
11
+ skipTail?: boolean;
12
+ }
13
+ /**
14
+ * Steam push action (internal implementation for standalone script)
15
+ * @param modPath - Path to the mod directory
16
+ * @param options - Push options
17
+ */
18
+ declare function steamPushActionInternal(modPath: string, options: PushOptions): Promise<void>;
19
+ export { steamPushActionInternal };
20
+ //# sourceMappingURL=upload-standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-standalone.d.ts","sourceRoot":"","sources":["../../../src/formats/steam/upload-standalone.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,UAAU,WAAW;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBD;;;;GAIG;AACH,iBAAe,uBAAuB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA8Lf;AAuCD,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Standalone Steam Workshop uploader script
3
+ * Run as a separate process to ensure proper cleanup of Steamworks proxy
4
+ */
5
+ import { join } from 'path';
6
+ import { createLogger } from '../../utils/logger.js';
7
+ import { parseInfoIni } from '../nuget/parser.js';
8
+ import { savePublishedFileId, getPublishedFileId } from './parser.js';
9
+ import { loadDescriptions, loadTitles, getPrimaryLanguageContent } from './metadata.js';
10
+ import { ProgressTracker, WorkshopUploadStatus } from './progress.js';
11
+ import { ProgressDisplay } from './progress-display.js';
12
+ import { getSteamAppId } from './config.js';
13
+ import { initSteamworks, shutdownSteamworks, createWorkshopItem, updateWorkshopItemWithProgress, } from './workshop.js';
14
+ /**
15
+ * Append submission footer if not skipped
16
+ */
17
+ function appendTail(content, skipTail) {
18
+ if (skipTail) {
19
+ return content;
20
+ }
21
+ const footer = '[hr]Submmited via ducky cli';
22
+ if (!content) {
23
+ return footer;
24
+ }
25
+ // Check if content already ends with the footer
26
+ if (content.trim().endsWith(footer)) {
27
+ return content;
28
+ }
29
+ return `${content}\n\n${footer}`;
30
+ }
31
+ /**
32
+ * Steam push action (internal implementation for standalone script)
33
+ * @param modPath - Path to the mod directory
34
+ * @param options - Push options
35
+ */
36
+ async function steamPushActionInternal(modPath, options) {
37
+ const { updateDescription, changelog, skipTail = false } = options;
38
+ const logger = createLogger({ verbose: true });
39
+ const progress = new ProgressTracker();
40
+ const progressDisplay = new ProgressDisplay();
41
+ // Setup progress tracking with visual display
42
+ progress.onProgress((p) => {
43
+ logger.debug(`[${WorkshopUploadStatus[p.status]}] ${p.message}`);
44
+ progressDisplay.update(p);
45
+ });
46
+ // Start the progress display
47
+ progressDisplay.start();
48
+ try {
49
+ // Phase 1: Preparing
50
+ progress.report(WorkshopUploadStatus.Preparing, 'Parsing mod metadata...');
51
+ const metadata = await parseInfoIni(modPath);
52
+ logger.info(`Mod: ${metadata.displayName || metadata.name}`);
53
+ logger.info(`Version: ${metadata.version}`);
54
+ const appId = getSteamAppId();
55
+ logger.info(`Steam App ID: ${appId}`);
56
+ const publishedFileId = getPublishedFileId(metadata);
57
+ const isFirstTimeUpload = !publishedFileId;
58
+ if (isFirstTimeUpload) {
59
+ progress.report(WorkshopUploadStatus.RequestingId, 'Creating new Workshop item...');
60
+ logger.info('Mode: First-time upload');
61
+ }
62
+ else {
63
+ logger.info(`Mode: Update existing Workshop item ${publishedFileId}`);
64
+ }
65
+ // Phase 2: Initialize Steamworks
66
+ progress.report(WorkshopUploadStatus.Preparing, 'Initializing Steamworks...');
67
+ logger.debug('Initializing Steamworks...');
68
+ await initSteamworks();
69
+ logger.success('Steamworks initialized');
70
+ // Phase 3: Create Workshop item if first-time upload
71
+ let finalPublishedFileId = publishedFileId;
72
+ if (isFirstTimeUpload) {
73
+ logger.info('Creating new Workshop item...');
74
+ finalPublishedFileId = await createWorkshopItem();
75
+ logger.success(`Created new Workshop item with ID: ${finalPublishedFileId}`);
76
+ // Save to info.ini
77
+ progress.report(WorkshopUploadStatus.WritingIni, 'Saving publishedFileId to info.ini...');
78
+ await savePublishedFileId(modPath, finalPublishedFileId);
79
+ logger.info(`Saved publishedFileId ${finalPublishedFileId} to info.ini`);
80
+ }
81
+ // Phase 4: Load descriptions and titles
82
+ logger.debug('Loading descriptions and titles...');
83
+ const descriptions = await loadDescriptions(modPath);
84
+ const titles = await loadTitles(modPath, metadata.displayName || metadata.name);
85
+ logger.info(`Found ${descriptions.length} description(s) and ${titles.length} title(s)`);
86
+ if (descriptions.length > 0) {
87
+ const langs = descriptions.map(d => d.language).join(', ');
88
+ logger.debug(`Languages: ${langs}`);
89
+ }
90
+ // Phase 5: Prepare main upload details
91
+ progress.report(WorkshopUploadStatus.StartingSteamUpload, 'Preparing Workshop upload...');
92
+ const previewPath = join(modPath, 'preview.png');
93
+ const primaryContent = getPrimaryLanguageContent(descriptions, titles);
94
+ logger.debug(`Primary language: ${primaryContent.description?.language || 'N/A'}`);
95
+ logger.debug(`Content path: ${modPath}`);
96
+ logger.debug(`Preview path: ${previewPath}`);
97
+ // Build update details
98
+ const updateDetails = {
99
+ contentPath: modPath,
100
+ previewPath: previewPath,
101
+ visibility: 0, // Public
102
+ changeNote: appendTail(changelog || '', skipTail),
103
+ };
104
+ if (changelog) {
105
+ logger.debug(`Changelog: ${changelog.substring(0, 50)}${changelog.length > 50 ? '...' : ''}`);
106
+ }
107
+ // Phase 6: Handle descriptions based on upload type
108
+ if (isFirstTimeUpload) {
109
+ // First-time upload: ALWAYS set primary language description
110
+ logger.info('Setting primary language description (required for new items)');
111
+ if (primaryContent.title) {
112
+ updateDetails.title = primaryContent.title.title;
113
+ logger.info(`Title: ${primaryContent.title.title}`);
114
+ }
115
+ if (primaryContent.description) {
116
+ updateDetails.description = appendTail(primaryContent.description.content, skipTail);
117
+ logger.debug(`Description length: ${primaryContent.description.content.length} characters`);
118
+ }
119
+ }
120
+ else if (updateDescription) {
121
+ // Update with --update-description flag: Update primary language
122
+ logger.info('Updating all language descriptions...');
123
+ // Update primary language first
124
+ if (primaryContent.title) {
125
+ updateDetails.title = primaryContent.title.title;
126
+ }
127
+ if (primaryContent.description) {
128
+ updateDetails.description = appendTail(primaryContent.description.content, skipTail);
129
+ }
130
+ }
131
+ else {
132
+ // Update without --update-description flag: Skip ALL descriptions
133
+ logger.info('Description updates: disabled (use --update-description to enable)');
134
+ }
135
+ // Phase 7: Submit main update
136
+ logger.info('Uploading content to Steam...');
137
+ progress.report(WorkshopUploadStatus.UploadingContent, 'Uploading content to Steam...');
138
+ await updateWorkshopItemWithProgress(finalPublishedFileId, updateDetails, logger, (bytesProcessed, bytesTotal) => {
139
+ progress.reportUploadProgress(bytesProcessed, bytesTotal);
140
+ });
141
+ logger.success('Content uploaded successfully');
142
+ // Phase 8: Update other languages if --update-description flag is set
143
+ if (updateDescription) {
144
+ const otherLanguages = descriptions.filter((d) => d.language !== primaryContent.description?.language);
145
+ if (otherLanguages.length > 0) {
146
+ const action = isFirstTimeUpload ? 'Uploading' : 'Updating';
147
+ logger.info(`${action} ${otherLanguages.length} additional language(s)...`);
148
+ for (let i = 0; i < otherLanguages.length; i++) {
149
+ const lang = otherLanguages[i];
150
+ progress.reportTranslationProgress(i + 1, otherLanguages.length);
151
+ logger.info(` [${i + 1}/${otherLanguages.length}] ${lang.language}`);
152
+ // Find title for this language
153
+ const langTitle = titles.find((t) => t.language === lang.language);
154
+ // Update with only title and description for this language
155
+ const langUpdateDetails = {
156
+ title: langTitle?.title,
157
+ description: appendTail(lang.content, skipTail),
158
+ language: lang.language,
159
+ };
160
+ await updateWorkshopItemWithProgress(finalPublishedFileId, langUpdateDetails, logger);
161
+ }
162
+ logger.success(`All ${otherLanguages.length} language(s) processed`);
163
+ }
164
+ }
165
+ // Phase 9: Complete
166
+ if (updateDescription) {
167
+ const languageCount = descriptions.length > 0 ? descriptions.length : 1;
168
+ const action = isFirstTimeUpload ? 'Published' : 'Updated';
169
+ logger.success(`${action} Workshop item: ${finalPublishedFileId} (${languageCount} language(s))`);
170
+ }
171
+ else {
172
+ const action = isFirstTimeUpload ? 'Published' : 'Updated';
173
+ logger.success(`${action} Workshop item: ${finalPublishedFileId}`);
174
+ }
175
+ progress.reportSuccess('Upload completed successfully');
176
+ }
177
+ catch (error) {
178
+ progress.reportFailure(error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
179
+ throw error;
180
+ }
181
+ finally {
182
+ // Stop the progress display
183
+ progressDisplay.stop();
184
+ // Shutdown Steamworks
185
+ shutdownSteamworks();
186
+ }
187
+ }
188
+ /**
189
+ * Main entry point for standalone execution
190
+ */
191
+ async function main() {
192
+ const args = process.argv.slice(2);
193
+ if (args.length === 0) {
194
+ console.error('Usage: steam-upload.js <modPath> [options]');
195
+ process.exit(1);
196
+ }
197
+ const modPath = args[0];
198
+ const updateDescription = args.includes('--update-description');
199
+ const skipTail = args.includes('--skip-tail');
200
+ const changelogIndex = args.indexOf('--changelog');
201
+ const changelog = changelogIndex >= 0 && args[changelogIndex + 1]
202
+ ? args[changelogIndex + 1]
203
+ : undefined;
204
+ try {
205
+ await steamPushActionInternal(modPath, {
206
+ updateDescription,
207
+ changelog,
208
+ skipTail,
209
+ });
210
+ process.exit(0);
211
+ }
212
+ catch (error) {
213
+ process.exit(1);
214
+ }
215
+ }
216
+ // Run if called directly
217
+ if (import.meta.url === `file://${process.argv[1]}`) {
218
+ main();
219
+ }
220
+ export { steamPushActionInternal };
221
+ //# sourceMappingURL=upload-standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-standalone.js","sourceRoot":"","sources":["../../../src/formats/steam/upload-standalone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { Logger } from '../../utils/logger.js';
2
+ /**
3
+ * Validation result
4
+ */
5
+ export interface ValidationResult {
6
+ isValid: boolean;
7
+ errors: Array<{
8
+ message: string;
9
+ suggestions?: string[];
10
+ }>;
11
+ }
12
+ /**
13
+ * Steam Workshop validator
14
+ */
15
+ export declare class SteamValidator {
16
+ private logger;
17
+ constructor(logger: Logger);
18
+ /**
19
+ * Validate all aspects of a mod for Steam Workshop publishing
20
+ */
21
+ validate(directory: string): Promise<ValidationResult>;
22
+ /**
23
+ * Validate Steam App ID
24
+ */
25
+ validateAppId(appId: number): {
26
+ message: string;
27
+ suggestions?: string[];
28
+ } | null;
29
+ /**
30
+ * Validate directory exists
31
+ */
32
+ validateDirectoryExists(directory: string): Promise<{
33
+ message: string;
34
+ suggestions?: string[];
35
+ } | null>;
36
+ /**
37
+ * Validate info.ini exists
38
+ */
39
+ validateInfoIniExists(directory: string): Promise<{
40
+ message: string;
41
+ suggestions?: string[];
42
+ } | null>;
43
+ /**
44
+ * Validate preview.png exists
45
+ */
46
+ validatePreviewImage(directory: string): Promise<{
47
+ message: string;
48
+ suggestions?: string[];
49
+ } | null>;
50
+ /**
51
+ * Validate mod structure
52
+ */
53
+ validateModStructure(directory: string): Promise<Array<{
54
+ message: string;
55
+ suggestions?: string[];
56
+ }>>;
57
+ }
58
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/formats/steam/validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAElC;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsC5D;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAahF;;OAEG;IACG,uBAAuB,CAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAa9D;;OAEG;IACG,qBAAqB,CACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAc9D;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAe9D;;OAEG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAyB/D"}