docs(cursor): refresh dates + migrate doc URLs for Cursor 3.0.0 -> 3.1.17 - #763
Conversation
…1.17 Closes #749. Triage of Cursor 3.0.0 -> 3.1.17. Re-verified all 19 CUR-* rules against the upstream changelog (cursor.com/changelog) and docs. The 3.0/3.1 features are all UX-side or cloud-side - none touch any on-disk file agnix validates: - 3.0 (2026-04-02): Agents Window, /worktree, /best-of-n, Design Mode, Agent Tabs, Await tool, multi-root hooks bug fix - 04-08 patch: Bugbot learned rules + MCP support (cloud-only) - 3.1 (2026-04-13): Tiled layout, voice input, diff-to-file nav, file search filters, perf - 04-15 patch: Canvases (interactive responses) Schema verification: - MDC frontmatter: description, globs, alwaysApply (matches agnix KNOWN_KEYS exactly) - Cursor agents: name, description, model, readonly, is_background (matches agnix exactly) - Hook events: 20 events documented, matches agnix CURSOR_HOOK_EVENTS exactly (no events added or removed) No code changes required. Cursor's docs URL structure migrated upstream (this is the fix users will see): - /docs/context/rules -> /docs/rules (CUR-001..009) - /docs/agent/hooks -> /docs/hooks (CUR-010..013, 017..019) - /docs/context/subagents -> /docs/subagents (CUR-014, CUR-015) - /docs/cloud-agent/setup is unchanged (CUR-016) Updated 18 source URL references across 18 rule entries. Documentation: - Bumped verified_on to 2026-04-22 for all 19 CUR-* rules in knowledge-base/rules.json and synced crates/agnix-rules/rules.json - Bumped RESEARCH-TRACKING.md 'Last Reviewed' for Cursor from 2026-02-26 to 2026-04-22 - Expanded the Config Format column to list all 5 file types Cursor validates (was only listing .cursor/rules/*.mdc and .cursorrules; added .cursor/hooks.json, .cursor/agents/*.md, .cursor/environment.json) - Updated the per-doc-source breakdown rows to use the new URLs - Regenerated website/docs/rules/generated/*.md Verified locally: - cargo clippy --workspace --all-targets --all-features -- -D warnings clean - cargo test -p agnix-rules --tests: 47 + 4 parity tests pass - No source code changed; no new tests needed
There was a problem hiding this comment.
Code Review
This pull request performs a comprehensive refresh of Cursor-related validation rules, updating documentation URLs and verification dates across the changelog, research tracking, and generated website files. A review comment correctly identifies that crates/agnix-rules/rules.json and knowledge-base/rules.json contain duplicate data and recommends refactoring the codebase to maintain a single source of truth.
| "evidence": { | ||
| "source_type": "vendor_docs", | ||
| "source_urls": [ | ||
| "https://cursor.com/docs/context/rules" | ||
| "https://cursor.com/docs/rules" | ||
| ], | ||
| "verified_on": "2026-02-26", | ||
| "verified_on": "2026-04-22", | ||
| "applies_to": { | ||
| "tool": "cursor" | ||
| }, |
There was a problem hiding this comment.
The file crates/agnix-rules/rules.json appears to be a duplicate of knowledge-base/rules.json. Both files are being updated with identical changes in this pull request. According to the general rules, the code should be refactored to have a single source of truth to avoid duplication in the first place.
References
- Instead of merging and deduplicating data from multiple sources, refactor the code to have a single source of truth to avoid duplication in the first place.
There was a problem hiding this comment.
Pull request overview
Updates Cursor-related documentation metadata to reflect Cursor 3.0.0 → 3.1.17 triage, primarily by refreshing verification dates and migrating upstream Cursor docs URLs so evidence links don’t 404.
Changes:
- Migrated Cursor evidence URLs to new docs paths (
/docs/rules,/docs/hooks,/docs/subagents) for CUR-* rules and refreshedverified_onto2026-04-22. - Updated research tracking inventory/source tables for Cursor, including expanded config-format coverage.
- Regenerated website rule pages for CUR-001..CUR-019 and added a changelog entry for the triage.
Reviewed changes
Copilot reviewed 4 out of 23 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| website/docs/rules/generated/cur-001.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-002.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-003.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-004.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-005.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-006.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-007.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-008.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-009.md | Refresh Verified On + migrate Cursor Rules doc URL |
| website/docs/rules/generated/cur-010.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-011.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-012.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-013.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-014.md | Refresh Verified On + migrate Cursor Subagents doc URL |
| website/docs/rules/generated/cur-015.md | Refresh Verified On + migrate Cursor Subagents doc URL |
| website/docs/rules/generated/cur-016.md | Refresh Verified On date (environment URL unchanged) |
| website/docs/rules/generated/cur-017.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-018.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| website/docs/rules/generated/cur-019.md | Refresh Verified On + migrate Cursor Hooks doc URL |
| knowledge-base/rules.json | Update CUR-* evidence URLs + verified dates in rules source-of-truth |
| crates/agnix-rules/rules.json | Mirror knowledge-base CUR-* evidence updates for packaged rules data |
| knowledge-base/RESEARCH-TRACKING.md | Update Cursor “Last Reviewed”, doc URLs, and config-format inventory |
| CHANGELOG.md | Document Cursor 3.0.0 → 3.1.17 triage + URL migration |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "source_type": "vendor_docs", | ||
| "source_urls": [ | ||
| "https://cursor.com/docs/context/rules" | ||
| "https://cursor.com/docs/rules" | ||
| ], | ||
| "verified_on": "2026-02-26", | ||
| "verified_on": "2026-04-22", |
There was a problem hiding this comment.
The Cursor docs URL migration is only applied to CUR-* entries here, but this same old URL (https://cursor.com/docs/context/rules) is still referenced elsewhere in this file (e.g., AGM-* and XP-* evidence sources). If the old path now 404s, those rule pages will still contain broken links; consider migrating all remaining occurrences to the new Cursor docs path and regenerating any affected generated docs.
| "source_type": "vendor_docs", | ||
| "source_urls": [ | ||
| "https://cursor.com/docs/context/rules" | ||
| "https://cursor.com/docs/rules" | ||
| ], | ||
| "verified_on": "2026-02-26", | ||
| "verified_on": "2026-04-22", |
There was a problem hiding this comment.
This file updates CUR-* evidence URLs to the new Cursor docs paths, but the old Cursor rules URL (https://cursor.com/docs/context/rules) still appears in other rule entries in this same JSON (e.g., AGM-* / XP-* evidence). If the old URL now 404s, those rules will still publish broken evidence links; consider migrating the remaining occurrences as well so the crate’s embedded rules data stays consistent.
| | Cursor - Rules | https://cursor.com/docs/rules | spec-drift.yml (monthly) | CUR-001 through CUR-009 | | ||
| | Cursor - Hooks | https://cursor.com/docs/hooks | spec-drift.yml (monthly) | CUR-010 through CUR-013, CUR-017 through CUR-019 | | ||
| | Cursor - Subagents | https://cursor.com/docs/subagents | spec-drift.yml (monthly) | CUR-014, CUR-015 | |
There was a problem hiding this comment.
RESEARCH-TRACKING is updated to the new Cursor docs URLs, but the spec-drift baseline file still points at the old Cursor doc paths (see .github/spec-baselines.json entries for cursor-rules/cursor-hooks/cursor-subagents). If those old URLs now 404, the spec-drift workflow will likely fail or report perpetual drift; update the baseline source URLs (and hashes) to match the new paths.
|
Per-comment reply table for round 1
Note: `cursor.com/docs/context/skills` (different URL, used by some XP-SK rules) is still valid (verified) — only the rules/hooks/subagents URLs migrated. Pushing now. |
Reviewer feedback (PR #763 round 1): - Copilot caught that the cursor URL migration was incomplete: 10 AGM-*/XP-* rule entries in rules.json (both copies) also cite the old cursor.com/docs/context/rules URL, but my initial Python pass only matched CUR-* prefix. Migrated all 10 additional refs. - Copilot also caught .github/spec-baselines.json with 3 stale baseline URLs (cursor-rules/cursor-hooks/cursor-subagents). Without this fix, the next spec-drift.yml workflow run would 404. Migrated all 3. Additionally fixed (caught by my own grep, not flagged by reviewers but would have caused a parity test failure): - knowledge-base/VALIDATION-RULES.md: 10 'Source:' lines (bulk sed) - knowledge-base/MONTHLY-REVIEW.md: 3 URL refs - knowledge-base/agent-config-optional-fields.md: 1 markdown link Versioned docs at website/versioned_docs/version-0.12.0/ are frozen historical snapshots and were deliberately not modified. Verified cursor.com/docs/context/skills (a different URL used by some XP-SK rules) is STILL valid - only the rules/hooks/subagents URLs migrated upstream. Not touching that one. Reply-with-reason on Gemini's rules.json duplication concern: this is the project-wide pattern enforced by test_rules_json_parity (same answer as PR #757). Refactor to a build-script-driven approach is out of scope for a triage PR. Verified locally: - cargo clippy --workspace --all-targets --all-features -- -D warnings clean - cargo test -p agnix-rules --tests: parity tests pass
…re ones CI's agnix self-lint failed with 'Unclosed XML tag <String> [XML-001]' because my round-1 fix commit (43b71fa) used 'git add -A' and inadvertently added the gitignored-by-convention working-memory file '.triage-report-749.md' (the exploration report). The report contains prose snippets like 'Option<String>' from Rust type discussions, which agnix's XML-001 rule flagged as unclosed XML tags. Fix: - git rm --cached .triage-report-749.md (file kept locally, removed from index) - Added '.triage-report-*.md' and '.exploration-report-*.md' to .gitignore so future triage PRs (#753, #744, #750, #754) won't accidentally re-include them. Verified locally: cargo run --release -p agnix-cli --bin agnix -- . returns 0 errors, 1 info (the pre-existing XP-SK-001 on plugin/skills/agnix/SKILL.md, unrelated to this PR). Lesson for future triage PRs: use 'git add <file>' explicitly instead of 'git add -A' so untracked working-memory files don't sneak in.
|
Round-2 update Push 2 (`43b71fa`) made CI's agnix self-lint job fail with XML-001 (Unclosed XML tag ''). Root cause: my round-1 fix used `git add -A` which inadvertently included the gitignored-by-convention working-memory file `.triage-report-749.md` (the exploration agent's report). The report has prose snippets like `Option` from Rust type discussions, which agnix's XML-001 rule flags as unclosed XML tags. Push 3 (`6b88069`) fixes it:
Verified locally: `cargo run --release -p agnix-cli --bin agnix -- .` returns 0 errors (1 pre-existing info on `plugin/skills/agnix/SKILL.md` unrelated to this PR). Lesson recorded for future triage PRs: stage files explicitly with `git add ` instead of `git add -A` so untracked working-memory files don't sneak in. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 9 out of 39 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "CUR-010", | ||
| "CUR-011", | ||
| "CUR-012", | ||
| "CUR-013" |
There was a problem hiding this comment.
cursor-hooks baseline only lists CUR-010..013, but CUR-017..019 also cite the Cursor hooks docs (https://cursor.com/docs/hooks) and should be included here so spec-drift changes get attributed to all affected rules.
| "CUR-013" | |
| "CUR-013", | |
| "CUR-017", | |
| "CUR-018", | |
| "CUR-019" |
…view) Reviewer feedback (PR #767 round 1): - Copilot CRITICAL: typed Hook enum still rejected mcp_tool, so even with the raw-JSON allow-list fix, CC-HK-012 (schema mismatch) would fire on every mcp_tool hook. Added Hook::McpTool variant with tool, if, timeout fields (per release notes). Updated all match arms (command(), prompt(), type_name(), the per-variant typed-validation block in rules/hooks/mod.rs); added is_mcp_tool() for symmetry. - Copilot: test was vacuous (only checked CC-HK-016 absence; would have passed with CC-HK-012 still firing). Strengthened to assert diagnostics.is_empty() (zero diagnostics of any rule). Now genuinely fails without the typed-enum addition. - Copilot: comment said 'follows the docs' but docs page hasn't been updated yet; reworded to 'follows the release notes' with a caveat about the doc gap as of 2026-04-23. - Gemini MEDIUM: KNOWN_KEYS dedup -> won't fix (project-wide pattern, same answer as PR #757/#763). Plus fmt drift caught by CI (cargo fmt forgotten after round-1 edit; same lesson as PR #758/#762).
* fix(claude-code): catch up to v2.1.118 (mcp_tool hook type) Closes #764. Triage of Claude Code v2.1.117 -> v2.1.118. The release added `type: "mcp_tool"` so hooks can invoke MCP tools directly. Without this fix, agnix would false-positive CC-HK-016 (unknown hook type) on every v2.1.118+ user following the release notes. Added `"mcp_tool"` to BOTH allow-lists in crates/agnix-core/src/rules/hooks/helpers.rs: - `valid_types` (lines 607, 973): used by CC-HK-016 strict check - `known_non_command` (lines 532, 974): used to flag async on non-command hook types Plus a regression test (`test_cc_hk_016_mcp_tool_type_valid`) asserting `mcp_tool` doesn't trigger CC-HK-016. Doc gap caveat: as of 2026-04-23 the docs at code.claude.com/docs/en/hooks only list 4 types (command, prompt, agent, http). The v2.1.118 release notes explicitly mention mcp_tool and are authoritative until the docs catch up. Other v2.1.118 changes need no agnix change: - Vim visual mode, /cost+/stats -> /usage, custom themes (UI/CLI) - Plugin themes/ directory: agnix's plugin.rs has no strict fields check, no false positive - DISABLE_UPDATES env var: not a config file - wslInheritsWindowsSettings policy key: settings.json field; agnix doesn't validate settings.json fields directly - autoMode.* '\$defaults' token: settings.json field - claude plugin tag (CLI), OAuth/credential bug fixes (runtime) Documentation: - Bumped verified_on to 2026-04-23 for all 25 CC-HK-* rules in knowledge-base/rules.json + synced crates/agnix-rules/rules.json - Regenerated website/docs/rules/generated/*.md Verified locally: - cargo clippy --workspace --all-targets --all-features -- -D warnings clean - cargo test -p agnix-core --lib: passes (+1 new regression test) * fix: expand mcp_tool to typed Hook enum + strengthen test (round 1 review) Reviewer feedback (PR #767 round 1): - Copilot CRITICAL: typed Hook enum still rejected mcp_tool, so even with the raw-JSON allow-list fix, CC-HK-012 (schema mismatch) would fire on every mcp_tool hook. Added Hook::McpTool variant with tool, if, timeout fields (per release notes). Updated all match arms (command(), prompt(), type_name(), the per-variant typed-validation block in rules/hooks/mod.rs); added is_mcp_tool() for symmetry. - Copilot: test was vacuous (only checked CC-HK-016 absence; would have passed with CC-HK-012 still firing). Strengthened to assert diagnostics.is_empty() (zero diagnostics of any rule). Now genuinely fails without the typed-enum addition. - Copilot: comment said 'follows the docs' but docs page hasn't been updated yet; reworded to 'follows the release notes' with a caveat about the doc gap as of 2026-04-23. - Gemini MEDIUM: KNOWN_KEYS dedup -> won't fix (project-wide pattern, same answer as PR #757/#763). Plus fmt drift caught by CI (cargo fmt forgotten after round-1 edit; same lesson as PR #758/#762).
Summary
Triage of Cursor 3.0.0 -> 3.1.17 (issue #749). Re-verified all 19 CUR-* rules against the upstream changelog at
cursor.com/changelog. No code changes required, but a documentation URL migration was discovered.Why no code changes
The 3.0/3.1 features are all UX-side or cloud-side — none touch any on-disk file agnix validates:
Schema verification (all match agnix exactly)
.cursor/rules/*.mdccursor.com/docs/rulesdescription,globs,alwaysApply— matchesKNOWN_KEYSinschemas/cursor.rs.cursor/agents/*.mdcursor.com/docs/subagentsname,description,model,readonly,is_background— matches agnix exactly.cursor/hooks.jsoncursor.com/docs/hooksCURSOR_HOOK_EVENTSexactly (no events added or removed).cursor/environment.jsoncursor.com/docs/cloud-agent/setup(unchanged)Doc URL migration upstream
Cursor renamed several docs paths in this window. This is the user-visible part of the PR — without it, the URLs in
rules.json/VALIDATION-RULES.md404:cursor.com/docs/context/rulescursor.com/docs/rules(CUR-001..009)cursor.com/docs/agent/hookscursor.com/docs/hooks(CUR-010..013, CUR-017..019)cursor.com/docs/context/subagentscursor.com/docs/subagents(CUR-014, CUR-015)Updated 18 source URL references across 18 rule entries. CUR-016 (cloud-agent setup) is unchanged.
Doc updates
knowledge-base/rules.jsonandcrates/agnix-rules/rules.json: bumpedverified_onto2026-04-22for all 19 CUR-* rules + URL migrations aboveknowledge-base/RESEARCH-TRACKING.md:.cursor/rules/*.mdcand.cursorrules; now lists all 5 file types (.cursor/hooks.json,.cursor/agents/*.md,.cursor/environment.jsonadded)website/docs/rules/generated/*.mdToolVersions
ToolVersions::cursorisOption<String>. Nothing to bump.Test plan
cargo test -p agnix-rules --tests: 47 + 4 parity tests passcargo clippy --workspace --all-targets --all-features -- -D warningscleanCloses #749.