fix(kyberforge): bridge apm content to Claude Code's flat plugin discovery
Claude Code's (and Copilot's) native plugin installer has zero awareness of .apm/ nesting -- it convention-scans only flat skills/, agents/, commands/, hooks.json at each plugin's root. Confirmed via strings on the installed claude binary and live installs of git@holocron/gitea@holocron/kyberforge@ holocron, all reporting Skills(0) Agents(0) Hooks(0) post ADR-0015's apm conversion. Root cause (apm_cli/core/plugin_manifest.py): apm's plugin.json compiler deliberately strips skills/agents/commands keys, assuming the host already auto-discovers those convention directories -- it has no model of .apm/ being host-visible at all. Separately, apm's own bundle exporter (apm_cli/bundle/plugin_exporter.py, behind `apm pack --format plugin`) implements the correct .apm/ -> flat mapping, but only ever targeted build/<name>-<version>/, a path nothing in marketplace.json's source: points at. scripts/sync-plugin-content.sh wraps that bundle exporter and copies its agents/, skills/, commands/, instructions/, extensions/, and merged hooks.json back into each plugin's own root as a second tracked compiled-output category -- same governance status as .claude-plugin/plugin.json: generated from .apm/, never hand-edited. tests/ subdirectories are excluded from the mirror (dev fixtures, not host-visible runtime content; several hardcode a relative repo-root walk-up sized for the .apm/-nested depth, which breaks when duplicated one level shallower). Applied for real across all 6 plugins and verified two ways: `claude plugin validate --strict` passes on every real plugin directory, and a live `claude --plugin-dir <path> -p "list skills/agents"` behavioral test confirms content is now actually discovered. Also, from the same issue #90 review round: - scripts/check-manifests.sh pointed at each plugin's root-level plugin.json (checking skills/hooks/mcpServers/agents pointer fields) -- that file was a stale near-duplicate of .claude-plugin/plugin.json nothing else read or wrote, now deleted across all 6 plugins. check-manifests.sh is rewritten to validate .claude-plugin/plugin.json instead, and drops the pointer-field checks entirely (nothing to check -- those fields are correctly absent by design). Content-presence drift is now check-plugin-content-sync's job, a new pre-push hook wired in .pre-commit-config.yaml. docs/adr/0017 records the root cause and decision in full, including two rejected alternatives (patching plugin.json's path fields directly -- apm's compiler strips them on every run; pointing marketplace.json at apm pack's build/ output -- a version-suffixed non-source directory nothing can install from without an extra build step). ADR-0015 and CONTEXT.md are updated to point at it. Refs: #90
This commit is contained in:
39
plugins/bin/skills/research/references/file-format.md
Normal file
39
plugins/bin/skills/research/references/file-format.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Reference file format
|
||||
|
||||
Every topic file follows this structure.
|
||||
|
||||
## Frontmatter
|
||||
|
||||
```yaml
|
||||
---
|
||||
topic: <topic-slug> # matches the filename without .md (e.g. "api-reference")
|
||||
source_keys: # kebab-case slugs of sources that contributed; must match sources.md entries
|
||||
- <slug>
|
||||
- <slug>
|
||||
---
|
||||
```
|
||||
|
||||
## Body
|
||||
|
||||
Plain prose organized into markdown sections (`##`, `###`). Extract the content most relevant to skill authoring or implementation — not a verbatim copy of the source. Focus on:
|
||||
- Decisions that affect how to call the API or tool
|
||||
- Options, flags, or parameters with non-obvious behavior
|
||||
- Constraints, rate limits, or gotchas
|
||||
- Canonical patterns the skill should follow
|
||||
|
||||
No inline URLs in the body — all source traceability lives in `sources.md` via `source_keys`.
|
||||
|
||||
## sources.md format
|
||||
|
||||
```markdown
|
||||
# Sources
|
||||
|
||||
## <slug>
|
||||
|
||||
- **URL:** <full URL>
|
||||
- **Description:** <one-line summary of what this source covers>
|
||||
- **Contributing files:** <comma-separated list of topic files this source contributed to>
|
||||
- **Status:** `extracted` | `no content extracted`
|
||||
```
|
||||
|
||||
Use one `##` section per source. Slugs are kebab-case derived from the domain or page title (e.g. `stripe-api-docs`, `openai-python-sdk-readme`). For Context7 sources, use the slug `context7-<library-slug>` (e.g. `context7-vercel-next-js`) and set **URL** to `context7:<library-id>` (e.g. `context7:/vercel/next.js`).
|
||||
17
plugins/bin/skills/research/references/topics.md
Normal file
17
plugins/bin/skills/research/references/topics.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Default topic list
|
||||
|
||||
Create one file per topic when relevant content is found. Skip topics with no content. Add custom topics when content warrants it.
|
||||
|
||||
| File | Covers |
|
||||
|---|---|
|
||||
| `overview.md` | What it is, key concepts, mental model, architecture summary |
|
||||
| `installation.md` | Setup, dependencies, prerequisites, version requirements |
|
||||
| `configuration.md` | Config files, options, environment variables, defaults |
|
||||
| `cli-reference.md` | Commands, subcommands, flags, exit codes |
|
||||
| `api-reference.md` | Endpoints, SDK methods, types, request/response shapes |
|
||||
| `examples.md` | Common usage patterns, recipes, quickstart walkthroughs |
|
||||
| `troubleshooting.md` | Known issues, error codes, gotchas, workarounds |
|
||||
|
||||
## Custom topics
|
||||
|
||||
Create additional topic files when content doesn't fit the defaults. Examples: `webhooks.md`, `rate-limits.md`, `authentication.md`, `migrations.md`, `security.md`. Use kebab-case filenames.
|
||||
Reference in New Issue
Block a user