Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
a77bcb4
introduce new event message bus rpc client and server
jjuliano Mar 11, 2025
bb8520f
return errors directly on non-params errors
jjuliano Mar 12, 2025
e527d25
add a results table to keep track of current results
jjuliano May 27, 2025
2174a53
store and append the resource output into item.results() per iteration
jjuliano May 27, 2025
17a160e
add actionID reference to item operations
jjuliano May 28, 2025
a6a6220
ensure that current action_id matches the DB
jjuliano May 28, 2025
a284ceb
convert evaluator to use the evaluator API
jjuliano May 30, 2025
72e7291
use the new API-based evaluator
jjuliano May 30, 2025
e5ee27d
update schema to 0.2.36
jjuliano May 30, 2025
b886a91
update ollama img to 0.8.0
jjuliano May 30, 2025
a1a9b56
relaxed the validations (will re-add) and json encode reader values
jjuliano May 30, 2025
869fe08
fix deprecated apis usage
jjuliano May 30, 2025
1ebfb63
add passing tests
jjuliano May 30, 2025
c1f512a
refactor item reader
jjuliano May 30, 2025
70f09a5
add more JSON repair operations
jjuliano Jun 1, 2025
450df61
handle closed DB gracefully
jjuliano Jun 1, 2025
39749e9
fix json repair logic
jjuliano Jun 1, 2025
f310641
move initialization of evaluator options logic into resolver
jjuliano Jun 2, 2025
db7d8ff
evaluate objects to JSON string using Go native libs
jjuliano Jun 4, 2025
6894da9
use the latest golangci
jjuliano Jun 19, 2025
38b9727
updated to latest golangci-lint. Use a new .golangci config
jjuliano Jun 19, 2025
3ff0ab4
suffix _test on test pkgs
jjuliano Jun 19, 2025
c35c4d4
continue adding more coverage tests
jjuliano Jun 21, 2025
ec4017d
refactor
jjuliano Jun 21, 2025
5a11ec3
add more coverage tests
jjuliano Jun 21, 2025
b9a116c
add more coverage tests
jjuliano Jun 21, 2025
a2deeec
bump to 75% coverage - added more coverage tests
jjuliano Jun 22, 2025
e3e51c2
added more tests to increase code coverage
jjuliano Jun 22, 2025
0fe9811
increase code-coverage further
jjuliano Jun 23, 2025
e8a9a98
increase code coverage to 77%
jjuliano Jun 23, 2025
ddb1fdb
CI build fixes
jjuliano Jun 23, 2025
aec187b
add more tests
jjuliano Jun 23, 2025
23cf991
centralized versioning; Dockerfile template; optional Anaconda download
jjuliano Jun 23, 2025
9285303
update version test to a much bump proof test
jjuliano Jun 23, 2025
6988f34
Merge bus branch to introduce message bus feature
jjuliano Jun 23, 2025
e2173be
use client-server message bus for IPC process replacing stamp-files
jjuliano Jun 23, 2025
821c65c
add more tests
jjuliano Jun 23, 2025
fda2009
add more tests
jjuliano Jun 23, 2025
012d40c
add more tests
jjuliano Jun 23, 2025
7aa9922
bump code coverage to 78%
jjuliano Jun 23, 2025
5b6d78b
bump code coverage to 78%
jjuliano Jun 23, 2025
3a81f35
bump code coverage to 78%
jjuliano Jun 24, 2025
978f122
bump code coverage
jjuliano Jun 24, 2025
23ebd56
bump code coverage
jjuliano Jun 24, 2025
1b71616
bump to 79%
jjuliano Jun 24, 2025
b29e8ad
bump to 79%
jjuliano Jun 24, 2025
153c92f
bump to 79%
jjuliano Jun 24, 2025
5a6e67f
bump to 79%
jjuliano Jun 24, 2025
8065776
add more tests
jjuliano Jun 24, 2025
9676984
Merge item_db_append: Add action ID support and results table functio…
jjuliano Jun 24, 2025
1a722b2
Fix function call capitalization and import issues after merge
jjuliano Jun 24, 2025
ce5f808
Complete item_db_append merge with updated tests
jjuliano Jun 24, 2025
fd469ab
Partially fix resolver tests after item_db_append merge
jjuliano Jun 24, 2025
60c7bab
Fix tests and update schema version after item_db_append merge
jjuliano Jun 24, 2025
46733e8
merged append_db_items
jjuliano Jun 25, 2025
54d15dc
windows compatibility
jjuliano Jun 26, 2025
492bf2a
add more tests
jjuliano Jun 27, 2025
f482e6a
code coverage
jjuliano Jun 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -221,4 +221,15 @@ pkg/**/**/*.txt
pkg/**/**/*.yaml
pkg/**/**/*.cover
pkg/**/**/*.cov
pkg/**/**/*.pkl
*.cov
*.pkl
*.db
*.backup
*.html
*.txt
temp_end
temp_main
./kdeps
kdeps
pkg/resolver/test-requesttest-resource
531 changes: 437 additions & 94 deletions .golangci.yml

Large diffs are not rendered by default.

25 changes: 13 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,23 @@ test: test-coverage

test-coverage:
@echo "$(OK_COLOR)==> Running the unit tests with coverage$(NO_COLOR)"
@NON_INTERACTIVE=1 go test -failfast -short -coverprofile=coverage_raw.out ./... | tee coverage.txt || true
@if [ -f coverage_raw.out ]; then \
{ head -n1 coverage_raw.out; grep -aE "^[[:alnum:]/._-]+\\.go:" coverage_raw.out; } > coverage.out; \
rm coverage_raw.out; \
fi
@echo "$(OK_COLOR)==> Coverage report:$(NO_COLOR)"
@go tool cover -func=coverage.out | tee coverage.txt || true
@COVERAGE=$$(grep total: coverage.txt | awk '{print $$3}' | sed 's/%//'); \
@TIMESTAMP=$$(date +%s); \
NON_INTERACTIVE=1 go test -failfast -short -coverprofile=coverage_raw_$$TIMESTAMP.out ./... | tee coverage_$$TIMESTAMP.txt || true; \
if [ -f coverage_raw_$$TIMESTAMP.out ]; then \
{ head -n1 coverage_raw_$$TIMESTAMP.out; grep -aE "^[[:alnum:]/._-]+\\.go:" coverage_raw_$$TIMESTAMP.out; } > coverage_$$TIMESTAMP.out; \
rm coverage_raw_$$TIMESTAMP.out; \
fi; \
echo "$(OK_COLOR)==> Coverage report:$(NO_COLOR)"; \
go tool cover -func=coverage_$$TIMESTAMP.out | tee coverage_$$TIMESTAMP.txt || true; \
COVERAGE=$$(grep total: coverage_$$TIMESTAMP.txt | awk '{print $$3}' | sed 's/%//'); \
REQUIRED=$${COVERAGE_THRESHOLD:-70.0}; \
if (( $$(echo $$COVERAGE '<' $$REQUIRED | bc -l) )); then \
echo "Coverage $$COVERAGE% is below required $$REQUIRED%"; \
exit 1; \
else \
echo "Coverage requirement met: $$COVERAGE% (threshold $$REQUIRED%)"; \
fi
@rm coverage.txt
fi; \
rm coverage_$$TIMESTAMP.txt coverage_$$TIMESTAMP.out 2> /dev/null

format: tools
@echo "$(OK_COLOR)>> [go vet] running$(NO_COLOR)" & \
Expand Down Expand Up @@ -79,10 +80,10 @@ tools:

@if ! command -v golangci-lint > /dev/null ; then \
echo ">> [$@]: golangci-lint not found: installing"; \
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.63.2; \
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \
fi

tools-update:
go install github.com/daixiang0/gci@latest; \
go install mvdan.cc/gofumpt@latest; \
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.63.2;
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest;
32 changes: 0 additions & 32 deletions cleanup_test.go

This file was deleted.

6 changes: 2 additions & 4 deletions cmd/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ package cmd

import (
"context"
"fmt"

"github.com/kdeps/kdeps/pkg/archiver"
"github.com/kdeps/kdeps/pkg/logging"
"github.com/spf13/afero"
"github.com/spf13/cobra"
Expand All @@ -21,11 +19,11 @@ func NewAddCommand(fs afero.Fs, ctx context.Context, kdepsDir string, logger *lo
RunE: func(cmd *cobra.Command, args []string) error {
pkgFile := args[0]
// Use the passed dependencies
_, err := archiver.ExtractPackage(fs, ctx, kdepsDir, pkgFile, logger)
_, err := ExtractPackageFn(fs, ctx, kdepsDir, pkgFile, logger)
if err != nil {
return err
}
fmt.Println("AI agent installed locally:", pkgFile)
PrintlnFn("AI agent installed locally:", pkgFile)
return nil
},
}
Expand Down
130 changes: 129 additions & 1 deletion cmd/add_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package cmd
package cmd_test

import (
"context"
"fmt"
"path/filepath"
"testing"

"github.com/kdeps/kdeps/cmd"
"github.com/kdeps/kdeps/pkg/archiver"
"github.com/kdeps/kdeps/pkg/logging"
"github.com/spf13/afero"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -153,3 +156,128 @@ func TestNewAddCommandRunE(t *testing.T) {
t.Fatalf("expected error due to missing package file, got nil")
}
}

func TestNewAddCommand_Structure(t *testing.T) {
fs := afero.NewMemMapFs()
ctx := context.Background()
kdepsDir := "/test/kdeps"
logger := logging.NewTestLogger()

cmd := NewAddCommand(fs, ctx, kdepsDir, logger)

if cmd.Use != "install [package]" {
t.Errorf("expected Use 'install [package]', got %q", cmd.Use)
}
if len(cmd.Aliases) != 1 || cmd.Aliases[0] != "i" {
t.Errorf("expected Aliases ['i'], got %v", cmd.Aliases)
}
if cmd.Short != "Install an AI agent locally" {
t.Errorf("expected Short 'Install an AI agent locally', got %q", cmd.Short)
}
if cmd.Example != "$ kdeps install ./myAgent.kdeps" {
t.Errorf("expected Example, got %q", cmd.Example)
}
}

func TestNewAddCommand_ArgsValidation(t *testing.T) {
fs := afero.NewMemMapFs()
ctx := context.Background()
kdepsDir := "/test/kdeps"
logger := logging.NewTestLogger()

cmd := NewAddCommand(fs, ctx, kdepsDir, logger)

// No arguments should error
err := cmd.Args(cmd, []string{})
if err == nil {
t.Error("expected error when no arguments provided")
}

// One argument should pass
err = cmd.Args(cmd, []string{"test.kdeps"})
if err != nil {
t.Errorf("unexpected error: %v", err)
}
}

func TestNewAddCommand_RunE_ErrorPath(t *testing.T) {
fs := afero.NewMemMapFs()
ctx := context.Background()
kdepsDir := "/test/kdeps"
logger := logging.NewTestLogger()

cmd := NewAddCommand(fs, ctx, kdepsDir, logger)
cmd.SetArgs([]string{"nonexistent.kdeps"})
err := cmd.Execute()
if err == nil {
t.Error("expected error for nonexistent package file")
}
}

// TestNewAddCommand_Success tests the success path with mocked ExtractPackage
func TestNewAddCommand_Success(t *testing.T) {
fs := afero.NewMemMapFs()
ctx := context.Background()
kdepsDir := "/tmp/kdeps"
logger := logging.NewTestLogger()

// Store original function
originalExtractPackageFn := cmd.ExtractPackageFn

// Restore original function after test
defer func() {
cmd.ExtractPackageFn = originalExtractPackageFn
}()

// Mock ExtractPackage for success path
cmd.ExtractPackageFn = func(fs afero.Fs, ctx context.Context, kdepsDir, kdepsPackage string, logger *logging.Logger) (*archiver.KdepsPackage, error) {
return &archiver.KdepsPackage{Workflow: "test-workflow"}, nil
}

// Capture the printed message
originalPrintlnFn := cmd.PrintlnFn
defer func() {
cmd.PrintlnFn = originalPrintlnFn
}()

var printedMessage string
cmd.PrintlnFn = func(a ...interface{}) (n int, err error) {
printedMessage = fmt.Sprintln(a...)
return len(printedMessage), nil
}

// Test the success path
addCmd := cmd.NewAddCommand(fs, ctx, kdepsDir, logger)
err := addCmd.RunE(addCmd, []string{"test.kdeps"})

assert.NoError(t, err)
assert.Contains(t, printedMessage, "AI agent installed locally: test.kdeps")
}

// TestNewAddCommand_ExtractPackageError tests error handling when ExtractPackage fails
func TestNewAddCommand_ExtractPackageError(t *testing.T) {
fs := afero.NewMemMapFs()
ctx := context.Background()
kdepsDir := "/tmp/kdeps"
logger := logging.NewTestLogger()

// Store original function
originalExtractPackageFn := cmd.ExtractPackageFn

// Restore original function after test
defer func() {
cmd.ExtractPackageFn = originalExtractPackageFn
}()

// Mock ExtractPackage for error path
cmd.ExtractPackageFn = func(fs afero.Fs, ctx context.Context, kdepsDir, kdepsPackage string, logger *logging.Logger) (*archiver.KdepsPackage, error) {
return nil, fmt.Errorf("extract package error")
}

// Test the error path
addCmd := cmd.NewAddCommand(fs, ctx, kdepsDir, logger)
err := addCmd.RunE(addCmd, []string{"test.kdeps"})

assert.Error(t, err)
assert.Contains(t, err.Error(), "extract package error")
}
16 changes: 6 additions & 10 deletions cmd/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@ package cmd

import (
"context"
"fmt"

"github.com/docker/docker/client"
"github.com/kdeps/kdeps/pkg/archiver"
"github.com/kdeps/kdeps/pkg/docker"
"github.com/kdeps/kdeps/pkg/logging"
"github.com/kdeps/schema/gen/kdeps"
"github.com/spf13/afero"
Expand All @@ -24,27 +20,27 @@ func NewBuildCommand(fs afero.Fs, ctx context.Context, kdepsDir string, systemCf
RunE: func(cmd *cobra.Command, args []string) error {
pkgFile := args[0]
// Use the passed dependencies
pkgProject, err := archiver.ExtractPackage(fs, ctx, kdepsDir, pkgFile, logger)
pkgProject, err := ExtractPackageFn(fs, ctx, kdepsDir, pkgFile, logger)
if err != nil {
return err
}
runDir, _, _, _, _, _, _, _, err := docker.BuildDockerfile(fs, ctx, systemCfg, kdepsDir, pkgProject, logger)
runDir, _, _, _, _, _, _, _, err := BuildDockerfileFn(fs, ctx, systemCfg, kdepsDir, pkgProject, logger)
if err != nil {
return err
}
dockerClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
dockerClient, err := NewDockerClientFn()
if err != nil {
return err
}
agentContainerName, agentContainerNameAndVersion, err := docker.BuildDockerImage(fs, ctx, systemCfg, dockerClient, runDir, kdepsDir, pkgProject, logger)
agentContainerName, agentContainerNameAndVersion, err := BuildDockerImageFn(fs, ctx, systemCfg, dockerClient, runDir, kdepsDir, pkgProject, logger)
if err != nil {
return err
}

if err := docker.CleanupDockerBuildImages(fs, ctx, agentContainerName, dockerClient); err != nil {
if err := CleanupDockerBuildImagesFn(fs, ctx, agentContainerName, dockerClient); err != nil {
return err
}
fmt.Println("Kdeps AI Agent docker image created:", agentContainerNameAndVersion)
PrintlnFn("Kdeps AI Agent docker image created:", agentContainerNameAndVersion)
return nil
},
}
Expand Down
Loading
Loading