ruvnet-brain 4.0.1 → 4.0.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/.claude-plugin/marketplace.json +1 -0
- package/README.md +4 -4
- package/bin/install.mjs +303 -24
- package/console/CONTRACT.md +172 -0
- package/console/activity.js +753 -0
- package/console/app.js +4189 -0
- package/console/architecture.html +1221 -0
- package/console/assets/depth-1.webp +0 -0
- package/console/assets/depth-2.webp +0 -0
- package/console/assets/depth-3.webp +0 -0
- package/console/assets/harness-vs-plain.svg +259 -0
- package/console/assets/hero.webp +0 -0
- package/console/assets/memory.webp +0 -0
- package/console/assets/metaharness.svg +247 -0
- package/console/index.html +777 -0
- package/console/install-architecture.html +162 -0
- package/console/install-mockup.html +543 -0
- package/console/style.css +2144 -0
- package/console/tips.css +926 -0
- package/console/tips.html +858 -0
- package/console/tips.js +128 -0
- package/docs/RELEASE-NOTES-4.0.md +88 -0
- package/kb/model-requirements.mjs +37 -6
- package/keys/ruvnet-brain-signing.pub.pem +3 -0
- package/package.json +8 -22
- package/plugin/.claude-plugin/marketplace.json +1 -0
- package/plugin/.claude-plugin/plugin.json +2 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/commands/brain-console.md +2 -2
- package/plugin/commands/configure.md +3 -2
- package/plugin/commands/rvbc.md +4 -3
- package/plugin/commands/rvcb.md +2 -2
- package/plugin/commands/whats-new.md +6 -6
- package/plugin/docs/RELEASE-NOTES-4.0.md +88 -0
- package/plugin/hooks/hooks.json +1 -2
- package/plugin/mcp/managed-cli-interface.mjs +47 -4
- package/plugin/mcp/server.mjs +90 -32
- package/plugin/scripts/detach.mjs +14 -0
- package/plugin/scripts/first-session-worker.mjs +38 -0
- package/plugin/scripts/ground-ruvnet.sh +16 -6
- package/plugin/scripts/hook-shim.mjs +34 -29
- package/plugin/scripts/learn-capture.sh +22 -3
- package/plugin/scripts/learn-flush.mjs +21 -4
- package/plugin/scripts/runtime-preferences.mjs +269 -0
- package/plugin/scripts/session-start-core.mjs +503 -0
- package/plugin/scripts/session-start.sh +3 -858
- package/plugin/scripts/whats-new.mjs +42 -0
- package/plugin/skills/brain-console/SKILL.md +4 -2
- package/plugin/skills/release-proof/SKILL.md +98 -0
- package/plugin/skills/release-proof/agents/openai.yaml +4 -0
- package/plugin/skills/release-proof/references/receipt-contract.md +44 -0
- package/plugin/skills/release-proof/scripts/release-proof.mjs +286 -0
- package/plugin/skills/ruvnet-brain/PLAYBOOK.md +5 -1
- package/plugin/skills/ruvnet-brain/SKILL.md +22 -7
- package/plugin/skills/rvbc/SKILL.md +9 -6
- package/plugin/skills/whats-new/SKILL.md +4 -4
- package/scripts/adr-backfill.mjs +107 -0
- package/scripts/advocacy-outcomes.mjs +808 -0
- package/scripts/agentdb-context.mjs +216 -0
- package/scripts/agentdb-fleet-doctor.mjs +101 -0
- package/scripts/ascii-drift.mjs +236 -0
- package/scripts/behavioral-l1-l4.mjs +210 -0
- package/scripts/brain-capability-check.mjs +72 -0
- package/scripts/brain-grade-groundtruth.mjs +100 -0
- package/scripts/brain-latency-50.mjs +227 -0
- package/scripts/brain-novice-50.mjs +189 -0
- package/scripts/brain-stamp.mjs +94 -0
- package/scripts/brain-state.mjs +212 -0
- package/scripts/build-bundle.mjs +531 -0
- package/scripts/build-concepts.mjs +132 -0
- package/scripts/build-l2.mjs +71 -0
- package/scripts/build-primer.mjs +73 -0
- package/scripts/build-symbols.mjs +68 -0
- package/scripts/calibrate-router.mjs +97 -0
- package/scripts/capability-audit.mjs +321 -0
- package/scripts/capability-registry.mjs +876 -0
- package/scripts/check-indexation.mjs +108 -0
- package/scripts/check-legibility.mjs +189 -0
- package/scripts/ci/build-fixture-kb.mjs +67 -0
- package/scripts/ci/learning-replay-codex-adapter.mjs +62 -0
- package/scripts/ci/learning-replay-recorder.mjs +59 -0
- package/scripts/ci/mutate-hook-timeout.mjs +70 -0
- package/scripts/ci/stranger-fixture-stage.mjs +17 -0
- package/scripts/ci/stranger-scenario.mjs +228 -0
- package/scripts/ci/stranger-timeout.mjs +25 -0
- package/scripts/ci-verdict.mjs +29 -0
- package/scripts/claims-verify.mjs +710 -0
- package/scripts/clear-claude-tmp.sh +31 -0
- package/scripts/console-engine.mjs +434 -0
- package/scripts/console-engine.test.mjs +125 -0
- package/scripts/corpus-qa.mjs +250 -0
- package/scripts/correction-detect-embed.mjs +346 -0
- package/scripts/correction-detect-measure.mjs +270 -0
- package/scripts/correction-detect.mjs +686 -0
- package/scripts/count-chunks.mjs +54 -0
- package/scripts/described-questions.json +30 -0
- package/scripts/design-grade.mjs +58 -0
- package/scripts/dev-plugin-link.sh +105 -0
- package/scripts/distill-project.mjs +200 -0
- package/scripts/doc-currency.mjs +801 -0
- package/scripts/eval-brain.mjs +244 -0
- package/scripts/fix-metaharness-memretrieve.mjs +121 -0
- package/scripts/fix-workstream.mjs +291 -0
- package/scripts/full-hints.mjs +87 -0
- package/scripts/gate.sh +39 -0
- package/scripts/gates.mjs +146 -0
- package/scripts/gen-console-images.mjs +54 -0
- package/scripts/gen-images.mjs +47 -0
- package/scripts/git-clone-refresh.mjs +52 -0
- package/scripts/git-hooks/pre-push +126 -0
- package/scripts/goal-match.mjs +398 -0
- package/scripts/goldie-research.mjs +223 -0
- package/scripts/goldie-weekly.sh +67 -0
- package/scripts/health-repair.mjs +237 -0
- package/scripts/helix-scenario-questions.json +10 -0
- package/scripts/ingest-gists.mjs +230 -0
- package/scripts/ingest-meeting.mjs +115 -0
- package/scripts/ingest-repo.mjs +79 -0
- package/scripts/install-npx-witness.sh +49 -0
- package/scripts/issue-fix.mjs +558 -0
- package/scripts/issue-watch.mjs +276 -0
- package/scripts/issue4-close-note.md +31 -0
- package/scripts/key-canary.mjs +91 -0
- package/scripts/latency-to-surface.mjs +233 -0
- package/scripts/learning-enable.mjs +380 -0
- package/scripts/learning-replay.mjs +1570 -0
- package/scripts/learnings.mjs +62 -0
- package/scripts/lesson-gate.mjs +680 -0
- package/scripts/lesson-lifecycle.mjs +449 -0
- package/scripts/lesson-promote.mjs +262 -0
- package/scripts/lesson-ratify.mjs +98 -0
- package/scripts/lesson-seed.mjs +252 -0
- package/scripts/lesson-store.mjs +447 -0
- package/scripts/loop-checkpoint.mjs +86 -0
- package/scripts/memdb-health.sh +14 -0
- package/scripts/memory-doctor.mjs +326 -0
- package/scripts/model-catalog.mjs +79 -0
- package/scripts/nightly-controller.mjs +66 -0
- package/scripts/nightly-gists.sh +72 -0
- package/scripts/nightly-wrapper.sh +172 -0
- package/scripts/notify.sh +12 -0
- package/scripts/npx-witness.sh +56 -0
- package/scripts/onboarding-console.mjs +2922 -0
- package/scripts/private-fence.mjs +69 -0
- package/scripts/proactivity-metrics.mjs +118 -0
- package/scripts/proof-questions.json +56 -0
- package/scripts/protected-release-invocation.mjs +76 -0
- package/scripts/prove.mjs +95 -0
- package/scripts/proxy/claude-proxied.sh +57 -0
- package/scripts/proxy/proxy-revert.sh +59 -0
- package/scripts/proxy/proxy-up.sh +60 -0
- package/scripts/proxy/proxy-verify.mjs +142 -0
- package/scripts/publication-receipt.mjs +307 -0
- package/scripts/published-surface-probe.mjs +241 -0
- package/scripts/qe/card-lane-gate.mjs +162 -0
- package/scripts/qe/session-start-gate.mjs +229 -0
- package/scripts/qe/ux-suite.mjs +323 -0
- package/scripts/reconcile-project.mjs +0 -0
- package/scripts/record-lesson.mjs +113 -0
- package/scripts/refresh-model-catalog.mjs +99 -0
- package/scripts/release-authority.mjs +93 -0
- package/scripts/release-proof.mjs +9 -0
- package/scripts/release-vector.mjs +281 -0
- package/scripts/release.mjs +439 -0
- package/scripts/remedy-registry.mjs +247 -0
- package/scripts/rerank-cap-eval.mjs +265 -0
- package/scripts/rerank-cap-warm-ab.mjs +129 -0
- package/scripts/route-cheap.mjs +20 -15
- package/scripts/router-utilization.mjs +182 -0
- package/scripts/routing-flywheel.mjs +596 -0
- package/scripts/rvf-generation.mjs +104 -0
- package/scripts/rvf-index-audit.mjs +138 -0
- package/scripts/self-update.mjs +296 -0
- package/scripts/selfcheck.mjs +7 -1
- package/scripts/sign-bundle.mjs +69 -0
- package/scripts/signal-watch.mjs +171 -0
- package/scripts/stabilization-receipt.mjs +108 -0
- package/scripts/stack-sync.mjs +469 -0
- package/scripts/stamp-existing-rvf-generations.mjs +53 -0
- package/scripts/stamp-sweep.mjs +144 -0
- package/scripts/status-honesty.mjs +102 -0
- package/scripts/sync-version.mjs +217 -0
- package/scripts/token-report.mjs +102 -0
- package/scripts/top100-benchmark.mjs +479 -0
- package/scripts/top100-corpus.mjs +112 -0
- package/scripts/top100-semantic-assertions.mjs +449 -0
- package/scripts/update-apply.mjs +9 -0
- package/scripts/upgrade-notice.mjs +14 -0
- package/scripts/verify-bundle.mjs +51 -0
- package/scripts/verify-channels.mjs +184 -0
- package/scripts/verify-model-catalog.mjs +104 -0
- package/scripts/verify-nightly-close-issue4.sh +31 -0
- package/scripts/version.mjs +40 -0
- package/scripts/wired-check.mjs +867 -0
- package/plugin/scripts/finalize-token-meter.mjs +0 -25
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>RuvNet Brain — Install Plan (Mockup)</title>
|
|
7
|
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 64 64%22><rect x=%222%22 y=%222%22 width=%2260%22 height=%2260%22 rx=%2216%22 fill=%22%230b0d12%22 stroke=%22%232c3850%22 stroke-width=%221.5%22/><path d=%22M25 48 C17 48 11.5 41.5 13.5 34.5 C10 29 13 21 19 19 C21 12.5 29 9.5 35 12 C43 9 50.5 14.5 50.5 22 C55 26 55 34.5 50 38 C49 43.5 43 47.5 37 46.5 L31 47.5 Z%22 fill=%22none%22 stroke=%22%23f0a830%22 stroke-width=%223.4%22 stroke-linejoin=%22round%22/><path d=%22M31 47 L31 33 M31 33 L24 27 M31 33 L40 24.5 M31 33 L41 36.5%22 fill=%22none%22 stroke=%22%23f0a830%22 stroke-width=%222.4%22 stroke-linecap=%22round%22 opacity=%22.9%22/><circle cx=%2224%22 cy=%2227%22 r=%223.4%22 fill=%22%235ad6ff%22/><circle cx=%2240%22 cy=%2224.5%22 r=%223.4%22 fill=%22%23f4b13a%22/><circle cx=%2241%22 cy=%2236.5%22 r=%223.4%22 fill=%22%235fd38a%22/></svg>">
|
|
8
|
+
<style>
|
|
9
|
+
|
|
10
|
+
/* ============================================================================
|
|
11
|
+
RUVNET BRAIN — INSTALL PLAN MOCKUP
|
|
12
|
+
Static, self-contained review artifact. Not the real installer — a preview
|
|
13
|
+
of what `printPlanAndConfirm()` in bin/install.mjs could show, for approval
|
|
14
|
+
before any installer code is written. Palette + type match console/style.css
|
|
15
|
+
("Amber Substrate"): graphite substrate, amber mind, cyan signal, green
|
|
16
|
+
grounding. Checked boxes read green (grounded / will happen), unchecked
|
|
17
|
+
optional boxes read amber (a choice you made to skip, not an error), and
|
|
18
|
+
the three items nothing else works without are grey (a fact, not a choice).
|
|
19
|
+
============================================================================ */
|
|
20
|
+
|
|
21
|
+
:root {
|
|
22
|
+
color-scheme: dark;
|
|
23
|
+
--bg: #0a0c10;
|
|
24
|
+
--bg-2: #0e1116;
|
|
25
|
+
--surface: #13171e;
|
|
26
|
+
--surface-2: #181d26;
|
|
27
|
+
--ridge: #2a3140;
|
|
28
|
+
|
|
29
|
+
--ink: #ece8dc;
|
|
30
|
+
--ink-2: #c3c2b6;
|
|
31
|
+
--muted: #8f94a1;
|
|
32
|
+
--faint: #5a5f6e;
|
|
33
|
+
--on-accent: #0a0c10;
|
|
34
|
+
|
|
35
|
+
--amber: #f0a830; --amber-text: #f0b04a;
|
|
36
|
+
--cyan: #5ad6ff; --cyan-text: #5ad6ff;
|
|
37
|
+
--green: #5fd38a; --green-text: #5fd38a;
|
|
38
|
+
--warn: #f0b65a; --warn-text: #f0b65a;
|
|
39
|
+
|
|
40
|
+
--spectrum: linear-gradient(96deg, #f0a830 0%, #ffce6a 24%, #5ad6ff 58%, #5fd38a 100%);
|
|
41
|
+
--shadow: 0 18px 42px -24px rgba(0, 0, 0, 0.65);
|
|
42
|
+
--shadow-deep: 0 30px 70px -34px rgba(0, 0, 0, 0.8);
|
|
43
|
+
|
|
44
|
+
--display: "Iowan Old Style", "Palatino Nova", Palatino, "Book Antiqua", Georgia, "Times New Roman", serif;
|
|
45
|
+
--sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
46
|
+
--mono: ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, "Liberation Mono", monospace;
|
|
47
|
+
|
|
48
|
+
--ease: cubic-bezier(0.22, 0.61, 0.36, 1);
|
|
49
|
+
--radius: 16px; --radius-s: 10px;
|
|
50
|
+
--maxw: 860px;
|
|
51
|
+
--gutter: clamp(1.1rem, 4vw, 2.2rem);
|
|
52
|
+
|
|
53
|
+
--fs--2: clamp(0.68rem, 0.66rem + 0.1vw, 0.75rem);
|
|
54
|
+
--fs--1: clamp(0.82rem, 0.79rem + 0.14vw, 0.89rem);
|
|
55
|
+
--fs-0: clamp(0.94rem, 0.91rem + 0.15vw, 1rem);
|
|
56
|
+
--fs-1: clamp(1.05rem, 1.0rem + 0.25vw, 1.16rem);
|
|
57
|
+
--fs-2: clamp(1.2rem, 1.1rem + 0.5vw, 1.4rem);
|
|
58
|
+
--fs-3: clamp(1.7rem, 1.35rem + 2vw, 2.5rem);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@media (prefers-color-scheme: light) {
|
|
62
|
+
:root {
|
|
63
|
+
color-scheme: light;
|
|
64
|
+
--bg: #f1efe8;
|
|
65
|
+
--bg-2: #e9e6dd;
|
|
66
|
+
--surface: #fbfaf6;
|
|
67
|
+
--surface-2: #f2efe8;
|
|
68
|
+
--ridge: #d9d5c9;
|
|
69
|
+
|
|
70
|
+
--ink: #20242e;
|
|
71
|
+
--ink-2: #3d4353;
|
|
72
|
+
--muted: #575d6e;
|
|
73
|
+
--faint: #878c99;
|
|
74
|
+
--on-accent: #241a06;
|
|
75
|
+
|
|
76
|
+
--amber: #e09614; --amber-text: #8f5c05;
|
|
77
|
+
--cyan: #2ba6cf; --cyan-text: #0a6d8f;
|
|
78
|
+
--green: #3aa768; --green-text: #1e7a45;
|
|
79
|
+
--warn: #d99a2b; --warn-text: #8a5c06;
|
|
80
|
+
|
|
81
|
+
--spectrum: linear-gradient(96deg, #c47d08 0%, #d9a12e 24%, #0e87ad 58%, #20824d 100%);
|
|
82
|
+
--shadow: 0 16px 36px -24px rgba(60, 50, 20, 0.35);
|
|
83
|
+
--shadow-deep: 0 26px 60px -30px rgba(60, 50, 20, 0.45);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:root {
|
|
88
|
+
--hair: color-mix(in srgb, var(--ridge) 78%, transparent);
|
|
89
|
+
--hair-strong: color-mix(in srgb, var(--ridge) 100%, transparent);
|
|
90
|
+
--fill: color-mix(in srgb, var(--amber) 9%, transparent);
|
|
91
|
+
--fill-cyan: color-mix(in srgb, var(--cyan) 9%, transparent);
|
|
92
|
+
--fill-green: color-mix(in srgb, var(--green) 9%, transparent);
|
|
93
|
+
--fill-warn: color-mix(in srgb, var(--warn) 10%, transparent);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
* , *::before, *::after { box-sizing: border-box; }
|
|
97
|
+
|
|
98
|
+
body {
|
|
99
|
+
margin: 0; background: var(--bg); color: var(--ink);
|
|
100
|
+
font-family: var(--sans); font-size: var(--fs-0); line-height: 1.6;
|
|
101
|
+
-webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;
|
|
102
|
+
background-image:
|
|
103
|
+
radial-gradient(color-mix(in srgb, var(--ink) 4.5%, transparent) 1px, transparent 1.5px),
|
|
104
|
+
radial-gradient(900px 520px at 84% -8%, color-mix(in srgb, var(--amber) 8%, transparent), transparent 60%),
|
|
105
|
+
radial-gradient(760px 600px at -6% 6%, color-mix(in srgb, var(--cyan) 6%, transparent), transparent 55%),
|
|
106
|
+
linear-gradient(180deg, var(--bg) 0%, var(--bg-2) 100%);
|
|
107
|
+
background-size: 26px 26px, auto, auto, auto;
|
|
108
|
+
background-attachment: fixed;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
:focus-visible { outline: 2px solid var(--cyan); outline-offset: 2px; border-radius: 6px; }
|
|
112
|
+
|
|
113
|
+
.wrap { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: var(--gutter); }
|
|
114
|
+
|
|
115
|
+
h1, h2, h3 { font-family: var(--display); font-weight: 600; letter-spacing: -0.01em; line-height: 1.15; color: var(--ink); margin: 0; }
|
|
116
|
+
p { margin: 0; color: var(--ink-2); }
|
|
117
|
+
code {
|
|
118
|
+
font-family: var(--mono); font-size: 0.88em; color: var(--cyan-text);
|
|
119
|
+
background: var(--fill-cyan); border: 1px solid color-mix(in srgb, var(--cyan) 26%, transparent);
|
|
120
|
+
border-radius: 6px; padding: 0.06em 0.4em;
|
|
121
|
+
/* guard against monospace fallback fonts that ligature "--" into an en/em dash */
|
|
122
|
+
font-variant-ligatures: none; font-feature-settings: "liga" 0, "calt" 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* ---------- header ---------- */
|
|
126
|
+
.spectrum-edge { height: 2px; background: var(--spectrum); opacity: 0.9; }
|
|
127
|
+
.head { padding: 14px 0; }
|
|
128
|
+
.head-inner { display: flex; align-items: center; gap: 11px; }
|
|
129
|
+
.mark { width: 26px; height: 26px; flex: none; }
|
|
130
|
+
.mark .mk-plate { fill: #0b0d12; stroke: #2c3850; stroke-width: 1.5; }
|
|
131
|
+
.mark .mk-brain { fill: none; stroke: #f0a830; stroke-width: 3.4; stroke-linejoin: round; }
|
|
132
|
+
.mark .mk-branch { fill: none; stroke: #f0a830; stroke-width: 2.4; stroke-linecap: round; opacity: 0.9; }
|
|
133
|
+
.mark .n1 { fill: #f4b13a; } .mark .n2 { fill: #5ad6ff; } .mark .n3 { fill: #5fd38a; }
|
|
134
|
+
.brand-text { font-family: var(--display); font-weight: 600; font-size: 1rem; color: var(--ink); }
|
|
135
|
+
.brand-sub { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); margin-left: 8px; }
|
|
136
|
+
.mockup-tag {
|
|
137
|
+
margin-left: auto; font-family: var(--mono); font-size: 10.5px; font-weight: 700;
|
|
138
|
+
letter-spacing: 0.14em; text-transform: uppercase; color: var(--warn-text);
|
|
139
|
+
border: 1px dashed color-mix(in srgb, var(--warn) 50%, transparent);
|
|
140
|
+
border-radius: 100px; padding: 4px 11px; white-space: nowrap;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* ---------- intro ---------- */
|
|
144
|
+
.intro { padding: clamp(1.6rem, 4vw, 2.6rem) 0 1.2rem; }
|
|
145
|
+
.eyebrow {
|
|
146
|
+
font-family: var(--mono); font-size: var(--fs--2); letter-spacing: 0.24em;
|
|
147
|
+
text-transform: uppercase; color: var(--cyan-text); margin-bottom: 12px;
|
|
148
|
+
}
|
|
149
|
+
h1.lead { font-size: var(--fs-3); text-wrap: balance; }
|
|
150
|
+
.lede { font-size: var(--fs-1); line-height: 1.55; color: var(--ink-2); max-width: 62ch; margin-top: 0.7rem; }
|
|
151
|
+
.sub-lede { font-size: var(--fs--1); color: var(--muted); max-width: 66ch; margin-top: 0.6rem; line-height: 1.55; }
|
|
152
|
+
|
|
153
|
+
/* legend */
|
|
154
|
+
.legend {
|
|
155
|
+
display: flex; flex-wrap: wrap; align-items: center; gap: 7px 20px;
|
|
156
|
+
margin: 1.2rem 0 0; font-size: 12px; letter-spacing: 0.02em; color: var(--muted);
|
|
157
|
+
}
|
|
158
|
+
.legend .lg { display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; }
|
|
159
|
+
.legend .lg-key { width: 10px; height: 10px; border-radius: 3px; flex: none; }
|
|
160
|
+
.k-on { background: var(--green); }
|
|
161
|
+
.k-off { background: transparent; border: 1.5px solid var(--amber); }
|
|
162
|
+
.k-lock { background: transparent; border: 1.5px solid var(--hair-strong); }
|
|
163
|
+
|
|
164
|
+
/* progress strip */
|
|
165
|
+
.progress-strip {
|
|
166
|
+
display: inline-flex; align-items: center; gap: 9px;
|
|
167
|
+
margin: 1.2rem 0 0; padding: 8px 14px; border-radius: 100px;
|
|
168
|
+
border: 1px solid color-mix(in srgb, var(--green) 34%, transparent);
|
|
169
|
+
background: color-mix(in srgb, var(--green) 7%, transparent);
|
|
170
|
+
font-size: 13px; color: var(--ink-2);
|
|
171
|
+
}
|
|
172
|
+
.progress-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); flex: none; }
|
|
173
|
+
.progress-strip b { color: var(--ink); font-variant-numeric: tabular-nums; }
|
|
174
|
+
|
|
175
|
+
/* ---------- checklist card ---------- */
|
|
176
|
+
main { padding: 1.4rem 0 3rem; }
|
|
177
|
+
.plan-card {
|
|
178
|
+
background: linear-gradient(180deg, var(--surface) 0%, color-mix(in srgb, var(--surface) 55%, var(--bg-2)) 100%);
|
|
179
|
+
border: 1px solid var(--ridge); border-radius: var(--radius); box-shadow: var(--shadow);
|
|
180
|
+
overflow: hidden;
|
|
181
|
+
}
|
|
182
|
+
.plan-card-head {
|
|
183
|
+
padding: clamp(16px, 2.6vw, 22px) clamp(16px, 3vw, 24px) 6px;
|
|
184
|
+
border-bottom: 1px solid var(--hair);
|
|
185
|
+
}
|
|
186
|
+
.plan-card-head h2 { font-size: var(--fs-2); }
|
|
187
|
+
.plan-card-head .q { font-size: var(--fs--1); color: var(--ink-2); margin-top: 4px; display: block; }
|
|
188
|
+
|
|
189
|
+
.row {
|
|
190
|
+
display: grid; grid-template-columns: 40px minmax(0, 1fr);
|
|
191
|
+
gap: 4px 16px; padding: clamp(16px, 2.6vw, 22px) clamp(16px, 3vw, 24px);
|
|
192
|
+
border-left: 3px solid transparent;
|
|
193
|
+
border-top: 1px solid var(--hair);
|
|
194
|
+
transition: background 0.2s var(--ease), border-color 0.2s var(--ease);
|
|
195
|
+
}
|
|
196
|
+
.row:first-of-type { border-top: 0; }
|
|
197
|
+
.row.is-on { border-left-color: var(--green); }
|
|
198
|
+
.row.is-off { border-left-color: var(--amber); background: var(--fill-warn); }
|
|
199
|
+
.row.is-locked { border-left-color: var(--hair-strong); }
|
|
200
|
+
.row:hover { background: color-mix(in srgb, var(--ink) 2.5%, transparent); }
|
|
201
|
+
.row.is-off:hover { background: color-mix(in srgb, var(--amber) 8%, transparent); }
|
|
202
|
+
|
|
203
|
+
/* custom checkbox */
|
|
204
|
+
.cbx-wrap { grid-row: 1 / span 2; display: flex; align-items: flex-start; padding-top: 2px; cursor: pointer; }
|
|
205
|
+
.row.is-locked .cbx-wrap { cursor: not-allowed; }
|
|
206
|
+
.cbx-wrap input {
|
|
207
|
+
position: absolute; opacity: 0; width: 30px; height: 30px; margin: 0; cursor: inherit;
|
|
208
|
+
}
|
|
209
|
+
.cbx {
|
|
210
|
+
position: relative; width: 24px; height: 24px; flex: none; border-radius: 7px;
|
|
211
|
+
border: 1.6px solid var(--hair-strong); background: color-mix(in srgb, var(--ink) 3%, transparent);
|
|
212
|
+
display: grid; place-items: center;
|
|
213
|
+
transition: background 0.16s var(--ease), border-color 0.16s var(--ease), transform 0.12s var(--ease);
|
|
214
|
+
}
|
|
215
|
+
.cbx-wrap:hover .cbx { border-color: var(--amber); }
|
|
216
|
+
.cbx-wrap input:focus-visible + .cbx { outline: 2px solid var(--cyan); outline-offset: 2px; }
|
|
217
|
+
.cbx-wrap input:active + .cbx { transform: scale(0.92); }
|
|
218
|
+
.cbx-check { width: 14px; height: 14px; opacity: 0; transform: scale(0.6); transition: opacity 0.14s var(--ease), transform 0.14s var(--ease); }
|
|
219
|
+
.cbx-check path { fill: none; stroke: var(--on-accent); stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
|
|
220
|
+
.cbx-wrap input:checked + .cbx { background: var(--green); border-color: transparent; }
|
|
221
|
+
.cbx-wrap input:checked + .cbx .cbx-check { opacity: 1; transform: scale(1); }
|
|
222
|
+
.row.is-locked .cbx-wrap input:checked + .cbx { background: var(--faint); }
|
|
223
|
+
.cbx-lock {
|
|
224
|
+
position: absolute; bottom: -6px; right: -6px; width: 15px; height: 15px; border-radius: 50%;
|
|
225
|
+
background: var(--surface-2); border: 1px solid var(--hair-strong);
|
|
226
|
+
display: grid; place-items: center; font-size: 9px; line-height: 1; color: var(--muted);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.row-top { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 10px; }
|
|
230
|
+
.row-num { font-family: var(--mono); font-size: 11.5px; color: var(--faint); flex: none; }
|
|
231
|
+
.row-title { font-size: var(--fs-1); font-weight: 650; }
|
|
232
|
+
.row.is-off .row-title { color: var(--ink-2); }
|
|
233
|
+
|
|
234
|
+
.badge {
|
|
235
|
+
font-family: var(--mono); font-size: 10px; font-weight: 700; letter-spacing: 0.1em;
|
|
236
|
+
text-transform: uppercase; border-radius: 100px; padding: 2.5px 9px 2.5px 8px;
|
|
237
|
+
border: 1px solid; white-space: nowrap;
|
|
238
|
+
}
|
|
239
|
+
.badge-locked { color: var(--muted); border-color: var(--hair-strong); background: transparent; }
|
|
240
|
+
.badge-rec { color: var(--green-text); border-color: color-mix(in srgb, var(--green) 34%, transparent); background: var(--fill-green); }
|
|
241
|
+
.badge-opt { color: var(--amber-text); border-color: color-mix(in srgb, var(--amber) 36%, transparent); background: var(--fill); }
|
|
242
|
+
|
|
243
|
+
.row-desc { font-size: var(--fs--1); color: var(--ink-2); line-height: 1.55; max-width: 64ch; margin-top: 6px; }
|
|
244
|
+
|
|
245
|
+
.row-impl {
|
|
246
|
+
font-size: var(--fs--1); color: var(--ink-2); line-height: 1.55; max-width: 64ch;
|
|
247
|
+
margin-top: 9px; padding-top: 9px; border-top: 1px dotted var(--hair);
|
|
248
|
+
}
|
|
249
|
+
.row-impl b { color: var(--ink); font-weight: 650; }
|
|
250
|
+
|
|
251
|
+
.row-ev {
|
|
252
|
+
font-family: var(--mono); font-size: 11px; color: var(--muted); margin-top: 7px;
|
|
253
|
+
overflow-wrap: anywhere;
|
|
254
|
+
}
|
|
255
|
+
.row-ev::before { content: "· evidence — "; color: var(--faint); }
|
|
256
|
+
|
|
257
|
+
.row-undo { font-size: 12px; color: var(--green-text); margin-top: 6px; font-family: var(--mono); }
|
|
258
|
+
|
|
259
|
+
/* proof block (nightly item) */
|
|
260
|
+
.proof {
|
|
261
|
+
margin-top: 12px; padding: 11px 13px; border-radius: 10px;
|
|
262
|
+
border: 1px solid color-mix(in srgb, var(--green) 36%, transparent);
|
|
263
|
+
background: var(--fill-green);
|
|
264
|
+
transition: background 0.2s var(--ease), border-color 0.2s var(--ease);
|
|
265
|
+
}
|
|
266
|
+
.proof.is-off {
|
|
267
|
+
border-color: var(--hair-strong); background: color-mix(in srgb, var(--ink) 3%, transparent);
|
|
268
|
+
}
|
|
269
|
+
.proof-pill {
|
|
270
|
+
display: inline-flex; align-items: center; gap: 7px;
|
|
271
|
+
font-family: var(--mono); font-size: 12px; font-weight: 700; letter-spacing: 0.04em;
|
|
272
|
+
color: var(--green-text); border: 1px solid color-mix(in srgb, var(--green) 42%, transparent);
|
|
273
|
+
background: color-mix(in srgb, var(--green) 12%, transparent);
|
|
274
|
+
border-radius: 100px; padding: 3px 11px;
|
|
275
|
+
}
|
|
276
|
+
.proof.is-off .proof-pill {
|
|
277
|
+
color: var(--muted); border-color: var(--hair-strong); background: transparent;
|
|
278
|
+
}
|
|
279
|
+
.proof-detail {
|
|
280
|
+
display: block; margin-top: 8px; font-family: var(--mono); font-size: 11.5px;
|
|
281
|
+
color: var(--ink-2); line-height: 1.55;
|
|
282
|
+
}
|
|
283
|
+
.proof-caption {
|
|
284
|
+
display: block; margin-top: 7px; font-size: 12px; color: var(--muted); line-height: 1.5; max-width: 60ch;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* footer note + action bar */
|
|
288
|
+
.plan-foot {
|
|
289
|
+
padding: 14px clamp(16px, 3vw, 24px) clamp(16px, 2.6vw, 22px);
|
|
290
|
+
border-top: 1px solid var(--hair);
|
|
291
|
+
font-size: 12.5px; color: var(--muted); line-height: 1.55;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.action-bar {
|
|
295
|
+
margin-top: 22px; display: flex; flex-wrap: wrap; align-items: center; gap: 12px;
|
|
296
|
+
}
|
|
297
|
+
.btn {
|
|
298
|
+
display: inline-flex; align-items: center; justify-content: center; gap: 8px;
|
|
299
|
+
font-family: var(--sans); font-weight: 600; font-size: 0.9rem;
|
|
300
|
+
padding: 9px 18px; border-radius: 10px; border: 1px solid transparent;
|
|
301
|
+
cursor: default; white-space: nowrap;
|
|
302
|
+
transition: transform 0.14s var(--ease), filter 0.16s var(--ease), background 0.18s var(--ease), border-color 0.18s var(--ease);
|
|
303
|
+
}
|
|
304
|
+
.btn:active { transform: scale(0.97); }
|
|
305
|
+
.btn-apply { background: var(--amber); color: var(--on-accent); box-shadow: 0 10px 22px -12px color-mix(in srgb, var(--amber) 65%, transparent); }
|
|
306
|
+
.btn-ghost { background: transparent; border-color: var(--hair-strong); color: var(--ink-2); }
|
|
307
|
+
.action-note { font-size: 12.5px; color: var(--muted); }
|
|
308
|
+
|
|
309
|
+
.foot {
|
|
310
|
+
border-top: 1px solid var(--hair); padding: 2rem 0 3rem;
|
|
311
|
+
font-size: 12.5px; color: var(--faint); line-height: 1.6;
|
|
312
|
+
}
|
|
313
|
+
.foot a { color: var(--cyan-text); text-decoration: none; }
|
|
314
|
+
.foot code { font-size: 0.92em; }
|
|
315
|
+
|
|
316
|
+
@media (max-width: 40em) {
|
|
317
|
+
.row { grid-template-columns: 32px minmax(0, 1fr); }
|
|
318
|
+
.cbx { width: 21px; height: 21px; }
|
|
319
|
+
}
|
|
320
|
+
</style>
|
|
321
|
+
</head>
|
|
322
|
+
<body>
|
|
323
|
+
|
|
324
|
+
<div class="spectrum-edge" aria-hidden="true"></div>
|
|
325
|
+
<header class="head">
|
|
326
|
+
<div class="wrap head-inner">
|
|
327
|
+
<svg class="mark" viewBox="0 0 64 64" aria-hidden="true">
|
|
328
|
+
<rect class="mk-plate" x="2" y="2" width="60" height="60" rx="16" />
|
|
329
|
+
<path class="mk-brain" d="M25 48 C17 48 11.5 41.5 13.5 34.5 C10 29 13 21 19 19 C21 12.5 29 9.5 35 12 C43 9 50.5 14.5 50.5 22 C55 26 55 34.5 50 38 C49 43.5 43 47.5 37 46.5 L31 47.5 Z" />
|
|
330
|
+
<path class="mk-branch" d="M31 47 L31 33 M31 33 L24 27 M31 33 L40 24.5 M31 33 L41 36.5" />
|
|
331
|
+
<circle class="n2" cx="24" cy="27" r="3.4" />
|
|
332
|
+
<circle class="n1" cx="40" cy="24.5" r="3.4" />
|
|
333
|
+
<circle class="n3" cx="41" cy="36.5" r="3.4" />
|
|
334
|
+
</svg>
|
|
335
|
+
<span class="brand-text">RuvNet Brain</span><span class="brand-sub">Install Plan</span>
|
|
336
|
+
<span class="mockup-tag">Mockup — nothing runs</span>
|
|
337
|
+
</div>
|
|
338
|
+
</header>
|
|
339
|
+
|
|
340
|
+
<div class="wrap intro">
|
|
341
|
+
<div class="eyebrow">npx ruvnet-brain — before anything happens</div>
|
|
342
|
+
<h1 class="lead">Out of the box, I'll do these — uncheck any.</h1>
|
|
343
|
+
<p class="lede">This is the plan screen you'd see the moment you run <code>npx ruvnet-brain</code>, before anything is written to your machine. Nothing happens until you accept it.</p>
|
|
344
|
+
<p class="sub-lede">Today this screen exists but only as a read-only preview with one blanket Yes/No — you can't uncheck item 4 on it. This mockup is what making it an actual checklist would look like. Nothing on this page is wired to code yet; it's here for review before <code>bin/install.mjs</code> is touched.</p>
|
|
345
|
+
|
|
346
|
+
<div class="legend" aria-hidden="true">
|
|
347
|
+
<span class="lg"><span class="lg-key k-on"></span>checked — will happen</span>
|
|
348
|
+
<span class="lg"><span class="lg-key k-off"></span>unchecked — your choice to skip, not an error</span>
|
|
349
|
+
<span class="lg"><span class="lg-key k-lock"></span>required — nothing else works without it</span>
|
|
350
|
+
</div>
|
|
351
|
+
|
|
352
|
+
<div class="progress-strip">
|
|
353
|
+
<span class="progress-dot"></span>
|
|
354
|
+
<span><b id="selCount">4</b> of <b>6</b> selected — 3 required, 1 recommended, 2 left off</span>
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
|
|
358
|
+
<main class="wrap">
|
|
359
|
+
<section class="plan-card">
|
|
360
|
+
<div class="plan-card-head">
|
|
361
|
+
<h2>Here is everything this will do</h2>
|
|
362
|
+
<span class="q">Type a number to toggle it in the real CLI version; here, click the box.</span>
|
|
363
|
+
</div>
|
|
364
|
+
|
|
365
|
+
<!-- 1 — download KB -->
|
|
366
|
+
<div class="row is-on is-locked" data-row="1">
|
|
367
|
+
<label class="cbx-wrap" title="Required — can't be unchecked. Nothing else on this list works without it.">
|
|
368
|
+
<input type="checkbox" checked disabled aria-label="Download the knowledge base — required">
|
|
369
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
370
|
+
<span class="cbx-lock" aria-hidden="true">🔒</span>
|
|
371
|
+
</label>
|
|
372
|
+
<div>
|
|
373
|
+
<div class="row-top">
|
|
374
|
+
<span class="row-num">1</span>
|
|
375
|
+
<h3 class="row-title">Download the knowledge base</h3>
|
|
376
|
+
<span class="badge badge-locked">Required</span>
|
|
377
|
+
</div>
|
|
378
|
+
<p class="row-desc">~736MB, signature-verified (Ed25519), saved to <code>~/.cache/ruvnet-brain/kb</code>.</p>
|
|
379
|
+
<p class="row-impl"><b>Uncheck this and:</b> not really possible — it's the product. No <code>search_ruvnet</code>, no grounded answers, nothing else in this list works either.</p>
|
|
380
|
+
<p class="row-ev">bin/install.mjs:308–364 (obtainBundle) · Ed25519 verify :30–39, :2744–2762</p>
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<!-- 2 — install reader -->
|
|
385
|
+
<div class="row is-on is-locked" data-row="2">
|
|
386
|
+
<label class="cbx-wrap" title="Required — can't be unchecked. Every query fails without it.">
|
|
387
|
+
<input type="checkbox" checked disabled aria-label="Install the local reader — required">
|
|
388
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
389
|
+
<span class="cbx-lock" aria-hidden="true">🔒</span>
|
|
390
|
+
</label>
|
|
391
|
+
<div>
|
|
392
|
+
<div class="row-top">
|
|
393
|
+
<span class="row-num">2</span>
|
|
394
|
+
<h3 class="row-title">Install the local reader</h3>
|
|
395
|
+
<span class="badge badge-locked">Required</span>
|
|
396
|
+
</div>
|
|
397
|
+
<p class="row-desc">Runs an npm install for <code>@ruvector/rvf</code> and <code>@xenova/transformers</code> inside the KB directory.</p>
|
|
398
|
+
<p class="row-impl"><b>Uncheck this and:</b> every query fails immediately — the installer's own verification step warns exactly this.</p>
|
|
399
|
+
<p class="row-ev">bin/install.mjs:433–472 · warning at :579 (verifyInstall)</p>
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
|
|
403
|
+
<!-- 3 — register plugin + MCP -->
|
|
404
|
+
<div class="row is-on is-locked" data-row="3">
|
|
405
|
+
<label class="cbx-wrap" title="Required in practice — the Console and slash commands depend on it.">
|
|
406
|
+
<input type="checkbox" checked disabled aria-label="Register the Claude Code plugin and MCP server — required in practice">
|
|
407
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
408
|
+
<span class="cbx-lock" aria-hidden="true">🔒</span>
|
|
409
|
+
</label>
|
|
410
|
+
<div>
|
|
411
|
+
<div class="row-top">
|
|
412
|
+
<span class="row-num">3</span>
|
|
413
|
+
<h3 class="row-title">Register the Claude Code plugin + MCP server</h3>
|
|
414
|
+
<span class="badge badge-locked">Required in practice</span>
|
|
415
|
+
</div>
|
|
416
|
+
<p class="row-desc">Adds the plugin marketplace and installs the MCP server (<code>--scope user</code>), which gives Claude the <code>search_ruvnet</code> tool, plus <code>/rvbc</code> and <code>/configure</code>.</p>
|
|
417
|
+
<p class="row-impl"><b>Uncheck this and:</b> the brain can still answer if <code>search_ruvnet</code> is wired by hand, but you lose the slash commands, the grounding hook, and the Console itself — the Console can't exist until this plugin is wired.</p>
|
|
418
|
+
<p class="row-ev">bin/install.mjs:497–544 (wirePlugin)</p>
|
|
419
|
+
</div>
|
|
420
|
+
</div>
|
|
421
|
+
|
|
422
|
+
<!-- 4 — nightly auto-update -->
|
|
423
|
+
<div class="row is-on" data-row="4">
|
|
424
|
+
<label class="cbx-wrap">
|
|
425
|
+
<input type="checkbox" checked data-toggle="proof-4" aria-label="Keep it auto-updated — recommended, on by default">
|
|
426
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
427
|
+
</label>
|
|
428
|
+
<div>
|
|
429
|
+
<div class="row-top">
|
|
430
|
+
<span class="row-num">4</span>
|
|
431
|
+
<h3 class="row-title">Keep it auto-updated (Evergreen)</h3>
|
|
432
|
+
<span class="badge badge-rec">Recommended · default on</span>
|
|
433
|
+
</div>
|
|
434
|
+
<p class="row-desc">Installs a macOS LaunchAgent (<code>com.ruvnet.brain-nightly</code>) that updates the brain at 03:47 every night.</p>
|
|
435
|
+
<p class="row-impl"><b>Uncheck this and:</b> updates become manual forever (<code>npx ruvnet-brain --update</code>) — rUv ships fast, and a stale brain is the single biggest way this stops being useful.</p>
|
|
436
|
+
<p class="row-ev">bin/install.mjs:1802–1868 (offerNightly), plist :1202–1291 · default-on parsing :1703–1706</p>
|
|
437
|
+
<p class="row-undo">Undo anytime: <code>npx ruvnet-brain --disable-nightly</code> / <code>--enable-nightly</code></p>
|
|
438
|
+
|
|
439
|
+
<div class="proof" id="proof-4">
|
|
440
|
+
<span class="proof-pill" id="proof-4-pill">✓ verified running</span>
|
|
441
|
+
<span class="proof-detail" id="proof-4-detail">launchctl confirms <code style="background:none;border:0;padding:0;color:inherit;">com.ruvnet.brain-nightly</code> is scheduled · last run: not yet — first run tonight at 03:47.</span>
|
|
442
|
+
<span class="proof-caption">Shown here as it will appear once installed. The checkbox alone never earns this pill — only a live <code style="background:none;border:0;padding:0;color:inherit;">launchctl</code> check does, reusing the same detector <code style="background:none;border:0;padding:0;color:inherit;">capability-registry.mjs</code>'s nightly-refresh row already runs (:754–800), so the installer and the Console can never disagree about whether it's really on.</span>
|
|
443
|
+
</div>
|
|
444
|
+
</div>
|
|
445
|
+
</div>
|
|
446
|
+
|
|
447
|
+
<!-- 5 — add missing rUv tools -->
|
|
448
|
+
<div class="row is-off" data-row="5">
|
|
449
|
+
<label class="cbx-wrap">
|
|
450
|
+
<input type="checkbox" aria-label="Add missing rUv tools — optional, off by default">
|
|
451
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
452
|
+
</label>
|
|
453
|
+
<div>
|
|
454
|
+
<div class="row-top">
|
|
455
|
+
<span class="row-num">5</span>
|
|
456
|
+
<h3 class="row-title">Add missing rUv tools (Ruflo + RuVector)</h3>
|
|
457
|
+
<span class="badge badge-opt">Optional · default off</span>
|
|
458
|
+
</div>
|
|
459
|
+
<p class="row-desc">Installs <code>claude-flow@alpha</code> (Ruflo — orchestration, swarms, SPARC) and the RuVector MCP/vector CLI, if not already on this machine.</p>
|
|
460
|
+
<p class="row-impl"><b>Uncheck this and:</b> (its default state) the brain still answers grounded questions with zero loss. You just can't orchestrate swarms or use the vector CLI through it — it can describe those tools but not run them.</p>
|
|
461
|
+
<p class="row-ev">bin/install.mjs:2120–2193 (offerStack) · default OFF at :2172</p>
|
|
462
|
+
</div>
|
|
463
|
+
</div>
|
|
464
|
+
|
|
465
|
+
<!-- 6 — CLAUDE.md note -->
|
|
466
|
+
<div class="row is-off" data-row="6">
|
|
467
|
+
<label class="cbx-wrap">
|
|
468
|
+
<input type="checkbox" aria-label="Add a note to CLAUDE.md — optional, off by default">
|
|
469
|
+
<span class="cbx"><svg class="cbx-check" viewBox="0 0 16 16"><path d="M3 8.5 6.5 12 13 4.5"/></svg></span>
|
|
470
|
+
</label>
|
|
471
|
+
<div>
|
|
472
|
+
<div class="row-top">
|
|
473
|
+
<span class="row-num">6</span>
|
|
474
|
+
<h3 class="row-title">Add a note to CLAUDE.md</h3>
|
|
475
|
+
<span class="badge badge-opt">Optional · default off</span>
|
|
476
|
+
</div>
|
|
477
|
+
<p class="row-desc">Appends 6 lines to <code>~/.claude/CLAUDE.md</code>, nudging Claude in every project to ground answers through the brain.</p>
|
|
478
|
+
<p class="row-impl"><b>Uncheck this and:</b> (its default state) nothing breaks. When the plugin (item 3) is installed, its own hooks already do this job — the note only matters if you skip the plugin entirely.</p>
|
|
479
|
+
<p class="row-ev">bin/install.mjs:2207–2267 (offerClaudeMd) · default OFF, only offered when the plugin isn't installed :2220</p>
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
|
|
483
|
+
<div class="plan-foot">
|
|
484
|
+
Required items (1–3) can't be unchecked — nothing else on this page works without them. Everything else keeps working exactly as it does today whether it's on or off; the two background jobs (nightly update, spend watchdog — not shown on this trimmed mockup) still require a real terminal session to enable, never a blanket <code>--yes</code>.
|
|
485
|
+
</div>
|
|
486
|
+
</section>
|
|
487
|
+
|
|
488
|
+
<div class="action-bar">
|
|
489
|
+
<button class="btn btn-apply" type="button" disabled>Install as shown (<span id="selCountBtn">4</span> selected)</button>
|
|
490
|
+
<button class="btn btn-ghost" type="button" disabled>Cancel</button>
|
|
491
|
+
<span class="action-note">Preview only — these buttons don't install anything on this page.</span>
|
|
492
|
+
</div>
|
|
493
|
+
</main>
|
|
494
|
+
|
|
495
|
+
<footer class="foot">
|
|
496
|
+
<div class="wrap">
|
|
497
|
+
Mockup for review, generated from <code>bin/install.mjs</code> as it exists today — every item, description, and evidence line above cites a real file/line, none invented. Once approved, this becomes the interactive body of <code>printPlanAndConfirm()</code>; nothing here has been wired into the real installer.
|
|
498
|
+
</div>
|
|
499
|
+
</footer>
|
|
500
|
+
|
|
501
|
+
<script>
|
|
502
|
+
// Visual-only: lets the checkboxes above look and behave like real toggles
|
|
503
|
+
// (state + counter update). No network calls, no writes, no installer code.
|
|
504
|
+
(function () {
|
|
505
|
+
var rows = document.querySelectorAll('.row:not(.is-locked)');
|
|
506
|
+
var selCount = document.getElementById('selCount');
|
|
507
|
+
var selCountBtn = document.getElementById('selCountBtn');
|
|
508
|
+
var LOCKED_COUNT = 3;
|
|
509
|
+
|
|
510
|
+
function recount() {
|
|
511
|
+
var checked = document.querySelectorAll('.row input[type="checkbox"]:checked').length;
|
|
512
|
+
selCount.textContent = checked;
|
|
513
|
+
selCountBtn.textContent = checked;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
rows.forEach(function (row) {
|
|
517
|
+
var input = row.querySelector('input[type="checkbox"]');
|
|
518
|
+
input.addEventListener('change', function () {
|
|
519
|
+
row.classList.toggle('is-on', input.checked);
|
|
520
|
+
row.classList.toggle('is-off', !input.checked);
|
|
521
|
+
recount();
|
|
522
|
+
|
|
523
|
+
var proofId = input.getAttribute('data-toggle');
|
|
524
|
+
if (proofId) {
|
|
525
|
+
var proof = document.getElementById(proofId);
|
|
526
|
+
var pill = document.getElementById(proofId + '-pill');
|
|
527
|
+
var detail = document.getElementById(proofId + '-detail');
|
|
528
|
+
if (input.checked) {
|
|
529
|
+
proof.classList.remove('is-off');
|
|
530
|
+
pill.innerHTML = '✓ verified running';
|
|
531
|
+
detail.innerHTML = 'launchctl confirms <code style="background:none;border:0;padding:0;color:inherit;">com.ruvnet.brain-nightly</code> is scheduled · last run: not yet — first run tonight at 03:47.';
|
|
532
|
+
} else {
|
|
533
|
+
proof.classList.add('is-off');
|
|
534
|
+
pill.textContent = 'off';
|
|
535
|
+
detail.textContent = 'No LaunchAgent, nothing to verify — this is what "off" looks like, not an error state.';
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
})();
|
|
541
|
+
</script>
|
|
542
|
+
</body>
|
|
543
|
+
</html>
|