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.
Files changed (94) hide show
  1. package/README.md +24 -27
  2. package/dist/ai/handler.d.ts +3 -3
  3. package/dist/ai/handler.d.ts.map +1 -1
  4. package/dist/ai/handler.js +6 -9
  5. package/dist/ai/handler.js.map +1 -1
  6. package/dist/ai/resolve-branch.d.ts +1 -2
  7. package/dist/ai/resolve-branch.d.ts.map +1 -1
  8. package/dist/ai/resolve-branch.js +8 -9
  9. package/dist/ai/resolve-branch.js.map +1 -1
  10. package/dist/api/branch.js +2 -2
  11. package/dist/api/branch.js.map +1 -1
  12. package/dist/api/github-sync.js +0 -2
  13. package/dist/api/github-sync.js.map +1 -1
  14. package/dist/api/settings-helpers.d.ts +3 -5
  15. package/dist/api/settings-helpers.d.ts.map +1 -1
  16. package/dist/api/settings-helpers.js +6 -19
  17. package/dist/api/settings-helpers.js.map +1 -1
  18. package/dist/auth/caching-auth-plugin.d.ts +7 -1
  19. package/dist/auth/caching-auth-plugin.d.ts.map +1 -1
  20. package/dist/auth/caching-auth-plugin.js +31 -3
  21. package/dist/auth/caching-auth-plugin.js.map +1 -1
  22. package/dist/auth/plugin.d.ts +1 -1
  23. package/dist/authorization/types.d.ts +1 -1
  24. package/dist/branch-registry.js +1 -1
  25. package/dist/branch-registry.js.map +1 -1
  26. package/dist/branch-schema-cache.d.ts +8 -13
  27. package/dist/branch-schema-cache.d.ts.map +1 -1
  28. package/dist/branch-schema-cache.js +55 -44
  29. package/dist/branch-schema-cache.js.map +1 -1
  30. package/dist/cli/cli.d.ts +20 -0
  31. package/dist/cli/cli.d.ts.map +1 -0
  32. package/dist/cli/cli.js +196 -0
  33. package/dist/cli/cli.js.map +1 -0
  34. package/dist/cli/generate-ai-content.js +1501 -723
  35. package/dist/cli/init.d.ts +2 -3
  36. package/dist/cli/init.d.ts.map +1 -1
  37. package/dist/cli/init.js +258 -2861
  38. package/dist/cli/init.js.map +1 -1
  39. package/dist/cli/sync.d.ts +33 -0
  40. package/dist/cli/sync.d.ts.map +1 -0
  41. package/dist/cli/sync.js +510 -0
  42. package/dist/cli/sync.js.map +1 -0
  43. package/dist/config/schemas/config.d.ts +5 -5
  44. package/dist/config/schemas/config.d.ts.map +1 -1
  45. package/dist/config/schemas/config.js +1 -1
  46. package/dist/config/schemas/config.js.map +1 -1
  47. package/dist/config-test.d.ts.map +1 -1
  48. package/dist/config-test.js +0 -1
  49. package/dist/config-test.js.map +1 -1
  50. package/dist/content-reader.js +1 -1
  51. package/dist/content-reader.js.map +1 -1
  52. package/dist/editor/BranchManager.d.ts.map +1 -1
  53. package/dist/editor/BranchManager.js +1 -3
  54. package/dist/editor/BranchManager.js.map +1 -1
  55. package/dist/git-manager.d.ts +2 -3
  56. package/dist/git-manager.d.ts.map +1 -1
  57. package/dist/git-manager.js +12 -4
  58. package/dist/git-manager.js.map +1 -1
  59. package/dist/operating-mode/client-safe-strategy.d.ts +1 -12
  60. package/dist/operating-mode/client-safe-strategy.d.ts.map +1 -1
  61. package/dist/operating-mode/client-safe-strategy.js +5 -42
  62. package/dist/operating-mode/client-safe-strategy.js.map +1 -1
  63. package/dist/operating-mode/client-unsafe-strategy.d.ts.map +1 -1
  64. package/dist/operating-mode/client-unsafe-strategy.js +10 -68
  65. package/dist/operating-mode/client-unsafe-strategy.js.map +1 -1
  66. package/dist/operating-mode/index.d.ts +3 -3
  67. package/dist/operating-mode/index.d.ts.map +1 -1
  68. package/dist/operating-mode/index.js +2 -2
  69. package/dist/operating-mode/types.d.ts +2 -6
  70. package/dist/operating-mode/types.d.ts.map +1 -1
  71. package/dist/services.d.ts +6 -0
  72. package/dist/services.d.ts.map +1 -1
  73. package/dist/services.js +52 -40
  74. package/dist/services.js.map +1 -1
  75. package/dist/settings-branch-utils.d.ts +2 -2
  76. package/dist/settings-branch-utils.js +3 -3
  77. package/dist/settings-branch-utils.js.map +1 -1
  78. package/dist/settings-workspace.d.ts +1 -2
  79. package/dist/settings-workspace.d.ts.map +1 -1
  80. package/dist/settings-workspace.js +1 -2
  81. package/dist/settings-workspace.js.map +1 -1
  82. package/dist/utils/fs.d.ts +3 -0
  83. package/dist/utils/fs.d.ts.map +1 -0
  84. package/dist/utils/fs.js +15 -0
  85. package/dist/utils/fs.js.map +1 -0
  86. package/dist/utils/git.d.ts +7 -0
  87. package/dist/utils/git.d.ts.map +1 -0
  88. package/dist/utils/git.js +17 -0
  89. package/dist/utils/git.js.map +1 -0
  90. package/dist/worker/task-queue-config.d.ts +2 -4
  91. package/dist/worker/task-queue-config.d.ts.map +1 -1
  92. package/dist/worker/task-queue-config.js +3 -7
  93. package/dist/worker/task-queue-config.js.map +1 -1
  94. package/package.json +4 -2
@@ -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, .canopy-prod-sim)
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
- * - Prod/Prod-sim: File-based cache at {branchRoot}/.canopy-meta/schema-cache.json
19
- * - Dev mode: In-memory singleton (no file I/O)
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
- private readonly mode;
29
- private devModeCache?;
30
- constructor(mode: OperatingMode);
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-prod-sim/content-branches/main)
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,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAOrD;;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;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAMhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,YAAY,CAAC,CAGpB;gBAE4B,IAAI,EAAE,aAAa;IAEhD;;;;;;;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;IA6B1E;;OAEG;YACW,sBAAsB;IAoEpC;;;;OAIG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAOhC"}
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
- * - Prod/Prod-sim: File-based cache at {branchRoot}/.canopy-meta/schema-cache.json
12
- * - Dev mode: In-memory singleton (no file I/O)
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
- this.mode = mode;
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-prod-sim/content-branches/main)
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
- return { schema: cacheData.schema, flatSchema: cacheData.flatSchema };
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":"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"}
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"}
@@ -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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"}