@warmhub/cli 0.126.0 → 0.128.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.
Files changed (2) hide show
  1. package/dist/wh.js +246 -206
  2. package/package.json +1 -1
package/dist/wh.js CHANGED
@@ -17766,16 +17766,37 @@ var BUILTIN_SHAPE_NAMES = [
17766
17766
  "List"
17767
17767
  ];
17768
17768
  var RETIRED_COLLECTION_SHAPE_NAMES = ["Triple"];
17769
+ var V2_RELATION_SHAPE_NAMES = ["Arc", "Bond"];
17770
+ var V2_AGGREGATE_SHAPE_NAMES = ["Set", "List"];
17771
+ var ORDINARY_COLLECTION_SHAPE_NAMES = [
17772
+ ...V2_RELATION_SHAPE_NAMES,
17773
+ ...V2_AGGREGATE_SHAPE_NAMES
17774
+ ];
17775
+ var COLLECTION_V2_SHAPE_NAMES = [
17776
+ "Collection",
17777
+ ...ORDINARY_COLLECTION_SHAPE_NAMES
17778
+ ];
17769
17779
  var RESERVED_COLLECTION_SHAPE_NAMES = [
17770
17780
  ...BUILTIN_SHAPE_NAMES,
17771
17781
  ...RETIRED_COLLECTION_SHAPE_NAMES
17772
17782
  ];
17783
+ var COLLECTION_CLASSIFICATION_SHAPE_NAMES = [
17784
+ "Collection",
17785
+ ...RESERVED_COLLECTION_SHAPE_NAMES
17786
+ ];
17787
+ var COLLECTION_CLASSIFICATION_SHAPE_NAME_SET = new Set(COLLECTION_CLASSIFICATION_SHAPE_NAMES);
17773
17788
  function isBuiltinCollectionShape(name) {
17774
17789
  return BUILTIN_SHAPE_NAMES.includes(name);
17775
17790
  }
17776
17791
  function isRetiredCollectionShape(name) {
17777
17792
  return RETIRED_COLLECTION_SHAPE_NAMES.includes(name);
17778
17793
  }
17794
+ function isOrdinaryCollectionShape(name) {
17795
+ return ORDINARY_COLLECTION_SHAPE_NAMES.includes(name);
17796
+ }
17797
+ function isCollectionV2Shape(name) {
17798
+ return COLLECTION_V2_SHAPE_NAMES.includes(name);
17799
+ }
17779
17800
  function isReservedCollectionShape(name) {
17780
17801
  return RESERVED_COLLECTION_SHAPE_NAMES.includes(name);
17781
17802
  }
@@ -17793,7 +17814,7 @@ var BUILTIN_LICENSE_SHAPE_NAMES = [
17793
17814
  ];
17794
17815
  var isLicenseShape = (name) => BUILTIN_LICENSE_SHAPE_NAMES.includes(name);
17795
17816
  function isRenameableSquattedShape(name) {
17796
- return isReservedCollectionShape(name) || isViewShape(name) || isLicenseShape(name);
17817
+ return isReservedCollectionShape(name) || isCollectionV2Shape(name) || isViewShape(name) || isLicenseShape(name);
17797
17818
  }
17798
17819
  function isBuiltinShape(name) {
17799
17820
  return BUILTIN_SHAPE_NAMES.includes(name) || BUILTIN_CONTENT_SHAPE_NAMES.includes(name) || BUILTIN_VIEW_SHAPE_NAMES.includes(name) || BUILTIN_LICENSE_SHAPE_NAMES.includes(name);
@@ -17838,6 +17859,47 @@ var BUILTIN_SHAPE_DEFS = {
17838
17859
  description: "An ordered list of things"
17839
17860
  }
17840
17861
  };
