brainctl 0.1.5 → 0.1.7

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 (37) hide show
  1. package/README.md +181 -131
  2. package/dist/executor/resolver.js +1 -38
  3. package/dist/mcp/server.js +183 -0
  4. package/dist/services/agent-config-service.d.ts +35 -0
  5. package/dist/services/agent-config-service.js +222 -0
  6. package/dist/services/mcp-preflight-service.d.ts +25 -0
  7. package/dist/services/mcp-preflight-service.js +84 -0
  8. package/dist/services/plugin-install-service.d.ts +92 -0
  9. package/dist/services/plugin-install-service.js +243 -0
  10. package/dist/services/profile-export-service.js +5 -5
  11. package/dist/services/profile-import-service.js +1 -1
  12. package/dist/services/profile-service.d.ts +10 -0
  13. package/dist/services/profile-service.js +140 -28
  14. package/dist/services/skill-paths.d.ts +2 -0
  15. package/dist/services/skill-paths.js +12 -0
  16. package/dist/services/skill-preflight-service.d.ts +23 -0
  17. package/dist/services/skill-preflight-service.js +40 -0
  18. package/dist/services/sync/agent-reader.d.ts +30 -0
  19. package/dist/services/sync/agent-reader.js +232 -0
  20. package/dist/services/sync/claude-writer.js +4 -1
  21. package/dist/services/sync/codex-writer.js +6 -2
  22. package/dist/services/sync/gemini-writer.js +4 -1
  23. package/dist/services/sync/managed-plugin-registry.d.ts +17 -0
  24. package/dist/services/sync/managed-plugin-registry.js +75 -0
  25. package/dist/services/sync/plugin-skill-reader.d.ts +2 -0
  26. package/dist/services/sync/plugin-skill-reader.js +33 -0
  27. package/dist/services/sync-service.js +5 -0
  28. package/dist/system/executables.d.ts +1 -0
  29. package/dist/system/executables.js +38 -0
  30. package/dist/types.d.ts +15 -5
  31. package/dist/ui/routes.js +423 -1
  32. package/dist/web/assets/index-BCkorugl.css +1 -0
  33. package/dist/web/assets/index-sGnTMhkX.js +16 -0
  34. package/dist/web/index.html +2 -2
  35. package/package.json +7 -1
  36. package/dist/web/assets/index-CRJ6cM0Q.css +0 -1
  37. package/dist/web/assets/index-Cr8gt3VF.js +0 -9
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>brainctl | Local Control Panel</title>
7
7
  <meta name="description" content="A local control panel for inspecting brainctl configuration, memory, skills, and agents." />
8
- <script type="module" crossorigin src="/assets/index-Cr8gt3VF.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CRJ6cM0Q.css">
8
+ <script type="module" crossorigin src="/assets/index-sGnTMhkX.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-BCkorugl.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brainctl",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "CLI environment manager for consistent AI workflows",
5
5
  "type": "module",
6
6
  "repository": {
@@ -35,6 +35,8 @@
35
35
  ],
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
+ "@dnd-kit/core": "^6.3.1",
39
+ "@dnd-kit/sortable": "^10.0.0",
38
40
  "commander": "^14.0.1",
39
41
  "fastmcp": "^3.34.0",
40
42
  "lucide-react": "^0.542.0",
@@ -48,10 +50,14 @@
48
50
  "jose": "6.2.2"
49
51
  },
