Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
timeout-minutes: 20
environment: production
outputs:
release_created: ${{ steps.release.outputs.releases_created }}
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
version: ${{ steps.release.outputs.version }}
steps:
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ test:

# Run agent evals
eval:
@npx @lobu/cli eval
@npx @lobu/cli@latest eval
# Deploy to Kubernetes
# Usage: make deploy [--target=environment]
deploy:
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ https://github.com/user-attachments/assets/d72a9286-0325-4b8b-afc0-c1efe9c96f4e
The quickest way to start is the CLI scaffold:

```bash
npx @lobu/cli init my-bot
cd my-bot && npx @lobu/cli run -d
npx @lobu/cli@latest init my-bot
cd my-bot && npx @lobu/cli@latest run -d
```

### Deployment modes
Expand Down
10 changes: 5 additions & 5 deletions codex-skills/lobu-builder/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ Prefer editing these files directly instead of burying behavior in ad hoc code.

## Workflow

1. Keep the project runnable. Start or reuse the stack with `npx @lobu/cli run -d`.
1. Keep the project runnable. Start or reuse the stack with `npx @lobu/cli@latest run -d`.
2. Make the smallest prompt, config, skill, or eval change that solves the task.
3. Run `npx @lobu/cli validate` after changing `lobu.toml` or skill definitions.
4. Test behavior with `npx @lobu/cli chat "..."` or the project's testing instructions.
5. Run `npx @lobu/cli eval` when the behavior should be captured as a regression test.
3. Run `npx @lobu/cli@latest validate` after changing `lobu.toml` or skill definitions.
4. Test behavior with `npx @lobu/cli@latest chat "..."` or the project's testing instructions.
5. Run `npx @lobu/cli@latest eval` when the behavior should be captured as a regression test.

If the repository already provides project-specific test scripts, use those.

Expand All @@ -54,7 +54,7 @@ If the repository already provides project-specific test scripts, use those.
## Useful Suggestions

- Add or reorder providers in `lobu.toml`
- Enable built-in skills with `npx @lobu/cli skills list`, `search`, or `add`
- Enable built-in skills with `npx @lobu/cli@latest skills list`, `search`, or `add`
- Add a custom MCP server under `[agents.<id>.skills.mcp.*]`
- Add a shared skill under `skills/` for repeated workflows
- Add evals for risky behaviors and policy constraints
Expand Down
1 change: 1 addition & 0 deletions docker/Dockerfile.gateway
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ ENV NIX_PATH="nixpkgs=/home/nixuser/.nix-defexpr/channels/nixpkgs"
WORKDIR /app

# Set up workspace for gateway + core + worker (worker needed for embedded deployment mode)
COPY bun.lock ./
COPY tsconfig.json ./
COPY package.json ./
COPY patches/ ./patches/
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ CLI tool for initializing and managing Lobu projects.
## Quick Start

```bash
npx @lobu/cli init my-bot
npx @lobu/cli@latest init my-bot
cd my-bot
docker compose up -d
```
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/api/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export async function resolveContext(
}

throw new Error(
`Unknown context "${contextName}". Run \`npx @lobu/cli context list\` to see configured contexts.`
`Unknown context "${contextName}". Run \`npx @lobu/cli@latest context list\` to see configured contexts.`
);
}

