@lovinka/vitrinka 1.9.0 → 1.10.1
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/CHANGELOG.md +25 -0
- package/README.md +2 -2
- package/dist/bin-mcp.js +2 -2
- package/dist/bin-mcp.js.map +1 -1
- package/dist/cli.js +8 -8
- package/dist/cli.js.map +1 -1
- package/dist/lib/base-url.js +1 -1
- package/dist/lib/base-url.js.map +1 -1
- package/dist/lib/token.js +1 -1
- package/dist/lib/token.js.map +1 -1
- package/dist/mcp.js +5 -5
- package/dist/mcp.js.map +1 -1
- package/dist/work.js +1 -1
- package/dist/work.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,31 @@
|
|
|
3
3
|
`vitrinka update` prints the sections newer than your previous version after
|
|
4
4
|
updating — keep entries short and user-facing.
|
|
5
5
|
|
|
6
|
+
## 1.10.1 — 2026-07-13
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- Canonical domain is now **vitrinka.in** — the CLI/MCP default base URL,
|
|
10
|
+
skills and docs all point there. vitrinka.lovinka.com keeps working as an
|
|
11
|
+
alias; override per-machine with `VITRINKA_URL` as before. Re-run
|
|
12
|
+
`vitrinka install` (or `doctor --fix`) to re-register MCP on the new host.
|
|
13
|
+
|
|
14
|
+
## 1.10.0 — 2026-07-13
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- `compose_board` question options accept `cardId` — the board draws a trace
|
|
18
|
+
wire from the option to the card it names, hovering glows it, and picking
|
|
19
|
+
flies the camera there. Pair it with the new `POST /artifact` params
|
|
20
|
+
(`section`, `device`, `anchor`/`side`): mockups land inside their take's
|
|
21
|
+
section frame, sized by device intent, and scale to fit their card
|
|
22
|
+
automatically (server-measured natural size).
|
|
23
|
+
|
|
24
|
+
## 1.9.0 — 2026-07-12
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- MCP registration moved to the remote `/mcp` endpoint (streamable HTTP) —
|
|
28
|
+
no local stdio process per session; `vitrinka install`/`doctor --fix`
|
|
29
|
+
re-register automatically. The old stdio bin is deprecated.
|
|
30
|
+
|
|
6
31
|
## 1.8.3 — 2026-07-11
|
|
7
32
|
|
|
8
33
|
### Fixed
|
package/README.md
CHANGED
|
@@ -92,7 +92,7 @@ For Claude Desktop or any other MCP client, add the equivalent entry by hand:
|
|
|
92
92
|
"command": "npx",
|
|
93
93
|
"args": ["-y", "--package=@lovinka/vitrinka", "vitrinka-mcp"],
|
|
94
94
|
"env": {
|
|
95
|
-
"VITRINKA_BASE_URL": "https://vitrinka.
|
|
95
|
+
"VITRINKA_BASE_URL": "https://vitrinka.in",
|
|
96
96
|
"VITRINKA_TOKEN": "…"
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -107,7 +107,7 @@ vitrinka is reachable over the WireGuard mesh — bring the VPN up (or point
|
|
|
107
107
|
|
|
108
108
|
| Var | Default | Purpose |
|
|
109
109
|
|---|---|---|
|
|
110
|
-
| `VITRINKA_URL` / `VITRINKA_BASE_URL` | `https://vitrinka.
|
|
110
|
+
| `VITRINKA_URL` / `VITRINKA_BASE_URL` | `https://vitrinka.in` | vitrinka server base URL. `VITRINKA_URL` wins, then `VITRINKA_BASE_URL`; the CLI's `--base` flag overrides both. |
|
|
111
111
|
| `VITRINKA_TOKEN` | — | Bearer write token. Falls back to `~/.config/vitrinka/token`. Required only by the **mutating** tools; read tools work unauthenticated. |
|
|
112
112
|
| `VITRINKA_OPERATOR` | — | Operator persona name. Falls back to `~/.config/vitrinka/operator` (written by `vitrinka install` onboarding). When set, write calls carry `X-Board-Actor: <name>` so the board credits the operator's machine — agent-authored content (`reply`, `attach_after`) keeps its explicit `claude` attribution. |
|
|
113
113
|
|
package/dist/bin-mcp.js
CHANGED
|
@@ -16,14 +16,14 @@ if (sub === '--help' || sub === '-h') {
|
|
|
16
16
|
' vitrinka-mcp Start the MCP server over stdio (DEPRECATED — see below).\n' +
|
|
17
17
|
' vitrinka-mcp work … Run the unattended annotation worker (--repo <dir>).\n\n' +
|
|
18
18
|
'ENV\n' +
|
|
19
|
-
' VITRINKA_BASE_URL default https://vitrinka.
|
|
19
|
+
' VITRINKA_BASE_URL default https://vitrinka.in\n' +
|
|
20
20
|
' VITRINKA_TOKEN bearer token; falls back to ~/.config/vitrinka/token\n' +
|
|
21
21
|
' (required only by mutating tools; reads work without it)\n\n' +
|
|
22
22
|
'DEPRECATED: the stdio server is replaced by the remote streamable-HTTP\n' +
|
|
23
23
|
'endpoint the Go server hosts at /mcp — same tools, zero local processes.\n\n' +
|
|
24
24
|
'REGISTER (Claude Code, user scope)\n' +
|
|
25
25
|
' claude mcp add --scope user --transport http vitrinka \\\n' +
|
|
26
|
-
' https://vitrinka.
|
|
26
|
+
' https://vitrinka.in/mcp \\\n' +
|
|
27
27
|
' --header "Authorization: Bearer $(cat ~/.config/vitrinka/token)"\n');
|
|
28
28
|
process.exit(0);
|
|
29
29
|
}
|
package/dist/bin-mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin-mcp.js","sourceRoot":"","sources":["../src/bin-mcp.ts"],"names":[],"mappings":";AACA,gFAAgF;AAChF,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,EAAE;AACF,gFAAgF;AAChF,0EAA0E;AAC1E,8CAA8C;AAE9C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+DAA+D;QAC7D,SAAS;QACT,uFAAuF;QACvF,oFAAoF;QACpF,OAAO;QACP,
|
|
1
|
+
{"version":3,"file":"bin-mcp.js","sourceRoot":"","sources":["../src/bin-mcp.ts"],"names":[],"mappings":";AACA,gFAAgF;AAChF,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,EAAE;AACF,gFAAgF;AAChF,0EAA0E;AAC1E,8CAA8C;AAE9C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+DAA+D;QAC7D,SAAS;QACT,uFAAuF;QACvF,oFAAoF;QACpF,OAAO;QACP,oDAAoD;QACpD,6EAA6E;QAC7E,mFAAmF;QACnF,0EAA0E;QAC1E,8EAA8E;QAC9E,sCAAsC;QACtC,8DAA8D;QAC9D,kCAAkC;QAClC,wEAAwE,CAC3E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;IACnB,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,CAAC;IACN,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -640,7 +640,7 @@ export async function pushProjectIndex(projectDir, base, project, verify = false
|
|
|
640
640
|
async function indexCmd(root, args) {
|
|
641
641
|
const projectDir = dirname(root);
|
|
642
642
|
const cfg = existsSync(vitrinkaCfgPath(root)) ? loadVitrinkaCfg(root) : null;
|
|
643
|
-
const base = (strArg(args.base) || cfg?.base || process.env.VITRINKA_URL || 'https://vitrinka.
|
|
643
|
+
const base = (strArg(args.base) || cfg?.base || process.env.VITRINKA_URL || 'https://vitrinka.in').replace(/\/+$/, '');
|
|
644
644
|
const project = sanitizeSeg(strArg(args.project) || cfg?.project || basename(mainWorktreeTop(projectDir) || projectDir), 64);
|
|
645
645
|
if (!(await pushProjectIndex(projectDir, base, project, true)))
|
|
646
646
|
process.exit(1);
|
|
@@ -717,7 +717,7 @@ async function indexComponentsCmd(root, args) {
|
|
|
717
717
|
const library = strArg(args.library);
|
|
718
718
|
if (!library)
|
|
719
719
|
throw new Error('index-components: --library <kit> is required (one per UI library, e.g. "web" or "expo")');
|
|
720
|
-
const base = (strArg(args.base) || process.env.VITRINKA_URL || 'https://vitrinka.
|
|
720
|
+
const base = (strArg(args.base) || process.env.VITRINKA_URL || 'https://vitrinka.in').replace(/\/+$/, '');
|
|
721
721
|
const project = sanitizeSeg(strArg(args.project) || basename(mainWorktreeTop(projectDir) || projectDir), 64);
|
|
722
722
|
let components;
|
|
723
723
|
if (strArg(args.from)) {
|
|
@@ -803,7 +803,7 @@ async function remoteInitCmd(root, args) {
|
|
|
803
803
|
return cfg;
|
|
804
804
|
}
|
|
805
805
|
const projectDir = dirname(root);
|
|
806
|
-
const base = (args.base && args.base !== true ? String(args.base) : process.env.VITRINKA_URL || 'https://vitrinka.
|
|
806
|
+
const base = (args.base && args.base !== true ? String(args.base) : process.env.VITRINKA_URL || 'https://vitrinka.in').replace(/\/+$/, '');
|
|
807
807
|
// Project identity comes from the MAIN worktree (a linked worktree's dir is
|
|
808
808
|
// named after its branch — using it would fork each branch into its own
|
|
809
809
|
// project; the branch already lives in cfg.branch).
|
|
@@ -1007,7 +1007,7 @@ async function nameCmd(rest, args) {
|
|
|
1007
1007
|
fail('name: expected a new name (or --clear)', 2);
|
|
1008
1008
|
if (clear && newName)
|
|
1009
1009
|
fail('name: pass either a new name or --clear, not both', 2);
|
|
1010
|
-
const base = (strArg(args.base) || process.env.VITRINKA_URL || 'https://vitrinka.
|
|
1010
|
+
const base = (strArg(args.base) || process.env.VITRINKA_URL || 'https://vitrinka.in').replace(/\/+$/, '');
|
|
1011
1011
|
const res = await patchSetMeta(base, segs[0], segs[1], segs[2], { name: clear ? '' : newName });
|
|
1012
1012
|
if (!res.ok)
|
|
1013
1013
|
fail(`name: ${res.error}`);
|
|
@@ -1024,7 +1024,7 @@ async function nameCmd(rest, args) {
|
|
|
1024
1024
|
// (no /api/v1/cli/auth route) it explains the shared-token path instead.
|
|
1025
1025
|
async function loginCmd(args) {
|
|
1026
1026
|
const base = (strArg(args.base) || process.env.VITRINKA_URL || process.env.VITRINKA_BASE_URL
|
|
1027
|
-
|| 'https://vitrinka.
|
|
1027
|
+
|| 'https://vitrinka.in').replace(/\/+$/, '');
|
|
1028
1028
|
let start;
|
|
1029
1029
|
try {
|
|
1030
1030
|
start = await fetch(`${base}/api/v1/cli/auth`, { method: 'POST', signal: AbortSignal.timeout(15_000) });
|
|
@@ -1106,7 +1106,7 @@ async function loginCmd(args) {
|
|
|
1106
1106
|
async function operatorCmd(rest, args) {
|
|
1107
1107
|
const pos = positionals(rest).slice(1); // drop the command word itself
|
|
1108
1108
|
const base = (strArg(args.base) || process.env.VITRINKA_URL || process.env.VITRINKA_BASE_URL
|
|
1109
|
-
|| 'https://vitrinka.
|
|
1109
|
+
|| 'https://vitrinka.in').replace(/\/+$/, '');
|
|
1110
1110
|
// stripControl mirrors the server's 422 on control characters — an
|
|
1111
1111
|
// arrow-edited or paste-polluted name must never reach the settings key.
|
|
1112
1112
|
const name = stripControl(pos.join(' '));
|
|
@@ -2983,7 +2983,7 @@ export const COMMANDS = [
|
|
|
2983
2983
|
{
|
|
2984
2984
|
name: 'login', summary: 'Sign this machine in: browser approval mints a personal, workspace-scoped token',
|
|
2985
2985
|
usage: '[--base <url>]', flags: [BASE_FLAG],
|
|
2986
|
-
examples: ['vitrinka login', 'vitrinka login --base https://vitrinka.
|
|
2986
|
+
examples: ['vitrinka login', 'vitrinka login --base https://vitrinka.in'],
|
|
2987
2987
|
},
|
|
2988
2988
|
{
|
|
2989
2989
|
name: 'doctor', summary: 'Check this machine\'s setup (server, token, operator, skills, shim, MCP); --fix repairs it',
|
|
@@ -3662,7 +3662,7 @@ const watchEmit = (line) => { process.stdout.write(line + '\n'); };
|
|
|
3662
3662
|
const watchSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
3663
3663
|
function watchBaseUrl(args) {
|
|
3664
3664
|
return (strArg(args.base) || process.env.VITRINKA_URL || process.env.VITRINKA_BASE_URL
|
|
3665
|
-
|| 'https://vitrinka.
|
|
3665
|
+
|| 'https://vitrinka.in').replace(/\/+$/, '');
|
|
3666
3666
|
}
|
|
3667
3667
|
// deriveWatchScope resolves the listener scope from flags + the repo context
|
|
3668
3668
|
// (PURE — unit-tested). Priority: --all (firehose) → --board <slug> → the repo's
|