Skip to content

Commit 597d898

Browse files
committed
fix(spec): resolve doc review findings in adoption specs and core spec
- Make layout, registration.path, manifest.required_fields optional in extensionModelBundle schema (match prose OPTIONAL declarations) - Remove phantom filePaths/configEntry wrapper keys from component_paths prose and examples in assistant-adoption.md - Fix Gemini CLI transport: http-streaming -> streamable-http - Add missing configuration/capabilities to copilot-cli.json - Add missing configuration to gemini-cli.json - Update core spec version 2026-02-14 -> 2026-02-22 - Replace stale plugin_model/adapter_interface refs with extension_model
1 parent dc6a65a commit 597d898

5 files changed

Lines changed: 51 additions & 54 deletions

File tree

spec/assistant-adoption.md

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,18 @@ The following example shows `component_paths` version-gated so that the skill in
137137
{
138138
"component_paths": {
139139
">=1.0.0": {
140-
"skills": { "filePaths": { "user": "~/.assistant/skills/{name}.md", "project": ".assistant/skills/{name}.md" } },
141-
"hooks": { "configEntry": { "file": ".assistant/hooks.json", "format": "json" } }
140+
"skills": { "user": "~/.assistant/skills/{name}.md", "project": ".assistant/skills/{name}.md" },
141+
"hooks": {
142+
"user": { "file": ".assistant/hooks.json", "format": "json" },
143+
"project": { "file": ".assistant/config.json", "format": "json", "key": "hooks" }
144+
}
142145
},
143146
"<1.0.0": {
144-
"skills": { "filePaths": { "user": "~/.assistant/legacy/{name}.md", "project": ".assistant/legacy/{name}.md" } },
145-
"hooks": { "configEntry": { "file": ".assistant/config.json", "format": "json", "key": "hooks" } }
147+
"skills": { "user": "~/.assistant/legacy/{name}.md", "project": ".assistant/legacy/{name}.md" },
148+
"hooks": {
149+
"user": { "file": ".assistant/config.json", "format": "json", "key": "hooks" },
150+
"project": { "file": ".assistant/config.json", "format": "json", "key": "hooks" }
151+
}
146152
}
147153
}
148154
}
@@ -210,13 +216,7 @@ Component path entries fall into two categories based on how the host consumes t
210216

211217
#### File-Based Components
212218

213-
Components that are installed as individual files on disk. The component types `skills`, `agents`, `commands`, and `instructions` use this pattern.
214-
215-
| Property | Type | Required | Description |
216-
|---|---|---|---|
217-
| `filePaths` | `object` | REQUIRED | An object with optional `user` and `project` keys, each mapping to a filesystem path string. |
218-
219-
The `filePaths` object:
219+
Components that are installed as individual files on disk. The component types `skills`, `agents`, `commands`, and `instructions` use this pattern. The component path entry is an object with optional `user` and `project` keys, each a string filesystem path.
220220

221221
| Key | Type | Description |
222222
|---|---|---|
@@ -225,13 +225,9 @@ The `filePaths` object:
225225

226226
#### Config-Entry Components
227227

228-
Components that are registered as entries within a configuration file rather than placed as standalone files. The component types `hooks`, `mcp_servers`, and `lsp_servers` use this pattern.
229-
230-
| Property | Type | Required | Description |
231-
|---|---|---|---|
232-
| `configEntry` | `object` | REQUIRED | Describes the configuration file where the component is registered. |
228+
Components that are registered as entries within a configuration file rather than placed as standalone files. The component types `hooks`, `mcp_servers`, and `lsp_servers` use this pattern. The component path entry is an object with optional `user` and `project` keys, each an object describing the configuration file for that scope.
233229

234-
The `configEntry` object:
230+
Each scope object has the following properties:
235231

236232
| Key | Type | Required | Description |
237233
|---|---|---|---|
@@ -256,47 +252,31 @@ The `component_paths` object as a whole MAY be version-gated at the top level.
256252
{
257253
"component_paths": {
258254
"skills": {
259-
"filePaths": {
260-
"user": "~/.claude/skills/{name}.md",
261-
"project": ".claude/skills/{name}.md"
262-
}
255+
"user": "~/.claude/skills/{name}.md",
256+
"project": ".claude/skills/{name}.md"
263257
},
264258
"agents": {
265-
"filePaths": {
266-
"user": "~/.claude/agents/{name}.md",
267-
"project": ".claude/agents/{name}.md"
268-
}
259+
"user": "~/.claude/agents/{name}.md",
260+
"project": ".claude/agents/{name}.md"
269261
},
270262
"commands": {
271-
"filePaths": {
272-
"user": "~/.claude/commands/{name}.md",
273-
"project": ".claude/commands/{name}.md"
274-
}
263+
"user": "~/.claude/commands/{name}.md",
264+
"project": ".claude/commands/{name}.md"
275265
},
276266
"instructions": {
277-
"filePaths": {
278-
"project": "CLAUDE.md"
279-
}
267+
"project": "CLAUDE.md"
280268
},
281269
"hooks": {
282-
"configEntry": {
283-
"file": ".claude/settings.json",
284-
"format": "jsonc",
285-
"key": "hooks"
286-
}
270+
"user": { "file": "~/.claude/settings.json", "format": "jsonc", "key": "hooks" },
271+
"project": { "file": ".claude/settings.json", "format": "jsonc", "key": "hooks" }
287272
},
288273
"mcp_servers": {
289-
"configEntry": {
290-
"file": ".claude/mcp.json",
291-
"format": "json"
292-
}
274+
"user": { "file": "~/.claude.json", "format": "json", "key": "mcpServers" },
275+
"project": { "file": ".mcp.json", "format": "json", "key": "mcpServers" }
293276
},
294277
"lsp_servers": {
295-
"configEntry": {
296-
"file": ".claude/settings.json",
297-
"format": "jsonc",
298-
"key": "lspServers"
299-
}
278+
"user": { "file": "~/.claude/settings.json", "format": "jsonc", "key": "lspServers" },
279+
"project": { "file": ".claude/settings.json", "format": "jsonc", "key": "lspServers" }
300280
}
301281
}
302282
}

