wikimemory 0.2.6 → 0.2.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.
@@ -34,12 +34,13 @@ async function main() {
34
34
  }
35
35
  const parsed = deploymentArguments(args);
36
36
  const paths = deploymentPaths(parsed.deployment);
37
- const requiresInstalledDeployment = command === "recover" ||
38
- command === "status" ||
39
- command === "passkeys" ||
40
- command === "connect" ||
41
- command === "uninstall" ||
42
- (command === "upgrade" && !parsed.remaining.includes("--record"));
37
+ const requiresInstalledDeployment = !parsed.remaining.includes("--help") &&
38
+ (command === "recover" ||
39
+ command === "status" ||
40
+ command === "passkeys" ||
41
+ command === "connect" ||
42
+ command === "uninstall" ||
43
+ (command === "upgrade" && !parsed.remaining.includes("--record")));
43
44
  if (requiresInstalledDeployment) {
44
45
  const requirement = command === "recover" || command === "passkeys" || command === "uninstall"
45
46
  ? "config"
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { deploymentRecordPath, readDeploymentRecord } from "./deployment-record.js";
3
+ import { isReactApplicationShell } from "./web-shell.js";
3
4
  const HEALTH_SCHEMA = z.object({
4
5
  status: z.literal("ok"),
5
6
  service: z.literal("wikimemory"),
@@ -29,7 +30,7 @@ export async function deploymentStatus(deployment) {
29
30
  throw new Error("Health and schema versions disagree");
30
31
  if (discovery.resource !== `${record.origin}/mcp`)
31
32
  throw new Error("OAuth discovery reports an unexpected MCP resource");
32
- if (!(await appResponse.text()).includes('<div id="root"></div>'))
33
+ if (!isReactApplicationShell(await appResponse.text()))
33
34
  throw new Error("React application shell verification failed");
34
35
  return {
35
36
  deployment,
@@ -9,6 +9,7 @@ import { deploymentRecordPath, readDeploymentRecord, writeDeploymentRecord } fro
9
9
  import { DEPLOYMENT_VERIFY_ATTEMPTS, deploymentVerifyDelay } from "./deployment-wait.js";
10
10
  import { packageRoot } from "./package-root.js";
11
11
  import { commandFailureMessage, runCommand } from "./subprocess.js";
12
+ import { isReactApplicationShell } from "./web-shell.js";
12
13
  const PACKAGE_ROOT = packageRoot();
13
14
  const DEPLOYMENT_NAME = /^[a-z0-9][a-z0-9-]{0,62}$/u;
14
15
  const MIGRATION_NAME = /^\d{4}_[a-z0-9_]+\.sql$/u;
@@ -204,7 +205,7 @@ export async function verifyRelease(origin, manifest, fetcher = fetch, sleeper =
204
205
  if (!discovery.ok)
205
206
  throw new Error(`OAuth protected-resource discovery returned HTTP ${discovery.status}`);
206
207
  const app = await fetcher(`${origin}/app`, { redirect: "error" });
207
- if (!app.ok || !(await app.text()).includes('<div id="root"></div>'))
208
+ if (!app.ok || !isReactApplicationShell(await app.text()))
208
209
  throw new Error("React application verification failed");
209
210
  return;
210
211
  }
@@ -0,0 +1,5 @@
1
+ const ROOT_CONTAINER = /<div\s+id=["']root["'][^>]*>/u;
2
+ const MODULE_ASSET = /<script\s+[^>]*type=["']module["'][^>]*src=["']\/assets\//u;
3
+ export function isReactApplicationShell(html) {
4
+ return ROOT_CONTAINER.test(html) && MODULE_ASSET.test(html);
5
+ }
@@ -1,2 +1,2 @@
1
- export const WIKIMEMORY_VERSION = "0.2.6";
1
+ export const WIKIMEMORY_VERSION = "0.2.7";
2
2
  export const LATEST_SCHEMA_VERSION = "0004_credential_bound_registration_tokens.sql";
@@ -0,0 +1 @@
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f5f6f8;--panel:#fff;--ink:#19211e;--muted:#66716c;--line:#dfe4e1;--accent:#176b52;--danger:#a83a3a}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}html{text-size-adjust:100%}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);margin:0;font:400 1rem/1.6 ui-sans-serif,system-ui,sans-serif}a{color:var(--accent)}header{border-bottom:1px solid var(--line);background:var(--panel);flex-wrap:wrap;align-items:center;gap:.5rem;padding:.75rem max(1rem,50% - 36rem);display:flex}header a{padding:.4rem;text-decoration:none}.brand{align-items:center;gap:.5rem;margin-right:auto;font-weight:800;display:flex}.brand span{background:var(--accent);color:#fff;border-radius:.55rem;place-items:center;width:2rem;height:2rem;display:grid}main{width:min(72rem,100% - 2rem);margin:auto;padding:3rem 0 6rem}.center{place-items:center;min-height:100vh;padding:1rem;display:grid}.center .panel{width:min(32rem,100%)}h1,h2{line-height:1.2}.lede,.muted,small{color:var(--muted)}.panel,.card{border:1px solid var(--line);background:var(--panel);border-radius:.85rem;padding:1.25rem}.panel{margin-bottom:1rem}.grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:1rem;display:grid}.meta{flex-wrap:wrap;gap:.4rem;display:flex}.meta span{background:#e7f4ef;border-radius:999px;padding:.1rem .45rem;font-size:.8rem}.search{gap:.5rem;margin:1rem 0 2rem;display:flex}input{background:var(--panel);width:100%;color:inherit;font:inherit;border:1px solid #b8c2bd;border-radius:.55rem;padding:.7rem}label{margin:1rem 0;font-weight:650;display:block}button,.button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:.55rem;padding:.7rem .95rem;font:600 .9rem system-ui;text-decoration:none;display:inline-flex}button:disabled{opacity:.5}.danger{border-color:var(--danger);color:var(--danger);background:0 0;margin-top:.5rem}.list{padding:0;list-style:none}.list li{border-bottom:1px solid var(--line);padding:.75rem 0}.list small{display:block}.notice{border-left:.3rem solid var(--accent);background:#e7f4ef;padding:.7rem 1rem}.document-body{border:1px solid var(--line);background:var(--panel);color:inherit;font:inherit;white-space:pre-wrap;overflow-wrap:anywhere;border-radius:.85rem;margin:2rem 0;padding:1.25rem;overflow-x:auto}.metadata{gap:.5rem;margin:1.5rem 0;display:grid}.metadata div{grid-template-columns:minmax(7rem,.25fr) 1fr;gap:1rem;display:grid}.metadata dt{color:var(--muted);font-weight:650}.metadata dd{margin:0}@media (prefers-color-scheme:dark){:root{--bg:#111714;--panel:#19201d;--ink:#edf3ef;--muted:#a6b0ab;--line:#2c3732;--accent:#74c9aa;--danger:#ef8585}.meta span,.notice{background:#183a2f}}
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="referrer" content="no-referrer" />
7
7
  <title>Wikimemory</title>
8
- <script type="module" crossorigin src="/assets/index-CWb1TP9g.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CjnFBnXp.css">
8
+ <script type="module" crossorigin src="/assets/index-Cebskfjw.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-9nkjx7L3.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikimemory",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "Personal, passkey-protected memory for Claude, Codex, and other MCP clients",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.6",
2
+ "version": "0.2.7",
3
3
  "schemaVersion": "0004_credential_bound_registration_tokens.sql",
4
4
  "migrations": [
5
5
  {
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const WIKIMEMORY_VERSION = "0.2.6";
1
+ export const WIKIMEMORY_VERSION = "0.2.7";
2
2
  export const LATEST_SCHEMA_VERSION = "0004_credential_bound_registration_tokens.sql";
@@ -1 +0,0 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f5f6f8;--panel:#fff;--ink:#19211e;--muted:#66716c;--line:#dfe4e1;--accent:#176b52;--danger:#a83a3a}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}body{background:var(--bg);color:var(--ink);margin:0;font:400 1rem/1.6 ui-sans-serif,system-ui,sans-serif}a{color:var(--accent)}header{border-bottom:1px solid var(--line);background:var(--panel);flex-wrap:wrap;align-items:center;gap:.5rem;padding:.75rem max(1rem,50% - 36rem);display:flex}header a{padding:.4rem;text-decoration:none}.brand{align-items:center;gap:.5rem;margin-right:auto;font-weight:800;display:flex}.brand span{background:var(--accent);color:#fff;border-radius:.55rem;place-items:center;width:2rem;height:2rem;display:grid}main{width:min(72rem,100% - 2rem);margin:auto;padding:3rem 0 6rem}.center{place-items:center;min-height:100vh;padding:1rem;display:grid}.center .panel{width:min(32rem,100%)}h1,h2{line-height:1.2}.lede,.muted,small{color:var(--muted)}.panel,.card{border:1px solid var(--line);background:var(--panel);border-radius:.85rem;padding:1.25rem}.panel{margin-bottom:1rem}.grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,19rem),1fr));gap:1rem;display:grid}.meta{flex-wrap:wrap;gap:.4rem;display:flex}.meta span{background:#e7f4ef;border-radius:999px;padding:.1rem .45rem;font-size:.8rem}.search{gap:.5rem;margin:1rem 0 2rem;display:flex}input{background:var(--panel);width:100%;color:inherit;font:inherit;border:1px solid #b8c2bd;border-radius:.55rem;padding:.7rem}label{margin:1rem 0;font-weight:650;display:block}button,.button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:.55rem;padding:.7rem .95rem;font:600 .9rem system-ui;text-decoration:none;display:inline-flex}button:disabled{opacity:.5}.danger{border-color:var(--danger);color:var(--danger);background:0 0;margin-top:.5rem}.list{padding:0;list-style:none}.list li{border-bottom:1px solid var(--line);padding:.75rem 0}.list small{display:block}.notice{border-left:.3rem solid var(--accent);background:#e7f4ef;padding:.7rem 1rem}.document-body{border:1px solid var(--line);background:var(--panel);color:inherit;font:inherit;white-space:pre-wrap;overflow-wrap:anywhere;border-radius:.85rem;margin:2rem 0;padding:1.25rem;overflow-x:auto}.metadata{gap:.5rem;margin:1.5rem 0;display:grid}.metadata div{grid-template-columns:minmax(7rem,.25fr) 1fr;gap:1rem;display:grid}.metadata dt{color:var(--muted);font-weight:650}.metadata dd{margin:0}@media (prefers-color-scheme:dark){:root{--bg:#111714;--panel:#19201d;--ink:#edf3ef;--muted:#a6b0ab;--line:#2c3732;--accent:#74c9aa;--danger:#ef8585}.meta span,.notice{background:#183a2f}}