@michaelfromyeg/loom-core 0.1.0 → 0.2.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
@@ -254,6 +254,27 @@ interface InstallResult {
254
254
  }
255
255
  /** Compile a plugin, place it into the scope's dirs, resolve config, write `loom.lock`. */
256
256
  declare function install(opts: InstallOptions): Promise<InstallResult>;
257
+ interface InstallMarketplaceOptions {
258
+ marketplaceDir: string;
259
+ scope: Scope;
260
+ cwd: string;
261
+ registry: AdapterRegistry;
262
+ targets?: Target[];
263
+ managed?: ManagedPolicy;
264
+ now?: string;
265
+ }
266
+ interface InstallMarketplaceResult {
267
+ marketplace: Marketplace;
268
+ /** One install result per marketplace plugin, in catalog order. */
269
+ installs: InstallResult[];
270
+ }
271
+ /**
272
+ * Install every plugin in a marketplace into the scope in one pass (the
273
+ * company-marketplace install). Each plugin is resolved (local or remote),
274
+ * compiled, placed, and gets its own `loom.lock` in its resolved root, mirroring
275
+ * a single-plugin install at marketplace scale (spec invariant: same primitives).
276
+ */
277
+ declare function installMarketplace(opts: InstallMarketplaceOptions): Promise<InstallMarketplaceResult>;
257
278
  interface UninstallOptions {
258
279
  /** Where loom.lock lives (also the default place uninstall reads from). */
259
280
  pluginDir: string;
@@ -439,11 +460,11 @@ declare function verifyArtifacts(lock: Lockfile, publicKey: KeyObject, signature
439
460
  declare function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void;
440
461
 
441
462
  /** The Loom/CLI version (versioning axis 2, spec §5). */
442
- declare const LOOM_VERSION = "0.1.0";
463
+ declare const LOOM_VERSION = "0.2.0";
443
464
  /**
444
465
  * Check a plugin's `loom_min_version` against the running Loom. Returns an error
445
466
  * message when unmet, or null when satisfied / unspecified.
446
467
  */
447
468
  declare function checkMinVersion(min: string | undefined): string | null;
448
469
 
449
- export { AdapterRegistry, type AliasInput, type AliasResult, type BuildMarketplaceOptions, type BuildMarketplaceResult, type BuildOptions, type BuildResult, CACHE_DIR, CompileError, type CompileOptions, type CompileResult, type ConfigResolution, type DependencyRecord, type Diagnostic, Diagnostics, type FetchedMarketplace, type FetchedPlugin, type ImportOutput, type ImportPluginOptions, type InstallOptions, type InstallResult, LOOM_VERSION, type LintResult, type LockInput, type ManagedPolicy, type PlannedArtifact, type PolicyContext, type ResolvedComponent, type ResolvedDeps, type ResolvedPlugin, type SecretsResult, type Severity, type Source, type StaticPass, type TaggedArtifact, type TargetOutput, type UninstallOptions, type UninstallResult, type UpdateResult, type VerifyResult, type WrittenArtifact, artifactDigest, build, buildLockfile, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installToScope, lint, loadMarketplaceDir, loadPluginDir, parseSource, placeCatalog, placePluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock };
470
+ export { AdapterRegistry, type AliasInput, type AliasResult, type BuildMarketplaceOptions, type BuildMarketplaceResult, type BuildOptions, type BuildResult, CACHE_DIR, CompileError, type CompileOptions, type CompileResult, type ConfigResolution, type DependencyRecord, type Diagnostic, Diagnostics, type FetchedMarketplace, type FetchedPlugin, type ImportOutput, type ImportPluginOptions, type InstallMarketplaceOptions, type InstallMarketplaceResult, type InstallOptions, type InstallResult, LOOM_VERSION, type LintResult, type LockInput, type ManagedPolicy, type PlannedArtifact, type PolicyContext, type ResolvedComponent, type ResolvedDeps, type ResolvedPlugin, type SecretsResult, type Severity, type Source, type StaticPass, type TaggedArtifact, type TargetOutput, type UninstallOptions, type UninstallResult, type UpdateResult, type VerifyResult, type WrittenArtifact, artifactDigest, build, buildLockfile, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, parseSource, placeCatalog, placePluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock };
package/dist/index.js CHANGED
@@ -128,7 +128,7 @@ function checkDescription(where, description, diags) {
128
128
  diags.warn(where, "description is very short; harnesses route on it -- make it specific");
129
129
  }
130
130
  }
131
- var LOOM_VERSION = "0.1.0";
131
+ var LOOM_VERSION = "0.2.0";
132
132
  function checkMinVersion(min) {
133
133
  if (!min) return null;
134
134
  const cleaned = semver.valid(semver.coerce(min) ?? min);
@@ -238,11 +238,11 @@ function resolveConfig(plugin, cwd, env = process.env) {
238
238
  if (fromEnv !== void 0) {
239
239
  values[v.env] = fromEnv;
240
240
  resolved.push({ env: v.env, source: "env", secret: v.secret });
241
- } else if (v.default !== void 0) {
241
+ } else if (v.default === void 0) {
242
+ resolved.push({ env: v.env, source: "missing", secret: v.secret });
243
+ } else {
242
244
  values[v.env] = v.default;
243
245
  resolved.push({ env: v.env, source: "default", secret: v.secret });
244
- } else {
245
- resolved.push({ env: v.env, source: "missing", secret: v.secret });
246
246
  }
247
247
  }
248
248
  }
@@ -256,7 +256,7 @@ function resolveConfig(plugin, cwd, env = process.env) {
256
256
  return { resolved, path };
257
257
  }
258
258
  function walkFiles(root, dir) {
259
- if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];
259
+ if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];
260
260
  const out = [];
