1
0
mirror of https://github.com/hustcer/deepseek-review.git synced 2026-05-13 05:16:05 +08:00

20 Commits

Author SHA1 Message Date
Justin Ma
9163ca2434 deps: Upgrade Nu to 0.112.2 & hustcer/setup-nu to v3.23 (#202)
* deps: Upgrade Nu to 0.112.2

* deps: Upgrade hustcer/setup-nu@v3.23
2026-05-07 21:24:17 +08:00
Xinnil
cb78a000a7 [RR] Add Trigger for Skipping CR (#199)
* new constants and check

* Update

* Delete comments
2026-05-07 21:05:53 +08:00
Xinnil
d1dcf1311d Review models Integration (#200)
* Update review.nu

Update model to preavoid depreciation

* Update refs

* Update payload in review

* Update the cr help
2026-05-07 20:57:52 +08:00
Justin Ma
6cbc5ef631 deps: Upgrade Nu to 0.111 (#198) 2026-03-01 15:55:32 +08:00
Justin Ma
92a3c2ae17 fix: Try to fix workflow error for Nu 0.111 (#197)
* fix: Try to fix workflow error for Nu 0.111

* chore: Update readme
2026-02-09 10:41:14 +08:00
hustcer
90c8878923 Bump to v1.20 2026-01-23 19:53:21 +08:00
Justin Ma
231c2d8432 chore: Update Nushell to 0.110.0 (#196) 2026-01-21 07:50:05 +08:00
hustcer
923ee0f999 deps: Upgrade hustcer/setup-nu to v3.22 2025-12-13 22:42:11 +08:00
Justin Ma
32cffba4d1 deps: Upgrade Nu to 0.109.1 (#195) 2025-12-03 22:34:55 +08:00
Justin Ma
0c001b0ee2 refactor: A better from env parser (#194)
* refactor: A better `from env` parser

* refactor: A better `from env` parser
2025-11-29 22:45:55 +08:00
hustcer
edcd90e48b deps: Upgrade actions/checkout@v6 2025-11-26 23:10:18 +08:00
Justin Ma
dfc4c59c1f fix: Fix from env for .env file parsing (#193)
* fix: Fix `from env` for .env file parsing

* fix: Fix `from env` for .env file parsing

* fix: Fix `from env` for .env file parsing
2025-11-26 23:07:41 +08:00
hustcer
92061e6c82 chore: Update README.md 2025-11-22 23:22:03 +08:00
Justin Ma
3c3f0a3c85 deps: Upgrade hustcer/setup-nu to v3.21 (#192) 2025-10-25 11:13:42 +08:00
Justin Ma
7a87f8adc0 chore: Update nutest to main ref (#191) 2025-10-24 23:06:24 +08:00
Justin Ma
d7b2e3a926 deps: Upgrade Nushell version to 0.108.0 (#190) 2025-10-24 22:51:09 +08:00
hustcer
91ae07bb82 deps: Upgrade hustcer/setup-nu to v3.20 2025-08-25 20:03:18 +08:00
hustcer
d830da6937 deps: Upgrade to actions/checkout@v5 2025-08-25 19:48:24 +08:00
hustcer
885b55dbb0 chore: Update minimum required Nushell version to 0.106.1 2025-08-18 21:16:27 +08:00
hustcer
317d3c92da fix: Make config-check use default value for --config flag 2025-08-13 22:14:52 +08:00
16 changed files with 168 additions and 92 deletions

View File

@@ -37,7 +37,7 @@ jobs:
As a senior Nushell engineer, perform comprehensive script review with focus on: As a senior Nushell engineer, perform comprehensive script review with focus on:
### 1. Core Requirements: ### 1. Core Requirements:
- Validate Nu 0.90+ compatibility - Validate Nu 0.100+ compatibility
- Check structured data handling - Check structured data handling
- Verify pipeline efficiency - Verify pipeline efficiency
- Assess module organization - Assess module organization
@@ -55,7 +55,7 @@ jobs:
- Parallel execution opportunities - Parallel execution opportunities
**Rules:** **Rules:**
- Target Nu 0.90+ features - Target Nu 0.100+ features
- Highlight data flow vulnerabilities - Highlight data flow vulnerabilities
- Suggest structured data optimizations - Suggest structured data optimizations
- Keep feedback Nu-specific - Keep feedback Nu-specific

View File

@@ -42,12 +42,12 @@ jobs:
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v6
- name: Checkout Nutest Repo - name: Checkout Nutest Repo
uses: actions/checkout@v4 uses: actions/checkout@v6
with: with:
ref: v1.1.0 ref: main
path: nutest path: nutest
repository: vyadh/nutest repository: vyadh/nutest
sparse-checkout: nutest/ sparse-checkout: nutest/

View File

@@ -1,6 +1,34 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [1.20.0] - 2026-01-23
### Bug Fixes
- Make config-check use default value for --config flag
- Fix `from env` for .env file parsing (#193)
### Miscellaneous Tasks
- Update minimum required Nushell version to 0.110.0
- Update nutest to main ref (#191)
- Update README.md
### Refactor
- A better `from env` parser (#194)
### Deps
- Upgrade to actions/checkout@v5
- Upgrade `hustcer/setup-nu` to v3.20
- Upgrade Nushell version to 0.108.0 (#190)
- Upgrade `hustcer/setup-nu` to v3.21 (#192)
- Upgrade actions/checkout@v6
- Upgrade Nu to 0.109.1 (#195)
- Update Nushell to 0.110.0 (#196)
- Upgrade `hustcer/setup-nu` to v3.22
## [1.19.0] - 2025-07-23 ## [1.19.0] - 2025-07-23
### Bug Fixes ### Bug Fixes

View File

@@ -7,31 +7,29 @@
[中文说明](README.zh-CN.md) [中文说明](README.zh-CN.md)
`deepseek-review` also offers seamless integration with DeepSeek models on SiliconCloud. [Sign Up Now](https://cloud.siliconflow.cn/i/rqCdIxzS) to **Claim Your Free 20 Million Tokens** and start exploring its capabilities!
## Features ## Features
### GitHub Action ### GitHub Action
- Automate PR Reviews with DeepSeek via GitHub Action - Automate PR Reviews with DeepSeek via GitHub Action
- Add `skip cr` or `skip review` to PR Title or Body to Disable Code Review in GitHub Actions - Add `skip cr` or `skip review` to the PR title or body to disable code review in GitHub Actions
- Cross-platform Support: Compatible with GitHub Runners across `macOS`, `Ubuntu`, and `Windows`. - Cross-platform Support: Compatible with GitHub Runners across `macOS`, `Ubuntu`, and `Windows`.
### Local Code Review ### Local Code Review
- Streaming Output Support for Local Code Review - Streaming output support for local code review
- Review Remote GitHub PRs Directly from Your Local CLI - Review remote GitHub PRs directly from your local CLI
- Review Commit Changes with DeepSeek for Any Local Repository by CLI - Review commit changes with DeepSeek for any local repository via CLI
- Support On-demand Changes Generation via `git show`/`git diff` Command for Further Code Review - Support on-demand change generation via `git show`/`git diff` commands for further code review
- Output Code Review Result to Specified File in Markdown Format - Output code review results to a specified file in Markdown format
- Cross-platform Compatibility: Designed to function seamlessly across all platforms capable of running [Nushell](https://github.com/nushell/nushell) - Cross-platform compatibility: Designed to function seamlessly across all platforms capable of running [Nushell](https://github.com/nushell/nushell)
### Both GH Action & Local ### Both GH Action & Local
- Support Both DeepSeek's `V3` & `R1` Models - Support both DeepSeek's `V3` and `R1` models
- Fully Customizable: Choose Models, Base URLs, and Prompts - Fully customizable: Choose models, base URLs, and prompts
- Supports Self-Hosted DeepSeek Models for Enhanced Flexibility - Support self-hosted DeepSeek models for enhanced flexibility
- Perform Code Reviews for Changes That either Include or Exclude Specific Files - Perform code reviews for changes that either include or exclude specific files
## Planned Features ## Planned Features
@@ -40,7 +38,7 @@
## Code Review with GitHub Action ## Code Review with GitHub Action
### Initiate Code Review When PR was Created ### Initiate Code Review When a PR is Created
Add a GitHub workflow with the following contents: Add a GitHub workflow with the following contents:
@@ -82,13 +80,13 @@ jobs:
</details> </details>
When a PR is created, DeepSeek code review will be automatically triggered, and the review results(depend on your prompt) will be posted as comments on the corresponding PR. For example: When a PR is created, DeepSeek code review will be automatically triggered, and the review results (depending on your prompt) will be posted as comments on the corresponding PR. For example:
- [Example 1](https://github.com/hustcer/deepseek-review/pull/30) with [default prompts](https://github.com/hustcer/deepseek-review/blob/main/action.yaml#L35) & [Run Log](https://github.com/hustcer/deepseek-review/actions/runs/13043609677/job/36390331791#step:2:53). - [Example 1](https://github.com/hustcer/deepseek-review/pull/30) with [default prompts](https://github.com/hustcer/deepseek-review/blob/main/action.yaml#L35) & [Run Log](https://github.com/hustcer/deepseek-review/actions/runs/13043609677/job/36390331791#step:2:53).
- [Example 2](https://github.com/hustcer/deepseek-review/pull/68) with [this prompt](https://github.com/hustcer/deepseek-review/blob/eba892d969049caff00b51a31e5c093aeeb536e3/.github/workflows/cr.yml#L32) - [Example 2](https://github.com/hustcer/deepseek-review/pull/68) with [this prompt](https://github.com/hustcer/deepseek-review/blob/eba892d969049caff00b51a31e5c093aeeb536e3/.github/workflows/cr.yml#L32)
### Trigger CR When a Specific Label was Added ### Trigger Code Review When a Specific Label is Added
If you don't want automatic review on PR creation, you can choose to trigger code review by adding a label. For example, create the following workflow: If you don't want automatic code review on PR creation, you can choose to trigger code review by adding a label. For example, create the following workflow:
```yaml ```yaml
name: Code Review name: Code Review
@@ -121,21 +119,21 @@ With this setup, DeepSeek code review will not run automatically upon PR creatio
| Name | Type | Description | | Name | Type | Description |
| -------------- | ------ | ----------------------------------------------------------------------- | | -------------- | ------ | ----------------------------------------------------------------------- |
| chat-token | String | Required, DeepSeek API Token | | chat-token | String | Required, DeepSeek API Token |
| model | String | Optional, The model used for code review, defaults to `deepseek-chat` | | model | String | Optional, The model used for code review, defaults to `deepseek-v4-flash` |
| base-url | String | Optional, DeepSeek API Base URL, defaults to `https://api.deepseek.com` | | base-url | String | Optional, DeepSeek API Base URL, defaults to `https://api.deepseek.com` |
| max-length | Int | Optional, Maximum length(Unicode width) of the content for review, if the content length exceeds this value, the review will be skipped. Default `0` means no limit. | | max-length | Int | Optional, Maximum length (Unicode width) of the content for review. If the content length exceeds this value, the review will be skipped. Default `0` means no limit. |
| sys-prompt | String | Optional, System prompt corresponding to `$sys_prompt` in the payload, default value see note below | | sys-prompt | String | Optional, System prompt corresponding to `$sys_prompt` in the payload, default value see note below |
| user-prompt | String | Optional, User prompt corresponding to `$user_prompt` in the payload, default value see note below | | user-prompt | String | Optional, User prompt corresponding to `$user_prompt` in the payload, default value see note below |
| temperature | Number | Optional, The temperature for the model to generate the response, between `0` and `2`, default value `0.3` | | temperature | Number | Optional, The temperature for the model to generate the response, between `0` and `2`. Default value is `0.3` |
| include-patterns | String | Optional, The comma separated file patterns to include in the code review. No default | | include-patterns | String | Optional, Comma-separated file patterns to include in the code review. No default |
| exclude-patterns | String | Optional, The comma separated file patterns to exclude in the code review. Default to `pnpm-lock.yaml,package-lock.json,*.lock` | | exclude-patterns | String | Optional, Comma-separated file patterns to exclude from the code review. Defaults to `pnpm-lock.yaml,package-lock.json,*.lock` |
| github-token | String | Optional, The `GITHUB_TOKEN` secret or personal access token to authenticate. Defaults to `${{ github.token }}`. | | github-token | String | Optional, The `GITHUB_TOKEN` secret or personal access token to authenticate. Defaults to `${{ github.token }}`. |
**DeepSeek API Call Payload**: **DeepSeek API Call Payload**:
```js ```js
{ {
// `$model` default value: deepseek-chat // `$model` default value: deepseek-v4-flash
model: $model, model: $model,
stream: false, stream: false,
temperature: $temperature, temperature: $temperature,
@@ -154,18 +152,18 @@ With this setup, DeepSeek code review will not run automatically upon PR creatio
> [!NOTE] > [!NOTE]
> >
> You can control the language of the code review results by the language of the > You can control the language of the code review results through the language of the
> Prompt. The default Prompt language is currently English. When you use a Chinese > prompt. The default prompt language is currently English. When you use a Chinese
> Prompt, the generated code review results will be in Chinese. > prompt, the generated code review results will be in Chinese.
## Local Code Review ## Local Code Review
### Required Tools ### Required Tools
To perform code reviews locally(should works for `macOS`, `Ubuntu`, and `Windows`), you need to install the following tools: To perform code reviews locally (works on `macOS`, `Ubuntu`, and `Windows`), you need to install the following tools:
- [`Nushell`](https://www.nushell.sh/book/installation.html). It is recommended to install the latest versions(min version required: `0.103`). - [`Nushell`](https://www.nushell.sh/book/installation.html). It is recommended to install the latest version (minimum version required: `0.112.2`).
- The latest version of [`awk`](https://github.com/onetrueawk/awk) or [`gawk`](https://www.gnu.org/software/gawk/) is required, with `gawk` being the preferred choice. - The latest version of [`awk`](https://github.com/onetrueawk/awk) or [`gawk`](https://www.gnu.org/software/gawk/) is required, with `gawk` being preferred.
- Clone this repository to your local machine, navigate to the repository directory, and run `nu cr -h`. You should see an output similar to the following: - Clone this repository to your local machine, navigate to the repository directory, and run `nu cr -h`. You should see an output similar to the following:
```console ```console
@@ -183,7 +181,7 @@ Flags:
-t, --diff-to <string>: Git diff ending commit SHA -t, --diff-to <string>: Git diff ending commit SHA
-c, --patch-cmd <string>: The `git show` or `git diff` command to get the diff content, for local CR only -c, --patch-cmd <string>: The `git show` or `git diff` command to get the diff content, for local CR only
-l, --max-length <int>: Maximum length of the content for review, 0 means no limit. -l, --max-length <int>: Maximum length of the content for review, 0 means no limit.
-m, --model <string>: Model name, or read from CHAT_MODEL env var, `deepseek-chat` by default -m, --model <string>: Model name, or read from CHAT_MODEL env var, `deepseek-v4-flash` by default
-b, --base-url <string>: DeepSeek API base URL, fallback to BASE_URL env var -b, --base-url <string>: DeepSeek API base URL, fallback to BASE_URL env var
-U, --chat-url <string>: DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat -U, --chat-url <string>: DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat
-s, --sys-prompt <string>: Default to $DEFAULT_OPTIONS.SYS_PROMPT, -s, --sys-prompt <string>: Default to $DEFAULT_OPTIONS.SYS_PROMPT,
@@ -202,27 +200,27 @@ Parameters:
### Environment Configuration ### Environment Configuration
To perform code review locally, you need to modify the configuration file. The repository already provides a configuration example [`config.example.yml`](https://github.com/hustcer/deepseek-review/blob/main/config.example.yml). Copy it to `config.yml` and modify it according to your actual needs. **Read the comments in the configuration file carefully**, as they explain the purpose of each configuration item. To perform code reviews locally, you need to modify the configuration file. The repository provides a configuration example [`config.example.yml`](https://github.com/hustcer/deepseek-review/blob/main/config.example.yml). Copy it to `config.yml` and modify it according to your needs. **Read the comments in the configuration file carefully**, as they explain the purpose of each configuration item.
> [!WARNING] > [!WARNING]
> >
> The `config.yml` configuration file is **only used locally** and will not be utilized in GitHub Workflow. **Sensitive information** in this file should be properly secured and **never committed** to the code repository. > The `config.yml` configuration file is **only used locally** and will not be utilized in GitHub Workflows. **Sensitive information** in this file should be properly secured and **never committed** to the code repository.
> >
**Create Command Alias** **Create a Command Alias**
For convenience in performing code review across any local repository, create a command alias. For example: For convenience when performing code reviews across any local repository, create a command alias. For example:
```sh ```sh
# For Nushell: Modify config.nu and add: # For Nushell: Modify config.nu and add:
alias cr = nu /absolute/path/to/deepseek-review/cr --config /absolute/path/to/deepseek-review/config.yml alias cr = nu /absolute/path/to/deepseek-review/cr --config /absolute/path/to/deepseek-review/config.yml
# Modify ~/.zshrc for zsh or ~/.bashrc for bash or ~/.config/fish/config.fish for fish and add: # Modify ~/.zshrc for zsh, ~/.bashrc for bash, or ~/.config/fish/config.fish for fish and add:
alias cr="nu /absolute/path/to/deepseek-review/cr --config /absolute/path/to/deepseek-review/config.yml" alias cr="nu /absolute/path/to/deepseek-review/cr --config /absolute/path/to/deepseek-review/config.yml"
# After sourcing the modified profile, use `cr` for code review # After sourcing the modified profile, use `cr` for code reviews
# For Windows powershell users please set cr alias by editing $PROFILE and add: # For Windows PowerShell users, set the cr alias by editing $PROFILE and add:
function cr { function cr {
nu D:\absolute\path\to\deepseek-review\cr --config D:\absolute\path\to\deepseek-review\config.yml @args nu D:\absolute\path\to\deepseek-review\cr --config D:\absolute\path\to\deepseek-review\config.yml @args
} }
@@ -235,20 +233,20 @@ function cr {
To review a local repository: To review a local repository:
- Navigate to the Git repository directory. - Navigate to the Git repository directory.
- Use the `cr` command to review current modifications, provided that `config.yml` is correctly configured. - Use the `cr` command to review current modifications, provided that `config.yml` is correctly configured.
**Usage Examples** **Usage Examples**
```sh ```sh
# Perform code review on the `git diff` changes in current directory # Perform code review on the `git diff` changes in the current directory
cr cr
# Perform code review on the `git diff f536acc` changes in current directory # Perform code review on the `git diff f536acc` changes in the current directory
cr --diff-from f536acc cr --diff-from f536acc
# Perform code review on the `git diff f536acc` changes and output result to review.md # Perform code review on the `git diff f536acc` changes and output the result to review.md
cr --diff-from f536acc --output review.md cr --diff-from f536acc --output review.md
# Perform code review on the `git diff f536acc 0dd0eb5` changes in current directory # Perform code review on the `git diff f536acc 0dd0eb5` changes in the current directory
cr --diff-from f536acc --diff-to 0dd0eb5 cr --diff-from f536acc --diff-to 0dd0eb5
# Review the changes in current directory using the `--patch-cmd` flag # Review the changes in the current directory using the `--patch-cmd` flag
cr --patch-cmd 'git diff head~3' cr --patch-cmd 'git diff head~3'
cr -c 'git show head~3' cr -c 'git show head~3'
cr -c 'git diff 2393375 71f5a31' cr -c 'git diff 2393375 71f5a31'
@@ -261,17 +259,17 @@ cr -c 'git diff 2393375 71f5a31 :!nu/*'
When reviewing a remote GitHub PR locally: When reviewing a remote GitHub PR locally:
- Always specify the PR number via `--pr-number` - Always specify the PR number via `--pr-number`.
- Use `--repo` to indicate the target repository (e.g., `hustcer/deepseek-review`). If `--repo` is omitted, the tool reads `settings.default-github-repo` from `config.yml`. - Use `--repo` to indicate the target repository (e.g., `hustcer/deepseek-review`). If `--repo` is omitted, the tool reads `settings.default-github-repo` from `config.yml`.
**Usage Examples** **Usage Examples**
```sh ```sh
# Perform code review on PR #31 in the remote DEFAULT_GITHUB_REPO repo # Perform code review on PR #31 in the remote DEFAULT_GITHUB_REPO repository
cr --pr-number 31 cr --pr-number 31
# Perform code review on PR #31 in the remote hustcer/deepseek-review repo # Perform code review on PR #31 in the remote hustcer/deepseek-review repository
cr --pr-number 31 --repo hustcer/deepseek-review cr --pr-number 31 --repo hustcer/deepseek-review
# Perform code review on PR #31 and exclude changes of pnpm-lock.yaml # Perform code review on PR #31 and exclude changes in pnpm-lock.yaml
cr --pr-number 31 --exclude pnpm-lock.yaml cr --pr-number 31 --exclude pnpm-lock.yaml
``` ```

View File

@@ -5,8 +5,6 @@
![Failed](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgist.githubusercontent.com%2Fhustcer%2Fb99391ee59016b17d0befe3331387e89%2Fraw%2Ftest-summary.json&query=%24.failed&label=Failed&color=red) ![Failed](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgist.githubusercontent.com%2Fhustcer%2Fb99391ee59016b17d0befe3331387e89%2Fraw%2Ftest-summary.json&query=%24.failed&label=Failed&color=red)
![Skipped](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgist.githubusercontent.com%2Fhustcer%2Fb99391ee59016b17d0befe3331387e89%2Fraw%2Ftest-summary.json&query=%24.skipped&label=Skipped&color=yellow) ![Skipped](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgist.githubusercontent.com%2Fhustcer%2Fb99391ee59016b17d0befe3331387e89%2Fraw%2Ftest-summary.json&query=%24.skipped&label=Skipped&color=yellow)
本工具也支持使用 SiliconCloud 上的 DeepSeek 模型,[注册](https://cloud.siliconflow.cn/i/rqCdIxzS) 就**免费赠送 2000 万 Token**,赶紧试试吧!
## 特性 ## 特性
### GitHub Action ### GitHub Action
@@ -119,7 +117,7 @@ jobs:
| 名称 | 类型 | 描述 | | 名称 | 类型 | 描述 |
| -------------- | ------ | -------------------------------------------------------------- | | -------------- | ------ | -------------------------------------------------------------- |
| chat-token | String | 必填DeepSeek API Token | | chat-token | String | 必填DeepSeek API Token |
| model | String | 可选,配置代码审查选用的模型,默认为 `deepseek-chat` | | model | String | 可选,配置代码审查选用的模型,默认为 `deepseek-v4-flash` |
| base-url | String | 可选DeepSeek API Base URL, 默认为 `https://api.deepseek.com` | | base-url | String | 可选DeepSeek API Base URL, 默认为 `https://api.deepseek.com` |
| max-length | Int | 可选,待审查内容的最大 Unicode 长度, 默认 `0` 表示没有限制,超过非零值则跳过审查 | | max-length | Int | 可选,待审查内容的最大 Unicode 长度, 默认 `0` 表示没有限制,超过非零值则跳过审查 |
| sys-prompt | String | 可选,系统提示词对应入参中的 `$sys_prompt`, 默认值见后文注释 | | sys-prompt | String | 可选,系统提示词对应入参中的 `$sys_prompt`, 默认值见后文注释 |
@@ -133,7 +131,7 @@ DeepSeek 接口调用入参:
```js ```js
{ {
// `$model` default value: deepseek-chat // `$model` default value: deepseek-v4-flash
model: $model, model: $model,
stream: false, stream: false,
temperature: $temperature, temperature: $temperature,
@@ -161,7 +159,7 @@ DeepSeek 接口调用入参:
在本地进行代码审查,支持 `macOS`, `Ubuntu` & `Windows` 不过需要安装以下工具: 在本地进行代码审查,支持 `macOS`, `Ubuntu` & `Windows` 不过需要安装以下工具:
- [`Nushell`](https://www.nushell.sh/book/installation.html), 建议安装最新版本(最低版本 `0.103`) - [`Nushell`](https://www.nushell.sh/book/installation.html), 建议安装最新版本(最低版本 `0.112.2`)
- [`awk`](https://github.com/onetrueawk/awk) 或者 [`gawk`](https://www.gnu.org/software/gawk/) 的最新版版本,优先推荐 `gawk` - [`awk`](https://github.com/onetrueawk/awk) 或者 [`gawk`](https://www.gnu.org/software/gawk/) 的最新版版本,优先推荐 `gawk`
- 接下来只需要把本仓库代码克隆到本地,然后进入仓库目录执行 `nu cr -h` 即可看到类似如下输出: - 接下来只需要把本仓库代码克隆到本地,然后进入仓库目录执行 `nu cr -h` 即可看到类似如下输出:
@@ -180,7 +178,7 @@ Flags:
-t, --diff-to <string>: Git diff ending commit SHA -t, --diff-to <string>: Git diff ending commit SHA
-c, --patch-cmd <string>: The `git show` or `git diff` command to get the diff content, for local CR only -c, --patch-cmd <string>: The `git show` or `git diff` command to get the diff content, for local CR only
-l, --max-length <int>: Maximum length of the content for review, 0 means no limit. -l, --max-length <int>: Maximum length of the content for review, 0 means no limit.
-m, --model <string>: Model name, or read from CHAT_MODEL env var, `deepseek-chat` by default -m, --model <string>: Model name, or read from CHAT_MODEL env var, `deepseek-v4-flash` by default
-b, --base-url <string>: DeepSeek API base URL, fallback to BASE_URL env var -b, --base-url <string>: DeepSeek API base URL, fallback to BASE_URL env var
-U, --chat-url <string>: DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat -U, --chat-url <string>: DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat
-s, --sys-prompt <string>: Default to $DEFAULT_OPTIONS.SYS_PROMPT, -s, --sys-prompt <string>: Default to $DEFAULT_OPTIONS.SYS_PROMPT,

View File

@@ -24,7 +24,7 @@ inputs:
description: 'The maximum length of the content for review, 0 means no limit.' description: 'The maximum length of the content for review, 0 means no limit.'
model: model:
required: false required: false
default: 'deepseek-chat' default: 'deepseek-v4-flash'
description: 'The DeepSeek model to choose for code review.' description: 'The DeepSeek model to choose for code review.'
temperature: temperature:
required: false required: false
@@ -58,9 +58,9 @@ runs:
using: 'composite' using: 'composite'
steps: steps:
- name: Setup Nu - name: Setup Nu
uses: hustcer/setup-nu@v3.19 uses: hustcer/setup-nu@v3.23
with: with:
version: 0.106.0 version: 0.112.2
- name: DeepSeek Code Review - name: DeepSeek Code Review
shell: nu {0} shell: nu {0}

View File

@@ -50,7 +50,7 @@ providers:
token: 'YOUR_DEEPSEEK_TOKEN' # Required, The API token for the provider token: 'YOUR_DEEPSEEK_TOKEN' # Required, The API token for the provider
base-url: 'https://api.deepseek.com' base-url: 'https://api.deepseek.com'
models: models:
- name: 'deepseek-chat' # Required, Pass the model name to --model flag to use it - name: 'deepseek-v4-flash' # Required, Pass the model name to --model flag to use it
alias: v3 # Optional, Alias name could also be passed to --model flag alias: v3 # Optional, Alias name could also be passed to --model flag
enabled: true # One and Only one model could be enabled in one model group enabled: true # One and Only one model could be enabled in one model group
description: 'DeepSeek V3' # Optional, Description of the model, won't be used actually description: 'DeepSeek V3' # Optional, Description of the model, won't be used actually

2
cr
View File

@@ -18,7 +18,7 @@ def main [
--diff-to(-t): string, # Git diff ending commit SHA --diff-to(-t): string, # Git diff ending commit SHA
--patch-cmd(-c): string, # The `git show` or `git diff` command to get the diff content, for local CR only --patch-cmd(-c): string, # The `git show` or `git diff` command to get the diff content, for local CR only
--max-length(-l): int, # Maximum length of the content for review, 0 means no limit. --max-length(-l): int, # Maximum length of the content for review, 0 means no limit.
--model(-m): string, # Model name, or read from CHAT_MODEL env var, `deepseek-chat` by default --model(-m): string, # Model name, or read from CHAT_MODEL env var, `deepseek-v4-flash` by default
--base-url(-b): string, # DeepSeek API base URL, fallback to BASE_URL env var --base-url(-b): string, # DeepSeek API base URL, fallback to BASE_URL env var
--chat-url(-U): string, # DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat --chat-url(-U): string, # DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat
--sys-prompt(-s): string # Default to $DEFAULT_OPTIONS.SYS_PROMPT, --sys-prompt(-s): string # Default to $DEFAULT_OPTIONS.SYS_PROMPT,

View File

@@ -20,6 +20,7 @@ words:
- hustcer - hustcer
- Nushell - Nushell
- creatio - creatio
- pipefail
- justfile - justfile
- lefthook - lefthook
- deepseek - deepseek

View File

@@ -1,7 +1,7 @@
{ {
"name": "deepseek-review", "name": "deepseek-review",
"version": "1.19.0", "version": "1.20.0",
"actionVer": "v1.19", "actionVer": "v1.20",
"author": "hustcer", "author": "hustcer",
"license": "MIT", "license": "MIT",
"github": "https://github.com/hustcer/deepseek-review", "github": "https://github.com/hustcer/deepseek-review",

View File

@@ -81,22 +81,63 @@ export def check-nushell [--debug] {
} }
# Converts a .env file into a record # Converts a .env file into a record
# may be used like this: open .env | load-env # May be used like this: open .env | load-env
# works with quoted and unquoted .env files # Works with quoted and unquoted .env files
export def 'from env' []: string -> record { export def "from env" []: string -> record {
lines let input = $in
| split column '#' # remove comments
| get column1 # Process escape sequences in double-quoted values using str replace chain
| parse '{key}={value}' # Use NUL char as placeholder to avoid replacement conflicts
| update value { let process_escapes = {|content: string|
str trim # Trim whitespace between value and inline comments $content
| str trim -c '"' # unquote double-quoted values | str replace -a '\\' (char nul) # Placeholder for \\ to avoid conflicts
| str trim -c "'" # unquote single-quoted values | str replace -a '\n' (char nl)
| str replace -a "\\n" "\n" # replace `\n` with newline char | str replace -a '\r' (char cr)
| str replace -a "\\r" "\r" # replace `\r` with carriage return | str replace -a '\t' (char tab)
| str replace -a "\\t" "\t" # replace `\t` with tab | str replace -a '\"' '"'
} | str replace -a (char nul) '\' # Restore \\ to single \
| transpose -r -d }
# Parse double-quoted value with escape sequence support
let parse_double_quoted = {|val: string|
let matched = ($val | parse -r '^"(?P<content>(?:[^"\\]|\\.)*)"')
if ($matched | is-empty) { $val | str trim -c '"' } else { do $process_escapes $matched.0.content }
}
# Parse single-quoted value (no escape processing)
let parse_single_quoted = {|val: string|
let matched = ($val | parse -r "^'(?P<content>[^']*)'")
if ($matched | is-empty) { $val | str trim -c "'" } else { $matched.0.content }
}
# Parse unquoted value: handle escaped hash (\#) and strip inline comments
let parse_unquoted = {|val: string|
$val
| str replace -a '\#' (char nul) # Placeholder for \#
| split row '#' # Split by comment delimiter
| first # Take content before first #
| str replace -a (char nul) '#' # Restore \# to #
| str trim
}
# Parse value based on its format
let parse_value = {|val: string|
match $val {
$v if ($v | str starts-with '"') => { do $parse_double_quoted $v }
$v if ($v | str starts-with "'") => { do $parse_single_quoted $v }
_ => { do $parse_unquoted $val }
}
}
let parsed = $input | lines
| str trim
| compact -e
| where {|line| not ($line | str starts-with '#') }
| parse "{key}={value}"
| update key {|row| $row.key | str trim | str replace -r '^export\s+' '' }
| update value {|row| do $parse_value ($row.value | str trim) }
if ($parsed | is-empty) { {} } else { $parsed | transpose -r -d -l }
} }
# Compact the record by removing empty columns # Compact the record by removing empty columns
@@ -152,7 +193,8 @@ export def git-check [
# Check if current directory is a git repo # Check if current directory is a git repo
export def is-repo [] { export def is-repo [] {
let checkRepo = try { let checkRepo = try {
do -i { git rev-parse --is-inside-work-tree } | complete # Put `complete` inside `do` block to avoid pipefail error in Nushell 0.110+
do { git rev-parse --is-inside-work-tree | complete }
} catch { } catch {
({ stdout: 'false' }) ({ stdout: 'false' })
} }
@@ -164,8 +206,8 @@ export def has-ref [
ref: string # The git ref to check ref: string # The git ref to check
] { ] {
if not (is-repo) { return false } if not (is-repo) { return false }
# Brackets were required here, or error will occur # Put `complete` inside `do` block to avoid pipefail error in Nushell 0.110+
let parse = (do -i { git rev-parse --verify -q $ref } | complete) let parse = (do { git rev-parse --verify -q $ref | complete })
if ($parse.stdout | is-empty) { false } else { true } if ($parse.stdout | is-empty) { false } else { true }
} }

View File

@@ -91,7 +91,8 @@ def check-models [options: record] {
} }
# Check if the config.yml file exists and if it's valid # Check if the config.yml file exists and if it's valid
export def config-check [--config: string = $SETTING_FILE] { export def config-check [--config: string] {
let config = $config | default $SETTING_FILE
file-exists $config file-exists $config
let options = open $config let options = open $config
check-prompts $options check-prompts $options

View File

@@ -80,6 +80,13 @@ def get-pr-diff [
exit $ECODE.SUCCESS exit $ECODE.SUCCESS
} }
let commit_msg = http get -H $BASE_HEADER $'($GITHUB_API_BASE)/repos/($repo)/pulls/($pr_number)/commits'
| last | get commit.message
if ($IGNORE_REVIEW_KEYWORDS | any {|it| $commit_msg =~ $it }) {
print $'(ansi r)The latest PR commit message contains keywords to skip the review, bye...(ansi reset)'
exit $ECODE.SUCCESS
}
# Get the diff content of the PR # Get the diff content of the PR
http get -H $DIFF_HEADER $'($GITHUB_API_BASE)/repos/($repo)/pulls/($pr_number)' | str trim http get -H $DIFF_HEADER $'($GITHUB_API_BASE)/repos/($repo)/pulls/($pr_number)' | str trim
} }

View File

@@ -46,9 +46,9 @@ export def 'make-release' [
export def has-ref [ export def has-ref [
ref: string # The git ref to check ref: string # The git ref to check
] { ] {
let checkRepo = (do -i { git rev-parse --is-inside-work-tree } | complete) # Put `complete` inside `do` block to avoid pipefail error in Nushell 0.110+
let checkRepo = (do { git rev-parse --is-inside-work-tree | complete })
if not ($checkRepo.stdout =~ 'true') { return false } if not ($checkRepo.stdout =~ 'true') { return false }
# Brackets were required here, or error will occur let parse = (do { git rev-parse --verify -q $ref | complete })
let parse = (do -i { git rev-parse --verify -q $ref } | complete)
if ($parse.stdout | is-empty) { false } else { true } if ($parse.stdout | is-empty) { false } else { true }
} }

View File

@@ -43,7 +43,7 @@ const IGNORED_MESSAGES = {
const HTTP_HEADERS = [User-Agent curl/8.9] const HTTP_HEADERS = [User-Agent curl/8.9]
const DEFAULT_OPTIONS = { const DEFAULT_OPTIONS = {
MODEL: 'deepseek-chat', MODEL: 'deepseek-v4-flash',
TEMPERATURE: 0.3, TEMPERATURE: 0.3,
BASE_URL: 'https://api.deepseek.com', BASE_URL: 'https://api.deepseek.com',
USER_PROMPT: 'Please review the following code changes:', USER_PROMPT: 'Please review the following code changes:',
@@ -62,7 +62,7 @@ export def --env deepseek-review [
--diff-from(-f): string, # Git diff starting commit SHA --diff-from(-f): string, # Git diff starting commit SHA
--patch-cmd(-c): string, # The `git show` or `git diff` command to get the diff content, for local CR only --patch-cmd(-c): string, # The `git show` or `git diff` command to get the diff content, for local CR only
--max-length(-l): int, # Maximum length of the content for review, 0 means no limit. --max-length(-l): int, # Maximum length of the content for review, 0 means no limit.
--model(-m): string, # Model name, or read from CHAT_MODEL env var, `deepseek-chat` by default --model(-m): string, # Model name, or read from CHAT_MODEL env var, `deepseek-v4-flash` by default
--base-url(-b): string, # DeepSeek API base URL, fallback to BASE_URL env var --base-url(-b): string, # DeepSeek API base URL, fallback to BASE_URL env var
--chat-url(-U): string, # DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat --chat-url(-U): string, # DeepSeek Model chat full API URL, e.g. http://localhost:11535/api/chat
--sys-prompt(-s): string # Default to $DEFAULT_OPTIONS.SYS_PROMPT, --sys-prompt(-s): string # Default to $DEFAULT_OPTIONS.SYS_PROMPT,
@@ -135,7 +135,8 @@ export def --env deepseek-review [
messages: [ messages: [
{ role: 'system', content: $sys_prompt }, { role: 'system', content: $sys_prompt },
{ role: 'user', content: $"($user_prompt):\n($content)" } { role: 'user', content: $"($user_prompt):\n($content)" }
] ],
thinking: { type: 'disabled' }
} }
if $debug { print $'(char nl)Code Changes:'; hr-line; print $content } if $debug { print $'(char nl)Code Changes:'; hr-line; print $content }
print $'(char nl)Waiting for response from (ansi g)($url)(ansi reset) ...' print $'(char nl)Waiting for response from (ansi g)($url)(ansi reset) ...'

View File

@@ -132,7 +132,7 @@ def install-gawk-for-actions [] {
Invoke-Expression (New-Object System.Net.WebClient).DownloadString("https://get.scoop.sh") Invoke-Expression (New-Object System.Net.WebClient).DownloadString("https://get.scoop.sh")
$env:Path = "$env:USERPROFILE\scoop\shims;" + $env:Path; scoop update; scoop install gawk $env:Path = "$env:USERPROFILE\scoop\shims;" + $env:Path; scoop update; scoop install gawk
'# | complete | get stdout | print '# | complete | get stdout | print
let awk_bin = $'($nu.home-path)/scoop/shims/gawk.exe' let awk_bin = $'($nu.home-dir)/scoop/shims/gawk.exe'
let version = get-awk-ver $awk_bin let version = get-awk-ver $awk_bin
{ awk_bin: $awk_bin, version: $version } { awk_bin: $awk_bin, version: $version }
} }