daggie
Daggie — AI-powered Dagger CI specialist agent.
Installation
dagger install github.com/telchak/daggerverse/daggie@v0.1.0Entrypoint
Return Type
Daggie !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| source | Directory | - | Project source directory |
| moduleUrls | [String ! ] | - | Git URLs of Dagger modules to clone and read for reference (e.g. 'https://github.com/org/repo.git#main:path/to/module') |
| selfImprove | String ! | "off" | Self-improvement mode: 'off' (default), 'write' (update context file), 'commit' (update + git commit) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve stringfunc (m *MyModule) Example(selfImprove string) *dagger.Daggie {
return dag.
Daggie(selfImprove)
}@function
def example(self_improve: str) -> dagger.Daggie:
return (
dag.daggie(self_improve)
)@func()
example(selfImprove: string): Daggie {
return dag
.daggie(selfImprove)
}Types
Daggie 🔗
AI-powered Dagger CI specialist agent. Specializes in creating, explaining, and debugging Dagger CI modules and pipelines across all SDKs (Python, TypeScript, Go, Java). Accepts Git URLs of Dagger modules at runtime, clones them via dag.git(), reads their source code, and uses that knowledge to propose implementations. Pass your project as --source and optionally reference Dagger modules via --module-urls for the agent to learn from.
source() 🔗
Project source directory
Return Type
Directory ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string sourcefunc (m *MyModule) Example(selfImprove string) *dagger.Directory {
return dag.
Daggie(selfImprove).
Source()
}@function
def example(self_improve: str) -> dagger.Directory:
return (
dag.daggie(self_improve)
.source()
)@func()
example(selfImprove: string): Directory {
return dag
.daggie(selfImprove)
.source()
}moduleUrls() 🔗
Git URLs of Dagger modules to clone and read for reference (e.g. ‘https://github.com/org/repo.git#main:path/to/module’)
Return Type
[String ! ] ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string module-urlsfunc (m *MyModule) Example(ctx context.Context, selfImprove string) []string {
return dag.
Daggie(selfImprove).
ModuleUrls(ctx)
}@function
async def example(self_improve: str) -> List[str]:
return await (
dag.daggie(self_improve)
.module_urls()
)@func()
async example(selfImprove: string): Promise<string[]> {
return dag
.daggie(selfImprove)
.moduleUrls()
}selfImprove() 🔗
Self-improvement mode: ‘off’ (default), ‘write’ (update context file), ‘commit’ (update + git commit)
Return Type
String ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string self-improvefunc (m *MyModule) Example(ctx context.Context, selfImprove string) string {
return dag.
Daggie(selfImprove).
SelfImprove(ctx)
}@function
async def example(self_improve: str) -> str:
return await (
dag.daggie(self_improve)
.self_improve()
)@func()
async example(selfImprove: string): Promise<string> {
return dag
.daggie(selfImprove)
.selfImprove()
}githubToken() 🔗
Return Type
Secret Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string github-tokenfunc (m *MyModule) Example(selfImprove string) *dagger.Secret {
return dag.
Daggie(selfImprove).
GithubToken()
}@function
def example(self_improve: str) -> dagger.Secret:
return (
dag.daggie(self_improve)
.github_token()
)@func()
example(selfImprove: string): Secret {
return dag
.daggie(selfImprove)
.githubToken()
}prRepo() 🔗
Return Type
String ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string pr-repofunc (m *MyModule) Example(ctx context.Context, selfImprove string) string {
return dag.
Daggie(selfImprove).
PrRepo(ctx)
}@function
async def example(self_improve: str) -> str:
return await (
dag.daggie(self_improve)
.pr_repo()
)@func()
async example(selfImprove: string): Promise<string> {
return dag
.daggie(selfImprove)
.prRepo()
}prNumber() 🔗
Return Type
Integer ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string pr-numberfunc (m *MyModule) Example(ctx context.Context, selfImprove string) int {
return dag.
Daggie(selfImprove).
PrNumber(ctx)
}@function
async def example(self_improve: str) -> int:
return await (
dag.daggie(self_improve)
.pr_number()
)@func()
async example(selfImprove: string): Promise<number> {
return dag
.daggie(selfImprove)
.prNumber()
}prCommitSha() 🔗
Return Type
String ! Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string pr-commit-shafunc (m *MyModule) Example(ctx context.Context, selfImprove string) string {
return dag.
Daggie(selfImprove).
PrCommitSha(ctx)
}@function
async def example(self_improve: str) -> str:
return await (
dag.daggie(self_improve)
.pr_commit_sha()
)@func()
async example(selfImprove: string): Promise<string> {
return dag
.daggie(selfImprove)
.prCommitSha()
}assist() 🔗
Create Dagger pipelines and modules, implement features.
Reads reference modules, understands your project, and implements Dagger CI pipelines. Returns the modified workspace directory.
Return Type
Directory !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| assignment | String ! | - | What you want the agent to do (e.g. 'Create a Dagger pipeline for building and testing a Python project') |
| source | Directory | null | Override source directory (uses constructor source if omitted) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string assist --assignment stringfunc (m *MyModule) Example(selfImprove string, assignment string) *dagger.Directory {
return dag.
Daggie(selfImprove).
Assist(assignment)
}@function
def example(self_improve: str, assignment: str) -> dagger.Directory:
return (
dag.daggie(self_improve)
.assist(assignment)
)@func()
example(selfImprove: string, assignment: string): Directory {
return dag
.daggie(selfImprove)
.assist(assignment)
}debug() 🔗
Diagnose and fix Dagger pipeline errors.
Analyzes error output, reads relevant source files, identifies the root cause, and applies fixes. Returns the modified workspace directory.
Return Type
Directory !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| errorOutput | String ! | - | Pipeline error output (stderr/stdout from dagger call) |
| source | Directory | null | Source directory with the broken module (optional) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string debug --error-output stringfunc (m *MyModule) Example(selfImprove string, errorOutput string) *dagger.Directory {
return dag.
Daggie(selfImprove).
Debug(errorOutput)
}@function
def example(self_improve: str, error_output: str) -> dagger.Directory:
return (
dag.daggie(self_improve)
.debug(error_output)
)@func()
example(selfImprove: string, errorOutput: string): Directory {
return dag
.daggie(selfImprove)
.debug(errorOutput)
}developGithubIssue() 🔗
Read a GitHub issue, route it to the best agent, and create a Pull Request.
A router LLM reads the issue and selects the optimal function — assist, explain, or debug — then calls it with extracted parameters. Comments on the issue with a summary and a link to the PR. Returns the PR URL.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| githubToken | Secret ! | - | GitHub token with repo and pull-request permissions |
| issueId | Integer ! | - | GitHub issue number |
| repository | String ! | - | GitHub repository URL (e.g. 'https://github.com/owner/repo') |
| source | Directory | null | Override source directory (uses constructor source if omitted) |
| base | String ! | "main" | Base branch for the pull request |
| suggestGithubFixOnFailure | Boolean ! | false | Post a diagnostic comment on the issue if the agent fails |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string develop-github-issue --github-token env:MYSECRET --issue-id integer --repository string --base string --suggest-github-fix-on-failure booleanfunc (m *MyModule) Example(ctx context.Context, selfImprove string, githubToken *dagger.Secret, issueId int, repository string, base string, suggestGithubFixOnFailure bool) string {
return dag.
Daggie(selfImprove).
DevelopGithubIssue(ctx, githubToken, issueId, repository, base, suggestGithubFixOnFailure)
}@function
async def example(self_improve: str, github_token: dagger.Secret, issue_id: int, repository: str, base: str, suggest_github_fix_on_failure: bool) -> str:
return await (
dag.daggie(self_improve)
.develop_github_issue(github_token, issue_id, repository, base, suggest_github_fix_on_failure)
)@func()
async example(selfImprove: string, githubToken: Secret, issueId: number, repository: string, base: string, suggestGithubFixOnFailure: boolean): Promise<string> {
return dag
.daggie(selfImprove)
.developGithubIssue(githubToken, issueId, repository, base, suggestGithubFixOnFailure)
}editFile() 🔗
Edit a file by replacing a string. The old_string must match exactly.
Returns a changeset showing the diff.
Return Type
Changeset !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| filePath | String ! | - | Path to the file relative to the workspace root |
| oldString | String ! | - | The exact string to find and replace |
| newString | String ! | - | The replacement string |
| replaceAll | Boolean ! | false | Replace all occurrences (default: first only) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string edit-file --file-path string --old-string string --new-string string --replace-all booleanfunc (m *MyModule) Example(selfImprove string, filePath string, oldString string, newString string, replaceAll bool) *dagger.Changeset {
return dag.
Daggie(selfImprove).
EditFile(filePath, oldString, newString, replaceAll)
}@function
def example(self_improve: str, file_path: str, old_string: str, new_string: str, replace_all: bool) -> dagger.Changeset:
return (
dag.daggie(self_improve)
.edit_file(file_path, old_string, new_string, replace_all)
)@func()
example(selfImprove: string, filePath: string, oldString: string, newString: string, replaceAll: boolean): Changeset {
return dag
.daggie(selfImprove)
.editFile(filePath, oldString, newString, replaceAll)
}explain() 🔗
Explain Dagger modules, CLI commands, pipeline patterns, and concepts.
Reads reference modules and source code to provide clear explanations with code examples. Returns the explanation as text.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| question | String ! | - | What you want explained (e.g. 'How does caching work in Dagger?') |
| source | Directory | null | Source directory to reference (optional) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string explain --question stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, question string) string {
return dag.
Daggie(selfImprove).
Explain(ctx, question)
}@function
async def example(self_improve: str, question: str) -> str:
return await (
dag.daggie(self_improve)
.explain(question)
)@func()
async example(selfImprove: string, question: string): Promise<string> {
return dag
.daggie(selfImprove)
.explain(question)
}glob() 🔗
Find files in the workspace matching a glob pattern.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| pattern | String ! | - | Glob pattern (e.g. 'src/**/*.py', '**/*.go', '**/dagger.json') |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string glob --pattern stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, pattern string) string {
return dag.
Daggie(selfImprove).
Glob(ctx, pattern)
}@function
async def example(self_improve: str, pattern: str) -> str:
return await (
dag.daggie(self_improve)
.glob(pattern)
)@func()
async example(selfImprove: string, pattern: string): Promise<string> {
return dag
.daggie(selfImprove)
.glob(pattern)
}grep() 🔗
Search file contents in the workspace using grep.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| pattern | String ! | - | Search pattern (regex supported) |
| paths | String ! | "" | Comma-separated paths to search in (optional) |
| fileGlob | String ! | "" | Glob pattern to filter files (e.g. '*.py') |
| insensitive | Boolean ! | false | Case-insensitive search |
| limit | Integer ! | 100 | Maximum number of matching lines to return |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string grep --pattern string --paths string --file-glob string --insensitive boolean --limit integerfunc (m *MyModule) Example(ctx context.Context, selfImprove string, pattern string, paths string, fileGlob string, insensitive bool, limit int) string {
return dag.
Daggie(selfImprove).
Grep(ctx, pattern, paths, fileGlob, insensitive, limit)
}@function
async def example(self_improve: str, pattern: str, paths: str, file_glob: str, insensitive: bool, limit: int) -> str:
return await (
dag.daggie(self_improve)
.grep(pattern, paths, file_glob, insensitive, limit)
)@func()
async example(selfImprove: string, pattern: string, paths: string, fileGlob: string, insensitive: boolean, limit: number): Promise<string> {
return dag
.daggie(selfImprove)
.grep(pattern, paths, fileGlob, insensitive, limit)
}readFile() 🔗
Read a file from the workspace with line numbers.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| filePath | String ! | - | Path to the file relative to the workspace root |
| offset | Integer ! | 0 | Line number to start reading from (1-based) |
| limit | Integer ! | 0 | Maximum number of lines to read |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string read-file --file-path string --offset integer --limit integerfunc (m *MyModule) Example(ctx context.Context, selfImprove string, filePath string, offset int, limit int) string {
return dag.
Daggie(selfImprove).
ReadFile(ctx, filePath, offset, limit)
}@function
async def example(self_improve: str, file_path: str, offset: int, limit: int) -> str:
return await (
dag.daggie(self_improve)
.read_file(file_path, offset, limit)
)@func()
async example(selfImprove: string, filePath: string, offset: number, limit: number): Promise<string> {
return dag
.daggie(selfImprove)
.readFile(filePath, offset, limit)
}readModule() 🔗
Read a Dagger module from a Git repository.
Clones the repo, reads dagger.json and main source files, and returns formatted module documentation. Use this to learn from existing Dagger modules when implementing new ones.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| url | String ! | - | Git URL of a Dagger module (e.g. 'https://github.com/org/repo.git#main:path/to/module') |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string read-module --url stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, url string) string {
return dag.
Daggie(selfImprove).
ReadModule(ctx, url)
}@function
async def example(self_improve: str, url: str) -> str:
return await (
dag.daggie(self_improve)
.read_module(url)
)@func()
async example(selfImprove: string, url: string): Promise<string> {
return dag
.daggie(selfImprove)
.readModule(url)
}review() 🔗
Review Dagger module code for quality, best practices, and correctness.
Checks function signatures, caching strategies, error handling, SDK patterns, and dagger.json configuration. Returns structured feedback.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| source | Directory | null | Source directory to review (uses constructor source if omitted) |
| diff | String ! | "" | Git diff or PR diff to review (optional) |
| focus | String ! | "" | Specific area to focus the review on (optional) |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string review --diff string --focus stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, diff string, focus string) string {
return dag.
Daggie(selfImprove).
Review(ctxdiff, focus)
}@function
async def example(self_improve: str, diff: str, focus: str) -> str:
return await (
dag.daggie(self_improve)
.review(diff, focus)
)@func()
async example(selfImprove: string, diff: string, focus: string): Promise<string> {
return dag
.daggie(selfImprove)
.review(diff, focus)
}suggestGithubFix() 🔗
Analyze a CI failure and post inline code suggestions on a GitHub PR.
Reads the error output, explores source files, and posts GitHub “suggested changes” that developers can apply with one click.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| githubToken | Secret ! | - | GitHub token with repo permissions |
| prNumber | Integer ! | - | Pull request number |
| repo | String ! | - | GitHub repository URL (e.g. 'https://github.com/owner/repo') |
| commitSha | String ! | - | HEAD commit SHA of the PR branch |
| errorOutput | String ! | - | CI error output (stderr/stdout) |
| source | Directory | null | Source directory of the PR branch |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string suggest-github-fix --github-token env:MYSECRET --pr-number integer --repo string --commit-sha string --error-output stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, githubToken *dagger.Secret, prNumber int, repo string, commitSha string, errorOutput string) string {
return dag.
Daggie(selfImprove).
SuggestGithubFix(ctx, githubToken, prNumber, repo, commitSha, errorOutput)
}@function
async def example(self_improve: str, github_token: dagger.Secret, pr_number: int, repo: str, commit_sha: str, error_output: str) -> str:
return await (
dag.daggie(self_improve)
.suggest_github_fix(github_token, pr_number, repo, commit_sha, error_output)
)@func()
async example(selfImprove: string, githubToken: Secret, prNumber: number, repo: string, commitSha: string, errorOutput: string): Promise<string> {
return dag
.daggie(selfImprove)
.suggestGithubFix(githubToken, prNumber, repo, commitSha, errorOutput)
}suggestGithubPrCodeComment() 🔗
Post an inline code suggestion on a GitHub pull request.
The suggestion will appear as a GitHub “suggested change” that developers can apply with one click.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| path | String ! | - | File path relative to repo root |
| line | Integer ! | - | Line number to suggest a change on |
| suggestion | String ! | - | Replacement code (no ```suggestion fences, just the raw code) |
| comment | String ! | "" | Explanation of the fix |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string suggest-github-pr-code-comment --path string --line integer --suggestion string --comment stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, path string, line int, suggestion string, comment string) string {
return dag.
Daggie(selfImprove).
SuggestGithubPrCodeComment(ctx, path, line, suggestion, comment)
}@function
async def example(self_improve: str, path: str, line: int, suggestion: str, comment: str) -> str:
return await (
dag.daggie(self_improve)
.suggest_github_pr_code_comment(path, line, suggestion, comment)
)@func()
async example(selfImprove: string, path: string, line: number, suggestion: string, comment: string): Promise<string> {
return dag
.daggie(selfImprove)
.suggestGithubPrCodeComment(path, line, suggestion, comment)
}task() 🔗
Launch a sub-agent for research or focused work.
The sub-agent has read-only access to the workspace. Use this for research, analysis, or exploring documentation.
Return Type
String !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| description | String ! | - | Short description of the sub-task |
| prompt | String ! | - | Detailed prompt for the sub-agent |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string task --description string --prompt stringfunc (m *MyModule) Example(ctx context.Context, selfImprove string, description string, prompt string) string {
return dag.
Daggie(selfImprove).
Task(ctx, description, prompt)
}@function
async def example(self_improve: str, description: str, prompt: str) -> str:
return await (
dag.daggie(self_improve)
.task(description, prompt)
)@func()
async example(selfImprove: string, description: string, prompt: string): Promise<string> {
return dag
.daggie(selfImprove)
.task(description, prompt)
}writeFile() 🔗
Create or overwrite a file in the workspace.
Returns a changeset showing the diff.
Return Type
Changeset !Arguments
| Name | Type | Default Value | Description |
|---|---|---|---|
| filePath | String ! | - | Path to the file relative to the workspace root |
| contents | String ! | - | The full file contents to write |
Example
dagger -m github.com/telchak/daggerverse/daggie@010621c997378db92da5969584001be575c5e5a7 call \
--self-improve string write-file --file-path string --contents stringfunc (m *MyModule) Example(selfImprove string, filePath string, contents string) *dagger.Changeset {
return dag.
Daggie(selfImprove).
WriteFile(filePath, contents)
}@function
def example(self_improve: str, file_path: str, contents: str) -> dagger.Changeset:
return (
dag.daggie(self_improve)
.write_file(file_path, contents)
)@func()
example(selfImprove: string, filePath: string, contents: string): Changeset {
return dag
.daggie(selfImprove)
.writeFile(filePath, contents)
}