total-recall-brain 3.45.0 → 3.46.1

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 (363) hide show
  1. package/bin/total-recall.mjs +7 -2
  2. package/frontend/dist/assets/index-BRYE1jmv.css +1 -0
  3. package/frontend/dist/assets/index-D1goIPjC.js +5598 -0
  4. package/frontend/dist/index.html +2 -2
  5. package/frontend/dist/sw.js +5 -4
  6. package/frontend/src/App.tsx +183 -236
  7. package/frontend/src/api/auth-inventory.ts +62 -0
  8. package/frontend/src/api/memory.ts +13 -8
  9. package/frontend/src/api/plugin-credentials.ts +23 -0
  10. package/frontend/src/api/plugins.ts +37 -53
  11. package/frontend/src/api/workspace-drawers.ts +97 -0
  12. package/frontend/src/components/BrainSelector.tsx +9 -3
  13. package/frontend/src/components/plugins/PluginPanel.tsx +83 -42
  14. package/frontend/src/components/plugins/PluginSettings.tsx +10 -20
  15. package/frontend/src/components/plugins/PluginWorkspace.tsx +367 -0
  16. package/frontend/src/components/plugins/ScopedPluginCommands.tsx +142 -0
  17. package/frontend/src/components/plugins/plugin-frame.ts +44 -33
  18. package/frontend/src/components/plugins/scoped-plugin-operations.ts +28 -0
  19. package/frontend/src/components/workspace/DrawerChat.tsx +110 -0
  20. package/frontend/src/components/workspace/DrawerLayout.tsx +196 -0
  21. package/frontend/src/components/workspace/DrawerMarkup.tsx +49 -0
  22. package/frontend/src/components/workspace/PluginChunkLibrary.tsx +92 -0
  23. package/frontend/src/components/workspace/PluginHome.tsx +76 -0
  24. package/frontend/src/components/workspace/WorkspaceDrawers.tsx +96 -0
  25. package/frontend/src/components/workspace/WorkspacePage.tsx +95 -0
  26. package/frontend/src/components/workspace/usePluginDesign.ts +38 -0
  27. package/frontend/src/index.css +409 -136
  28. package/frontend/src/pages/HelpPage.tsx +15 -46
  29. package/frontend/src/pages/MemoryPage.tsx +19 -36
  30. package/frontend/src/pages/SettingsPage.tsx +1 -1
  31. package/metadata.plugin.schema.json +53 -227
  32. package/package.json +1 -1
  33. package/scaffold/.agent/skills/plugin/SKILL.md +13 -11
  34. package/scaffold/.agent/skills/plugin/evals/README.md +14 -21
  35. package/scaffold/.agent/skills/plugin/evals/cases/01-fabricated-seed.mjs +15 -18
  36. package/scaffold/.agent/skills/plugin/evals/cases/02-reassuring-default.mjs +19 -24
  37. package/scaffold/.agent/skills/plugin/evals/cases/03-declared-template.mjs +12 -20
  38. package/scaffold/.agent/skills/plugin/evals/cases/04-home-collects-credential.mjs +35 -0
  39. package/scaffold/.agent/skills/plugin/evals/cases/05-host-leak-in-scaffold.mjs +8 -28
  40. package/scaffold/.agent/skills/plugin/evals/cases/06-correct-plugin.mjs +85 -47
  41. package/scaffold/.agent/skills/plugin/evals/run.mjs +17 -18
  42. package/scaffold/.agent/skills/plugin/prompts/05-credentials.md +4 -4
  43. package/scaffold/.agent/skills/plugin/prompts/07-scaffold.md +2 -2
  44. package/scaffold/.agent/skills/plugin/prompts/08-verify.md +4 -4
  45. package/scaffold/.agent/skills/plugin/references/anti-patterns.md +2 -2
  46. package/scaffold/.agent/skills/plugin/references/generative-home.md +38 -0
  47. package/scaffold/.agent/skills/plugin/references/scaffold.md +5 -5
  48. package/scaffold/.agent/skills/plugin/references/surfaces.md +13 -4
  49. package/scaffold/.agent/skills/plugin/scripts/record.mjs +75 -153
  50. package/scaffold/.agent/skills/plugin/subagents/plugin-reviewer.md +4 -4
  51. package/scaffold/.agent/skills/total-recall/plugins/auth/DESIGN.md +76 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/auth/README.md +3 -1
  53. package/scaffold/.agent/skills/total-recall/plugins/auth/cli.mjs +20 -15
  54. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +6 -6
  55. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +2 -1
  56. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +13 -51
  57. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/access-overview.md +17 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/agent-login.md +20 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/baseline-audit.md +22 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-repository-binding.md +17 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/credential-store-maintenance.md +17 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-password.md +18 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/dashboard-sessions.md +18 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/endpoint-probe.md +23 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/google-sign-in.md +21 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/mesh-machines.md +16 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/passkey-enrollment.md +21 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/registered-brains.md +16 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/scoped-access-keys.md +17 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/secret-inventory.md +25 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/chunks/signing-key-rotation.md +22 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +375 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/automations/{ui/DESIGN.md → DESIGN.md} +32 -21
  74. package/scaffold/.agent/skills/total-recall/plugins/automations/adapters.mjs +17 -1
  75. package/scaffold/.agent/skills/total-recall/plugins/automations/cli.mjs +10 -1
  76. package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +6 -6
  77. package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +4 -3
  78. package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +11 -27
  79. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/automations.js +2 -2
  80. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/control-ledger.md +42 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/local-inventory-triage.md +17 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/pending-control.md +39 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/run-evidence.md +41 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/schedule-vs-run-evidence.md +17 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/source-coverage.md +41 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/automations/ui/{card.js → home.js} +32 -27
  87. package/scaffold/.agent/skills/total-recall/plugins/code-quality/DESIGN.md +53 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +23 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +4 -2
  90. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +4 -2
  91. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -6
  92. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +2 -1
  93. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +40 -40
  94. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/config.md +15 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/detect.md +15 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/gate.md +15 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/init.md +15 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/report.md +17 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/run.md +17 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/chunks/snapshot.md +15 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +55 -23
  102. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/home.mjs +214 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/DESIGN.md +146 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -6
  105. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +2 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +51 -34
  107. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +1 -1
  108. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/create.md +35 -0
  109. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/history.md +35 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/library.md +49 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/list.md +42 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/promote.md +40 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/read.md +25 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/remove.md +26 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/rollback.md +26 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/show.md +53 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/status.md +40 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test-path.md +38 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/test.md +46 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/chunks/update.md +32 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/home.js +533 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/embeddings/DESIGN.md +110 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -6
  124. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +2 -1
  125. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +13 -10
  126. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/benchmark.md +49 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/coverage.md +53 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/models.md +43 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/pull.md +41 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/chunks/status.md +59 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/home.js +353 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/git/DESIGN.md +31 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/git/README.md +25 -1
  134. package/scaffold/.agent/skills/total-recall/plugins/git/cli.mjs +5 -1
  135. package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +6 -6
  136. package/scaffold/.agent/skills/total-recall/plugins/git/package.json +2 -1
  137. package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +17 -27
  138. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/commit-memory.mjs +30 -6
  139. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/fleet.mjs +24 -6
  140. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/secret-firewall.mjs +33 -7
  141. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/undo.mjs +29 -5
  142. package/scaffold/.agent/skills/total-recall/plugins/git/src/ops/unmerged.mjs +182 -0
  143. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/change-comparison.md +27 -0
  144. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/commit-identity.md +22 -0
  145. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/create-worktree.md +25 -0
  146. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/registered-worktrees.md +22 -0
  147. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/remove-worktree.md +23 -0
  148. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/repository-ledger.md +25 -0
  149. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/unmerged-work.md +22 -0
  150. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/upstream-divergence.md +17 -0
  151. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-conflict-triage.md +17 -0
  152. package/scaffold/.agent/skills/total-recall/plugins/git/ui/chunks/worktree-terminal.md +22 -0
  153. package/scaffold/.agent/skills/total-recall/plugins/git/ui/home.js +273 -0
  154. package/scaffold/.agent/skills/total-recall/plugins/mesh/DESIGN.md +35 -0
  155. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +4 -5
  156. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +9 -3
  157. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +6 -6
  158. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +2 -1
  159. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +37 -39
  160. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +5 -3
  161. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/active-device-dispatch.md +22 -0
  162. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-probe.md +25 -0
  163. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/control-server.md +22 -0
  164. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/credential-readiness.md +23 -0
  165. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/elected-leader.md +22 -0
  166. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/enrollment-key.md +22 -0
  167. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/file-receipt.md +25 -0
  168. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-execution.md +23 -0
  169. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/fleet-presence.md +23 -0
  170. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/interactive-ssh.md +22 -0
  171. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/local-enrollment.md +23 -0
  172. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/mesh-policy.md +23 -0
  173. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/network-atlas.md +25 -0
  174. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-roster.md +26 -0
  175. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/node-selection-proof.md +17 -0
  176. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/owner-observations.md +23 -0
  177. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/peer-path.md +23 -0
  178. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/pinned-leader.md +24 -0
  179. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/reachability-evidence-ladder.md +17 -0
  180. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/recorded-login.md +23 -0
  181. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/remote-execution.md +22 -0
  182. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/chunks/secret-grants.md +26 -0
  183. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/{card.js → home.js} +93 -22
  184. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/DESIGN.md +86 -0
  185. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/README.md +19 -0
  186. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +5 -1
  187. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
  188. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +2 -1
  189. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +43 -22
  190. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/chat.mjs +80 -0
  191. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/adapter-docs-freshness.md +16 -0
  192. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/chat-handoff.md +26 -0
  193. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/fleet-maintenance.md +21 -0
  194. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/harness-inventory.md +21 -0
  195. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-access.md +18 -0
  196. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/included-usage-verification.md +15 -0
  197. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/independent-review.md +17 -0
  198. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/managed-execution.md +20 -0
  199. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/official-documentation.md +18 -0
  200. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/quota-recovery.md +21 -0
  201. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/review-routing-decision.md +16 -0
  202. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/route-work.md +18 -0
  203. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/routing-evidence.md +18 -0
  204. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/run-ledger.md +18 -0
  205. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/home.js +198 -0
  206. package/scaffold/.agent/skills/total-recall/plugins/openwiki/DESIGN.md +75 -0
  207. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +2 -0
  208. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +17 -14
  209. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
  210. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +2 -1
  211. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +10 -44
  212. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +5 -4
  213. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/graph.mjs +3 -4
  214. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +23 -18
  215. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/mesh-vaults.mjs +8 -3
  216. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +6 -3
  217. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/search.mjs +3 -5
  218. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/token.mjs +21 -47
  219. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +17 -6
  220. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/auto-refresh.md +18 -0
  221. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/bootstrap-pages.md +18 -0
  222. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generate-wiki.md +21 -0
  223. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/generator-settings.md +18 -0
  224. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/host-probe.md +18 -0
  225. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/ingest-preview.md +18 -0
  226. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-hygiene.md +21 -0
  227. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/link-topology.md +19 -0
  228. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/passage-search.md +19 -0
  229. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/propagation-plan.md +18 -0
  230. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/provider-credentials.md +18 -0
  231. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/refresh-report.md +18 -0
  232. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/task-evidence.md +22 -0
  233. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/upstream-record.md +18 -0
  234. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/watch-upstream.md +18 -0
  235. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/chunks/wiki-atlas.md +19 -0
  236. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +261 -513
  237. package/scaffold/.agent/skills/total-recall/plugins/security/DESIGN.md +84 -0
  238. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +4 -2
  239. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +7 -19
  240. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -6
  241. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +2 -3
  242. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +19 -52
  243. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/device-evidence.md +21 -0
  244. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/evidence-desk.md +18 -0
  245. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/guided-device-review.md +17 -0
  246. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/host-and-network.md +21 -0
  247. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/https-headers.md +17 -0
  248. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/mesh-coverage.md +18 -0
  249. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/private-security-tools.md +16 -0
  250. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/single-origin-header-check.md +17 -0
  251. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/source-review.md +21 -0
  252. package/scaffold/.agent/skills/total-recall/plugins/security/ui/chunks/ssh-permission-plan.md +17 -0
  253. package/scaffold/.agent/skills/total-recall/plugins/security/ui/home.js +283 -0
  254. package/scaffold/.agent/skills/total-recall/plugins/ssss/DESIGN.md +93 -0
  255. package/scaffold/.agent/skills/total-recall/plugins/ssss/package-lock.json +2 -2
  256. package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +2 -1
  257. package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +5 -3
  258. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/conformance.md +26 -0
  259. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/registry.md +37 -0
  260. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/repair.md +42 -0
  261. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/scaffold.md +33 -0
  262. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/status.md +43 -0
  263. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validate.md +34 -0
  264. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/validation-diagnostics.md +17 -0
  265. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/chunks/workspace-registry-preflight.md +17 -0
  266. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/home.js +348 -0
  267. package/scaffold/.agent/skills/total-recall/references/operations.md +2 -0
  268. package/src/cli/api.mjs +3 -3
  269. package/src/cli/brief.mjs +3 -0
  270. package/src/cli/config.mjs +16 -0
  271. package/src/cli/connect.mjs +2 -7
  272. package/src/cli/plugin/chunks.mjs +145 -0
  273. package/src/cli/plugin/create.mjs +24 -52
  274. package/src/cli/plugin/index.mjs +20 -9
  275. package/src/cli/setup.mjs +2 -9
  276. package/src/cli/start.mjs +1 -0
  277. package/src/cli/startup.mjs +18 -0
  278. package/src/core/app-deploy/design-tokens.mjs +14 -9
  279. package/src/core/app-deploy/ui-elements.mjs +1 -1
  280. package/src/core/brain-registry.mjs +5 -0
  281. package/src/core/brain-updates.mjs +5 -1
  282. package/src/core/daemon-control.mjs +5 -1
  283. package/src/core/dashboard-bundle.mjs +261 -0
  284. package/src/core/default-plugin-refresh.mjs +39 -0
  285. package/src/core/ensure-dependencies.mjs +19 -15
  286. package/src/core/memory-brain.mjs +30 -8
  287. package/src/core/plugin-activation.mjs +63 -20
  288. package/src/core/plugin-contracts/{card.mjs → manifest.mjs} +23 -57
  289. package/src/core/plugin-contracts/startup-check.mjs +49 -0
  290. package/src/core/plugin-contracts/ui.mjs +9 -3
  291. package/src/core/plugin-distribution.mjs +6 -6
  292. package/src/core/plugin-lifecycle.mjs +58 -0
  293. package/src/core/plugin-loader.mjs +9 -5
  294. package/src/core/plugin-runner.mjs +21 -10
  295. package/src/core/plugin-startup-checks.mjs +44 -0
  296. package/src/core/plugin-state.mjs +19 -5
  297. package/src/core/plugin-store.mjs +30 -11
  298. package/src/core/project-id.mjs +15 -5
  299. package/src/core/required-plugins.mjs +31 -6
  300. package/src/core/schema.mjs +2 -0
  301. package/src/core/ssss-operation-service.mjs +1 -0
  302. package/src/core/startup-health.mjs +28 -3
  303. package/src/core/testing/plugin-fixture.mjs +22 -21
  304. package/src/core/throttled-fetch.mjs +25 -18
  305. package/src/core/ui-chunk-choice.mjs +77 -0
  306. package/src/core/ui-chunk.registry.json +23 -0
  307. package/src/core/ui-chunks.mjs +434 -0
  308. package/src/core/vault-cache.mjs +58 -59
  309. package/src/core/workspace-compositions.mjs +151 -0
  310. package/src/core/workspace-drawers.mjs +79 -0
  311. package/src/server/api.mjs +4 -27
  312. package/src/server/index.mjs +28 -21
  313. package/src/server/memory-events.mjs +31 -0
  314. package/src/server/plugin-brain-targets.mjs +89 -0
  315. package/src/server/rest.mjs +2 -0
  316. package/src/server/route-inventory.mjs +3 -2
  317. package/src/server/route-manifest.json +52 -4
  318. package/src/server/routes/_shared.mjs +7 -14
  319. package/src/server/routes/brains.mjs +29 -44
  320. package/src/server/routes/dashboard.mjs +26 -0
  321. package/src/server/routes/plugins.mjs +154 -45
  322. package/src/server/routes/ui-chunks.mjs +192 -0
  323. package/frontend/dist/assets/index-DACh1dhx.js +0 -5613
  324. package/frontend/dist/assets/index-DtwsDyFM.css +0 -1
  325. package/frontend/src/components/plugins/card/CardEngine.tsx +0 -108
  326. package/frontend/src/components/plugins/card/CardScenes.tsx +0 -103
  327. package/frontend/src/components/plugins/card/ExecutionPicker.tsx +0 -64
  328. package/frontend/src/components/plugins/card/args.ts +0 -28
  329. package/frontend/src/components/plugins/card/card.css +0 -32
  330. package/frontend/src/components/plugins/card/cli-line.ts +0 -13
  331. package/frontend/src/components/plugins/card/contract.ts +0 -91
  332. package/frontend/src/components/plugins/card/format.ts +0 -49
  333. package/frontend/src/components/plugins/card/runner-context.ts +0 -11
  334. package/frontend/src/components/plugins/card/runner.tsx +0 -43
  335. package/frontend/src/components/plugins/card/theme.ts +0 -35
  336. package/frontend/src/components/plugins/card/use-source.ts +0 -22
  337. package/frontend/src/components/plugins/card/widgets.tsx +0 -94
  338. package/frontend/src/components/plugins/workspace/WorkspaceHost.tsx +0 -23
  339. package/frontend/src/pages/PluginsPage.tsx +0 -1719
  340. package/scaffold/.agent/skills/plugin/evals/cases/04-card-collects-credential.mjs +0 -47
  341. package/scaffold/.agent/skills/plugin/prompts/06-card.md +0 -46
  342. package/scaffold/.agent/skills/plugin/references/card.md +0 -90
  343. package/scaffold/.agent/skills/plugin/subagents/card-designer.md +0 -60
  344. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/DESIGN.md +0 -67
  345. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +0 -1179
  346. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +0 -32
  347. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +0 -588
  348. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +0 -575
  349. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/DESIGN.md +0 -32
  350. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +0 -482
  351. package/scaffold/.agent/skills/total-recall/plugins/git/ui/DESIGN.md +0 -100
  352. package/scaffold/.agent/skills/total-recall/plugins/git/ui/card.js +0 -637
  353. package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/DESIGN.md +0 -217
  354. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/DESIGN.md +0 -32
  355. package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/card.js +0 -1276
  356. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +0 -45
  357. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +0 -1401
  358. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +0 -4
  359. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +0 -41
  360. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +0 -396
  361. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +0 -98
  362. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/DESIGN.md +0 -15
  363. package/scaffold/.agent/skills/total-recall/plugins/ssss/ui/card.js +0 -182
