canopycms 0.0.11 → 0.0.12
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/README.md +24 -27
- package/dist/ai/handler.d.ts +3 -3
- package/dist/ai/handler.d.ts.map +1 -1
- package/dist/ai/handler.js +6 -9
- package/dist/ai/handler.js.map +1 -1
- package/dist/ai/resolve-branch.d.ts +1 -2
- package/dist/ai/resolve-branch.d.ts.map +1 -1
- package/dist/ai/resolve-branch.js +8 -9
- package/dist/ai/resolve-branch.js.map +1 -1
- package/dist/api/branch.js +2 -2
- package/dist/api/branch.js.map +1 -1
- package/dist/api/github-sync.js +0 -2
- package/dist/api/github-sync.js.map +1 -1
- package/dist/api/settings-helpers.d.ts +3 -5
- package/dist/api/settings-helpers.d.ts.map +1 -1
- package/dist/api/settings-helpers.js +6 -19
- package/dist/api/settings-helpers.js.map +1 -1
- package/dist/auth/caching-auth-plugin.d.ts +7 -1
- package/dist/auth/caching-auth-plugin.d.ts.map +1 -1
- package/dist/auth/caching-auth-plugin.js +31 -3
- package/dist/auth/caching-auth-plugin.js.map +1 -1
- package/dist/auth/plugin.d.ts +1 -1
- package/dist/authorization/types.d.ts +1 -1
- package/dist/branch-registry.js +1 -1
- package/dist/branch-registry.js.map +1 -1
- package/dist/branch-schema-cache.d.ts +8 -13
- package/dist/branch-schema-cache.d.ts.map +1 -1
- package/dist/branch-schema-cache.js +55 -44
- package/dist/branch-schema-cache.js.map +1 -1
- package/dist/cli/cli.d.ts +20 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +196 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/generate-ai-content.js +1501 -723
- package/dist/cli/init.d.ts +2 -3
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +258 -2861
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/sync.d.ts +33 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +510 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/schemas/config.d.ts +5 -5
- package/dist/config/schemas/config.d.ts.map +1 -1
- package/dist/config/schemas/config.js +1 -1
- package/dist/config/schemas/config.js.map +1 -1
- package/dist/config-test.d.ts.map +1 -1
- package/dist/config-test.js +0 -1
- package/dist/config-test.js.map +1 -1
- package/dist/content-reader.js +1 -1
- package/dist/content-reader.js.map +1 -1
- package/dist/editor/BranchManager.d.ts.map +1 -1
- package/dist/editor/BranchManager.js +1 -3
- package/dist/editor/BranchManager.js.map +1 -1
- package/dist/git-manager.d.ts +2 -3
- package/dist/git-manager.d.ts.map +1 -1
- package/dist/git-manager.js +12 -4
- package/dist/git-manager.js.map +1 -1
- package/dist/operating-mode/client-safe-strategy.d.ts +1 -12
- package/dist/operating-mode/client-safe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-safe-strategy.js +5 -42
- package/dist/operating-mode/client-safe-strategy.js.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
- package/dist/operating-mode/client-unsafe-strategy.js +10 -68
- package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
- package/dist/operating-mode/index.d.ts +3 -3
- package/dist/operating-mode/index.d.ts.map +1 -1
- package/dist/operating-mode/index.js +2 -2
- package/dist/operating-mode/types.d.ts +2 -6
- package/dist/operating-mode/types.d.ts.map +1 -1
- package/dist/services.d.ts +6 -0
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +52 -40
- package/dist/services.js.map +1 -1
- package/dist/settings-branch-utils.d.ts +2 -2
- package/dist/settings-branch-utils.js +3 -3
- package/dist/settings-branch-utils.js.map +1 -1
- package/dist/settings-workspace.d.ts +1 -2
- package/dist/settings-workspace.d.ts.map +1 -1
- package/dist/settings-workspace.js +1 -2
- package/dist/settings-workspace.js.map +1 -1
- package/dist/utils/fs.d.ts +3 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +15 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/git.d.ts +7 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +17 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/worker/task-queue-config.d.ts +2 -4
- package/dist/worker/task-queue-config.d.ts.map +1 -1
- package/dist/worker/task-queue-config.js +3 -7
- package/dist/worker/task-queue-config.js.map +1 -1
- package/package.json +4 -2
package/dist/branch-registry.js
CHANGED
|
@@ -101,7 +101,7 @@ export class BranchRegistry {
|
|
|
101
101
|
try {
|
|
102
102
|
const entries = await fs.readdir(this.root, { withFileTypes: true });
|
|
103
103
|
for (const entry of entries) {
|
|
104
|
-
// Skip non-directories and hidden directories (like .canopy-meta
|
|
104
|
+
// Skip non-directories and hidden directories (like .canopy-meta)
|
|
105
105
|
if (!entry.isDirectory() || entry.name.startsWith('.')) {
|
|
106
106
|
continue;
|
|
107
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-registry.js","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"branch-registry.js","sourceRoot":"","sources":["../src/branch-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { RootCollectionConfig } from './config';
|
|
2
2
|
import type { FlatSchemaItem } from './config/types';
|
|
3
|
-
import type { EntrySchemaRegistry } from './schema/types';
|
|
4
3
|
import type { OperatingMode } from './operating-mode';
|
|
4
|
+
import type { EntrySchemaRegistry } from './schema/types';
|
|
5
5
|
/**
|
|
6
6
|
* Schema cache structure stored in {branchRoot}/.canopy-meta/schema-cache.json
|
|
7
7
|
*/
|
|
@@ -15,8 +15,8 @@ export interface BranchSchemaCacheEntry {
|
|
|
15
15
|
* Manages per-branch schema caching with lazy loading and automatic invalidation.
|
|
16
16
|
*
|
|
17
17
|
* Caching Strategy:
|
|
18
|
-
* -
|
|
19
|
-
*
|
|
18
|
+
* - File-based cache at {branchRoot}/.canopy-meta/schema-cache.json (no in-memory layer
|
|
19
|
+
* — intentional: matches prod behavior and keeps cache coherent across Lambda invocations)
|
|
20
20
|
* - Invalidation: Writers create .stale marker, causing cache regeneration on next access
|
|
21
21
|
*
|
|
22
22
|
* Multi-User Support:
|
|
@@ -25,13 +25,14 @@ export interface BranchSchemaCacheEntry {
|
|
|
25
25
|
* - Atomic file operations prevent corruption during concurrent access
|
|
26
26
|
*/
|
|
27
27
|
export declare class BranchSchemaCache {
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
28
|
+
/** Tracks when we last checked mtimes per contentRoot, to debounce rapid requests */
|
|
29
|
+
private lastMtimeCheck;
|
|
30
|
+
private readonly devMode;
|
|
31
|
+
constructor(mode?: OperatingMode);
|
|
31
32
|
/**
|
|
32
33
|
* Get schema for a branch (loads from cache or resolves fresh).
|
|
33
34
|
*
|
|
34
|
-
* @param branchRoot - Root directory of the branch (e.g., .canopy-
|
|
35
|
+
* @param branchRoot - Root directory of the branch (e.g., .canopy-dev/content-branches/main)
|
|
35
36
|
* @param entrySchemaRegistry - Map of schema names to field definitions
|
|
36
37
|
* @param contentRootName - Name of content directory (e.g., "content") from config
|
|
37
38
|
* @returns Resolved schema tree and flattened schema
|
|
@@ -50,11 +51,5 @@ export declare class BranchSchemaCache {
|
|
|
50
51
|
* @param branchRoot - Root directory of the branch
|
|
51
52
|
*/
|
|
52
53
|
invalidate(branchRoot: string): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* Clear all caches (for testing).
|
|
55
|
-
* In dev mode, clears in-memory cache.
|
|
56
|
-
* In prod/prod-sim modes, this would need to traverse all branch directories.
|
|
57
|
-
*/
|
|
58
|
-
clearAll(): Promise<void>;
|
|
59
54
|
}
|
|
60
55
|
//# sourceMappingURL=branch-schema-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-schema-cache.d.ts","sourceRoot":"","sources":["../src/branch-schema-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"branch-schema-cache.d.ts","sourceRoot":"","sources":["../src/branch-schema-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAUzD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,oBAAoB,CAAA;IAC5B,UAAU,EAAE,cAAc,EAAE,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;CACjB;AA8BD;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAC5B,qFAAqF;IACrF,OAAO,CAAC,cAAc,CAA4B;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,IAAI,GAAE,aAAsB;IAIxC;;;;;;;OAOG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,GAAE,MAAkB,GAClC,OAAO,CAAC;QAAE,MAAM,EAAE,oBAAoB,CAAC;QAAC,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IAI1E;;OAEG;YACW,sBAAsB;IAkFpC;;;;OAIG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpD"}
|
|
@@ -4,12 +4,45 @@ import { resolveSchema, isValidSchema } from './schema/resolver';
|
|
|
4
4
|
import { flattenSchema } from './config/flatten';
|
|
5
5
|
/** Bump when BranchSchemaCacheEntry shape changes to auto-invalidate stale caches */
|
|
6
6
|
const SCHEMA_CACHE_VERSION = 2;
|
|
7
|
+
/** Minimum interval between mtime staleness checks (ms) */
|
|
8
|
+
const MTIME_CHECK_DEBOUNCE_MS = 1000;
|
|
9
|
+
/**
|
|
10
|
+
* In dev mode, check whether any .collection.json file under dir has been
|
|
11
|
+
* modified more recently than cachedAt. Returns true if stale.
|
|
12
|
+
*
|
|
13
|
+
* Uses a single recursive readdir to find all .collection.json files,
|
|
14
|
+
* then stats only those files.
|
|
15
|
+
*/
|
|
16
|
+
async function isStaleByMtime(dir, cachedAt) {
|
|
17
|
+
let entries;
|
|
18
|
+
try {
|
|
19
|
+
entries = await fs.readdir(dir, { recursive: true, encoding: 'utf-8' });
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (!entry.endsWith('.collection.json'))
|
|
26
|
+
continue;
|
|
27
|
+
const full = path.join(dir, entry);
|
|
28
|
+
try {
|
|
29
|
+
const stat = await fs.stat(full);
|
|
30
|
+
if (stat.mtimeMs > cachedAt.getTime())
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// File may have been deleted between readdir and stat
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
7
40
|
/**
|
|
8
41
|
* Manages per-branch schema caching with lazy loading and automatic invalidation.
|
|
9
42
|
*
|
|
10
43
|
* Caching Strategy:
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
44
|
+
* - File-based cache at {branchRoot}/.canopy-meta/schema-cache.json (no in-memory layer
|
|
45
|
+
* — intentional: matches prod behavior and keeps cache coherent across Lambda invocations)
|
|
13
46
|
* - Invalidation: Writers create .stale marker, causing cache regeneration on next access
|
|
14
47
|
*
|
|
15
48
|
* Multi-User Support:
|
|
@@ -18,38 +51,20 @@ const SCHEMA_CACHE_VERSION = 2;
|
|
|
18
51
|
* - Atomic file operations prevent corruption during concurrent access
|
|
19
52
|
*/
|
|
20
53
|
export class BranchSchemaCache {
|
|
21
|
-
constructor(mode) {
|
|
22
|
-
|
|
54
|
+
constructor(mode = 'prod') {
|
|
55
|
+
/** Tracks when we last checked mtimes per contentRoot, to debounce rapid requests */
|
|
56
|
+
this.lastMtimeCheck = new Map();
|
|
57
|
+
this.devMode = mode === 'dev';
|
|
23
58
|
}
|
|
24
59
|
/**
|
|
25
60
|
* Get schema for a branch (loads from cache or resolves fresh).
|
|
26
61
|
*
|
|
27
|
-
* @param branchRoot - Root directory of the branch (e.g., .canopy-
|
|
62
|
+
* @param branchRoot - Root directory of the branch (e.g., .canopy-dev/content-branches/main)
|
|
28
63
|
* @param entrySchemaRegistry - Map of schema names to field definitions
|
|
29
64
|
* @param contentRootName - Name of content directory (e.g., "content") from config
|
|
30
65
|
* @returns Resolved schema tree and flattened schema
|
|
31
66
|
*/
|
|
32
67
|
async getSchema(branchRoot, entrySchemaRegistry, contentRootName = 'content') {
|
|
33
|
-
// Dev mode: use in-memory singleton
|
|
34
|
-
if (this.mode === 'dev') {
|
|
35
|
-
if (!this.devModeCache) {
|
|
36
|
-
const contentRoot = path.join(branchRoot, contentRootName);
|
|
37
|
-
const result = await resolveSchema(contentRoot, entrySchemaRegistry);
|
|
38
|
-
// Validate schema has content
|
|
39
|
-
if (!isValidSchema(result.schema)) {
|
|
40
|
-
throw new Error(`No schema found in ${contentRoot}. Create .collection.json files ` +
|
|
41
|
-
'with references to field schemas defined in your entry schema registry.');
|
|
42
|
-
}
|
|
43
|
-
// Use configured contentRoot name as base path for logical paths
|
|
44
|
-
const flatSchema = flattenSchema(result.schema, contentRootName);
|
|
45
|
-
this.devModeCache = {
|
|
46
|
-
schema: result.schema,
|
|
47
|
-
flatSchema,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return this.devModeCache;
|
|
51
|
-
}
|
|
52
|
-
// Prod/prod-sim: use file-based cache with stale marker invalidation
|
|
53
68
|
return this.loadFromCacheOrResolve(branchRoot, entrySchemaRegistry, contentRootName);
|
|
54
69
|
}
|
|
55
70
|
/**
|
|
@@ -77,7 +92,21 @@ export class BranchSchemaCache {
|
|
|
77
92
|
cacheData = null;
|
|
78
93
|
}
|
|
79
94
|
if (cacheData && cacheData.version === SCHEMA_CACHE_VERSION) {
|
|
80
|
-
|
|
95
|
+
// In dev mode, also check file mtimes so direct schema edits (outside the CMS) are picked up.
|
|
96
|
+
// Debounce: skip the walk if we checked this contentRoot within the last second.
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const lastCheck = this.lastMtimeCheck.get(contentRoot) ?? 0;
|
|
99
|
+
if (this.devMode &&
|
|
100
|
+
now - lastCheck >= MTIME_CHECK_DEBOUNCE_MS &&
|
|
101
|
+
(await isStaleByMtime(contentRoot, new Date(cacheData.cachedAt)))) {
|
|
102
|
+
this.lastMtimeCheck.set(contentRoot, now);
|
|
103
|
+
cacheData = null;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
if (this.devMode)
|
|
107
|
+
this.lastMtimeCheck.set(contentRoot, now);
|
|
108
|
+
return { schema: cacheData.schema, flatSchema: cacheData.flatSchema };
|
|
109
|
+
}
|
|
81
110
|
}
|
|
82
111
|
// Cache miss or stale - regenerate
|
|
83
112
|
const result = await resolveSchema(contentRoot, entrySchemaRegistry);
|
|
@@ -115,28 +144,10 @@ export class BranchSchemaCache {
|
|
|
115
144
|
* @param branchRoot - Root directory of the branch
|
|
116
145
|
*/
|
|
117
146
|
async invalidate(branchRoot) {
|
|
118
|
-
if (this.mode === 'dev') {
|
|
119
|
-
// Clear in-memory cache
|
|
120
|
-
this.devModeCache = undefined;
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
// Prod/prod-sim: create stale marker (empty file)
|
|
124
147
|
const cacheDir = path.join(branchRoot, '.canopy-meta');
|
|
125
148
|
const stalePath = path.join(cacheDir, 'schema-cache.stale');
|
|
126
149
|
await fs.mkdir(cacheDir, { recursive: true });
|
|
127
150
|
await fs.writeFile(stalePath, '', 'utf-8');
|
|
128
151
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Clear all caches (for testing).
|
|
131
|
-
* In dev mode, clears in-memory cache.
|
|
132
|
-
* In prod/prod-sim modes, this would need to traverse all branch directories.
|
|
133
|
-
*/
|
|
134
|
-
async clearAll() {
|
|
135
|
-
if (this.mode === 'dev') {
|
|
136
|
-
this.devModeCache = undefined;
|
|
137
|
-
}
|
|
138
|
-
// For prod/prod-sim, clearing all caches would require knowing all branch roots
|
|
139
|
-
// For now, just clear dev mode cache. Tests can invalidate specific branches.
|
|
140
|
-
}
|
|
141
152
|
}
|
|
142
153
|
//# sourceMappingURL=branch-schema-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-schema-cache.js","sourceRoot":"","sources":["../src/branch-schema-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAM5B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,qFAAqF;AACrF,MAAM,oBAAoB,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"branch-schema-cache.js","sourceRoot":"","sources":["../src/branch-schema-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* CanopyCMS CLI entrypoint.
|
|
4
|
+
*
|
|
5
|
+
* Routes commands to their implementations:
|
|
6
|
+
* init, init-deploy, worker, generate-ai-content, sync
|
|
7
|
+
*
|
|
8
|
+
* Command implementations live in separate files (init.ts, sync.ts, etc.)
|
|
9
|
+
* and are dynamically imported to keep startup fast.
|
|
10
|
+
*/
|
|
11
|
+
import minimist from 'minimist';
|
|
12
|
+
/** Parse raw CLI args into structured flags and positional command. Exported for testing. */
|
|
13
|
+
export declare function parseArgs(rawArgs: string[]): {
|
|
14
|
+
argv: minimist.ParsedArgs;
|
|
15
|
+
flags: Record<string, string | boolean>;
|
|
16
|
+
command: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
/** Resolve sync direction from --push/--pull/--abort flags. Exported for testing. */
|
|
19
|
+
export declare function resolveSyncDirection(push: boolean, pull: boolean, abort: boolean): 'push' | 'pull' | 'both' | 'abort';
|
|
20
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAIH,OAAO,QAAQ,MAAM,UAAU,CAAA;AAI/B,6FAA6F;AAC7F,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE;;;;EAS1C;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAGpC"}
|
package/dist/cli/cli.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* CanopyCMS CLI entrypoint.
|
|
4
|
+
*
|
|
5
|
+
* Routes commands to their implementations:
|
|
6
|
+
* init, init-deploy, worker, generate-ai-content, sync
|
|
7
|
+
*
|
|
8
|
+
* Command implementations live in separate files (init.ts, sync.ts, etc.)
|
|
9
|
+
* and are dynamically imported to keep startup fast.
|
|
10
|
+
*/
|
|
11
|
+
import { realpathSync } from 'node:fs';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
import minimist from 'minimist';
|
|
14
|
+
import * as p from '@clack/prompts';
|
|
15
|
+
/** Parse raw CLI args into structured flags and positional command. Exported for testing. */
|
|
16
|
+
export function parseArgs(rawArgs) {
|
|
17
|
+
const argv = minimist(rawArgs, {
|
|
18
|
+
boolean: ['force', 'non-interactive', 'push', 'pull', 'abort'],
|
|
19
|
+
string: ['app-dir', 'branch', 'content-root', 'output', 'config'],
|
|
20
|
+
alias: { f: 'force' },
|
|
21
|
+
});
|
|
22
|
+
const flags = argv;
|
|
23
|
+
const command = argv._[0];
|
|
24
|
+
return { argv, flags, command };
|
|
25
|
+
}
|
|
26
|
+
/** Resolve sync direction from --push/--pull/--abort flags. Exported for testing. */
|
|
27
|
+
export function resolveSyncDirection(push, pull, abort) {
|
|
28
|
+
if (abort)
|
|
29
|
+
return 'abort';
|
|
30
|
+
return push && !pull ? 'push' : pull && !push ? 'pull' : 'both';
|
|
31
|
+
}
|
|
32
|
+
// CLI entrypoint
|
|
33
|
+
async function main() {
|
|
34
|
+
const { argv, flags, command } = parseArgs(process.argv.slice(2));
|
|
35
|
+
if (command === 'init') {
|
|
36
|
+
const { init } = await import('./init');
|
|
37
|
+
const nonInteractive = flags['non-interactive'] === true;
|
|
38
|
+
const force = flags['force'] === true;
|
|
39
|
+
const mode = 'dev';
|
|
40
|
+
let appDir;
|
|
41
|
+
if (typeof flags['app-dir'] === 'string') {
|
|
42
|
+
appDir = flags['app-dir'];
|
|
43
|
+
}
|
|
44
|
+
else if (nonInteractive) {
|
|
45
|
+
appDir = 'app';
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const result = await p.text({
|
|
49
|
+
message: 'App directory?',
|
|
50
|
+
placeholder: 'app',
|
|
51
|
+
defaultValue: 'app',
|
|
52
|
+
});
|
|
53
|
+
if (p.isCancel(result)) {
|
|
54
|
+
p.cancel('Init cancelled.');
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
appDir = result;
|
|
58
|
+
}
|
|
59
|
+
let ai;
|
|
60
|
+
if (flags['ai'] === false) {
|
|
61
|
+
ai = false;
|
|
62
|
+
}
|
|
63
|
+
else if (nonInteractive) {
|
|
64
|
+
ai = true;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const result = await p.confirm({
|
|
68
|
+
message: 'Include AI content endpoint?',
|
|
69
|
+
initialValue: true,
|
|
70
|
+
});
|
|
71
|
+
if (p.isCancel(result)) {
|
|
72
|
+
p.cancel('Init cancelled.');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
ai = result;
|
|
76
|
+
}
|
|
77
|
+
await init({
|
|
78
|
+
mode,
|
|
79
|
+
appDir,
|
|
80
|
+
ai,
|
|
81
|
+
projectDir: process.cwd(),
|
|
82
|
+
force,
|
|
83
|
+
nonInteractive,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else if (command === 'init-deploy') {
|
|
87
|
+
const { initDeployAws } = await import('./init');
|
|
88
|
+
const cloud = argv._[1];
|
|
89
|
+
if (cloud !== 'aws') {
|
|
90
|
+
console.error('Usage: canopycms init-deploy aws');
|
|
91
|
+
console.error('Only "aws" is currently supported.');
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
await initDeployAws({
|
|
95
|
+
cloud: 'aws',
|
|
96
|
+
projectDir: process.cwd(),
|
|
97
|
+
force: flags['force'] === true,
|
|
98
|
+
nonInteractive: flags['non-interactive'] === true,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (command === 'worker') {
|
|
102
|
+
const { workerRunOnce } = await import('./init');
|
|
103
|
+
const subcommand = argv._[1];
|
|
104
|
+
if (subcommand !== 'run-once') {
|
|
105
|
+
console.error('Usage: canopycms worker run-once');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
// Resolve auth plugin from the adopter's installed packages.
|
|
109
|
+
// Uses variable-based import() so TypeScript doesn't resolve against canopycms's own deps.
|
|
110
|
+
const authMode = process.env.CANOPY_AUTH_MODE || 'dev';
|
|
111
|
+
let authPlugin;
|
|
112
|
+
try {
|
|
113
|
+
if (authMode === 'clerk') {
|
|
114
|
+
const pkg = 'canopycms-auth-clerk';
|
|
115
|
+
const { createClerkAuthPlugin } = await import(pkg);
|
|
116
|
+
authPlugin = createClerkAuthPlugin({});
|
|
117
|
+
}
|
|
118
|
+
else if (authMode === 'dev') {
|
|
119
|
+
const pkg = 'canopycms-auth-dev';
|
|
120
|
+
const { createDevAuthPlugin } = await import(pkg);
|
|
121
|
+
authPlugin = createDevAuthPlugin();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
console.warn(`Could not load auth plugin for mode "${authMode}" — skipping cache refresh`);
|
|
126
|
+
}
|
|
127
|
+
await workerRunOnce({ projectDir: process.cwd(), authPlugin });
|
|
128
|
+
}
|
|
129
|
+
else if (command === 'generate-ai-content') {
|
|
130
|
+
const { generateAIContentCLI } = await import('./generate-ai-content');
|
|
131
|
+
await generateAIContentCLI({
|
|
132
|
+
projectDir: process.cwd(),
|
|
133
|
+
outputDir: typeof flags['output'] === 'string' ? flags['output'] : undefined,
|
|
134
|
+
configPath: typeof flags['config'] === 'string' ? flags['config'] : undefined,
|
|
135
|
+
appDir: typeof flags['app-dir'] === 'string' ? flags['app-dir'] : undefined,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else if (command === 'sync') {
|
|
139
|
+
const { sync } = await import('./sync');
|
|
140
|
+
const direction = resolveSyncDirection(flags['push'] === true, flags['pull'] === true, flags['abort'] === true);
|
|
141
|
+
await sync({
|
|
142
|
+
projectDir: process.cwd(),
|
|
143
|
+
direction,
|
|
144
|
+
branch: typeof flags['branch'] === 'string' ? flags['branch'] : undefined,
|
|
145
|
+
contentRoot: typeof flags['content-root'] === 'string' ? flags['content-root'] : undefined,
|
|
146
|
+
force: flags['force'] === true,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log('CanopyCMS CLI');
|
|
151
|
+
console.log('');
|
|
152
|
+
console.log('Commands:');
|
|
153
|
+
console.log(' init Add CanopyCMS to a Next.js app');
|
|
154
|
+
console.log(' --app-dir <path> App directory (default: app)');
|
|
155
|
+
console.log(' --no-ai Skip AI content endpoint generation');
|
|
156
|
+
console.log(' --force Overwrite existing files without asking');
|
|
157
|
+
console.log(' --non-interactive Use defaults, no prompts');
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log(' init-deploy aws Generate AWS deployment artifacts');
|
|
160
|
+
console.log(' --force Overwrite existing files without asking');
|
|
161
|
+
console.log(' --non-interactive Use defaults, no prompts');
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(' worker run-once Process tasks, sync git, refresh auth cache');
|
|
164
|
+
console.log(' generate-ai-content Generate static AI-ready content files');
|
|
165
|
+
console.log(' --output <dir> Output directory (default: public/ai)');
|
|
166
|
+
console.log(' --config <path> Path to AI content config file');
|
|
167
|
+
console.log(' --app-dir <path> App directory (default: app)');
|
|
168
|
+
console.log('');
|
|
169
|
+
console.log(' sync Sync content between working tree and CMS');
|
|
170
|
+
console.log(' --push Push working-tree content to a branch workspace');
|
|
171
|
+
console.log(' --pull Pull content from a branch workspace');
|
|
172
|
+
console.log(' --abort Abort a failed merge in a branch workspace');
|
|
173
|
+
console.log(' --branch <name> Target branch workspace');
|
|
174
|
+
console.log(' --content-root <path> Content directory (default: content)');
|
|
175
|
+
console.log(' --force Skip confirmation prompts');
|
|
176
|
+
process.exit(0);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Only run when executed directly as a CLI, not when imported in tests.
|
|
180
|
+
// Use realpathSync to resolve symlinks — npx creates a symlink in node_modules/.bin/
|
|
181
|
+
// that won't match import.meta.url's resolved real path.
|
|
182
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
183
|
+
let isDirectRun = false;
|
|
184
|
+
try {
|
|
185
|
+
isDirectRun = realpathSync(process.argv[1]) === realpathSync(__filename);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// process.argv[1] may be undefined or point to a non-existent file
|
|
189
|
+
}
|
|
190
|
+
if (isDirectRun) {
|
|
191
|
+
main().catch((err) => {
|
|
192
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
193
|
+
process.exit(1);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
|