Layout compatibility audit
Guide: Install · Sources · Resources · Services · Translation · Settings · Workspace · Agent roles · Layout audit
The active contracts in schemas/ describe ten layouts: eight client/convention dialects, agent-plugins v1 (whose schemas are vendored under 1.0.0 and 1.1.0, plus the com.deepseek.harness namespace contract), and a manifest-less skill collection. All ten have executable discovery tests. This is not inferred from schema validity or from a higher-priority manifest reading the same repository.
| Layout | README repository fixture | Independently checked behavior |
|---|---|---|
| Claude Code | grafana/mcp-grafana |
Manifest identity and inline MCP |
| Codex | saadeghi/daisyui |
Own manifest and skills; API marketplace alias and additive paths in contract cases |
| Cursor | EveryInc/compound-engineering-plugin |
Own manifest and productive Cursor marketplace; schema-less MCP and component overrides in contract cases |
| Kimi Code | obra/superpowers |
Compatibility and primary manifest paths, startup skill, appended skill instructions |
| Universal | muratcankoylan/Agent-Skills-for-Context-Engineering |
Own manifest and skill collection |
| agent-plugins v1 | saadeghi/daisyui |
Vendored schemas, portable root identity; extension surfaces (commands, agents, hooks, LSP) and per-server MCP policy from the com.deepseek.harness namespace in contract cases |
| ZCode | zenstory-ai/oh-story-claudecode |
Own marketplace, custom commands path, all four process-hook declarations |
| Qoder CLI | DietrichGebert/ponytail |
Own identity and declared qoder-hooks.json |
| GitHub Copilot | headroomlabs-ai/headroom |
Own marketplace and nested plugin manifest, hooks directory; ponytail also exercises Copilot native event names |
| Skill collection | Universal repository above, with manifests suppressed in the test | Real SKILL.md files remain discoverable without manifests |
Test design
tests/fixtures/real-layouts/ stores selected original declarations and runtime text, pinned to full commit IDs, with per-file SHA-256 and upstream licenses. scripts/update-layout-fixtures.mjs reads Git blobs at those commits; it does not trust modifications in cached working trees. Scripts and binaries are not executed by these tests.
tests/real-layouts.test.ts checks provenance, validates real manifests against their schemas, scans the original multi-layout tree, then materializes a second tree with competing manifests suppressed at every suite root. Productive marketplace provenance comes from the scanner itself. It also checks runtime command readers, hook normalization, detail projections, and Kimi instruction loading. The skill-collection and primary-Kimi cases are explicit derived layout variants, not claims about unmodified upstream locations.
tests/component-declarations.test.ts covers schema forms not present in every sample: file/directory/array paths, Cursor text extensions, MCP file/inline arrays, file LSP configs, Qoder inline commands, Kimi hooks/system prompts/catalog aliases, marketplace pluginRoot and entry-only declarations, Codex API catalogs, and containment/fail-closed cases. tests/project-hooks.test.ts covers the project dimension: settings-table and standalone hook files, the bare event table a hooks.json may carry, malformed-file fail-closed behavior, and the private runtime snapshot the bridge mounts.
Skill source aggregation tests cover one-card grouping, installation, reload, resource paths, duplicate names, and invalid-skill diagnostics. Explicit marketplace and plugin declarations retain their identities. Undeclared roots with other runtime surfaces remain separate. The skill collection contract defines installation behavior.
Implementation
component-files.ts resolves contained paths and normalized resources; suite-components.ts normalizes hook and LSP declarations. Catalog counts, command/agent providers, role routing and detail panels consume those same resources. Invalid explicit hooks cannot revive the default hook file. Inline manifest commands remain read-only in the resource editor.
The project dimension reuses that normalization through native-project.ts, so .agents/hooks/hooks.json and .agents/hooks.json mount exactly like a suite’s own hooks.json; a standalone file may hold the bare event table or a hooks key. .agents/mcp.json is that layout’s own mcpServers document, beside root .mcp.json for Claude Code and .cursor/mcp.json for Cursor; ZCode reads its own files only. The user Agent layout root ~/.agents/ carries the same surfaces: the panel-authored skills, commands and personas, the same two hook file names, and hand-written mcp.json / lsp.json declarations.
A metadata-only root plugin.json keeps its existing identity but inherits missing component declarations from its co-located Claude manifest. The unmodified ponytail fixture verifies this behavior; otherwise its root name-only file would still hide its real hooks despite passing isolated tests.
Kimi system/startup instructions use the existing scoped systemPrompt service. ZCode process hooks retain argv boundaries through quoted command adaptation. Supported Copilot/Cursor lifecycle event spellings map to the existing command-hook bridge. No host repository changes or additional dependencies were needed for this increment.
Boundaries
The tests prove layout parsing and the implemented DSH component adapters. They do not execute arbitrary third-party hooks, start their MCP processes, certify remote credentials/binaries, or reproduce every original client feature. Some published templates still contain installation-specific values (for example ponytail’s PONYTAIL_DIR); fixture tests retain that source text rather than silently fixing it.
Native editor rules, app connectors, vendor-specific tools/permission engines and hook events without DSH equivalents are not made portable by parsing their manifests. The legacy kimi-cli tool-plugin appendix is a different protocol from the active schemas/kimi/plugin.schema.json (Kimi Code). Project LSP remains diagnosed and unmounted under the user’s no-host-changes constraint; user-suite LSP files and inline tables use the existing mount adapter. These boundaries must not be described as full upstream runtime equivalence.
Reproduce
node scripts/compat-report.mjs
node scripts/update-layout-fixtures.mjs
pnpm exec vitest run tests/real-layouts.test.ts tests/component-declarations.test.ts
pnpm run check:refactor
Only the first command acquires missing repository caches. Normal tests use committed snapshots and never require GitHub access.