@@ -0,0 +1,42 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: control-ledger
5
+ title: Automation control ledger
6
+ description: Browse observed automation records, filter by trigger and state, and distinguish declarations from an actual run.
7
+ timestamp: "2026-11-08T10:14:00Z"
8
+ intents: [automation inventory, scheduled work control ledger, filter automation trigger state and source]
9
+ surfaces: [page]
10
+ panel: automations
11
+ operations: [list]
12
+ data:
13
+ - list:/schema_version
14
+ - list:/checked_at
15
+ - list:/complete
16
+ - list:/nodes/0/automations/0/id
17
+ - list:/nodes/0/automations/0/node_id
18
+ - list:/nodes/0/automations/0/source
19
+ - list:/nodes/0/automations/0/name
20
+ - list:/nodes/0/automations/0/intent
21
+ - list:/nodes/0/automations/0/origin
22
+ - list:/nodes/0/automations/0/trigger/kind
23
+ - list:/nodes/0/automations/0/trigger/summary
24
+ - list:/nodes/0/automations/0/trigger/timezone
25
+ - list:/nodes/0/automations/0/enabled
26
+ - list:/nodes/0/automations/0/state
27
+ - list:/nodes/0/automations/0/runner_available
28
+ - list:/nodes/0/automations/0/placement
29
+ - list:/nodes/0/automations/0/plugin_id
30
+ - list:/nodes/0/automations/0/plugin_name
31
+ - list:/nodes/0/automations/0/schedule
32
+ - list:/nodes/0/automations/0/valid
33
+ - list:/nodes/0/automations/0/last_handled_slot
34
+ - list:/nodes/0/automations/0/last_run/at
35
+ - list:/nodes/0/automations/0/last_run/state
36
+ - list:/nodes/0/automations/0/last_run/exit_code
37
+ ---
38
+ <section data-design-component="ledger-note" aria-label="Automation control ledger">
39
+ <p data-design-component="ledger-label">Triggers · sources · outcomes</p>
40
+ <h2>Automation control ledger</h2>
41
+ <p>Filter the inventory by node, source, trigger or observed state. Start with this node and scan the mesh when you need remote coverage.</p>
42
+ </section>
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: local-inventory-triage
5
+ title: Triage missing automations in local inventory
6
+ description: Inspect this machine's source coverage before treating an absent record as a missing automation.
7
+ timestamp: "2026-11-08T23:12:00Z"
8
+ intents: [why is an automation missing locally, check local automation inventory completeness, narrow fleet automation inventory to this host]
9
+ surfaces: [page]
10
+ panel: automations
11
+ operations: [list, status]
12
+ data: ["list:/complete", "list:/nodes/0/self", "list:/nodes/0/coverage/0/source", "list:/nodes/0/coverage/0/status"]
13
+ ---
14
+ <section data-design-component="ledger-note">
15
+ <h2>Start with local source coverage</h2>
16
+ <p>Switch the ledger to this machine. Check whether the automation's source was read before looking elsewhere or deciding that its record is absent.</p>
17
+ </section>
@@ -0,0 +1,39 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: pending-control
5
+ title: Confirm pending task cancellation
6
+ description: Review the local source-owned control, confirm the pending task target, and verify its final cancellation receipt.
7
+ timestamp: "2026-11-08T10:14:00Z"
8
+ intents: [cancel pending local durable automation, source owned task cancellation receipt, pending task safety controls]
9
+ surfaces: [page]
10
+ operations: [list, show, cancel]
11
+ data:
12
+ - list:/nodes/0/coverage/0/source
13
+ - list:/nodes/0/coverage/0/status
14
+ - list:/nodes/0/coverage/0/checked_at
15
+ - list:/nodes/0/coverage/0/error
16
+ - list:/nodes/0/automations/0/last_exit_code
17
+ - list:/nodes/0/automations/0/command
18
+ - list:/nodes/0/automations/0/actions/0/command
19
+ - list:/nodes/0/automations/0/actions/0/label
20
+ - list:/nodes/0/automations/0/actions/0/args/0
21
+ - list:/nodes/0/automations/0/actions/0/effect
22
+ - list:/nodes/0/automations/0/owner_ref/layer
23
+ - list:/nodes/0/automations/0/owner_ref/slug
24
+ - show:/automation/actions/0/command
25
+ - show:/automation/actions/0/label
26
+ - show:/automation/actions/0/args/0
27
+ - show:/automation/actions/0/effect
28
+ - show:/automation/owner_ref/layer
29
+ - show:/automation/owner_ref/slug
30
+ - show:/automation/last_exit_code
31
+ - cancel:/success
32
+ - cancel:/id
33
+ - cancel:/state
34
+ ---
35
+ <section data-design-component="ledger-note" aria-label="Confirm pending task cancellation">
36
+ <p data-design-component="ledger-label">Local controls</p>
37
+ <h2>Confirm pending task cancellation</h2>
38
+ <p>Choose a pending record with an advertised cancellation action. Review its source and stable ID before confirming. The owner must report the final cancelled state.</p>
39
+ </section>
@@ -0,0 +1,41 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: run-evidence
5
+ title: Automation run evidence
6
+ description: Inspect the source-owned automation record, schedule, last handled slot and actual outcome by stable ID.
7
+ timestamp: "2026-11-08T10:14:00Z"
8
+ intents: [inspect automation run outcome, audit handled slot and exit code, show automation by stable ID]
9
+ surfaces: [page]
10
+ operations: [show]
11
+ data:
12
+ - show:/schema_version
13
+ - show:/checked_at
14
+ - show:/automation/id
15
+ - show:/automation/node_id
16
+ - show:/automation/source
17
+ - show:/automation/name
18
+ - show:/automation/intent
19
+ - show:/automation/command
20
+ - show:/automation/origin
21
+ - show:/automation/trigger/kind
22
+ - show:/automation/trigger/summary
23
+ - show:/automation/trigger/timezone
24
+ - show:/automation/enabled
25
+ - show:/automation/state
26
+ - show:/automation/runner_available
27
+ - show:/automation/last_run/at
28
+ - show:/automation/last_run/state
29
+ - show:/automation/last_run/exit_code
30
+ - show:/automation/placement
31
+ - show:/automation/plugin_id
32
+ - show:/automation/plugin_name
33
+ - show:/automation/schedule
34
+ - show:/automation/valid
35
+ - show:/automation/last_handled_slot
36
+ ---
37
+ <section data-design-component="ledger-note" aria-label="Automation run evidence">
38
+ <p data-design-component="ledger-label">Observed runs</p>
39
+ <h2>Automation run evidence</h2>
40
+ <p>Read the record by stable ID. A handled slot records scheduler activity. The run timestamp, state and exit code describe execution when the owner reports them.</p>
41
+ </section>
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: schedule-vs-run-evidence
5
+ title: Verify that a scheduled automation actually ran
6
+ description: Compare the declared schedule and last handled slot with the observed run time and exit state for an automation.
7
+ timestamp: "2026-11-08T23:12:00Z"
8
+ intents: [verify scheduled automation actually ran, investigate missed schedule slot, compare schedule with observed automation outcome]
9
+ surfaces: [page]
10
+ panel: automations
11
+ operations: [list, show]
12
+ data: ["show:/automation/schedule", "show:/automation/last_handled_slot", "show:/automation/last_run/at", "show:/automation/last_run/state", "show:/automation/last_run/exit_code"]
13
+ ---
14
+ <section data-design-component="ledger-note">
15
+ <h2>Find observed run evidence</h2>
16
+ <p>Open the automation in the ledger. Compare the schedule and last handled slot with the observed run time and exit state. A schedule identifies when work should run.</p>
17
+ </section>
@@ -0,0 +1,41 @@
1
+ ---
2
+ type: ui-chunk:chunk
3
+ plugin: automations
4
+ id: source-coverage
5
+ title: Mesh automation source coverage
6
+ description: Inspect node reachability, per-source coverage and observed state counts before relying on an inventory.
7
+ timestamp: "2026-11-08T10:14:00Z"
8
+ intents: [automation node coverage, offline or unauthorized automation source, observed automation state counts]
9
+ surfaces: [page]
10
+ operations: [list, status]
11
+ data:
12
+ - status:/schema_version
13
+ - status:/checked_at
14
+ - status:/complete
15
+ - status:/nodes/0/node_id
16
+ - status:/nodes/0/hostname
17
+ - status:/nodes/0/ip
18
+ - status:/nodes/0/self
19
+ - status:/nodes/0/online
20
+ - status:/nodes/0/checked_at
21
+ - status:/nodes/0/status
22
+ - status:/nodes/0/error
23
+ - status:/nodes/0/counts
24
+ - status:/nodes/0/coverage/0/source
25
+ - status:/nodes/0/coverage/0/status
26
+ - status:/nodes/0/coverage/0/checked_at
27
+ - status:/nodes/0/coverage/0/error
28
+ - list:/nodes/0/node_id
29
+ - list:/nodes/0/hostname
30
+ - list:/nodes/0/ip
31
+ - list:/nodes/0/self
32
+ - list:/nodes/0/online
33
+ - list:/nodes/0/checked_at
34
+ - list:/nodes/0/status
35
+ - list:/nodes/0/error
36
+ ---
37
+ <section data-design-component="ledger-note" aria-label="Mesh automation source coverage">
38
+ <p data-design-component="ledger-label">Coverage</p>
39
+ <h2>Mesh automation source coverage</h2>
40
+ <p>Review the node check time and each source outcome. A count is meaningful only beside its coverage, including unsupported sources and offline nodes.</p>
41
+ </section>
@@ -23,7 +23,7 @@ export function decodeInventory(result) {
23
23
  return data;
24
24
  }
