diff --git a/roles/home/aichat/config.yaml b/roles/home/aichat/config.yaml new file mode 100644 index 0000000..dbf40de --- /dev/null +++ b/roles/home/aichat/config.yaml @@ -0,0 +1,23 @@ +clients: + - type: ollama + api_base: https://ollama.giugl.io + models: + - name: mistral:7b-instruct-v0.3-fp16 + max_input_tokens: 32000 + max_output_tokens: 8192 + + - name: llama3:8b-instruct-fp16 + max_input_tokens: 8192 + max_output_tokens: 8192 + + - name: phi3:14b-medium-4k-instruct-q8_0 + max_input_tokens: 128000 + max_output_tokens: 8192 + + - name: pino-coder + max_input_tokens: 8192 + max_output_tokens: 8192 + + - type: openai + api_key: null + api_base: https://api.openai.com/v1 diff --git a/roles/home/aichat/roles/commitmessage.md b/roles/home/aichat/roles/commitmessage.md new file mode 100644 index 0000000..f1fd85a --- /dev/null +++ b/roles/home/aichat/roles/commitmessage.md @@ -0,0 +1,175 @@ +--- +model: ollama:pino-coder +temperature: 0 +--- + +Your task is to generate a commit message for a given git diff. The commit message should follow the Conventional Commits specification, which includes a type, optional scope, and a brief description. The message should be concise, unambiguous, and capture the technical details of the changes made. + +Commit Convention Format: +(): + +[optional body] + +[optional footer(s)] + +Common types include: +- feat: A new feature +- fix: A bug fix +- docs: Documentation changes +- style: Code style/formatting changes (not affecting code logic) +- refactor: Code changes that neither fix a bug nor add a feature +- test: Adding or modifying tests +- chore: Changes to build process or auxiliary tools +- perf: Performance improvements + +Here are some examples of well-formatted commit messages: + +### INPUT: + +diff --git a/src/utils/date-formatter.js b/src/utils/date-formatter.js +index 2345678..3456789 100644 +--- a/src/utils/date-formatter.js ++++ b/src/utils/date-formatter.js +@@ -5,7 +5,7 @@ export function formatDate(date) { + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); +- return `$${year}-$${month}-$${day}`; ++ return `$${year}/$${month}/$${day}`; +} + +### OUTPUT: + +fix(date-formatter): modified `formatDate()` to use '/' instead of '-' as the separator + +### INPUT: + +diff --git a/src/app.js b/src/app.js +index 83d2e7a..b6a1c3f 100644 +--- a/src/app.js ++++ b/src/app.js +@@ -10,6 +10,10 @@ function initialize() { + setupEventListeners(); +} + ++// TODO: add other listeners ++// https://github.com/user/project/issue/123 ++function setupEventListeners() { ++ document.getElementById('submit').addEventListener('click', handleSubmit); ++ document.getElementById('reset').addEventListener('click', handleReset); ++} ++ +function handleSubmit(event) { + event.preventDefault(); + const data = new FormData(event.target); +@@ -20,6 +24,10 @@ function handleSubmit(event) { + + console.log('Form submitted:', data); +} + ++function handleReset(event) { ++ event.preventDefault(); ++ event.target.form.reset(); ++ console.log('Form reset'); +} + +### OUTPUT: + +feat(app): implement form event listeners + +- Added `setupEventListeners()` to handle form interactions +- Implemented `handleReset()` for form reset functionality +- Added event listeners for submit and reset buttons +- Track TODO comment for future listener additions (https://github.com/user/project/issue/123) + +### INPUT: + +diff --git a/pkg/database/client.go b/pkg/database/client.go +index 003740f..6fc4861 100644 +--- a/pkg/database/client.go ++++ b/pkg/database/client.go +@@ -24,9 +24,12 @@ var ErrNilDatabaseClient = errors.New("database client is nil after setup") + +// InitDB initializes the database with the given application name and optional dbpath for SQLite. +func InitDB(appName string, dbpath ...string) error { +- cfg := config.New() ++ var ( ++ psqlReadReplica string ++ err error ++ ) + +- var err error ++ cfg := config.New() + + // Set up a new logger with your required configuration. + newLogger := logger.New( +@@ -38,9 +41,8 @@ func InitDB(appName string, dbpath ...string) error { + }, + ) + +- // Load PostgreSQL configurations +- var psqlReadReplica string + psqlSource, err := cfg.Load(config.PSQL.String()) ++ + if err != nil { + log.Println("PSQL not set, using SQLite instead.") + } else { + +### OUTPUT: + +style(database/client): group together `psqlReadReplica` and `err` in function's prologue + +### INPUT: + +diff --git a/pkg/khttp/client.go b/pkg/khttp/client.go +index a53064c..3aff938 100644 +--- a/pkg/khttp/client.go ++++ b/pkg/khttp/client.go +@@ -11,14 +11,17 @@ import ( + "github.pie.apple.com/kerosene/Core/structs" +) + ++// TODO: https://github.pie.apple.com/Kerosene/Core/issues/43 ++// feat: Centralise and remove over use of os.Environment +const ( +- // Environment variables and file names. + authFilesDirEnvVar = "WHISPER_AUTH_FILES_DIR" + keyName = "decrypted_key.pem" + certName = "cert.pem" +) + +// Error for missing environment variable. ++// TODO: refactor: move errors into centralized errors.go files ++// https://github.pie.apple.com/Kerosene/Core/issues/57 +var errMissingEnvironmentVariable = fmt.Errorf("%s environment variable is not set", authFilesDirEnvVar) + +// AuthConfig holds authentication file paths. +@@ -31,9 +34,11 @@ type AuthConfig struct { +// NewAuthConfig creates an AuthConfig from environment variables. +func NewAuthConfig() (*AuthConfig, error) { + dir := os.Getenv(authFilesDirEnvVar) ++ + if dir == "" { + return nil, errMissingEnvironmentVariable + } ++ + return &AuthConfig{ + Dir: dir, + CertFile: filepath.Join(dir, certName), +@@ -211,7 +216,7 @@ func setupMTLSOnlyTransport(certData string, keyData string) (*http.Transport, e + +// Make scheme and Auth Type separate and load from DB. +func parseProxyURL(scheme string, routing structs.Routing) (*url.URL, error) { +- return url.Parse(fmt.Sprintf("%s://%s:%s", scheme, routing.Proxy, routing.Port)) ++ return url.Parse(fmt.Sprintf("%s://%s:%d", scheme, routing.Proxy, routing.Port)) +} + +// loadX509KeyPair loads an X509 key pair from the specified cert and key files. + +### OUTPUT: + +fix/refactor(khttp/client): use correct format specifier for and add TODOs + +- Parsed proxy URL using `fmt.Sprintf()` with correct format specifier for port +- Added TODOs to centralize errors and remove overuse of `os.Environment` (#43, #57) + + diff --git a/roles/home/aichat/roles/createpr.md b/roles/home/aichat/roles/createpr.md new file mode 100644 index 0000000..0a7298e --- /dev/null +++ b/roles/home/aichat/roles/createpr.md @@ -0,0 +1,8 @@ +--- +model: ollama:pino-coder +temperature: 0 +--- + +Create a concise and informative PR message for a given code diff using the Conventional Commits format. +Include all significant changes, such as new environment variables, refactored functions, and added or removed TODOs. +Mention specific issue numbers for better trackability. diff --git a/roles/home/scripts/commits.sh b/roles/home/scripts/commits.sh new file mode 100644 index 0000000..cb02274 --- /dev/null +++ b/roles/home/scripts/commits.sh @@ -0,0 +1,124 @@ +create_pr_from_files() { + local origin_branch="development" + local current_branch=$(git rev-parse --abbrev-ref HEAD) + local files=() + + # Parse arguments + while [[ $# -gt 0 ]]; do + case $1 in + -b | --base) + origin_branch="$2" + shift 2 + ;; + *) + files+=("$1") + shift + ;; + esac + done + + if [ ${#files[@]} -eq 0 ]; then + echo "Usage: create_pr_from_files [ ...] [-b ]" + return 1 + fi + + # Checkout to the new branch and add the specified files + local commit_message="" + local new_branch="pr-$(date +%Y%m%d%H%M%S)" + + git checkout -b "$new_branch" + git add "${files[@]}" + + # Generate commit message using aichat + echo "Generating commit message..." + commit_message=$(git diff --staged | aichat -m ollama:pino-coder -r commitmessage) + + if [ -z "$commit_message" ]; then + echo "Failed to generate commit message. Cleaning up." + git checkout - + git branch -D "$new_branch" + if $has_changes; then + echo "Restoring stashed changes..." + git stash pop + fi + git checkout "${current_branch}" + return 1 + fi + + # Extract title and body from the generated commit message + local commit_subject=$(echo "$commit_message" | head -n 1) + local commit_body=$(echo "$commit_message" | tail -n +2) + + if ! git commit -m "$commit_subject"$'\n\n'"$commit_body"; then + echo "Committing changes failed. Cleaning up." + git checkout - + git branch -D "$new_branch" + if $has_changes; then + echo "Restoring stashed changes..." + git stash pop + fi + + git checkout "${current_branch}" + + return 1 + fi + + git push origin "$new_branch" + + gh pr create --base "$origin_branch" --head "$new_branch" --title "$commit_subject" --body "$commit_body" + + echo "Pull request created successfully." + + git checkout "${current_branch}" +} + +create_pr_from_commit() { + local commit_hash="$1" + local base_branch="${2:-development}" + + if [ -z "$commit_hash" ]; then + echo "Usage: create_pr_from_commit []" + return 1 + fi + + # Check for uncommitted changes and stash them if any + local has_changes=false + if ! git diff --quiet || ! git diff --cached --quiet; then + echo "Stashing uncommitted changes..." + git stash push -u + has_changes=true + fi + + # Create a new branch name based on the commit hash + local new_branch="pr-${commit_hash}" + + # Checkout to the new branch and cherry-pick the commit + git checkout "$base_branch" && git checkout -b "$new_branch" + if ! git cherry-pick "$commit_hash"; then + echo "Cherry-picking failed. Cleaning up." + git checkout - + git branch -D "$new_branch" + if $has_changes; then + echo "Restoring stashed changes..." + git stash pop + fi + return 1 + fi + + git push origin "$new_branch" + + local commit_message=$(git show -s --format=%B "$commit_hash") + local commit_subject=$(echo "$commit_message" | head -n 1) + local commit_body=$(echo "$commit_message" | tail -n +2) + + gh pr create --base "$base_branch" --head "$new_branch" --title "$commit_subject" --body "$commit_body" + + echo "Pull request created successfully." + + if $has_changes; then + echo "Restoring stashed changes..." + git stash pop + fi +} + +