Skip to content

feat(apm)!: restructure primitives under .apm, entry prompts, full-target ci - #19

Merged
using-system merged 8 commits into
mainfrom
features/ci-apm
Aug 22, 2026
Merged

feat(apm)!: restructure primitives under .apm, entry prompts, full-target ci#19
using-system merged 8 commits into
mainfrom
features/ci-apm

Conversation

@using-system

@using-system using-system commented Aug 22, 2026

Copy link
Copy Markdown
Owner

More than CI: this PR restructures the package's primitive tree and completes the consumer experience, with the validation pipeline that proved every step.

1. Canonical .apm/ layout (breaking — fixes #20)

Top-level agents/ is not part of any APM package contract: consumers received the skills and the MCP server but never the two agents — the core of the product. All primitives now live under .apm/ in typed subdirectories:

  • agents/.apm/agents/ (observe-run, otel-instrumentation-expert)
  • skills/.apm/skills/ (otel-guides, observability-cli-guides, setup-local-stack, run-scenario) — unified by choice: one convention, cleaner root

Verified consumer-side on every MCP-capable harness: 2 agents integrated.claude/agents/, .github/agents/, .opencode/agents/, ...

2. Entry-point prompts (fixes #18)

.apm/prompts/odd-observe.prompt.md and odd-instrument.prompt.md — thin launchers only: parse $ARGUMENTS into the agent's mission block and delegate; the agents stay the single source of behavior. Empirically verified fan-out per harness: Claude → .claude/commands/ slash commands, Copilot → .github/prompts/, OpenCode → .opencode/commands/. One source file, no command+prompt pair needed.

3. ci-apm workflow — the real APM CLI on every PR

Matrix over the 8 MCP-capable targets (claude, copilot, cursor, codex, gemini, opencode, windsurf, kiro — grok-build excluded: no MCP client for the declared server), fail-fast: false. Each leg:

  1. Consumer-style apm install of this repo into a scratch project, with the materialized file tree published in the run summary — the per-harness deployment is visible on every PR
  2. apm install --target <t> + apm audit on the package's own manifest (resolution, MCP wiring, hidden-unicode scan, drift replay)

This closes the long-standing gap: the manifest had never been parsed by the real APM CLI (apm-cli==0.28.0 pinned). Consumer artifacts (.mcp.json, apm.lock.yaml) gitignored.

BREAKING CHANGE: the agents/ and skills/ directories move under .apm/.

🤖 Generated with Claude Code

Opt-in per PR via the validate-apm label: apm install (resolution +
mcp wiring) then apm audit (hidden-unicode scan, install replay,
drift diff). Both commands validated locally against this repo -
install configures the oddyssey server and exits 0, audit scans clean.
Consumer artifacts (.mcp.json, apm.lock.yaml) gitignored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
using-system and others added 5 commits August 22, 2026 16:19
CI runners carry no harness markers, so apm install needs an explicit
--target; claude is CI-only (the package itself stays target-agnostic).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The label-gated job now installs the package consumer-style for all
nine harness targets, publishing the materialized file tree of each in
the run summary (collapsible per target), then validates the package's
own manifest with install + audit. This surfaced issue #20: agent
primitives are not deployed by apm install.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
It has no MCP client and the package declares an MCP server, which
apm rightly refuses; the exclusion and its reason are stated in the
run summary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
agents/ at the repo root is not part of any APM package contract, so
consumers received the skills and the MCP server but never the two
agents (#20). All primitives now live under .apm/ in typed
subdirectories (.apm/agents/, .apm/skills/) - the canonical APM
package layout, verified consumer-side: agents AND skills integrate.

BREAKING CHANGE: the agents/ and skills/ directories move under .apm/.

Closes #20

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The validation is fast enough to drop the label gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
using-system and others added 2 commits August 22, 2026 16:37
Thin launchers only: each parses the arguments into a well-formed
mission block and delegates to its agent, which stays the single
source of behavior. One .apm/prompts source per verb fans out per
harness - verified consumer-side: Claude gets .claude/commands
slash commands, Copilot gets .github/prompts.

Closes #18

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One matrix leg per harness replaces the shell loop: each leg does the
consumer install with its tree in the run summary, then validates the
package's own manifest for that same target - no more hardcoded
--target claude. fail-fast off so one broken harness does not mask
the others.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@using-system using-system changed the title ci(apm): validate the manifest with the real apm cli on labeled prs feat(apm)!: restructure primitives under .apm, entry prompts, full-target ci Aug 22, 2026
@using-system
using-system merged commit 8246bbf into main Aug 22, 2026
8 checks passed
@github-actions github-actions Bot mentioned this pull request Aug 22, 2026
@using-system
using-system deleted the features/ci-apm branch August 22, 2026 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: agent primitives are not deployed to consumers by apm install feat: /odd entry-point commands and prompts

1 participant