@clickraft/cli 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -144,7 +144,7 @@ var EXIT_CODE_MAP = {
144
144
  exitCode: 2,
145
145
  category: "usage",
146
146
  retryable: false,
147
- hint: "Run `node-type list` for the current set of node types."
147
+ hint: "Run `clickraft nodes list` for the current set of node types."
148
148
  },
149
149
  CANVAS_REV_MISMATCH: {
150
150
  exitCode: 7,
@@ -188,6 +188,12 @@ var EXIT_CODE_MAP = {
188
188
  retryable: false,
189
189
  hint: "Resource not found."
190
190
  },
191
+ NODE_TYPE_NOT_FOUND: {
192
+ exitCode: 2,
193
+ category: "usage",
194
+ retryable: false,
195
+ hint: "Run `clickraft nodes list` for the current set of node types."
196
+ },
191
197
  FEATURE_DISABLED: {
192
198
  exitCode: 2,
193
199
  category: "usage",
@@ -2587,7 +2593,14 @@ var ModelSummarySchema = z8.object({
2587
2593
  output: z8.array(z8.string())
2588
2594
  }).passthrough().nullable(),
2589
2595
  bestFor: z8.array(z8.string()),
2590
- badges: z8.array(z8.string()),
2596
+ badges: z8.array(
2597
+ z8.object({
2598
+ type: z8.string(),
2599
+ label: z8.string(),
2600
+ color: z8.string(),
2601
+ expires_at: z8.string().nullable().optional()
2602
+ }).strict()
2603
+ ),
2591
2604
  isFeatured: z8.boolean(),
2592
2605
  isDefault: z8.boolean(),
2593
2606
  docsUrl: z8.string().nullable(),
@@ -2633,28 +2646,86 @@ async function listModels(opts) {
2633
2646
  return data;
2634
2647
  }
2635
2648
 
2636
- // src/commands/product/list.ts
2649
+ // src/schemas/node-types.ts
2637
2650
  import { z as z9 } from "zod";
2638
- var ProductImageSummarySchema = z9.object({
2639
- id: z9.string().uuid(),
2640
- url: z9.string(),
2641
- altText: z9.string().nullable(),
2642
- isPrimary: z9.boolean(),
2643
- sortOrder: z9.number().int()
2651
+ var NodeTypeSummarySchema = z9.object({
2652
+ type: z9.string(),
2653
+ portCount: z9.number()
2654
+ }).strict();
2655
+ var NodeTypePortSchema = z9.object({
2656
+ handleId: z9.string(),
2657
+ direction: z9.enum(["input", "output"]),
2658
+ dataType: z9.string()
2659
+ }).strict();
2660
+ var NodeTypeDetailSchema = z9.object({
2661
+ type: z9.string(),
2662
+ ports: z9.array(NodeTypePortSchema),
2663
+ agentWritableFields: z9.array(z9.string())
2664
+ }).strict();
2665
+ var NodeTypesListResponseSchema = z9.object({
2666
+ nodeTypes: z9.array(NodeTypeSummarySchema)
2667
+ }).strict();
2668
+
2669
+ // src/commands/nodes/internal.ts
2670
+ async function buildNodesClient(opts) {
2671
+ const cfg = await loadConfig({
2672
+ flagProfile: opts.profile,
2673
+ flagApiBaseUrl: opts.apiBaseUrl,
2674
+ flagToken: opts.token
2675
+ });
2676
+ return new ApiClient({
2677
+ apiBaseUrl: cfg.apiBaseUrl,
2678
+ accessToken: cfg.accessToken,
2679
+ signal: opts.signal,
2680
+ cloudflareAccess: cfg.cloudflareAccess
2681
+ });
2682
+ }
2683
+
2684
+ // src/commands/nodes/describe.ts
2685
+ async function describeNode(opts) {
2686
+ const client = opts.client ?? await buildNodesClient(opts);
2687
+ return client.request({
2688
+ method: "GET",
2689
+ path: `/node-types/${encodeURIComponent(opts.type)}`,
2690
+ responseSchema: NodeTypeDetailSchema,
2691
+ signal: opts.signal
2692
+ });
2693
+ }
2694
+
2695
+ // src/commands/nodes/list.ts
2696
+ async function listNodes(opts) {
2697
+ const client = opts.client ?? await buildNodesClient(opts);
2698
+ const data = await client.request({
2699
+ method: "GET",
2700
+ path: "/node-types",
2701
+ responseSchema: NodeTypesListResponseSchema,
2702
+ signal: opts.signal
2703
+ });
2704
+ return data;
2705
+ }
2706
+
2707
+ // src/commands/product/list.ts
2708
+ import { z as z10 } from "zod";
2709
+ var ProductImageSummarySchema = z10.object({
2710
+ id: z10.string().uuid(),
2711
+ url: z10.string(),
2712
+ altText: z10.string().nullable(),
2713
+ isPrimary: z10.boolean(),
2714
+ sortOrder: z10.number().int()
2644
2715
  });
2645
- var ProductSummarySchema = z9.object({
2646
- id: z9.string().uuid(),
2647
- title: z9.string(),
2648
- sourceType: z9.string(),
2649
- syncStatus: z9.enum(["synced", "pending", "stale", "error", "deleted_upstream"]).nullable(),
2650
- vendor: z9.string().nullable(),
2651
- productType: z9.string().nullable(),
2652
- tags: z9.array(z9.string()),
2653
- images: z9.array(ProductImageSummarySchema)
2716
+ var ProductSummarySchema = z10.object({
2717
+ id: z10.string().uuid(),
2718
+ title: z10.string(),
2719
+ sourceType: z10.string(),
2720
+ syncStatus: z10.enum(["synced", "pending", "stale", "error", "deleted_upstream"]).nullable(),
2721
+ vendor: z10.string().nullable(),
2722
+ productType: z10.string().nullable(),
2723
+ tags: z10.array(z10.string()),
2724
+ images: z10.array(ProductImageSummarySchema)
2654
2725
  });
2655
- var ProductsListResponseSchema = z9.object({
2656
- items: z9.array(ProductSummarySchema),
2657
- nextCursor: z9.string().nullable()
2726
+ var ProductsListResponseSchema = z10.object({
2727
+ items: z10.array(ProductSummarySchema),
2728
+ nextCursor: z10.string().nullable()
2658
2729
  });
2659
2730
  var DEFAULT_LIMIT = 50;
2660
2731
  async function listProducts(options) {
@@ -2785,33 +2856,33 @@ async function buildTemplateClient(opts) {
2785
2856
  }
2786
2857
 
2787
2858
  // src/schemas/templates.ts
2788
- import { z as z10 } from "zod";
2789
- var DeclaredParamSchema = z10.object({
2790
- name: z10.string(),
2791
- type: z10.string(),
2792
- required: z10.boolean(),
2793
- defaultValue: z10.string().nullable().optional(),
2794
- enumValues: z10.array(z10.string()).nullable().optional(),
2795
- description: z10.string().nullable().optional()
2859
+ import { z as z11 } from "zod";
2860
+ var DeclaredParamSchema = z11.object({
2861
+ name: z11.string(),
2862
+ type: z11.string(),
2863
+ required: z11.boolean(),
2864
+ defaultValue: z11.string().nullable().optional(),
2865
+ enumValues: z11.array(z11.string()).nullable().optional(),
2866
+ description: z11.string().nullable().optional()
2796
2867
  }).strict();
2797
- var TemplateSummarySchema = z10.object({
2798
- id: z10.string().uuid(),
2799
- source: z10.enum(["own", "system"]),
2800
- name: z10.string(),
2801
- description: z10.string().nullable(),
2802
- category: z10.string().nullable(),
2803
- thumbnailUrl: z10.string().nullable(),
2804
- tags: z10.array(z10.string()),
2805
- createdAt: z10.string()
2868
+ var TemplateSummarySchema = z11.object({
2869
+ id: z11.string().uuid(),
2870
+ source: z11.enum(["own", "system"]),
2871
+ name: z11.string(),
2872
+ description: z11.string().nullable(),
2873
+ category: z11.string().nullable(),
2874
+ thumbnailUrl: z11.string().nullable(),
2875
+ tags: z11.array(z11.string()),
2876
+ createdAt: z11.string()
2806
2877
  }).strict();
2807
2878
  var TemplateDetailSchema = TemplateSummarySchema.extend({
2808
- declaredParams: z10.array(DeclaredParamSchema),
2809
- timesUsed: z10.number()
2879
+ declaredParams: z11.array(DeclaredParamSchema),
2880
+ timesUsed: z11.number()
2810
2881
  }).strict();
2811
- var TemplatesListResponseSchema = z10.object({
2812
- templates: z10.array(TemplateSummarySchema),
2813
- cursor: z10.string().nullable(),
2814
- hasMore: z10.boolean()
2882
+ var TemplatesListResponseSchema = z11.object({
2883
+ templates: z11.array(TemplateSummarySchema),
2884
+ cursor: z11.string().nullable(),
2885
+ hasMore: z11.boolean()
2815
2886
  }).strict();
2816
2887
 
2817
2888
  // src/commands/template/list.ts
@@ -2861,20 +2932,20 @@ async function getTemplate(opts) {
2861
2932
  }
2862
2933
 
2863
2934
  // src/commands/tokens/list.ts
2864
- import { z as z11 } from "zod";
2865
- var TokenRowSchema = z11.object({
2866
- id: z11.string().uuid(),
2867
- organizationId: z11.string().uuid(),
2868
- userId: z11.string().uuid(),
2869
- clientId: z11.string().nullable(),
2870
- tokenPrefix: z11.string(),
2871
- name: z11.string().nullable(),
2872
- scopes: z11.array(z11.string()),
2873
- lastUsedAt: z11.string().nullable(),
2874
- expiresAt: z11.string(),
2875
- createdAt: z11.string()
2935
+ import { z as z12 } from "zod";
2936
+ var TokenRowSchema = z12.object({
2937
+ id: z12.string().uuid(),
2938
+ organizationId: z12.string().uuid(),
2939
+ userId: z12.string().uuid(),
2940
+ clientId: z12.string().nullable(),
2941
+ tokenPrefix: z12.string(),
2942
+ name: z12.string().nullable(),
2943
+ scopes: z12.array(z12.string()),
2944
+ lastUsedAt: z12.string().nullable(),
2945
+ expiresAt: z12.string(),
2946
+ createdAt: z12.string()
2876
2947
  }).strict();
2877
- var TokensListResponseSchema = z11.array(TokenRowSchema);
2948
+ var TokensListResponseSchema = z12.array(TokenRowSchema);
2878
2949
  async function listTokens(options) {
2879
2950
  const config = await loadConfig({
2880
2951
  flagProfile: options.profile,
@@ -2900,51 +2971,51 @@ async function listTokens(options) {
2900
2971
  }
2901
2972
 
2902
2973
  // src/schemas/workflows.ts
2903
- import { z as z12 } from "zod";
2904
- var WorkflowDeclaredParamSchema = z12.object({
2905
- name: z12.string(),
2906
- type: z12.string(),
2907
- required: z12.boolean().optional(),
2908
- defaultValue: z12.unknown().optional(),
2909
- description: z12.unknown().optional()
2974
+ import { z as z13 } from "zod";
2975
+ var WorkflowDeclaredParamSchema = z13.object({
2976
+ name: z13.string(),
2977
+ type: z13.string(),
2978
+ required: z13.boolean().optional(),
2979
+ defaultValue: z13.unknown().optional(),
2980
+ description: z13.unknown().optional()
2910
2981
  }).passthrough();
2911
- var WorkflowSummarySchema = z12.object({
2912
- id: z12.string().uuid(),
2913
- name: z12.string(),
2914
- tags: z12.array(z12.string()),
2915
- declared_params: z12.array(WorkflowDeclaredParamSchema).nullable().default([]),
2916
- canvas_rev: z12.number().int().nonnegative(),
2917
- updated_at: z12.string()
2982
+ var WorkflowSummarySchema = z13.object({
2983
+ id: z13.string().uuid(),
2984
+ name: z13.string(),
2985
+ tags: z13.array(z13.string()),
2986
+ declared_params: z13.array(WorkflowDeclaredParamSchema).nullable().default([]),
2987
+ canvas_rev: z13.number().int().nonnegative(),
2988
+ updated_at: z13.string()
2918
2989
  }).strict();
2919
- var WorkflowsListResponseSchema = z12.object({
2920
- items: z12.array(WorkflowSummarySchema),
2921
- nextCursor: z12.string().nullable()
2990
+ var WorkflowsListResponseSchema = z13.object({
2991
+ items: z13.array(WorkflowSummarySchema),
2992
+ nextCursor: z13.string().nullable()
2922
2993
  }).strict();
2923
- var WorkflowDetailSchema = z12.object({
2924
- id: z12.string().uuid(),
2925
- name: z12.string(),
2926
- description: z12.string().nullable(),
2927
- tags: z12.array(z12.string()),
2928
- declared_params: z12.array(WorkflowDeclaredParamSchema).nullable().default([]),
2929
- canvas_rev: z12.number().int().nonnegative(),
2930
- nodes: z12.array(z12.unknown()),
2931
- edges: z12.array(z12.unknown()),
2932
- created_at: z12.string(),
2933
- updated_at: z12.string()
2994
+ var WorkflowDetailSchema = z13.object({
2995
+ id: z13.string().uuid(),
2996
+ name: z13.string(),
2997
+ description: z13.string().nullable(),
2998
+ tags: z13.array(z13.string()),
2999
+ declared_params: z13.array(WorkflowDeclaredParamSchema).nullable().default([]),
3000
+ canvas_rev: z13.number().int().nonnegative(),
3001
+ nodes: z13.array(z13.unknown()),
3002
+ edges: z13.array(z13.unknown()),
3003
+ created_at: z13.string(),
3004
+ updated_at: z13.string()
2934
3005
  }).strict();
2935
- var WorkflowCreateResponseSchema = z12.object({
2936
- id: z12.string().uuid(),
2937
- name: z12.string(),
2938
- description: z12.string().nullable(),
2939
- tags: z12.array(z12.string()),
2940
- declared_params: z12.array(WorkflowDeclaredParamSchema).nullable().default([]),
2941
- canvas_rev: z12.number().int().nonnegative(),
2942
- created_at: z12.string(),
2943
- updated_at: z12.string()
3006
+ var WorkflowCreateResponseSchema = z13.object({
3007
+ id: z13.string().uuid(),
3008
+ name: z13.string(),
3009
+ description: z13.string().nullable(),
3010
+ tags: z13.array(z13.string()),
3011
+ declared_params: z13.array(WorkflowDeclaredParamSchema).nullable().default([]),
3012
+ canvas_rev: z13.number().int().nonnegative(),
3013
+ created_at: z13.string(),
3014
+ updated_at: z13.string()
2944
3015
  }).strict();
2945
- var WorkflowMutateResponseSchema = z12.object({
2946
- canvas_rev: z12.number().int().nonnegative(),
2947
- applied: z12.number().int().nonnegative(),
3016
+ var WorkflowMutateResponseSchema = z13.object({
3017
+ canvas_rev: z13.number().int().nonnegative(),
3018
+ applied: z13.number().int().nonnegative(),
2948
3019
  workflow: WorkflowDetailSchema
2949
3020
  }).strict();
2950
3021
 
@@ -3439,6 +3510,40 @@ function renderTemplateDetail(detail, out) {
3439
3510
  }
3440
3511
  out.write(lines.join("\n") + "\n");
3441
3512
  }
3513
+ function renderNodesList(result, out) {
3514
+ const { nodeTypes } = result;
3515
+ if (nodeTypes.length === 0) {
3516
+ out.write("No node types.\n");
3517
+ return;
3518
+ }
3519
+ const headers = ["TYPE", "PORTS"];
3520
+ const data = nodeTypes.map((n) => [n.type, String(n.portCount)]);
3521
+ const widths = headers.map(
3522
+ (header, i) => Math.max(header.length, ...data.map((cells) => cells[i].length))
3523
+ );
3524
+ const padRow = (cells) => cells.map((cell, i) => cell.padEnd(widths[i])).join(" ").trimEnd();
3525
+ out.write(padRow(headers) + "\n");
3526
+ for (const cells of data) out.write(padRow(cells) + "\n");
3527
+ }
3528
+ function renderNodeDetail(detail, out) {
3529
+ const lines = [detail.type, "", "Ports:"];
3530
+ if (detail.ports.length === 0) {
3531
+ lines.push(" (none)");
3532
+ } else {
3533
+ for (const p of detail.ports) {
3534
+ lines.push(` - ${p.handleId} (${p.direction}, ${p.dataType})`);
3535
+ }
3536
+ }
3537
+ lines.push("", "Agent-writable fields:");
3538
+ if (detail.agentWritableFields.length === 0) {
3539
+ lines.push(" (none)");
3540
+ } else {
3541
+ for (const field of detail.agentWritableFields) {
3542
+ lines.push(` - ${field}`);
3543
+ }
3544
+ }
3545
+ out.write(lines.join("\n") + "\n");
3546
+ }
3442
3547
  var TIER_ORDER = { premium: 0, pro: 1, standard: 2 };
3443
3548
  function renderModelsList(result, out, options) {
3444
3549
  const { models } = result;
@@ -3464,15 +3569,22 @@ function renderModelsList(result, out, options) {
3464
3569
  out.write(`${sorted.length} models${filterSuffix}
3465
3570
 
3466
3571
  `);
3467
- const headers = ["SLUG", "NAME", "CATEGORY", "TIER", "CREDITS", "DEFAULT"];
3468
- const data = sorted.map((m) => [
3469
- m.slug,
3470
- m.displayName,
3471
- m.category,
3472
- m.costTier,
3473
- String(m.creditCost),
3474
- m.isDefault ? "\u2713" : ""
3475
- ]);
3572
+ const MAX_BADGES = 3;
3573
+ const headers = ["SLUG", "NAME", "CATEGORY", "TIER", "CREDITS", "DEFAULT", "BADGES"];
3574
+ const data = sorted.map((m) => {
3575
+ const labels = m.badges.map((b) => b.label);
3576
+ const shown = labels.slice(0, MAX_BADGES).join(", ");
3577
+ const extra = labels.length > MAX_BADGES ? ` +${labels.length - MAX_BADGES} more` : "";
3578
+ return [
3579
+ m.slug,
3580
+ m.displayName,
3581
+ m.category,
3582
+ m.costTier,
3583
+ String(m.creditCost),
3584
+ m.isDefault ? "\u2713" : "",
3585
+ labels.length > 0 ? shown + extra : "\u2014"
3586
+ ];
3587
+ });
3476
3588
  const widths = headers.map(
3477
3589
  (header, i) => Math.max(header.length, ...data.map((cells) => cells[i].length))
3478
3590
  );
@@ -3808,6 +3920,8 @@ function renderRootHelp(version) {
3808
3920
  " brand-model list List available brand models",
3809
3921
  " product list List products in your organization",
3810
3922
  " models list List available AI models",
3923
+ " nodes list List available workflow node types",
3924
+ " nodes describe Describe a node type's ports and fields",
3811
3925
  " telemetry inspect Show current telemetry state and payload shape",
3812
3926
  " template list List available templates",
3813
3927
  " template get Fetch a template by ID",
@@ -3949,6 +4063,42 @@ function renderCommandHelp(command) {
3949
4063
  " clickraft models list --featured --json",
3950
4064
  ""
3951
4065
  ].join("\n");
4066
+ case "nodes":
4067
+ return [
4068
+ "Usage: clickraft nodes <subcommand> [options]",
4069
+ "",
4070
+ "Subcommands:",
4071
+ " list List available workflow node types",
4072
+ " describe Show a node type's ports and agent-writable fields",
4073
+ ""
4074
+ ].join("\n");
4075
+ case "nodes list":
4076
+ return [
4077
+ "Usage: clickraft nodes list [options]",
4078
+ "",
4079
+ "Lists the workflow node types available to the API, with port counts.",
4080
+ "",
4081
+ "Options:",
4082
+ " --profile <name>",
4083
+ " --api-base-url <url>",
4084
+ " --token <token>",
4085
+ " --json",
4086
+ ""
4087
+ ].join("\n");
4088
+ case "nodes describe":
4089
+ return [
4090
+ "Usage: clickraft nodes describe <type> [options]",
4091
+ "",
4092
+ "Shows a node type's ports (handleId, direction, dataType) and the fields",
4093
+ "an agent may write. Handle ids are printed verbatim for use in edges.",
4094
+ "",
4095
+ "Options:",
4096
+ " --profile <name>",
4097
+ " --api-base-url <url>",
4098
+ " --token <token>",
4099
+ " --json",
4100
+ ""
4101
+ ].join("\n");
3952
4102
  case "telemetry inspect":
3953
4103
  return [
3954
4104
  "Usage: clickraft telemetry inspect [options]",
@@ -4236,6 +4386,13 @@ function matchNewCommand(argv) {
4236
4386
  if (sub === void 0 || sub.startsWith("-")) return { kind: "sub-help", verb: "models" };
4237
4387
  return { kind: "unknown-sub", verb: "models", sub };
4238
4388
  }
4389
+ if (verb === "nodes") {
4390
+ const sub = argv[1];
4391
+ if (sub === "list") return { kind: "cmd", path: "nodes.list", verbTokenCount: 2 };
4392
+ if (sub === "describe") return { kind: "cmd", path: "nodes.describe", verbTokenCount: 2 };
4393
+ if (sub === void 0 || sub.startsWith("-")) return { kind: "sub-help", verb: "nodes" };
4394
+ return { kind: "unknown-sub", verb: "nodes", sub };
4395
+ }
4239
4396
  if (verb === "workflow") {
4240
4397
  const sub = argv[1];
4241
4398
  if (sub === "create") return { kind: "cmd", path: "workflow.create", verbTokenCount: 2 };
@@ -4305,6 +4462,10 @@ async function runNewCommand(newCmd, options, stdout, stderr) {
4305
4462
  return await runProductList(argvAfterVerb, ctx, rc);
4306
4463
  case "models.list":
4307
4464
  return await runModelsList(argvAfterVerb, ctx, rc);
4465
+ case "nodes.list":
4466
+ return await runNodesList(argvAfterVerb, ctx, rc);
4467
+ case "nodes.describe":
4468
+ return await runNodesDescribe(argvAfterVerb, ctx, rc);
4308
4469
  case "workflow.create":
4309
4470
  return await runWorkflowCreate(argvAfterVerb, ctx, rc);
4310
4471
  case "workflow.list":
@@ -4691,6 +4852,57 @@ function emitModelsList(result, ctx, rc, parsed) {
4691
4852
  }
4692
4853
  });
4693
4854
  }
4855
+ async function runNodesList(argv, ctx, rc) {
4856
+ const parsed = parseArgs(argv, {
4857
+ string: [...COMMON_RICH_STRING_FLAGS],
4858
+ boolean: [...COMMON_RICH_BOOL_FLAGS]
4859
+ });
4860
+ const result = await listNodes({
4861
+ profile: parsed.string.profile,
4862
+ apiBaseUrl: parsed.string["api-base-url"],
4863
+ token: parsed.string.token,
4864
+ signal: rc.signal
4865
+ });
4866
+ emitNodesList(result, ctx, rc);
4867
+ return 0;
4868
+ }
4869
+ async function runNodesDescribe(argv, ctx, rc) {
4870
+ const parsed = parseArgs(argv, {
4871
+ string: [...COMMON_RICH_STRING_FLAGS],
4872
+ boolean: [...COMMON_RICH_BOOL_FLAGS]
4873
+ });
4874
+ const type = parsed.positional[0];
4875
+ if (!type) throw new ArgError("Missing required <type> argument.");
4876
+ const detail = await describeNode({
4877
+ type,
4878
+ profile: parsed.string.profile,
4879
+ apiBaseUrl: parsed.string["api-base-url"],
4880
+ token: parsed.string.token,
4881
+ signal: rc.signal
4882
+ });
4883
+ emitNodeDetail(detail, ctx, rc);
4884
+ return 0;
4885
+ }
4886
+ function emitNodesList(result, ctx, rc) {
4887
+ if (rc.signal?.aborted) {
4888
+ throw new AuthError("AUTH_FLOW_CANCELLED", "Cancelled.");
4889
+ }
4890
+ if (rc.jsonMode) {
4891
+ rc.stdout.write(JSON.stringify(wrapSuccess(result, ctx)) + "\n");
4892
+ return;
4893
+ }
4894
+ renderNodesList(result, rc.stdout);
4895
+ }
4896
+ function emitNodeDetail(detail, ctx, rc) {
4897
+ if (rc.signal?.aborted) {
4898
+ throw new AuthError("AUTH_FLOW_CANCELLED", "Cancelled.");
4899
+ }
4900
+ if (rc.jsonMode) {
4901
+ rc.stdout.write(JSON.stringify(wrapSuccess(detail, ctx)) + "\n");
4902
+ return;
4903
+ }
4904
+ renderNodeDetail(detail, rc.stdout);
4905
+ }
4694
4906
  async function runWorkflowCreate(argv, ctx, rc) {
4695
4907
  const parsed = parseArgs(argv, {
4696
4908
  string: [...COMMON_RICH_STRING_FLAGS, "name", "description", "from-file"],