create-cogenta 0.0.2 → 0.1.0

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 (98) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +17 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/blueprints/association.d.ts +73 -0
  6. package/dist/blueprints/association.d.ts.map +1 -0
  7. package/dist/blueprints/association.js +176 -0
  8. package/dist/blueprints/association.js.map +1 -0
  9. package/dist/blueprints/blog.d.ts +211 -0
  10. package/dist/blueprints/blog.d.ts.map +1 -0
  11. package/dist/blueprints/blog.js +297 -0
  12. package/dist/blueprints/blog.js.map +1 -0
  13. package/dist/blueprints/content-pack.d.ts +54 -0
  14. package/dist/blueprints/content-pack.d.ts.map +1 -0
  15. package/dist/blueprints/content-pack.js +40 -0
  16. package/dist/blueprints/content-pack.js.map +1 -0
  17. package/dist/blueprints/content-packs.d.ts +10 -0
  18. package/dist/blueprints/content-packs.d.ts.map +1 -0
  19. package/dist/blueprints/content-packs.js +26 -0
  20. package/dist/blueprints/content-packs.js.map +1 -0
  21. package/dist/blueprints/documentation.d.ts +71 -0
  22. package/dist/blueprints/documentation.d.ts.map +1 -0
  23. package/dist/blueprints/documentation.js +153 -0
  24. package/dist/blueprints/documentation.js.map +1 -0
  25. package/dist/blueprints/magazine.d.ts +79 -0
  26. package/dist/blueprints/magazine.d.ts.map +1 -0
  27. package/dist/blueprints/magazine.js +163 -0
  28. package/dist/blueprints/magazine.js.map +1 -0
  29. package/dist/blueprints/portfolio.d.ts +73 -0
  30. package/dist/blueprints/portfolio.d.ts.map +1 -0
  31. package/dist/blueprints/portfolio.js +171 -0
  32. package/dist/blueprints/portfolio.js.map +1 -0
  33. package/dist/blueprints/registry.d.ts +23 -0
  34. package/dist/blueprints/registry.d.ts.map +1 -0
  35. package/dist/blueprints/registry.js +42 -0
  36. package/dist/blueprints/registry.js.map +1 -0
  37. package/dist/blueprints/restaurant.d.ts +79 -0
  38. package/dist/blueprints/restaurant.d.ts.map +1 -0
  39. package/dist/blueprints/restaurant.js +175 -0
  40. package/dist/blueprints/restaurant.js.map +1 -0
  41. package/dist/blueprints/saas.d.ts +66 -0
  42. package/dist/blueprints/saas.d.ts.map +1 -0
  43. package/dist/blueprints/saas.js +165 -0
  44. package/dist/blueprints/saas.js.map +1 -0
  45. package/dist/blueprints/vitrine.d.ts +100 -0
  46. package/dist/blueprints/vitrine.d.ts.map +1 -0
  47. package/dist/blueprints/vitrine.js +214 -0
  48. package/dist/blueprints/vitrine.js.map +1 -0
  49. package/dist/config-file.d.ts +13 -0
  50. package/dist/config-file.d.ts.map +1 -0
  51. package/dist/config-file.js +93 -0
  52. package/dist/config-file.js.map +1 -0
  53. package/dist/environment.d.ts +27 -0
  54. package/dist/environment.d.ts.map +1 -0
  55. package/dist/environment.js +91 -0
  56. package/dist/environment.js.map +1 -0
  57. package/dist/index.d.ts +37 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +79 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/llm-setup.d.ts +39 -0
  62. package/dist/llm-setup.d.ts.map +1 -0
  63. package/dist/llm-setup.js +47 -0
  64. package/dist/llm-setup.js.map +1 -0
  65. package/dist/playground-reset.d.ts +27 -0
  66. package/dist/playground-reset.d.ts.map +1 -0
  67. package/dist/playground-reset.js +40 -0
  68. package/dist/playground-reset.js.map +1 -0
  69. package/dist/prompts.d.ts +30 -0
  70. package/dist/prompts.d.ts.map +1 -0
  71. package/dist/prompts.js +63 -0
  72. package/dist/prompts.js.map +1 -0
  73. package/dist/recap.d.ts +19 -0
  74. package/dist/recap.d.ts.map +1 -0
  75. package/dist/recap.js +74 -0
  76. package/dist/recap.js.map +1 -0
  77. package/dist/scaffold.d.ts +49 -0
  78. package/dist/scaffold.d.ts.map +1 -0
  79. package/dist/scaffold.js +170 -0
  80. package/dist/scaffold.js.map +1 -0
  81. package/dist/skin-flow.d.ts +35 -0
  82. package/dist/skin-flow.d.ts.map +1 -0
  83. package/dist/skin-flow.js +56 -0
  84. package/dist/skin-flow.js.map +1 -0
  85. package/dist/skin-preview.d.ts +8 -0
  86. package/dist/skin-preview.d.ts.map +1 -0
  87. package/dist/skin-preview.js +130 -0
  88. package/dist/skin-preview.js.map +1 -0
  89. package/dist/types.d.ts +19 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +13 -0
  92. package/dist/types.js.map +1 -0
  93. package/dist/wizard.d.ts +17 -0
  94. package/dist/wizard.d.ts.map +1 -0
  95. package/dist/wizard.js +157 -0
  96. package/dist/wizard.js.map +1 -0
  97. package/package.json +45 -6
  98. package/README.md +0 -0
