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.
Files changed (302) hide show
  1. package/README.md +48 -153
  2. package/dist/adapters/claude-code.js +3 -2
  3. package/dist/adapters/codex.js +3 -2
  4. package/dist/adapters/jsonMcp.d.ts +3 -1
  5. package/dist/adapters/jsonMcp.js +18 -4
  6. package/dist/adapters/kimi-code.d.ts +21 -0
  7. package/dist/adapters/kimi-code.js +107 -0
  8. package/dist/adapters/kiro.js +3 -2
  9. package/dist/adapters/mcpPlan.d.ts +6 -1
  10. package/dist/adapters/mcpPlan.js +106 -8
  11. package/dist/adapters/pi.js +22 -3
  12. package/dist/adapters/symlinkPlan.d.ts +7 -0
  13. package/dist/adapters/symlinkPlan.js +16 -7
  14. package/dist/adapters/zcode.d.ts +21 -0
  15. package/dist/adapters/zcode.js +234 -0
  16. package/dist/cli.js +145 -29
  17. package/dist/commands/doctor.d.ts +7 -2
  18. package/dist/commands/doctor.js +40 -2
  19. package/dist/commands/init.d.ts +4 -2
  20. package/dist/commands/init.js +29 -13
  21. package/dist/commands/kimi.d.ts +16 -0
  22. package/dist/commands/kimi.js +64 -0
  23. package/dist/commands/manage.d.ts +39 -0
  24. package/dist/commands/manage.js +126 -0
  25. package/dist/commands/mcp.d.ts +77 -14
  26. package/dist/commands/mcp.js +169 -29
  27. package/dist/commands/mcpGateway.d.ts +6 -0
  28. package/dist/commands/mcpGateway.js +35 -14
  29. package/dist/commands/mcpImport.d.ts +46 -0
  30. package/dist/commands/mcpImport.js +359 -0
  31. package/dist/commands/memory.d.ts +17 -3
  32. package/dist/commands/memory.js +27 -8
  33. package/dist/commands/migrate.d.ts +16 -5
  34. package/dist/commands/migrate.js +93 -17
  35. package/dist/commands/onboard.d.ts +74 -2
  36. package/dist/commands/onboard.js +469 -71
  37. package/dist/commands/rollback.js +28 -2
  38. package/dist/commands/secretsAudit.js +4 -1
  39. package/dist/commands/skill.d.ts +52 -6
  40. package/dist/commands/skill.js +114 -15
  41. package/dist/commands/sync.js +5 -1
  42. package/dist/core/adapter.d.ts +11 -1
  43. package/dist/core/canonical.d.ts +15 -7
  44. package/dist/core/canonical.js +101 -13
  45. package/dist/core/capabilitySelection.d.ts +45 -0
  46. package/dist/core/capabilitySelection.js +124 -0
  47. package/dist/core/types.d.ts +25 -2
  48. package/dist/core/types.js +8 -0
  49. package/dist/lib/agentBridge.d.ts +169 -0
  50. package/dist/lib/agentBridge.js +367 -0
  51. package/dist/lib/agentBridgeProvider.d.ts +14 -0
  52. package/dist/lib/agentBridgeProvider.js +95 -0
  53. package/dist/lib/backup.d.ts +32 -0
  54. package/dist/lib/backup.js +20 -1
  55. package/dist/lib/builtinSkills.d.ts +2 -0
  56. package/dist/lib/builtinSkills.js +4 -0
  57. package/dist/lib/chatAgents.d.ts +42 -0
  58. package/dist/lib/chatAgents.js +59 -0
  59. package/dist/lib/cliMetadata.d.ts +1 -0
  60. package/dist/lib/cliMetadata.js +14 -0
  61. package/dist/lib/envVarNames.d.ts +3 -0
  62. package/dist/lib/envVarNames.js +19 -0
  63. package/dist/lib/gatewayBackend.d.ts +28 -0
  64. package/dist/lib/gatewayBackend.js +72 -1
  65. package/dist/lib/installAgent.d.ts +7 -5
  66. package/dist/lib/installAgent.js +4 -3
  67. package/dist/lib/mcpConnect.js +5 -1
  68. package/dist/lib/mcpMigrateRead.d.ts +2 -0
  69. package/dist/lib/mcpMigrateRead.js +22 -1
  70. package/dist/lib/mcpRuntime.d.ts +46 -0
  71. package/dist/lib/mcpRuntime.js +185 -0
  72. package/dist/lib/mcpStatusProvider.d.ts +10 -0
  73. package/dist/lib/mcpStatusProvider.js +25 -0
  74. package/dist/lib/mcpToolRegistry.d.ts +18 -0
  75. package/dist/lib/mcpToolRegistry.js +107 -14
  76. package/dist/lib/memoryGraph.d.ts +1 -1
  77. package/dist/lib/memoryGraph.js +9 -3
  78. package/dist/lib/memoryProvider.d.ts +58 -0
  79. package/dist/lib/memoryProvider.js +175 -0
  80. package/dist/lib/memoryStatus.d.ts +17 -0
  81. package/dist/lib/memoryStatus.js +88 -0
  82. package/dist/lib/nativeMemory.d.ts +19 -0
  83. package/dist/lib/nativeMemory.js +129 -0
  84. package/dist/lib/realHomeSnapshot.js +5 -0
  85. package/dist/lib/runtimeControlProvider.d.ts +16 -0
  86. package/dist/lib/runtimeControlProvider.js +170 -0
  87. package/dist/lib/secretEnv.d.ts +2 -1
  88. package/dist/lib/secretEnv.js +6 -2
  89. package/dist/lib/skillProvider.d.ts +13 -0
  90. package/dist/lib/skillProvider.js +210 -0
  91. package/dist/lib/taskProvider.d.ts +7 -0
  92. package/dist/lib/taskProvider.js +43 -0
  93. package/dist/lib/taskStore.d.ts +46 -0
  94. package/dist/lib/taskStore.js +156 -0
  95. package/dist/lib/terminalPicker.d.ts +23 -49
  96. package/dist/lib/terminalPicker.js +80 -218
  97. package/dist/lib/zcodeOwnership.d.ts +17 -0
  98. package/dist/lib/zcodeOwnership.js +37 -0
  99. package/dist/pi-bridge/bundle.js +476 -37
  100. package/dist/pi-bridge/index.js +42 -21
  101. package/dist/pi-bridge/schemaTranslate.d.ts +4 -8
  102. package/dist/pi-bridge/schemaTranslate.js +4 -8
  103. package/dist/probes/codex.d.ts +7 -0
  104. package/dist/probes/codex.js +37 -5
  105. package/dist/probes/kimi-code.d.ts +12 -0
  106. package/dist/probes/kimi-code.js +55 -0
  107. package/dist/probes/zcode.d.ts +32 -0
  108. package/dist/probes/zcode.js +140 -0
  109. package/dist/sdk.d.ts +1 -1
  110. package/docs/architecture.md +230 -28
  111. package/docs/assets/brand-v3/trellis-mark-v3-a.png +0 -0
  112. package/docs/assets/brand-v3/trellis-mark-v3-a.svg +10 -0
  113. package/docs/assets/poster-series-v3/README.md +60 -0
  114. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-en.png +0 -0
  115. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-en.svg +51 -0
  116. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-zh.png +0 -0
  117. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-horizontal-zh.svg +51 -0
  118. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-en.png +0 -0
  119. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-en.svg +48 -0
  120. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-zh.png +0 -0
  121. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-memory-zh.svg +48 -0
  122. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-en.png +0 -0
  123. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-en.svg +56 -0
  124. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-zh.png +0 -0
  125. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-migrate-zh.svg +56 -0
  126. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-en.png +0 -0
  127. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-en.svg +47 -0
  128. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-zh.png +0 -0
  129. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-switch-zh.svg +47 -0
  130. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-en.png +0 -0
  131. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-en.svg +51 -0
  132. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-zh.png +0 -0
  133. package/docs/assets/poster-series-v3/agent-trellis-poster-v3-unified-zh.svg +51 -0
  134. package/docs/getting-started.md +496 -42
  135. package/docs/overview.md +134 -0
  136. package/docs/overview.zh-CN.md +102 -0
  137. package/docs/research.md +59 -0
  138. package/docs/roadmap.md +11 -6
  139. package/docs/video/README.md +76 -0
  140. package/docs/video/build/audio/01-opening.aiff +0 -0
  141. package/docs/video/build/audio/01-opening.mp3 +0 -0
  142. package/docs/video/build/audio/02-pain.aiff +0 -0
  143. package/docs/video/build/audio/02-pain.mp3 +0 -0
  144. package/docs/video/build/audio/03-solution.aiff +0 -0
  145. package/docs/video/build/audio/03-solution.mp3 +0 -0
  146. package/docs/video/build/audio/04-install.aiff +0 -0
  147. package/docs/video/build/audio/04-install.mp3 +0 -0
  148. package/docs/video/build/audio/04-setup.mp3 +0 -0
  149. package/docs/video/build/audio/05-dryrun.mp3 +0 -0
  150. package/docs/video/build/audio/05-init.aiff +0 -0
  151. package/docs/video/build/audio/05-init.mp3 +0 -0
  152. package/docs/video/build/audio/05-interactive.mp3 +0 -0
  153. package/docs/video/build/audio/06-dryrun.aiff +0 -0
  154. package/docs/video/build/audio/06-dryrun.mp3 +0 -0
  155. package/docs/video/build/audio/06-onboard.mp3 +0 -0
  156. package/docs/video/build/audio/06-run.mp3 +0 -0
  157. package/docs/video/build/audio/07-onboard.aiff +0 -0
  158. package/docs/video/build/audio/07-onboard.mp3 +0 -0
  159. package/docs/video/build/audio/07-verify.mp3 +0 -0
  160. package/docs/video/build/audio/08-closing.mp3 +0 -0
  161. package/docs/video/build/audio/08-doctor.aiff +0 -0
  162. package/docs/video/build/audio/08-doctor.mp3 +0 -0
  163. package/docs/video/build/audio/09-rollback.aiff +0 -0
  164. package/docs/video/build/audio/09-rollback.mp3 +0 -0
  165. package/docs/video/build/audio/10-principles.aiff +0 -0
  166. package/docs/video/build/audio/10-principles.mp3 +0 -0
  167. package/docs/video/build/audio/11-closing.aiff +0 -0
  168. package/docs/video/build/audio/11-closing.mp3 +0 -0
  169. package/docs/video/build/frames/01-opening-0.png +0 -0
  170. package/docs/video/build/frames/02-pain-1.png +0 -0
  171. package/docs/video/build/frames/02-pain-2.png +0 -0
  172. package/docs/video/build/frames/03-solution-3.png +0 -0
  173. package/docs/video/build/frames/04-install-4.png +0 -0
  174. package/docs/video/build/frames/04-setup-4.png +0 -0
  175. package/docs/video/build/frames/04-setup-5.png +0 -0
  176. package/docs/video/build/frames/05-dryrun-6.png +0 -0
  177. package/docs/video/build/frames/05-init-5.png +0 -0
  178. package/docs/video/build/frames/05-interactive-5.png +0 -0
  179. package/docs/video/build/frames/05-interactive-6.png +0 -0
  180. package/docs/video/build/frames/06-dryrun-6.png +0 -0
  181. package/docs/video/build/frames/06-dryrun-7.png +0 -0
  182. package/docs/video/build/frames/06-onboard-7.png +0 -0
  183. package/docs/video/build/frames/06-onboard-8.png +0 -0
  184. package/docs/video/build/frames/06-run-7.png +0 -0
  185. package/docs/video/build/frames/06-run-8.png +0 -0
  186. package/docs/video/build/frames/07-onboard-10.png +0 -0
  187. package/docs/video/build/frames/07-onboard-7.png +0 -0
  188. package/docs/video/build/frames/07-onboard-8.png +0 -0
  189. package/docs/video/build/frames/07-onboard-9.png +0 -0
  190. package/docs/video/build/frames/07-verify-10.png +0 -0
  191. package/docs/video/build/frames/07-verify-8.png +0 -0
  192. package/docs/video/build/frames/07-verify-9.png +0 -0
  193. package/docs/video/build/frames/08-closing-10.png +0 -0
  194. package/docs/video/build/frames/08-closing-11.png +0 -0
  195. package/docs/video/build/frames/08-doctor-11.png +0 -0
  196. package/docs/video/build/frames/08-doctor-9.png +0 -0
  197. package/docs/video/build/frames/09-rollback-10.png +0 -0
  198. package/docs/video/build/frames/09-rollback-12.png +0 -0
  199. package/docs/video/build/frames/10-principles-11.png +0 -0
  200. package/docs/video/build/frames/10-principles-13.png +0 -0
  201. package/docs/video/build/frames/11-closing-12.png +0 -0
  202. package/docs/video/build/frames/11-closing-14.png +0 -0
  203. package/docs/video/build/segments/01-opening.mp4 +0 -0
  204. package/docs/video/build/segments/01-opening.txt +3 -0
  205. package/docs/video/build/segments/02-pain.mp4 +0 -0
  206. package/docs/video/build/segments/02-pain.txt +5 -0
  207. package/docs/video/build/segments/03-solution.mp4 +0 -0
  208. package/docs/video/build/segments/03-solution.txt +3 -0
  209. package/docs/video/build/segments/04-install.mp4 +0 -0
  210. package/docs/video/build/segments/04-install.txt +3 -0
  211. package/docs/video/build/segments/04-setup.mp4 +0 -0
  212. package/docs/video/build/segments/04-setup.txt +3 -0
  213. package/docs/video/build/segments/05-dryrun.mp4 +0 -0
  214. package/docs/video/build/segments/05-dryrun.txt +3 -0
  215. package/docs/video/build/segments/05-init.mp4 +0 -0
  216. package/docs/video/build/segments/05-init.txt +3 -0
  217. package/docs/video/build/segments/05-interactive.mp4 +0 -0
  218. package/docs/video/build/segments/05-interactive.txt +5 -0
  219. package/docs/video/build/segments/06-dryrun.mp4 +0 -0
  220. package/docs/video/build/segments/06-dryrun.txt +3 -0
  221. package/docs/video/build/segments/06-onboard.mp4 +0 -0
  222. package/docs/video/build/segments/06-onboard.txt +5 -0
  223. package/docs/video/build/segments/06-run.mp4 +0 -0
  224. package/docs/video/build/segments/06-run.txt +3 -0
  225. package/docs/video/build/segments/07-onboard.mp4 +0 -0
  226. package/docs/video/build/segments/07-onboard.txt +5 -0
  227. package/docs/video/build/segments/07-verify.mp4 +0 -0
  228. package/docs/video/build/segments/07-verify.txt +5 -0
  229. package/docs/video/build/segments/08-closing.mp4 +0 -0
  230. package/docs/video/build/segments/08-closing.txt +3 -0
  231. package/docs/video/build/segments/08-doctor.mp4 +0 -0
  232. package/docs/video/build/segments/08-doctor.txt +3 -0
  233. package/docs/video/build/segments/09-rollback.mp4 +0 -0
  234. package/docs/video/build/segments/09-rollback.txt +3 -0
  235. package/docs/video/build/segments/10-principles.mp4 +0 -0
  236. package/docs/video/build/segments/10-principles.txt +3 -0
  237. package/docs/video/build/segments/11-closing.mp4 +0 -0
  238. package/docs/video/build/segments/11-closing.txt +3 -0
  239. package/docs/video/build/segments/final.txt +8 -0
  240. package/docs/video/build-ai/audio/01-hook.mp3 +0 -0
  241. package/docs/video/build-ai/audio/02-pain.mp3 +0 -0
  242. package/docs/video/build-ai/audio/03-solution.mp3 +0 -0
  243. package/docs/video/build-ai/audio/04-how.mp3 +0 -0
  244. package/docs/video/build-ai/audio/05-safe.mp3 +0 -0
  245. package/docs/video/build-ai/audio/06-closing.mp3 +0 -0
  246. package/docs/video/build-ai/clips/01-hook.mp4 +0 -0
  247. package/docs/video/build-ai/clips/02-pain.mp4 +0 -0
  248. package/docs/video/build-ai/clips/03-solution.mp4 +0 -0
  249. package/docs/video/build-ai/clips/04-how.mp4 +0 -0
  250. package/docs/video/build-ai/clips/05-safe.mp4 +0 -0
  251. package/docs/video/build-ai/clips/06-closing.mp4 +0 -0
  252. package/docs/video/build-ai/first-frame-02-pain.png +0 -0
  253. package/docs/video/build-ai/first-frame-03-solution.png +0 -0
  254. package/docs/video/build-ai/first-frame-04-how.png +0 -0
  255. package/docs/video/build-ai/first-frame-05-safe.png +0 -0
  256. package/docs/video/build-ai/segments/01-hook.caption.txt +2 -0
  257. package/docs/video/build-ai/segments/01-hook.mp4 +0 -0
  258. package/docs/video/build-ai/segments/02-pain.mp4 +0 -0
  259. package/docs/video/build-ai/segments/03-solution.mp4 +0 -0
  260. package/docs/video/build-ai/segments/04-how.mp4 +0 -0
  261. package/docs/video/build-ai/segments/05-safe.mp4 +0 -0
  262. package/docs/video/build-ai/segments/06-closing.mp4 +0 -0
  263. package/docs/video/build-ai/segments/cap-01-hook.png +0 -0
  264. package/docs/video/build-ai/segments/cap-02-pain.png +0 -0
  265. package/docs/video/build-ai/segments/cap-03-solution.png +0 -0
  266. package/docs/video/build-ai/segments/cap-04-how.png +0 -0
  267. package/docs/video/build-ai/segments/cap-05-safe.png +0 -0
  268. package/docs/video/build-ai/segments/cap-06-closing.png +0 -0
  269. package/docs/video/build-ai/segments/final.txt +6 -0
  270. package/docs/video/build-posters/audio/01-hook.mp3 +0 -0
  271. package/docs/video/build-posters/audio/02-pain.mp3 +0 -0
  272. package/docs/video/build-posters/audio/03-solution.mp3 +0 -0
  273. package/docs/video/build-posters/audio/04-how.mp3 +0 -0
  274. package/docs/video/build-posters/audio/05-safe.mp3 +0 -0
  275. package/docs/video/build-posters/audio/06-closing.mp3 +0 -0
  276. package/docs/video/build-posters/cap-01-hook.png +0 -0
  277. package/docs/video/build-posters/cap-02-pain.png +0 -0
  278. package/docs/video/build-posters/cap-03-solution.png +0 -0
  279. package/docs/video/build-posters/cap-04-how.png +0 -0
  280. package/docs/video/build-posters/cap-05-safe.png +0 -0
  281. package/docs/video/build-posters/cap-06-closing.png +0 -0
  282. package/docs/video/build-posters/card-01-hook.png +0 -0
  283. package/docs/video/build-posters/card-06-closing.png +0 -0
  284. package/docs/video/build-posters/segments/01-hook.mp4 +0 -0
  285. package/docs/video/build-posters/segments/02-pain.mp4 +0 -0
  286. package/docs/video/build-posters/segments/03-solution.mp4 +0 -0
  287. package/docs/video/build-posters/segments/04-how.mp4 +0 -0
  288. package/docs/video/build-posters/segments/05-safe.mp4 +0 -0
  289. package/docs/video/build-posters/segments/06-closing.mp4 +0 -0
  290. package/docs/video/build-posters/segments/final.txt +6 -0
  291. package/docs/video/generate-video-ai.mjs +334 -0
  292. package/docs/video/generate-video-posters.mjs +204 -0
  293. package/docs/video/generate-video.mjs +426 -0
  294. package/docs/video/outline.zh-CN.md +102 -0
  295. package/docs/video/trellis-demo-video-ai.mp4 +0 -0
  296. package/docs/video/trellis-demo-video.mp4 +0 -0
  297. package/docs/video/voiceover.zh-CN.md +49 -0
  298. package/package.json +6 -2
  299. package/schema/builtin-skills/trellis-runtime/SKILL.md +117 -0
  300. package/schema/capability-selection.example.yaml +23 -0
  301. package/schema/scope.example.yaml +1 -1
  302. package/schema/servers.example.yaml +15 -1
