@agentplate/cli 1.0.0

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 (139) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +206 -0
  4. package/agents/architect.md +108 -0
  5. package/agents/builder.md +97 -0
  6. package/agents/coordinator.md +113 -0
  7. package/agents/deployer.md +117 -0
  8. package/agents/devops.md +114 -0
  9. package/agents/lead.md +107 -0
  10. package/agents/merger.md +103 -0
  11. package/agents/reviewer.md +90 -0
  12. package/agents/scout.md +95 -0
  13. package/agents/verifier.md +106 -0
  14. package/package.json +64 -0
  15. package/src/agents/guard-rules.ts +55 -0
  16. package/src/agents/identity.test.ts +161 -0
  17. package/src/agents/identity.ts +229 -0
  18. package/src/agents/manifest.test.ts +260 -0
  19. package/src/agents/manifest.ts +286 -0
  20. package/src/agents/overlay.test.ts +190 -0
  21. package/src/agents/overlay.ts +212 -0
  22. package/src/agents/system-prompt.test.ts +53 -0
  23. package/src/agents/system-prompt.ts +95 -0
  24. package/src/agents/turn-runner.ts +79 -0
  25. package/src/commands/coordinator.test.ts +75 -0
  26. package/src/commands/coordinator.ts +259 -0
  27. package/src/commands/deploy.test.ts +504 -0
  28. package/src/commands/deploy.ts +874 -0
  29. package/src/commands/doctor.test.ts +106 -0
  30. package/src/commands/doctor.ts +208 -0
  31. package/src/commands/init.ts +71 -0
  32. package/src/commands/log.ts +51 -0
  33. package/src/commands/mail.ts +197 -0
  34. package/src/commands/merge.ts +127 -0
  35. package/src/commands/model.ts +58 -0
  36. package/src/commands/prime.ts +61 -0
  37. package/src/commands/reap.ts +87 -0
  38. package/src/commands/serve.ts +61 -0
  39. package/src/commands/setup.ts +48 -0
  40. package/src/commands/ship.test.ts +106 -0
  41. package/src/commands/ship.ts +202 -0
  42. package/src/commands/skill.test.ts +458 -0
  43. package/src/commands/skill.ts +730 -0
  44. package/src/commands/sling.ts +365 -0
  45. package/src/commands/status.ts +60 -0
  46. package/src/commands/stop.ts +56 -0
  47. package/src/commands/tui.ts +199 -0
  48. package/src/commands/worktree.ts +77 -0
  49. package/src/config.test.ts +92 -0
  50. package/src/config.ts +202 -0
  51. package/src/db/sqlite.test.ts +77 -0
  52. package/src/db/sqlite.ts +102 -0
  53. package/src/deploy/audit.test.ts +233 -0
  54. package/src/deploy/audit.ts +245 -0
  55. package/src/deploy/context.test.ts +243 -0
  56. package/src/deploy/context.ts +72 -0
  57. package/src/deploy/registry.test.ts +101 -0
  58. package/src/deploy/registry.ts +86 -0
  59. package/src/deploy/secrets.test.ts +129 -0
  60. package/src/deploy/secrets.ts +69 -0
  61. package/src/deploy/targets/docker-gha.test.ts +323 -0
  62. package/src/deploy/targets/docker-gha.ts +841 -0
  63. package/src/deploy/types.ts +153 -0
  64. package/src/errors.test.ts +42 -0
  65. package/src/errors.ts +69 -0
  66. package/src/events/store.test.ts +183 -0
  67. package/src/events/store.ts +201 -0
  68. package/src/index.ts +137 -0
  69. package/src/insights/quality-gates.ts +73 -0
  70. package/src/json.test.ts +28 -0
  71. package/src/json.ts +50 -0
  72. package/src/logging/color.ts +62 -0
  73. package/src/logging/logger.ts +60 -0
  74. package/src/logging/sanitizer.test.ts +36 -0
  75. package/src/logging/sanitizer.ts +57 -0
  76. package/src/mail/client.test.ts +192 -0
  77. package/src/mail/client.ts +188 -0
  78. package/src/mail/store.test.ts +279 -0
  79. package/src/mail/store.ts +311 -0
  80. package/src/merge/lock.test.ts +88 -0
  81. package/src/merge/lock.ts +84 -0
  82. package/src/merge/queue.test.ts +136 -0
  83. package/src/merge/queue.ts +177 -0
  84. package/src/merge/resolver.test.ts +219 -0
  85. package/src/merge/resolver.ts +274 -0
  86. package/src/paths.ts +36 -0
  87. package/src/providers/apply.test.ts +90 -0
  88. package/src/providers/apply.ts +66 -0
  89. package/src/providers/registry.test.ts +74 -0
  90. package/src/providers/registry.ts +254 -0
  91. package/src/runtimes/claude.ts +313 -0
  92. package/src/runtimes/codex.ts +280 -0
  93. package/src/runtimes/cursor.ts +247 -0
  94. package/src/runtimes/gemini.ts +173 -0
  95. package/src/runtimes/mock.ts +71 -0
  96. package/src/runtimes/opencode.ts +259 -0
  97. package/src/runtimes/registry.test.ts +924 -0
  98. package/src/runtimes/registry.ts +63 -0
  99. package/src/runtimes/resolve.ts +45 -0
  100. package/src/runtimes/types.ts +97 -0
  101. package/src/scaffold.ts +68 -0
  102. package/src/secrets.test.ts +51 -0
  103. package/src/secrets.ts +78 -0
  104. package/src/serve/api.ts +667 -0
  105. package/src/serve/server.test.ts +433 -0
  106. package/src/serve/server.ts +271 -0
  107. package/src/serve/system.ts +90 -0
  108. package/src/serve/weather.ts +140 -0
  109. package/src/sessions/reaper.test.ts +162 -0
  110. package/src/sessions/reaper.ts +149 -0
  111. package/src/sessions/store.test.ts +351 -0
  112. package/src/sessions/store.ts +350 -0
  113. package/src/skills/distiller.test.ts +498 -0
  114. package/src/skills/distiller.ts +426 -0
  115. package/src/skills/feedback.test.ts +300 -0
  116. package/src/skills/feedback.ts +168 -0
  117. package/src/skills/lifecycle.ts +169 -0
  118. package/src/skills/retrieval.test.ts +421 -0
  119. package/src/skills/retrieval.ts +365 -0
  120. package/src/skills/safety.test.ts +335 -0
  121. package/src/skills/safety.ts +216 -0
  122. package/src/skills/store.test.ts +425 -0
  123. package/src/skills/store.ts +684 -0
  124. package/src/skills/types.ts +107 -0
  125. package/src/types.ts +442 -0
  126. package/src/utils/detect.test.ts +35 -0
  127. package/src/utils/detect.ts +82 -0
  128. package/src/version.test.ts +19 -0
  129. package/src/version.ts +7 -0
  130. package/src/wizard/setup.ts +254 -0
  131. package/src/worktree/manager.test.ts +181 -0
  132. package/src/worktree/manager.ts +229 -0
  133. package/templates/overlay.md.tmpl +102 -0
  134. package/ui/dist/assets/index-C7rXIMER.css +1 -0
  135. package/ui/dist/assets/index-W4kbr4by.js +4526 -0
  136. package/ui/dist/favicon.svg +21 -0
  137. package/ui/dist/index.html +16 -0
  138. package/ui/dist/logo-clay.svg +21 -0
  139. package/ui/dist/logo.svg +18 -0
