mirror of
https://github.com/markwylde/claude-code-gitea-action.git
synced 2026-02-20 02:22:49 +08:00
Compare commits
8 Commits
v1.0.10
...
fix/gitea-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ccac04993 | ||
|
|
1fd3bbc91b | ||
|
|
a8399fe052 | ||
|
|
f640f38102 | ||
|
|
54147e92b6 | ||
|
|
42d3e56b56 | ||
|
|
2c9043d65f | ||
|
|
957f0ddc6f |
25
README.md
25
README.md
@@ -125,6 +125,31 @@ This action has been enhanced to work with Gitea installations. The main differe
|
|||||||
|
|
||||||
2. **API URL Configuration**: You must specify your Gitea server URL using the `gitea_api_url` input.
|
2. **API URL Configuration**: You must specify your Gitea server URL using the `gitea_api_url` input.
|
||||||
|
|
||||||
|
3. **Custom Server URL**: For Gitea instances running in containers, you can override link generation using the `GITEA_SERVER_URL` environment variable.
|
||||||
|
|
||||||
|
### Custom Server URL Configuration
|
||||||
|
|
||||||
|
When running Gitea in containers, the action may generate links using internal container URLs (e.g., `http://gitea:3000`) instead of your public URL. To fix this, set the `GITEA_SERVER_URL` environment variable:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: markwylde/claude-code-gitea-action@v1.0.5
|
||||||
|
with:
|
||||||
|
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||||
|
gitea_token: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
env:
|
||||||
|
# Override the internal container URL with your public URL
|
||||||
|
GITEA_SERVER_URL: https://gitea.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**How it works:**
|
||||||
|
- The action first checks for `GITEA_SERVER_URL` (user-configurable)
|
||||||
|
- Falls back to `GITHUB_SERVER_URL` (automatically set by Gitea Actions)
|
||||||
|
- Uses `https://github.com` as final fallback
|
||||||
|
|
||||||
|
This ensures that all links in Claude's comments (job runs, branches, etc.) point to your public Gitea instance instead of internal container addresses.
|
||||||
|
|
||||||
|
See [`examples/gitea-custom-url.yml`](./examples/gitea-custom-url.yml) for a complete example.
|
||||||
|
|
||||||
### Gitea Setup Notes
|
### Gitea Setup Notes
|
||||||
|
|
||||||
- Use a Gitea personal access token "GITEA_TOKEN"
|
- Use a Gitea personal access token "GITEA_TOKEN"
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ runs:
|
|||||||
- name: Run Claude Code
|
- name: Run Claude Code
|
||||||
id: claude-code
|
id: claude-code
|
||||||
if: steps.prepare.outputs.contains_trigger == 'true'
|
if: steps.prepare.outputs.contains_trigger == 'true'
|
||||||
uses: anthropics/claude-code-base-action@c8e31bd52d9a149b3f8309d7978c6edaa282688d # v0.0.8
|
uses: anthropics/claude-code-base-action@v0.0.24
|
||||||
with:
|
with:
|
||||||
prompt_file: /tmp/claude-prompts/claude-prompt.txt
|
prompt_file: /tmp/claude-prompts/claude-prompt.txt
|
||||||
allowed_tools: ${{ env.ALLOWED_TOOLS }}
|
allowed_tools: ${{ env.ALLOWED_TOOLS }}
|
||||||
|
|||||||
23
examples/gitea-custom-url.yml
Normal file
23
examples/gitea-custom-url.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Claude PR Review with Custom Gitea URL
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
claude-review:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Claude Code Analysis
|
||||||
|
uses: markwylde/claude-code-gitea-action@gitea
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
claude-api-key: ${{ secrets.CLAUDE_API_KEY }}
|
||||||
|
env:
|
||||||
|
# Set this to your public Gitea URL to override the internal container URL
|
||||||
|
# This ensures that links in comments point to the correct public URL
|
||||||
|
GITEA_SERVER_URL: https://gitea.example.com
|
||||||
|
|
||||||
|
# Note: GITHUB_SERVER_URL is automatically set by Gitea Actions to the internal URL
|
||||||
|
# but it will be overridden by GITEA_SERVER_URL if set above
|
||||||
273
package-lock.json
generated
273
package-lock.json
generated
@@ -12,8 +12,6 @@
|
|||||||
"@actions/github": "^6.0.1",
|
"@actions/github": "^6.0.1",
|
||||||
"@anthropic-ai/sdk": "^0.30.0",
|
"@anthropic-ai/sdk": "^0.30.0",
|
||||||
"@modelcontextprotocol/sdk": "^1.11.0",
|
"@modelcontextprotocol/sdk": "^1.11.0",
|
||||||
"@octokit/graphql": "^8.2.2",
|
|
||||||
"@octokit/rest": "^21.1.1",
|
|
||||||
"@octokit/webhooks-types": "^7.6.1",
|
"@octokit/webhooks-types": "^7.6.1",
|
||||||
"node-fetch": "^3.3.2",
|
"node-fetch": "^3.3.2",
|
||||||
"zod": "^3.24.4"
|
"zod": "^3.24.4"
|
||||||
@@ -211,82 +209,6 @@
|
|||||||
"node": ">= 18"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/graphql": {
|
|
||||||
"version": "8.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz",
|
|
||||||
"integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/request": "^9.2.3",
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/@octokit/endpoint": {
|
|
||||||
"version": "10.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
|
|
||||||
"integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
|
|
||||||
"version": "25.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz",
|
|
||||||
"integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/@octokit/request": {
|
|
||||||
"version": "9.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz",
|
|
||||||
"integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/endpoint": "^10.1.4",
|
|
||||||
"@octokit/request-error": "^6.1.8",
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"fast-content-type-parse": "^2.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/@octokit/request-error": {
|
|
||||||
"version": "6.1.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
|
|
||||||
"integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^14.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/@octokit/types": {
|
|
||||||
"version": "14.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
|
|
||||||
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^25.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql/node_modules/universal-user-agent": {
|
|
||||||
"version": "7.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
|
||||||
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
|
|
||||||
"license": "ISC"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/openapi-types": {
|
"node_modules/@octokit/openapi-types": {
|
||||||
"version": "24.2.0",
|
"version": "24.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
|
||||||
@@ -382,185 +304,6 @@
|
|||||||
"node": ">= 18"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/rest": {
|
|
||||||
"version": "21.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz",
|
|
||||||
"integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/core": "^6.1.4",
|
|
||||||
"@octokit/plugin-paginate-rest": "^11.4.2",
|
|
||||||
"@octokit/plugin-request-log": "^5.3.1",
|
|
||||||
"@octokit/plugin-rest-endpoint-methods": "^13.3.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
|
|
||||||
"version": "5.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
|
|
||||||
"integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/core": {
|
|
||||||
"version": "6.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz",
|
|
||||||
"integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/auth-token": "^5.0.0",
|
|
||||||
"@octokit/graphql": "^8.2.2",
|
|
||||||
"@octokit/request": "^9.2.3",
|
|
||||||
"@octokit/request-error": "^6.1.8",
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"before-after-hook": "^3.0.2",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/core/node_modules/@octokit/types": {
|
|
||||||
"version": "14.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
|
|
||||||
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^25.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
|
|
||||||
"version": "10.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
|
|
||||||
"integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/endpoint/node_modules/@octokit/types": {
|
|
||||||
"version": "14.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
|
|
||||||
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^25.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
|
|
||||||
"version": "25.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz",
|
|
||||||
"integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
|
|
||||||
"version": "11.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz",
|
|
||||||
"integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^13.10.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@octokit/core": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
|
|
||||||
"version": "5.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz",
|
|
||||||
"integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@octokit/core": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
|
|
||||||
"version": "13.5.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz",
|
|
||||||
"integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^13.10.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@octokit/core": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/request": {
|
|
||||||
"version": "9.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz",
|
|
||||||
"integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/endpoint": "^10.1.4",
|
|
||||||
"@octokit/request-error": "^6.1.8",
|
|
||||||
"@octokit/types": "^14.0.0",
|
|
||||||
"fast-content-type-parse": "^2.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/request-error": {
|
|
||||||
"version": "6.1.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
|
|
||||||
"integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^14.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/request-error/node_modules/@octokit/types": {
|
|
||||||
"version": "14.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
|
|
||||||
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^25.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/request/node_modules/@octokit/types": {
|
|
||||||
"version": "14.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz",
|
|
||||||
"integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^25.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/before-after-hook": {
|
|
||||||
"version": "3.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
|
|
||||||
"integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
|
|
||||||
"license": "Apache-2.0"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/rest/node_modules/universal-user-agent": {
|
|
||||||
"version": "7.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
|
||||||
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
|
|
||||||
"license": "ISC"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/types": {
|
"node_modules/@octokit/types": {
|
||||||
"version": "13.10.0",
|
"version": "13.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
|
||||||
@@ -1042,22 +785,6 @@
|
|||||||
"express": "^4.11 || 5 || ^5.0.0-beta.1"
|
"express": "^4.11 || 5 || ^5.0.0-beta.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fast-content-type-parse": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fastify"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/fastify"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/fast-deep-equal": {
|
"node_modules/fast-deep-equal": {
|
||||||
"version": "3.1.3",
|
"version": "3.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ ${
|
|||||||
? `
|
? `
|
||||||
4. Check for Existing Branch (for issues and closed PRs):
|
4. Check for Existing Branch (for issues and closed PRs):
|
||||||
- Before implementing changes, check if there's already a claude branch for this ${eventData.isPR ? "PR" : "issue"}.
|
- Before implementing changes, check if there's already a claude branch for this ${eventData.isPR ? "PR" : "issue"}.
|
||||||
- Use Bash to run \`git branch -r | grep "claude/${eventData.isPR ? "pr" : "issue"}-${eventData.isPR ? eventData.prNumber : eventData.issueNumber}"\` to search for existing branches.
|
- Use the mcp__gitea__list_branches tool to list branches.
|
||||||
- If found, use mcp__local_git_ops__checkout_branch to switch to the existing branch (set fetch_remote=true).
|
- If found, use mcp__local_git_ops__checkout_branch to switch to the existing branch (set fetch_remote=true).
|
||||||
- If not found, you'll create a new branch when making changes (see Execute Actions section).
|
- If not found, you'll create a new branch when making changes (see Execute Actions section).
|
||||||
- Mark this todo as complete by checking the box.
|
- Mark this todo as complete by checking the box.
|
||||||
@@ -566,18 +566,20 @@ ${
|
|||||||
eventData.isPR && !eventData.claudeBranch
|
eventData.isPR && !eventData.claudeBranch
|
||||||
? `
|
? `
|
||||||
- Commit changes using mcp__local_git_ops__commit_files to the existing branch (works for both new and existing files).
|
- Commit changes using mcp__local_git_ops__commit_files to the existing branch (works for both new and existing files).
|
||||||
|
- Make sure commits follow the same convention as other commits in the repository.
|
||||||
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
||||||
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
||||||
- After pushing, you should normally create a PR using mcp__local_git_ops__create_pull_request, unless it already exists.
|
- After pushing, you MUST create a PR using mcp__local_git_ops__create_pull_request.
|
||||||
- When pushing changes with this tool and TRIGGER_USERNAME is not "Unknown", include a "Co-authored-by: ${context.triggerUsername} <${context.triggerUsername}@users.noreply.local>" line in the commit message.`
|
- When pushing changes with this tool and TRIGGER_USERNAME is not "Unknown", include a "Co-authored-by: ${context.triggerUsername} <${context.triggerUsername}@users.noreply.local>" line in the commit message.`
|
||||||
: eventData.claudeBranch
|
: eventData.claudeBranch
|
||||||
? `
|
? `
|
||||||
- You are already on the correct branch (${eventData.claudeBranch}). Do not create a new branch.
|
- You are already on the correct branch (${eventData.claudeBranch}). Do not create a new branch.
|
||||||
- Commit changes using mcp__local_git_ops__commit_files (works for both new and existing files)
|
- Commit changes using mcp__local_git_ops__commit_files (works for both new and existing files)
|
||||||
|
- Make sure commits follow the same convention as other commits in the repository.
|
||||||
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
||||||
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
||||||
`
|
`
|
||||||
: `}
|
: `
|
||||||
- IMPORTANT: You are currently on the base branch (${eventData.baseBranch}). Before making changes, you should first check if there's already an existing claude branch for this ${eventData.isPR ? "PR" : "issue"}.
|
- IMPORTANT: You are currently on the base branch (${eventData.baseBranch}). Before making changes, you should first check if there's already an existing claude branch for this ${eventData.isPR ? "PR" : "issue"}.
|
||||||
- FIRST: Use Bash to run \`git branch -r | grep "claude/${eventData.isPR ? "pr" : "issue"}-${eventData.isPR ? eventData.prNumber : eventData.issueNumber}"\` to check for existing branches.
|
- FIRST: Use Bash to run \`git branch -r | grep "claude/${eventData.isPR ? "pr" : "issue"}-${eventData.isPR ? eventData.prNumber : eventData.issueNumber}"\` to check for existing branches.
|
||||||
- If an existing claude branch is found:
|
- If an existing claude branch is found:
|
||||||
@@ -590,19 +592,8 @@ ${
|
|||||||
- After being on the correct branch (existing or new), commit changes using mcp__local_git_ops__commit_files (works for both new and existing files)
|
- After being on the correct branch (existing or new), commit changes using mcp__local_git_ops__commit_files (works for both new and existing files)
|
||||||
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
- Use mcp__local_git_ops__commit_files to commit files atomically in a single commit (supports single or multiple files).
|
||||||
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
- CRITICAL: After committing, you MUST push the branch to the remote repository using mcp__local_git_ops__push_branch
|
||||||
- When pushing changes and TRIGGER_USERNAME is not "Unknown", include a "Co-authored-by: ${context.triggerUsername} <${context.triggerUsername}@users.noreply.local>" line in the commit message.
|
- After pushing, you should create a PR using mcp__local_git_ops__create_pull_request unless one already exists for that branch.
|
||||||
- Provide a URL to create a PR manually in this format:
|
`
|
||||||
[Create a PR](${GITEA_SERVER_URL}/${context.repository}/compare/${eventData.baseBranch}...<branch-name>?quick_pull=1&title=<url-encoded-title>&body=<url-encoded-body>)
|
|
||||||
- IMPORTANT: Use THREE dots (...) between branch names, not two (..)
|
|
||||||
Example: ${GITEA_SERVER_URL}/${context.repository}/compare/main...feature-branch (correct)
|
|
||||||
NOT: ${GITEA_SERVER_URL}/${context.repository}/compare/main..feature-branch (incorrect)
|
|
||||||
- IMPORTANT: Ensure all URL parameters are properly encoded - spaces should be encoded as %20, not left as spaces
|
|
||||||
Example: Instead of "fix: update welcome message", use "fix%3A%20update%20welcome%20message"
|
|
||||||
- The target-branch should be '${eventData.baseBranch}'.
|
|
||||||
- The branch-name is your created branch name
|
|
||||||
- The body should include:
|
|
||||||
- A clear description of the changes
|
|
||||||
- Reference to the original ${eventData.isPR ? "PR" : "issue"}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
C. For Complex Changes:
|
C. For Complex Changes:
|
||||||
@@ -619,7 +610,7 @@ ${!eventData.isPR || !eventData.claudeBranch ? `6. Final Update:` : `5. Final Up
|
|||||||
- When all todos are completed, remove the spinner and add a brief summary of what was accomplished, and what was not done.
|
- When all todos are completed, remove the spinner and add a brief summary of what was accomplished, and what was not done.
|
||||||
- Note: If you see previous Claude comments with headers like "**Claude finished @user's task**" followed by "---", do not include this in your comment. The system adds this automatically.
|
- Note: If you see previous Claude comments with headers like "**Claude finished @user's task**" followed by "---", do not include this in your comment. The system adds this automatically.
|
||||||
- If you changed any files locally, you must commit them using mcp__local_git_ops__commit_files AND push the branch using mcp__local_git_ops__push_branch before saying that you're done.
|
- If you changed any files locally, you must commit them using mcp__local_git_ops__commit_files AND push the branch using mcp__local_git_ops__push_branch before saying that you're done.
|
||||||
${!eventData.isPR || !eventData.claudeBranch ? `- If you created a branch and made changes, your comment must include the PR URL with prefilled title and body mentioned above.` : ""}
|
${!eventData.isPR || !eventData.claudeBranch ? `- If you created a branch and made changes, you must create a PR using mcp__local_git_ops__create_pull_request.` : ""}
|
||||||
|
|
||||||
Important Notes:
|
Important Notes:
|
||||||
- All communication must happen through Gitea PR comments.
|
- All communication must happen through Gitea PR comments.
|
||||||
@@ -671,8 +662,7 @@ c. List key information from the provided data
|
|||||||
d. Outline the main tasks and potential challenges
|
d. Outline the main tasks and potential challenges
|
||||||
e. Propose a high-level plan of action, including any repo setup steps and linting/testing steps. Remember, you are on a fresh checkout of the branch, so you may need to install dependencies, run build commands, etc.
|
e. Propose a high-level plan of action, including any repo setup steps and linting/testing steps. Remember, you are on a fresh checkout of the branch, so you may need to install dependencies, run build commands, etc.
|
||||||
f. If you are unable to complete certain steps, such as running a linter or test suite, particularly due to missing permissions, explain this in your comment so that the user can update your \`--allowedTools\`.
|
f. If you are unable to complete certain steps, such as running a linter or test suite, particularly due to missing permissions, explain this in your comment so that the user can update your \`--allowedTools\`.
|
||||||
`
|
`;
|
||||||
}`;
|
|
||||||
|
|
||||||
if (context.customInstructions) {
|
if (context.customInstructions) {
|
||||||
promptContent += `\n\nCUSTOM INSTRUCTIONS:\n${context.customInstructions}`;
|
promptContent += `\n\nCUSTOM INSTRUCTIONS:\n${context.customInstructions}`;
|
||||||
|
|||||||
@@ -7,8 +7,25 @@ function deriveApiUrl(serverUrl: string): string {
|
|||||||
return `${serverUrl}/api/v1`;
|
return `${serverUrl}/api/v1`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const GITEA_SERVER_URL =
|
// Get the appropriate server URL, prioritizing GITEA_SERVER_URL for custom Gitea instances
|
||||||
process.env.GITHUB_SERVER_URL || "https://github.com";
|
function getServerUrl(): string {
|
||||||
|
// First check for GITEA_SERVER_URL (can be set by user)
|
||||||
|
const giteaServerUrl = process.env.GITEA_SERVER_URL;
|
||||||
|
if (giteaServerUrl && giteaServerUrl !== "") {
|
||||||
|
return giteaServerUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back to GITHUB_SERVER_URL (set by Gitea/GitHub Actions environment)
|
||||||
|
const githubServerUrl = process.env.GITHUB_SERVER_URL;
|
||||||
|
if (githubServerUrl && githubServerUrl !== "") {
|
||||||
|
return githubServerUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default fallback
|
||||||
|
return "https://github.com";
|
||||||
|
}
|
||||||
|
|
||||||
|
export const GITEA_SERVER_URL = getServerUrl();
|
||||||
|
|
||||||
export const GITEA_API_URL =
|
export const GITEA_API_URL =
|
||||||
process.env.GITEA_API_URL || deriveApiUrl(GITEA_SERVER_URL);
|
process.env.GITEA_API_URL || deriveApiUrl(GITEA_SERVER_URL);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export async function setupBranch(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Check out the base branch and let Claude create branches as needed
|
// Check out the base branch and let Claude create branches as needed
|
||||||
await $`git fetch origin ${sourceBranch}`;
|
await $`git fetch origin --depth=1 ${sourceBranch}`;
|
||||||
await $`git checkout ${sourceBranch}`;
|
await $`git checkout ${sourceBranch}`;
|
||||||
await $`git pull origin ${sourceBranch}`;
|
await $`git pull origin ${sourceBranch}`;
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ export async function setupBranch(
|
|||||||
|
|
||||||
// Ensure we have the latest version of the source branch
|
// Ensure we have the latest version of the source branch
|
||||||
console.log(`Fetching latest ${sourceBranch}...`);
|
console.log(`Fetching latest ${sourceBranch}...`);
|
||||||
await $`git fetch origin ${sourceBranch}`;
|
await $`git fetch origin --depth=1 ${sourceBranch}`;
|
||||||
|
|
||||||
// Checkout the source branch
|
// Checkout the source branch
|
||||||
console.log(`Checking out ${sourceBranch}...`);
|
console.log(`Checking out ${sourceBranch}...`);
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export async function branchHasChanges(
|
|||||||
*/
|
*/
|
||||||
export async function fetchBranch(branchName: string): Promise<boolean> {
|
export async function fetchBranch(branchName: string): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
await $`git fetch origin ${branchName}`;
|
await $`git fetch origin --depth=1 ${branchName}`;
|
||||||
return true;
|
return true;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(
|
console.log(
|
||||||
|
|||||||
83
test/gitea-server-url.test.ts
Normal file
83
test/gitea-server-url.test.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { describe, it, expect, beforeEach, afterEach } from "bun:test";
|
||||||
|
|
||||||
|
describe("GITEA_SERVER_URL configuration", () => {
|
||||||
|
const originalEnv = process.env;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
// Reset environment variables
|
||||||
|
process.env = { ...originalEnv };
|
||||||
|
delete process.env.GITEA_SERVER_URL;
|
||||||
|
delete process.env.GITHUB_SERVER_URL;
|
||||||
|
|
||||||
|
// Clear module cache to force re-evaluation
|
||||||
|
delete require.cache[require.resolve("../src/github/api/config")];
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
process.env = originalEnv;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should prioritize GITEA_SERVER_URL over GITHUB_SERVER_URL", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "https://gitea.example.com";
|
||||||
|
process.env.GITHUB_SERVER_URL = "http://gitea:3000";
|
||||||
|
|
||||||
|
const { GITEA_SERVER_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_SERVER_URL).toBe("https://gitea.example.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should fall back to GITHUB_SERVER_URL when GITEA_SERVER_URL is not set", async () => {
|
||||||
|
process.env.GITHUB_SERVER_URL = "http://gitea:3000";
|
||||||
|
|
||||||
|
const { GITEA_SERVER_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_SERVER_URL).toBe("http://gitea:3000");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should use default when neither GITEA_SERVER_URL nor GITHUB_SERVER_URL is set", async () => {
|
||||||
|
const { GITEA_SERVER_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_SERVER_URL).toBe("https://github.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should ignore empty GITEA_SERVER_URL and use GITHUB_SERVER_URL", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "";
|
||||||
|
process.env.GITHUB_SERVER_URL = "http://gitea:3000";
|
||||||
|
|
||||||
|
const { GITEA_SERVER_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_SERVER_URL).toBe("http://gitea:3000");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should derive correct API URL from custom GITEA_SERVER_URL", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "https://gitea.example.com";
|
||||||
|
|
||||||
|
const { GITEA_API_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_API_URL).toBe("https://gitea.example.com/api/v1");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle GitHub.com URLs correctly", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "https://github.com";
|
||||||
|
|
||||||
|
const { GITEA_API_URL } = await import("../src/github/api/config");
|
||||||
|
expect(GITEA_API_URL).toBe("https://api.github.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create correct job run links with custom GITEA_SERVER_URL", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "https://gitea.example.com";
|
||||||
|
|
||||||
|
// Clear module cache and re-import
|
||||||
|
delete require.cache[require.resolve("../src/github/operations/comments/common")];
|
||||||
|
const { createJobRunLink } = await import("../src/github/operations/comments/common");
|
||||||
|
|
||||||
|
const link = createJobRunLink("owner", "repo", "123");
|
||||||
|
expect(link).toBe("[View job run](https://gitea.example.com/owner/repo/actions/runs/123)");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create correct branch links with custom GITEA_SERVER_URL", async () => {
|
||||||
|
process.env.GITEA_SERVER_URL = "https://gitea.example.com";
|
||||||
|
|
||||||
|
// Clear module cache and re-import
|
||||||
|
delete require.cache[require.resolve("../src/github/operations/comments/common")];
|
||||||
|
const { createBranchLink } = await import("../src/github/operations/comments/common");
|
||||||
|
|
||||||
|
const link = createBranchLink("owner", "repo", "feature-branch");
|
||||||
|
expect(link).toBe("\n[View branch](https://gitea.example.com/owner/repo/src/branch/feature-branch/)");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
// Environment setup & latest features
|
// Environment setup & latest features
|
||||||
"lib": ["ESNext"],
|
"lib": ["ESNext", "DOM"],
|
||||||
"target": "ESNext",
|
"target": "ESNext",
|
||||||
"module": "ESNext",
|
"module": "ESNext",
|
||||||
"moduleDetection": "force",
|
"moduleDetection": "force",
|
||||||
|
|||||||
Reference in New Issue
Block a user