@@ -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 four agents. It does not yet
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 four agents. A skill built around Claude
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 four," and can be restricted with an explicit
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 four agents' configs or restarting them, if the hub supports
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
- That changed with gateway mode (below), which made it unavoidable: in
249
- gateway mode the agent connects to Trellis, and Trellis connects to the
250
- remote server, so the agent's own OAuth flow is no longer on the path.
251
- Trellis now implements the client half itself — discovery (RFC 8414 /
252
- RFC 9728), dynamic client registration (RFC 7591), authorization code
253
- with PKCE S256 (RFC 7636), and the refresh grant — in `src/lib/oauth/`.
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 `trellis mcp auth <server>` ever opens a browser.** It is run by
259
- a human, once. The gateway never initiates an interactive flow under
260
- any circumstance; a server with no stored credential is skipped the
261
- same way an unreachable one is.
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 gateway does it
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 applies: each agent keeps using its own
276
- native OAuth flow, exactly as before.
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 as
315
- `<server>__<tool>`. Secrets resolve through `resolveSecretEnv` exactly as
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. Remote servers needing real OAuth
322
- become reachable from every agent, including pi, for the same reason.
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 (defaults to `@modelcontextprotocol/server-memory`,
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 (P5 in the roadmap evaluates embedding into an existing one —
351
- mcp-router's or skills-hub's — before building a new one)
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
- `probeMcpServer` has something deterministic to handshake against inside
453
- the container without depending on a real npm package or network access.
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.
@@ -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>