17862
+ var COLLECTION_V2_SHAPE_DEFS = {
17863
+ Collection: { fields: {} },
17864
+ Arc: {
17865
+ fields: {
17866
+ from: { type: "wref", binding: "either" },
17867
+ to: { type: "wref", binding: "either" }
17868
+ },
17869
+ composes: ["Collection"]
17870
+ },
17871
+ Bond: {
17872
+ fields: {
17873
+ ends: {
17874
+ type: "array",
17875
+ items: { type: "wref", binding: "either" },
17876
+ minItems: 2,
17877
+ maxItems: 2
17878
+ }
17879
+ },
17880
+ composes: ["Collection"]
17881
+ },
17882
+ Set: {
17883
+ fields: {
17884
+ members: {
17885
+ type: "array",
17886
+ items: { type: "wref", binding: "either" },
17887
+ minItems: 1
17888
+ }
17889
+ },
17890
+ composes: ["Collection"]
17891
+ },
17892
+ List: {
17893
+ fields: {
17894
+ items: {
17895
+ type: "array",
17896
+ items: { type: "wref", binding: "either" },
17897
+ minItems: 1
17898
+ }
17899
+ },
17900
+ composes: ["Collection"]
17901
+ }
17902
+ };
17841
17903
  var BUILTIN_CONTENT_SHAPE_DEFS = {
17842
17904
  Content: {
17843
17905
  fields: {
@@ -26050,10 +26112,10 @@ function illegalOpSequences(operations, errors, checkAddAdd, options) {
26050
26112
 
26051
26113
  // ../../packages/rules/src/preflight-operation.ts
26052
26114
  var collectionTypes = ["arc", "bond", "set", "list", "pair"];
26053
- var canonicalCollectionTypes = ["arc", "bond", "set", "list"];
26115
+ var canonicalCollectionTypes = ["arc", "bond", "pair", "set", "list"];
26054
26116
  var collectionOps = ["add", "revise"];
26055
26117
  var COLLECTION_CREATE_REQUIRES_NAME_MESSAGE = "Collection create requires a name. Collections are ordinary named things (ADR 0004).";
26056
- var COLLECTION_ABOUT_REMOVED_MESSAGE = 'about accepts a wref. Create the collection as its own named operation, then point the assertion at it. Prefer deterministic relationship names, for example: [{"operation":"add","kind":"collection","type":"arc","name":"a-to-b","members":["A","B"]},{"operation":"add","kind":"assertion","about":"Arc/a-to-b","name":"Assertion/example","data":{}}]. For CLI usage, use wh commit submit --file with the two operations.';
26118
+ var COLLECTION_ABOUT_REMOVED_MESSAGE = 'about accepts a wref. Create the collection as its own named operation, then point the assertion at it. Prefer deterministic relationship names, for example: [{"operation":"add","kind":"thing","name":"Arc/a-to-b","data":{"from":"Shape/A","to":"Shape/B"}},{"operation":"add","kind":"assertion","about":"Arc/a-to-b","name":"Assertion/example","data":{}}]. For CLI usage, use wh commit submit --file with the two operations.';
26057
26119
  function parseCollectionType(value) {
26058
26120
  return collectionTypes.find((candidate) => candidate === value) ?? null;
26059
26121
  }
@@ -26088,7 +26150,7 @@ function builtinShapeGuard(op, operationIndex) {
26088
26150
  message: `Shape "${op.newName}" is a retired collection shape and cannot be written manually`
26089
26151
  });
26090
26152
  } else {
26091
- const builtinShapeName = name && isBuiltinShape(name) && !reservedSourcePassThrough ? name : isShapeRename && op.newName && isBuiltinShape(op.newName) ? op.newName : undefined;
26153
+ const builtinShapeName = name && (isBuiltinShape(name) || isCollectionV2Shape(name)) && !reservedSourcePassThrough ? name : isShapeRename && op.newName && (isBuiltinShape(op.newName) || isCollectionV2Shape(op.newName)) ? op.newName : undefined;
26092
26154
  if (builtinShapeName && (isShapeRename || op.operation !== "retract" && op.kind === "shape")) {
26093
26155
  const action = op.operation === "add" ? "created" : op.operation === "rename" ? "renamed" : "revised";
26094
26156
  errors.push({
@@ -26098,7 +26160,7 @@ function builtinShapeGuard(op, operationIndex) {
26098
26160
  });
26099
26161
  }
26100
26162
  }
26101
- if (name) {
26163
+ if (name && op.operation !== "retract") {
26102
26164
  const local = splitLocalPath(name);
26103
26165
  if (local && isRetiredCollectionShape(local.shapePrefix)) {
26104
26166
  errors.push({
@@ -26106,7 +26168,7 @@ function builtinShapeGuard(op, operationIndex) {
26106
26168
  operationIndex,
26107
26169
  message: `Cannot ${op.operation} under retired collection shape "${local.shapePrefix}". Triple is read-only and retired for new collection writes.`
26108
26170
  });
26109
- } else if (op.kind === "thing" && local && isBuiltinCollectionShape(local.shapePrefix)) {
26171
+ } else if (op.kind === "thing" && local && (isBuiltinCollectionShape(local.shapePrefix) && !isOrdinaryCollectionShape(local.shapePrefix) || local.shapePrefix === "Collection")) {
26110
26172
  const message = op.operation === "add" ? `Cannot add kind="thing" under built-in shape "${local.shapePrefix}". Use kind="collection" instead.` : `Cannot revise kind="thing" under built-in shape "${local.shapePrefix}". Use kind="collection" to revise a collection.`;
26111
26173
  errors.push({
26112
26174
  code: "VALIDATION_ERROR",
@@ -26195,6 +26257,7 @@ function validateCollectionOps(op, operationIndex) {
26195
26257
  if (parseCollectionOp(op.operation) === null) {
26196
26258
  return errors;
26197
26259
  }
26260
+ const collectionType = parseCollectionType(op.type);
26198
26261
  if (op.operation === "add" && !op.name) {
26199
26262
  errors.push({
26200
26263
  code: "VALIDATION_ERROR",
@@ -26202,7 +26265,6 @@ function validateCollectionOps(op, operationIndex) {
26202
26265
  message: COLLECTION_CREATE_REQUIRES_NAME_MESSAGE
26203
26266
  });
26204
26267
  }
26205
- const collectionType = parseCollectionType(op.type);
26206
26268
  if (collectionType === null) {
26207
26269
  errors.push({
26208
26270
  code: "VALIDATION_ERROR",
@@ -40590,12 +40652,12 @@ function compareUnsignedUtf8(left, right) {
40590
40652
  var CHECKPOINT_CHUNK_BYTE_LIMIT = 67108864;
40591
40653
  var CHECKPOINT_PART_DIGITS = 10;
40592
40654
  var CHECKPOINT_FORMAT = "warmhub-repository-checkpoint";
40593
- var CHECKPOINT_FORMAT_VERSION = 2;
40655
+ var CHECKPOINT_FORMAT_VERSION = 3;
40594
40656
  var CHECKPOINT_MANIFEST_NAME = "repository-checkpoint.json";
40595
40657
  var checkpointSha256Schema = exports_external.string().regex(/^[0-9a-f]{64}$/);
40596
- var nonnegativeSafeIntegerSchema = exports_external.number().int().nonnegative().safe();
40597
- var positiveSafeIntegerSchema = exports_external.number().int().positive().safe();
40598
- var jsonNumberSchema = exports_external.number().finite().refine((value) => !Number.isInteger(value) || Number.isSafeInteger(value), "JSON integers must be safe integers");
40658
+ var nonnegativeSafeIntegerSchema = exports_external.number().int().nonnegative();
40659
+ var positiveSafeIntegerSchema = exports_external.number().int().positive();
40660
+ var jsonNumberSchema = exports_external.number().refine((value) => !Number.isInteger(value) || Number.isSafeInteger(value), "JSON integers must be safe integers");
40599
40661
  var jsonValueSchema = exports_external.lazy(() => exports_external.union([
40600
40662
  exports_external.null(),
40601
40663
  exports_external.boolean(),
@@ -40607,11 +40669,11 @@ var jsonValueSchema = exports_external.lazy(() => exports_external.union([
40607
40669
  var checkpointRowBaseSchema = exports_external.object({
40608
40670
  wref: exports_external.string().min(1),
40609
40671
  durableId: exports_external.string().min(1),
40610
- version: exports_external.number().int().positive().safe(),
40672
+ version: exports_external.number().int().positive(),
40611
40673
  active: exports_external.literal(true),
40612
40674
  data: jsonValueSchema
40613
40675
  });
40614
- var pinnedWrefSchema = exports_external.string().regex(/^[^\r\n]+@v[1-9]\d*$/, "Checkpoint wref must be pinned with @vN");
40676
+ var pinnedWrefSchema = exports_external.string().regex(/^[^\r\n]+@v[1-9]\d*(?![\s\S])/, "Checkpoint wref must be pinned with @vN");
40615
40677
  var affirmedWrefsSchema = exports_external.array(pinnedWrefSchema).superRefine((wrefs, context) => {
40616
40678
  for (let index = 1;index < wrefs.length; index += 1) {
40617
40679
  const previous = wrefs[index - 1];
@@ -40625,11 +40687,16 @@ var affirmedWrefsSchema = exports_external.array(pinnedWrefSchema).superRefine((
40625
40687
  }
40626
40688
  }
40627
40689
  });
40690
+ var checkpointCollectionsSchema = exports_external.array(exports_external.object({
40691
+ shape: exports_external.string().min(1),
40692
+ memberCount: nonnegativeSafeIntegerSchema
40693
+ }).strict()).min(1);
40628
40694
  var checkpointRowSchema = exports_external.discriminatedUnion("kind", [
40629
40695
  checkpointRowBaseSchema.extend({ kind: exports_external.literal("shape") }).strict(),
40630
40696
  checkpointRowBaseSchema.extend({
40631
- kind: exports_external.enum(["thing", "collection"]),
40632
- shapeName: exports_external.string().min(1)
40697
+ kind: exports_external.literal("thing"),
40698
+ shapeName: exports_external.string().min(1),
40699
+ collections: checkpointCollectionsSchema.optional()
40633
40700
  }).strict(),
40634
40701
  checkpointRowBaseSchema.extend({
40635
40702
  kind: exports_external.literal("assertion"),
@@ -40653,9 +40720,9 @@ var checkpointManifestStreamSchema = exports_external.object({
40653
40720
  var checkpointManifestFields = {
40654
40721
  format: exports_external.literal(CHECKPOINT_FORMAT),
40655
40722
  formatVersion: exports_external.literal(CHECKPOINT_FORMAT_VERSION),
40656
- checkpointId: exports_external.string().uuid(),
40723
+ checkpointId: exports_external.uuid(),
40657
40724
  repository: exports_external.object({
40658
- id: exports_external.string().uuid(),
40725
+ id: exports_external.uuid(),
40659
40726
  org: exports_external.string().min(1),
40660
40727
  repo: exports_external.string().min(1)
40661
40728
  }).strict(),
@@ -40848,7 +40915,7 @@ function addOneSafe(value) {
40848
40915
  return next;
40849
40916
  }
40850
40917
  // ../../packages/rules/src/repository-export/types.ts
40851
- var REPOSITORY_EXPORT_FORMAT_VERSION = 3;
40918
+ var REPOSITORY_EXPORT_FORMAT_VERSION = 4;
40852
40919
  var REPOSITORY_EXPORT_MEDIA_TYPE = "application/x-ndjson";
40853
40920
  var repositoryExportSha256Schema = exports_external.string().regex(/^[0-9a-f]{64}$/);
40854
40921
  var nonnegativeSafeIntegerSchema2 = exports_external.number().int().nonnegative();
@@ -40856,22 +40923,10 @@ var positiveSafeIntegerSchema2 = exports_external.number().int().positive();
40856
40923
  var REPOSITORY_EXPORT_ROW_KINDS = [
40857
40924
  "shape",
40858
40925
  "thing",
40859
- "collection",
40860
40926
  "assertion"
40861
40927
  ];
40862
40928
  var REPOSITORY_EXPORT_MODES = ["heads", "ops"];
40863
- var REPOSITORY_EXPORT_SHAPE_PROVENANCES = [
40864
- "captured",
40865
- "migration-stamped",
40866
- "reconstructed"
40867
- ];
40868
- var repositoryExportShapeCertificateSchema = exports_external.object({
40869
- name: exports_external.string().min(1),
40870
- v: positiveSafeIntegerSchema2,
40871
- durableId: exports_external.string().min(1),
40872
- provenance: exports_external.enum(REPOSITORY_EXPORT_SHAPE_PROVENANCES),
40873
- declared: exports_external.boolean()
40874
- }).strict();
40929
+ var repositoryExportShapeCertificateSchema = exports_external.string().regex(/^[^\r\n]+@v[1-9]\d*(?![\s\S])/, "Shape certificate must be a pinned wref");
40875
40930
  var repositoryExportReferenceSchema = exports_external.object({
40876
40931
  wref: exports_external.string().min(1),
40877
40932
  v: positiveSafeIntegerSchema2.optional(),
@@ -40888,11 +40943,23 @@ function refineStrictlyIncreasing(entries, key, message, context) {
40888
40943
  });
40889
40944
  }
40890
40945
  var shapesSchema = exports_external.array(repositoryExportShapeCertificateSchema).superRefine((shapes, context) => {
40891
- refineStrictlyIncreasing(shapes, (entry) => entry.durableId, "Shape certificates must be unique and strictly increasing by durableId", context);
40946
+ refineStrictlyIncreasing(shapes.slice(1), (entry) => entry, "Shape certificates after the declared one must be unique and strictly increasing", context);
40947
+ const declared = shapes[0];
40948
+ if (declared !== undefined && shapes.indexOf(declared, 1) !== -1) {
40949
+ context.addIssue({
40950
+ code: "custom",
40951
+ path: [shapes.indexOf(declared, 1)],
40952
+ message: "The declared Shape must not repeat in the closure tail"
40953
+ });
40954
+ }
40892
40955
  });
40893
40956
  var affirmedSchema = exports_external.array(repositoryExportReferenceSchema).superRefine((affirmed, context) => {
40894
40957
  refineStrictlyIncreasing(affirmed, (entry) => entry.wref, "Affirmed references must be unique and strictly increasing", context);
40895
40958
  });
40959
+ var repositoryExportCollectionsSchema = exports_external.array(exports_external.object({
40960
+ shape: exports_external.string().min(1),
40961
+ memberCount: exports_external.number().int().nonnegative()
40962
+ }).strict()).min(1);
40896
40963
  var rowEnvelopeFields = {
40897
40964
  wref: exports_external.string().min(1),
40898
40965
  durableId: exports_external.string().min(1),
@@ -40911,8 +40978,9 @@ var activeRowSchema = exports_external.discriminatedUnion("kind", [
40911
40978
  }).strict(),
40912
40979
  exports_external.object({
40913
40980
  ...activeRowFields,
40914
- kind: exports_external.enum(["thing", "collection"]),
40915
- shapes: shapesSchema
40981
+ kind: exports_external.literal("thing"),
40982
+ shapes: shapesSchema,
40983
+ collections: repositoryExportCollectionsSchema.optional()
40916
40984
  }).strict(),
40917
40985
  exports_external.object({
40918
40986
  ...activeRowFields,
@@ -41631,13 +41699,28 @@ var SYSTEM_MANIFEST = {
41631
41699
  },
41632
41700
  shapes: [
41633
41701
  { name: "ComponentInstall", fields: COMPONENT_INSTALL_FIELDS },
41634
- { name: "ComponentConfig", fields: COMPONENT_CONFIG_FIELDS }
41702
+ { name: "ComponentConfig", fields: COMPONENT_CONFIG_FIELDS },
41703
+ { name: "Collection", ...COLLECTION_V2_SHAPE_DEFS.Collection },
41704
+ { name: "Arc", ...COLLECTION_V2_SHAPE_DEFS.Arc },
41705
+ { name: "Bond", ...COLLECTION_V2_SHAPE_DEFS.Bond },
41706
+ { name: "Set", ...COLLECTION_V2_SHAPE_DEFS.Set },
41707
+ { name: "List", ...COLLECTION_V2_SHAPE_DEFS.List }
41635
41708
  ],
41636
41709
  credentials: [],
41637
41710
  subscriptions: [],
41638
41711
  seeds: [],
41639
41712
  health: {
41640
- requires: { shapes: ["ComponentInstall", "ComponentConfig"] }
41713
+ requires: {
41714
+ shapes: [
41715
+ "ComponentInstall",
41716
+ "ComponentConfig",
41717
+ "Collection",
41718
+ "Arc",
41719
+ "Bond",
41720
+ "Set",
41721
+ "List"
41722
+ ]
41723
+ }
41641
41724
  },
41642
41725
  teardown: {},
41643
41726
  runtimeAccess: { reads: [], writes: [] }
@@ -41657,7 +41740,12 @@ var SYSTEM_COMPONENT = {
41657
41740
  name: "ComponentConfig",
41658
41741
  fields: COMPONENT_CONFIG_FIELDS,
41659
41742
  installInfra: true
41660
- }
41743
+ },
41744
+ { name: "Collection", ...COLLECTION_V2_SHAPE_DEFS.Collection },
41745
+ { name: "Arc", ...COLLECTION_V2_SHAPE_DEFS.Arc },
41746
+ { name: "Bond", ...COLLECTION_V2_SHAPE_DEFS.Bond },
41747
+ { name: "Set", ...COLLECTION_V2_SHAPE_DEFS.Set },
41748
+ { name: "List", ...COLLECTION_V2_SHAPE_DEFS.List }
41661
41749
  ]
41662
41750
  };
41663
41751
 
@@ -45323,7 +45411,7 @@ function createStreamingSubmissionHandle(input, deps) {
45323
45411
  // ../../packages/sdk-ts/package.json
45324
45412
  var package_default = {
45325
45413
  name: "@warmhub/sdk-ts",
45326
- version: "0.124.0",
45414
+ version: "0.126.0",
45327
45415
  private: false,
45328
45416
  type: "module",
45329
45417
  description: "The TypeScript SDK for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
@@ -47160,7 +47248,8 @@ class WarmHubClient {
47160
47248
  wref,
47161
47249
  version: opts?.version,
47162
47250
  limit: opts?.limit,
47163
- cursor: opts?.cursor
47251
+ cursor: opts?.cursor,
47252
+ shape: opts?.shape
47164
47253
  });
47165
47254
  } catch (error51) {
47166
47255
  throw toWarmHubError(error51);
@@ -47199,7 +47288,8 @@ class WarmHubClient {
47199
47288
  wref,
47200
47289
  version: opts?.version,
47201
47290
  members,
47202
- position: opts?.position
47291
+ position: opts?.position,
47292
+ shape: opts?.shape
47203
47293
  });
47204
47294
  } catch (error51) {
47205
47295
  throw toWarmHubError(error51);
@@ -47214,7 +47304,8 @@ class WarmHubClient {
47214
47304
  rightWref,
47215
47305
  leftVersion: opts?.leftVersion,
47216
47306
  rightVersion: opts?.rightVersion,
47217
- mode: opts?.mode
47307
+ mode: opts?.mode,
47308
+ shape: opts?.shape
47218
47309
  });
47219
47310
  } catch (error51) {
47220
47311
  throw toWarmHubError(error51);
@@ -47259,7 +47350,8 @@ class WarmHubClient {
47259
47350
  orgName,
47260
47351
  repoName,
47261
47352
  wref,
47262
- version: opts?.version
47353
+ version: opts?.version,
47354
+ shape: opts?.shape
47263
47355
  });
47264
47356
  } catch (error51) {
47265
47357
  throw toWarmHubError(error51);
@@ -52135,30 +52227,23 @@ function pinnedWref(c, wref, version2) {
52135
52227
  function kindLabel(c, kind) {
52136
52228
  return `${c.dim}${kind}${c.reset}`;
52137
52229
  }
52138
- function collectionFields(shapeName, data) {
52139
- if (!isBuiltinCollectionShape(shapeName))
52140
- return null;
52141
- const fieldDefs = BUILTIN_SHAPE_DEFS[shapeName].fields;
52142
- const result = [];
52143
- for (const [key, fieldType] of Object.entries(fieldDefs)) {
52144
- const value = data[key];
52145
- if (Array.isArray(fieldType)) {
52146
- const elementType = fieldType[0];
52147
- if (basePrimitiveTypeFromSpec(elementType) !== "wref")
52148
- continue;
52149
- const wrefs = Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
52150
- result.push({ name: key, wrefs });
52151
- } else if (basePrimitiveTypeFromSpec(fieldType) === "wref") {
52152
- result.push({
52153
- name: key,
52154
- wrefs: typeof value === "string" ? [value] : []
52155
- });
52156
- }
52157
- }
52158
- return result;
52159
- }
52160
- function effectiveKind(kind, shapeName) {
52161
- if ((kind === "thing" || kind === "collection" || !kind) && shapeName && isBuiltinCollectionShape(shapeName)) {
52230
+ function asCollectionSummaries(value) {
52231
+ if (!Array.isArray(value))
52232
+ return;
52233
+ const entries = value.filter((entry) => typeof entry === "object" && entry !== null && typeof entry.shape === "string");
52234
+ return entries.length > 0 ? entries : undefined;
52235
+ }
52236
+ function bareShapeName(token) {
52237
+ const withoutVersion = token.split("@", 1)[0] ?? "";
52238
+ return withoutVersion.slice(withoutVersion.lastIndexOf("/") + 1);
52239
+ }
52240
+ function effectiveKind(kind, shapeName, collections) {
52241
+ if (kind !== "thing" && kind)
52242
+ return kind;
52243
+ const summaryShape = collections?.[0]?.shape;
52244
+ if (summaryShape)
52245
+ return bareShapeName(summaryShape).toLowerCase();
52246
+ if (shapeName && isBuiltinCollectionShape(shapeName)) {
52162
52247
  return shapeName.toLowerCase();
52163
52248
  }
52164
52249
  return kind;
@@ -53084,7 +53169,7 @@ function renderHead(out, c, chars, result, org, repo, shape, kind) {
53084
53169
  for (const item of items) {
53085
53170
  const wref = pinnedWref(c, item.wref ?? item.name ?? "(unknown)", item.version);
53086
53171
  const shapeName = item.shapeName;
53087
- const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", shapeName));
53172
+ const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", shapeName, asCollectionSummaries(item.collections)));
53088
53173
  const retractedTag = item.active === false ? ` ${c.red}[RETRACTED]${c.reset}` : "";
53089
53174
  out(` ${wref} ${kl}${retractedTag}`);
53090
53175
  if (item.declaredShapes?.length) {
@@ -53099,11 +53184,7 @@ function renderHead(out, c, chars, result, org, repo, shape, kind) {
53099
53184
  if (item.affirmedWrefs?.length) {
53100
53185
  out(` ${c.dim}affirms:${c.reset} ${refList(c, item.affirmedWrefs, decorations)}`);
53101
53186
  }
53102
- const fields = shapeName && (item.kind === "thing" || item.kind === "collection") && item.data ? collectionFields(shapeName, item.data) : null;
53103
- if (fields) {
53104
- const allWrefs = fields.flatMap((f) => f.wrefs);
53105
- out(` ${refList(c, allWrefs, decorations)}`);
53106
- } else if (item.data && typeof item.data === "object") {
53187
+ if (item.data && typeof item.data === "object") {
53107
53188
  out(` ${dataPreview(c, item.data)}`);
53108
53189
  }
53109
53190
  const itemMeta = item.metadata;
@@ -53117,7 +53198,7 @@ function renderThing(out, c, result) {
53117
53198
  const decorations = getResponseDecorations(result);
53118
53199
  const wref = result.wref ?? result.name ?? "(unknown)";
53119
53200
  const shapeName = singularShapeName(result);
53120
- const displayKind = effectiveKind(result.kind ?? "thing", shapeName);
53201
+ const displayKind = effectiveKind(result.kind ?? "thing", shapeName, result.collections);
53121
53202
  const retractedTag = result.active === false ? ` ${c.red}[RETRACTED]${c.reset}` : "";
53122
53203
  out(`${pinnedWref(c, wref, result.version)} ${kindLabel(c, displayKind)}${retractedTag}`);
53123
53204
  out(` ${c.dim}wref:${c.reset} ${escapeTerminalTextForDisplay(wref)}`);
@@ -53153,29 +53234,18 @@ function renderThing(out, c, result) {
53153
53234
  out(` ${c.dim}revisedOn:${c.reset} ${formatTime(meta3.revisedOn, now)}`);
53154
53235
  }
53155
53236
  }
53156
- if (result.collection) {
53157
- renderCollectionSummary(out, c, result.collection, decorations);
53237
+ for (const collection of result.collections ?? []) {
53238
+ renderCollectionSummary(out, c, collection, decorations);
53158
53239
  }
53159
- const fields = shapeName && result.data ? collectionFields(shapeName, result.data) : null;
53160
- if (fields) {
53161
- for (const field of fields) {
53162
- if (field.wrefs.length === 1) {
53163
- const pad = " ".repeat(Math.max(1, 9 - field.name.length));
53164
- out(` ${c.dim}${escapeTerminalTextForDisplay(field.name)}:${c.reset}${pad}${refDisplay(c, field.wrefs[0] ?? "", decorations)}`);
53165
- } else {
53166
- out(` ${c.dim}${escapeTerminalTextForDisplay(field.name)}:${c.reset}`);
53167
- for (const w of field.wrefs) {
53168
- out(` ${refDisplay(c, w, decorations)}`);
53169
- }
53170
- }
53171
- }
53172
- } else if (result.data) {
53240
+ if (result.data) {
53173
53241
  out(` ${c.dim}data:${c.reset}`);
53174
53242
  renderJsonDataBlock(out, c, result.data, " ", decorations);
53175
53243
  }
53176
53244
  }
53177
53245
  function renderCollectionSummary(out, c, collection, decorations) {
53178
- out(` ${c.dim}collection:${c.reset} ${collection.type}`);
53246
+ out(` ${c.dim}collection:${c.reset} ${collection.shape}`);
53247
+ if (collection.memberCount === undefined)
53248
+ return;
53179
53249
  out(` ${c.dim}members:${c.reset} ${collection.memberCount}`);
53180
53250
  if (collection.fullData)
53181
53251
  return;
@@ -53209,7 +53279,7 @@ function renderGraphValue(out, c, value, indent, decorations) {
53209
53279
  function renderGraphNode(out, c, result, indent = "", decorations) {
53210
53280
  const wref = result.wref ?? result.name ?? "(unknown)";
53211
53281
  const shapeName = singularShapeName(result);
53212
- const displayKind = effectiveKind(result.kind ?? "thing", shapeName);
53282
+ const displayKind = effectiveKind(result.kind ?? "thing", shapeName, result.collections);
53213
53283
  out(`${indent}${pinnedWref(c, wref, result.version)} ${kindLabel(c, displayKind)}`);
53214
53284
  if (result.about) {
53215
53285
  out(`${indent} ${c.dim}about:${c.reset}`);
@@ -53339,7 +53409,7 @@ function renderBatchView(out, c, result, wrefs, flagsVersion) {
53339
53409
  const requestedBase = requested.replace(/@.+$/, "");
53340
53410
  const fallback = item.wref ?? `${item.shapeName ?? "?"}/${item.name ?? "(unknown)"}`;
53341
53411
  const base = requestedBase.length > 0 ? requestedBase : fallback.replace(/@v\d+$/, "");
53342
- const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", item.shapeName));
53412
+ const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", item.shapeName, asCollectionSummaries(item.collections)));
53343
53413
  const retractedTag = item.active === false ? ` ${c.red}[RETRACTED]${c.reset}` : "";
53344
53414
  const display = labeledRef(c, `${base}@v${item.version}`, fallback) ?? `${escapeTerminalTextForDisplay(base)}@v${item.version}`;
53345
53415
  out(` ${display} ${kl}${retractedTag}`);
@@ -54091,7 +54161,7 @@ function renderQueryResults(out, c, result) {
54091
54161
  for (const item of items) {
54092
54162
  const wref = pinnedWref(c, item.wref ?? item.name ?? "(unknown)", item.version);
54093
54163
  const shapeName = item.shapeName;
54094
- const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", shapeName));
54164
+ const kl = kindLabel(c, effectiveKind(item.kind ?? "thing", shapeName, asCollectionSummaries(item.collections)));
54095
54165
  const retractedTag = item.active === false ? ` ${c.red}[RETRACTED]${c.reset}` : "";
54096
54166
  out(` ${wref} ${kl}${retractedTag}`);
54097
54167
  if (item.declaredShapes?.length) {
@@ -54103,11 +54173,7 @@ function renderQueryResults(out, c, result) {
54103
54173
  if (item.roles?.length) {
54104
54174
  out(` ${c.dim}roles:${c.reset} ${item.roles.join(", ")}`);
54105
54175
  }
54106
- const fields = shapeName && (item.kind === "thing" || item.kind === "collection" || !item.kind) && item.data ? collectionFields(shapeName, item.data) : null;
54107
- if (fields) {
54108
- const allWrefs = fields.flatMap((f) => f.wrefs);
54109
- out(` ${refList(c, allWrefs, decorations)}`);
54110
- } else if (item.data && typeof item.data === "object") {
54176
+ if (item.data && typeof item.data === "object") {
54111
54177
  out(` ${dataPreview(c, item.data)}`);
54112
54178
  }
54113
54179
  }
@@ -56424,9 +56490,11 @@ function renderMembers(ctx, result) {
56424
56490
  return;
56425
56491
  }
56426
56492
  const decorations = getResponseDecorations(result);
56427
- for (const item of result.items) {
56428
- const position = item.position ?? 0;
56429
- ctx.out(`${String(position).padStart(4, " ")} ${refDisplay(c, item.wref, decorations)}`);
56493
+ const labels = result.items.map((item) => item.position === undefined ? item.fieldPath : `${item.fieldPath}[${item.position}]`);
56494
+ const width = Math.max(...labels.map((label) => label.length));
56495
+ for (const [index, item] of result.items.entries()) {
56496
+ const label = labels[index] ?? "";
56497
+ ctx.out(` ${c.dim}${label.padEnd(width, " ")}${c.reset} ${refDisplay(c, item.wref, decorations)}`);
56430
56498
  }
56431
56499
  }
56432
56500
  function renderContains(ctx, result) {
@@ -56467,7 +56535,7 @@ function renderDiff(ctx, result) {
56467
56535
  }
56468
56536
  function renderStats(ctx, result) {
56469
56537
  const c = ctx.colors;
56470
- ctx.out(`${pinnedWref(c, result.wref)} ${c.dim}${result.type}${c.reset}`);
56538
+ ctx.out(`${pinnedWref(c, result.wref)} ${c.dim}${result.shape}${c.reset}`);
56471
56539
  ctx.out(`members: ${result.memberCount}`);
56472
56540
  ctx.out(`unique: ${result.uniqueMemberCount}`);
56473
56541
  }
@@ -56526,11 +56594,11 @@ async function readStreamUtf82(input) {
56526
56594
  var SUPPORTED_COLLECTION_TYPES = [
56527
56595
  "arc",
56528
56596
  "bond",
56597
+ "pair",
56529
56598
  "set",
56530
- "list",
56531
- "pair"
56599
+ "list"
56532
56600
  ];
56533
- var CANONICAL_COLLECTION_TYPE_USAGE = "<arc|bond|set|list>";
56601
+ var CANONICAL_COLLECTION_TYPE_USAGE = "<arc|bond|pair|set|list>";
56534
56602
  var commonWriteFlags = {
56535
56603
  "event-request-id": operationEventRequestIdFlag,
56536
56604
  message: flag.string({ short: "m", description: "Commit message" }),
@@ -56576,7 +56644,7 @@ var collectionQueryFlags = {
56576
56644
  };
56577
56645
  var collectionCreateFlags = {
56578
56646
  type: flag.string({
56579
- description: "For new collections, use arc, bond, set, or list"
56647
+ description: "set, list, or the legacy deprecated arc, bond, pair. Set/List land as ordinary Things under their protected V2 Shapes; arc/bond/pair are accepted during the compatibility window and lowered to ordinary Things."
56580
56648
  }),
56581
56649
  name: flag.string({
56582
56650
  description: "Collection local name. Collections are ordinary named things."
@@ -56605,13 +56673,19 @@ var collectionCreateFlags = {
56605
56673
  ...collectionQueryFlags,
56606
56674
  ...commonWriteFlags
56607
56675
  };
56676
+ var collectionReadShapeFlag = {
56677
+ shape: flag.string({
56678
+ description: "Collection Shape to read this Thing under (required for composites, e.g. Arc)"
56679
+ })
56680
+ };
56608
56681
  var collectionMembersFlags = {
56609
56682
  limit: flag.number({
56610
56683
  description: "Max members per page (default: 50, max: 500)"
56611
56684
  }),
56612
56685
  cursor: flag.string({ description: "Opaque pagination cursor" }),
56613
56686
  all: flag.boolean({ description: "Fetch all pages" }),
56614
- version: flag.number({ description: "Specific version number" })
56687
+ version: flag.number({ description: "Specific version number" }),
56688
+ ...collectionReadShapeFlag
56615
56689
  };
56616
56690
  var collectionContainsFlags = {
56617
56691
  position: flag.number({
@@ -56620,7 +56694,8 @@ var collectionContainsFlags = {
56620
56694
  version: flag.number({
56621
56695
  description: "Specific collection version number. Member inputs are still pinned before comparison; use pinned @vN members for historical membership checks."
56622
56696
  }),
56623
- ...collectionInputFlags
56697
+ ...collectionInputFlags,
56698
+ ...collectionReadShapeFlag
56624
56699
  };
56625
56700
  var collectionDiffFlags = {
56626
56701
  mode: flag.string({
@@ -56631,7 +56706,8 @@ var collectionDiffFlags = {
56631
56706
  }),
56632
56707
  "right-version": flag.number({
56633
56708
  description: "Specific right collection version"
56634
- })
56709
+ }),
56710
+ ...collectionReadShapeFlag
56635
56711
  };
56636
56712
  var collectionReviseFlags = {
56637
56713
  add: flag.string({
@@ -56647,7 +56723,8 @@ var collectionReviseFlags = {
56647
56723
  ...commonWriteFlags
56648
56724
  };
56649
56725
  var collectionStatsFlags = {
56650
- version: flag.number({ description: "Specific collection version number" })
56726
+ version: flag.number({ description: "Specific collection version number" }),
56727
+ ...collectionReadShapeFlag
56651
56728
  };
56652
56729
  function validateCollectionType(value) {
56653
56730
  const parsed = SUPPORTED_COLLECTION_TYPES.find((candidate) => candidate === value);
@@ -56662,7 +56739,7 @@ function validateDiffMode(value) {
56662
56739
  if (value === "auto" || value === "membership" || value === "ordered") {
56663
56740
  return value;
56664
56741
  }
56665
- usageError("--mode must be one of: auto, membership, ordered", "wh collection diff Set/a Set/b --mode membership");
56742
+ return usageError("--mode must be one of: auto, membership, ordered", "wh collection diff Set/a Set/b --mode membership");
56666
56743
  }
56667
56744
  function collectionQuerySourceFromFlags(flags) {
56668
56745
  const where = (flags.where ?? []).map(parseWhereFlag);
@@ -56702,9 +56779,6 @@ function requireSetForQuerySource(type, source, example) {
56702
56779
  return;
56703
56780
  usageError("Selector-backed collection sources are only supported for set collections", example);
56704
56781
  }
56705
- function normalizeCreateMembers(type, members) {
56706
- return type === "set" ? Array.from(new Set(members)) : members;
56707
- }
56708
56782
  function hasDeferredMemberSource(flags) {
56709
56783
  return !!flags.file || !!flags.stdin;
56710
56784
  }
@@ -56766,7 +56840,7 @@ var handleCollectionCreate = async (ctx, { flags, args }) => {
56766
56840
  }) : undefined;
56767
56841
  const eventRequestId = flags["event-request-id"] ?? createOperationEventRequestId();
56768
56842
  ctx.status(`Operation event request: ${eventRequestId}`);
56769
- const inlineMembers = normalizeCreateMembers(type, parseMemberList(flags.members));
56843
+ const inlineMembers = parseMemberList(flags.members);
56770
56844
  if (flags["skip-existing"] && !queryBacked && inlineMembers.length === 0 && hasDeferredMemberSource(flags)) {
56771
56845
  try {
56772
56846
  const result2 = await ctx.client.collection.create(org, repo, {
@@ -56792,7 +56866,7 @@ var handleCollectionCreate = async (ctx, { flags, args }) => {
56792
56866
  wrefField: flags["wref-field"],
56793
56867
  label: "collection members"
56794
56868
  });
56795
- const members = normalizeCreateMembers(type, explicitMembers);
56869
+ const members = explicitMembers;
56796
56870
  if (sourceRepo && members.length > 0) {
56797
56871
  usageError("--source-repo cannot be combined with explicit members; use canonical wh:org/repo/... member wrefs or omit --source-repo.", "wh collection create --type set --name wake-voters --source-repo data/nc-voters --shape Voter --where county=Wake");
56798
56872
  }
@@ -56861,12 +56935,13 @@ var handleCollectionMembers = async (ctx, { flags, args }) => {
56861
56935
  fetchPage: (cursor) => ctx.client.collection.members(org, repo, wref, {
56862
56936
  version: snapshotVersion,
56863
56937
  limit: pageLimit,
56864
- cursor
56938
+ cursor,
56939
+ shape: flags.shape
56865
56940
  }),
56866
56941
  title: "Collection members"
56867
56942
  })) {
56868
56943
  firstPage ??= {
56869
- type: page.type,
56944
+ shape: page.shape,
56870
56945
  wref: page.wref,
56871
56946
  version: page.version
56872
56947
  };
@@ -56875,7 +56950,7 @@ var handleCollectionMembers = async (ctx, { flags, args }) => {
56875
56950
  snapshotVersion ??= page.version;
56876
56951
  }
56877
56952
  writeCollectionMembersOutput(ctx, withDecorations({
56878
- type: firstPage?.type ?? "set",
56953
+ shape: firstPage?.shape ?? flags.shape ?? "",
56879
56954
  wref: firstPage?.wref ?? wref,
56880
56955
  version: snapshotVersion ?? firstPage?.version ?? flags.version ?? 1,
56881
56956
  items,
@@ -56886,7 +56961,8 @@ var handleCollectionMembers = async (ctx, { flags, args }) => {
56886
56961
  const result = await ctx.client.collection.members(org, repo, wref, {
56887
56962
  version: flags.version,
56888
56963
  limit: boundedLimit,
56889
- cursor: flags.cursor
56964
+ cursor: flags.cursor,
56965
+ shape: flags.shape
56890
56966
  });
56891
56967
  if (result.nextCursor) {
56892
56968
  emitPartialPageHint(ctx, result.items.length, result.nextCursor, boundedLimit);
@@ -56901,7 +56977,7 @@ function writeCollectionMembersOutput(ctx, result, page) {
56901
56977
  if (ctx.format === "json") {
56902
56978
  const envelope = pageEnvelope(result.items, page);
56903
56979
  printJson(ctx.out, {
56904
- type: result.type,
56980
+ shape: result.shape,
56905
56981
  wref: result.wref,
56906
56982
  version: result.version,
56907
56983
  items: result.items,
@@ -56933,7 +57009,8 @@ var handleCollectionContains = async (ctx, { flags, args }) => {
56933
57009
  const { org, repo } = parseCollectionReadRepo(ctx, [wref]);
56934
57010
  const result = await ctx.client.collection.contains(org, repo, wref, members, {
56935
57011
  version: flags.version,
56936
- position: flags.position
57012
+ position: flags.position,
57013
+ shape: flags.shape
56937
57014
  });
56938
57015
  writeOutput(ctx, result, () => renderContains(ctx, result));
56939
57016
  };
@@ -56946,7 +57023,8 @@ var handleCollectionDiff = async (ctx, { flags, args }) => {
56946
57023
  const result = await ctx.client.collection.diff(org, repo, leftWref, rightWref, {
56947
57024
  leftVersion: flags["left-version"],
56948
57025
  rightVersion: flags["right-version"],
56949
- mode: validateDiffMode(flags.mode)
57026
+ mode: validateDiffMode(flags.mode),
57027
+ shape: flags.shape
56950
57028
  });
56951
57029
  writeOutput(ctx, result, () => renderDiff(ctx, result));
56952
57030
  };
@@ -57017,7 +57095,8 @@ var handleCollectionStats = async (ctx, { flags, args }) => {
57017
57095
  }
57018
57096
  const { org, repo } = parseCollectionReadRepo(ctx, [wref]);
57019
57097
  const result = await ctx.client.collection.stats(org, repo, wref, {
57020
- version: flags.version
57098
+ version: flags.version,
57099
+ shape: flags.shape
57021
57100
  });
57022
57101
  writeOutput(ctx, result, () => renderStats(ctx, result));
57023
57102
  };
@@ -57266,7 +57345,7 @@ var createFlags3 = {
57266
57345
  multiple: true
57267
57346
  }),
57268
57347
  type: flag.string({
57269
- description: "For new collections, use arc, bond, set, or list"
57348
+ description: "set, list, or the legacy deprecated arc, bond, pair. Set/List land as ordinary Things under their protected V2 Shapes; arc/bond/pair are accepted during the compatibility window and lowered to ordinary Things."
57270
57349
  }),
57271
57350
  name: flag.string({
57272
57351
  description: "collection name for --type shorthand"
@@ -57300,27 +57379,29 @@ function identifyCommitSubmitStreamRow(row) {
57300
57379
  // ../../packages/warmhub-cli/src/domains/commit-submit-template.ts
57301
57380
  import { writeFile } from "node:fs/promises";
57302
57381
  var WRITE_TEMPLATE_KINDS = ["thing", "assertion"];
57303
- var COLLECTION_TEMPLATE_SPECS = {
57304
- Arc: {
57305
- type: "arc",
57306
- members: ["Shape/FILL_IN_FROM", "Shape/FILL_IN_TO"]
57307
- },
57308
- Bond: {
57309
- type: "bond",
57310
- members: ["Shape/FILL_IN_1", "Shape/FILL_IN_2"]
57311
- },
57312
- Set: { type: "set", members: ["Shape/FILL_IN"] },
57313
- List: { type: "list", members: ["Shape/FILL_IN"] }
57314
- };
57315
- function collectionTemplateSpec(shapeName) {
57316
- if (!isBuiltinCollectionShape(shapeName) || shapeName === "Pair") {
57317
- return;
57382
+ async function readTemplateShape(ctx, org, repo, shapeName) {
57383
+ try {
57384
+ const shape = await ctx.client.shape.get(org, repo, shapeName);
57385
+ if ((shapeName === "Set" || shapeName === "List") && shape.componentRef !== "warmhub/system") {
57386
+ return;
57387
+ }
57388
+ return shape;
57389
+ } catch (error51) {
57390
+ const code = error51.code;
57391
+ if ((shapeName === "Set" || shapeName === "List") && code === "NOT_FOUND") {
57392
+ return;
57393
+ }
57394
+ throw error51;
57318
57395
  }
57319
- return COLLECTION_TEMPLATE_SPECS[shapeName];
57320
57396
  }
57321
57397
  function zeroValueForField(fieldSpec) {
57322
57398
  if (Array.isArray(fieldSpec))
57323
57399
  return [];
57400
+ const arraySpec = fieldSpec;
57401
+ if (isTypeSpecObject(fieldSpec) && arraySpec.type === "array" && typeof arraySpec.minItems === "number") {
57402
+ const item = zeroValueForField(arraySpec.items);
57403
+ return Array.from({ length: Math.max(0, arraySpec.minItems) }, () => item);
57404
+ }
57324
57405
  const primitiveType = primitiveTypeSpecFromFieldSpec(fieldSpec);
57325
57406
  if (primitiveType) {
57326
57407
  const isOptional = primitiveType.endsWith("?");
@@ -57415,32 +57496,31 @@ var handleTemplate = async (ctx, { flags, args }) => {
57415
57496
  const count = Math.max(1, flags.count ?? 1);
57416
57497
  const operations = [];
57417
57498
  for (const shapeName of shapeNames) {
57418
- const collectionTemplate = templateKind === "thing" ? collectionTemplateSpec(shapeName) : undefined;
57419
- const operationKind = collectionTemplate ? "collection" : templateKind;
57420
57499
  if (operationType === "retract") {
57421
57500
  for (let i = 0;i < count; i++) {
57422
57501
  operations.push({
57423
57502
  operation: "retract",
57424
- kind: operationKind,
57425
- name: operationKind === "shape" ? shapeName : `${shapeName}/FILL_IN`
57503
+ kind: templateKind,
57504
+ name: templateKind === "shape" ? shapeName : `${shapeName}/FILL_IN`
57426
57505
  });
57427
57506
  }
57428
57507
  continue;
57429
57508
  }
57430
57509
  const nameSuffix = count > 1 ? (i) => `my-${shapeName.toLowerCase()}-${i + 1}` : () => `my-${shapeName.toLowerCase()}`;
57431
- if (collectionTemplate) {
57510
+ const shape = await readTemplateShape(ctx, org, repo, shapeName);
57511
+ if (shape === undefined) {
57512
+ const type = shapeName === "Set" ? "set" : "list";
57432
57513
  for (let i = 0;i < count; i++) {
57433
57514
  operations.push({
57434
57515
  operation: operationType,
57435
57516
  kind: "collection",
57436
- type: collectionTemplate.type,
57517
+ type,
57437
57518
  name: operationType === "add" ? nameSuffix(i) : `${shapeName}/FILL_IN`,
57438
- members: [...collectionTemplate.members]
57519
+ members: ["Shape/FILL_IN"]
57439
57520
  });
57440
57521
  }
57441
57522
  continue;
57442
57523
  }
57443
- const shape = await ctx.client.shape.get(org, repo, shapeName);
57444
57524
  const shapeVersion = shape.version;
57445
57525
  const shapeData = shapeVersion?.data;
57446
57526
  const fields = shapeData?.fields ?? {};
@@ -57643,7 +57723,7 @@ var SOURCE_COMMAND_EXAMPLES = {
57643
57723
  "--add": "wh commit submit --add Proof/example --data '{}' -m 'Add Proof/example' --repo acme/world",
57644
57724
  "--revise": "wh commit submit --revise Proof/example --data '{}' -m 'Revise Proof/example' --repo acme/world",
57645
57725
  "--retract": "wh commit submit --retract Proof/example -m 'Retract Proof/example' --repo acme/world",
57646
- "--type": "wh commit submit --type arc --name route --members Location/a,Location/b -m 'Add route' --repo acme/world"
57726
+ "--type": `wh commit submit --add route --shape Arc --data '{"from":"Location/a","to":"Location/b"}' -m 'Add route' --repo acme/world`
57647
57727
  };
57648
57728
  function resolveCommitOperationSource(input) {
57649
57729
  const selected = SOURCE_FLAGS.filter(([, key]) => input[key]).map(([flag2]) => flag2);
@@ -58447,11 +58527,10 @@ var handleSubmit = async (ctx, { flags, args }) => {
58447
58527
  }
58448
58528
  return parsed;
58449
58529
  });
58450
- const validCollectionTypes = ["arc", "bond", "set", "list", "pair"];
58451
- const canonicalCollectionTypes2 = ["arc", "bond", "set", "list"];
58530
+ const validCollectionTypes = ["arc", "bond", "pair", "set", "list"];
58452
58531
  const collectionType = validCollectionTypes.find((candidate) => candidate === flags.type);
58453
58532
  if (flags.type !== undefined && collectionType === undefined) {
58454
- throw new CliError(2 /* UserInput */, "USER_INPUT", `Invalid --type "${flags.type}". Use one of: ${canonicalCollectionTypes2.join(", ")}`, undefined, "wh commit submit --type arc --name route --members Location/a,Location/b");
58533
+ throw new CliError(2 /* UserInput */, "USER_INPUT", `Invalid --type "${flags.type}". Use one of: ${validCollectionTypes.join(", ")}`, undefined, "wh commit submit --type set --name group --members Location/a,Location/b");
58455
58534
  }
58456
58535
  const jsonlFile = opsFile?.endsWith(".jsonl") === true;
58457
58536
  const operationSource = resolveCommitOperationSource({
@@ -58495,10 +58574,10 @@ var handleSubmit = async (ctx, { flags, args }) => {
58495
58574
  } else if (operationSource === "--type") {
58496
58575
  const selectedCollectionType = requireCommitSourceValue(operationSource, collectionType);
58497
58576
  if (!flags.name) {
58498
- usageError("Usage: wh commit submit --type <arc|bond|set|list> --name <collection-name> --members <wref1,wref2,...>", "wh commit submit --type arc --name route --members Location/a,Location/b");
58577
+ usageError("Usage: wh commit submit --type <arc|bond|pair|set|list> --name <collection-name> --members <wref1,wref2,...>", "wh commit submit --type set --name group --members Location/a,Location/b");
58499
58578
  }
58500
58579
  if (!flags.members) {
58501
- usageError("Usage: wh commit submit --type <arc|bond|set|list> --name <collection-name> --members <wref1,wref2,...>", "wh commit submit --type arc --name route --members Location/a,Location/b");
58580
+ usageError("Usage: wh commit submit --type <arc|bond|pair|set|list> --name <collection-name> --members <wref1,wref2,...>", "wh commit submit --type set --name group --members Location/a,Location/b");
58502
58581
  }
58503
58582
  const members = flags.members.split(",").map((m) => m.trim()).filter(Boolean);
58504
58583
  const arityMap = { arc: 2, bond: 2, pair: 2 };
@@ -58660,7 +58739,7 @@ var handleSubmit = async (ctx, { flags, args }) => {
58660
58739
  renderPartialStreamSubmission(ctx, error51, completedAllFailed ? undefined : { committer });
58661
58740
  }
58662
58741
  const recovered = toCliError(error51);
58663
- throw new CliError(recovered.code, recovered.kind, recovered.message, error51, `${receiptLookupCommand(org, repo, error51.eventRequestId)} ${recovered.hint ?? ""}`.trim(), undefined, recovered.backendCode, recovered.recovery);
58742
+ throw new CliError(recovered.code, recovered.kind, recovered.message, error51, `${receiptLookupCommand(org, repo, error51.eventRequestId)} ${recovered.hint ?? ""}`.trim(), undefined, recovered.errorCode, recovered.recovery);
58664
58743
  }
58665
58744
  throw error51;
58666
58745
  }
@@ -58981,8 +59060,8 @@ var COMMIT_DOMAIN = defineDomain({
58981
59060
  'wh commit submit --file dataset.jsonl --stream-id bulk-2026-06-04 --skip-existing --progress -m "bulk stream"',
58982
59061
  'wh commit submit --file dataset.jsonl --server-stream --stream-id bulk-2026-08-14 --group-size 1000 --format jsonl -m "server stream"',
58983
59062
  "wh shape template Session HypothesisCandidate -o ops.json",
58984
- "wh commit submit --type arc --name route --members Location/a,Location/b",
58985
- "wh commit submit --type bond --name peers --members Person/alice,Person/bob",
59063
+ `wh commit submit --add route --shape Arc --data '{"from":"Location/a","to":"Location/b"}'`,
59064
+ `wh commit submit --add peers --shape Bond --data '{"ends":["Person/alice","Person/bob"]}'`,
58986
59065
  'wh commit submit --type set --name active-locations --members Location/a,Location/b,Location/c -m "Create location set"'
58987
59066
  ],
58988
59067
  notes: [
@@ -59595,39 +59674,6 @@ var registryUpdateFlags = {
59595
59674
  // ../../packages/warmhub-cli/src/domains/component-handlers.ts
59596
59675
  import { resolve as resolve2 } from "node:path";
59597
59676
 
59598
- // ../../packages/warmhub-cli/src/domain-rename-hints.ts
59599
- var RENAME_HINT_MAP = {
59600
- "commit:create": "Renamed to 'wh commit submit'",
59601
- "commit:template": "Moved to 'wh shape template'",
59602
- graph: "Moved to 'wh thing graph'",
59603
- "org:add-member": "Use 'wh org member add'",
59604
- "org:remove-member": "Use 'wh org member remove'",
59605
- "org:list-members": "Use 'wh org member list'",
59606
- "org:change-role": "Use 'wh org member set-role'",
59607
- "thing:get-many": "Renamed; 'wh thing view' is now variadic",
59608
- "credential:set-keys": "Folded into 'wh credential set'",
59609
- "credential:export": {
59610
- message: "'wh credential export' was removed; it has no direct CLI replacement.",
59611
- hint: "Webhook subscriptions now auto-inject WEBHOOK_* keys (WEBHOOK_BEARER_TOKEN, WEBHOOK_API_KEY[+ _HEADER], WEBHOOK_BASIC_USERNAME/PASSWORD, WEBHOOK_SIGNING_SECRET) as auth headers — store them on a credential set then bind with 'wh sub bind <subscriptionName> --credentials <setName>'. Generic key names (e.g. API_KEY) are not forwarded."
59612
- },
59613
- "shape:delete": "Use 'wh shape retract'",
59614
- "init:run": "Use 'wh init' (no inner verb)",
59615
- "prime:run": "Use 'wh prime'",
59616
- "use:run": "Use 'wh use'",
59617
- "graph:run": "Use 'wh thing graph'",
59618
- "doctor:check": "Use 'wh doctor'",
59619
- "doctor:run": "Use 'wh doctor'",
59620
- "channel:start": "Use 'wh channel'",
59621
- "notifications:list": "Use 'wh notifications'"
59622
- };
59623
- var RENAME_HINTS = RENAME_HINT_MAP;
59624
- function resolveRenameHint(entry) {
59625
- return typeof entry === "string" ? { message: entry } : entry;
59626
- }
59627
- function getTopLevelRenameHintCommands() {
59628
- return Object.keys(RENAME_HINTS).filter((key) => !key.includes(":"));
59629
- }
59630
-
59631
59677
  // ../../packages/warmhub-cli/src/builtin-cli-domains.ts
59632
59678
  var _names = null;
59633
59679
  var EXTRA_TOP_LEVEL_COMMANDS = ["help"];
@@ -59636,11 +59682,7 @@ function ensureNames() {
59636
59682
  return _names;
59637
59683
  const registry3 = new DomainRegistry;
59638
59684
  registerAllDomains(registry3);
59639
- _names = new Set([
59640
- ...registry3.getDomainNames(),
59641
- ...EXTRA_TOP_LEVEL_COMMANDS,
59642
- ...getTopLevelRenameHintCommands()
59643
- ]);
59685
+ _names = new Set([...registry3.getDomainNames(), ...EXTRA_TOP_LEVEL_COMMANDS]);
59644
59686
  return _names;
59645
59687
  }
59646
59688
  function isBuiltinCliDomain(name) {
@@ -61985,8 +62027,7 @@ function parseRecipient(kind, name) {
61985
62027
  ...resolveRegisteredComponentRef(name, CREATE_USAGE, CREATE_EXAMPLE)
61986
62028
  };
61987
62029
  default:
61988
- usageError("Grant recipient kind must be member, pat, or component.", CREATE_EXAMPLE);
61989
- throw new Error("usageError must throw");
62030
+ return usageError("Grant recipient kind must be member, pat, or component.", CREATE_EXAMPLE);
61990
62031
  }
61991
62032
  }
61992
62033
  function isPatternList(value) {
@@ -62959,7 +63000,7 @@ var ORG_DOMAIN = defineDomain({
62959
63000
  });
62960
63001
 
62961
63002
  // ../../packages/warmhub-cli/src/domains/prime-content.md
62962
- var prime_content_default = "# WarmHub CLI Context\n> **Context Recovery**: Run `wh prime` after compaction or new session\n\n## Environment\n{{REPO_LINE}}\n\n## Core Concepts\n- **Thing**: A named entity versioned by writes. **Assertion**: A thing that makes a shape-validated claim about another thing.\n- **Shape**: A thing defining data structure; every other thing has one. **Write**: One or more add/revise/retract operations with per-operation results.\n- **wref**: A reference to a thing. Local: `Player` (the shape) or `Player/alice` (a thing with that shape). Cross-repo: `wh:org/repo/Shape` or `wh:org/repo/Shape/name`.\n\n## Versioned Wrefs\n- `Shape` addresses the shape itself; `Shape/name` addresses a thing with that shape. `@vN` pins either.\n- Floating write refs to retracted targets fail; existing pinned versions remain valid.\n- Rename invalidates old spellings, including `@vN`; the new name resolves history.\n- Untyped wrefs accept any thing. `wref<T>` requires the target's shape to be `T`; a shape has no shape, so never satisfies it. `wref?` coalesces only `thing_absent`, never a missing shape.\n- Wref `binding`: `identity` follows the Thing, `versioned` pins.\n\n## Key Workflows\n\n**Write data** (discover shapes → scaffold ops → submit):\n```bash\nwh shape list --repo org/repo # list available shapes\nwh shape view ShapeName --repo org/repo # inspect fields\nwh shape template ShapeName -o ops.json --repo org/repo # scaffold write ops (supports --kind assertion)\n# edit ops.json — fill FILL_IN placeholders — then:\nwh commit submit --file ops.json --dry-run --repo org/repo # preview; remove --dry-run to submit\n# or single assertion (no file needed):\nwh assertion create --shape ShapeName --about Target/name --name my-assertion --data '{\"field\":1}' --repo org/repo\n# Relay failed operation details when present. Never hand-guess ops JSON — use `wh shape template <Shape>`.\n```\n\n**Read data:**\n```bash\nwh thing list --repo org/repo # all things at HEAD\nwh thing view Shape/name --repo org/repo # inspect a thing\nwh thing query --shape MyShape --repo org/repo # find things by shape\nwh thing about Shape --repo org/repo # assertions about a shape\nwh assertion list --repo org/repo # all assertions at HEAD\nwh thing history Shape/name --repo org/repo # version history\n\n# Batch read — wh thing view is variadic (max 500 wrefs/call):\nwh thing view Player/alice Player/bob # variadic positionals\nwh thing view --file wrefs.txt --json # one wref per line\ncat wrefs.txt | wh thing view --format jsonl # one JSON line per *deduped* requested wref\n```\n\n## Wref Quick Reference\n\nWrites use explicit names and wrefs. Untyped fields, collection members,\nassertion `about`, and committers accept any thing. Create a deterministic\ntarget before referencing it in the same commit.\n\n## Command Reference\n\n**Global flags**: `--repo`, `--format`, `--json`, `--live`\n### thing — Things\n- `wh thing list [--shape] [--kind] [--match] [--include-retracted]` — Current HEAD state\n- `wh thing view [<wref>...] [--file <path>] [--version] [--depth] [--include-retracted] [--data-mode auto|full]` — Thing details. Variadic (max 500). `--version` implies `--include-retracted`. Batch JSON returns `{ requested, items, missing }`; jsonl emits one row per deduped requested wref. Large Set/List bodies summarize by default; use `--data-mode full` for canonical collection JSON.\n- `wh thing history [wref] [--shape] [--about] [--include-retracted]` — Version history\n- `wh thing resolve <wref>` — Resolve a wref to its canonical thing identity\n- `wh thing create <name|Shape/name> (--data|--file) [--shape]` — Create\n- `wh thing revise <name> [--data] [--message] [--committer] [--expected-version]` — Revise (CONFLICT if HEAD≠n)\n- `wh thing retract <wref> -m <message> [--reason] [--kind] [--expected-version]` — Retract\n- `wh thing query [--shape] [--kind] [--about] [--match]` — Query by filters\n- `wh thing search <query> [--shape] [--kind] [--about] [--mode]` — Search text\n- `wh thing rename <Shape/oldName> <newName>` — Rename\n- `wh thing refs <wref> [--inbound] [--outbound] [--field]` — Show field references; use `wh thing about` for assertions about the target thing\n- `wh thing about <wref> [--shape] [--match] [--depth] [--resolve-collections] [--role from|to|ends] [--limit] [--include-retracted]` — Show assertions about the target identity; `--resolve-collections` expands bare/@HEAD/@ALL members, `--role` filters direction; not pinned @vN\n\n- `wh view evaluate VIEW [--limit N] [--cursor TOK] [--all]`\n### commit — Write operations\n- `wh commit submit [--ops|--file|--add|--revise|--retract] [--dry-run] [--skip-existing]` — Submit operations, or evaluate the complete bounded input without durable changes under `--dry-run`. JSONL preview emits one operation row per input plus one summary.\n- `wh shape template <shape> [shape2 ...] [--kind] [--operation add|revise|retract] [-o file]` — Generate sample ops\n\n### assertion — Assertion operations\n- `wh assertion list [--about wref] [--shape] [--match] [--include-retracted]` — Browse assertions\n- `wh assertion view <wref> [--version] [--include-retracted]` — Assertion details\n- `wh assertion create --shape <s> --name <n> --about <wref> [--data] [-m] [--committer]` — Create assertion\n- `wh assertion revise <wref> --data <json> [--message] [--committer]` — Revise assertion\n- `wh assertion retract <wref> -m <message> [--reason] [--committer] [--expected-version]` — Retract assertion\n- `wh assertion history <wref> [--include-retracted]` — Assertion history\n\n### shape — Shape management\n- `wh shape list [--match] [--include-retracted]` — List all shapes\n- `wh shape view <name> [--include-retracted]` — Shape details\n- `wh shape revise <name> (--fields|--file)`\n- `wh shape create <name> (--fields|--file)`\n- `wh shape retract <name> -m <message> [--reason] [--expected-version]` — Retract shape\n- `wh shape history <name> [--include-retracted]` — Shape history\n- `wh shape rename <oldName> <newName>` — Rename shape\n\n### repo — Repository management\n- `wh repo create <org/name> [--display-name] [--description] [--visibility]` — Create repo\n- `wh repo list [org]` — List repos\n- `wh repo view [org/repo]` — Repo details\n\n### org — Organization management\n- `wh org create <name> [--display-name]` — Create a new organization\n- `wh org view <name>` — View organization details (alias: info)\n- `wh org list` — List all organizations\n\n### sub — Subscription management\n- `wh sub create <name> [flags]` — Create a subscription\n- `wh sub view <name>` — View subscription details\n- `wh sub list` — List all subscriptions\n- `wh sub log <name>` — Tail subscription delivery feed\n- `wh sub attempts <runId>` — Show attempt history for a run\n- `wh sub pause <name>` — Pause a subscription\n- `wh sub resume <name>` — Resume a paused subscription\n- `wh sub bind <name> [--credentials]` — Bind a credential set to a subscription for webhook auth\n- `wh sub unbind <name>` — Remove credential binding from a subscription\n- `wh sub delete <name>` — Retire; name reserved\n\n### notifications — Action notification listing\n- `wh notifications [--limit] [--since]` — List repo-scoped action notifications\n\n### credential — Credential set management\n- `wh credential create <name> [--repo org/repo | --org org] [--scope] [--description]` — Create an empty credential set\n- `wh credential list [--repo org/repo | --org org]` — List credential sets accessible from a repo or org\n- `wh credential view <name> [--repo org/repo | --org org]` — View a credential set (key names only, no values)\n- `wh credential delete <name> [--repo org/repo | --org org]` — Delete a credential set and its Vault object\n- `wh credential set <setName> [<keyName>] [--repo org/repo | --org org] [--value]` — Set credential key(s). With `<keyName>`: single-key form (reads value from `--value` or stdin). Without `<keyName>`: batch form (reads JSON object from stdin, e.g. `{\"KEY\":\"val\"}`)\n- `wh credential unset <setName> <keyName> [--repo org/repo | --org org]` — Remove a key from a credential set\n- `wh credential audit <setName> [--repo org/repo | --org org]` — View audit log for a credential set\n- `wh credential revoke <setName> [--repo org/repo | --org org] [--reason]` — Revoke a credential set (blocks new binds and stops bound webhook deliveries)\n\n### component — Component management\n- `wh component validate <path>` — Validate package\n- `wh component install <org/name>` — Install a registered component\n- `wh component register <name> --org <org> --manifest <path> [flags]` — Register component identity\n- `wh component unregister <org/name>` — Remove a registered component identity\n- `wh component registry list --org <org>` — List registered components\n- `wh component registry view <org/name>` — View a registered component\n- `wh component registry update <org/name> [flags]` — Update a registered component\n- `wh component list` — List installed components\n- `wh component update <org/name>` — Update installed component\n- `wh component view <org/name>` — Show component details (alias: show)\n- `wh component doctor <org/name>` — Run component health checks\n- `wh component teardown <org/name>` — Pause component subscriptions\n\n### Getting More Info\n- `wh help` — help overview\n- `wh <domain>` — domain verbs\n- `wh <domain> <verb> --help` — verb flags and examples\n- `wh help --format json` — `CliSpecV2` (`schemaVersion: 2`): global/contextual/root tables and command overrides\n\n## Common Workflows\n\n**Explore a repo:**\n```bash\nwh thing list --repo org/repo # see all things in HEAD\nwh thing view Shape/name --repo org/repo # inspect a specific thing\nwh thing history Shape/name --repo org/repo # inspect version history\nwh thing about Shape/name # assertions about thing/shape\n```\n\n**Create an assertion** (most common write):\n```bash\n# --about takes an untyped target wref: Shape or Shape/name.\nwh assertion create --shape MyShape --about TargetShape/target-name \\\n --name my-assertion --data '{\"field_a\":1,\"field_b\":\"value\"}' --repo org/repo\n# Output includes per-operation status; relay failures when present.\n```\n\n**Create via write entrypoint** (alternative, supports batches and streams):\n```bash\nwh commit submit --add my-item --shape MyShape --kind assertion \\\n --about TargetShape/target-name --data '{\"field_a\":1}' --repo org/repo\n```\n\n**Batch write via file** (generate template → edit → submit):\n```bash\nwh shape template Hypothesis Evidence -o ops.json # add --kind assertion --about TargetShape/name for assertions\n# edit ops.json — fill FILL_IN placeholders\nwh commit submit --file ops.json -m \"batch update\" # submit all operations (bare `wh commit` is equivalent)\n# --file format: docs.warmhub.ai/cli-reference/commit-operations\n```\n\n**Bulk write (JSONL stream, >1k ops)** — one chunked stream beats per-record commits (~60× faster):\n```bash\nwh shape template MyShape -o ops.jsonl # one op per line (.jsonl)\nID=\"bulk-$(date +%s)\" # caller id for chunk correlation\nwh commit submit --file ops.jsonl --stream-id \"$ID\" --chunk-size 5000 \\\n --skip-existing --progress -m \"bulk ingest\" --repo org/repo\n# --chunk-size: ops per append chunk (default 1000, max 10000); chunk≈1 is ~60× slower\n# --skip-existing: skips already-written add ops (drops per-row read-before-write)\n# --stream-id identifies the submission but provides no receipt or resume.\n# After an outcome-unknown append, stop writes and reconcile attempted + unsent\n# work from a later verified checkpoint; never blindly replay revise/retract.\n```\n\n**Create collections:**\n```bash\nwh commit submit --type arc --name route --members Location/a,Location/b --repo org/repo\nwh assertion create --shape Supports --name route-support --about Arc/route --data '{\"confidence\":0.8}' --repo org/repo\n```\n\n**Modify data:**\n```bash\nwh thing revise Shape/name --data '{\"x\":5,\"y\":3}' -m \"update\" --repo org/repo\nwh thing retract Shape/old-item -m \"withdrawn\" --reason \"data feed contaminated\" --repo org/repo\n```\n\n**Query and filter:**\n```bash\nwh thing query --shape MyShape # by shape\nwh thing query --kind assertion --about Shape/name # by kind + target\nwh thing history Shape/name --limit 10 # version history\n```\n\n## Built-in Content shape\n\nWarmHub repos expose three well-known content wrefs:\n- `Content/Readme` — stored markdown for humans\n- `Content/Agents` — stored markdown guidance for AI agents\n- `Content/LlmsTxt` — synthesized per-request sitemap (read-only)\n\nFetch via `wh repo content get --kind readme|agents|llms-txt`,\n`client.repo.getReadme/getAgents/getLlmsTxt`, MCP `warmhub_repo_content_get`,\nor raw HTTP `GET /{org}/{repo}/readme.md|agents.md|llms.txt`.\nSee `wh repo describe` → `additionalInformation` for the discovery field.\n\n## Query Discipline\n- Plan the repo, shapes, and wrefs you need before the first query.\n- Gather the needed facts from one repo before switching to another.\n- Do the queries first, then write one complete answer.\n\n## Agent Tips\n- **Always run commands for live data** — this context describes the CLI, not repo contents\n- **Before writing, discover wrefs** — run `wh thing list` or `wh shape list`\n- **Shape field types**: `string`, `number`, `boolean`, `wref`, arrays, optionals, nested objects\n- **Write commands return per-operation results** — relay failures and affected wrefs to the user\n- **Pass data inline** with `--data '{...}'` — do NOT create temp files\n- Add `--json` to any command for machine-readable JSON output\n- **Aliases teach canonical commands** — executing aliases emit a status hint; misleading lifecycle aliases reject and point to `retract`\n- Writes go through `wh commit submit` (or bare `wh commit`) or wrappers (`create`, `revise`, `retract`, `assertion create`). `retract` irreversibly withdraws an identity and creates a history entry.\n- Use `wh doctor` to check environment health\n";
63003
+ var prime_content_default = "# WarmHub CLI Context\n> **Context Recovery**: Run `wh prime` after compaction or new session\n\n## Environment\n{{REPO_LINE}}\n\n## Core Concepts\n- **Thing**: A named entity versioned by writes. **Assertion**: A thing that makes a shape-validated claim about another thing.\n- **Shape**: A thing defining data structure; every other thing has one. **Write**: One or more add/revise/retract operations with per-operation results.\n- **wref**: A reference to a thing. Local: `Player` (the shape) or `Player/alice` (a thing with that shape). Cross-repo: `wh:org/repo/Shape` or `wh:org/repo/Shape/name`.\n\n## Versioned Wrefs\n- `Shape` addresses the shape itself; `Shape/name` addresses a thing with that shape. `@vN` pins either.\n- Floating write refs to retracted targets fail; existing pinned versions remain valid.\n- Rename invalidates old spellings, including `@vN`; the new name resolves history.\n- Untyped wrefs accept any thing. `wref<T>` requires the target's shape to be `T`; a shape has no shape, so never satisfies it. `wref?` coalesces only `thing_absent`, never a missing shape.\n- Wref `binding`: `identity` follows the Thing, `versioned` pins.\n\n## Key Workflows\n\n**Write data** (discover shapes → scaffold ops → submit):\n```bash\nwh shape list --repo org/repo # list available shapes\nwh shape view ShapeName --repo org/repo # inspect fields\nwh shape template ShapeName -o ops.json --repo org/repo # scaffold write ops (supports --kind assertion)\n# edit ops.json — fill FILL_IN placeholders — then:\nwh commit submit --file ops.json --dry-run --repo org/repo # preview; remove --dry-run to submit\n# or single assertion (no file needed):\nwh assertion create --shape ShapeName --about Target/name --name my-assertion --data '{\"field\":1}' --repo org/repo\n# Relay failed operation details when present. Never hand-guess ops JSON — use `wh shape template <Shape>`.\n```\n\n**Read data:**\n```bash\nwh thing list --repo org/repo # all things at HEAD\nwh thing view Shape/name --repo org/repo # inspect a thing\nwh thing query --shape MyShape --repo org/repo # find things by shape\nwh thing about Shape --repo org/repo # assertions about a shape\nwh assertion list --repo org/repo # all assertions at HEAD\nwh thing history Shape/name --repo org/repo # version history\n\n# Batch read — wh thing view is variadic (max 500 wrefs/call):\nwh thing view Player/alice Player/bob # variadic positionals\nwh thing view --file wrefs.txt --json # one wref per line\ncat wrefs.txt | wh thing view --format jsonl # one JSON line per *deduped* requested wref\n```\n\n## Wref Quick Reference\n\nWrites use explicit names and wrefs. Untyped fields, collection members,\nassertion `about`, and committers accept any thing. Create a deterministic\ntarget before referencing it in the same commit.\n\n## Command Reference\n\n**Global flags**: `--repo`, `--format`, `--json`, `--live`\n### thing — Things\n- `wh thing list [--shape] [--kind] [--match] [--include-retracted]` — Current HEAD state\n- `wh thing view [<wref>...] [--file <path>] [--version] [--depth] [--include-retracted] [--data-mode auto|full]` — Thing details. Variadic (max 500). `--version` implies `--include-retracted`. Batch JSON returns `{ requested, items, missing }`; jsonl emits one row per deduped requested wref. Large Set/List bodies summarize by default; use `--data-mode full` for canonical collection JSON.\n- `wh thing history [wref] [--shape] [--about] [--include-retracted]` — Version history\n- `wh thing resolve <wref>` — Resolve a wref to its canonical thing identity\n- `wh thing create <name|Shape/name> (--data|--file) [--shape]` — Create\n- `wh thing revise <name> [--data] [--message] [--committer] [--expected-version]` — Revise (CONFLICT if HEAD≠n)\n- `wh thing retract <wref> -m <message> [--reason] [--kind] [--expected-version]` — Retract\n- `wh thing query [--shape] [--kind] [--about] [--match]` — Query by filters\n- `wh thing search <query> [--shape] [--kind] [--about] [--mode]` — Search text\n- `wh thing rename <Shape/oldName> <newName>` — Rename\n- `wh thing refs <wref> [--inbound] [--outbound] [--field]` — Show field references; use `wh thing about` for assertions about the target thing\n- `wh thing about <wref> [--shape] [--match] [--depth] [--resolve-collections] [--role from|to|ends] [--limit] [--include-retracted]` — Show assertions about the target identity; `--resolve-collections` expands bare/@HEAD/@ALL members, `--role` filters direction; not pinned @vN\n\n- `wh view evaluate VIEW [--limit N] [--cursor TOK] [--all]`\n### commit — Write operations\n- `wh commit submit [--ops|--file|--add|--revise|--retract] [--dry-run] [--skip-existing]` — Submit operations, or evaluate the complete bounded input without durable changes under `--dry-run`. JSONL preview emits one operation row per input plus one summary.\n- `wh shape template <shape> [shape2 ...] [--kind] [--operation add|revise|retract] [-o file]` — Generate sample ops\n\n### assertion — Assertion operations\n- `wh assertion list [--about wref] [--shape] [--match] [--include-retracted]` — Browse assertions\n- `wh assertion view <wref> [--version] [--include-retracted]` — Assertion details\n- `wh assertion create --shape <s> --name <n> --about <wref> [--data] [-m] [--committer]` — Create assertion\n- `wh assertion revise <wref> --data <json> [--message] [--committer]` — Revise assertion\n- `wh assertion retract <wref> -m <message> [--reason] [--committer] [--expected-version]` — Retract assertion\n- `wh assertion history <wref> [--include-retracted]` — Assertion history\n\n### shape — Shape management\n- `wh shape list [--match] [--include-retracted]` — List all shapes\n- `wh shape view <name> [--include-retracted]` — Shape details\n- `wh shape revise <name> (--fields|--file)`\n- `wh shape create <name> (--fields|--file)`\n- `wh shape retract <name> -m <message> [--reason] [--expected-version]` — Retract shape\n- `wh shape history <name> [--include-retracted]` — Shape history\n- `wh shape rename <oldName> <newName>` — Rename shape\n\n### repo — Repository management\n- `wh repo create <org/name> [--display-name] [--description] [--visibility]` — Create repo\n- `wh repo list [org]` — List repos\n- `wh repo view [org/repo]` — Repo details\n\n### org — Organization management\n- `wh org create <name> [--display-name]` — Create a new organization\n- `wh org view <name>` — View organization details (alias: info)\n- `wh org list` — List all organizations\n\n### sub — Subscription management\n- `wh sub create <name> [flags]` — Create a subscription\n- `wh sub view <name>` — View subscription details\n- `wh sub list` — List all subscriptions\n- `wh sub log <name>` — Tail subscription delivery feed\n- `wh sub attempts <runId>` — Show attempt history for a run\n- `wh sub pause <name>` — Pause a subscription\n- `wh sub resume <name>` — Resume a paused subscription\n- `wh sub bind <name> [--credentials]` — Bind a credential set to a subscription for webhook auth\n- `wh sub unbind <name>` — Remove credential binding from a subscription\n- `wh sub delete <name>` — Retire; name reserved\n\n### notifications — Action notification listing\n- `wh notifications [--limit] [--since]` — List repo-scoped action notifications\n\n### credential — Credential set management\n- `wh credential create <name> [--repo org/repo | --org org] [--scope] [--description]` — Create an empty credential set\n- `wh credential list [--repo org/repo | --org org]` — List credential sets accessible from a repo or org\n- `wh credential view <name> [--repo org/repo | --org org]` — View a credential set (key names only, no values)\n- `wh credential delete <name> [--repo org/repo | --org org]` — Delete a credential set and its Vault object\n- `wh credential set <setName> [<keyName>] [--repo org/repo | --org org] [--value]` — Set credential key(s). With `<keyName>`: single-key form (reads value from `--value` or stdin). Without `<keyName>`: batch form (reads JSON object from stdin, e.g. `{\"KEY\":\"val\"}`)\n- `wh credential unset <setName> <keyName> [--repo org/repo | --org org]` — Remove a key from a credential set\n- `wh credential audit <setName> [--repo org/repo | --org org]` — View audit log for a credential set\n- `wh credential revoke <setName> [--repo org/repo | --org org] [--reason]` — Revoke a credential set (blocks new binds and stops bound webhook deliveries)\n\n### component — Component management\n- `wh component validate <path>` — Validate package\n- `wh component install <org/name>` — Install a registered component\n- `wh component register <name> --org <org> --manifest <path> [flags]` — Register component identity\n- `wh component unregister <org/name>` — Remove a registered component identity\n- `wh component registry list --org <org>` — List registered components\n- `wh component registry view <org/name>` — View a registered component\n- `wh component registry update <org/name> [flags]` — Update a registered component\n- `wh component list` — List installed components\n- `wh component update <org/name>` — Update installed component\n- `wh component view <org/name>` — Show component details (alias: show)\n- `wh component doctor <org/name>` — Run component health checks\n- `wh component teardown <org/name>` — Pause component subscriptions\n\n### Getting More Info\n- `wh help` — help overview\n- `wh <domain>` — domain verbs\n- `wh <domain> <verb> --help` — verb flags and examples\n- `wh help --format json` — `CliSpecV2` (`schemaVersion: 2`): global/contextual/root tables and command overrides\n\n## Common Workflows\n\n**Explore a repo:**\n```bash\nwh thing list --repo org/repo # see all things in HEAD\nwh thing view Shape/name --repo org/repo # inspect a specific thing\nwh thing history Shape/name --repo org/repo # inspect version history\nwh thing about Shape/name # assertions about thing/shape\n```\n\n**Create an assertion** (most common write):\n```bash\n# --about takes an untyped target wref: Shape or Shape/name.\nwh assertion create --shape MyShape --about TargetShape/target-name \\\n --name my-assertion --data '{\"field_a\":1,\"field_b\":\"value\"}' --repo org/repo\n# Output includes per-operation status; relay failures when present.\n```\n\n**Create via write entrypoint** (alternative, supports batches and streams):\n```bash\nwh commit submit --add my-item --shape MyShape --kind assertion \\\n --about TargetShape/target-name --data '{\"field_a\":1}' --repo org/repo\n```\n\n**Batch write via file** (generate template → edit → submit):\n```bash\nwh shape template Hypothesis Evidence -o ops.json # add --kind assertion --about TargetShape/name for assertions\n# edit ops.json — fill FILL_IN placeholders\nwh commit submit --file ops.json -m \"batch update\" # submit all operations (bare `wh commit` is equivalent)\n# --file format: docs.warmhub.ai/cli-reference/commit-operations\n```\n\n**Bulk write (JSONL stream, >1k ops)** — one chunked stream beats per-record commits (~60× faster):\n```bash\nwh shape template MyShape -o ops.jsonl # one op per line (.jsonl)\nID=\"bulk-$(date +%s)\" # caller id for chunk correlation\nwh commit submit --file ops.jsonl --stream-id \"$ID\" --chunk-size 5000 \\\n --skip-existing --progress -m \"bulk ingest\" --repo org/repo\n# --chunk-size: ops per append chunk (default 1000, max 10000); chunk≈1 is ~60× slower\n# --skip-existing: skips already-written add ops (drops per-row read-before-write)\n# --stream-id identifies the submission but provides no receipt or resume.\n# After an outcome-unknown append, stop writes and reconcile attempted + unsent\n# work from a later verified checkpoint; never blindly replay revise/retract.\n```\n\n**Create collections:**\n```bash\nwh commit submit --add route --shape Arc --data '{\"from\":\"Location/a\",\"to\":\"Location/b\"}'\nwh assertion create --shape Supports --name route-support --about Arc/route --data '{\"confidence\":0.8}' --repo org/repo\n```\n\n**Modify data:**\n```bash\nwh thing revise Shape/name --data '{\"x\":5,\"y\":3}' -m \"update\" --repo org/repo\nwh thing retract Shape/old-item -m \"withdrawn\" --reason \"data feed contaminated\" --repo org/repo\n```\n\n**Query and filter:**\n```bash\nwh thing query --shape MyShape # by shape\nwh thing query --kind assertion --about Shape/name # by kind + target\nwh thing history Shape/name --limit 10 # version history\n```\n\n## Built-in Content shape\n\nWarmHub repos expose three well-known content wrefs:\n- `Content/Readme` — stored markdown for humans\n- `Content/Agents` — stored markdown guidance for AI agents\n- `Content/LlmsTxt` — synthesized per-request sitemap (read-only)\n\nFetch via `wh repo content get --kind readme|agents|llms-txt`,\n`client.repo.getReadme/getAgents/getLlmsTxt`, MCP `warmhub_repo_content_get`,\nor raw HTTP `GET /{org}/{repo}/readme.md|agents.md|llms.txt`.\nSee `wh repo describe` → `additionalInformation` for the discovery field.\n\n## Query Discipline\n- Plan the repo, shapes, and wrefs you need before the first query.\n- Gather the needed facts from one repo before switching to another.\n- Do the queries first, then write one complete answer.\n\n## Agent Tips\n- **Always run commands for live data** — this context describes the CLI, not repo contents\n- **Before writing, discover wrefs** — run `wh thing list` or `wh shape list`\n- **Shape field types**: `string`, `number`, `boolean`, `wref`, arrays, optionals, nested objects\n- **Write commands return per-operation results** — relay failures and affected wrefs to the user\n- **Pass data inline** with `--data '{...}'` — do NOT create temp files\n- Add `--json` to any command for machine-readable JSON output\n- **Aliases teach canonical commands** — executing aliases emit a status hint; misleading lifecycle aliases reject and point to `retract`\n- Writes go through `wh commit submit` (or bare `wh commit`) or wrappers (`create`, `revise`, `retract`, `assertion create`). `retract` irreversibly withdraws an identity and creates a history entry.\n- Use `wh doctor` to check environment health\n";
62963
63004
 
62964
63005
  // ../../packages/warmhub-cli/src/domains/prime.ts
62965
63006
  function buildMarkdown(config2) {
@@ -68718,7 +68759,7 @@ function unknownCommandError(command, resolver) {
68718
68759
  return userInputError(`Unknown command: ${command}`, closest ? `Did you mean 'wh ${closest}'?` : "Run 'wh help' for available commands.");
68719
68760
  }
68720
68761
  function retirementError(entry) {
68721
- const resolved = resolveRenameHint(entry);
68762
+ const resolved = typeof entry === "string" ? { message: entry } : entry;
68722
68763
  return new CliError(2 /* UserInput */, "USER_INPUT", resolved.message, undefined, resolved.hint);
68723
68764
  }
68724
68765
  function rootControlWithCommandError(control) {
@@ -69366,8 +69407,7 @@ var resolver = createInvocationResolver(productionRegistry.getDomains());
69366
69407
  var catalog = {
69367
69408
  globals: GLOBAL_FLAG_SPECS,
69368
69409
  contextualControls: CONTEXTUAL_CONTROL_SPECS,
69369
- rootControls: ROOT_CONTROL_SPECS,
69370
- renameHints: RENAME_HINTS
69410
+ rootControls: ROOT_CONTROL_SPECS
69371
69411
  };
69372
69412
  function prepareCliInvocation(argv) {
69373
69413
  return prepare(argv, resolver, catalog);
@@ -69426,7 +69466,7 @@ function selectedRepo(flags, config2) {
69426
69466
  }
69427
69467
  }
69428
69468
  function isReservedCandidateName(name) {
69429
- return isBuiltinCliDomain(name) || getTopLevelRenameHintCommands().includes(name);
69469
+ return isBuiltinCliDomain(name);
69430
69470
  }
69431
69471
  function basePorts(flags, config2) {
69432
69472
  return {
@@ -69768,7 +69808,7 @@ function resolveLogLevel(flagLevel, env) {
69768
69808
  // package.json
69769
69809
  var package_default3 = {
69770
69810
  name: "@warmhub/cli",
69771
- version: "0.126.0",
69811
+ version: "0.128.0",
69772
69812
  private: false,
69773
69813
  type: "module",
69774
69814
  description: "The wh CLI for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",
@@ -70393,5 +70433,5 @@ process.exitCode = interceptedExitCode === undefined ? await runPreparedCli(laun
70393
70433
  version: package_default3.version
70394
70434
  }) : interceptedExitCode;
70395
70435
 
70396
- //# debugId=F59DA1C0179CC6A864756E2164756E21
70397
- //# warmhub-cli-build-info {"cliVersion":"0.126.0","sdkVersion":"0.124.0"}
70436
+ //# debugId=815EE8EFA242BD9064756E2164756E21
70437
+ //# warmhub-cli-build-info {"cliVersion":"0.128.0","sdkVersion":"0.126.0"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warmhub/cli",
3
- "version": "0.126.0",
3
+ "version": "0.128.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "The wh CLI for WarmHub — create repos, commit and query data, and compound knowledge with your AI agents.",