spec/assistants/copilot-cli.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,16 @@
104104
"mcp_servers": ".mcp.json",
105105
"lsp_servers": ".lsp.json"
106106
}
107+
},
108+
"configuration": {
109+
"settings_paths": {
110+
"user": "~/.copilot/settings.json",
111+
"project": ".github/copilot-settings.json"
112+
}
113+
},
114+
"capabilities": {
115+
"lazy_loading": false,
116+
"hot_reload": false,
117+
"managed_settings": false
107118
}
108119
}

spec/assistants/gemini-cli.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@
111111
},
112112
"mcp": {
113113
"supported": true,
114-
"transports": ["stdio", "sse", "http-streaming"],
114+
"transports": ["stdio", "sse", "streamable-http"],
115115
"env_prefix": null
116116
},
117117
"extension_model": {
@@ -133,6 +133,12 @@
133133
"mcp_servers": ".mcp.json"
134134
}
135135
},
136+
"configuration": {
137+
"settings_paths": {
138+
"user": "~/.gemini/settings.json",
139+
"project": ".gemini/settings.json"
140+
}
141+
},
136142
"capabilities": {
137143
"lazy_loading": false,
138144
"hot_reload": false,

spec/schemas/assistant-adoption.schema.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@
222222

223223
"extensionModelBundle": {
224224
"type": "object",
225-
"required": ["type", "install_dir", "manifest", "registration", "layout"],
225+
"required": ["type", "install_dir", "manifest", "registration"],
226226
"additionalProperties": false,
227227
"properties": {
228228
"type": {
@@ -236,7 +236,7 @@
236236
},
237237
"manifest": {
238238
"type": "object",
239-
"required": ["filename", "required_fields"],
239+
"required": ["filename"],
240240
"additionalProperties": false,
241241
"properties": {
242242
"filename": {
@@ -252,7 +252,7 @@
252252
},
253253
"registration": {
254254
"type": "object",
255-
"required": ["mechanism", "path"],
255+
"required": ["mechanism"],
256256
"additionalProperties": false,
257257
"properties": {
258258
"mechanism": {

spec/specification.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ nav_order: 2
66

77
# ccpkg Specification
88

9-
**Specification Version: 2026-02-14 (Draft)**
9+
**Specification Version: 2026-02-22 (Draft)**
1010

1111
## Status
1212

@@ -1092,15 +1092,15 @@ ccpkg integrates with each host's extension or plugin system, leveraging the hos
10921092

10931093
### Bootstrap
10941094

1095-
On first use, ccpkg registers itself with the host's extension discovery system. The bootstrap process varies by host — some use marketplace registration, others use directory scanning or plugin manifests. The exact mechanism is defined in the host's adoption specification under `plugin_model`.
1095+
On first use, ccpkg registers itself with the host's extension discovery system. The bootstrap process varies by host — some use marketplace registration, others use directory scanning or plugin manifests. The exact mechanism is defined in the host's adoption specification under `extension_model`.
10961096

10971097
### Plugin Registration
10981098

10991099
During installation, the installer performs two host-facing steps as defined by the host's adoption specification:
11001100

1101-
1. **Generate host plugin manifest.** The installer creates the host's expected plugin manifest inside the install directory, mapping ccpkg manifest fields (name, version, description, author) to the host's manifest format. The manifest path and format are defined in the host's `plugin_model.manifest_path` field. Package authors SHOULD NOT include host-specific plugin manifests in their archives. If a host-specific manifest is present, the installer MUST use the generated version and MAY warn the author.
1101+
1. **Generate host plugin manifest.** The installer creates the host's expected plugin manifest inside the install directory, mapping ccpkg manifest fields (name, version, description, author) to the host's manifest format. The manifest path and format are defined in the host's `extension_model.manifest.filename` field. Package authors SHOULD NOT include host-specific plugin manifests in their archives. If a host-specific manifest is present, the installer MUST use the generated version and MAY warn the author.
11021102

1103-
2. **Register with host.** The installer registers the package with the host's extension system as described in the host's `adapter_interface` operations. This ensures the host recognizes the package on the next session start.
1103+
2. **Register with host.** The installer registers the package with the host's extension system as described in the host's `extension_model.registration` mechanism. This ensures the host recognizes the package on the next session start.
11041104

11051105
These two steps — generating a plugin manifest and registering with the host — are the complete integration surface. The specific files and settings keys are defined in each host's [adoption specification](assistant-adoption.md).
11061106

0 commit comments

Comments
 (0)