package/dist/index.js ADDED
@@ -0,0 +1,79 @@
1
+ import { basename, resolve as resolvePath } from 'node:path';
2
+ import { parseArgs } from 'node:util';
3
+ import { createOutput, shouldUseColour } from '@cogenta/cli';
4
+ import { createDefaultsPrompter, createInteractivePrompter } from './prompts.js';
5
+ import { runWizard } from './wizard.js';
6
+ export { BLUEPRINT_CONTENT_PACKS } from './blueprints/content-packs.js';
7
+ export { BLUEPRINTS, DEFAULT_BLUEPRINT_ID, resolveBlueprint } from './blueprints/registry.js';
8
+ export { ConfigFileError, loadConfigFile } from './config-file.js';
9
+ export { checkEnvironment } from './environment.js';
10
+ export { createProviderClient, LLM_PROVIDERS, validateApiKey } from './llm-setup.js';
11
+ export { resetPlaygroundData } from './playground-reset.js';
12
+ export { createDefaultsPrompter, createInteractivePrompter } from './prompts.js';
13
+ export { printRecap } from './recap.js';
14
+ export { scaffoldSite } from './scaffold.js';
15
+ export { chooseSkin } from './skin-flow.js';
16
+ export { renderSkinPreview } from './skin-preview.js';
17
+ export { defaultAnswers } from './types.js';
18
+ export { runWizard } from './wizard.js';
19
+ const USAGE = `create-cogenta — scaffold a new Cogenta site
20
+
21
+ Usage
22
+ npm create cogenta [directory] [options]
23
+
24
+ Options
25
+ --yes Accept every default, no questions asked
26
+ --config <file> Install non-interactively from a JSON config file
27
+ --no-color Never colour the output (NO_COLOR is honoured too)
28
+ `;
29
+ /** Mirrors `@cogenta/cli`'s own `run()`: nothing here calls `process.exit` or writes to a stream directly, so the whole wizard is testable without spawning a process. */
30
+ export async function run(options) {
31
+ const env = options.env ?? process.env;
32
+ const stdout = options.stdout ?? ((text) => void process.stdout.write(text));
33
+ const stderr = options.stderr ?? ((text) => void process.stderr.write(text));
34
+ let parsed;
35
+ try {
36
+ parsed = parseArgs({
37
+ args: [...options.argv],
38
+ allowPositionals: true,
39
+ strict: true,
40
+ options: {
41
+ yes: { type: 'boolean' },
42
+ config: { type: 'string' },
43
+ 'no-color': { type: 'boolean' },
44
+ help: { type: 'boolean', short: 'h' },
45
+ },
46
+ });
47
+ }
48
+ catch (error) {
49
+ stderr(`${error instanceof Error ? error.message : String(error)}\n\n${USAGE}`);
50
+ return 2;
51
+ }
52
+ if (parsed.values.help === true) {
53
+ stdout(USAGE);
54
+ return 0;
55
+ }
56
+ const colour = parsed.values['no-color'] === true ? false : shouldUseColour(env, options.isTty ?? false);
57
+ const out = createOutput(stdout, colour);
58
+ const cwd = options.cwd ?? process.cwd();
59
+ const targetArg = parsed.positionals[0] ?? '.';
60
+ const targetDir = resolvePath(cwd, targetArg);
61
+ const siteName = targetArg === '.' ? basename(cwd) : basename(targetArg);
62
+ // `--config` never prompts at all — building an interactive readline
63
+ // interface for it would needlessly hold stdin open.
64
+ const useYes = parsed.values.yes === true || typeof parsed.values.config === 'string';
65
+ const prompter = useYes
66
+ ? createDefaultsPrompter()
67
+ : createInteractivePrompter({ input: options.stdin ?? process.stdin, output: process.stdout });
68
+ return runWizard({
69
+ targetDir,
70
+ siteName,
71
+ prompter,
72
+ out,
73
+ env,
74
+ ...(typeof parsed.values.config === 'string'
75
+ ? { configPath: resolvePath(cwd, parsed.values.config) }
76
+ : {}),
77
+ });
78
+ }
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type ProviderClient } from '@cogenta/agents';
2
+ export type LlmProviderId = 'none' | 'anthropic' | 'openai' | 'google';
3
+ export interface LlmProviderOption {
4
+ readonly id: LlmProviderId;
5
+ readonly label: string;
6
+ readonly defaultModel?: string;
7
+ }
8
+ /** "aucun pour l'instant" is listed first, not hidden at the bottom — the CMS works without AI (R2), and the wizard's own layout must not suggest otherwise. */
9
+ export declare const LLM_PROVIDERS: readonly LlmProviderOption[];
10
+ export interface ValidateKeyOptions {
11
+ readonly provider: Exclude<LlmProviderId, 'none'>;
12
+ readonly apiKey: string;
13
+ readonly model: string;
14
+ readonly timeoutMs?: number;
15
+ /** Test seam only — lets a test stand in for the network without mocking a shared module. */
16
+ readonly fetchImpl?: typeof fetch;
17
+ }
18
+ export interface ValidateKeyResult {
19
+ readonly valid: boolean;
20
+ /** Present only when `valid` is `false` — why the check failed, so the recap can say more than "no". */
21
+ readonly reason?: string;
22
+ }
23
+ export interface CreateProviderClientOptions {
24
+ readonly provider: Exclude<LlmProviderId, 'none'>;
25
+ readonly apiKey: string;
26
+ readonly model: string;
27
+ /** Test seam only — lets a test stand in for the network without mocking a shared module. */
28
+ readonly fetchImpl?: typeof fetch;
29
+ }
30
+ /** The same adapter construction `validateApiKey` uses, exported so a later real call (skin generation, L9 task 7) does not duplicate it. */
31
+ export declare function createProviderClient(options: CreateProviderClientOptions): ProviderClient;
32
+ /**
33
+ * "Modèle et clé API si un fournisseur est choisi ; validation immédiate de
34
+ * la clé." A one-token round trip is enough to know the key is accepted —
35
+ * this is not the AI skin-generation pipeline (L9 task 7), just a yes/no on
36
+ * whether the provider will work at all.
37
+ */
38
+ export declare function validateApiKey(options: ValidateKeyOptions): Promise<ValidateKeyResult>;
39
+ //# sourceMappingURL=llm-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-setup.d.ts","sourceRoot":"","sources":["../src/llm-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAA;AAExB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,gKAAgK;AAChK,eAAO,MAAM,aAAa,EAAE,SAAS,iBAAiB,EAKrD,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,wGAAwG;IACxG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAClC;AAED,6IAA6I;AAC7I,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CASzF;AAMD;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB5F"}
@@ -0,0 +1,47 @@
1
+ import { createAnthropicClient, createGoogleClient, createOpenAiClient, } from '@cogenta/agents';
2
+ /** "aucun pour l'instant" is listed first, not hidden at the bottom — the CMS works without AI (R2), and the wizard's own layout must not suggest otherwise. */
3
+ export const LLM_PROVIDERS = [
4
+ { id: 'none', label: 'None for now — the CMS works fully without one' },
5
+ { id: 'anthropic', label: 'Anthropic', defaultModel: 'claude-sonnet-5' },
6
+ { id: 'openai', label: 'OpenAI', defaultModel: 'gpt-5' },
7
+ { id: 'google', label: 'Google', defaultModel: 'gemini-2.5-pro' },
8
+ ];
9
+ /** The same adapter construction `validateApiKey` uses, exported so a later real call (skin generation, L9 task 7) does not duplicate it. */
10
+ export function createProviderClient(options) {
11
+ const config = {
12
+ apiKey: options.apiKey,
13
+ model: options.model,
14
+ ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),
15
+ };
16
+ if (options.provider === 'anthropic')
17
+ return createAnthropicClient(config);
18
+ if (options.provider === 'openai')
19
+ return createOpenAiClient(config);
20
+ return createGoogleClient(config);
21
+ }
22
+ function clientFor(options) {
23
+ return createProviderClient(options);
24
+ }
25
+ /**
26
+ * "Modèle et clé API si un fournisseur est choisi ; validation immédiate de
27
+ * la clé." A one-token round trip is enough to know the key is accepted —
28
+ * this is not the AI skin-generation pipeline (L9 task 7), just a yes/no on
29
+ * whether the provider will work at all.
30
+ */
31
+ export async function validateApiKey(options) {
32
+ const client = clientFor(options);
33
+ const timeoutMs = options.timeoutMs ?? 8_000;
34
+ const controller = new AbortController();
35
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
36
+ try {
37
+ await client.chat({ model: options.model, messages: [{ role: 'user', content: 'ping' }], maxTokens: 1 }, { signal: controller.signal });
38
+ return { valid: true };
39
+ }
40
+ catch (error) {
41
+ return { valid: false, reason: error instanceof Error ? error.message : String(error) };
42
+ }
43
+ finally {
44
+ clearTimeout(timer);
45
+ }
46
+ }
47
+ //# sourceMappingURL=llm-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-setup.js","sourceRoot":"","sources":["../src/llm-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAA;AAUxB,gKAAgK;AAChK,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gDAAgD,EAAE;IACvE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE;IACxE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;IACxD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE;CAClE,CAAA;AAyBD,6IAA6I;AAC7I,MAAM,UAAU,oBAAoB,CAAC,OAAoC;IACvE,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;KAC7E,CAAA;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,WAAW;QAAE,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC1E,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACpE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,OAA2B;IAC5C,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAE7D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CACf,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EACrF,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAA;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACzF,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type DatabaseHandle } from '@cogenta/core';
2
+ export interface ResetPlaygroundDataOptions {
3
+ readonly db: DatabaseHandle;
4
+ /** Which real content pack to reset back to — `blog` by default, the one with the richest real demo content. */
5
+ readonly blueprintId?: string;
6
+ readonly defaultLocale?: string;
7
+ /** An existing admin's email, whose id becomes `createdBy` on every reseeded entry. Omit to leave it null. */
8
+ readonly adminEmail?: string;
9
+ }
10
+ /**
11
+ * "Un bac à sable public exécutant du code arbitraire est une cible.
12
+ * Commencer par une démo en lecture seule réinitialisée périodiquement."
13
+ * (L9 tâche 12).
14
+ *
15
+ * Wipes a blueprint's own tables and reseeds its real demo content —
16
+ * `BLUEPRINT_CONTENT_PACKS`, the exact same collections and
17
+ * `seedDemoContent` already built and tested for `create-cogenta`'s
18
+ * installer (L9 tasks 3-4, 8), not a second, parallel set of demo data
19
+ * invented for this one purpose.
20
+ *
21
+ * A real, tested, callable unit — scheduling it periodically (a cron job,
22
+ * a platform's scheduled task) is an operational decision for whoever
23
+ * deploys a read-only playground instance, out of scope here: this
24
+ * function does the actual reset, once, when called.
25
+ */
26
+ export declare function resetPlaygroundData(options: ResetPlaygroundDataOptions): Promise<void>;
27
+ //# sourceMappingURL=playground-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playground-reset.d.ts","sourceRoot":"","sources":["../src/playground-reset.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAIjE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAA;IAC3B,gHAAgH;IAChH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,8GAA8G;IAC9G,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB5F"}
@@ -0,0 +1,40 @@
1
+ import { createUserStore, ensureAuthTables } from '@cogenta/auth';
2
+ import { CogentaError } from '@cogenta/core';
3
+ import { createSchemaTables, dropSchemaTables } from '@cogenta/schema';
4
+ import { BLUEPRINT_CONTENT_PACKS } from './blueprints/content-packs.js';
5
+ /**
6
+ * "Un bac à sable public exécutant du code arbitraire est une cible.
7
+ * Commencer par une démo en lecture seule réinitialisée périodiquement."
8
+ * (L9 tâche 12).
9
+ *
10
+ * Wipes a blueprint's own tables and reseeds its real demo content —
11
+ * `BLUEPRINT_CONTENT_PACKS`, the exact same collections and
12
+ * `seedDemoContent` already built and tested for `create-cogenta`'s
13
+ * installer (L9 tasks 3-4, 8), not a second, parallel set of demo data
14
+ * invented for this one purpose.
15
+ *
16
+ * A real, tested, callable unit — scheduling it periodically (a cron job,
17
+ * a platform's scheduled task) is an operational decision for whoever
18
+ * deploys a read-only playground instance, out of scope here: this
19
+ * function does the actual reset, once, when called.
20
+ */
21
+ export async function resetPlaygroundData(options) {
22
+ const blueprintId = options.blueprintId ?? 'blog';
23
+ const pack = BLUEPRINT_CONTENT_PACKS[blueprintId];
24
+ if (pack === undefined) {
25
+ throw new CogentaError({
26
+ code: 'PLAYGROUND_BLUEPRINT_UNKNOWN',
27
+ message: `No content pack for blueprint "${blueprintId}".`,
28
+ hint: `Pass one of: ${Object.keys(BLUEPRINT_CONTENT_PACKS).join(', ')}.`,
29
+ details: { blueprintId },
30
+ });
31
+ }
32
+ await dropSchemaTables(options.db, pack.collections);
33
+ await createSchemaTables(options.db, pack.collections);
34
+ await ensureAuthTables(options.db);
35
+ const adminId = options.adminEmail === undefined
36
+ ? null
37
+ : ((await createUserStore(options.db).byEmail(options.adminEmail))?.id ?? null);
38
+ await pack.seedDemoContent(options.db, options.defaultLocale ?? 'en', adminId);
39
+ }
40
+ //# sourceMappingURL=playground-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playground-reset.js","sourceRoot":"","sources":["../src/playground-reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAWvE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAmC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAA;IACjD,MAAM,IAAI,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAA;IACjD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,kCAAkC,WAAW,IAAI;YAC1D,IAAI,EAAE,gBAAgB,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACxE,OAAO,EAAE,EAAE,WAAW,EAAE;SACzB,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IACpD,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IAEtD,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,OAAO,GACX,OAAO,CAAC,UAAU,KAAK,SAAS;QAC9B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAA;IAEnF,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,EAAE,OAAO,CAAC,CAAA;AAChF,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface Choice<T> {
2
+ readonly label: string;
3
+ readonly value: T;
4
+ readonly hint?: string;
5
+ }
6
+ /**
7
+ * Text/numbered-choice/confirm — the three primitives the wizard needs.
8
+ * R9: audited against `@clack/prompts`/`prompts`/`enquirer` and built on
9
+ * `node:readline/promises` instead — `prompts` and `enquirer` have had no
10
+ * release in over two years, and `@clack/prompts`, while healthy, pulls
11
+ * four more packages for what three functions here cover in well under a
12
+ * hundred lines. No arrow-key navigation, but "type a number and press
13
+ * Enter" is a completely standard, universally understood CLI pattern —
14
+ * it does not put "moins de 60 secondes" at risk.
15
+ */
16
+ export interface Prompter {
17
+ text(question: string, defaultValue: string): Promise<string>;
18
+ choice<T>(question: string, choices: readonly Choice<T>[], defaultIndex: number): Promise<T>;
19
+ confirm(question: string, defaultValue: boolean): Promise<boolean>;
20
+ close(): void;
21
+ }
22
+ export interface PromptIO {
23
+ readonly input: NodeJS.ReadableStream;
24
+ readonly output: NodeJS.WritableStream;
25
+ }
26
+ /** Talks to a real terminal (or any injected stream pair, for tests that want to script real input). */
27
+ export declare function createInteractivePrompter(io: PromptIO): Prompter;
28
+ /** `--yes`: every question answers its own default, and stdin is never touched — this is what makes "nine Enters" and "zero Enters" the same outcome. */
29
+ export declare function createDefaultsPrompter(): Prompter;
30
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7D,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC5F,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClE,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAA;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAA;CACvC;AAED,wGAAwG;AACxG,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAyChE;AAED,yJAAyJ;AACzJ,wBAAgB,sBAAsB,IAAI,QAAQ,CAqBjD"}
@@ -0,0 +1,63 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ /** Talks to a real terminal (or any injected stream pair, for tests that want to script real input). */
3
+ export function createInteractivePrompter(io) {
4
+ const rl = createInterface({ input: io.input, output: io.output });
5
+ return {
6
+ async text(question, defaultValue) {
7
+ const answer = await rl.question(`${question} (${defaultValue}): `);
8
+ const trimmed = answer.trim();
9
+ return trimmed === '' ? defaultValue : trimmed;
10
+ },
11
+ async choice(question, choices, defaultIndex) {
12
+ const fallback = choices[defaultIndex];
13
+ if (fallback === undefined) {
14
+ throw new RangeError(`defaultIndex ${defaultIndex} is out of range for ${choices.length} choices.`);
15
+ }
16
+ const lines = choices.map((entry, index) => {
17
+ const marker = index === defaultIndex ? '*' : ' ';
18
+ const hint = entry.hint === undefined ? '' : ` — ${entry.hint}`;
19
+ return ` ${marker} ${index + 1}. ${entry.label}${hint}`;
20
+ });
21
+ const answer = await rl.question(`${question}\n${lines.join('\n')}\nChoice (${defaultIndex + 1}): `);
22
+ const trimmed = answer.trim();
23
+ if (trimmed === '')
24
+ return fallback.value;
25
+ const picked = Number.parseInt(trimmed, 10);
26
+ const entry = choices[picked - 1];
27
+ return entry === undefined ? fallback.value : entry.value;
28
+ },
29
+ async confirm(question, defaultValue) {
30
+ const suffix = defaultValue ? 'Y/n' : 'y/N';
31
+ const answer = await rl.question(`${question} (${suffix}): `);
32
+ const trimmed = answer.trim().toLowerCase();
33
+ if (trimmed === '')
34
+ return defaultValue;
35
+ return trimmed === 'y' || trimmed === 'yes';
36
+ },
37
+ close() {
38
+ rl.close();
39
+ },
40
+ };
41
+ }
42
+ /** `--yes`: every question answers its own default, and stdin is never touched — this is what makes "nine Enters" and "zero Enters" the same outcome. */
43
+ export function createDefaultsPrompter() {
44
+ return {
45
+ async text(_question, defaultValue) {
46
+ return defaultValue;
47
+ },
48
+ async choice(_question, choices, defaultIndex) {
49
+ const fallback = choices[defaultIndex];
50
+ if (fallback === undefined) {
51
+ throw new RangeError(`defaultIndex ${defaultIndex} is out of range for ${choices.length} choices.`);
52
+ }
53
+ return fallback.value;
54
+ },
55
+ async confirm(_question, defaultValue) {
56
+ return defaultValue;
57
+ },
58
+ close() {
59
+ // Nothing was opened.
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Output } from '@cogenta/cli';
2
+ import type { ResolvedBlueprint } from './blueprints/registry.js';
3
+ import type { EnvironmentReport } from './environment.js';
4
+ import type { ValidateKeyResult } from './llm-setup.js';
5
+ import type { ScaffoldResult } from './scaffold.js';
6
+ import type { SkinOutcome } from './skin-flow.js';
7
+ import type { WizardAnswers } from './types.js';
8
+ export interface RecapInput {
9
+ readonly answers: WizardAnswers;
10
+ readonly environment: EnvironmentReport;
11
+ readonly resolvedBlueprint: ResolvedBlueprint;
12
+ readonly keyValidation?: ValidateKeyResult;
13
+ readonly scaffold: ScaffoldResult;
14
+ /** Present only when generation was attempted (L9 task 7) — absent means it was never offered (no LLM, no description). */
15
+ readonly skinOutcome?: SkinOutcome;
16
+ }
17
+ /** Step 10: "ce qui est actif, ce qui est dégradé et pourquoi, prochaine étape." Every degraded item names why, never just that it is degraded. */
18
+ export declare function printRecap(input: RecapInput, out: Output): void;
19
+ //# sourceMappingURL=recap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recap.d.ts","sourceRoot":"","sources":["../src/recap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAA;IACvC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAA;IAC1C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,2HAA2H;IAC3H,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CACnC;AAED,mJAAmJ;AACnJ,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAmF/D"}
package/dist/recap.js ADDED
@@ -0,0 +1,74 @@
1
+ import { BLUEPRINT_CONTENT_PACKS } from './blueprints/content-packs.js';
2
+ /** Step 10: "ce qui est actif, ce qui est dégradé et pourquoi, prochaine étape." Every degraded item names why, never just that it is degraded. */
3
+ export function printRecap(input, out) {
4
+ const { answers, environment, resolvedBlueprint, keyValidation, scaffold, skinOutcome } = input;
5
+ out.heading('Your site');
6
+ out.ok(`${answers.siteName} — ${answers.siteUrl}`);
7
+ out.detail(answers.targetDir);
8
+ out.heading('Blueprint');
9
+ if (resolvedBlueprint.fellBackToBlank) {
10
+ out.warn(`"${answers.blueprintId}" is not built yet — used "blank" instead.`);
11
+ }
12
+ else {
13
+ out.ok(resolvedBlueprint.blueprint.label);
14
+ }
15
+ out.heading('Database');
16
+ out.ok(answers.databaseDriver);
17
+ if (answers.databaseDriver === 'sqlite') {
18
+ out.detail('One machine, no vector index — fine for a single site, not for a fleet.');
19
+ }
20
+ out.heading('LLM provider');
21
+ if (answers.llmProvider === 'none') {
22
+ out.warn('None configured. Everything works except the agents.');
23
+ }
24
+ else if (keyValidation === undefined) {
25
+ out.warn(`${answers.llmProvider} configured, but no API key was given to validate.`);
26
+ }
27
+ else if (keyValidation.valid) {
28
+ out.ok(`${answers.llmProvider} (${answers.llmModel ?? 'default model'}) — key validated.`);
29
+ }
30
+ else {
31
+ out.bad(`${answers.llmProvider} key did not validate: ${keyValidation.reason ?? 'unknown error'}. The agents will not run until this is fixed.`);
32
+ }
33
+ const hasContentPack = BLUEPRINT_CONTENT_PACKS[resolvedBlueprint.blueprint.id] !== undefined;
34
+ out.heading('Skin');
35
+ if (!hasContentPack) {
36
+ out.warn('Default skin — this blueprint has no theme.tokens.json step yet. AI skin generation applies only to blueprints with a real content pack today.');
37
+ }
38
+ else if (skinOutcome?.kind === 'generated') {
39
+ out.ok(`AI-generated skin, validated in ${skinOutcome.attempts} attempt${skinOutcome.attempts === 1 ? '' : 's'} — written to theme.tokens.json.`);
40
+ }
41
+ else if (skinOutcome?.kind === 'default') {
42
+ out.warn(`@cogenta/theme-canonical default skin — kept because ${skinOutcome.reason}.`);
43
+ }
44
+ else {
45
+ out.ok('@cogenta/theme-canonical default skin — written to theme.tokens.json.');
46
+ if (answers.llmProvider === 'none' || answers.siteDescription === undefined) {
47
+ out.detail('AI skin generation was not offered: it needs an LLM provider and a site description. Run `cogenta skin generate` later (a future CLI task) to try it.');
48
+ }
49
+ }
50
+ if (hasContentPack) {
51
+ out.heading('Recommended agents');
52
+ out.detail('Not enabled — no site runs a live agent scheduler yet. Recorded in .cogenta/recommended-agents.json for when one exists.');
53
+ }
54
+ out.heading('Admin account');
55
+ if (scaffold.usersExitCode === 0) {
56
+ out.line(scaffold.usersOutput.trim());
57
+ }
58
+ else {
59
+ out.bad('Could not create the admin account.');
60
+ out.detail(scaffold.usersOutput.trim());
61
+ }
62
+ if (environment.checks.some((check) => check.status === 'warn')) {
63
+ out.heading('Degraded');
64
+ for (const check of environment.checks) {
65
+ if (check.status === 'warn')
66
+ out.warn(check.message);
67
+ }
68
+ }
69
+ out.heading('Next step');
70
+ out.line(`cd ${answers.targetDir}`);
71
+ out.line('npx cogenta serve');
72
+ out.detail('Sign in with the admin account above and enrol a passkey from the admin UI — that ceremony needs a browser, so it never runs during install.');
73
+ }
74
+ //# sourceMappingURL=recap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recap.js","sourceRoot":"","sources":["../src/recap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAkBvE,mJAAmJ;AACnJ,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,GAAW;IACvD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAE/F,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAClD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAE7B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,IAAI,iBAAiB,CAAC,eAAe,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,4CAA4C,CAAC,CAAA;IAC/E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACvB,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC9B,IAAI,OAAO,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QACxC,GAAG,CAAC,MAAM,CAAC,yEAAyE,CAAC,CAAA;IACvF,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC3B,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;IAClE,CAAC;SAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,oDAAoD,CAAC,CAAA;IACtF,CAAC;SAAM,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;QAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,QAAQ,IAAI,eAAe,oBAAoB,CAAC,CAAA;IAC5F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CACL,GAAG,OAAO,CAAC,WAAW,0BAA0B,aAAa,CAAC,MAAM,IAAI,eAAe,gDAAgD,CACxI,CAAA;IACH,CAAC;IAED,MAAM,cAAc,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,SAAS,CAAA;IAE5F,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CACN,gJAAgJ,CACjJ,CAAA;IACH,CAAC;SAAM,IAAI,WAAW,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QAC7C,GAAG,CAAC,EAAE,CACJ,mCAAmC,WAAW,CAAC,QAAQ,WAAW,WAAW,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kCAAkC,CAC1I,CAAA;IACH,CAAC;SAAM,IAAI,WAAW,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,wDAAwD,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;IACzF,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,EAAE,CAAC,uEAAuE,CAAC,CAAA;QAC/E,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC5E,GAAG,CAAC,MAAM,CACR,uJAAuJ,CACxJ,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;QACjC,GAAG,CAAC,MAAM,CACR,0HAA0H,CAC3H,CAAA;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC5B,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QAC9C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACvB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACnC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC7B,GAAG,CAAC,MAAM,CACR,8IAA8I,CAC/I,CAAA;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { SkinTokens } from '@cogenta/render';
2
+ export interface ScaffoldAnswers {
3
+ readonly targetDir: string;
4
+ readonly siteName: string;
5
+ readonly siteUrl: string;
6
+ readonly defaultLocale: string;
7
+ readonly databaseDriver: 'sqlite' | 'postgres' | 'mysql';
8
+ readonly databaseUrl?: string;
9
+ readonly llm?: {
10
+ readonly provider: string;
11
+ readonly model: string;
12
+ };
13
+ readonly adminEmail: string;
14
+ /** Defaults to `blank` (`DEFAULT_BLUEPRINT_ID`) — the existing, unchanged behaviour. */
15
+ readonly blueprintId?: string;
16
+ /** Already generated and validated by `chooseSkin` (L9 task 7). Absent: the theme's default `tokens.json` is copied, exactly as before this option existed. */
17
+ readonly skinTokens?: SkinTokens;
18
+ }
19
+ export interface ScaffoldResult {
20
+ readonly configPath: string;
21
+ readonly migrateExitCode: number;
22
+ readonly migrateOutput: string;
23
+ readonly usersExitCode: number;
24
+ readonly usersOutput: string;
25
+ /** The blueprint actually applied — may be `blank` if the requested one fell back. */
26
+ readonly blueprintId: string;
27
+ readonly fellBackToBlank: boolean;
28
+ /** Always written — `[]` for `blank`, a real content pack's collections otherwise. `cogenta serve` requires this file to exist regardless of blueprint. */
29
+ readonly schemaPath: string;
30
+ /** Present only when a blueprint wrote `theme.tokens.json` — says whether the AI-generated skin was used or the theme's default was copied. */
31
+ readonly skinSource?: 'generated' | 'default';
32
+ }
33
+ /**
34
+ * Step 9: "Installation, migrations, contenu de démo." Writes the site's
35
+ * own files, then genuinely runs it up — `runMigrate`/`runUsers` are the
36
+ * exact functions `cogenta migrate up`/`cogenta users create` call, reused
37
+ * rather than re-implemented, so a scaffolded site is provably the same
38
+ * thing those commands would produce by hand afterwards.
39
+ *
40
+ * A blueprint with a real `BlueprintContentPack` (`./blueprints/content-packs.js`)
41
+ * additionally materialises its tables, seeds real demo content, applies a
42
+ * skin and records which agents it recommends. `blank` (and any blueprint
43
+ * without a pack yet) takes none of those branches — but the content schema
44
+ * file itself is written unconditionally either way (an empty array for
45
+ * `blank`), since `cogenta serve` requires one to exist regardless of
46
+ * blueprint.
47
+ */
48
+ export declare function scaffoldSite(answers: ScaffoldAnswers, env?: Record<string, string | undefined>): Promise<ScaffoldResult>;
49
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAKjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,+JAA+J;IAC/J,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,2JAA2J;IAC3J,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,+IAA+I;IAC/I,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAC9C;AAmFD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,eAAe,EACxB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,OAAO,CAAC,cAAc,CAAC,CAqFzB"}