canopycms 0.0.58 → 0.0.60
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/api/__test__/mock-client.js +4 -4
- package/dist/api/__test__/mock-client.js.map +1 -1
- package/dist/api/branch-merge.d.ts.map +1 -1
- package/dist/api/branch-merge.js +2 -6
- package/dist/api/branch-merge.js.map +1 -1
- package/dist/api/branch-withdraw.d.ts.map +1 -1
- package/dist/api/branch-withdraw.js +19 -4
- package/dist/api/branch-withdraw.js.map +1 -1
- package/dist/api/entries.d.ts.map +1 -1
- package/dist/api/entries.js +22 -3
- package/dist/api/entries.js.map +1 -1
- package/dist/api/groups.d.ts +3 -0
- package/dist/api/groups.d.ts.map +1 -1
- package/dist/api/groups.js +89 -68
- package/dist/api/groups.js.map +1 -1
- package/dist/api/permissions.d.ts +1 -0
- package/dist/api/permissions.d.ts.map +1 -1
- package/dist/api/permissions.js +23 -20
- package/dist/api/permissions.js.map +1 -1
- package/dist/api/schema.d.ts.map +1 -1
- package/dist/api/schema.js +29 -15
- package/dist/api/schema.js.map +1 -1
- package/dist/authorization/groups/index.d.ts +1 -1
- package/dist/authorization/groups/index.d.ts.map +1 -1
- package/dist/authorization/groups/index.js +1 -1
- package/dist/authorization/groups/index.js.map +1 -1
- package/dist/authorization/groups/loader.d.ts +25 -4
- package/dist/authorization/groups/loader.d.ts.map +1 -1
- package/dist/authorization/groups/loader.js +39 -20
- package/dist/authorization/groups/loader.js.map +1 -1
- package/dist/authorization/groups/schema.d.ts +8 -7
- package/dist/authorization/groups/schema.d.ts.map +1 -1
- package/dist/authorization/groups/schema.js +8 -4
- package/dist/authorization/groups/schema.js.map +1 -1
- package/dist/authorization/index.d.ts +4 -3
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +6 -3
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/path.d.ts +8 -0
- package/dist/authorization/path.d.ts.map +1 -1
- package/dist/authorization/path.js +16 -1
- package/dist/authorization/path.js.map +1 -1
- package/dist/authorization/permissions/index.d.ts +1 -1
- package/dist/authorization/permissions/index.d.ts.map +1 -1
- package/dist/authorization/permissions/index.js +1 -1
- package/dist/authorization/permissions/index.js.map +1 -1
- package/dist/authorization/permissions/loader.d.ts +18 -4
- package/dist/authorization/permissions/loader.d.ts.map +1 -1
- package/dist/authorization/permissions/loader.js +35 -24
- package/dist/authorization/permissions/loader.js.map +1 -1
- package/dist/authorization/permissions/schema.d.ts +8 -7
- package/dist/authorization/permissions/schema.d.ts.map +1 -1
- package/dist/authorization/permissions/schema.js +8 -4
- package/dist/authorization/permissions/schema.js.map +1 -1
- package/dist/authorization/settings-file-store.d.ts +127 -0
- package/dist/authorization/settings-file-store.d.ts.map +1 -0
- package/dist/authorization/settings-file-store.js +156 -0
- package/dist/authorization/settings-file-store.js.map +1 -0
- package/dist/branch-metadata.d.ts +11 -0
- package/dist/branch-metadata.d.ts.map +1 -1
- package/dist/branch-metadata.js +22 -0
- package/dist/branch-metadata.js.map +1 -1
- package/dist/branch-workspace.d.ts.map +1 -1
- package/dist/branch-workspace.js +1 -0
- package/dist/branch-workspace.js.map +1 -1
- package/dist/cli/cli.d.ts +20 -0
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +9618 -246
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/generate-ai-content.js +101 -12
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +25 -3
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +39 -11
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/template-files/Dockerfile.cms.template +33 -1
- package/dist/cli/template-files/deploy-cms.yml.template +9 -1
- package/dist/cli/template-files/dockerignore.template +13 -0
- package/dist/cli/template-files/middleware-clerk.ts.template +12 -5
- package/dist/cli/template-files/middleware.ts.template +10 -5
- package/dist/cli/templates.d.ts +1 -0
- package/dist/cli/templates.d.ts.map +1 -1
- package/dist/cli/templates.js +3 -0
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schemas/config.d.ts +68 -6
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +32 -2
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config/types.d.ts +31 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +25 -3
- package/dist/context.js.map +1 -1
- package/dist/editor/BranchManager.d.ts +3 -0
- package/dist/editor/BranchManager.d.ts.map +1 -1
- package/dist/editor/BranchManager.js +18 -5
- package/dist/editor/BranchManager.js.map +1 -1
- package/dist/editor/hooks/useBranchManager.d.ts +3 -1
- package/dist/editor/hooks/useBranchManager.d.ts.map +1 -1
- package/dist/editor/hooks/useBranchManager.js +2 -0
- package/dist/editor/hooks/useBranchManager.js.map +1 -1
- package/dist/editor/hooks/useGroupManager.d.ts.map +1 -1
- package/dist/editor/hooks/useGroupManager.js +13 -2
- package/dist/editor/hooks/useGroupManager.js.map +1 -1
- package/dist/editor/hooks/usePermissionManager.d.ts.map +1 -1
- package/dist/editor/hooks/usePermissionManager.js +13 -2
- package/dist/editor/hooks/usePermissionManager.js.map +1 -1
- package/dist/git-manager.d.ts +39 -0
- package/dist/git-manager.d.ts.map +1 -1
- package/dist/git-manager.js +104 -8
- package/dist/git-manager.js.map +1 -1
- package/dist/schema/schema-store.d.ts +98 -0
- package/dist/schema/schema-store.d.ts.map +1 -1
- package/dist/schema/schema-store.js +187 -29
- package/dist/schema/schema-store.js.map +1 -1
- package/dist/settings-workspace.d.ts.map +1 -1
- package/dist/settings-workspace.js +1 -0
- package/dist/settings-workspace.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/git.d.ts +19 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +47 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/worker/cms-worker.d.ts +64 -0
- package/dist/worker/cms-worker.d.ts.map +1 -1
- package/dist/worker/cms-worker.js +318 -28
- package/dist/worker/cms-worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -36,12 +36,19 @@ export const getBranchPermissions = (branch, user) => {
|
|
|
36
36
|
const canPerformWorkflowActions = userIsCreator || userInACL || isSystemBranch || userIsAdmin || userIsReviewer;
|
|
37
37
|
// Submit: Can perform workflow actions AND branch is in editing status
|
|
38
38
|
const canSubmit = canPerformWorkflowActions && branch.status === 'editing';
|
|
39
|
-
// Withdraw: Can perform workflow actions AND branch is in submitted status
|
|
39
|
+
// Withdraw: Can perform workflow actions AND branch is in submitted status.
|
|
40
|
+
// Allowed even when the PR was closed without merging -- that's the
|
|
41
|
+
// deliberate recovery path for a closed-unmerged PR (a later resubmit
|
|
42
|
+
// opens a fresh PR). The server skips the now-impossible draft conversion
|
|
43
|
+
// in that case; see api/branch-withdraw.ts.
|
|
40
44
|
const canWithdraw = canPerformWorkflowActions && branch.status === 'submitted';
|
|
41
45
|
// Delete: Admin or creator (but not if submitted)
|
|
42
46
|
const canDelete = (userIsAdmin || userIsCreator) && branch.status !== 'submitted';
|
|
43
|
-
// Request changes: Only Reviewers or Admins can request changes on submitted
|
|
44
|
-
|
|
47
|
+
// Request changes: Only Reviewers or Admins can request changes on submitted
|
|
48
|
+
// branches. Same closed-PR restriction as withdraw applies (converts PR to draft).
|
|
49
|
+
const canRequestChanges = (userIsAdmin || userIsReviewer) &&
|
|
50
|
+
branch.status === 'submitted' &&
|
|
51
|
+
branch.pullRequestState !== 'closed';
|
|
45
52
|
return { canSubmit, canWithdraw, canDelete, canRequestChanges };
|
|
46
53
|
};
|
|
47
54
|
const statusColorMap = {
|
|
@@ -74,10 +81,16 @@ export const BranchManager = ({ branches, mode, user, onSelect, onCreate, onDele
|
|
|
74
81
|
variant: 'light',
|
|
75
82
|
};
|
|
76
83
|
const perms = getBranchPermissions(b, user);
|
|
77
|
-
return (_jsx(Paper, { withBorder: true, radius: "md", p: "md", shadow: "xs", "data-testid": `branch-list-item-${b.name}`, children: _jsxs(Group, { justify: "space-between", align: "flex-start", children: [_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { gap: "xs", children: [_jsx(Text, { fw: 600, children: b.name }), _jsx(Badge, { color: statusColor.color, variant: statusColor.variant, "data-testid": `branch-status-badge-${b.name}`, children: b.status }), b.
|
|
84
|
+
return (_jsx(Paper, { withBorder: true, radius: "md", p: "md", shadow: "xs", "data-testid": `branch-list-item-${b.name}`, children: _jsxs(Group, { justify: "space-between", align: "flex-start", children: [_jsxs(Stack, { gap: 4, children: [_jsxs(Group, { gap: "xs", children: [_jsx(Text, { fw: 600, children: b.name }), _jsx(Badge, { color: statusColor.color, variant: statusColor.variant, "data-testid": `branch-status-badge-${b.name}`, children: b.status }), b.status === 'archived' && b.mergedAt && (_jsx(Badge, { color: "teal", variant: "light", "data-testid": `branch-merged-badge-${b.name}`, children: "Merged" })), b.pullRequestNumber && (_jsxs(Badge, { color: b.pullRequestState === 'closed'
|
|
85
|
+
? 'red'
|
|
86
|
+
: b.pullRequestState === 'merged'
|
|
87
|
+
? 'violet'
|
|
88
|
+
: 'blue', variant: "light", children: ["PR #", b.pullRequestNumber, b.pullRequestState === 'closed' ? ' (closed)' : ''] })), b.commentCount !== undefined && b.commentCount > 0 && (_jsxs(Badge, { color: "grape", variant: "light", children: [b.commentCount, " ", b.commentCount === 1 ? 'comment' : 'comments'] }))] }), _jsxs(Group, { gap: "xs", align: "center", children: [b.updatedAt && (_jsxs(Text, { size: "xs", c: "dimmed", children: ["Updated ", b.updatedAt] })), b.createdBy && (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", c: "dimmed", children: "\u2022" }), _jsx(Text, { size: "xs", c: "dimmed", children: "Owner:" }), onGetUserMetadata ? (_jsx(UserBadge, { userId: b.createdBy, getUserMetadata: onGetUserMetadata, variant: "avatar-name", size: "xs", showEmailTooltip: true, showBadge: true, badgeVariant: "light", color: "gray" })) : (_jsx(Text, { size: "xs", c: "dimmed", children: b.createdBy }))] })), b.pullRequestUrl && (_jsxs(_Fragment, { children: [_jsx(Text, { size: "xs", c: "dimmed", children: "\u2022" }), _jsx(Text, { size: "xs", c: "blue", component: "a", href: b.pullRequestUrl, target: "_blank", rel: "noopener noreferrer", style: {
|
|
78
89
|
textDecoration: 'underline',
|
|
79
90
|
cursor: 'pointer',
|
|
80
|
-
}, children: "View PR" })] }))] }), b.access && (_jsxs(Group, { gap: 6, children: [b.access.users?.map((u) => onGetUserMetadata ? (_jsx(UserBadge, { userId: u, getUserMetadata: onGetUserMetadata, variant: "avatar-only", size: "xs", showEmailTooltip: true }, u)) : (_jsx(Badge, { variant: "outline", color: "neutral", children: u }, u))), b.access.groups?.map((g) => (_jsx(Badge, { variant: "outline", color: "neutral", children: g }, g)))] }))] }), _jsxs(Group, { gap: 8, children: [_jsx(Button, { size: "xs", variant: "light", onClick: () => onSelect?.(b.name), "data-testid": `switch-to-branch-button-${b.name}`, children: "Open" }), b.status === 'submitted' ? (_jsx(Tooltip, { label: "Only the branch creator can withdraw", disabled: perms.canWithdraw, children: _jsx(Button, { size: "xs", variant: "light", color: "orange", onClick: () => onWithdraw?.(b.name), disabled: !perms.canWithdraw, "data-testid": `withdraw-branch-button-${b.name}`, children: "Withdraw" }) })) : (_jsx(Tooltip, { label: "Only the branch creator can submit", disabled: perms.canSubmit, children: _jsx(Button, { size: "xs", variant: "light", color: "green", onClick: () => onSubmit?.(b.name), disabled: !perms.canSubmit, "data-testid": `submit-branch-button-${b.name}`, children: "Submit" }) })), _jsx(Tooltip, { label:
|
|
91
|
+
}, children: "View PR" })] }))] }), b.access && (_jsxs(Group, { gap: 6, children: [b.access.users?.map((u) => onGetUserMetadata ? (_jsx(UserBadge, { userId: u, getUserMetadata: onGetUserMetadata, variant: "avatar-only", size: "xs", showEmailTooltip: true }, u)) : (_jsx(Badge, { variant: "outline", color: "neutral", children: u }, u))), b.access.groups?.map((g) => (_jsx(Badge, { variant: "outline", color: "neutral", children: g }, g)))] }))] }), _jsxs(Group, { gap: 8, children: [_jsx(Button, { size: "xs", variant: "light", onClick: () => onSelect?.(b.name), "data-testid": `switch-to-branch-button-${b.name}`, children: "Open" }), b.status === 'submitted' ? (_jsx(Tooltip, { label: "Only the branch creator can withdraw", disabled: perms.canWithdraw, children: _jsx(Button, { size: "xs", variant: "light", color: "orange", onClick: () => onWithdraw?.(b.name), disabled: !perms.canWithdraw, "data-testid": `withdraw-branch-button-${b.name}`, children: "Withdraw" }) })) : (_jsx(Tooltip, { label: "Only the branch creator can submit", disabled: perms.canSubmit, children: _jsx(Button, { size: "xs", variant: "light", color: "green", onClick: () => onSubmit?.(b.name), disabled: !perms.canSubmit, "data-testid": `submit-branch-button-${b.name}`, children: "Submit" }) })), _jsx(Tooltip, { label: b.pullRequestState === 'closed'
|
|
92
|
+
? 'PR was closed on GitHub without merging'
|
|
93
|
+
: 'Only Reviewers or Admins can request changes', disabled: perms.canRequestChanges, children: _jsx(Button, { size: "xs", variant: "outline", color: "neutral", onClick: () => onRequestChanges?.(b.name), disabled: !perms.canRequestChanges, "data-testid": `request-changes-branch-button-${b.name}`, children: "Request changes" }) }), _jsx(Tooltip, { label: b.status === 'submitted'
|
|
81
94
|
? 'Cannot delete branch with open PR'
|
|
82
95
|
: 'Only Admin or branch creator can delete', disabled: perms.canDelete, children: _jsx(Button, { size: "xs", variant: "outline", color: "red", onClick: () => onDelete?.(b.name), disabled: !perms.canDelete, "data-testid": `delete-branch-button-${b.name}`, children: "Delete" }) })] })] }) }, b.name));
|
|
83
96
|
}) })) })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BranchManager.js","sourceRoot":"","sources":["../../src/editor/BranchManager.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,UAAU,EACV,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,OAAO,GACR,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"BranchManager.js","sourceRoot":"","sources":["../../src/editor/BranchManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BranchMetadata } from '../../types';
|
|
1
|
+
import type { BranchMetadata, PullRequestState } from '../../types';
|
|
2
2
|
import type { OperatingMode } from '../../operating-mode';
|
|
3
3
|
import type { CommentThread } from '../../comment-store';
|
|
4
4
|
/**
|
|
@@ -15,6 +15,8 @@ export interface BranchSummary {
|
|
|
15
15
|
};
|
|
16
16
|
pullRequestUrl?: string;
|
|
17
17
|
pullRequestNumber?: number;
|
|
18
|
+
pullRequestState?: PullRequestState;
|
|
19
|
+
mergedAt?: string;
|
|
18
20
|
commentCount: number;
|
|
19
21
|
}
|
|
20
22
|
export interface UseBranchManagerOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBranchManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useBranchManager.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"useBranchManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useBranchManager.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AA+CxD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;KAC7B,CAAA;IACD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAA;IAE5B;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAEhC;;OAEG;IACH,QAAQ,EAAE,aAAa,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,aAAa,EAAE,cAAc,GAAG,SAAS,CAAA;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA+MzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBranchManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/useBranchManager.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC;;GAEG;AACH,MAAM,sBAAsB,GAAG,CAC7B,UAAkB,EAClB,SAA8B,EAC9B,QAAoB,EACpB,EAAE;IACF,MAAM,CAAC,gBAAgB,CAAC;QACtB,KAAK,EAAE,0BAA0B;QACjC,QAAQ,EAAE,CACR,KAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,YAC9C,oCAAoC,UAAU,mJAAmJ,GAC7L,CACR;QACD,MAAM,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;QACtD,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;QAChC,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,wBAAwB,GAAG,CAC/B,UAAkB,EAClB,SAA8B,EAC9B,QAAoB,EACpB,EAAE;IACF,MAAM,CAAC,gBAAgB,CAAC;QACtB,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,CACR,KAAC,IAAI,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,YAC9C,sCAAsC,UAAU,+IAA+I,GAC3L,CACR;QACD,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE;QACxD,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;QACjC,QAAQ;QACR,SAAS;KACV,CAAC,CAAA;AACJ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"useBranchManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/useBranchManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGroupManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useGroupManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGvE,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACjF,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IAC3E,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IACvE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"useGroupManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/useGroupManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGvE,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACjF,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IAC3E,0BAA0B,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IACvE,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAsGtF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useCallback, useEffect, useState } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { notifications } from '@mantine/notifications';
|
|
3
3
|
import { useApiClient } from '../context/index.js';
|
|
4
4
|
/**
|
|
@@ -28,6 +28,13 @@ export function useGroupManager(options) {
|
|
|
28
28
|
const apiClient = useApiClient();
|
|
29
29
|
const [groupsData, setGroupsData] = useState([]);
|
|
30
30
|
const [groupsLoading, setGroupsLoading] = useState(false);
|
|
31
|
+
// Last-loaded version, sent back as expectedContentVersion on save so the
|
|
32
|
+
// server can detect a conflicting edit from another user (see
|
|
33
|
+
// api/groups.ts's updateInternalGroupsHandler). Deliberately NOT
|
|
34
|
+
// auto-updated on a 409 — the user must reopen the manager (which reloads)
|
|
35
|
+
// to pick up the latest version, rather than silently retrying and risking
|
|
36
|
+
// an overwrite.
|
|
37
|
+
const versionRef = useRef(0);
|
|
31
38
|
const loadGroups = async () => {
|
|
32
39
|
setGroupsLoading(true);
|
|
33
40
|
try {
|
|
@@ -35,6 +42,7 @@ export function useGroupManager(options) {
|
|
|
35
42
|
if (!result.ok)
|
|
36
43
|
throw new Error('Failed to load groups');
|
|
37
44
|
setGroupsData(result.data?.groups ?? []);
|
|
45
|
+
versionRef.current = result.data?.version ?? 0;
|
|
38
46
|
}
|
|
39
47
|
catch (err) {
|
|
40
48
|
console.error('Failed to load groups:', err);
|
|
@@ -46,7 +54,10 @@ export function useGroupManager(options) {
|
|
|
46
54
|
};
|
|
47
55
|
const handleSaveGroups = useCallback(async (groups) => {
|
|
48
56
|
try {
|
|
49
|
-
const result = await apiClient.groups.updateInternal({
|
|
57
|
+
const result = await apiClient.groups.updateInternal({
|
|
58
|
+
groups,
|
|
59
|
+
expectedContentVersion: versionRef.current,
|
|
60
|
+
});
|
|
50
61
|
if (!result.ok) {
|
|
51
62
|
throw new Error(result.error || 'Failed to save groups');
|
|
52
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGroupManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/useGroupManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useGroupManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/useGroupManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePermissionManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/usePermissionManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGrD,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,qBAAqB,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,gBAAgB,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IAChD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,0BAA0B,
|
|
1
|
+
{"version":3,"file":"usePermissionManager.d.ts","sourceRoot":"","sources":["../../../src/editor/hooks/usePermissionManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGrD,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,kBAAkB,EAAE,OAAO,CAAA;IAC3B,qBAAqB,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,gBAAgB,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IAChD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,0BAA0B,CA6E5B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react';
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { notifications } from '@mantine/notifications';
|
|
3
3
|
import { useApiClient } from '../context/index.js';
|
|
4
4
|
/**
|
|
@@ -27,6 +27,13 @@ export function usePermissionManager(options) {
|
|
|
27
27
|
const apiClient = useApiClient();
|
|
28
28
|
const [permissionsData, setPermissionsData] = useState([]);
|
|
29
29
|
const [permissionsLoading, setPermissionsLoading] = useState(false);
|
|
30
|
+
// Last-loaded version, sent back as expectedContentVersion on save so the
|
|
31
|
+
// server can detect a conflicting edit from another user (see
|
|
32
|
+
// api/permissions.ts's updatePermissionsHandler). Deliberately NOT
|
|
33
|
+
// auto-updated on a 409 — the user must reopen the manager (which reloads)
|
|
34
|
+
// to pick up the latest version, rather than silently retrying and risking
|
|
35
|
+
// an overwrite.
|
|
36
|
+
const versionRef = useRef(0);
|
|
30
37
|
const loadPermissions = async () => {
|
|
31
38
|
setPermissionsLoading(true);
|
|
32
39
|
try {
|
|
@@ -34,6 +41,7 @@ export function usePermissionManager(options) {
|
|
|
34
41
|
if (!result.ok)
|
|
35
42
|
throw new Error('Failed to load permissions');
|
|
36
43
|
setPermissionsData(result.data?.permissions ?? []);
|
|
44
|
+
versionRef.current = result.data?.version ?? 0;
|
|
37
45
|
}
|
|
38
46
|
catch (err) {
|
|
39
47
|
console.error('Failed to load permissions:', err);
|
|
@@ -48,7 +56,10 @@ export function usePermissionManager(options) {
|
|
|
48
56
|
};
|
|
49
57
|
const handleSavePermissions = async (permissions) => {
|
|
50
58
|
try {
|
|
51
|
-
const result = await apiClient.permissions.update({
|
|
59
|
+
const result = await apiClient.permissions.update({
|
|
60
|
+
permissions,
|
|
61
|
+
expectedContentVersion: versionRef.current,
|
|
62
|
+
});
|
|
52
63
|
if (!result.ok) {
|
|
53
64
|
throw new Error(result.error || 'Failed to save permissions');
|
|
54
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePermissionManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/usePermissionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"usePermissionManager.js","sourceRoot":"","sources":["../../../src/editor/hooks/usePermissionManager.ts"],"names":[],"mappings":"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"}
|
package/dist/git-manager.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type SimpleGitOptions, type StatusResult } from 'simple-git';
|
|
2
2
|
import type { OperatingMode } from './operating-mode';
|
|
3
|
+
/** @internal — exported for tests only. */
|
|
4
|
+
export declare function gitChildEnv(overrides: Record<string, string>): Record<string, string>;
|
|
3
5
|
/**
|
|
4
6
|
* Add a pattern to a repo's .git/info/exclude (a per-repository gitignore that
|
|
5
7
|
* never gets committed) so runtime metadata like .canopy-meta/ can't be staged
|
|
@@ -30,6 +32,12 @@ export interface ResolveRemoteUrlOptions {
|
|
|
30
32
|
defaultRemoteUrl?: string;
|
|
31
33
|
baseBranch: string;
|
|
32
34
|
sourceRoot?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Escape hatch: allow a resolved NETWORK remote URL (from remoteUrl/
|
|
37
|
+
* defaultRemoteUrl/the strategy env var) in prod mode. See CanopyConfig's
|
|
38
|
+
* `allowNetworkRemoteInProd` doc comment. Has no effect in dev mode.
|
|
39
|
+
*/
|
|
40
|
+
allowNetworkRemoteInProd?: boolean;
|
|
33
41
|
}
|
|
34
42
|
export interface InitializeWorkspaceOptions {
|
|
35
43
|
workspacePath: string;
|
|
@@ -40,6 +48,12 @@ export interface InitializeWorkspaceOptions {
|
|
|
40
48
|
defaultRemoteUrl?: string;
|
|
41
49
|
remoteUrl?: string;
|
|
42
50
|
remoteName?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Escape hatch: allow a resolved NETWORK remote URL in prod mode. Threaded
|
|
53
|
+
* through to `resolveRemoteUrl` — see its option of the same name and
|
|
54
|
+
* CanopyConfig's `allowNetworkRemoteInProd` doc comment.
|
|
55
|
+
*/
|
|
56
|
+
allowNetworkRemoteInProd?: boolean;
|
|
43
57
|
branchType: 'content' | 'orphan';
|
|
44
58
|
/** Git author name for internal commits (e.g., orphan branch init). */
|
|
45
59
|
gitBotAuthorName: string;
|
|
@@ -118,6 +132,26 @@ export declare class GitManager {
|
|
|
118
132
|
* @throws Error if git repo doesn't exist
|
|
119
133
|
*/
|
|
120
134
|
static validateGitRepoExists(repoPath: string): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Guards prod mode against pointing git operations at a NETWORK remote
|
|
137
|
+
* (http(s)://, ssh://, git://, or scp-like `user@host:path`).
|
|
138
|
+
*
|
|
139
|
+
* In the intended prod architecture the CMS Lambda has no internet access:
|
|
140
|
+
* all git network I/O happens on the EC2 worker against the EFS-local bare
|
|
141
|
+
* repo `{workspace}/remote.git`, which the Lambda reaches via auto-detect
|
|
142
|
+
* (see `resolveRemoteUrl`'s auto-detect step, which always yields a local
|
|
143
|
+
* path by construction — never checked here). A network URL supplied via
|
|
144
|
+
* any of the three resolvable sources (explicit param, config, env var) is
|
|
145
|
+
* almost always a misconfiguration: the internet-less Lambda would try to
|
|
146
|
+
* clone/fetch/push it directly and hang until timeout.
|
|
147
|
+
*
|
|
148
|
+
* Dev mode is never restricted here — this only fires for `mode === 'prod'`.
|
|
149
|
+
* `file://` URLs and plain filesystem paths are LOCAL and always allowed.
|
|
150
|
+
*
|
|
151
|
+
* @param source - Human-readable description of where `url` came from, used
|
|
152
|
+
* only in the thrown error message (e.g. "config.defaultRemoteUrl").
|
|
153
|
+
*/
|
|
154
|
+
private static assertRemoteUrlAllowedInMode;
|
|
121
155
|
/**
|
|
122
156
|
* Resolves the remote URL for git operations following the priority:
|
|
123
157
|
* 1. Explicit remoteUrl parameter
|
|
@@ -127,6 +161,11 @@ export declare class GitManager {
|
|
|
127
161
|
*
|
|
128
162
|
* Uses strategy flags to determine behavior, GitManager executes the logic.
|
|
129
163
|
*
|
|
164
|
+
* In prod mode, a resolved network URL from any of the first three sources
|
|
165
|
+
* is rejected unless `options.allowNetworkRemoteInProd` is set — see
|
|
166
|
+
* `assertRemoteUrlAllowedInMode`. Auto-detect/auto-init (source 4) are never
|
|
167
|
+
* checked: they always yield a local filesystem path by construction.
|
|
168
|
+
*
|
|
130
169
|
* @param options.sourceRoot - Optional source directory for monorepos. When provided,
|
|
131
170
|
* this directory (relative to git root) is used as the source for the simulated remote.
|
|
132
171
|
* Defaults to process.cwd().
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../src/git-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAA;AAInB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"git-manager.d.ts","sourceRoot":"","sources":["../src/git-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/git-manager.js
CHANGED
|
@@ -5,9 +5,34 @@ import { invalidateContentIndexesForRoot } from './content-index-registry.js';
|
|
|
5
5
|
import { invalidateBranchContentCaches } from './content-index-generation.js';
|
|
6
6
|
import { createDebugLogger } from './utils/debug.js';
|
|
7
7
|
import { getErrorMessage, isNotFoundError } from './utils/error.js';
|
|
8
|
-
import { resolveBaseBranch } from './utils/git.js';
|
|
8
|
+
import { isNetworkRemoteUrl, resolveBaseBranch } from './utils/git.js';
|
|
9
9
|
import { acquireProvisioningLock } from './utils/provisioning-lock.js';
|
|
10
10
|
const log = createDebugLogger({ prefix: 'GitManager' });
|
|
11
|
+
/**
|
|
12
|
+
* Child environment for spawned git processes. simple-git's .env() REPLACES
|
|
13
|
+
* the child env entirely (deploy-proven 2026-07-24: every Lambda git spawn
|
|
14
|
+
* failed with "dubious ownership" on the uid-1000-owned EFS clones because
|
|
15
|
+
* the child env lost the runtime's git variables). Spreading ALL of
|
|
16
|
+
* process.env trips simple-git's unsafe-variable blocklist on hosts where
|
|
17
|
+
* GIT_EDITOR/GIT_SSH_COMMAND etc. are set - so pass through a deterministic
|
|
18
|
+
* ALLOWLIST of process basics + author/tracing families.
|
|
19
|
+
*
|
|
20
|
+
* GIT_CONFIG_* is deliberately NOT passed through: simple-git hard-blocks
|
|
21
|
+
* env-based git config (allowUnsafeConfigEnvCount) since it can inject
|
|
22
|
+
* arbitrary settings. Host-level config like the safe.directory workaround
|
|
23
|
+
* for uid-mismatched EFS clones belongs in the image's SYSTEM gitconfig -
|
|
24
|
+
* see Dockerfile.cms.template's `git config --system` line.
|
|
25
|
+
*/
|
|
26
|
+
const GIT_ENV_PASSTHROUGH = /^(PATH|HOME|USER|LANG|LC_[A-Z]+|TZ|TMPDIR|GIT_(AUTHOR|COMMITTER)_(NAME|EMAIL|DATE)|GIT_TERMINAL_PROMPT|GIT_TRACE[0-9A-Z_]*)$/;
|
|
27
|
+
/** @internal — exported for tests only. */
|
|
28
|
+
export function gitChildEnv(overrides) {
|
|
29
|
+
const env = {};
|
|
30
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
31
|
+
if (value !== undefined && GIT_ENV_PASSTHROUGH.test(key))
|
|
32
|
+
env[key] = value;
|
|
33
|
+
}
|
|
34
|
+
return { ...env, ...overrides };
|
|
35
|
+
}
|
|
11
36
|
// In-memory lock to prevent concurrent remote.git initialization
|
|
12
37
|
// Maps remotePath -> Promise<void> to serialize access
|
|
13
38
|
const remoteInitLocks = new Map();
|
|
@@ -57,10 +82,26 @@ export class GitManager {
|
|
|
57
82
|
this.remote = options.remote ?? 'origin';
|
|
58
83
|
this.skipIndexMarker = options.skipIndexMarker ?? false;
|
|
59
84
|
this.git = simpleGit({ baseDir: this.repoPath, ...gitOptions });
|
|
85
|
+
// `this.git` is for LOCAL working-tree ops in the intended prod topology,
|
|
86
|
+
// where `origin` resolves to a local path (an auto-detected/initialized
|
|
87
|
+
// `remote.git`) - its env is the allowlist from gitChildEnv, which
|
|
88
|
+
// intentionally drops HTTPS_PROXY/GIT_SSL_*/GIT_SSH_COMMAND/etc. Do NOT
|
|
89
|
+
// route GitHub network I/O through it - the worker uses fresh full-env
|
|
90
|
+
// simpleGit() instances for push/fetch so proxy/TLS vars survive.
|
|
91
|
+
//
|
|
92
|
+
// Under the `allowNetworkRemoteInProd` escape hatch, `this.remote` CAN be
|
|
93
|
+
// a network URL, and this.git.fetch(this.remote, ...)/this.git.raw(['push',
|
|
94
|
+
// ...]) do hit it - those calls still run with the restricted allowlist
|
|
95
|
+
// env above, so they will drop HTTPS_PROXY/GIT_SSL_*/GIT_SSH_COMMAND. This
|
|
96
|
+
// is a known limitation of that escape hatch (tracked in
|
|
97
|
+
// .claude/future-tasks/network-escape-hatch-git-env.md), not a bug: full
|
|
98
|
+
// proxy/TLS-env support for `this.remote` ops when the escape hatch is on
|
|
99
|
+
// is still open work.
|
|
100
|
+
//
|
|
60
101
|
// Prevent git from traversing above repoPath to find a parent .git directory.
|
|
61
102
|
// If the workspace's .git is corrupt/missing, git should fail rather than
|
|
62
103
|
// silently operating on the host repo above.
|
|
63
|
-
this.git.env(
|
|
104
|
+
this.git.env(gitChildEnv({ GIT_CEILING_DIRECTORIES: path.dirname(this.repoPath) }));
|
|
64
105
|
}
|
|
65
106
|
static async cloneRepo(remoteUrl, targetPath, baseBranch = 'main') {
|
|
66
107
|
log.debug('git', 'Cloning repository', {
|
|
@@ -334,6 +375,41 @@ export class GitManager {
|
|
|
334
375
|
throw err;
|
|
335
376
|
}
|
|
336
377
|
}
|
|
378
|
+
/**
|
|
379
|
+
* Guards prod mode against pointing git operations at a NETWORK remote
|
|
380
|
+
* (http(s)://, ssh://, git://, or scp-like `user@host:path`).
|
|
381
|
+
*
|
|
382
|
+
* In the intended prod architecture the CMS Lambda has no internet access:
|
|
383
|
+
* all git network I/O happens on the EC2 worker against the EFS-local bare
|
|
384
|
+
* repo `{workspace}/remote.git`, which the Lambda reaches via auto-detect
|
|
385
|
+
* (see `resolveRemoteUrl`'s auto-detect step, which always yields a local
|
|
386
|
+
* path by construction — never checked here). A network URL supplied via
|
|
387
|
+
* any of the three resolvable sources (explicit param, config, env var) is
|
|
388
|
+
* almost always a misconfiguration: the internet-less Lambda would try to
|
|
389
|
+
* clone/fetch/push it directly and hang until timeout.
|
|
390
|
+
*
|
|
391
|
+
* Dev mode is never restricted here — this only fires for `mode === 'prod'`.
|
|
392
|
+
* `file://` URLs and plain filesystem paths are LOCAL and always allowed.
|
|
393
|
+
*
|
|
394
|
+
* @param source - Human-readable description of where `url` came from, used
|
|
395
|
+
* only in the thrown error message (e.g. "config.defaultRemoteUrl").
|
|
396
|
+
*/
|
|
397
|
+
static assertRemoteUrlAllowedInMode(mode, url, source, allowNetworkRemoteInProd) {
|
|
398
|
+
if (mode !== 'prod')
|
|
399
|
+
return;
|
|
400
|
+
if (allowNetworkRemoteInProd)
|
|
401
|
+
return;
|
|
402
|
+
if (!isNetworkRemoteUrl(url))
|
|
403
|
+
return;
|
|
404
|
+
throw new Error(`CanopyCMS: refusing to use a network remote URL in prod mode (from ${source}: "${url}"). ` +
|
|
405
|
+
`The standard AWS Lambda+EC2-worker topology runs the CMS Lambda with no internet ` +
|
|
406
|
+
`access — the EC2 worker owns all network git I/O, and the Lambda is expected to reach ` +
|
|
407
|
+
`the EFS-local bare repo ({workspace}/remote.git) via auto-detect instead. Pointing a ` +
|
|
408
|
+
`network URL here would make the internet-less Lambda try to clone/fetch/push it ` +
|
|
409
|
+
`directly and hang until timeout. If this prod host genuinely has internet access and ` +
|
|
410
|
+
`intentionally runs git against a network remote (e.g. a single-VM deployment), set ` +
|
|
411
|
+
`config.allowNetworkRemoteInProd: true to acknowledge this.`);
|
|
412
|
+
}
|
|
337
413
|
/**
|
|
338
414
|
* Resolves the remote URL for git operations following the priority:
|
|
339
415
|
* 1. Explicit remoteUrl parameter
|
|
@@ -343,6 +419,11 @@ export class GitManager {
|
|
|
343
419
|
*
|
|
344
420
|
* Uses strategy flags to determine behavior, GitManager executes the logic.
|
|
345
421
|
*
|
|
422
|
+
* In prod mode, a resolved network URL from any of the first three sources
|
|
423
|
+
* is rejected unless `options.allowNetworkRemoteInProd` is set — see
|
|
424
|
+
* `assertRemoteUrlAllowedInMode`. Auto-detect/auto-init (source 4) are never
|
|
425
|
+
* checked: they always yield a local filesystem path by construction.
|
|
426
|
+
*
|
|
346
427
|
* @param options.sourceRoot - Optional source directory for monorepos. When provided,
|
|
347
428
|
* this directory (relative to git root) is used as the source for the simulated remote.
|
|
348
429
|
* Defaults to process.cwd().
|
|
@@ -356,12 +437,19 @@ export class GitManager {
|
|
|
356
437
|
const strategy = operatingStrategy(options.mode);
|
|
357
438
|
const config = strategy.getRemoteUrlConfig();
|
|
358
439
|
// Centralized priority chain (no duplication across strategies)
|
|
359
|
-
if (options.remoteUrl)
|
|
440
|
+
if (options.remoteUrl) {
|
|
441
|
+
this.assertRemoteUrlAllowedInMode(options.mode, options.remoteUrl, 'the explicit remoteUrl parameter', options.allowNetworkRemoteInProd);
|
|
360
442
|
return options.remoteUrl;
|
|
361
|
-
|
|
443
|
+
}
|
|
444
|
+
if (options.defaultRemoteUrl) {
|
|
445
|
+
this.assertRemoteUrlAllowedInMode(options.mode, options.defaultRemoteUrl, 'config.defaultRemoteUrl', options.allowNetworkRemoteInProd);
|
|
362
446
|
return options.defaultRemoteUrl;
|
|
363
|
-
|
|
364
|
-
|
|
447
|
+
}
|
|
448
|
+
const envUrl = process.env[config.envVarName];
|
|
449
|
+
if (envUrl) {
|
|
450
|
+
this.assertRemoteUrlAllowedInMode(options.mode, envUrl, `the ${config.envVarName} environment variable`, options.allowNetworkRemoteInProd);
|
|
451
|
+
return envUrl;
|
|
452
|
+
}
|
|
365
453
|
// Auto-detect: check if a pre-existing remote.git exists at the expected path
|
|
366
454
|
// (e.g., created by EC2 worker on EFS in prod mode)
|
|
367
455
|
if (config.autoDetectRemotePath) {
|
|
@@ -421,7 +509,7 @@ export class GitManager {
|
|
|
421
509
|
try {
|
|
422
510
|
const checkGit = simpleGit({ baseDir: options.workspacePath });
|
|
423
511
|
// Ceiling prevents git from traversing to a parent repo if .git is corrupt
|
|
424
|
-
checkGit.env(
|
|
512
|
+
checkGit.env(gitChildEnv({ GIT_CEILING_DIRECTORIES: path.dirname(options.workspacePath) }));
|
|
425
513
|
await checkGit.raw(['rev-parse', '--git-dir']);
|
|
426
514
|
repoExists = true;
|
|
427
515
|
}
|
|
@@ -452,6 +540,7 @@ export class GitManager {
|
|
|
452
540
|
defaultRemoteUrl: options.defaultRemoteUrl,
|
|
453
541
|
baseBranch,
|
|
454
542
|
sourceRoot: options.sourceRoot,
|
|
543
|
+
allowNetworkRemoteInProd: options.allowNetworkRemoteInProd,
|
|
455
544
|
});
|
|
456
545
|
// Require remoteUrl for cloning
|
|
457
546
|
if (!remoteUrl) {
|
|
@@ -473,7 +562,7 @@ export class GitManager {
|
|
|
473
562
|
// global gitconfig, and internal commits (e.g., orphan branch init) need one.
|
|
474
563
|
// The real bot author is set later via ensureAuthor() before user-facing commits.
|
|
475
564
|
const freshGit = simpleGit({ baseDir: options.workspacePath });
|
|
476
|
-
freshGit.env(
|
|
565
|
+
freshGit.env(gitChildEnv({ GIT_CEILING_DIRECTORIES: path.dirname(options.workspacePath) }));
|
|
477
566
|
await freshGit.addConfig('canopycms.managed', 'true');
|
|
478
567
|
await freshGit.addConfig('user.name', options.gitBotAuthorName);
|
|
479
568
|
await freshGit.addConfig('user.email', options.gitBotAuthorEmail);
|
|
@@ -505,6 +594,7 @@ export class GitManager {
|
|
|
505
594
|
defaultRemoteUrl: options.defaultRemoteUrl,
|
|
506
595
|
baseBranch,
|
|
507
596
|
sourceRoot: options.sourceRoot,
|
|
597
|
+
allowNetworkRemoteInProd: options.allowNetworkRemoteInProd,
|
|
508
598
|
});
|
|
509
599
|
if (remoteUrl) {
|
|
510
600
|
await git.ensureRemote(remoteUrl);
|
|
@@ -513,6 +603,12 @@ export class GitManager {
|
|
|
513
603
|
// 6. Checkout or create branch based on type
|
|
514
604
|
if (options.branchType === 'orphan') {
|
|
515
605
|
await git.createOrphanSettingsBranch(options.branchName, {});
|
|
606
|
+
// Settings mutations hold an OCC lockfile (<file>.lock, see
|
|
607
|
+
// authorization/settings-file-store.ts) inside this git-committed
|
|
608
|
+
// workspace. Commits here use scoped `git add <file>` today, but a
|
|
609
|
+
// crash-orphaned lock dir must never be committable by a future broad
|
|
610
|
+
// stage either. Runs on every init, so existing clones pick it up.
|
|
611
|
+
await git.ensureGitExclude('*.lock');
|
|
516
612
|
}
|
|
517
613
|
else {
|
|
518
614
|
await git.checkoutBranch(options.branchName);
|