Switch to double quotes and reformat codebase with Biome
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/best-practices')({
|
||||
export const Route = createFileRoute("/docs/best-practices")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Best Practices - Paseo Docs',
|
||||
'Tips for getting the most out of Paseo and mobile-first agent workflows.',
|
||||
"Best Practices - Paseo Docs",
|
||||
"Tips for getting the most out of Paseo and mobile-first agent workflows.",
|
||||
),
|
||||
}),
|
||||
component: BestPractices,
|
||||
})
|
||||
});
|
||||
|
||||
function BestPractices() {
|
||||
return (
|
||||
@@ -17,131 +17,118 @@ function BestPractices() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">Best Practices</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
What I've learned from using Paseo daily. Not rules, just patterns
|
||||
that have worked for me.
|
||||
What I've learned from using Paseo daily. Not rules, just patterns that have worked for
|
||||
me.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Agents replace typing, not thinking</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Your role has changed. You're no longer the one writing code line by
|
||||
line. You're the one making decisions: what to build, how it should
|
||||
work, what the architecture looks like. The agent executes, but you
|
||||
direct.
|
||||
Your role has changed. You're no longer the one writing code line by line. You're the one
|
||||
making decisions: what to build, how it should work, what the architecture looks like. The
|
||||
agent executes, but you direct.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You can't just say "implement feature X" and walk away. You still
|
||||
have to do the hard part: deciding what to build, how it fits into
|
||||
the system, what trade-offs to make. Thinking is not optional. At
|
||||
least for now, agents replace the typing, not the thinking.
|
||||
You can't just say "implement feature X" and walk away. You still have to do the hard
|
||||
part: deciding what to build, how it fits into the system, what trade-offs to make.
|
||||
Thinking is not optional. At least for now, agents replace the typing, not the thinking.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Verification loops</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The agent needs a way to verify its work. TDD is one implementation of
|
||||
this pattern: get the agent to write a failing test, verify it fails
|
||||
for the right reasons, then tell it to make the test pass. The agent
|
||||
can loop on its own because it knows what "done" means.
|
||||
The agent needs a way to verify its work. TDD is one implementation of this pattern: get
|
||||
the agent to write a failing test, verify it fails for the right reasons, then tell it to
|
||||
make the test pass. The agent can loop on its own because it knows what "done" means.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Invest in tooling</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
It's not just test runners. For web apps, something like Playwright
|
||||
MCP lets the agent take screenshots and verify UI changes. For a SaaS
|
||||
app I built a CLI that wraps all the business logic so the agent could
|
||||
launch jobs, check statuses, and scrape data without going through the
|
||||
UI.
|
||||
It's not just test runners. For web apps, something like Playwright MCP lets the agent
|
||||
take screenshots and verify UI changes. For a SaaS app I built a CLI that wraps all the
|
||||
business logic so the agent could launch jobs, check statuses, and scrape data without
|
||||
going through the UI.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Code is cheap with coding agents. I would have never written that CLI
|
||||
before because it felt like wasted effort. Now I bootstrap tooling
|
||||
first. It pays off exponentially.
|
||||
Code is cheap with coding agents. I would have never written that CLI before because it
|
||||
felt like wasted effort. Now I bootstrap tooling first. It pays off exponentially.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Agents are cheap</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Don't be shy about running multiple agents. Paseo lets you launch
|
||||
agents in isolated worktrees. Kick one off with voice while walking,
|
||||
then kick off another. They work independently. You get a notification
|
||||
when they're done.
|
||||
Don't be shy about running multiple agents. Paseo lets you launch agents in isolated
|
||||
worktrees. Kick one off with voice while walking, then kick off another. They work
|
||||
independently. You get a notification when they're done.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Use voice extensively</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
It's much more natural to use voice to communicate ideas and pull them
|
||||
out of your brain. The agent will parse and organize your thoughts
|
||||
better than if you try to write the perfect prompt. You don't need to
|
||||
organize anything. Just talk.
|
||||
It's much more natural to use voice to communicate ideas and pull them out of your brain.
|
||||
The agent will parse and organize your thoughts better than if you try to write the
|
||||
perfect prompt. You don't need to organize anything. Just talk.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Current speech-to-text models are really good. They catch accents,
|
||||
acronyms, technical terms. And even when they don't, the LLM will
|
||||
infer what you meant.
|
||||
Current speech-to-text models are really good. They catch accents, acronyms, technical
|
||||
terms. And even when they don't, the LLM will infer what you meant.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Understand the type of work</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Sometimes you need to plan: design a spec, verify it, get the agent to
|
||||
follow through. Maybe it takes a couple of agents to work through it.
|
||||
Other times it's conversational: kick off a single agent and start
|
||||
talking, asking questions. Match your approach to the task.
|
||||
Sometimes you need to plan: design a spec, verify it, get the agent to follow through.
|
||||
Maybe it takes a couple of agents to work through it. Other times it's conversational:
|
||||
kick off a single agent and start talking, asking questions. Match your approach to the
|
||||
task.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Iterate and refactor often</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Don't expect perfect. Expect working. Make it work, make it correct,
|
||||
make it beautiful. Each iteration gets you closer. With tests,
|
||||
refactoring is cheap.
|
||||
Don't expect perfect. Expect working. Make it work, make it correct, make it beautiful.
|
||||
Each iteration gets you closer. With tests, refactoring is cheap.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
I don't let myself add too many features before stopping to refactor.
|
||||
Sometimes I kick off an agent and have it trace code paths, explain
|
||||
dependencies, show me how modules connect. I make mental notes during
|
||||
code review and circle back.
|
||||
I don't let myself add too many features before stopping to refactor. Sometimes I kick off
|
||||
an agent and have it trace code paths, explain dependencies, show me how modules connect.
|
||||
I make mental notes during code review and circle back.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Use agents to check agents</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
If an agent implements something and you ask it to review its own
|
||||
work, it will never find issues. Launch a separate agent with a fresh
|
||||
context to review the first agent's code. It will catch things the
|
||||
first agent missed or glossed over. An agent might say it's done when
|
||||
it's not. Another agent can detect that.
|
||||
If an agent implements something and you ask it to review its own work, it will never find
|
||||
issues. Launch a separate agent with a fresh context to review the first agent's code. It
|
||||
will catch things the first agent missed or glossed over. An agent might say it's done
|
||||
when it's not. Another agent can detect that.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Learn your agents' quirks</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
People argue about which model is better. That's the wrong question.
|
||||
Each model has strengths and weaknesses. Knowing them is more useful
|
||||
than chasing benchmarks. Benchmarks don't mean anything. You need to
|
||||
try the models yourself to form an opinion.
|
||||
People argue about which model is better. That's the wrong question. Each model has
|
||||
strengths and weaknesses. Knowing them is more useful than chasing benchmarks. Benchmarks
|
||||
don't mean anything. You need to try the models yourself to form an opinion.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
I use Claude Code as my main driver because it's quick and uses tools
|
||||
well. But sometimes it jumps to conclusions and gives up too easily.
|
||||
Codex is frustratingly slow but goes deep, doesn't stop, and is
|
||||
methodical. It's also stubborn and too serious. These aren't good or
|
||||
bad traits, just differences you learn to work around. Use the right
|
||||
model for the job.
|
||||
I use Claude Code as my main driver because it's quick and uses tools well. But sometimes
|
||||
it jumps to conclusions and gives up too easily. Codex is frustratingly slow but goes
|
||||
deep, doesn't stop, and is methodical. It's also stubborn and too serious. These aren't
|
||||
good or bad traits, just differences you learn to work around. Use the right model for the
|
||||
job.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/cli')({
|
||||
export const Route = createFileRoute("/docs/cli")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'CLI - Paseo Docs',
|
||||
'Paseo CLI reference: manage agents, daemons, permissions, and worktrees from your terminal.',
|
||||
"CLI - Paseo Docs",
|
||||
"Paseo CLI reference: manage agents, daemons, permissions, and worktrees from your terminal.",
|
||||
),
|
||||
}),
|
||||
component: CLI,
|
||||
})
|
||||
});
|
||||
|
||||
function Code({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto">
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function CLI() {
|
||||
@@ -25,8 +25,8 @@ function CLI() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">CLI</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The Paseo CLI lets you manage agents from your terminal. It's the same interface exposed by
|
||||
the daemon's API, so anything you can do in the app you can do from the command line.
|
||||
The Paseo CLI lets you manage agents from your terminal. It's the same interface exposed
|
||||
by the daemon's API, so anything you can do in the app you can do from the command line.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -67,16 +67,16 @@ paseo run --output-schema schema.json "extract release notes"
|
||||
paseo run --output-schema '{"type":"object","properties":{"summary":{"type":"string"}},"required":["summary"]}' "summarize release notes"`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The <code className="font-mono">--worktree</code> flag creates the agent in an isolated git
|
||||
worktree, useful for parallel feature development.
|
||||
The <code className="font-mono">--worktree</code> flag creates the agent in an isolated
|
||||
git worktree, useful for parallel feature development.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Use <code className="font-mono">--output-schema</code> to return only matching JSON output.
|
||||
You can pass a schema file path or an inline JSON schema object.
|
||||
This mode cannot be used with <code className="font-mono">--detach</code>.
|
||||
Use <code className="font-mono">--output-schema</code> to return only matching JSON
|
||||
output. You can pass a schema file path or an inline JSON schema object. This mode cannot
|
||||
be used with <code className="font-mono">--detach</code>.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
By default, <code className="font-mono">paseo run</code> waits for completion. Use{' '}
|
||||
By default, <code className="font-mono">paseo run</code> waits for completion. Use{" "}
|
||||
<code className="font-mono">--detach</code> to run in the background.
|
||||
</p>
|
||||
</section>
|
||||
@@ -96,13 +96,15 @@ paseo ls -a -g --json # Full list as JSON`}</pre>
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Streaming output</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Use <code className="font-mono">paseo attach</code> to stream an agent's output in real-time:
|
||||
Use <code className="font-mono">paseo attach</code> to stream an agent's output in
|
||||
real-time:
|
||||
</p>
|
||||
<Code>
|
||||
<pre className="text-white/80">{`paseo attach abc123 # Attach to agent (Ctrl+C to detach)`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Agent IDs can be shortened — <code className="font-mono">abc</code> works if it's unambiguous.
|
||||
Agent IDs can be shortened — <code className="font-mono">abc</code> works if it's
|
||||
unambiguous.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -180,7 +182,8 @@ paseo daemon status # Check status
|
||||
paseo daemon stop # Stop the daemon`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Use <code className="font-mono">PASEO_HOME</code> to run multiple isolated daemon instances.
|
||||
Use <code className="font-mono">PASEO_HOME</code> to run multiple isolated daemon
|
||||
instances.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -197,9 +200,7 @@ paseo run --detach "implement the API" --name api-agent
|
||||
paseo wait api-agent
|
||||
paseo logs api-agent --tail 5`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Simple implement + verify loop:
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">Simple implement + verify loop:</p>
|
||||
<Code>
|
||||
<pre className="text-white/80">{`# Requires jq
|
||||
while true; do
|
||||
@@ -236,7 +237,8 @@ paseo ls -q # IDs only (quiet)`}</pre>
|
||||
<h2 className="text-xl font-medium">Global options</h2>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li>
|
||||
<code className="font-mono">--host <host:port></code> — connect to a different daemon
|
||||
<code className="font-mono">--host <host:port></code> — connect to a different
|
||||
daemon
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">--json</code> — JSON output
|
||||
@@ -250,5 +252,5 @@ paseo ls -q # IDs only (quiet)`}</pre>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/configuration')({
|
||||
export const Route = createFileRoute("/docs/configuration")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Configuration - Paseo Docs',
|
||||
'Configure Paseo via config.json, environment variables, and CLI overrides.',
|
||||
"Configuration - Paseo Docs",
|
||||
"Configure Paseo via config.json, environment variables, and CLI overrides.",
|
||||
),
|
||||
}),
|
||||
component: Configuration,
|
||||
})
|
||||
});
|
||||
|
||||
function Configuration() {
|
||||
return (
|
||||
@@ -17,8 +17,8 @@ function Configuration() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">Configuration</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Paseo loads configuration from a single JSON file in your Paseo home directory, with optional
|
||||
environment variable and CLI overrides.
|
||||
Paseo loads configuration from a single JSON file in your Paseo home directory, with
|
||||
optional environment variable and CLI overrides.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -33,24 +33,26 @@ function Configuration() {
|
||||
<span>~/.paseo/config.json</span>
|
||||
</div>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You can change the home directory by setting <code className="font-mono">PASEO_HOME</code>{' '}
|
||||
or passing <code className="font-mono">--home</code> to <code className="font-mono">paseo daemon start</code>.
|
||||
You can change the home directory by setting <code className="font-mono">PASEO_HOME</code>{" "}
|
||||
or passing <code className="font-mono">--home</code> to{" "}
|
||||
<code className="font-mono">paseo daemon start</code>.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Precedence</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Paseo merges configuration in this order:
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">Paseo merges configuration in this order:</p>
|
||||
<ol className="text-white/60 space-y-2 list-decimal list-inside">
|
||||
<li>Defaults</li>
|
||||
<li><code className="font-mono">config.json</code></li>
|
||||
<li>
|
||||
<code className="font-mono">config.json</code>
|
||||
</li>
|
||||
<li>Environment variables</li>
|
||||
<li>CLI flags</li>
|
||||
</ol>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Lists append across sources (for example, <code className="font-mono">allowedHosts</code> and
|
||||
Lists append across sources (for example, <code className="font-mono">allowedHosts</code>{" "}
|
||||
and
|
||||
<code className="font-mono">cors.allowedOrigins</code>).
|
||||
</p>
|
||||
</section>
|
||||
@@ -61,7 +63,7 @@ function Configuration() {
|
||||
Minimal example that configures listening address, host allowlist, provider keys, and MCP:
|
||||
</p>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"$schema": "https://paseo.sh/schemas/paseo.config.v1.json",
|
||||
"version": 1,
|
||||
"providers": {
|
||||
@@ -79,19 +81,21 @@ function Configuration() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Agent provider runtime settings</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Use <code className="font-mono">agents.providers</code> to customize how Paseo launches agent provider CLIs.
|
||||
This works for <code className="font-mono">claude</code>, <code className="font-mono">codex</code>, and
|
||||
Use <code className="font-mono">agents.providers</code> to customize how Paseo launches
|
||||
agent provider CLIs. This works for <code className="font-mono">claude</code>,{" "}
|
||||
<code className="font-mono">codex</code>, and
|
||||
<code className="font-mono"> opencode</code>.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
<code className="font-mono">command.mode</code> can be <code className="font-mono">default</code>,{' '}
|
||||
<code className="font-mono">append</code>, or <code className="font-mono">replace</code>. Use{' '}
|
||||
<code className="font-mono">env</code> to inject provider-specific environment variables.
|
||||
<code className="font-mono">command.mode</code> can be{" "}
|
||||
<code className="font-mono">default</code>, <code className="font-mono">append</code>, or{" "}
|
||||
<code className="font-mono">replace</code>. Use <code className="font-mono">env</code> to
|
||||
inject provider-specific environment variables.
|
||||
</p>
|
||||
|
||||
<h3 className="text-lg font-medium">Enable Claude Code Chrome MCP</h3>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"agents": {
|
||||
"providers": {
|
||||
"claude": {
|
||||
@@ -105,9 +109,11 @@ function Configuration() {
|
||||
}`}
|
||||
</pre>
|
||||
|
||||
<h3 className="text-lg font-medium">Point Claude to Anthropic-compatible endpoints (z.ai example)</h3>
|
||||
<h3 className="text-lg font-medium">
|
||||
Point Claude to Anthropic-compatible endpoints (z.ai example)
|
||||
</h3>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"agents": {
|
||||
"providers": {
|
||||
"claude": {
|
||||
@@ -124,11 +130,11 @@ function Configuration() {
|
||||
|
||||
<h3 className="text-lg font-medium">Run Claude through Docker</h3>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Create a wrapper script that runs Claude in Docker, then tell Paseo to replace the Claude launch command
|
||||
with that script.
|
||||
Create a wrapper script that runs Claude in Docker, then tell Paseo to replace the Claude
|
||||
launch command with that script.
|
||||
</p>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"agents": {
|
||||
"providers": {
|
||||
"claude": {
|
||||
@@ -142,7 +148,7 @@ function Configuration() {
|
||||
}`}
|
||||
</pre>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`#!/usr/bin/env bash
|
||||
{`#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
docker run --rm -i \\
|
||||
-v "$PWD":"$PWD" \\
|
||||
@@ -156,13 +162,16 @@ docker run --rm -i \\
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Voice</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Voice is configured through <code className="font-mono">features.dictation</code> and{' '}
|
||||
<code className="font-mono">features.voiceMode</code>, with provider credentials under{' '}
|
||||
Voice is configured through <code className="font-mono">features.dictation</code> and{" "}
|
||||
<code className="font-mono">features.voiceMode</code>, with provider credentials under{" "}
|
||||
<code className="font-mono">providers</code>.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
For voice philosophy, architecture, and complete local/OpenAI setup examples, see{' '}
|
||||
<a href="/docs/voice" className="underline hover:text-white/80">Voice docs</a>.
|
||||
For voice philosophy, architecture, and complete local/OpenAI setup examples, see{" "}
|
||||
<a href="/docs/voice" className="underline hover:text-white/80">
|
||||
Voice docs
|
||||
</a>
|
||||
.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -176,16 +185,16 @@ docker run --rm -i \\
|
||||
Console: <code className="font-mono">info</code> and above
|
||||
</li>
|
||||
<li>
|
||||
File (<code className="font-mono">$PASEO_HOME/daemon.log</code>):{' '}
|
||||
File (<code className="font-mono">$PASEO_HOME/daemon.log</code>):{" "}
|
||||
<code className="font-mono">trace</code> and above
|
||||
</li>
|
||||
<li>
|
||||
File rotation: <code className="font-mono">10m</code> max file size,{' '}
|
||||
File rotation: <code className="font-mono">10m</code> max file size,{" "}
|
||||
<code className="font-mono">2</code> retained files total (active + 1 rotated)
|
||||
</li>
|
||||
</ul>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"log": {
|
||||
"console": {
|
||||
"level": "info",
|
||||
@@ -203,7 +212,7 @@ docker run --rm -i \\
|
||||
}`}
|
||||
</pre>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Legacy fields <code className="font-mono">log.level</code> and{' '}
|
||||
Legacy fields <code className="font-mono">log.level</code> and{" "}
|
||||
<code className="font-mono">log.format</code> are still supported and map to the new
|
||||
destination settings.
|
||||
</p>
|
||||
@@ -212,22 +221,75 @@ docker run --rm -i \\
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Common env vars</h2>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li><code className="font-mono">PASEO_HOME</code> — set Paseo home directory</li>
|
||||
<li><code className="font-mono">PASEO_LISTEN</code> — override <code className="font-mono">daemon.listen</code></li>
|
||||
<li><code className="font-mono">PASEO_ALLOWED_HOSTS</code> — override/extend <code className="font-mono">daemon.allowedHosts</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG_CONSOLE_LEVEL</code> — override <code className="font-mono">log.console.level</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG_FILE_LEVEL</code> — override <code className="font-mono">log.file.level</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG_FILE_PATH</code> — override <code className="font-mono">log.file.path</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG_FILE_ROTATE_SIZE</code> — override <code className="font-mono">log.file.rotate.maxSize</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG_FILE_ROTATE_COUNT</code> — override <code className="font-mono">log.file.rotate.maxFiles</code></li>
|
||||
<li><code className="font-mono">PASEO_LOG</code>, <code className="font-mono">PASEO_LOG_FORMAT</code> — legacy log overrides (still supported)</li>
|
||||
<li><code className="font-mono">OPENAI_API_KEY</code> — override OpenAI provider key</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LLM_PROVIDER</code> — override voice LLM provider (<code className="font-mono">claude</code>, <code className="font-mono">codex</code>, <code className="font-mono">opencode</code>)</li>
|
||||
<li><code className="font-mono">PASEO_DICTATION_STT_PROVIDER</code>, <code className="font-mono">PASEO_VOICE_STT_PROVIDER</code>, <code className="font-mono">PASEO_VOICE_TTS_PROVIDER</code> — override voice provider selection (<code className="font-mono">local</code> or <code className="font-mono">openai</code>)</li>
|
||||
<li><code className="font-mono">PASEO_LOCAL_MODELS_DIR</code> — control local model directory</li>
|
||||
<li><code className="font-mono">PASEO_DICTATION_LOCAL_STT_MODEL</code> — override local dictation STT model</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LOCAL_STT_MODEL</code>, <code className="font-mono">PASEO_VOICE_LOCAL_TTS_MODEL</code> — override local voice STT/TTS models</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEAKER_ID</code>, <code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEED</code> — optional local voice TTS tuning</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_HOME</code> — set Paseo home directory
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LISTEN</code> — override{" "}
|
||||
<code className="font-mono">daemon.listen</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_ALLOWED_HOSTS</code> — override/extend{" "}
|
||||
<code className="font-mono">daemon.allowedHosts</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG_CONSOLE_LEVEL</code> — override{" "}
|
||||
<code className="font-mono">log.console.level</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG_FILE_LEVEL</code> — override{" "}
|
||||
<code className="font-mono">log.file.level</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG_FILE_PATH</code> — override{" "}
|
||||
<code className="font-mono">log.file.path</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG_FILE_ROTATE_SIZE</code> — override{" "}
|
||||
<code className="font-mono">log.file.rotate.maxSize</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG_FILE_ROTATE_COUNT</code> — override{" "}
|
||||
<code className="font-mono">log.file.rotate.maxFiles</code>
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOG</code>,{" "}
|
||||
<code className="font-mono">PASEO_LOG_FORMAT</code> — legacy log overrides (still
|
||||
supported)
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">OPENAI_API_KEY</code> — override OpenAI provider key
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LLM_PROVIDER</code> — override voice LLM
|
||||
provider (<code className="font-mono">claude</code>,{" "}
|
||||
<code className="font-mono">codex</code>, <code className="font-mono">opencode</code>)
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_DICTATION_STT_PROVIDER</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_STT_PROVIDER</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_TTS_PROVIDER</code> — override voice provider
|
||||
selection (<code className="font-mono">local</code> or{" "}
|
||||
<code className="font-mono">openai</code>)
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOCAL_MODELS_DIR</code> — control local model
|
||||
directory
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_DICTATION_LOCAL_STT_MODEL</code> — override local
|
||||
dictation STT model
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_STT_MODEL</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_MODEL</code> — override local voice
|
||||
STT/TTS models
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEAKER_ID</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEED</code> — optional local voice
|
||||
TTS tuning
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
@@ -241,5 +303,5 @@ docker run --rm -i \\
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/')({
|
||||
export const Route = createFileRoute("/docs/")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Getting Started - Paseo Docs',
|
||||
'Learn how to set up and use Paseo to manage your coding agents from anywhere.',
|
||||
"Getting Started - Paseo Docs",
|
||||
"Learn how to set up and use Paseo to manage your coding agents from anywhere.",
|
||||
),
|
||||
}),
|
||||
component: GettingStarted,
|
||||
})
|
||||
});
|
||||
|
||||
function GettingStarted() {
|
||||
return (
|
||||
@@ -17,15 +17,14 @@ function GettingStarted() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">Getting Started</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Paseo connects to your local development environment and lets you manage your coding agents from anywhere.
|
||||
Paseo connects to your local development environment and lets you manage your coding
|
||||
agents from anywhere.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Installation</h2>
|
||||
<p className="text-white/60">
|
||||
Install the CLI globally and run it on your machine:
|
||||
</p>
|
||||
<p className="text-white/60">Install the CLI globally and run it on your machine:</p>
|
||||
<div className="bg-card border border-border rounded-lg p-4 font-mono text-sm">
|
||||
<span className="text-muted-foreground select-none">$ </span>
|
||||
<span>npm install -g @getpaseo/cli</span>
|
||||
@@ -39,14 +38,16 @@ function GettingStarted() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Connect the App</h2>
|
||||
<p className="text-white/60">
|
||||
Open Paseo on your phone and scan the QR code displayed in your terminal, or enter the server address manually.
|
||||
Open Paseo on your phone and scan the QR code displayed in your terminal, or enter the
|
||||
server address manually.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Prerequisites</h2>
|
||||
<p className="text-white/60">
|
||||
Paseo wraps CLI tools like Claude Code and Codex. You'll need to have them installed and configured with your own credentials before Paseo can manage them.
|
||||
Paseo wraps CLI tools like Claude Code and Codex. You'll need to have them installed and
|
||||
configured with your own credentials before Paseo can manage them.
|
||||
</p>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li>
|
||||
@@ -85,11 +86,12 @@ function GettingStarted() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Voice Setup</h2>
|
||||
<p className="text-white/60">
|
||||
Paseo includes first-class voice support with a local-first architecture and configurable speech
|
||||
providers.
|
||||
Paseo includes first-class voice support with a local-first architecture and configurable
|
||||
speech providers.
|
||||
</p>
|
||||
<p className="text-white/60">
|
||||
For architecture, local model behavior, and provider configuration, see the Voice docs page.
|
||||
For architecture, local model behavior, and provider configuration, see the Voice docs
|
||||
page.
|
||||
</p>
|
||||
<a href="/docs/voice" className="underline hover:text-white/80">
|
||||
Voice docs
|
||||
@@ -122,5 +124,5 @@ function GettingStarted() {
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/security')({
|
||||
export const Route = createFileRoute("/docs/security")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Security - Paseo Docs',
|
||||
'Security model for Paseo: architecture overview, connection methods, relay encryption, and best practices.',
|
||||
"Security - Paseo Docs",
|
||||
"Security model for Paseo: architecture overview, connection methods, relay encryption, and best practices.",
|
||||
),
|
||||
}),
|
||||
component: Security,
|
||||
})
|
||||
});
|
||||
|
||||
function Callout({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="bg-primary/10 border border-primary/30 rounded-lg p-4 text-white/80">
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function Security() {
|
||||
@@ -79,7 +79,7 @@ function Security() {
|
||||
<h3 className="text-lg font-medium mt-6">How it works</h3>
|
||||
<ol className="text-white/60 space-y-2 list-decimal list-inside">
|
||||
<li>
|
||||
The daemon generates a persistent ECDH keypair and stores it in{' '}
|
||||
The daemon generates a persistent ECDH keypair and stores it in{" "}
|
||||
<code className="font-mono">$PASEO_HOME/daemon-keypair.json</code>
|
||||
</li>
|
||||
<li>
|
||||
@@ -140,7 +140,7 @@ function Security() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Direct connections</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
By default, the daemon listens on <code className="font-mono">127.0.0.1:6767</code>{' '}
|
||||
By default, the daemon listens on <code className="font-mono">127.0.0.1:6767</code>{" "}
|
||||
(localhost only). This is safe for local CLI usage but not reachable from your phone or
|
||||
other devices.
|
||||
</p>
|
||||
@@ -155,7 +155,7 @@ function Security() {
|
||||
|
||||
<h3 className="text-lg font-medium mt-6">VPN access</h3>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
If you prefer direct connections over the relay, you can use a VPN like{' '}
|
||||
If you prefer direct connections over the relay, you can use a VPN like{" "}
|
||||
<a
|
||||
href="https://tailscale.com"
|
||||
target="_blank"
|
||||
@@ -170,7 +170,7 @@ function Security() {
|
||||
<p className="text-white/60 leading-relaxed">To set this up:</p>
|
||||
<ol className="text-white/60 space-y-2 list-decimal list-inside">
|
||||
<li>
|
||||
Install Tailscale on your machine and phone and join them to the same{' '}
|
||||
Install Tailscale on your machine and phone and join them to the same{" "}
|
||||
<a
|
||||
href="https://tailscale.com/kb/1136/tailnet"
|
||||
target="_blank"
|
||||
@@ -181,14 +181,16 @@ function Security() {
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
Configure the daemon to listen on your Tailscale IP (e.g.,{' '}
|
||||
Configure the daemon to listen on your Tailscale IP (e.g.,{" "}
|
||||
<code className="font-mono">100.x.y.z:6767</code>)
|
||||
</li>
|
||||
<li>
|
||||
Add your Tailscale hostname to <code className="font-mono">allowedHosts</code> and{' '}
|
||||
Add your Tailscale hostname to <code className="font-mono">allowedHosts</code> and{" "}
|
||||
<code className="font-mono">cors.allowedOrigins</code>
|
||||
</li>
|
||||
<li>Add the daemon as a direct connection in the Paseo app using the Tailscale address</li>
|
||||
<li>
|
||||
Add the daemon as a direct connection in the Paseo app using the Tailscale address
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<h3 className="text-lg font-medium mt-6">Binding to 0.0.0.0</h3>
|
||||
@@ -196,7 +198,7 @@ function Security() {
|
||||
<strong>Warning:</strong> Binding to <code className="font-mono">0.0.0.0</code> makes the
|
||||
daemon reachable on all network interfaces, including public Wi-Fi and local networks.
|
||||
This can expose your daemon to unauthorized access. If you must bind to all interfaces,
|
||||
ensure you have proper firewall rules and review your{' '}
|
||||
ensure you have proper firewall rules and review your{" "}
|
||||
<code className="font-mono">allowedHosts</code> configuration.
|
||||
</div>
|
||||
</section>
|
||||
@@ -214,17 +216,17 @@ function Security() {
|
||||
on incoming requests. Requests with unrecognized hosts are rejected.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Configure via <code className="font-mono">daemon.allowedHosts</code> in{' '}
|
||||
Configure via <code className="font-mono">daemon.allowedHosts</code> in{" "}
|
||||
<code className="font-mono">config.json</code>:
|
||||
</p>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li>
|
||||
Default (<code className="font-mono">[]</code>): allow{' '}
|
||||
<code className="font-mono">localhost</code>,{' '}
|
||||
Default (<code className="font-mono">[]</code>): allow{" "}
|
||||
<code className="font-mono">localhost</code>,{" "}
|
||||
<code className="font-mono">*.localhost</code>, and all IP addresses
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">['.example.com']</code>: allow{' '}
|
||||
<code className="font-mono">['.example.com']</code>: allow{" "}
|
||||
<code className="font-mono">example.com</code> and any subdomain, plus defaults
|
||||
</li>
|
||||
<li>
|
||||
@@ -283,5 +285,5 @@ function Security() {
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/updates')({
|
||||
export const Route = createFileRoute("/docs/updates")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Updates - Paseo Docs',
|
||||
'How to update Paseo daemon and apps across web, desktop, and mobile.',
|
||||
"Updates - Paseo Docs",
|
||||
"How to update Paseo daemon and apps across web, desktop, and mobile.",
|
||||
),
|
||||
}),
|
||||
component: UpdatesDocs,
|
||||
})
|
||||
});
|
||||
|
||||
function UpdatesDocs() {
|
||||
return (
|
||||
@@ -53,7 +53,7 @@ function UpdatesDocs() {
|
||||
className="underline hover:text-white/80"
|
||||
>
|
||||
app.paseo.sh
|
||||
</a>{' '}
|
||||
</a>{" "}
|
||||
is always up to date. No manual update needed.
|
||||
</p>
|
||||
</section>
|
||||
@@ -82,5 +82,5 @@ function UpdatesDocs() {
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/voice')({
|
||||
export const Route = createFileRoute("/docs/voice")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Voice - Paseo Docs',
|
||||
'Paseo voice architecture, local-first model execution, and provider configuration.',
|
||||
"Voice - Paseo Docs",
|
||||
"Paseo voice architecture, local-first model execution, and provider configuration.",
|
||||
),
|
||||
}),
|
||||
component: VoiceDocs,
|
||||
})
|
||||
});
|
||||
|
||||
function VoiceDocs() {
|
||||
return (
|
||||
@@ -17,17 +17,17 @@ function VoiceDocs() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">Voice</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Paseo has first-class voice support for dictation and realtime conversations with your coding
|
||||
environment.
|
||||
Paseo has first-class voice support for dictation and realtime conversations with your
|
||||
coding environment.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Philosophy</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Voice is local-first. You can run speech fully on-device, or choose OpenAI for speech features.
|
||||
For voice reasoning/orchestration, Paseo reuses agent providers already installed and authenticated
|
||||
on your machine.
|
||||
Voice is local-first. You can run speech fully on-device, or choose OpenAI for speech
|
||||
features. For voice reasoning/orchestration, Paseo reuses agent providers already
|
||||
installed and authenticated on your machine.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
This keeps credentials and execution in your environment and avoids introducing a separate
|
||||
@@ -38,9 +38,16 @@ function VoiceDocs() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Architecture</h2>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li>Speech I/O: STT and TTS providers per feature (<code className="font-mono">local</code> or <code className="font-mono">openai</code>)</li>
|
||||
<li>
|
||||
Speech I/O: STT and TTS providers per feature (<code className="font-mono">local</code>{" "}
|
||||
or <code className="font-mono">openai</code>)
|
||||
</li>
|
||||
<li>Local speech runtime: ONNX models executed on CPU by default</li>
|
||||
<li>Voice LLM orchestration: hidden agent session using your configured provider (<code className="font-mono">claude</code>, <code className="font-mono">codex</code>, or <code className="font-mono">opencode</code>)</li>
|
||||
<li>
|
||||
Voice LLM orchestration: hidden agent session using your configured provider (
|
||||
<code className="font-mono">claude</code>, <code className="font-mono">codex</code>, or{" "}
|
||||
<code className="font-mono">opencode</code>)
|
||||
</li>
|
||||
<li>Tooling path: MCP stdio bridge for voice tools and agent control</li>
|
||||
</ul>
|
||||
</section>
|
||||
@@ -48,16 +55,17 @@ function VoiceDocs() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Local Speech</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Local speech defaults to model IDs <code className="font-mono">parakeet-tdt-0.6b-v3-int8</code>{' '}
|
||||
(STT) and <code className="font-mono">kokoro-en-v0_19</code> (TTS, speaker 0 / voice 00).
|
||||
Local speech defaults to model IDs{" "}
|
||||
<code className="font-mono">parakeet-tdt-0.6b-v3-int8</code> (STT) and{" "}
|
||||
<code className="font-mono">kokoro-en-v0_19</code> (TTS, speaker 0 / voice 00).
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Missing models are downloaded at daemon startup into{' '}
|
||||
<code className="font-mono">$PASEO_HOME/models/local-speech</code>.
|
||||
Downloads happen only for missing files.
|
||||
Missing models are downloaded at daemon startup into{" "}
|
||||
<code className="font-mono">$PASEO_HOME/models/local-speech</code>. Downloads happen only
|
||||
for missing files.
|
||||
</p>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"version": 1,
|
||||
"features": {
|
||||
"dictation": { "stt": { "provider": "local", "model": "parakeet-tdt-0.6b-v3-int8" } },
|
||||
@@ -79,11 +87,12 @@ function VoiceDocs() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">OpenAI Speech Option</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You can switch dictation, voice STT, and voice TTS to OpenAI by setting provider fields to{' '}
|
||||
<code className="font-mono">openai</code> and providing <code className="font-mono">OPENAI_API_KEY</code>.
|
||||
You can switch dictation, voice STT, and voice TTS to OpenAI by setting provider fields to{" "}
|
||||
<code className="font-mono">openai</code> and providing{" "}
|
||||
<code className="font-mono">OPENAI_API_KEY</code>.
|
||||
</p>
|
||||
<pre className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto text-white/80">
|
||||
{`{
|
||||
{`{
|
||||
"version": 1,
|
||||
"features": {
|
||||
"dictation": { "stt": { "provider": "openai" } },
|
||||
@@ -102,22 +111,42 @@ function VoiceDocs() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Environment Variables</h2>
|
||||
<ul className="text-white/60 space-y-2 list-disc list-inside">
|
||||
<li><code className="font-mono">OPENAI_API_KEY</code> — OpenAI speech credentials</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LLM_PROVIDER</code> — voice agent provider override</li>
|
||||
<li><code className="font-mono">PASEO_LOCAL_MODELS_DIR</code> — local model storage directory</li>
|
||||
<li><code className="font-mono">PASEO_DICTATION_LOCAL_STT_MODEL</code> — local dictation STT model ID</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LOCAL_STT_MODEL</code>, <code className="font-mono">PASEO_VOICE_LOCAL_TTS_MODEL</code> — local voice STT/TTS model IDs</li>
|
||||
<li><code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEAKER_ID</code>, <code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEED</code> — optional local voice TTS tuning</li>
|
||||
<li>
|
||||
<code className="font-mono">OPENAI_API_KEY</code> — OpenAI speech credentials
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LLM_PROVIDER</code> — voice agent provider
|
||||
override
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_LOCAL_MODELS_DIR</code> — local model storage
|
||||
directory
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_DICTATION_LOCAL_STT_MODEL</code> — local dictation STT
|
||||
model ID
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_STT_MODEL</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_MODEL</code> — local voice STT/TTS
|
||||
model IDs
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEAKER_ID</code>,{" "}
|
||||
<code className="font-mono">PASEO_VOICE_LOCAL_TTS_SPEED</code> — optional local voice
|
||||
TTS tuning
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Operational Notes</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Realtime voice can launch and control agents. Treat voice prompts with the same care as direct
|
||||
agent instructions, especially when specifying working directories or destructive operations.
|
||||
Realtime voice can launch and control agents. Treat voice prompts with the same care as
|
||||
direct agent instructions, especially when specifying working directories or destructive
|
||||
operations.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { pageMeta } from '~/meta'
|
||||
import { createFileRoute } from "@tanstack/react-router";
|
||||
import { pageMeta } from "~/meta";
|
||||
|
||||
export const Route = createFileRoute('/docs/worktrees')({
|
||||
export const Route = createFileRoute("/docs/worktrees")({
|
||||
head: () => ({
|
||||
meta: pageMeta(
|
||||
'Git Worktrees - Paseo Docs',
|
||||
'Run agents in isolated git worktrees for parallel feature development.',
|
||||
"Git Worktrees - Paseo Docs",
|
||||
"Run agents in isolated git worktrees for parallel feature development.",
|
||||
),
|
||||
}),
|
||||
component: Worktrees,
|
||||
})
|
||||
});
|
||||
|
||||
function Code({ children }: { children: React.ReactNode }) {
|
||||
return (
|
||||
<div className="bg-card border border-border rounded-lg p-4 font-mono text-sm overflow-x-auto">
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function Worktrees() {
|
||||
@@ -25,8 +25,8 @@ function Worktrees() {
|
||||
<div>
|
||||
<h1 className="text-3xl font-medium font-title mb-4">Git Worktrees</h1>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Git worktrees let you have multiple working directories from the same repository.
|
||||
Paseo uses them to run agents in isolated branches without switching contexts.
|
||||
Git worktrees let you have multiple working directories from the same repository. Paseo
|
||||
uses them to run agents in isolated branches without switching contexts.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -34,14 +34,14 @@ function Worktrees() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Why worktrees?</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Without worktrees, running multiple agents on the same repo means they share the
|
||||
working directory. One agent's changes interfere with another's. You can't safely
|
||||
run parallel tasks.
|
||||
Without worktrees, running multiple agents on the same repo means they share the working
|
||||
directory. One agent's changes interfere with another's. You can't safely run parallel
|
||||
tasks.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
With worktrees, each agent gets its own directory and branch. They can work
|
||||
simultaneously without conflict. When an agent finishes, you review the diff,
|
||||
merge the branch, and archive the worktree.
|
||||
With worktrees, each agent gets its own directory and branch. They can work simultaneously
|
||||
without conflict. When an agent finishes, you review the diff, merge the branch, and
|
||||
archive the worktree.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -61,9 +61,9 @@ function Worktrees() {
|
||||
└── swift-hare/ # random slug`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The hash avoids collisions between repositories that share the same directory or
|
||||
remote name. Worktree directory names are random slugs — the branch name is
|
||||
separate and chosen when you first launch an agent in the worktree.
|
||||
The hash avoids collisions between repositories that share the same directory or remote
|
||||
name. Worktree directory names are random slugs — the branch name is separate and chosen
|
||||
when you first launch an agent in the worktree.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -71,12 +71,12 @@ function Worktrees() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Branches</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
When you create a worktree, Paseo generates a random directory name. The branch name
|
||||
is set when you first launch an agent — Paseo generates one automatically.
|
||||
When you create a worktree, Paseo generates a random directory name. The branch name is
|
||||
set when you first launch an agent — Paseo generates one automatically.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
This means the worktree directory and branch are independent. You can rename the
|
||||
branch later without affecting the worktree path.
|
||||
This means the worktree directory and branch are independent. You can rename the branch
|
||||
later without affecting the worktree path.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -84,14 +84,13 @@ function Worktrees() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Multiple agents per worktree</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You can launch multiple agents into the same worktree. They share the working
|
||||
directory and branch, which is useful when you want agents to collaborate on
|
||||
the same feature or when one agent hands off to another.
|
||||
You can launch multiple agents into the same worktree. They share the working directory
|
||||
and branch, which is useful when you want agents to collaborate on the same feature or
|
||||
when one agent hands off to another.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Be mindful of conflicts — agents working on the same files simultaneously can
|
||||
step on each other. This works best when agents have distinct responsibilities
|
||||
or run sequentially.
|
||||
Be mindful of conflicts — agents working on the same files simultaneously can step on each
|
||||
other. This works best when agents have distinct responsibilities or run sequentially.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -100,7 +99,7 @@ function Worktrees() {
|
||||
<h2 className="text-xl font-medium">Setup with paseo.json</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
When Paseo creates a worktree, it's a fresh checkout. Dependencies aren't installed,
|
||||
config files aren't copied. You can automate setup by creating a{' '}
|
||||
config files aren't copied. You can automate setup by creating a{" "}
|
||||
<code className="font-mono">paseo.json</code> file in your repository root:
|
||||
</p>
|
||||
<Code>
|
||||
@@ -114,14 +113,14 @@ function Worktrees() {
|
||||
}`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The <code className="font-mono">setup</code> array contains shell commands that run
|
||||
after the worktree is created. Use it to install dependencies, copy local config
|
||||
files, or run any other initialization.
|
||||
The <code className="font-mono">setup</code> array contains shell commands that run after
|
||||
the worktree is created. Use it to install dependencies, copy local config files, or run
|
||||
any other initialization.
|
||||
</p>
|
||||
<div className="bg-yellow-500/10 border border-yellow-500/30 rounded-lg p-4 text-white/80">
|
||||
<strong>Important:</strong> Setup commands come from{' '}
|
||||
<code className="font-mono">paseo.json</code> in the selected base branch. If you pick{' '}
|
||||
<code className="font-mono">main</code>, Paseo reads the committed file on{' '}
|
||||
<strong>Important:</strong> Setup commands come from{" "}
|
||||
<code className="font-mono">paseo.json</code> in the selected base branch. If you pick{" "}
|
||||
<code className="font-mono">main</code>, Paseo reads the committed file on{" "}
|
||||
<code className="font-mono">main</code>. Local or uncommitted changes in another branch
|
||||
are not used for that worktree.
|
||||
</div>
|
||||
@@ -139,7 +138,7 @@ function Worktrees() {
|
||||
path (original repository root)
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">$PASEO_ROOT_PATH</code> — legacy alias of{' '}
|
||||
<code className="font-mono">$PASEO_ROOT_PATH</code> — legacy alias of{" "}
|
||||
<code className="font-mono">$PASEO_SOURCE_CHECKOUT_PATH</code>
|
||||
</li>
|
||||
<li>
|
||||
@@ -149,7 +148,8 @@ function Worktrees() {
|
||||
<code className="font-mono">$PASEO_BRANCH_NAME</code> — the branch name created
|
||||
</li>
|
||||
<li>
|
||||
<code className="font-mono">$PASEO_WORKTREE_PORT</code> — an available local port for setup scripts
|
||||
<code className="font-mono">$PASEO_WORKTREE_PORT</code> — an available local port for
|
||||
setup scripts
|
||||
</li>
|
||||
</ul>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
@@ -211,47 +211,29 @@ function Worktrees() {
|
||||
{/* Workflow */}
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Workflow</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
The typical workflow is:
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">The typical workflow is:</p>
|
||||
<ol className="text-white/60 space-y-2 list-decimal list-inside">
|
||||
<li>
|
||||
Create a worktree — Paseo creates the directory and runs setup
|
||||
</li>
|
||||
<li>
|
||||
Launch an agent — Paseo creates or assigns a branch
|
||||
</li>
|
||||
<li>
|
||||
Agent works in isolation — changes stay in its worktree
|
||||
</li>
|
||||
<li>
|
||||
Review the diff — compare against the base branch
|
||||
</li>
|
||||
<li>
|
||||
Merge or discard — if approved, merge the branch; otherwise archive
|
||||
</li>
|
||||
<li>
|
||||
Archive the worktree — cleans up the directory and optionally the branch
|
||||
</li>
|
||||
<li>Create a worktree — Paseo creates the directory and runs setup</li>
|
||||
<li>Launch an agent — Paseo creates or assigns a branch</li>
|
||||
<li>Agent works in isolation — changes stay in its worktree</li>
|
||||
<li>Review the diff — compare against the base branch</li>
|
||||
<li>Merge or discard — if approved, merge the branch; otherwise archive</li>
|
||||
<li>Archive the worktree — cleans up the directory and optionally the branch</li>
|
||||
</ol>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You can run multiple agents in different worktrees simultaneously. Each worktree
|
||||
has its own branch and working directory.
|
||||
You can run multiple agents in different worktrees simultaneously. Each worktree has its
|
||||
own branch and working directory.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
{/* CLI reference */}
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">CLI reference</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Create an agent in a new worktree:
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">Create an agent in a new worktree:</p>
|
||||
<Code>
|
||||
<pre className="text-white/80">{`paseo run --worktree feature-auth --base main "implement auth"`}</pre>
|
||||
</Code>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
List all worktrees:
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">List all worktrees:</p>
|
||||
<Code>
|
||||
<pre className="text-white/80">{`paseo worktree ls`}</pre>
|
||||
</Code>
|
||||
@@ -267,14 +249,14 @@ function Worktrees() {
|
||||
<section className="space-y-4">
|
||||
<h2 className="text-xl font-medium">Metadata</h2>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
Paseo stores metadata in each worktree's git directory to track the base branch.
|
||||
This is used for diff operations and to know what branch to merge into.
|
||||
Paseo stores metadata in each worktree's git directory to track the base branch. This is
|
||||
used for diff operations and to know what branch to merge into.
|
||||
</p>
|
||||
<p className="text-white/60 leading-relaxed">
|
||||
You don't need to manage this manually — Paseo handles it when creating and
|
||||
archiving worktrees.
|
||||
You don't need to manage this manually — Paseo handles it when creating and archiving
|
||||
worktrees.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user