@michaelfromyeg/weft-adapter-codex 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -276,7 +276,16 @@ var codexAdapter = {
276
276
  // Format verified working from Codex CLI v0.121 (the marketplace release) through
277
277
  // v0.139 (manual install test: marketplace add + plugin install). Bump the ceiling
278
278
  // when re-verified against a newer line.
279
- range: ">=0.121.0 <0.140.0"
279
+ range: ">=0.121.0 <0.140.0",
280
+ marketplace: {
281
+ cli: {
282
+ bin: "codex",
283
+ add: (source) => ["plugin", "marketplace", "add", source],
284
+ remove: (name) => ["plugin", "marketplace", "remove", name],
285
+ // Codex uses `plugin add` (not `install`).
286
+ install: (plugin, marketplace) => ["plugin", "add", `${plugin}@${marketplace}`]
287
+ }
288
+ }
280
289
  },
281
290
  detect(scope, cwd) {
282
291
  const root = scope === "user" ? join(homedir(), ".codex") : join(cwd, ".codex");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/import.ts","../src/mcp.ts","../src/index.ts"],"names":["author","basename","json","artifact","join"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n artifact,\n type CompiledArtifact,\n type ImportedMarketplace,\n type ImportedPlugin,\n type ImportOptions,\n type ImportResult,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { Component, Marketplace, Plugin } from \"@michaelfromyeg/weft-schema\";\n\nconst MCP_SCHEMA = \"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\";\nconst json = (o: unknown): string => `${JSON.stringify(o, null, 2)}\\n`;\n\nfunction readJson(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\n/** Subdirectories of `dir` that contain `marker`. */\nfunction subdirsWith(dir: string, marker: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n return readdirSync(dir)\n .filter((n) => statSync(join(dir, n)).isDirectory() && existsSync(join(dir, n, marker)))\n .sort();\n}\n\nfunction filesWithExt(dir: string, ext: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n return readdirSync(dir)\n .filter((n) => n.endsWith(ext) && statSync(join(dir, n)).isFile())\n .sort();\n}\n\nfunction copyTree(\n srcDir: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n const out: CompiledArtifact[] = [];\n const walk = (d: string) => {\n for (const n of readdirSync(d).sort()) {\n const abs = join(d, n);\n if (statSync(abs).isDirectory()) walk(abs);\n else\n out.push(artifact(`${destPrefix}/${relative(srcDir, abs)}`, readFileSync(abs), { kind }));\n }\n };\n walk(srcDir);\n return out;\n}\n\n/** A Weft source string from a Codex marketplace entry `source` object. */\nfunction sourceToString(source: unknown): string {\n if (typeof source === \"string\") return source;\n const s = source as Record<string, unknown>;\n switch (s?.source) {\n case \"local\":\n return String(s.path ?? \"\");\n case \"git-subdir\": {\n const url = String(s.url ?? \"\");\n const gh = url.match(/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (gh) {\n const sub = typeof s.path === \"string\" ? s.path.replace(/^\\.\\//, \"\") : \"\";\n const ref = typeof s.ref === \"string\" ? s.ref : \"\";\n return `github:${gh[1]}/${gh[2]}${sub ? `/${sub}` : \"\"}${ref ? `#${ref}` : \"\"}`;\n }\n return url;\n }\n default:\n return String(source);\n }\n}\n\ninterface McpServerCfg {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n type?: string;\n url?: string;\n}\n\n/** Reconstruct an MCP-standard server.json from a Codex run config (lossy but functional). */\nfunction synthesizeServerJson(namespace: string, name: string, cfg: McpServerCfg): unknown {\n const base = {\n $schema: MCP_SCHEMA,\n name: `${namespace}/${name}`,\n description: `Imported ${name} MCP server.`,\n version: \"0.0.0\",\n };\n if (cfg.url) return { ...base, remotes: [{ type: cfg.type ?? \"streamable-http\", url: cfg.url }] };\n if (cfg.command === \"npx\" && Array.isArray(cfg.args)) {\n const ident = cfg.args.find((a) => a !== \"-y\" && !a.startsWith(\"-\"));\n if (ident) {\n const at = ident.lastIndexOf(\"@\");\n const id = at > 0 ? ident.slice(0, at) : ident;\n const version = at > 0 ? ident.slice(at + 1) : undefined;\n return {\n ...base,\n packages: [\n {\n registryType: \"npm\",\n identifier: id,\n ...(version ? { version } : {}),\n transport: { type: \"stdio\" },\n },\n ],\n };\n }\n }\n return {\n ...base,\n ...(cfg.command ? { command: cfg.command } : {}),\n ...(cfg.args ? { args: cfg.args } : {}),\n ...(cfg.env ? { env: cfg.env } : {}),\n };\n}\n\n/**\n * Read a plugin's `.mcp.json` server map. Accepts both the direct\n * `{ \"<name>\": { command, args, ... } }` form Weft emits and the wrapped\n * `{ \"mcp_servers\": { ... } }` form Codex also documents.\n */\nfunction readMcpJson(path: string): Record<string, McpServerCfg> {\n const parsed = readJson(path);\n if (!parsed) return {};\n const map =\n parsed.mcp_servers && typeof parsed.mcp_servers === \"object\"\n ? (parsed.mcp_servers as Record<string, unknown>)\n : parsed;\n const servers: Record<string, McpServerCfg> = {};\n for (const [name, cfg] of Object.entries(map)) {\n if (cfg && typeof cfg === \"object\") servers[name] = cfg as McpServerCfg;\n }\n return servers;\n}\n\nfunction importPlugin(\n dir: string,\n manifest: Record<string, unknown> | null,\n name: string,\n namespace: string,\n): ImportedPlugin {\n const components: Component[] = [];\n const files: CompiledArtifact[] = [];\n\n // Skills: each skills/<name> dir with a SKILL.md. The per-skill\n // agents/openai.yaml sidecar inside is harness metadata, not a component; it\n // is carried along verbatim as a skill asset but never wired as an agent.\n for (const sk of subdirsWith(join(dir, \"skills\"), \"SKILL.md\")) {\n components.push({ skill: `skills/${sk}` });\n files.push(...copyTree(join(dir, \"skills\", sk), `skills/${sk}`, \"skill\"));\n }\n // Codex subagents are TOML files at agents/<file>.toml.\n for (const f of filesWithExt(join(dir, \"agents\"), \".toml\")) {\n components.push({ agent: `agents/${f}` });\n files.push(artifact(`agents/${f}`, readFileSync(join(dir, \"agents\", f)), { kind: \"agent\" }));\n }\n\n // MCP: prefer the verbatim server.json copies a Weft build leaves under mcp/.\n // Only when there is no mcp/ dir do we reconstruct from the .mcp.json server map.\n const mcpDir = join(dir, \"mcp\");\n if (existsSync(mcpDir) && statSync(mcpDir).isDirectory()) {\n for (const leaf of subdirsWith(mcpDir, \"server.json\")) {\n components.push({ mcp: `mcp/${leaf}` });\n files.push(\n artifact(`mcp/${leaf}/server.json`, readFileSync(join(mcpDir, leaf, \"server.json\")), {\n kind: \"mcp\",\n }),\n );\n }\n } else if (existsSync(join(dir, \".mcp.json\"))) {\n const servers = readMcpJson(join(dir, \".mcp.json\"));\n for (const [serverName, cfg] of Object.entries(servers)) {\n components.push({ mcp: `mcp/${serverName}` });\n files.push(\n artifact(\n `mcp/${serverName}/server.json`,\n json(synthesizeServerJson(namespace, serverName, cfg)),\n { kind: \"mcp\" },\n ),\n );\n }\n }\n\n const author = manifest?.author as { name?: string; email?: string } | undefined;\n const plugin: Plugin = {\n name,\n version: String(manifest?.version ?? \"0.1.0\"),\n owner: {\n name: author?.name ?? name,\n namespace,\n ...(author?.email ? { email: author.email } : {}),\n },\n ...(manifest?.description ? { description: String(manifest.description) } : {}),\n components,\n };\n return { kind: \"plugin\", plugin, files };\n}\n\nfunction importMarketplace(\n manifest: Record<string, unknown>,\n namespace: string,\n): ImportedMarketplace {\n // The Codex catalog has no owner; it carries `interface.displayName` instead.\n const iface = manifest.interface as { displayName?: string } | undefined;\n const ownerName = iface?.displayName ?? String(manifest.name);\n const plugins = ((manifest.plugins as Record<string, unknown>[]) ?? []).map((p) => ({\n plugin: sourceToString(p.source),\n ...(p.category ? { category: String(p.category) } : {}),\n }));\n const marketplace: Marketplace = {\n name: String(manifest.name),\n owner: { name: ownerName, namespace },\n plugins,\n };\n return { kind: \"marketplace\", marketplace };\n}\n\n/** Reverse-compile a Codex plugin or marketplace dir into the Weft model. */\nexport function importCodex(dir: string, opts?: ImportOptions): ImportResult | null {\n const namespace = opts?.namespace ?? \"com.imported\";\n\n // Native Codex marketplace catalog (shared `.agents` tree).\n const marketplace = readJson(join(dir, \".agents\", \"plugins\", \"marketplace.json\"));\n if (marketplace) return importMarketplace(marketplace, namespace);\n\n const manifest = readJson(join(dir, \".codex-plugin\", \"plugin.json\"));\n const basename = dir.replace(/\\/+$/, \"\").split(\"/\").pop() || \"imported-plugin\";\n const name = typeof manifest?.name === \"string\" ? manifest.name : basename;\n\n // A plugin is anything with the Codex component layout (manifest is best-effort).\n if (manifest || existsSync(join(dir, \"skills\")) || existsSync(join(dir, \"agents\"))) {\n return importPlugin(dir, manifest, name, namespace);\n }\n return null;\n}\n","/**\n * Derives a runnable Codex MCP server config from an MCP-standard `server.json`\n * (the registry's ServerJSON shape: packages[] / remotes[] / a bare command).\n * The result is one entry in a plugin's `.mcp.json` server map.\n *\n * Codex infers the transport from the keys present (`command` => stdio, `url` =>\n * http); there is NO `transport` key (harness-research.md, Codex MCP section).\n * Stored standards stay verbatim in the plugin; this is the tool-specific view.\n */\n\nexport interface McpServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n}\n\ninterface McpPackage {\n registryType?: string;\n identifier?: string;\n version?: string;\n transport?: { type?: string };\n}\ninterface McpRemote {\n type?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n}\ninterface ServerJson {\n name?: string;\n packages?: McpPackage[];\n remotes?: McpRemote[];\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/** The short server key Codex uses (the part after the reverse-DNS namespace). */\nexport function mcpServerName(server: ServerJson): string {\n const raw = server.name ?? \"server\";\n const afterSlash = raw.includes(\"/\") ? raw.slice(raw.lastIndexOf(\"/\") + 1) : raw;\n return afterSlash || \"server\";\n}\n\nconst RUNNERS: Record<string, string> = { npm: \"npx\", pypi: \"uvx\" };\n\nexport function mcpRunConfig(server: ServerJson): McpServerConfig {\n const pkg = server.packages?.[0];\n if (pkg?.identifier) {\n if (pkg.registryType === \"oci\") {\n return { command: \"docker\", args: [\"run\", \"-i\", \"--rm\", pkg.identifier] };\n }\n const runner = RUNNERS[pkg.registryType ?? \"npm\"] ?? \"npx\";\n const ident = pkg.version ? `${pkg.identifier}@${pkg.version}` : pkg.identifier;\n const args = runner === \"npx\" ? [\"-y\", ident] : [ident];\n return { command: runner, args };\n }\n\n const remote = server.remotes?.[0];\n if (remote?.url) {\n // Codex http servers carry only `url` here; headers/bearer-token live under\n // documented sub-keys we don't synthesize without provenance.\n return { url: remote.url };\n }\n\n if (server.command) {\n const config: McpServerConfig = { command: server.command };\n if (server.args) config.args = server.args;\n if (server.env) config.env = server.env;\n return config;\n }\n\n return { command: \"echo\", args: [\"server.json declares no runnable transport\"] };\n}\n","import { homedir } from \"node:os\";\nimport { basename, extname, join } from \"node:path\";\nimport {\n artifact,\n type CompiledArtifact,\n type HarnessAdapter,\n type InstallPaths,\n type PluginCtx,\n parseFrontmatter,\n type ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport {\n type Component,\n kindOf,\n leafNameOf,\n type Plugin,\n refOf,\n type Scope,\n} from \"@michaelfromyeg/weft-schema\";\nimport { importCodex } from \"./import\";\nimport { type McpServerConfig, mcpRunConfig, mcpServerName } from \"./mcp\";\n\n/** Bump on any change to Codex's plugin/marketplace/sidecar shape (spec §5). */\nconst TARGET_SCHEMA = \"codex-plugin/0.121\";\n\nconst json = (o: unknown): string => `${JSON.stringify(o, null, 2)}\\n`;\n\ninterface CodexAuthor {\n name: string;\n email?: string;\n}\nfunction author(name: string, email?: string): CodexAuthor {\n return email ? { name, email } : { name };\n}\n\ninterface CodexPluginManifest {\n name: string;\n version?: string;\n description?: string;\n author?: CodexAuthor;\n /** Path to the skills dir, relative to the plugin root. */\n skills?: string;\n /** Path to the MCP server map (.mcp.json), relative to the plugin root. */\n mcpServers?: string;\n interface?: { displayName: string; shortDescription?: string };\n}\n\ninterface CodexLocalSource {\n source: \"local\";\n path: string;\n}\ninterface CodexGitSource {\n source: \"git-subdir\";\n url: string;\n path?: string;\n ref?: string;\n}\ninterface CodexCatalogPlugin {\n name: string;\n source: CodexLocalSource | CodexGitSource;\n policy: { installation: string; authentication: string };\n category: string;\n}\ninterface CodexMarketplace {\n name: string;\n interface: { displayName: string };\n plugins: CodexCatalogPlugin[];\n}\n\n/**\n * Map a resolved Weft entry source to Codex's discriminated source object. Local\n * relative paths become `{source:\"local\"}`; github/git URLs become\n * `{source:\"git-subdir\"}`. Codex resolves `path` relative to the repo root.\n */\nfunction toCodexSource(source: string): CodexLocalSource | CodexGitSource {\n const gh = source.match(/^github:([^/#]+)\\/([^#]+?)(?:#(.+))?$/);\n if (gh) {\n const [, owner, repoAndSub, ref] = gh;\n const slash = repoAndSub.indexOf(\"/\");\n const repo = slash >= 0 ? repoAndSub.slice(0, slash) : repoAndSub;\n const sub = slash >= 0 ? repoAndSub.slice(slash + 1) : \"\";\n return {\n source: \"git-subdir\",\n url: `https://github.com/${owner}/${repo}.git`,\n ...(sub ? { path: `./${sub}` } : {}),\n ...(ref ? { ref } : {}),\n };\n }\n if (/^https?:\\/\\//.test(source) || source.endsWith(\".git\")) {\n return { source: \"git-subdir\", url: source };\n }\n return { source: \"local\", path: source.startsWith(\"./\") ? source : `./${source}` };\n}\n\n/** Copy every file under a plugin dir into `destPrefix/`, preserving structure. */\nfunction copyDir(\n ctx: PluginCtx,\n ref: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n return ctx.list(ref).map((file) => {\n const within = file.startsWith(`${ref}/`) ? file.slice(ref.length + 1) : basename(file);\n return artifact(`${destPrefix}/${within}`, ctx.read(file), { kind });\n });\n}\n\n/** Place a component that may be a single Markdown file or a directory. */\nfunction copyFileOrDir(\n ctx: PluginCtx,\n ref: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n const files = ctx.list(ref);\n if (files.length === 0) {\n return [artifact(`${destPrefix}${extname(ref) || \".md\"}`, ctx.read(ref), { kind })];\n }\n return copyDir(ctx, ref, destPrefix, kind);\n}\n\n/**\n * Read a skill's SKILL.md frontmatter so the sidecar can mirror its identity.\n * Returns empty data when there is no SKILL.md or no frontmatter block.\n */\nfunction skillFrontmatter(ctx: PluginCtx, ref: string): Record<string, unknown> {\n try {\n const md = ctx.read(`${ref}/SKILL.md`).toString(\"utf8\");\n return parseFrontmatter(md).data;\n } catch {\n return {};\n }\n}\n\n/**\n * Build the per-skill `agents/openai.yaml` sidecar. Shape is CONFIRMED in\n * harness-research.md: `interface.{display_name,short_description}`,\n * `policy.allow_implicit_invocation`, `dependencies.tools`.\n */\nfunction skillSidecar(name: string, description: string): string {\n const yamlString = (v: string): string => JSON.stringify(v);\n return [\n \"interface:\",\n ` display_name: ${yamlString(name)}`,\n ` short_description: ${yamlString(description)}`,\n \"policy:\",\n \" allow_implicit_invocation: true\",\n \"dependencies:\",\n \" tools: []\",\n \"\",\n ].join(\"\\n\");\n}\n\nconst codexAdapter: HarnessAdapter = {\n target: \"codex\",\n version: \"0.1.0\",\n targetSchema: TARGET_SCHEMA,\n harness: {\n name: \"Codex CLI\",\n versionCommand: \"codex --version\",\n // Format verified working from Codex CLI v0.121 (the marketplace release) through\n // v0.139 (manual install test: marketplace add + plugin install). Bump the ceiling\n // when re-verified against a newer line.\n range: \">=0.121.0 <0.140.0\",\n },\n\n detect(scope: Scope, cwd: string): InstallPaths {\n const root = scope === \"user\" ? join(homedir(), \".codex\") : join(cwd, \".codex\");\n // User and project skills live on the SHARED `.agents/skills` path, NOT under\n // the `.codex` root (harness-research.md, Codex Skills section).\n const skills =\n scope === \"user\" ? join(homedir(), \".agents\", \"skills\") : join(cwd, \".agents\", \"skills\");\n return {\n root,\n plugins: join(root, \"plugins\"),\n skills,\n // config.toml (MCP servers) lives at the `.codex` root.\n mcp: root,\n agents: join(root, \"agents\"),\n // TODO(verify): Codex documents no dedicated commands dir; best-effort under root.\n commands: join(root, \"commands\"),\n // TODO(verify): Codex plugins reference hooks via a `hooks/hooks.json` manifest\n // path; this install-scope dir placement is best-effort and not wired to it.\n hooks: join(root, \"hooks\"),\n // Native marketplace catalog lives at `.agents/plugins/marketplace.json`\n // (shared `.agents` tree), NOT under the `.codex` root.\n catalog:\n scope === \"user\" ? join(homedir(), \".agents\", \"plugins\") : join(cwd, \".agents\", \"plugins\"),\n };\n },\n\n transform(component: Component, ctx: PluginCtx): CompiledArtifact[] {\n const ref = refOf(component);\n const leaf = leafNameOf(component);\n switch (kindOf(component)) {\n case \"skill\": {\n const files = copyDir(ctx, ref, `skills/${leaf}`, \"skill\");\n const fm = skillFrontmatter(ctx, ref);\n const displayName = typeof fm.name === \"string\" ? fm.name : leaf;\n const shortDescription = typeof fm.description === \"string\" ? fm.description : \"\";\n files.push(\n artifact(\n `skills/${leaf}/agents/openai.yaml`,\n skillSidecar(displayName, shortDescription),\n {\n kind: \"skill\",\n },\n ),\n );\n return files;\n }\n case \"agent\": {\n // Codex subagents are TOML files at agents/<leaf>.toml.\n // TODO(verify): exact subagent field set; documented fields are name,\n // description, developer_instructions (+ optional model/sandbox_mode/etc).\n const md = ctx.read(ref).toString(\"utf8\");\n const { data, body } = parseFrontmatter(md);\n const name = typeof data.name === \"string\" ? data.name : leaf;\n const description = typeof data.description === \"string\" ? data.description : \"\";\n return [\n artifact(`agents/${leaf}.toml`, renderAgentToml(name, description, body), {\n kind: \"agent\",\n }),\n ];\n }\n case \"command\":\n // TODO(verify): no documented Codex commands dir; placed best-effort.\n return copyFileOrDir(ctx, ref, `commands/${leaf}`, \"command\");\n case \"hook\":\n // TODO(verify): Codex declares hooks via a `hooks/hooks.json` manifest; this\n // per-hook placement is best-effort and not yet wired into that file.\n return copyFileOrDir(ctx, ref, `hooks/${leaf}`, \"hook\");\n case \"mcp\":\n // Verbatim provenance copy; the runnable config goes into .mcp.json.\n return copyDir(ctx, ref, `mcp/${leaf}`, \"mcp\");\n case \"passthrough\":\n // TODO(verify): see the hook case; placed best-effort, disabled.\n return [\n artifact(`hooks/${basename(ref)}`, ctx.read(ref), { kind: \"hook\", executable: true }),\n ];\n default:\n return [];\n }\n },\n\n emitManifest(plugin: Plugin, ctx: PluginCtx): CompiledArtifact[] {\n const artifacts: CompiledArtifact[] = [];\n\n const mcpServers: Record<string, McpServerConfig> = {};\n for (const c of plugin.components) {\n if (kindOf(c) !== \"mcp\") continue;\n try {\n const server = JSON.parse(ctx.read(`${refOf(c)}/server.json`).toString(\"utf8\"));\n mcpServers[mcpServerName(server)] = mcpRunConfig(server);\n } catch {\n // validate.ts already surfaced an error for an unparsable server.json.\n }\n }\n\n const hasSkills = plugin.components.some((c) => kindOf(c) === \"skill\");\n const hasMcp = Object.keys(mcpServers).length > 0;\n\n const manifest: CodexPluginManifest = {\n name: plugin.name,\n version: plugin.version,\n author: author(plugin.owner.name, plugin.owner.email),\n };\n if (plugin.description) manifest.description = plugin.description;\n // Auto-discovery covers the default layout; the explicit paths let Codex find\n // skills/MCP without scanning and make the bundle self-describing.\n if (hasSkills) manifest.skills = \"./skills/\";\n if (hasMcp) manifest.mcpServers = \"./.mcp.json\";\n manifest.interface = plugin.description\n ? { displayName: plugin.name, shortDescription: plugin.description }\n : { displayName: plugin.name };\n\n // The manifest MUST live under `.codex-plugin/` (Codex plugin spec, v0.121).\n artifacts.push(artifact(\".codex-plugin/plugin.json\", json(manifest), { kind: \"manifest\" }));\n // MCP servers go in a sibling `.mcp.json` (a direct name->config map) that the\n // manifest references -- Codex no longer reads a plugin-local config.toml.\n if (hasMcp) artifacts.push(artifact(\".mcp.json\", json(mcpServers), { kind: \"manifest\" }));\n\n return artifacts;\n },\n\n emitCatalog(marketplace: ResolvedMarketplace): CompiledArtifact[] {\n const plugins: CodexCatalogPlugin[] = marketplace.entries.map((entry) => ({\n name: entry.name,\n source: toCodexSource(entry.source),\n // Codex requires a policy; these defaults match its own example marketplaces.\n policy: { installation: \"AVAILABLE\", authentication: \"ON_INSTALL\" },\n // Codex requires a category; fall back to a valid default when unset.\n category: entry.category ?? \"Productivity\",\n }));\n\n const catalog: CodexMarketplace = {\n name: marketplace.name,\n interface: { displayName: marketplace.name },\n plugins,\n };\n\n return [artifact(\".agents/plugins/marketplace.json\", json(catalog), { kind: \"catalog\" })];\n },\n\n importNative: importCodex,\n};\n\nfunction tomlString(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n/** Render a Codex subagent TOML. Multi-line instructions use a basic string. */\nfunction renderAgentToml(name: string, description: string, instructions: string): string {\n const lines = [`name = ${tomlString(name)}`];\n if (description) lines.push(`description = ${tomlString(description)}`);\n const body = instructions.trim();\n if (body) {\n const escaped = body.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"');\n lines.push(`developer_instructions = \"\"\"\\n${escaped}\\n\"\"\"`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport default codexAdapter;\n"]}
1
+ {"version":3,"sources":["../src/import.ts","../src/mcp.ts","../src/index.ts"],"names":["author","basename","json","artifact","join"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n artifact,\n type CompiledArtifact,\n type ImportedMarketplace,\n type ImportedPlugin,\n type ImportOptions,\n type ImportResult,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { Component, Marketplace, Plugin } from \"@michaelfromyeg/weft-schema\";\n\nconst MCP_SCHEMA = \"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\";\nconst json = (o: unknown): string => `${JSON.stringify(o, null, 2)}\\n`;\n\nfunction readJson(path: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n } catch {\n return null;\n }\n}\n\n/** Subdirectories of `dir` that contain `marker`. */\nfunction subdirsWith(dir: string, marker: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n return readdirSync(dir)\n .filter((n) => statSync(join(dir, n)).isDirectory() && existsSync(join(dir, n, marker)))\n .sort();\n}\n\nfunction filesWithExt(dir: string, ext: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n return readdirSync(dir)\n .filter((n) => n.endsWith(ext) && statSync(join(dir, n)).isFile())\n .sort();\n}\n\nfunction copyTree(\n srcDir: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n const out: CompiledArtifact[] = [];\n const walk = (d: string) => {\n for (const n of readdirSync(d).sort()) {\n const abs = join(d, n);\n if (statSync(abs).isDirectory()) walk(abs);\n else\n out.push(artifact(`${destPrefix}/${relative(srcDir, abs)}`, readFileSync(abs), { kind }));\n }\n };\n walk(srcDir);\n return out;\n}\n\n/** A Weft source string from a Codex marketplace entry `source` object. */\nfunction sourceToString(source: unknown): string {\n if (typeof source === \"string\") return source;\n const s = source as Record<string, unknown>;\n switch (s?.source) {\n case \"local\":\n return String(s.path ?? \"\");\n case \"git-subdir\": {\n const url = String(s.url ?? \"\");\n const gh = url.match(/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/);\n if (gh) {\n const sub = typeof s.path === \"string\" ? s.path.replace(/^\\.\\//, \"\") : \"\";\n const ref = typeof s.ref === \"string\" ? s.ref : \"\";\n return `github:${gh[1]}/${gh[2]}${sub ? `/${sub}` : \"\"}${ref ? `#${ref}` : \"\"}`;\n }\n return url;\n }\n default:\n return String(source);\n }\n}\n\ninterface McpServerCfg {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n type?: string;\n url?: string;\n}\n\n/** Reconstruct an MCP-standard server.json from a Codex run config (lossy but functional). */\nfunction synthesizeServerJson(namespace: string, name: string, cfg: McpServerCfg): unknown {\n const base = {\n $schema: MCP_SCHEMA,\n name: `${namespace}/${name}`,\n description: `Imported ${name} MCP server.`,\n version: \"0.0.0\",\n };\n if (cfg.url) return { ...base, remotes: [{ type: cfg.type ?? \"streamable-http\", url: cfg.url }] };\n if (cfg.command === \"npx\" && Array.isArray(cfg.args)) {\n const ident = cfg.args.find((a) => a !== \"-y\" && !a.startsWith(\"-\"));\n if (ident) {\n const at = ident.lastIndexOf(\"@\");\n const id = at > 0 ? ident.slice(0, at) : ident;\n const version = at > 0 ? ident.slice(at + 1) : undefined;\n return {\n ...base,\n packages: [\n {\n registryType: \"npm\",\n identifier: id,\n ...(version ? { version } : {}),\n transport: { type: \"stdio\" },\n },\n ],\n };\n }\n }\n return {\n ...base,\n ...(cfg.command ? { command: cfg.command } : {}),\n ...(cfg.args ? { args: cfg.args } : {}),\n ...(cfg.env ? { env: cfg.env } : {}),\n };\n}\n\n/**\n * Read a plugin's `.mcp.json` server map. Accepts both the direct\n * `{ \"<name>\": { command, args, ... } }` form Weft emits and the wrapped\n * `{ \"mcp_servers\": { ... } }` form Codex also documents.\n */\nfunction readMcpJson(path: string): Record<string, McpServerCfg> {\n const parsed = readJson(path);\n if (!parsed) return {};\n const map =\n parsed.mcp_servers && typeof parsed.mcp_servers === \"object\"\n ? (parsed.mcp_servers as Record<string, unknown>)\n : parsed;\n const servers: Record<string, McpServerCfg> = {};\n for (const [name, cfg] of Object.entries(map)) {\n if (cfg && typeof cfg === \"object\") servers[name] = cfg as McpServerCfg;\n }\n return servers;\n}\n\nfunction importPlugin(\n dir: string,\n manifest: Record<string, unknown> | null,\n name: string,\n namespace: string,\n): ImportedPlugin {\n const components: Component[] = [];\n const files: CompiledArtifact[] = [];\n\n // Skills: each skills/<name> dir with a SKILL.md. The per-skill\n // agents/openai.yaml sidecar inside is harness metadata, not a component; it\n // is carried along verbatim as a skill asset but never wired as an agent.\n for (const sk of subdirsWith(join(dir, \"skills\"), \"SKILL.md\")) {\n components.push({ skill: `skills/${sk}` });\n files.push(...copyTree(join(dir, \"skills\", sk), `skills/${sk}`, \"skill\"));\n }\n // Codex subagents are TOML files at agents/<file>.toml.\n for (const f of filesWithExt(join(dir, \"agents\"), \".toml\")) {\n components.push({ agent: `agents/${f}` });\n files.push(artifact(`agents/${f}`, readFileSync(join(dir, \"agents\", f)), { kind: \"agent\" }));\n }\n\n // MCP: prefer the verbatim server.json copies a Weft build leaves under mcp/.\n // Only when there is no mcp/ dir do we reconstruct from the .mcp.json server map.\n const mcpDir = join(dir, \"mcp\");\n if (existsSync(mcpDir) && statSync(mcpDir).isDirectory()) {\n for (const leaf of subdirsWith(mcpDir, \"server.json\")) {\n components.push({ mcp: `mcp/${leaf}` });\n files.push(\n artifact(`mcp/${leaf}/server.json`, readFileSync(join(mcpDir, leaf, \"server.json\")), {\n kind: \"mcp\",\n }),\n );\n }\n } else if (existsSync(join(dir, \".mcp.json\"))) {\n const servers = readMcpJson(join(dir, \".mcp.json\"));\n for (const [serverName, cfg] of Object.entries(servers)) {\n components.push({ mcp: `mcp/${serverName}` });\n files.push(\n artifact(\n `mcp/${serverName}/server.json`,\n json(synthesizeServerJson(namespace, serverName, cfg)),\n { kind: \"mcp\" },\n ),\n );\n }\n }\n\n const author = manifest?.author as { name?: string; email?: string } | undefined;\n const plugin: Plugin = {\n name,\n version: String(manifest?.version ?? \"0.1.0\"),\n owner: {\n name: author?.name ?? name,\n namespace,\n ...(author?.email ? { email: author.email } : {}),\n },\n ...(manifest?.description ? { description: String(manifest.description) } : {}),\n components,\n };\n return { kind: \"plugin\", plugin, files };\n}\n\nfunction importMarketplace(\n manifest: Record<string, unknown>,\n namespace: string,\n): ImportedMarketplace {\n // The Codex catalog has no owner; it carries `interface.displayName` instead.\n const iface = manifest.interface as { displayName?: string } | undefined;\n const ownerName = iface?.displayName ?? String(manifest.name);\n const plugins = ((manifest.plugins as Record<string, unknown>[]) ?? []).map((p) => ({\n plugin: sourceToString(p.source),\n ...(p.category ? { category: String(p.category) } : {}),\n }));\n const marketplace: Marketplace = {\n name: String(manifest.name),\n owner: { name: ownerName, namespace },\n plugins,\n };\n return { kind: \"marketplace\", marketplace };\n}\n\n/** Reverse-compile a Codex plugin or marketplace dir into the Weft model. */\nexport function importCodex(dir: string, opts?: ImportOptions): ImportResult | null {\n const namespace = opts?.namespace ?? \"com.imported\";\n\n // Native Codex marketplace catalog (shared `.agents` tree).\n const marketplace = readJson(join(dir, \".agents\", \"plugins\", \"marketplace.json\"));\n if (marketplace) return importMarketplace(marketplace, namespace);\n\n const manifest = readJson(join(dir, \".codex-plugin\", \"plugin.json\"));\n const basename = dir.replace(/\\/+$/, \"\").split(\"/\").pop() || \"imported-plugin\";\n const name = typeof manifest?.name === \"string\" ? manifest.name : basename;\n\n // A plugin is anything with the Codex component layout (manifest is best-effort).\n if (manifest || existsSync(join(dir, \"skills\")) || existsSync(join(dir, \"agents\"))) {\n return importPlugin(dir, manifest, name, namespace);\n }\n return null;\n}\n","/**\n * Derives a runnable Codex MCP server config from an MCP-standard `server.json`\n * (the registry's ServerJSON shape: packages[] / remotes[] / a bare command).\n * The result is one entry in a plugin's `.mcp.json` server map.\n *\n * Codex infers the transport from the keys present (`command` => stdio, `url` =>\n * http); there is NO `transport` key (harness-research.md, Codex MCP section).\n * Stored standards stay verbatim in the plugin; this is the tool-specific view.\n */\n\nexport interface McpServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n}\n\ninterface McpPackage {\n registryType?: string;\n identifier?: string;\n version?: string;\n transport?: { type?: string };\n}\ninterface McpRemote {\n type?: string;\n url?: string;\n headers?: Array<{ name: string; value: string }>;\n}\ninterface ServerJson {\n name?: string;\n packages?: McpPackage[];\n remotes?: McpRemote[];\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/** The short server key Codex uses (the part after the reverse-DNS namespace). */\nexport function mcpServerName(server: ServerJson): string {\n const raw = server.name ?? \"server\";\n const afterSlash = raw.includes(\"/\") ? raw.slice(raw.lastIndexOf(\"/\") + 1) : raw;\n return afterSlash || \"server\";\n}\n\nconst RUNNERS: Record<string, string> = { npm: \"npx\", pypi: \"uvx\" };\n\nexport function mcpRunConfig(server: ServerJson): McpServerConfig {\n const pkg = server.packages?.[0];\n if (pkg?.identifier) {\n if (pkg.registryType === \"oci\") {\n return { command: \"docker\", args: [\"run\", \"-i\", \"--rm\", pkg.identifier] };\n }\n const runner = RUNNERS[pkg.registryType ?? \"npm\"] ?? \"npx\";\n const ident = pkg.version ? `${pkg.identifier}@${pkg.version}` : pkg.identifier;\n const args = runner === \"npx\" ? [\"-y\", ident] : [ident];\n return { command: runner, args };\n }\n\n const remote = server.remotes?.[0];\n if (remote?.url) {\n // Codex http servers carry only `url` here; headers/bearer-token live under\n // documented sub-keys we don't synthesize without provenance.\n return { url: remote.url };\n }\n\n if (server.command) {\n const config: McpServerConfig = { command: server.command };\n if (server.args) config.args = server.args;\n if (server.env) config.env = server.env;\n return config;\n }\n\n return { command: \"echo\", args: [\"server.json declares no runnable transport\"] };\n}\n","import { homedir } from \"node:os\";\nimport { basename, extname, join } from \"node:path\";\nimport {\n artifact,\n type CompiledArtifact,\n type HarnessAdapter,\n type InstallPaths,\n type PluginCtx,\n parseFrontmatter,\n type ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport {\n type Component,\n kindOf,\n leafNameOf,\n type Plugin,\n refOf,\n type Scope,\n} from \"@michaelfromyeg/weft-schema\";\nimport { importCodex } from \"./import\";\nimport { type McpServerConfig, mcpRunConfig, mcpServerName } from \"./mcp\";\n\n/** Bump on any change to Codex's plugin/marketplace/sidecar shape (spec §5). */\nconst TARGET_SCHEMA = \"codex-plugin/0.121\";\n\nconst json = (o: unknown): string => `${JSON.stringify(o, null, 2)}\\n`;\n\ninterface CodexAuthor {\n name: string;\n email?: string;\n}\nfunction author(name: string, email?: string): CodexAuthor {\n return email ? { name, email } : { name };\n}\n\ninterface CodexPluginManifest {\n name: string;\n version?: string;\n description?: string;\n author?: CodexAuthor;\n /** Path to the skills dir, relative to the plugin root. */\n skills?: string;\n /** Path to the MCP server map (.mcp.json), relative to the plugin root. */\n mcpServers?: string;\n interface?: { displayName: string; shortDescription?: string };\n}\n\ninterface CodexLocalSource {\n source: \"local\";\n path: string;\n}\ninterface CodexGitSource {\n source: \"git-subdir\";\n url: string;\n path?: string;\n ref?: string;\n}\ninterface CodexCatalogPlugin {\n name: string;\n source: CodexLocalSource | CodexGitSource;\n policy: { installation: string; authentication: string };\n category: string;\n}\ninterface CodexMarketplace {\n name: string;\n interface: { displayName: string };\n plugins: CodexCatalogPlugin[];\n}\n\n/**\n * Map a resolved Weft entry source to Codex's discriminated source object. Local\n * relative paths become `{source:\"local\"}`; github/git URLs become\n * `{source:\"git-subdir\"}`. Codex resolves `path` relative to the repo root.\n */\nfunction toCodexSource(source: string): CodexLocalSource | CodexGitSource {\n const gh = source.match(/^github:([^/#]+)\\/([^#]+?)(?:#(.+))?$/);\n if (gh) {\n const [, owner, repoAndSub, ref] = gh;\n const slash = repoAndSub.indexOf(\"/\");\n const repo = slash >= 0 ? repoAndSub.slice(0, slash) : repoAndSub;\n const sub = slash >= 0 ? repoAndSub.slice(slash + 1) : \"\";\n return {\n source: \"git-subdir\",\n url: `https://github.com/${owner}/${repo}.git`,\n ...(sub ? { path: `./${sub}` } : {}),\n ...(ref ? { ref } : {}),\n };\n }\n if (/^https?:\\/\\//.test(source) || source.endsWith(\".git\")) {\n return { source: \"git-subdir\", url: source };\n }\n return { source: \"local\", path: source.startsWith(\"./\") ? source : `./${source}` };\n}\n\n/** Copy every file under a plugin dir into `destPrefix/`, preserving structure. */\nfunction copyDir(\n ctx: PluginCtx,\n ref: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n return ctx.list(ref).map((file) => {\n const within = file.startsWith(`${ref}/`) ? file.slice(ref.length + 1) : basename(file);\n return artifact(`${destPrefix}/${within}`, ctx.read(file), { kind });\n });\n}\n\n/** Place a component that may be a single Markdown file or a directory. */\nfunction copyFileOrDir(\n ctx: PluginCtx,\n ref: string,\n destPrefix: string,\n kind: CompiledArtifact[\"kind\"],\n): CompiledArtifact[] {\n const files = ctx.list(ref);\n if (files.length === 0) {\n return [artifact(`${destPrefix}${extname(ref) || \".md\"}`, ctx.read(ref), { kind })];\n }\n return copyDir(ctx, ref, destPrefix, kind);\n}\n\n/**\n * Read a skill's SKILL.md frontmatter so the sidecar can mirror its identity.\n * Returns empty data when there is no SKILL.md or no frontmatter block.\n */\nfunction skillFrontmatter(ctx: PluginCtx, ref: string): Record<string, unknown> {\n try {\n const md = ctx.read(`${ref}/SKILL.md`).toString(\"utf8\");\n return parseFrontmatter(md).data;\n } catch {\n return {};\n }\n}\n\n/**\n * Build the per-skill `agents/openai.yaml` sidecar. Shape is CONFIRMED in\n * harness-research.md: `interface.{display_name,short_description}`,\n * `policy.allow_implicit_invocation`, `dependencies.tools`.\n */\nfunction skillSidecar(name: string, description: string): string {\n const yamlString = (v: string): string => JSON.stringify(v);\n return [\n \"interface:\",\n ` display_name: ${yamlString(name)}`,\n ` short_description: ${yamlString(description)}`,\n \"policy:\",\n \" allow_implicit_invocation: true\",\n \"dependencies:\",\n \" tools: []\",\n \"\",\n ].join(\"\\n\");\n}\n\nconst codexAdapter: HarnessAdapter = {\n target: \"codex\",\n version: \"0.1.0\",\n targetSchema: TARGET_SCHEMA,\n harness: {\n name: \"Codex CLI\",\n versionCommand: \"codex --version\",\n // Format verified working from Codex CLI v0.121 (the marketplace release) through\n // v0.139 (manual install test: marketplace add + plugin install). Bump the ceiling\n // when re-verified against a newer line.\n range: \">=0.121.0 <0.140.0\",\n marketplace: {\n cli: {\n bin: \"codex\",\n add: (source) => [\"plugin\", \"marketplace\", \"add\", source],\n remove: (name) => [\"plugin\", \"marketplace\", \"remove\", name],\n // Codex uses `plugin add` (not `install`).\n install: (plugin, marketplace) => [\"plugin\", \"add\", `${plugin}@${marketplace}`],\n },\n },\n },\n\n detect(scope: Scope, cwd: string): InstallPaths {\n const root = scope === \"user\" ? join(homedir(), \".codex\") : join(cwd, \".codex\");\n // User and project skills live on the SHARED `.agents/skills` path, NOT under\n // the `.codex` root (harness-research.md, Codex Skills section).\n const skills =\n scope === \"user\" ? join(homedir(), \".agents\", \"skills\") : join(cwd, \".agents\", \"skills\");\n return {\n root,\n plugins: join(root, \"plugins\"),\n skills,\n // config.toml (MCP servers) lives at the `.codex` root.\n mcp: root,\n agents: join(root, \"agents\"),\n // TODO(verify): Codex documents no dedicated commands dir; best-effort under root.\n commands: join(root, \"commands\"),\n // TODO(verify): Codex plugins reference hooks via a `hooks/hooks.json` manifest\n // path; this install-scope dir placement is best-effort and not wired to it.\n hooks: join(root, \"hooks\"),\n // Native marketplace catalog lives at `.agents/plugins/marketplace.json`\n // (shared `.agents` tree), NOT under the `.codex` root.\n catalog:\n scope === \"user\" ? join(homedir(), \".agents\", \"plugins\") : join(cwd, \".agents\", \"plugins\"),\n };\n },\n\n transform(component: Component, ctx: PluginCtx): CompiledArtifact[] {\n const ref = refOf(component);\n const leaf = leafNameOf(component);\n switch (kindOf(component)) {\n case \"skill\": {\n const files = copyDir(ctx, ref, `skills/${leaf}`, \"skill\");\n const fm = skillFrontmatter(ctx, ref);\n const displayName = typeof fm.name === \"string\" ? fm.name : leaf;\n const shortDescription = typeof fm.description === \"string\" ? fm.description : \"\";\n files.push(\n artifact(\n `skills/${leaf}/agents/openai.yaml`,\n skillSidecar(displayName, shortDescription),\n {\n kind: \"skill\",\n },\n ),\n );\n return files;\n }\n case \"agent\": {\n // Codex subagents are TOML files at agents/<leaf>.toml.\n // TODO(verify): exact subagent field set; documented fields are name,\n // description, developer_instructions (+ optional model/sandbox_mode/etc).\n const md = ctx.read(ref).toString(\"utf8\");\n const { data, body } = parseFrontmatter(md);\n const name = typeof data.name === \"string\" ? data.name : leaf;\n const description = typeof data.description === \"string\" ? data.description : \"\";\n return [\n artifact(`agents/${leaf}.toml`, renderAgentToml(name, description, body), {\n kind: \"agent\",\n }),\n ];\n }\n case \"command\":\n // TODO(verify): no documented Codex commands dir; placed best-effort.\n return copyFileOrDir(ctx, ref, `commands/${leaf}`, \"command\");\n case \"hook\":\n // TODO(verify): Codex declares hooks via a `hooks/hooks.json` manifest; this\n // per-hook placement is best-effort and not yet wired into that file.\n return copyFileOrDir(ctx, ref, `hooks/${leaf}`, \"hook\");\n case \"mcp\":\n // Verbatim provenance copy; the runnable config goes into .mcp.json.\n return copyDir(ctx, ref, `mcp/${leaf}`, \"mcp\");\n case \"passthrough\":\n // TODO(verify): see the hook case; placed best-effort, disabled.\n return [\n artifact(`hooks/${basename(ref)}`, ctx.read(ref), { kind: \"hook\", executable: true }),\n ];\n default:\n return [];\n }\n },\n\n emitManifest(plugin: Plugin, ctx: PluginCtx): CompiledArtifact[] {\n const artifacts: CompiledArtifact[] = [];\n\n const mcpServers: Record<string, McpServerConfig> = {};\n for (const c of plugin.components) {\n if (kindOf(c) !== \"mcp\") continue;\n try {\n const server = JSON.parse(ctx.read(`${refOf(c)}/server.json`).toString(\"utf8\"));\n mcpServers[mcpServerName(server)] = mcpRunConfig(server);\n } catch {\n // validate.ts already surfaced an error for an unparsable server.json.\n }\n }\n\n const hasSkills = plugin.components.some((c) => kindOf(c) === \"skill\");\n const hasMcp = Object.keys(mcpServers).length > 0;\n\n const manifest: CodexPluginManifest = {\n name: plugin.name,\n version: plugin.version,\n author: author(plugin.owner.name, plugin.owner.email),\n };\n if (plugin.description) manifest.description = plugin.description;\n // Auto-discovery covers the default layout; the explicit paths let Codex find\n // skills/MCP without scanning and make the bundle self-describing.\n if (hasSkills) manifest.skills = \"./skills/\";\n if (hasMcp) manifest.mcpServers = \"./.mcp.json\";\n manifest.interface = plugin.description\n ? { displayName: plugin.name, shortDescription: plugin.description }\n : { displayName: plugin.name };\n\n // The manifest MUST live under `.codex-plugin/` (Codex plugin spec, v0.121).\n artifacts.push(artifact(\".codex-plugin/plugin.json\", json(manifest), { kind: \"manifest\" }));\n // MCP servers go in a sibling `.mcp.json` (a direct name->config map) that the\n // manifest references -- Codex no longer reads a plugin-local config.toml.\n if (hasMcp) artifacts.push(artifact(\".mcp.json\", json(mcpServers), { kind: \"manifest\" }));\n\n return artifacts;\n },\n\n emitCatalog(marketplace: ResolvedMarketplace): CompiledArtifact[] {\n const plugins: CodexCatalogPlugin[] = marketplace.entries.map((entry) => ({\n name: entry.name,\n source: toCodexSource(entry.source),\n // Codex requires a policy; these defaults match its own example marketplaces.\n policy: { installation: \"AVAILABLE\", authentication: \"ON_INSTALL\" },\n // Codex requires a category; fall back to a valid default when unset.\n category: entry.category ?? \"Productivity\",\n }));\n\n const catalog: CodexMarketplace = {\n name: marketplace.name,\n interface: { displayName: marketplace.name },\n plugins,\n };\n\n return [artifact(\".agents/plugins/marketplace.json\", json(catalog), { kind: \"catalog\" })];\n },\n\n importNative: importCodex,\n};\n\nfunction tomlString(value: string): string {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n\n/** Render a Codex subagent TOML. Multi-line instructions use a basic string. */\nfunction renderAgentToml(name: string, description: string, instructions: string): string {\n const lines = [`name = ${tomlString(name)}`];\n if (description) lines.push(`description = ${tomlString(description)}`);\n const body = instructions.trim();\n if (body) {\n const escaped = body.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"');\n lines.push(`developer_instructions = \"\"\"\\n${escaped}\\n\"\"\"`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport default codexAdapter;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michaelfromyeg/weft-adapter-codex",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "Weft adapter for OpenAI Codex: config.toml MCP servers + skill sidecars + component placement.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,11 +16,11 @@
16
16
  "dist"
17
17
  ],
18
18
  "dependencies": {
19
- "@michaelfromyeg/weft-adapter-kit": "1.4.1",
20
- "@michaelfromyeg/weft-schema": "1.4.1"
19
+ "@michaelfromyeg/weft-adapter-kit": "1.5.0",
20
+ "@michaelfromyeg/weft-schema": "1.5.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@michaelfromyeg/weft-core": "1.4.1"
23
+ "@michaelfromyeg/weft-core": "1.5.0"
24
24
  },
25
25
  "license": "MIT",
26
26
  "author": "Michael DeMarco",