agent-trellis 0.7.0 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -153
- package/dist/adapters/claude-code.js +3 -2
- package/dist/adapters/codex.js +3 -2
- package/dist/adapters/jsonMcp.d.ts +3 -1
- package/dist/adapters/jsonMcp.js +18 -4
- package/dist/adapters/kimi-code.d.ts +21 -0
- package/dist/adapters/kimi-code.js +107 -0
- package/dist/adapters/kiro.js +3 -2
- package/dist/adapters/mcpPlan.d.ts +6 -1
- package/dist/adapters/mcpPlan.js +106 -8
- package/dist/adapters/pi.js +22 -3
- package/dist/adapters/symlinkPlan.d.ts +7 -0
- package/dist/adapters/symlinkPlan.js +16 -7
- package/dist/adapters/zcode.d.ts +21 -0
- package/dist/adapters/zcode.js +234 -0
- package/dist/cli.js +145 -29
- package/dist/commands/doctor.d.ts +7 -2
- package/dist/commands/doctor.js +40 -2
- package/dist/commands/init.d.ts +4 -2
- package/dist/commands/init.js +29 -13
- package/dist/commands/kimi.d.ts +16 -0
- package/dist/commands/kimi.js +64 -0
- package/dist/commands/manage.d.ts +39 -0
- package/dist/commands/manage.js +126 -0
- package/dist/commands/mcp.d.ts +77 -14
- package/dist/commands/mcp.js +169 -29
- package/dist/commands/mcpGateway.d.ts +6 -0
- package/dist/commands/mcpGateway.js +35 -14
- package/dist/commands/mcpImport.d.ts +46 -0
- package/dist/commands/mcpImport.js +359 -0
- package/dist/commands/memory.d.ts +17 -3
- package/dist/commands/memory.js +27 -8
- package/dist/commands/migrate.d.ts +16 -5
- package/dist/commands/migrate.js +93 -17
- package/dist/commands/onboard.d.ts +74 -2
- package/dist/commands/onboard.js +469 -71
- package/dist/commands/rollback.js +28 -2
- package/dist/commands/secretsAudit.js +4 -1
- package/dist/commands/skill.d.ts +52 -6
- package/dist/commands/skill.js +114 -15
- package/dist/commands/sync.js +5 -1
- package/dist/core/adapter.d.ts +11 -1
- package/dist/core/canonical.d.ts +15 -7
- package/dist/core/canonical.js +101 -13
- package/dist/core/capabilitySelection.d.ts +45 -0
- package/dist/core/capabilitySelection.js +124 -0
- package/dist/core/types.d.ts +25 -2
- package/dist/core/types.js +8 -0
- package/dist/lib/agentBridge.d.ts +169 -0
- package/dist/lib/agentBridge.js +367 -0
- package/dist/lib/agentBridgeProvider.d.ts +14 -0
- package/dist/lib/agentBridgeProvider.js +95 -0
- package/dist/lib/backup.d.ts +32 -0
- package/dist/lib/backup.js +20 -1
- package/dist/lib/builtinSkills.d.ts +2 -0
- package/dist/lib/builtinSkills.js +4 -0
- package/dist/lib/chatAgents.d.ts +42 -0
- package/dist/lib/chatAgents.js +59 -0
- package/dist/lib/cliMetadata.d.ts +1 -0
- package/dist/lib/cliMetadata.js +14 -0
- package/dist/lib/envVarNames.d.ts +3 -0
- package/dist/lib/envVarNames.js +19 -0
- package/dist/lib/gatewayBackend.d.ts +28 -0
- package/dist/lib/gatewayBackend.js +72 -1
- package/dist/lib/installAgent.d.ts +7 -5
- package/dist/lib/installAgent.js +4 -3
- package/dist/lib/mcpConnect.js +5 -1
- package/dist/lib/mcpMigrateRead.d.ts +2 -0
- package/dist/lib/mcpMigrateRead.js +22 -1
- package/dist/lib/mcpRuntime.d.ts +46 -0
- package/dist/lib/mcpRuntime.js +185 -0
- package/dist/lib/mcpStatusProvider.d.ts +10 -0
- package/dist/lib/mcpStatusProvider.js +25 -0
- package/dist/lib/mcpToolRegistry.d.ts +18 -0
- package/dist/lib/mcpToolRegistry.js +107 -14
- package/dist/lib/memoryGraph.d.ts +1 -1
- package/dist/lib/memoryGraph.js +9 -3
- package/dist/lib/memoryProvider.d.ts +58 -0
- package/dist/lib/memoryProvider.js +175 -0
- package/dist/lib/memoryStatus.d.ts +17 -0
- package/dist/lib/memoryStatus.js +88 -0
- package/dist/lib/nativeMemory.d.ts +19 -0
- package/dist/lib/nativeMemory.js +129 -0
- package/dist/lib/realHomeSnapshot.js +5 -0
- package/dist/lib/runtimeControlProvider.d.ts +16 -0
- package/dist/lib/runtimeControlProvider.js +170 -0
- package/dist/lib/secretEnv.d.ts +2 -1
- package/dist/lib/secretEnv.js +6 -2
- package/dist/lib/skillProvider.d.ts +13 -0
- package/dist/lib/skillProvider.js +210 -0
- package/dist/lib/taskProvider.d.ts +7 -0
- package/dist/lib/taskProvider.js +43 -0
- package/dist/lib/taskStore.d.ts +46 -0
- package/dist/lib/taskStore.js +156 -0
- package/dist/lib/terminalPicker.d.ts +23 -49
- package/dist/lib/terminalPicker.js +80 -218
- package/dist/lib/zcodeOwnership.d.ts +17 -0
- package/dist/lib/zcodeOwnership.js +37 -0
- package/dist/pi-bridge/bundle.js +476 -37
- package/dist/pi-bridge/index.js +42 -21
- package/dist/pi-bridge/schemaTranslate.d.ts +4 -8
- package/dist/pi-bridge/schemaTranslate.js +4 -8
- package/dist/probes/codex.d.ts +7 -0
- package/dist/probes/codex.js +37 -5
- package/dist/probes/kimi-code.d.ts +12 -0
- package/dist/probes/kimi-code.js +55 -0
- package/dist/probes/zcode.d.ts +32 -0
- package/dist/probes/zcode.js +140 -0
- package/dist/sdk.d.ts +1 -1
- package/docs/architecture.md +230 -28
- package/docs/assets/brand-v3/trellis-mark-v3-a.png +0 -0
- package/docs/assets/brand-v3/trellis-mark-v3-a.svg +10 -0
- package/docs/assets/poster-series-v3/README.md +60 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-en.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-en.svg +51 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-zh.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-zh.svg +51 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-en.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-en.svg +48 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-zh.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-zh.svg +48 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-en.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-en.svg +56 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-zh.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-zh.svg +56 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-en.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-en.svg +47 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-zh.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-zh.svg +47 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-en.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-en.svg +51 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-zh.png +0 -0
- package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-zh.svg +51 -0
- package/docs/getting-started.md +496 -42
- package/docs/overview.md +134 -0
- package/docs/overview.zh-CN.md +102 -0
- package/docs/research.md +59 -0
- package/docs/roadmap.md +11 -6
- package/docs/video/README.md +76 -0
- package/docs/video/build/audio/01-opening.aiff +0 -0
- package/docs/video/build/audio/01-opening.mp3 +0 -0
- package/docs/video/build/audio/02-pain.aiff +0 -0
- package/docs/video/build/audio/02-pain.mp3 +0 -0
- package/docs/video/build/audio/03-solution.aiff +0 -0
- package/docs/video/build/audio/03-solution.mp3 +0 -0
- package/docs/video/build/audio/04-install.aiff +0 -0
- package/docs/video/build/audio/04-install.mp3 +0 -0
- package/docs/video/build/audio/04-setup.mp3 +0 -0
- package/docs/video/build/audio/05-dryrun.mp3 +0 -0
- package/docs/video/build/audio/05-init.aiff +0 -0
- package/docs/video/build/audio/05-init.mp3 +0 -0
- package/docs/video/build/audio/05-interactive.mp3 +0 -0
- package/docs/video/build/audio/06-dryrun.aiff +0 -0
- package/docs/video/build/audio/06-dryrun.mp3 +0 -0
- package/docs/video/build/audio/06-onboard.mp3 +0 -0
- package/docs/video/build/audio/06-run.mp3 +0 -0
- package/docs/video/build/audio/07-onboard.aiff +0 -0
- package/docs/video/build/audio/07-onboard.mp3 +0 -0
- package/docs/video/build/audio/07-verify.mp3 +0 -0
- package/docs/video/build/audio/08-closing.mp3 +0 -0
- package/docs/video/build/audio/08-doctor.aiff +0 -0
- package/docs/video/build/audio/08-doctor.mp3 +0 -0
- package/docs/video/build/audio/09-rollback.aiff +0 -0
- package/docs/video/build/audio/09-rollback.mp3 +0 -0
- package/docs/video/build/audio/10-principles.aiff +0 -0
- package/docs/video/build/audio/10-principles.mp3 +0 -0
- package/docs/video/build/audio/11-closing.aiff +0 -0
- package/docs/video/build/audio/11-closing.mp3 +0 -0
- package/docs/video/build/frames/01-opening-0.png +0 -0
- package/docs/video/build/frames/02-pain-1.png +0 -0
- package/docs/video/build/frames/02-pain-2.png +0 -0
- package/docs/video/build/frames/03-solution-3.png +0 -0
- package/docs/video/build/frames/04-install-4.png +0 -0
- package/docs/video/build/frames/04-setup-4.png +0 -0
- package/docs/video/build/frames/04-setup-5.png +0 -0
- package/docs/video/build/frames/05-dryrun-6.png +0 -0
- package/docs/video/build/frames/05-init-5.png +0 -0
- package/docs/video/build/frames/05-interactive-5.png +0 -0
- package/docs/video/build/frames/05-interactive-6.png +0 -0
- package/docs/video/build/frames/06-dryrun-6.png +0 -0
- package/docs/video/build/frames/06-dryrun-7.png +0 -0
- package/docs/video/build/frames/06-onboard-7.png +0 -0
- package/docs/video/build/frames/06-onboard-8.png +0 -0
- package/docs/video/build/frames/06-run-7.png +0 -0
- package/docs/video/build/frames/06-run-8.png +0 -0
- package/docs/video/build/frames/07-onboard-10.png +0 -0
- package/docs/video/build/frames/07-onboard-7.png +0 -0
- package/docs/video/build/frames/07-onboard-8.png +0 -0
- package/docs/video/build/frames/07-onboard-9.png +0 -0
- package/docs/video/build/frames/07-verify-10.png +0 -0
- package/docs/video/build/frames/07-verify-8.png +0 -0
- package/docs/video/build/frames/07-verify-9.png +0 -0
- package/docs/video/build/frames/08-closing-10.png +0 -0
- package/docs/video/build/frames/08-closing-11.png +0 -0
- package/docs/video/build/frames/08-doctor-11.png +0 -0
- package/docs/video/build/frames/08-doctor-9.png +0 -0
- package/docs/video/build/frames/09-rollback-10.png +0 -0
- package/docs/video/build/frames/09-rollback-12.png +0 -0
- package/docs/video/build/frames/10-principles-11.png +0 -0
- package/docs/video/build/frames/10-principles-13.png +0 -0
- package/docs/video/build/frames/11-closing-12.png +0 -0
- package/docs/video/build/frames/11-closing-14.png +0 -0
- package/docs/video/build/segments/01-opening.mp4 +0 -0
- package/docs/video/build/segments/01-opening.txt +3 -0
- package/docs/video/build/segments/02-pain.mp4 +0 -0
- package/docs/video/build/segments/02-pain.txt +5 -0
- package/docs/video/build/segments/03-solution.mp4 +0 -0
- package/docs/video/build/segments/03-solution.txt +3 -0
- package/docs/video/build/segments/04-install.mp4 +0 -0
- package/docs/video/build/segments/04-install.txt +3 -0
- package/docs/video/build/segments/04-setup.mp4 +0 -0
- package/docs/video/build/segments/04-setup.txt +3 -0
- package/docs/video/build/segments/05-dryrun.mp4 +0 -0
- package/docs/video/build/segments/05-dryrun.txt +3 -0
- package/docs/video/build/segments/05-init.mp4 +0 -0
- package/docs/video/build/segments/05-init.txt +3 -0
- package/docs/video/build/segments/05-interactive.mp4 +0 -0
- package/docs/video/build/segments/05-interactive.txt +5 -0
- package/docs/video/build/segments/06-dryrun.mp4 +0 -0
- package/docs/video/build/segments/06-dryrun.txt +3 -0
- package/docs/video/build/segments/06-onboard.mp4 +0 -0
- package/docs/video/build/segments/06-onboard.txt +5 -0
- package/docs/video/build/segments/06-run.mp4 +0 -0
- package/docs/video/build/segments/06-run.txt +3 -0
- package/docs/video/build/segments/07-onboard.mp4 +0 -0
- package/docs/video/build/segments/07-onboard.txt +5 -0
- package/docs/video/build/segments/07-verify.mp4 +0 -0
- package/docs/video/build/segments/07-verify.txt +5 -0
- package/docs/video/build/segments/08-closing.mp4 +0 -0
- package/docs/video/build/segments/08-closing.txt +3 -0
- package/docs/video/build/segments/08-doctor.mp4 +0 -0
- package/docs/video/build/segments/08-doctor.txt +3 -0
- package/docs/video/build/segments/09-rollback.mp4 +0 -0
- package/docs/video/build/segments/09-rollback.txt +3 -0
- package/docs/video/build/segments/10-principles.mp4 +0 -0
- package/docs/video/build/segments/10-principles.txt +3 -0
- package/docs/video/build/segments/11-closing.mp4 +0 -0
- package/docs/video/build/segments/11-closing.txt +3 -0
- package/docs/video/build/segments/final.txt +8 -0
- package/docs/video/build-ai/audio/01-hook.mp3 +0 -0
- package/docs/video/build-ai/audio/02-pain.mp3 +0 -0
- package/docs/video/build-ai/audio/03-solution.mp3 +0 -0
- package/docs/video/build-ai/audio/04-how.mp3 +0 -0
- package/docs/video/build-ai/audio/05-safe.mp3 +0 -0
- package/docs/video/build-ai/audio/06-closing.mp3 +0 -0
- package/docs/video/build-ai/clips/01-hook.mp4 +0 -0
- package/docs/video/build-ai/clips/02-pain.mp4 +0 -0
- package/docs/video/build-ai/clips/03-solution.mp4 +0 -0
- package/docs/video/build-ai/clips/04-how.mp4 +0 -0
- package/docs/video/build-ai/clips/05-safe.mp4 +0 -0
- package/docs/video/build-ai/clips/06-closing.mp4 +0 -0
- package/docs/video/build-ai/first-frame-02-pain.png +0 -0
- package/docs/video/build-ai/first-frame-03-solution.png +0 -0
- package/docs/video/build-ai/first-frame-04-how.png +0 -0
- package/docs/video/build-ai/first-frame-05-safe.png +0 -0
- package/docs/video/build-ai/segments/01-hook.caption.txt +2 -0
- package/docs/video/build-ai/segments/01-hook.mp4 +0 -0
- package/docs/video/build-ai/segments/02-pain.mp4 +0 -0
- package/docs/video/build-ai/segments/03-solution.mp4 +0 -0
- package/docs/video/build-ai/segments/04-how.mp4 +0 -0
- package/docs/video/build-ai/segments/05-safe.mp4 +0 -0
- package/docs/video/build-ai/segments/06-closing.mp4 +0 -0
- package/docs/video/build-ai/segments/cap-01-hook.png +0 -0
- package/docs/video/build-ai/segments/cap-02-pain.png +0 -0
- package/docs/video/build-ai/segments/cap-03-solution.png +0 -0
- package/docs/video/build-ai/segments/cap-04-how.png +0 -0
- package/docs/video/build-ai/segments/cap-05-safe.png +0 -0
- package/docs/video/build-ai/segments/cap-06-closing.png +0 -0
- package/docs/video/build-ai/segments/final.txt +6 -0
- package/docs/video/build-posters/audio/01-hook.mp3 +0 -0
- package/docs/video/build-posters/audio/02-pain.mp3 +0 -0
- package/docs/video/build-posters/audio/03-solution.mp3 +0 -0
- package/docs/video/build-posters/audio/04-how.mp3 +0 -0
- package/docs/video/build-posters/audio/05-safe.mp3 +0 -0
- package/docs/video/build-posters/audio/06-closing.mp3 +0 -0
- package/docs/video/build-posters/cap-01-hook.png +0 -0
- package/docs/video/build-posters/cap-02-pain.png +0 -0
- package/docs/video/build-posters/cap-03-solution.png +0 -0
- package/docs/video/build-posters/cap-04-how.png +0 -0
- package/docs/video/build-posters/cap-05-safe.png +0 -0
- package/docs/video/build-posters/cap-06-closing.png +0 -0
- package/docs/video/build-posters/card-01-hook.png +0 -0
- package/docs/video/build-posters/card-06-closing.png +0 -0
- package/docs/video/build-posters/segments/01-hook.mp4 +0 -0
- package/docs/video/build-posters/segments/02-pain.mp4 +0 -0
- package/docs/video/build-posters/segments/03-solution.mp4 +0 -0
- package/docs/video/build-posters/segments/04-how.mp4 +0 -0
- package/docs/video/build-posters/segments/05-safe.mp4 +0 -0
- package/docs/video/build-posters/segments/06-closing.mp4 +0 -0
- package/docs/video/build-posters/segments/final.txt +6 -0
- package/docs/video/generate-video-ai.mjs +334 -0
- package/docs/video/generate-video-posters.mjs +204 -0
- package/docs/video/generate-video.mjs +426 -0
- package/docs/video/outline.zh-CN.md +102 -0
- package/docs/video/trellis-demo-video-ai.mp4 +0 -0
- package/docs/video/trellis-demo-video.mp4 +0 -0
- package/docs/video/voiceover.zh-CN.md +49 -0
- package/package.json +6 -2
- package/schema/builtin-skills/trellis-runtime/SKILL.md +117 -0
- package/schema/capability-selection.example.yaml +23 -0
- package/schema/scope.example.yaml +1 -1
- package/schema/servers.example.yaml +15 -1
package/docs/architecture.md
CHANGED
|
@@ -18,7 +18,7 @@ required reading for that.
|
|
|
18
18
|
│ trellis sync / trellis doctor
|
|
19
19
|
┌───────┼────────┬─────────────┬──────────────┐
|
|
20
20
|
▼ ▼ ▼ ▼
|
|
21
|
-
Claude Code Codex Kiro pi
|
|
21
|
+
Claude Code Codex Kiro pi Kimi Code ZCode
|
|
22
22
|
(symlink adapter) (incremental (symlink adapter) (bridge
|
|
23
23
|
TOML writer) extension)
|
|
24
24
|
```
|
|
@@ -57,7 +57,7 @@ Aligned to the `.agents Protocol` draft, extended where the draft is silent:
|
|
|
57
57
|
## Global vs. workspace scope
|
|
58
58
|
|
|
59
59
|
**Global only, for now.** Trellis manages `~/.trellis` — one canonical
|
|
60
|
-
source per machine, applied to that machine's
|
|
60
|
+
source per machine, applied to that machine's six supported agents. It does not yet
|
|
61
61
|
read or merge a project-local `.trellis/` in a specific repo.
|
|
62
62
|
|
|
63
63
|
The `.agents Protocol` draft (see `research.md`) describes a two-layer
|
|
@@ -72,11 +72,11 @@ that's scope creep against this section, not a natural extension.
|
|
|
72
72
|
|
|
73
73
|
## Private / agent-specific capabilities
|
|
74
74
|
|
|
75
|
-
Not everything belongs to all
|
|
75
|
+
Not everything belongs to all six agents. A skill built around Claude
|
|
76
76
|
Code's Task-based subagent delegation has no equivalent to delegate to on
|
|
77
77
|
Codex; an MCP server might only make sense for one agent's workflow. Every
|
|
78
78
|
scopable item — skill, subagent profile, memory entry, MCP server —
|
|
79
|
-
defaults to "shared with all
|
|
79
|
+
defaults to "shared with all managed agents," and can be restricted with an explicit
|
|
80
80
|
`scope` (skills/agents/memories) or inline `agents:` (MCP servers, see
|
|
81
81
|
below). Restriction is the exception you declare, not something you
|
|
82
82
|
configure for the common case.
|
|
@@ -173,8 +173,22 @@ the hub instead — meaningfully less code and one fewer class of failure
|
|
|
173
173
|
the project that is an agent runtime extension, not a config generator,
|
|
174
174
|
regardless of hub mode.
|
|
175
175
|
|
|
176
|
+
The pi bridge symlink follows the currently executing Trellis installation.
|
|
177
|
+
When switching from a checkout to a global package (or between installation
|
|
178
|
+
roots), sync can repair an outside-root link only if its target ends in
|
|
179
|
+
`dist/pi-bridge/bundle.js` and its bytes match the current bridge bundle.
|
|
180
|
+
The repair is backed up, including the old symlink target. Modified, unrelated,
|
|
181
|
+
or dangling outside-root links remain conflicts; this exception applies only
|
|
182
|
+
to the bridge extension, not to Skill or instruction symlinks.
|
|
183
|
+
|
|
176
184
|
## MCP hub mode
|
|
177
185
|
|
|
186
|
+
For onboarding, the short rule is: **Gateway is the recommended local
|
|
187
|
+
Trellis mode; Hub is for an already-running external service**. Gateway is a
|
|
188
|
+
local stdio subprocess that Trellis starts for the Agent session. Hub is an
|
|
189
|
+
HTTP endpoint operated outside this process; Trellis only writes the URL and
|
|
190
|
+
does not deploy, configure, or health-manage that Hub.
|
|
191
|
+
|
|
178
192
|
Every agent's MCP surface can be either N direct server definitions
|
|
179
193
|
(default) or one static entry pointing at a single HTTP endpoint — `mcp.hub.url`
|
|
180
194
|
in `mcp/servers.yaml` is the field, but the supported way to set it is
|
|
@@ -197,7 +211,7 @@ to the code writing one entry that points at it.
|
|
|
197
211
|
- Every adapter writes ONE entry instead of N. This is most of the value:
|
|
198
212
|
adding a new backend server means editing wherever the hub's own config
|
|
199
213
|
lives (this project doesn't prescribe that either) and never touching
|
|
200
|
-
any of the
|
|
214
|
+
any of the five agents' configs or restarting them, if the hub supports
|
|
201
215
|
live reload (mcp-hub does, via SSE).
|
|
202
216
|
- The collision check against `known_host_injected` (docs/research.md
|
|
203
217
|
§"Codex — three hard constraints") shrinks to checking one name instead
|
|
@@ -245,23 +259,29 @@ Codex's `codex mcp login`/`logout` pair, Kiro's `oauth`/`oauthScopes`
|
|
|
245
259
|
fields — and pi, whose bridge is Trellis's own code, simply couldn't
|
|
246
260
|
reach such a server at all.
|
|
247
261
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
262
|
+
Gateway mode does not automatically take ownership of OAuth servers. Mark a
|
|
263
|
+
server explicitly with `auth: oauth` (or `trellis mcp set <name> --auth oauth`)
|
|
264
|
+
and gateway planning keeps it direct. This preserves the native Agent OAuth
|
|
265
|
+
flow for Claude Code/Codex/Kiro; Pi's bridge is the client for its direct OAuth
|
|
266
|
+
connection and may use Trellis's own OAuth store. Trellis never infers this
|
|
267
|
+
classification from a URL or a transient 401.
|
|
268
|
+
|
|
269
|
+
Trellis still implements the client half itself — discovery (RFC 8414 /
|
|
270
|
+
RFC 9728), dynamic client registration (RFC 7591), authorization code with
|
|
271
|
+
PKCE S256 (RFC 7636), and the refresh grant — in `src/lib/oauth/`, but that
|
|
272
|
+
path is currently used for Pi/direct bridge connections rather than silently
|
|
273
|
+
replacing native Agent authorization.
|
|
254
274
|
|
|
255
275
|
Two rules shape it, both from the constraint that the gateway is spawned
|
|
256
276
|
silently by an agent with no terminal attached:
|
|
257
277
|
|
|
258
|
-
- **Only
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
278
|
+
- **Only an explicit human authorization command opens a browser.** Native
|
|
279
|
+
clients use their own login command for direct OAuth entries. Pi's direct
|
|
280
|
+
bridge uses `trellis mcp auth <server>`. The gateway never initiates an
|
|
281
|
+
interactive flow and never connects an OAuth-marked server.
|
|
262
282
|
- **Refreshing is silent, and serialized by a lock.** A `refresh_token`
|
|
263
|
-
grant needs neither a browser nor a callback, so the
|
|
264
|
-
at connect time. The lock (`~/.trellis/mcp/oauth/<name>.lock`) exists
|
|
283
|
+
grant needs neither a browser nor a callback, so the Pi direct bridge can
|
|
284
|
+
do it at connect time. The lock (`~/.trellis/mcp/oauth/<name>.lock`) exists
|
|
265
285
|
because most authorization servers rotate the refresh token and
|
|
266
286
|
invalidate its predecessor — two concurrent refreshes would leave one
|
|
267
287
|
party holding a credential that is already dead.
|
|
@@ -272,8 +292,9 @@ mode 0600, never in `servers.yaml` and never in the OS keychain (macOS's
|
|
|
272
292
|
non-interactive, no-GUI-session context the gateway runs in — measured,
|
|
273
293
|
not assumed).
|
|
274
294
|
|
|
275
|
-
In direct mode nothing here
|
|
276
|
-
|
|
295
|
+
In direct mode nothing here changes: each agent keeps using its own native
|
|
296
|
+
OAuth flow. In gateway mode, an OAuth-marked server is also kept direct; only
|
|
297
|
+
ordinary MCP servers enter the gateway.
|
|
277
298
|
|
|
278
299
|
## MCP gateway mode
|
|
279
300
|
|
|
@@ -311,15 +332,25 @@ true rather than aspirational:
|
|
|
311
332
|
would have written for that agent (same `resolveMcpPlan`, so per-server
|
|
312
333
|
`agents:` scope, `enabled: false`, host-injected collisions,
|
|
313
334
|
literal-secret refusals and unresolved `env` names all behave
|
|
314
|
-
identically), connects each one, and exposes their tools
|
|
315
|
-
|
|
335
|
+
identically), connects each one, and exposes their tools through the shared
|
|
336
|
+
Agent-safe name allocator. Names contain only `[A-Za-z0-9_-]` and are at most
|
|
337
|
+
64 characters; unique short names stay short, while duplicate names retain a
|
|
338
|
+
normalized `<server>__<tool>` identity. Secrets resolve through
|
|
339
|
+
`resolveSecretEnv` exactly as
|
|
316
340
|
in direct mode — the gateway introduces no second path by which a value
|
|
317
341
|
could reach disk.
|
|
318
342
|
|
|
319
343
|
**What it changes for the agents:** Codex's single-`bearer_token_env_var`
|
|
320
344
|
limitation stops applying, because Codex no longer receives any server's
|
|
321
|
-
`headers` — the gateway holds them.
|
|
322
|
-
|
|
345
|
+
`headers` — the gateway holds them. OAuth-marked servers are intentionally
|
|
346
|
+
kept direct; ordinary remote servers remain shared through the gateway. An
|
|
347
|
+
upstream tool keeps its original name when that name is unique and longer than
|
|
348
|
+
the short-name threshold; generic short names receive a compact
|
|
349
|
+
`<server>__<tool>` prefix even when unique. A tool already carrying its source
|
|
350
|
+
prefix is not repeated. Dotted or otherwise invalid names are normalized, and long names
|
|
351
|
+
receive a deterministic hash suffix within the 64-character budget. If
|
|
352
|
+
normalized names still collide, Trellis adds a stable suffix instead of
|
|
353
|
+
dropping a tool.
|
|
323
354
|
|
|
324
355
|
**The seam.** `src/commands/mcpGateway.ts` depends on a `GatewayBackend`
|
|
325
356
|
interface and nothing below it — never a connection, transport, or
|
|
@@ -332,12 +363,117 @@ substitution at one construction site: the entry written into each
|
|
|
332
363
|
agent's config is identical either way, so converging later requires no
|
|
333
364
|
re-sync and nothing the user notices.
|
|
334
365
|
|
|
366
|
+
## MCP Runtime direction
|
|
367
|
+
|
|
368
|
+
Gateway mode is the first consumer of a broader runtime shape. The runtime
|
|
369
|
+
edge is available as `trellis mcp-runtime --agent <id>`. Existing
|
|
370
|
+
`trellis mcp-gateway --agent <id>` entries are a compatibility alias and now
|
|
371
|
+
use the same provider registry. Both edges can expose Trellis-owned
|
|
372
|
+
capabilities and selected upstream MCP capabilities:
|
|
373
|
+
|
|
374
|
+
```text
|
|
375
|
+
Agent
|
|
376
|
+
│ one MCP connection
|
|
377
|
+
▼
|
|
378
|
+
Trellis MCP Runtime
|
|
379
|
+
├─ BuiltinRegistry
|
|
380
|
+
│ ├─ SkillProvider (read/search canonical skills)
|
|
381
|
+
│ ├─ RuntimeMemoryProvider
|
|
382
|
+
│ │ └─ CanonicalMemoryProvider (read-only canonical Markdown)
|
|
383
|
+
│ └─ StatusProvider (future read-only diagnostics)
|
|
384
|
+
└─ UpstreamProvider
|
|
385
|
+
└─ existing GatewayBackend / future RemoteBackend
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
The runtime is a protocol edge; providers are the capability boundary. A
|
|
389
|
+
provider may expose tools, resources, prompts, or a combination. The current
|
|
390
|
+
`GatewayBackend` remains the upstream tool aggregation implementation and is
|
|
391
|
+
mounted as an `UpstreamProvider`, so connection, OAuth, timeout, namespace,
|
|
392
|
+
and cleanup logic stay in one place.
|
|
393
|
+
|
|
394
|
+
Native skills remain the default delivery. Runtime MCP delivery is configured
|
|
395
|
+
per agent under `mcp.runtime.delivery` and supports `native`, `mcp`, or
|
|
396
|
+
`both`. The built-in providers are intentionally read-only and scope-filtered:
|
|
397
|
+
SkillProvider reads canonical skills, while RuntimeMemoryProvider adapts a
|
|
398
|
+
CanonicalMemoryProvider that reads canonical Markdown memories through
|
|
399
|
+
`trellis.memory.search`, `trellis.memory.read`, and
|
|
400
|
+
`trellis://memories/<name>.md`. Neither executes scripts or mutates canonical
|
|
401
|
+
state. When the documented `memory` MCP backend is enabled, Agent-created
|
|
402
|
+
entities and observations are written through that upstream MCP server; the
|
|
403
|
+
Runtime provider does not duplicate its graph protocol. `trellis memory
|
|
404
|
+
extract` is the explicit, conflict-safe graph-to-canonical path. A future
|
|
405
|
+
local-graph/OpenViking source can implement the same MemoryProvider contract,
|
|
406
|
+
and native/private Agent stores are never scraped implicitly.
|
|
407
|
+
|
|
408
|
+
`trellis.runtime.status` reports Memory readiness separately: backend
|
|
409
|
+
configuration, graph existence/readiness, canonical count, write authority,
|
|
410
|
+
and which managed Agents receive the shared route. This prevents an empty
|
|
411
|
+
canonical directory from being mistaken for a missing or unusable backend.
|
|
412
|
+
|
|
413
|
+
Onboarding keeps two Memory decisions independent:
|
|
414
|
+
|
|
415
|
+
- `--memory-migrate on|off` imports supported native Markdown memory into
|
|
416
|
+
canonical `memories/*.md`.
|
|
417
|
+
- `--memory on|off` enables the shared Memory MCP backend and graph.
|
|
418
|
+
|
|
419
|
+
The first adapter is Claude Code's exact current-workspace project-memory
|
|
420
|
+
directory. Kimi Code and pi session stores, and Kiro databases, are reported as
|
|
421
|
+
unsupported until a format-specific adapter is reviewed; Trellis does not
|
|
422
|
+
interpret sessions or caches as memory.
|
|
423
|
+
|
|
424
|
+
Kimi Code is Runtime-first. Its adapter writes one `trellis` entry to
|
|
425
|
+
`~/.kimi-code/mcp.json`; it does not copy canonical Skills into
|
|
426
|
+
`~/.kimi-code/skills` when delivery is `mcp`. Use `trellis kimi` for this mode:
|
|
427
|
+
the launcher passes Kimi's documented `--skills-dir` override an empty
|
|
428
|
+
temporary directory, preventing Kimi's automatic `~/.agents/skills` discovery
|
|
429
|
+
from duplicating the Runtime SkillProvider. Kimi's native mode remains
|
|
430
|
+
available when delivery is `native` or `both`.
|
|
431
|
+
|
|
432
|
+
Kimi's user MCP registry is `~/.kimi-code/mcp.json`; the adapter preserves
|
|
433
|
+
unowned entries and uses the existing MCP ownership ledger for the one entry
|
|
434
|
+
Trellis owns. The Kimi CLI itself remains responsible for login and OAuth.
|
|
435
|
+
|
|
436
|
+
## Built-in Trellis Skill lifecycle
|
|
437
|
+
|
|
438
|
+
`schema/builtin-skills/trellis-runtime/SKILL.md` is part of the Trellis
|
|
439
|
+
package, not a user-specific copy. `trellis init` bootstraps it into the
|
|
440
|
+
canonical source at `~/.trellis/skills/trellis-runtime/SKILL.md`; subsequent
|
|
441
|
+
changes are made once there and distributed through the normal adapter path.
|
|
442
|
+
|
|
443
|
+
The Skill has two contracts:
|
|
444
|
+
|
|
445
|
+
- **Takeover contract:** describe the safe operator flow — inspect, dry-run,
|
|
446
|
+
choose the migration source and managed boundary, select capabilities,
|
|
447
|
+
authorize OAuth, sync, audit, verify, and rollback. This is a procedure for
|
|
448
|
+
the human or an Agent assisting the human; it is not a license for an Agent
|
|
449
|
+
to silently rewrite native configuration.
|
|
450
|
+
- **Runtime contract:** describe how a managed Agent consumes
|
|
451
|
+
`SkillProvider`, `RuntimeMemoryProvider`, the instruction provider, status
|
|
452
|
+
providers, and task handoff providers through the current MCP edge.
|
|
453
|
+
|
|
454
|
+
Delivery determines how the second contract reaches an Agent:
|
|
455
|
+
|
|
456
|
+
| Delivery | Projection | Runtime Skill source |
|
|
457
|
+
| --- | --- | --- |
|
|
458
|
+
| `native` | Trellis-owned native symlink | Agent's native Skill discovery |
|
|
459
|
+
| `mcp` | No native Trellis Skill projection | `SkillProvider` through `trellis mcp-runtime` |
|
|
460
|
+
| `both` | Native projection plus Runtime entry | Both, intentionally during compatibility or transition |
|
|
461
|
+
|
|
462
|
+
This keeps takeover instructions and post-takeover capability instructions in
|
|
463
|
+
one versioned Skill while preserving the security boundary: Runtime providers
|
|
464
|
+
are external context, native instructions remain authoritative at startup,
|
|
465
|
+
and task mutations require explicit confirmation. The MCP client's generated
|
|
466
|
+
namespace (for example `mcp__trellis__skills_search`) is not part of the
|
|
467
|
+
portable Skill contract.
|
|
468
|
+
|
|
335
469
|
## What Trellis explicitly does not build
|
|
336
470
|
|
|
337
471
|
- A resident MCP gateway daemon. Gateway mode above is a per-session
|
|
338
472
|
subprocess with no lifecycle; hub mode points at something you operate.
|
|
339
473
|
Neither is a service Trellis starts, supervises, or keeps running.
|
|
340
|
-
- A memory backend (
|
|
474
|
+
- A semantic/external memory backend (the built-in provider only exposes
|
|
475
|
+
read-only canonical Markdown; the default graph backend remains
|
|
476
|
+
`@modelcontextprotocol/server-memory`,
|
|
341
477
|
turned on with `trellis onboard --memory on` (trellis-onboard-mcp-mode)
|
|
342
478
|
rather than hand-editing `servers.yaml`, documented in
|
|
343
479
|
`schema/servers.example.yaml`; mem0/OpenMemory and totalrecallai-class
|
|
@@ -347,8 +483,12 @@ re-sync and nothing the user notices.
|
|
|
347
483
|
provides — `~/.config/agent-env/secrets.env`, 1Password's `op run`,
|
|
348
484
|
anything that populates `process.env` before an adapter's generated
|
|
349
485
|
command runs)
|
|
350
|
-
- A GUI
|
|
351
|
-
|
|
486
|
+
- A GUI is now `@trellis/gui` — P10 in the roadmap, not P5 (P5 is
|
|
487
|
+
`@trellis/sdk`, the read-only API the GUI's own read views could have
|
|
488
|
+
used but didn't, per `openspec/changes/trellis-gui/design.md` Decision
|
|
489
|
+
1 — the GUI's sidecar imports internal command modules directly
|
|
490
|
+
instead, to reuse write/backup mechanics `@trellis/sdk`'s read-only
|
|
491
|
+
barrel deliberately excludes)
|
|
352
492
|
|
|
353
493
|
## MCP handshake probing is opt-in, not default
|
|
354
494
|
|
|
@@ -419,6 +559,53 @@ once; it is never where you repeatedly verify against it.
|
|
|
419
559
|
```
|
|
420
560
|
scripts/sandbox.sh # interactive shell in the sandbox
|
|
421
561
|
scripts/sandbox.sh npm run dev doctor # run a command in the sandbox
|
|
562
|
+
scripts/sandbox.sh --runtime # divergent multi-agent Runtime lab
|
|
563
|
+
scripts/sandbox.sh --migration # Kiro -> Codex post-migration lab
|
|
564
|
+
scripts/sandbox.sh --management # steady-state unified management lab
|
|
565
|
+
scripts/sandbox.sh --failure # hanging-upstream isolation lab
|
|
566
|
+
scripts/sandbox-matrix.sh # run the full scenario matrix
|
|
567
|
+
scripts/agent-sandbox.sh # real Codex/Claude/Kiro/pi/Kimi CLI config smoke
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
`agent-sandbox.sh` 默认使用一次性 HOME。需要进行授权时,显式使用专用
|
|
571
|
+
Docker volume(默认名为 `trellis-agent-auth-home`):
|
|
572
|
+
|
|
573
|
+
如果宿主机已经登录 Codex 或 pi,可以显式复用单个认证文件:
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
scripts/agent-sandbox.sh --host-auth codex
|
|
577
|
+
scripts/agent-sandbox.sh --host-auth pi
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
这两个命令只读取宿主机对应的 `auth.json`,不读取整个 agent 配置目录。
|
|
581
|
+
|
|
582
|
+
```
|
|
583
|
+
scripts/agent-sandbox.sh --login codex
|
|
584
|
+
scripts/agent-sandbox.sh --login claude
|
|
585
|
+
scripts/agent-sandbox.sh --login kiro
|
|
586
|
+
scripts/agent-sandbox.sh --status codex
|
|
587
|
+
scripts/agent-sandbox.sh --status claude
|
|
588
|
+
scripts/agent-sandbox.sh --status kiro
|
|
589
|
+
scripts/agent-sandbox.sh --auth codex exec --help
|
|
590
|
+
scripts/agent-sandbox.sh --auth claude -p --help
|
|
591
|
+
scripts/agent-sandbox.sh --prepare
|
|
592
|
+
scripts/agent-sandbox.sh --host-auth codex
|
|
593
|
+
scripts/agent-sandbox.sh --host-auth pi
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
授权只写入这个 Docker volume,不会复制宿主机的登录态,也不会进入
|
|
597
|
+
Git、镜像或 fixture。`--login` 会分别执行真实 agent 的登录命令:
|
|
598
|
+
Codex 使用 device auth,Claude Code 使用 Claude subscription 登录,
|
|
599
|
+
Kiro CLI 使用 free license 的 device flow。Kiro 在未登录时会明确拒绝
|
|
600
|
+
`mcp list`,这是预期的授权前置条件。需要清空授权 volume 时,应由用户
|
|
601
|
+
显式执行 `docker volume rm <volume-name>`;Trellis 不会自动删除它。
|
|
602
|
+
|
|
603
|
+
授权后若要在同一登录态中运行真实 agent,使用 `--auth` 前缀,例如:
|
|
604
|
+
|
|
605
|
+
```
|
|
606
|
+
scripts/agent-sandbox.sh --prepare
|
|
607
|
+
scripts/agent-sandbox.sh --auth codex exec ...
|
|
608
|
+
scripts/agent-sandbox.sh --auth claude -p ...
|
|
422
609
|
```
|
|
423
610
|
|
|
424
611
|
Backed by OrbStack (this machine's Docker context — a Mac-native,
|
|
@@ -449,5 +636,20 @@ known findings, not just to look plausible:
|
|
|
449
636
|
exercise the case-sensitivity check.
|
|
450
637
|
- `test/fixtures/sample-mcp-server.js` — a minimal real MCP server (reads
|
|
451
638
|
`initialize` over stdio, replies with fixed `serverInfo`) so
|
|
452
|
-
|
|
453
|
-
|
|
639
|
+
`probeMcpServer` has something deterministic to handshake against inside
|
|
640
|
+
the container without depending on a real npm package or network access.
|
|
641
|
+
|
|
642
|
+
For the MCP Runtime phase, the sandbox has a separate intentionally
|
|
643
|
+
divergent fixture rather than expanding the baseline one:
|
|
644
|
+
|
|
645
|
+
```
|
|
646
|
+
scripts/sandbox.sh --runtime
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
This scenario gives Claude Code, Codex, Kiro, pi, and Kimi Code different native
|
|
650
|
+
skills, instructions, and MCP entries; adds canonical scope, per-agent
|
|
651
|
+
direct/gateway routes, `native`/`mcp`/`both` delivery, a deliberate
|
|
652
|
+
host-injected collision, and canonical memory content. The lab then runs
|
|
653
|
+
native sync, MCP sync, memory sync, secrets audit, and real MCP client
|
|
654
|
+
handshakes against Claude/Codex/pi/Kimi runtime views. All writes stay inside
|
|
655
|
+
the container-local HOME.
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Trellis mark</title>
|
|
3
|
+
<desc id="desc">A letter T whose beam is a trellis lattice.</desc>
|
|
4
|
+
<g fill="none" stroke="#161c24" stroke-linecap="round">
|
|
5
|
+
<rect x="16" y="18" width="64" height="18" rx="9" stroke-width="5.5"/>
|
|
6
|
+
<g stroke-width="2.6" clip-path="url(#a-beam)"><path d="M-64.5 32 L-55.5 23"/><path d="M-64.5 23 L-55.5 32"/><path d="M-46.5 32 L-37.5 23"/><path d="M-46.5 23 L-37.5 32"/><path d="M-28.5 32 L-19.5 23"/><path d="M-28.5 23 L-19.5 32"/><path d="M-10.5 32 L-1.5 23"/><path d="M-10.5 23 L-1.5 32"/><path d="M7.5 32 L16.5 23"/><path d="M7.5 23 L16.5 32"/><path d="M25.5 32 L34.5 23"/><path d="M25.5 23 L34.5 32"/><path d="M43.5 32 L52.5 23"/><path d="M43.5 23 L52.5 32"/><path d="M61.5 32 L70.5 23"/><path d="M61.5 23 L70.5 32"/><path d="M79.5 32 L88.5 23"/><path d="M79.5 23 L88.5 32"/><path d="M97.5 32 L106.5 23"/><path d="M97.5 23 L106.5 32"/><path d="M115.5 32 L124.5 23"/><path d="M115.5 23 L124.5 32"/></g>
|
|
7
|
+
<path d="M48 36 V78" stroke-width="8"/>
|
|
8
|
+
</g>
|
|
9
|
+
<defs><clipPath id="a-beam"><rect x="21" y="23" width="54" height="9" rx="4.5"/></clipPath></defs>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Agent Trellis poster series
|
|
2
|
+
|
|
3
|
+
The canonical brand mark and social poster series. The earlier v1 and v2
|
|
4
|
+
iterations were retired and removed; they remain in git history (`f4e5136`,
|
|
5
|
+
`1045bb6`).
|
|
6
|
+
|
|
7
|
+
Design notes:
|
|
8
|
+
|
|
9
|
+
- The hero zone of each poster is a purpose-built diagram (agent paths,
|
|
10
|
+
migration flow, shared memory rail, context handoff) instead of the logo
|
|
11
|
+
scaled up inside empty corner brackets.
|
|
12
|
+
- Each theme gets its own quiet accent color (indigo / teal / violet /
|
|
13
|
+
orange); the mark itself stays single-ink.
|
|
14
|
+
- The kicker/title overlap in the v1 English layout is fixed; all metrics are
|
|
15
|
+
computed from the title baseline.
|
|
16
|
+
- One horizontal 1200x675 master (X/Twitter, WeChat article header) joins the
|
|
17
|
+
3:4 verticals, in both English and Chinese.
|
|
18
|
+
- Vertical posters are phone-first (feed width ~390 css px): body text runs at
|
|
19
|
+
34/35 px, diagram labels at 16-17 px, install line at 32 px. The horizontal
|
|
20
|
+
masters are desktop-first and keep the denser metrics.
|
|
21
|
+
|
|
22
|
+
## Mark
|
|
23
|
+
|
|
24
|
+
The brand mark is the **Lattice T** — the letter T whose beam is a trellis
|
|
25
|
+
lattice: [svg](../brand-v3/trellis-mark-v3-a.svg) /
|
|
26
|
+
[png](../brand-v3/trellis-mark-v3-a.png). It is a single-ink symbol and is the
|
|
27
|
+
same mark used in the README header and every poster. Two retired alternates
|
|
28
|
+
(constellation T, lattice panel) remain in git history.
|
|
29
|
+
|
|
30
|
+
## Posters
|
|
31
|
+
|
|
32
|
+
Vertical masters are 1080x1440 (3:4, Xiaohongshu / WeChat Moments); horizontal
|
|
33
|
+
masters are 1200x675 (16:9). SVG sources are the editable masters.
|
|
34
|
+
|
|
35
|
+
| Theme | EN | ZH |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| Unified runtime | [svg](agent-trellis-poster-v3-unified-en.svg) / [png](agent-trellis-poster-v3-unified-en.png) | [svg](agent-trellis-poster-v3-unified-zh.svg) / [png](agent-trellis-poster-v3-unified-zh.png) |
|
|
38
|
+
| One-command migration | [svg](agent-trellis-poster-v3-migrate-en.svg) / [png](agent-trellis-poster-v3-migrate-en.png) | [svg](agent-trellis-poster-v3-migrate-zh.svg) / [png](agent-trellis-poster-v3-migrate-zh.png) |
|
|
39
|
+
| Shared memory | [svg](agent-trellis-poster-v3-memory-en.svg) / [png](agent-trellis-poster-v3-memory-en.png) | [svg](agent-trellis-poster-v3-memory-zh.svg) / [png](agent-trellis-poster-v3-memory-zh.png) |
|
|
40
|
+
| Switch agents | [svg](agent-trellis-poster-v3-switch-en.svg) / [png](agent-trellis-poster-v3-switch-en.png) | [svg](agent-trellis-poster-v3-switch-zh.svg) / [png](agent-trellis-poster-v3-switch-zh.png) |
|
|
41
|
+
| Horizontal hero | [svg](agent-trellis-poster-v3-horizontal-en.svg) / [png](agent-trellis-poster-v3-horizontal-en.png) | [svg](agent-trellis-poster-v3-horizontal-zh.svg) / [png](agent-trellis-poster-v3-horizontal-zh.png) |
|
|
42
|
+
|
|
43
|
+
## Copy
|
|
44
|
+
|
|
45
|
+
Same approved copy as v1:
|
|
46
|
+
|
|
47
|
+
- `One Runtime. Every Code Agent.` / 一个 Runtime,统一所有 Code Agent。
|
|
48
|
+
- `Migrate in one command.` / 一条命令,迁移现有配置。
|
|
49
|
+
- `Keep context in the loop.` / 让上下文始终在线。
|
|
50
|
+
- `Change Agents. Keep moving.` / 切换 Agent,不丢上下文。
|
|
51
|
+
|
|
52
|
+
## Regenerate
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
node scripts/generate-brand-v3.mjs # brand mark
|
|
56
|
+
node scripts/generate-poster-series-v3.mjs # 8 vertical + 2 horizontal posters
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Both scripts write SVG masters into `docs/assets/` and render PNGs through
|
|
60
|
+
`qlmanage` + `sips` (macOS built-ins, no extra dependencies).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1600" viewBox="0 0 1600 1600">
|
|
2
|
+
<rect width="1600" height="1600" fill="#fafaf8"/>
|
|
3
|
+
<g transform="translate(0 350)">
|
|
4
|
+
<g transform="translate(64 100) scale(0.58)" fill="none" stroke="#161c24" stroke-linecap="round">
|
|
5
|
+
<defs><clipPath id="v3-beam-64-100"><rect x="21" y="23" width="54" height="9" rx="4.5"/></clipPath></defs>
|
|
6
|
+
<rect x="16" y="18" width="64" height="18" rx="9" stroke-width="5.5"/>
|
|
7
|
+
<g stroke-width="2.6" clip-path="url(#v3-beam-64-100)"><path d="M-64.5 32 L-55.5 23"/><path d="M-64.5 23 L-55.5 32"/><path d="M-46.5 32 L-37.5 23"/><path d="M-46.5 23 L-37.5 32"/><path d="M-28.5 32 L-19.5 23"/><path d="M-28.5 23 L-19.5 32"/><path d="M-10.5 32 L-1.5 23"/><path d="M-10.5 23 L-1.5 32"/><path d="M7.5 32 L16.5 23"/><path d="M7.5 23 L16.5 32"/><path d="M25.5 32 L34.5 23"/><path d="M25.5 23 L34.5 32"/><path d="M43.5 32 L52.5 23"/><path d="M43.5 23 L52.5 32"/><path d="M61.5 32 L70.5 23"/><path d="M61.5 23 L70.5 32"/><path d="M79.5 32 L88.5 23"/><path d="M79.5 23 L88.5 32"/><path d="M97.5 32 L106.5 23"/><path d="M97.5 23 L106.5 32"/><path d="M115.5 32 L124.5 23"/><path d="M115.5 23 L124.5 32"/></g>
|
|
8
|
+
<path d="M48 36 V78" stroke-width="8"/>
|
|
9
|
+
</g>
|
|
10
|
+
<text x="140" y="141" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="26" font-weight="700" letter-spacing="2.6" fill="#161c24">AGENT TRELLIS</text>
|
|
11
|
+
<text x="1536" y="140" text-anchor="end" font-family="Menlo, SFMono-Regular, monospace" font-size="15" font-weight="400" letter-spacing="1.7" fill="#69727d">OPEN SOURCE · LOCAL FIRST</text>
|
|
12
|
+
<path d="M64 192 H1536" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
13
|
+
<rect x="64" y="189" width="46" height="3" fill="#3457d5"/>
|
|
14
|
+
|
|
15
|
+
<text x="108" y="262" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="17" font-weight="400" letter-spacing="2.2" fill="#3457d5">UNIFIED CODE AGENT RUNTIME</text>
|
|
16
|
+
<rect x="64" y="300" width="8" height="182" fill="#3457d5"/>
|
|
17
|
+
<text x="108" y="366" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="84" font-weight="800" letter-spacing="-2.2" fill="#161c24">One Runtime.</text><text x="108" y="464" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="84" font-weight="800" letter-spacing="-2.2" fill="#161c24">Every Code Agent.</text>
|
|
18
|
+
<text x="108" y="522" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="24" font-weight="450" letter-spacing="0" fill="#69727d">Skills, MCP, Memory and Instructions</text><text x="108" y="558" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="24" font-weight="450" letter-spacing="0" fill="#69727d">stay aligned from one canonical source.</text>
|
|
19
|
+
|
|
20
|
+
<text x="108" y="640" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="15" font-weight="400" letter-spacing="1.6" fill="#69727d">SKILLS · MCP · MEMORY · INSTRUCTIONS</text>
|
|
21
|
+
<circle cx="112" cy="700" r="5.5" fill="#3457d5"/>
|
|
22
|
+
<text x="140" y="709" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="24" font-weight="500" letter-spacing="0.2" fill="#161c24">$ npm i -g agent-trellis</text>
|
|
23
|
+
|
|
24
|
+
<g>
|
|
25
|
+
<rect x="1000" y="250" width="500" height="450" fill="none" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
26
|
+
<path d="M991 250 H1009 M1000 241 V259" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M1491 250 H1509 M1500 241 V259" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M991 700 H1009 M1000 691 V709" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M1491 700 H1509 M1500 691 V709" fill="none" stroke="#dfe4ea" stroke-width="2"/>
|
|
27
|
+
<rect x="1018" y="228" width="242" height="44" fill="#fafaf8"/>
|
|
28
|
+
<text x="1035" y="258" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="20" font-weight="400" letter-spacing="1.8" fill="#3457d5">FIG.00 — RUNTIME</text>
|
|
29
|
+
</g>
|
|
30
|
+
<g>
|
|
31
|
+
<rect x="1039" y="319" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/><rect x="1039" y="464" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/><rect x="1039" y="609" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/>
|
|
32
|
+
<g fill="none">
|
|
33
|
+
<defs><clipPath id="d-horizontal"><rect x="1172" y="337" width="156" height="276" rx="12"/></clipPath></defs>
|
|
34
|
+
<rect x="1165" y="330" width="170" height="290" rx="18" stroke="#161c24" stroke-width="3.5"/>
|
|
35
|
+
<g clip-path="url(#d-horizontal)" stroke="#69727d" stroke-width="2" opacity="0.85"><path d="M710 613 L986 337"/><path d="M710 337 L986 613"/><path d="M731 613 L1007 337"/><path d="M731 337 L1007 613"/><path d="M752 613 L1028 337"/><path d="M752 337 L1028 613"/><path d="M773 613 L1049 337"/><path d="M773 337 L1049 613"/><path d="M794 613 L1070 337"/><path d="M794 337 L1070 613"/><path d="M815 613 L1091 337"/><path d="M815 337 L1091 613"/><path d="M836 613 L1112 337"/><path d="M836 337 L1112 613"/><path d="M857 613 L1133 337"/><path d="M857 337 L1133 613"/><path d="M878 613 L1154 337"/><path d="M878 337 L1154 613"/><path d="M899 613 L1175 337"/><path d="M899 337 L1175 613"/><path d="M920 613 L1196 337"/><path d="M920 337 L1196 613"/><path d="M941 613 L1217 337"/><path d="M941 337 L1217 613"/><path d="M962 613 L1238 337"/><path d="M962 337 L1238 613"/><path d="M983 613 L1259 337"/><path d="M983 337 L1259 613"/><path d="M1004 613 L1280 337"/><path d="M1004 337 L1280 613"/><path d="M1025 613 L1301 337"/><path d="M1025 337 L1301 613"/><path d="M1046 613 L1322 337"/><path d="M1046 337 L1322 613"/><path d="M1067 613 L1343 337"/><path d="M1067 337 L1343 613"/><path d="M1088 613 L1364 337"/><path d="M1088 337 L1364 613"/><path d="M1109 613 L1385 337"/><path d="M1109 337 L1385 613"/><path d="M1130 613 L1406 337"/><path d="M1130 337 L1406 613"/><path d="M1151 613 L1427 337"/><path d="M1151 337 L1427 613"/><path d="M1172 613 L1448 337"/><path d="M1172 337 L1448 613"/><path d="M1193 613 L1469 337"/><path d="M1193 337 L1469 613"/><path d="M1214 613 L1490 337"/><path d="M1214 337 L1490 613"/><path d="M1235 613 L1511 337"/><path d="M1235 337 L1511 613"/><path d="M1256 613 L1532 337"/><path d="M1256 337 L1532 613"/><path d="M1277 613 L1553 337"/><path d="M1277 337 L1553 613"/><path d="M1298 613 L1574 337"/><path d="M1298 337 L1574 613"/><path d="M1319 613 L1595 337"/><path d="M1319 337 L1595 613"/><path d="M1340 613 L1616 337"/><path d="M1340 337 L1616 613"/><path d="M1361 613 L1637 337"/><path d="M1361 337 L1637 613"/><path d="M1382 613 L1658 337"/><path d="M1382 337 L1658 613"/><path d="M1403 613 L1679 337"/><path d="M1403 337 L1679 613"/><path d="M1424 613 L1700 337"/><path d="M1424 337 L1700 613"/><path d="M1445 613 L1721 337"/><path d="M1445 337 L1721 613"/><path d="M1466 613 L1742 337"/><path d="M1466 337 L1742 613"/><path d="M1487 613 L1763 337"/><path d="M1487 337 L1763 613"/><path d="M1508 613 L1784 337"/><path d="M1508 337 L1784 613"/><path d="M1529 613 L1805 337"/><path d="M1529 337 L1805 613"/><path d="M1550 613 L1826 337"/><path d="M1550 337 L1826 613"/><path d="M1571 613 L1847 337"/><path d="M1571 337 L1847 613"/><path d="M1592 613 L1868 337"/><path d="M1592 337 L1868 613"/><path d="M1613 613 L1889 337"/><path d="M1613 337 L1889 613"/><path d="M1634 613 L1910 337"/><path d="M1634 337 L1910 613"/></g>
|
|
36
|
+
</g>
|
|
37
|
+
<g fill="none" stroke="#161c24" stroke-width="3">
|
|
38
|
+
<path d="M1062 330 C 1120 330 1128 400 1165 400"/>
|
|
39
|
+
<path d="M1062 475 H1165"/>
|
|
40
|
+
<path d="M1062 620 C 1120 620 1128 550 1165 550"/>
|
|
41
|
+
<path d="M1335 400 H1450 M1335 475 H1450 M1335 550 H1450"/>
|
|
42
|
+
</g>
|
|
43
|
+
<g fill="#3457d5"><circle cx="1456" cy="400" r="6.5"/><circle cx="1456" cy="475" r="6.5"/><circle cx="1456" cy="550" r="6.5"/></g>
|
|
44
|
+
</g>
|
|
45
|
+
<text x="1250" y="745" text-anchor="middle" font-family="Menlo, SFMono-Regular, monospace" font-size="14" font-weight="400" letter-spacing="2" fill="#3457d5">ONE RUNTIME · MANY AGENTS</text>
|
|
46
|
+
|
|
47
|
+
<path d="M64 784 H1536" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
48
|
+
<text x="64" y="822" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="13.5" font-weight="400" letter-spacing="1.5" fill="#69727d">AGENT TRELLIS — UNIFIED CODE AGENT RUNTIME</text>
|
|
49
|
+
<text x="1536" y="822" text-anchor="end" font-family="Menlo, SFMono-Regular, monospace" font-size="13.5" font-weight="400" letter-spacing="1.5" fill="#69727d">agent-trellis.dev</text>
|
|
50
|
+
</g>
|
|
51
|
+
</svg>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1600" height="1600" viewBox="0 0 1600 1600">
|
|
2
|
+
<rect width="1600" height="1600" fill="#fafaf8"/>
|
|
3
|
+
<g transform="translate(0 350)">
|
|
4
|
+
<g transform="translate(64 100) scale(0.58)" fill="none" stroke="#161c24" stroke-linecap="round">
|
|
5
|
+
<defs><clipPath id="v3-beam-64-100"><rect x="21" y="23" width="54" height="9" rx="4.5"/></clipPath></defs>
|
|
6
|
+
<rect x="16" y="18" width="64" height="18" rx="9" stroke-width="5.5"/>
|
|
7
|
+
<g stroke-width="2.6" clip-path="url(#v3-beam-64-100)"><path d="M-64.5 32 L-55.5 23"/><path d="M-64.5 23 L-55.5 32"/><path d="M-46.5 32 L-37.5 23"/><path d="M-46.5 23 L-37.5 32"/><path d="M-28.5 32 L-19.5 23"/><path d="M-28.5 23 L-19.5 32"/><path d="M-10.5 32 L-1.5 23"/><path d="M-10.5 23 L-1.5 32"/><path d="M7.5 32 L16.5 23"/><path d="M7.5 23 L16.5 32"/><path d="M25.5 32 L34.5 23"/><path d="M25.5 23 L34.5 32"/><path d="M43.5 32 L52.5 23"/><path d="M43.5 23 L52.5 32"/><path d="M61.5 32 L70.5 23"/><path d="M61.5 23 L70.5 32"/><path d="M79.5 32 L88.5 23"/><path d="M79.5 23 L88.5 32"/><path d="M97.5 32 L106.5 23"/><path d="M97.5 23 L106.5 32"/><path d="M115.5 32 L124.5 23"/><path d="M115.5 23 L124.5 32"/></g>
|
|
8
|
+
<path d="M48 36 V78" stroke-width="8"/>
|
|
9
|
+
</g>
|
|
10
|
+
<text x="140" y="141" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="26" font-weight="700" letter-spacing="2.6" fill="#161c24">AGENT TRELLIS</text>
|
|
11
|
+
<text x="1536" y="140" text-anchor="end" font-family="Menlo, SFMono-Regular, monospace" font-size="15" font-weight="400" letter-spacing="1.7" fill="#69727d">OPEN SOURCE · LOCAL FIRST</text>
|
|
12
|
+
<path d="M64 192 H1536" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
13
|
+
<rect x="64" y="189" width="46" height="3" fill="#3457d5"/>
|
|
14
|
+
|
|
15
|
+
<text x="108" y="262" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="17" font-weight="400" letter-spacing="2.2" fill="#3457d5">UNIFIED CODE AGENT RUNTIME</text>
|
|
16
|
+
<rect x="64" y="308" width="8" height="164" fill="#3457d5"/>
|
|
17
|
+
<text x="108" y="366" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="74" font-weight="800" letter-spacing="-1" fill="#161c24">一个 Runtime,</text><text x="108" y="456" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="74" font-weight="800" letter-spacing="-1" fill="#161c24">统一所有 Code Agent。</text>
|
|
18
|
+
<text x="108" y="514" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="24" font-weight="450" letter-spacing="0" fill="#69727d">从一个 canonical source 统一管理</text><text x="108" y="550" text-anchor="start" font-family="Helvetica Neue, PingFang SC, Arial, sans-serif" font-size="24" font-weight="450" letter-spacing="0" fill="#69727d">Skill、MCP、Memory 与共享指令。</text>
|
|
19
|
+
|
|
20
|
+
<text x="108" y="640" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="15" font-weight="400" letter-spacing="1.6" fill="#69727d">SKILLS · MCP · MEMORY · INSTRUCTIONS</text>
|
|
21
|
+
<circle cx="112" cy="700" r="5.5" fill="#3457d5"/>
|
|
22
|
+
<text x="140" y="709" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="24" font-weight="500" letter-spacing="0.2" fill="#161c24">$ npm i -g agent-trellis</text>
|
|
23
|
+
|
|
24
|
+
<g>
|
|
25
|
+
<rect x="1000" y="250" width="500" height="450" fill="none" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
26
|
+
<path d="M991 250 H1009 M1000 241 V259" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M1491 250 H1509 M1500 241 V259" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M991 700 H1009 M1000 691 V709" fill="none" stroke="#dfe4ea" stroke-width="2"/><path d="M1491 700 H1509 M1500 691 V709" fill="none" stroke="#dfe4ea" stroke-width="2"/>
|
|
27
|
+
<rect x="1018" y="228" width="242" height="44" fill="#fafaf8"/>
|
|
28
|
+
<text x="1035" y="258" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="20" font-weight="400" letter-spacing="1.8" fill="#3457d5">FIG.00 — RUNTIME</text>
|
|
29
|
+
</g>
|
|
30
|
+
<g>
|
|
31
|
+
<rect x="1039" y="319" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/><rect x="1039" y="464" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/><rect x="1039" y="609" width="22" height="22" rx="6" fill="none" stroke="#161c24" stroke-width="3"/>
|
|
32
|
+
<g fill="none">
|
|
33
|
+
<defs><clipPath id="d-horizontal"><rect x="1172" y="337" width="156" height="276" rx="12"/></clipPath></defs>
|
|
34
|
+
<rect x="1165" y="330" width="170" height="290" rx="18" stroke="#161c24" stroke-width="3.5"/>
|
|
35
|
+
<g clip-path="url(#d-horizontal)" stroke="#69727d" stroke-width="2" opacity="0.85"><path d="M710 613 L986 337"/><path d="M710 337 L986 613"/><path d="M731 613 L1007 337"/><path d="M731 337 L1007 613"/><path d="M752 613 L1028 337"/><path d="M752 337 L1028 613"/><path d="M773 613 L1049 337"/><path d="M773 337 L1049 613"/><path d="M794 613 L1070 337"/><path d="M794 337 L1070 613"/><path d="M815 613 L1091 337"/><path d="M815 337 L1091 613"/><path d="M836 613 L1112 337"/><path d="M836 337 L1112 613"/><path d="M857 613 L1133 337"/><path d="M857 337 L1133 613"/><path d="M878 613 L1154 337"/><path d="M878 337 L1154 613"/><path d="M899 613 L1175 337"/><path d="M899 337 L1175 613"/><path d="M920 613 L1196 337"/><path d="M920 337 L1196 613"/><path d="M941 613 L1217 337"/><path d="M941 337 L1217 613"/><path d="M962 613 L1238 337"/><path d="M962 337 L1238 613"/><path d="M983 613 L1259 337"/><path d="M983 337 L1259 613"/><path d="M1004 613 L1280 337"/><path d="M1004 337 L1280 613"/><path d="M1025 613 L1301 337"/><path d="M1025 337 L1301 613"/><path d="M1046 613 L1322 337"/><path d="M1046 337 L1322 613"/><path d="M1067 613 L1343 337"/><path d="M1067 337 L1343 613"/><path d="M1088 613 L1364 337"/><path d="M1088 337 L1364 613"/><path d="M1109 613 L1385 337"/><path d="M1109 337 L1385 613"/><path d="M1130 613 L1406 337"/><path d="M1130 337 L1406 613"/><path d="M1151 613 L1427 337"/><path d="M1151 337 L1427 613"/><path d="M1172 613 L1448 337"/><path d="M1172 337 L1448 613"/><path d="M1193 613 L1469 337"/><path d="M1193 337 L1469 613"/><path d="M1214 613 L1490 337"/><path d="M1214 337 L1490 613"/><path d="M1235 613 L1511 337"/><path d="M1235 337 L1511 613"/><path d="M1256 613 L1532 337"/><path d="M1256 337 L1532 613"/><path d="M1277 613 L1553 337"/><path d="M1277 337 L1553 613"/><path d="M1298 613 L1574 337"/><path d="M1298 337 L1574 613"/><path d="M1319 613 L1595 337"/><path d="M1319 337 L1595 613"/><path d="M1340 613 L1616 337"/><path d="M1340 337 L1616 613"/><path d="M1361 613 L1637 337"/><path d="M1361 337 L1637 613"/><path d="M1382 613 L1658 337"/><path d="M1382 337 L1658 613"/><path d="M1403 613 L1679 337"/><path d="M1403 337 L1679 613"/><path d="M1424 613 L1700 337"/><path d="M1424 337 L1700 613"/><path d="M1445 613 L1721 337"/><path d="M1445 337 L1721 613"/><path d="M1466 613 L1742 337"/><path d="M1466 337 L1742 613"/><path d="M1487 613 L1763 337"/><path d="M1487 337 L1763 613"/><path d="M1508 613 L1784 337"/><path d="M1508 337 L1784 613"/><path d="M1529 613 L1805 337"/><path d="M1529 337 L1805 613"/><path d="M1550 613 L1826 337"/><path d="M1550 337 L1826 613"/><path d="M1571 613 L1847 337"/><path d="M1571 337 L1847 613"/><path d="M1592 613 L1868 337"/><path d="M1592 337 L1868 613"/><path d="M1613 613 L1889 337"/><path d="M1613 337 L1889 613"/><path d="M1634 613 L1910 337"/><path d="M1634 337 L1910 613"/></g>
|
|
36
|
+
</g>
|
|
37
|
+
<g fill="none" stroke="#161c24" stroke-width="3">
|
|
38
|
+
<path d="M1062 330 C 1120 330 1128 400 1165 400"/>
|
|
39
|
+
<path d="M1062 475 H1165"/>
|
|
40
|
+
<path d="M1062 620 C 1120 620 1128 550 1165 550"/>
|
|
41
|
+
<path d="M1335 400 H1450 M1335 475 H1450 M1335 550 H1450"/>
|
|
42
|
+
</g>
|
|
43
|
+
<g fill="#3457d5"><circle cx="1456" cy="400" r="6.5"/><circle cx="1456" cy="475" r="6.5"/><circle cx="1456" cy="550" r="6.5"/></g>
|
|
44
|
+
</g>
|
|
45
|
+
<text x="1250" y="745" text-anchor="middle" font-family="Menlo, SFMono-Regular, monospace" font-size="14" font-weight="400" letter-spacing="2" fill="#3457d5">ONE RUNTIME · MANY AGENTS</text>
|
|
46
|
+
|
|
47
|
+
<path d="M64 784 H1536" stroke="#dfe4ea" stroke-width="1.5"/>
|
|
48
|
+
<text x="64" y="822" text-anchor="start" font-family="Menlo, SFMono-Regular, monospace" font-size="13.5" font-weight="400" letter-spacing="1.5" fill="#69727d">AGENT TRELLIS — UNIFIED CODE AGENT RUNTIME</text>
|
|
49
|
+
<text x="1536" y="822" text-anchor="end" font-family="Menlo, SFMono-Regular, monospace" font-size="13.5" font-weight="400" letter-spacing="1.5" fill="#69727d">agent-trellis.dev</text>
|
|
50
|
+
</g>
|
|
51
|
+
</svg>
|