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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ The tables below show whether each tool supports a given feature (✅ = supporte
| Google Antigravity plugin | ✅ | | ✅ | | ✅ | ✅ | ✅ | | |
| JetBrains AI Assistant | ✅ | ✅ | ✅ | | | ✅ | | | |
| JetBrains Junie | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| AugmentCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| AugmentCode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Devin Desktop | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Warp | ✅ | ✅ | ✅ | ✅ | | ✅ | | ✅ | |
| Replit | ✅ | | | | | ✅ | | | |
Expand Down
2 changes: 2 additions & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
"backgrounding",
"bugbot",
"rewake",
"slugified",
"slugifies",
"slugifying",
"fakehash",
"fakeintegrityvalue",
"Fskill",
Expand Down
22 changes: 22 additions & 0 deletions docs/reference/file-formats.md
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,28 @@ Generating checks for Cursor replaces `.cursor/BUGBOT.md`, so run `rulesync impo

For Rovo Dev CLI, checks are [code-review custom instructions](https://support.atlassian.com/rovo/docs/set-custom-instructions-for-code-reviews/), and Rovo Dev reads one plain-Markdown file rather than a file per check — so every check targeting Rovo Dev collapses into `.rovodev/.review-agent.md` (note the leading dot in the file name). The file takes **no frontmatter**. Everything else works exactly as it does for Cursor Bugbot above, because the two surfaces are the same shape: one marked-up section per check, `severity`/`tools` dropped, `description` used only when the body is empty, markers splitting the file back on import (with a hand-written file importing as a single `review-agent` check), the same `<!-- rulesync:literal-check:… -->` escaping, the same replace-and-warn on generate, and the same deletion guard for a file holding anything rulesync did not write. Project scope only — these are per-repository review instructions and Rovo Dev documents no user-level equivalent, which is the opposite of the Rovo Dev permissions surface (global only).

For AugmentCode, checks are [Augment Code Review guidelines](https://docs.augmentcode.com/codereview/review-guidelines), which live in one YAML file at `.augment/code_review_guidelines.yaml` rather than in a file per check. Augment groups rules into named **areas**, each with a `description`, the `globs` it applies to, and a list of `rules` — every rule an `id` / `description` / `severity` triple, all of them required. Rulesync maps one check onto one rule: the body becomes the rule's `description` (the check's `description` is used when the body is empty, and the file stem when neither is set), and the rule lands in an area of its own, keyed by the check's file stem. An `augmentcode` frontmatter block moves it: `area` groups several checks under one key, with `areaDescription` and `globs` taken from the first check to name that area (`globs` defaults to `["**"]`, matching Augment's own example; an authored empty list is kept as written, since an area matching nothing is a narrower statement than the catch-all, not an absent value), and `id` overrides the rule id. An authored `area` is used verbatim — Augment's own documented example keys an area `memory_safety`, and rewriting the underscores would leave the original area behind while a second one appeared beside it. Only the file-stem default is slugified, since that has to become a legal key from an arbitrary file name. Rule ids are kept distinct because Augment reports findings by id: two same-named checks in different subdirectories become `security` and `security-2`, and a generated id also steps aside for one a preserved hand-written area already uses. Example:

```md
---
targets: ["augmentcode"]
severity: high
augmentcode:
area: databases
areaDescription: "Data and Database related rules"
globs: ["db/**"]
id: "no_pii_in_bigquery"
---

Never store PII data in BigQuery tables.
```

**Severity is lossy in one direction.** Augment's scale is `high` / `medium` / `low` with no band above `high`, so canonical `critical` is written as `high` and imports back as `high` — the canonical value is not recoverable from Augment's file alone. A check with no `severity` emits `medium`, since the field cannot be omitted: `high` would push every unannotated check past the ones deliberately marked `medium`, and `low` would bury them.

Generation **merges** rather than replaces, because Augment's documentation tells users to hand-write this file. Only the areas the current check set claims are rewritten — and a claimed area is replaced as a whole, so a field you hand-added inside one Rulesync regenerates does not survive. Every other area, the `file_paths_to_ignore` list, and any key Augment adds later are left untouched. `file_paths_to_ignore` is recognized and preserved but never authored or imported — the canonical check model has no ignore surface, and adding one is a separate question. The cost of merging is that rulesync cannot tell its own leftovers from a hand-written area: renaming a check strands the area under the old key, and when checks remain but none target AugmentCode the existing areas are left in place with a warning rather than guessed at. For the same reason the file is never deleted once it exists — unlike the Markdown surfaces, YAML carries no marker saying which text is rulesync's, since a rewrite drops comments and an unknown top-level key risks Augment's own parser.

On import, each rule becomes its own check (an area of three rules is three checks, not one), carrying the area key, description and globs back in its `augmentcode` block so the next generate regroups them exactly where they were. A rule missing `id` or `description` is left in the YAML rather than imported, and a rule id repeated across two areas is suffixed so the second check does not overwrite the first. Project scope only — the reviewer reads the file from the committed repository, and Augment documents no user-level equivalent.

For Hermes Agent, Rulesync writes project-local JSON specs under `.hermes/plugins/rulesync-checks/checks/` and a `rulesync-checks` plugin beside them. Its one-shot [`pre_verify` hook](https://hermes-agent.nousresearch.com/docs/user-guide/features/hooks/#pre-verify) fires only for coding turns with changed paths and `attempt == 0`, then asks Hermes to run all configured checks before finishing. `tools` is preserved as advisory guidance because Hermes does not enforce an Amp-style per-check tool allowlist. Run Hermes with the project plugin explicitly trusted for that invocation:

```sh
Expand Down
2 changes: 1 addition & 1 deletion docs/reference/supported-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Rulesync supports both **generation** and **import** for All of the major AI cod
| Google Antigravity plugin | antigravity-plugin | ✅ | | ✅ 🔧 | | ✅ | ✅ | ✅ | | |
| JetBrains AI Assistant | aiassistant | ✅ | ✅ | ✅ 🌏 | | | ✅ | | | |
| JetBrains Junie | junie | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | 🌏 | 🌏 | |
| AugmentCode | augmentcode | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | |
| AugmentCode | augmentcode | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | |
| Devin Desktop | devin | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 🔧 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | ✅ 🌏 | |
| Warp | warp | ✅ 🌏 | ✅ | ✅ 🌏 | ✅ 🌏 | | ✅ 🌏 | | 🌏 | |
| Replit | replit | ✅ | | | | | ✅ 🌏 | | | |
Expand Down
7 changes: 7 additions & 0 deletions src/constants/augmentcode-paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,12 @@ export const AUGMENTCODE_SETTINGS_FILE_NAME = "settings.json";
// writes it (it stays a user-owned, gitignored file).
// @see https://docs.augmentcode.com/cli/config
export const AUGMENTCODE_SETTINGS_LOCAL_FILE_NAME = "settings.local.json";
/**
* Augment Code Review's custom guidelines file. Read from the repository root's
* `.augment/` folder, project scope only — Augment documents no user-level
* equivalent, and the reviewer runs against the committed tree.
* @see https://docs.augmentcode.com/codereview/review-guidelines
*/
export const AUGMENTCODE_CODE_REVIEW_GUIDELINES_FILE_NAME = "code_review_guidelines.yaml";
export const AUGMENTCODE_IGNORE_FILE_NAME = ".augmentignore";
export const AUGMENTCODE_LEGACY_RULE_FILE_NAME = ".augment-guidelines";
14 changes: 14 additions & 0 deletions src/e2e/e2e-checks.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ const checksGenerateTargets = [
target: "amp",
outputPath: join(".agents", "checks", "security.md"),
},
{
// Augment Code Review reads one YAML guidelines file of named areas.
target: "augmentcode",
outputPath: join(".augment", "code_review_guidelines.yaml"),
},
{
// Bugbot reads one aggregated instruction file rather than per-check files.
target: "cursor",
Expand Down Expand Up @@ -87,6 +92,15 @@ Look for injection vulnerabilities.
});

const generatedContent = await readFileContent(join(testDir, outputPath));
if (target === "augmentcode") {
// One area per check, keyed by the source file basename.
expect(generatedContent).toContain("areas:");
expect(generatedContent).toContain("security:");
expect(generatedContent).toContain("id: security");
expect(generatedContent).toContain("severity: high");
expect(generatedContent).toContain("Look for injection vulnerabilities.");
return;
}
if (target === "takt") {
// One quality gate per check, in the shared config's owned block.
expect(generatedContent).toContain("workflow_overrides:");
Expand Down
Loading
Loading