overlord-cli 4.15.0 → 4.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,7 +69,7 @@ function resolveProtocolMetadata(flags = {}, base = {}) {
69
69
  const metadata = { ...base };
70
70
 
71
71
  if (flags['metadata-json']) {
72
- const parsed = JSON.parse(String(flags['metadata-json']));
72
+ const parsed = parseJsonFlag('--metadata-json', flags['metadata-json']);
73
73
  if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
74
74
  throw new Error('--metadata-json must be a JSON object');
75
75
  }
@@ -215,6 +215,15 @@ function requireFlag(flags, name, envAlias) {
215
215
  return String(value);
216
216
  }
217
217
 
218
+ function parseJsonFlag(flagName, rawValue) {
219
+ try {
220
+ return JSON.parse(String(rawValue));
221
+ } catch (err) {
222
+ const detail = err instanceof Error ? err.message : String(err);
223
+ throw new Error(`${flagName} must be valid JSON: ${detail}`);
224
+ }
225
+ }
226
+
218
227
  function readTextFile(filePath, label) {
219
228
  try {
220
229
  return fs.readFileSync(filePath, 'utf8');
@@ -286,11 +295,7 @@ async function resolveChangeRationales(flags) {
286
295
  );
287
296
  }
288
297
  if (flags['change-rationales-json']) {
289
- try {
290
- return JSON.parse(String(flags['change-rationales-json']));
291
- } catch {
292
- throw new Error('--change-rationales-json must be valid JSON');
293
- }
298
+ return parseJsonFlag('--change-rationales-json', flags['change-rationales-json']);
294
299
  }
295
300
  return [];
296
301
  }
@@ -534,7 +539,7 @@ async function protocolUpdate(args) {
534
539
  : {}),
535
540
  ...(flags.phase ? { phase: String(flags.phase) } : {}),
536
541
  ...(flags['event-type'] ? { eventType: String(flags['event-type']) } : {}),
537
- ...(flags['payload-json'] ? { payload: JSON.parse(String(flags['payload-json'])) } : {}),
542
+ ...(flags['payload-json'] ? { payload: parseJsonFlag('--payload-json', flags['payload-json']) } : {}),
538
543
  ...(changeRationales.length > 0 ? { changeRationales } : {})
539
544
  };
540
545
 
@@ -613,7 +618,7 @@ async function protocolAsk(args) {
613
618
  ticketId,
614
619
  question,
615
620
  ...(flags.phase ? { phase: String(flags.phase) } : {}),
616
- ...(flags['payload-json'] ? { payload: JSON.parse(String(flags['payload-json'])) } : {})
621
+ ...(flags['payload-json'] ? { payload: parseJsonFlag('--payload-json', flags['payload-json']) } : {})
617
622
  };
618
623
 
619
624
  const data = await apiPost(platformUrl, agentToken, localSecret, '/api/protocol/ask', body, timeoutMs);
@@ -750,11 +755,7 @@ async function protocolDeliver(args) {
750
755
  if (flags['artifacts-file']) {
751
756
  artifacts = await readJsonFileOrStdin(String(flags['artifacts-file']), '--artifacts-file');
752
757
  } else if (flags['artifacts-json']) {
753
- try {
754
- artifacts = JSON.parse(String(flags['artifacts-json']));
755
- } catch {
756
- throw new Error('--artifacts-json must be valid JSON');
757
- }
758
+ artifacts = parseJsonFlag('--artifacts-json', flags['artifacts-json']);
758
759
  }
759
760
 
760
761
  if (deliverPayload && (flags['change-rationales-file'] || flags['change-rationales-json'])) {
@@ -805,7 +806,7 @@ async function protocolArtifactPrepareUpload(args) {
805
806
  ...(flags['artifact-type'] ? { artifactType: String(flags['artifact-type']) } : {}),
806
807
  ...(flags['content-type'] ? { contentType: String(flags['content-type']) } : {}),
807
808
  ...(flags['file-size'] ? { fileSize: parseInt(String(flags['file-size']), 10) } : {}),
808
- ...(flags['metadata-json'] ? { metadata: JSON.parse(String(flags['metadata-json'])) } : {})
809
+ ...(flags['metadata-json'] ? { metadata: parseJsonFlag('--metadata-json', flags['metadata-json']) } : {})
809
810
  };
810
811
 
811
812
  const data = await apiPost(
@@ -838,7 +839,7 @@ async function protocolArtifactFinalizeUpload(args) {
838
839
  ...(flags['artifact-type'] ? { artifactType: String(flags['artifact-type']) } : {}),
839
840
  ...(flags['content-type'] ? { contentType: String(flags['content-type']) } : {}),
840
841
  ...(flags['file-size'] ? { fileSize: parseInt(String(flags['file-size']), 10) } : {}),
841
- ...(flags['metadata-json'] ? { metadata: JSON.parse(String(flags['metadata-json'])) } : {})
842
+ ...(flags['metadata-json'] ? { metadata: parseJsonFlag('--metadata-json', flags['metadata-json']) } : {})
842
843
  };
843
844
 
844
845
  const data = await apiPost(
@@ -915,7 +916,7 @@ async function protocolArtifactUploadFile(args) {
915
916
  artifactType: String(flags['artifact-type'] ?? 'document'),
916
917
  contentType,
917
918
  fileSize: fileStats.size,
918
- ...(flags['metadata-json'] ? { metadata: JSON.parse(String(flags['metadata-json'])) } : {})
919
+ ...(flags['metadata-json'] ? { metadata: parseJsonFlag('--metadata-json', flags['metadata-json']) } : {})
919
920
  },
920
921
  timeoutMs
921
922
  );
@@ -941,7 +942,7 @@ async function protocolArtifactUploadFile(args) {
941
942
  artifactType: String(flags['artifact-type'] ?? 'document'),
942
943
  contentType,
943
944
  fileSize: fileStats.size,
944
- ...(flags['metadata-json'] ? { metadata: JSON.parse(String(flags['metadata-json'])) } : {})
945
+ ...(flags['metadata-json'] ? { metadata: parseJsonFlag('--metadata-json', flags['metadata-json']) } : {})
945
946
  },
946
947
  timeoutMs
947
948
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord-cli",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "description": "Overlord CLI — launch AI agents on tickets from anywhere",
5
5
  "type": "module",
6
6
  "bin": {