@jobshimo/browser-link 0.8.2 → 0.8.5
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/dist/agent-instructions/content.js +42 -27
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/agent-instructions/file-ops.js +7 -2
- package/dist/agent-instructions/file-ops.js.map +1 -1
- package/dist/commands/doctor.js +30 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/update-check.d.ts +25 -0
- package/dist/commands/update-check.js +108 -0
- package/dist/commands/update-check.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/map/tools.d.ts +1 -5
- package/dist/map/tools.js +45 -0
- package/dist/map/tools.js.map +1 -1
- package/dist/tools/browser-definitions.d.ts +6 -0
- package/dist/tools/browser-definitions.js +134 -0
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/server-instructions.d.ts +16 -2
- package/dist/tools/server-instructions.js +87 -68
- package/dist/tools/server-instructions.js.map +1 -1
- package/dist/tools/types.d.ts +26 -1
- package/dist/ui/app.js +13 -3
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/hooks/use-update-check.d.ts +16 -0
- package/dist/ui/hooks/use-update-check.js +48 -0
- package/dist/ui/hooks/use-update-check.js.map +1 -0
- package/dist/ui/screens/agent-instructions.d.ts +7 -1
- package/dist/ui/screens/agent-instructions.js +13 -3
- package/dist/ui/screens/agent-instructions.js.map +1 -1
- package/dist/ui/screens/menu.d.ts +10 -1
- package/dist/ui/screens/menu.js +37 -5
- package/dist/ui/screens/menu.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
import { type ClientId } from '../../agent-instructions/index.js';
|
|
1
2
|
import type { CommonProps } from './types.js';
|
|
2
3
|
interface AgentInstructionsViewProps extends CommonProps {
|
|
3
4
|
onBack: () => void;
|
|
5
|
+
/** Optional initial cursor target. When the user lands on this screen via
|
|
6
|
+
* the `i` hotkey from the main menu, the cursor is auto-positioned on
|
|
7
|
+
* the first outdated client so the next Enter refreshes it. Falls back
|
|
8
|
+
* to row 0 when omitted or when the requested client is not present. */
|
|
9
|
+
initialCursorClient?: ClientId;
|
|
4
10
|
}
|
|
5
|
-
export declare function AgentInstructionsView({ language, onBack }: AgentInstructionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function AgentInstructionsView({ language, onBack, initialCursorClient, }: AgentInstructionsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
6
12
|
export {};
|
|
@@ -71,17 +71,27 @@ function statusBadge(state, t) {
|
|
|
71
71
|
return { label: t.corrupt, color: 'yellow' };
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
export function AgentInstructionsView({ language, onBack }) {
|
|
74
|
+
export function AgentInstructionsView({ language, onBack, initialCursorClient, }) {
|
|
75
75
|
const t = I18N[language];
|
|
76
76
|
const [reports, setReports] = useState(() => statusAll());
|
|
77
|
-
const
|
|
77
|
+
const items = useMemo(() => INSTRUCTIONS_INSTALLERS, []);
|
|
78
|
+
// If the caller asked us to focus a specific client, place the cursor on
|
|
79
|
+
// it; otherwise default to the first row. The lookup is done once on
|
|
80
|
+
// mount because the prop is the user's deliberate landing instruction —
|
|
81
|
+
// we should not pull the cursor away from where they navigated to next.
|
|
82
|
+
const initialIndex = useMemo(() => {
|
|
83
|
+
if (!initialCursorClient)
|
|
84
|
+
return 0;
|
|
85
|
+
const i = items.findIndex((it) => it.id === initialCursorClient);
|
|
86
|
+
return i >= 0 ? i : 0;
|
|
87
|
+
}, [initialCursorClient, items]);
|
|
88
|
+
const [cursor, setCursor] = useState(initialIndex);
|
|
78
89
|
const [lastAction, setLastAction] = useState(null);
|
|
79
90
|
// Refresh status when we come back from an install/uninstall round-trip.
|
|
80
91
|
useEffect(() => {
|
|
81
92
|
if (lastAction)
|
|
82
93
|
setReports(statusAll());
|
|
83
94
|
}, [lastAction]);
|
|
84
|
-
const items = useMemo(() => INSTRUCTIONS_INSTALLERS, []);
|
|
85
95
|
// Column width is driven by the longest displayName so adding a fourth
|
|
86
96
|
// client never requires hand-tuning a magic padEnd value in two places.
|
|
87
97
|
const nameColumnWidth = useMemo(() => displayNameColumnWidth(items.map((i) => i.displayName)), [items]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/ui/screens/agent-instructions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EACL,uBAAuB,GAGxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,SAAS,EACT,wBAAwB,GAEzB,MAAM,gCAAgC,CAAC;AAqBxC,MAAM,IAAI,GAA4C;IACpD,EAAE,EAAE;QACF,KAAK,EAAE,uEAAuE;QAC9E,KAAK,EAAE;YACL,wEAAwE;YACxE,wEAAwE;YACxE,0EAA0E;YAC1E,0EAA0E;SAC3E,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,aAAa,EAAE,qEAAqE;QACpF,SAAS,EAAE,aAAa;QACxB,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,iBAAiB;QAC/B,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,6BAA6B;QACtC,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,0DAA0D;QAClE,WAAW,EAAE,kEAAkE;QAC/E,aAAa,EAAE,qDAAqD;QACpE,WAAW,EAAE,mBAAmB;QAChC,aAAa,EAAE,qBAAqB;QACpC,WAAW,EAAE,mEAAmE;KACjF;IACD,EAAE,EAAE;QACF,KAAK,EAAE,6EAA6E;QACpF,KAAK,EAAE;YACL,0EAA0E;YAC1E,4EAA4E;YAC5E,sEAAsE;YACtE,0EAA0E;YAC1E,qCAAqC;SACtC,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,aAAa,EACX,kFAAkF;QACpF,SAAS,EAAE,aAAa;QACxB,QAAQ,EAAE,kBAAkB;QAC5B,YAAY,EAAE,gBAAgB;QAC9B,MAAM,EAAE,uBAAuB;QAC/B,OAAO,EAAE,gCAAgC;QACzC,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,gEAAgE;QACxE,WAAW,EAAE,uEAAuE;QACpF,aAAa,EAAE,gDAAgD;QAC/D,WAAW,EAAE,yBAAyB;QACtC,aAAa,EAAE,4BAA4B;QAC3C,WAAW,EAAE,gEAAgE;KAC9E;CACF,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../../src/ui/screens/agent-instructions.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
import { type UpdateCheckState } from '../hooks/use-update-check.js';
|
|
1
2
|
import type { CommonProps } from './types.js';
|
|
2
3
|
export type MenuAction = 'register' | 'instructions' | 'permissions' | 'multiAgent' | 'extension' | 'doctor' | 'updates' | 'freePort' | 'language' | 'welcome' | 'about' | 'repo' | 'quit';
|
|
3
4
|
interface MainMenuProps extends CommonProps {
|
|
4
5
|
onSelect: (action: MenuAction) => void;
|
|
5
6
|
onSwapLang: () => void;
|
|
6
7
|
onQuit: () => void;
|
|
8
|
+
/** Override the outdated-clients lookup. Tests inject a stub so we can
|
|
9
|
+
* assert banner behaviour without depending on the real filesystem. The
|
|
10
|
+
* runtime default uses `statusAll()` from commands/instructions. */
|
|
11
|
+
outdatedClientNames?: () => string[];
|
|
12
|
+
/** Override the background update-check hook result. Tests pass a fixed
|
|
13
|
+
* value to assert the update banner renders only when isNewer is true.
|
|
14
|
+
* In production this is undefined and the menu calls the real hook. */
|
|
15
|
+
updateState?: UpdateCheckState;
|
|
7
16
|
}
|
|
8
|
-
export declare function MainMenu({ language, onSelect, onSwapLang, onQuit }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare function MainMenu({ language, onSelect, onSwapLang, onQuit, outdatedClientNames, updateState, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
9
18
|
export {};
|
package/dist/ui/screens/menu.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text, useInput } from 'ink';
|
|
3
|
-
import { useState } from 'react';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
4
|
import { Frame, Menu } from '../components.js';
|
|
5
|
+
import { statusAll } from '../../commands/instructions.js';
|
|
6
|
+
import { useBackgroundUpdateCheck } from '../hooks/use-update-check.js';
|
|
5
7
|
const MENU_I18N = {
|
|
6
8
|
en: {
|
|
7
9
|
title: 'browser-link — setup',
|
|
8
10
|
prompt: 'Pick an action',
|
|
9
|
-
footer: '↑↓ navigate · ↵ select · l language · q quit',
|
|
11
|
+
footer: '↑↓ navigate · ↵ select · i instructions · l language · q quit',
|
|
12
|
+
outdatedBanner: (clients) => `⚠ Outdated browser-link block in ${clients}. Press \`i\` to refresh in place.`,
|
|
13
|
+
updateBanner: (latest) => `⬆ v${latest} available — run \`npm install -g @jobshimo/browser-link@latest\``,
|
|
10
14
|
options: {
|
|
11
15
|
register: 'Register browser-link with an MCP client',
|
|
12
16
|
instructions: 'Agent instructions — drop a trigger block into Claude/OpenCode/Copilot global .md',
|
|
@@ -26,7 +30,9 @@ const MENU_I18N = {
|
|
|
26
30
|
es: {
|
|
27
31
|
title: 'browser-link — configuración',
|
|
28
32
|
prompt: 'Elegí una acción',
|
|
29
|
-
footer: '↑↓ moverse · ↵ elegir · l idioma · q salir',
|
|
33
|
+
footer: '↑↓ moverse · ↵ elegir · i instrucciones · l idioma · q salir',
|
|
34
|
+
outdatedBanner: (clients) => `⚠ Bloque de browser-link desactualizado en ${clients}. Apretá \`i\` para refrescar.`,
|
|
35
|
+
updateBanner: (latest) => `⬆ v${latest} disponible — corré \`npm install -g @jobshimo/browser-link@latest\``,
|
|
30
36
|
options: {
|
|
31
37
|
register: 'Registrar browser-link en un cliente MCP',
|
|
32
38
|
instructions: 'Instrucciones del agente — meter un bloque de triggers en el .md global de Claude/OpenCode/Copilot',
|
|
@@ -44,8 +50,22 @@ const MENU_I18N = {
|
|
|
44
50
|
},
|
|
45
51
|
},
|
|
46
52
|
};
|
|
47
|
-
|
|
53
|
+
/** Default implementation — read live status from the installer registry
|
|
54
|
+
* and project the outdated ones to their display names. Pulled out so the
|
|
55
|
+
* test seam (`outdatedClientNames` prop) has a clean default. */
|
|
56
|
+
function defaultOutdatedClientNames() {
|
|
57
|
+
return statusAll()
|
|
58
|
+
.filter((r) => r.state.kind === 'installed-outdated')
|
|
59
|
+
.map((r) => r.displayName);
|
|
60
|
+
}
|
|
61
|
+
export function MainMenu({ language, onSelect, onSwapLang, onQuit, outdatedClientNames = defaultOutdatedClientNames, updateState, }) {
|
|
48
62
|
const t = MENU_I18N[language];
|
|
63
|
+
// The real hook drives a 6-hourly background check; tests inject a fixed
|
|
64
|
+
// `updateState` instead. We call the hook unconditionally so the React
|
|
65
|
+
// rules-of-hooks are satisfied (no conditional invocation), then ignore
|
|
66
|
+
// its result when the prop override is present.
|
|
67
|
+
const hookState = useBackgroundUpdateCheck();
|
|
68
|
+
const effectiveUpdate = updateState ?? hookState;
|
|
49
69
|
const items = [
|
|
50
70
|
'register',
|
|
51
71
|
'instructions',
|
|
@@ -62,6 +82,16 @@ export function MainMenu({ language, onSelect, onSwapLang, onQuit }) {
|
|
|
62
82
|
'quit',
|
|
63
83
|
].map((a) => ({ value: a, label: t.options[a] }));
|
|
64
84
|
const [idx, setIdx] = useState(0);
|
|
85
|
+
// Banner state is computed on mount. The screen unmounts when the user
|
|
86
|
+
// navigates away (AgentInstructionsView is a different screen), so the
|
|
87
|
+
// next mount re-runs the lookup — after a successful refresh the banner
|
|
88
|
+
// disappears automatically without any explicit invalidation.
|
|
89
|
+
const [outdated, setOutdated] = useState(() => outdatedClientNames());
|
|
90
|
+
// Refresh the banner if the prop function changes between renders (the
|
|
91
|
+
// App may re-create it across language switches or theme changes).
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
setOutdated(outdatedClientNames());
|
|
94
|
+
}, [outdatedClientNames]);
|
|
65
95
|
useInput((input, key) => {
|
|
66
96
|
if (key.upArrow)
|
|
67
97
|
setIdx((i) => (i - 1 + items.length) % items.length);
|
|
@@ -78,7 +108,9 @@ export function MainMenu({ language, onSelect, onSwapLang, onQuit }) {
|
|
|
78
108
|
onQuit();
|
|
79
109
|
else if (input === 'l')
|
|
80
110
|
onSwapLang();
|
|
111
|
+
else if (input === 'i' || input === 'I')
|
|
112
|
+
onSelect('instructions');
|
|
81
113
|
});
|
|
82
|
-
return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [_jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) })] }));
|
|
114
|
+
return (_jsxs(Frame, { title: t.title, footer: t.footer, children: [outdated.length > 0 && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "yellow", children: t.outdatedBanner(outdated.join(', ')) }) })), effectiveUpdate.isNewer && effectiveUpdate.latest !== null && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: "cyan", children: t.updateBanner(effectiveUpdate.latest) }) })), _jsx(Text, { color: "white", bold: true, children: t.prompt }), _jsx(Box, { marginTop: 1, children: _jsx(Menu, { items: items, selectedIndex: idx }) })] }));
|
|
83
115
|
}
|
|
84
116
|
//# sourceMappingURL=menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/ui/screens/menu.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/ui/screens/menu.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobshimo/browser-link",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "MCP server that bridges Claude Code, OpenCode, GitHub Copilot CLI and other MCP clients to a Chrome tab. Per-tool permissions, multi-agent mode (multiple MCP clients sharing one bridge), persistent UI map across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|