@michaelfromyeg/loom-schema 0.2.0 → 0.3.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.d.ts CHANGED
@@ -768,18 +768,20 @@ declare const SCHEMAS: {
768
768
  readonly "loom.lock": z.ZodObject<{
769
769
  loomVersion: z.ZodString;
770
770
  generatedAt: z.ZodString;
771
- plugin: z.ZodObject<{
771
+ plugins: z.ZodArray<z.ZodObject<{
772
772
  id: z.ZodString;
773
773
  version: z.ZodString;
774
774
  ref: z.ZodString;
775
775
  sha: z.ZodString;
776
- }, z.core.$strip>;
777
- dependencies: z.ZodArray<z.ZodObject<{
778
- id: z.ZodString;
779
- range: z.ZodString;
780
- resolvedSha: z.ZodString;
776
+ dependencies: z.ZodArray<z.ZodObject<{
777
+ id: z.ZodString;
778
+ range: z.ZodString;
779
+ resolvedSha: z.ZodString;
780
+ }, z.core.$strip>>;
781
+ aliases: z.ZodRecord<z.ZodString, z.ZodString>;
781
782
  }, z.core.$strip>>;
782
783
  artifacts: z.ZodArray<z.ZodObject<{
784
+ plugin: z.ZodString;
783
785
  component: z.ZodString;
784
786
  target: z.ZodEnum<{
785
787
  claude: "claude";
@@ -822,7 +824,6 @@ declare const SCHEMAS: {
822
824
  targetSchema: z.ZodString;
823
825
  }, z.core.$strip>>>;
824
826
  }, z.core.$strip>;
825
- aliases: z.ZodRecord<z.ZodString, z.ZodString>;
826
827
  }, z.core.$strip>;
827
828
  readonly "cases.yaml": z.ZodObject<{
828
829
  component: z.ZodString;
@@ -884,6 +885,7 @@ declare const Scope: z.ZodEnum<{
884
885
  }>;
885
886
  type Scope = z.infer<typeof Scope>;
886
887
  declare const ArtifactRecord: z.ZodObject<{
888
+ plugin: z.ZodString;
887
889
  component: z.ZodString;
888
890
  target: z.ZodEnum<{
889
891
  claude: "claude";
@@ -909,22 +911,42 @@ declare const AdapterRecord: z.ZodObject<{
909
911
  version: z.ZodString;
910
912
  targetSchema: z.ZodString;
911
913
  }, z.core.$strip>;
912
- /** `loom.lock` generated and committed; drives update/uninstall/verify. */
914
+ /** One installed plugin's record within a lockfile. */
915
+ declare const PluginLock: z.ZodObject<{
916
+ id: z.ZodString;
917
+ version: z.ZodString;
918
+ ref: z.ZodString;
919
+ sha: z.ZodString;
920
+ dependencies: z.ZodArray<z.ZodObject<{
921
+ id: z.ZodString;
922
+ range: z.ZodString;
923
+ resolvedSha: z.ZodString;
924
+ }, z.core.$strip>>;
925
+ aliases: z.ZodRecord<z.ZodString, z.ZodString>;
926
+ }, z.core.$strip>;
927
+ type PluginLock = z.infer<typeof PluginLock>;
928
+ /**
929
+ * `loom.lock` — the ledger of everything installed into one target (a project for
930
+ * project scope, the user dir for user scope). Drives update/uninstall/verify.
931
+ * Holds many plugins so a marketplace install is a single lockfile.
932
+ */
913
933
  declare const Lockfile: z.ZodObject<{
914
934
  loomVersion: z.ZodString;
915
935
  generatedAt: z.ZodString;
916
- plugin: z.ZodObject<{
936
+ plugins: z.ZodArray<z.ZodObject<{
917
937
  id: z.ZodString;
918
938
  version: z.ZodString;
919
939
  ref: z.ZodString;
920
940
  sha: z.ZodString;
921
- }, z.core.$strip>;
922
- dependencies: z.ZodArray<z.ZodObject<{
923
- id: z.ZodString;
924
- range: z.ZodString;
925
- resolvedSha: z.ZodString;
941
+ dependencies: z.ZodArray<z.ZodObject<{
942
+ id: z.ZodString;
943
+ range: z.ZodString;
944
+ resolvedSha: z.ZodString;
945
+ }, z.core.$strip>>;
946
+ aliases: z.ZodRecord<z.ZodString, z.ZodString>;
926
947
  }, z.core.$strip>>;
927
948
  artifacts: z.ZodArray<z.ZodObject<{
949
+ plugin: z.ZodString;
928
950
  component: z.ZodString;
929
951
  target: z.ZodEnum<{
930
952
  claude: "claude";
@@ -967,7 +989,6 @@ declare const Lockfile: z.ZodObject<{
967
989
  targetSchema: z.ZodString;
968
990
  }, z.core.$strip>>>;
969
991
  }, z.core.$strip>;
970
- aliases: z.ZodRecord<z.ZodString, z.ZodString>;
971
992
  }, z.core.$strip>;
972
993
  type Lockfile = z.infer<typeof Lockfile>;
973
994
 
@@ -1040,4 +1061,4 @@ declare function loadPlugin(text: string, opts?: {
1040
1061
  filename?: string;
1041
1062
  }): ParseResult<Plugin>;
1042
1063
 
1043
- export { ALL_TARGETS, AdapterRecord, AgentComponent, ArtifactRecord, Assertion, Badge, COMPONENT_KINDS, Case, CommandComponent, Component, type ComponentKind, ConfigVar, Dependency, type DetectedKind, DifferentialAssert, type DocFormat, EvalFile, HookComponent, IndexEntry, IndexFile, IndexVersion, JudgeAssert, Lockfile, Marketplace, MarketplaceEntry, McpComponent, Namespace, OutputAssert, Owner, type ParseIssue, type ParseResult, PassthroughComponent, Plugin, SCHEMAS, type SchemaName, Scope, SkillComponent, Target, TraceAssert, Trust, allJsonSchemas, detectComponentKind, fqid, jsonSchemaFor, kindOf, leafNameOf, loadManifest, loadPlugin, parseDocument, parsePlugin, refOf, schemaForKind, stringifyDocument, targetsOf, validate };
1064
+ export { ALL_TARGETS, AdapterRecord, AgentComponent, ArtifactRecord, Assertion, Badge, COMPONENT_KINDS, Case, CommandComponent, Component, type ComponentKind, ConfigVar, Dependency, type DetectedKind, DifferentialAssert, type DocFormat, EvalFile, HookComponent, IndexEntry, IndexFile, IndexVersion, JudgeAssert, Lockfile, Marketplace, MarketplaceEntry, McpComponent, Namespace, OutputAssert, Owner, type ParseIssue, type ParseResult, PassthroughComponent, Plugin, PluginLock, SCHEMAS, type SchemaName, Scope, SkillComponent, Target, TraceAssert, Trust, allJsonSchemas, detectComponentKind, fqid, jsonSchemaFor, kindOf, leafNameOf, loadManifest, loadPlugin, parseDocument, parsePlugin, refOf, schemaForKind, stringifyDocument, targetsOf, validate };
package/dist/index.js CHANGED
@@ -223,6 +223,8 @@ var IndexFile = z.object({
223
223
  });
224
224
  var Scope = z.enum(["user", "project"]);
225
225
  var ArtifactRecord = z.object({
226
+ /** Fully-qualified id of the plugin this artifact belongs to. */
227
+ plugin: z.string(),
226
228
  /** Fully-qualified component id. */
227
229
  component: z.string(),
228
230
  target: Target,
@@ -239,15 +241,11 @@ var AdapterRecord = z.object({
239
241
  version: z.string(),
240
242
  targetSchema: z.string()
241
243
  });
242
- var Lockfile = z.object({
243
- loomVersion: z.string(),
244
- generatedAt: z.string(),
245
- plugin: z.object({
246
- id: z.string(),
247
- version: z.string(),
248
- ref: z.string(),
249
- sha: z.string()
250
- }),
244
+ var PluginLock = z.object({
245
+ id: z.string(),
246
+ version: z.string(),
247
+ ref: z.string(),
248
+ sha: z.string(),
251
249
  dependencies: z.array(
252
250
  z.object({
253
251
  id: z.string(),
@@ -255,6 +253,14 @@ var Lockfile = z.object({
255
253
  resolvedSha: z.string()
256
254
  })
257
255
  ),
256
+ /** Bare leaf name -> fully-qualified id (§9.4). */
257
+ aliases: z.record(z.string(), z.string())
258
+ });
259
+ var Lockfile = z.object({
260
+ loomVersion: z.string(),
261
+ generatedAt: z.string(),
262
+ plugins: z.array(PluginLock),
263
+ /** Every placed artifact across all plugins; each tagged with its `plugin` id. */
258
264
  artifacts: z.array(ArtifactRecord),
259
265
  adapters: z.object({
260
266
  claude: AdapterRecord.optional(),
@@ -262,9 +268,7 @@ var Lockfile = z.object({
262
268
  cursor: AdapterRecord.optional(),
263
269
  copilot: AdapterRecord.optional(),
264
270
  opencode: AdapterRecord.optional()
265
- }).partial(),
266
- /** Bare leaf name -> fully-qualified id (§9.4). */
267
- aliases: z.record(z.string(), z.string())
271
+ }).partial()
268
272
  });
269
273
  var MarketplaceEntry = z.object({
270
274
  /** Same source forms as Dependency.plugin. */
@@ -379,6 +383,6 @@ function loadPlugin(text, opts = {}) {
379
383
  return parsePlugin(raw);
380
384
  }
381
385
 
382
- export { ALL_TARGETS, AdapterRecord, AgentComponent, ArtifactRecord, Assertion, Badge, COMPONENT_KINDS, Case, CommandComponent, Component, ConfigVar, Dependency, EvalFile, HookComponent, IndexEntry, IndexFile, IndexVersion, Lockfile, Marketplace, MarketplaceEntry, McpComponent, Namespace, Owner, PassthroughComponent, Plugin, SCHEMAS, Scope, SkillComponent, Target, Trust, allJsonSchemas, detectComponentKind, fqid, jsonSchemaFor, kindOf, leafNameOf, loadManifest, loadPlugin, parseDocument, parsePlugin, refOf, schemaForKind, stringifyDocument, targetsOf, validate };
386
+ export { ALL_TARGETS, AdapterRecord, AgentComponent, ArtifactRecord, Assertion, Badge, COMPONENT_KINDS, Case, CommandComponent, Component, ConfigVar, Dependency, EvalFile, HookComponent, IndexEntry, IndexFile, IndexVersion, Lockfile, Marketplace, MarketplaceEntry, McpComponent, Namespace, Owner, PassthroughComponent, Plugin, PluginLock, SCHEMAS, Scope, SkillComponent, Target, Trust, allJsonSchemas, detectComponentKind, fqid, jsonSchemaFor, kindOf, leafNameOf, loadManifest, loadPlugin, parseDocument, parsePlugin, refOf, schemaForKind, stringifyDocument, targetsOf, validate };
383
387
  //# sourceMappingURL=index.js.map
384
388
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/component.ts","../src/evals.ts","../src/indexfile.ts","../src/lockfile.ts","../src/marketplace.ts","../src/jsonschema.ts","../src/parse.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/** The five coding-agent harnesses Loom compiles to. */\nexport const Target = z.enum([\"claude\", \"codex\", \"cursor\", \"copilot\", \"opencode\"]);\nexport type Target = z.infer<typeof Target>;\n\nexport const ALL_TARGETS: readonly Target[] = Target.options;\n\n/** Reverse-DNS namespace, e.g. `com.acme`. */\nexport const Namespace = z\n .string()\n .regex(/^[a-z0-9]+(\\.[a-z0-9]+)+$/, \"namespace must be reverse-DNS, e.g. com.acme\");\n\nexport const Owner = z.object({\n name: z.string(),\n namespace: Namespace,\n email: z.email().optional(),\n});\nexport type Owner = z.infer<typeof Owner>;\n\n/** A config value a component reads at runtime. Declared, never stored (§11). */\nexport const ConfigVar = z.object({\n env: z.string(),\n secret: z.boolean().default(false),\n prompt: z.string().optional(),\n default: z.string().optional(),\n required: z.boolean().default(true),\n});\nexport type ConfigVar = z.infer<typeof ConfigVar>;\n\nconst commonFields = {\n /** Which harnesses to emit for; default = all five. */\n targets: z.array(Target).optional(),\n /** Path to a `cases.yaml` eval file, relative to the plugin root. */\n evals: z.string().optional(),\n} as const;\n\n/** The seven primitive component kinds. `passthrough` is verbatim/single-target. */\nexport const COMPONENT_KINDS = [\"skill\", \"mcp\", \"agent\", \"hook\", \"command\", \"passthrough\"] as const;\nexport type ComponentKind = (typeof COMPONENT_KINDS)[number];\n\nexport const SkillComponent = z.strictObject({ ...commonFields, skill: z.string() });\nexport const McpComponent = z.strictObject({\n ...commonFields,\n mcp: z.string(),\n config: z.array(ConfigVar).optional(),\n});\nexport const AgentComponent = z.strictObject({ ...commonFields, agent: z.string() });\nexport const HookComponent = z.strictObject({ ...commonFields, hook: z.string() });\nexport const CommandComponent = z.strictObject({ ...commonFields, command: z.string() });\n\n/** A verbatim executable artifact bound to a single harness. Placed DISABLED. */\nexport const PassthroughComponent = z.strictObject({\n passthrough: z.string(),\n target: Target,\n kind: z.enum([\"hook\", \"plugin\", \"script\"]),\n default_enabled: z.boolean().default(false),\n});\n\nexport const Component = z.union([\n SkillComponent,\n McpComponent,\n AgentComponent,\n HookComponent,\n CommandComponent,\n PassthroughComponent,\n]);\nexport type Component = z.infer<typeof Component>;\n\n/** Source forms accepted for a plugin reference. */\nexport const Dependency = z.object({\n /** github:owner/repo | <git-url> | npm:<pkg> | ./path */\n plugin: z.string(),\n version: z.string().optional(),\n /** Piecemeal: pull only these leaf names (+ their shared/sibling assets). */\n components: z.array(z.string()).optional(),\n});\nexport type Dependency = z.infer<typeof Dependency>;\n\nexport const Trust = z.object({\n sign: z.boolean().default(false),\n scan: z.array(z.enum([\"schema\", \"security\"])).default([\"schema\"]),\n});\nexport type Trust = z.infer<typeof Trust>;\n\n/** `loom.yaml` — the single file an author writes. */\nexport const Plugin = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, \"plugin name must be kebab-case\"),\n version: z.string(),\n owner: Owner,\n description: z.string().optional(),\n license: z.string().optional(),\n loom_min_version: z.string().optional(),\n components: z.array(Component),\n depends: z.array(Dependency).optional(),\n trust: Trust.optional(),\n});\nexport type Plugin = z.infer<typeof Plugin>;\n","import {\n AgentComponent,\n CommandComponent,\n type Component,\n type ComponentKind,\n HookComponent,\n McpComponent,\n PassthroughComponent,\n SkillComponent,\n} from \"./plugin\";\n\n/** The key that names each component variant in `loom.yaml`. */\nconst KIND_KEYS: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nconst VARIANT_SCHEMAS = {\n skill: SkillComponent,\n mcp: McpComponent,\n agent: AgentComponent,\n hook: HookComponent,\n command: CommandComponent,\n passthrough: PassthroughComponent,\n} as const;\n\nexport interface DetectedKind {\n kind: ComponentKind;\n}\n\n/**\n * Decide a component's kind from which discriminating key is present.\n * Returns an error string instead of throwing so callers can attach a path.\n */\nexport function detectComponentKind(\n raw: unknown,\n): { ok: true; kind: ComponentKind } | { ok: false; error: string } {\n if (typeof raw !== \"object\" || raw === null) {\n return { ok: false, error: \"component must be an object\" };\n }\n const present = (Object.keys(KIND_KEYS) as ComponentKind[]).filter(\n (kind) => KIND_KEYS[kind] in (raw as Record<string, unknown>),\n );\n if (present.length === 0) {\n return {\n ok: false,\n error: `component has no kind key (one of: ${Object.values(KIND_KEYS).join(\", \")})`,\n };\n }\n if (present.length > 1) {\n return {\n ok: false,\n error: `component has conflicting kind keys: ${present.join(\", \")}`,\n };\n }\n return { ok: true, kind: present[0] as ComponentKind };\n}\n\n/** The schema for a detected kind — used by the loader for path-precise errors. */\nexport function schemaForKind(kind: ComponentKind) {\n return VARIANT_SCHEMAS[kind];\n}\n\n/** The kind of an already-validated component. */\nexport function kindOf(component: Component): ComponentKind {\n const detected = detectComponentKind(component);\n if (!detected.ok) throw new Error(detected.error);\n return detected.kind;\n}\n\n/** The relative path (skill dir, mcp dir, hook file, …) this component points at. */\nexport function refOf(component: Component): string {\n const c = component as Record<string, unknown>;\n const kind = kindOf(component);\n return c[KIND_KEYS[kind]] as string;\n}\n\n/**\n * The leaf name used to build a fully-qualified id `{namespace}/{plugin}:{leaf}`.\n * Derived from the basename of the component's ref, stripping a known extension.\n */\nexport function leafNameOf(component: Component): string {\n const ref = refOf(component);\n const base = ref.split(\"/\").filter(Boolean).pop() ?? ref;\n return base.replace(/\\.(md|json|toml|ya?ml|ts|js|sh)$/i, \"\");\n}\n\n/** Harnesses this component targets, defaulting to all when unspecified. */\nexport function targetsOf(component: Component, all: readonly string[]): readonly string[] {\n if (\"target\" in component && typeof component.target === \"string\") {\n return [component.target];\n }\n if (\"targets\" in component && component.targets && component.targets.length > 0) {\n return component.targets;\n }\n return all;\n}\n\n/** Build the canonical fully-qualified id for a component. */\nexport function fqid(namespace: string, bundleName: string, leaf: string): string {\n return `${namespace}/${bundleName}:${leaf}`;\n}\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\nconst TraceAssert = z.object({\n kind: z.literal(\"trace\"),\n toolCalled: z.string().optional(),\n toolNotCalled: z.string().optional(),\n /** Required call order. */\n sequence: z.array(z.string()).optional(),\n /** Path-efficiency ceiling. */\n maxCalls: z.number().optional(),\n minPassRate: z.number().min(0).max(1).default(1.0),\n});\nexport type TraceAssert = z.infer<typeof TraceAssert>;\n\nconst OutputAssert = z.object({\n kind: z.literal(\"output\"),\n equals: z.string().optional(),\n matches: z.string().optional(),\n jsonSchema: z.string().optional(),\n tolerance: z.number().optional(),\n});\nexport type OutputAssert = z.infer<typeof OutputAssert>;\n\nconst JudgeAssert = z.object({\n kind: z.literal(\"judge\"),\n rubric: z.string(),\n mode: z.enum([\"absolute\", \"pairwise\"]).default(\"pairwise\"),\n /** Required for pairwise. */\n reference: z.string().optional(),\n samples: z.number().default(3),\n /** Absolute mode only. */\n threshold: z.number().optional(),\n /** Advisory unless true. */\n gate: z.boolean().default(false),\n});\nexport type JudgeAssert = z.infer<typeof JudgeAssert>;\n\nconst DifferentialAssert = z.object({\n kind: z.literal(\"differential\"),\n baseline: z.string().default(\"last-release\"),\n noWorseThan: z.number().default(0.0),\n});\nexport type DifferentialAssert = z.infer<typeof DifferentialAssert>;\n\nexport const Assertion = z.discriminatedUnion(\"kind\", [\n TraceAssert,\n OutputAssert,\n JudgeAssert,\n DifferentialAssert,\n]);\nexport type Assertion = z.infer<typeof Assertion>;\n\nexport const Case = z.object({\n name: z.string(),\n prompt: z.string(),\n /** Shell, run before. */\n setup: z.string().optional(),\n /** Shell, exit 0 = pass (post-state check). */\n verify: z.string().optional(),\n cleanup: z.string().optional(),\n samples: z.number().default(1),\n assert: z.array(Assertion),\n});\nexport type Case = z.infer<typeof Case>;\n\n/** `cases.yaml` — evals for one component. */\nexport const EvalFile = z.object({\n /** Fully-qualified component id. */\n component: z.string(),\n /** Which harnesses to run; others reported UNTESTED. */\n harnesses: z.array(Target),\n cases: z.array(Case),\n});\nexport type EvalFile = z.infer<typeof EvalFile>;\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\n/** Trust badges (spec §10). valid/tested are computed in Phase 2; the rest in Phase 3. */\nexport const Badge = z.enum([\"valid\", \"tested\", \"verified\", \"scanned\", \"signed\"]);\nexport type Badge = z.infer<typeof Badge>;\n\nexport const IndexVersion = z.object({\n version: z.string(),\n ref: z.string(),\n sha: z.string(),\n badges: z.array(Badge),\n /** Harnesses with passing deterministic eval runs. */\n harnessCoverage: z.array(Target),\n});\nexport type IndexVersion = z.infer<typeof IndexVersion>;\n\nexport const IndexEntry = z.object({\n id: z.string(),\n source: z.string(),\n versions: z.array(IndexVersion),\n /** Aggregate, opt-in only -- never per-user. */\n telemetry: z\n .object({\n installs: z.number().default(0),\n activeUsage: z.number().default(0),\n })\n .optional(),\n});\nexport type IndexEntry = z.infer<typeof IndexEntry>;\n\n/** `loom.index/1` -- a metadata-only aggregator (spec §10), self-hostable static JSON. */\nexport const IndexFile = z.object({\n schema: z.literal(\"loom.index/1\"),\n plugins: z.array(IndexEntry),\n federated: z.array(z.object({ source: z.string(), ingestedAt: z.string() })).optional(),\n});\nexport type IndexFile = z.infer<typeof IndexFile>;\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\nexport const Scope = z.enum([\"user\", \"project\"]);\nexport type Scope = z.infer<typeof Scope>;\n\nexport const ArtifactRecord = z.object({\n /** Fully-qualified component id. */\n component: z.string(),\n target: Target,\n scope: Scope,\n /** Absolute placement path. */\n path: z.string(),\n /** sha256 of compiled output. */\n hash: z.string(),\n placement: z.enum([\"copy\", \"shared\"]),\n /** Executable artifacts start disabled (§11). */\n enabled: z.boolean(),\n});\nexport type ArtifactRecord = z.infer<typeof ArtifactRecord>;\n\nexport const AdapterRecord = z.object({\n version: z.string(),\n targetSchema: z.string(),\n});\n\n/** `loom.lock` — generated and committed; drives update/uninstall/verify. */\nexport const Lockfile = z.object({\n loomVersion: z.string(),\n generatedAt: z.string(),\n plugin: z.object({\n id: z.string(),\n version: z.string(),\n ref: z.string(),\n sha: z.string(),\n }),\n dependencies: z.array(\n z.object({\n id: z.string(),\n range: z.string(),\n resolvedSha: z.string(),\n }),\n ),\n artifacts: z.array(ArtifactRecord),\n adapters: z\n .object({\n claude: AdapterRecord.optional(),\n codex: AdapterRecord.optional(),\n cursor: AdapterRecord.optional(),\n copilot: AdapterRecord.optional(),\n opencode: AdapterRecord.optional(),\n })\n .partial(),\n /** Bare leaf name -> fully-qualified id (§9.4). */\n aliases: z.record(z.string(), z.string()),\n});\nexport type Lockfile = z.infer<typeof Lockfile>;\n","import { z } from \"zod\";\nimport { Owner } from \"./plugin\";\n\nexport const MarketplaceEntry = z.object({\n /** Same source forms as Dependency.plugin. */\n plugin: z.string(),\n version: z.string().optional(),\n category: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\nexport type MarketplaceEntry = z.infer<typeof MarketplaceEntry>;\n\n/** `marketplace.yaml` — a curated catalog compiled to each harness's native form. */\nexport const Marketplace = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, \"marketplace name must be kebab-case\"),\n owner: Owner,\n description: z.string().optional(),\n plugins: z.array(MarketplaceEntry),\n /** Permitted external namespaces a plugin here may depend on. */\n allow_dependencies_on: z.array(z.string()).optional(),\n});\nexport type Marketplace = z.infer<typeof Marketplace>;\n","import { z } from \"zod\";\nimport { EvalFile } from \"./evals\";\nimport { Lockfile } from \"./lockfile\";\nimport { Marketplace } from \"./marketplace\";\nimport { Plugin } from \"./plugin\";\n\n/** Canonical manifests for which we publish a `$schema` for editor autocomplete. */\nexport const SCHEMAS = {\n \"loom.yaml\": Plugin,\n \"marketplace.yaml\": Marketplace,\n \"loom.lock\": Lockfile,\n \"cases.yaml\": EvalFile,\n} as const;\n\nexport type SchemaName = keyof typeof SCHEMAS;\n\n/** Export a JSON Schema (draft 2020-12) for one canonical manifest. */\nexport function jsonSchemaFor(name: SchemaName): unknown {\n return z.toJSONSchema(SCHEMAS[name], { target: \"draft-2020-12\" });\n}\n\n/** Export JSON Schemas for every canonical manifest, keyed by file name. */\nexport function allJsonSchemas(): Record<SchemaName, unknown> {\n const out = {} as Record<SchemaName, unknown>;\n for (const name of Object.keys(SCHEMAS) as SchemaName[]) {\n out[name] = jsonSchemaFor(name);\n }\n return out;\n}\n","import JSON5 from \"json5\";\nimport * as YAML from \"yaml\";\nimport type { z } from \"zod\";\nimport { detectComponentKind, schemaForKind } from \"./component\";\nimport { Plugin } from \"./plugin\";\n\nexport type DocFormat = \"yaml\" | \"json5\" | \"auto\";\n\nexport interface ParseIssue {\n path: string;\n message: string;\n}\nexport type ParseResult<T> = { ok: true; value: T } | { ok: false; issues: ParseIssue[] };\n\nfunction guessFormat(filename?: string): \"yaml\" | \"json5\" {\n if (filename && /\\.json5$/i.test(filename)) return \"json5\";\n return \"yaml\";\n}\n\n/**\n * Read raw manifest text into a plain object.\n *\n * YAML is parsed in **1.2 core** mode, which kills the \"Norway problem\": only\n * `true`/`false` are booleans, so `no`/`yes`/`on`/`off` stay strings. (Unquoted\n * `1.10` still becomes the float `1.1` per YAML semantics — but version fields\n * are typed as strings, so that surfaces as a precise Zod error telling the\n * author to quote it.) `strict` rejects duplicate keys. JSON5 input is accepted\n * against the same schemas.\n */\nexport function parseDocument(\n text: string,\n format: DocFormat = \"auto\",\n filename?: string,\n): unknown {\n const fmt = format === \"auto\" ? guessFormat(filename) : format;\n if (fmt === \"json5\") return JSON5.parse(text);\n return YAML.parse(text, { version: \"1.2\", schema: \"core\", strict: true });\n}\n\n/** Serialize an object back to YAML 1.2 (used when writing a generated manifest). */\nexport function stringifyDocument(obj: unknown): string {\n return YAML.stringify(obj, { version: \"1.2\" });\n}\n\nfunction pathStr(path: readonly PropertyKey[]): string {\n let out = \"\";\n for (const seg of path) {\n if (typeof seg === \"number\") out += `[${seg}]`;\n else {\n const key = String(seg);\n out += out ? `.${key}` : key;\n }\n }\n return out;\n}\n\n/** Validate an already-parsed object against a schema, returning path-precise issues. */\nexport function validate<T>(schema: z.ZodType<T>, raw: unknown): ParseResult<T> {\n const r = schema.safeParse(raw);\n if (r.success) return { ok: true, value: r.data };\n return {\n ok: false,\n issues: r.error.issues.map((iss) => ({ path: pathStr(iss.path), message: iss.message })),\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/**\n * Parse a plugin with kind-aware component routing, so a malformed component\n * produces `components[2].mcp: Required` rather than a noisy union error.\n */\nexport function parsePlugin(raw: unknown): ParseResult<Plugin> {\n const issues: ParseIssue[] = [];\n\n if (isRecord(raw) && Array.isArray(raw.components)) {\n raw.components.forEach((c, i) => {\n const det = detectComponentKind(c);\n if (!det.ok) {\n issues.push({ path: `components[${i}]`, message: det.error });\n return;\n }\n const r = schemaForKind(det.kind).safeParse(c);\n if (!r.success) {\n for (const iss of r.error.issues) {\n issues.push({ path: `components[${i}].${pathStr(iss.path)}`, message: iss.message });\n }\n }\n });\n }\n\n const full = Plugin.safeParse(raw);\n if (!full.success) {\n for (const iss of full.error.issues) {\n // Skip generic union noise on components — pass 1 gave precise messages.\n if (issues.length > 0 && iss.path[0] === \"components\") continue;\n issues.push({ path: pathStr(iss.path), message: iss.message });\n }\n }\n\n if (issues.length > 0) return { ok: false, issues };\n // No issues means the full parse succeeded (a bad component fails Plugin too).\n return { ok: true, value: (full as { data: Plugin }).data };\n}\n\n/** Convenience: read text (YAML/JSON5) and validate against any schema. */\nexport function loadManifest<T>(\n schema: z.ZodType<T>,\n text: string,\n opts: { format?: DocFormat; filename?: string } = {},\n): ParseResult<T> {\n let raw: unknown;\n try {\n raw = parseDocument(text, opts.format ?? \"auto\", opts.filename);\n } catch (err) {\n return { ok: false, issues: [{ path: \"\", message: `parse error: ${(err as Error).message}` }] };\n }\n return validate(schema, raw);\n}\n\n/** Read text (YAML/JSON5) and parse as a plugin with component routing. */\nexport function loadPlugin(\n text: string,\n opts: { format?: DocFormat; filename?: string } = {},\n): ParseResult<Plugin> {\n let raw: unknown;\n try {\n raw = parseDocument(text, opts.format ?? \"auto\", opts.filename);\n } catch (err) {\n return { ok: false, issues: [{ path: \"\", message: `parse error: ${(err as Error).message}` }] };\n }\n return parsePlugin(raw);\n}\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/component.ts","../src/evals.ts","../src/indexfile.ts","../src/lockfile.ts","../src/marketplace.ts","../src/jsonschema.ts","../src/parse.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/** The five coding-agent harnesses Loom compiles to. */\nexport const Target = z.enum([\"claude\", \"codex\", \"cursor\", \"copilot\", \"opencode\"]);\nexport type Target = z.infer<typeof Target>;\n\nexport const ALL_TARGETS: readonly Target[] = Target.options;\n\n/** Reverse-DNS namespace, e.g. `com.acme`. */\nexport const Namespace = z\n .string()\n .regex(/^[a-z0-9]+(\\.[a-z0-9]+)+$/, \"namespace must be reverse-DNS, e.g. com.acme\");\n\nexport const Owner = z.object({\n name: z.string(),\n namespace: Namespace,\n email: z.email().optional(),\n});\nexport type Owner = z.infer<typeof Owner>;\n\n/** A config value a component reads at runtime. Declared, never stored (§11). */\nexport const ConfigVar = z.object({\n env: z.string(),\n secret: z.boolean().default(false),\n prompt: z.string().optional(),\n default: z.string().optional(),\n required: z.boolean().default(true),\n});\nexport type ConfigVar = z.infer<typeof ConfigVar>;\n\nconst commonFields = {\n /** Which harnesses to emit for; default = all five. */\n targets: z.array(Target).optional(),\n /** Path to a `cases.yaml` eval file, relative to the plugin root. */\n evals: z.string().optional(),\n} as const;\n\n/** The seven primitive component kinds. `passthrough` is verbatim/single-target. */\nexport const COMPONENT_KINDS = [\"skill\", \"mcp\", \"agent\", \"hook\", \"command\", \"passthrough\"] as const;\nexport type ComponentKind = (typeof COMPONENT_KINDS)[number];\n\nexport const SkillComponent = z.strictObject({ ...commonFields, skill: z.string() });\nexport const McpComponent = z.strictObject({\n ...commonFields,\n mcp: z.string(),\n config: z.array(ConfigVar).optional(),\n});\nexport const AgentComponent = z.strictObject({ ...commonFields, agent: z.string() });\nexport const HookComponent = z.strictObject({ ...commonFields, hook: z.string() });\nexport const CommandComponent = z.strictObject({ ...commonFields, command: z.string() });\n\n/** A verbatim executable artifact bound to a single harness. Placed DISABLED. */\nexport const PassthroughComponent = z.strictObject({\n passthrough: z.string(),\n target: Target,\n kind: z.enum([\"hook\", \"plugin\", \"script\"]),\n default_enabled: z.boolean().default(false),\n});\n\nexport const Component = z.union([\n SkillComponent,\n McpComponent,\n AgentComponent,\n HookComponent,\n CommandComponent,\n PassthroughComponent,\n]);\nexport type Component = z.infer<typeof Component>;\n\n/** Source forms accepted for a plugin reference. */\nexport const Dependency = z.object({\n /** github:owner/repo | <git-url> | npm:<pkg> | ./path */\n plugin: z.string(),\n version: z.string().optional(),\n /** Piecemeal: pull only these leaf names (+ their shared/sibling assets). */\n components: z.array(z.string()).optional(),\n});\nexport type Dependency = z.infer<typeof Dependency>;\n\nexport const Trust = z.object({\n sign: z.boolean().default(false),\n scan: z.array(z.enum([\"schema\", \"security\"])).default([\"schema\"]),\n});\nexport type Trust = z.infer<typeof Trust>;\n\n/** `loom.yaml` — the single file an author writes. */\nexport const Plugin = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, \"plugin name must be kebab-case\"),\n version: z.string(),\n owner: Owner,\n description: z.string().optional(),\n license: z.string().optional(),\n loom_min_version: z.string().optional(),\n components: z.array(Component),\n depends: z.array(Dependency).optional(),\n trust: Trust.optional(),\n});\nexport type Plugin = z.infer<typeof Plugin>;\n","import {\n AgentComponent,\n CommandComponent,\n type Component,\n type ComponentKind,\n HookComponent,\n McpComponent,\n PassthroughComponent,\n SkillComponent,\n} from \"./plugin\";\n\n/** The key that names each component variant in `loom.yaml`. */\nconst KIND_KEYS: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nconst VARIANT_SCHEMAS = {\n skill: SkillComponent,\n mcp: McpComponent,\n agent: AgentComponent,\n hook: HookComponent,\n command: CommandComponent,\n passthrough: PassthroughComponent,\n} as const;\n\nexport interface DetectedKind {\n kind: ComponentKind;\n}\n\n/**\n * Decide a component's kind from which discriminating key is present.\n * Returns an error string instead of throwing so callers can attach a path.\n */\nexport function detectComponentKind(\n raw: unknown,\n): { ok: true; kind: ComponentKind } | { ok: false; error: string } {\n if (typeof raw !== \"object\" || raw === null) {\n return { ok: false, error: \"component must be an object\" };\n }\n const present = (Object.keys(KIND_KEYS) as ComponentKind[]).filter(\n (kind) => KIND_KEYS[kind] in (raw as Record<string, unknown>),\n );\n if (present.length === 0) {\n return {\n ok: false,\n error: `component has no kind key (one of: ${Object.values(KIND_KEYS).join(\", \")})`,\n };\n }\n if (present.length > 1) {\n return {\n ok: false,\n error: `component has conflicting kind keys: ${present.join(\", \")}`,\n };\n }\n return { ok: true, kind: present[0] as ComponentKind };\n}\n\n/** The schema for a detected kind — used by the loader for path-precise errors. */\nexport function schemaForKind(kind: ComponentKind) {\n return VARIANT_SCHEMAS[kind];\n}\n\n/** The kind of an already-validated component. */\nexport function kindOf(component: Component): ComponentKind {\n const detected = detectComponentKind(component);\n if (!detected.ok) throw new Error(detected.error);\n return detected.kind;\n}\n\n/** The relative path (skill dir, mcp dir, hook file, …) this component points at. */\nexport function refOf(component: Component): string {\n const c = component as Record<string, unknown>;\n const kind = kindOf(component);\n return c[KIND_KEYS[kind]] as string;\n}\n\n/**\n * The leaf name used to build a fully-qualified id `{namespace}/{plugin}:{leaf}`.\n * Derived from the basename of the component's ref, stripping a known extension.\n */\nexport function leafNameOf(component: Component): string {\n const ref = refOf(component);\n const base = ref.split(\"/\").filter(Boolean).pop() ?? ref;\n return base.replace(/\\.(md|json|toml|ya?ml|ts|js|sh)$/i, \"\");\n}\n\n/** Harnesses this component targets, defaulting to all when unspecified. */\nexport function targetsOf(component: Component, all: readonly string[]): readonly string[] {\n if (\"target\" in component && typeof component.target === \"string\") {\n return [component.target];\n }\n if (\"targets\" in component && component.targets && component.targets.length > 0) {\n return component.targets;\n }\n return all;\n}\n\n/** Build the canonical fully-qualified id for a component. */\nexport function fqid(namespace: string, bundleName: string, leaf: string): string {\n return `${namespace}/${bundleName}:${leaf}`;\n}\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\nconst TraceAssert = z.object({\n kind: z.literal(\"trace\"),\n toolCalled: z.string().optional(),\n toolNotCalled: z.string().optional(),\n /** Required call order. */\n sequence: z.array(z.string()).optional(),\n /** Path-efficiency ceiling. */\n maxCalls: z.number().optional(),\n minPassRate: z.number().min(0).max(1).default(1.0),\n});\nexport type TraceAssert = z.infer<typeof TraceAssert>;\n\nconst OutputAssert = z.object({\n kind: z.literal(\"output\"),\n equals: z.string().optional(),\n matches: z.string().optional(),\n jsonSchema: z.string().optional(),\n tolerance: z.number().optional(),\n});\nexport type OutputAssert = z.infer<typeof OutputAssert>;\n\nconst JudgeAssert = z.object({\n kind: z.literal(\"judge\"),\n rubric: z.string(),\n mode: z.enum([\"absolute\", \"pairwise\"]).default(\"pairwise\"),\n /** Required for pairwise. */\n reference: z.string().optional(),\n samples: z.number().default(3),\n /** Absolute mode only. */\n threshold: z.number().optional(),\n /** Advisory unless true. */\n gate: z.boolean().default(false),\n});\nexport type JudgeAssert = z.infer<typeof JudgeAssert>;\n\nconst DifferentialAssert = z.object({\n kind: z.literal(\"differential\"),\n baseline: z.string().default(\"last-release\"),\n noWorseThan: z.number().default(0.0),\n});\nexport type DifferentialAssert = z.infer<typeof DifferentialAssert>;\n\nexport const Assertion = z.discriminatedUnion(\"kind\", [\n TraceAssert,\n OutputAssert,\n JudgeAssert,\n DifferentialAssert,\n]);\nexport type Assertion = z.infer<typeof Assertion>;\n\nexport const Case = z.object({\n name: z.string(),\n prompt: z.string(),\n /** Shell, run before. */\n setup: z.string().optional(),\n /** Shell, exit 0 = pass (post-state check). */\n verify: z.string().optional(),\n cleanup: z.string().optional(),\n samples: z.number().default(1),\n assert: z.array(Assertion),\n});\nexport type Case = z.infer<typeof Case>;\n\n/** `cases.yaml` — evals for one component. */\nexport const EvalFile = z.object({\n /** Fully-qualified component id. */\n component: z.string(),\n /** Which harnesses to run; others reported UNTESTED. */\n harnesses: z.array(Target),\n cases: z.array(Case),\n});\nexport type EvalFile = z.infer<typeof EvalFile>;\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\n/** Trust badges (spec §10). valid/tested are computed in Phase 2; the rest in Phase 3. */\nexport const Badge = z.enum([\"valid\", \"tested\", \"verified\", \"scanned\", \"signed\"]);\nexport type Badge = z.infer<typeof Badge>;\n\nexport const IndexVersion = z.object({\n version: z.string(),\n ref: z.string(),\n sha: z.string(),\n badges: z.array(Badge),\n /** Harnesses with passing deterministic eval runs. */\n harnessCoverage: z.array(Target),\n});\nexport type IndexVersion = z.infer<typeof IndexVersion>;\n\nexport const IndexEntry = z.object({\n id: z.string(),\n source: z.string(),\n versions: z.array(IndexVersion),\n /** Aggregate, opt-in only -- never per-user. */\n telemetry: z\n .object({\n installs: z.number().default(0),\n activeUsage: z.number().default(0),\n })\n .optional(),\n});\nexport type IndexEntry = z.infer<typeof IndexEntry>;\n\n/** `loom.index/1` -- a metadata-only aggregator (spec §10), self-hostable static JSON. */\nexport const IndexFile = z.object({\n schema: z.literal(\"loom.index/1\"),\n plugins: z.array(IndexEntry),\n federated: z.array(z.object({ source: z.string(), ingestedAt: z.string() })).optional(),\n});\nexport type IndexFile = z.infer<typeof IndexFile>;\n","import { z } from \"zod\";\nimport { Target } from \"./plugin\";\n\nexport const Scope = z.enum([\"user\", \"project\"]);\nexport type Scope = z.infer<typeof Scope>;\n\nexport const ArtifactRecord = z.object({\n /** Fully-qualified id of the plugin this artifact belongs to. */\n plugin: z.string(),\n /** Fully-qualified component id. */\n component: z.string(),\n target: Target,\n scope: Scope,\n /** Absolute placement path. */\n path: z.string(),\n /** sha256 of compiled output. */\n hash: z.string(),\n placement: z.enum([\"copy\", \"shared\"]),\n /** Executable artifacts start disabled (§11). */\n enabled: z.boolean(),\n});\nexport type ArtifactRecord = z.infer<typeof ArtifactRecord>;\n\nexport const AdapterRecord = z.object({\n version: z.string(),\n targetSchema: z.string(),\n});\n\n/** One installed plugin's record within a lockfile. */\nexport const PluginLock = z.object({\n id: z.string(),\n version: z.string(),\n ref: z.string(),\n sha: z.string(),\n dependencies: z.array(\n z.object({\n id: z.string(),\n range: z.string(),\n resolvedSha: z.string(),\n }),\n ),\n /** Bare leaf name -> fully-qualified id (§9.4). */\n aliases: z.record(z.string(), z.string()),\n});\nexport type PluginLock = z.infer<typeof PluginLock>;\n\n/**\n * `loom.lock` — the ledger of everything installed into one target (a project for\n * project scope, the user dir for user scope). Drives update/uninstall/verify.\n * Holds many plugins so a marketplace install is a single lockfile.\n */\nexport const Lockfile = z.object({\n loomVersion: z.string(),\n generatedAt: z.string(),\n plugins: z.array(PluginLock),\n /** Every placed artifact across all plugins; each tagged with its `plugin` id. */\n artifacts: z.array(ArtifactRecord),\n adapters: z\n .object({\n claude: AdapterRecord.optional(),\n codex: AdapterRecord.optional(),\n cursor: AdapterRecord.optional(),\n copilot: AdapterRecord.optional(),\n opencode: AdapterRecord.optional(),\n })\n .partial(),\n});\nexport type Lockfile = z.infer<typeof Lockfile>;\n","import { z } from \"zod\";\nimport { Owner } from \"./plugin\";\n\nexport const MarketplaceEntry = z.object({\n /** Same source forms as Dependency.plugin. */\n plugin: z.string(),\n version: z.string().optional(),\n category: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\nexport type MarketplaceEntry = z.infer<typeof MarketplaceEntry>;\n\n/** `marketplace.yaml` — a curated catalog compiled to each harness's native form. */\nexport const Marketplace = z.object({\n name: z.string().regex(/^[a-z0-9-]+$/, \"marketplace name must be kebab-case\"),\n owner: Owner,\n description: z.string().optional(),\n plugins: z.array(MarketplaceEntry),\n /** Permitted external namespaces a plugin here may depend on. */\n allow_dependencies_on: z.array(z.string()).optional(),\n});\nexport type Marketplace = z.infer<typeof Marketplace>;\n","import { z } from \"zod\";\nimport { EvalFile } from \"./evals\";\nimport { Lockfile } from \"./lockfile\";\nimport { Marketplace } from \"./marketplace\";\nimport { Plugin } from \"./plugin\";\n\n/** Canonical manifests for which we publish a `$schema` for editor autocomplete. */\nexport const SCHEMAS = {\n \"loom.yaml\": Plugin,\n \"marketplace.yaml\": Marketplace,\n \"loom.lock\": Lockfile,\n \"cases.yaml\": EvalFile,\n} as const;\n\nexport type SchemaName = keyof typeof SCHEMAS;\n\n/** Export a JSON Schema (draft 2020-12) for one canonical manifest. */\nexport function jsonSchemaFor(name: SchemaName): unknown {\n return z.toJSONSchema(SCHEMAS[name], { target: \"draft-2020-12\" });\n}\n\n/** Export JSON Schemas for every canonical manifest, keyed by file name. */\nexport function allJsonSchemas(): Record<SchemaName, unknown> {\n const out = {} as Record<SchemaName, unknown>;\n for (const name of Object.keys(SCHEMAS) as SchemaName[]) {\n out[name] = jsonSchemaFor(name);\n }\n return out;\n}\n","import JSON5 from \"json5\";\nimport * as YAML from \"yaml\";\nimport type { z } from \"zod\";\nimport { detectComponentKind, schemaForKind } from \"./component\";\nimport { Plugin } from \"./plugin\";\n\nexport type DocFormat = \"yaml\" | \"json5\" | \"auto\";\n\nexport interface ParseIssue {\n path: string;\n message: string;\n}\nexport type ParseResult<T> = { ok: true; value: T } | { ok: false; issues: ParseIssue[] };\n\nfunction guessFormat(filename?: string): \"yaml\" | \"json5\" {\n if (filename && /\\.json5$/i.test(filename)) return \"json5\";\n return \"yaml\";\n}\n\n/**\n * Read raw manifest text into a plain object.\n *\n * YAML is parsed in **1.2 core** mode, which kills the \"Norway problem\": only\n * `true`/`false` are booleans, so `no`/`yes`/`on`/`off` stay strings. (Unquoted\n * `1.10` still becomes the float `1.1` per YAML semantics — but version fields\n * are typed as strings, so that surfaces as a precise Zod error telling the\n * author to quote it.) `strict` rejects duplicate keys. JSON5 input is accepted\n * against the same schemas.\n */\nexport function parseDocument(\n text: string,\n format: DocFormat = \"auto\",\n filename?: string,\n): unknown {\n const fmt = format === \"auto\" ? guessFormat(filename) : format;\n if (fmt === \"json5\") return JSON5.parse(text);\n return YAML.parse(text, { version: \"1.2\", schema: \"core\", strict: true });\n}\n\n/** Serialize an object back to YAML 1.2 (used when writing a generated manifest). */\nexport function stringifyDocument(obj: unknown): string {\n return YAML.stringify(obj, { version: \"1.2\" });\n}\n\nfunction pathStr(path: readonly PropertyKey[]): string {\n let out = \"\";\n for (const seg of path) {\n if (typeof seg === \"number\") out += `[${seg}]`;\n else {\n const key = String(seg);\n out += out ? `.${key}` : key;\n }\n }\n return out;\n}\n\n/** Validate an already-parsed object against a schema, returning path-precise issues. */\nexport function validate<T>(schema: z.ZodType<T>, raw: unknown): ParseResult<T> {\n const r = schema.safeParse(raw);\n if (r.success) return { ok: true, value: r.data };\n return {\n ok: false,\n issues: r.error.issues.map((iss) => ({ path: pathStr(iss.path), message: iss.message })),\n };\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n/**\n * Parse a plugin with kind-aware component routing, so a malformed component\n * produces `components[2].mcp: Required` rather than a noisy union error.\n */\nexport function parsePlugin(raw: unknown): ParseResult<Plugin> {\n const issues: ParseIssue[] = [];\n\n if (isRecord(raw) && Array.isArray(raw.components)) {\n raw.components.forEach((c, i) => {\n const det = detectComponentKind(c);\n if (!det.ok) {\n issues.push({ path: `components[${i}]`, message: det.error });\n return;\n }\n const r = schemaForKind(det.kind).safeParse(c);\n if (!r.success) {\n for (const iss of r.error.issues) {\n issues.push({ path: `components[${i}].${pathStr(iss.path)}`, message: iss.message });\n }\n }\n });\n }\n\n const full = Plugin.safeParse(raw);\n if (!full.success) {\n for (const iss of full.error.issues) {\n // Skip generic union noise on components — pass 1 gave precise messages.\n if (issues.length > 0 && iss.path[0] === \"components\") continue;\n issues.push({ path: pathStr(iss.path), message: iss.message });\n }\n }\n\n if (issues.length > 0) return { ok: false, issues };\n // No issues means the full parse succeeded (a bad component fails Plugin too).\n return { ok: true, value: (full as { data: Plugin }).data };\n}\n\n/** Convenience: read text (YAML/JSON5) and validate against any schema. */\nexport function loadManifest<T>(\n schema: z.ZodType<T>,\n text: string,\n opts: { format?: DocFormat; filename?: string } = {},\n): ParseResult<T> {\n let raw: unknown;\n try {\n raw = parseDocument(text, opts.format ?? \"auto\", opts.filename);\n } catch (err) {\n return { ok: false, issues: [{ path: \"\", message: `parse error: ${(err as Error).message}` }] };\n }\n return validate(schema, raw);\n}\n\n/** Read text (YAML/JSON5) and parse as a plugin with component routing. */\nexport function loadPlugin(\n text: string,\n opts: { format?: DocFormat; filename?: string } = {},\n): ParseResult<Plugin> {\n let raw: unknown;\n try {\n raw = parseDocument(text, opts.format ?? \"auto\", opts.filename);\n } catch (err) {\n return { ok: false, issues: [{ path: \"\", message: `parse error: ${(err as Error).message}` }] };\n }\n return parsePlugin(raw);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michaelfromyeg/loom-schema",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Loom canonical data model: Zod schemas, types, and JSON-Schema export.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",