okno 1.0.0-beta.6 → 1.0.0-beta.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.
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,KAAK,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;AAEpE,UAAU,QAAQ;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oFAAoF;IACpF,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CACzB;AAiBD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0B5C;AAED;;;mEAGmE;AACnE,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA8BrD;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAA;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAwB,GAAG,OAAO,CAmB7E;AA2FD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAgB/E;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA8F7C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAkBA,KAAK,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;AAEpE,UAAU,QAAQ;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oFAAoF;IACpF,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CACzB;AAiBD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0B5C;AAED;;;mEAGmE;AACnE,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA8BrD;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAA;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAwB,GAAG,OAAO,CAmB7E;AA2FD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAgB/E;AA4CD,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAgH7C"}
package/dist/init.js CHANGED
@@ -1,58 +1,59 @@
1
- import { existsSync as f, readFileSync as h, writeFileSync as l, mkdirSync as k } from "node:fs";
2
- import { join as s, dirname as v } from "node:path";
3
- import { fileURLToPath as S } from "node:url";
4
- const u = {
1
+ import { existsSync as c, readFileSync as k, writeFileSync as p, mkdirSync as g } from "node:fs";
2
+ import { join as i, dirname as v } from "node:path";
3
+ import { fileURLToPath as y } from "node:url";
4
+ import { spawnSync as S } from "node:child_process";
5
+ const f = {
5
6
  astro: ["astro.config.mjs", "astro.config.ts", "astro.config.js"],
6
7
  sveltekit: ["vite.config.ts", "vite.config.js"],
7
8
  nuxt: ["nuxt.config.ts", "nuxt.config.js"],
8
9
  vite: ["vite.config.ts", "vite.config.js", "vite.config.mjs"]
9
10
  };
10
- function p(n, e) {
11
- for (const t of e) {
12
- const o = s(n, t);
13
- if (f(o)) return o;
11
+ function m(t, e) {
12
+ for (const n of e) {
13
+ const o = i(t, n);
14
+ if (c(o)) return o;
14
15
  }
15
16
  return null;
16
17
  }
17
- function b(n) {
18
- const e = s(n, "package.json"), t = {};
19
- if (f(e))
18
+ function x(t) {
19
+ const e = i(t, "package.json"), n = {};
20
+ if (c(e))
20
21
  try {
21
- const i = JSON.parse(h(e, "utf-8"));
22
- Object.assign(t, i.dependencies, i.devDependencies);
22
+ const r = JSON.parse(k(e, "utf-8"));
23
+ Object.assign(n, r.dependencies, r.devDependencies);
23
24
  } catch {
24
25
  }
25
- const o = (i) => i in t;
26
- return o("astro") || p(n, u.astro) ? { framework: "astro", configPath: p(n, u.astro), pluginsAt: "vite" } : o("nuxt") ? { framework: "nuxt", configPath: p(n, u.nuxt), pluginsAt: "vite" } : o("@sveltejs/kit") ? { framework: "sveltekit", configPath: p(n, u.vite), pluginsAt: "top" } : o("vite") ? { framework: "vite", configPath: p(n, u.vite), pluginsAt: "top" } : { framework: "unknown", configPath: null, pluginsAt: "top" };
26
+ const o = (r) => r in n;
27
+ return o("astro") || m(t, f.astro) ? { framework: "astro", configPath: m(t, f.astro), pluginsAt: "vite" } : o("nuxt") ? { framework: "nuxt", configPath: m(t, f.nuxt), pluginsAt: "vite" } : o("@sveltejs/kit") ? { framework: "sveltekit", configPath: m(t, f.vite), pluginsAt: "top" } : o("vite") ? { framework: "vite", configPath: m(t, f.vite), pluginsAt: "top" } : { framework: "unknown", configPath: null, pluginsAt: "top" };
27
28
  }
28
- function x(n) {
29
- let e = h(n, "utf-8");
29
+ function A(t) {
30
+ let e = k(t, "utf-8");
30
31
  if (/from\s*["']okno\/vite["']/.test(e)) return !0;
31
- const t = e.match(/\bplugins\s*:\s*\[/);
32
- if (!t || t.index === void 0) return !1;
33
- const o = t.index + t[0].length, i = e.slice(o);
34
- let m;
35
- const a = i.match(/^[^\S\n]*\n(\s*)/);
36
- a ? m = `
37
- ${a[1]}okno(),` : i.trimStart().startsWith("]") ? m = "okno()" : m = "okno(), ", e = e.slice(0, o) + m + e.slice(o);
38
- const d = 'import { okno } from "okno/vite"', r = [...e.matchAll(/^import .*$/gm)];
39
- if (r.length) {
40
- const c = r[r.length - 1], g = c.index + c[0].length;
41
- e = e.slice(0, g) + `
42
- ` + d + e.slice(g);
32
+ const n = e.match(/\bplugins\s*:\s*\[/);
33
+ if (!n || n.index === void 0) return !1;
34
+ const o = n.index + n[0].length, r = e.slice(o);
35
+ let l;
36
+ const a = r.match(/^[^\S\n]*\n(\s*)/);
37
+ a ? l = `
38
+ ${a[1]}okno(),` : r.trimStart().startsWith("]") ? l = "okno()" : l = "okno(), ", e = e.slice(0, o) + l + e.slice(o);
39
+ const d = 'import { okno } from "okno/vite"', s = [...e.matchAll(/^import .*$/gm)];
40
+ if (s.length) {
41
+ const u = s[s.length - 1], h = u.index + u[0].length;
42
+ e = e.slice(0, h) + `
43
+ ` + d + e.slice(h);
43
44
  } else
44
45
  e = d + `
45
46
  ` + e;
46
- return l(n, e), !0;
47
+ return p(t, e), !0;
47
48
  }
48
- function A(n, e = "starter") {
49
- const t = s(n, "okno"), o = s(t, "schema.ts");
50
- return f(o) ? !1 : (k(t, { recursive: !0 }), e === "empty" ? (l(o, C), !0) : (k(s(t, "pages"), { recursive: !0 }), k(s(t, "globals"), { recursive: !0 }), l(o, j), l(s(t, "pages", "home.ts"), w), l(s(t, "globals", "meta.ts"), E), l(s(t, "globals", "navbar.ts"), R), l(s(t, "globals", "footer.ts"), T), !0));
49
+ function C(t, e = "starter") {
50
+ const n = i(t, "okno"), o = i(n, "schema.ts");
51
+ return c(o) ? !1 : (g(n, { recursive: !0 }), e === "empty" ? (p(o, j), !0) : (g(i(n, "pages"), { recursive: !0 }), g(i(n, "globals"), { recursive: !0 }), p(o, w), p(i(n, "pages", "home.ts"), E), p(i(n, "globals", "meta.ts"), P), p(i(n, "globals", "navbar.ts"), R), p(i(n, "globals", "footer.ts"), T), !0));
51
52
  }
52
- const C = `import type { Schema } from "okno"
53
+ const j = `import type { Schema } from "okno"
53
54
 
54
55
  export default {} satisfies Schema
55
- `, j = `import type { Schema } from "okno"
56
+ `, w = `import type { Schema } from "okno"
56
57
 
57
58
  export default {
58
59
  pages: {
@@ -102,13 +103,13 @@ export default {
102
103
  },
103
104
  },
104
105
  } satisfies Schema
105
- `, w = `export default {
106
+ `, E = `export default {
106
107
  headline: "Hello from okno",
107
108
  subhead: "Edit this on the page — press “e” or visit ?okno.",
108
109
  body: "<p>This is your home page. Everything here is content in your repo.</p>",
109
110
  image: null,
110
111
  }
111
- `, E = `export default {
112
+ `, P = `export default {
112
113
  title: "My okno site",
113
114
  description: "Built with okno — a Git-backed CMS with live editing.",
114
115
  shareImage: null,
@@ -127,29 +128,52 @@ export default {
127
128
  links: [{ link: { text: "Home", url: "/", external: false } }],
128
129
  }
129
130
  `;
130
- function P(n) {
131
- const e = v(S(import.meta.url)), t = s(e, "..", "skills", "connect-okno", "SKILL.md");
132
- if (!f(t)) return null;
133
- const o = s(".claude", "skills", "connect-okno", "SKILL.md"), i = s(n, o);
134
- return f(i) ? null : (k(v(i), { recursive: !0 }), l(i, h(t, "utf-8")), o);
131
+ function M(t) {
132
+ const e = v(y(import.meta.url)), n = i(e, "..", "skills", "connect-okno", "SKILL.md");
133
+ if (!c(n)) return null;
134
+ const o = i(".claude", "skills", "connect-okno", "SKILL.md"), r = i(t, o);
135
+ return c(r) ? null : (g(v(r), { recursive: !0 }), p(r, k(n, "utf-8")), o);
135
136
  }
136
- function M(n, e) {
137
- const t = e === "claude" ? ".mcp.json" : s(".cursor", "mcp.json"), o = s(n, t);
138
- let i = { mcpServers: {} };
139
- if (f(o))
137
+ function O(t, e) {
138
+ const n = e === "claude" ? ".mcp.json" : i(".cursor", "mcp.json"), o = i(t, n);
139
+ let r = { mcpServers: {} };
140
+ if (c(o))
140
141
  try {
141
- i = JSON.parse(h(o, "utf-8"));
142
+ r = JSON.parse(k(o, "utf-8"));
142
143
  } catch {
143
144
  }
144
- return i.mcpServers ??= {}, i.mcpServers.okno = { command: "npx", args: ["okno", "mcp"] }, k(s(o, ".."), { recursive: !0 }), l(o, JSON.stringify(i, null, 2) + `
145
- `), t;
145
+ return r.mcpServers ??= {}, r.mcpServers.okno = { command: "npx", args: ["okno", "mcp"] }, g(i(o, ".."), { recursive: !0 }), p(o, JSON.stringify(r, null, 2) + `
146
+ `), n;
147
+ }
148
+ function N(t) {
149
+ return c(i(t, "bun.lock")) || c(i(t, "bun.lockb")) ? "bun" : c(i(t, "pnpm-lock.yaml")) ? "pnpm" : c(i(t, "yarn.lock")) ? "yarn" : "npm";
150
+ }
151
+ function $() {
152
+ try {
153
+ const t = v(y(import.meta.url));
154
+ return JSON.parse(k(i(t, "..", "package.json"), "utf-8")).version ?? "";
155
+ } catch {
156
+ return "";
157
+ }
146
158
  }
147
- async function H() {
148
- const n = process.cwd(), e = await import("@clack/prompts");
159
+ function I(t) {
160
+ try {
161
+ const e = JSON.parse(k(i(t, "package.json"), "utf-8"));
162
+ return !!(e.dependencies?.okno || e.devDependencies?.okno);
163
+ } catch {
164
+ return !1;
165
+ }
166
+ }
167
+ function H(t, e) {
168
+ const n = $(), o = n ? `okno@${n}` : "okno", r = e === "npm" ? ["install", o] : ["add", o], l = `${e} ${r.join(" ")}`;
169
+ return S(e, r, { cwd: t, stdio: "inherit", shell: process.platform === "win32" }).status === 0 ? l : null;
170
+ }
171
+ async function V() {
172
+ const t = process.cwd(), e = await import("@clack/prompts");
149
173
  e.intro("okno init");
150
- let t = b(n);
151
- if (t.framework === "unknown") {
152
- const r = await e.select({
174
+ let n = x(t);
175
+ if (n.framework === "unknown") {
176
+ const s = await e.select({
153
177
  message: "Which framework is this project?",
154
178
  options: [
155
179
  { value: "astro", label: "Astro" },
@@ -158,23 +182,13 @@ async function H() {
158
182
  { value: "nuxt", label: "Nuxt" }
159
183
  ]
160
184
  });
161
- if (e.isCancel(r)) return e.cancel("Cancelled.");
162
- const c = r, g = c === "astro" || c === "nuxt" ? "vite" : "top", y = u[c] ?? u.vite;
163
- t = { framework: c, configPath: p(n, y), pluginsAt: g };
185
+ if (e.isCancel(s)) return e.cancel("Cancelled.");
186
+ const u = s, h = u === "astro" || u === "nuxt" ? "vite" : "top", b = f[u] ?? f.vite;
187
+ n = { framework: u, configPath: m(t, b), pluginsAt: h };
164
188
  }
165
- const o = await e.select({
166
- message: "Set up the okno MCP server for your AI editor?",
167
- options: [
168
- { value: "claude", label: "Claude Code", hint: ".mcp.json + connect-okno skill" },
169
- { value: "cursor", label: "Cursor", hint: ".cursor/mcp.json" },
170
- { value: "skip", label: "Skip", hint: "no AI editor" }
171
- ],
172
- initialValue: "claude"
173
- });
174
- if (e.isCancel(o)) return e.cancel("Cancelled.");
175
- let i = "starter";
176
- if (!f(s(n, "okno", "schema.ts"))) {
177
- const r = await e.select({
189
+ let o = "starter";
190
+ if (!c(i(t, "okno", "schema.ts"))) {
191
+ const s = await e.select({
178
192
  message: "Scaffold a Starter, or an empty schema?",
179
193
  options: [
180
194
  { value: "starter", label: "Starter", hint: "Home + Meta/Navbar/Footer globals, ready to edit" },
@@ -182,40 +196,60 @@ async function H() {
182
196
  ],
183
197
  initialValue: "starter"
184
198
  });
185
- if (e.isCancel(r)) return e.cancel("Cancelled.");
186
- i = r;
199
+ if (e.isCancel(s)) return e.cancel("Cancelled.");
200
+ o = s;
187
201
  }
202
+ const l = await e.select({
203
+ message: "Set up the okno MCP server for your AI editor? (optional)",
204
+ options: [
205
+ { value: "skip", label: "Skip", hint: "default — add later with `okno mcp`" },
206
+ { value: "claude", label: "Claude Code", hint: ".mcp.json + connect-okno skill" },
207
+ { value: "cursor", label: "Cursor", hint: ".cursor/mcp.json" }
208
+ ],
209
+ initialValue: "skip"
210
+ });
211
+ if (e.isCancel(l)) return e.cancel("Cancelled.");
188
212
  const a = [];
213
+ if (I(t))
214
+ a.push("• okno already a dependency — skipped install");
215
+ else {
216
+ const s = N(t);
217
+ e.log.step(`Installing okno with ${s}…`);
218
+ const u = H(t, s);
219
+ a.push(
220
+ u ? `✓ Installed okno (${u})` : `! Couldn't install okno automatically — run \`${s === "npm" ? "npm install" : `${s} add`} okno\` yourself`
221
+ );
222
+ }
189
223
  let d = !1;
190
- if (t.configPath && (d = x(t.configPath)), d)
191
- a.push(`✓ Added okno() to ${t.configPath.replace(n + "/", "")}`);
224
+ if (n.configPath && (d = A(n.configPath)), d)
225
+ a.push(`✓ Added okno() to ${n.configPath.replace(t + "/", "")}`);
192
226
  else {
193
- const r = t.pluginsAt === "vite" ? `import { okno } from "okno/vite"
227
+ const s = n.pluginsAt === "vite" ? `import { okno } from "okno/vite"
194
228
  // inside defineConfig:
195
229
  // vite: { plugins: [okno()] }` : `import { okno } from "okno/vite"
196
230
  // inside defineConfig:
197
231
  // plugins: [okno()]`;
198
232
  a.push(`! Couldn't edit your config automatically — add okno() yourself:
199
- ${r}`);
233
+ ${s}`);
200
234
  }
201
- if (A(n, i) ? a.push(
202
- i === "starter" ? "✓ Scaffolded the okno Starter (Home + Meta/Navbar/Footer globals)" : "✓ Scaffolded an empty okno/ (schema only — nothing else)"
203
- ) : a.push("• okno/ already exists — left it alone"), o !== "skip") {
204
- const r = M(n, o);
205
- a.push(`✓ Registered the okno MCP server in ${r}`);
235
+ if (C(t, o) ? a.push(
236
+ o === "starter" ? "✓ Scaffolded the okno Starter (Home + Meta/Navbar/Footer globals)" : "✓ Scaffolded an empty okno/ (schema only — nothing else)"
237
+ ) : a.push("• okno/ already exists — left it alone"), l !== "skip") {
238
+ const s = O(t, l);
239
+ a.push(`✓ Registered the okno MCP server in ${s}`);
206
240
  }
207
- if (o === "claude") {
208
- const r = P(n);
209
- r && a.push(`✓ Installed the connect-okno skill in ${r}`);
241
+ if (l === "claude") {
242
+ const s = M(t);
243
+ s && a.push(`✓ Installed the connect-okno skill in ${s}`);
210
244
  }
211
245
  e.note(a.join(`
212
246
  `), "Done"), e.outro("Run your dev server and press “e” (or visit ?okno) to open the editor.");
213
247
  }
214
248
  export {
215
- x as addPlugin,
216
- b as detect,
217
- H as runInit,
218
- A as scaffold,
219
- M as writeMcpConfig,
220
- P as writeSkill
249
+ A as addPlugin,
250
+ x as detect,
251
+ V as runInit,
252
+ C as scaffold,
253
+ O as writeMcpConfig,
254
+ M as writeSkill
221
255
  };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "okno",
3
3
  "description": "Git-backed CMS with live editing for any Vite framework",
4
4
  "author": "Gabriel Uhlíř",
5
- "version": "1.0.0-beta.6",
5
+ "version": "1.0.0-beta.7",
6
6
  "homepage": "https://okno.build",
7
7
  "type": "module",
8
8
  "types": "./dist/index.d.ts",