-
Notifications
You must be signed in to change notification settings - Fork 2
feat: support check dead links in lint command #184
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
Conversation
🦋 Changeset detectedLatest commit: 0f74b0d The changes in this PR will be included in the next version bump. This PR includes changesets to release 2 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Warning Rate limit exceeded@JounQin has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 16 minutes and 14 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughAdds a new dead-link remark-lint rule and enables it in remarkrc; persists CLI lint options to disk and exposes a Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant CLI as doom CLI (lint)
participant FS as FileSystem
participant LINT as checkDeadLinks
participant CFG as loadConfig
participant PD as PluginDriver/RouteService
participant RLK as remarkLink
User->>CLI: doom lint [--debug]
CLI->>FS: mkdir -p STORAGE_DIR
CLI->>FS: write OPTIONS_FILE { root, globalOptions }
CLI->>LINT: run remark with plugins
LINT->>FS: read OPTIONS_FILE (lazy)
LINT->>CFG: loadConfig(root, globalOptions)
CFG-->>LINT: config + configFilePath
LINT->>PD: ensure/create RouteService (scan if needed)
LINT->>RLK: run remarkLink({ lint: true, routeService, ... })
RLK-->>LINT: diagnostics
LINT-->>CLI: report diagnostics
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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.
Pull Request Overview
This PR adds support for checking dead links in the lint command and updates dependencies. The main changes include implementing a new dead link checker that integrates with the existing lint workflow, along with updating file imports from .js to .ts extensions throughout the codebase.
- Adds a new
checkDeadLinksremark plugin that validates links against the route service - Updates the lint command to store options for dead link checking functionality
- Updates various dependencies including Playwright, RSPress packages, and ESLint
Reviewed Changes
Copilot reviewed 37 out of 38 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/doom/src/remark-lint/check-dead-links.ts | New dead link checker implementation using RSPress RouteService |
| packages/doom/src/cli/lint.ts | Enhanced lint command with options storage for dead link checking |
| packages/doom/src/remarkrc.ts | Integrated checkDeadLinks plugin into remark configuration |
| packages/doom/src/utils/constants.ts | Added storage directory and options file constants |
| Multiple .ts files | Updated import paths from .js to .ts extensions |
| package.json files | Updated dependencies to newer versions |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
commit: |
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: JounQin <admin@1stg.me>
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.
Actionable comments posted: 11
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (37)
.changeset/metal-turkeys-pay.md(1 hunks).changeset/silly-rabbits-invite.md(1 hunks)package.json(1 hunks)packages/doom/package.json(3 hunks)packages/doom/src/cli/helpers.ts(1 hunks)packages/doom/src/cli/lint.ts(2 hunks)packages/doom/src/cli/load-config.ts(3 hunks)packages/doom/src/plugins/api/index.ts(1 hunks)packages/doom/src/plugins/attributes/index.ts(1 hunks)packages/doom/src/plugins/attributes/remark-attributes/index.ts(1 hunks)packages/doom/src/plugins/auto-sidebar/index.ts(1 hunks)packages/doom/src/plugins/auto-sidebar/utils.ts(1 hunks)packages/doom/src/plugins/auto-sidebar/walk.ts(1 hunks)packages/doom/src/plugins/auto-toc/index.ts(1 hunks)packages/doom/src/plugins/auto-toc/remark-auto-toc.ts(1 hunks)packages/doom/src/plugins/directives/index.ts(1 hunks)packages/doom/src/plugins/global/index.ts(1 hunks)packages/doom/src/plugins/index.ts(1 hunks)packages/doom/src/plugins/mermaid/index.ts(1 hunks)packages/doom/src/plugins/permission/index.ts(1 hunks)packages/doom/src/plugins/replace/index.ts(1 hunks)packages/doom/src/plugins/replace/normalize-img-src.ts(1 hunks)packages/doom/src/plugins/replace/parse-toc.ts(1 hunks)packages/doom/src/plugins/replace/rehype-normalize-link.ts(1 hunks)packages/doom/src/plugins/replace/remark-replace.ts(1 hunks)packages/doom/src/plugins/replace/resolve-reference.ts(1 hunks)packages/doom/src/plugins/shiki/index.ts(1 hunks)packages/doom/src/plugins/shiki/transformers/index.ts(1 hunks)packages/doom/src/remark-lint/check-dead-links.ts(1 hunks)packages/doom/src/remark-lint/index.ts(1 hunks)packages/doom/src/remarkrc.ts(2 hunks)packages/doom/src/shared/index.ts(1 hunks)packages/doom/src/types.ts(1 hunks)packages/doom/src/utils/constants.ts(1 hunks)packages/doom/src/utils/helpers.ts(1 hunks)packages/doom/src/utils/index.ts(1 hunks)packages/export/package.json(1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx,js,jsx,md,yml,yaml,json}
📄 CodeRabbit inference engine (AGENTS.md)
Format code using the repository’s Prettier configuration (yarn format)
Files:
packages/doom/src/plugins/replace/resolve-reference.tspackages/doom/src/plugins/replace/normalize-img-src.tspackages/doom/src/types.tspackages/doom/src/plugins/auto-toc/index.tspackages/doom/src/remark-lint/index.tspackages/doom/src/plugins/permission/index.tspackages/doom/src/plugins/directives/index.tspackages/doom/src/plugins/attributes/index.tspackages/doom/src/plugins/mermaid/index.tspackages/doom/src/utils/constants.tspackages/doom/src/cli/helpers.tspackages/doom/src/plugins/shiki/transformers/index.tspackages/doom/src/remarkrc.tspackages/doom/src/shared/index.tspackages/export/package.jsonpackage.jsonpackages/doom/src/plugins/replace/index.tspackages/doom/src/plugins/auto-sidebar/utils.tspackages/doom/src/cli/load-config.tspackages/doom/src/utils/index.tspackages/doom/src/utils/helpers.tspackages/doom/src/plugins/auto-sidebar/walk.tspackages/doom/src/plugins/replace/remark-replace.tspackages/doom/src/plugins/auto-toc/remark-auto-toc.tspackages/doom/src/plugins/shiki/index.tspackages/doom/src/plugins/api/index.tspackages/doom/src/remark-lint/check-dead-links.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/replace/rehype-normalize-link.tspackages/doom/src/plugins/attributes/remark-attributes/index.tspackages/doom/src/plugins/replace/parse-toc.tspackages/doom/src/plugins/index.tspackages/doom/src/cli/lint.tspackages/doom/package.jsonpackages/doom/src/plugins/auto-sidebar/index.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Code must adhere to TypeScript strict-mode rules (no implicit any, strict null checks, etc.)
Maintain strong type coverage; validate with yarn typecov
Files:
packages/doom/src/plugins/replace/resolve-reference.tspackages/doom/src/plugins/replace/normalize-img-src.tspackages/doom/src/types.tspackages/doom/src/plugins/auto-toc/index.tspackages/doom/src/remark-lint/index.tspackages/doom/src/plugins/permission/index.tspackages/doom/src/plugins/directives/index.tspackages/doom/src/plugins/attributes/index.tspackages/doom/src/plugins/mermaid/index.tspackages/doom/src/utils/constants.tspackages/doom/src/cli/helpers.tspackages/doom/src/plugins/shiki/transformers/index.tspackages/doom/src/remarkrc.tspackages/doom/src/shared/index.tspackages/doom/src/plugins/replace/index.tspackages/doom/src/plugins/auto-sidebar/utils.tspackages/doom/src/cli/load-config.tspackages/doom/src/utils/index.tspackages/doom/src/utils/helpers.tspackages/doom/src/plugins/auto-sidebar/walk.tspackages/doom/src/plugins/replace/remark-replace.tspackages/doom/src/plugins/auto-toc/remark-auto-toc.tspackages/doom/src/plugins/shiki/index.tspackages/doom/src/plugins/api/index.tspackages/doom/src/remark-lint/check-dead-links.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/replace/rehype-normalize-link.tspackages/doom/src/plugins/attributes/remark-attributes/index.tspackages/doom/src/plugins/replace/parse-toc.tspackages/doom/src/plugins/index.tspackages/doom/src/cli/lint.tspackages/doom/src/plugins/auto-sidebar/index.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
Follow ESLint project-specific rules; avoid disabling rules without justification
Files:
packages/doom/src/plugins/replace/resolve-reference.tspackages/doom/src/plugins/replace/normalize-img-src.tspackages/doom/src/types.tspackages/doom/src/plugins/auto-toc/index.tspackages/doom/src/remark-lint/index.tspackages/doom/src/plugins/permission/index.tspackages/doom/src/plugins/directives/index.tspackages/doom/src/plugins/attributes/index.tspackages/doom/src/plugins/mermaid/index.tspackages/doom/src/utils/constants.tspackages/doom/src/cli/helpers.tspackages/doom/src/plugins/shiki/transformers/index.tspackages/doom/src/remarkrc.tspackages/doom/src/shared/index.tspackages/doom/src/plugins/replace/index.tspackages/doom/src/plugins/auto-sidebar/utils.tspackages/doom/src/cli/load-config.tspackages/doom/src/utils/index.tspackages/doom/src/utils/helpers.tspackages/doom/src/plugins/auto-sidebar/walk.tspackages/doom/src/plugins/replace/remark-replace.tspackages/doom/src/plugins/auto-toc/remark-auto-toc.tspackages/doom/src/plugins/shiki/index.tspackages/doom/src/plugins/api/index.tspackages/doom/src/remark-lint/check-dead-links.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/replace/rehype-normalize-link.tspackages/doom/src/plugins/attributes/remark-attributes/index.tspackages/doom/src/plugins/replace/parse-toc.tspackages/doom/src/plugins/index.tspackages/doom/src/cli/lint.tspackages/doom/src/plugins/auto-sidebar/index.ts
packages/**
📄 CodeRabbit inference engine (AGENTS.md)
Organize code as a Yarn workspaces monorepo; place package code under packages/
Files:
packages/doom/src/plugins/replace/resolve-reference.tspackages/doom/src/plugins/replace/normalize-img-src.tspackages/doom/src/types.tspackages/doom/src/plugins/auto-toc/index.tspackages/doom/src/remark-lint/index.tspackages/doom/src/plugins/permission/index.tspackages/doom/src/plugins/directives/index.tspackages/doom/src/plugins/attributes/index.tspackages/doom/src/plugins/mermaid/index.tspackages/doom/src/utils/constants.tspackages/doom/src/cli/helpers.tspackages/doom/src/plugins/shiki/transformers/index.tspackages/doom/src/remarkrc.tspackages/doom/src/shared/index.tspackages/export/package.jsonpackages/doom/src/plugins/replace/index.tspackages/doom/src/plugins/auto-sidebar/utils.tspackages/doom/src/cli/load-config.tspackages/doom/src/utils/index.tspackages/doom/src/utils/helpers.tspackages/doom/src/plugins/auto-sidebar/walk.tspackages/doom/src/plugins/replace/remark-replace.tspackages/doom/src/plugins/auto-toc/remark-auto-toc.tspackages/doom/src/plugins/shiki/index.tspackages/doom/src/plugins/api/index.tspackages/doom/src/remark-lint/check-dead-links.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/replace/rehype-normalize-link.tspackages/doom/src/plugins/attributes/remark-attributes/index.tspackages/doom/src/plugins/replace/parse-toc.tspackages/doom/src/plugins/index.tspackages/doom/src/cli/lint.tspackages/doom/package.jsonpackages/doom/src/plugins/auto-sidebar/index.ts
packages/doom/**
📄 CodeRabbit inference engine (AGENTS.md)
Place the main documentation tool and CLI in packages/doom/
Files:
packages/doom/src/plugins/replace/resolve-reference.tspackages/doom/src/plugins/replace/normalize-img-src.tspackages/doom/src/types.tspackages/doom/src/plugins/auto-toc/index.tspackages/doom/src/remark-lint/index.tspackages/doom/src/plugins/permission/index.tspackages/doom/src/plugins/directives/index.tspackages/doom/src/plugins/attributes/index.tspackages/doom/src/plugins/mermaid/index.tspackages/doom/src/utils/constants.tspackages/doom/src/cli/helpers.tspackages/doom/src/plugins/shiki/transformers/index.tspackages/doom/src/remarkrc.tspackages/doom/src/shared/index.tspackages/doom/src/plugins/replace/index.tspackages/doom/src/plugins/auto-sidebar/utils.tspackages/doom/src/cli/load-config.tspackages/doom/src/utils/index.tspackages/doom/src/utils/helpers.tspackages/doom/src/plugins/auto-sidebar/walk.tspackages/doom/src/plugins/replace/remark-replace.tspackages/doom/src/plugins/auto-toc/remark-auto-toc.tspackages/doom/src/plugins/shiki/index.tspackages/doom/src/plugins/api/index.tspackages/doom/src/remark-lint/check-dead-links.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/replace/rehype-normalize-link.tspackages/doom/src/plugins/attributes/remark-attributes/index.tspackages/doom/src/plugins/replace/parse-toc.tspackages/doom/src/plugins/index.tspackages/doom/src/cli/lint.tspackages/doom/package.jsonpackages/doom/src/plugins/auto-sidebar/index.ts
packages/export/**
📄 CodeRabbit inference engine (AGENTS.md)
Place document export functionality in packages/export/
Files:
packages/export/package.json
🧠 Learnings (6)
📓 Common learnings
Learnt from: JounQin
PR: alauda/doom#30
File: src/runtime/components/K8sCrd.tsx:5-5
Timestamp: 2025-05-26T09:09:21.339Z
Learning: The alauda/doom project uses yarn v4 for dependency management, which handles package exports and module resolution correctly, so imports like `rspress/core/theme` work without any ESLint errors.
📚 Learning: 2025-09-24T04:08:32.103Z
Learnt from: CR
PR: alauda/doom#0
File: AGENTS.md:0-0
Timestamp: 2025-09-24T04:08:32.103Z
Learning: Applies to **/*.{ts,tsx} : Maintain strong type coverage; validate with yarn typecov
Applied to files:
packages/doom/src/shared/index.tspackages/doom/src/utils/helpers.ts
📚 Learning: 2025-06-06T07:08:55.881Z
Learnt from: JounQin
PR: alauda/doom#69
File: package.json:101-101
Timestamp: 2025-06-06T07:08:55.881Z
Learning: When a package has peer dependencies that require TypeScript (like `eslint-react/eslint-plugin`), TypeScript should be moved from devDependencies to dependencies to satisfy the peer dependency requirement.
Applied to files:
package.json
📚 Learning: 2025-05-29T16:25:28.086Z
Learnt from: JounQin
PR: alauda/doom#40
File: src/plugins/sitemap/index.ts:7-7
Timestamp: 2025-05-29T16:25:28.086Z
Learning: In rspress/shared v2.0.0-beta.8, the '/logger' export is available in the package exports field, so imports like `import { logger } from 'rspress/shared/logger'` are valid even if ESLint shows resolution errors. This is used throughout the codebase in files like src/cli/translate.ts, src/cli/load-config.ts, src/utils/git.ts, and src/plugins/sitemap/index.ts.
Applied to files:
packages/doom/src/plugins/replace/index.tspackages/doom/src/utils/index.tspackages/doom/src/plugins/global/index.tspackages/doom/src/plugins/index.ts
📚 Learning: 2025-05-26T09:09:21.339Z
Learnt from: JounQin
PR: alauda/doom#30
File: src/runtime/components/K8sCrd.tsx:5-5
Timestamp: 2025-05-26T09:09:21.339Z
Learning: The alauda/doom project uses yarn v4 for dependency management, which handles package exports and module resolution correctly, so imports like `rspress/core/theme` work without any ESLint errors.
Applied to files:
packages/doom/src/plugins/global/index.tspackages/doom/package.json
📚 Learning: 2025-07-09T02:33:05.638Z
Learnt from: JounQin
PR: alauda/doom#117
File: src/remark-lint/no-heading-punctuation.ts:4-4
Timestamp: 2025-07-09T02:33:05.638Z
Learning: In the alauda/doom project, JounQin prefers to keep the `toString` import from `mdast-util-to-string` as is, even though it shadows the global toString property. Variable shadowing warnings for this specific case should not be flagged as issues.
Applied to files:
packages/doom/src/plugins/global/index.ts
🧬 Code graph analysis (3)
packages/doom/src/remarkrc.ts (1)
packages/doom/src/remark-lint/check-dead-links.ts (1)
checkDeadLinks(20-57)
packages/doom/src/remark-lint/check-dead-links.ts (3)
packages/doom/src/utils/constants.ts (1)
OPTIONS_FILE(10-10)packages/doom/src/types.ts (1)
GlobalCliOptions(17-35)packages/doom/src/cli/load-config.ts (1)
loadConfig(393-571)
packages/doom/src/cli/lint.ts (2)
packages/doom/src/types.ts (1)
GlobalCliOptions(17-35)packages/doom/src/utils/constants.ts (2)
STORAGE_DIR(8-8)OPTIONS_FILE(10-10)
🔇 Additional comments (9)
packages/doom/src/plugins/api/index.ts (1)
6-10: Consistent TS module specifiersThe switch to explicit
.tsimports/exports keeps NodeNext resolution consistent with the rest of the repo—looks good.packages/doom/src/plugins/attributes/remark-attributes/index.ts (1)
5-8: TS extension alignmentThanks for updating the internal imports to
.ts; this keeps the attribute plugin in sync with the new resolution strategy.package.json (1)
36-49: Version bumps look good.The dev dependency updates stay within the expected compatibility range and align with the existing toolchain. 👍
packages/doom/src/plugins/shiki/transformers/index.ts (1)
1-1: Export target looks goodThe extension alignment keeps the transformer barrel up to date; no further action needed.
packages/doom/src/cli/helpers.ts (1)
7-8: Import updates are consistentThe
.tstargets exist in this package and keep type resolution aligned—looks good.packages/doom/src/plugins/permission/index.ts (1)
3-12: Permission plugin imports are alignedThe updated specifiers mirror the TypeScript sources without altering behaviour. No issues here.
packages/doom/src/plugins/auto-sidebar/walk.ts (1)
22-26: Sidebar helpers import rewrite looks fineThe updated specifiers point at the TypeScript sources already in this package; nothing further needed.
packages/doom/src/plugins/replace/index.ts (1)
6-18: TS extensions re-export alignment looks goodThanks for updating the replace plugin’s imports/exports to point at the
.tssources. This keeps the module graph consistent with the rest of the TypeScript-first cleanup in this PR.packages/doom/src/plugins/shiki/index.ts (1)
1-1: Shiki transformer export matches TS sourcesThe re-export now targets the
.tsentry point, lining up with the repo-wide extension change. Looks good.
02f3f46 to
be19ef1
Compare
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.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/doom/src/remark-lint/check-dead-links.ts(1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{ts,tsx,js,jsx,md,yml,yaml,json}
📄 CodeRabbit inference engine (AGENTS.md)
Format code using the repository’s Prettier configuration (yarn format)
Files:
packages/doom/src/remark-lint/check-dead-links.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Code must adhere to TypeScript strict-mode rules (no implicit any, strict null checks, etc.)
Maintain strong type coverage; validate with yarn typecov
Files:
packages/doom/src/remark-lint/check-dead-links.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
Follow ESLint project-specific rules; avoid disabling rules without justification
Files:
packages/doom/src/remark-lint/check-dead-links.ts
packages/**
📄 CodeRabbit inference engine (AGENTS.md)
Organize code as a Yarn workspaces monorepo; place package code under packages/
Files:
packages/doom/src/remark-lint/check-dead-links.ts
packages/doom/**
📄 CodeRabbit inference engine (AGENTS.md)
Place the main documentation tool and CLI in packages/doom/
Files:
packages/doom/src/remark-lint/check-dead-links.ts
🧠 Learnings (1)
📚 Learning: 2025-05-29T10:22:30.004Z
Learnt from: JounQin
PR: alauda/doom#34
File: src/cli/load-config.ts:290-0
Timestamp: 2025-05-29T10:22:30.004Z
Learning: In the alauda/doom project, the team prefers throwing descriptive errors for invalid configuration rather than using optional chaining or graceful fallbacks. This fail-fast approach helps catch configuration issues early during development.
Applied to files:
packages/doom/src/remark-lint/check-dead-links.ts
🧬 Code graph analysis (1)
packages/doom/src/remark-lint/check-dead-links.ts (3)
packages/doom/src/utils/constants.ts (1)
OPTIONS_FILE(10-10)packages/doom/src/types.ts (1)
GlobalCliOptions(17-35)packages/doom/src/cli/load-config.ts (1)
loadConfig(393-571)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
- GitHub Check: Build and Lint with Node.js 22 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 18 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 20 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 24 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 24 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 22 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 20 on ubuntu-latest
- GitHub Check: Build and Lint with Node.js 18 on ubuntu-latest
be19ef1 to
0f74b0d
Compare
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
close IDP-1297
Summary by CodeRabbit
New Features
Chores
Notes