@dendelion/paper-camp 0.28.4 → 0.31.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.
Files changed (90) hide show
  1. package/dist/chunks/daemon-state.61FBbbsV.js +332 -0
  2. package/dist/chunks/daemon-state.61FBbbsV.js.map +1 -0
  3. package/dist/chunks/dev-port.DG-T8zNq.js +42 -0
  4. package/dist/chunks/dev-port.DG-T8zNq.js.map +1 -0
  5. package/dist/chunks/{daemon-state.CI9RArUn.js → phase-progress.CazP7K7B.js} +1602 -1801
  6. package/dist/chunks/phase-progress.CazP7K7B.js.map +1 -0
  7. package/dist/cli/index.js +9720 -7854
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/core/daemon-state/daemon-state.d.ts +26 -1
  10. package/dist/core/daemon-state/daemon-state.d.ts.map +1 -1
  11. package/dist/core/desk-discovery/evidence.d.ts +1 -0
  12. package/dist/core/desk-discovery/evidence.d.ts.map +1 -1
  13. package/dist/core/desk-discovery/toolbar-host.d.ts +9 -0
  14. package/dist/core/desk-discovery/toolbar-host.d.ts.map +1 -0
  15. package/dist/core/desk-discovery/toolbar-host.test.d.ts +2 -0
  16. package/dist/core/desk-discovery/toolbar-host.test.d.ts.map +1 -0
  17. package/dist/core/doctor/checks/structural.d.ts.map +1 -1
  18. package/dist/core/doctor/rules.d.ts +5 -0
  19. package/dist/core/doctor/rules.d.ts.map +1 -1
  20. package/dist/core/index.js +147 -133
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/core/machine-registry/machine-registry.d.ts +14 -0
  23. package/dist/core/machine-registry/machine-registry.d.ts.map +1 -1
  24. package/dist/core/night-checks.d.ts +14 -0
  25. package/dist/core/night-checks.d.ts.map +1 -0
  26. package/dist/core/night-checks.test.d.ts +2 -0
  27. package/dist/core/night-checks.test.d.ts.map +1 -0
  28. package/dist/core/night-findings.d.ts +9 -0
  29. package/dist/core/night-findings.d.ts.map +1 -0
  30. package/dist/core/night-findings.test.d.ts +2 -0
  31. package/dist/core/night-findings.test.d.ts.map +1 -0
  32. package/dist/core/night-gate.d.ts +14 -0
  33. package/dist/core/night-gate.d.ts.map +1 -0
  34. package/dist/core/night-gate.test.d.ts +2 -0
  35. package/dist/core/night-gate.test.d.ts.map +1 -0
  36. package/dist/core/night-health.d.ts +21 -0
  37. package/dist/core/night-health.d.ts.map +1 -0
  38. package/dist/core/night-health.test.d.ts +2 -0
  39. package/dist/core/night-health.test.d.ts.map +1 -0
  40. package/dist/core/night-prompts.d.ts +16 -0
  41. package/dist/core/night-prompts.d.ts.map +1 -0
  42. package/dist/core/night-prompts.test.d.ts +2 -0
  43. package/dist/core/night-prompts.test.d.ts.map +1 -0
  44. package/dist/core/night-shift.d.ts +33 -0
  45. package/dist/core/night-shift.d.ts.map +1 -0
  46. package/dist/core/night-shift.test.d.ts +2 -0
  47. package/dist/core/night-shift.test.d.ts.map +1 -0
  48. package/dist/core/night-suggestions.d.ts +14 -0
  49. package/dist/core/night-suggestions.d.ts.map +1 -0
  50. package/dist/core/night-suggestions.test.d.ts +2 -0
  51. package/dist/core/night-suggestions.test.d.ts.map +1 -0
  52. package/dist/core/night-worktree.d.ts +7 -0
  53. package/dist/core/night-worktree.d.ts.map +1 -0
  54. package/dist/core/night-worktree.test.d.ts +2 -0
  55. package/dist/core/night-worktree.test.d.ts.map +1 -0
  56. package/dist/core/parse/schemas.d.ts +68 -0
  57. package/dist/core/parse/schemas.d.ts.map +1 -1
  58. package/dist/core/phase-run.d.ts +1 -1
  59. package/dist/core/phase-run.d.ts.map +1 -1
  60. package/dist/core/registry-version.d.ts +10 -0
  61. package/dist/core/registry-version.d.ts.map +1 -0
  62. package/dist/core/registry-version.test.d.ts +2 -0
  63. package/dist/core/registry-version.test.d.ts.map +1 -0
  64. package/dist/core/stats.d.ts.map +1 -1
  65. package/dist/core/update-token.d.ts +5 -0
  66. package/dist/core/update-token.d.ts.map +1 -0
  67. package/dist/core/update-token.test.d.ts +2 -0
  68. package/dist/core/update-token.test.d.ts.map +1 -0
  69. package/dist/toolbar/toolbar.js +1665 -1608
  70. package/dist/toolbar/toolbar.js.map +1 -1
  71. package/dist/types/index.d.ts +157 -3
  72. package/dist/types/index.d.ts.map +1 -1
  73. package/dist/types/index.js +32 -12
  74. package/dist/types/index.js.map +1 -1
  75. package/dist/vite/daemon-target.d.ts +13 -0
  76. package/dist/vite/daemon-target.d.ts.map +1 -0
  77. package/dist/vite/daemon-target.test.d.ts +2 -0
  78. package/dist/vite/daemon-target.test.d.ts.map +1 -0
  79. package/dist/vite/index.d.ts +1 -1
  80. package/dist/vite/index.d.ts.map +1 -1
  81. package/dist/vite/index.js +40 -63
  82. package/dist/vite/index.js.map +1 -1
  83. package/package.json +1 -1
  84. package/dist/chunks/daemon-state.CI9RArUn.js.map +0 -1
  85. package/dist/chunks/dev-port.BGjGddjm.js +0 -43
  86. package/dist/chunks/dev-port.BGjGddjm.js.map +0 -1
  87. package/dist/vite/proxy.d.ts +0 -10
  88. package/dist/vite/proxy.d.ts.map +0 -1
  89. package/dist/vite/proxy.test.d.ts +0 -2
  90. package/dist/vite/proxy.test.d.ts.map +0 -1
