octocms 0.4.5 → 0.4.8

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 (46) hide show
  1. package/dist/admin/query/QueryProvider.d.ts +14 -4
  2. package/dist/admin/query/QueryProvider.d.ts.map +1 -1
  3. package/dist/admin/query/QueryProvider.js +2 -17
  4. package/dist/admin/query/QueryProvider.js.map +1 -1
  5. package/dist/{agentDocs-BKJBT3HN.js → agentDocs-W6CQBLWC.js} +2 -2
  6. package/dist/{chunk-SIXGLITH.js → chunk-AQACHV5O.js} +42 -32
  7. package/dist/chunk-AQACHV5O.js.map +1 -0
  8. package/dist/chunk-YQQT73XR.js +7 -0
  9. package/dist/chunk-YQQT73XR.js.map +1 -0
  10. package/dist/cli/index.js +6 -6
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/lib/agentDocs.js +376 -0
  13. package/dist/cli/lib/agentDocs.js.map +1 -0
  14. package/dist/cli/lib/codegen.js +343 -0
  15. package/dist/cli/lib/codegen.js.map +1 -0
  16. package/dist/cli/lib/contentValidator.js +230 -0
  17. package/dist/cli/lib/contentValidator.js.map +1 -0
  18. package/dist/cli/lib/logger.js +34 -0
  19. package/dist/cli/lib/logger.js.map +1 -0
  20. package/dist/cli/lib/project.js +87 -0
  21. package/dist/cli/lib/project.js.map +1 -0
  22. package/dist/cli/lib/schemaDocs.js +105 -0
  23. package/dist/cli/lib/schemaDocs.js.map +1 -0
  24. package/dist/cli/lib/templates.js +379 -0
  25. package/dist/cli/lib/templates.js.map +1 -0
  26. package/dist/cli/lib/validateConfig.js +122 -0
  27. package/dist/cli/lib/validateConfig.js.map +1 -0
  28. package/dist/config.cjs +38 -1
  29. package/dist/config.cjs.map +1 -1
  30. package/dist/index.cjs +33 -9
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/{init-ESHPKWKN.js → init-62DCMFY2.js} +45 -20
  33. package/dist/init-62DCMFY2.js.map +1 -0
  34. package/dist/{update-YDXCLS6L.js → update-RWXTBSDH.js} +11 -37
  35. package/dist/update-RWXTBSDH.js.map +1 -0
  36. package/dist/withOctoCMS.cjs +36 -1
  37. package/dist/withOctoCMS.cjs.map +1 -1
  38. package/dist/withOctoCMS.d.ts +11 -0
  39. package/dist/withOctoCMS.d.ts.map +1 -1
  40. package/dist/withOctoCMS.js +24 -1
  41. package/dist/withOctoCMS.js.map +1 -1
  42. package/package.json +1 -6
  43. package/dist/chunk-SIXGLITH.js.map +0 -1
  44. package/dist/init-ESHPKWKN.js.map +0 -1
  45. package/dist/update-YDXCLS6L.js.map +0 -1
  46. /package/dist/{agentDocs-BKJBT3HN.js.map → agentDocs-W6CQBLWC.js.map} +0 -0
@@ -1,9 +1,19 @@
1
1
  import React from 'react';
2
2
  /**
3
- * Wraps the admin tree in a `QueryClientProvider` and lazily mounts
4
- * `@tanstack/react-query-devtools` in development. Devtools is an optional
5
- * peer dep if it's not installed the dynamic import simply rejects and the
6
- * provider keeps working.
3
+ * Wraps the admin tree in a `QueryClientProvider`.
4
+ *
5
+ * `@tanstack/react-query-devtools` is intentionally NOT loaded here.
6
+ * Browser ESM cannot resolve bare specifiers at runtime, so any "auto-detect
7
+ * if installed" pattern requires either bundler resolution (which fails the
8
+ * build when the dep is absent) or magic comments / `new Function` (which
9
+ * silence the bundler but then fail in the browser). Both create more
10
+ * problems than they solve.
11
+ *
12
+ * Consumers who want devtools install `@tanstack/react-query-devtools` and
13
+ * mount `<ReactQueryDevtools />` themselves alongside their admin tree —
14
+ * see [docs/getting-started.md](../../../docs/getting-started.md) for the
15
+ * three-line wrapper pattern. The OctoCMS dev repo does this in
16
+ * `src/app/cms/[[...path]]/page.tsx`.
7
17
  */
