@roster-lock/config-editor-cli 0.0.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 (164) hide show
  1. package/.claude-plugin/plugin.json +6 -0
  2. package/LICENSE.md +11 -0
  3. package/README.md +40 -0
  4. package/dist/commands/draft/from-lock.js +31 -0
  5. package/dist/commands/draft/from-lock.js.map +1 -0
  6. package/dist/commands/draft/index.js +22 -0
  7. package/dist/commands/draft/index.js.map +1 -0
  8. package/dist/commands/draft/init.js +25 -0
  9. package/dist/commands/draft/init.js.map +1 -0
  10. package/dist/commands/draft/promote.js +24 -0
  11. package/dist/commands/draft/promote.js.map +1 -0
  12. package/dist/commands/draft/publish.js +26 -0
  13. package/dist/commands/draft/publish.js.map +1 -0
  14. package/dist/commands/draft/validate.js +30 -0
  15. package/dist/commands/draft/validate.js.map +1 -0
  16. package/dist/commands/engine/add-asset.js +44 -0
  17. package/dist/commands/engine/add-asset.js.map +1 -0
  18. package/dist/commands/engine/add-piece-type.js +47 -0
  19. package/dist/commands/engine/add-piece-type.js.map +1 -0
  20. package/dist/commands/engine/edit-definition.js +49 -0
  21. package/dist/commands/engine/edit-definition.js.map +1 -0
  22. package/dist/commands/engine/index.js +24 -0
  23. package/dist/commands/engine/index.js.map +1 -0
  24. package/dist/commands/engine/remove-asset.js +27 -0
  25. package/dist/commands/engine/remove-asset.js.map +1 -0
  26. package/dist/commands/engine/remove-piece-type.js +28 -0
  27. package/dist/commands/engine/remove-piece-type.js.map +1 -0
  28. package/dist/commands/engine/set-info.js +22 -0
  29. package/dist/commands/engine/set-info.js.map +1 -0
  30. package/dist/commands/engine/show.js +23 -0
  31. package/dist/commands/engine/show.js.map +1 -0
  32. package/dist/commands/piece-meta/index.js +19 -0
  33. package/dist/commands/piece-meta/index.js.map +1 -0
  34. package/dist/commands/piece-meta/set.js +27 -0
  35. package/dist/commands/piece-meta/set.js.map +1 -0
  36. package/dist/commands/piece-meta/show.js +15 -0
  37. package/dist/commands/piece-meta/show.js.map +1 -0
  38. package/dist/commands/roster/add-piece.js +93 -0
  39. package/dist/commands/roster/add-piece.js.map +1 -0
  40. package/dist/commands/roster/edit-piece.js +92 -0
  41. package/dist/commands/roster/edit-piece.js.map +1 -0
  42. package/dist/commands/roster/import-piece.js +83 -0
  43. package/dist/commands/roster/import-piece.js.map +1 -0
  44. package/dist/commands/roster/index.js +24 -0
  45. package/dist/commands/roster/index.js.map +1 -0
  46. package/dist/commands/roster/list.js +24 -0
  47. package/dist/commands/roster/list.js.map +1 -0
  48. package/dist/commands/roster/remove-piece.js +30 -0
  49. package/dist/commands/roster/remove-piece.js.map +1 -0
  50. package/dist/commands/roster/rescan.js +55 -0
  51. package/dist/commands/roster/rescan.js.map +1 -0
  52. package/dist/commands/roster/test-download.js +72 -0
  53. package/dist/commands/roster/test-download.js.map +1 -0
  54. package/dist/commands/selection/add-script.js +43 -0
  55. package/dist/commands/selection/add-script.js.map +1 -0
  56. package/dist/commands/selection/index.js +21 -0
  57. package/dist/commands/selection/index.js.map +1 -0
  58. package/dist/commands/selection/run-script.js +27 -0
  59. package/dist/commands/selection/run-script.js.map +1 -0
  60. package/dist/commands/selection/set.js +41 -0
  61. package/dist/commands/selection/set.js.map +1 -0
  62. package/dist/commands/selection/show.js +15 -0
  63. package/dist/commands/selection/show.js.map +1 -0
  64. package/dist/commands/show.js +15 -0
  65. package/dist/commands/show.js.map +1 -0
  66. package/dist/commands/validate.js +31 -0
  67. package/dist/commands/validate.js.map +1 -0
  68. package/dist/index.js +55 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/lib/cli-options.js +7 -0
  71. package/dist/lib/cli-options.js.map +1 -0
  72. package/dist/lib/draft-io.js +38 -0
  73. package/dist/lib/draft-io.js.map +1 -0
  74. package/dist/lib/errors.js +32 -0
  75. package/dist/lib/errors.js.map +1 -0
  76. package/dist/lib/fs-walk.js +28 -0
  77. package/dist/lib/fs-walk.js.map +1 -0
  78. package/dist/lib/json-input.js +16 -0
  79. package/dist/lib/json-input.js.map +1 -0
  80. package/dist/lib/lock-io.js +20 -0
  81. package/dist/lib/lock-io.js.map +1 -0
  82. package/dist/lib/parse.js +52 -0
  83. package/dist/lib/parse.js.map +1 -0
  84. package/dist/lib/piece-scan.js +12 -0
  85. package/dist/lib/piece-scan.js.map +1 -0
  86. package/dist/lib/schema-help.js +38 -0
  87. package/dist/lib/schema-help.js.map +1 -0
  88. package/dist/lib/schemas.js +71 -0
  89. package/dist/lib/schemas.js.map +1 -0
  90. package/dist/lib/semver-report.js +13 -0
  91. package/dist/lib/semver-report.js.map +1 -0
  92. package/dist/lib/slugify.js +13 -0
  93. package/dist/lib/slugify.js.map +1 -0
  94. package/dist/version.js +5 -0
  95. package/dist/version.js.map +1 -0
  96. package/package.json +49 -0
  97. package/scripts/bundle.js +15 -0
  98. package/scripts/generate-version.js +14 -0
  99. package/skills/rosterlock-config-editor/SKILL.md +151 -0
  100. package/src/commands/draft/from-lock.ts +34 -0
  101. package/src/commands/draft/index.ts +5 -0
  102. package/src/commands/draft/init.ts +21 -0
  103. package/src/commands/draft/promote.ts +24 -0
  104. package/src/commands/draft/publish.ts +26 -0
  105. package/src/commands/draft/validate.ts +30 -0
  106. package/src/commands/engine/add-asset.ts +46 -0
  107. package/src/commands/engine/add-piece-type.ts +56 -0
  108. package/src/commands/engine/edit-definition.ts +58 -0
  109. package/src/commands/engine/index.ts +7 -0
  110. package/src/commands/engine/remove-asset.ts +25 -0
  111. package/src/commands/engine/remove-piece-type.ts +27 -0
  112. package/src/commands/engine/set-info.ts +17 -0
  113. package/src/commands/engine/show.ts +20 -0
  114. package/src/commands/piece-meta/index.ts +2 -0
  115. package/src/commands/piece-meta/set.ts +29 -0
  116. package/src/commands/piece-meta/show.ts +12 -0
  117. package/src/commands/roster/add-piece.ts +109 -0
  118. package/src/commands/roster/edit-piece.ts +99 -0
  119. package/src/commands/roster/import-piece.ts +112 -0
  120. package/src/commands/roster/index.ts +7 -0
  121. package/src/commands/roster/list.ts +23 -0
  122. package/src/commands/roster/remove-piece.ts +28 -0
  123. package/src/commands/roster/rescan.ts +63 -0
  124. package/src/commands/roster/test-download.ts +76 -0
  125. package/src/commands/selection/add-script.ts +44 -0
  126. package/src/commands/selection/index.ts +4 -0
  127. package/src/commands/selection/run-script.ts +30 -0
  128. package/src/commands/selection/set.ts +54 -0
  129. package/src/commands/selection/show.ts +12 -0
  130. package/src/commands/show.ts +12 -0
  131. package/src/commands/validate.ts +26 -0
  132. package/src/index.ts +85 -0
  133. package/src/lib/cli-options.ts +8 -0
  134. package/src/lib/draft-io.ts +41 -0
  135. package/src/lib/errors.ts +30 -0
  136. package/src/lib/fs-walk.ts +31 -0
  137. package/src/lib/json-input.ts +21 -0
  138. package/src/lib/lock-io.ts +18 -0
  139. package/src/lib/parse.ts +42 -0
  140. package/src/lib/piece-scan.ts +19 -0
  141. package/src/lib/schema-help.ts +44 -0
  142. package/src/lib/schemas.ts +100 -0
  143. package/src/lib/semver-report.ts +11 -0
  144. package/src/lib/slugify.ts +9 -0
  145. package/test.rosterlock.draft.json +62 -0
  146. package/tests/commands/add-piece.spec.ts +92 -0
  147. package/tests/commands/draft-validate.spec.ts +85 -0
  148. package/tests/commands/edit-definition.spec.ts +94 -0
  149. package/tests/commands/edit-piece.spec.ts +153 -0
  150. package/tests/commands/from-lock.spec.ts +80 -0
  151. package/tests/commands/help-arguments.spec.ts +31 -0
  152. package/tests/commands/import-piece.spec.ts +228 -0
  153. package/tests/commands/piece-meta.spec.ts +123 -0
  154. package/tests/commands/rescan.spec.ts +137 -0
  155. package/tests/lib/draft-io.spec.ts +76 -0
  156. package/tests/lib/errors.spec.ts +48 -0
  157. package/tests/lib/fs-walk.spec.ts +35 -0
  158. package/tests/lib/json-input.spec.ts +63 -0
  159. package/tests/lib/parse.spec.ts +85 -0
  160. package/tests/lib/schema-help.spec.ts +42 -0
  161. package/tests/lib/schemas.spec.ts +82 -0
  162. package/tests/lib/slugify.spec.ts +28 -0
  163. package/tsconfig.json +19 -0
  164. package/tsconfig.test.json +10 -0
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pieceMetaSetCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const shared_1 = require("@roster-lock/shared");
6
+ const utils_1 = require("@roster-lock/utils");
7
+ const draft_io_1 = require("../../lib/draft-io");
8
+ const cli_options_1 = require("../../lib/cli-options");
9
+ const errors_1 = require("../../lib/errors");
10
+ const json_input_1 = require("../../lib/json-input");
11
+ const schemas_1 = require("../../lib/schemas");
12
+ const schema_help_1 = require("../../lib/schema-help");
13
+ exports.pieceMetaSetCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("set"))
14
+ .description("Set the custom piece meta (schema/defaultMeta/values) for a piece type")
15
+ .argument("<pieceType>", "the piece type key")
16
+ .option("--json <file>", "fields to merge in, read from a JSON file (or \"-\" for stdin). " +
17
+ `Shape: ${(0, schema_help_1.describeSchemaShape)(schemas_1.pieceMetaOverridesSchema)}`)
18
+ .action((0, errors_1.withErrorHandling)(async (pieceType, opts) => {
19
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
20
+ const draft = (0, draft_io_1.readDraft)(draftPath);
21
+ const overrides = opts.json ? await (0, json_input_1.readJsonInput)(opts.json, schemas_1.pieceMetaOverridesSchema) : {};
22
+ draft.stagedLock.pieceMeta[pieceType] = { ...(0, utils_1.cloneJSON)(shared_1.EMPTY_PIECE_META), ...overrides };
23
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
24
+ (0, draft_io_1.writeDraft)(draftPath, draft);
25
+ console.log(`Set piece meta for "${pieceType}"`);
26
+ }));
27
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/commands/piece-meta/set.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,gDAAwF;AACxF,8CAA+C;AAC/C,iDAA6E;AAC7E,uDAAwD;AACxD,6CAAqD;AACrD,qDAAqD;AACrD,+CAA6D;AAC7D,uDAA4D;AAE/C,QAAA,mBAAmB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,KAAK,CAAC,CAAC;KACnE,WAAW,CAAC,wEAAwE,CAAC;KACrF,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC7C,MAAM,CACL,eAAe,EACf,kEAAkE;IAClE,UAAU,IAAA,iCAAmB,EAAC,kCAAwB,CAAC,EAAE,CAC1D;KACA,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,SAAiB,EAAE,IAAuC,EAAE,EAAE;IAC7F,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,0BAAa,EAAC,IAAI,CAAC,IAAI,EAAE,kCAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAA,iBAAS,EAAC,yBAAgB,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;IAEzF,wCAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,IAAA,qBAAU,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pieceMetaShowCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const draft_io_1 = require("../../lib/draft-io");
6
+ const cli_options_1 = require("../../lib/cli-options");
7
+ const errors_1 = require("../../lib/errors");
8
+ exports.pieceMetaShowCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("show"))
9
+ .description("Print the staged lock's piece meta")
10
+ .action((0, errors_1.withErrorHandling)(async (opts) => {
11
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
12
+ const draft = (0, draft_io_1.readDraft)(draftPath);
13
+ console.log(JSON.stringify(draft.stagedLock.pieceMeta, null, 2));
14
+ }));
15
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/piece-meta/show.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAiE;AACjE,uDAAwD;AACxD,6CAAqD;AAExC,QAAA,oBAAoB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;KACrE,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;IAC3D,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addPieceCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const shared_1 = require("@roster-lock/shared");
8
+ const draft_io_1 = require("../../lib/draft-io");
9
+ const cli_options_1 = require("../../lib/cli-options");
10
+ const errors_1 = require("../../lib/errors");
11
+ const parse_1 = require("../../lib/parse");
12
+ const piece_scan_1 = require("../../lib/piece-scan");
13
+ const slugify_1 = require("../../lib/slugify");
14
+ const json_input_1 = require("../../lib/json-input");
15
+ const schemas_1 = require("../../lib/schemas");
16
+ const schema_help_1 = require("../../lib/schema-help");
17
+ function collectSource(value, previous) {
18
+ previous.push(value);
19
+ return previous;
20
+ }
21
+ exports.addPieceCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("add-piece"))
22
+ .description("Scan a folder and add it as a piece for an existing piece type")
23
+ .argument("<pieceType>", "the piece type key")
24
+ .argument("<folder>", "path to the folder to scan for the piece's assets")
25
+ .option("--path-variables <k=v,...>", "path variable values used to resolve this piece's asset globs")
26
+ .option("--download-source <url>", "download source url (repeatable)", collectSource, [])
27
+ .option("--json <file>", "set humanInfo/downloadSources/pathVariables from a JSON file (or \"-\" for stdin), applied on top of a " +
28
+ `rosterlock.piece-info.json in the folder if present. Shape: ${(0, schema_help_1.describeSchemaShape)(schemas_1.pieceOverridesSchema)}`)
29
+ .action((0, errors_1.withErrorHandling)(async (pieceType, folder, opts) => {
30
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
31
+ const draft = (0, draft_io_1.readDraft)(draftPath);
32
+ const pieceDefinition = draft.stagedLock.engine.pieceDefinitions[pieceType];
33
+ if (!pieceDefinition)
34
+ throw new Error(`Unknown piece type "${pieceType}"; define it first with "engine add-piece-type"`);
35
+ const pathVariables = (0, parse_1.parseKeyValueList)(opts.pathVariables);
36
+ const { version, errors } = await (0, piece_scan_1.scanPieceFolder)(folder, pathVariables, pieceDefinition);
37
+ if (errors.length > 0) {
38
+ for (const err of errors)
39
+ console.error(`[${err.type}] ${err.id}: ${err.message}`);
40
+ throw new Error(`Folder does not match piece type "${pieceType}"'s asset definitions`);
41
+ }
42
+ const piece = {
43
+ id: "",
44
+ version,
45
+ humanInfo: { name: "", author: "", url: "" },
46
+ downloadSources: [...opts.downloadSource],
47
+ pathVariables,
48
+ requiredPieces: Object.fromEntries(pieceDefinition.requires.map((requiredType) => [requiredType, { selectable: false, expected: [] }])),
49
+ };
50
+ const metaPath = (0, node_path_1.join)(folder, shared_1.PATH_ROSTERLOCK_PIECE_INFO);
51
+ if ((0, node_fs_1.existsSync)(metaPath)) {
52
+ const metaJson = JSON.parse((0, node_fs_1.readFileSync)(metaPath, "utf-8"));
53
+ const meta = shared_1.ROSTERLOCK_V1_PIECEINFO_CASTER_JSONSCHEMA.cast(metaJson, true);
54
+ piece.humanInfo = meta.humanInfo;
55
+ for (const source of meta.downloadSources) {
56
+ if (!piece.downloadSources.includes(source))
57
+ piece.downloadSources.push(source);
58
+ }
59
+ }
60
+ if (opts.json) {
61
+ const overrides = await (0, json_input_1.readJsonInput)(opts.json, schemas_1.pieceOverridesSchema);
62
+ if (overrides.humanInfo)
63
+ piece.humanInfo = overrides.humanInfo;
64
+ if (overrides.downloadSources) {
65
+ for (const source of overrides.downloadSources) {
66
+ if (!piece.downloadSources.includes(source))
67
+ piece.downloadSources.push(source);
68
+ }
69
+ }
70
+ if (overrides.pathVariables)
71
+ Object.assign(piece.pathVariables, overrides.pathVariables);
72
+ }
73
+ if (piece.downloadSources.length === 0) {
74
+ throw new Error("At least one download source is required; pass --download-source or provide a rosterlock.piece-info.json with downloadSources");
75
+ }
76
+ piece.id = piece.humanInfo.name
77
+ ? `@${(0, slugify_1.slugify)(piece.humanInfo.author)}/${(0, slugify_1.slugify)(piece.humanInfo.name)}`
78
+ : `#${version.logic}/${version.media}`;
79
+ const collection = draft.stagedLock.rosters[pieceType] ?? (draft.stagedLock.rosters[pieceType] = []);
80
+ if (collection.find((p) => p.id === piece.id)) {
81
+ throw new Error(`Piece "${piece.id}" already exists in "${pieceType}"; use "roster remove-piece" first`);
82
+ }
83
+ collection.push(piece);
84
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
85
+ draft.draft.rosterPieceInfo[pieceType] ??= {};
86
+ draft.draft.rosterPieceInfo[pieceType][piece.id] = {
87
+ referenceFolder: folder,
88
+ testedDownloadSources: [],
89
+ };
90
+ (0, draft_io_1.writeDraft)(draftPath, draft);
91
+ console.log(`Added piece "${piece.id}" (logic=${version.logic}) to "${pieceType}"`);
92
+ }));
93
+ //# sourceMappingURL=add-piece.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-piece.js","sourceRoot":"","sources":["../../../src/commands/roster/add-piece.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.editPieceCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const shared_1 = require("@roster-lock/shared");
6
+ const draft_io_1 = require("../../lib/draft-io");
7
+ const cli_options_1 = require("../../lib/cli-options");
8
+ const errors_1 = require("../../lib/errors");
9
+ const parse_1 = require("../../lib/parse");
10
+ const json_input_1 = require("../../lib/json-input");
11
+ const schemas_1 = require("../../lib/schemas");
12
+ const schema_help_1 = require("../../lib/schema-help");
13
+ function collect(value, previous) {
14
+ previous.push(value);
15
+ return previous;
16
+ }
17
+ exports.editPieceCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("edit-piece"))
18
+ .description("Edit an existing roster piece's human info, download sources, or path variables")
19
+ .argument("<pieceType>", "the piece type key")
20
+ .argument("<pieceId>", "the piece's id (as shown by \"roster list\")")
21
+ .option("--name <name>", "human-readable name")
22
+ .option("--author <author>", "author name")
23
+ .option("--url <url>", "info url")
24
+ .option("--image <url>", "image url")
25
+ .option("--add-download-source <url>", "download source url to add (repeatable)", collect, [])
26
+ .option("--remove-download-source <url>", "download source url to remove (repeatable)", collect, [])
27
+ .option("--path-variables <k=v,...>", "path variable values to set (existing keys not mentioned are left alone)")
28
+ .option("--remove-path-variable <name>", "path variable name to remove (repeatable)", collect, [])
29
+ .option("--json <file>", "bulk-set humanInfo/downloadSources/pathVariables from a JSON file (or \"-\" for stdin), applied before the " +
30
+ `flags above (so a specific flag always wins over --json). Shape: ${(0, schema_help_1.describeSchemaShape)(schemas_1.pieceOverridesSchema)}`)
31
+ .action((0, errors_1.withErrorHandling)(async (pieceType, pieceId, opts) => {
32
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
33
+ const draft = (0, draft_io_1.readDraft)(draftPath);
34
+ const collection = draft.stagedLock.rosters[pieceType];
35
+ if (!collection)
36
+ throw new Error(`Unknown piece type "${pieceType}"`);
37
+ const piece = collection.find((p) => p.id === pieceId);
38
+ if (!piece)
39
+ throw new Error(`Unknown piece "${pieceId}" in "${pieceType}"`);
40
+ const nothingRequested = (opts.name === undefined && opts.author === undefined && opts.url === undefined && opts.image === undefined
41
+ && opts.addDownloadSource.length === 0 && opts.removeDownloadSource.length === 0
42
+ && opts.pathVariables === undefined && opts.removePathVariable.length === 0
43
+ && opts.json === undefined);
44
+ if (nothingRequested) {
45
+ throw new Error("Nothing to change; pass --name/--author/--url/--image, " +
46
+ "--add-download-source/--remove-download-source, --path-variables/--remove-path-variable, or --json");
47
+ }
48
+ if (opts.json) {
49
+ const overrides = await (0, json_input_1.readJsonInput)(opts.json, schemas_1.pieceOverridesSchema);
50
+ if (overrides.humanInfo)
51
+ piece.humanInfo = overrides.humanInfo;
52
+ if (overrides.downloadSources) {
53
+ for (const source of overrides.downloadSources) {
54
+ if (!piece.downloadSources.includes(source))
55
+ piece.downloadSources.push(source);
56
+ }
57
+ }
58
+ if (overrides.pathVariables)
59
+ Object.assign(piece.pathVariables, overrides.pathVariables);
60
+ }
61
+ if (opts.name !== undefined)
62
+ piece.humanInfo.name = opts.name;
63
+ if (opts.author !== undefined)
64
+ piece.humanInfo.author = opts.author;
65
+ if (opts.url !== undefined)
66
+ piece.humanInfo.url = opts.url;
67
+ if (opts.image !== undefined)
68
+ piece.humanInfo.image = opts.image;
69
+ for (const source of opts.addDownloadSource) {
70
+ if (!piece.downloadSources.includes(source))
71
+ piece.downloadSources.push(source);
72
+ }
73
+ for (const source of opts.removeDownloadSource) {
74
+ const index = piece.downloadSources.indexOf(source);
75
+ if (index === -1)
76
+ throw new Error(`Download source not found on piece "${pieceId}": ${source}`);
77
+ piece.downloadSources.splice(index, 1);
78
+ }
79
+ if (piece.downloadSources.length === 0) {
80
+ throw new Error("A piece must keep at least one download source");
81
+ }
82
+ if (opts.pathVariables !== undefined) {
83
+ Object.assign(piece.pathVariables, (0, parse_1.parseKeyValueList)(opts.pathVariables));
84
+ }
85
+ for (const name of opts.removePathVariable) {
86
+ delete piece.pathVariables[name];
87
+ }
88
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
89
+ (0, draft_io_1.writeDraft)(draftPath, draft);
90
+ console.log(`Updated piece "${pieceId}" in "${pieceType}"`);
91
+ }));
92
+ //# sourceMappingURL=edit-piece.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-piece.js","sourceRoot":"","sources":["../../../src/commands/roster/edit-piece.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importPieceCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const node_path_1 = require("node:path");
6
+ const shared_1 = require("@roster-lock/shared");
7
+ const utils_1 = require("@roster-lock/utils");
8
+ const draft_io_1 = require("../../lib/draft-io");
9
+ const lock_io_1 = require("../../lib/lock-io");
10
+ const cli_options_1 = require("../../lib/cli-options");
11
+ const errors_1 = require("../../lib/errors");
12
+ function readSourceConfig(sourcePath) {
13
+ const resolved = (0, node_path_1.resolve)(process.cwd(), sourcePath);
14
+ if (resolved.endsWith(draft_io_1.DRAFT_SUFFIX))
15
+ return (0, draft_io_1.readDraft)(resolved).stagedLock;
16
+ return (0, lock_io_1.readLock)(resolved);
17
+ }
18
+ function findByMatchingVersion(collection, version) {
19
+ return collection?.find((p) => p.version.logic === version.logic && p.version.media === version.media);
20
+ }
21
+ function importRequiredPieces(sourceConfig, targetConfig, piece, importing) {
22
+ for (const [requiredType, requirement] of Object.entries(piece.requiredPieces)) {
23
+ requirement.expected = requirement.expected.map((requiredId) => importRequiredPiece(sourceConfig, targetConfig, requiredType, requiredId, importing));
24
+ }
25
+ }
26
+ function importRequiredPiece(sourceConfig, targetConfig, pieceType, sourceId, importing) {
27
+ const sourcePiece = sourceConfig.rosters[pieceType]?.find((p) => p.id === sourceId);
28
+ if (!sourcePiece)
29
+ throw new Error(`Required piece "${sourceId}" of type "${pieceType}" not found in the source document`);
30
+ const collection = targetConfig.rosters[pieceType] ?? (targetConfig.rosters[pieceType] = []);
31
+ const existing = findByMatchingVersion(collection, sourcePiece.version);
32
+ if (existing)
33
+ return existing.id;
34
+ const importKey = `${pieceType}:${sourceId}`;
35
+ if (importing.has(importKey)) {
36
+ throw new Error(`Circular required-piece reference detected at "${pieceType}" piece "${sourceId}"`);
37
+ }
38
+ if (collection.find((p) => p.id === sourceId)) {
39
+ throw new Error(`Cannot import required piece "${sourceId}" (${pieceType}): a different piece already exists under that id ` +
40
+ "in the target draft");
41
+ }
42
+ const requiredPiece = (0, utils_1.cloneJSON)(sourcePiece);
43
+ collection.push(requiredPiece);
44
+ importing.add(importKey);
45
+ importRequiredPieces(sourceConfig, targetConfig, requiredPiece, importing);
46
+ importing.delete(importKey);
47
+ console.log(`Imported required piece "${requiredPiece.id}" into "${pieceType}": ` +
48
+ `logic ${requiredPiece.version.logic}, media ${requiredPiece.version.media}`);
49
+ return requiredPiece.id;
50
+ }
51
+ exports.importPieceCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("import-piece"))
52
+ .description("Copy a piece from another draft or published lock file into this draft's rosters, trusting the source's " +
53
+ "existing hash as-is - use \"roster add-piece\" instead if you need the hash (re)computed from local files")
54
+ .argument("<sourcePath>", `path to the source draft (*${draft_io_1.DRAFT_SUFFIX}) or published lock file`)
55
+ .argument("<pieceType>", "the piece type key (must exist in this draft's engine)")
56
+ .argument("<pieceId>", "the piece's id in the source (as shown by \"roster list\" run against the source)")
57
+ .option("--as <newId>", "import under a different piece id (defaults to the source piece's id)")
58
+ .action((0, errors_1.withErrorHandling)(async (sourcePath, pieceType, pieceId, opts) => {
59
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
60
+ const draft = (0, draft_io_1.readDraft)(draftPath);
61
+ const pieceDefinition = draft.stagedLock.engine.pieceDefinitions[pieceType];
62
+ if (!pieceDefinition)
63
+ throw new Error(`Unknown piece type "${pieceType}"; define it first with "engine add-piece-type"`);
64
+ const sourceConfig = readSourceConfig(sourcePath);
65
+ const sourceCollection = sourceConfig.rosters[pieceType];
66
+ const sourcePiece = sourceCollection?.find((p) => p.id === pieceId);
67
+ if (!sourcePiece)
68
+ throw new Error(`Unknown piece "${pieceId}" in "${pieceType}" in "${sourcePath}"`);
69
+ const newId = opts.as ?? sourcePiece.id;
70
+ const collection = draft.stagedLock.rosters[pieceType] ?? (draft.stagedLock.rosters[pieceType] = []);
71
+ if (collection.find((p) => p.id === newId)) {
72
+ throw new Error(`Piece "${newId}" already exists in "${pieceType}"; use --as to import under a different id, ` +
73
+ `or "roster remove-piece" first`);
74
+ }
75
+ const piece = { ...(0, utils_1.cloneJSON)(sourcePiece), id: newId };
76
+ collection.push(piece);
77
+ importRequiredPieces(sourceConfig, draft.stagedLock, piece, new Set([`${pieceType}:${sourcePiece.id}`]));
78
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
79
+ (0, draft_io_1.writeDraft)(draftPath, draft);
80
+ console.log(`Imported piece "${newId}"${newId !== sourcePiece.id ? ` (from "${sourcePiece.id}")` : ""} into "${pieceType}": ` +
81
+ `logic ${piece.version.logic}, media ${piece.version.media}`);
82
+ }));
83
+ //# sourceMappingURL=import-piece.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-piece.js","sourceRoot":"","sources":["../../../src/commands/roster/import-piece.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./add-piece"), exports);
18
+ __exportStar(require("./edit-piece"), exports);
19
+ __exportStar(require("./import-piece"), exports);
20
+ __exportStar(require("./rescan"), exports);
21
+ __exportStar(require("./test-download"), exports);
22
+ __exportStar(require("./list"), exports);
23
+ __exportStar(require("./remove-piece"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/roster/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,+CAA6B;AAC7B,iDAA+B;AAC/B,2CAAyB;AACzB,kDAAgC;AAChC,yCAAuB;AACvB,iDAA+B"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rosterListCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const draft_io_1 = require("../../lib/draft-io");
6
+ const cli_options_1 = require("../../lib/cli-options");
7
+ const errors_1 = require("../../lib/errors");
8
+ exports.rosterListCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("list"))
9
+ .description("List pieces in the staged lock's rosters")
10
+ .argument("[pieceType]", "the piece type key (defaults to listing every piece type's roster)")
11
+ .action((0, errors_1.withErrorHandling)(async (pieceType, opts) => {
12
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
13
+ const draft = (0, draft_io_1.readDraft)(draftPath);
14
+ const collections = pieceType
15
+ ? { [pieceType]: draft.stagedLock.rosters[pieceType] ?? [] }
16
+ : draft.stagedLock.rosters;
17
+ for (const [type, pieces] of Object.entries(collections)) {
18
+ console.log(`${type}:`);
19
+ for (const piece of pieces) {
20
+ console.log(` ${piece.id} logic=${piece.version.logic.slice(0, 12)} sources=${piece.downloadSources.length}`);
21
+ }
22
+ }
23
+ }));
24
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/roster/list.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAAiE;AACjE,uDAAwD;AACxD,6CAAqD;AAExC,QAAA,iBAAiB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,MAAM,CAAC,CAAC;KAClE,WAAW,CAAC,0CAA0C,CAAC;KACvD,QAAQ,CAAC,aAAa,EAAE,oEAAoE,CAAC;KAC7F,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,SAA6B,EAAE,IAAwB,EAAE,EAAE;IAC1F,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,SAAS;QAC3B,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE;QAC5D,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;IAE7B,KAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACxB,KAAI,MAAM,KAAK,IAAI,MAAM,EAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,WAAW,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removePieceCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const shared_1 = require("@roster-lock/shared");
6
+ const draft_io_1 = require("../../lib/draft-io");
7
+ const cli_options_1 = require("../../lib/cli-options");
8
+ const errors_1 = require("../../lib/errors");
9
+ exports.removePieceCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("remove-piece"))
10
+ .description("Remove a piece from the staged lock's rosters")
11
+ .argument("<pieceType>", "the piece type key")
12
+ .argument("<pieceId>", "the piece's id (as shown by \"roster list\")")
13
+ .action((0, errors_1.withErrorHandling)(async (pieceType, pieceId, opts) => {
14
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
15
+ const draft = (0, draft_io_1.readDraft)(draftPath);
16
+ const collection = draft.stagedLock.rosters[pieceType];
17
+ if (!collection)
18
+ throw new Error(`Unknown piece type "${pieceType}"`);
19
+ const index = collection.findIndex((p) => p.id === pieceId);
20
+ if (index === -1)
21
+ throw new Error(`Unknown piece "${pieceId}" in "${pieceType}"`);
22
+ collection.splice(index, 1);
23
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
24
+ const pieceInfo = draft.draft.rosterPieceInfo[pieceType];
25
+ if (pieceInfo)
26
+ delete pieceInfo[pieceId];
27
+ (0, draft_io_1.writeDraft)(draftPath, draft);
28
+ console.log(`Removed piece "${pieceId}" from "${pieceType}"`);
29
+ }));
30
+ //# sourceMappingURL=remove-piece.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-piece.js","sourceRoot":"","sources":["../../../src/commands/roster/remove-piece.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,gDAAsE;AACtE,iDAA6E;AAC7E,uDAAwD;AACxD,6CAAqD;AAExC,QAAA,kBAAkB,GAAG,IAAA,6BAAe,EAAC,IAAI,mBAAO,CAAC,cAAc,CAAC,CAAC;KAC3E,WAAW,CAAC,+CAA+C,CAAC;KAC5D,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;KAC7C,QAAQ,CAAC,WAAW,EAAE,8CAA8C,CAAC;KACrE,MAAM,CAAC,IAAA,0BAAiB,EAAC,KAAK,EAAE,SAAiB,EAAE,OAAe,EAAE,IAAwB,EAAE,EAAE;IAC/F,MAAM,SAAS,GAAG,IAAA,2BAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,oBAAS,EAAC,SAAS,CAAC,CAAC;IAEnC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,IAAG,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,GAAG,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC5D,IAAG,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,SAAS,SAAS,GAAG,CAAC,CAAC;IAEjF,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5B,wCAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,IAAG,SAAS;QAAE,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;IAExC,IAAA,qBAAU,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,WAAW,SAAS,GAAG,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rescanCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const shared_1 = require("@roster-lock/shared");
6
+ const draft_io_1 = require("../../lib/draft-io");
7
+ const cli_options_1 = require("../../lib/cli-options");
8
+ const errors_1 = require("../../lib/errors");
9
+ const parse_1 = require("../../lib/parse");
10
+ const piece_scan_1 = require("../../lib/piece-scan");
11
+ exports.rescanCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("rescan"))
12
+ .description("Recompute an existing roster piece's asset hashes from its folder (e.g. after adding new asset files or " +
13
+ "changing an asset definition), without touching its id, humanInfo, downloadSources, or requiredPieces")
14
+ .argument("<pieceType>", "the piece type key")
15
+ .argument("<pieceId>", "the piece's id (as shown by \"roster list\")")
16
+ .argument("[folder]", "path to the folder to scan (defaults to the folder used by the last \"roster add-piece\"/\"roster rescan\")")
17
+ .option("--path-variables <k=v,...>", "path variable values used to resolve this piece's asset globs (defaults to the piece's existing path variables)")
18
+ .action((0, errors_1.withErrorHandling)(async (pieceType, pieceId, folderArg, opts) => {
19
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
20
+ const draft = (0, draft_io_1.readDraft)(draftPath);
21
+ const pieceDefinition = draft.stagedLock.engine.pieceDefinitions[pieceType];
22
+ if (!pieceDefinition)
23
+ throw new Error(`Unknown piece type "${pieceType}"`);
24
+ const collection = draft.stagedLock.rosters[pieceType];
25
+ if (!collection)
26
+ throw new Error(`Unknown piece type "${pieceType}"`);
27
+ const piece = collection.find((p) => p.id === pieceId);
28
+ if (!piece)
29
+ throw new Error(`Unknown piece "${pieceId}" in "${pieceType}"`);
30
+ const pieceInfo = draft.draft.rosterPieceInfo[pieceType]?.[pieceId];
31
+ const folder = folderArg ?? pieceInfo?.referenceFolder;
32
+ if (!folder) {
33
+ throw new Error(`No folder recorded for piece "${pieceId}"; pass one explicitly: ` +
34
+ `roster rescan ${pieceType} ${pieceId} <folder>`);
35
+ }
36
+ const pathVariables = opts.pathVariables !== undefined ? (0, parse_1.parseKeyValueList)(opts.pathVariables) : piece.pathVariables;
37
+ const { version, errors } = await (0, piece_scan_1.scanPieceFolder)(folder, pathVariables, pieceDefinition);
38
+ if (errors.length > 0) {
39
+ for (const err of errors)
40
+ console.error(`[${err.type}] ${err.id}: ${err.message}`);
41
+ throw new Error(`Folder does not match piece type "${pieceType}"'s asset definitions`);
42
+ }
43
+ const oldVersion = piece.version;
44
+ piece.version = version;
45
+ shared_1.ROSTERLOCK_V1_CASTER_JSONSCHEMA.cast(draft.stagedLock);
46
+ draft.draft.rosterPieceInfo[pieceType] ??= {};
47
+ draft.draft.rosterPieceInfo[pieceType][pieceId] = {
48
+ referenceFolder: folder,
49
+ testedDownloadSources: [],
50
+ };
51
+ (0, draft_io_1.writeDraft)(draftPath, draft);
52
+ console.log(`Rescanned piece "${pieceId}" in "${pieceType}": ` +
53
+ `logic ${oldVersion.logic}->${version.logic}, media ${oldVersion.media}->${version.media}, docs ${oldVersion.docs}->${version.docs}`);
54
+ }));
55
+ //# sourceMappingURL=rescan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescan.js","sourceRoot":"","sources":["../../../src/commands/roster/rescan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testDownloadCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_os_1 = require("node:os");
7
+ const node_path_1 = require("node:path");
8
+ const plugin_runtime_1 = require("@roster-lock/plugin-runtime");
9
+ const draft_io_1 = require("../../lib/draft-io");
10
+ const cli_options_1 = require("../../lib/cli-options");
11
+ const errors_1 = require("../../lib/errors");
12
+ const piece_scan_1 = require("../../lib/piece-scan");
13
+ exports.testDownloadCommand = (0, cli_options_1.withDraftOption)(new commander_1.Command("test-download"))
14
+ .description("Download a source over the network, verify its hash matches the piece, and record the test")
15
+ .argument("<pieceType>", "the piece type key")
16
+ .argument("<pieceId>", "the piece's id (as shown by \"roster list\")")
17
+ .argument("<sourceUrl>", "download source url to fetch and verify")
18
+ .action((0, errors_1.withErrorHandling)(async (pieceType, pieceId, sourceUrl, opts) => {
19
+ const draftPath = (0, draft_io_1.resolveDraftPath)(opts.draft);
20
+ const draft = (0, draft_io_1.readDraft)(draftPath);
21
+ const pieceDefinition = draft.stagedLock.engine.pieceDefinitions[pieceType];
22
+ if (!pieceDefinition)
23
+ throw new Error(`Unknown piece type "${pieceType}"`);
24
+ const piece = draft.stagedLock.rosters[pieceType]?.find((p) => p.id === pieceId);
25
+ if (!piece)
26
+ throw new Error(`Unknown piece "${pieceId}" in "${pieceType}"`);
27
+ const tempDir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "rosterlock-test-download-"));
28
+ try {
29
+ const { finishPromise } = await (0, plugin_runtime_1.downloadToFolder)(plugin_runtime_1.DEFAULT_PLUGIN_DIR, {
30
+ url: sourceUrl,
31
+ destinationFolder: tempDir,
32
+ processHandlers: {
33
+ abortSignal: new AbortController().signal,
34
+ onProgress: (progress, total) => {
35
+ process.stderr.write(`\rDownloading... ${progress}${total ? `/${total}` : ""}`);
36
+ },
37
+ },
38
+ });
39
+ await finishPromise;
40
+ process.stderr.write("\n");
41
+ const { version, errors } = await (0, piece_scan_1.scanPieceFolder)(tempDir, piece.pathVariables, pieceDefinition);
42
+ if (errors.length > 0) {
43
+ for (const err of errors)
44
+ console.error(`[${err.type}] ${err.id}: ${err.message}`);
45
+ throw new Error("Downloaded folder does not match the piece type's asset definitions");
46
+ }
47
+ if (version.logic !== piece.version.logic ||
48
+ version.media !== piece.version.media ||
49
+ version.docs !== piece.version.docs) {
50
+ console.error("Version mismatch:");
51
+ console.error(` expected: ${JSON.stringify(piece.version)}`);
52
+ console.error(` actual: ${JSON.stringify(version)}`);
53
+ throw new Error(`Downloaded source does not match the recorded version for "${pieceId}"`);
54
+ }
55
+ if (!piece.downloadSources.includes(sourceUrl)) {
56
+ piece.downloadSources.push(sourceUrl);
57
+ }
58
+ draft.draft.rosterPieceInfo[pieceType] ??= {};
59
+ const pieceInfo = draft.draft.rosterPieceInfo[pieceType][pieceId] ?? (draft.draft.rosterPieceInfo[pieceType][pieceId] = { testedDownloadSources: [] });
60
+ pieceInfo.testedDownloadSources.push({
61
+ source: sourceUrl,
62
+ testedAt: Date.now(),
63
+ version,
64
+ });
65
+ (0, draft_io_1.writeDraft)(draftPath, draft);
66
+ console.log(`Verified download source for "${pieceId}"`);
67
+ }
68
+ finally {
69
+ await (0, promises_1.rm)(tempDir, { recursive: true, force: true });
70
+ }
71
+ }));
72
+ //# sourceMappingURL=test-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-download.js","sourceRoot":"","sources":["../../../src/commands/roster/test-download.ts"],"names":[],"mappings":"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"}