canopycms 0.0.60 → 0.0.61-int.74
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.d.ts +29 -0
- package/dist/api/__test__/mock-client.d.ts.map +1 -1
- package/dist/api/__test__/mock-client.js +51 -0
- package/dist/api/__test__/mock-client.js.map +1 -1
- package/dist/api/admin-branch-health.d.ts +65 -0
- package/dist/api/admin-branch-health.d.ts.map +1 -0
- package/dist/api/admin-branch-health.js +448 -0
- package/dist/api/admin-branch-health.js.map +1 -0
- package/dist/api/admin.d.ts +136 -0
- package/dist/api/admin.d.ts.map +1 -0
- package/dist/api/admin.js +338 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/assets.d.ts.map +1 -1
- package/dist/api/assets.js +4 -0
- package/dist/api/assets.js.map +1 -1
- package/dist/api/branch-merge.d.ts +6 -0
- package/dist/api/branch-merge.d.ts.map +1 -1
- package/dist/api/branch-merge.js +13 -3
- package/dist/api/branch-merge.js.map +1 -1
- package/dist/api/branch-status.d.ts.map +1 -1
- package/dist/api/branch-status.js +15 -5
- package/dist/api/branch-status.js.map +1 -1
- package/dist/api/branch-withdraw.d.ts +6 -0
- package/dist/api/branch-withdraw.d.ts.map +1 -1
- package/dist/api/branch-withdraw.js +15 -3
- package/dist/api/branch-withdraw.js.map +1 -1
- package/dist/api/branch.d.ts +11 -1
- package/dist/api/branch.d.ts.map +1 -1
- package/dist/api/branch.js +70 -4
- package/dist/api/branch.js.map +1 -1
- package/dist/api/client.d.ts +34 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +47 -0
- package/dist/api/client.js.map +1 -1
- package/dist/api/comments.d.ts.map +1 -1
- package/dist/api/comments.js +4 -0
- package/dist/api/comments.js.map +1 -1
- package/dist/api/content.d.ts.map +1 -1
- package/dist/api/content.js +4 -4
- package/dist/api/content.js.map +1 -1
- package/dist/api/entries.js +1 -1
- package/dist/api/entries.js.map +1 -1
- package/dist/api/github-sync.d.ts.map +1 -1
- package/dist/api/github-sync.js +14 -3
- package/dist/api/github-sync.js.map +1 -1
- package/dist/api/guards.d.ts +7 -1
- package/dist/api/guards.d.ts.map +1 -1
- package/dist/api/guards.js +54 -0
- package/dist/api/guards.js.map +1 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +0 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.js +7 -7
- package/dist/api/schema.js.map +1 -1
- package/dist/authorization/branch.d.ts +14 -1
- package/dist/authorization/branch.d.ts.map +1 -1
- package/dist/authorization/branch.js +5 -3
- package/dist/authorization/branch.js.map +1 -1
- package/dist/authorization/index.d.ts +1 -0
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +2 -0
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/protected-branch.d.ts +39 -0
- package/dist/authorization/protected-branch.d.ts.map +1 -0
- package/dist/authorization/protected-branch.js +43 -0
- package/dist/authorization/protected-branch.js.map +1 -0
- package/dist/branch-health.d.ts +78 -0
- package/dist/branch-health.d.ts.map +1 -0
- package/dist/branch-health.js +151 -0
- package/dist/branch-health.js.map +1 -0
- package/dist/branch-metadata.d.ts +20 -0
- package/dist/branch-metadata.d.ts.map +1 -1
- package/dist/branch-metadata.js +21 -1
- package/dist/branch-metadata.js.map +1 -1
- package/dist/branch-registry.d.ts.map +1 -1
- package/dist/branch-registry.js +13 -1
- package/dist/branch-registry.js.map +1 -1
- package/dist/cli/cli.js +154 -13
- package/dist/cli/generate-ai-content.js +54 -10
- package/dist/cli/init.js +72 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +4 -1
- package/dist/cli/sync.js.map +1 -1
- package/dist/content-store.d.ts +16 -0
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +22 -6
- package/dist/content-store.js.map +1 -1
- package/dist/editor/BranchManager.d.ts +9 -1
- package/dist/editor/BranchManager.d.ts.map +1 -1
- package/dist/editor/BranchManager.js +20 -9
- package/dist/editor/BranchManager.js.map +1 -1
- package/dist/editor/CommentsPanel.d.ts.map +1 -1
- package/dist/editor/CommentsPanel.js +4 -12
- package/dist/editor/CommentsPanel.js.map +1 -1
- package/dist/editor/Editor.d.ts.map +1 -1
- package/dist/editor/Editor.js +46 -10
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/EntryNavigator.d.ts +7 -0
- package/dist/editor/EntryNavigator.d.ts.map +1 -1
- package/dist/editor/EntryNavigator.js +17 -5
- package/dist/editor/EntryNavigator.js.map +1 -1
- package/dist/editor/FormRenderer.d.ts.map +1 -1
- package/dist/editor/FormRenderer.js +4 -0
- package/dist/editor/FormRenderer.js.map +1 -1
- package/dist/editor/admin/SystemHealthPanel.d.ts +6 -0
- package/dist/editor/admin/SystemHealthPanel.d.ts.map +1 -0
- package/dist/editor/admin/SystemHealthPanel.js +234 -0
- package/dist/editor/admin/SystemHealthPanel.js.map +1 -0
- package/dist/editor/admin/useSystemHealth.d.ts +40 -0
- package/dist/editor/admin/useSystemHealth.d.ts.map +1 -0
- package/dist/editor/admin/useSystemHealth.js +205 -0
- package/dist/editor/admin/useSystemHealth.js.map +1 -0
- package/dist/editor/comments/FieldWrapper.d.ts.map +1 -1
- package/dist/editor/comments/FieldWrapper.js +1 -1
- package/dist/editor/comments/FieldWrapper.js.map +1 -1
- package/dist/editor/comments/InlineCommentThread.d.ts.map +1 -1
- package/dist/editor/comments/InlineCommentThread.js +2 -21
- package/dist/editor/comments/InlineCommentThread.js.map +1 -1
- package/dist/editor/comments/ThreadCarousel.d.ts +2 -0
- package/dist/editor/comments/ThreadCarousel.d.ts.map +1 -1
- package/dist/editor/comments/ThreadCarousel.js +5 -2
- package/dist/editor/comments/ThreadCarousel.js.map +1 -1
- package/dist/editor/components/EditorHeader.d.ts +11 -0
- package/dist/editor/components/EditorHeader.d.ts.map +1 -1
- package/dist/editor/components/EditorHeader.js +75 -41
- package/dist/editor/components/EditorHeader.js.map +1 -1
- package/dist/editor/components/EditorSidebar.d.ts +7 -1
- package/dist/editor/components/EditorSidebar.d.ts.map +1 -1
- package/dist/editor/components/EditorSidebar.js +3 -3
- package/dist/editor/components/EditorSidebar.js.map +1 -1
- package/dist/editor/fields/ImageField.d.ts.map +1 -1
- package/dist/editor/fields/ImageField.js +4 -1
- package/dist/editor/fields/ImageField.js.map +1 -1
- package/dist/editor/fields/StringListField.d.ts +20 -0
- package/dist/editor/fields/StringListField.d.ts.map +1 -0
- package/dist/editor/fields/StringListField.js +25 -0
- package/dist/editor/fields/StringListField.js.map +1 -0
- package/dist/editor/hooks/useBranchActions.d.ts.map +1 -1
- package/dist/editor/hooks/useBranchActions.js +8 -2
- package/dist/editor/hooks/useBranchActions.js.map +1 -1
- package/dist/editor/hooks/useBranchManager.d.ts +12 -3
- package/dist/editor/hooks/useBranchManager.d.ts.map +1 -1
- package/dist/editor/hooks/useBranchManager.js +16 -1
- package/dist/editor/hooks/useBranchManager.js.map +1 -1
- package/dist/editor/hooks/useDraftManager.d.ts +7 -0
- package/dist/editor/hooks/useDraftManager.d.ts.map +1 -1
- package/dist/editor/hooks/useDraftManager.js +57 -3
- package/dist/editor/hooks/useDraftManager.js.map +1 -1
- package/dist/editor/hooks/useEntryManager.d.ts.map +1 -1
- package/dist/editor/hooks/useEntryManager.js +25 -7
- package/dist/editor/hooks/useEntryManager.js.map +1 -1
- package/dist/editor/media/AssetCard.d.ts.map +1 -1
- package/dist/editor/media/AssetCard.js +23 -2
- package/dist/editor/media/AssetCard.js.map +1 -1
- package/dist/editor/relative-time.d.ts +8 -0
- package/dist/editor/relative-time.d.ts.map +1 -0
- package/dist/editor/relative-time.js +26 -0
- package/dist/editor/relative-time.js.map +1 -0
- package/dist/git-manager.d.ts.map +1 -1
- package/dist/git-manager.js +10 -2
- package/dist/git-manager.js.map +1 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/handler.js +20 -9
- package/dist/http/handler.js.map +1 -1
- package/dist/http/router.d.ts.map +1 -1
- package/dist/http/router.js +2 -0
- package/dist/http/router.js.map +1 -1
- package/dist/paths/branch-name.d.ts +20 -0
- package/dist/paths/branch-name.d.ts.map +1 -0
- package/dist/paths/branch-name.js +24 -0
- package/dist/paths/branch-name.js.map +1 -0
- package/dist/paths/branch.d.ts +2 -8
- package/dist/paths/branch.d.ts.map +1 -1
- package/dist/paths/branch.js +6 -12
- package/dist/paths/branch.js.map +1 -1
- package/dist/paths/index.d.ts +2 -1
- package/dist/paths/index.d.ts.map +1 -1
- package/dist/paths/index.js +4 -1
- package/dist/paths/index.js.map +1 -1
- package/dist/services.js +9 -1
- package/dist/services.js.map +1 -1
- package/dist/task-queue/index.d.ts +2 -2
- package/dist/task-queue/index.d.ts.map +1 -1
- package/dist/task-queue/index.js +1 -1
- package/dist/task-queue/index.js.map +1 -1
- package/dist/task-queue/task-queue.d.ts +37 -1
- package/dist/task-queue/task-queue.d.ts.map +1 -1
- package/dist/task-queue/task-queue.js +104 -0
- package/dist/task-queue/task-queue.js.map +1 -1
- package/dist/task-queue/types.d.ts +11 -0
- package/dist/task-queue/types.d.ts.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/occ-json-write.d.ts.map +1 -1
- package/dist/utils/occ-json-write.js +7 -0
- package/dist/utils/occ-json-write.js.map +1 -1
- package/dist/utils/provisioning-lock.d.ts +19 -0
- package/dist/utils/provisioning-lock.d.ts.map +1 -1
- package/dist/utils/provisioning-lock.js +26 -0
- package/dist/utils/provisioning-lock.js.map +1 -1
- package/dist/validation/reference-validator.d.ts +17 -1
- package/dist/validation/reference-validator.d.ts.map +1 -1
- package/dist/validation/reference-validator.js +33 -10
- package/dist/validation/reference-validator.js.map +1 -1
- package/dist/worker/cms-worker.d.ts +38 -0
- package/dist/worker/cms-worker.d.ts.map +1 -1
- package/dist/worker/cms-worker.js +328 -25
- package/dist/worker/cms-worker.js.map +1 -1
- package/dist/worker/task-queue.d.ts +3 -3
- package/dist/worker/task-queue.d.ts.map +1 -1
- package/dist/worker/task-queue.js +2 -2
- package/dist/worker/task-queue.js.map +1 -1
- package/dist/worker/worker-status.d.ts +48 -0
- package/dist/worker/worker-status.d.ts.map +1 -0
- package/dist/worker/worker-status.js +53 -0
- package/dist/worker/worker-status.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protected base branch predicate.
|
|
3
|
+
*
|
|
4
|
+
* The base branch (the PR base — usually `main`) can never be submitted for
|
|
5
|
+
* review (both modes: submitting it would push straight to itself, bypassing
|
|
6
|
+
* review) and is read-only in the editor in prod (dev needs the base branch
|
|
7
|
+
* editable since the developer always lands there — see ARCHITECTURE.md
|
|
8
|
+
* "Protected Base Branch"). This is the single source of truth other modules
|
|
9
|
+
* key off of; do not re-derive the comparison elsewhere.
|
|
10
|
+
*/
|
|
11
|
+
import type { CanopyConfig } from '../config';
|
|
12
|
+
export interface BranchProtection {
|
|
13
|
+
/** True when branchName resolves to the configured base branch. */
|
|
14
|
+
isProtected: boolean;
|
|
15
|
+
/** True when the branch must never be submitted for review (both modes). */
|
|
16
|
+
submitBlocked: boolean;
|
|
17
|
+
/** True when the branch is read-only in the editor (prod only). */
|
|
18
|
+
readOnly: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Determine whether `branchName` is the protected base branch for `config`.
|
|
22
|
+
*
|
|
23
|
+
* Comparison is sanitization-aware: branch metadata names are sanitized
|
|
24
|
+
* (`sanitizeBranchName`) but `config.defaultBaseBranch` holds the raw git
|
|
25
|
+
* name, so both sides are sanitized before comparing.
|
|
26
|
+
*
|
|
27
|
+
* `recordedBaseBranch` (a branch's own `baseBranch` field, i.e. its recorded
|
|
28
|
+
* fork point) is an additional, independent protection clause: a branch whose
|
|
29
|
+
* fork point equals its own name IS a base workspace, regardless of what
|
|
30
|
+
* `config.defaultBaseBranch` says right now. This matters because in dev
|
|
31
|
+
* mode, `config.defaultBaseBranch` tracks live git HEAD (`refreshActiveBranch`)
|
|
32
|
+
* and can drift to a different branch after the base workspace was created --
|
|
33
|
+
* without this clause, that drift would silently un-protect the branch the
|
|
34
|
+
* base workspace was actually forked from. The clause is purely additive: it
|
|
35
|
+
* only ever adds protection the config clause didn't already grant, so a
|
|
36
|
+
* normal editing branch (`baseBranch !== name`) is never falsely protected.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getBranchProtection(config: Pick<CanopyConfig, 'mode' | 'defaultBaseBranch'>, branchName: string, recordedBaseBranch?: string): BranchProtection;
|
|
39
|
+
//# sourceMappingURL=protected-branch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected-branch.d.ts","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAM7C,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,WAAW,EAAE,OAAO,CAAA;IACpB,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,EACxD,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,gBAAgB,CAWlB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protected base branch predicate.
|
|
3
|
+
*
|
|
4
|
+
* The base branch (the PR base — usually `main`) can never be submitted for
|
|
5
|
+
* review (both modes: submitting it would push straight to itself, bypassing
|
|
6
|
+
* review) and is read-only in the editor in prod (dev needs the base branch
|
|
7
|
+
* editable since the developer always lands there — see ARCHITECTURE.md
|
|
8
|
+
* "Protected Base Branch"). This is the single source of truth other modules
|
|
9
|
+
* key off of; do not re-derive the comparison elsewhere.
|
|
10
|
+
*/
|
|
11
|
+
// branch-name, NOT branch: this module is client-reachable (editor bundle →
|
|
12
|
+
// api/guards.ts → here), and paths/branch.ts drags node:fs into the graph,
|
|
13
|
+
// which breaks adopters' production `next build`.
|
|
14
|
+
import { sanitizeBranchName } from '../paths/branch-name.js';
|
|
15
|
+
/**
|
|
16
|
+
* Determine whether `branchName` is the protected base branch for `config`.
|
|
17
|
+
*
|
|
18
|
+
* Comparison is sanitization-aware: branch metadata names are sanitized
|
|
19
|
+
* (`sanitizeBranchName`) but `config.defaultBaseBranch` holds the raw git
|
|
20
|
+
* name, so both sides are sanitized before comparing.
|
|
21
|
+
*
|
|
22
|
+
* `recordedBaseBranch` (a branch's own `baseBranch` field, i.e. its recorded
|
|
23
|
+
* fork point) is an additional, independent protection clause: a branch whose
|
|
24
|
+
* fork point equals its own name IS a base workspace, regardless of what
|
|
25
|
+
* `config.defaultBaseBranch` says right now. This matters because in dev
|
|
26
|
+
* mode, `config.defaultBaseBranch` tracks live git HEAD (`refreshActiveBranch`)
|
|
27
|
+
* and can drift to a different branch after the base workspace was created --
|
|
28
|
+
* without this clause, that drift would silently un-protect the branch the
|
|
29
|
+
* base workspace was actually forked from. The clause is purely additive: it
|
|
30
|
+
* only ever adds protection the config clause didn't already grant, so a
|
|
31
|
+
* normal editing branch (`baseBranch !== name`) is never falsely protected.
|
|
32
|
+
*/
|
|
33
|
+
export function getBranchProtection(config, branchName, recordedBaseBranch) {
|
|
34
|
+
const sanitizedName = sanitizeBranchName(branchName);
|
|
35
|
+
const isProtected = sanitizedName === sanitizeBranchName(config.defaultBaseBranch ?? 'main') ||
|
|
36
|
+
(recordedBaseBranch !== undefined && sanitizedName === sanitizeBranchName(recordedBaseBranch));
|
|
37
|
+
return {
|
|
38
|
+
isProtected,
|
|
39
|
+
submitBlocked: isProtected,
|
|
40
|
+
readOnly: isProtected && config.mode === 'prod',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=protected-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protected-branch.js","sourceRoot":"","sources":["../../src/authorization/protected-branch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,4EAA4E;AAC5E,2EAA2E;AAC3E,kDAAkD;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAWzD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAwD,EACxD,UAAkB,EAClB,kBAA2B;IAE3B,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IACpD,MAAM,WAAW,GACf,aAAa,KAAK,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC;QACxE,CAAC,kBAAkB,KAAK,SAAS,IAAI,aAAa,KAAK,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAEhG,OAAO;QACL,WAAW;QACX,aAAa,EAAE,WAAW;QAC1B,QAAQ,EAAE,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;KAChD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { BranchMetadata } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Admin-facing health classification of every directory under a branches
|
|
4
|
+
* root (`baseRoot`), including ones the {@link BranchRegistry} quarantines
|
|
5
|
+
* out of normal listings. Two stuck states have no in-product recovery
|
|
6
|
+
* without this: a branch dir whose `.canopy-meta/branch.json` is corrupt
|
|
7
|
+
* (registry now silently drops it — see branch-registry.ts's
|
|
8
|
+
* `scanBranchDirectories` quarantine), and an orphan dir with no
|
|
9
|
+
* `branch.json` at all (left behind by a partial delete crash — see
|
|
10
|
+
* `api/branch.ts`'s delete handler). Both are invisible to admins in prod,
|
|
11
|
+
* who have no filesystem access.
|
|
12
|
+
*
|
|
13
|
+
* `scanBranchHealth` mirrors the registry's own directory-listing rules
|
|
14
|
+
* (skip non-directories and dot-prefixed names) so its classification never
|
|
15
|
+
* disagrees with what the registry itself would show as "missing".
|
|
16
|
+
*/
|
|
17
|
+
export type BranchHealthKind = 'healthy' | 'corrupt-metadata' | 'orphan';
|
|
18
|
+
export interface BranchHealthEntry {
|
|
19
|
+
dirName: string;
|
|
20
|
+
kind: BranchHealthKind;
|
|
21
|
+
/** True when this directory is the sanitized base-branch directory. */
|
|
22
|
+
isBaseBranch?: boolean;
|
|
23
|
+
/** healthy only */
|
|
24
|
+
branch?: BranchMetadata;
|
|
25
|
+
/** corrupt-metadata only: message describing why the file failed to load. */
|
|
26
|
+
parseError?: string;
|
|
27
|
+
/** corrupt-metadata only: branch.json's mtime, ISO. Omitted if branch.json itself couldn't be stat'd. */
|
|
28
|
+
metaMtime?: string;
|
|
29
|
+
/** orphan only: whether a `.git` directory is present (partial clone vs. fully-provisioned). */
|
|
30
|
+
hasGitDir?: boolean;
|
|
31
|
+
/** orphan only: the directory's own mtime, ISO. */
|
|
32
|
+
dirMtime?: string;
|
|
33
|
+
/** orphan only: age of the directory's mtime in ms, clamped to >= 0. */
|
|
34
|
+
ageMs?: number;
|
|
35
|
+
/**
|
|
36
|
+
* [H1] Present iff the dir's provisioning init-lock marker exists on disk,
|
|
37
|
+
* for orphan and corrupt-metadata entries only. Presence alone means
|
|
38
|
+
* nothing -- a crashed provisioner's lock lingers forever (proper-lockfile
|
|
39
|
+
* stale locks are only reaped by a later acquisition attempt, and a health
|
|
40
|
+
* scan never acquires). Freshness (`ageMs`) is the actual signal admin
|
|
41
|
+
* actions gate on.
|
|
42
|
+
*/
|
|
43
|
+
provisioningLock?: {
|
|
44
|
+
mtime: string;
|
|
45
|
+
ageMs: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The on-disk path of the cross-process provisioning lock marker for a
|
|
50
|
+
* given branch directory, matching `branch-workspace.ts`'s
|
|
51
|
+
* `ensureGitWorkspace()` exactly:
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* acquireProvisioningLock(
|
|
55
|
+
* path.dirname(branchRoot), // === baseRoot
|
|
56
|
+
* `.${path.basename(branchRoot)}.init.lock`,
|
|
57
|
+
* )
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* `acquireProvisioningLock` passes this name as `lockfilePath`, which
|
|
61
|
+
* overrides proper-lockfile's default `${target}.lock` naming, so the lock
|
|
62
|
+
* marker itself (a directory, mkdir-based) lives at exactly this path -- no
|
|
63
|
+
* extra `.lock` suffix.
|
|
64
|
+
*/
|
|
65
|
+
export declare function provisioningLockPath(baseRoot: string, dirName: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Scan every directory under `baseRoot` and classify it as healthy,
|
|
68
|
+
* corrupt-metadata, or orphan. Never throws for a single bad directory --
|
|
69
|
+
* one dir's unreadable/unparseable metadata must not take down the whole
|
|
70
|
+
* scan (same rationale as the registry's own quarantine behavior).
|
|
71
|
+
*
|
|
72
|
+
* Tolerates a missing `baseRoot` (returns `[]`) so the admin endpoint can
|
|
73
|
+
* call this unconditionally without a pre-existence check.
|
|
74
|
+
*/
|
|
75
|
+
export declare function scanBranchHealth(baseRoot: string, opts: {
|
|
76
|
+
baseBranchName: string;
|
|
77
|
+
}): Promise<BranchHealthEntry[]>;
|
|
78
|
+
//# sourceMappingURL=branch-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-health.d.ts","sourceRoot":"","sources":["../src/branch-health.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,kBAAkB,GAAG,QAAQ,CAAA;AAExE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,gBAAgB,CAAA;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mBAAmB;IACnB,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yGAAyG;IACzG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gGAAgG;IAChG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9E;AA2BD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmG9B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { BranchMetadataFileManager, BranchMetadataCorruptError } from './branch-metadata.js';
|
|
4
|
+
import { sanitizeBranchName } from './paths/branch-name.js';
|
|
5
|
+
import { getErrorMessage, isNodeError, isNotFoundError } from './utils/error.js';
|
|
6
|
+
/**
|
|
7
|
+
* The on-disk path of the cross-process provisioning lock marker for a
|
|
8
|
+
* given branch directory, matching `branch-workspace.ts`'s
|
|
9
|
+
* `ensureGitWorkspace()` exactly:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* acquireProvisioningLock(
|
|
13
|
+
* path.dirname(branchRoot), // === baseRoot
|
|
14
|
+
* `.${path.basename(branchRoot)}.init.lock`,
|
|
15
|
+
* )
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* `acquireProvisioningLock` passes this name as `lockfilePath`, which
|
|
19
|
+
* overrides proper-lockfile's default `${target}.lock` naming, so the lock
|
|
20
|
+
* marker itself (a directory, mkdir-based) lives at exactly this path -- no
|
|
21
|
+
* extra `.lock` suffix.
|
|
22
|
+
*/
|
|
23
|
+
export function provisioningLockPath(baseRoot, dirName) {
|
|
24
|
+
return path.join(baseRoot, `.${dirName}.init.lock`);
|
|
25
|
+
}
|
|
26
|
+
/** Stat the provisioning lock marker, if present. Never throws. */
|
|
27
|
+
async function readProvisioningLock(baseRoot, dirName) {
|
|
28
|
+
try {
|
|
29
|
+
const stat = await fs.stat(provisioningLockPath(baseRoot, dirName));
|
|
30
|
+
return { mtime: stat.mtime.toISOString(), ageMs: Math.max(0, Date.now() - stat.mtimeMs) };
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Missing, or unreadable for some other reason -- either way, "no signal"
|
|
34
|
+
// is the safe default rather than failing the whole scan.
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Stat branch.json's mtime for a corrupt-metadata entry. Never throws. */
|
|
39
|
+
async function readMetaMtime(branchRoot) {
|
|
40
|
+
try {
|
|
41
|
+
const stat = await fs.stat(path.join(branchRoot, '.canopy-meta', 'branch.json'));
|
|
42
|
+
return stat.mtime.toISOString();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Scan every directory under `baseRoot` and classify it as healthy,
|
|
50
|
+
* corrupt-metadata, or orphan. Never throws for a single bad directory --
|
|
51
|
+
* one dir's unreadable/unparseable metadata must not take down the whole
|
|
52
|
+
* scan (same rationale as the registry's own quarantine behavior).
|
|
53
|
+
*
|
|
54
|
+
* Tolerates a missing `baseRoot` (returns `[]`) so the admin endpoint can
|
|
55
|
+
* call this unconditionally without a pre-existence check.
|
|
56
|
+
*/
|
|
57
|
+
export async function scanBranchHealth(baseRoot, opts) {
|
|
58
|
+
const resolvedRoot = path.resolve(baseRoot);
|
|
59
|
+
const sanitizedBaseBranchName = sanitizeBranchName(opts.baseBranchName);
|
|
60
|
+
let dirEntries;
|
|
61
|
+
try {
|
|
62
|
+
dirEntries = await fs.readdir(resolvedRoot, { withFileTypes: true });
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (isNotFoundError(err))
|
|
66
|
+
return [];
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
const entries = [];
|
|
70
|
+
for (const dirEntry of dirEntries) {
|
|
71
|
+
// Same skip rules as BranchRegistry.scanBranchDirectories: non-dirs and
|
|
72
|
+
// dot-prefixed names (`.canopy-meta`-style, and our own `.trash-*`/
|
|
73
|
+
// `.*.init.lock` markers) are never branch directories.
|
|
74
|
+
if (!dirEntry.isDirectory() || dirEntry.name.startsWith('.'))
|
|
75
|
+
continue;
|
|
76
|
+
const dirName = dirEntry.name;
|
|
77
|
+
const branchRoot = path.join(resolvedRoot, dirName);
|
|
78
|
+
const isBaseBranch = dirName === sanitizedBaseBranchName;
|
|
79
|
+
let meta = null;
|
|
80
|
+
let loadErr = null;
|
|
81
|
+
try {
|
|
82
|
+
meta = await BranchMetadataFileManager.loadOnly(branchRoot);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
loadErr = err;
|
|
86
|
+
}
|
|
87
|
+
if (loadErr) {
|
|
88
|
+
// Both the documented BranchMetadataCorruptError (bad JSON) and any
|
|
89
|
+
// other loadOnly failure (EACCES, EISDIR from a directory named
|
|
90
|
+
// branch.json, etc.) land here: all are "needs admin attention",
|
|
91
|
+
// and none may throw out of the scan.
|
|
92
|
+
//
|
|
93
|
+
// [MEDIUM-2] parseError is served to the browser via the admin
|
|
94
|
+
// branch-health endpoint, so it must never leak the absolute
|
|
95
|
+
// workspace path. BranchMetadataCorruptError carries `parseCause`
|
|
96
|
+
// (the raw JSON.parse message, path-free) for exactly this --
|
|
97
|
+
// `message` embeds branchRoot and is for server logs only. Other node
|
|
98
|
+
// errors (EISDIR from a directory named branch.json, EACCES, etc.)
|
|
99
|
+
// embed the path in their `message`, so only their `code` is safe to
|
|
100
|
+
// surface; non-node errors fall back to getErrorMessage.
|
|
101
|
+
const parseError = loadErr instanceof BranchMetadataCorruptError
|
|
102
|
+
? loadErr.parseCause
|
|
103
|
+
: isNodeError(loadErr)
|
|
104
|
+
? (loadErr.code ?? 'read error')
|
|
105
|
+
: getErrorMessage(loadErr);
|
|
106
|
+
const [metaMtime, provisioningLock] = await Promise.all([
|
|
107
|
+
readMetaMtime(branchRoot),
|
|
108
|
+
readProvisioningLock(resolvedRoot, dirName),
|
|
109
|
+
]);
|
|
110
|
+
entries.push({
|
|
111
|
+
dirName,
|
|
112
|
+
kind: 'corrupt-metadata',
|
|
113
|
+
...(isBaseBranch ? { isBaseBranch } : {}),
|
|
114
|
+
parseError,
|
|
115
|
+
...(metaMtime ? { metaMtime } : {}),
|
|
116
|
+
...(provisioningLock ? { provisioningLock } : {}),
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (meta) {
|
|
121
|
+
entries.push({
|
|
122
|
+
dirName,
|
|
123
|
+
kind: 'healthy',
|
|
124
|
+
...(isBaseBranch ? { isBaseBranch } : {}),
|
|
125
|
+
branch: meta.branch,
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
// meta === null, no loadErr: no branch.json at all -- orphan.
|
|
130
|
+
const [gitDirStat, dirStat, provisioningLock] = await Promise.all([
|
|
131
|
+
fs.stat(path.join(branchRoot, '.git')).catch(() => null),
|
|
132
|
+
fs.stat(branchRoot).catch(() => null),
|
|
133
|
+
readProvisioningLock(resolvedRoot, dirName),
|
|
134
|
+
]);
|
|
135
|
+
entries.push({
|
|
136
|
+
dirName,
|
|
137
|
+
kind: 'orphan',
|
|
138
|
+
...(isBaseBranch ? { isBaseBranch } : {}),
|
|
139
|
+
hasGitDir: gitDirStat !== null,
|
|
140
|
+
...(dirStat
|
|
141
|
+
? {
|
|
142
|
+
dirMtime: dirStat.mtime.toISOString(),
|
|
143
|
+
ageMs: Math.max(0, Date.now() - dirStat.mtimeMs),
|
|
144
|
+
}
|
|
145
|
+
: {}),
|
|
146
|
+
...(provisioningLock ? { provisioningLock } : {}),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return entries;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=branch-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-health.js","sourceRoot":"","sources":["../src/branch-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,26 @@ export interface BranchMetadataFile {
|
|
|
9
9
|
export declare class BranchMetadataConflictError extends Error {
|
|
10
10
|
constructor(message?: string);
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* branch.json exists but its content is not valid JSON. Distinguished from
|
|
14
|
+
* provisioning/IO failures so callers can degrade instead of failing hard:
|
|
15
|
+
* the registry scan quarantines the branch, and the request handler keeps
|
|
16
|
+
* serving (with empty internal groups) when the BASE branch is the corrupt
|
|
17
|
+
* one — otherwise the admin recovery surface would be unreachable exactly
|
|
18
|
+
* when it is needed.
|
|
19
|
+
*/
|
|
20
|
+
export declare class BranchMetadataCorruptError extends Error {
|
|
21
|
+
readonly branchRoot: string;
|
|
22
|
+
/**
|
|
23
|
+
* [MEDIUM-2] The raw JSON.parse failure message (e.g. "Unexpected token
|
|
24
|
+
* ..."), with no embedded path. `message` above deliberately keeps the
|
|
25
|
+
* full `branchRoot`-qualified text for server logs; `parseCause` is what
|
|
26
|
+
* callers should surface to clients (see branch-health.ts's `parseError`)
|
|
27
|
+
* so the admin branch-health scan never leaks the absolute workspace path.
|
|
28
|
+
*/
|
|
29
|
+
readonly parseCause: string;
|
|
30
|
+
constructor(branchRoot: string, cause: string);
|
|
31
|
+
}
|
|
12
32
|
/**
|
|
13
33
|
* Manages branch.json — branch status and access ACLs, both security-adjacent
|
|
14
34
|
* state — under `.canopy-meta/` in a branch workspace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-metadata.d.ts","sourceRoot":"","sources":["../src/branch-metadata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,SAAS,CAAA;AAG1E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAarD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;CACvB;AAID,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,SAAwD;CAI5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAE7C,OAAO;IAOP;;;OAGG;WACU,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"branch-metadata.d.ts","sourceRoot":"","sources":["../src/branch-metadata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAgB,MAAM,SAAS,CAAA;AAG1E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAarD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,cAAc,CAAA;CACvB;AAID,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,SAAwD;CAI5E;AAED;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAEf,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAM9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAE7C,OAAO;IAOP;;;OAGG;WACU,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAiB7E;;;OAGG;IACH,MAAM,CAAC,GAAG,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9B,yBAAyB;YAId,IAAI;IAclB;;;;;;;;;;;;;OAaG;YACW,KAAK;IAenB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,IAAI,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwEvE;;OAEG;YACW,kBAAkB;CAIjC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC,CAAA;CAClE;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,IAAiB,GACrB,WAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAO7C;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GACvC,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,UAAU;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAC9B,yBAEF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,aAAa,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAiB/B,CAAA"}
|
package/dist/branch-metadata.js
CHANGED
|
@@ -14,6 +14,22 @@ export class BranchMetadataConflictError extends Error {
|
|
|
14
14
|
this.name = 'BranchMetadataConflictError';
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* branch.json exists but its content is not valid JSON. Distinguished from
|
|
19
|
+
* provisioning/IO failures so callers can degrade instead of failing hard:
|
|
20
|
+
* the registry scan quarantines the branch, and the request handler keeps
|
|
21
|
+
* serving (with empty internal groups) when the BASE branch is the corrupt
|
|
22
|
+
* one — otherwise the admin recovery surface would be unreachable exactly
|
|
23
|
+
* when it is needed.
|
|
24
|
+
*/
|
|
25
|
+
export class BranchMetadataCorruptError extends Error {
|
|
26
|
+
constructor(branchRoot, cause) {
|
|
27
|
+
super(`Corrupt branch metadata in '${branchRoot}': ${cause}`);
|
|
28
|
+
this.name = 'BranchMetadataCorruptError';
|
|
29
|
+
this.branchRoot = branchRoot;
|
|
30
|
+
this.parseCause = cause;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
17
33
|
/**
|
|
18
34
|
* Manages branch.json — branch status and access ACLs, both security-adjacent
|
|
19
35
|
* state — under `.canopy-meta/` in a branch workspace.
|
|
@@ -53,7 +69,8 @@ export class BranchMetadataFileManager {
|
|
|
53
69
|
* Use this for read-only access (e.g., in registry scanning or loadBranchContext).
|
|
54
70
|
*/
|
|
55
71
|
static async loadOnly(branchRoot) {
|
|
56
|
-
const
|
|
72
|
+
const resolvedRoot = path.resolve(branchRoot);
|
|
73
|
+
const filePath = path.join(resolvedRoot, BRANCH_META_DIR, BRANCH_META_FILE);
|
|
57
74
|
try {
|
|
58
75
|
const raw = await fs.readFile(filePath, 'utf8');
|
|
59
76
|
return JSON.parse(raw);
|
|
@@ -62,6 +79,9 @@ export class BranchMetadataFileManager {
|
|
|
62
79
|
if (isNotFoundError(err)) {
|
|
63
80
|
return null;
|
|
64
81
|
}
|
|
82
|
+
if (err instanceof SyntaxError) {
|
|
83
|
+
throw new BranchMetadataCorruptError(resolvedRoot, err.message);
|
|
84
|
+
}
|
|
65
85
|
throw err;
|
|
66
86
|
}
|
|
67
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-metadata.js","sourceRoot":"","sources":["../src/branch-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAE/B,MAAM,eAAe,GAAG,cAAc,CAAA;AACtC,MAAM,gBAAgB,GAAG,aAAa,CAAA;AAStC,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEhC,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAO,GAAG,qDAAqD;QACzE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAA;IAC3C,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,yBAAyB;IAMpC,YAAoB,UAAkB,EAAE,QAAgB,EAAE,OAA+B;QACvF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;QAC7E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAA;IACnC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAkB;QACtC,MAAM,
|
|
1
|
+
{"version":3,"file":"branch-metadata.js","sourceRoot":"","sources":["../src/branch-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-registry.d.ts","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AA4B5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB;;;;OAIG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,4GAA4G;IAC5G,OAAO,CAAC,aAAa,CAAwC;IAE7D,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB,CAAI;gBAEnB,IAAI,EAAE,MAAM;IAOxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2BtC;;;;;;;;;;OAUG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAW3D,OAAO,CAAC,kBAAkB;IAO1B;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;;;;;OAMG;YACW,UAAU;YAYV,iBAAiB;IA4C/B;;;;OAIG;cACa,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"branch-registry.d.ts","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AA4B5C,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB;;;;OAIG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,4GAA4G;IAC5G,OAAO,CAAC,aAAa,CAAwC;IAE7D,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB,CAAI;gBAEnB,IAAI,EAAE,MAAM;IAOxB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA2BtC;;;;;;;;;;OAUG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAW3D,OAAO,CAAC,kBAAkB;IAO1B;;;;;;;;;OASG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBjC;;;;;;OAMG;YACW,UAAU;YAYV,iBAAiB;IA4C/B;;;;OAIG;cACa,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CA+ClE"}
|
package/dist/branch-registry.js
CHANGED
|
@@ -232,7 +232,19 @@ export class BranchRegistry {
|
|
|
232
232
|
continue;
|
|
233
233
|
}
|
|
234
234
|
const branchRoot = path.join(this.root, entry.name);
|
|
235
|
-
|
|
235
|
+
// Quarantine, don't propagate: one branch's corrupt/unreadable
|
|
236
|
+
// branch.json must not take down the whole listing (a rethrow here
|
|
237
|
+
// would 500 GET /branches for every branch). The broken branch just
|
|
238
|
+
// drops out of the registry; it stays on disk for the admin
|
|
239
|
+
// branch-health surface to report and repair.
|
|
240
|
+
let meta;
|
|
241
|
+
try {
|
|
242
|
+
meta = await BranchMetadataFileManager.loadOnly(branchRoot);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.warn(`CanopyCMS: Skipping branch directory '${entry.name}' during registry scan: ${getErrorMessage(err)}`);
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
236
248
|
if (meta) {
|
|
237
249
|
branches.push({
|
|
238
250
|
branch: meta.branch,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-registry.js","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,GAAG,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;AAE3D,kFAAkF;AAClF,MAAM,aAAa,GAAG,eAAe,CAAA;AACrC,mFAAmF;AACnF,6EAA6E;AAC7E,gFAAgF;AAChF,mFAAmF;AACnF,MAAM,mBAAmB,GAAG,qBAAqB,CAAA;AACjD,MAAM,kBAAkB,GAAG,mBAAmB,CAAA;AAC9C,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAE1B,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,iBAAiB,CAAA;AAElC,+GAA+G;AAC/G,MAAM,gCAAgC,GAAG,IAAI,CAAA;AAa7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,OAAO,cAAc;IAYzB,YAAY,IAAY;QANxB,4GAA4G;QACpG,kBAAa,GAAoC,IAAI,CAAA;QAE7D,6DAA6D;QACrD,wBAAmB,GAAG,CAAC,CAAA;QAG7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,MAA8B,CAAA;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;YACxD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAA;QACpD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;YAChC,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;QAED,wEAAwE;QACxE,uEAAuE;QACvE,uEAAuE;QACvE,qEAAqE;QACrE,IAAI,MAAM,CAAC,OAAO,KAAK,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3E,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC9D,IAAI,mBAAmB,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,MAAM,CAAC,QAAQ,CAAA;QACxB,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;IAChC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;QAC1D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QAEvB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAAE,OAAO,SAAS,CAAA;QAEhD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACtD,CAAC;IAEO,kBAAkB;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,mBAAmB,GAAG,gCAAgC;YAAE,OAAO,KAAK,CAAA;QACnF,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAA;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QAExE,IAAI,CAAC;YACH,+DAA+D;YAC/D,kEAAkE;YAClE,kEAAkE;YAClE,qEAAqE;YACrE,8DAA8D;YAC9D,IAAI,IAAI,CAAC,aAAa;gBAAE,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAChE,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,8CAA8C,EAAE;gBACrE,KAAK,EAAE,eAAe,CAAC,GAAG,CAAC;aAC5B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC,aAAa,CAAA;QAEjD,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACpC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAA;QACxB,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAA;QAClB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,uEAAuE;QACvE,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAEnD,qEAAqE;QACrE,8EAA8E;QAC9E,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,uEAAuE;YACvE,sEAAsE;YACtE,sEAAsE;YACtE,qEAAqE;YACrE,qEAAqE;YACrE,sEAAsE;YACtE,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,QAAQ,GAA2B;YACvC,OAAO,EAAE,gBAAgB;YACzB,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,KAAK;SACvB,CAAA;QAED,uDAAuD;QACvD,yEAAyE;QACzE,MAAM,cAAc,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9F,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAA;QAEpF,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACpD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,qCAAqC;YACrC,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAC/C,MAAM,GAAG,CAAA;QACX,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,qBAAqB;QACnC,MAAM,QAAQ,GAAoB,EAAE,CAAA;QAEpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;YAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,kEAAkE;gBAClE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvD,SAAQ;gBACV,CAAC;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"branch-registry.js","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"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"}
|