@@ -0,0 +1,13 @@
1
+ export interface DaemonTarget {
2
+ origin: string;
3
+ slug: string;
4
+ }
5
+ /** A root the registry doesn't know, or no daemon actually answering on the
6
+ * resolved port, both mean "toolbar off" — the caller can't tell them apart
7
+ * and doesn't need to, `undefined` covers both. `portOverride` stands in for
8
+ * a daemon started by hand, whose real port `daemon.json` may not reflect.
9
+ * The Vite root of a monorepo app, e.g. `apps/admin`, sits inside its
10
+ * registered project path rather than equalling it, so matching picks the
11
+ * longest containing path in case projects are nested. */
12
+ export declare function resolveDaemonTarget(root: string, portOverride?: number): Promise<DaemonTarget | undefined>;
13
+ //# sourceMappingURL=daemon-target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-target.d.ts","sourceRoot":"","sources":["../../src/vite/daemon-target.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;;;;;0DAM0D;AAC1D,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAYnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=daemon-target.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-target.test.d.ts","sourceRoot":"","sources":["../../src/vite/daemon-target.test.ts"],"names":[],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import { Plugin } from 'vite';
2
- export declare const CAMP_ROUTE = "/paper-camp";
2
+ export declare const TOOLBAR_OFF_MESSAGE = "paper-camp: toolbar off \u2014 run `paper-camp start` and register this repo with `paper-camp init`";
3
3
  export interface PaperCampToolbarOptions {
4
4
  port?: number;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAKlD,eAAO,MAAM,UAAU,gBAAgB,CAAC;AAExC,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CAuCvE;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,MAAM,EAAiB,MAAM,MAAM,CAAC;AAKrE,eAAO,MAAM,mBAAmB,wGACkE,CAAC;AAEnG,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CAoCvE;AAED,eAAe,SAAS,CAAC"}
@@ -1,75 +1,52 @@
1
- import { r as h, a as b } from "../chunks/dev-port.BGjGddjm.js";
2
- import { request as T } from "node:http";
3
- const $ = "paper-camp-toolbar-script", g = "data-route", m = "data-paper-camp-mount";
4
- function C(t) {
5
- return (t == null ? void 0 : t.getAttribute(m)) ?? "";
1
+ import { r as c } from "../chunks/dev-port.DG-T8zNq.js";
2
+ import { resolve as l, sep as u } from "node:path";
3
+ import { n as d, e as f, r as g, b as m } from "../chunks/daemon-state.61FBbbsV.js";
4
+ const h = "paper-camp-toolbar-script", R = "data-route";
5
+ function T(a, t) {
6
+ return t === a || t.startsWith(a + u);
6
7
  }
7
- typeof document > "u" || C(document.getElementById("root"));
8
- function w(t, o) {
9
- return t.replace('<div id="root">', `<div id="root" ${m}="${o}">`);
8
+ async function b(a, t) {
9
+ var e;
10
+ const o = await d(f()), r = l(a), s = o.projects.filter((n) => T(n.path, r)).sort((n, p) => p.path.length - n.path.length)[0];
11
+ if (!s) return;
12
+ const i = t ?? ((e = await g(m())) == null ? void 0 : e.port);
13
+ if (i !== void 0)
14
+ return { origin: `http://localhost:${i}`, slug: s.slug };
10
15
  }
11
- function y(t, o, { port: c, host: n = "127.0.0.1", mount: r = "" }) {
12
- const e = T(
13
- {
14
- host: n,
15
- port: c,
16
- path: t.url ?? "/",
17
- method: t.method,
18
- headers: { ...t.headers, host: `${n}:${c}`, "accept-encoding": "identity" }
19
- },
20
- (a) => {
21
- const i = (a.headers["content-type"] ?? "").includes("text/html");
22
- if (r && i) {
23
- const u = [];
24
- a.on("data", (d) => u.push(d)), a.on("end", () => {
25
- const d = w(Buffer.concat(u).toString("utf-8"), r), { "transfer-encoding": s, ...p } = a.headers;
26
- o.writeHead(a.statusCode ?? 502, {
27
- ...p,
28
- "content-length": String(Buffer.byteLength(d))
29
- }), o.end(d);
30
- });
31
- return;
32
- }
33
- o.writeHead(a.statusCode ?? 502, a.headers), a.pipe(o);
34
- }
35
- );
36
- e.on("error", () => {
37
- o.statusCode = 502, o.end(`paper-camp server is not reachable on port ${c} — run \`paper-camp dev\`.`);
38
- }), t.pipe(e);
39
- }
40
- const l = "/paper-camp";
41
- function A(t = {}) {
42
- let o = t.port, c = !0, n = l;
16
+ const y = "paper-camp: toolbar off — run `paper-camp start` and register this repo with `paper-camp init`";
17
+ function S(a = {}) {
18
+ let t;
43
19
  return {
44
20
  name: "paper-camp-toolbar",
45
21
  apply: "serve",
46
- async configureServer(r) {
47
- o ?? (o = await h(r.config.root) ?? 3333);
48
- const e = await b(r.config.root), a = r.config.mode === "production";
49
- if (c = ((e == null ? void 0 : e.enabled) ?? !0) && (!a || (e == null ? void 0 : e.allowProduction) === !0), n = (e == null ? void 0 : e.route) ?? l, !c) return;
50
- const i = o;
51
- r.middlewares.use((u, d, s) => {
52
- const [p, f] = (u.url ?? "").split("?", 2);
53
- if (p !== n) {
54
- s();
55
- return;
56
- }
57
- d.statusCode = 308, d.setHeader("Location", f ? `${n}/?${f}` : `${n}/`), d.end();
58
- }), r.middlewares.use(n, (u, d) => {
59
- y(u, d, { port: i, mount: n });
60
- });
22
+ async configureServer(o) {
23
+ const r = await c(o.config.root), s = o.config.mode === "production";
24
+ if (!(((r == null ? void 0 : r.enabled) ?? !0) && (!s || (r == null ? void 0 : r.allowProduction) === !0))) return;
25
+ const e = await b(o.config.root, a.port);
26
+ if (!e) {
27
+ console.log(y);
28
+ return;
29
+ }
30
+ const n = `/p/${e.slug}`;
31
+ t = {
32
+ tag: "script",
33
+ attrs: {
34
+ type: "module",
35
+ id: h,
36
+ [R]: n,
37
+ src: `${e.origin}${n}/toolbar.js`
38
+ },
39
+ injectTo: "body"
40
+ };
61
41
  },
62
- transformIndexHtml(r) {
63
- return c ? r.replace(
64
- "</body>",
65
- `<script type="module" id="${$}" ${g}="${n}" src="${n}/toolbar.js"><\/script></body>`
66
- ) : r;
42
+ transformIndexHtml(o) {
43
+ return t ? { html: o, tags: [t] } : o;
67
44
  }
68
45
  };
69
46
  }
70
47
  export {
71
- l as CAMP_ROUTE,
72
- A as default,
73
- A as paperCamp
48
+ y as TOOLBAR_OFF_MESSAGE,
49
+ S as default,
50
+ S as paperCamp
74
51
  };
75
52
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/toolbar/route-attribute.ts","../../src/app/services/mount.ts","../../src/vite/proxy.ts","../../src/vite/index.ts"],"sourcesContent":["export const TOOLBAR_SCRIPT_ID = 'paper-camp-toolbar-script';\nexport const ROUTE_ATTRIBUTE = 'data-route';\n","export const MOUNT_ATTRIBUTE = 'data-paper-camp-mount';\n\nexport function readMountPrefix(\n root: { getAttribute(name: string): string | null } | null,\n): string {\n return root?.getAttribute(MOUNT_ATTRIBUTE) ?? '';\n}\n\nexport const mountPrefix =\n typeof document === 'undefined' ? '' : readMountPrefix(document.getElementById('root'));\n\nexport function injectMountAttribute(html: string, mount: string): string {\n return html.replace('<div id=\"root\">', `<div id=\"root\" ${MOUNT_ATTRIBUTE}=\"${mount}\">`);\n}\n","import { type IncomingMessage, type ServerResponse, request as httpRequest } from 'node:http';\nimport { injectMountAttribute } from '../app/services/mount';\n\nexport { injectMountAttribute };\n\nexport interface ProxyToCampServerOptions {\n port: number;\n host?: string;\n mount?: string;\n}\n\nexport function proxyToCampServer(\n req: IncomingMessage,\n res: ServerResponse,\n { port, host = '127.0.0.1', mount = '' }: ProxyToCampServerOptions,\n): void {\n const proxyReq = httpRequest(\n {\n host,\n port,\n path: req.url ?? '/',\n method: req.method,\n headers: { ...req.headers, host: `${host}:${port}`, 'accept-encoding': 'identity' },\n },\n (proxyRes) => {\n const isHtml = (proxyRes.headers['content-type'] ?? '').includes('text/html');\n if (mount && isHtml) {\n const chunks: Buffer[] = [];\n proxyRes.on('data', (chunk) => chunks.push(chunk));\n proxyRes.on('end', () => {\n const body = injectMountAttribute(Buffer.concat(chunks).toString('utf-8'), mount);\n const { 'transfer-encoding': _te, ...headers } = proxyRes.headers;\n res.writeHead(proxyRes.statusCode ?? 502, {\n ...headers,\n 'content-length': String(Buffer.byteLength(body)),\n });\n res.end(body);\n });\n return;\n }\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n },\n );\n proxyReq.on('error', () => {\n res.statusCode = 502;\n res.end(`paper-camp server is not reachable on port ${port} — run \\`paper-camp dev\\`.`);\n });\n req.pipe(proxyReq);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { readConfigIntegration, readConfigPort } from '../cli/dev-port';\nimport { ROUTE_ATTRIBUTE, TOOLBAR_SCRIPT_ID } from '../toolbar/route-attribute';\nimport { proxyToCampServer } from './proxy';\n\nexport const CAMP_ROUTE = '/paper-camp';\n\nexport interface PaperCampToolbarOptions {\n port?: number;\n}\n\nexport function paperCamp(options: PaperCampToolbarOptions = {}): Plugin {\n let resolvedPort = options.port;\n let enabled = true;\n let route = CAMP_ROUTE;\n\n return {\n name: 'paper-camp-toolbar',\n apply: 'serve',\n async configureServer(server: ViteDevServer) {\n resolvedPort ??= (await readConfigPort(server.config.root)) ?? 3333;\n const integration = await readConfigIntegration(server.config.root);\n const isProduction = server.config.mode === 'production';\n enabled =\n (integration?.enabled ?? true) && (!isProduction || integration?.allowProduction === true);\n route = integration?.route ?? CAMP_ROUTE;\n if (!enabled) return;\n const port = resolvedPort;\n server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const [path, query] = (req.url ?? '').split('?', 2);\n if (path !== route) {\n next();\n return;\n }\n res.statusCode = 308;\n res.setHeader('Location', query ? `${route}/?${query}` : `${route}/`);\n res.end();\n });\n server.middlewares.use(route, (req: IncomingMessage, res: ServerResponse) => {\n proxyToCampServer(req, res, { port, mount: route });\n });\n },\n transformIndexHtml(html: string) {\n if (!enabled) return html;\n return html.replace(\n '</body>',\n `<script type=\"module\" id=\"${TOOLBAR_SCRIPT_ID}\" ${ROUTE_ATTRIBUTE}=\"${route}\" src=\"${route}/toolbar.js\"></script></body>`,\n );\n },\n };\n}\n\nexport default paperCamp;\n"],"names":["TOOLBAR_SCRIPT_ID","ROUTE_ATTRIBUTE","MOUNT_ATTRIBUTE","readMountPrefix","root","injectMountAttribute","html","mount","proxyToCampServer","req","res","port","host","proxyReq","httpRequest","proxyRes","isHtml","chunks","chunk","body","_te","headers","CAMP_ROUTE","paperCamp","options","resolvedPort","enabled","route","server","readConfigPort","integration","readConfigIntegration","isProduction","next","path","query"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/toolbar/route-attribute.ts","../../src/vite/daemon-target.ts","../../src/vite/index.ts"],"sourcesContent":["export const TOOLBAR_SCRIPT_ID = 'paper-camp-toolbar-script';\nexport const ROUTE_ATTRIBUTE = 'data-route';\n\nexport function scriptOrigin(script: { src: string } | null | undefined): string | undefined {\n if (!script?.src) return undefined;\n try {\n return new URL(script.src).origin;\n } catch {\n return undefined;\n }\n}\n","import { resolve, sep } from 'node:path';\nimport { daemonStatePath, readRunningDaemonState } from '../core/daemon-state';\nimport { defaultRegistryPath, loadRegistry } from '../core/machine-registry';\n\nexport interface DaemonTarget {\n origin: string;\n slug: string;\n}\n\nfunction containsRoot(projectPath: string, root: string): boolean {\n return root === projectPath || root.startsWith(projectPath + sep);\n}\n\n/** A root the registry doesn't know, or no daemon actually answering on the\n * resolved port, both mean \"toolbar off\" — the caller can't tell them apart\n * and doesn't need to, `undefined` covers both. `portOverride` stands in for\n * a daemon started by hand, whose real port `daemon.json` may not reflect.\n * The Vite root of a monorepo app, e.g. `apps/admin`, sits inside its\n * registered project path rather than equalling it, so matching picks the\n * longest containing path in case projects are nested. */\nexport async function resolveDaemonTarget(\n root: string,\n portOverride?: number,\n): Promise<DaemonTarget | undefined> {\n const registry = await loadRegistry(defaultRegistryPath());\n const resolvedRoot = resolve(root);\n const project = registry.projects\n .filter((candidate) => containsRoot(candidate.path, resolvedRoot))\n .sort((a, b) => b.path.length - a.path.length)[0];\n if (!project) return undefined;\n\n const port = portOverride ?? (await readRunningDaemonState(daemonStatePath()))?.port;\n if (port === undefined) return undefined;\n\n return { origin: `http://localhost:${port}`, slug: project.slug };\n}\n","import type { HtmlTagDescriptor, Plugin, ViteDevServer } from 'vite';\nimport { readConfigIntegration } from '../cli/dev-port';\nimport { ROUTE_ATTRIBUTE, TOOLBAR_SCRIPT_ID } from '../toolbar/route-attribute';\nimport { resolveDaemonTarget } from './daemon-target';\n\nexport const TOOLBAR_OFF_MESSAGE =\n 'paper-camp: toolbar off — run `paper-camp start` and register this repo with `paper-camp init`';\n\nexport interface PaperCampToolbarOptions {\n port?: number;\n}\n\nexport function paperCamp(options: PaperCampToolbarOptions = {}): Plugin {\n let scriptTag: HtmlTagDescriptor | undefined;\n\n return {\n name: 'paper-camp-toolbar',\n apply: 'serve',\n async configureServer(server: ViteDevServer) {\n const integration = await readConfigIntegration(server.config.root);\n const isProduction = server.config.mode === 'production';\n const enabled =\n (integration?.enabled ?? true) && (!isProduction || integration?.allowProduction === true);\n if (!enabled) return;\n\n const target = await resolveDaemonTarget(server.config.root, options.port);\n if (!target) {\n console.log(TOOLBAR_OFF_MESSAGE);\n return;\n }\n\n const mount = `/p/${target.slug}`;\n scriptTag = {\n tag: 'script',\n attrs: {\n type: 'module',\n id: TOOLBAR_SCRIPT_ID,\n [ROUTE_ATTRIBUTE]: mount,\n src: `${target.origin}${mount}/toolbar.js`,\n },\n injectTo: 'body',\n };\n },\n transformIndexHtml(html: string) {\n if (!scriptTag) return html;\n return { html, tags: [scriptTag] };\n },\n };\n}\n\nexport default paperCamp;\n"],"names":["TOOLBAR_SCRIPT_ID","ROUTE_ATTRIBUTE","containsRoot","projectPath","root","sep","resolveDaemonTarget","portOverride","registry","loadRegistry","defaultRegistryPath","resolvedRoot","resolve","project","candidate","a","b","port","_a","readRunningDaemonState","daemonStatePath","TOOLBAR_OFF_MESSAGE","paperCamp","options","scriptTag","server","integration","readConfigIntegration","isProduction","target","mount","html"],"mappings":";;;AAAO,MAAMA,IAAoB,6BACpBC,IAAkB;ACQ/B,SAASC,EAAaC,GAAqBC,GAAuB;AAChE,SAAOA,MAASD,KAAeC,EAAK,WAAWD,IAAcE,CAAG;AAClE;AASA,eAAsBC,EACpBF,GACAG,GACmC;;AACnC,QAAMC,IAAW,MAAMC,EAAaC,GAAqB,GACnDC,IAAeC,EAAQR,CAAI,GAC3BS,IAAUL,EAAS,SACtB,OAAO,CAACM,MAAcZ,EAAaY,EAAU,MAAMH,CAAY,CAAC,EAChE,KAAK,CAACI,GAAGC,MAAMA,EAAE,KAAK,SAASD,EAAE,KAAK,MAAM,EAAE,CAAC;AAClD,MAAI,CAACF,EAAS;AAEd,QAAMI,IAAOV,OAAiBW,IAAA,MAAMC,EAAuBC,EAAA,CAAiB,MAA9C,gBAAAF,EAAkD;AAChF,MAAID,MAAS;AAEb,WAAO,EAAE,QAAQ,oBAAoBA,CAAI,IAAI,MAAMJ,EAAQ,KAAA;AAC7D;AC9BO,MAAMQ,IACX;AAMK,SAASC,EAAUC,IAAmC,IAAY;AACvE,MAAIC;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,gBAAgBC,GAAuB;AAC3C,YAAMC,IAAc,MAAMC,EAAsBF,EAAO,OAAO,IAAI,GAC5DG,IAAeH,EAAO,OAAO,SAAS;AAG5C,UAAI,IADDC,KAAA,gBAAAA,EAAa,YAAW,QAAU,CAACE,MAAgBF,KAAA,gBAAAA,EAAa,qBAAoB,KACzE;AAEd,YAAMG,IAAS,MAAMvB,EAAoBmB,EAAO,OAAO,MAAMF,EAAQ,IAAI;AACzE,UAAI,CAACM,GAAQ;AACX,gBAAQ,IAAIR,CAAmB;AAC/B;AAAA,MACF;AAEA,YAAMS,IAAQ,MAAMD,EAAO,IAAI;AAC/B,MAAAL,IAAY;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAIxB;AAAA,UACJ,CAACC,CAAe,GAAG6B;AAAA,UACnB,KAAK,GAAGD,EAAO,MAAM,GAAGC,CAAK;AAAA,QAAA;AAAA,QAE/B,UAAU;AAAA,MAAA;AAAA,IAEd;AAAA,IACA,mBAAmBC,GAAc;AAC/B,aAAKP,IACE,EAAE,MAAAO,GAAM,MAAM,CAACP,CAAS,EAAA,IADRO;AAAA,IAEzB;AAAA,EAAA;AAEJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dendelion/paper-camp",
3
- "version": "0.28.4",
3
+ "version": "0.31.1",
4
4
  "description": "Local-first, AI-native project management with retro aesthetics",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.12.1",