Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agents/skills
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ uv run alembic upgrade head

- **Documentation**: Check `docs/` directory for architecture, workflow, and development guides
- **Examples**: Look at existing plot implementations in `plots/` for patterns
- **CLAUDE.md**: Additional guidance specific to Claude AI agent workflows
- **CLAUDE.md**: Additional guidance specific to Claude AI agent workflows; `AGENTS.md` is a symlink to it, so agents that read `AGENTS.md` get the same rules
- **Issue Templates**: Use GitHub issue templates for consistent problem reporting

### Common Issues
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ Known gaps with NO verification loop yet (reason through carefully and say so in
## Claude Code Configuration

- **Commands directory**: Commands live in `agentic/commands/` (agent-agnostic). A symlink `.claude/commands/ → ../agentic/commands/` ensures Claude Code slash-command resolution works. Do not create commands directly in `.claude/commands/`.
- **Other agents read the same files**: `AGENTS.md` is a symlink to this file and `.agents/skills/ → ../.claude/skills/` exposes the project skills, so the Antigravity CLI (`agy`), Codex, and other tools that read `AGENTS.md` or `.agents/skills/` load the same rules and skills. Edit `CLAUDE.md` and `.claude/skills/`, never the link paths, and never replace either link with a real file or directory. Rules worded for Claude Code tools (Edit/Write, `model: opus`, subagents, MCP servers) apply to other agents by analogy: their file-editing tool, their strongest model tier, their delegation mechanism.

## CRITICAL: Mandatory Workflow for New Specs and Implementations

Expand Down
1 change: 1 addition & 0 deletions agentic/docs/project-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@ Example: `plots/scatter-basic/` contains everything for the basic scatter plot.
- **`agentic/`**: AI workflow layer (composable phases, prompt templates, runtime state)
- **`agentic/workflows/`**: Click CLI scripts (plan, build, test, review + orchestrators)
- **`agentic/commands/`**: Markdown prompt templates
- **Agent instruction files**: `CLAUDE.md` holds the rules and `.claude/skills/` the skills. Three symlinks make them visible to other tools without a copy to keep in sync: `.claude/commands/` points to `agentic/commands/`, `AGENTS.md` points to `CLAUDE.md` (read by the Antigravity CLI `agy`, Codex, and the GitHub Copilot coding agent), and `.agents/skills/` points to `.claude/skills/` (the skills directory `agy` reads). `.github/copilot-instructions.md` is the separate, hand-synced guide for Copilot. `tests/unit/test_agent_instructions.py` fails if a link is replaced by a real file or points elsewhere.
- **`automation/`**: CI/CD helper scripts (workflow_cli, label_manager, sync_to_postgres)
- **`infra/`**: Infrastructure that would otherwise live only in a dashboard
- **`infra/cloudflare/`**: Source of the apex `anyplot.ai/api/*` Worker, plus the origin gate's rollout and measuring procedure
Expand Down
8 changes: 8 additions & 0 deletions changelog.d/agents-md-bridge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### Added

- **Agent rules and skills for non-Claude agents.** `AGENTS.md` is a symlink to
`CLAUDE.md` and `.agents/skills/` a symlink to `.claude/skills/`, so the
Antigravity CLI (`agy`), Codex, and other tools that read those paths load the
same rules and skills from one source instead of a third file to keep in sync.
A unit test fails if either link is replaced by a real file or points
elsewhere. (#12187)
23 changes: 23 additions & 0 deletions tests/unit/test_agent_instructions.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,29 @@ def test_the_commands_symlink_points_where_it_says() -> None:
assert link.resolve() == (REPO_ROOT / "agentic" / "commands").resolve()


@pytest.mark.parametrize(
("link", "target", "raw"),
[
(REPO_ROOT / "AGENTS.md", CLAUDE_MD, "CLAUDE.md"),
(REPO_ROOT / ".agents" / "skills", REPO_ROOT / ".claude" / "skills", "../.claude/skills"),
],
ids=["AGENTS.md", ".agents-skills"],
)
def test_the_agents_bridge_links_point_at_the_claude_sources(link: Path, target: Path, raw: str) -> None:
"""`AGENTS.md` and `.agents/skills/` are how agy, Codex and other non-Claude
agents find the rules and skills (CLAUDE.md, "Claude Code Configuration").

Same failure as the commands link: a real file or directory in their place
still exists and still reads plausibly, but it is a third copy nobody keeps
in sync. The raw link text is pinned as well, because a relative link is
what keeps it valid in every checkout and worktree; an absolute one resolves
on the machine that made it and nowhere else.
"""
assert link.is_symlink(), f"{link} is documented as a symlink"
assert link.readlink() == Path(raw), f"{link} should be the relative link {raw}"
assert link.resolve() == target.resolve()


def test_every_named_skill_exists() -> None:
"""The routing table in CLAUDE.md sends work to `.claude/skills/<name>/`.

Expand Down
Loading