25
25
 
26
- export class AutomationsCard extends HTMLElement {
26
+ export class AutomationsElement extends HTMLElement {
27
27
  constructor() {
28
28
  super();
29
29
  this.attachShadow({ mode: 'open' });
@@ -37,6 +37,8 @@ export class AutomationsCard extends HTMLElement {
37
37
  this.request = 0;
38
38
  this.attemptedAt = null;
39
39
  this.pendingControl = null;
40
+ this.localOnly = true;
41
+ this.showInventoryJson = false;
40
42
  this.boundClick = (event) => this.click(event);
41
43
  this.boundChange = (event) => this.change(event);
42
44
  this.boundKey = (event) => this.key(event);
@@ -58,7 +60,7 @@ export class AutomationsCard extends HTMLElement {
58
60
  this.shadowRoot.addEventListener('keydown', this.boundKey);
59
61
  window.addEventListener('plugin-show-screen', this.boundScreen);
60
62
  this.render();
61
- void this.refresh();
63
+ if (this.host?.run) void this.refresh();
62
64
  }
63
65
 
64
66
  disconnectedCallback() {
@@ -71,14 +73,8 @@ export class AutomationsCard extends HTMLElement {
71
73
  }
72
74
 
73
75
  async invoke(command, args = []) {
74
- if (this.host?.run) return this.host.run(command, args);
75
- const response = await fetch('/api/plugins/automations/run', {
76
- method: 'POST', credentials: 'same-origin', signal: this.controller?.signal,
77
- headers: { 'Content-Type': 'application/json' },
78
- body: JSON.stringify({ subcommand: command, args }),
79
- });
80
- if (!response.ok) throw new Error(`Automation request failed (${response.status})`);
81
- return response.json();
76
+ if (!this.host?.run) throw new Error('Authenticated automation bridge unavailable');
77
+ return this.host.run(command, args);
82
78
  }
83
79
 
84
80
  async refresh() {
@@ -86,10 +82,11 @@ export class AutomationsCard extends HTMLElement {
86
82
  this.controller?.abort();
87
83
  this.controller = new AbortController();
88
84
  this.phase = 'loading'; this.inventory = null; this.error = ''; this.feedback = ''; this.pendingControl = null;
85
+ this.showInventoryJson = false;
89
86
  this.attemptedAt = new Date().toISOString();
90
87
  this.render();
91
88
  try {
92
- const data = decodeInventory(await this.invoke('list'));
89
+ const data = decodeInventory(await this.invoke('list', this.localOnly ? ['--local'] : []));
93
90
  if (request !== this.request || !this.isConnected) return;
94
91
  this.inventory = data; this.phase = 'ready';
95
92
  } catch (error) {
@@ -148,20 +145,24 @@ export class AutomationsCard extends HTMLElement {
148
145
  const selected = [...this.shadowRoot.querySelectorAll('[data-record]')].find((item) => item.dataset.record === this.selected);
149
146
  selected?.focus();
150
147
  } else if (button.dataset.action === 'refresh') void this.refresh();
151
- else if (button.dataset.action === 'copy') void this.copyOutput();
148
+ else if (button.dataset.action === 'scope') { this.localOnly = !this.localOnly; void this.refresh(); }
149
+ else if (button.dataset.action === 'inventory-json') this.toggleInventoryJson();
152
150
  else if (button.dataset.action === 'confirm-control') void this.executeControl(this.pendingControl?.index, true);
153
151
  else if (button.dataset.action === 'dismiss-control') { this.pendingControl = null; this.render(); }
154
152
  else if (button.dataset.control) void this.executeControl(Number(button.dataset.control));
155
153
  }
156
154
 
157
- async copyOutput() {
155
+ toggleInventoryJson() {
158
156
  if (!this.inventory) return;
159
- try {
160
- if (!navigator.clipboard?.writeText) throw new Error('Clipboard is unavailable');
161
- await navigator.clipboard.writeText(JSON.stringify(this.inventory, null, 2));
162
- if (this.isConnected) this.feedback = 'Inventory copied';
163
- } catch (error) { if (this.isConnected) this.feedback = `Copy failed: ${error.message}`; }
164
- if (this.isConnected) this.render();
157
+ this.showInventoryJson = !this.showInventoryJson;
158
+ this.render();
159
+ if (this.showInventoryJson) {
160
+ const field = this.shadowRoot.querySelector('#inventory-json-value');
161
+ field.focus();
162
+ field.select();
163
+ } else {
164
+ this.shadowRoot.querySelector('[data-action="inventory-json"]').focus();
165
+ }
165
166
  }
166
167
 
167
168
  async executeControl(index, confirmed = false) {
@@ -251,23 +252,27 @@ export class AutomationsCard extends HTMLElement {
251
252
  : this.phase === 'ready' ? (this.inventory.complete === true ? 'Discovery complete' : 'Partial discovery — inspect source coverage') : 'Not checked';
252
253
  const content = this.phase !== 'ready' ? `<div class="empty"><h3>${escape(status)}</h3><p>${escape(this.phase === 'error' ? this.error : this.phase === 'loading' ? 'Reading automation sources and node availability…' : 'Refresh to inspect automation sources.')}</p></div>`
253
254
  : this.screen === 'nodes' ? this.renderNodes() : this.screen === 'audit' ? this.renderAudit() : this.screen === 'run' ? this.renderRun() : this.renderScheduled();
255
+ const inventoryJson = this.showInventoryJson ? `
256
+ <label for="inventory-json-value">Inventory JSON</label>
257
+ <p id="inventory-json-help" class="note">Copy the selection with your browser’s Copy command or Ctrl+C / ⌘C.</p>
258
+ <textarea id="inventory-json-value" aria-describedby="inventory-json-help" rows="8" readonly>${escape(JSON.stringify(this.inventory, null, 2))}</textarea>` : '';
254
259
  this.shadowRoot.innerHTML = `
255
260
  <style>
256
- :host { --face-bg:#181713; --face-surface:#24221c; --face-text:#f4efe5; --face-muted:#c5bca9; --face-border:#726652; --face-accent:#f2bd63; --face-error:#ffb5a9; --face-focus:#b8d9ff; --automation-bg:var(--bg-card,var(--face-bg)); --automation-surface:var(--bg-elevated,var(--face-surface)); --automation-text:var(--text-primary,var(--face-text)); --automation-muted:var(--text-secondary,var(--face-muted)); --automation-border:var(--border,var(--face-border)); --automation-accent:var(--accent,var(--face-accent)); --automation-error:var(--face-error); --automation-focus:var(--face-focus); display:block; color:var(--automation-text); font:14px/1.45 system-ui,sans-serif; min-width:0; color-scheme:dark; }
261
+ .inventory-json { padding:0 16px 16px; }
262
+ .inventory-json .note { margin:4px 0 8px; }
263
+ .inventory-json textarea { width:100%; resize:vertical; padding:8px; border:1px solid var(--automation-border); border-radius:5px; background:var(--automation-surface); color:var(--automation-text); font:12px/1.5 ui-monospace,monospace; }
264
+ .inventory-json textarea:focus-visible { outline:3px solid var(--automation-focus); outline-offset:3px; }
265
+ :host { --automation-bg:var(--color-background,#181713); --automation-surface:var(--color-surface,#24221c); --automation-text:var(--color-text,#f4efe5); --automation-muted:var(--color-muted,#c5bca9); --automation-border:var(--color-border,#726652); --automation-accent:var(--color-primary,#f2bd63); --automation-error:var(--color-error,#ffb5a9); --automation-focus:var(--color-focus,#b8d9ff); display:block; color:var(--automation-text); font:var(--typography-body-font-size,14px)/1.45 var(--typography-body-font-family,system-ui,sans-serif); min-width:0; color-scheme:dark; }
257
266
  *,*::before,*::after { box-sizing:border-box; } button,select { font:inherit; color:inherit; min-height:44px; min-width:44px; } button { cursor:pointer; } button:disabled { cursor:wait; opacity:.6; } button:focus-visible,select:focus-visible { outline:3px solid var(--automation-focus); outline-offset:3px; } .workspace { border:1px solid var(--automation-border); border-radius:12px; background:var(--automation-bg); overflow:hidden; } .masthead { padding:20px; display:flex; gap:16px; align-items:center; flex-wrap:wrap; } .brand { display:flex; gap:12px; align-items:center; flex:1; min-width:0; } svg { width:40px; height:40px; color:var(--automation-accent); flex:none; } h2,h3,p { margin:0; } h2 { font-size:20px; letter-spacing:-.03em; } h3 { font-size:15px; } .eyebrow { text-transform:uppercase; letter-spacing:.11em; font-size:10px; color:var(--automation-muted); margin-bottom:4px; } .subtle,small,.note { color:var(--automation-muted); } small { display:block; font-size:11px; margin-top:3px; overflow-wrap:anywhere; } .refresh { border:1px solid var(--automation-accent); background:var(--automation-accent); color:var(--automation-bg); border-radius:7px; padding:8px 14px; font-weight:700; } .status-line { padding:12px 20px; background:var(--automation-surface); border-block:1px solid var(--automation-border); display:flex; justify-content:space-between; gap:12px; flex-wrap:wrap; } .status-line strong { font-size:12px; font-weight:600; } .tabs { display:flex; padding:8px 12px 0; gap:4px; border-bottom:1px solid var(--automation-border); } .tabs button { flex:1; background:transparent; border:0; border-bottom:3px solid transparent; padding:10px 4px; color:var(--automation-muted); } .tabs button[aria-selected=true] { border-color:var(--automation-accent); color:var(--automation-text); font-weight:700; } .body { padding:16px; min-height:200px; animation:reveal .16s ease-out; } .filters { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; margin-bottom:16px; } label { font-size:11px; color:var(--automation-muted); display:grid; gap:4px; } select { width:100%; max-width:100%; background:var(--automation-surface); border:1px solid var(--automation-border); border-radius:5px; padding:6px; } .ledger { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:16px; } .index,.detail,.node { min-width:0; } .index h3 { margin-bottom:8px; } ul { list-style:none; padding:0; margin:0; } .index ul { max-height:380px; overflow:auto; } .index li+li { margin-top:6px; } .index button { width:100%; display:flex; justify-content:space-between; gap:12px; align-items:center; text-align:left; padding:12px; background:transparent; border:1px solid var(--automation-border); border-radius:7px; } .index button[aria-pressed=true] { border-color:var(--automation-accent); background:var(--automation-surface); } strong { overflow-wrap:anywhere; } .state { display:inline-block; text-transform:none; font:11px/1.4 ui-monospace,monospace; border:1px solid var(--automation-border); border-radius:4px; padding:3px 6px; overflow-wrap:anywhere; } .bad { color:var(--automation-error); } .detail { border-left:2px solid var(--automation-accent); padding:0 0 0 16px; } .detail h3 { font-size:19px; margin-bottom:12px; overflow-wrap:anywhere; } dl { display:grid; grid-template-columns:minmax(80px,.7fr) minmax(0,1fr); gap:9px 12px; margin:0; } dt { color:var(--automation-muted); font-size:11px; } dd { margin:0; overflow-wrap:anywhere; font-size:12px; } .mono { font-family:ui-monospace,monospace; overflow-wrap:anywhere; font-size:11px; } .note { font-size:11px; margin-top:16px; } .count { font:11px ui-monospace,monospace; margin-left:4px; color:var(--automation-muted); } .node-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(min(260px,100%),1fr)); gap:16px; } .node { border:1px solid var(--automation-border); border-radius:8px; padding:14px; } .node header { display:flex; justify-content:space-between; align-items:start; gap:12px; margin-bottom:4px; } .coverage { margin-top:12px; } .coverage li { border-top:1px solid var(--automation-border); padding:10px 0; } .coverage li>div { display:flex; justify-content:space-between; align-items:center; gap:12px; } .coverage strong { font-size:12px; } .coverage p { font-size:12px; margin-top:6px; } .audit li { display:flex; justify-content:space-between; gap:16px; padding:12px 0; border-bottom:1px solid var(--automation-border); } .audit li>div { min-width:0; } .audit li>div:last-child { text-align:right; } .audit { margin-top:12px; } .source-actions { display:flex; flex-wrap:wrap; gap:8px; margin-top:16px; } .source-actions button { border:1px solid var(--automation-accent); border-radius:5px; background:var(--automation-surface); padding:8px 12px; } .effect { display:block; font:10px ui-monospace,monospace; color:var(--automation-muted); } .footer { display:flex; align-items:center; justify-content:space-between; padding:8px 16px; gap:12px; border-top:1px solid var(--automation-border); } .footer button { background:transparent; border:0; color:var(--automation-muted); padding:8px; font-size:12px; } .feedback { font-size:12px; overflow-wrap:anywhere; } .empty { padding:26px 12px; } .empty p { color:var(--automation-muted); margin-top:8px; } @keyframes reveal { from { opacity:.65; } to { opacity:1; } } @media(max-width:600px) { .masthead { padding:16px; gap:10px; } .filters { grid-template-columns:repeat(2,minmax(0,1fr)); } .ledger { grid-template-columns:minmax(0,1fr); } .detail { border-left:0; border-top:2px solid var(--automation-accent); padding:16px 0 0; } .index ul { max-height:260px; } .status-line { padding:10px 16px; } .body { padding:12px; } h2 { font-size:18px; } } @media(prefers-reduced-motion:reduce) { .body { animation:none; } }
258
267
  </style>
259
268
  <div class="workspace"><header class="masthead"><div class="brand"><svg viewBox="0 0 40 40" fill="none" aria-hidden="true"><path d="M4 20h9m0 0 7-11h12m-19 11 7 11h12M13 20h19" stroke="currentColor" stroke-width="2"/><circle cx="5" cy="20" r="3" fill="currentColor"/><path d="M30 6h6v6h-6zM30 17h6v6h-6zM30 28h6v6h-6z" stroke="currentColor" stroke-width="2"/></svg><div><p class="eyebrow">Triggers · sources · outcomes</p><h2>Automations</h2></div></div><button class="refresh" data-action="refresh" ${this.phase === 'loading' ? 'disabled' : ''}>Refresh</button></header>
260
- <div class="status-line" role="status" aria-live="polite"><strong class="${this.phase === 'error' ? 'bad' : ''}">${escape(status)}</strong><small>${this.phase === 'ready' ? 'Checked' : 'Last attempt'} ${escape(date(this.phase === 'ready' ? this.inventory.checked_at : this.attemptedAt))}</small></div>
269
+ <div class="status-line"><div role="status" aria-live="polite"><strong class="${this.phase === 'error' ? 'bad' : ''}">${escape(status)} · ${this.localOnly ? 'This node' : 'Mesh'}</strong><small>${this.phase === 'ready' ? 'Checked' : 'Last attempt'} ${escape(date(this.phase === 'ready' ? this.inventory.checked_at : this.attemptedAt))}</small></div><button data-action="scope" ${this.phase === 'loading' ? 'disabled' : ''}>${this.localOnly ? 'Scan mesh' : 'Use this node'}</button></div>
261
270
  <nav class="tabs" role="tablist" aria-label="Automation views">${SCREENS.map((screen) => `<button id="tab-${screen.id}" role="tab" aria-controls="panel-${screen.id}" aria-selected="${this.screen === screen.id}" tabindex="${this.screen === screen.id ? '0' : '-1'}" data-screen="${screen.id}">${screen.label}</button>`).join('')}</nav>
262
271
  <div class="body" id="panel-${this.screen}" role="tabpanel" aria-labelledby="tab-${this.screen}" tabindex="0" aria-busy="${this.phase === 'loading'}">${content}</div>
263
- <footer class="footer"><span class="feedback" role="status">${escape(this.feedback || (this.phase === 'ready' ? 'Coverage determines completeness.' : 'No current inventory.'))}</span><button data-action="copy" ${this.inventory ? '' : 'disabled'}>Copy inventory</button></footer></div>`;
272
+ <footer class="footer"><span class="feedback" role="status">${escape(this.feedback || (this.phase === 'ready' ? 'Coverage determines completeness.' : 'No current inventory.'))}</span><button type="button" data-action="inventory-json" aria-expanded="${this.showInventoryJson}" aria-controls="inventory-json" ${this.inventory ? '' : 'disabled'}>${this.showInventoryJson ? 'Hide inventory JSON' : 'Select inventory JSON'}</button></footer>
273
+ <div class="inventory-json" id="inventory-json" ${this.showInventoryJson ? '' : 'hidden'}>${inventoryJson}</div></div>`;
264
274
  if (focusedAction) this.shadowRoot.querySelector(`[data-action="${focusedAction}"]`)?.focus();
265
275
  }
266
276
  }
267
277
 
268
- // Card and panel share the same inventory contract.
269
- export const ChronosAutomationsCard = AutomationsCard;
270
- export class AutomationsElement extends AutomationsCard {}
271
- if (!customElements.get('tr-automations-card')) customElements.define('tr-automations-card', AutomationsCard);
272
- if (!customElements.get('automations-card')) customElements.define('automations-card', class extends AutomationsCard {});
273
278
  if (!customElements.get('tr-automations')) customElements.define('tr-automations', AutomationsElement);
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: "Code Quality Gates"
3
+ plugin: code-quality
4
+ tokens:
5
+ color-primary: "#eab308"
6
+ color-primary-strong: "#facc15"
7
+ color-background: "#0f172a"
8
+ color-surface: "#1e293b"
9
+ color-border: "#334155"
10
+ color-text: "#f8fafc"
11
+ color-muted: "#94a3b8"
12
+ color-accent: "#38bdf8"
13
+ color-success: "#10b981"
14
+ color-warning: "#f59e0b"
15
+ color-danger: "#ef4444"
16
+ color-on-primary: "#0f172a"
17
+ font-body: "'Space Grotesk', system-ui, sans-serif"
18
+ font-mono: "'JetBrains Mono', 'Fira Code', monospace"
19
+ radius-md: "8px"
20
+ space-4: "16px"
21
+ components:
22
+ report:
23
+ backgroundColor: "{tokens.color-surface}"
24
+ textColor: "{tokens.color-text}"
25
+ rounded: "{tokens.radius-md}"
26
+ padding: "{tokens.space-4}"
27
+ workflow:
28
+ backgroundColor: "{tokens.color-background}"
29
+ textColor: "{tokens.color-text}"
30
+ rounded: "{tokens.radius-md}"
31
+ padding: "{tokens.space-4}"
32
+ ---
33
+
34
+ # Code Quality Gates — design
35
+
36
+ The plugin's own visual language, for the Home panel, the SSSS UI chunks and any
37
+ host that themes them. Values follow `branding.color` in `plugin.json` and the
38
+ card palette in `ui/DESIGN.md`.
39
+
40
+ ## Meaning of colour
41
+
42
+ - `color-success`: a report with status `clean` and nothing else.
43
+ - `color-warning`: `partial`, `stale`, `unknown-freshness`, `zero-scope`, and skipped gates.
44
+ - `color-danger`: `failed`, `unparsed-failure`, `infrastructure`, `unreadable`, `missing`, and failing gates.
45
+ - `color-primary`: the one action that runs gates.
46
+
47
+ No colour ever signals "passing" without a `clean` report view. Absent data is
48
+ shown as absent, in `color-muted`.
49
+
50
+ ## Type
51
+
52
+ `font-mono` for gate ids, file paths, revisions and commands; `font-body` for
53
+ everything else.
@@ -2,6 +2,7 @@
2
2
  * `total-recall code-quality <verb>` for the repository you run it from.
3
3
  *
4
4
  * report [view] [arg] read the latest gate report; never starts a check
5
+ * run --tier fast|full run the configured gates once
5
6
  * snapshot --node <name> put the exact source under test on the test node (git file list only)
6
7
  * gate list|add|remove edit the repo's gate list
7
8
  * config get|set|…, detect [--apply], init
@@ -74,6 +75,28 @@ export async function run(argv = []) {
74
75
  return;
75
76
  }
76
77
 
78
+ if (verb === 'run') {
79
+ const usage = 'Usage: total-recall code-quality run [--tier fast|full] [--json]';
80
+ if (rest.includes('--help') || rest.includes('-h')) { console.log(usage); return; }
81
+ const json = rest.includes('--json');
82
+ const options = rest.filter((arg) => arg !== '--json');
83
+ const tier = options.length ? options[1] : 'fast';
84
+ const emitFailure = (exitCode, error) => {
85
+ if (json) console.log(JSON.stringify({ ok: false, exitCode, error }));
86
+ else console.error(error);
87
+ process.exitCode = exitCode;
88
+ };
89
+ if ((options.length && (options.length !== 2 || options[0] !== '--tier')) || !['fast', 'full'].includes(tier)) {
90
+ return emitFailure(2, usage);
91
+ }
92
+ try {
93
+ const { exitCode } = runCore('check.mjs', ['--tier', tier], { quiet: json });
94
+ if (json) console.log(JSON.stringify({ ok: exitCode === 0, exitCode, tier }));
95
+ if (exitCode) process.exitCode = exitCode;
96
+ } catch (error) { emitFailure(error.exitCode || 1, error.message); }
97
+ return;
98
+ }
99
+
77
100
  const moduleUrl = skillConfigModule();
78
101
  if (!moduleUrl) {
79
102
  return fail('Run this through the total-recall CLI: config verbs need a Total Recall install with skill config support.', 2);
@@ -15,13 +15,15 @@ export function findSkillDir(start = process.cwd()) {
15
15
  return stateDir(start);
16
16
  }
17
17
 
18
- export function runCore(script, args) {
18
+ export function runCore(script, args, { quiet = false } = {}) {
19
19
  if (!fs.existsSync(stateDir())) {
20
20
  const error = new Error('No code-quality state in this repository (.agent/skills/code-quality). Create configuration: total-recall code-quality detect --apply');
21
21
  error.exitCode = 2;
22
22
  throw error;
23
23
  }
24
- const result = spawnSync(process.execPath, [path.join(CORE_DIR, script), ...args], { stdio: 'inherit' });
24
+ const result = spawnSync(process.execPath, [path.join(CORE_DIR, script), ...args], {
25
+ stdio: quiet ? ['ignore', 'ignore', 'inherit'] : 'inherit',
26
+ });
25
27
  if (result.error) throw result.error;
26
28
  return { exitCode: result.status ?? 1, data: { state_dir: stateDir(), script } };
27
29
  }
@@ -204,12 +204,14 @@ function acquireLock(lockPath, label) {
204
204
  const ageMs = held?.startedAt ? Date.now() - Date.parse(held.startedAt) : Infinity;
205
205
  const expired = Number.isFinite(ageMs) && ageMs > STALE_AFTER_MS;
206
206
 
207
- if (STEAL_LOCK && state === 'alive') {
207
+ const protectedHolder = state === 'alive' || state === 'alive-foreign' ||
208
+ (state === 'unverifiable' && !expired);
209
+ if (STEAL_LOCK && protectedHolder) {
208
210
  // The machine-wide lock is shared by every repo on this host. A verified
209
211
  // live holder is another repo's (or this repo's) real run: stealing its
210
212
  // lock, or killing it, silently destroys that run's result.
211
213
  fail(
212
- `--steal-lock refused: the ${label} lock is held by a verified running check ` +
214
+ `--steal-lock refused: the ${label} lock has a protected holder (state=${state}) ` +
213
215
  `(pid ${held.pid}, ${held.repoRoot ?? 'unknown repo'}, started ${held.startedAt ?? 'unknown'}).\n` +
214
216
  ` Wait for it to finish, or stop that process yourself if you own it.`,
215
217
  3
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "tr-plugin-code-quality",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "tr-plugin-code-quality",
9
- "version": "0.2.7",
9
+ "version": "0.3.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@gregiteen/ssss-cli": "0.14.5"
13
13
  },
14
14
  "devDependencies": {
15
- "total-recall-brain": "3.44.0"
15
+ "total-recall-brain": "3.45.0"
16
16
  }
17
17
  },
18
18
  "node_modules/@alcalzone/ansi-tokenize": {
@@ -5543,9 +5543,9 @@
5543
5543
  }
5544
5544
  },
5545
5545
  "node_modules/total-recall-brain": {
5546
- "version": "3.44.0",
5547
- "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.44.0.tgz",
5548
- "integrity": "sha512-VNPaIO9zsSwoxAsJ5ByIQBP9zPpLq4RiQO7Vrex4rBOHFQJT50P7utcZiLMSZTyZJU4C/m5uB8qTCSBMp6+l6Q==",
5546
+ "version": "3.45.0",
5547
+ "resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.45.0.tgz",
5548
+ "integrity": "sha512-HDYfROazZbsLHQsFPnlBcSpe1HL1QEi7JG8x/eNRUI06RxVQsZWl8LwBo2lTWjWRDrKmCy7BUmSXQDuWF3lrEw==",
5549
5549
  "dev": true,
5550
5550
  "license": "MIT",
5551
5551
  "workspaces": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tr-plugin-code-quality",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "Total Recall code-quality plugin: shared gate runner core and per-repo gate configuration.",
6
6
  "license": "MIT",
@@ -18,6 +18,7 @@
18
18
  "plugin.json",
19
19
  "README.md",
20
20
  "LICENSE",
21
+ "DESIGN.md",
21
22
  "core/",
22
23
  "commands/",
23
24
  "ui/"
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
3
3
  "id": "code-quality",
4
4
  "name": "Code Quality Gates",
5
- "version": "0.2.7",
5
+ "version": "0.3.0",
6
6
  "description": "Fail-closed deterministic code-quality gates, lint rules, and test compliance reporting.",
7
7
  "author": "Total Recall contributors",
8
8
  "license": "MIT",
@@ -22,6 +22,15 @@
22
22
  "description": "Read the latest gate report or --review-diagnostics, with --json for machine output. Never starts a check",
23
23
  "effect": "read"
24
24
  },
25
+ {
26
+ "name": "run",
27
+ "description": "Run the selected repository's configured fast or full gates once and persist the report",
28
+ "effect": "write",
29
+ "timeoutMs": 600000,
30
+ "args": [
31
+ { "name": "tier", "flag": "--tier", "type": "choice", "options": ["fast", "full"], "label": "Gate tier" }
32
+ ]
33
+ },
25
34
  {
26
35
  "name": "snapshot",
27
36
  "description": "Copy the exact source under test (git file lists of this repo and linked plugin repos, secrets refused) to the test node, with a SHA-256 manifest",
@@ -63,7 +72,37 @@
63
72
  }
64
73
  ],
65
74
  "ui": {
75
+ "home": "code-quality-home",
76
+ "design_tokens": "DESIGN.md",
66
77
  "elements": [
78
+ {
79
+ "id": "code-quality-home",
80
+ "kind": "panel",
81
+ "tag": "code-quality-home",
82
+ "module": "ui/home.mjs",
83
+ "description": "Home: verdict, freshness, coverage, findings and the declared operations for this repository. Data comes from `code-quality report --json`; absent data never renders as passing.",
84
+ "props": {
85
+ "view": {
86
+ "type": "object",
87
+ "description": "JSON printed by `total-recall code-quality report --json`. Absent view renders as no data, never as passing."
88
+ }
89
+ },
90
+ "optional_tokens": [
91
+ "font-body",
92
+ "font-mono",
93
+ "color-primary",
94
+ "color-primary-strong",
95
+ "color-on-primary",
96
+ "color-background",
97
+ "color-surface",
98
+ "color-border",
99
+ "color-text",
100
+ "color-muted",
101
+ "color-success",
102
+ "color-warning",
103
+ "color-danger"
104
+ ]
105
+ },
67
106
  {
68
107
  "id": "code-quality-report",
69
108
  "kind": "panel",
@@ -76,10 +115,6 @@
76
115
  "description": "JSON printed by `total-recall code-quality report json`. Absent view renders as no data, never as passing."
77
116
  }
78
117
  },
79
- "events": [
80
- "run-check",
81
- "reload"
82
- ],
83
118
  "optional_tokens": [
84
119
  "font-body",
85
120
  "color-text",
@@ -91,41 +126,6 @@
91
126
  "radius-md",
92
127
  "space-4"
93
128
  ]
94
- },
95
- {
96
- "id": "card",
97
- "kind": "card",
98
- "tag": "tr-code-quality-card",
99
- "module": "ui/card.js",
100
- "description": "Gatekeeper Card Face"
101
- }
102
- ]
103
- },
104
- "card_face": {
105
- "skin": "winamp-classic",
106
- "theme": "vibrant",
107
- "headline": "Deterministic Code Gates & Lint",
108
- "primary_color": "#06b6d4",
109
- "secondary_color": "#164e63",
110
- "accent_color": "#22d3ee",
111
- "touch_layout": "comfortable",
112
- "interactive": true,
113
- "quick_actions": [
114
- {
115
- "subcommand": "report",
116
- "label": "REPORT"
117
- },
118
- {
119
- "subcommand": "gate",
120
- "label": "GATE"
121
- },
122
- {
123
- "subcommand": "config",
124
- "label": "CONFIG"
125
- },
126
- {
127
- "subcommand": "detect",
128
- "label": "DETECT"
129
129
  }
130
130
  ]
131
131
  },