total-recall-brain 3.40.1 → 3.40.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 (186) hide show
  1. package/README.md +152 -41
  2. package/bin/total-recall.mjs +16 -76
  3. package/docs/reference/cli-reference.md +10 -10
  4. package/extension/background.js +6 -2
  5. package/extension/config.js +8 -0
  6. package/extension/lib/brain-client.js +29 -4
  7. package/extension/options/options.html +1 -0
  8. package/extension/sidepanel/sidepanel.html +1 -0
  9. package/frontend/dist/assets/{index-CvQRdT2j.css → index-AGUes-VG.css} +1 -1
  10. package/frontend/dist/assets/index-Bt5iVPZj.js +5618 -0
  11. package/frontend/dist/index.html +2 -2
  12. package/frontend/src/api/keys.ts +9 -2
  13. package/frontend/src/api/plugins.ts +4 -0
  14. package/frontend/src/components/plugins/card/CardEngine.tsx +2 -1
  15. package/frontend/src/components/plugins/card/card.css +1 -1
  16. package/frontend/src/pages/IntegrationsPage.tsx +315 -8
  17. package/frontend/src/pages/PluginsPage.tsx +532 -87
  18. package/package.json +6 -5
  19. package/scaffold/.agent/skills/meta-harness/references/optimized/original.md +1 -1
  20. package/scaffold/.agent/skills/meta-harness/references/optimized/section-09.md +1 -1
  21. package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +10 -10
  22. package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +1 -6
  23. package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +0 -1
  24. package/scaffold/.agent/skills/total-recall/plugins/auth/src/browser-session.mjs +309 -4
  25. package/scaffold/.agent/skills/total-recall/plugins/auth/src/cli-secret.mjs +44 -34
  26. package/scaffold/.agent/skills/total-recall/plugins/auth/src/google-oauth.mjs +6 -4
  27. package/scaffold/.agent/skills/total-recall/plugins/auth/src/provider-catalog.mjs +1 -1
  28. package/scaffold/.agent/skills/total-recall/plugins/auth/src/provider-rotation-recipes.mjs +118 -4
  29. package/scaffold/.agent/skills/total-recall/plugins/auth/src/routes/auth.mjs +2 -2
  30. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-env-export.mjs +3 -3
  31. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-remote-deploy.mjs +1 -1
  32. package/scaffold/.agent/skills/total-recall/plugins/auth/src/secrets-rotate.mjs +24 -6
  33. package/scaffold/.agent/skills/total-recall/plugins/auth/ui/card.js +164 -123
  34. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/README.md +65 -0
  35. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/cli.mjs +76 -0
  36. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/package.json +19 -0
  37. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/plugin.json +290 -0
  38. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/adapters/dsh.mjs +446 -0
  39. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/documentation.mjs +152 -0
  40. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/executor.mjs +71 -0
  41. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/runtime.mjs +36 -0
  42. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/setup.mjs +35 -0
  43. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/src/worker.mjs +175 -0
  44. package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/card.js +18 -0
  45. package/scaffold/.agent/skills/total-recall/plugins/code-quality/LICENSE +21 -0
  46. package/scaffold/.agent/skills/total-recall/plugins/code-quality/README.md +84 -0
  47. package/scaffold/.agent/skills/total-recall/plugins/code-quality/cli.mjs +79 -0
  48. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/check.mjs +6 -0
  49. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/report.mjs +6 -0
  50. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/run-core.mjs +27 -0
  51. package/scaffold/.agent/skills/total-recall/plugins/code-quality/commands/snapshot.mjs +163 -0
  52. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/check.mjs +757 -0
  53. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/config.schema.json +86 -0
  54. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/detect.mjs +89 -0
  55. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/report-data.mjs +145 -0
  56. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/report.mjs +210 -0
  57. package/scaffold/.agent/skills/total-recall/plugins/code-quality/core/state.mjs +20 -0
  58. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +2869 -0
  59. package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +28 -0
  60. package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +186 -0
  61. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/DESIGN.md +18 -0
  62. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +272 -0
  63. package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/code-quality-report.mjs +129 -0
  64. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/LICENSE +21 -0
  65. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/README.md +73 -0
  66. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/cli.mjs +375 -0
  67. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/examples/commands/echo-tool.mjs +23 -0
  68. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/examples/commands/group.mjs +262 -0
  69. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/examples/commands/project-id.mjs +74 -0
  70. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +2869 -0
  71. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +31 -0
  72. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +221 -0
  73. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/schemas/cli_command.schema.json +107 -0
  74. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/skills/composable-cli/SKILL.md +63 -0
  75. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/command.mjs +313 -0
  76. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/compile.mjs +19 -0
  77. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/compose.mjs +144 -0
  78. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/contract.mjs +110 -0
  79. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/library.mjs +23 -0
  80. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/registry.mjs +192 -0
  81. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/resolve.mjs +221 -0
  82. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/risk.mjs +126 -0
  83. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/src/ssss-documents.mjs +29 -0
  84. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/DESIGN.md +18 -0
  85. package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +273 -0
  86. package/scaffold/.agent/skills/total-recall/plugins/embeddings/LICENSE +21 -0
  87. package/scaffold/.agent/skills/total-recall/plugins/embeddings/README.md +20 -0
  88. package/scaffold/.agent/skills/total-recall/plugins/embeddings/cli.mjs +310 -0
  89. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +2826 -0
  90. package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +11 -0
  91. package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +62 -0
  92. package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +297 -0
  93. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/LICENSE +21 -0
  94. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/README.md +43 -0
  95. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/cli.mjs +258 -0
  96. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +4005 -0
  97. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +20 -0
  98. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/plugin.json +125 -0
  99. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/DESIGN.md +18 -0
  100. package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/card.js +278 -0
  101. package/scaffold/.agent/skills/total-recall/plugins/mesh/README.md +9 -0
  102. package/scaffold/.agent/skills/total-recall/plugins/mesh/cli.mjs +6 -0
  103. package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +4721 -0
  104. package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +3 -21
  105. package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +14 -1
  106. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/cli/mesh.mjs +10 -0
  107. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/headscale-client.mjs +5 -1
  108. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/leader-election.mjs +4 -13
  109. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-access-verify.mjs +22 -0
  110. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh-files.mjs +18 -0
  111. package/scaffold/.agent/skills/total-recall/plugins/mesh/src/core/mesh.mjs +2 -0
  112. package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +14 -0
  113. package/scaffold/.agent/skills/total-recall/plugins/openwiki/LICENSE +21 -0
  114. package/scaffold/.agent/skills/total-recall/plugins/openwiki/README.md +35 -0
  115. package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +124 -0
  116. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +4097 -0
  117. package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +12 -0
  118. package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +165 -0
  119. package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/ingest.mjs +127 -0
  120. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/DESIGN.md +18 -0
  121. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +279 -0
  122. package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/panel.js +539 -0
  123. package/scaffold/.agent/skills/total-recall/plugins/security/LICENSE +21 -0
  124. package/scaffold/.agent/skills/total-recall/plugins/security/README.md +67 -0
  125. package/scaffold/.agent/skills/total-recall/plugins/security/cli.mjs +932 -0
  126. package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +3256 -0
  127. package/scaffold/.agent/skills/total-recall/plugins/security/package.json +25 -0
  128. package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +297 -0
  129. package/scaffold/.agent/skills/total-recall/plugins/security/scripts/build-ui.mjs +4 -0
  130. package/scaffold/.agent/skills/total-recall/plugins/security/skills/security/SKILL.md +37 -0
  131. package/scaffold/.agent/skills/total-recall/plugins/security/src/android.mjs +21 -0
  132. package/scaffold/.agent/skills/total-recall/plugins/security/src/devices.mjs +94 -0
  133. package/scaffold/.agent/skills/total-recall/plugins/security/src/machines.mjs +164 -0
  134. package/scaffold/.agent/skills/total-recall/plugins/security/src/scanner.mjs +41 -0
  135. package/scaffold/.agent/skills/total-recall/plugins/security/src/windows.mjs +42 -0
  136. package/scaffold/.agent/skills/total-recall/plugins/security/ui/DESIGN.md +18 -0
  137. package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +95 -0
  138. package/scaffold/.agent/skills/total-recall/plugins/security/ui/panel.js +98 -0
  139. package/scaffold/.agent/skills/total-recall/references/auth.md +1 -1
  140. package/src/cli/brief.mjs +33 -9
  141. package/src/cli/command.mjs +2 -7
  142. package/src/cli/config.mjs +1 -0
  143. package/src/cli/connect.mjs +5 -0
  144. package/src/cli/context.mjs +2 -1
  145. package/src/cli/daemon.mjs +36 -1
  146. package/src/cli/doctor.mjs +6 -0
  147. package/src/cli/harness.mjs +3 -0
  148. package/src/cli/help.mjs +26 -0
  149. package/src/cli/init.mjs +4 -4
  150. package/src/cli/memory-entry.mjs +1 -0
  151. package/src/cli/memory-init.mjs +2 -0
  152. package/src/cli/plugin/index.mjs +11 -0
  153. package/src/cli/plugin/install.mjs +2 -1
  154. package/src/cli/rebuild.mjs +3 -1
  155. package/src/cli/startup.mjs +2 -1
  156. package/src/cli/update.mjs +19 -0
  157. package/src/core/automatic-brain-updates.mjs +67 -0
  158. package/src/core/brain-updates.mjs +21 -2
  159. package/src/core/cli-commands.mjs +71 -0
  160. package/src/core/cli-maintenance.mjs +45 -0
  161. package/src/core/cli-quick-reference.mjs +20 -0
  162. package/src/core/cli-semantic-index.mjs +722 -0
  163. package/src/core/context-compiler.mjs +27 -1
  164. package/src/core/crons.mjs +2 -13
  165. package/src/core/daemon-control.mjs +6 -4
  166. package/src/core/daemon-loop.mjs +12 -8
  167. package/src/core/default-plugins.mjs +5 -0
  168. package/src/core/global-brain-updates.mjs +39 -0
  169. package/src/core/mesh-brain-updates.mjs +30 -0
  170. package/src/core/meta-harness.mjs +108 -0
  171. package/src/core/plugin-dependencies.mjs +2 -1
  172. package/src/core/plugin-loader.mjs +2 -1
  173. package/src/core/plugin-runner.mjs +12 -4
  174. package/src/core/plugin-setup.mjs +20 -0
  175. package/src/core/plugin-store.mjs +22 -4
  176. package/src/core/plugin-tasks.mjs +1 -1
  177. package/src/core/project-brain.mjs +2 -0
  178. package/src/core/project-status.mjs +64 -0
  179. package/src/core/required-plugins.mjs +46 -0
  180. package/src/core/scaffold-plugins.mjs +17 -3
  181. package/src/core/source-brain-updates.mjs +47 -0
  182. package/src/core/startup-health.mjs +5 -3
  183. package/src/core/surface.mjs +44 -10
  184. package/src/server/routes/extension.mjs +53 -8
  185. package/templates/onboarding-interview.md +1 -1
  186. package/frontend/dist/assets/index-SOVUlZqm.js +0 -5596
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "tr-plugin-git-sentinel",
3
+ "version": "1.1.1",
4
+ "type": "module",
5
+ "description": "Reports the state of the current git repository: branch, dirty files, unpushed commits and stashes.",
6
+ "scripts": {
7
+ "test": "vitest run"
8
+ },
9
+ "license": "MIT",
10
+ "files": [
11
+ "cli.mjs",
12
+ "plugin.json",
13
+ "README.md",
14
+ "LICENSE",
15
+ "ui/"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ }
20
+ }
@@ -0,0 +1,125 @@
1
+ {
2
+ "$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
3
+ "id": "git-sentinel",
4
+ "name": "Git Hygiene",
5
+ "version": "1.2.1",
6
+ "description": "Worktree hygiene, branch inspection, unpushed commits, and stash tracker.",
7
+ "author": "Total Recall",
8
+ "license": "MIT",
9
+ "use_cases": [
10
+ "software-development"
11
+ ],
12
+ "cli": {
13
+ "command": "git-sentinel",
14
+ "handler": "./cli.mjs",
15
+ "subcommands": [
16
+ {
17
+ "name": "audit",
18
+ "description": "Summarise branch, worktree, upstream and stash state (--json for machine output)",
19
+ "effect": "read"
20
+ },
21
+ {
22
+ "name": "diff",
23
+ "description": "Show a diffstat of unstaged changes",
24
+ "effect": "read"
25
+ }
26
+ ]
27
+ },
28
+ "card_face": {
29
+ "skin": "copper-obsidian",
30
+ "theme": "copper",
31
+ "headline": "Worktree Hygiene & Repository Watch",
32
+ "primary_color": "#b45309",
33
+ "secondary_color": "#0c0a09",
34
+ "accent_color": "#f59e0b",
35
+ "touch_layout": "comfortable",
36
+ "interactive": true,
37
+ "quick_actions": [
38
+ {
39
+ "subcommand": "audit",
40
+ "label": "AUDIT"
41
+ },
42
+ {
43
+ "subcommand": "diff",
44
+ "label": "DIFFSTAT"
45
+ }
46
+ ]
47
+ },
48
+ "ui": {
49
+ "elements": [
50
+ {
51
+ "id": "card",
52
+ "kind": "card",
53
+ "tag": "tr-git-sentinel-card",
54
+ "module": "ui/card.js",
55
+ "description": "Git Hygiene Repository Hygiene Card Face"
56
+ }
57
+ ]
58
+ },
59
+ "auth": {
60
+ "plugin": "auth",
61
+ "methods": [
62
+ "passkey",
63
+ "google-oauth2"
64
+ ],
65
+ "session_verification": true
66
+ },
67
+ "deploy": {
68
+ "targets": [
69
+ "ssss-app",
70
+ "nextjs",
71
+ "react",
72
+ "flask"
73
+ ],
74
+ "required_ssss_version": ">=0.9.3",
75
+ "access_grants": [
76
+ "auth:session:verify",
77
+ "ssss:vault:read",
78
+ "ssss:vault:write",
79
+ "ssss:events:append"
80
+ ]
81
+ },
82
+ "branding": {
83
+ "name": "Git Hygiene",
84
+ "color": "#b45309",
85
+ "accent": "#f59e0b",
86
+ "badge": "Repository Hygiene",
87
+ "font": "space-grotesk"
88
+ },
89
+ "status": {
90
+ "command": "audit",
91
+ "refresh_seconds": 60
92
+ },
93
+ "distribution": {
94
+ "tier": "official",
95
+ "license": "open"
96
+ },
97
+ "card_layout": {
98
+ "template": "dashboard",
99
+ "regions": [
100
+ {
101
+ "widget": "status",
102
+ "title": "Status"
103
+ },
104
+ {
105
+ "widget": "live",
106
+ "title": "Live view"
107
+ },
108
+ {
109
+ "widget": "list",
110
+ "title": "Details",
111
+ "source": {
112
+ "command": "diff"
113
+ }
114
+ },
115
+ {
116
+ "widget": "actions",
117
+ "title": "Commands"
118
+ },
119
+ {
120
+ "widget": "activity",
121
+ "title": "Recent activity"
122
+ }
123
+ ]
124
+ }
125
+ }
@@ -0,0 +1,18 @@
1
+ # DESIGN.md — Blame Game
2
+
3
+ ```yaml
4
+ tokens:
5
+ brand-name: "Blame Game"
6
+ wordmark: "[BLAME//GAME]"
7
+ color-primary: "#22c55e"
8
+ color-background: "#0f172a"
9
+ color-accent: "#f97316"
10
+ badge: "Tree Guard"
11
+ font-mono: "'JetBrains Mono', 'Fira Code', monospace"
12
+ border-radius: "8px"
13
+ ```
14
+
15
+ ## Brand & Typographic Wordmark
16
+ - **Name**: Blame Game
17
+ - **Wordmark Logo**: `[BLAME//GAME]` (custom typographic badge, no generic icons)
18
+ - **Palette**: Primary `#22c55e`, Surface `#0f172a`, Accent `#f97316`.
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Git Hygiene — Repository Hygiene & Branch Integrity
3
+ * Bespoke Animated Web Component Card Face with Live Branch Pulse Rings.
4
+ *
5
+ * Zero emojis, authentic commercial brand identity, touch-first ergonomics (>=44px).
6
+ */
7
+
8
+ export class GitSentinelCard extends HTMLElement {
9
+ constructor() {
10
+ super();
11
+ this.status = 'Ready';
12
+ this.executing = false;
13
+ }
14
+
15
+ connectedCallback() {
16
+ this.attachShadow({ mode: 'open' });
17
+ this.render();
18
+ this.initPulseAnimation();
19
+ }
20
+
21
+ async execute(action, args = []) {
22
+ const out = this.shadowRoot.querySelector('#card-out');
23
+ const badge = this.shadowRoot.querySelector('#status-badge');
24
+ if (out) out.textContent = `[SENTINEL AUDITOR] Scanning ${action.toUpperCase()}...`;
25
+ if (badge) badge.textContent = 'SCANNING';
26
+ this.executing = true;
27
+
28
+ try {
29
+ const res = await this.host?.run(action, args);
30
+ let text = '';
31
+ if (typeof res === 'object') {
32
+ text = res.output || JSON.stringify(res, null, 2);
33
+ } else {
34
+ text = String(res || 'Audit completed without output.');
35
+ }
36
+ if (out) out.textContent = text.trim();
37
+ if (badge) badge.textContent = 'SECURE';
38
+ } catch (err) {
39
+ if (out) out.textContent = `[SENTINEL ALERT] ${err.message}`;
40
+ if (badge) badge.textContent = 'ALERT';
41
+ } finally {
42
+ this.executing = false;
43
+ }
44
+ }
45
+
46
+ initPulseAnimation() {
47
+ const canvas = this.shadowRoot.querySelector('#sentinel-canvas');
48
+ if (!canvas) return;
49
+ const ctx = canvas.getContext('2d');
50
+ if (!ctx) return;
51
+
52
+ let ringR1 = 4;
53
+ let ringR2 = 14;
54
+ let ringR3 = 24;
55
+
56
+ const draw = () => {
57
+ if (!this.isConnected) return;
58
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
59
+
60
+ const cx = canvas.width / 2;
61
+ const cy = canvas.height / 2;
62
+ const maxR = 30;
63
+
64
+ // Draw branch spine
65
+ ctx.strokeStyle = 'rgba(16, 185, 129, 0.2)';
66
+ ctx.lineWidth = 1.5;
67
+ ctx.beginPath();
68
+ ctx.moveTo(cx - 80, cy);
69
+ ctx.lineTo(cx + 80, cy);
70
+ ctx.stroke();
71
+
72
+ // Branch forks
73
+ ctx.beginPath();
74
+ ctx.moveTo(cx - 30, cy);
75
+ ctx.lineTo(cx - 10, cy - 14);
76
+ ctx.lineTo(cx + 40, cy - 14);
77
+ ctx.stroke();
78
+
79
+ // Draw pulse rings from head
80
+ const drawRing = (r) => {
81
+ const alpha = Math.max(0, 1 - (r / maxR));
82
+ ctx.strokeStyle = this.executing ? `rgba(52, 211, 153, ${alpha})` : `rgba(16, 185, 129, ${alpha})`;
83
+ ctx.lineWidth = 1.5;
84
+ ctx.beginPath();
85
+ ctx.arc(cx, cy, r, 0, Math.PI * 2);
86
+ ctx.stroke();
87
+ };
88
+
89
+ drawRing(ringR1);
90
+ drawRing(ringR2);
91
+ drawRing(ringR3);
92
+
93
+ // Core commit node
94
+ ctx.fillStyle = '#34d399';
95
+ ctx.shadowColor = '#34d399';
96
+ ctx.shadowBlur = 8;
97
+ ctx.beginPath();
98
+ ctx.arc(cx, cy, 4, 0, Math.PI * 2);
99
+ ctx.fill();
100
+ ctx.shadowBlur = 0;
101
+
102
+ const speed = this.executing ? 0.8 : 0.35;
103
+ ringR1 = (ringR1 + speed) % maxR;
104
+ ringR2 = (ringR2 + speed) % maxR;
105
+ ringR3 = (ringR3 + speed) % maxR;
106
+
107
+ requestAnimationFrame(draw);
108
+ };
109
+
110
+ requestAnimationFrame(draw);
111
+ }
112
+
113
+ render() {
114
+ this.shadowRoot.innerHTML = `
115
+ <style>
116
+ :host {
117
+ display: block;
118
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
119
+ background: #061510;
120
+ color: #d1fae5;
121
+ border-radius: 8px;
122
+ border: 1px solid rgba(16, 185, 129, 0.35);
123
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.45);
124
+ padding: 18px;
125
+ box-sizing: border-box;
126
+ overflow: hidden;
127
+ }
128
+ .header {
129
+ display: flex;
130
+ justify-content: space-between;
131
+ align-items: flex-start;
132
+ margin-bottom: 14px;
133
+ }
134
+ .brand-meta {
135
+ display: flex;
136
+ flex-direction: column;
137
+ gap: 2px;
138
+ }
139
+ .title {
140
+ font-size: 16px;
141
+ font-weight: 700;
142
+ letter-spacing: 0.04em;
143
+ text-transform: uppercase;
144
+ color: #a7f3d0;
145
+ margin: 0;
146
+ }
147
+ .subtitle {
148
+ font-size: 11px;
149
+ color: #10b981;
150
+ letter-spacing: 0.02em;
151
+ margin: 0;
152
+ }
153
+ .badge {
154
+ display: inline-flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ font-size: 10px;
158
+ font-weight: 700;
159
+ letter-spacing: 0.08em;
160
+ text-transform: uppercase;
161
+ color: #34d399;
162
+ background: rgba(16, 185, 129, 0.12);
163
+ border: 1px solid rgba(16, 185, 129, 0.3);
164
+ border-radius: 4px;
165
+ padding: 4px 8px;
166
+ }
167
+ .visual-display {
168
+ position: relative;
169
+ background: #020b08;
170
+ border: 1px solid rgba(16, 185, 129, 0.2);
171
+ border-radius: 6px;
172
+ margin-bottom: 14px;
173
+ overflow: hidden;
174
+ }
175
+ canvas {
176
+ display: block;
177
+ width: 100%;
178
+ height: 64px;
179
+ }
180
+ .telemetry-row {
181
+ display: flex;
182
+ justify-content: space-between;
183
+ padding: 6px 10px;
184
+ background: rgba(255, 255, 255, 0.03);
185
+ border-top: 1px solid rgba(16, 185, 129, 0.15);
186
+ font-family: monospace;
187
+ font-size: 11px;
188
+ color: #6ee7b7;
189
+ }
190
+ .actions-grid {
191
+ display: grid;
192
+ grid-template-columns: repeat(3, 1fr);
193
+ gap: 8px;
194
+ margin-bottom: 12px;
195
+ }
196
+ .touch-btn {
197
+ min-height: 44px;
198
+ min-width: 44px;
199
+ display: inline-flex;
200
+ align-items: center;
201
+ justify-content: center;
202
+ background: rgba(16, 185, 129, 0.08);
203
+ border: 1px solid rgba(16, 185, 129, 0.25);
204
+ color: #a7f3d0;
205
+ font-size: 11px;
206
+ font-weight: 600;
207
+ letter-spacing: 0.04em;
208
+ text-transform: uppercase;
209
+ border-radius: 6px;
210
+ cursor: pointer;
211
+ transition: background 0.15s ease, border-color 0.15s ease;
212
+ padding: 6px 8px;
213
+ text-align: center;
214
+ }
215
+ .touch-btn:hover {
216
+ background: rgba(16, 185, 129, 0.18);
217
+ border-color: rgba(16, 185, 129, 0.5);
218
+ }
219
+ .touch-btn:active {
220
+ transform: translateY(1px);
221
+ }
222
+ .output-box {
223
+ background: #010604;
224
+ border: 1px solid rgba(16, 185, 129, 0.2);
225
+ border-radius: 6px;
226
+ padding: 8px 10px;
227
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
228
+ font-size: 11px;
229
+ line-height: 1.45;
230
+ color: #6ee7b7;
231
+ min-height: 48px;
232
+ max-height: 85px;
233
+ overflow-y: auto;
234
+ white-space: pre-wrap;
235
+ word-break: break-word;
236
+ }
237
+ </style>
238
+
239
+ <div class="header">
240
+ <div class="brand-meta">
241
+ <h2 class="title">Git Hygiene</h2>
242
+ <p class="subtitle">Repository Hygiene & Branch Integrity</p>
243
+ </div>
244
+ <div id="status-badge" class="badge">READY</div>
245
+ </div>
246
+
247
+ <div class="visual-display">
248
+ <canvas id="sentinel-canvas" width="340" height="64"></canvas>
249
+ <div class="telemetry-row">
250
+ <span>Worktree: Monitored</span>
251
+ <span>Upstream: Origin Tracking</span>
252
+ </div>
253
+ </div>
254
+
255
+ <div class="actions-grid">
256
+ <button id="btn-audit" class="touch-btn" type="button">Audit Status</button>
257
+ <button id="btn-diff" class="touch-btn" type="button">Working Diff</button>
258
+ <button id="btn-help" class="touch-btn" type="button">Help</button>
259
+ </div>
260
+
261
+ <div id="card-out" class="output-box">Worktree watcher armed. Dispatch audit to inspect repository status.</div>
262
+ `;
263
+
264
+ this.shadowRoot.querySelector('#btn-audit')?.addEventListener('click', () => {
265
+ this.execute('audit');
266
+ });
267
+ this.shadowRoot.querySelector('#btn-diff')?.addEventListener('click', () => {
268
+ this.execute('diff');
269
+ });
270
+ this.shadowRoot.querySelector('#btn-help')?.addEventListener('click', () => {
271
+ this.execute('help');
272
+ });
273
+ }
274
+ }
275
+
276
+ if (!customElements.get('tr-git-sentinel-card')) {
277
+ customElements.define('tr-git-sentinel-card', GitSentinelCard);
278
+ }
@@ -1,5 +1,14 @@
1
1
  # Mesh
