@lovinka/vitrinka 1.10.0 → 1.10.2

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 CHANGED
@@ -3,6 +3,14 @@
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
+
6
14
  ## 1.10.0 — 2026-07-13
7
15
 
8
16
  ### Added
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.lovinka.com",
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.lovinka.com` | vitrinka server base URL. `VITRINKA_URL` wins, then `VITRINKA_BASE_URL`; the CLI's `--base` flag overrides both. |
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.lovinka.com\n' +
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.lovinka.com/mcp \\\n' +
26
+ ' https://vitrinka.in/mcp \\\n' +
27
27
  ' --header "Authorization: Bearer $(cat ~/.config/vitrinka/token)"\n');
28
28
  process.exit(0);
29
29
  }
@@ -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,6DAA6D;QAC7D,6EAA6E;QAC7E,mFAAmF;QACnF,0EAA0E;QAC1E,8EAA8E;QAC9E,sCAAsC;QACtC,8DAA8D;QAC9D,2CAA2C;QAC3C,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"}
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com').replace(/\/+$/, '');
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.lovinka.com'],
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',
@@ -3600,7 +3600,9 @@ async function boardFromSetCmd(root, args) {
3600
3600
  if (actor)
3601
3601
  headers['X-Board-Actor'] = actor;
3602
3602
  const create = await fetch(`${cfg.base}/api/v1/boards`, {
3603
- method: 'POST', headers, body: JSON.stringify({ slug, title, project: cfg.project }),
3603
+ // Session/set boards fold under the "testing" sidebar subgroup (the server
3604
+ // also infers this for s-YYYYMMDD* slugs; explicit covers named sets too).
3605
+ method: 'POST', headers, body: JSON.stringify({ slug, title, project: cfg.project, subgroup: 'testing' }),
3604
3606
  signal: AbortSignal.timeout(30_000),
3605
3607
  });
3606
3608
  if (!create.ok && create.status !== 409) { // 409 = board exists → reuse
@@ -3662,7 +3664,7 @@ const watchEmit = (line) => { process.stdout.write(line + '\n'); };
3662
3664
  const watchSleep = (ms) => new Promise((r) => setTimeout(r, ms));
3663
3665
  function watchBaseUrl(args) {
3664
3666
  return (strArg(args.base) || process.env.VITRINKA_URL || process.env.VITRINKA_BASE_URL
3665
- || 'https://vitrinka.lovinka.com').replace(/\/+$/, '');
3667
+ || 'https://vitrinka.in').replace(/\/+$/, '');
3666
3668
  }
3667
3669
  // deriveWatchScope resolves the listener scope from flags + the repo context
3668
3670
  // (PURE — unit-tested). Priority: --all (firehose) → --board <slug> → the repo's