50
52
  "devDependencies": {
53
+ "@tailwindcss/postcss": "^4.2.2",
51
54
  "@types/node": "^24.6.1",
52
55
  "@types/react": "^19.1.13",
53
56
  "@types/react-dom": "^19.1.9",
54
57
  "@vitejs/plugin-react": "^5.0.2",
58
+ "autoprefixer": "^10.4.27",
59
+ "postcss": "^8.5.8",
60
+ "tailwindcss": "^4.2.2",
55
61
  "tsx": "^4.20.6",
56
62
  "typescript": "^5.9.3",
57
63
  "vite": "^7.1.10",
@@ -1 +0,0 @@
1
- :root{color-scheme:light;--bg: #f4f5f2;--bg-accent: rgba(255, 255, 255, .7);--panel: rgba(255, 255, 255, .82);--panel-strong: rgba(255, 255, 255, .94);--border: rgba(17, 24, 39, .1);--border-strong: rgba(17, 24, 39, .16);--text: #101114;--muted: rgba(16, 17, 20, .64);--shadow: 0 26px 70px rgba(17, 24, 39, .08);--shadow-soft: 0 12px 28px rgba(17, 24, 39, .06);--radius-xl: 28px;--radius-lg: 22px;--radius-md: 16px;--radius-sm: 12px;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,SF Pro Display,Segoe UI,sans-serif;background:var(--bg);color:var(--text)}*{box-sizing:border-box}html,body,#root{min-height:100%;margin:0}body{min-height:100vh;background:radial-gradient(circle at top left,rgba(255,255,255,.8),transparent 26%),radial-gradient(circle at top right,rgba(17,24,39,.05),transparent 28%),linear-gradient(180deg,#f7f8f6,#eef1eb);color:var(--text)}button,textarea{font:inherit}button{cursor:pointer}button:disabled{cursor:default}#root{min-height:100vh}.app-shell{min-height:100vh;padding:24px}.shell{width:min(1440px,100%);margin:0 auto;display:grid;gap:18px}.panel{border:1px solid var(--border);border-radius:var(--radius-xl);background:var(--panel);box-shadow:var(--shadow);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.topbar{padding:22px 24px;display:flex;align-items:center;justify-content:space-between;gap:20px}.brand-block{display:flex;align-items:center;gap:14px;min-width:0}.brand-mark{width:44px;height:44px;border-radius:14px;display:grid;place-items:center;background:#101114;color:#fff;box-shadow:inset 0 1px #ffffff14}.eyebrow{margin:0 0 6px;text-transform:uppercase;letter-spacing:.14em;font-size:.72rem;font-weight:700;color:var(--muted)}.brand-block h1,.workspace-header h2,.panel-heading h2,.section-header h3,.empty-state h2{margin:0;font-size:clamp(1.4rem,2.5vw,2.3rem);line-height:1.05;letter-spacing:-.04em}.workspace-header h2,.panel-heading h2,.section-header h3{font-size:clamp(1.05rem,1.7vw,1.35rem)}.status-strip{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10px}.status-chip,.muted-pill,.skill-chip,.agent-command{display:inline-flex;align-items:center;gap:8px;border:1px solid var(--border);border-radius:999px;background:#ffffffa8;color:#101114bd;padding:8px 12px;font-size:.84rem;line-height:1}.muted-pill{background:#ffffff7a;color:var(--muted)}.shell-grid{display:grid;grid-template-columns:320px minmax(0,1fr);gap:18px;align-items:start}.nav-card,.workspace-card{padding:20px}.nav-card{position:sticky;top:24px}.panel-heading,.workspace-header,.section-header,.metric-card-header,.agent-row,.agent-row-meta{display:flex;align-items:center;justify-content:space-between;gap:16px}.panel-heading{margin-bottom:18px}.section-nav{display:grid;gap:10px}.section-button{border:1px solid var(--border);border-radius:var(--radius-lg);background:#ffffffa8;color:var(--text);padding:16px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;text-align:left;transition:transform .14s ease,border-color .14s ease,background-color .14s ease,box-shadow .14s ease}.section-button:hover:not(:disabled){transform:translateY(-1px);border-color:var(--border-strong);box-shadow:var(--shadow-soft)}.section-button:disabled{opacity:.62}.section-button.is-active{background:#101114;color:#fff;border-color:#101114;box-shadow:0 14px 30px #1011142e}.section-button.is-disabled{opacity:.7}.section-button-icon{width:36px;height:36px;border-radius:12px;display:grid;place-items:center;background:#1011140f}.section-button.is-active .section-button-icon{background:#ffffff1a}.section-button-label{display:grid;gap:4px;min-width:0}.section-button-label span:first-child{font-weight:650}.section-button-subtitle{color:var(--muted);font-size:.82rem}.section-button.is-active .section-button-subtitle{color:#ffffffc2}.section-button-chevron{color:var(--muted)}.section-button.is-active .section-button-chevron{color:#fffc}.workspace-card{display:grid;gap:20px;min-width:0}.workspace-header{padding-bottom:18px;border-bottom:1px solid var(--border);align-items:flex-start}.workspace-header-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:10px}.muted-copy{margin:8px 0 0;color:var(--muted);line-height:1.5;word-break:break-word}.view-stack{display:grid;gap:18px}.metrics-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.metric-card{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--panel-strong);padding:18px;min-width:0;box-shadow:var(--shadow-soft)}.metric-card.is-wide{grid-column:1 / -1}.metric-card-header{margin-bottom:14px;justify-content:flex-start}.metric-card-icon{width:32px;height:32px;border-radius:11px;display:grid;place-items:center;background:#1011140f}.metric-card-label{font-size:.86rem;color:var(--muted)}.metric-card-value{display:block;font-size:clamp(1rem,1.8vw,1.2rem);line-height:1.35;letter-spacing:-.03em;word-break:break-word}.metric-card-note{margin:10px 0 0;color:var(--muted);line-height:1.45}.panel-inner{border:1px solid var(--border);border-radius:var(--radius-lg);background:#ffffffb8;padding:18px}.chip-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}.skill-chip{padding-inline:14px}.agent-list,.memory-file-list{display:grid;gap:12px}.agent-row{justify-content:space-between;border:1px solid var(--border);border-radius:var(--radius-md);background:#fffc;padding:14px 16px}.agent-row-meta{justify-content:flex-start;min-width:0}.agent-row-meta strong{display:block;text-transform:capitalize}.agent-row-meta p{margin:3px 0 0;color:var(--muted)}.agent-status-dot{width:10px;height:10px;border-radius:999px;background:#1011143d;flex:0 0 auto}.agent-status-dot.is-online{background:#101114}.agent-status-dot.is-offline{background:#10111447}.agent-command{flex:0 0 auto}.memory-layout{display:grid;grid-template-columns:320px minmax(0,1fr);gap:16px;min-width:0}.memory-list,.memory-preview{min-width:0}.memory-file-button{border:1px solid var(--border);border-radius:var(--radius-md);background:#ffffffd1;padding:14px 16px;text-align:left;display:grid;gap:6px;transition:transform .14s ease,border-color .14s ease,background-color .14s ease}.memory-file-button:hover{transform:translateY(-1px);border-color:var(--border-strong)}.memory-file-button.is-selected{background:#101114;color:#fff;border-color:#101114}.memory-file-button strong,.memory-file-button span{min-width:0;overflow:hidden;text-overflow:ellipsis}.memory-file-button span{color:var(--muted);font-size:.8rem}.memory-file-button.is-selected span{color:#ffffffbd}.memory-preview{display:grid;gap:14px}.memory-editor{width:100%;min-height:420px;resize:vertical;border:1px solid var(--border);border-radius:var(--radius-lg);background:#fffffff0;color:var(--text);padding:18px;line-height:1.55;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,Liberation Mono,monospace;box-shadow:var(--shadow-soft)}.memory-editor:focus{outline:2px solid rgba(16,17,20,.18);outline-offset:2px}.run-view,.config-view{gap:16px}.config-panel{display:grid;gap:18px}.config-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px}.config-list{display:grid;gap:14px}.config-card,.config-empty-state{border:1px solid var(--border);border-radius:var(--radius-lg);background:#ffffffd6;padding:18px;box-shadow:var(--shadow-soft)}.config-card{display:grid;gap:16px}.config-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.config-card-header h4,.config-empty-state strong{margin:0;font-size:1rem;line-height:1.25;letter-spacing:-.02em}.config-empty-state p{margin:8px 0 0;color:var(--muted);line-height:1.5}.config-field-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.secondary-button,.danger-button{border-radius:999px;padding:11px 15px;display:inline-flex;align-items:center;justify-content:center;gap:9px;font-weight:650;transition:transform .14s ease,border-color .14s ease,background-color .14s ease,opacity .14s ease}.secondary-button{border:1px solid var(--border);background:#ffffffe0;color:var(--text)}.danger-button{border:1px solid rgba(16,17,20,.12);background:#1011140a;color:var(--text)}.secondary-button:hover:not(:disabled),.danger-button:hover:not(:disabled){transform:translateY(-1px);border-color:var(--border-strong)}.secondary-button:disabled,.danger-button:disabled{opacity:.5}.editor-textarea{min-height:180px;resize:vertical}.editor-code,.editor-textarea{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,Liberation Mono,monospace;line-height:1.55}.save-feedback{border:1px solid var(--border);border-radius:var(--radius-md);background:#ffffffe0;padding:13px 15px;display:inline-flex;align-items:center;gap:10px;font-size:.92rem}.save-feedback.saved{border-color:#10111424}.save-feedback.error{border-color:#1011142e}.run-panel{display:grid;gap:18px}.run-form{display:grid;gap:16px}.field{display:grid;gap:8px}.field-label{font-size:.86rem;font-weight:650;letter-spacing:-.01em}.field-control{width:100%;border:1px solid var(--border);border-radius:var(--radius-md);background:#fffffff0;color:var(--text);padding:13px 14px;box-shadow:var(--shadow-soft);min-width:0}.field-control:focus{outline:2px solid rgba(16,17,20,.18);outline-offset:2px}.field-control:disabled{opacity:.72}.field-help{margin:0;color:var(--muted);font-size:.82rem;line-height:1.45}.run-agent-grid,.run-detail-grid,.run-summary-grid{display:grid;gap:14px}.run-agent-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.run-detail-grid{grid-template-columns:minmax(0,1.35fr) minmax(320px,.95fr);align-items:start}.run-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.run-actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px}.run-button{border:1px solid #101114;border-radius:999px;background:#101114;color:#fff;padding:13px 18px;display:inline-flex;align-items:center;gap:10px;font-weight:650;box-shadow:0 14px 30px #1011142e;transition:transform .14s ease,opacity .14s ease}.run-button:hover:not(:disabled){transform:translateY(-1px)}.run-button:disabled{opacity:.55}.run-button-spinner,.run-state-spinner{animation:spin .9s linear infinite}.run-state{white-space:nowrap}.run-state.running{border-color:#1011142e;background:#10111414}.run-state.success{border-color:#10111424;background:#1011140f}.run-state.error{border-color:#1011142e;background:#10111414}.run-output-panel,.run-summary-panel{min-width:0}.run-output{width:100%;min-height:380px;resize:vertical;border:1px solid var(--border);border-radius:var(--radius-lg);background:#fffffff0;color:var(--text);padding:18px;line-height:1.55;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Monaco,Consolas,Liberation Mono,monospace;box-shadow:var(--shadow-soft)}.run-output:focus{outline:2px solid rgba(16,17,20,.18);outline-offset:2px}.run-summary-tile{border:1px solid var(--border);border-radius:var(--radius-md);background:#ffffffe0;padding:14px 15px;display:grid;gap:8px}.run-summary-tile-icon{width:32px;height:32px;border-radius:11px;display:grid;place-items:center;background:#1011140f}.run-summary-tile-label{color:var(--muted);font-size:.82rem}.run-summary-tile-value{font-size:1rem;line-height:1.4;word-break:break-word}.run-empty-state{border:1px solid var(--border);border-radius:var(--radius-lg);background:#fffc;padding:18px;min-height:220px;display:grid;grid-template-columns:auto minmax(0,1fr);gap:14px;align-items:start}.run-empty-state.is-error{background:#ffffffe6}.run-empty-state strong{display:block;margin-bottom:6px}.run-empty-state p{margin:0;color:var(--muted);line-height:1.55}.empty-state{border:1px solid var(--border);border-radius:var(--radius-xl);background:#ffffffc2;padding:30px;min-height:260px;display:grid;align-content:start;gap:12px;box-shadow:var(--shadow-soft)}.empty-state p{margin:0;color:var(--muted);line-height:1.6;max-width:60ch}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1080px){.shell-grid,.memory-layout,.run-detail-grid,.metrics-grid,.config-field-grid,.run-agent-grid,.run-summary-grid{grid-template-columns:1fr}.nav-card{position:static}}@media(max-width:720px){.app-shell{padding:16px}.topbar{padding:18px;align-items:flex-start;flex-direction:column}.nav-card,.workspace-card,.panel-inner{padding:16px}.run-actions{align-items:stretch}.config-toolbar,.config-card-header{flex-direction:column;align-items:stretch}.run-button{width:100%;justify-content:center}.secondary-button,.danger-button{width:100%}}.empty-state-icon{width:42px;height:42px;border-radius:14px;display:grid;place-items:center;background:#10111412}@media(max-width:1100px){.shell-grid,.memory-layout,.metrics-grid{grid-template-columns:1fr}.nav-card{position:static}}@media(max-width:720px){.app-shell{padding:14px}.topbar,.workspace-header{flex-direction:column;align-items:flex-start}.status-strip,.workspace-header-meta{justify-content:flex-start}.panel,.nav-card,.workspace-card{padding:16px;border-radius:22px}.memory-editor{min-height:300px}}