Expand Down Expand Up @@ -114,7 +114,7 @@ export async function setCurrentContext(
const config = await loadContextConfig();
if (!config.contexts[trimmedName]) {
throw new Error(
`Unknown context "${trimmedName}". Run \`npx @lobu/cli context add ${trimmedName} --api-url <url>\` first.`
`Unknown context "${trimmedName}". Run \`npx @lobu/cli@latest context add ${trimmedName} --api-url <url>\` first.`
);
}

Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/commands/chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export async function chatCommand(
if (!authToken) {
console.error(
chalk.red(
"\n Session expired or not logged in. Run `npx @lobu/cli login` or set ADMIN_PASSWORD.\n"
"\n Session expired or not logged in. Run `npx @lobu/cli@latest login` or set ADMIN_PASSWORD.\n"
)
);
process.exit(1);
Expand Down Expand Up @@ -201,7 +201,7 @@ async function sendViaApi(
if (createRes.status === 401) {
console.error(
chalk.red(
"\n Authentication required. Run `npx @lobu/cli login` or set ADMIN_PASSWORD.\n"
"\n Authentication required. Run `npx @lobu/cli@latest login` or set ADMIN_PASSWORD.\n"
)
);
process.exit(1);
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ turns:
console.log(chalk.dim(` ${displayUrl}\n`));
}
console.log(chalk.cyan(" 3. Start the services:"));
console.log(chalk.dim(" npx @lobu/cli run -d\n"));
console.log(chalk.dim(" npx @lobu/cli@latest run -d\n"));
if (includeOwlettoLocal) {
console.log(chalk.cyan(" 4. Set up Owletto (first run):"));
console.log(
Expand Down
6 changes: 4 additions & 2 deletions packages/cli/src/commands/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export async function loginCommand(options: {
);
console.log(
chalk.dim(
" Run `npx @lobu/cli logout` first, or use `--force` to re-authenticate.\n"
" Run `npx @lobu/cli@latest logout` first, or use `--force` to re-authenticate.\n"
)
);
return;
Expand Down Expand Up @@ -430,7 +430,9 @@ export async function loginCommand(options: {
}
}

spinner.fail("Login request expired. Run `npx @lobu/cli login` again.");
spinner.fail(
"Login request expired. Run `npx @lobu/cli@latest login` again."
);
console.log();
}

Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/commands/providers/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export async function providersAddCommand(
console.log(chalk.red(`\n Provider "${providerId}" not found.`));
console.log(
chalk.dim(
" Run `npx @lobu/cli providers list` to see available providers.\n"
" Run `npx @lobu/cli@latest providers list` to see available providers.\n"
)
);
return;
Expand Down Expand Up @@ -72,7 +72,7 @@ export async function providersAddCommand(
if (!apiKey) {
console.log(chalk.dim("\n Set the API key:"));
console.log(
chalk.cyan(` npx @lobu/cli secrets set ${envVar} <your-key>`)
chalk.cyan(` npx @lobu/cli@latest secrets set ${envVar} <your-key>`)
);
}
console.log();
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/commands/providers/list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export async function providersListCommand(): Promise<void> {

console.log(
chalk.dim(
"\n Use `npx @lobu/cli providers add <id>` to add a provider to lobu.toml.\n"
"\n Use `npx @lobu/cli@latest providers add <id>` to add a provider to lobu.toml.\n"
)
);
}
6 changes: 4 additions & 2 deletions packages/cli/src/commands/skills/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ export async function skillsAddCommand(
if (!skill) {
console.log(chalk.red(`\n Skill "${skillId}" not found.`));
console.log(
chalk.dim(" Run `npx @lobu/cli skills list` to see available skills.\n")
chalk.dim(
" Run `npx @lobu/cli@latest skills list` to see available skills.\n"
)
);
return;
}
Expand Down Expand Up @@ -62,7 +64,7 @@ export async function skillsAddCommand(
console.log(chalk.dim("\n Required secrets:"));
for (const v of envVars) {
console.log(
chalk.cyan(` npx @lobu/cli secrets set ${v} <your-key>`)
chalk.cyan(` npx @lobu/cli@latest secrets set ${v} <your-key>`)
);
}
}
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/src/commands/skills/info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export async function skillsInfoCommand(skillId: string): Promise<void> {
if (!skill) {
console.log(chalk.red(`\n Skill "${skillId}" not found.`));
console.log(
chalk.dim(" Run `npx @lobu/cli skills list` to see available skills.\n")
chalk.dim(
" Run `npx @lobu/cli@latest skills list` to see available skills.\n"
)
);
return;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/commands/skills/list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export async function skillsListCommand(): Promise<void> {

console.log(
chalk.dim(
"\n Use `npx @lobu/cli skills info <id>` for details on a specific skill.\n"
"\n Use `npx @lobu/cli@latest skills info <id>` for details on a specific skill.\n"
)
);
}
2 changes: 1 addition & 1 deletion packages/cli/src/commands/status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export async function statusCommand(cwd: string): Promise<void> {
} catch {
console.log(chalk.yellow("\n Gateway not reachable."));
console.log(
chalk.dim(" Start with `npx @lobu/cli run` to run your agents.\n")
chalk.dim(" Start with `npx @lobu/cli@latest run` to run your agents.\n")
);
return;
}
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/commands/validate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export async function validateCommand(cwd: string): Promise<boolean> {
for (const skillId of agentEntry.skills.enabled) {
if (!skillIds.has(skillId)) {
errors.push(
`[agents.${agentId}] Unknown skill "${skillId}". Run \`npx @lobu/cli skills list\` to see available skills.`
`[agents.${agentId}] Unknown skill "${skillId}". Run \`npx @lobu/cli@latest skills list\` to see available skills.`
);
}
}
Expand Down
4 changes: 3 additions & 1 deletion packages/cli/src/commands/whoami.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ export async function whoamiCommand(options?: {
console.log(chalk.dim("\n Not logged in."));
console.log(chalk.dim(` Context: ${target.name}`));
console.log(chalk.dim(` API URL: ${target.apiUrl}`));
console.log(chalk.dim(" Run `npx @lobu/cli login` to authenticate.\n"));
console.log(
chalk.dim(" Run `npx @lobu/cli@latest login` to authenticate.\n")
);
return;
}

Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/templates/README.md.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Make sure you have Docker CLI installed.

```bash
# Start the services
npx @lobu/cli run -d
npx @lobu/cli@latest run -d

# View logs
docker compose logs -f
Expand Down
20 changes: 11 additions & 9 deletions packages/landing/src/components/CTA.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,20 @@ export function CTA() {
}}
onClick={(e) => {
const button = e.currentTarget as HTMLButtonElement;
navigator.clipboard.writeText("npx @lobu/cli init").then(() => {
const original = button.innerHTML;
button.innerHTML =
'<span style="color: var(--color-tg-accent)">Copied!</span>';
setTimeout(() => {
button.innerHTML = original;
}, 2000);
});
navigator.clipboard
.writeText("npx @lobu/cli@latest init")
.then(() => {
const original = button.innerHTML;
button.innerHTML =
'<span style="color: var(--color-tg-accent)">Copied!</span>';
setTimeout(() => {
button.innerHTML = original;
}, 2000);
});
}}
>
<span style={{ color: "var(--color-tg-accent)" }}>$</span> npx
@lobu/cli init
@lobu/cli@latest init
<svg
width="12"
height="12"
Expand Down
17 changes: 10 additions & 7 deletions packages/landing/src/components/DemoSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type TermLine = {
};

const initLines: TermLine[] = [
{ text: "$ npx lobu init landing-demo-agent", color: "#4ade80" },
{ text: "$ npx @lobu/cli@latest init landing-demo-agent", color: "#4ade80" },
{ text: "", color: "" },
{ text: "🤖 Welcome to Lobu!", color: "#facc15" },
{ text: "", color: "" },
Expand Down Expand Up @@ -79,7 +79,7 @@ const initLines: TermLine[] = [
{ text: "", color: "" },
{ text: "Next steps:", color: "#facc15" },
{ text: " cd landing-demo-agent", color: "#67e8f9" },
{ text: " npx @lobu/cli run -d", color: "#67e8f9" },
{ text: " npx @lobu/cli@latest run -d", color: "#67e8f9" },
];

const agentPrompt = [
Expand All @@ -90,7 +90,7 @@ const agentPrompt = [
"2. Help me shape the agent behavior by editing those files directly.",
"3. Use Lobu skills when they make sense: https://lobu.ai/getting-started/skills/",
"4. Suggest any provider, skill, or connection changes needed in lobu.toml.",
"5. Keep the project runnable with `npx @lobu/cli run -d`.",
"5. Keep the project runnable with `npx @lobu/cli@latest run -d`.",
"",
"Explain what you change and why.",
].join("\n");
Expand All @@ -114,11 +114,14 @@ const embedSnippet = [
].join("\n");

const testEvalLines: TermLine[] = [
{ text: '$ npx lobu chat "Hello, what can you do?"', color: "#4ade80" },
{
text: '$ npx @lobu/cli@latest chat "Hello, what can you do?"',
color: "#4ade80",
},
{ text: "I can help with code reviews, manage GitHub", color: "#c9cdd4" },
{ text: "issues, and answer questions about your...", color: "#c9cdd4" },
{ text: "", color: "" },
{ text: "$ npx lobu eval", color: "#4ade80" },
{ text: "$ npx @lobu/cli@latest eval", color: "#4ade80" },
{ text: "", color: "" },
{ text: "Running 3 evals (9 trials)...", color: "#8f96a3" },
{ text: "", color: "" },
Expand All @@ -132,7 +135,7 @@ const testEvalLines: TermLine[] = [

const selfHostSnippet = [
"$ cd landing-demo-agent",
"$ npx @lobu/cli run -d",
"$ npx @lobu/cli@latest run -d",
"# iterate locally",
"",
"$ docker compose up -d",
Expand Down Expand Up @@ -424,7 +427,7 @@ export function DemoSection() {
/>
</div>
<TerminalWindow
label="npx lobu init landing-demo-agent"
label="npx @lobu/cli@latest init landing-demo-agent"
lines={initLines}
/>
</div>
Expand Down
10 changes: 8 additions & 2 deletions packages/landing/src/components/InstallSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@ const localDev = {
badges: ["CLI scaffold", "Full stack", "Fastest setup"],
docsHref: "/deployment/docker/",
steps: [
{ label: "Scaffold a new agent", code: "npx @lobu/cli init my-agent" },
{ label: "Run the stack", code: "cd my-agent && npx @lobu/cli run -d" },
{
label: "Scaffold a new agent",
code: "npx @lobu/cli@latest init my-agent",
},
{
label: "Run the stack",
code: "cd my-agent && npx @lobu/cli@latest run -d",
},
{ label: "Open the docs", code: "open http://localhost:8080/api/docs" },
],
};
Expand Down
5 changes: 3 additions & 2 deletions packages/landing/src/components/SkillsSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ const editorFiles: EditorFile[] = [
const AGENT_PROMPT =
"Set up a new Lobu agent in this directory. Create lobu.toml, IDENTITY.md, SOUL.md, USER.md, and a skill in skills/ops-triage/SKILL.md with nix packages, a network allowlist, tool permissions, and an MCP server. Follow the Lobu skill conventions at https://lobu.ai/getting-started/skills/.";

const INIT_COMMAND = "npx lobu init";
const INIT_COMMAND = "npx @lobu/cli@latest init";

function useCopy(value: string) {
const [copied, setCopied] = useState(false);
Expand Down Expand Up @@ -577,7 +577,8 @@ function EditorPreview() {
style={codeBlockStyle}
>
<code>
<span style={{ color: "#7aa2f7" }}>$</span> npx lobu run
<span style={{ color: "#7aa2f7" }}>$</span> npx @lobu/cli@latest
run
{"\n"}
<span style={{ color: "#9ece6a" }}>{">"}</span> reading
lobu.toml
Expand Down
4 changes: 2 additions & 2 deletions packages/landing/src/components/TerminalLog.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export function TerminalLog({ fill }: { fill?: boolean }) {
const lines: { text: string; color: string }[] = [
{ text: "$ npx @lobu/cli run -d", color: "#4ade80" },
{ text: "$ npx @lobu/cli@latest run -d", color: "#4ade80" },
{ text: "[gateway] listening on :8080", color: "#8f96a3" },
{ text: "[gateway] connected to Redis", color: "#8f96a3" },
{
Expand Down Expand Up @@ -67,7 +67,7 @@ export function TerminalLog({ fill }: { fill?: boolean }) {
class="px-2.5 py-1 rounded-md"
style={{ backgroundColor: "#23262d", color: "#c9cdd4" }}
>
npx @lobu/cli run
npx @lobu/cli@latest run
</span>
</div>
</div>
Expand Down
Loading
Loading