261
261
  for (const entry of readdirSync(dir).sort()) {
262
262
  const abs = join(dir, entry);
@@ -347,17 +347,15 @@ async function gitFetch(url, ref) {
347
347
  mkdirSync(CACHE_DIR, { recursive: true });
348
348
  const dir = cacheDirFor(`${url}@${ref ?? "default"}`);
349
349
  const isSha = ref !== void 0 && SHA_RE.test(ref);
350
- if (!existsSync(join(dir, ".git"))) {
351
- if (isSha) {
352
- await execa("git", ["clone", url, dir]);
353
- await execa("git", ["checkout", ref], { cwd: dir });
354
- } else {
355
- const branchArgs = ref ? ["--branch", ref] : [];
356
- await execa("git", ["clone", "--depth", "1", ...branchArgs, url, dir]);
357
- }
358
- } else {
350
+ if (existsSync(join(dir, ".git"))) {
359
351
  await execa("git", ["fetch", "origin", ...ref ? [ref] : []], { cwd: dir });
360
352
  await execa("git", ["checkout", ref ?? "FETCH_HEAD"], { cwd: dir, reject: false });
353
+ } else if (isSha) {
354
+ await execa("git", ["clone", url, dir]);
355
+ await execa("git", ["checkout", ref], { cwd: dir });
356
+ } else {
357
+ const branchArgs = ref ? ["--branch", ref] : [];
358
+ await execa("git", ["clone", "--depth", "1", ...branchArgs, url, dir]);
361
359
  }
362
360
  const sha = (await execa("git", ["rev-parse", "HEAD"], { cwd: dir })).stdout.trim();
363
361
  return { dir, sha };
@@ -388,7 +386,7 @@ ${loaded.issues.map((i) => ` ${i.path}: ${i.message}`).join("\n")}`
388
386
  }
389
387
  return loaded.value;
390
388
  }
391
- async function resolveDependency(dep, fromRoot) {
389
+ function resolveDependency(dep, fromRoot) {
392
390
  return resolvePluginRefFull(dep.plugin, fromRoot);
393
391
  }
394
392
  async function gitInfo(dir) {
@@ -583,7 +581,7 @@ function installToScope(result, scope, cwd) {
583
581
  }
584
582
 
585
583
  // src/api.ts
586
- async function loadResolved(pluginDir) {
584
+ function loadResolved(pluginDir) {
587
585
  return resolveDependencies(loadOrThrow2(pluginDir));
588
586
  }
589
587
  function issuesToDiagnostics(issues) {
@@ -671,13 +669,8 @@ async function buildMarketplace(opts) {
671
669
  }
672
670
  return { marketplace, plugins: compiled.map((c) => c.result), written };
673
671
  }
674
- async function install(opts) {
675
- const { fb, dependencies } = await loadResolved(opts.pluginDir);
676
- const result = compile(fb, {
677
- registry: opts.registry,
678
- targets: opts.targets,
679
- only: opts.only
680
- });
672
+ function installResolved(fb, dependencies, opts) {
673
+ const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });
681
674
  if (result.diagnostics.hasErrors) {
682
675
  throw new CompileError("compile failed", result.diagnostics.errors);
683
676
  }
@@ -692,18 +685,72 @@ async function install(opts) {
692
685
  }
693
686
  const artifacts = installToScope(result, opts.scope, opts.cwd);
694
687
  const secrets = resolveConfig(result.fb.plugin, opts.cwd);
695
- const { ref, sha } = await gitInfo(opts.pluginDir);
696
688
  const lockfile = buildLockfile({
697
689
  result,
698
690
  artifacts,
699
691
  dependencies,
700
- ref,
701
- sha,
692
+ ref: opts.ref,
693
+ sha: opts.sha,
702
694
  generatedAt: opts.now ?? (/* @__PURE__ */ new Date()).toISOString()
703
695
  });
704
- const lockPath = writeLock(opts.lockDir ?? opts.pluginDir, lockfile);
696
+ const lockPath = writeLock(opts.lockDir ?? fb.root, lockfile);
705
697
  return { result, lockfile, lockPath, secrets };
706
698
  }
699
+ async function install(opts) {
700
+ const { fb, dependencies } = await loadResolved(opts.pluginDir);
701
+ const { ref, sha } = await gitInfo(opts.pluginDir);
702
+ return installResolved(fb, dependencies, {
703
+ scope: opts.scope,
704
+ cwd: opts.cwd,
705
+ registry: opts.registry,
706
+ ref,
707
+ sha,
708
+ lockDir: opts.lockDir ?? opts.pluginDir,
709
+ ...opts.targets ? { targets: opts.targets } : {},
710
+ ...opts.only ? { only: opts.only } : {},
711
+ ...opts.managed ? { managed: opts.managed } : {},
712
+ ...opts.badges ? { badges: opts.badges } : {},
713
+ ...opts.now ? { now: opts.now } : {}
714
+ });
715
+ }
716
+ async function installMarketplace(opts) {
717
+ const loaded = loadMarketplaceDir(opts.marketplaceDir);
718
+ if (!loaded.ok) {
719
+ throw new CompileError(
720
+ `failed to load marketplace in ${opts.marketplaceDir}`,
721
+ issuesToDiagnostics(loaded.issues)
722
+ );
723
+ }
724
+ const { marketplace, root } = loaded.value;
725
+ const installs = [];
726
+ for (const entry of marketplace.plugins) {
727
+ let resolved;
728
+ try {
729
+ resolved = await resolvePluginRefFull(entry.plugin, root);
730
+ } catch (err) {
731
+ throw new CompileError(`marketplace entry "${entry.plugin}" failed`, [
732
+ { severity: "error", where: "plugins", message: err.message }
733
+ ]);
734
+ }
735
+ let fb = resolved.fb;
736
+ if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };
737
+ const { fb: merged, dependencies } = await resolveDependencies(fb);
738
+ installs.push(
739
+ installResolved(merged, dependencies, {
740
+ scope: opts.scope,
741
+ cwd: opts.cwd,
742
+ registry: opts.registry,
743
+ ref: resolved.ref,
744
+ sha: resolved.sha,
745
+ lockDir: fb.root,
746
+ ...opts.targets ? { targets: opts.targets } : {},
747
+ ...opts.managed ? { managed: opts.managed } : {},
748
+ ...opts.now ? { now: opts.now } : {}
749
+ })
750
+ );
751
+ }
752
+ return { marketplace, installs };
753
+ }
707
754
  function pruneEmptyDirs(paths) {
708
755
  const dirs = new Set(paths.map((p) => dirname(p)));
709
756
  for (const start of dirs) {
@@ -853,6 +900,6 @@ function verifyArtifacts(lock, publicKey, signature) {
853
900
  return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };
854
901
  }
855
902
 
856
- export { AdapterRegistry, CACHE_DIR, CompileError, Diagnostics, LOOM_VERSION, artifactDigest, build, buildLockfile, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installToScope, lint, loadMarketplaceDir, loadPluginDir, parseSource, placeCatalog, placePluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock };
903
+ export { AdapterRegistry, CACHE_DIR, CompileError, Diagnostics, LOOM_VERSION, artifactDigest, build, buildLockfile, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, parseSource, placeCatalog, placePluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock };
857
904
  //# sourceMappingURL=index.js.map
858
905
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/diagnostics.ts","../src/namespace.ts","../src/validate.ts","../src/version.ts","../src/compile.ts","../src/config.ts","../src/loader.ts","../src/resolve.ts","../src/deps.ts","../src/lockfile.ts","../src/managed.ts","../src/hash.ts","../src/place.ts","../src/api.ts","../src/import.ts","../src/registry.ts","../src/sign.ts"],"names":["kindOf","join","existsSync","statSync","mkdirSync","resolvePath","leafNameOf","refOf","writeFileSync","readFileSync","createHash","loadOrThrow","dirname","readdirSync","manifestPath"],"mappings":"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","file":"index.js","sourcesContent":["export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n /** Path-precise location: \"components[1].mcp\", \"owner.namespace\", or a file path. */\n where: string;\n message: string;\n}\n\n/** Accumulates diagnostics during compile; fails closed when any error is present. */\nexport class Diagnostics {\n readonly items: Diagnostic[] = [];\n\n error(where: string, message: string): void {\n this.items.push({ severity: \"error\", where, message });\n }\n warn(where: string, message: string): void {\n this.items.push({ severity: \"warning\", where, message });\n }\n info(where: string, message: string): void {\n this.items.push({ severity: \"info\", where, message });\n }\n\n get hasErrors(): boolean {\n return this.items.some((d) => d.severity === \"error\");\n }\n\n get errors(): Diagnostic[] {\n return this.items.filter((d) => d.severity === \"error\");\n }\n}\n\nexport class CompileError extends Error {\n constructor(\n message: string,\n readonly diagnostics: Diagnostic[],\n ) {\n super(message);\n this.name = \"CompileError\";\n }\n}\n","/** One component identified for aliasing: its bare leaf name and full id. */\nexport interface AliasInput {\n id: string;\n leaf: string;\n}\n\nexport interface AliasResult {\n /** Bare leaf name -> fully-qualified id. */\n aliases: Record<string, string>;\n /** True same-scope collisions: one leaf claimed by multiple ids. */\n collisions: Array<{ leaf: string; ids: string[] }>;\n}\n\n/**\n * Bare name when unambiguous (spec §9.4). A leaf used by exactly one component\n * gets the bare alias; a leaf shared by several is surfaced as a collision for\n * the caller to resolve (prompt interactively, or error non-interactively).\n * Never silently last-wins.\n */\nexport function resolveAliases(components: AliasInput[]): AliasResult {\n const byLeaf = new Map<string, string[]>();\n for (const c of components) {\n const ids = byLeaf.get(c.leaf) ?? [];\n ids.push(c.id);\n byLeaf.set(c.leaf, ids);\n }\n\n const aliases: Record<string, string> = {};\n const collisions: AliasResult[\"collisions\"] = [];\n for (const [leaf, ids] of byLeaf) {\n if (ids.length === 1) aliases[leaf] = ids[0] as string;\n else collisions.push({ leaf, ids: [...ids].sort() });\n }\n return { aliases, collisions };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFrontmatter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport { kindOf, refOf } from \"@michaelfromyeg/loom-schema\";\nimport type { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\n\n/**\n * Static validation (spec §9.1 step 3, the `valid` badge): every referenced file\n * exists, skill/agent frontmatter is well-formed, `server.json` parses, and\n * descriptions clear a basic quality bar. Errors fail the compile closed.\n */\nexport function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void {\n fb.plugin.components.forEach((component, i) => {\n const where = `components[${i}]`;\n const ref = refOf(component);\n const abs = join(fb.root, ref);\n if (!existsSync(abs)) {\n diags.error(where, `referenced path \"${ref}\" does not exist`);\n return;\n }\n\n switch (kindOf(component)) {\n case \"skill\":\n validateSkill(fb, ref, abs, where, diags);\n break;\n case \"mcp\":\n validateMcp(fb, ref, abs, where, diags);\n break;\n case \"agent\":\n validateMarkdownComponent(fb, ref, abs, where, diags);\n break;\n default:\n // command / hook / passthrough: existence is the only static gate.\n break;\n }\n });\n}\n\nfunction validateSkill(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `skill \"${ref}\" must be a directory containing SKILL.md`);\n return;\n }\n const skillMd = join(abs, \"SKILL.md\");\n if (!existsSync(skillMd)) {\n diags.error(where, `skill \"${ref}\" is missing SKILL.md`);\n return;\n }\n const { data } = parseFrontmatter(fb.read(join(ref, \"SKILL.md\")).toString(\"utf8\"));\n if (!data.name) diags.error(`${where}.skill`, \"SKILL.md frontmatter is missing `name`\");\n checkDescription(`${where}.skill`, data.description, diags);\n}\n\nfunction validateMcp(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `mcp \"${ref}\" must be a directory containing server.json`);\n return;\n }\n const serverJsonPath = join(abs, \"server.json\");\n if (!existsSync(serverJsonPath)) {\n diags.error(where, `mcp \"${ref}\" is missing server.json`);\n return;\n }\n let server: Record<string, unknown>;\n try {\n server = JSON.parse(fb.read(join(ref, \"server.json\")).toString(\"utf8\"));\n } catch (err) {\n diags.error(`${where}.mcp`, `server.json is not valid JSON: ${(err as Error).message}`);\n return;\n }\n if (!server.name) diags.error(`${where}.mcp`, \"server.json is missing `name`\");\n const hasRunnable = server.packages || server.remotes || server.command;\n if (!hasRunnable) {\n diags.warn(`${where}.mcp`, \"server.json declares no `packages`, `remotes`, or `command`\");\n }\n checkDescription(`${where}.mcp`, server.description, diags);\n}\n\nfunction validateMarkdownComponent(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (statSync(abs).isDirectory()) return; // agent-as-dir: defer detailed checks\n const { data } = parseFrontmatter(fb.read(ref).toString(\"utf8\"));\n if (!data.name) diags.warn(`${where}.agent`, \"agent frontmatter is missing `name`\");\n checkDescription(`${where}.agent`, data.description, diags);\n}\n\nfunction checkDescription(where: string, description: unknown, diags: Diagnostics): void {\n if (!description) {\n diags.error(where, \"missing `description` (required for discovery + the tested badge)\");\n return;\n }\n if (String(description).trim().length < 16) {\n diags.warn(where, \"description is very short; harnesses route on it -- make it specific\");\n }\n}\n","import semver from \"semver\";\n\n/** The Loom/CLI version (versioning axis 2, spec §5). */\nexport const LOOM_VERSION = \"0.1.0\";\n\n/**\n * Check a plugin's `loom_min_version` against the running Loom. Returns an error\n * message when unmet, or null when satisfied / unspecified.\n */\nexport function checkMinVersion(min: string | undefined): string | null {\n if (!min) return null;\n const cleaned = semver.valid(semver.coerce(min) ?? min);\n if (!cleaned) return `loom_min_version \"${min}\" is not a valid semver`;\n if (semver.lt(LOOM_VERSION, cleaned)) {\n return `plugin requires Loom >= ${min}, but this is ${LOOM_VERSION}`;\n }\n return null;\n}\n","import type {\n CompiledArtifact,\n HarnessAdapter,\n PluginCtx,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/loom-adapter-kit\";\nimport {\n ALL_TARGETS,\n type Component,\n type ComponentKind,\n fqid,\n kindOf,\n leafNameOf,\n type Plugin,\n type Target,\n targetsOf,\n} from \"@michaelfromyeg/loom-schema\";\nimport { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\nimport { resolveAliases } from \"./namespace\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { validatePlugin } from \"./validate\";\nimport { checkMinVersion } from \"./version\";\n\n/** An emitted artifact tagged with the canonical component it came from. */\nexport interface TaggedArtifact {\n componentId: string;\n artifact: CompiledArtifact;\n}\n\n/** Everything one adapter produced for one plugin. */\nexport interface TargetOutput {\n target: Target;\n adapter: HarnessAdapter;\n /** Plugin-root-relative artifacts: components + the plugin manifest. */\n artifacts: TaggedArtifact[];\n}\n\nexport interface CompileResult {\n fb: FetchedPlugin;\n /** Plugin id: `{namespace}/{name}`. */\n id: string;\n /** The components actually compiled (the piecemeal selection, or all). */\n components: ResolvedComponent[];\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n targets: TargetOutput[];\n}\n\nexport interface CompileOptions {\n registry: AdapterRegistry;\n /** Restrict to these targets; default = every target with a registered adapter. */\n targets?: Target[];\n /** Piecemeal: include only these component leaf names; default = all (spec §9.2). */\n only?: string[];\n}\n\n/** A synthetic one-entry marketplace wrapping a single plugin (spec §9.1 build). */\nexport function synthMarketplace(plugin: Plugin): ResolvedMarketplace {\n return {\n name: plugin.name,\n owner: plugin.owner,\n ...(plugin.description ? { description: plugin.description } : {}),\n entries: [\n {\n name: plugin.name,\n source: `./plugins/${plugin.name}`,\n ...(plugin.description ? { description: plugin.description } : {}),\n version: plugin.version,\n },\n ],\n };\n}\n\nexport interface ResolvedComponent {\n id: string;\n leaf: string;\n kind: ComponentKind;\n component: Component;\n}\n\nexport interface StaticPass {\n id: string;\n diagnostics: Diagnostics;\n aliases: Record<string, string>;\n resolved: ResolvedComponent[];\n}\n\n/**\n * Steps 1-4 of the pipeline shared by `compile` and `lint`: min-version,\n * static validation, fully-qualified ids, and alias resolution. No adapters run,\n * so it is the deterministic \"is this plugin valid?\" pass behind the valid badge.\n */\nexport function staticPass(fb: FetchedPlugin): StaticPass {\n const diagnostics = new Diagnostics();\n const { plugin } = fb;\n const id = `${plugin.owner.namespace}/${plugin.name}`;\n\n const minErr = checkMinVersion(plugin.loom_min_version);\n if (minErr) diagnostics.error(\"loom_min_version\", minErr);\n\n validatePlugin(fb, diagnostics);\n\n const resolved: ResolvedComponent[] = plugin.components.map((component) => ({\n id: fqid(plugin.owner.namespace, plugin.name, leafNameOf(component)),\n leaf: leafNameOf(component),\n kind: kindOf(component),\n component,\n }));\n\n const { aliases, collisions } = resolveAliases(resolved);\n for (const c of collisions) {\n diagnostics.error(\n `components.${c.leaf}`,\n `ambiguous component name \"${c.leaf}\": ${c.ids.join(\" vs \")}; qualify or choose which keeps the bare alias`,\n );\n }\n\n return { id, diagnostics, aliases, resolved };\n}\n\n/**\n * Steps 1-5 of the compile pipeline (spec §9.1): load is done by the caller;\n * here we enforce min-version, validate statically, resolve aliases, and run each\n * adapter's transform + emitManifest. Catalog emission (a marketplace concern) and\n * placement are separate so `build` can inspect without installing and `install`\n * can pull components piecemeal.\n *\n * Never throws on plugin problems -- it accumulates diagnostics so the caller can\n * render them. `build`/`install` fail closed when `diagnostics.hasErrors`.\n */\nexport function compile(fb: FetchedPlugin, opts: CompileOptions): CompileResult {\n const { plugin } = fb;\n const pass = staticPass(fb);\n const { id, diagnostics } = pass;\n\n // Piecemeal selection (spec §9.2): include only the requested component leaves.\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n if (onlySet) {\n for (const leaf of onlySet) {\n if (!pass.resolved.some((rc) => rc.leaf === leaf)) {\n diagnostics.error(\n \"only\",\n `component \"${leaf}\" not found; available: ${pass.resolved.map((r) => r.leaf).join(\", \")}`,\n );\n }\n }\n }\n const selected = onlySet ? pass.resolved.filter((rc) => onlySet.has(rc.leaf)) : pass.resolved;\n const effectivePlugin: Plugin = onlySet\n ? { ...plugin, components: selected.map((rc) => rc.component) }\n : plugin;\n const aliases = onlySet\n ? Object.fromEntries(\n Object.entries(pass.aliases).filter(([, cid]) => selected.some((rc) => rc.id === cid)),\n )\n : pass.aliases;\n const reverseAlias = new Map(Object.entries(aliases).map(([leaf, cid]) => [cid, leaf]));\n\n const requested = opts.targets ?? opts.registry.targets;\n const targets: TargetOutput[] = [];\n\n for (const target of requested) {\n const adapter = opts.registry.get(target);\n if (!adapter) {\n if (opts.targets) diagnostics.warn(target, `no adapter registered for target \"${target}\"`);\n continue;\n }\n\n const ctx: PluginCtx = {\n plugin: effectivePlugin,\n read: fb.read,\n list: fb.list,\n aliasFor: (componentId) => reverseAlias.get(componentId) ?? componentId,\n };\n\n const pluginArtifacts: TaggedArtifact[] = [];\n for (const rc of selected) {\n if (!targetsOf(rc.component, ALL_TARGETS).includes(target)) continue;\n for (const a of adapter.transform(rc.component, ctx)) {\n pluginArtifacts.push({ componentId: rc.id, artifact: a });\n }\n }\n for (const a of adapter.emitManifest(effectivePlugin, ctx)) {\n pluginArtifacts.push({ componentId: id, artifact: a });\n }\n\n targets.push({ target, adapter, artifacts: pluginArtifacts });\n }\n\n return { fb, id, components: selected, aliases, diagnostics, targets };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Component, Plugin } from \"@michaelfromyeg/loom-schema\";\n\nexport interface ConfigResolution {\n env: string;\n /** Where the value came from -- never the value itself. */\n source: \"env\" | \"default\" | \"missing\";\n secret: boolean;\n}\n\nexport interface SecretsResult {\n resolved: ConfigResolution[];\n /** Path to the gitignored local config the values were written to (or null). */\n path: string | null;\n}\n\nfunction configVarsOf(component: Component) {\n return \"config\" in component && component.config ? component.config : [];\n}\n\n/**\n * Resolve declared `ConfigVar`s (spec §9.1 step 7, §11 rule 4: declare-not-store).\n * Values come from the environment or a declared default and are written ONLY to a\n * local, gitignored config -- never to the lockfile, the plugin, the index, or\n * telemetry. The returned summary records where each value came from, not the value.\n */\nexport function resolveConfig(\n plugin: Plugin,\n cwd: string,\n env: Record<string, string | undefined> = process.env,\n): SecretsResult {\n const resolved: ConfigResolution[] = [];\n const values: Record<string, string> = {};\n\n for (const component of plugin.components) {\n for (const v of configVarsOf(component)) {\n const fromEnv = env[v.env];\n if (fromEnv !== undefined) {\n values[v.env] = fromEnv;\n resolved.push({ env: v.env, source: \"env\", secret: v.secret });\n } else if (v.default !== undefined) {\n values[v.env] = v.default;\n resolved.push({ env: v.env, source: \"default\", secret: v.secret });\n } else {\n resolved.push({ env: v.env, source: \"missing\", secret: v.secret });\n }\n }\n }\n\n if (Object.keys(values).length === 0) return { resolved, path: null };\n\n const dir = join(cwd, \".loom\");\n mkdirSync(dir, { recursive: true });\n // Gitignore the whole local-config dir so resolved values never get committed.\n writeFileSync(join(dir, \".gitignore\"), \"*\\n\");\n const path = join(dir, \"secrets.local.json\");\n writeFileSync(path, `${JSON.stringify(values, null, 2)}\\n`);\n return { resolved, path };\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n loadManifest,\n loadPlugin,\n Marketplace,\n type ParseResult,\n type Plugin,\n} from \"@michaelfromyeg/loom-schema\";\n\n/** A plugin whose files are available on disk under `root`. */\nexport interface FetchedPlugin {\n plugin: Plugin;\n root: string;\n manifestPath: string;\n /** Read a file from the plugin, relative to `root`. */\n read(relPath: string): Buffer;\n /** Recursively list files under a plugin dir, as paths relative to `root` (sorted). */\n list(relDir: string): string[];\n}\n\n/** A loaded marketplace manifest and its directory. */\nexport interface FetchedMarketplace {\n marketplace: Marketplace;\n root: string;\n manifestPath: string;\n}\n\n/** Recursively collect file paths under `dir`, relative to `root`. Deterministic order. */\nfunction walkFiles(root: string, dir: string): string[] {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir).sort()) {\n const abs = join(dir, entry);\n if (statSync(abs).isDirectory()) out.push(...walkFiles(root, abs));\n else out.push(relative(root, abs));\n }\n return out;\n}\n\nconst MANIFEST_NAMES = [\"loom.yaml\", \"loom.yml\", \"loom.json5\", \"loom.json\"];\n\n/** Build `read`/`list` accessors rooted at a directory (used for merged plugins too). */\nexport function fileAccessors(root: string): Pick<FetchedPlugin, \"read\" | \"list\"> {\n return {\n read: (relPath: string) => readFileSync(join(root, relPath)),\n list: (relDir: string) => walkFiles(root, join(root, relDir)),\n };\n}\n\n/** Load and validate the plugin manifest in `dir`, exposing its files for adapters. */\nexport function loadPluginDir(dir: string): ParseResult<FetchedPlugin> {\n const manifestPath = MANIFEST_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n { path: dir, message: `no plugin manifest found (one of: ${MANIFEST_NAMES.join(\", \")})` },\n ],\n };\n }\n\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadPlugin(text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n\n return {\n ok: true,\n value: { plugin: parsed.value, root: dir, manifestPath, ...fileAccessors(dir) },\n };\n}\n\nconst MARKETPLACE_NAMES = [\n \"marketplace.yaml\",\n \"marketplace.yml\",\n \"marketplace.json5\",\n \"marketplace.json\",\n];\n\n/** True when `dir` is a marketplace (a catalog of plugins) rather than a plugin. */\nexport function hasMarketplaceManifest(dir: string): boolean {\n return MARKETPLACE_NAMES.some((n) => existsSync(join(dir, n)));\n}\n\n/** Load and validate the marketplace manifest in `dir`. */\nexport function loadMarketplaceDir(dir: string): ParseResult<FetchedMarketplace> {\n const manifestPath = MARKETPLACE_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n {\n path: dir,\n message: `no marketplace manifest found (one of: ${MARKETPLACE_NAMES.join(\", \")})`,\n },\n ],\n };\n }\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadManifest(Marketplace, text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n return { ok: true, value: { marketplace: parsed.value, root: dir, manifestPath } };\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\";\nimport type { Dependency } from \"@michaelfromyeg/loom-schema\";\nimport { execa } from \"execa\";\nimport { type FetchedPlugin, loadPluginDir } from \"./loader\";\n\nexport type Source =\n | { kind: \"local\"; path: string }\n | { kind: \"github\"; repo: string; ref?: string }\n | { kind: \"git\"; url: string; ref?: string }\n | { kind: \"npm\"; pkg: string; version?: string };\n\n/** Where cloned/fetched remote plugins are cached. */\nexport const CACHE_DIR = join(homedir(), \".loom\", \"cache\");\n\n/** Parse a plugin/dependency source string into a structured form (spec §6.1). */\nexport function parseSource(src: string): Source {\n if (src.startsWith(\"./\") || src.startsWith(\"../\") || isAbsolute(src)) {\n return { kind: \"local\", path: src };\n }\n if (src.startsWith(\"github:\")) {\n const [repo, ref] = src.slice(\"github:\".length).split(\"#\");\n return ref ? { kind: \"github\", repo, ref } : { kind: \"github\", repo };\n }\n if (src.startsWith(\"npm:\")) {\n const spec = src.slice(\"npm:\".length);\n const at = spec.lastIndexOf(\"@\");\n if (at > 0) return { kind: \"npm\", pkg: spec.slice(0, at), version: spec.slice(at + 1) };\n return { kind: \"npm\", pkg: spec };\n }\n if (\n src.startsWith(\"git@\") ||\n src.startsWith(\"git+\") ||\n src.startsWith(\"file://\") ||\n /^https?:\\/\\//.test(src)\n ) {\n const [url, ref] = src.replace(/^git\\+/, \"\").split(\"#\");\n return ref ? { kind: \"git\", url, ref } : { kind: \"git\", url };\n }\n // Bare `owner/repo` is treated as GitHub shorthand.\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(src)) return { kind: \"github\", repo: src };\n return { kind: \"local\", path: src };\n}\n\nfunction cacheDirFor(key: string): string {\n return join(CACHE_DIR, createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16));\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n/** Clone (or refresh) a git repo into the cache and check out `ref`; return dir + SHA. */\nasync function gitFetch(\n url: string,\n ref: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n mkdirSync(CACHE_DIR, { recursive: true });\n const dir = cacheDirFor(`${url}@${ref ?? \"default\"}`);\n const isSha = ref !== undefined && SHA_RE.test(ref);\n\n if (!existsSync(join(dir, \".git\"))) {\n if (isSha) {\n await execa(\"git\", [\"clone\", url, dir]);\n await execa(\"git\", [\"checkout\", ref as string], { cwd: dir });\n } else {\n const branchArgs = ref ? [\"--branch\", ref] : [];\n await execa(\"git\", [\"clone\", \"--depth\", \"1\", ...branchArgs, url, dir]);\n }\n } else {\n await execa(\"git\", [\"fetch\", \"origin\", ...(ref ? [ref] : [])], { cwd: dir });\n await execa(\"git\", [\"checkout\", ref ?? \"FETCH_HEAD\"], { cwd: dir, reject: false });\n }\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n return { dir, sha };\n}\n\n/** A fetched plugin plus the ref/SHA it resolved to (for the lockfile). */\nexport interface ResolvedPlugin {\n fb: FetchedPlugin;\n ref: string;\n sha: string;\n}\n\n/**\n * Resolve a plugin source to a fetched plugin on disk (spec §5, §9.1 step 2).\n * Local `./path` sources resolve relative to `fromRoot`; `github:`/git sources are\n * git-cloned into the cache and pinned to a resolved SHA; `npm:` is a clear stub.\n */\nexport async function resolvePluginRefFull(\n source: string,\n fromRoot: string,\n): Promise<ResolvedPlugin> {\n const src = parseSource(source);\n\n if (src.kind === \"local\") {\n const dir = isAbsolute(src.path) ? src.path : resolvePath(fromRoot, src.path);\n return { fb: loadOrThrow(dir, source), ref: \"local\", sha: \"\" };\n }\n if (src.kind === \"github\" || src.kind === \"git\") {\n const url = src.kind === \"github\" ? `https://github.com/${src.repo}.git` : src.url;\n const { dir, sha } = await gitFetch(url, src.ref);\n return { fb: loadOrThrow(dir, source), ref: src.ref ?? \"default\", sha };\n }\n throw new Error(`npm source resolution (\"${source}\") is not implemented yet`);\n}\n\n/** Convenience: resolve and return only the fetched plugin. */\nexport async function resolvePluginRef(source: string, fromRoot: string): Promise<FetchedPlugin> {\n return (await resolvePluginRefFull(source, fromRoot)).fb;\n}\n\nfunction loadOrThrow(dir: string, source: string): FetchedPlugin {\n const loaded = loadPluginDir(dir);\n if (!loaded.ok) {\n throw new Error(\n `failed to load \"${source}\":\\n${loaded.issues.map((i) => ` ${i.path}: ${i.message}`).join(\"\\n\")}`,\n );\n }\n return loaded.value;\n}\n\n/** Resolve a `depends` entry to a fetched plugin (relative to the depending plugin root). */\nexport async function resolveDependency(\n dep: Dependency,\n fromRoot: string,\n): Promise<ResolvedPlugin> {\n return resolvePluginRefFull(dep.plugin, fromRoot);\n}\n\n/** Best-effort git ref + SHA for the lockfile. Returns sentinels outside a repo. */\nexport async function gitInfo(dir: string): Promise<{ ref: string; sha: string }> {\n try {\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n let ref = \"HEAD\";\n try {\n ref = (\n await execa(\"git\", [\"describe\", \"--tags\", \"--exact-match\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n try {\n ref = (\n await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n /* keep HEAD */\n }\n }\n return { ref, sha };\n } catch {\n return { ref: \"local\", sha: \"\" };\n }\n}\n","import { cpSync, mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type Component,\n type ComponentKind,\n kindOf,\n leafNameOf,\n refOf,\n} from \"@michaelfromyeg/loom-schema\";\nimport { type FetchedPlugin, fileAccessors } from \"./loader\";\nimport { resolveDependency } from \"./resolve\";\n\nconst KIND_KEY: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nfunction rewriteRef(c: Component, newRef: string): Component {\n return { ...c, [KIND_KEY[kindOf(c)]]: newRef } as Component;\n}\n\nconst skipGit = (src: string): boolean => !/\\/\\.git(\\/|$)/.test(src);\n\nexport interface DependencyRecord {\n id: string;\n range: string;\n resolvedSha: string;\n}\n\nexport interface ResolvedDeps {\n fb: FetchedPlugin;\n dependencies: DependencyRecord[];\n}\n\n/**\n * Resolve a plugin's `depends` (spec §9.1 step 2). Each dependency is fetched\n * (locally or git-cloned and pinned to a SHA), then its selected components are\n * vendored into a merged temp tree under `_deps/<name>/` and registered under the\n * consuming plugin's namespace. Piecemeal `components:[…]` selects which to\n * register, but the whole dep tree is copied so shared assets travel (drift-aware).\n * Direct cycles are detected by id.\n */\nexport async function resolveDependencies(\n fb: FetchedPlugin,\n tmpRoot?: string,\n): Promise<ResolvedDeps> {\n const depends = fb.plugin.depends ?? [];\n if (depends.length === 0) return { fb, dependencies: [] };\n\n const merged = mkdtempSync(join(tmpRoot ?? tmpdir(), \"loom-merged-\"));\n cpSync(fb.root, merged, { recursive: true, filter: skipGit });\n\n const components: Component[] = [...fb.plugin.components];\n const dependencies: DependencyRecord[] = [];\n const seen = new Set<string>([`${fb.plugin.owner.namespace}/${fb.plugin.name}`]);\n\n for (const dep of depends) {\n const resolved = await resolveDependency(dep, fb.root);\n const dp = resolved.fb.plugin;\n const depId = `${dp.owner.namespace}/${dp.name}`;\n if (seen.has(depId)) throw new Error(`dependency cycle detected at ${depId}`);\n seen.add(depId);\n\n const want = dep.components;\n if (want) {\n const missing = want.filter((leaf) => !dp.components.some((c) => leafNameOf(c) === leaf));\n if (missing.length > 0) {\n throw new Error(`dependency ${depId} has no component(s): ${missing.join(\", \")}`);\n }\n }\n const selected = dp.components.filter((c) => !want || want.includes(leafNameOf(c)));\n\n const destBase = join(\"_deps\", dp.name);\n cpSync(resolved.fb.root, join(merged, destBase), { recursive: true, filter: skipGit });\n for (const c of selected) components.push(rewriteRef(c, join(destBase, refOf(c))));\n\n dependencies.push({ id: depId, range: dep.version ?? \"*\", resolvedSha: resolved.sha });\n }\n\n const plugin = { ...fb.plugin, components };\n const mergedFb: FetchedPlugin = {\n plugin,\n root: merged,\n manifestPath: join(merged, \"loom.yaml\"),\n ...fileAccessors(merged),\n };\n return { fb: mergedFb, dependencies };\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type ArtifactRecord, Lockfile, validate } from \"@michaelfromyeg/loom-schema\";\nimport type { CompileResult } from \"./compile\";\nimport { LOOM_VERSION } from \"./version\";\n\nexport interface LockInput {\n result: CompileResult;\n artifacts: ArtifactRecord[];\n ref: string;\n sha: string;\n generatedAt: string;\n dependencies?: Lockfile[\"dependencies\"];\n}\n\n/** Assemble the `loom.lock` object (spec §6.3) from an install. */\nexport function buildLockfile(input: LockInput): Lockfile {\n const adapters: Lockfile[\"adapters\"] = {};\n for (const t of input.result.targets) {\n adapters[t.target] = { version: t.adapter.version, targetSchema: t.adapter.targetSchema };\n }\n return {\n loomVersion: LOOM_VERSION,\n generatedAt: input.generatedAt,\n plugin: {\n id: input.result.id,\n version: input.result.fb.plugin.version,\n ref: input.ref,\n sha: input.sha,\n },\n dependencies: input.dependencies ?? [],\n artifacts: input.artifacts,\n adapters,\n aliases: input.result.aliases,\n };\n}\n\nexport function serializeLock(lock: Lockfile): string {\n return `${JSON.stringify(lock, null, 2)}\\n`;\n}\n\nexport function writeLock(dir: string, lock: Lockfile): string {\n const p = join(dir, \"loom.lock\");\n writeFileSync(p, serializeLock(lock));\n return p;\n}\n\n/** Read and validate an existing lockfile; null when absent or malformed. */\nexport function readLock(dir: string): Lockfile | null {\n try {\n const text = readFileSync(join(dir, \"loom.lock\"), \"utf8\");\n const res = validate(Lockfile, JSON.parse(text));\n return res.ok ? res.value : null;\n } catch {\n return null;\n }\n}\n","import type { Badge } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * A managed-mode install policy (spec §11 rule 5): the same install mechanism as\n * a solo dev, restricted by scope + policy. An enterprise pins an allowlist of\n * namespaces and/or required badges; only scope and policy differ, never mechanism.\n */\nexport interface ManagedPolicy {\n /** Only these reverse-DNS namespaces may be installed. */\n allowNamespaces?: string[];\n /** Each installed plugin must carry all of these badges. */\n requireBadges?: Badge[];\n}\n\nexport interface PolicyContext {\n namespace: string;\n badges?: Badge[];\n}\n\n/** A blocking reason when the policy forbids the install, or null when permitted. */\nexport function checkManagedPolicy(\n policy: ManagedPolicy | undefined,\n ctx: PolicyContext,\n): string | null {\n if (!policy) return null;\n if (policy.allowNamespaces && !policy.allowNamespaces.includes(ctx.namespace)) {\n return `namespace \"${ctx.namespace}\" is not allowlisted (managed mode allows: ${policy.allowNamespaces.join(\", \")})`;\n }\n if (policy.requireBadges && policy.requireBadges.length > 0) {\n const have = new Set(ctx.badges ?? []);\n const missing = policy.requireBadges.filter((b) => !have.has(b));\n if (missing.length > 0) return `plugin is missing required badge(s): ${missing.join(\", \")}`;\n }\n return null;\n}\n","import { createHash } from \"node:crypto\";\n\n/** sha256 of compiled output, used for content-addressed update + the signed badge. */\nexport function sha256(contents: string | Buffer): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ArtifactKind,\n HarnessAdapter,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/loom-adapter-kit\";\nimport type { ArtifactRecord, Scope, Target } from \"@michaelfromyeg/loom-schema\";\nimport { type CompileResult, synthMarketplace, type TargetOutput } from \"./compile\";\nimport { sha256 } from \"./hash\";\n\nexport interface WrittenArtifact {\n target: Target;\n /** Relative to the per-target output base. */\n relPath: string;\n abs: string;\n hash: string;\n kind?: ArtifactKind;\n}\n\nfunction writeArtifact(\n baseDir: string,\n relPath: string,\n contents: string | Buffer,\n): { abs: string; hash: string } {\n const abs = join(baseDir, relPath);\n mkdirSync(dirname(abs), { recursive: true });\n const buf = typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n writeFileSync(abs, buf);\n return { abs, hash: sha256(buf) };\n}\n\n/** Write one plugin's artifacts under `<baseDir>/plugins/<pluginName>/`. */\nexport function placePluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): WrittenArtifact[] {\n const pluginPrefix = join(\"plugins\", pluginName);\n return target.artifacts.map(({ artifact }) => {\n const rel = join(pluginPrefix, artifact.relPath);\n const { abs, hash } = writeArtifact(baseDir, rel, artifact.contents);\n return { target: target.target, relPath: rel, abs, hash, kind: artifact.kind };\n });\n}\n\n/** Emit and write a harness's native catalog at `<baseDir>/`. */\nexport function placeCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): WrittenArtifact[] {\n return adapter.emitCatalog(marketplace).map((artifact) => {\n const { abs, hash } = writeArtifact(baseDir, artifact.relPath, artifact.contents);\n return { target: adapter.target, relPath: artifact.relPath, abs, hash, kind: artifact.kind };\n });\n}\n\n/**\n * `loom build` placement for a single plugin (spec §9.1 step 6, inspect-only):\n * writes the plugin tree at `outDir/<target>/plugins/<plugin>/` plus a synthetic\n * one-entry catalog at the target root, leaving harness install dirs untouched.\n */\nexport function buildToDir(result: CompileResult, outDir: string): WrittenArtifact[] {\n const written: WrittenArtifact[] = [];\n const { plugin } = result.fb;\n const marketplace = synthMarketplace(plugin);\n for (const t of result.targets) {\n const base = join(outDir, t.target);\n written.push(...placePluginArtifacts(t, base, plugin.name));\n written.push(...placeCatalog(t.adapter, marketplace, base));\n }\n return written;\n}\n\nfunction toBuffer(contents: string | Buffer): Buffer {\n return typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n}\n\nexport interface PlannedArtifact {\n record: ArtifactRecord;\n contents: Buffer;\n}\n\n/**\n * Compute (without writing) where each target's plugin tree would land in the\n * scope, with content hashes. Drives both install (write all) and update (write\n * only what changed). Executable/passthrough artifacts are recorded DISABLED (§11).\n */\nexport function planScopeArtifacts(\n result: CompileResult,\n scope: Scope,\n cwd: string,\n): PlannedArtifact[] {\n const planned: PlannedArtifact[] = [];\n const name = result.fb.plugin.name;\n for (const t of result.targets) {\n const paths = t.adapter.detect(scope, cwd);\n const pluginDir = join(paths.plugins, name);\n for (const { componentId, artifact } of t.artifacts) {\n const contents = toBuffer(artifact.contents);\n planned.push({\n contents,\n record: {\n component: componentId,\n target: t.target,\n scope,\n path: join(pluginDir, artifact.relPath),\n hash: sha256(contents),\n placement: \"copy\",\n enabled: artifact.executable !== true,\n },\n });\n }\n }\n return planned;\n}\n\n/** `loom install` placement (spec §9.1 step 6): write every artifact, record each. */\nexport function installToScope(result: CompileResult, scope: Scope, cwd: string): ArtifactRecord[] {\n return planScopeArtifacts(result, scope, cwd).map(({ record, contents }) => {\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n return record;\n });\n}\n","import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { CatalogEntry, ResolvedMarketplace } from \"@michaelfromyeg/loom-adapter-kit\";\nimport type {\n Badge,\n Lockfile,\n Marketplace,\n ParseIssue,\n Plugin,\n Scope,\n Target,\n} from \"@michaelfromyeg/loom-schema\";\nimport { type CompileResult, compile, staticPass } from \"./compile\";\nimport { resolveConfig, type SecretsResult } from \"./config\";\nimport { type DependencyRecord, resolveDependencies } from \"./deps\";\nimport { CompileError, type Diagnostic, type Diagnostics } from \"./diagnostics\";\nimport { type FetchedPlugin, loadMarketplaceDir, loadPluginDir } from \"./loader\";\nimport { buildLockfile, readLock, writeLock } from \"./lockfile\";\nimport { checkManagedPolicy, type ManagedPolicy } from \"./managed\";\nimport {\n buildToDir,\n installToScope,\n placeCatalog,\n placePluginArtifacts,\n planScopeArtifacts,\n type WrittenArtifact,\n} from \"./place\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { gitInfo, resolvePluginRefFull } from \"./resolve\";\n\n/** Load a plugin and resolve its `depends` into a merged tree (spec §9.1 step 2). */\nasync function loadResolved(\n pluginDir: string,\n): Promise<{ fb: FetchedPlugin; dependencies: DependencyRecord[] }> {\n return resolveDependencies(loadOrThrow(pluginDir));\n}\n\nfunction issuesToDiagnostics(issues: ParseIssue[]): Diagnostic[] {\n return issues.map((i) => ({ severity: \"error\", where: i.path, message: i.message }));\n}\n\nfunction loadOrThrow(pluginDir: string) {\n const loaded = loadPluginDir(pluginDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load plugin in ${pluginDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n return loaded.value;\n}\n\nexport interface LintResult {\n id: string;\n plugin: Plugin;\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n}\n\n/** Load + statically validate a plugin without running any adapter (the valid badge). */\nexport function lint(pluginDir: string): LintResult {\n const fb = loadOrThrow(pluginDir);\n const pass = staticPass(fb);\n return { id: pass.id, plugin: fb.plugin, aliases: pass.aliases, diagnostics: pass.diagnostics };\n}\n\nexport interface BuildOptions {\n pluginDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n}\n\nexport interface BuildResult {\n result: CompileResult;\n written: WrittenArtifact[];\n}\n\n/** Compile a plugin and write its marketplace + plugin layout into `outDir` (no install). */\nexport async function build(opts: BuildOptions): Promise<BuildResult> {\n const { fb } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n const written = buildToDir(result, opts.outDir);\n return { result, written };\n}\n\nexport interface BuildMarketplaceOptions {\n marketplaceDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n}\n\nexport interface BuildMarketplaceResult {\n marketplace: Marketplace;\n plugins: CompileResult[];\n written: WrittenArtifact[];\n}\n\n/**\n * Compile a curated `marketplace.yaml` of many plugins: resolve and compile each\n * referenced plugin, place every plugin tree under `outDir/<target>/plugins/`,\n * and emit ONE native catalog per target listing them all (spec §6.2). This is\n * the company-marketplace workflow.\n */\nexport async function buildMarketplace(\n opts: BuildMarketplaceOptions,\n): Promise<BuildMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const compiled: Array<{ entry: Marketplace[\"plugins\"][number]; result: CompileResult }> = [];\n for (const entry of marketplace.plugins) {\n let fb: FetchedPlugin;\n try {\n fb = (await resolvePluginRefFull(entry.plugin, root)).fb;\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the compiled plugin.json too, so the\n // catalog and the plugin manifest agree (plugin.json wins at install time).\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n // Resolve the entry plugin's own dependencies before compiling it.\n const merged = (await resolveDependencies(fb)).fb;\n const result = compile(merged, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(`plugin \"${result.id}\" failed`, result.diagnostics.errors);\n }\n compiled.push({ entry, result });\n }\n\n const targets = opts.targets ?? opts.registry.targets;\n const written: WrittenArtifact[] = [];\n for (const target of targets) {\n const adapter = opts.registry.get(target);\n if (!adapter) continue;\n const base = join(opts.outDir, target);\n const entries: CatalogEntry[] = [];\n for (const { entry, result } of compiled) {\n const output = result.targets.find((t) => t.target === target);\n if (!output) continue;\n const p = result.fb.plugin;\n written.push(...placePluginArtifacts(output, base, p.name));\n entries.push({\n name: p.name,\n source: `./plugins/${p.name}`,\n ...(p.description ? { description: p.description } : {}),\n version: entry.version ?? p.version,\n ...(entry.category ? { category: entry.category } : {}),\n ...(entry.tags ? { tags: entry.tags } : {}),\n });\n }\n const resolved: ResolvedMarketplace = {\n name: marketplace.name,\n owner: marketplace.owner,\n ...(marketplace.description ? { description: marketplace.description } : {}),\n entries,\n };\n written.push(...placeCatalog(adapter, resolved, base));\n }\n\n return { marketplace, plugins: compiled.map((c) => c.result), written };\n}\n\nexport interface InstallOptions {\n pluginDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Piecemeal: install only these component leaf names (spec §9.2). */\n only?: string[];\n /** Managed-mode policy: namespace allowlist / required badges (spec §11). */\n managed?: ManagedPolicy;\n /** Badges known for this plugin (for managed `requireBadges`). */\n badges?: Badge[];\n /** Where to write `loom.lock` (default: the plugin dir). Eval points this at a scratch dir. */\n lockDir?: string;\n /** Inject the lockfile timestamp for deterministic tests. */\n now?: string;\n}\n\nexport interface InstallResult {\n result: CompileResult;\n lockfile: Lockfile;\n lockPath: string;\n /** Declared config resolution summary (never the values) -- spec §11. */\n secrets: SecretsResult;\n}\n\n/** Compile a plugin, place it into the scope's dirs, resolve config, write `loom.lock`. */\nexport async function install(opts: InstallOptions): Promise<InstallResult> {\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const result = compile(fb, {\n registry: opts.registry,\n targets: opts.targets,\n only: opts.only,\n });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n // Managed mode gates the install by namespace / required badges (spec §11).\n const blocked = checkManagedPolicy(opts.managed, {\n namespace: result.fb.plugin.owner.namespace,\n badges: opts.badges,\n });\n if (blocked) {\n throw new CompileError(\"install blocked by managed policy\", [\n { severity: \"error\", where: \"managed\", message: blocked },\n ]);\n }\n const artifacts = installToScope(result, opts.scope, opts.cwd);\n const secrets = resolveConfig(result.fb.plugin, opts.cwd);\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const lockfile = buildLockfile({\n result,\n artifacts,\n dependencies,\n ref,\n sha,\n generatedAt: opts.now ?? new Date().toISOString(),\n });\n const lockPath = writeLock(opts.lockDir ?? opts.pluginDir, lockfile);\n return { result, lockfile, lockPath, secrets };\n}\n\nexport interface UninstallOptions {\n /** Where loom.lock lives (also the default place uninstall reads from). */\n pluginDir: string;\n lockDir?: string;\n}\n\nexport interface UninstallResult {\n removed: string[];\n}\n\n/** Prune now-empty directories upward from each removed file (best-effort). */\nfunction pruneEmptyDirs(paths: string[]): void {\n const dirs = new Set(paths.map((p) => dirname(p)));\n for (const start of dirs) {\n let d = start;\n while (d && d !== dirname(d)) {\n try {\n if (readdirSync(d).length > 0) break;\n rmSync(d, { recursive: true, force: true });\n } catch {\n break;\n }\n d = dirname(d);\n }\n }\n}\n\n/**\n * Remove everything `install` placed, using the paths recorded in `loom.lock`,\n * then delete the lockfile (spec §6.3). Errors are defined out of existence:\n * a missing artifact is simply skipped.\n */\nexport function uninstall(opts: UninstallOptions): UninstallResult {\n const dir = opts.lockDir ?? opts.pluginDir;\n const lock = readLock(dir);\n if (!lock) {\n throw new CompileError(\"nothing to uninstall\", [\n { severity: \"error\", where: \"loom.lock\", message: `no loom.lock found in ${dir}` },\n ]);\n }\n const removed: string[] = [];\n for (const a of lock.artifacts) {\n if (existsSync(a.path)) {\n rmSync(a.path, { force: true });\n removed.push(a.path);\n }\n }\n pruneEmptyDirs(removed);\n rmSync(join(dir, \"loom.lock\"), { force: true });\n return { removed };\n}\n\nexport interface UpdateResult {\n lockfile: Lockfile;\n lockPath: string;\n /** Artifacts whose content hash changed (or are new) since the prior lockfile. */\n changed: string[];\n}\n\n/**\n * Re-resolve refs, recompile, diff artifact content hashes against `loom.lock`,\n * and re-place ONLY changed artifacts (spec §5, §9.3). Content addressing makes\n * \"is there really a new version?\" exact: an unchanged artifact is never rewritten.\n */\nexport async function update(opts: InstallOptions): Promise<UpdateResult> {\n const prev = readLock(opts.pluginDir);\n const prevHash = new Map((prev?.artifacts ?? []).map((a) => [a.path, a.hash]));\n\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n\n const planned = planScopeArtifacts(result, opts.scope, opts.cwd);\n const changed: string[] = [];\n for (const { record, contents } of planned) {\n if (prevHash.get(record.path) === record.hash) continue; // unchanged -> never rewrite\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n changed.push(record.path);\n }\n\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const lockfile = buildLockfile({\n result,\n artifacts: planned.map((p) => p.record),\n dependencies,\n ref,\n sha,\n generatedAt: opts.now ?? new Date().toISOString(),\n });\n const lockPath = writeLock(opts.pluginDir, lockfile);\n return { lockfile, lockPath, changed };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { HarnessAdapter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport { stringifyDocument } from \"@michaelfromyeg/loom-schema\";\n\nexport interface ImportPluginOptions {\n /** Directory holding an existing native plugin or marketplace. */\n dir: string;\n adapter: HarnessAdapter;\n /** Where to write the generated Loom plugin/marketplace. */\n outDir: string;\n /** Reverse-DNS namespace to assign (native assets lack one). */\n namespace?: string;\n}\n\nexport interface ImportOutput {\n kind: \"plugin\" | \"marketplace\";\n name: string;\n outDir: string;\n manifestPath: string;\n fileCount: number;\n id?: string;\n}\n\n/**\n * Reverse-compile an existing native plugin/marketplace into the Loom model and\n * write it to `outDir`, ready for `loom build` to cross-compile to every other\n * harness. This is \"federate, don't wall off\" applied to assets you already have.\n */\nexport function importNativePlugin(opts: ImportPluginOptions): ImportOutput {\n if (!opts.adapter.importNative) {\n throw new Error(`adapter \"${opts.adapter.target}\" does not support import`);\n }\n const result = opts.adapter.importNative(opts.dir, { namespace: opts.namespace });\n if (!result) {\n throw new Error(`no ${opts.adapter.target} plugin or marketplace found in ${opts.dir}`);\n }\n mkdirSync(opts.outDir, { recursive: true });\n\n if (result.kind === \"marketplace\") {\n const manifestPath = join(opts.outDir, \"marketplace.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.marketplace));\n return {\n kind: \"marketplace\",\n name: result.marketplace.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: 0,\n };\n }\n\n const manifestPath = join(opts.outDir, \"loom.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.plugin));\n for (const f of result.files) {\n const abs = join(opts.outDir, f.relPath);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(\n abs,\n typeof f.contents === \"string\" ? Buffer.from(f.contents, \"utf8\") : f.contents,\n );\n }\n return {\n kind: \"plugin\",\n name: result.plugin.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: result.files.length,\n id: `${result.plugin.owner.namespace}/${result.plugin.name}`,\n };\n}\n","import type { HarnessAdapter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport type { Target } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * Adapters registered by Target (spec §7). Core depends only on the adapter-kit\n * interface; the CLI (or an embedding app) registers concrete adapters, keeping\n * the dependency direction one-way and letting community adapters slot in.\n */\nexport class AdapterRegistry {\n private readonly adapters = new Map<Target, HarnessAdapter>();\n\n register(adapter: HarnessAdapter): this {\n this.adapters.set(adapter.target, adapter);\n return this;\n }\n\n get(target: Target): HarnessAdapter | undefined {\n return this.adapters.get(target);\n }\n\n has(target: Target): boolean {\n return this.adapters.has(target);\n }\n\n get targets(): Target[] {\n return [...this.adapters.keys()];\n }\n}\n","import { createHash, generateKeyPairSync, type KeyObject, sign, verify } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { Lockfile } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * A digest over the lockfile's artifact set (component + target + content hash).\n * Signing this binds a signature to exactly the compiled artifacts (spec §10\n * `signed` badge). Sorting makes it order-independent and deterministic.\n */\nexport function artifactDigest(lock: Lockfile): Buffer {\n const lines = lock.artifacts.map((a) => `${a.component}\\t${a.target}\\t${a.hash}`).sort();\n return createHash(\"sha256\").update(lines.join(\"\\n\")).digest();\n}\n\n/** Ed25519 keypair. Production would use sigstore/cosign keyless signing instead. */\nexport function generateSigningKeys(): { publicKey: KeyObject; privateKey: KeyObject } {\n return generateKeyPairSync(\"ed25519\");\n}\n\nexport function signLock(lock: Lockfile, privateKey: KeyObject): string {\n return sign(null, artifactDigest(lock), privateKey).toString(\"base64\");\n}\n\nexport function verifyLockSignature(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): boolean {\n try {\n return verify(null, artifactDigest(lock), publicKey, Buffer.from(signature, \"base64\"));\n } catch {\n return false;\n }\n}\n\nexport interface VerifyResult {\n signatureValid: boolean;\n /** Recorded artifact paths whose on-disk bytes no longer match the lock hash. */\n tampered: string[];\n}\n\n/**\n * Verify a signature AND that every recorded artifact on disk still matches its\n * lockfile hash. The `signed` badge requires both: a valid signature over the\n * digest and no tampered artifacts.\n */\nexport function verifyArtifacts(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): VerifyResult {\n const tampered: string[] = [];\n for (const a of lock.artifacts) {\n if (!existsSync(a.path)) {\n tampered.push(a.path);\n continue;\n }\n const actual = createHash(\"sha256\").update(readFileSync(a.path)).digest(\"hex\");\n if (actual !== a.hash) tampered.push(a.path);\n }\n return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };\n}\n"]}
1
+ {"version":3,"sources":["../src/diagnostics.ts","../src/namespace.ts","../src/validate.ts","../src/version.ts","../src/compile.ts","../src/config.ts","../src/loader.ts","../src/resolve.ts","../src/deps.ts","../src/lockfile.ts","../src/managed.ts","../src/hash.ts","../src/place.ts","../src/api.ts","../src/import.ts","../src/registry.ts","../src/sign.ts"],"names":["kindOf","join","existsSync","statSync","mkdirSync","resolvePath","leafNameOf","refOf","writeFileSync","readFileSync","createHash","loadOrThrow","dirname","readdirSync","manifestPath"],"mappings":"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","file":"index.js","sourcesContent":["export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n /** Path-precise location: \"components[1].mcp\", \"owner.namespace\", or a file path. */\n where: string;\n message: string;\n}\n\n/** Accumulates diagnostics during compile; fails closed when any error is present. */\nexport class Diagnostics {\n readonly items: Diagnostic[] = [];\n\n error(where: string, message: string): void {\n this.items.push({ severity: \"error\", where, message });\n }\n warn(where: string, message: string): void {\n this.items.push({ severity: \"warning\", where, message });\n }\n info(where: string, message: string): void {\n this.items.push({ severity: \"info\", where, message });\n }\n\n get hasErrors(): boolean {\n return this.items.some((d) => d.severity === \"error\");\n }\n\n get errors(): Diagnostic[] {\n return this.items.filter((d) => d.severity === \"error\");\n }\n}\n\nexport class CompileError extends Error {\n constructor(\n message: string,\n readonly diagnostics: Diagnostic[],\n ) {\n super(message);\n this.name = \"CompileError\";\n }\n}\n","/** One component identified for aliasing: its bare leaf name and full id. */\nexport interface AliasInput {\n id: string;\n leaf: string;\n}\n\nexport interface AliasResult {\n /** Bare leaf name -> fully-qualified id. */\n aliases: Record<string, string>;\n /** True same-scope collisions: one leaf claimed by multiple ids. */\n collisions: Array<{ leaf: string; ids: string[] }>;\n}\n\n/**\n * Bare name when unambiguous (spec §9.4). A leaf used by exactly one component\n * gets the bare alias; a leaf shared by several is surfaced as a collision for\n * the caller to resolve (prompt interactively, or error non-interactively).\n * Never silently last-wins.\n */\nexport function resolveAliases(components: AliasInput[]): AliasResult {\n const byLeaf = new Map<string, string[]>();\n for (const c of components) {\n const ids = byLeaf.get(c.leaf) ?? [];\n ids.push(c.id);\n byLeaf.set(c.leaf, ids);\n }\n\n const aliases: Record<string, string> = {};\n const collisions: AliasResult[\"collisions\"] = [];\n for (const [leaf, ids] of byLeaf) {\n if (ids.length === 1) aliases[leaf] = ids[0] as string;\n else collisions.push({ leaf, ids: [...ids].sort() });\n }\n return { aliases, collisions };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFrontmatter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport { kindOf, refOf } from \"@michaelfromyeg/loom-schema\";\nimport type { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\n\n/**\n * Static validation (spec §9.1 step 3, the `valid` badge): every referenced file\n * exists, skill/agent frontmatter is well-formed, `server.json` parses, and\n * descriptions clear a basic quality bar. Errors fail the compile closed.\n */\nexport function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void {\n fb.plugin.components.forEach((component, i) => {\n const where = `components[${i}]`;\n const ref = refOf(component);\n const abs = join(fb.root, ref);\n if (!existsSync(abs)) {\n diags.error(where, `referenced path \"${ref}\" does not exist`);\n return;\n }\n\n switch (kindOf(component)) {\n case \"skill\":\n validateSkill(fb, ref, abs, where, diags);\n break;\n case \"mcp\":\n validateMcp(fb, ref, abs, where, diags);\n break;\n case \"agent\":\n validateMarkdownComponent(fb, ref, abs, where, diags);\n break;\n default:\n // command / hook / passthrough: existence is the only static gate.\n break;\n }\n });\n}\n\nfunction validateSkill(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `skill \"${ref}\" must be a directory containing SKILL.md`);\n return;\n }\n const skillMd = join(abs, \"SKILL.md\");\n if (!existsSync(skillMd)) {\n diags.error(where, `skill \"${ref}\" is missing SKILL.md`);\n return;\n }\n const { data } = parseFrontmatter(fb.read(join(ref, \"SKILL.md\")).toString(\"utf8\"));\n if (!data.name) diags.error(`${where}.skill`, \"SKILL.md frontmatter is missing `name`\");\n checkDescription(`${where}.skill`, data.description, diags);\n}\n\nfunction validateMcp(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `mcp \"${ref}\" must be a directory containing server.json`);\n return;\n }\n const serverJsonPath = join(abs, \"server.json\");\n if (!existsSync(serverJsonPath)) {\n diags.error(where, `mcp \"${ref}\" is missing server.json`);\n return;\n }\n let server: Record<string, unknown>;\n try {\n server = JSON.parse(fb.read(join(ref, \"server.json\")).toString(\"utf8\"));\n } catch (err) {\n diags.error(`${where}.mcp`, `server.json is not valid JSON: ${(err as Error).message}`);\n return;\n }\n if (!server.name) diags.error(`${where}.mcp`, \"server.json is missing `name`\");\n const hasRunnable = server.packages || server.remotes || server.command;\n if (!hasRunnable) {\n diags.warn(`${where}.mcp`, \"server.json declares no `packages`, `remotes`, or `command`\");\n }\n checkDescription(`${where}.mcp`, server.description, diags);\n}\n\nfunction validateMarkdownComponent(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (statSync(abs).isDirectory()) return; // agent-as-dir: defer detailed checks\n const { data } = parseFrontmatter(fb.read(ref).toString(\"utf8\"));\n if (!data.name) diags.warn(`${where}.agent`, \"agent frontmatter is missing `name`\");\n checkDescription(`${where}.agent`, data.description, diags);\n}\n\nfunction checkDescription(where: string, description: unknown, diags: Diagnostics): void {\n if (!description) {\n diags.error(where, \"missing `description` (required for discovery + the tested badge)\");\n return;\n }\n if (String(description).trim().length < 16) {\n diags.warn(where, \"description is very short; harnesses route on it -- make it specific\");\n }\n}\n","import semver from \"semver\";\n\n/** The Loom/CLI version (versioning axis 2, spec §5). */\nexport const LOOM_VERSION = \"0.2.0\";\n\n/**\n * Check a plugin's `loom_min_version` against the running Loom. Returns an error\n * message when unmet, or null when satisfied / unspecified.\n */\nexport function checkMinVersion(min: string | undefined): string | null {\n if (!min) return null;\n const cleaned = semver.valid(semver.coerce(min) ?? min);\n if (!cleaned) return `loom_min_version \"${min}\" is not a valid semver`;\n if (semver.lt(LOOM_VERSION, cleaned)) {\n return `plugin requires Loom >= ${min}, but this is ${LOOM_VERSION}`;\n }\n return null;\n}\n","import type {\n CompiledArtifact,\n HarnessAdapter,\n PluginCtx,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/loom-adapter-kit\";\nimport {\n ALL_TARGETS,\n type Component,\n type ComponentKind,\n fqid,\n kindOf,\n leafNameOf,\n type Plugin,\n type Target,\n targetsOf,\n} from \"@michaelfromyeg/loom-schema\";\nimport { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\nimport { resolveAliases } from \"./namespace\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { validatePlugin } from \"./validate\";\nimport { checkMinVersion } from \"./version\";\n\n/** An emitted artifact tagged with the canonical component it came from. */\nexport interface TaggedArtifact {\n componentId: string;\n artifact: CompiledArtifact;\n}\n\n/** Everything one adapter produced for one plugin. */\nexport interface TargetOutput {\n target: Target;\n adapter: HarnessAdapter;\n /** Plugin-root-relative artifacts: components + the plugin manifest. */\n artifacts: TaggedArtifact[];\n}\n\nexport interface CompileResult {\n fb: FetchedPlugin;\n /** Plugin id: `{namespace}/{name}`. */\n id: string;\n /** The components actually compiled (the piecemeal selection, or all). */\n components: ResolvedComponent[];\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n targets: TargetOutput[];\n}\n\nexport interface CompileOptions {\n registry: AdapterRegistry;\n /** Restrict to these targets; default = every target with a registered adapter. */\n targets?: Target[];\n /** Piecemeal: include only these component leaf names; default = all (spec §9.2). */\n only?: string[];\n}\n\n/** A synthetic one-entry marketplace wrapping a single plugin (spec §9.1 build). */\nexport function synthMarketplace(plugin: Plugin): ResolvedMarketplace {\n return {\n name: plugin.name,\n owner: plugin.owner,\n ...(plugin.description ? { description: plugin.description } : {}),\n entries: [\n {\n name: plugin.name,\n source: `./plugins/${plugin.name}`,\n ...(plugin.description ? { description: plugin.description } : {}),\n version: plugin.version,\n },\n ],\n };\n}\n\nexport interface ResolvedComponent {\n id: string;\n leaf: string;\n kind: ComponentKind;\n component: Component;\n}\n\nexport interface StaticPass {\n id: string;\n diagnostics: Diagnostics;\n aliases: Record<string, string>;\n resolved: ResolvedComponent[];\n}\n\n/**\n * Steps 1-4 of the pipeline shared by `compile` and `lint`: min-version,\n * static validation, fully-qualified ids, and alias resolution. No adapters run,\n * so it is the deterministic \"is this plugin valid?\" pass behind the valid badge.\n */\nexport function staticPass(fb: FetchedPlugin): StaticPass {\n const diagnostics = new Diagnostics();\n const { plugin } = fb;\n const id = `${plugin.owner.namespace}/${plugin.name}`;\n\n const minErr = checkMinVersion(plugin.loom_min_version);\n if (minErr) diagnostics.error(\"loom_min_version\", minErr);\n\n validatePlugin(fb, diagnostics);\n\n const resolved: ResolvedComponent[] = plugin.components.map((component) => ({\n id: fqid(plugin.owner.namespace, plugin.name, leafNameOf(component)),\n leaf: leafNameOf(component),\n kind: kindOf(component),\n component,\n }));\n\n const { aliases, collisions } = resolveAliases(resolved);\n for (const c of collisions) {\n diagnostics.error(\n `components.${c.leaf}`,\n `ambiguous component name \"${c.leaf}\": ${c.ids.join(\" vs \")}; qualify or choose which keeps the bare alias`,\n );\n }\n\n return { id, diagnostics, aliases, resolved };\n}\n\n/**\n * Steps 1-5 of the compile pipeline (spec §9.1): load is done by the caller;\n * here we enforce min-version, validate statically, resolve aliases, and run each\n * adapter's transform + emitManifest. Catalog emission (a marketplace concern) and\n * placement are separate so `build` can inspect without installing and `install`\n * can pull components piecemeal.\n *\n * Never throws on plugin problems -- it accumulates diagnostics so the caller can\n * render them. `build`/`install` fail closed when `diagnostics.hasErrors`.\n */\nexport function compile(fb: FetchedPlugin, opts: CompileOptions): CompileResult {\n const { plugin } = fb;\n const pass = staticPass(fb);\n const { id, diagnostics } = pass;\n\n // Piecemeal selection (spec §9.2): include only the requested component leaves.\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n if (onlySet) {\n for (const leaf of onlySet) {\n if (!pass.resolved.some((rc) => rc.leaf === leaf)) {\n diagnostics.error(\n \"only\",\n `component \"${leaf}\" not found; available: ${pass.resolved.map((r) => r.leaf).join(\", \")}`,\n );\n }\n }\n }\n const selected = onlySet ? pass.resolved.filter((rc) => onlySet.has(rc.leaf)) : pass.resolved;\n const effectivePlugin: Plugin = onlySet\n ? { ...plugin, components: selected.map((rc) => rc.component) }\n : plugin;\n const aliases = onlySet\n ? Object.fromEntries(\n Object.entries(pass.aliases).filter(([, cid]) => selected.some((rc) => rc.id === cid)),\n )\n : pass.aliases;\n const reverseAlias = new Map(Object.entries(aliases).map(([leaf, cid]) => [cid, leaf]));\n\n const requested = opts.targets ?? opts.registry.targets;\n const targets: TargetOutput[] = [];\n\n for (const target of requested) {\n const adapter = opts.registry.get(target);\n if (!adapter) {\n if (opts.targets) diagnostics.warn(target, `no adapter registered for target \"${target}\"`);\n continue;\n }\n\n const ctx: PluginCtx = {\n plugin: effectivePlugin,\n read: fb.read,\n list: fb.list,\n aliasFor: (componentId) => reverseAlias.get(componentId) ?? componentId,\n };\n\n const pluginArtifacts: TaggedArtifact[] = [];\n for (const rc of selected) {\n if (!targetsOf(rc.component, ALL_TARGETS).includes(target)) continue;\n for (const a of adapter.transform(rc.component, ctx)) {\n pluginArtifacts.push({ componentId: rc.id, artifact: a });\n }\n }\n for (const a of adapter.emitManifest(effectivePlugin, ctx)) {\n pluginArtifacts.push({ componentId: id, artifact: a });\n }\n\n targets.push({ target, adapter, artifacts: pluginArtifacts });\n }\n\n return { fb, id, components: selected, aliases, diagnostics, targets };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Component, Plugin } from \"@michaelfromyeg/loom-schema\";\n\nexport interface ConfigResolution {\n env: string;\n /** Where the value came from -- never the value itself. */\n source: \"env\" | \"default\" | \"missing\";\n secret: boolean;\n}\n\nexport interface SecretsResult {\n resolved: ConfigResolution[];\n /** Path to the gitignored local config the values were written to (or null). */\n path: string | null;\n}\n\nfunction configVarsOf(component: Component) {\n return \"config\" in component && component.config ? component.config : [];\n}\n\n/**\n * Resolve declared `ConfigVar`s (spec §9.1 step 7, §11 rule 4: declare-not-store).\n * Values come from the environment or a declared default and are written ONLY to a\n * local, gitignored config -- never to the lockfile, the plugin, the index, or\n * telemetry. The returned summary records where each value came from, not the value.\n */\nexport function resolveConfig(\n plugin: Plugin,\n cwd: string,\n env: Record<string, string | undefined> = process.env,\n): SecretsResult {\n const resolved: ConfigResolution[] = [];\n const values: Record<string, string> = {};\n\n for (const component of plugin.components) {\n for (const v of configVarsOf(component)) {\n const fromEnv = env[v.env];\n if (fromEnv !== undefined) {\n values[v.env] = fromEnv;\n resolved.push({ env: v.env, source: \"env\", secret: v.secret });\n } else if (v.default === undefined) {\n resolved.push({ env: v.env, source: \"missing\", secret: v.secret });\n } else {\n values[v.env] = v.default;\n resolved.push({ env: v.env, source: \"default\", secret: v.secret });\n }\n }\n }\n\n if (Object.keys(values).length === 0) return { resolved, path: null };\n\n const dir = join(cwd, \".loom\");\n mkdirSync(dir, { recursive: true });\n // Gitignore the whole local-config dir so resolved values never get committed.\n writeFileSync(join(dir, \".gitignore\"), \"*\\n\");\n const path = join(dir, \"secrets.local.json\");\n writeFileSync(path, `${JSON.stringify(values, null, 2)}\\n`);\n return { resolved, path };\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n loadManifest,\n loadPlugin,\n Marketplace,\n type ParseResult,\n type Plugin,\n} from \"@michaelfromyeg/loom-schema\";\n\n/** A plugin whose files are available on disk under `root`. */\nexport interface FetchedPlugin {\n plugin: Plugin;\n root: string;\n manifestPath: string;\n /** Read a file from the plugin, relative to `root`. */\n read(relPath: string): Buffer;\n /** Recursively list files under a plugin dir, as paths relative to `root` (sorted). */\n list(relDir: string): string[];\n}\n\n/** A loaded marketplace manifest and its directory. */\nexport interface FetchedMarketplace {\n marketplace: Marketplace;\n root: string;\n manifestPath: string;\n}\n\n/** Recursively collect file paths under `dir`, relative to `root`. Deterministic order. */\nfunction walkFiles(root: string, dir: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir).sort()) {\n const abs = join(dir, entry);\n if (statSync(abs).isDirectory()) out.push(...walkFiles(root, abs));\n else out.push(relative(root, abs));\n }\n return out;\n}\n\nconst MANIFEST_NAMES = [\"loom.yaml\", \"loom.yml\", \"loom.json5\", \"loom.json\"];\n\n/** Build `read`/`list` accessors rooted at a directory (used for merged plugins too). */\nexport function fileAccessors(root: string): Pick<FetchedPlugin, \"read\" | \"list\"> {\n return {\n read: (relPath: string) => readFileSync(join(root, relPath)),\n list: (relDir: string) => walkFiles(root, join(root, relDir)),\n };\n}\n\n/** Load and validate the plugin manifest in `dir`, exposing its files for adapters. */\nexport function loadPluginDir(dir: string): ParseResult<FetchedPlugin> {\n const manifestPath = MANIFEST_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n { path: dir, message: `no plugin manifest found (one of: ${MANIFEST_NAMES.join(\", \")})` },\n ],\n };\n }\n\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadPlugin(text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n\n return {\n ok: true,\n value: { plugin: parsed.value, root: dir, manifestPath, ...fileAccessors(dir) },\n };\n}\n\nconst MARKETPLACE_NAMES = [\n \"marketplace.yaml\",\n \"marketplace.yml\",\n \"marketplace.json5\",\n \"marketplace.json\",\n];\n\n/** True when `dir` is a marketplace (a catalog of plugins) rather than a plugin. */\nexport function hasMarketplaceManifest(dir: string): boolean {\n return MARKETPLACE_NAMES.some((n) => existsSync(join(dir, n)));\n}\n\n/** Load and validate the marketplace manifest in `dir`. */\nexport function loadMarketplaceDir(dir: string): ParseResult<FetchedMarketplace> {\n const manifestPath = MARKETPLACE_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n {\n path: dir,\n message: `no marketplace manifest found (one of: ${MARKETPLACE_NAMES.join(\", \")})`,\n },\n ],\n };\n }\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadManifest(Marketplace, text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n return { ok: true, value: { marketplace: parsed.value, root: dir, manifestPath } };\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\";\nimport type { Dependency } from \"@michaelfromyeg/loom-schema\";\nimport { execa } from \"execa\";\nimport { type FetchedPlugin, loadPluginDir } from \"./loader\";\n\nexport type Source =\n | { kind: \"local\"; path: string }\n | { kind: \"github\"; repo: string; ref?: string }\n | { kind: \"git\"; url: string; ref?: string }\n | { kind: \"npm\"; pkg: string; version?: string };\n\n/** Where cloned/fetched remote plugins are cached. */\nexport const CACHE_DIR = join(homedir(), \".loom\", \"cache\");\n\n/** Parse a plugin/dependency source string into a structured form (spec §6.1). */\nexport function parseSource(src: string): Source {\n if (src.startsWith(\"./\") || src.startsWith(\"../\") || isAbsolute(src)) {\n return { kind: \"local\", path: src };\n }\n if (src.startsWith(\"github:\")) {\n const [repo, ref] = src.slice(\"github:\".length).split(\"#\");\n return ref ? { kind: \"github\", repo, ref } : { kind: \"github\", repo };\n }\n if (src.startsWith(\"npm:\")) {\n const spec = src.slice(\"npm:\".length);\n const at = spec.lastIndexOf(\"@\");\n if (at > 0) return { kind: \"npm\", pkg: spec.slice(0, at), version: spec.slice(at + 1) };\n return { kind: \"npm\", pkg: spec };\n }\n if (\n src.startsWith(\"git@\") ||\n src.startsWith(\"git+\") ||\n src.startsWith(\"file://\") ||\n /^https?:\\/\\//.test(src)\n ) {\n const [url, ref] = src.replace(/^git\\+/, \"\").split(\"#\");\n return ref ? { kind: \"git\", url, ref } : { kind: \"git\", url };\n }\n // Bare `owner/repo` is treated as GitHub shorthand.\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(src)) return { kind: \"github\", repo: src };\n return { kind: \"local\", path: src };\n}\n\nfunction cacheDirFor(key: string): string {\n return join(CACHE_DIR, createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16));\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n/** Clone (or refresh) a git repo into the cache and check out `ref`; return dir + SHA. */\nasync function gitFetch(\n url: string,\n ref: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n mkdirSync(CACHE_DIR, { recursive: true });\n const dir = cacheDirFor(`${url}@${ref ?? \"default\"}`);\n const isSha = ref !== undefined && SHA_RE.test(ref);\n\n if (existsSync(join(dir, \".git\"))) {\n await execa(\"git\", [\"fetch\", \"origin\", ...(ref ? [ref] : [])], { cwd: dir });\n await execa(\"git\", [\"checkout\", ref ?? \"FETCH_HEAD\"], { cwd: dir, reject: false });\n } else if (isSha) {\n await execa(\"git\", [\"clone\", url, dir]);\n await execa(\"git\", [\"checkout\", ref as string], { cwd: dir });\n } else {\n const branchArgs = ref ? [\"--branch\", ref] : [];\n await execa(\"git\", [\"clone\", \"--depth\", \"1\", ...branchArgs, url, dir]);\n }\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n return { dir, sha };\n}\n\n/** A fetched plugin plus the ref/SHA it resolved to (for the lockfile). */\nexport interface ResolvedPlugin {\n fb: FetchedPlugin;\n ref: string;\n sha: string;\n}\n\n/**\n * Resolve a plugin source to a fetched plugin on disk (spec §5, §9.1 step 2).\n * Local `./path` sources resolve relative to `fromRoot`; `github:`/git sources are\n * git-cloned into the cache and pinned to a resolved SHA; `npm:` is a clear stub.\n */\nexport async function resolvePluginRefFull(\n source: string,\n fromRoot: string,\n): Promise<ResolvedPlugin> {\n const src = parseSource(source);\n\n if (src.kind === \"local\") {\n const dir = isAbsolute(src.path) ? src.path : resolvePath(fromRoot, src.path);\n return { fb: loadOrThrow(dir, source), ref: \"local\", sha: \"\" };\n }\n if (src.kind === \"github\" || src.kind === \"git\") {\n const url = src.kind === \"github\" ? `https://github.com/${src.repo}.git` : src.url;\n const { dir, sha } = await gitFetch(url, src.ref);\n return { fb: loadOrThrow(dir, source), ref: src.ref ?? \"default\", sha };\n }\n throw new Error(`npm source resolution (\"${source}\") is not implemented yet`);\n}\n\n/** Convenience: resolve and return only the fetched plugin. */\nexport async function resolvePluginRef(source: string, fromRoot: string): Promise<FetchedPlugin> {\n return (await resolvePluginRefFull(source, fromRoot)).fb;\n}\n\nfunction loadOrThrow(dir: string, source: string): FetchedPlugin {\n const loaded = loadPluginDir(dir);\n if (!loaded.ok) {\n throw new Error(\n `failed to load \"${source}\":\\n${loaded.issues.map((i) => ` ${i.path}: ${i.message}`).join(\"\\n\")}`,\n );\n }\n return loaded.value;\n}\n\n/** Resolve a `depends` entry to a fetched plugin (relative to the depending plugin root). */\nexport function resolveDependency(dep: Dependency, fromRoot: string): Promise<ResolvedPlugin> {\n return resolvePluginRefFull(dep.plugin, fromRoot);\n}\n\n/** Best-effort git ref + SHA for the lockfile. Returns sentinels outside a repo. */\nexport async function gitInfo(dir: string): Promise<{ ref: string; sha: string }> {\n try {\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n let ref = \"HEAD\";\n try {\n ref = (\n await execa(\"git\", [\"describe\", \"--tags\", \"--exact-match\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n try {\n ref = (\n await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n /* keep HEAD */\n }\n }\n return { ref, sha };\n } catch {\n return { ref: \"local\", sha: \"\" };\n }\n}\n","import { cpSync, mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type Component,\n type ComponentKind,\n kindOf,\n leafNameOf,\n refOf,\n} from \"@michaelfromyeg/loom-schema\";\nimport { type FetchedPlugin, fileAccessors } from \"./loader\";\nimport { resolveDependency } from \"./resolve\";\n\nconst KIND_KEY: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nfunction rewriteRef(c: Component, newRef: string): Component {\n return { ...c, [KIND_KEY[kindOf(c)]]: newRef } as Component;\n}\n\nconst skipGit = (src: string): boolean => !/\\/\\.git(\\/|$)/.test(src);\n\nexport interface DependencyRecord {\n id: string;\n range: string;\n resolvedSha: string;\n}\n\nexport interface ResolvedDeps {\n fb: FetchedPlugin;\n dependencies: DependencyRecord[];\n}\n\n/**\n * Resolve a plugin's `depends` (spec §9.1 step 2). Each dependency is fetched\n * (locally or git-cloned and pinned to a SHA), then its selected components are\n * vendored into a merged temp tree under `_deps/<name>/` and registered under the\n * consuming plugin's namespace. Piecemeal `components:[…]` selects which to\n * register, but the whole dep tree is copied so shared assets travel (drift-aware).\n * Direct cycles are detected by id.\n */\nexport async function resolveDependencies(\n fb: FetchedPlugin,\n tmpRoot?: string,\n): Promise<ResolvedDeps> {\n const depends = fb.plugin.depends ?? [];\n if (depends.length === 0) return { fb, dependencies: [] };\n\n const merged = mkdtempSync(join(tmpRoot ?? tmpdir(), \"loom-merged-\"));\n cpSync(fb.root, merged, { recursive: true, filter: skipGit });\n\n const components: Component[] = [...fb.plugin.components];\n const dependencies: DependencyRecord[] = [];\n const seen = new Set<string>([`${fb.plugin.owner.namespace}/${fb.plugin.name}`]);\n\n for (const dep of depends) {\n const resolved = await resolveDependency(dep, fb.root);\n const dp = resolved.fb.plugin;\n const depId = `${dp.owner.namespace}/${dp.name}`;\n if (seen.has(depId)) throw new Error(`dependency cycle detected at ${depId}`);\n seen.add(depId);\n\n const want = dep.components;\n if (want) {\n const missing = want.filter((leaf) => !dp.components.some((c) => leafNameOf(c) === leaf));\n if (missing.length > 0) {\n throw new Error(`dependency ${depId} has no component(s): ${missing.join(\", \")}`);\n }\n }\n const selected = dp.components.filter((c) => !want || want.includes(leafNameOf(c)));\n\n const destBase = join(\"_deps\", dp.name);\n cpSync(resolved.fb.root, join(merged, destBase), { recursive: true, filter: skipGit });\n for (const c of selected) components.push(rewriteRef(c, join(destBase, refOf(c))));\n\n dependencies.push({ id: depId, range: dep.version ?? \"*\", resolvedSha: resolved.sha });\n }\n\n const plugin = { ...fb.plugin, components };\n const mergedFb: FetchedPlugin = {\n plugin,\n root: merged,\n manifestPath: join(merged, \"loom.yaml\"),\n ...fileAccessors(merged),\n };\n return { fb: mergedFb, dependencies };\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type ArtifactRecord, Lockfile, validate } from \"@michaelfromyeg/loom-schema\";\nimport type { CompileResult } from \"./compile\";\nimport { LOOM_VERSION } from \"./version\";\n\nexport interface LockInput {\n result: CompileResult;\n artifacts: ArtifactRecord[];\n ref: string;\n sha: string;\n generatedAt: string;\n dependencies?: Lockfile[\"dependencies\"];\n}\n\n/** Assemble the `loom.lock` object (spec §6.3) from an install. */\nexport function buildLockfile(input: LockInput): Lockfile {\n const adapters: Lockfile[\"adapters\"] = {};\n for (const t of input.result.targets) {\n adapters[t.target] = { version: t.adapter.version, targetSchema: t.adapter.targetSchema };\n }\n return {\n loomVersion: LOOM_VERSION,\n generatedAt: input.generatedAt,\n plugin: {\n id: input.result.id,\n version: input.result.fb.plugin.version,\n ref: input.ref,\n sha: input.sha,\n },\n dependencies: input.dependencies ?? [],\n artifacts: input.artifacts,\n adapters,\n aliases: input.result.aliases,\n };\n}\n\nexport function serializeLock(lock: Lockfile): string {\n return `${JSON.stringify(lock, null, 2)}\\n`;\n}\n\nexport function writeLock(dir: string, lock: Lockfile): string {\n const p = join(dir, \"loom.lock\");\n writeFileSync(p, serializeLock(lock));\n return p;\n}\n\n/** Read and validate an existing lockfile; null when absent or malformed. */\nexport function readLock(dir: string): Lockfile | null {\n try {\n const text = readFileSync(join(dir, \"loom.lock\"), \"utf8\");\n const res = validate(Lockfile, JSON.parse(text));\n return res.ok ? res.value : null;\n } catch {\n return null;\n }\n}\n","import type { Badge } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * A managed-mode install policy (spec §11 rule 5): the same install mechanism as\n * a solo dev, restricted by scope + policy. An enterprise pins an allowlist of\n * namespaces and/or required badges; only scope and policy differ, never mechanism.\n */\nexport interface ManagedPolicy {\n /** Only these reverse-DNS namespaces may be installed. */\n allowNamespaces?: string[];\n /** Each installed plugin must carry all of these badges. */\n requireBadges?: Badge[];\n}\n\nexport interface PolicyContext {\n namespace: string;\n badges?: Badge[];\n}\n\n/** A blocking reason when the policy forbids the install, or null when permitted. */\nexport function checkManagedPolicy(\n policy: ManagedPolicy | undefined,\n ctx: PolicyContext,\n): string | null {\n if (!policy) return null;\n if (policy.allowNamespaces && !policy.allowNamespaces.includes(ctx.namespace)) {\n return `namespace \"${ctx.namespace}\" is not allowlisted (managed mode allows: ${policy.allowNamespaces.join(\", \")})`;\n }\n if (policy.requireBadges && policy.requireBadges.length > 0) {\n const have = new Set(ctx.badges ?? []);\n const missing = policy.requireBadges.filter((b) => !have.has(b));\n if (missing.length > 0) return `plugin is missing required badge(s): ${missing.join(\", \")}`;\n }\n return null;\n}\n","import { createHash } from \"node:crypto\";\n\n/** sha256 of compiled output, used for content-addressed update + the signed badge. */\nexport function sha256(contents: string | Buffer): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ArtifactKind,\n HarnessAdapter,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/loom-adapter-kit\";\nimport type { ArtifactRecord, Scope, Target } from \"@michaelfromyeg/loom-schema\";\nimport { type CompileResult, synthMarketplace, type TargetOutput } from \"./compile\";\nimport { sha256 } from \"./hash\";\n\nexport interface WrittenArtifact {\n target: Target;\n /** Relative to the per-target output base. */\n relPath: string;\n abs: string;\n hash: string;\n kind?: ArtifactKind;\n}\n\nfunction writeArtifact(\n baseDir: string,\n relPath: string,\n contents: string | Buffer,\n): { abs: string; hash: string } {\n const abs = join(baseDir, relPath);\n mkdirSync(dirname(abs), { recursive: true });\n const buf = typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n writeFileSync(abs, buf);\n return { abs, hash: sha256(buf) };\n}\n\n/** Write one plugin's artifacts under `<baseDir>/plugins/<pluginName>/`. */\nexport function placePluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): WrittenArtifact[] {\n const pluginPrefix = join(\"plugins\", pluginName);\n return target.artifacts.map(({ artifact }) => {\n const rel = join(pluginPrefix, artifact.relPath);\n const { abs, hash } = writeArtifact(baseDir, rel, artifact.contents);\n return { target: target.target, relPath: rel, abs, hash, kind: artifact.kind };\n });\n}\n\n/** Emit and write a harness's native catalog at `<baseDir>/`. */\nexport function placeCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): WrittenArtifact[] {\n return adapter.emitCatalog(marketplace).map((artifact) => {\n const { abs, hash } = writeArtifact(baseDir, artifact.relPath, artifact.contents);\n return { target: adapter.target, relPath: artifact.relPath, abs, hash, kind: artifact.kind };\n });\n}\n\n/**\n * `loom build` placement for a single plugin (spec §9.1 step 6, inspect-only):\n * writes the plugin tree at `outDir/<target>/plugins/<plugin>/` plus a synthetic\n * one-entry catalog at the target root, leaving harness install dirs untouched.\n */\nexport function buildToDir(result: CompileResult, outDir: string): WrittenArtifact[] {\n const written: WrittenArtifact[] = [];\n const { plugin } = result.fb;\n const marketplace = synthMarketplace(plugin);\n for (const t of result.targets) {\n const base = join(outDir, t.target);\n written.push(...placePluginArtifacts(t, base, plugin.name));\n written.push(...placeCatalog(t.adapter, marketplace, base));\n }\n return written;\n}\n\nfunction toBuffer(contents: string | Buffer): Buffer {\n return typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n}\n\nexport interface PlannedArtifact {\n record: ArtifactRecord;\n contents: Buffer;\n}\n\n/**\n * Compute (without writing) where each target's plugin tree would land in the\n * scope, with content hashes. Drives both install (write all) and update (write\n * only what changed). Executable/passthrough artifacts are recorded DISABLED (§11).\n */\nexport function planScopeArtifacts(\n result: CompileResult,\n scope: Scope,\n cwd: string,\n): PlannedArtifact[] {\n const planned: PlannedArtifact[] = [];\n const name = result.fb.plugin.name;\n for (const t of result.targets) {\n const paths = t.adapter.detect(scope, cwd);\n const pluginDir = join(paths.plugins, name);\n for (const { componentId, artifact } of t.artifacts) {\n const contents = toBuffer(artifact.contents);\n planned.push({\n contents,\n record: {\n component: componentId,\n target: t.target,\n scope,\n path: join(pluginDir, artifact.relPath),\n hash: sha256(contents),\n placement: \"copy\",\n enabled: artifact.executable !== true,\n },\n });\n }\n }\n return planned;\n}\n\n/** `loom install` placement (spec §9.1 step 6): write every artifact, record each. */\nexport function installToScope(result: CompileResult, scope: Scope, cwd: string): ArtifactRecord[] {\n return planScopeArtifacts(result, scope, cwd).map(({ record, contents }) => {\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n return record;\n });\n}\n","import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { CatalogEntry, ResolvedMarketplace } from \"@michaelfromyeg/loom-adapter-kit\";\nimport type {\n Badge,\n Lockfile,\n Marketplace,\n ParseIssue,\n Plugin,\n Scope,\n Target,\n} from \"@michaelfromyeg/loom-schema\";\nimport { type CompileResult, compile, staticPass } from \"./compile\";\nimport { resolveConfig, type SecretsResult } from \"./config\";\nimport { type DependencyRecord, resolveDependencies } from \"./deps\";\nimport { CompileError, type Diagnostic, type Diagnostics } from \"./diagnostics\";\nimport { type FetchedPlugin, loadMarketplaceDir, loadPluginDir } from \"./loader\";\nimport { buildLockfile, readLock, writeLock } from \"./lockfile\";\nimport { checkManagedPolicy, type ManagedPolicy } from \"./managed\";\nimport {\n buildToDir,\n installToScope,\n placeCatalog,\n placePluginArtifacts,\n planScopeArtifacts,\n type WrittenArtifact,\n} from \"./place\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { gitInfo, type ResolvedPlugin, resolvePluginRefFull } from \"./resolve\";\n\n/** Load a plugin and resolve its `depends` into a merged tree (spec §9.1 step 2). */\nfunction loadResolved(\n pluginDir: string,\n): Promise<{ fb: FetchedPlugin; dependencies: DependencyRecord[] }> {\n return resolveDependencies(loadOrThrow(pluginDir));\n}\n\nfunction issuesToDiagnostics(issues: ParseIssue[]): Diagnostic[] {\n return issues.map((i) => ({ severity: \"error\", where: i.path, message: i.message }));\n}\n\nfunction loadOrThrow(pluginDir: string) {\n const loaded = loadPluginDir(pluginDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load plugin in ${pluginDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n return loaded.value;\n}\n\nexport interface LintResult {\n id: string;\n plugin: Plugin;\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n}\n\n/** Load + statically validate a plugin without running any adapter (the valid badge). */\nexport function lint(pluginDir: string): LintResult {\n const fb = loadOrThrow(pluginDir);\n const pass = staticPass(fb);\n return { id: pass.id, plugin: fb.plugin, aliases: pass.aliases, diagnostics: pass.diagnostics };\n}\n\nexport interface BuildOptions {\n pluginDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n}\n\nexport interface BuildResult {\n result: CompileResult;\n written: WrittenArtifact[];\n}\n\n/** Compile a plugin and write its marketplace + plugin layout into `outDir` (no install). */\nexport async function build(opts: BuildOptions): Promise<BuildResult> {\n const { fb } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n const written = buildToDir(result, opts.outDir);\n return { result, written };\n}\n\nexport interface BuildMarketplaceOptions {\n marketplaceDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n}\n\nexport interface BuildMarketplaceResult {\n marketplace: Marketplace;\n plugins: CompileResult[];\n written: WrittenArtifact[];\n}\n\n/**\n * Compile a curated `marketplace.yaml` of many plugins: resolve and compile each\n * referenced plugin, place every plugin tree under `outDir/<target>/plugins/`,\n * and emit ONE native catalog per target listing them all (spec §6.2). This is\n * the company-marketplace workflow.\n */\nexport async function buildMarketplace(\n opts: BuildMarketplaceOptions,\n): Promise<BuildMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const compiled: Array<{ entry: Marketplace[\"plugins\"][number]; result: CompileResult }> = [];\n for (const entry of marketplace.plugins) {\n let fb: FetchedPlugin;\n try {\n fb = (await resolvePluginRefFull(entry.plugin, root)).fb;\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the compiled plugin.json too, so the\n // catalog and the plugin manifest agree (plugin.json wins at install time).\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n // Resolve the entry plugin's own dependencies before compiling it.\n const merged = (await resolveDependencies(fb)).fb;\n const result = compile(merged, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(`plugin \"${result.id}\" failed`, result.diagnostics.errors);\n }\n compiled.push({ entry, result });\n }\n\n const targets = opts.targets ?? opts.registry.targets;\n const written: WrittenArtifact[] = [];\n for (const target of targets) {\n const adapter = opts.registry.get(target);\n if (!adapter) continue;\n const base = join(opts.outDir, target);\n const entries: CatalogEntry[] = [];\n for (const { entry, result } of compiled) {\n const output = result.targets.find((t) => t.target === target);\n if (!output) continue;\n const p = result.fb.plugin;\n written.push(...placePluginArtifacts(output, base, p.name));\n entries.push({\n name: p.name,\n source: `./plugins/${p.name}`,\n ...(p.description ? { description: p.description } : {}),\n version: entry.version ?? p.version,\n ...(entry.category ? { category: entry.category } : {}),\n ...(entry.tags ? { tags: entry.tags } : {}),\n });\n }\n const resolved: ResolvedMarketplace = {\n name: marketplace.name,\n owner: marketplace.owner,\n ...(marketplace.description ? { description: marketplace.description } : {}),\n entries,\n };\n written.push(...placeCatalog(adapter, resolved, base));\n }\n\n return { marketplace, plugins: compiled.map((c) => c.result), written };\n}\n\nexport interface InstallOptions {\n pluginDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Piecemeal: install only these component leaf names (spec §9.2). */\n only?: string[];\n /** Managed-mode policy: namespace allowlist / required badges (spec §11). */\n managed?: ManagedPolicy;\n /** Badges known for this plugin (for managed `requireBadges`). */\n badges?: Badge[];\n /** Where to write `loom.lock` (default: the plugin dir). Eval points this at a scratch dir. */\n lockDir?: string;\n /** Inject the lockfile timestamp for deterministic tests. */\n now?: string;\n}\n\nexport interface InstallResult {\n result: CompileResult;\n lockfile: Lockfile;\n lockPath: string;\n /** Declared config resolution summary (never the values) -- spec §11. */\n secrets: SecretsResult;\n}\n\n/** Compile an already-resolved plugin, place it into the scope, and write its lock. */\nfunction installResolved(\n fb: FetchedPlugin,\n dependencies: DependencyRecord[],\n opts: {\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n only?: string[];\n managed?: ManagedPolicy;\n badges?: Badge[];\n ref: string;\n sha: string;\n /** Where to write `loom.lock` (default: the plugin's resolved root). */\n lockDir?: string;\n now?: string;\n },\n): InstallResult {\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n // Managed mode gates the install by namespace / required badges (spec §11).\n const blocked = checkManagedPolicy(opts.managed, {\n namespace: result.fb.plugin.owner.namespace,\n badges: opts.badges,\n });\n if (blocked) {\n throw new CompileError(\"install blocked by managed policy\", [\n { severity: \"error\", where: \"managed\", message: blocked },\n ]);\n }\n const artifacts = installToScope(result, opts.scope, opts.cwd);\n const secrets = resolveConfig(result.fb.plugin, opts.cwd);\n const lockfile = buildLockfile({\n result,\n artifacts,\n dependencies,\n ref: opts.ref,\n sha: opts.sha,\n generatedAt: opts.now ?? new Date().toISOString(),\n });\n const lockPath = writeLock(opts.lockDir ?? fb.root, lockfile);\n return { result, lockfile, lockPath, secrets };\n}\n\n/** Compile a plugin, place it into the scope's dirs, resolve config, write `loom.lock`. */\nexport async function install(opts: InstallOptions): Promise<InstallResult> {\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const { ref, sha } = await gitInfo(opts.pluginDir);\n return installResolved(fb, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref,\n sha,\n lockDir: opts.lockDir ?? opts.pluginDir,\n ...(opts.targets ? { targets: opts.targets } : {}),\n ...(opts.only ? { only: opts.only } : {}),\n ...(opts.managed ? { managed: opts.managed } : {}),\n ...(opts.badges ? { badges: opts.badges } : {}),\n ...(opts.now ? { now: opts.now } : {}),\n });\n}\n\nexport interface InstallMarketplaceOptions {\n marketplaceDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n managed?: ManagedPolicy;\n now?: string;\n}\n\nexport interface InstallMarketplaceResult {\n marketplace: Marketplace;\n /** One install result per marketplace plugin, in catalog order. */\n installs: InstallResult[];\n}\n\n/**\n * Install every plugin in a marketplace into the scope in one pass (the\n * company-marketplace install). Each plugin is resolved (local or remote),\n * compiled, placed, and gets its own `loom.lock` in its resolved root, mirroring\n * a single-plugin install at marketplace scale (spec invariant: same primitives).\n */\nexport async function installMarketplace(\n opts: InstallMarketplaceOptions,\n): Promise<InstallMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const installs: InstallResult[] = [];\n for (const entry of marketplace.plugins) {\n let resolved: ResolvedPlugin;\n try {\n resolved = await resolvePluginRefFull(entry.plugin, root);\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the installed plugin (catalog wins).\n let fb = resolved.fb;\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n const { fb: merged, dependencies } = await resolveDependencies(fb);\n installs.push(\n installResolved(merged, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref: resolved.ref,\n sha: resolved.sha,\n lockDir: fb.root,\n ...(opts.targets ? { targets: opts.targets } : {}),\n ...(opts.managed ? { managed: opts.managed } : {}),\n ...(opts.now ? { now: opts.now } : {}),\n }),\n );\n }\n return { marketplace, installs };\n}\n\nexport interface UninstallOptions {\n /** Where loom.lock lives (also the default place uninstall reads from). */\n pluginDir: string;\n lockDir?: string;\n}\n\nexport interface UninstallResult {\n removed: string[];\n}\n\n/** Prune now-empty directories upward from each removed file (best-effort). */\nfunction pruneEmptyDirs(paths: string[]): void {\n const dirs = new Set(paths.map((p) => dirname(p)));\n for (const start of dirs) {\n let d = start;\n while (d && d !== dirname(d)) {\n try {\n if (readdirSync(d).length > 0) break;\n rmSync(d, { recursive: true, force: true });\n } catch {\n break;\n }\n d = dirname(d);\n }\n }\n}\n\n/**\n * Remove everything `install` placed, using the paths recorded in `loom.lock`,\n * then delete the lockfile (spec §6.3). Errors are defined out of existence:\n * a missing artifact is simply skipped.\n */\nexport function uninstall(opts: UninstallOptions): UninstallResult {\n const dir = opts.lockDir ?? opts.pluginDir;\n const lock = readLock(dir);\n if (!lock) {\n throw new CompileError(\"nothing to uninstall\", [\n { severity: \"error\", where: \"loom.lock\", message: `no loom.lock found in ${dir}` },\n ]);\n }\n const removed: string[] = [];\n for (const a of lock.artifacts) {\n if (existsSync(a.path)) {\n rmSync(a.path, { force: true });\n removed.push(a.path);\n }\n }\n pruneEmptyDirs(removed);\n rmSync(join(dir, \"loom.lock\"), { force: true });\n return { removed };\n}\n\nexport interface UpdateResult {\n lockfile: Lockfile;\n lockPath: string;\n /** Artifacts whose content hash changed (or are new) since the prior lockfile. */\n changed: string[];\n}\n\n/**\n * Re-resolve refs, recompile, diff artifact content hashes against `loom.lock`,\n * and re-place ONLY changed artifacts (spec §5, §9.3). Content addressing makes\n * \"is there really a new version?\" exact: an unchanged artifact is never rewritten.\n */\nexport async function update(opts: InstallOptions): Promise<UpdateResult> {\n const prev = readLock(opts.pluginDir);\n const prevHash = new Map((prev?.artifacts ?? []).map((a) => [a.path, a.hash]));\n\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n\n const planned = planScopeArtifacts(result, opts.scope, opts.cwd);\n const changed: string[] = [];\n for (const { record, contents } of planned) {\n if (prevHash.get(record.path) === record.hash) continue; // unchanged -> never rewrite\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n changed.push(record.path);\n }\n\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const lockfile = buildLockfile({\n result,\n artifacts: planned.map((p) => p.record),\n dependencies,\n ref,\n sha,\n generatedAt: opts.now ?? new Date().toISOString(),\n });\n const lockPath = writeLock(opts.pluginDir, lockfile);\n return { lockfile, lockPath, changed };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { HarnessAdapter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport { stringifyDocument } from \"@michaelfromyeg/loom-schema\";\n\nexport interface ImportPluginOptions {\n /** Directory holding an existing native plugin or marketplace. */\n dir: string;\n adapter: HarnessAdapter;\n /** Where to write the generated Loom plugin/marketplace. */\n outDir: string;\n /** Reverse-DNS namespace to assign (native assets lack one). */\n namespace?: string;\n}\n\nexport interface ImportOutput {\n kind: \"plugin\" | \"marketplace\";\n name: string;\n outDir: string;\n manifestPath: string;\n fileCount: number;\n id?: string;\n}\n\n/**\n * Reverse-compile an existing native plugin/marketplace into the Loom model and\n * write it to `outDir`, ready for `loom build` to cross-compile to every other\n * harness. This is \"federate, don't wall off\" applied to assets you already have.\n */\nexport function importNativePlugin(opts: ImportPluginOptions): ImportOutput {\n if (!opts.adapter.importNative) {\n throw new Error(`adapter \"${opts.adapter.target}\" does not support import`);\n }\n const result = opts.adapter.importNative(opts.dir, { namespace: opts.namespace });\n if (!result) {\n throw new Error(`no ${opts.adapter.target} plugin or marketplace found in ${opts.dir}`);\n }\n mkdirSync(opts.outDir, { recursive: true });\n\n if (result.kind === \"marketplace\") {\n const manifestPath = join(opts.outDir, \"marketplace.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.marketplace));\n return {\n kind: \"marketplace\",\n name: result.marketplace.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: 0,\n };\n }\n\n const manifestPath = join(opts.outDir, \"loom.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.plugin));\n for (const f of result.files) {\n const abs = join(opts.outDir, f.relPath);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(\n abs,\n typeof f.contents === \"string\" ? Buffer.from(f.contents, \"utf8\") : f.contents,\n );\n }\n return {\n kind: \"plugin\",\n name: result.plugin.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: result.files.length,\n id: `${result.plugin.owner.namespace}/${result.plugin.name}`,\n };\n}\n","import type { HarnessAdapter } from \"@michaelfromyeg/loom-adapter-kit\";\nimport type { Target } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * Adapters registered by Target (spec §7). Core depends only on the adapter-kit\n * interface; the CLI (or an embedding app) registers concrete adapters, keeping\n * the dependency direction one-way and letting community adapters slot in.\n */\nexport class AdapterRegistry {\n private readonly adapters = new Map<Target, HarnessAdapter>();\n\n register(adapter: HarnessAdapter): this {\n this.adapters.set(adapter.target, adapter);\n return this;\n }\n\n get(target: Target): HarnessAdapter | undefined {\n return this.adapters.get(target);\n }\n\n has(target: Target): boolean {\n return this.adapters.has(target);\n }\n\n get targets(): Target[] {\n return [...this.adapters.keys()];\n }\n}\n","import { createHash, generateKeyPairSync, type KeyObject, sign, verify } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { Lockfile } from \"@michaelfromyeg/loom-schema\";\n\n/**\n * A digest over the lockfile's artifact set (component + target + content hash).\n * Signing this binds a signature to exactly the compiled artifacts (spec §10\n * `signed` badge). Sorting makes it order-independent and deterministic.\n */\nexport function artifactDigest(lock: Lockfile): Buffer {\n const lines = lock.artifacts.map((a) => `${a.component}\\t${a.target}\\t${a.hash}`).sort();\n return createHash(\"sha256\").update(lines.join(\"\\n\")).digest();\n}\n\n/** Ed25519 keypair. Production would use sigstore/cosign keyless signing instead. */\nexport function generateSigningKeys(): { publicKey: KeyObject; privateKey: KeyObject } {\n return generateKeyPairSync(\"ed25519\");\n}\n\nexport function signLock(lock: Lockfile, privateKey: KeyObject): string {\n return sign(null, artifactDigest(lock), privateKey).toString(\"base64\");\n}\n\nexport function verifyLockSignature(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): boolean {\n try {\n return verify(null, artifactDigest(lock), publicKey, Buffer.from(signature, \"base64\"));\n } catch {\n return false;\n }\n}\n\nexport interface VerifyResult {\n signatureValid: boolean;\n /** Recorded artifact paths whose on-disk bytes no longer match the lock hash. */\n tampered: string[];\n}\n\n/**\n * Verify a signature AND that every recorded artifact on disk still matches its\n * lockfile hash. The `signed` badge requires both: a valid signature over the\n * digest and no tampered artifacts.\n */\nexport function verifyArtifacts(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): VerifyResult {\n const tampered: string[] = [];\n for (const a of lock.artifacts) {\n if (!existsSync(a.path)) {\n tampered.push(a.path);\n continue;\n }\n const actual = createHash(\"sha256\").update(readFileSync(a.path)).digest(\"hex\");\n if (actual !== a.hash) tampered.push(a.path);\n }\n return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michaelfromyeg/loom-core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Loom compile pipeline: resolver, namespacing, placement, lockfile, adapter registry.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,8 +18,8 @@
18
18
  "dependencies": {
19
19
  "execa": "^9.5.2",
20
20
  "semver": "^7.6.3",
21
- "@michaelfromyeg/loom-adapter-kit": "0.1.0",
22
- "@michaelfromyeg/loom-schema": "0.1.0"
21
+ "@michaelfromyeg/loom-adapter-kit": "0.2.0",
22
+ "@michaelfromyeg/loom-schema": "0.2.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/semver": "^7.5.8"