fix(apm-workflow): type: selects processing, it does not validate content
configure.md said apm.yml's `type:` field "constrains what .apm/ may contain" and that changing it later "does not retroactively validate what is already on disk" — both implying a validation step that does not exist. Read against the installed apm-cli 0.28.0: PackageContentType controls how a package is processed during install/compile, apm_package.py only enum-checks the declared string, and validate_apm_package() branches on the structural type derived from files on disk, never on the declared field. There is no content-vs-type mismatch check anywhere. The hazard is therefore the opposite of what the wording primed for: silent omission. A package declaring type: instructions while shipping .apm/skills/ installs no skill and compiles AGENTS.md only, exits 0, and reports success having shipped none of its primitives. The rule is now to verify deployed output rather than the exit code. apm-orchestrate carried the same wording as a Hard Rule and is corrected in step; its separate defects stay with #120. Also refreshes the exemplar figures this branch had re-staled.264a5dbset them to 3,222 words of references;6cb47f8then added 63 words and invalidated them, and the correction above adds more. Re-measured after all edits: body 237 and whole-file 304 both still hold, references total 3,416. body-discipline.md's "roughly 3,200" moves with it. ADR-0020 is deliberately untouched — it self-pins its citations tof9b919d— as is the git-commits negative example pinned to5e23250. Refs #99
This commit is contained in:
@@ -25,7 +25,7 @@ version: 1.0.0
|
||||
|
||||
- `name`, `version` — required (see above)
|
||||
- `description`, `author`, `license`, `homepage`, `repository`, `keywords` — standard package metadata
|
||||
- `type` — `instructions | skill | hybrid | prompts`; constrains what `.apm/` may contain, so set it before scaffolding content (see Gotchas)
|
||||
- `type` — `instructions | skill | hybrid | prompts`; selects how the package is processed at install/compile time. It is a routing selector, not a constraint on what `.apm/` may contain (see Gotchas)
|
||||
- `targets` — which harnesses this package compiles to (plural list form preferred; legacy singular `target: copilot,claude` CSV form still accepted)
|
||||
- `includes` — `auto` publishes the authoritative local layout as-is; it is not scoped down to what's relevant, so anything narrower needs an explicit repo-path list. Note: `auto` also does not sweep generic root-level passthrough files (README.md, docs/, sources.md, config files) into the `apm pack` distribution bundle — see `references/compile.md`
|
||||
- `dependencies`/`devDependencies` — `apm`/`mcp`/`lsp` entries; `devDependencies` share the same shape but are excluded from the shipped artifact
|
||||
@@ -85,6 +85,6 @@ apm config set registry.corp-main.default true
|
||||
|
||||
## Gotchas
|
||||
|
||||
- `apm.yml`'s `type:` field constrains what `.apm/` may contain — set it before scaffolding content, not after. Changing it later does not retroactively validate what is already on disk.
|
||||
- `apm.yml`'s `type:` field validates nothing about `.apm/`. It selects processing: `instructions` compiles to AGENTS.md only, `skill` installs a native skill only, `prompts` emits commands only, `hybrid` does both (see `apm_cli/models/validation.py`, `PackageContentType`). apm checks only that the value parses to one of those four strings; no check anywhere compares it against the primitives actually on disk, and no mismatch diagnostic exists. A package declaring `type: instructions` while shipping `.apm/skills/` therefore raises no error — the mismatch resolves silently, either by omitting that primitive from the install/compile output or, in apm 0.28.0 where `get_effective_type()` routes off the on-disk layout and never reads the declared field, by ignoring the declared value outright. Both directions are silent: `apm install` and `apm compile` can exit 0 having shipped none of the primitives you expected. Set `type:` to cover every primitive the package ships, and confirm the deployed output rather than the exit code.
|
||||
- `apm experimental enable registries` must run before any `registry.*` config takes effect. Declaring a `registries:` block or running `apm config set registry.*` without it silently does nothing — no error, no warning.
|
||||
- `apm plugin init <name>` run with a positional name argument, from inside a directory already named `<name>`, creates a wrongly-nested `<name>/<name>/` subdirectory — it treats the positional arg as "create a new project directory named X," not "confirm the current directory is X." Fix: omit the positional argument entirely when already cd'd into the target package directory — run `apm plugin init --yes --target claude,copilot` instead.
|
||||
|
||||
Reference in New Issue
Block a user