canopycms 0.0.0 → 0.0.2
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.
- package/dist/auth/plugin.d.ts +8 -0
- package/dist/auth/plugin.d.ts.map +1 -1
- package/dist/build-mode.d.ts +15 -5
- package/dist/build-mode.d.ts.map +1 -1
- package/dist/build-mode.js +18 -8
- package/dist/build-mode.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +37 -36
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/template-files/ai-config.ts.template +21 -0
- package/dist/cli/template-files/ai-route.ts.template +10 -0
- package/dist/cli/template-files/canopy.ts.template +24 -0
- package/dist/cli/templates.d.ts +5 -1
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +9 -2
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/schemas/config.d.ts +4 -0
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +2 -0
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/types.d.ts +5 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/content-reader.js +2 -2
- package/dist/content-reader.js.map +1 -1
- package/dist/context.js +5 -5
- package/dist/context.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +15 -18
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/types.d.ts +8 -0
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +5 -4
- package/src/cli/init.ts +43 -38
- package/dist/__integration__/fixtures/content-seeds.d.ts +0 -43
- package/dist/__integration__/fixtures/content-seeds.d.ts.map +0 -1
- package/dist/__integration__/fixtures/content-seeds.js +0 -99
- package/dist/__integration__/fixtures/content-seeds.js.map +0 -1
- package/dist/__integration__/fixtures/schemas.d.ts +0 -12
- package/dist/__integration__/fixtures/schemas.d.ts.map +0 -1
- package/dist/__integration__/fixtures/schemas.js +0 -65
- package/dist/__integration__/fixtures/schemas.js.map +0 -1
- package/dist/__integration__/test-utils/api-client.d.ts +0 -123
- package/dist/__integration__/test-utils/api-client.d.ts.map +0 -1
- package/dist/__integration__/test-utils/api-client.js +0 -118
- package/dist/__integration__/test-utils/api-client.js.map +0 -1
- package/dist/__integration__/test-utils/multi-user.d.ts +0 -25
- package/dist/__integration__/test-utils/multi-user.d.ts.map +0 -1
- package/dist/__integration__/test-utils/multi-user.js +0 -105
- package/dist/__integration__/test-utils/multi-user.js.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.d.ts +0 -25
- package/dist/__integration__/test-utils/test-workspace.d.ts.map +0 -1
- package/dist/__integration__/test-utils/test-workspace.js +0 -102
- package/dist/__integration__/test-utils/test-workspace.js.map +0 -1
- package/dist/editor/BranchManager.stories.d.ts +0 -8
- package/dist/editor/BranchManager.stories.d.ts.map +0 -1
- package/dist/editor/BranchManager.stories.js +0 -74
- package/dist/editor/BranchManager.stories.js.map +0 -1
- package/dist/editor/CanopyEditor.stories.d.ts +0 -7
- package/dist/editor/CanopyEditor.stories.d.ts.map +0 -1
- package/dist/editor/CanopyEditor.stories.js +0 -99
- package/dist/editor/CanopyEditor.stories.js.map +0 -1
- package/dist/editor/CommentsPanel.stories.d.ts +0 -10
- package/dist/editor/CommentsPanel.stories.d.ts.map +0 -1
- package/dist/editor/CommentsPanel.stories.js +0 -175
- package/dist/editor/CommentsPanel.stories.js.map +0 -1
- package/dist/editor/Editor.stories.d.ts +0 -7
- package/dist/editor/Editor.stories.d.ts.map +0 -1
- package/dist/editor/Editor.stories.js +0 -95
- package/dist/editor/Editor.stories.js.map +0 -1
- package/dist/editor/EditorPanes.stories.d.ts +0 -7
- package/dist/editor/EditorPanes.stories.d.ts.map +0 -1
- package/dist/editor/EditorPanes.stories.js +0 -116
- package/dist/editor/EditorPanes.stories.js.map +0 -1
- package/dist/editor/EntryNavigator.stories.d.ts +0 -8
- package/dist/editor/EntryNavigator.stories.d.ts.map +0 -1
- package/dist/editor/EntryNavigator.stories.js +0 -42
- package/dist/editor/EntryNavigator.stories.js.map +0 -1
- package/dist/editor/FormRenderer.stories.d.ts +0 -7
- package/dist/editor/FormRenderer.stories.d.ts.map +0 -1
- package/dist/editor/FormRenderer.stories.js +0 -115
- package/dist/editor/FormRenderer.stories.js.map +0 -1
- package/dist/editor/GroupManager.stories.d.ts +0 -19
- package/dist/editor/GroupManager.stories.d.ts.map +0 -1
- package/dist/editor/GroupManager.stories.js +0 -265
- package/dist/editor/GroupManager.stories.js.map +0 -1
- package/dist/editor/PermissionManager.stories.d.ts +0 -20
- package/dist/editor/PermissionManager.stories.d.ts.map +0 -1
- package/dist/editor/PermissionManager.stories.js +0 -506
- package/dist/editor/PermissionManager.stories.js.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.d.ts +0 -10
- package/dist/editor/comments/FieldWrapper.stories.d.ts.map +0 -1
- package/dist/editor/comments/FieldWrapper.stories.js +0 -173
- package/dist/editor/comments/FieldWrapper.stories.js.map +0 -1
- package/dist/editor/fields/BlockField.stories.d.ts +0 -7
- package/dist/editor/fields/BlockField.stories.d.ts.map +0 -1
- package/dist/editor/fields/BlockField.stories.js +0 -50
- package/dist/editor/fields/BlockField.stories.js.map +0 -1
- package/dist/editor/fields/fields.stories.d.ts +0 -8
- package/dist/editor/fields/fields.stories.d.ts.map +0 -1
- package/dist/editor/fields/fields.stories.js +0 -34
- package/dist/editor/fields/fields.stories.js.map +0 -1
- package/dist/test-utils/api-test-helpers.d.ts +0 -238
- package/dist/test-utils/api-test-helpers.d.ts.map +0 -1
- package/dist/test-utils/api-test-helpers.js +0 -347
- package/dist/test-utils/api-test-helpers.js.map +0 -1
- package/dist/test-utils/console-spy.d.ts +0 -56
- package/dist/test-utils/console-spy.d.ts.map +0 -1
- package/dist/test-utils/console-spy.js +0 -81
- package/dist/test-utils/console-spy.js.map +0 -1
- package/dist/test-utils/git-helpers.d.ts +0 -21
- package/dist/test-utils/git-helpers.d.ts.map +0 -1
- package/dist/test-utils/git-helpers.js +0 -23
- package/dist/test-utils/git-helpers.js.map +0 -1
- package/dist/test-utils/index.d.ts +0 -5
- package/dist/test-utils/index.d.ts.map +0 -1
- package/dist/test-utils/index.js +0 -4
- package/dist/test-utils/index.js.map +0 -1
- package/src/__integration__/errors/invalid-content.test.ts +0 -238
- package/src/__integration__/errors/permission-denied.test.ts +0 -220
- package/src/__integration__/fixtures/content-seeds.ts +0 -105
- package/src/__integration__/fixtures/schemas.ts +0 -67
- package/src/__integration__/initialization/prod-sim-init.test.ts +0 -139
- package/src/__integration__/permissions/path-permissions.test.ts +0 -314
- package/src/__integration__/permissions/role-permissions.test.ts +0 -354
- package/src/__integration__/permissions/settings-branch-isolation.test.ts +0 -317
- package/src/__integration__/settings/groups-api.test.ts +0 -403
- package/src/__integration__/test-utils/api-client.ts +0 -167
- package/src/__integration__/test-utils/multi-user.ts +0 -129
- package/src/__integration__/test-utils/test-workspace.ts +0 -130
- package/src/__integration__/user/user-context.test.ts +0 -174
- package/src/__integration__/validation/input-validation.test.ts +0 -166
- package/src/__integration__/workflows/api-editing-workflow.test.ts +0 -244
- package/src/__integration__/workflows/conflict-resolution.test.ts +0 -259
- package/src/__integration__/workflows/editing-workflow.test.ts +0 -205
- package/src/__integration__/workflows/review-workflow.test.ts +0 -260
- package/src/ai/__tests__/build.integration.test.ts +0 -224
- package/src/ai/__tests__/generate.integration.test.ts +0 -495
- package/src/ai/__tests__/handler.integration.test.ts +0 -212
- package/src/ai/__tests__/json-to-markdown.test.ts +0 -553
- package/src/ai/generate.ts +0 -410
- package/src/ai/handler.ts +0 -123
- package/src/ai/index.ts +0 -26
- package/src/ai/json-to-markdown.ts +0 -424
- package/src/ai/resolve-branch.ts +0 -34
- package/src/ai/types.ts +0 -160
- package/src/api/AGENTS.md +0 -81
- package/src/api/__test__/mock-client.ts +0 -404
- package/src/api/assets.test.ts +0 -140
- package/src/api/assets.ts +0 -154
- package/src/api/branch-merge.test.ts +0 -163
- package/src/api/branch-merge.ts +0 -113
- package/src/api/branch-review.test.ts +0 -297
- package/src/api/branch-review.ts +0 -136
- package/src/api/branch-status.test.ts +0 -85
- package/src/api/branch-status.ts +0 -153
- package/src/api/branch-withdraw.test.ts +0 -146
- package/src/api/branch-withdraw.ts +0 -81
- package/src/api/branch-workflow.integration.test.ts +0 -578
- package/src/api/branch.test.ts +0 -620
- package/src/api/branch.ts +0 -492
- package/src/api/client.test.ts +0 -349
- package/src/api/client.ts +0 -506
- package/src/api/comments.test.ts +0 -285
- package/src/api/comments.ts +0 -210
- package/src/api/content.test.ts +0 -345
- package/src/api/content.ts +0 -454
- package/src/api/entries.test.ts +0 -1339
- package/src/api/entries.ts +0 -650
- package/src/api/github-sync.ts +0 -144
- package/src/api/groups.test.ts +0 -1013
- package/src/api/groups.ts +0 -375
- package/src/api/guards.test.ts +0 -533
- package/src/api/guards.ts +0 -271
- package/src/api/index.ts +0 -87
- package/src/api/permissions.test.ts +0 -766
- package/src/api/permissions.ts +0 -334
- package/src/api/reference-options.ts +0 -118
- package/src/api/resolve-references.ts +0 -107
- package/src/api/route-builder.ts +0 -289
- package/src/api/schema.test.ts +0 -840
- package/src/api/schema.ts +0 -936
- package/src/api/security.test.ts +0 -233
- package/src/api/settings-helpers.ts +0 -84
- package/src/api/types.ts +0 -40
- package/src/api/user.test.ts +0 -127
- package/src/api/user.ts +0 -42
- package/src/api/validators.test.ts +0 -275
- package/src/api/validators.ts +0 -176
- package/src/asset-store.test.ts +0 -37
- package/src/asset-store.ts +0 -110
- package/src/auth/cache.ts +0 -7
- package/src/auth/caching-auth-plugin.test.ts +0 -154
- package/src/auth/caching-auth-plugin.ts +0 -109
- package/src/auth/context-helpers.ts +0 -75
- package/src/auth/file-based-auth-cache.test.ts +0 -257
- package/src/auth/file-based-auth-cache.ts +0 -279
- package/src/auth/index.ts +0 -12
- package/src/auth/plugin.ts +0 -51
- package/src/auth/types.ts +0 -38
- package/src/authorization/__tests__/branch.test.ts +0 -260
- package/src/authorization/__tests__/content.test.ts +0 -142
- package/src/authorization/__tests__/path.test.ts +0 -133
- package/src/authorization/__tests__/permissions-loader.test.ts +0 -200
- package/src/authorization/branch.ts +0 -94
- package/src/authorization/content.ts +0 -93
- package/src/authorization/groups/index.ts +0 -11
- package/src/authorization/groups/loader.ts +0 -127
- package/src/authorization/groups/schema.ts +0 -48
- package/src/authorization/helpers.ts +0 -48
- package/src/authorization/index.ts +0 -84
- package/src/authorization/path.ts +0 -112
- package/src/authorization/permissions/index.ts +0 -11
- package/src/authorization/permissions/loader.ts +0 -116
- package/src/authorization/permissions/schema.ts +0 -66
- package/src/authorization/test-utils.ts +0 -15
- package/src/authorization/types.ts +0 -66
- package/src/authorization/validation.test.ts +0 -100
- package/src/authorization/validation.ts +0 -62
- package/src/branch-metadata.test.ts +0 -168
- package/src/branch-metadata.ts +0 -166
- package/src/branch-registry.test.ts +0 -248
- package/src/branch-registry.ts +0 -152
- package/src/branch-schema-cache.test.ts +0 -275
- package/src/branch-schema-cache.ts +0 -189
- package/src/branch-workspace.test.ts +0 -183
- package/src/branch-workspace.ts +0 -124
- package/src/build/generate-ai-content.ts +0 -78
- package/src/build/index.ts +0 -8
- package/src/build-mode.ts +0 -27
- package/src/cli/generate-ai-content.ts +0 -100
- package/src/cli/init.test.ts +0 -240
- package/src/cli/templates/canopy.ts.template +0 -55
- package/src/cli/templates.ts +0 -47
- package/src/client.ts +0 -12
- package/src/comment-store.test.ts +0 -442
- package/src/comment-store.ts +0 -301
- package/src/config/__tests__/config.test.ts +0 -513
- package/src/config/flatten.ts +0 -174
- package/src/config/helpers.ts +0 -167
- package/src/config/index.ts +0 -86
- package/src/config/schemas/collection.ts +0 -67
- package/src/config/schemas/config.ts +0 -77
- package/src/config/schemas/field.ts +0 -108
- package/src/config/schemas/media.ts +0 -27
- package/src/config/schemas/permissions.ts +0 -21
- package/src/config/types.ts +0 -321
- package/src/config/validation.ts +0 -70
- package/src/config-test.ts +0 -65
- package/src/config.ts +0 -11
- package/src/content-id-index.test.ts +0 -512
- package/src/content-id-index.ts +0 -479
- package/src/content-reader.test.ts +0 -478
- package/src/content-reader.ts +0 -214
- package/src/content-store.test.ts +0 -1126
- package/src/content-store.ts +0 -793
- package/src/context.ts +0 -111
- package/src/editor/BranchManager.stories.tsx +0 -80
- package/src/editor/BranchManager.test.tsx +0 -324
- package/src/editor/BranchManager.tsx +0 -461
- package/src/editor/CanopyEditor.stories.tsx +0 -128
- package/src/editor/CanopyEditor.test.tsx +0 -81
- package/src/editor/CanopyEditor.tsx +0 -73
- package/src/editor/CanopyEditorPage.test.tsx +0 -59
- package/src/editor/CanopyEditorPage.tsx +0 -25
- package/src/editor/CommentsPanel.stories.tsx +0 -184
- package/src/editor/CommentsPanel.tsx +0 -338
- package/src/editor/Editor.integration.test.tsx +0 -227
- package/src/editor/Editor.stories.tsx +0 -119
- package/src/editor/Editor.tsx +0 -1221
- package/src/editor/EditorPanes.stories.tsx +0 -256
- package/src/editor/EditorPanes.test.tsx +0 -77
- package/src/editor/EditorPanes.tsx +0 -180
- package/src/editor/EntryNavigator.stories.tsx +0 -65
- package/src/editor/EntryNavigator.test.tsx +0 -598
- package/src/editor/EntryNavigator.tsx +0 -665
- package/src/editor/FormRenderer.stories.tsx +0 -212
- package/src/editor/FormRenderer.test.tsx +0 -194
- package/src/editor/FormRenderer.tsx +0 -432
- package/src/editor/GroupManager.stories.tsx +0 -301
- package/src/editor/GroupManager.test.tsx +0 -682
- package/src/editor/GroupManager.tsx +0 -9
- package/src/editor/PermissionManager.stories.tsx +0 -539
- package/src/editor/PermissionManager.test.tsx +0 -864
- package/src/editor/PermissionManager.tsx +0 -12
- package/src/editor/canopy-path.test.ts +0 -23
- package/src/editor/canopy-path.ts +0 -52
- package/src/editor/client-reference-resolver.ts +0 -118
- package/src/editor/comments/BranchComments.tsx +0 -93
- package/src/editor/comments/EntryComments.tsx +0 -94
- package/src/editor/comments/FieldWrapper.stories.tsx +0 -210
- package/src/editor/comments/FieldWrapper.tsx +0 -129
- package/src/editor/comments/InlineCommentThread.test.tsx +0 -384
- package/src/editor/comments/InlineCommentThread.tsx +0 -246
- package/src/editor/comments/ThreadCarousel.test.tsx +0 -393
- package/src/editor/comments/ThreadCarousel.tsx +0 -525
- package/src/editor/components/ConfirmDeleteModal.tsx +0 -49
- package/src/editor/components/EditorContext.tsx +0 -49
- package/src/editor/components/EditorFooter.tsx +0 -47
- package/src/editor/components/EditorHeader.tsx +0 -492
- package/src/editor/components/EditorSidebar.tsx +0 -193
- package/src/editor/components/EntryCreateModal.tsx +0 -193
- package/src/editor/components/RenameEntryModal.tsx +0 -152
- package/src/editor/components/UserBadge.test.tsx +0 -274
- package/src/editor/components/UserBadge.tsx +0 -240
- package/src/editor/components/index.ts +0 -6
- package/src/editor/context/ApiClientContext.tsx +0 -56
- package/src/editor/context/EditorStateContext.tsx +0 -221
- package/src/editor/context/index.ts +0 -40
- package/src/editor/editor-config.test.ts +0 -385
- package/src/editor/editor-config.ts +0 -94
- package/src/editor/editor-utils.test.ts +0 -772
- package/src/editor/editor-utils.ts +0 -303
- package/src/editor/env.ts +0 -4
- package/src/editor/fields/BlockField.stories.tsx +0 -79
- package/src/editor/fields/BlockField.tsx +0 -267
- package/src/editor/fields/CodeField.tsx +0 -41
- package/src/editor/fields/MarkdownField.tsx +0 -205
- package/src/editor/fields/ObjectField.tsx +0 -71
- package/src/editor/fields/ReferenceField.tsx +0 -138
- package/src/editor/fields/SelectField.tsx +0 -76
- package/src/editor/fields/TextField.tsx +0 -35
- package/src/editor/fields/ToggleField.tsx +0 -37
- package/src/editor/fields/fields.stories.tsx +0 -40
- package/src/editor/group-manager/ExternalGroupsTab.tsx +0 -114
- package/src/editor/group-manager/GroupCard.tsx +0 -102
- package/src/editor/group-manager/GroupForm.tsx +0 -66
- package/src/editor/group-manager/InternalGroupsTab.tsx +0 -147
- package/src/editor/group-manager/MemberList.tsx +0 -184
- package/src/editor/group-manager/hooks/useExternalGroupSearch.ts +0 -63
- package/src/editor/group-manager/hooks/useGroupState.ts +0 -134
- package/src/editor/group-manager/hooks/useUserSearch.ts +0 -84
- package/src/editor/group-manager/index.tsx +0 -210
- package/src/editor/group-manager/types.ts +0 -28
- package/src/editor/hooks/README.md +0 -26
- package/src/editor/hooks/__test__/test-utils.tsx +0 -183
- package/src/editor/hooks/index.ts +0 -23
- package/src/editor/hooks/useBranchActions.test.tsx +0 -267
- package/src/editor/hooks/useBranchActions.tsx +0 -121
- package/src/editor/hooks/useBranchManager.test.tsx +0 -391
- package/src/editor/hooks/useBranchManager.tsx +0 -326
- package/src/editor/hooks/useCommentSystem.test.ts +0 -615
- package/src/editor/hooks/useCommentSystem.ts +0 -347
- package/src/editor/hooks/useDraftManager.test.ts +0 -375
- package/src/editor/hooks/useDraftManager.ts +0 -259
- package/src/editor/hooks/useEditorLayout.test.ts +0 -147
- package/src/editor/hooks/useEditorLayout.ts +0 -67
- package/src/editor/hooks/useEntryManager.test.ts +0 -588
- package/src/editor/hooks/useEntryManager.ts +0 -387
- package/src/editor/hooks/useGroupManager.test.ts +0 -277
- package/src/editor/hooks/useGroupManager.ts +0 -139
- package/src/editor/hooks/usePermissionManager.test.ts +0 -211
- package/src/editor/hooks/usePermissionManager.ts +0 -113
- package/src/editor/hooks/useReferenceResolution.ts +0 -248
- package/src/editor/hooks/useSchemaManager.test.ts +0 -370
- package/src/editor/hooks/useSchemaManager.ts +0 -310
- package/src/editor/hooks/useUserContext.tsx +0 -57
- package/src/editor/hooks/useUserMetadata.test.ts +0 -191
- package/src/editor/hooks/useUserMetadata.ts +0 -71
- package/src/editor/permission-manager/GroupSelector.tsx +0 -73
- package/src/editor/permission-manager/PermissionEditor.tsx +0 -321
- package/src/editor/permission-manager/PermissionLevelBadge.tsx +0 -53
- package/src/editor/permission-manager/PermissionTree.tsx +0 -237
- package/src/editor/permission-manager/UserSelector.tsx +0 -95
- package/src/editor/permission-manager/constants.tsx +0 -18
- package/src/editor/permission-manager/hooks/useGroupsAndUsers.ts +0 -153
- package/src/editor/permission-manager/hooks/usePermissionTree.ts +0 -200
- package/src/editor/permission-manager/index.tsx +0 -294
- package/src/editor/permission-manager/types.ts +0 -58
- package/src/editor/permission-manager/utils.ts +0 -179
- package/src/editor/preview-bridge.test.tsx +0 -50
- package/src/editor/preview-bridge.tsx +0 -294
- package/src/editor/schema-editor/CollectionEditor.test.tsx +0 -238
- package/src/editor/schema-editor/CollectionEditor.tsx +0 -520
- package/src/editor/schema-editor/EntryTypeEditor.test.tsx +0 -215
- package/src/editor/schema-editor/EntryTypeEditor.tsx +0 -367
- package/src/editor/schema-editor/index.ts +0 -19
- package/src/editor/setup-test-dom.ts +0 -10
- package/src/editor/test-setup.ts +0 -33
- package/src/editor/theme.tsx +0 -119
- package/src/editor/utils/env.ts +0 -39
- package/src/entry-schema-registry.test.ts +0 -281
- package/src/entry-schema-registry.ts +0 -121
- package/src/entry-schema.ts +0 -84
- package/src/git-manager.test.ts +0 -552
- package/src/git-manager.ts +0 -667
- package/src/github-service.test.ts +0 -312
- package/src/github-service.ts +0 -295
- package/src/http/handler.test.ts +0 -275
- package/src/http/handler.ts +0 -280
- package/src/http/index.ts +0 -11
- package/src/http/router.ts +0 -164
- package/src/http/types.ts +0 -44
- package/src/id.test.ts +0 -48
- package/src/id.ts +0 -22
- package/src/index.ts +0 -26
- package/src/operating-mode/__tests__/strategies.test.ts +0 -511
- package/src/operating-mode/client-safe-strategy.ts +0 -184
- package/src/operating-mode/client-unsafe-strategy.ts +0 -303
- package/src/operating-mode/client.ts +0 -13
- package/src/operating-mode/index.ts +0 -34
- package/src/operating-mode/types.ts +0 -186
- package/src/paths/__tests__/branch.test.ts +0 -53
- package/src/paths/__tests__/normalize.test.ts +0 -141
- package/src/paths/__tests__/resolve.test.ts +0 -207
- package/src/paths/__tests__/validation.test.ts +0 -61
- package/src/paths/branch.ts +0 -115
- package/src/paths/index.ts +0 -73
- package/src/paths/normalize-server.ts +0 -40
- package/src/paths/normalize.ts +0 -107
- package/src/paths/resolve.ts +0 -61
- package/src/paths/test-utils.ts +0 -37
- package/src/paths/types.ts +0 -68
- package/src/paths/validation.test.ts +0 -480
- package/src/paths/validation.ts +0 -391
- package/src/reference-resolver.test.ts +0 -107
- package/src/reference-resolver.ts +0 -157
- package/src/schema/index.ts +0 -29
- package/src/schema/meta-loader.ts +0 -366
- package/src/schema/resolver.ts +0 -83
- package/src/schema/schema-store-types.ts +0 -56
- package/src/schema/schema-store.test.ts +0 -816
- package/src/schema/schema-store.ts +0 -795
- package/src/schema/types.ts +0 -33
- package/src/schema-meta-loader.test.ts +0 -447
- package/src/server.ts +0 -15
- package/src/services.test.ts +0 -559
- package/src/services.ts +0 -373
- package/src/settings-branch-utils.ts +0 -53
- package/src/settings-workspace.ts +0 -156
- package/src/task-queue/README.md +0 -144
- package/src/task-queue/index.ts +0 -14
- package/src/task-queue/task-queue.test.ts +0 -524
- package/src/task-queue/task-queue.ts +0 -514
- package/src/task-queue/types.ts +0 -41
- package/src/test-utils/api-test-helpers.ts +0 -445
- package/src/test-utils/console-spy.test.ts +0 -14
- package/src/test-utils/console-spy.ts +0 -125
- package/src/test-utils/git-helpers.ts +0 -31
- package/src/test-utils/index.ts +0 -4
- package/src/types.ts +0 -54
- package/src/user.ts +0 -118
- package/src/utils/debug.test.ts +0 -114
- package/src/utils/debug.ts +0 -127
- package/src/utils/error.test.ts +0 -92
- package/src/utils/error.ts +0 -83
- package/src/utils/format.ts +0 -12
- package/src/validation/__tests__/field-traversal.test.ts +0 -263
- package/src/validation/deletion-checker.ts +0 -234
- package/src/validation/field-traversal.ts +0 -146
- package/src/validation/reference-validator.ts +0 -168
- package/src/worker/cms-worker-rebase.test.ts +0 -473
- package/src/worker/cms-worker.ts +0 -777
- package/src/worker/integration.test.ts +0 -289
- package/src/worker/task-queue-config.ts +0 -25
- package/src/worker/task-queue.test.ts +0 -452
- package/src/worker/task-queue.ts +0 -58
- /package/{src/cli/templates → dist/cli/template-files}/Dockerfile.cms.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/canopycms.config.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/deploy-cms.yml.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/edit-page.tsx.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/route.ts.template +0 -0
- /package/{src/cli/templates → dist/cli/template-files}/schemas.ts.template +0 -0
package/src/comment-store.ts
DELETED
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises'
|
|
2
|
-
import path from 'node:path'
|
|
3
|
-
import { randomUUID } from 'node:crypto'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Error thrown when a concurrent modification is detected.
|
|
7
|
-
* Operations that encounter this error will automatically retry.
|
|
8
|
-
*/
|
|
9
|
-
export class CommentStoreConflictError extends Error {
|
|
10
|
-
constructor() {
|
|
11
|
-
super('Concurrent modification detected')
|
|
12
|
-
this.name = 'CommentStoreConflictError'
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type CommentType = 'field' | 'entry' | 'branch'
|
|
17
|
-
|
|
18
|
-
export interface Comment {
|
|
19
|
-
id: string
|
|
20
|
-
threadId: string
|
|
21
|
-
userId: string
|
|
22
|
-
timestamp: string // ISO string for individual comment
|
|
23
|
-
text: string
|
|
24
|
-
// Note: No resolved flag on individual comments
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface CommentThread {
|
|
28
|
-
id: string
|
|
29
|
-
comments: Comment[] // Sorted by timestamp (oldest first)
|
|
30
|
-
resolved: boolean // Applies to entire thread
|
|
31
|
-
createdAt: string // ISO string, timestamp of first comment (for sorting)
|
|
32
|
-
resolvedBy?: string // userId who resolved (for audit trail)
|
|
33
|
-
resolvedAt?: string // ISO string
|
|
34
|
-
type: CommentType
|
|
35
|
-
authorId: string // userId of thread creator (for resolve permission)
|
|
36
|
-
|
|
37
|
-
// Addressing (all optional based on type)
|
|
38
|
-
entryPath?: string // Required for field/entry, undefined for branch
|
|
39
|
-
canopyPath?: string // Required for field, undefined for entry/branch
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface CommentsFile {
|
|
43
|
-
schemaVersion: number
|
|
44
|
-
version: number // Incremented on each write for optimistic locking
|
|
45
|
-
writeId?: string // Unique ID for each write, used to verify write ownership
|
|
46
|
-
threads: Record<string, CommentThread>
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Manages comment storage for a branch workspace.
|
|
51
|
-
* Comments are stored in .canopy-meta/comments.json and are NOT committed to git.
|
|
52
|
-
*
|
|
53
|
-
* Uses optimistic locking with retry to handle concurrent modifications safely.
|
|
54
|
-
* This is non-blocking - conflicts are detected via version mismatch and retried.
|
|
55
|
-
*/
|
|
56
|
-
export class CommentStore {
|
|
57
|
-
private filePath: string
|
|
58
|
-
private loadedVersion: number | null = null
|
|
59
|
-
|
|
60
|
-
constructor(branchRoot: string) {
|
|
61
|
-
this.filePath = path.join(branchRoot, '.canopy-meta', 'comments.json')
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Load comments file. Tracks version for optimistic locking.
|
|
66
|
-
*/
|
|
67
|
-
async load(): Promise<CommentsFile> {
|
|
68
|
-
try {
|
|
69
|
-
const content = await fs.readFile(this.filePath, 'utf-8')
|
|
70
|
-
const data = JSON.parse(content) as CommentsFile
|
|
71
|
-
// Backward compat: treat missing version as 0
|
|
72
|
-
this.loadedVersion = data.version ?? 0
|
|
73
|
-
return { ...data, version: this.loadedVersion }
|
|
74
|
-
} catch {
|
|
75
|
-
// File doesn't exist yet, return empty structure
|
|
76
|
-
this.loadedVersion = null
|
|
77
|
-
return {
|
|
78
|
-
schemaVersion: 1,
|
|
79
|
-
version: 0,
|
|
80
|
-
threads: {},
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Save comments file with optimistic locking.
|
|
87
|
-
* Uses atomic temp-file write to prevent corruption.
|
|
88
|
-
*
|
|
89
|
-
* For new files (expectedVersion === null): uses exclusive create to prevent races
|
|
90
|
-
* For existing files: uses atomic rename with post-write verification
|
|
91
|
-
*
|
|
92
|
-
* @throws CommentStoreConflictError if version has changed since load
|
|
93
|
-
*/
|
|
94
|
-
private async save(data: CommentsFile, expectedVersion: number | null): Promise<void> {
|
|
95
|
-
await fs.mkdir(path.dirname(this.filePath), { recursive: true })
|
|
96
|
-
|
|
97
|
-
// Increment version and generate unique write ID for ownership verification
|
|
98
|
-
// New files start at version 1, existing files increment by 1
|
|
99
|
-
const newVersion = expectedVersion === null ? 1 : expectedVersion + 1
|
|
100
|
-
const writeId = randomUUID()
|
|
101
|
-
const newData = { ...data, version: newVersion, writeId }
|
|
102
|
-
const content = JSON.stringify(newData, null, 2)
|
|
103
|
-
const tempPath = `${this.filePath}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`
|
|
104
|
-
|
|
105
|
-
if (expectedVersion === null) {
|
|
106
|
-
// New file case: use exclusive create flag to prevent race
|
|
107
|
-
// If file already exists, this will throw EEXIST
|
|
108
|
-
try {
|
|
109
|
-
await fs.writeFile(this.filePath, content, { flag: 'wx' })
|
|
110
|
-
return
|
|
111
|
-
} catch (err: unknown) {
|
|
112
|
-
if ((err as NodeJS.ErrnoException).code === 'EEXIST') {
|
|
113
|
-
// File was created by another process, conflict
|
|
114
|
-
throw new CommentStoreConflictError()
|
|
115
|
-
}
|
|
116
|
-
throw err
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Existing file case: write to temp, atomic rename, then verify we won
|
|
121
|
-
await fs.writeFile(tempPath, content, 'utf-8')
|
|
122
|
-
|
|
123
|
-
try {
|
|
124
|
-
// First check: verify expected version before rename
|
|
125
|
-
let currentVersion: number | null = null
|
|
126
|
-
try {
|
|
127
|
-
const current = JSON.parse(await fs.readFile(this.filePath, 'utf-8'))
|
|
128
|
-
currentVersion = current.version ?? 0
|
|
129
|
-
} catch {
|
|
130
|
-
currentVersion = null
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (currentVersion !== expectedVersion) {
|
|
134
|
-
throw new CommentStoreConflictError()
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Atomic rename
|
|
138
|
-
await fs.rename(tempPath, this.filePath)
|
|
139
|
-
|
|
140
|
-
// Post-write verification with settling delay
|
|
141
|
-
// Wait to let concurrent renames complete on shared filesystems (EFS/NFS), then verify our writeId
|
|
142
|
-
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
143
|
-
|
|
144
|
-
const afterWrite = JSON.parse(await fs.readFile(this.filePath, 'utf-8'))
|
|
145
|
-
if (afterWrite.writeId !== writeId) {
|
|
146
|
-
// Another process won the race - our write was overwritten
|
|
147
|
-
throw new CommentStoreConflictError()
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
// Clean up temp file on any error (may already be renamed away)
|
|
151
|
-
await fs.unlink(tempPath).catch(() => {})
|
|
152
|
-
throw err
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Retry an operation that may fail due to concurrent modification.
|
|
158
|
-
* Non-blocking - reloads and retries on conflict with exponential backoff.
|
|
159
|
-
*/
|
|
160
|
-
private async withRetry<T>(operation: () => Promise<T>, maxAttempts = 10): Promise<T> {
|
|
161
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
162
|
-
try {
|
|
163
|
-
return await operation()
|
|
164
|
-
} catch (err) {
|
|
165
|
-
if (err instanceof CommentStoreConflictError && attempt < maxAttempts) {
|
|
166
|
-
// Reset loaded version and retry with exponential backoff + jitter
|
|
167
|
-
this.loadedVersion = null
|
|
168
|
-
const baseDelay = Math.min(10 * Math.pow(2, attempt - 1), 100) // 10, 20, 40, 80, 100ms cap
|
|
169
|
-
const jitter = Math.random() * baseDelay
|
|
170
|
-
await new Promise((resolve) => setTimeout(resolve, baseDelay + jitter))
|
|
171
|
-
continue
|
|
172
|
-
}
|
|
173
|
-
throw err
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
throw new Error('Unreachable')
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
async addComment(options: {
|
|
180
|
-
userId: string
|
|
181
|
-
text: string
|
|
182
|
-
threadId?: string
|
|
183
|
-
type: CommentType
|
|
184
|
-
entryPath?: string
|
|
185
|
-
canopyPath?: string
|
|
186
|
-
}): Promise<{ threadId: string; commentId: string }> {
|
|
187
|
-
// Generate IDs outside retry so they stay stable across retries
|
|
188
|
-
const threadId = options.threadId || randomUUID()
|
|
189
|
-
const commentId = randomUUID()
|
|
190
|
-
|
|
191
|
-
return this.withRetry(async () => {
|
|
192
|
-
const data = await this.load()
|
|
193
|
-
const timestamp = new Date().toISOString()
|
|
194
|
-
|
|
195
|
-
const comment: Comment = {
|
|
196
|
-
id: commentId,
|
|
197
|
-
threadId,
|
|
198
|
-
userId: options.userId,
|
|
199
|
-
timestamp,
|
|
200
|
-
text: options.text,
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (!data.threads[threadId]) {
|
|
204
|
-
// Create new thread
|
|
205
|
-
data.threads[threadId] = {
|
|
206
|
-
id: threadId,
|
|
207
|
-
comments: [comment],
|
|
208
|
-
resolved: false,
|
|
209
|
-
createdAt: timestamp,
|
|
210
|
-
type: options.type,
|
|
211
|
-
authorId: options.userId,
|
|
212
|
-
entryPath: options.entryPath,
|
|
213
|
-
canopyPath: options.canopyPath,
|
|
214
|
-
}
|
|
215
|
-
} else {
|
|
216
|
-
// Add to existing thread
|
|
217
|
-
data.threads[threadId].comments.push(comment)
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
await this.save(data, this.loadedVersion)
|
|
221
|
-
return { threadId, commentId }
|
|
222
|
-
})
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
async resolveThread(threadId: string, userId: string): Promise<boolean> {
|
|
226
|
-
return this.withRetry(async () => {
|
|
227
|
-
const data = await this.load()
|
|
228
|
-
|
|
229
|
-
if (!data.threads[threadId]) {
|
|
230
|
-
return false
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
data.threads[threadId].resolved = true
|
|
234
|
-
data.threads[threadId].resolvedBy = userId
|
|
235
|
-
data.threads[threadId].resolvedAt = new Date().toISOString()
|
|
236
|
-
|
|
237
|
-
await this.save(data, this.loadedVersion)
|
|
238
|
-
return true
|
|
239
|
-
})
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
async listThreads(options?: { includeResolved?: boolean }): Promise<CommentThread[]> {
|
|
243
|
-
const data = await this.load()
|
|
244
|
-
const threads = Object.values(data.threads)
|
|
245
|
-
|
|
246
|
-
if (options?.includeResolved === false) {
|
|
247
|
-
return threads.filter((t) => !t.resolved)
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return threads
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async getThread(threadId: string): Promise<CommentThread | null> {
|
|
254
|
-
const data = await this.load()
|
|
255
|
-
return data.threads[threadId] || null
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
async deleteThread(threadId: string): Promise<boolean> {
|
|
259
|
-
return this.withRetry(async () => {
|
|
260
|
-
const data = await this.load()
|
|
261
|
-
|
|
262
|
-
if (!data.threads[threadId]) {
|
|
263
|
-
return false
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
delete data.threads[threadId]
|
|
267
|
-
await this.save(data, this.loadedVersion)
|
|
268
|
-
return true
|
|
269
|
-
})
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Get all threads for a specific field
|
|
274
|
-
*/
|
|
275
|
-
async getThreadsForField(entryPath: string, canopyPath: string): Promise<CommentThread[]> {
|
|
276
|
-
const data = await this.load()
|
|
277
|
-
return Object.values(data.threads)
|
|
278
|
-
.filter((t) => t.type === 'field' && t.entryPath === entryPath && t.canopyPath === canopyPath)
|
|
279
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt))
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Get all threads for a specific entry (not field-specific)
|
|
284
|
-
*/
|
|
285
|
-
async getThreadsForEntry(entryPath: string): Promise<CommentThread[]> {
|
|
286
|
-
const data = await this.load()
|
|
287
|
-
return Object.values(data.threads)
|
|
288
|
-
.filter((t) => t.type === 'entry' && t.entryPath === entryPath)
|
|
289
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt))
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* Get all branch-level threads
|
|
294
|
-
*/
|
|
295
|
-
async getBranchThreads(): Promise<CommentThread[]> {
|
|
296
|
-
const data = await this.load()
|
|
297
|
-
return Object.values(data.threads)
|
|
298
|
-
.filter((t) => t.type === 'branch')
|
|
299
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt))
|
|
300
|
-
}
|
|
301
|
-
}
|