-
Notifications
You must be signed in to change notification settings - Fork 0
docs: add AI assistant configuration guidelines #44
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| # Copilot Instructions | ||
|
|
||
| This is a modern C++ project template using CMake >= 3.20 and C++17. | ||
|
|
||
| ## Code Style | ||
|
|
||
| - Follow Google C++ style with 4-space indentation and 100-character column limit | ||
| - Variables, locals, and members use `lower_case` naming | ||
| - Classes and structs use `CamelCase` naming | ||
| - Pointer alignment is left: `int* ptr` not `int *ptr` | ||
| - Brace style: K&R (attach opening brace to statement) | ||
| - Include sorting: main header first, then system headers, then project headers, separated by blank lines | ||
|
|
||
| ## Project Architecture | ||
|
|
||
| - Each build target has its own subdirectory under `src/` with its own `CMakeLists.txt` | ||
| - Tests go in `tests/test_<target_name>.cpp` using GoogleTest (GTest) | ||
| - Use `target_include_directories` and `target_link_libraries` with correct CMake visibility keywords (PUBLIC, PRIVATE, INTERFACE) | ||
| - Shared libraries use RPATH (`$ORIGIN/../lib`) for portable deployment | ||
| - Plugins use a C-compatible API with `extern "C"` exported entrypoints | ||
|
|
||
| ## Build & Test | ||
|
|
||
| - Build: `./scripts/build.sh` | ||
| - Test: `cd build && ctest --output-on-failure` | ||
| - Format: `./scripts/format.sh` | ||
| - Lint: `./scripts/lint.sh` (requires build first for compile_commands.json) | ||
|
|
||
| ## Conventions | ||
|
|
||
| - Always use CMake target properties instead of raw compiler/linker flags | ||
| - Use `#pragma once` for header guards | ||
| - New libraries: create `src/<name>/CMakeLists.txt`, add via `add_subdirectory()` in root CMakeLists.txt | ||
| - New tests: create `tests/test_<name>.cpp`, register in `tests/CMakeLists.txt` with `gtest_discover_tests()` | ||
| - Plugin implementations must export `register_plugin()` as `extern "C"` |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| # AI Assistant Configuration Guide | ||
|
|
||
| This project includes configuration for **Claude Code** and **GitHub Copilot** | ||
| so AI tools generate code that matches the project's conventions out of the box. | ||
|
|
||
| Think of these files as onboarding documentation for AI pair programmers. | ||
|
|
||
| ## What's Configured | ||
|
|
||
| ### Claude Code | ||
|
|
||
| | File | Purpose | | ||
| |------|---------| | ||
| | `CLAUDE.md` | Project context: build commands, structure, conventions, anti-patterns | | ||
|
|
||
| The following are **recommended additions** (not yet in the repo): | ||
|
|
||
| | File | Purpose | | ||
| |------|---------| | ||
| | `.claude/settings.json` | Pre-approved commands and auto-format hook | | ||
| | `.claude/commands/*.md` | Custom slash commands (e.g., `/project:build`, `/project:test`) | | ||
|
|
||
|
Comment on lines
+18
to
+22
|
||
| ### GitHub Copilot | ||
|
|
||
| | File | Purpose | | ||
| |------|---------| | ||
| | `.github/copilot-instructions.md` | Code style, architecture patterns, naming conventions | | ||
|
|
||
|
Comment on lines
+25
to
+28
|
||
| ## Claude Code Features Explained | ||
|
|
||
| ### CLAUDE.md (repository root) | ||
|
|
||
| Automatically loaded into every Claude Code conversation. Contains build | ||
| commands, project structure, code conventions, and anti-patterns. Claude uses | ||
| this to generate code that matches `.clang-format` and `.clang-tidy` rules | ||
| without needing to run the formatters. | ||
|
|
||
| Supports hierarchical placement — a `CLAUDE.md` in a subdirectory adds context | ||
| for that subtree (e.g., `tests/CLAUDE.md` could add test-specific instructions). | ||
|
|
||
| ### .claude/settings.json — Pre-approved Commands | ||
|
|
||
| Without this file, Claude asks permission every time it runs `cmake`, `ctest`, | ||
| or `./scripts/build.sh`. The settings file pre-approves safe commands: | ||
|
|
||
| ```jsonc | ||
| { | ||
| "permissions": { | ||
| "allow": [ | ||
| "Bash(./scripts/build.sh*)", | ||
| "Bash(cmake *)", | ||
| "Bash(ctest *)" | ||
| // ... additional commands | ||
| ] | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| This eliminates repetitive permission prompts and makes Claude significantly | ||
| faster to work with. Dangerous commands (`rm -rf /`, `sudo`) are explicitly denied. | ||
|
|
||
| Personal overrides should go in `.claude/settings.local.json`; add this path | ||
| to your `.gitignore` so local settings aren't committed. | ||
|
|
||
| ### .claude/settings.json — Auto-Format Hook | ||
|
|
||
| The `PostToolUse` hook automatically runs `clang-format` on any `.cpp`, `.hpp`, | ||
| or `.h` file that Claude writes or edits. This means Claude's output always | ||
| matches the project's formatting rules — even if Claude's generation doesn't | ||
| perfectly follow `.clang-format`. | ||
|
|
||
| ### .claude/commands/ — Custom Slash Commands | ||
|
|
||
| These are reusable workflows invoked with `/project:command-name`: | ||
|
|
||
| | Command | What it does | | ||
| |---------|-------------| | ||
| | `/project:build [config]` | Build the project (default: Debug), run tests | | ||
| | `/project:test [filter]` | Run test suite, optionally filter by name | | ||
| | `/project:check` | Run full CI pipeline locally (format + build + lint + test) | | ||
| | `/project:add-library <name>` | Scaffold a new library target with CMake, source, header, and tests | | ||
|
Comment on lines
+20
to
+81
|
||
|
|
||
|
Comment on lines
+76
to
+82
|
||
| Commands are invoked with the `/project:` prefix (e.g., `/project:build`). | ||
| They accept arguments via `$ARGUMENTS` and are markdown files that tell Claude | ||
| what steps to follow — not shell scripts. | ||
|
|
||
| ### .github/copilot-instructions.md | ||
|
|
||
| GitHub Copilot reads this for code generation context. It's intentionally more | ||
| concise than `CLAUDE.md` since Copilot uses it as supplementary context alongside | ||
| its own code analysis. Focused on naming conventions, architectural patterns, | ||
| and build commands. | ||
|
|
||
| ## How to Customize for Your Project | ||
|
|
||
| When you fork this template: | ||
|
|
||
| 1. **Update `CLAUDE.md`** — Replace example library descriptions with your | ||
| actual architecture | ||
| 2. **Update `.github/copilot-instructions.md`** — Adjust style rules to match | ||
| 3. **Add slash commands** — Create `.claude/commands/your-workflow.md` for | ||
| project-specific workflows | ||
| 4. **Adjust permissions** — Edit `.claude/settings.json` to pre-approve your | ||
| project's build tools | ||
|
|
||
| **Tips:** | ||
| - Be specific: "Variables use `lower_case`" beats "write clean code" | ||
| - Document anti-patterns: "do not use X" prevents common AI mistakes | ||
| - Keep `CLAUDE.md` under 200 lines — longer files waste context and reduce adherence | ||
| - Test your instructions: ask the AI to generate a file and verify it follows conventions | ||
|
|
||
| ## Further Reading | ||
|
|
||
| - [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code) | ||
| - [GitHub Copilot custom instructions](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot) | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The markdown table syntax here starts each row with
||(double pipe), which creates an extra empty column and renders incorrectly. Use single leading/trailing pipes (e.g.,| File | Purpose |) to make this a valid 2-column table.