@@ -0,0 +1,102 @@
1
+ # DO NOT EDIT — generated by `agentplate sling`
2
+ # This per-task overlay is rewritten on every spawn. To change the structure,
3
+ # edit the template at `templates/overlay.md.tmpl` in the Agentplate repo, not this
4
+ # emitted copy.
5
+
6
+ ## Your Assignment
7
+
8
+ - **Agent Name:** {{AGENT_NAME}}
9
+ - **Capability:** {{CAPABILITY}}
10
+ - **Task ID:** {{TASK_ID}}
11
+ - **Spec:** {{SPEC_PATH}}
12
+ - **Branch:** {{BRANCH_NAME}}
13
+ - **Worktree:** {{WORKTREE_PATH}}
14
+ - **Parent:** {{PARENT_AGENT}}
15
+ - **Depth:** {{DEPTH}}
16
+
17
+ You are a **{{CAPABILITY}}** agent. The base definition at the end of this file
18
+ describes HOW you work; this header describes WHAT you have been assigned.
19
+
20
+ ## Working Directory
21
+
22
+ Your worktree root is: `{{WORKTREE_PATH}}`
23
+
24
+ **CRITICAL**: every file you create, modify, or delete MUST live under this
25
+ directory. Writing to the canonical project root instead of your worktree is a
26
+ critical boundary violation — your work is isolated here so it can be merged
27
+ cleanly later. You MAY read files anywhere in the repo for context, but all
28
+ WRITES go to your worktree.
29
+
30
+ ## File Scope (exclusive ownership)
31
+
32
+ These paths are relative to your worktree root. You may ONLY modify the files
33
+ listed below. If you need a change outside this scope, send mail to your parent
34
+ agent requesting it — do not edit out-of-scope files yourself.
35
+
36
+ {{FILE_SCOPE}}
37
+
38
+ {{SKILLS}}
39
+
40
+ ## Communication Protocol
41
+
42
+ All coordination happens over the Agentplate mail bus. Your address is
43
+ **{{AGENT_NAME}}**.
44
+
45
+ ```bash
46
+ # Check your inbox regularly (especially after finishing a unit of work)
47
+ agentplate mail check --agent {{AGENT_NAME}}
48
+
49
+ # Send a status update to your parent
50
+ agentplate mail send --to {{PARENT_AGENT}} --subject "status" \
51
+ --body "Progress update here" --type status --from {{AGENT_NAME}}
52
+
53
+ # Ask a blocking question (use a higher priority so it surfaces promptly)
54
+ agentplate mail send --to {{PARENT_AGENT}} --subject "question" \
55
+ --body "Your question here" --type question --priority high --from {{AGENT_NAME}}
56
+
57
+ # Reply within an existing thread
58
+ agentplate mail reply <message-id> --body "Your reply" --from {{AGENT_NAME}}
59
+ ```
60
+
61
+ If you hit a blocker you cannot resolve, send mail with
62
+ `--type error --priority urgent` and stop rather than guessing.
63
+
64
+ ## Parallel Siblings
65
+
66
+ {{SIBLINGS}}
67
+
68
+ ## Completion Protocol
69
+
70
+ Before you report completion you MUST, in order:
71
+
72
+ 1. Run every quality gate listed below and make sure each one passes.
73
+ 2. Commit all of your changes to your branch (`{{BRANCH_NAME}}`). Do NOT push to
74
+ the canonical branch — your work is merged for you via `agentplate merge`.
75
+ 3. Send a single terminal mail to your parent so the runner knows you are done:
76
+
77
+ ```bash
78
+ agentplate mail send --to {{PARENT_AGENT}} --subject "Done: {{TASK_ID}}" \
79
+ --body "Summary of what you changed and the quality-gate results" \
80
+ --type worker_done --from {{AGENT_NAME}}
81
+ ```
82
+
83
+ Read-only capabilities (scout, reviewer) skip the commit step but still send the
84
+ terminal mail with a summary of their findings.
85
+
86
+ ### Quality Gates
87
+
88
+ {{QUALITY_GATES}}
89
+
90
+ ## Constraints
91
+
92
+ {{CONSTRAINTS}}
93
+
94
+ ## Spawning Sub-Workers
95
+
96
+ {{CAN_SPAWN}}
97
+
98
+ ---
99
+
100
+ ## Base Definition (the HOW)
101
+
102
+ {{BASE_DEFINITION}}
@@ -0,0 +1 @@
1
+ :root{--bg: #08090f;--bg-rail: #0b0c14;--bg-topbar: #0c0e16;--bg-card: #14161f;--bg-card-2: #1b1e2a;--bg-input: #1d2030;--border: #262a38;--border-soft: #1c1f2b;--text: #eef0f6;--text-dim: #a3a9bd;--text-faint: #6b7188;--accent: #fb4b38;--accent-2: #ff6a4d;--accent-soft: rgba(251, 75, 56, .14);--accent-border: rgba(251, 75, 56, .45);--grad-accent: linear-gradient(135deg, #ff6a4d 0%, #fb4b38 55%, #e0245e 100%);--grad-brand: linear-gradient(135deg, #ff7a3d, #fb4b38);--ok: #2dd4a7;--ok-soft: rgba(45, 212, 167, .14);--grad-ok: linear-gradient(135deg, #34e7b4, #10b981);--warn: #fbbf24;--warn-soft: rgba(251, 191, 36, .14);--grad-warn: linear-gradient(135deg, #fcd34d, #f59e0b);--err: #fb4b38;--err-soft: rgba(251, 75, 56, .14);--info: #4f8cff;--info-soft: rgba(79, 140, 255, .14);--grad-info: linear-gradient(135deg, #6aa8ff, #3b6cf6);--violet: #a78bfa;--violet-soft: rgba(167, 139, 250, .14);--grad-violet: linear-gradient(135deg, #c4b5fd, #8b5cf6);--cyan: #22d3ee;--cyan-soft: rgba(34, 211, 238, .14);--grad-cyan: linear-gradient(135deg, #67e8f9, #06b6d4);--rail-w: 80px;--topbar-h: 54px;--statusbar-h: 30px;--radius: 16px;--radius-sm: 10px;--shadow-card: 0 1px 0 rgba(255, 255, 255, .03) inset, 0 8px 24px rgba(0, 0, 0, .28);--glow-accent: 0 6px 20px rgba(251, 75, 56, .35)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);background-image:radial-gradient(900px 500px at 100% -5%,rgba(251,75,56,.1),transparent 60%),radial-gradient(800px 500px at -5% 0%,rgba(124,92,246,.1),transparent 55%),radial-gradient(700px 600px at 50% 110%,rgba(34,211,238,.06),transparent 60%);background-attachment:fixed;color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Inter,Roboto,Helvetica,Arial,sans-serif;font-size:14px;-webkit-font-smoothing:antialiased}.os{display:grid;grid-template-columns:var(--rail-w) 1fr;grid-template-rows:var(--topbar-h) 1fr var(--statusbar-h);grid-template-areas:"rail topbar" "rail main" "rail status";height:100vh;overflow:hidden}.rail{grid-area:rail;background:var(--bg-rail);border-right:1px solid var(--border);display:flex;flex-direction:column;align-items:center;padding:10px 0;gap:4px;overflow-y:auto}.rail::-webkit-scrollbar{width:0}.rail-logo{width:42px;height:42px;border-radius:13px;display:grid;place-items:center;color:#fff;background:var(--grad-brand);box-shadow:var(--glow-accent);margin-bottom:12px}.rail-item{width:62px;padding:9px 0 7px;border:none;background:transparent;color:var(--text-faint);border-radius:14px;display:flex;flex-direction:column;align-items:center;gap:5px;cursor:pointer;font:inherit;position:relative;transition:color .15s,background .15s,transform .1s}.rail-item:hover{color:var(--text);background:var(--bg-card)}.rail-item:active{transform:scale(.95)}.rail-item.active{color:#fff;background:var(--accent-soft)}.rail-item.active:before{content:"";position:absolute;left:-10px;top:50%;transform:translateY(-50%);width:4px;height:22px;border-radius:0 4px 4px 0;background:var(--grad-accent)}.rail-item.active .ri-icon{color:var(--accent-2);filter:drop-shadow(0 0 8px rgba(251,75,56,.55))}.rail-item .ri-icon{display:grid;place-items:center;line-height:1}.rail-item .ri-label{font-size:10px;font-weight:600;letter-spacing:.01em}.topbar{grid-area:topbar;background:var(--bg-topbar);border-bottom:1px solid var(--border);display:flex;align-items:center;gap:14px;padding:0 16px}.topbar-brand{display:flex;align-items:center;gap:9px;font-weight:700;font-size:15px}.topbar-brand .brand-glyph{display:grid;place-items:center;color:var(--accent-2)}.ver-pill{font-size:10px;font-weight:800;color:#fff;background:var(--grad-accent);border-radius:7px;padding:2px 7px;letter-spacing:.04em;box-shadow:0 2px 8px #fb4b3866}.topbar-spacer{flex:1}.topbar-search{width:min(420px,38vw);display:flex;align-items:center;gap:9px;background:var(--bg-input);border:1px solid var(--border);border-radius:11px;padding:8px 12px;color:var(--text-faint);font:inherit;font-size:13px;text-align:left;cursor:pointer;transition:border-color .15s,box-shadow .15s}.topbar-search span{flex:1}.topbar-search:hover{border-color:var(--accent-border);box-shadow:0 0 0 3px var(--accent-soft)}.topbar-search kbd{margin-left:auto;font-size:11px;background:var(--bg-card-2);border:1px solid var(--border);border-radius:5px;padding:1px 5px;color:var(--text-dim)}.topbar-icon{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;color:var(--text-dim);background:transparent;border:none;cursor:pointer;font-size:16px;position:relative}.topbar-icon:hover{background:var(--bg-card);color:var(--text)}.topbar-badge{position:absolute;top:1px;right:1px;min-width:15px;height:15px;padding:0 4px;border-radius:8px;background:var(--accent);color:#fff;font-size:9.5px;font-weight:800;line-height:15px;text-align:center;box-shadow:0 0 0 2px var(--bg-topbar, #0d0e11)}.notif-wrap{position:relative;display:inline-flex}.notif-panel{position:absolute;top:calc(100% + 8px);right:0;width:360px;max-height:460px;overflow-y:auto;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 16px 40px #00000080;z-index:60}.notif-head{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--border-soft);position:sticky;top:0;background:var(--bg-card)}.notif-title{font-weight:800;font-size:13.5px}.notif-count{font-size:12px;color:var(--text-faint)}.notif-empty{padding:28px 16px;text-align:center;color:var(--text-faint);font-size:13px}.notif-list{list-style:none;margin:0;padding:0}.notif-item{display:flex;gap:10px;padding:11px 14px;border-bottom:1px solid var(--border-soft);align-items:flex-start}.notif-item.clickable{cursor:pointer}.notif-item.clickable:hover{background:var(--bg-card-2)}.notif-item.fresh{background:#f5402d0f}.notif-dot{width:9px;height:9px;border-radius:50%;margin-top:4px;flex:0 0 auto}.notif-body{min-width:0;flex:1}.notif-row1{display:flex;align-items:baseline;gap:8px}.notif-agent{font-weight:700;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notif-label{font-size:10.5px;color:var(--text-faint);letter-spacing:.02em}.notif-ago{margin-left:auto;font-size:11px;color:var(--text-faint);white-space:nowrap}.notif-summary{font-size:12.5px;color:var(--text-dim);margin-top:2px;word-break:break-word}.topbar-user{display:flex;align-items:center;gap:8px;padding:4px 8px 4px 4px;border-radius:18px}.avatar{width:30px;height:30px;border-radius:50%;background:var(--grad-accent);color:#fff;display:grid;place-items:center;font-weight:800;font-size:13px;box-shadow:var(--glow-accent)}.main{grid-area:main;overflow-y:auto;padding:26px 30px 40px}.statusbar{grid-area:status;background:var(--bg-topbar);border-top:1px solid var(--border);display:flex;align-items:center;gap:20px;padding:0 16px;font-size:11.5px;color:var(--text-dim)}.sb-item{display:flex;align-items:center;gap:6px}.sb-key{color:var(--text-faint);font-weight:600;letter-spacing:.02em}.sb-val{color:var(--text);font-weight:600}.sb-bar{width:46px;height:5px;border-radius:3px;background:var(--bg-card-2);overflow:hidden}.sb-bar>span{display:block;height:100%;border-radius:3px}.sb-spacer{flex:1}.sb-dot{width:7px;height:7px;border-radius:50%;display:inline-block}.page-head{margin-bottom:22px}.page-title{display:flex;align-items:center;gap:12px;font-size:30px;font-weight:800;letter-spacing:-.02em;margin:0}.page-sub{color:var(--text-dim);margin:6px 0 0;font-size:14px}.head-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:16px;margin-bottom:22px}.stat{background:var(--bg-card);border:1px solid var(--border-soft);border-radius:var(--radius);padding:18px 20px;min-height:150px;display:flex;flex-direction:column;position:relative;overflow:hidden;box-shadow:var(--shadow-card);transition:transform .15s,border-color .15s}.stat:after{content:"";position:absolute;inset:0 0 auto 0;height:2px;background:var(--grad-accent);opacity:.7}.stat:hover{transform:translateY(-2px);border-color:var(--border)}.stat-top{display:flex;align-items:center;justify-content:space-between}.stat-label{color:var(--text-dim);font-size:14px;font-weight:500}.stat-icon{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;color:#fff;background:var(--grad-accent);box-shadow:0 4px 12px #00000040}.stat-icon.ok{background:var(--grad-ok)}.stat-icon.warn{background:var(--grad-warn)}.stat-icon.info{background:var(--grad-info)}.stat-icon.violet{background:var(--grad-violet)}.stat-icon.cyan{background:var(--grad-cyan)}.stat-value{font-size:42px;font-weight:800;margin-top:auto;letter-spacing:-.02em;line-height:1}.stat-value.sm{font-size:30px}.stat-value.accent{color:var(--accent-2)}.stat-value.ok{color:var(--ok)}.stat-sub{color:var(--text-faint);font-size:12px;margin-top:6px}.title-icon{width:40px;height:40px;border-radius:13px;display:grid;place-items:center;color:#fff;background:var(--grad-accent);box-shadow:var(--glow-accent);flex:0 0 auto}.title-icon.ok{background:var(--grad-ok);box-shadow:0 6px 18px #10b98152}.title-icon.warn{background:var(--grad-warn);box-shadow:0 6px 18px #f59e0b52}.title-icon.info{background:var(--grad-info);box-shadow:0 6px 18px #3b6cf652}.title-icon.violet{background:var(--grad-violet);box-shadow:0 6px 18px #8b5cf652}.title-icon.cyan{background:var(--grad-cyan);box-shadow:0 6px 18px #06b6d452}.card{background:var(--bg-card);border:1px solid var(--border-soft);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow-card)}.card-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.card-title{font-size:16px;font-weight:700;display:flex;align-items:center;gap:9px}.card-title svg{color:var(--accent-2)}.card-meta{color:var(--text-faint);font-size:12px}.btn{border:1px solid var(--border);background:var(--bg-card-2);color:var(--text);border-radius:9px;padding:8px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:7px}.btn:hover:not(:disabled){border-color:var(--accent-border)}.btn.primary{background:var(--grad-accent);border-color:transparent;color:#fff;box-shadow:var(--glow-accent)}.btn.primary:hover:not(:disabled){filter:brightness(1.08);border-color:transparent}.btn:disabled{opacity:.5;cursor:not-allowed}.seg{display:inline-flex;background:var(--bg-card-2);border:1px solid var(--border);border-radius:10px;padding:3px;gap:2px}.seg button{border:none;background:transparent;color:var(--text-dim);border-radius:7px;padding:6px 14px;font:inherit;font-size:13px;font-weight:600;cursor:pointer}.seg button.active{background:var(--grad-accent);color:#fff;box-shadow:0 2px 10px #fb4b3859}.badge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:600;border-radius:7px;padding:3px 9px;border:1px solid transparent}.badge .bdot{width:6px;height:6px;border-radius:50%;background:currentColor}.badge.ok{color:var(--ok);background:var(--ok-soft);border-color:#34d3994d}.badge.warn{color:var(--warn);background:var(--warn-soft);border-color:#fbbf244d}.badge.err{color:var(--err);background:var(--err-soft);border-color:var(--accent-border)}.badge.info{color:var(--info);background:var(--info-soft);border-color:#60a5fa4d}.badge.accent{color:var(--accent-2);background:var(--accent-soft);border-color:var(--accent-border)}.badge.neutral{color:var(--text-dim);background:var(--bg-card-2);border-color:var(--border)}.badge.violet{color:var(--violet);background:#a78bfa1f;border-color:#a78bfa4d}.bar{height:7px;border-radius:4px;background:var(--bg-card-2);overflow:hidden}.bar>span{display:block;height:100%;border-radius:4px;background:var(--grad-accent)}.grid-wrap{overflow-x:auto}table.grid{width:100%;border-collapse:collapse;font-size:13px}table.grid th{text-align:left;color:var(--text-faint);font-weight:600;font-size:11px;letter-spacing:.05em;text-transform:uppercase;padding:8px 12px;border-bottom:1px solid var(--border)}table.grid td{padding:11px 12px;border-bottom:1px solid var(--border-soft);color:var(--text)}table.grid tr:last-child td{border-bottom:none}.row-click{cursor:pointer}.row-click:hover{background:var(--bg-card-2)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.dim{color:var(--text-dim)}.faint{color:var(--text-faint)}.nowrap{white-space:nowrap}.empty{color:var(--text-faint);padding:24px;text-align:center}.row-2col{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:1000px){.row-2col{grid-template-columns:1fr}}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--border);border-radius:6px}::-webkit-scrollbar-track{background:transparent}.cmdk-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0405098c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:flex;justify-content:center;align-items:flex-start;padding-top:12vh;z-index:80}.cmdk{width:min(560px,92vw);background:var(--bg-card);border:1px solid var(--border);border-radius:16px;box-shadow:0 24px 70px #0000008c;overflow:hidden;display:flex;flex-direction:column}.cmdk-input{width:100%;border:none;border-bottom:1px solid var(--border-soft);background:transparent;color:var(--text);font:inherit;font-size:16px;padding:16px 18px;outline:none}.cmdk-input::placeholder{color:var(--text-faint)}.cmdk-list{max-height:50vh;overflow-y:auto;padding:6px}.cmdk-section{font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-faint);padding:10px 10px 4px}.cmdk-item{width:100%;display:flex;align-items:center;gap:11px;padding:9px 11px;border:none;background:transparent;color:var(--text);font:inherit;font-size:14px;border-radius:10px;cursor:pointer;text-align:left}.cmdk-item.active{background:var(--accent-soft)}.cmdk-icon{display:grid;place-items:center;color:var(--text-dim);flex:0 0 auto}.cmdk-item.active .cmdk-icon{color:var(--accent-2)}.cmdk-label{flex:1;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cmdk-kind{font-size:11px;color:var(--text-faint);border:1px solid var(--border);border-radius:6px;padding:1px 6px}.cmdk-empty{padding:26px;text-align:center;color:var(--text-faint)}.cmdk-foot{display:flex;gap:16px;padding:9px 14px;border-top:1px solid var(--border-soft);font-size:11.5px;color:var(--text-faint)}.cmdk-foot kbd{background:var(--bg-card-2);border:1px solid var(--border);border-radius:5px;padding:1px 5px;margin-right:3px;font-size:10.5px}