mirror of
https://github.com/coder/registry.git
synced 2026-06-02 20:48:14 +00:00
feat: add auggie cli (#350)
## Description Adds the Auggie CLI module <!-- Briefly describe what this PR does and why --> ## Type of Change - [x] New module - [ ] Bug fix - [ ] Feature/enhancement - [ ] Documentation - [ ] Other ## Module Information <!-- Delete this section if not applicable --> **Path:** `registry/coder-labs/modules/auggie` **New version:** `v0.1.0` ## Testing & Validation - [x] Tests pass (`bun test`) - [x] Code formatted (`bun run fmt`) - [x] Changes tested locally ## Related Issues <!-- Link related issues or write "None" if not applicable --> --------- Co-authored-by: Atif Ali <me@matifali.dev> Co-authored-by: DevelopmentCats <christofer@coder.com> Co-authored-by: DevCats <chris@dualriver.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="25" height="25"/>
|
||||
<path d="M5.50694 21.1637C5.17323 21.1637 4.89218 21.1064 4.66378 20.9926C4.436 20.8787 4.26333 20.7052 4.1476 20.4763C4.03187 20.2473 3.97247 19.9672 3.97247 19.6382V16.2463C3.97247 15.8281 3.88859 15.5239 3.72265 15.3341C3.55549 15.1449 3.25912 15.0449 2.83418 15.0353C2.70191 15.0353 2.59598 14.9859 2.51577 14.8853C2.43433 14.7859 2.39453 14.6708 2.39453 14.5425C2.39453 14.4033 2.43433 14.2882 2.51577 14.1984C2.5966 14.1087 2.70375 14.0593 2.83418 14.0496C3.25912 14.0394 3.55549 13.94 3.72265 13.7508C3.88981 13.5616 3.97247 13.2622 3.97247 12.8537V9.46177C3.97247 8.96352 4.10474 8.58456 4.36742 8.3261C4.6301 8.06763 5.01035 7.9375 5.50694 7.9375H9.55926C9.71173 7.9375 9.83725 7.98269 9.9389 8.07185C10.0399 8.16162 10.0914 8.27669 10.0914 8.41466C10.0914 8.5448 10.0485 8.65626 9.96278 8.75145C9.87706 8.84664 9.76316 8.89423 9.62049 8.89423H5.8578C5.6441 8.89423 5.48245 8.94906 5.37162 9.05871C5.26018 9.16836 5.20446 9.33766 5.20446 9.5678V12.9754C5.20446 13.2742 5.14323 13.5454 5.02199 13.7894C4.90075 14.034 4.73848 14.2256 4.53581 14.3659C4.33313 14.5051 4.09616 14.575 3.82246 14.575V14.5147C4.09616 14.5147 4.33313 14.5846 4.53581 14.7238C4.73848 14.863 4.90075 15.0552 5.02199 15.3004C5.14323 15.5444 5.20446 15.8155 5.20446 16.1143V19.537C5.20446 19.7671 5.26018 19.9358 5.37162 20.0461C5.48306 20.1569 5.64533 20.2106 5.8578 20.2106H9.62049C9.76194 20.2106 9.87583 20.2582 9.96278 20.3527C10.0497 20.4479 10.0914 20.56 10.0914 20.6895C10.0914 20.8191 10.0412 20.9299 9.9389 21.0251C9.83725 21.1203 9.71112 21.1673 9.55926 21.1673H5.50694V21.1643V21.1637Z" fill="#F8F7F7" stroke="#F8F7F7" stroke-width="0.259057" stroke-miterlimit="10"/>
|
||||
<path d="M15.4423 21.1634C15.2898 21.1634 15.1643 21.1158 15.0626 21.0212C14.961 20.926 14.9102 20.8139 14.9102 20.6856C14.9102 20.5573 14.953 20.444 15.0387 20.3488C15.1245 20.2536 15.2384 20.2067 15.381 20.2067H19.1437C19.3574 20.2067 19.5191 20.153 19.6299 20.0422C19.7413 19.9325 19.7971 19.7632 19.7971 19.5331V16.1104C19.7971 15.8116 19.8583 15.5405 19.9795 15.2965C20.1008 15.0519 20.263 14.8603 20.4657 14.7199C20.6684 14.5807 20.9054 14.5108 21.1791 14.5108V14.5711C20.9054 14.5711 20.6684 14.5012 20.4657 14.362C20.263 14.2229 20.1008 14.0307 19.9795 13.7855C19.8583 13.5415 19.7971 13.2703 19.7971 12.9715V9.5639C19.7971 9.33496 19.7413 9.16566 19.6299 9.0548C19.5185 8.94515 19.3562 8.89033 19.1437 8.89033H15.381C15.2396 8.89033 15.1257 8.84273 15.0387 8.74754C14.953 8.65355 14.9102 8.54089 14.9102 8.41076C14.9102 8.27158 14.9604 8.15771 15.0626 8.06795C15.1637 7.97818 15.2898 7.93359 15.4423 7.93359H19.4946C19.9912 7.93359 20.3702 8.06373 20.6341 8.32219C20.898 8.58065 21.029 8.95961 21.029 9.45786V12.8498C21.029 13.2583 21.1129 13.5583 21.2789 13.7469C21.446 13.9361 21.7424 14.0361 22.1673 14.0457C22.2996 14.0554 22.4055 14.1048 22.4858 14.1945C22.5672 14.2843 22.607 14.3994 22.607 14.5385C22.607 14.6687 22.5672 14.7826 22.4858 14.8814C22.4055 14.9808 22.2978 15.0314 22.1673 15.0314C21.7424 15.041 21.4466 15.141 21.2789 15.3302C21.1117 15.5194 21.029 15.823 21.029 16.2424V19.6343C21.029 19.9639 20.9709 20.2422 20.8539 20.4723C20.737 20.7025 20.5655 20.8736 20.3377 20.9887C20.1093 21.1025 19.8283 21.1598 19.4946 21.1598H15.4423V21.1628V21.1634Z" fill="#F8F7F7" stroke="#F8F7F7" stroke-width="0.259057" stroke-miterlimit="10"/>
|
||||
<path d="M16.4845 15.8401C17.2224 15.8401 17.8206 15.2515 17.8206 14.5255C17.8206 13.7996 17.2224 13.2109 16.4845 13.2109C15.7467 13.2109 15.1484 13.7996 15.1484 14.5255C15.1484 15.2515 15.7467 15.8401 16.4845 15.8401Z" fill="#F8F7F7" stroke="#F8F7F7" stroke-width="0.259057" stroke-miterlimit="10"/>
|
||||
<path d="M9.00014 15.8401C9.73798 15.8401 10.3362 15.2515 10.3362 14.5255C10.3362 13.7996 9.73798 13.2109 9.00014 13.2109C8.2623 13.2109 7.66406 13.7996 7.66406 14.5255C7.66406 15.2515 8.2623 15.8401 9.00014 15.8401Z" fill="#F8F7F7" stroke="#F8F7F7" stroke-width="0.259057" stroke-miterlimit="10"/>
|
||||
<path d="M12.0442 4.13327L11.942 6.81971C11.942 6.97033 11.7974 7.04564 11.5084 7.04564C11.2194 7.04564 11.0749 6.97033 11.0749 6.81971C11.0492 6.15036 11.0284 5.63103 11.0112 5.26291C11.0027 4.88637 10.9941 4.61826 10.9855 4.45921C10.9769 4.30016 10.9727 4.20376 10.9727 4.17062V4.12062C10.9727 3.92843 11.1515 3.83203 11.5084 3.83203C11.8654 3.83203 12.0442 3.93264 12.0442 4.13327ZM14.213 4.13327L14.1108 6.81971C14.1108 6.97033 13.9663 7.04564 13.6773 7.04564C13.3883 7.04564 13.2437 6.97033 13.2437 6.81971C13.218 6.15036 13.1972 5.63103 13.1801 5.26291C13.1715 4.88637 13.1629 4.61826 13.1543 4.45921C13.1458 4.30016 13.1415 4.20376 13.1415 4.17062V4.12062C13.1415 3.92843 13.3203 3.83203 13.6773 3.83203C14.0342 3.83203 14.213 3.93264 14.213 4.13327Z" fill="#F8F7F7" stroke="#F8F7F7" stroke-width="0.259057" stroke-miterlimit="10"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.8 KiB |
@@ -0,0 +1,161 @@
|
||||
---
|
||||
display_name: Auggie CLI
|
||||
icon: ../../../../.icons/auggie.svg
|
||||
description: Run Auggie CLI in your workspace for AI-powered coding assistance with AgentAPI integration
|
||||
verified: true
|
||||
tags: [agent, auggie, ai, tasks, augment]
|
||||
---
|
||||
|
||||
# Auggie CLI
|
||||
|
||||
Run Auggie CLI in your workspace to access Augment's AI coding assistant with advanced context understanding and codebase integration. This module integrates with [AgentAPI](https://github.com/coder/agentapi).
|
||||
|
||||
```tf
|
||||
module "auggie" {
|
||||
source = "registry.coder.com/coder-labs/auggie/coder"
|
||||
version = "0.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder/project"
|
||||
}
|
||||
```
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **Node.js and npm must be sourced/available before the auggie module installs** - ensure they are installed in your workspace image or via earlier provisioning steps
|
||||
- You must add the [Coder Login](https://registry.coder.com/modules/coder/coder-login) module to your template
|
||||
- **Augment session token for authentication (required for tasks). [Instructions](https://docs.augmentcode.com/cli/setup-auggie/authentication) to get the session token**
|
||||
|
||||
## Examples
|
||||
|
||||
### Usage with Tasks and Configuration
|
||||
|
||||
```tf
|
||||
data "coder_parameter" "ai_prompt" {
|
||||
type = "string"
|
||||
name = "AI Prompt"
|
||||
default = ""
|
||||
description = "Initial task prompt for Auggie CLI"
|
||||
mutable = true
|
||||
}
|
||||
|
||||
module "coder-login" {
|
||||
count = data.coder_workspace.me.start_count
|
||||
source = "registry.coder.com/coder/coder-login/coder"
|
||||
version = "1.0.31"
|
||||
agent_id = coder_agent.example.id
|
||||
}
|
||||
|
||||
module "auggie" {
|
||||
source = "registry.coder.com/coder-labs/auggie/coder"
|
||||
version = "0.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder/project"
|
||||
|
||||
# Authentication
|
||||
augment_session_token = <<-EOF
|
||||
{"accessToken":"xxxx-yyyy-zzzz-jjjj","tenantURL":"https://d1.api.augmentcode.com/","scopes":["read","write"]}
|
||||
EOF # Required for tasks
|
||||
|
||||
# Version
|
||||
auggie_version = "0.3.0"
|
||||
|
||||
# Task configuration
|
||||
ai_prompt = data.coder_parameter.ai_prompt.value
|
||||
continue_previous_conversation = true
|
||||
interaction_mode = "quiet"
|
||||
auggie_model = "gpt5"
|
||||
report_tasks = true
|
||||
|
||||
# MCP configuration for additional integrations
|
||||
mcp = <<-EOF
|
||||
{
|
||||
"mcpServers": {
|
||||
"filesystem": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/coder/project"]
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Workspace guidelines
|
||||
rules = <<-EOT
|
||||
# Project Guidelines
|
||||
|
||||
## Code Style
|
||||
- Use TypeScript for all new JavaScript files
|
||||
- Follow consistent naming conventions
|
||||
- Add comprehensive comments for complex logic
|
||||
|
||||
## Testing
|
||||
- Write unit tests for all new functions
|
||||
- Ensure test coverage above 80%
|
||||
|
||||
## Documentation
|
||||
- Update README.md for any new features
|
||||
- Document API changes in CHANGELOG.md
|
||||
EOT
|
||||
}
|
||||
```
|
||||
|
||||
### Using Multiple MCP Configuration Files
|
||||
|
||||
```tf
|
||||
module "auggie" {
|
||||
source = "registry.coder.com/coder-labs/auggie/coder"
|
||||
version = "0.1.0"
|
||||
agent_id = coder_agent.example.id
|
||||
folder = "/home/coder/project"
|
||||
|
||||
# Multiple MCP configuration files
|
||||
mcp_files = [
|
||||
"/path/to/filesystem-mcp.json",
|
||||
"/path/to/database-mcp.json",
|
||||
"/path/to/api-mcp.json"
|
||||
]
|
||||
|
||||
mcp = <<-EOF
|
||||
{
|
||||
"mcpServers": {
|
||||
"Test MCP": {
|
||||
"command": "uv",
|
||||
"args": [
|
||||
"--directory",
|
||||
"/home/coder/test-mcp",
|
||||
"run",
|
||||
"server.py"
|
||||
],
|
||||
"timeout": 600
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
```
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
If you have any issues, please take a look at the log files below.
|
||||
|
||||
```bash
|
||||
# Installation logs
|
||||
cat ~/.auggie-module/install.log
|
||||
|
||||
# Startup logs
|
||||
cat ~/.auggie-module/agentapi-start.log
|
||||
|
||||
# Pre/post install script logs
|
||||
cat ~/.auggie-module/pre_install.log
|
||||
cat ~/.auggie-module/post_install.log
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> To use tasks with Auggie CLI, create a `coder_parameter` named `"AI Prompt"` and pass its value to the auggie module's `ai_prompt` variable. The `folder` variable is required for the module to function correctly.
|
||||
|
||||
## References
|
||||
|
||||
- [Auggie CLI Reference](https://docs.augmentcode.com/cli/reference)
|
||||
- [Auggie CLI MCP Integration](https://docs.augmentcode.com/cli/integrations#mcp-integrations)
|
||||
- [Augment Code Documentation](https://docs.augmentcode.com/)
|
||||
- [AgentAPI Documentation](https://github.com/coder/agentapi)
|
||||
- [Coder AI Agents Guide](https://coder.com/docs/tutorials/ai-agents)
|
||||
@@ -0,0 +1,186 @@
|
||||
run "test_auggie_basic" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-123"
|
||||
folder = "/home/coder/projects"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = coder_env.auggie_session_auth.name == "AUGMENT_SESSION_AUTH"
|
||||
error_message = "Auggie session auth environment variable should be set correctly"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.folder == "/home/coder/projects"
|
||||
error_message = "Folder variable should be set correctly"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.agent_id == "test-agent-123"
|
||||
error_message = "Agent ID variable should be set correctly"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.install_auggie == true
|
||||
error_message = "Install auggie should default to true"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.install_agentapi == true
|
||||
error_message = "Install agentapi should default to true"
|
||||
}
|
||||
}
|
||||
|
||||
run "test_auggie_with_session_token" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-456"
|
||||
folder = "/home/coder/workspace"
|
||||
augment_session_token = "test-session-token-123"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = coder_env.auggie_session_auth.value == "test-session-token-123"
|
||||
error_message = "Auggie session token value should match the input"
|
||||
}
|
||||
}
|
||||
|
||||
run "test_auggie_with_custom_options" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-789"
|
||||
folder = "/home/coder/custom"
|
||||
order = 5
|
||||
group = "development"
|
||||
icon = "/icon/custom.svg"
|
||||
auggie_model = "gpt-4"
|
||||
ai_prompt = "Help me write better code"
|
||||
interaction_mode = "compact"
|
||||
continue_previous_conversation = true
|
||||
install_auggie = false
|
||||
install_agentapi = false
|
||||
auggie_version = "1.0.0"
|
||||
agentapi_version = "v0.6.0"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.order == 5
|
||||
error_message = "Order variable should be set to 5"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.group == "development"
|
||||
error_message = "Group variable should be set to 'development'"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.icon == "/icon/custom.svg"
|
||||
error_message = "Icon variable should be set to custom icon"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.auggie_model == "gpt-4"
|
||||
error_message = "Auggie model variable should be set to 'gpt-4'"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.ai_prompt == "Help me write better code"
|
||||
error_message = "AI prompt variable should be set correctly"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.interaction_mode == "compact"
|
||||
error_message = "Interaction mode should be set to 'compact'"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.continue_previous_conversation == true
|
||||
error_message = "Continue previous conversation should be set to true"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.auggie_version == "1.0.0"
|
||||
error_message = "Auggie version should be set to '1.0.0'"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.agentapi_version == "v0.6.0"
|
||||
error_message = "AgentAPI version should be set to 'v0.6.0'"
|
||||
}
|
||||
}
|
||||
|
||||
run "test_auggie_with_mcp_and_rules" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-mcp"
|
||||
folder = "/home/coder/mcp-test"
|
||||
mcp = jsonencode({
|
||||
mcpServers = {
|
||||
test = {
|
||||
command = "test-server"
|
||||
args = ["--config", "test.json"]
|
||||
}
|
||||
}
|
||||
})
|
||||
mcp_files = [
|
||||
"/path/to/mcp1.json",
|
||||
"/path/to/mcp2.json"
|
||||
]
|
||||
rules = "# General coding rules\n- Write clean code\n- Add comments"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.mcp != ""
|
||||
error_message = "MCP configuration should be provided"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = length(var.mcp_files) == 2
|
||||
error_message = "Should have 2 MCP files"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.rules != ""
|
||||
error_message = "Rules should be provided"
|
||||
}
|
||||
}
|
||||
|
||||
run "test_auggie_with_scripts" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-scripts"
|
||||
folder = "/home/coder/scripts"
|
||||
pre_install_script = "echo 'Pre-install script'"
|
||||
post_install_script = "echo 'Post-install script'"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.pre_install_script == "echo 'Pre-install script'"
|
||||
error_message = "Pre-install script should be set correctly"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = var.post_install_script == "echo 'Post-install script'"
|
||||
error_message = "Post-install script should be set correctly"
|
||||
}
|
||||
}
|
||||
|
||||
run "test_auggie_interaction_mode_validation" {
|
||||
command = plan
|
||||
|
||||
variables {
|
||||
agent_id = "test-agent-validation"
|
||||
folder = "/home/coder/test"
|
||||
interaction_mode = "print"
|
||||
}
|
||||
|
||||
assert {
|
||||
condition = contains(["interactive", "print", "quiet", "compact"], var.interaction_mode)
|
||||
error_message = "Interaction mode should be one of the valid options"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,342 @@
|
||||
import {
|
||||
test,
|
||||
afterEach,
|
||||
describe,
|
||||
setDefaultTimeout,
|
||||
beforeAll,
|
||||
expect,
|
||||
} from "bun:test";
|
||||
import { execContainer, readFileContainer, runTerraformInit } from "~test";
|
||||
import {
|
||||
loadTestFile,
|
||||
writeExecutable,
|
||||
setup as setupUtil,
|
||||
execModuleScript,
|
||||
expectAgentAPIStarted,
|
||||
} from "../../../coder/modules/agentapi/test-util";
|
||||
import dedent from "dedent";
|
||||
|
||||
let cleanupFunctions: (() => Promise<void>)[] = [];
|
||||
const registerCleanup = (cleanup: () => Promise<void>) => {
|
||||
cleanupFunctions.push(cleanup);
|
||||
};
|
||||
afterEach(async () => {
|
||||
const cleanupFnsCopy = cleanupFunctions.slice().reverse();
|
||||
cleanupFunctions = [];
|
||||
for (const cleanup of cleanupFnsCopy) {
|
||||
try {
|
||||
await cleanup();
|
||||
} catch (error) {
|
||||
console.error("Error during cleanup:", error);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
interface SetupProps {
|
||||
skipAgentAPIMock?: boolean;
|
||||
skipAuggieMock?: boolean;
|
||||
moduleVariables?: Record<string, string>;
|
||||
agentapiMockScript?: string;
|
||||
}
|
||||
|
||||
const setup = async (props?: SetupProps): Promise<{ id: string }> => {
|
||||
const projectDir = "/home/coder/project";
|
||||
const { id } = await setupUtil({
|
||||
moduleDir: import.meta.dir,
|
||||
moduleVariables: {
|
||||
install_auggie: props?.skipAuggieMock ? "true" : "false",
|
||||
install_agentapi: props?.skipAgentAPIMock ? "true" : "false",
|
||||
folder: projectDir,
|
||||
...props?.moduleVariables,
|
||||
},
|
||||
registerCleanup,
|
||||
projectDir,
|
||||
skipAgentAPIMock: props?.skipAgentAPIMock,
|
||||
agentapiMockScript: props?.agentapiMockScript,
|
||||
});
|
||||
if (!props?.skipAuggieMock) {
|
||||
await writeExecutable({
|
||||
containerId: id,
|
||||
filePath: "/usr/bin/auggie",
|
||||
content: await loadTestFile(import.meta.dir, "auggie-mock.sh"),
|
||||
});
|
||||
}
|
||||
return { id };
|
||||
};
|
||||
|
||||
setDefaultTimeout(60 * 1000);
|
||||
|
||||
describe("auggie", async () => {
|
||||
beforeAll(async () => {
|
||||
await runTerraformInit(import.meta.dir);
|
||||
});
|
||||
|
||||
test("happy-path", async () => {
|
||||
const { id } = await setup();
|
||||
await execModuleScript(id);
|
||||
await expectAgentAPIStarted(id);
|
||||
});
|
||||
|
||||
test("install-auggie-version", async () => {
|
||||
const version_to_install = "0.3.0";
|
||||
const { id } = await setup({
|
||||
skipAuggieMock: true,
|
||||
moduleVariables: {
|
||||
install_auggie: "true",
|
||||
auggie_version: version_to_install,
|
||||
pre_install_script: dedent`
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Install Node.js and npm via system package manager
|
||||
if ! command -v node >/dev/null 2>&1; then
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nodejs npm
|
||||
fi
|
||||
|
||||
# Configure npm to use user directory (avoids permission issues)
|
||||
mkdir -p "$HOME/.npm-global"
|
||||
npm config set prefix "$HOME/.npm-global"
|
||||
|
||||
# Persist npm user directory configuration
|
||||
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
|
||||
echo "prefix=$HOME/.npm-global" > ~/.npmrc
|
||||
`,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
const resp = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
`cat /home/coder/.auggie-module/install.log`,
|
||||
]);
|
||||
expect(resp.stdout).toContain(version_to_install);
|
||||
});
|
||||
|
||||
test("check-latest-auggie-version-works", async () => {
|
||||
const { id } = await setup({
|
||||
skipAuggieMock: true,
|
||||
skipAgentAPIMock: true,
|
||||
moduleVariables: {
|
||||
install_auggie: "true",
|
||||
pre_install_script: dedent`
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Install Node.js and npm via system package manager
|
||||
if ! command -v node >/dev/null 2>&1; then
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y nodejs npm
|
||||
fi
|
||||
|
||||
# Configure npm to use user directory (avoids permission issues)
|
||||
mkdir -p "$HOME/.npm-global"
|
||||
npm config set prefix "$HOME/.npm-global"
|
||||
|
||||
# Persist npm user directory configuration
|
||||
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
|
||||
echo "prefix=$HOME/.npm-global" > ~/.npmrc
|
||||
`,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
await expectAgentAPIStarted(id);
|
||||
});
|
||||
|
||||
test("auggie-session-token", async () => {
|
||||
const sessionToken = "test-session-token-123";
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
augment_session_token: sessionToken,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const envCheck = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
`env | grep AUGMENT_SESSION_AUTH || echo "AUGMENT_SESSION_AUTH not found"`,
|
||||
]);
|
||||
expect(envCheck.stdout).toContain("AUGMENT_SESSION_AUTH");
|
||||
});
|
||||
|
||||
test("auggie-mcp-config", async () => {
|
||||
const mcpConfig = JSON.stringify({
|
||||
mcpServers: {
|
||||
test: {
|
||||
command: "test-cmd",
|
||||
type: "stdio"
|
||||
}
|
||||
}
|
||||
});
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
mcp: mcpConfig,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const resp = await readFileContainer(
|
||||
id,
|
||||
"/home/coder/.auggie-module/agentapi-start.log",
|
||||
);
|
||||
expect(resp).toContain("--mcp-config");
|
||||
});
|
||||
|
||||
test("auggie-rules", async () => {
|
||||
const rules = "Always use TypeScript for new files";
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
install_auggie: "false", // Don't need to install auggie to test rules file creation
|
||||
rules: rules,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const rulesFile = await readFileContainer(id, "/home/coder/.augment/rules.md");
|
||||
expect(rulesFile).toContain(rules);
|
||||
});
|
||||
|
||||
test("auggie-ai-task-prompt", async () => {
|
||||
const prompt = "This is a task prompt for Auggie.";
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
ai_prompt: prompt,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const resp = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
`cat /home/coder/.auggie-module/agentapi-start.log`,
|
||||
]);
|
||||
expect(resp.stdout).toContain(prompt);
|
||||
});
|
||||
|
||||
test("auggie-interaction-mode", async () => {
|
||||
const mode = "compact";
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
interaction_mode: mode,
|
||||
ai_prompt: "test prompt",
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const startLog = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
"cat /home/coder/.auggie-module/agentapi-start.log",
|
||||
]);
|
||||
expect(startLog.stdout).toContain(`--${mode}`);
|
||||
});
|
||||
|
||||
test("auggie-model", async () => {
|
||||
const model = "gpt-4";
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
auggie_model: model,
|
||||
ai_prompt: "test prompt",
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const startLog = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
"cat /home/coder/.auggie-module/agentapi-start.log",
|
||||
]);
|
||||
expect(startLog.stdout).toContain(`--model ${model}`);
|
||||
});
|
||||
|
||||
test("auggie-continue-previous-conversation", async () => {
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
continue_previous_conversation: "true",
|
||||
ai_prompt: "test prompt",
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const startLog = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
"cat /home/coder/.auggie-module/agentapi-start.log",
|
||||
]);
|
||||
expect(startLog.stdout).toContain("--continue");
|
||||
});
|
||||
|
||||
test("pre-post-install-scripts", async () => {
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
pre_install_script: "#!/bin/bash\necho 'auggie-pre-install-script'",
|
||||
post_install_script: "#!/bin/bash\necho 'auggie-post-install-script'",
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const preInstallLog = await readFileContainer(
|
||||
id,
|
||||
"/home/coder/.auggie-module/pre_install.log",
|
||||
);
|
||||
expect(preInstallLog).toContain("auggie-pre-install-script");
|
||||
|
||||
const postInstallLog = await readFileContainer(
|
||||
id,
|
||||
"/home/coder/.auggie-module/post_install.log",
|
||||
);
|
||||
expect(postInstallLog).toContain("auggie-post-install-script");
|
||||
});
|
||||
|
||||
test("folder-variable", async () => {
|
||||
const folder = "/home/coder/auggie-test-folder";
|
||||
const { id } = await setup({
|
||||
skipAuggieMock: false,
|
||||
moduleVariables: {
|
||||
folder,
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const resp = await readFileContainer(
|
||||
id,
|
||||
"/home/coder/.auggie-module/agentapi-start.log",
|
||||
);
|
||||
expect(resp).toContain(folder);
|
||||
});
|
||||
|
||||
test("coder-mcp-config-created", async () => {
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
install_auggie: "false", // Don't need to install auggie to test MCP config creation
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const mcpConfig = await readFileContainer(id, "/home/coder/.augment/coder_mcp.json");
|
||||
expect(mcpConfig).toContain("mcpServers");
|
||||
expect(mcpConfig).toContain("coder");
|
||||
expect(mcpConfig).toContain("CODER_MCP_APP_STATUS_SLUG");
|
||||
expect(mcpConfig).toContain("CODER_MCP_AI_AGENTAPI_URL");
|
||||
});
|
||||
|
||||
test("mcp-files-array", async () => {
|
||||
const mcpFiles = ["/path/to/mcp1.json", "/path/to/mcp2.json"];
|
||||
const { id } = await setup({
|
||||
moduleVariables: {
|
||||
mcp_files: JSON.stringify(mcpFiles),
|
||||
ai_prompt: "test prompt",
|
||||
},
|
||||
});
|
||||
await execModuleScript(id);
|
||||
|
||||
const startLog = await execContainer(id, [
|
||||
"bash",
|
||||
"-c",
|
||||
"cat /home/coder/.auggie-module/agentapi-start.log",
|
||||
]);
|
||||
expect(startLog.stdout).toContain("mcp1.json");
|
||||
expect(startLog.stdout).toContain("mcp2.json");
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,230 @@
|
||||
terraform {
|
||||
required_version = ">= 1.0"
|
||||
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
version = ">= 2.7"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "agent_id" {
|
||||
type = string
|
||||
description = "The ID of a Coder agent."
|
||||
}
|
||||
|
||||
data "coder_workspace" "me" {}
|
||||
|
||||
data "coder_workspace_owner" "me" {}
|
||||
|
||||
variable "order" {
|
||||
type = number
|
||||
description = "The order determines the position of app in the UI presentation. The lowest order is shown first and apps with equal order are sorted by name (ascending order)."
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "group" {
|
||||
type = string
|
||||
description = "The name of a group that this app belongs to."
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "icon" {
|
||||
type = string
|
||||
description = "The icon to use for the app."
|
||||
default = "/icon/auggie.svg"
|
||||
}
|
||||
|
||||
variable "folder" {
|
||||
type = string
|
||||
description = "The folder to run Auggie in."
|
||||
}
|
||||
|
||||
variable "install_auggie" {
|
||||
type = bool
|
||||
description = "Whether to install Auggie CLI."
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "auggie_version" {
|
||||
type = string
|
||||
description = "The version of Auggie to install."
|
||||
default = "" # empty string means the latest available version
|
||||
validation {
|
||||
condition = var.auggie_version == "" || can(regex("^v?[0-9]+\\.[0-9]+\\.[0-9]+", var.auggie_version))
|
||||
error_message = "auggie_version must be empty (for latest) or a valid semantic version like 'v1.2.3' or '1.2.3'."
|
||||
}
|
||||
}
|
||||
|
||||
variable "install_agentapi" {
|
||||
type = bool
|
||||
description = "Whether to install AgentAPI."
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "agentapi_version" {
|
||||
type = string
|
||||
description = "The version of AgentAPI to install."
|
||||
default = "v0.6.0"
|
||||
validation {
|
||||
condition = can(regex("^v[0-9]+\\.[0-9]+\\.[0-9]+", var.agentapi_version))
|
||||
error_message = "agentapi_version must be a valid semantic version starting with 'v', like 'v0.3.3'."
|
||||
}
|
||||
}
|
||||
|
||||
variable "pre_install_script" {
|
||||
type = string
|
||||
description = "Custom script to run before installing Auggie."
|
||||
default = null
|
||||
}
|
||||
|
||||
variable "post_install_script" {
|
||||
type = string
|
||||
description = "Custom script to run after installing Auggie."
|
||||
default = null
|
||||
}
|
||||
|
||||
# ----------------------------------------------
|
||||
|
||||
variable "ai_prompt" {
|
||||
type = string
|
||||
description = "Task prompt for the Auggie CLI"
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "mcp" {
|
||||
type = string
|
||||
description = "MCP configuration as a JSON string for the auggie cli, check https://docs.augmentcode.com/cli/integrations#mcp-integrations"
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "mcp_files" {
|
||||
type = list(string)
|
||||
description = "MCP configuration from a JSON file for the auggie cli, check https://docs.augmentcode.com/cli/integrations#mcp-integrations"
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "rules" {
|
||||
type = string
|
||||
description = "Additional rules to append to workspace guidelines (markdown format)"
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "continue_previous_conversation" {
|
||||
type = bool
|
||||
description = "Whether to resume the previous conversation."
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "interaction_mode" {
|
||||
type = string
|
||||
description = "Interaction mode with the Auggie CLI. Options: interactive, print, quiet, compact. https://docs.augmentcode.com/cli/reference#cli-flags"
|
||||
default = "interactive"
|
||||
validation {
|
||||
condition = contains(["interactive", "print", "quiet", "compact"], var.interaction_mode)
|
||||
error_message = "interaction_mode must be one of: interactive, print, quiet, compact."
|
||||
}
|
||||
}
|
||||
|
||||
variable "augment_session_token" {
|
||||
type = string
|
||||
description = "Auggie session token for authentication. https://docs.augmentcode.com/cli/setup-auggie/authentication"
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "auggie_model" {
|
||||
type = string
|
||||
description = "The model to use for Auggie, find available models using auggie --list-models"
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "report_tasks" {
|
||||
type = bool
|
||||
description = "Whether to enable task reporting to Coder UI via AgentAPI"
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "cli_app" {
|
||||
type = bool
|
||||
description = "Whether to create a CLI app for Auggie"
|
||||
default = false
|
||||
}
|
||||
|
||||
variable "web_app_display_name" {
|
||||
type = string
|
||||
description = "Display name for the web app"
|
||||
default = "Auggie"
|
||||
}
|
||||
|
||||
variable "cli_app_display_name" {
|
||||
type = string
|
||||
description = "Display name for the CLI app"
|
||||
default = "Auggie CLI"
|
||||
}
|
||||
|
||||
resource "coder_env" "auggie_session_auth" {
|
||||
agent_id = var.agent_id
|
||||
name = "AUGMENT_SESSION_AUTH"
|
||||
value = var.augment_session_token
|
||||
}
|
||||
|
||||
locals {
|
||||
app_slug = "auggie"
|
||||
install_script = file("${path.module}/scripts/install.sh")
|
||||
start_script = file("${path.module}/scripts/start.sh")
|
||||
module_dir_name = ".auggie-module"
|
||||
}
|
||||
|
||||
module "agentapi" {
|
||||
source = "registry.coder.com/coder/agentapi/coder"
|
||||
version = "1.1.1"
|
||||
|
||||
agent_id = var.agent_id
|
||||
web_app_slug = local.app_slug
|
||||
web_app_order = var.order
|
||||
web_app_group = var.group
|
||||
web_app_icon = var.icon
|
||||
web_app_display_name = var.web_app_display_name
|
||||
cli_app = var.cli_app
|
||||
cli_app_slug = var.cli_app ? "${local.app_slug}-cli" : null
|
||||
cli_app_display_name = var.cli_app ? var.cli_app_display_name : null
|
||||
module_dir_name = local.module_dir_name
|
||||
install_agentapi = var.install_agentapi
|
||||
agentapi_version = var.agentapi_version
|
||||
pre_install_script = var.pre_install_script
|
||||
post_install_script = var.post_install_script
|
||||
start_script = <<-EOT
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
|
||||
echo -n '${base64encode(local.start_script)}' | base64 -d > /tmp/start.sh
|
||||
chmod +x /tmp/start.sh
|
||||
ARG_AUGGIE_START_DIRECTORY='${var.folder}' \
|
||||
ARG_TASK_PROMPT='${base64encode(var.ai_prompt)}' \
|
||||
ARG_MCP_FILES='${jsonencode(var.mcp_files)}' \
|
||||
ARG_AUGGIE_RULES='${base64encode(var.rules)}' \
|
||||
ARG_AUGGIE_CONTINUE_PREVIOUS_CONVERSATION='${var.continue_previous_conversation}' \
|
||||
ARG_AUGGIE_INTERACTION_MODE='${var.interaction_mode}' \
|
||||
ARG_AUGMENT_SESSION_AUTH='${var.augment_session_token}' \
|
||||
ARG_AUGGIE_MODEL='${var.auggie_model}' \
|
||||
ARG_REPORT_TASKS='${var.report_tasks}' \
|
||||
/tmp/start.sh
|
||||
EOT
|
||||
|
||||
install_script = <<-EOT
|
||||
#!/bin/bash
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
|
||||
echo -n '${base64encode(local.install_script)}' | base64 -d > /tmp/install.sh
|
||||
chmod +x /tmp/install.sh
|
||||
ARG_AUGGIE_INSTALL='${var.install_auggie}' \
|
||||
ARG_AUGGIE_VERSION='${var.auggie_version}' \
|
||||
ARG_MCP_APP_STATUS_SLUG='${local.app_slug}' \
|
||||
ARG_AUGGIE_RULES='${base64encode(var.rules)}' \
|
||||
ARG_MCP_CONFIG='${var.mcp != null ? base64encode(replace(var.mcp, "'", "'\\''")) : ""}' \
|
||||
/tmp/install.sh
|
||||
EOT
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
source "$HOME"/.bashrc
|
||||
|
||||
BOLD='\033[0;1m'
|
||||
|
||||
# Function to check if a command exists
|
||||
command_exists() {
|
||||
command -v "$1" > /dev/null 2>&1
|
||||
}
|
||||
|
||||
ARG_AUGGIE_INSTALL=${ARG_AUGGIE_INSTALL:-true}
|
||||
ARG_AUGGIE_VERSION=${ARG_AUGGIE_VERSION:-}
|
||||
ARG_MCP_APP_STATUS_SLUG=${ARG_MCP_APP_STATUS_SLUG:-}
|
||||
ARG_AUGGIE_RULES=$(echo -n "${ARG_AUGGIE_RULES:-}" | base64 -d)
|
||||
ARG_MCP_CONFIG=${ARG_MCP_CONFIG:-}
|
||||
|
||||
echo "--------------------------------"
|
||||
|
||||
printf "install auggie: %s\n" "$ARG_AUGGIE_INSTALL"
|
||||
printf "auggie_version: %s\n" "$ARG_AUGGIE_VERSION"
|
||||
printf "app_slug: %s\n" "$ARG_MCP_APP_STATUS_SLUG"
|
||||
printf "rules: %s\n" "$ARG_AUGGIE_RULES"
|
||||
|
||||
echo "--------------------------------"
|
||||
|
||||
|
||||
function check_dependencies() {
|
||||
if ! command_exists node; then
|
||||
printf "Error: Node.js is not installed. Please install Node.js manually or use the pre_install_script to install it.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command_exists npm; then
|
||||
printf "Error: npm is not installed. Please install npm manually or use the pre_install_script to install it.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "Node.js version: %s\n" "$(node --version)"
|
||||
printf "npm version: %s\n" "$(npm --version)"
|
||||
}
|
||||
|
||||
function install_auggie() {
|
||||
if [ "${ARG_AUGGIE_INSTALL}" = "true" ]; then
|
||||
check_dependencies
|
||||
|
||||
printf "%s Installing Auggie CLI\n" "${BOLD}"
|
||||
|
||||
NPM_GLOBAL_PREFIX="${HOME}/.npm-global"
|
||||
if [ ! -d "$NPM_GLOBAL_PREFIX" ]; then
|
||||
mkdir -p "$NPM_GLOBAL_PREFIX"
|
||||
fi
|
||||
|
||||
npm config set prefix "$NPM_GLOBAL_PREFIX"
|
||||
|
||||
export PATH="$NPM_GLOBAL_PREFIX/bin:$PATH"
|
||||
|
||||
if [ -n "$ARG_AUGGIE_VERSION" ]; then
|
||||
npm install -g "@augmentcode/auggie@$ARG_AUGGIE_VERSION"
|
||||
else
|
||||
npm install -g "@augmentcode/auggie"
|
||||
fi
|
||||
|
||||
if ! grep -q "export PATH=\"\$HOME/.npm-global/bin:\$PATH\"" "$HOME/.bashrc"; then
|
||||
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> "$HOME/.bashrc"
|
||||
fi
|
||||
|
||||
printf "%s Successfully installed Auggie CLI. Version: %s\n" "${BOLD}" "$(auggie --version)"
|
||||
else
|
||||
printf "Skipping Auggie CLI installation (install_auggie=false)\n"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
function create_coder_mcp() {
|
||||
AUGGIE_CODER_MCP_FILE="$HOME/.augment/coder_mcp.json"
|
||||
CODER_MCP=$(
|
||||
cat << EOF
|
||||
{
|
||||
"mcpServers":{
|
||||
"coder": {
|
||||
"args": ["exp", "mcp", "server"],
|
||||
"command": "coder",
|
||||
"env": {
|
||||
"CODER_MCP_APP_STATUS_SLUG": "${ARG_MCP_APP_STATUS_SLUG}",
|
||||
"CODER_MCP_AI_AGENTAPI_URL": "http://localhost:3284",
|
||||
"CODER_AGENT_URL": "${CODER_AGENT_URL:-}",
|
||||
"CODER_AGENT_TOKEN": "${CODER_AGENT_TOKEN:-}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
)
|
||||
mkdir -p "$(dirname "$AUGGIE_CODER_MCP_FILE")"
|
||||
echo "$CODER_MCP" > "$AUGGIE_CODER_MCP_FILE"
|
||||
printf "Coder MCP config created at: %s\n" "$AUGGIE_CODER_MCP_FILE"
|
||||
}
|
||||
|
||||
function create_user_mcp() {
|
||||
if [ -n "$ARG_MCP_CONFIG" ]; then
|
||||
USER_MCP_CONFIG_FILE="$HOME/.augment/user_mcp.json"
|
||||
USER_MCP_CONTENT=$(echo -n "$ARG_MCP_CONFIG" | base64 -d)
|
||||
mkdir -p "$(dirname "$USER_MCP_CONFIG_FILE")"
|
||||
echo "$USER_MCP_CONTENT" > "$USER_MCP_CONFIG_FILE"
|
||||
printf "User MCP config created at: %s\n" "$USER_MCP_CONFIG_FILE"
|
||||
else
|
||||
printf "No user MCP config provided, skipping user MCP config creation.\n"
|
||||
fi
|
||||
}
|
||||
|
||||
function create_rules_file() {
|
||||
AUGGIE_RULES_FILE="$HOME/.augment/rules.md"
|
||||
if [ -n "$ARG_AUGGIE_RULES" ]; then
|
||||
mkdir -p "$(dirname "$AUGGIE_RULES_FILE")"
|
||||
echo -n "$ARG_AUGGIE_RULES" > "$AUGGIE_RULES_FILE"
|
||||
printf "Rules file created at: %s\n" "$AUGGIE_RULES_FILE"
|
||||
else
|
||||
printf "No rules provided, skipping rules file creation.\n"
|
||||
fi
|
||||
}
|
||||
|
||||
install_auggie
|
||||
create_coder_mcp
|
||||
create_user_mcp
|
||||
create_rules_file
|
||||
@@ -0,0 +1,104 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
source "$HOME"/.bashrc
|
||||
|
||||
command_exists() {
|
||||
command -v "$1" > /dev/null 2>&1
|
||||
}
|
||||
|
||||
if [ -f "$HOME/.nvm/nvm.sh" ]; then
|
||||
source "$HOME"/.nvm/nvm.sh
|
||||
else
|
||||
export PATH="$HOME/.npm-global/bin:$PATH"
|
||||
fi
|
||||
|
||||
ARG_AUGGIE_START_DIRECTORY=${ARG_AUGGIE_START_DIRECTORY:-"$HOME"}
|
||||
ARG_TASK_PROMPT=$(echo -n "${ARG_TASK_PROMPT:-}" | base64 -d)
|
||||
ARG_MCP_FILES=${ARG_MCP_FILES:-[]}
|
||||
ARG_AUGGIE_RULES=${ARG_AUGGIE_RULES:-}
|
||||
ARG_AUGMENT_SESSION_AUTH=${ARG_AUGMENT_SESSION_AUTH:-}
|
||||
ARG_AUGGIE_CONTINUE_PREVIOUS_CONVERSATION=${ARG_AUGGIE_CONTINUE_PREVIOUS_CONVERSATION:-false}
|
||||
ARG_AUGGIE_INTERACTION_MODE=${ARG_AUGGIE_INTERACTION_MODE:-"interactive"}
|
||||
ARG_AUGGIE_MODEL=${ARG_AUGGIE_MODEL:-}
|
||||
ARG_REPORT_TASKS=${ARG_REPORT_TASKS:-false}
|
||||
|
||||
ARGS=()
|
||||
|
||||
echo "--------------------------------"
|
||||
|
||||
printf "auggie_start_directory: %s\n" "$ARG_AUGGIE_START_DIRECTORY"
|
||||
printf "task_prompt: %s\n" "$ARG_TASK_PROMPT"
|
||||
printf "mcp_files: %s\n" "$ARG_MCP_FILES"
|
||||
printf "auggie_rules: %s\n" "$ARG_AUGGIE_RULES"
|
||||
printf "continue_previous_conversation: %s\n" "$ARG_AUGGIE_CONTINUE_PREVIOUS_CONVERSATION"
|
||||
printf "auggie_interaction_mode: %s\n" "$ARG_AUGGIE_INTERACTION_MODE"
|
||||
printf "augment_session_auth: %s\n" "$ARG_AUGMENT_SESSION_AUTH"
|
||||
printf "auggie_model: %s\n" "$ARG_AUGGIE_MODEL"
|
||||
printf "report_tasks: %s\n" "$ARG_REPORT_TASKS"
|
||||
|
||||
echo "--------------------------------"
|
||||
|
||||
|
||||
function validate_auggie_installation() {
|
||||
if command_exists auggie; then
|
||||
printf "Auggie is installed\n"
|
||||
else
|
||||
printf "Error: Auggie is not installed. Please enable install_auggie or install it manually\n"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function build_auggie_args() {
|
||||
if [ -n "$ARG_AUGGIE_INTERACTION_MODE" ]; then
|
||||
if [ "$ARG_AUGGIE_INTERACTION_MODE" != "interactive" ]; then
|
||||
ARGS+=(--"$ARG_AUGGIE_INTERACTION_MODE")
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$ARG_AUGGIE_MODEL" ]; then
|
||||
ARGS+=(--model "$ARG_AUGGIE_MODEL")
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.augment/user_mcp.json" ]; then
|
||||
ARGS+=(--mcp-config "$HOME/.augment/user_mcp.json")
|
||||
fi
|
||||
|
||||
if [ -n "$ARG_MCP_FILES" ] && [ "$ARG_MCP_FILES" != "[]" ]; then
|
||||
for file in $(echo "$ARG_MCP_FILES" | jq -r '.[]'); do
|
||||
ARGS+=(--mcp-config "$file")
|
||||
done
|
||||
fi
|
||||
|
||||
ARGS+=(--mcp-config "$HOME/.augment/coder_mcp.json")
|
||||
|
||||
if [ -n "$ARG_AUGGIE_RULES" ]; then
|
||||
AUGGIE_RULES_FILE="$HOME/.augment/rules.md"
|
||||
ARGS+=(--rules "$AUGGIE_RULES_FILE")
|
||||
fi
|
||||
|
||||
if [ "$ARG_AUGGIE_CONTINUE_PREVIOUS_CONVERSATION" == "true" ]; then
|
||||
ARGS+=(--continue)
|
||||
fi
|
||||
|
||||
if [ -n "$ARG_TASK_PROMPT" ]; then
|
||||
if [ "$ARG_REPORT_TASKS" == "true" ]; then
|
||||
PROMPT="Every step of the way, report your progress using coder_report_task tool with proper summary and statuses. Your task at hand: $ARG_TASK_PROMPT"
|
||||
else
|
||||
PROMPT="$ARG_TASK_PROMPT"
|
||||
fi
|
||||
ARGS+=(--instruction "$PROMPT")
|
||||
fi
|
||||
}
|
||||
|
||||
function start_agentapi_server() {
|
||||
mkdir -p "$ARG_AUGGIE_START_DIRECTORY"
|
||||
cd "$ARG_AUGGIE_START_DIRECTORY"
|
||||
ARGS+=(--workspace-root "$ARG_AUGGIE_START_DIRECTORY")
|
||||
printf "Running auggie with args: %s\n" "$(printf '%q ' "${ARGS[@]}")"
|
||||
agentapi server --term-width 67 --term-height 1190 -- auggie "${ARGS[@]}"
|
||||
}
|
||||
|
||||
validate_auggie_installation
|
||||
build_auggie_args
|
||||
start_agentapi_server
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [[ "$1" == "--version" ]]; then
|
||||
echo "HELLO: $(bash -c env)"
|
||||
echo "auggie version v1.0.0"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
set -e
|
||||
|
||||
while true; do
|
||||
echo "$(date) - auggie-mock"
|
||||
sleep 15
|
||||
done
|
||||
Reference in New Issue
Block a user