canopycms 0.0.67-int.90 → 0.0.67

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 (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
package/dist/cli/init.js CHANGED
@@ -334,18 +334,18 @@ var init_config = __esm({
334
334
  onAccountClick: z5.function().returns(z5.void()).optional(),
335
335
  onLogoutClick: z5.function().returns(z5.void()).optional(),
336
336
  // Optional: custom account component (e.g., Clerk's UserButton)
337
- AccountComponent: z5.custom().optional()
337
+ AccountComponent: z5.custom().optional(),
338
+ // Optional: provider sign-in UI for signed-out users (see EditorSignInProps)
339
+ SignInComponent: z5.custom().optional()
338
340
  });
339
341
  CanopyConfigSchema = z5.object({
340
342
  media: mediaSchema.optional(),
341
- // No outer .optional() here: defaultBranchAccessSchema/defaultPathAccessSchema already
342
- // have .default('deny'), so the field is optional on input but always resolves to
343
- // 'allow'/'deny' (never undefined) on output. An outer .optional() would short-circuit
344
- // before the inner default runs, defeating the fail-closed default (SCH-M1).
345
- // defaultPathAccessSchema's union keeps the same rule: the .default('deny') sits on the
346
- // OUTER union, not inside defaultPathAccessLevelsSchema, so an omitted top-level field
347
- // still resolves to 'deny' and an omitted level inside the object form stays undefined
348
- // (resolved to 'deny' at read time by resolveDefaultPathAccess).
343
+ // No outer .optional(): both schemas already .default('deny'), so the field is optional on
344
+ // input but always resolves to 'allow'/'deny' (never undefined) on output — an outer
345
+ // .optional() would short-circuit before the inner default runs, defeating the fail-closed
346
+ // default (SCH-M1). defaultPathAccessSchema's .default('deny') sits on the OUTER union, not
347
+ // inside defaultPathAccessLevelsSchema, so an omitted level in the object form stays
348
+ // undefined (resolved to 'deny' at read time by resolveDefaultPathAccess).
349
349
  defaultBranchAccess: defaultBranchAccessSchema,
350
350
  defaultPathAccess: defaultPathAccessSchema,
351
351
  // .optional() deliberately defeats defaultBaseBranchSchema's .default('main'):
@@ -369,16 +369,11 @@ var init_config = __esm({
369
369
  allowNetworkRemoteInProd: z5.boolean().optional(),
370
370
  settingsBranch: z5.string().optional(),
371
371
  autoCreateSettingsPR: z5.boolean().optional(),
372
- // Deliberately `deploymentNameSchema.optional()`, NOT `deploymentNameSchema` alone.
373
- // deploymentNameSchema.default('prod') would make `parse(undefined)` resolve to
374
- // the literal 'prod' instead of staying `undefined` — collapsing the
375
- // env > config > modeDefault precedence chain that resolveDeploymentName
376
- // (operating-mode/deployment-name.ts) implements: config would then always
377
- // "win" over modeDefault (masking dev's real default of 'local'), and the env
378
- // var would just be racing config's baked-in 'prod' instead of a true absence.
379
- // `.optional()` here is what keeps an omitted deploymentName reaching
380
- // resolveDeploymentName as `undefined`, so it can fall through to modeDefault.
381
- // Do not "fix" this by removing `.optional()`.
372
+ // `.optional()`, NOT bare `deploymentNameSchema`: its own `.default('prod')` would make
373
+ // `parse(undefined)` resolve to 'prod' instead of staying `undefined`, collapsing the
374
+ // env > config > modeDefault precedence chain `resolveDeploymentName`
375
+ // (operating-mode/deployment-name.ts) implements — config would always "win" over
376
+ // modeDefault, masking dev's real default of 'local'. Do not remove `.optional()`.
382
377
  deploymentName: deploymentNameSchema.optional(),
383
378
  contentRoot: contentRootSchema.default("content"),
384
379
  sourceRoot: sourceRootSchema.optional(),
@@ -522,7 +517,6 @@ var init_fs = __esm({
522
517
  // dist/cli/templates.js
523
518
  var templates_exports = {};
524
519
  __export(templates_exports, {
525
- SCAFFOLD_STACK_NAME: () => SCAFFOLD_STACK_NAME,
526
520
  aiConfig: () => aiConfig,
527
521
  aiRoute: () => aiRoute,
528
522
  apiRoute: () => apiRoute,
@@ -588,9 +582,8 @@ async function aiRoute(options) {
588
582
  const template = await readTemplate("ai-route.ts.template");
589
583
  return template.replace("{{CONFIG_IMPORT}}", options.configImport);
590
584
  }
591
- async function middleware(options) {
592
- const templateName = options.authProvider === "clerk" ? "middleware-clerk.ts.template" : "middleware.ts.template";
593
- return readTemplate(templateName);
585
+ async function middleware() {
586
+ return readTemplate("middleware.ts.template");
594
587
  }
595
588
  async function nextConfig(options) {
596
589
  const templateName = options.staticBuild ? "next.config-static.ts.template" : "next.config.ts.template";
@@ -638,8 +631,7 @@ __export(project_detect_exports, {
638
631
  detectDefaultBranch: () => detectDefaultBranch,
639
632
  detectGitHubRepo: () => detectGitHubRepo,
640
633
  detectPackageManager: () => detectPackageManager,
641
- missingCdkDependencies: () => missingCdkDependencies,
642
- readPackageJson: () => readPackageJson
634
+ missingCdkDependencies: () => missingCdkDependencies
643
635
  });
644
636
  import fs3 from "node:fs/promises";
645
637
  import path3 from "node:path";
@@ -768,14 +760,13 @@ var init_project_detect = __esm({
768
760
  pnpm: {
769
761
  lockfile: "pnpm-lock.yaml",
770
762
  ciInstall: "corepack enable && pnpm install --frozen-lockfile",
771
- // pnpm-workspace.yaml holds settings the install obeys even in a single-package app: pnpm
772
- // 11's `allowBuilds` decisions, `overrides`, `patchedDependencies`. pnpm 11 fails the
773
- // install on any dependency build script without a decision, and an app with the editor has
774
- // several (es5-ext through the editor, sharp through Next). The `[l]` glob keeps the file
775
- // optional: COPY rejects a missing literal source, but accepts a pattern that matches
776
- // nothing when another source matches. Measured 2026-09-13 on Docker Engine 29.6.2 (BuildKit
777
- // v0.31.2): `COPY package.json pnpm-workspace.yam[l] ./` builds with no pnpm-workspace.yaml
778
- // in the context, and the same line with the literal name fails with "not found".
763
+ // pnpm-workspace.yaml holds settings the install obeys even in a single-package app
764
+ // (pnpm 11's `allowBuilds` decisions, `overrides`, `patchedDependencies`); pnpm 11 fails
765
+ // the install on any dependency build script without a decision, and an app with the
766
+ // editor has several (es5-ext, sharp). The `[l]` glob keeps the file optional: on Docker
767
+ // Engine 29.6.2 (BuildKit v0.31.2), `COPY package.json pnpm-workspace.yam[l] ./` builds
768
+ // with no pnpm-workspace.yaml in the context, while the same line with the literal name
769
+ // fails with "not found".
779
770
  dockerCopy: "COPY package.json pnpm-lock.yaml pnpm-workspace.yam[l] ./",
780
771
  dockerInstall: "RUN corepack enable && pnpm install --frozen-lockfile",
781
772
  build: "pnpm run build",
@@ -810,7 +801,7 @@ var init_project_detect = __esm({
810
801
  }
811
802
  });
812
803
 
813
- // dist/worker/task-queue-config.js
804
+ // dist/task-queue/task-queue-config.js
814
805
  var task_queue_config_exports = {};
815
806
  __export(task_queue_config_exports, {
816
807
  getTaskQueueDir: () => getTaskQueueDir
@@ -828,7 +819,7 @@ function getTaskQueueDir(config) {
828
819
  }
829
820
  }
830
821
  var init_task_queue_config = __esm({
831
- "dist/worker/task-queue-config.js"() {
822
+ "dist/task-queue/task-queue-config.js"() {
832
823
  "use strict";
833
824
  init_config2();
834
825
  }
@@ -861,15 +852,11 @@ var init_debug = __esm({
861
852
  return LOG_LEVELS[level] >= LOG_LEVELS[minLevel];
862
853
  }
863
854
  /**
864
- * The ISO-8601 timestamp leads the line BARE - not wrapped in brackets as it
865
- * once was. `CANOPYCMS_DEBUG=true` can be set on the EC2 worker, whose stdout
866
- * appends to /var/log/canopy-worker/worker.log; the CloudWatch agent's
867
- * `multi_line_start_pattern` matches the timestamp at the START of a line
868
- * (see worker/log.ts's INVARIANT and cms-service.ts's agent config), so a
869
- * leading `[` meant every debug line was silently folded into the previous
870
- * event instead of starting its own. The bracketed `[prefix:category]` and
871
- * `[level]` fields still follow, so the human-readable shape is unchanged
872
- * apart from those two characters.
855
+ * The ISO-8601 timestamp leads the line BARE, never bracketed. `CANOPYCMS_DEBUG=true` can
856
+ * be set on the EC2 worker, whose stdout appends to /var/log/canopy-worker/worker.log, and
857
+ * the CloudWatch agent's `multi_line_start_pattern` matches a timestamp at the START of a
858
+ * line (see worker/log.ts's INVARIANT and cms-service.ts's agent config): any leading
859
+ * character folds the line into the previous event instead of starting its own.
873
860
  */
874
861
  formatMessage(level, category, message) {
875
862
  const timestamp = (/* @__PURE__ */ new Date()).toISOString();
@@ -902,15 +889,9 @@ var init_debug = __esm({
902
889
  throw new Error(errorMsg);
903
890
  }
904
891
  }
905
- /**
906
- * Start timing an operation
907
- */
908
892
  time(label) {
909
893
  this.timers.set(label, Date.now());
910
894
  }
911
- /**
912
- * End timing an operation and log the duration
913
- */
914
895
  timeEnd(category, label) {
915
896
  const start = this.timers.get(label);
916
897
  if (start === void 0) {
@@ -922,9 +903,6 @@ var init_debug = __esm({
922
903
  this.debug(category, `${label} completed`, { durationMs: duration });
923
904
  return duration;
924
905
  }
925
- /**
926
- * Wrap an async function with automatic timing
927
- */
928
906
  async timed(category, label, fn) {
929
907
  this.time(label);
930
908
  try {
@@ -1375,17 +1353,9 @@ var init_task_queue = __esm({
1375
1353
  }
1376
1354
  });
1377
1355
 
1378
- // dist/task-queue/index.js
1379
- var init_task_queue2 = __esm({
1380
- "dist/task-queue/index.js"() {
1381
- "use strict";
1382
- init_task_queue();
1383
- }
1384
- });
1385
-
1386
- // dist/worker/task-queue.js
1387
- var task_queue_exports = {};
1388
- __export(task_queue_exports, {
1356
+ // dist/task-queue/cms-task-queue.js
1357
+ var cms_task_queue_exports = {};
1358
+ __export(cms_task_queue_exports, {
1389
1359
  cleanupOldTasks: () => cleanupOldTasks,
1390
1360
  cmsTaskQueueLogger: () => cmsTaskQueueLogger,
1391
1361
  completeTask: () => completeTask,
@@ -1394,7 +1364,6 @@ __export(task_queue_exports, {
1394
1364
  failTask: () => failTask,
1395
1365
  getQueueStats: () => getQueueStats,
1396
1366
  getTask: () => getTask,
1397
- getTaskResult: () => getTask,
1398
1367
  listCorruptTaskFiles: () => listCorruptTaskFiles,
1399
1368
  listTasks: () => listTasks,
1400
1369
  recoverOrphanedTasks: () => recoverOrphanedTasks,
@@ -1402,11 +1371,11 @@ __export(task_queue_exports, {
1402
1371
  retryTask: () => retryTask
1403
1372
  });
1404
1373
  var debugLogger, cmsTaskQueueLogger;
1405
- var init_task_queue3 = __esm({
1406
- "dist/worker/task-queue.js"() {
1374
+ var init_cms_task_queue = __esm({
1375
+ "dist/task-queue/cms-task-queue.js"() {
1407
1376
  "use strict";
1408
1377
  init_debug();
1409
- init_task_queue2();
1378
+ init_task_queue();
1410
1379
  debugLogger = createDebugLogger({ prefix: "TaskQueue" });
1411
1380
  cmsTaskQueueLogger = {
1412
1381
  debug(message, data) {
@@ -1427,7 +1396,6 @@ var ProdClientSafeStrategy = class {
1427
1396
  constructor() {
1428
1397
  this.mode = "prod";
1429
1398
  }
1430
- // UI Feature Flags
1431
1399
  supportsBranching() {
1432
1400
  return true;
1433
1401
  }
@@ -1440,7 +1408,6 @@ var ProdClientSafeStrategy = class {
1440
1408
  supportsPullRequests() {
1441
1409
  return true;
1442
1410
  }
1443
- // Simple Data
1444
1411
  getPermissionsFileName() {
1445
1412
  return "permissions.json";
1446
1413
  }
@@ -1458,7 +1425,6 @@ var DevClientSafeStrategy = class {
1458
1425
  constructor() {
1459
1426
  this.mode = "dev";
1460
1427
  }
1461
- // UI Feature Flags
1462
1428
  supportsBranching() {
1463
1429
  return true;
1464
1430
  }
@@ -1471,7 +1437,6 @@ var DevClientSafeStrategy = class {
1471
1437
  supportsPullRequests() {
1472
1438
  return false;
1473
1439
  }
1474
- // Simple Data
1475
1440
  getPermissionsFileName() {
1476
1441
  return "permissions.json";
1477
1442
  }
@@ -1512,11 +1477,6 @@ function resolveDeploymentName(config, modeDefault) {
1512
1477
  // dist/operating-mode/client-unsafe-strategy.js
1513
1478
  init_config2();
1514
1479
  var ProdStrategy = class extends ProdClientSafeStrategy {
1515
- // All client-safe methods inherited automatically from ProdClientSafeStrategy:
1516
- // - mode, supportsBranching(), supportsStatusBadge(), supportsComments()
1517
- // - supportsPullRequests(), getPermissionsFileName(), getGroupsFileName()
1518
- // - shouldCommit(), shouldPush()
1519
- // Add client-unsafe methods (use Node.js APIs)
1520
1480
  getWorkspaceRoot(_sourceRoot) {
1521
1481
  return path.resolve(process.env.CANOPYCMS_WORKSPACE_ROOT ?? DEFAULT_PROD_WORKSPACE);
1522
1482
  }
@@ -1570,7 +1530,6 @@ var ProdStrategy = class extends ProdClientSafeStrategy {
1570
1530
  }
1571
1531
  };
1572
1532
  var DevStrategy = class extends DevClientSafeStrategy {
1573
- // Inherits client-safe methods from DevClientSafeStrategy
1574
1533
  getWorkspaceRoot(sourceRoot) {
1575
1534
  return path.resolve(sourceRoot ?? process.cwd(), ".canopy-dev");
1576
1535
  }
@@ -1760,7 +1719,7 @@ async function init(options) {
1760
1719
  } else {
1761
1720
  await writeFile(path7.join(projectDir, "next.config.ts"), await nextConfig2({ staticBuild }), writeOpts);
1762
1721
  }
1763
- await writeFile(path7.join(projectDir, path7.dirname(appDir), "middleware.ts"), await middleware2({ authProvider }), writeOpts);
1722
+ await writeFile(path7.join(projectDir, path7.dirname(appDir), "middleware.ts"), await middleware2(), writeOpts);
1764
1723
  const gitignorePath = path7.join(projectDir, ".gitignore");
1765
1724
  const CANOPY_GITIGNORE_BLOCK = "# CanopyCMS\n.canopy-dev/\n";
1766
1725
  if (await filePathExists(gitignorePath)) {
@@ -1971,7 +1930,7 @@ CanopyCMS worker run-once (mode: ${mode}, auth: ${authMode})
1971
1930
  process.exitCode = 1;
1972
1931
  }
1973
1932
  }
1974
- const { dequeueTask: dequeueTask2, completeTask: completeTask2, listTasks: listTasks2 } = await Promise.resolve().then(() => (init_task_queue3(), task_queue_exports));
1933
+ const { dequeueTask: dequeueTask2, completeTask: completeTask2, listTasks: listTasks2 } = await Promise.resolve().then(() => (init_cms_task_queue(), cms_task_queue_exports));
1975
1934
  if (mode === "prod") {
1976
1935
  const pending = await listTasks2(taskDir, "pending");
1977
1936
  if (pending.length > 0) {
@@ -12,7 +12,7 @@
12
12
  * so re-running is a no-op. Source-specific ordering conventions (e.g.
13
13
  * Nextra _meta.json) are out of scope — order defaults to alphabetical.
14
14
  */
15
- export declare const MIGRATE_FORMATS: readonly ["md", "mdx", "json", "yaml"];
15
+ declare const MIGRATE_FORMATS: readonly ["md", "mdx", "json", "yaml"];
16
16
  export type MigrateFormat = (typeof MIGRATE_FORMATS)[number];
17
17
  export interface MigrateOptions {
18
18
  projectDir: string;
@@ -20,7 +20,6 @@ export interface MigrateOptions {
20
20
  contentRoot?: string;
21
21
  /** Entry type name written into .collection.json and file names (e.g. 'doc') */
22
22
  entryType?: string;
23
- /** File format to migrate */
24
23
  format?: MigrateFormat;
25
24
  /** Entry schema registry key written into .collection.json (e.g. 'docSchema') */
26
25
  schema?: string;
@@ -29,21 +28,25 @@ export interface MigrateOptions {
29
28
  /** Skip the confirmation prompt */
30
29
  force?: boolean;
31
30
  }
32
- /** Migration precondition failure — thrown so the CLI exits non-zero. */
31
+ /**
32
+ * Migration precondition failure — thrown so the CLI exits non-zero.
33
+ * @internal Exported for tests.
34
+ */
33
35
  export declare class MigrateError extends Error {
34
36
  constructor(message: string);
35
37
  }
36
38
  /**
37
- * Normalize a file/directory base name into a slug the whole CMS accepts.
38
- * Must satisfy parseSlug (/^[a-z0-9][a-z0-9-]*$/) — underscores are NOT allowed:
39
- * the public read path (readByUrlPath/read) rejects them, so a migrated page
40
- * carrying one is unreachable and now fails the production build outright
41
- * (static/index.ts's assertRoutableSlugs). Migration writes files directly
42
- * rather than through the write API, so its [SLUG] create guard does not cover
43
- * this — normalizing here is what keeps the migrated tree buildable.
39
+ * Normalizes a file/directory base name into a slug parseSlug accepts
40
+ * (/^[a-z0-9][a-z0-9-]*$/) — underscores are NOT allowed: the public read path
41
+ * rejects them, so a migrated page carrying one is unreachable and fails the
42
+ * production build (static/index.ts's assertRoutableSlugs). Migration writes
43
+ * files directly, bypassing the write API's [SLUG] create guard, so this
44
+ * normalization is the only thing that keeps the migrated tree buildable.
45
+ * @internal Exported for tests.
44
46
  */
45
47
  export declare function slugifyName(name: string): string;
46
48
  /** Run the migrate command. Returns the number of operations applied. */
47
49
  export declare function migrate(options: MigrateOptions): Promise<{
48
50
  opCount: number;
49
51
  }>;
52
+ export {};
@@ -25,8 +25,11 @@ import { withLock } from '../utils/async-mutex.js';
25
25
  import { withOccFileLock, OccWriteConflictError } from '../utils/occ-json-write.js';
26
26
  import { BranchMetadataFileManager } from '../branch-metadata.js';
27
27
  import { invalidateBranchContentCaches } from '../content-index-generation.js';
28
- export const MIGRATE_FORMATS = ['md', 'mdx', 'json', 'yaml'];
29
- /** Migration precondition failure — thrown so the CLI exits non-zero. */
28
+ const MIGRATE_FORMATS = ['md', 'mdx', 'json', 'yaml'];
29
+ /**
30
+ * Migration precondition failure — thrown so the CLI exits non-zero.
31
+ * @internal Exported for tests.
32
+ */
30
33
  export class MigrateError extends Error {
31
34
  constructor(message) {
32
35
  super(message);
@@ -34,13 +37,13 @@ export class MigrateError extends Error {
34
37
  }
35
38
  }
36
39
  /**
37
- * Normalize a file/directory base name into a slug the whole CMS accepts.
38
- * Must satisfy parseSlug (/^[a-z0-9][a-z0-9-]*$/) — underscores are NOT allowed:
39
- * the public read path (readByUrlPath/read) rejects them, so a migrated page
40
- * carrying one is unreachable and now fails the production build outright
41
- * (static/index.ts's assertRoutableSlugs). Migration writes files directly
42
- * rather than through the write API, so its [SLUG] create guard does not cover
43
- * this — normalizing here is what keeps the migrated tree buildable.
40
+ * Normalizes a file/directory base name into a slug parseSlug accepts
41
+ * (/^[a-z0-9][a-z0-9-]*$/) — underscores are NOT allowed: the public read path
42
+ * rejects them, so a migrated page carrying one is unreachable and fails the
43
+ * production build (static/index.ts's assertRoutableSlugs). Migration writes
44
+ * files directly, bypassing the write API's [SLUG] create guard, so this
45
+ * normalization is the only thing that keeps the migrated tree buildable.
46
+ * @internal Exported for tests.
44
47
  */
45
48
  export function slugifyName(name) {
46
49
  const slug = name
@@ -145,7 +148,6 @@ export async function migrate(options) {
145
148
  if (!(await filePathExists(contentDir))) {
146
149
  throw new MigrateError(`Content directory not found: ${contentRoot}/ (expected at ${contentDir})`);
147
150
  }
148
- // Resolve entry type / format / schema from flags, prompting for what's missing
149
151
  let entryType = options.entryType;
150
152
  if (!entryType) {
151
153
  const result = await p.text({
@@ -218,27 +220,18 @@ export async function migrate(options) {
218
220
  return { opCount: 0 };
219
221
  }
220
222
  }
221
- // migrate's target (`projectDir`, resolved by walking up from cwd to the
222
- // nearest canopycms.config.ts — see cli/project-root.ts) is USUALLY the
223
- // developer's live source repo, not a branch clone: migrate is meant to run
224
- // once, before any branch workspace has ever been created, converting a
225
- // plain content tree into CanopyCMS conventions. In that (common) case
226
- // there is no cached schema/content-index to invalidate, and bumping the
227
- // markers there would be a no-op nobody reads — no consumer treats the
228
- // live project root as a cached branchRoot outside build/static mode, which
229
- // skips the disk cache entirely — and would risk violating the
230
- // never-write-.canopy-meta-at-the-project-root invariant documented on
223
+ // `projectDir` (resolved by cli/project-root.ts) is usually the live source repo,
224
+ // not a branch clone — migrate typically runs before any branch workspace exists.
225
+ // The live root has no cached schema/content-index to invalidate, and touching one
226
+ // would risk the never-write-.canopy-meta-at-the-project-root invariant owned by
231
227
  // BranchSchemaCache.
232
228
  //
233
- // But projectDir CAN resolve to an actual branch clone workspace if the CLI
234
- // happens to be invoked with cwd inside one: branch clones are full git
235
- // clones (see GitManager.cloneRepo), so they carry their own
236
- // canopycms.config.ts and satisfy findProjectRoot just as well as the true
237
- // project root. Guard on that directly — a branch clone always has
238
- // .canopy-meta/branch.json (BranchMetadataFileManager), the live project
239
- // root never does — rather than assuming based on how migrate is "usually"
240
- // invoked. Computed BEFORE applying ops so the same check gates both the
241
- // surrogate schema lock below and the post-migration cache invalidation.
229
+ // But `projectDir` CAN be an actual branch clone if cwd is inside one (clones are
230
+ // full git checkouts, see GitManager.cloneRepo, with their own canopycms.config.ts).
231
+ // Guard on that directly: a branch clone always has .canopy-meta/branch.json, the
232
+ // live project root never does. Computed before applying ops so this one check
233
+ // gates both the surrogate schema lock below and the post-migration cache
234
+ // invalidation.
242
235
  const isBranchClone = Boolean(await BranchMetadataFileManager.loadOnly(projectDir));
243
236
  const applyOps = async () => {
244
237
  for (const op of ops) {
@@ -276,7 +269,6 @@ export async function migrate(options) {
276
269
  if (isBranchClone) {
277
270
  await invalidateBranchContentCaches(projectDir);
278
271
  }
279
- // Sanity-check the result: all .collection.json files must parse
280
272
  try {
281
273
  const result = await loadCollectionMetaFiles(contentDir);
282
274
  p.log.success(`Validated: ${result.collections.length} collection(s)${result.root ? ' + root' : ''} loaded cleanly.`);
@@ -4,19 +4,15 @@
4
4
  *
5
5
  * Everything here is best-effort by design: `init-deploy aws` must never fail
6
6
  * because a project has no git remote, no lockfile, or no git binary at all.
7
- * Each detector falls back to the value the templates used before detection
8
- * existed, so an npm project in a `main`-default repo gets byte-identical
9
- * output to what shipped previously.
7
+ * Each detector falls back to a fixed default (e.g. 'npm', 'main') it cannot
8
+ * verify, keeping the output deterministic instead of failing the command.
10
9
  */
11
10
  export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'yarn-berry';
12
11
  /**
13
- * The package-manager-specific command and file strings the deployment
14
- * templates need.
15
- *
16
- * These reach two very different places -- a GitHub Actions step and a
17
- * Dockerfile layer -- so they are kept together: a `Dockerfile.cms` that
18
- * installs with npm while the workflow installs with pnpm is exactly the
19
- * half-fix that moves a failure rather than removing it.
12
+ * Package-manager-specific command and file strings the deployment templates
13
+ * need, kept together because they reach two different places (a GitHub
14
+ * Actions step and a Dockerfile layer): a `Dockerfile.cms` using npm while
15
+ * the workflow uses pnpm would just move the failure, not remove it.
20
16
  */
21
17
  export interface PackageManagerCommands {
22
18
  /** Lockfile that identifies this manager, for the workflow's `paths:` filter. */
@@ -34,27 +30,21 @@ export interface PackageManagerCommands {
34
30
  }
35
31
  export declare function commandsFor(manager: PackageManager): PackageManagerCommands;
36
32
  /**
37
- * Identify the adopter's package manager.
38
- *
39
- * `packageManager` (the corepack field) wins when present -- it is the
40
- * declared intent. Otherwise the lockfile decides. With neither, we return
41
- * 'npm', which is what every template hardcoded before this existed.
33
+ * Identifies the adopter's package manager. `packageManager` (the corepack
34
+ * field) wins when present — it's the declared intent; otherwise the lockfile
35
+ * decides; with neither, this returns 'npm'.
42
36
  *
43
- * Yarn is split into classic vs Berry because the two need different install
44
- * flags and a different Docker build context, and `yarn.lock`'s *name* cannot
45
- * tell them apart -- only its first lines can.
37
+ * Yarn splits into classic vs Berry because the two need different install
38
+ * flags and Docker build contexts, and `yarn.lock`'s name alone can't tell
39
+ * them apart — only its first lines can.
46
40
  */
47
41
  export declare function detectPackageManager(projectDir: string): Promise<PackageManager>;
48
42
  /**
49
- * The branch the deploy workflow should trigger on.
50
- *
51
- * Only `origin/HEAD` counts. The obvious-looking fallback -- "use the branch
52
- * that's checked out" -- would be worse than the hardcoded `main` it replaces:
53
- * an adopter scaffolding from a setup branch would get
54
- * `branches: [add-cms]` baked into the workflow, so the deploy would go quiet
55
- * the moment that branch merged. That silent-trigger failure is the exact LOW
56
- * this detection exists to fix, so we do not reintroduce it in a
57
- * harder-to-predict form.
43
+ * The branch the deploy workflow should trigger on. Only `origin/HEAD` counts —
44
+ * "use the currently checked-out branch" looks like a better fallback than the
45
+ * hardcoded `main` it replaces, but scaffolding from a setup branch would bake
46
+ * `branches: [add-cms]` into the workflow, so the deploy would silently go
47
+ * quiet the moment that branch merges.
58
48
  */
59
49
  export declare function detectDefaultBranch(projectDir: string): Promise<string>;
60
50
  export interface GitHubRepo {
@@ -67,9 +57,6 @@ export interface GitHubRepo {
67
57
  * (`https://github.com/owner/repo`) forms.
68
58
  */
69
59
  export declare function detectGitHubRepo(projectDir: string): Promise<GitHubRepo | null>;
70
- type PackageJson = Record<string, unknown>;
71
- /** Read the adopter's package.json, or null when absent/unparseable. */
72
- export declare function readPackageJson(projectDir: string): Promise<PackageJson | null>;
73
60
  /**
74
61
  * Dependencies the generated CDK app needs at deploy time.
75
62
  *
@@ -89,4 +76,3 @@ export declare const CDK_DEPENDENCIES: readonly ["canopycms", "canopycms-cdk", "
89
76
  * manifest certainly has none of them installed.
90
77
  */
91
78
  export declare function missingCdkDependencies(projectDir: string): Promise<string[]>;
92
- export {};
@@ -4,9 +4,8 @@
4
4
  *
5
5
  * Everything here is best-effort by design: `init-deploy aws` must never fail
6
6
  * because a project has no git remote, no lockfile, or no git binary at all.
7
- * Each detector falls back to the value the templates used before detection
8
- * existed, so an npm project in a `main`-default repo gets byte-identical
9
- * output to what shipped previously.
7
+ * Each detector falls back to a fixed default (e.g. 'npm', 'main') it cannot
8
+ * verify, keeping the output deterministic instead of failing the command.
10
9
  */
11
10
  import fs from 'node:fs/promises';
12
11
  import path from 'node:path';
@@ -24,14 +23,13 @@ const COMMANDS = {
24
23
  pnpm: {
25
24
  lockfile: 'pnpm-lock.yaml',
26
25
  ciInstall: 'corepack enable && pnpm install --frozen-lockfile',
27
- // pnpm-workspace.yaml holds settings the install obeys even in a single-package app: pnpm
28
- // 11's `allowBuilds` decisions, `overrides`, `patchedDependencies`. pnpm 11 fails the
29
- // install on any dependency build script without a decision, and an app with the editor has
30
- // several (es5-ext through the editor, sharp through Next). The `[l]` glob keeps the file
31
- // optional: COPY rejects a missing literal source, but accepts a pattern that matches
32
- // nothing when another source matches. Measured 2026-09-13 on Docker Engine 29.6.2 (BuildKit
33
- // v0.31.2): `COPY package.json pnpm-workspace.yam[l] ./` builds with no pnpm-workspace.yaml
34
- // in the context, and the same line with the literal name fails with "not found".
26
+ // pnpm-workspace.yaml holds settings the install obeys even in a single-package app
27
+ // (pnpm 11's `allowBuilds` decisions, `overrides`, `patchedDependencies`); pnpm 11 fails
28
+ // the install on any dependency build script without a decision, and an app with the
29
+ // editor has several (es5-ext, sharp). The `[l]` glob keeps the file optional: on Docker
30
+ // Engine 29.6.2 (BuildKit v0.31.2), `COPY package.json pnpm-workspace.yam[l] ./` builds
31
+ // with no pnpm-workspace.yaml in the context, while the same line with the literal name
32
+ // fails with "not found".
35
33
  dockerCopy: 'COPY package.json pnpm-lock.yaml pnpm-workspace.yam[l] ./',
36
34
  dockerInstall: 'RUN corepack enable && pnpm install --frozen-lockfile',
37
35
  build: 'pnpm run build',
@@ -58,15 +56,13 @@ export function commandsFor(manager) {
58
56
  return COMMANDS[manager];
59
57
  }
60
58
  /**
61
- * Identify the adopter's package manager.
59
+ * Identifies the adopter's package manager. `packageManager` (the corepack
60
+ * field) wins when present — it's the declared intent; otherwise the lockfile
61
+ * decides; with neither, this returns 'npm'.
62
62
  *
63
- * `packageManager` (the corepack field) wins when present -- it is the
64
- * declared intent. Otherwise the lockfile decides. With neither, we return
65
- * 'npm', which is what every template hardcoded before this existed.
66
- *
67
- * Yarn is split into classic vs Berry because the two need different install
68
- * flags and a different Docker build context, and `yarn.lock`'s *name* cannot
69
- * tell them apart -- only its first lines can.
63
+ * Yarn splits into classic vs Berry because the two need different install
64
+ * flags and Docker build contexts, and `yarn.lock`'s name alone can't tell
65
+ * them apart — only its first lines can.
70
66
  */
71
67
  export async function detectPackageManager(projectDir) {
72
68
  for (const dir of await workspaceSearchPath(projectDir)) {
@@ -86,20 +82,17 @@ const MAX_WORKSPACE_DEPTH = 8;
86
82
  /**
87
83
  * Directories to consult for package-manager evidence, nearest first.
88
84
  *
89
- * Normally just `projectDir`. The exception is a monorepo: in a pnpm/npm/yarn
90
- * workspace the lockfile and `packageManager` field live at the repo root,
91
- * while the Next.js app -- the directory an adopter naturally runs
92
- * `init-deploy aws` in, because that is where `canopycms init` told them to
93
- * run -- is `apps/site` and has neither. Looking only at `projectDir` there
94
- * returns 'npm' for a pnpm repo and writes `npm ci` into both the workflow and
95
- * Dockerfile.cms: silently wrong, and the exact failure this detection exists
96
- * to prevent.
85
+ * Normally just `projectDir`. In a pnpm/npm/yarn monorepo the lockfile and
86
+ * `packageManager` field live at the repo root, while the Next.js app —
87
+ * where `canopycms init` told the adopter to run `init-deploy aws` — is a
88
+ * subdirectory (e.g. `apps/site`) with neither. Looking only at `projectDir`
89
+ * there would return 'npm' for a pnpm repo and silently write `npm ci` into
90
+ * both the workflow and Dockerfile.cms.
97
91
  *
98
- * The walk starts only when `projectDir` has a package.json but no evidence of
99
- * its own -- the signal of a workspace member -- and stops at the directory
100
- * holding `.git`. Both bounds matter: without them a project with no lockfile
101
- * anywhere would keep climbing into unrelated directories and adopt a
102
- * stranger's package manager.
92
+ * The walk starts only when `projectDir` has a package.json but no evidence
93
+ * of its own (the signal of a workspace member), and stops at the directory
94
+ * holding `.git` — otherwise a project with no lockfile anywhere would climb
95
+ * into unrelated directories and adopt a stranger's package manager.
103
96
  */
104
97
  async function workspaceSearchPath(projectDir) {
105
98
  const start = path.resolve(projectDir);
@@ -152,15 +145,11 @@ async function isYarnBerryLockfile(projectDir) {
152
145
  }
153
146
  }
154
147
  /**
155
- * The branch the deploy workflow should trigger on.
156
- *
157
- * Only `origin/HEAD` counts. The obvious-looking fallback -- "use the branch
158
- * that's checked out" -- would be worse than the hardcoded `main` it replaces:
159
- * an adopter scaffolding from a setup branch would get
160
- * `branches: [add-cms]` baked into the workflow, so the deploy would go quiet
161
- * the moment that branch merged. That silent-trigger failure is the exact LOW
162
- * this detection exists to fix, so we do not reintroduce it in a
163
- * harder-to-predict form.
148
+ * The branch the deploy workflow should trigger on. Only `origin/HEAD` counts —
149
+ * "use the currently checked-out branch" looks like a better fallback than the
150
+ * hardcoded `main` it replaces, but scaffolding from a setup branch would bake
151
+ * `branches: [add-cms]` into the workflow, so the deploy would silently go
152
+ * quiet the moment that branch merges.
164
153
  */
165
154
  export async function detectDefaultBranch(projectDir) {
166
155
  const head = await gitRaw(projectDir, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);
@@ -203,7 +192,7 @@ async function gitRaw(projectDir, args) {
203
192
  }
204
193
  }
205
194
  /** Read the adopter's package.json, or null when absent/unparseable. */
206
- export async function readPackageJson(projectDir) {
195
+ async function readPackageJson(projectDir) {
207
196
  try {
208
197
  const raw = await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8');
209
198
  const parsed = JSON.parse(raw);