2
2
 
3
+ `total-recall mesh access verify --all-pairs --json` executes actual shell
4
+ identity probes in every direction between configured SSH machines. Offline
5
+ machines and devices without an account remain explicitly unverified. Existing
6
+ network restrictions continue to apply.
7
+
8
+ `total-recall mesh file put <node> <source> <destination> --mode 600` transfers
9
+ bounded files through the recorded SSH connection, with payload on stdin and
10
+ SHA-256 readback verification. It never copies vaults or provisions accounts.
11
+
3
12
  > Headscale and Tailscale SSH control-server mesh administration and node discovery
4
13
 
5
14
  ## Sharing
@@ -12,6 +12,12 @@ export async function run(argv = []) {
12
12
  const args = argv.slice(3);
13
13
  const sub = args[0] || 'status';
14
14
  if (args.includes('--help') || args.includes('-h')) return meshCli(['--help']);
15
+ if(sub==='file'){
16
+ if(args[1]!=='put')throw new Error('file put <node> <source> <destination> [--mode 600]');
17
+ const {putMeshFile}=await import('./src/core/mesh-files.mjs');
18
+ const at=args.indexOf('--mode');const mode=at<0?0o600:Number.parseInt(args[at+1],8);
19
+ console.log(JSON.stringify(await putMeshFile({node:args[2],source:args[3],destination:args[4],mode})));return;
20
+ }
15
21
  if (sub === 'status' || sub === 'view' || sub === 'probe') {
16
22
  const result = await meshStatus();
17
23
  console.log(JSON.stringify(result));