Skip to content

apm compile should emit .github/copilot-instructions.md (dogfood gap) #792

@danielmeppiel

Description

@danielmeppiel

The dogfood opportunity

APM the package manager compiles .apm/instructions/ into multiple agent-tool formats: AGENTS.md (Codex / Cursor / Aider / Copilot fallback), CLAUDE.md (Claude Code), and .github/instructions/*.instructions.md (scoped per-pattern Copilot format with applyTo: frontmatter). That's the core "write-once, run-anywhere" value prop.

APM the OSS project does not yet eat its own dogfood. This repo currently:

This is exactly the format-fragmentation pain APM was built to solve, so the contradiction is becoming visible to anyone who reads our repo (see PR #754 conversation).

The proposed fix

Move all top-level contributing-guide content (currently in .github/copilot-instructions.md) into a single source: .apm/instructions/contributing.md (or similar). Then apm compile should emit:

Output file Reader(s) APM today
AGENTS.md Codex CLI, Cursor, Aider, OpenAI Codex, Copilot (root fallback) Already supported
CLAUDE.md Claude Code Already supported
.github/instructions/*.instructions.md GitHub Copilot (scoped, applyTo:) Already supported
.github/copilot-instructions.md GitHub Copilot (root prose) GAP — file this issue

Once that compile target exists, this repo can:

  1. Move .github/copilot-instructions.md content into .apm/instructions/contributing.md (or split into focused files).
  2. Add .gitignore entries for the generated outputs OR commit them with a CI staleness guard.
  3. Run apm compile in pre-commit + CI.
  4. Delete every hand-authored top-level instruction file.

Why this matters beyond this repo

The README claim becomes provable on our own repository. Every contributor sees the proof: one .apm/instructions/contributing.md edit lands in AGENTS.md, CLAUDE.md, and the Copilot files in the same commit. That's the demo we should be running on every PR.

It also unblocks PR #754 (#695): instead of hand-authoring AGENTS.md, the PR becomes "convert top-level instructions to APM-compiled," which is a much stronger release-notes beat.

Out of scope (for now)

  • Compile-target plugins for .cursor/rules/, .windsurf/rules/, .aider.conf.yml, etc. — these are already covered by other compile targets or out-of-scope.
  • Changing the per-file scoped .github/instructions/*.instructions.md format — keep as-is, it's the most powerful Copilot format.

Acceptance criteria

  • apm compile emits .github/copilot-instructions.md from one or more .apm/instructions/*.md files (likely a designated "root" or "general" instruction file, or aggregating non-applyTo:-scoped content).
  • targets.py Copilot profile lists copilot-instructions.md alongside its existing .github/ outputs.
  • Compile is idempotent and round-trips cleanly with apm compile --check style staleness detection (or whatever the existing convention is).
  • Tests: at least one fixture proving the emission, one proving round-trip stability.

References

good first issue candidate — small surface, well-defined, and the contributor gets a high-visibility win (their code generates a file every contributor sees).

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/cliCLI command surface, flags, help text (cross-cutting).area/docs-sitedocs/src/content (Starlight), README, doc generation.good first issueGood for newcomersstatus/acceptedDirection approved, safe to start work.status/triagedInitial agentic triage complete; pending maintainer ratification (silence = approval).theme/portabilityOne manifest, every target. Multi-target deploy, marketplace, packaging, install.type/featureNew capability, new flag, new primitive.

    Type

    No type

    Projects

    Status

    Done

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions