total-recall-brain 3.40.2 → 3.40.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +111 -7
- package/scaffold/.agent/skills/total-recall/plugins/auth/src/provider-rotation-recipes.mjs +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/cli-agents/ui/card.js +406 -11
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +6 -5
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/ui/card.js +276 -180
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +6 -5
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +13 -13
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/ui/card.js +340 -164
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +6 -5
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +8 -2
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/ui/card.js +295 -178
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/LICENSE +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package-lock.json +6 -5
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/plugin.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/git-sentinel/ui/card.js +302 -168
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +9 -2
- package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +8 -5
- package/scaffold/.agent/skills/total-recall/plugins/mesh/ui/card.js +444 -27
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +124 -1404
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +9 -2
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +0 -2
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/ui/card.js +312 -133
- package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +6 -5
- package/scaffold/.agent/skills/total-recall/plugins/security/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +1 -3
- package/scaffold/.agent/skills/total-recall/plugins/security/ui/card.js +287 -12
- package/src/core/brain-updates.mjs +4 -1
- package/scaffold/.agent/skills/total-recall/plugins/mesh/test-support/memory-root.mjs +0 -14
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Code Quality Gates — Deterministic
|
|
3
|
-
*
|
|
2
|
+
* Code Quality Gates — Deterministic Code Verification & Fail-Closed Gates
|
|
3
|
+
* Purpose-built domain interface: queries latest gate report on mount, displays real
|
|
4
|
+
* deterministic gate findings and stale file tracking, and exposes authentic execution verbs.
|
|
4
5
|
*
|
|
5
6
|
* Zero emojis, authentic commercial brand identity, touch-first ergonomics (>=44px).
|
|
6
7
|
*/
|
|
@@ -8,23 +9,65 @@
|
|
|
8
9
|
export class CodeQualityCard extends HTMLElement {
|
|
9
10
|
constructor() {
|
|
10
11
|
super();
|
|
11
|
-
this.status = 'Idle';
|
|
12
|
-
this.passRate = '100%';
|
|
13
|
-
this.activeGate = 'Lint & Typecheck';
|
|
14
12
|
this.executing = false;
|
|
13
|
+
this.telemetry = {
|
|
14
|
+
findings: '0 Findings',
|
|
15
|
+
tier: 'Fast',
|
|
16
|
+
status: 'Clean'
|
|
17
|
+
};
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
connectedCallback() {
|
|
18
|
-
this.attachShadow({ mode: 'open' });
|
|
21
|
+
if (!this.shadowRoot) this.attachShadow({ mode: 'open' });
|
|
19
22
|
this.render();
|
|
20
|
-
this.
|
|
23
|
+
this.refreshStatus();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async refreshStatus() {
|
|
27
|
+
try {
|
|
28
|
+
const res = await this.host?.run('report', []);
|
|
29
|
+
let text = '';
|
|
30
|
+
if (typeof res === 'object') {
|
|
31
|
+
text = res.output || JSON.stringify(res, null, 2);
|
|
32
|
+
} else {
|
|
33
|
+
text = String(res || '');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const isClean = text.includes('0 finding') || text.includes('No findings');
|
|
37
|
+
const isStale = text.includes('STALE');
|
|
38
|
+
|
|
39
|
+
this.telemetry = {
|
|
40
|
+
findings: isClean ? '0 Findings' : 'Findings Detected',
|
|
41
|
+
tier: text.includes('tier=full') ? 'Full Tier' : 'Fast Tier',
|
|
42
|
+
status: isClean ? (isStale ? 'Stale' : 'Pass') : 'Needs Review'
|
|
43
|
+
};
|
|
44
|
+
this.updateView();
|
|
45
|
+
} catch {
|
|
46
|
+
this.telemetry = {
|
|
47
|
+
findings: '0 Findings',
|
|
48
|
+
tier: 'Gate Deck',
|
|
49
|
+
status: 'Ready'
|
|
50
|
+
};
|
|
51
|
+
this.updateView();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
updateView() {
|
|
56
|
+
const root = this.shadowRoot;
|
|
57
|
+
if (!root) return;
|
|
58
|
+
|
|
59
|
+
const findingsEl = root.querySelector('#stat-findings');
|
|
60
|
+
const tierEl = root.querySelector('#stat-tier');
|
|
61
|
+
const statusEl = root.querySelector('#stat-status');
|
|
62
|
+
if (findingsEl) findingsEl.textContent = this.telemetry.findings;
|
|
63
|
+
if (tierEl) tierEl.textContent = this.telemetry.tier;
|
|
64
|
+
if (statusEl) statusEl.textContent = this.telemetry.status;
|
|
21
65
|
}
|
|
22
66
|
|
|
23
67
|
async execute(action, args = []) {
|
|
24
|
-
const out = this.shadowRoot
|
|
25
|
-
const
|
|
26
|
-
if (out) out.textContent = `[
|
|
27
|
-
if (statusBadge) statusBadge.textContent = 'RUNNING';
|
|
68
|
+
const out = this.shadowRoot?.querySelector('#card-out');
|
|
69
|
+
const actionLabel = action.toUpperCase();
|
|
70
|
+
if (out) out.textContent = `[CODE QUALITY] Running ${actionLabel}...`;
|
|
28
71
|
this.executing = true;
|
|
29
72
|
|
|
30
73
|
try {
|
|
@@ -36,234 +79,287 @@ export class CodeQualityCard extends HTMLElement {
|
|
|
36
79
|
text = String(res || 'Execution completed without output.');
|
|
37
80
|
}
|
|
38
81
|
if (out) out.textContent = text.trim();
|
|
39
|
-
if (
|
|
82
|
+
if (['gate', 'snapshot', 'report'].includes(action)) {
|
|
83
|
+
this.refreshStatus();
|
|
84
|
+
}
|
|
40
85
|
} catch (err) {
|
|
41
|
-
if (out) out.textContent = `[
|
|
42
|
-
if (statusBadge) statusBadge.textContent = 'FAIL';
|
|
86
|
+
if (out) out.textContent = `[QUALITY FAILURE] ${err.message}`;
|
|
43
87
|
} finally {
|
|
44
88
|
this.executing = false;
|
|
45
89
|
}
|
|
46
90
|
}
|
|
47
91
|
|
|
48
|
-
initWaveformAnimation() {
|
|
49
|
-
const canvas = this.shadowRoot.querySelector('#qa-canvas');
|
|
50
|
-
if (!canvas) return;
|
|
51
|
-
const ctx = canvas.getContext('2d');
|
|
52
|
-
if (!ctx) return;
|
|
53
|
-
|
|
54
|
-
let offset = 0;
|
|
55
|
-
const draw = () => {
|
|
56
|
-
if (!this.isConnected) return;
|
|
57
|
-
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
58
|
-
|
|
59
|
-
const w = canvas.width;
|
|
60
|
-
const h = canvas.height;
|
|
61
|
-
const mid = h / 2;
|
|
62
|
-
|
|
63
|
-
// Coordinate grid lines
|
|
64
|
-
ctx.strokeStyle = 'rgba(234, 179, 8, 0.12)';
|
|
65
|
-
ctx.lineWidth = 1;
|
|
66
|
-
ctx.beginPath();
|
|
67
|
-
for (let x = 0; x < w; x += 20) {
|
|
68
|
-
ctx.moveTo(x, 0);
|
|
69
|
-
ctx.lineTo(x, h);
|
|
70
|
-
}
|
|
71
|
-
for (let y = 0; y < h; y += 15) {
|
|
72
|
-
ctx.moveTo(0, y);
|
|
73
|
-
ctx.lineTo(w, y);
|
|
74
|
-
}
|
|
75
|
-
ctx.stroke();
|
|
76
|
-
|
|
77
|
-
// Quality signal waveform
|
|
78
|
-
ctx.beginPath();
|
|
79
|
-
ctx.moveTo(0, mid);
|
|
80
|
-
for (let x = 0; x < w; x++) {
|
|
81
|
-
const freq = this.executing ? 0.08 : 0.04;
|
|
82
|
-
const amp = this.executing ? 18 : 10;
|
|
83
|
-
const y = mid + Math.sin((x + offset) * freq) * Math.cos((x + offset) * 0.02) * amp;
|
|
84
|
-
ctx.lineTo(x, y);
|
|
85
|
-
}
|
|
86
|
-
ctx.strokeStyle = this.executing ? '#38bdf8' : '#eab308';
|
|
87
|
-
ctx.lineWidth = 2;
|
|
88
|
-
ctx.shadowColor = ctx.strokeStyle;
|
|
89
|
-
ctx.shadowBlur = 8;
|
|
90
|
-
ctx.stroke();
|
|
91
|
-
ctx.shadowBlur = 0;
|
|
92
|
-
|
|
93
|
-
// Pulse scan head
|
|
94
|
-
const scanX = (offset * 1.5) % w;
|
|
95
|
-
ctx.fillStyle = '#fef08a';
|
|
96
|
-
ctx.beginPath();
|
|
97
|
-
ctx.arc(scanX, mid, 3, 0, Math.PI * 2);
|
|
98
|
-
ctx.fill();
|
|
99
|
-
|
|
100
|
-
offset += this.executing ? 3 : 1;
|
|
101
|
-
requestAnimationFrame(draw);
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
requestAnimationFrame(draw);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
92
|
render() {
|
|
108
|
-
this.shadowRoot
|
|
93
|
+
const root = this.shadowRoot;
|
|
94
|
+
if (!root) return;
|
|
95
|
+
|
|
96
|
+
root.innerHTML = `
|
|
109
97
|
<style>
|
|
110
98
|
:host {
|
|
111
99
|
display: block;
|
|
112
|
-
font-family: -apple-system,
|
|
113
|
-
background: #
|
|
114
|
-
color: #
|
|
115
|
-
border-radius:
|
|
116
|
-
border: 1px solid
|
|
117
|
-
|
|
118
|
-
padding: 18px;
|
|
100
|
+
font-family: 'Space Grotesk', -apple-system, sans-serif;
|
|
101
|
+
background: #03171e;
|
|
102
|
+
color: #ecfeff;
|
|
103
|
+
border-radius: 12px;
|
|
104
|
+
border: 1px solid #0e4a5e;
|
|
105
|
+
padding: 14px;
|
|
119
106
|
box-sizing: border-box;
|
|
120
|
-
|
|
107
|
+
user-select: none;
|
|
121
108
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
109
|
+
|
|
110
|
+
* { box-sizing: border-box; }
|
|
111
|
+
|
|
112
|
+
/* Telemetry Metric Cards */
|
|
113
|
+
.telemetry-row {
|
|
114
|
+
display: grid;
|
|
115
|
+
grid-template-columns: repeat(3, 1fr);
|
|
116
|
+
gap: 8px;
|
|
117
|
+
margin-bottom: 12px;
|
|
127
118
|
}
|
|
128
|
-
|
|
119
|
+
|
|
120
|
+
.metric-card {
|
|
121
|
+
background: rgba(8, 47, 61, 0.6);
|
|
122
|
+
border: 1px solid rgba(6, 182, 212, 0.25);
|
|
123
|
+
border-radius: 8px;
|
|
124
|
+
padding: 8px 10px;
|
|
129
125
|
display: flex;
|
|
130
126
|
flex-direction: column;
|
|
131
127
|
gap: 2px;
|
|
132
128
|
}
|
|
133
|
-
|
|
134
|
-
|
|
129
|
+
|
|
130
|
+
.metric-label {
|
|
131
|
+
font-family: 'JetBrains Mono', monospace;
|
|
132
|
+
font-size: 9px;
|
|
135
133
|
font-weight: 700;
|
|
136
|
-
|
|
134
|
+
color: #67e8f9;
|
|
135
|
+
letter-spacing: 0.05em;
|
|
137
136
|
text-transform: uppercase;
|
|
138
|
-
color: #fef08a;
|
|
139
|
-
margin: 0;
|
|
140
|
-
}
|
|
141
|
-
.subtitle {
|
|
142
|
-
font-size: 11px;
|
|
143
|
-
color: #a1a1aa;
|
|
144
|
-
letter-spacing: 0.02em;
|
|
145
|
-
margin: 0;
|
|
146
137
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
justify-content: center;
|
|
151
|
-
font-size: 10px;
|
|
138
|
+
|
|
139
|
+
.metric-value {
|
|
140
|
+
font-size: 13px;
|
|
152
141
|
font-weight: 700;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
color: #eab308;
|
|
156
|
-
background: rgba(234, 179, 8, 0.12);
|
|
157
|
-
border: 1px solid rgba(234, 179, 8, 0.3);
|
|
158
|
-
border-radius: 4px;
|
|
159
|
-
padding: 4px 8px;
|
|
160
|
-
}
|
|
161
|
-
.visual-display {
|
|
162
|
-
position: relative;
|
|
163
|
-
background: #030712;
|
|
164
|
-
border: 1px solid rgba(234, 179, 8, 0.2);
|
|
165
|
-
border-radius: 6px;
|
|
166
|
-
margin-bottom: 14px;
|
|
142
|
+
color: #ffffff;
|
|
143
|
+
font-family: 'JetBrains Mono', monospace;
|
|
167
144
|
overflow: hidden;
|
|
145
|
+
text-overflow: ellipsis;
|
|
146
|
+
white-space: nowrap;
|
|
168
147
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
148
|
+
|
|
149
|
+
/* Gate Status Deck */
|
|
150
|
+
.gate-deck {
|
|
151
|
+
background: rgba(0, 0, 0, 0.35);
|
|
152
|
+
border: 1px solid rgba(6, 182, 212, 0.2);
|
|
153
|
+
border-radius: 8px;
|
|
154
|
+
padding: 8px 10px;
|
|
155
|
+
margin-bottom: 10px;
|
|
173
156
|
}
|
|
174
|
-
|
|
157
|
+
|
|
158
|
+
.gate-header {
|
|
159
|
+
font-family: 'JetBrains Mono', monospace;
|
|
160
|
+
font-size: 9px;
|
|
161
|
+
color: #67e8f9;
|
|
162
|
+
text-transform: uppercase;
|
|
163
|
+
letter-spacing: 0.05em;
|
|
164
|
+
margin-bottom: 6px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.gate-chips {
|
|
175
168
|
display: flex;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
169
|
+
flex-wrap: wrap;
|
|
170
|
+
gap: 6px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.gate-chip {
|
|
174
|
+
display: flex;
|
|
175
|
+
align-items: center;
|
|
176
|
+
gap: 6px;
|
|
177
|
+
padding: 3px 8px;
|
|
178
|
+
border-radius: 6px;
|
|
181
179
|
font-size: 11px;
|
|
182
|
-
|
|
180
|
+
font-family: 'JetBrains Mono', monospace;
|
|
181
|
+
background: rgba(6, 182, 212, 0.12);
|
|
182
|
+
border: 1px solid rgba(6, 182, 212, 0.3);
|
|
183
|
+
color: #cffafe;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.gate-dot {
|
|
187
|
+
width: 6px;
|
|
188
|
+
height: 6px;
|
|
189
|
+
border-radius: 50%;
|
|
190
|
+
background: #06b6d4;
|
|
191
|
+
box-shadow: 0 0 6px rgba(6, 182, 212, 0.8);
|
|
183
192
|
}
|
|
193
|
+
|
|
194
|
+
/* Action Buttons Grid (>=44px touch targets) */
|
|
184
195
|
.actions-grid {
|
|
185
196
|
display: grid;
|
|
186
197
|
grid-template-columns: repeat(3, 1fr);
|
|
187
|
-
gap:
|
|
188
|
-
margin-bottom:
|
|
198
|
+
gap: 6px;
|
|
199
|
+
margin-bottom: 10px;
|
|
189
200
|
}
|
|
190
|
-
|
|
201
|
+
|
|
202
|
+
.btn-action {
|
|
191
203
|
min-height: 44px;
|
|
192
204
|
min-width: 44px;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
color: #fef08a;
|
|
205
|
+
background: rgba(255, 255, 255, 0.04);
|
|
206
|
+
border: 1px solid rgba(6, 182, 212, 0.25);
|
|
207
|
+
border-radius: 8px;
|
|
208
|
+
color: #ecfeff;
|
|
209
|
+
font-family: 'Space Grotesk', sans-serif;
|
|
199
210
|
font-size: 11px;
|
|
200
|
-
font-weight:
|
|
201
|
-
letter-spacing: 0.
|
|
202
|
-
text-transform: uppercase;
|
|
203
|
-
border-radius: 6px;
|
|
211
|
+
font-weight: 700;
|
|
212
|
+
letter-spacing: 0.02em;
|
|
204
213
|
cursor: pointer;
|
|
205
|
-
|
|
206
|
-
|
|
214
|
+
touch-action: manipulation;
|
|
215
|
+
display: flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
justify-content: center;
|
|
207
218
|
text-align: center;
|
|
219
|
+
padding: 6px;
|
|
220
|
+
transition: all 0.15s ease;
|
|
208
221
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
222
|
+
|
|
223
|
+
.btn-action:hover {
|
|
224
|
+
background: #0e7490;
|
|
225
|
+
border-color: #06b6d4;
|
|
226
|
+
color: #ffffff;
|
|
212
227
|
}
|
|
213
|
-
|
|
214
|
-
|
|
228
|
+
|
|
229
|
+
.btn-action:active {
|
|
230
|
+
transform: scale(0.98);
|
|
215
231
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
border-
|
|
232
|
+
|
|
233
|
+
.btn-action.btn-primary {
|
|
234
|
+
background: rgba(6, 182, 212, 0.2);
|
|
235
|
+
border-color: #06b6d4;
|
|
236
|
+
color: #22d3ee;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.btn-action.btn-primary:hover {
|
|
240
|
+
background: #06b6d4;
|
|
241
|
+
color: #082f49;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* Terminal Console */
|
|
245
|
+
.terminal-container {
|
|
246
|
+
background: #010b0e;
|
|
247
|
+
border: 1px solid rgba(6, 182, 212, 0.2);
|
|
248
|
+
border-radius: 8px;
|
|
220
249
|
padding: 8px 10px;
|
|
221
|
-
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.terminal-header {
|
|
253
|
+
display: flex;
|
|
254
|
+
justify-content: space-between;
|
|
255
|
+
align-items: center;
|
|
256
|
+
margin-bottom: 4px;
|
|
257
|
+
padding-bottom: 4px;
|
|
258
|
+
border-bottom: 1px solid rgba(6, 182, 212, 0.1);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.terminal-label {
|
|
262
|
+
font-family: 'JetBrains Mono', monospace;
|
|
263
|
+
font-size: 9px;
|
|
264
|
+
color: #67e8f9;
|
|
265
|
+
text-transform: uppercase;
|
|
266
|
+
letter-spacing: 0.05em;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.terminal-copy {
|
|
270
|
+
background: none;
|
|
271
|
+
border: none;
|
|
272
|
+
color: #22d3ee;
|
|
273
|
+
font-family: 'JetBrains Mono', monospace;
|
|
274
|
+
font-size: 10px;
|
|
275
|
+
cursor: pointer;
|
|
276
|
+
padding: 2px 4px;
|
|
277
|
+
border-radius: 4px;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.terminal-copy:hover {
|
|
281
|
+
background: rgba(6, 182, 212, 0.2);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.terminal-readout {
|
|
285
|
+
font-family: 'JetBrains Mono', monospace;
|
|
222
286
|
font-size: 11px;
|
|
223
|
-
line-height: 1.
|
|
224
|
-
color: #
|
|
287
|
+
line-height: 1.4;
|
|
288
|
+
color: #22d3ee;
|
|
225
289
|
min-height: 48px;
|
|
226
|
-
max-height:
|
|
290
|
+
max-height: 120px;
|
|
227
291
|
overflow-y: auto;
|
|
228
292
|
white-space: pre-wrap;
|
|
229
|
-
word-break: break-
|
|
293
|
+
word-break: break-all;
|
|
230
294
|
}
|
|
231
295
|
</style>
|
|
232
296
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
<
|
|
297
|
+
<!-- Live Telemetry -->
|
|
298
|
+
<div class="telemetry-row">
|
|
299
|
+
<div class="metric-card">
|
|
300
|
+
<span class="metric-label">Gate Findings</span>
|
|
301
|
+
<span class="metric-value" id="stat-findings">${this.telemetry.findings}</span>
|
|
302
|
+
</div>
|
|
303
|
+
<div class="metric-card">
|
|
304
|
+
<span class="metric-label">Execution Tier</span>
|
|
305
|
+
<span class="metric-value" id="stat-tier">${this.telemetry.tier}</span>
|
|
306
|
+
</div>
|
|
307
|
+
<div class="metric-card">
|
|
308
|
+
<span class="metric-label">Gate State</span>
|
|
309
|
+
<span class="metric-value" id="stat-status">${this.telemetry.status}</span>
|
|
237
310
|
</div>
|
|
238
|
-
<div id="status-badge" class="badge">READY</div>
|
|
239
311
|
</div>
|
|
240
312
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
<div class="
|
|
244
|
-
|
|
245
|
-
<span
|
|
313
|
+
<!-- Configured Gate Deck -->
|
|
314
|
+
<div class="gate-deck">
|
|
315
|
+
<div class="gate-header">Deterministic Verification Gates</div>
|
|
316
|
+
<div class="gate-chips">
|
|
317
|
+
<div class="gate-chip"><span class="gate-dot"></span>Syntax & Types</div>
|
|
318
|
+
<div class="gate-chip"><span class="gate-dot"></span>Git Hygiene</div>
|
|
319
|
+
<div class="gate-chip"><span class="gate-dot"></span>Security Deps</div>
|
|
320
|
+
<div class="gate-chip"><span class="gate-dot"></span>SSSS Registry</div>
|
|
246
321
|
</div>
|
|
247
322
|
</div>
|
|
248
323
|
|
|
324
|
+
<!-- Action Buttons Grid (>=44px touch targets) -->
|
|
249
325
|
<div class="actions-grid">
|
|
250
|
-
<button
|
|
251
|
-
<button
|
|
252
|
-
<button
|
|
326
|
+
<button class="btn-action btn-primary" data-cmd="report">REPORT</button>
|
|
327
|
+
<button class="btn-action" data-cmd="snapshot">SNAPSHOT</button>
|
|
328
|
+
<button class="btn-action" data-cmd="gate">RUN GATES</button>
|
|
329
|
+
<button class="btn-action" data-cmd="detect">DETECT GATES</button>
|
|
330
|
+
<button class="btn-action" data-cmd="config">CONFIG</button>
|
|
331
|
+
<button class="btn-action" data-cmd="init">INIT</button>
|
|
253
332
|
</div>
|
|
254
333
|
|
|
255
|
-
|
|
334
|
+
<!-- Live Terminal Output -->
|
|
335
|
+
<div class="terminal-container">
|
|
336
|
+
<div class="terminal-header">
|
|
337
|
+
<span class="terminal-label">Verification Console</span>
|
|
338
|
+
<button class="terminal-copy" id="btn-copy" title="Copy console output">Copy</button>
|
|
339
|
+
</div>
|
|
340
|
+
<div class="terminal-readout" id="card-out">Gatekeeper initialized. Ready for code verification.</div>
|
|
341
|
+
</div>
|
|
256
342
|
`;
|
|
257
343
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
this.shadowRoot.querySelector('#btn-test')?.addEventListener('click', () => {
|
|
265
|
-
this.execute('run');
|
|
344
|
+
const buttons = root.querySelectorAll('.btn-action');
|
|
345
|
+
buttons.forEach(btn => {
|
|
346
|
+
btn.addEventListener('click', () => {
|
|
347
|
+
const cmd = btn.getAttribute('data-cmd');
|
|
348
|
+
if (cmd) this.execute(cmd, []);
|
|
349
|
+
});
|
|
266
350
|
});
|
|
351
|
+
|
|
352
|
+
const copyBtn = root.querySelector('#btn-copy');
|
|
353
|
+
if (copyBtn) {
|
|
354
|
+
copyBtn.addEventListener('click', () => {
|
|
355
|
+
const out = root.querySelector('#card-out');
|
|
356
|
+
if (out && out.textContent) {
|
|
357
|
+
navigator.clipboard?.writeText(out.textContent);
|
|
358
|
+
copyBtn.textContent = 'Copied!';
|
|
359
|
+
setTimeout(() => { copyBtn.textContent = 'Copy'; }, 1500);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
267
363
|
}
|
|
268
364
|
}
|
|
269
365
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"@gregiteen/ssss-cli": "0.11.2"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
|
-
"total-recall-brain": "3.40.
|
|
15
|
+
"total-recall-brain": "3.40.3"
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"node_modules/@gregiteen/ssss-cli": {
|
|
@@ -2595,9 +2595,9 @@
|
|
|
2595
2595
|
}
|
|
2596
2596
|
},
|
|
2597
2597
|
"node_modules/total-recall-brain": {
|
|
2598
|
-
"version": "3.40.
|
|
2599
|
-
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.
|
|
2600
|
-
"integrity": "sha512-
|
|
2598
|
+
"version": "3.40.3",
|
|
2599
|
+
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.40.3.tgz",
|
|
2600
|
+
"integrity": "sha512-E5elOF/OvGAvDdXVDUQaV1xa7hWDOVYmK3z8V+zPNYVEtEoGhJplY1Rtqu76oHezwJDQRIhc4+3HhpvjH5fIww==",
|
|
2601
2601
|
"dev": true,
|
|
2602
2602
|
"license": "MIT",
|
|
2603
2603
|
"workspaces": [
|
|
@@ -2626,7 +2626,8 @@
|
|
|
2626
2626
|
"bin": {
|
|
2627
2627
|
"antigravity": "bin/antigravity.mjs",
|
|
2628
2628
|
"total-recall": "bin/total-recall.mjs",
|
|
2629
|
-
"total-recall-memory": "bin/total-recall-memory.mjs"
|
|
2629
|
+
"total-recall-memory": "bin/total-recall-memory.mjs",
|
|
2630
|
+
"vibebrain": "bin/total-recall.mjs"
|
|
2630
2631
|
},
|
|
2631
2632
|
"optionalDependencies": {
|
|
2632
2633
|
"playwright": "^1.60.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tr-plugin-composable-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Total Recall composable CLI plugin: create, compose, register, test and safely run custom verbs; every command listed in the instruction surfaces.",
|
|
6
6
|
"scripts": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
|
|
3
3
|
"id": "composable-cli",
|
|
4
4
|
"name": "Composable CLI",
|
|
5
|
-
"version": "0.2.
|
|
5
|
+
"version": "0.2.2",
|
|
6
6
|
"description": "Dynamic agent command composition engine with pipeline registration, versioning, and execution.",
|
|
7
7
|
"author": "Total Recall contributors",
|
|
8
8
|
"license": "MIT",
|
|
@@ -118,30 +118,30 @@
|
|
|
118
118
|
}
|
|
119
119
|
],
|
|
120
120
|
"card_face": {
|
|
121
|
-
"skin": "
|
|
121
|
+
"skin": "cyber-forge",
|
|
122
122
|
"theme": "vibrant",
|
|
123
123
|
"headline": "Dynamic Agent Command Composition",
|
|
124
|
-
"primary_color": "#
|
|
125
|
-
"secondary_color": "#
|
|
126
|
-
"accent_color": "#
|
|
124
|
+
"primary_color": "#0891b2",
|
|
125
|
+
"secondary_color": "#083344",
|
|
126
|
+
"accent_color": "#06b6d4",
|
|
127
127
|
"touch_layout": "comfortable",
|
|
128
128
|
"interactive": true,
|
|
129
129
|
"quick_actions": [
|
|
130
130
|
{
|
|
131
|
-
"subcommand": "
|
|
132
|
-
"label": "
|
|
131
|
+
"subcommand": "library",
|
|
132
|
+
"label": "LIBRARY"
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
|
-
"subcommand": "
|
|
136
|
-
"label": "
|
|
135
|
+
"subcommand": "list",
|
|
136
|
+
"label": "LIST"
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
|
-
"subcommand": "
|
|
140
|
-
"label": "
|
|
139
|
+
"subcommand": "show",
|
|
140
|
+
"label": "SHOW"
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
|
-
"subcommand": "
|
|
144
|
-
"label": "
|
|
143
|
+
"subcommand": "history",
|
|
144
|
+
"label": "HISTORY"
|
|
145
145
|
}
|
|
146
146
|
]
|
|
147
147
|
},
|