8
18
  export declare function QueryProvider({ children }: {
9
19
  children: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"QueryProvider.d.ts","sourceRoot":"","sources":["../../../admin/query/QueryProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA6BxE"}
1
+ {"version":3,"file":"QueryProvider.d.ts","sourceRoot":"","sources":["../../../admin/query/QueryProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAQxE"}
@@ -1,31 +1,16 @@
1
1
  "use client";
2
2
  import "../../chunk-B5LE2OEC.js";
3
- import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { jsx } from "react/jsx-runtime";
4
4
  import { useEffect, useState } from "react";
5
5
  import { QueryClientProvider } from "@tanstack/react-query";
6
6
  import { attachCrossTabInvalidationListener } from "./invalidate";
7
7
  import { getQueryClient } from "./queryClient";
8
8
  function QueryProvider({ children }) {
9
9
  const [client] = useState(() => getQueryClient());
10
- const [Devtools, setDevtools] = useState(null);
11
10
  useEffect(() => {
12
11
  return attachCrossTabInvalidationListener(client);
13
12
  }, [client]);
14
- useEffect(() => {
15
- if (process.env.NODE_ENV === "production") return;
16
- let cancelled = false;
17
- import("@tanstack/react-query-devtools").then((m) => {
18
- if (!cancelled) setDevtools(() => m.ReactQueryDevtools);
19
- }).catch(() => {
20
- });
21
- return () => {
22
- cancelled = true;
23
- };
24
- }, []);
25
- return /* @__PURE__ */ jsxs(QueryClientProvider, { client, children: [
26
- children,
27
- Devtools ? /* @__PURE__ */ jsx(Devtools, { initialIsOpen: false }) : null
28
- ] });
13
+ return /* @__PURE__ */ jsx(QueryClientProvider, { client, children });
29
14
  }
30
15
  export {
31
16
  QueryProvider
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../admin/query/QueryProvider.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { attachCrossTabInvalidationListener } from './invalidate';\nimport { getQueryClient } from './queryClient';\n\n/**\n * Wraps the admin tree in a `QueryClientProvider` and lazily mounts\n * `@tanstack/react-query-devtools` in development. Devtools is an optional\n * peer dep if it's not installed the dynamic import simply rejects and the\n * provider keeps working.\n */\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => getQueryClient());\n const [Devtools, setDevtools] = useState<React.ComponentType<{ initialIsOpen?: boolean }> | null>(null);\n\n useEffect(() => {\n return attachCrossTabInvalidationListener(client);\n }, [client]);\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n let cancelled = false;\n import('@tanstack/react-query-devtools')\n .then((m) => {\n if (!cancelled) setDevtools(() => m.ReactQueryDevtools);\n })\n .catch(() => {\n // Optional peer dep absent silently skip.\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n return (\n <QueryClientProvider client={client}>\n {children}\n {Devtools ? <Devtools initialIsOpen={false} /> : null}\n </QueryClientProvider>\n );\n}\n"],"mappings":";;AAsCI,SAEc,KAFd;AApCJ,SAAgB,WAAW,gBAAgB;AAC3C,SAAS,2BAA2B;AAEpC,SAAS,0CAA0C;AACnD,SAAS,sBAAsB;AAQxB,SAAS,cAAc,EAAE,SAAS,GAAkC;AACzE,QAAM,CAAC,MAAM,IAAI,SAAS,MAAM,eAAe,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAkE,IAAI;AAEtG,YAAU,MAAM;AACd,WAAO,mCAAmC,MAAM;AAAA,EAClD,GAAG,CAAC,MAAM,CAAC;AAEX,YAAU,MAAM;AACd,QAAI,QAAQ,IAAI,aAAa,aAAc;AAC3C,QAAI,YAAY;AAChB,WAAO,gCAAgC,EACpC,KAAK,CAAC,MAAM;AACX,UAAI,CAAC,UAAW,aAAY,MAAM,EAAE,kBAAkB;AAAA,IACxD,CAAC,EACA,MAAM,MAAM;AAAA,IAEb,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,qBAAC,uBAAoB,QAClB;AAAA;AAAA,IACA,WAAW,oBAAC,YAAS,eAAe,OAAO,IAAK;AAAA,KACnD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../admin/query/QueryProvider.tsx"],"sourcesContent":["'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { attachCrossTabInvalidationListener } from './invalidate';\nimport { getQueryClient } from './queryClient';\n\n/**\n * Wraps the admin tree in a `QueryClientProvider`.\n *\n * `@tanstack/react-query-devtools` is intentionally NOT loaded here.\n * Browser ESM cannot resolve bare specifiers at runtime, so any \"auto-detect\n * if installed\" pattern requires either bundler resolution (which fails the\n * build when the dep is absent) or magic comments / `new Function` (which\n * silence the bundler but then fail in the browser). Both create more\n * problems than they solve.\n *\n * Consumers who want devtools install `@tanstack/react-query-devtools` and\n * mount `<ReactQueryDevtools />` themselves alongside their admin tree —\n * see [docs/getting-started.md](../../../docs/getting-started.md) for the\n * three-line wrapper pattern. The OctoCMS dev repo does this in\n * `src/app/cms/[[...path]]/page.tsx`.\n */\nexport function QueryProvider({ children }: { children: React.ReactNode }) {\n const [client] = useState(() => getQueryClient());\n\n useEffect(() => {\n return attachCrossTabInvalidationListener(client);\n }, [client]);\n\n return <QueryClientProvider client={client}>{children}</QueryClientProvider>;\n}\n"],"mappings":";;AA+BS;AA7BT,SAAgB,WAAW,gBAAgB;AAC3C,SAAS,2BAA2B;AAEpC,SAAS,0CAA0C;AACnD,SAAS,sBAAsB;AAkBxB,SAAS,cAAc,EAAE,SAAS,GAAkC;AACzE,QAAM,CAAC,MAAM,IAAI,SAAS,MAAM,eAAe,CAAC;AAEhD,YAAU,MAAM;AACd,WAAO,mCAAmC,MAAM;AAAA,EAClD,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO,oBAAC,uBAAoB,QAAiB,UAAS;AACxD;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  agentsMdSection,
3
3
  agentsMdTemplate
4
- } from "./chunk-SIXGLITH.js";
4
+ } from "./chunk-AQACHV5O.js";
5
5
  import {
6
6
  log
7
7
  } from "./chunk-6PHFHGTZ.js";
@@ -35,4 +35,4 @@ async function agentDocsCommand(projectRoot) {
35
35
  export {
36
36
  agentDocsCommand
37
37
  };
38
- //# sourceMappingURL=agentDocs-BKJBT3HN.js.map
38
+ //# sourceMappingURL=agentDocs-W6CQBLWC.js.map
@@ -80,7 +80,8 @@ import { setConfig } from 'octocms/lib/configStore';
80
80
 
81
81
  setConfig(configOctoCMS);
82
82
  `;
83
- var rootLayoutTemplate = `import '../cms/__generated__/configInit';
83
+ var CONFIG_INIT_IMPORT = "import 'cms/__generated__/configInit';";
84
+ var rootLayoutTemplate = `${CONFIG_INIT_IMPORT}
84
85
  import type { Metadata } from 'next';
85
86
 
86
87
  export const metadata: Metadata = {
@@ -95,33 +96,19 @@ export default function RootLayout({ children }: { children: React.ReactNode })
95
96
  );
96
97
  }
97
98
  `;
98
- var rootLayoutConfigInitImport = `import '../cms/__generated__/configInit';
99
+ var rootLayoutConfigInitImport = `${CONFIG_INIT_IMPORT}
99
100
  `;
100
- var ADMIN_LAYOUT_CONFIG_INIT_DEPTH = {
101
- /** `app/cms/layout.tsx` */
102
- fromAppCms: 2,
103
- /** `src/app/cms/layout.tsx` */
104
- fromSrcAppCms: 3
105
- };
106
- function buildAdminLayoutTemplate(configInitUpSegments) {
107
- const up = "../".repeat(configInitUpSegments);
108
- return `import '${up}cms/__generated__/configInit';
101
+ function buildAdminLayoutTemplate() {
102
+ return `${CONFIG_INIT_IMPORT}
109
103
  import 'octocms/globals.css';
110
104
  import '@mdxeditor/editor/style.css';
111
105
 
112
106
  export { AdminLayout as default, metadata } from 'octocms/admin';
113
107
  `;
114
108
  }
115
- var ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH = {
116
- /** `app/cms/[[...path]]/page.tsx` */
117
- fromAppCmsCatchAll: 3,
118
- /** `src/app/cms/[[...path]]/page.tsx` */
119
- fromSrcAppCmsCatchAll: 4
120
- };
121
- function buildAdminPageTemplate(configInitUpSegments) {
122
- const up = "../".repeat(configInitUpSegments);
109
+ function buildAdminPageTemplate() {
123
110
  return `// Registers setConfig() for server actions \u2014 some POST bundles skip layout.tsx.
124
- import '${up}cms/__generated__/configInit';
111
+ ${CONFIG_INIT_IMPORT}
125
112
 
126
113
  export { AdminApp as default } from 'octocms/admin';
127
114
  `;
@@ -137,6 +124,13 @@ import 'octocms/globals.css';
137
124
  import '@mdxeditor/editor/style.css';
138
125
 
139
126
  export { AdminLayout as default, metadata } from 'octocms/admin/pages/AdminLayout';
127
+ `,
128
+ // 0.5.x — barrel re-export with depth-counted relative configInit import.
129
+ `import '../../cms/__generated__/configInit';
130
+ import 'octocms/globals.css';
131
+ import '@mdxeditor/editor/style.css';
132
+
133
+ export { AdminLayout as default, metadata } from 'octocms/admin';
140
134
  `
141
135
  ];
142
136
  var LEGACY_ADMIN_CATCH_ALL_TEMPLATES = [
@@ -145,6 +139,12 @@ var LEGACY_ADMIN_CATCH_ALL_TEMPLATES = [
145
139
  `,
146
140
  // 0.5.x — barrel re-export without configInit on the page (server actions could miss setConfig).
147
141
  `export { AdminApp as default } from 'octocms/admin';
142
+ `,
143
+ // 0.5.x with depth-counted configInit (replaced by bare-specifier alias).
144
+ `// Registers setConfig() for server actions \u2014 some POST bundles skip layout.tsx.
145
+ import '../../../cms/__generated__/configInit';
146
+
147
+ export { AdminApp as default } from 'octocms/admin';
148
148
  `
149
149
  ];
150
150
  var nextAuthRouteTemplate = `import NextAuth from 'next-auth';
@@ -154,22 +154,20 @@ const handler = NextAuth(authOptions);
154
154
 
155
155
  export { handler as GET, handler as POST };
156
156
  `;
157
- function agentChatRouteTemplate(opts) {
158
- const upDirs = "../".repeat(opts.depth);
157
+ function agentChatRouteTemplate() {
159
158
  return `// Side-effect import: registers \`configOctoCMS\` + \`agentConfig\` into the
160
159
  // runtime stores so \`getAgentConfig()\` resolves on cold start. Route Handlers
161
160
  // don't run \`app/layout.tsx\`, so this import has to live here.
162
- import '${upDirs}cms/__generated__/configInit';
161
+ ${CONFIG_INIT_IMPORT}
163
162
 
164
163
  export { chatRoute as POST, chatStatusRoute as GET } from 'octocms/agent';
165
164
  `;
166
165
  }
167
- function mediaRouteTemplate(opts) {
168
- const upDirs = "../".repeat(opts.depth);
166
+ function mediaRouteTemplate() {
169
167
  return `// Side-effect import: registers \`configOctoCMS\` into the runtime store so
170
168
  // \`getConfig()\` resolves on cold start. Route Handlers don't run
171
169
  // \`app/layout.tsx\`, so this import has to live here.
172
- import '${upDirs}cms/__generated__/configInit';
170
+ ${CONFIG_INIT_IMPORT}
173
171
 
174
172
  export { mediaRoute as GET } from 'octocms/admin/mediaRoute';
175
173
  `;
@@ -250,11 +248,25 @@ Built with [OctoCMS](https://octocms.com) \u2014 a file-based CMS on Next.js.
250
248
 
251
249
  ## Setup
252
250
 
253
- ### 1. Create a GitHub App
251
+ ### 1. Install dependencies
252
+
253
+ \`\`\`bash
254
+ npm install octocms next-auth @tanstack/react-query @mdxeditor/editor \\
255
+ @radix-ui/react-avatar @radix-ui/react-dialog @radix-ui/react-dropdown-menu \\
256
+ @radix-ui/react-label @radix-ui/react-select @radix-ui/react-slot \\
257
+ @radix-ui/react-tabs @radix-ui/react-toast \\
258
+ class-variance-authority clsx glob lucide-react minisearch octokit \\
259
+ react-markdown rehype-sanitize remark-gfm remark-mdx \\
260
+ sharp slugify sonner tailwind-merge zod
261
+ \`\`\`
262
+
263
+ > The exact list (with the right \`octocms\` version pin) is also printed by \`npx octocms init\` \u2014 copy it from there.
264
+
265
+ ### 2. Create a GitHub App
254
266
 
255
267
  Follow the [OctoCMS GitHub App setup guide](https://octocms.com/docs/github-app) to create a GitHub App for authentication.
256
268
 
257
- ### 2. Configure environment variables
269
+ ### 3. Configure environment variables
258
270
 
259
271
  Copy the values from your GitHub App into \`.env.local\`:
260
272
 
@@ -275,7 +287,7 @@ GITHUB_REPO_NAME=your_repo_name
275
287
  # CMS_GITHUB_TOKEN=your_github_pat
276
288
  \`\`\`
277
289
 
278
- ### 3. Run the dev server
290
+ ### 4. Run the dev server
279
291
 
280
292
  \`\`\`bash
281
293
  npm run dev
@@ -337,9 +349,7 @@ export {
337
349
  generatedConfigInitTemplate,
338
350
  rootLayoutTemplate,
339
351
  rootLayoutConfigInitImport,
340
- ADMIN_LAYOUT_CONFIG_INIT_DEPTH,
341
352
  buildAdminLayoutTemplate,
342
- ADMIN_CATCH_ALL_CONFIG_INIT_DEPTH,
343
353
  buildAdminPageTemplate,
344
354
  adminErrorTemplate,
345
355
  LEGACY_ADMIN_LAYOUT_TEMPLATES,
@@ -357,4 +367,4 @@ export {
357
367
  agentsMdTemplate,
358
368
  tsconfigPaths
359
369
  };
360
- //# sourceMappingURL=chunk-SIXGLITH.js.map
370
+ //# sourceMappingURL=chunk-AQACHV5O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/lib/templates.ts"],"sourcesContent":["/**\n * File templates used by `octocms init` and `octocms update`.\n */\n\nconst CODEGEN_BANNER = `/*\n * AUTO-GENERATED — DO NOT EDIT.\n * Generated from cms/octocms.config.ts.\n * Run \\`npx octocms types:gen\\` to regenerate.\n */\n\n`;\n\n/** Static cms/__generated__/types.ts for the helloPage demo schema. */\nexport const generatedTypesTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\nexport interface HelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface HelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: HelloPageFields;\n}\n\nexport type AnyEntry = HelloPageEntry;\n\nexport type EntryMap = {\n helloPage: HelloPageEntry;\n};\n`;\n\n/** Static cms/__generated__/enums.ts for the helloPage demo schema. */\nexport const generatedEnumsTemplate =\n CODEGEN_BANNER +\n `export const CollectionName = {\n HelloPage: 'helloPage',\n} as const;\nexport type CollectionName = (typeof CollectionName)[keyof typeof CollectionName];\n\nexport const COLLECTION_NAMES = ['helloPage'] as const;\n\nexport const FieldFormat = {\n String: 'string',\n Text: 'text',\n Markdown: 'markdown',\n Boolean: 'boolean',\n Reference: 'reference',\n Image: 'image',\n Number: 'number',\n Datetime: 'datetime',\n Json: 'json',\n Slug: 'slug',\n Select: 'select',\n Url: 'url',\n Color: 'color',\n Conditional: 'conditional',\n Richtext: 'richtext',\n} as const;\nexport type FieldFormat = (typeof FieldFormat)[keyof typeof FieldFormat];\n`;\n\n/** Static cms/__generated__/content.d.ts for the helloPage demo schema. */\nexport const generatedContentDeclsTemplate =\n CODEGEN_BANNER +\n `import type { EntryStatus } from 'octocms/types';\n\n// Raw on-disk types (before query() processing).\nexport interface RawHelloPageFields {\n title: string;\n description: string;\n}\n\nexport interface RawHelloPageEntry {\n sys: { id: string; type: 'helloPage'; status: EntryStatus };\n fields: RawHelloPageFields;\n}\n`;\n\n/** Static cms/__generated__/index.ts — always the same shape. */\nexport const generatedIndexTemplate =\n CODEGEN_BANNER +\n `export * from './types';\nexport * from './enums';\nexport * from './query';\n`;\n\n/** Static cms/__generated__/query.ts — always the same shape (schema-independent). */\nexport const generatedQueryTemplate =\n CODEGEN_BANNER +\n `import { createQuery } from 'octocms/query';\nimport { configOctoCMS, type OctoConfig } from '../octocms.config';\nimport type { EntryMap } from './types';\n\n// configOctoCMS is widened to Config for admin internals; cast back to OctoConfig so\n// createQuery preserves literal collection/field names for type-safe queries.\nexport const query = createQuery<EntryMap, OctoConfig>(configOctoCMS as unknown as OctoConfig);\n`;\n\n/** Static cms/__generated__/configInit.ts — always the same shape (schema-independent). */\nexport const generatedConfigInitTemplate =\n CODEGEN_BANNER +\n `import { configOctoCMS } from '../octocms.config';\nimport { setConfig } from 'octocms/lib/configStore';\n\nsetConfig(configOctoCMS);\n`;\n\n/**\n * All scaffolded files import the generated config initialiser via the bare\n * specifier `cms/__generated__/configInit`. Resolution works in two layers:\n *\n * - TypeScript IntelliSense: the consumer's `tsconfig.json` `paths` (added\n * by `octocms init`).\n * - Bundler: an alias registered by `withOctoCMS()` so Webpack and Turbopack\n * resolve the bare specifier from anywhere — including `app/layout.tsx`,\n * route handlers at any depth, and files inside `node_modules/octocms/`.\n *\n * This eliminates the previous depth-counting (`'../../../cms/...'`) that was\n * a recurring source of off-by-one bugs across templates and routes.\n */\nconst CONFIG_INIT_IMPORT = \"import 'cms/__generated__/configInit';\";\n\n/**\n * Minimal root layout written when `app/layout.tsx` does not already exist.\n * The configInit import is the critical side-effect; the rest is a Next.js\n * boilerplate shell.\n */\nexport const rootLayoutTemplate = `${CONFIG_INIT_IMPORT}\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'My App',\n};\n\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n`;\n\n/** The one-liner prepended to an existing root layout to register the config. */\nexport const rootLayoutConfigInitImport = `${CONFIG_INIT_IMPORT}\\n`;\n\nexport function buildAdminLayoutTemplate(): string {\n return `${CONFIG_INIT_IMPORT}\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin';\n`;\n}\n\n/**\n * Catch-all admin route — every \\`/cms/*\\` URL renders the package's\n * \\`AdminApp\\` async server component (awaits \\`params\\`, no outer Suspense).\n * Side-effect-imports \\`configInit\\` so server-action bundles register\n * \\`setConfig()\\` even when Next.js does not load \\`layout.tsx\\` for the POST.\n */\nexport function buildAdminPageTemplate(): string {\n return `// Registers setConfig() for server actions — some POST bundles skip layout.tsx.\n${CONFIG_INIT_IMPORT}\n\nexport { AdminApp as default } from 'octocms/admin';\n`;\n}\n\n/**\n * Admin error boundary — rendered by Next.js when anything in the catch-all\n * tree throws during render. Re-uses the shared \\`AdminErrorView\\` so GitHub\n * config / auth / availability / rate-limit copy stays consistent with the\n * public-page error boundary.\n */\nexport const adminErrorTemplate = `'use client';\n\nexport { AdminError as default } from 'octocms/admin';\n`;\n\n/**\n * Historical template values used by \\`octocms update\\` to recognise an\n * unmodified install when migrating between routing models. Each entry is\n * the literal file content shipped by a previous OctoCMS version. If a\n * user-app file matches one of these byte-for-byte, \\`update\\` will replace\n * it with the current template; otherwise it leaves it alone.\n */\nexport const LEGACY_ADMIN_LAYOUT_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `import '../../cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin/pages/AdminLayout';\n`,\n // 0.5.x — barrel re-export with depth-counted relative configInit import.\n `import '../../cms/__generated__/configInit';\nimport 'octocms/globals.css';\nimport '@mdxeditor/editor/style.css';\n\nexport { AdminLayout as default, metadata } from 'octocms/admin';\n`,\n];\n\nexport const LEGACY_ADMIN_CATCH_ALL_TEMPLATES: ReadonlyArray<string> = [\n // 0.4.x — re-exported from the deep path.\n `export { AdminApp as default } from 'octocms/admin/AdminApp';\n`,\n // 0.5.x — barrel re-export without configInit on the page (server actions could miss setConfig).\n `export { AdminApp as default } from 'octocms/admin';\n`,\n // 0.5.x with depth-counted configInit (replaced by bare-specifier alias).\n `// Registers setConfig() for server actions — some POST bundles skip layout.tsx.\nimport '../../../cms/__generated__/configInit';\n\nexport { AdminApp as default } from 'octocms/admin';\n`,\n];\n\nexport const nextAuthRouteTemplate = `import NextAuth from 'next-auth';\nimport { authOptions } from 'octocms/admin/auth';\n\nconst handler = NextAuth(authOptions);\n\nexport { handler as GET, handler as POST };\n`;\n\n/**\n * Build a thin re-export Route Handler for the chat-agent SSE endpoint.\n *\n * The actual handler lives in `octocms/agent/chatApi.ts`\n * (`chatRoute` / `chatStatusRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so\n * `getAgentConfig()` resolves on cold start (Route Handlers don't run\n * `app/layout.tsx`); and\n * 2. re-exports `chatRoute` as `POST` and `chatStatusRoute` as `GET`.\n *\n * The configInit import uses the bare specifier (resolved by the bundler\n * alias from `withOctoCMS()`), so the route file is depth-agnostic and can be\n * placed under `app/` or `src/app/` without code changes.\n */\nexport function agentChatRouteTemplate(): string {\n return `// Side-effect import: registers \\`configOctoCMS\\` + \\`agentConfig\\` into the\n// runtime stores so \\`getAgentConfig()\\` resolves on cold start. Route Handlers\n// don't run \\`app/layout.tsx\\`, so this import has to live here.\n${CONFIG_INIT_IMPORT}\n\nexport { chatRoute as POST, chatStatusRoute as GET } from 'octocms/agent';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the `/media/[...slug]` proxy.\n *\n * The actual handler lives in `octocms/admin/mediaRoute.ts`\n * (`mediaRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `mediaRoute` as `GET`.\n *\n * The configInit import uses the bare specifier (resolved by the bundler\n * alias from `withOctoCMS()`), so the route file is depth-agnostic.\n */\nexport function mediaRouteTemplate(): string {\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\n${CONFIG_INIT_IMPORT}\n\nexport { mediaRoute as GET } from 'octocms/admin/mediaRoute';\n`;\n}\n\n/**\n * Build a thin re-export Route Handler for the public-site `/api/search`\n * endpoint consumed by the `SearchBox` component shipped at\n * `octocms/components/public`.\n *\n * The actual handler lives in `octocms/admin/searchRoute.ts`\n * (`searchRoute`). The user-app file just:\n * 1. side-effect-imports `cms/__generated__/configInit` so `getConfig()`\n * resolves on cold start (Route Handlers don't run `app/layout.tsx`); and\n * 2. re-exports `searchRoute` as `GET`.\n *\n * The configInit import uses the bare specifier (resolved by the bundler\n * alias from `withOctoCMS()`), so the route file is depth-agnostic.\n */\nexport function searchRouteTemplate(): string {\n return `// Side-effect import: registers \\`configOctoCMS\\` into the runtime store so\n// \\`getConfig()\\` resolves on cold start. Route Handlers don't run\n// \\`app/layout.tsx\\`, so this import has to live here.\n${CONFIG_INIT_IMPORT}\n\nexport { searchRoute as GET } from 'octocms/admin/searchRoute';\n`;\n}\n\nexport function octoConfigTemplate(opts: { projectName: string; baseBranch: string; pointerBranch?: string }): string {\n const gitBlock = opts.pointerBranch\n ? ` git: {\\n baseBranch: '${opts.baseBranch}',\\n publishedPointerBranch: '${opts.pointerBranch}',\\n },`\n : ` git: { baseBranch: '${opts.baseBranch}' },`;\n\n return `import type { Config } from 'octocms/types';\nimport { defineConfig } from 'octocms/config';\n\nconst _typedConfigOctoCMS = defineConfig({\n projectName: '${opts.projectName}',\n${gitBlock}\n contentFolder: 'cms/content',\n mediaContentFolder: 'cms/media',\n mediaFolder: 'public/media',\n mediaAllowedFormats: ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'avif'],\n collections: {\n helloPage: {\n label: 'Hello Page',\n fields: {\n title: { label: 'Title', format: 'string', entryTitle: true, required: true },\n description: { label: 'Description', format: 'text' },\n },\n },\n },\n});\n\nexport const configOctoCMS: Config = _typedConfigOctoCMS;\nexport type OctoConfig = typeof _typedConfigOctoCMS;\n`;\n}\n\nexport function nextConfigTemplate(): string {\n return `import type { NextConfig } from 'next';\nimport { withOctoCMS } from 'octocms/config';\nimport { configOctoCMS } from './cms/octocms.config';\n\nexport { configOctoCMS } from './cms/octocms.config';\nexport type { OctoConfig } from './cms/octocms.config';\n\nconst nextConfig: NextConfig = {};\n\nexport default withOctoCMS(nextConfig, configOctoCMS);\n`;\n}\n\nexport function demoHelloPageJson(): string {\n return JSON.stringify(\n {\n sys: { id: '0000', type: 'helloPage', status: 'merged' },\n fields: {\n title: 'Hello World',\n description: 'Welcome to your new OctoCMS site! Edit this content in the CMS admin panel.',\n },\n },\n null,\n 2,\n );\n}\n\nexport const helloPageTemplate = `import { query } from 'cms/__generated__/query';\n\nexport default async function HelloPage() {\n const page = await query('helloPage').first();\n if (!page) return null;\n return (\n <main>\n <h1>{page.fields.title}</h1>\n <p>{page.fields.description}</p>\n </main>\n );\n}\n`;\n\nexport function readmeTemplate(projectName: string): string {\n return `# ${projectName}\n\nBuilt with [OctoCMS](https://octocms.com) — a file-based CMS on Next.js.\n\n## Setup\n\n### 1. Install dependencies\n\n\\`\\`\\`bash\nnpm install octocms next-auth @tanstack/react-query @mdxeditor/editor \\\\\n @radix-ui/react-avatar @radix-ui/react-dialog @radix-ui/react-dropdown-menu \\\\\n @radix-ui/react-label @radix-ui/react-select @radix-ui/react-slot \\\\\n @radix-ui/react-tabs @radix-ui/react-toast \\\\\n class-variance-authority clsx glob lucide-react minisearch octokit \\\\\n react-markdown rehype-sanitize remark-gfm remark-mdx \\\\\n sharp slugify sonner tailwind-merge zod\n\\`\\`\\`\n\n> The exact list (with the right \\`octocms\\` version pin) is also printed by \\`npx octocms init\\` — copy it from there.\n\n### 2. Create a GitHub App\n\nFollow the [OctoCMS GitHub App setup guide](https://octocms.com/docs/github-app) to create a GitHub App for authentication.\n\n### 3. Configure environment variables\n\nCopy the values from your GitHub App into \\`.env.local\\`:\n\n\\`\\`\\`bash\n# GitHub App credentials (required for CMS auth)\nGITHUB_ID=your_github_app_client_id\nGITHUB_SECRET=your_github_app_client_secret\n\n# NextAuth (generate secret: openssl rand -base64 32)\nNEXTAUTH_SECRET=your_nextauth_secret\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=your_github_username_or_org\nGITHUB_REPO_NAME=your_repo_name\n\n# Optional: static GitHub token for private repos / higher API rate limits\n# CMS_GITHUB_TOKEN=your_github_pat\n\\`\\`\\`\n\n### 4. Run the dev server\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n\nOpen [http://localhost:3000/cms](http://localhost:3000/cms) to access the CMS admin.\n`;\n}\n\nexport function envLocalTemplate(): string {\n return `# GitHub App credentials (required for CMS auth)\n# Create a GitHub App at: https://github.com/settings/apps/new\nGITHUB_ID=\nGITHUB_SECRET=\n\n# NextAuth secret — generate with: openssl rand -base64 32\nNEXTAUTH_SECRET=\nNEXTAUTH_URL=http://localhost:3000\n\n# GitHub repo for content storage (required in production)\nGITHUB_REPO_OWNER=\nGITHUB_REPO_NAME=\n\n# Optional: static GitHub token for private repos or higher API rate limits\n# CMS_GITHUB_TOKEN=\n`;\n}\n\nconst AGENT_DOCS_MARKER = '<!-- octocms:agent-docs -->';\n\nexport function agentsMdSection(): string {\n return `${AGENT_DOCS_MARKER}\n## OctoCMS — AI Content Management\n\nFor tasks that involve creating, editing, or deleting CMS content directly (without the admin UI), read the auto-generated agent docs:\n\n- **\\`octocms/docs/overview.md\\`** — How to find, create, update, and delete content entries via file operations\n- **\\`octocms/docs/schema.md\\`** — Per-collection field definitions, example JSON, and file path conventions\n\nThese docs are generated from \\`cms/octocms.config.ts\\`. Regenerate after schema changes: \\`npm run agent-docs:gen\\`.`;\n}\n\nexport function agentsMdTemplate(): string {\n return `# Project Guidelines\n\n${agentsMdSection()}\n`;\n}\n\nexport function tsconfigPaths(): Record<string, string[]> {\n return {\n 'cms/__generated__': ['./cms/__generated__/index.ts'],\n 'cms/__generated__/*': ['./cms/__generated__/*'],\n '@/*': ['./src/*'],\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,7 @@
1
+ // package.json
2
+ var version = "0.4.8";
3
+
4
+ export {
5
+ version
6
+ };
7
+ //# sourceMappingURL=chunk-YQQT73XR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"octocms\",\n \"version\": \"0.4.8\",\n \"description\": \"A file-based CMS for Next.js — schema-driven, Git-backed, no database\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"keywords\": [\n \"cms\",\n \"nextjs\",\n \"headless-cms\",\n \"git-cms\",\n \"content-management\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/octocms/octocms.git\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.ts\",\n \"require\": \"./dist/query.cjs\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"require\": \"./dist/config.cjs\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.ts\",\n \"require\": \"./dist/defineConfig.cjs\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"require\": \"./dist/types.cjs\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.ts\",\n \"require\": \"./dist/withOctoCMS.cjs\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.cjs\",\n \"import\": \"./dist/agent/index.js\"\n },\n \"./schema\": {\n \"types\": \"./dist/schema/index.d.ts\",\n \"import\": \"./dist/schema/index.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.ts\",\n \"require\": \"./dist/components/public/index.cjs\",\n \"import\": \"./dist/components/public/index.js\"\n },\n \"./lib/configStore\": {\n \"types\": \"./dist/lib/configStore.d.ts\",\n \"require\": \"./dist/lib/configStore.cjs\",\n \"import\": \"./dist/lib/configStore.js\"\n },\n \"./admin\": {\n \"types\": \"./dist/admin/index.d.ts\",\n \"import\": \"./dist/admin/index.js\"\n },\n \"./admin/*\": {\n \"types\": \"./dist/admin/*.d.ts\",\n \"import\": \"./dist/admin/*.js\"\n },\n \"./components/*\": {\n \"types\": \"./dist/components/*.d.ts\",\n \"import\": \"./dist/components/*.js\"\n },\n \"./hooks/*\": {\n \"types\": \"./dist/hooks/*.d.ts\",\n \"import\": \"./dist/hooks/*.js\"\n },\n \"./lib/*\": {\n \"types\": \"./dist/lib/*.d.ts\",\n \"import\": \"./dist/lib/*.js\"\n },\n \"./schema/*\": {\n \"types\": \"./dist/schema/*.d.ts\",\n \"import\": \"./dist/schema/*.js\"\n },\n \"./utils/*\": {\n \"types\": \"./dist/utils/*.d.ts\",\n \"import\": \"./dist/utils/*.js\"\n },\n \"./globals.css\": \"./globals.css\",\n \"./docs/*\": \"./docs/*\"\n },\n \"bin\": {\n \"octocms\": \"dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"docs\",\n \"globals.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json && cp globals.css dist/globals.css\",\n \"prepublishOnly\": \"npm run checks && npm run build\",\n \"lint\": \"oxlint .\",\n \"lint:fix\": \"oxlint --fix .\",\n \"fmt\": \"oxfmt .\",\n \"fmt:check\": \"oxfmt --check .\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"ts-check\": \"tsc --noEmit --incremental false\",\n \"checks\": \"npm run lint && npm run ts-check && npm run fmt:check && npm run test:run\",\n \"checks:fix\": \"npm run lint:fix && npm run fmt && npm run test:run\"\n },\n \"peerDependencies\": {\n \"@anthropic-ai/sdk\": \">=0.91\",\n \"@huggingface/transformers\": \">=4\",\n \"@mdxeditor/editor\": \">=3\",\n \"@radix-ui/react-avatar\": \">=1\",\n \"@radix-ui/react-dialog\": \">=1\",\n \"@radix-ui/react-dropdown-menu\": \">=2\",\n \"@radix-ui/react-label\": \">=2\",\n \"@radix-ui/react-select\": \">=2\",\n \"@radix-ui/react-slot\": \">=1\",\n \"@radix-ui/react-tabs\": \">=1\",\n \"@radix-ui/react-toast\": \">=1\",\n \"@tanstack/react-query\": \">=5\",\n \"class-variance-authority\": \">=0.7\",\n \"clsx\": \">=2\",\n \"glob\": \">=11\",\n \"lucide-react\": \">=1\",\n \"mammoth\": \">=1.12\",\n \"minisearch\": \">=7\",\n \"next\": \">=15\",\n \"next-auth\": \">=4\",\n \"octokit\": \">=4\",\n \"openai\": \">=4\",\n \"pdfjs-dist\": \">=4\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"react-markdown\": \">=10\",\n \"rehype-sanitize\": \">=6\",\n \"remark-gfm\": \">=4\",\n \"remark-mdx\": \">=3\",\n \"sharp\": \">=0.34\",\n \"slugify\": \">=1\",\n \"sonner\": \">=2\",\n \"tailwind-merge\": \">=3\",\n \"zod\": \">=4\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic-ai/sdk\": {\n \"optional\": true\n },\n \"@huggingface/transformers\": {\n \"optional\": true\n },\n \"mammoth\": {\n \"optional\": true\n },\n \"openai\": {\n \"optional\": true\n },\n \"pdfjs-dist\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.9\",\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19.2.14\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitejs/plugin-react\": \"^6.0.1\",\n \"jsdom\": \"^29.0.1\",\n \"oxfmt\": \"^0.11.0\",\n \"oxlint\": \"^0.17.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.9.3\",\n \"vite-tsconfig-paths\": \"^6.1.1\",\n \"vitest\": \"^4.1.2\"\n }\n}\n"],"mappings":";AAEE,cAAW;","names":[]}
package/dist/cli/index.js CHANGED
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ version
4
+ } from "../chunk-YQQT73XR.js";
2
5
  import {
3
6
  resolveProjectRoot
4
7
  } from "../chunk-TG624CCO.js";
@@ -8,9 +11,6 @@ import {
8
11
  } from "../chunk-6PHFHGTZ.js";
9
12
  import "../chunk-DDAAVRWG.js";
10
13
 
11
- // package.json
12
- var version = "0.4.5";
13
-
14
14
  // cli/index.ts
15
15
  var HELP = `
16
16
  ${fmt.bold("OctoCMS CLI")} v${version}
@@ -164,7 +164,7 @@ async function main() {
164
164
  try {
165
165
  switch (command) {
166
166
  case "init": {
167
- const { initCommand } = await import("../init-ESHPKWKN.js");
167
+ const { initCommand } = await import("../init-62DCMFY2.js");
168
168
  await initCommand(process.cwd(), { yes: flags.yes === true });
169
169
  break;
170
170
  }
@@ -195,13 +195,13 @@ async function main() {
195
195
  }
196
196
  case "update": {
197
197
  const projectRoot = resolveProjectRoot();
198
- const { updateCommand } = await import("../update-YDXCLS6L.js");
198
+ const { updateCommand } = await import("../update-RWXTBSDH.js");
199
199
  await updateCommand(projectRoot);
200
200
  break;
201
201
  }
202
202
  case "agent-docs": {
203
203
  const projectRoot = resolveProjectRoot();
204
- const { agentDocsCommand } = await import("../agentDocs-BKJBT3HN.js");
204
+ const { agentDocsCommand } = await import("../agentDocs-W6CQBLWC.js");
205
205
  await agentDocsCommand(projectRoot);
206
206
  break;
207
207
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../cli/index.ts"],"sourcesContent":["{\n \"name\": \"octocms\",\n \"version\": \"0.4.5\",\n \"description\": \"A file-based CMS for Next.js — schema-driven, Git-backed, no database\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"keywords\": [\n \"cms\",\n \"nextjs\",\n \"headless-cms\",\n \"git-cms\",\n \"content-management\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/octocms/octocms.git\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\"\n },\n \"./query\": {\n \"types\": \"./dist/query.d.ts\",\n \"require\": \"./dist/query.cjs\",\n \"import\": \"./dist/query.js\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"require\": \"./dist/config.cjs\",\n \"import\": \"./dist/config.js\"\n },\n \"./defineConfig\": {\n \"types\": \"./dist/defineConfig.d.ts\",\n \"require\": \"./dist/defineConfig.cjs\",\n \"import\": \"./dist/defineConfig.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"require\": \"./dist/types.cjs\",\n \"import\": \"./dist/types.js\"\n },\n \"./withOctoCMS\": {\n \"types\": \"./dist/withOctoCMS.d.ts\",\n \"require\": \"./dist/withOctoCMS.cjs\",\n \"import\": \"./dist/withOctoCMS.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent/index.d.ts\",\n \"require\": \"./dist/agent/index.cjs\",\n \"import\": \"./dist/agent/index.js\"\n },\n \"./schema\": {\n \"types\": \"./dist/schema/index.d.ts\",\n \"import\": \"./dist/schema/index.js\"\n },\n \"./components/public\": {\n \"types\": \"./dist/components/public/index.d.ts\",\n \"require\": \"./dist/components/public/index.cjs\",\n \"import\": \"./dist/components/public/index.js\"\n },\n \"./lib/configStore\": {\n \"types\": \"./dist/lib/configStore.d.ts\",\n \"require\": \"./dist/lib/configStore.cjs\",\n \"import\": \"./dist/lib/configStore.js\"\n },\n \"./admin\": {\n \"types\": \"./dist/admin/index.d.ts\",\n \"import\": \"./dist/admin/index.js\"\n },\n \"./admin/*\": {\n \"types\": \"./dist/admin/*.d.ts\",\n \"import\": \"./dist/admin/*.js\"\n },\n \"./components/*\": {\n \"types\": \"./dist/components/*.d.ts\",\n \"import\": \"./dist/components/*.js\"\n },\n \"./hooks/*\": {\n \"types\": \"./dist/hooks/*.d.ts\",\n \"import\": \"./dist/hooks/*.js\"\n },\n \"./lib/*\": {\n \"types\": \"./dist/lib/*.d.ts\",\n \"import\": \"./dist/lib/*.js\"\n },\n \"./schema/*\": {\n \"types\": \"./dist/schema/*.d.ts\",\n \"import\": \"./dist/schema/*.js\"\n },\n \"./utils/*\": {\n \"types\": \"./dist/utils/*.d.ts\",\n \"import\": \"./dist/utils/*.js\"\n },\n \"./globals.css\": \"./globals.css\",\n \"./docs/*\": \"./docs/*\"\n },\n \"bin\": {\n \"octocms\": \"dist/cli/index.js\"\n },\n \"files\": [\n \"dist\",\n \"docs\",\n \"globals.css\"\n ],\n \"scripts\": {\n \"build\": \"tsup && tsc -p tsconfig.build.json && cp globals.css dist/globals.css\",\n \"prepublishOnly\": \"npm run checks && npm run build\",\n \"lint\": \"oxlint .\",\n \"lint:fix\": \"oxlint --fix .\",\n \"fmt\": \"oxfmt .\",\n \"fmt:check\": \"oxfmt --check .\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"ts-check\": \"tsc --noEmit --incremental false\",\n \"checks\": \"npm run lint && npm run ts-check && npm run fmt:check && npm run test:run\",\n \"checks:fix\": \"npm run lint:fix && npm run fmt && npm run test:run\"\n },\n \"peerDependencies\": {\n \"@anthropic-ai/sdk\": \">=0.91\",\n \"@huggingface/transformers\": \">=4\",\n \"@mdxeditor/editor\": \">=3\",\n \"@radix-ui/react-avatar\": \">=1\",\n \"@radix-ui/react-dialog\": \">=1\",\n \"@radix-ui/react-dropdown-menu\": \">=2\",\n \"@radix-ui/react-label\": \">=2\",\n \"@radix-ui/react-select\": \">=2\",\n \"@radix-ui/react-slot\": \">=1\",\n \"@radix-ui/react-tabs\": \">=1\",\n \"@radix-ui/react-toast\": \">=1\",\n \"@tanstack/react-query\": \">=5\",\n \"@tanstack/react-query-devtools\": \">=5\",\n \"class-variance-authority\": \">=0.7\",\n \"clsx\": \">=2\",\n \"glob\": \">=11\",\n \"lucide-react\": \">=1\",\n \"mammoth\": \">=1.12\",\n \"minisearch\": \">=7\",\n \"next\": \">=15\",\n \"next-auth\": \">=4\",\n \"octokit\": \">=4\",\n \"openai\": \">=4\",\n \"pdfjs-dist\": \">=4\",\n \"react\": \">=18\",\n \"react-dom\": \">=18\",\n \"react-markdown\": \">=10\",\n \"rehype-sanitize\": \">=6\",\n \"remark-gfm\": \">=4\",\n \"remark-mdx\": \">=3\",\n \"sharp\": \">=0.34\",\n \"slugify\": \">=1\",\n \"sonner\": \">=2\",\n \"tailwind-merge\": \">=3\",\n \"zod\": \">=4\"\n },\n \"peerDependenciesMeta\": {\n \"@anthropic-ai/sdk\": {\n \"optional\": true\n },\n \"@huggingface/transformers\": {\n \"optional\": true\n },\n \"mammoth\": {\n \"optional\": true\n },\n \"openai\": {\n \"optional\": true\n },\n \"pdfjs-dist\": {\n \"optional\": true\n },\n \"@tanstack/react-query-devtools\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.9\",\n \"@tanstack/react-query-devtools\": \"^5.100.9\",\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/node\": \"^20\",\n \"@types/react\": \"^19.2.14\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitejs/plugin-react\": \"^6.0.1\",\n \"jsdom\": \"^29.0.1\",\n \"oxfmt\": \"^0.11.0\",\n \"oxlint\": \"^0.17.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.9.3\",\n \"vite-tsconfig-paths\": \"^6.1.1\",\n \"vitest\": \"^4.1.2\"\n }\n}\n","#!/usr/bin/env node\n/* eslint-disable no-console */\n\n/**\n * OctoCMS CLI — command-line tools for managing an OctoCMS project.\n *\n * Commands:\n * init Initialize OctoCMS in a Next.js project\n * dev Start development server with config watching\n * types:gen Generate TypeScript types from next.config.ts\n * embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n * validate Validate all content entries against the schema\n * update Regenerate admin route files\n * agent-docs Inject AI agent doc links into AGENTS.md\n *\n * Usage:\n * octocms <command> [options]\n * octocms --help\n * octocms --version\n */\n\nimport { fmt, log } from './lib/logger';\nimport { resolveProjectRoot } from './lib/project';\nimport { version as VERSION } from '../package.json';\n\nconst HELP = `\n ${fmt.bold('OctoCMS CLI')} v${VERSION}\n\n Usage: octocms <command> [options]\n\n ${fmt.bold('Commands:')}\n init Initialize OctoCMS in a Next.js project\n dev Start development server with config watching\n types:gen Generate TypeScript types from next.config.ts\n embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n validate Validate all content entries against the schema\n update Regenerate admin route files\n agent-docs Inject AI agent doc links into AGENTS.md\n\n ${fmt.bold('Options:')}\n --help Show this help message\n --version Show version number\n\n Run ${fmt.cyan('octocms <command> --help')} for command-specific help.\n`;\n\nconst COMMAND_HELP: Record<string, string> = {\n init: `\n ${fmt.bold('octocms init')} — Initialize OctoCMS in a Next.js project\n\n Creates next.config.ts, admin route files, demo content, and updates\n next.config.ts and tsconfig.json with required configuration.\n\n ${fmt.bold('Usage:')} octocms init [options]\n\n ${fmt.bold('Options:')}\n --yes, -y Accept all defaults (non-interactive)\n --help Show this help message\n`,\n dev: `\n ${fmt.bold('octocms dev')} — Start development server with config watching\n\n Spawns Next.js dev server and watches next.config.ts. When the config\n changes, types are automatically regenerated.\n\n ${fmt.bold('Usage:')} octocms dev [options]\n\n ${fmt.bold('Options:')}\n --port <n> Port number (default: 3000)\n --help Show this help message\n`,\n 'types:gen': `\n ${fmt.bold('octocms types:gen')} — Generate TypeScript types from next.config.ts\n\n Produces cms/__generated__/types.ts, enums.ts, content.d.ts, and index.ts.\n Validates the config before generating.\n\n ${fmt.bold('Usage:')} octocms types:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'embeddings:gen': `\n ${fmt.bold('octocms embeddings:gen')} — Generate cms/__generated__/embeddings.json\n\n Walks every content entry, embeds new/changed entries via the local\n @huggingface/transformers model (Xenova/bge-small-en-v1.5, 384 dims), and\n writes the merged store. Re-running on unchanged content is a fast no-op.\n\n Requires the @huggingface/transformers peer dep installed.\n\n ${fmt.bold('Usage:')} octocms embeddings:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n validate: `\n ${fmt.bold('octocms validate')} — Validate all content entries against the schema\n\n Reads every JSON file in cms/content/, validates structure, field types,\n required fields, select option values, reference targets, and companion files.\n\n ${fmt.bold('Usage:')} octocms validate\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'agent-docs': `\n ${fmt.bold('octocms agent-docs')} — Inject AI agent doc links into AGENTS.md\n\n Creates AGENTS.md if it doesn't exist, or appends the OctoCMS section\n if the file exists but doesn't reference the agent docs yet.\n\n ${fmt.bold('Usage:')} octocms agent-docs\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n update: `\n ${fmt.bold('octocms update')} — Regenerate admin route files\n\n Ensures src/app/cms/layout.tsx and the catch-all page re-export are\n up-to-date with the latest OctoCMS version.\n\n ${fmt.bold('Usage:')} octocms update\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n};\n\nfunction parseArgs(argv: string[]): { command: string | null; flags: Record<string, string | boolean> } {\n const args = argv.slice(2); // skip node + script path\n const flags: Record<string, string | boolean> = {};\n let command: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--help' || arg === '-h') {\n flags.help = true;\n } else if (arg === '--version' || arg === '-v') {\n flags.version = true;\n } else if (arg === '--yes' || arg === '-y') {\n flags.yes = true;\n } else if (arg === '--port') {\n flags.port = args[++i] ?? '';\n } else if (arg.startsWith('--port=')) {\n flags.port = arg.slice(7);\n } else if (!arg.startsWith('-') && !command) {\n // Handle compound commands as single tokens\n if (arg === 'types:gen' || arg === 'embeddings:gen' || arg === 'agent-docs') {\n command = arg;\n } else {\n command = arg;\n }\n }\n }\n\n return { command, flags };\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv);\n\n if (flags.version) {\n console.log(VERSION);\n return;\n }\n\n if (!command || flags.help) {\n if (command && COMMAND_HELP[command]) {\n console.log(COMMAND_HELP[command]);\n } else {\n console.log(HELP);\n }\n return;\n }\n\n if (COMMAND_HELP[command] && flags.help) {\n console.log(COMMAND_HELP[command]);\n return;\n }\n\n try {\n switch (command) {\n case 'init': {\n // init doesn't need an existing project root — use cwd\n const { initCommand } = await import('./commands/init');\n await initCommand(process.cwd(), { yes: flags.yes === true });\n break;\n }\n case 'dev': {\n const projectRoot = resolveProjectRoot();\n const { devCommand } = await import('./commands/dev');\n const port = flags.port ? Number(flags.port) : undefined;\n await devCommand(projectRoot, { port });\n break;\n }\n case 'types:gen': {\n const projectRoot = resolveProjectRoot();\n const { typesGenCommand } = await import('./commands/typesGen');\n await typesGenCommand(projectRoot);\n break;\n }\n case 'embeddings:gen': {\n const projectRoot = resolveProjectRoot();\n const { embeddingsGenCommand } = await import('./commands/embeddingsGen');\n await embeddingsGenCommand(projectRoot);\n break;\n }\n case 'validate': {\n const projectRoot = resolveProjectRoot();\n const { validateCommand } = await import('./commands/validate');\n await validateCommand(projectRoot);\n break;\n }\n case 'update': {\n const projectRoot = resolveProjectRoot();\n const { updateCommand } = await import('./commands/update');\n await updateCommand(projectRoot);\n break;\n }\n case 'agent-docs': {\n const projectRoot = resolveProjectRoot();\n const { agentDocsCommand } = await import('./commands/agentDocs');\n await agentDocsCommand(projectRoot);\n break;\n }\n default:\n log.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exitCode = 1;\n }\n } catch (e) {\n log.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nmain();\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/* eslint-disable no-console */\n\n/**\n * OctoCMS CLI — command-line tools for managing an OctoCMS project.\n *\n * Commands:\n * init Initialize OctoCMS in a Next.js project\n * dev Start development server with config watching\n * types:gen Generate TypeScript types from next.config.ts\n * embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n * validate Validate all content entries against the schema\n * update Regenerate admin route files\n * agent-docs Inject AI agent doc links into AGENTS.md\n *\n * Usage:\n * octocms <command> [options]\n * octocms --help\n * octocms --version\n */\n\nimport { fmt, log } from './lib/logger';\nimport { resolveProjectRoot } from './lib/project';\nimport { version as VERSION } from '../package.json';\n\nconst HELP = `\n ${fmt.bold('OctoCMS CLI')} v${VERSION}\n\n Usage: octocms <command> [options]\n\n ${fmt.bold('Commands:')}\n init Initialize OctoCMS in a Next.js project\n dev Start development server with config watching\n types:gen Generate TypeScript types from next.config.ts\n embeddings:gen Generate cms/__generated__/embeddings.json for the chat agent\n validate Validate all content entries against the schema\n update Regenerate admin route files\n agent-docs Inject AI agent doc links into AGENTS.md\n\n ${fmt.bold('Options:')}\n --help Show this help message\n --version Show version number\n\n Run ${fmt.cyan('octocms <command> --help')} for command-specific help.\n`;\n\nconst COMMAND_HELP: Record<string, string> = {\n init: `\n ${fmt.bold('octocms init')} — Initialize OctoCMS in a Next.js project\n\n Creates next.config.ts, admin route files, demo content, and updates\n next.config.ts and tsconfig.json with required configuration.\n\n ${fmt.bold('Usage:')} octocms init [options]\n\n ${fmt.bold('Options:')}\n --yes, -y Accept all defaults (non-interactive)\n --help Show this help message\n`,\n dev: `\n ${fmt.bold('octocms dev')} — Start development server with config watching\n\n Spawns Next.js dev server and watches next.config.ts. When the config\n changes, types are automatically regenerated.\n\n ${fmt.bold('Usage:')} octocms dev [options]\n\n ${fmt.bold('Options:')}\n --port <n> Port number (default: 3000)\n --help Show this help message\n`,\n 'types:gen': `\n ${fmt.bold('octocms types:gen')} — Generate TypeScript types from next.config.ts\n\n Produces cms/__generated__/types.ts, enums.ts, content.d.ts, and index.ts.\n Validates the config before generating.\n\n ${fmt.bold('Usage:')} octocms types:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'embeddings:gen': `\n ${fmt.bold('octocms embeddings:gen')} — Generate cms/__generated__/embeddings.json\n\n Walks every content entry, embeds new/changed entries via the local\n @huggingface/transformers model (Xenova/bge-small-en-v1.5, 384 dims), and\n writes the merged store. Re-running on unchanged content is a fast no-op.\n\n Requires the @huggingface/transformers peer dep installed.\n\n ${fmt.bold('Usage:')} octocms embeddings:gen\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n validate: `\n ${fmt.bold('octocms validate')} — Validate all content entries against the schema\n\n Reads every JSON file in cms/content/, validates structure, field types,\n required fields, select option values, reference targets, and companion files.\n\n ${fmt.bold('Usage:')} octocms validate\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n 'agent-docs': `\n ${fmt.bold('octocms agent-docs')} — Inject AI agent doc links into AGENTS.md\n\n Creates AGENTS.md if it doesn't exist, or appends the OctoCMS section\n if the file exists but doesn't reference the agent docs yet.\n\n ${fmt.bold('Usage:')} octocms agent-docs\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n update: `\n ${fmt.bold('octocms update')} — Regenerate admin route files\n\n Ensures src/app/cms/layout.tsx and the catch-all page re-export are\n up-to-date with the latest OctoCMS version.\n\n ${fmt.bold('Usage:')} octocms update\n\n ${fmt.bold('Options:')}\n --help Show this help message\n`,\n};\n\nfunction parseArgs(argv: string[]): { command: string | null; flags: Record<string, string | boolean> } {\n const args = argv.slice(2); // skip node + script path\n const flags: Record<string, string | boolean> = {};\n let command: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--help' || arg === '-h') {\n flags.help = true;\n } else if (arg === '--version' || arg === '-v') {\n flags.version = true;\n } else if (arg === '--yes' || arg === '-y') {\n flags.yes = true;\n } else if (arg === '--port') {\n flags.port = args[++i] ?? '';\n } else if (arg.startsWith('--port=')) {\n flags.port = arg.slice(7);\n } else if (!arg.startsWith('-') && !command) {\n // Handle compound commands as single tokens\n if (arg === 'types:gen' || arg === 'embeddings:gen' || arg === 'agent-docs') {\n command = arg;\n } else {\n command = arg;\n }\n }\n }\n\n return { command, flags };\n}\n\nasync function main(): Promise<void> {\n const { command, flags } = parseArgs(process.argv);\n\n if (flags.version) {\n console.log(VERSION);\n return;\n }\n\n if (!command || flags.help) {\n if (command && COMMAND_HELP[command]) {\n console.log(COMMAND_HELP[command]);\n } else {\n console.log(HELP);\n }\n return;\n }\n\n if (COMMAND_HELP[command] && flags.help) {\n console.log(COMMAND_HELP[command]);\n return;\n }\n\n try {\n switch (command) {\n case 'init': {\n // init doesn't need an existing project root — use cwd\n const { initCommand } = await import('./commands/init');\n await initCommand(process.cwd(), { yes: flags.yes === true });\n break;\n }\n case 'dev': {\n const projectRoot = resolveProjectRoot();\n const { devCommand } = await import('./commands/dev');\n const port = flags.port ? Number(flags.port) : undefined;\n await devCommand(projectRoot, { port });\n break;\n }\n case 'types:gen': {\n const projectRoot = resolveProjectRoot();\n const { typesGenCommand } = await import('./commands/typesGen');\n await typesGenCommand(projectRoot);\n break;\n }\n case 'embeddings:gen': {\n const projectRoot = resolveProjectRoot();\n const { embeddingsGenCommand } = await import('./commands/embeddingsGen');\n await embeddingsGenCommand(projectRoot);\n break;\n }\n case 'validate': {\n const projectRoot = resolveProjectRoot();\n const { validateCommand } = await import('./commands/validate');\n await validateCommand(projectRoot);\n break;\n }\n case 'update': {\n const projectRoot = resolveProjectRoot();\n const { updateCommand } = await import('./commands/update');\n await updateCommand(projectRoot);\n break;\n }\n case 'agent-docs': {\n const projectRoot = resolveProjectRoot();\n const { agentDocsCommand } = await import('./commands/agentDocs');\n await agentDocsCommand(projectRoot);\n break;\n }\n default:\n log.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exitCode = 1;\n }\n } catch (e) {\n log.error((e as Error).message);\n process.exitCode = 1;\n }\n}\n\nmain();\n"],"mappings":"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","names":[]}