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
@@ -0,0 +1,170 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { createUserStore, ensureAuthTables } from '@cogenta/auth';
5
+ import { createOutput, runMigrate, runUsers } from '@cogenta/cli';
6
+ import { createDatabaseRegistry, createLogger } from '@cogenta/core';
7
+ import { createSchemaTables } from '@cogenta/schema';
8
+ import { BLUEPRINT_CONTENT_PACKS } from './blueprints/content-packs.js';
9
+ import { DEFAULT_BLUEPRINT_ID, resolveBlueprint } from './blueprints/registry.js';
10
+ function capture() {
11
+ const chunks = [];
12
+ return { write: (text) => chunks.push(text), text: () => chunks.join('') };
13
+ }
14
+ function databaseUrlFor(answers) {
15
+ if (answers.databaseUrl !== undefined)
16
+ return answers.databaseUrl;
17
+ // SQLite is the zero-config default (R1) — no external service, no Docker,
18
+ // achievable well under sixty seconds.
19
+ return join(answers.targetDir, '.cogenta', 'site.db');
20
+ }
21
+ /**
22
+ * A hand-written `.mjs` — not a round trip through `defineConfig`'s TS
23
+ * shape — for the same reason this project's own CLI tests generate
24
+ * `cogenta.config.mjs` (`packages/cli/test/doctor.test.ts`): a `.ts` config
25
+ * needs Node 22.18+ to strip types at import time, and the installer's own
26
+ * `--yes` promise ("moins de 60 secondes") should not depend on a Node
27
+ * version newer than the one this wizard itself already required.
28
+ */
29
+ function configFileContents(answers) {
30
+ const llmBlock = answers.llm === undefined
31
+ ? ''
32
+ : ` llm: { provider: ${JSON.stringify(answers.llm.provider)}, model: ${JSON.stringify(answers.llm.model)} },\n`;
33
+ return `export default {
34
+ site: {
35
+ name: ${JSON.stringify(answers.siteName)},
36
+ url: ${JSON.stringify(answers.siteUrl)},
37
+ locales: [${JSON.stringify(answers.defaultLocale)}],
38
+ defaultLocale: ${JSON.stringify(answers.defaultLocale)},
39
+ },
40
+ database: {
41
+ driver: ${JSON.stringify(answers.databaseDriver)},
42
+ url: ${JSON.stringify(databaseUrlFor(answers))},
43
+ },
44
+ cache: { path: ${JSON.stringify(join(answers.targetDir, '.cogenta', 'cache'))} },
45
+ storage: { path: ${JSON.stringify(join(answers.targetDir, '.cogenta', 'media'))} },
46
+ ${llmBlock}}
47
+ `;
48
+ }
49
+ function schemaFileContents(collections) {
50
+ // Every `FieldDefinition` a blueprint declares here is plain, serialisable
51
+ // data (contract A) — `defineCollection` validates and returns it as-is,
52
+ // never wrapping it in behaviour — so writing it out as a JSON literal is
53
+ // exactly the array `loadCollections` (`@cogenta/cli`) reads back, not an
54
+ // approximation of it.
55
+ return `export default ${JSON.stringify(collections, null, 2)}\n`;
56
+ }
57
+ function packageJsonContents(answers) {
58
+ const pkg = {
59
+ name: answers.siteName
60
+ .toLowerCase()
61
+ .replace(/[^a-z0-9]+/g, '-')
62
+ .replace(/^-+|-+$/g, '') || 'cogenta-site',
63
+ version: '0.0.0',
64
+ private: true,
65
+ type: 'module',
66
+ dependencies: {
67
+ '@cogenta/core': 'latest',
68
+ '@cogenta/cli': 'latest',
69
+ '@cogenta/theme-canonical': 'latest',
70
+ },
71
+ };
72
+ return `${JSON.stringify(pkg, null, 2)}\n`;
73
+ }
74
+ /**
75
+ * The tokens.json this site's skin starts from — the canonical theme's own
76
+ * default, copied verbatim. L9 task 7's AI skin-generation pipeline is a
77
+ * different, later job; this is "apply an existing skin", nothing more.
78
+ */
79
+ async function canonicalTokensJson() {
80
+ const url = import.meta.resolve('@cogenta/theme-canonical/tokens.json');
81
+ return readFile(fileURLToPath(url), 'utf8');
82
+ }
83
+ /**
84
+ * Step 9: "Installation, migrations, contenu de démo." Writes the site's
85
+ * own files, then genuinely runs it up — `runMigrate`/`runUsers` are the
86
+ * exact functions `cogenta migrate up`/`cogenta users create` call, reused
87
+ * rather than re-implemented, so a scaffolded site is provably the same
88
+ * thing those commands would produce by hand afterwards.
89
+ *
90
+ * A blueprint with a real `BlueprintContentPack` (`./blueprints/content-packs.js`)
91
+ * additionally materialises its tables, seeds real demo content, applies a
92
+ * skin and records which agents it recommends. `blank` (and any blueprint
93
+ * without a pack yet) takes none of those branches — but the content schema
94
+ * file itself is written unconditionally either way (an empty array for
95
+ * `blank`), since `cogenta serve` requires one to exist regardless of
96
+ * blueprint.
97
+ */
98
+ export async function scaffoldSite(answers, env = process.env) {
99
+ const { blueprint, fellBackToBlank } = resolveBlueprint(answers.blueprintId ?? DEFAULT_BLUEPRINT_ID);
100
+ await mkdir(answers.targetDir, { recursive: true });
101
+ await mkdir(join(answers.targetDir, '.cogenta'), { recursive: true });
102
+ const configPath = join(answers.targetDir, 'cogenta.config.mjs');
103
+ await writeFile(configPath, configFileContents(answers), 'utf8');
104
+ await writeFile(join(answers.targetDir, 'package.json'), packageJsonContents(answers), 'utf8');
105
+ const pack = BLUEPRINT_CONTENT_PACKS[blueprint.id];
106
+ // `cogenta serve` (`@cogenta/cli`) hard-requires a `cogenta.schema.*` file
107
+ // to exist next to the config — including for `blank`, whose whole point
108
+ // is an empty collections array, not a missing file. Writing it
109
+ // unconditionally is what makes "npm create cogenta" with every default
110
+ // answer produce a site `cogenta serve` can actually start.
111
+ const schemaPath = join(answers.targetDir, 'cogenta.schema.mjs');
112
+ await writeFile(schemaPath, schemaFileContents(pack?.collections ?? []), 'utf8');
113
+ let skinSource;
114
+ if (pack !== undefined) {
115
+ skinSource = answers.skinTokens === undefined ? 'default' : 'generated';
116
+ const tokensJson = answers.skinTokens === undefined
117
+ ? await canonicalTokensJson()
118
+ : `${JSON.stringify(answers.skinTokens, null, 2)}\n`;
119
+ await writeFile(join(answers.targetDir, 'theme.tokens.json'), tokensJson, 'utf8');
120
+ await writeFile(join(answers.targetDir, '.cogenta', 'recommended-agents.json'), `${JSON.stringify(pack.recommendedAgents, null, 2)}\n`, 'utf8');
121
+ }
122
+ const migrateCapture = capture();
123
+ const migrateStderr = capture();
124
+ const migrateExitCode = await runMigrate({
125
+ subcommand: 'up',
126
+ cwd: answers.targetDir,
127
+ env,
128
+ out: createOutput(migrateCapture.write, false),
129
+ stderr: migrateStderr.write,
130
+ });
131
+ const usersCapture = capture();
132
+ const usersStderr = capture();
133
+ const usersExitCode = await runUsers({
134
+ subcommand: 'create',
135
+ cwd: answers.targetDir,
136
+ env,
137
+ email: answers.adminEmail,
138
+ admin: true,
139
+ out: createOutput(usersCapture.write, false),
140
+ stderr: usersStderr.write,
141
+ });
142
+ if (pack !== undefined && migrateExitCode === 0 && usersExitCode === 0) {
143
+ const logger = createLogger({ level: 'silent' });
144
+ const selection = await createDatabaseRegistry({ logger }).select({
145
+ driver: answers.databaseDriver,
146
+ url: databaseUrlFor(answers),
147
+ });
148
+ try {
149
+ await createSchemaTables(selection.instance, pack.collections);
150
+ await ensureAuthTables(selection.instance);
151
+ const admin = await createUserStore(selection.instance).byEmail(answers.adminEmail);
152
+ await pack.seedDemoContent(selection.instance, answers.defaultLocale, admin?.id ?? null);
153
+ }
154
+ finally {
155
+ await selection.dispose();
156
+ }
157
+ }
158
+ return {
159
+ configPath,
160
+ migrateExitCode,
161
+ migrateOutput: migrateCapture.text() + migrateStderr.text(),
162
+ usersExitCode,
163
+ usersOutput: usersCapture.text() + usersStderr.text(),
164
+ blueprintId: blueprint.id,
165
+ fellBackToBlank,
166
+ schemaPath,
167
+ ...(skinSource === undefined ? {} : { skinSource }),
168
+ };
169
+ }
170
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEpE,OAAO,EAA6B,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAgCjF,SAAS,OAAO;IACd,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AAC5E,CAAC;AAED,SAAS,cAAc,CAAC,OAAwB;IAC9C,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,WAAW,CAAA;IACjE,2EAA2E;IAC3E,uCAAuC;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,OAAwB;IAClD,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,KAAK,SAAS;QACvB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAA;IAEpH,OAAO;;YAEG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;WACjC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;qBAChC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;;;cAG5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC;WACzC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;;mBAE/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;qBAC1D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;EAC/E,QAAQ;CACT,CAAA;AACD,CAAC;AAED,SAAS,kBAAkB,CAAC,WAA4C;IACtE,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,uBAAuB;IACvB,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AACnE,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAwB;IACnD,MAAM,GAAG,GAAG;QACV,IAAI,EACF,OAAO,CAAC,QAAQ;aACb,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,cAAc;QAC9C,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE;YACZ,eAAe,EAAE,QAAQ;YACzB,cAAc,EAAE,QAAQ;YACxB,0BAA0B,EAAE,QAAQ;SACrC;KACF,CAAA;IACD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,mBAAmB;IAChC,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAA;IACvE,OAAO,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAwB,EACxB,GAAG,GAAuC,OAAO,CAAC,GAAG;IAErD,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,gBAAgB,CACrD,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAC5C,CAAA;IAED,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;IAChE,MAAM,SAAS,CAAC,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IAChE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IAE9F,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAClD,2EAA2E;IAC3E,yEAAyE;IACzE,gEAAgE;IAChE,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;IAChE,MAAM,SAAS,CAAC,UAAU,EAAE,kBAAkB,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IAChF,IAAI,UAA+C,CAAA;IAEnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAA;QACvE,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,KAAK,SAAS;YAC9B,CAAC,CAAC,MAAM,mBAAmB,EAAE;YAC7B,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;QACxD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;QACjF,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,yBAAyB,CAAC,EAC9D,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACtD,MAAM,CACP,CAAA;IACH,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,EAAE,CAAA;IAChC,MAAM,aAAa,GAAG,OAAO,EAAE,CAAA;IAC/B,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC;QACvC,UAAU,EAAE,IAAI;QAChB,GAAG,EAAE,OAAO,CAAC,SAAS;QACtB,GAAG;QACH,GAAG,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;QAC9C,MAAM,EAAE,aAAa,CAAC,KAAK;KAC5B,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,OAAO,EAAE,CAAA;IAC9B,MAAM,WAAW,GAAG,OAAO,EAAE,CAAA;IAC7B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC;QACnC,UAAU,EAAE,QAAQ;QACpB,GAAG,EAAE,OAAO,CAAC,SAAS;QACtB,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,UAAU;QACzB,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;QAC5C,MAAM,EAAE,WAAW,CAAC,KAAK;KAC1B,CAAC,CAAA;IAEF,IAAI,IAAI,KAAK,SAAS,IAAI,eAAe,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAChD,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YAChE,MAAM,EAAE,OAAO,CAAC,cAAc;YAC9B,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YAC9D,MAAM,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YAC1C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACnF,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,CAAA;QAC1F,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,eAAe;QACf,aAAa,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE;QAC3D,aAAa;QACb,WAAW,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE;QACrD,WAAW,EAAE,SAAS,CAAC,EAAE;QACzB,eAAe;QACf,UAAU;QACV,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;KACpD,CAAA;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type ProviderClient } from '@cogenta/agents';
2
+ import type { Output } from '@cogenta/cli';
3
+ import type { SkinTokens } from '@cogenta/render';
4
+ import type { Prompter } from './prompts.js';
5
+ export interface ChooseSkinOptions {
6
+ readonly prompter: Prompter;
7
+ readonly out: Output;
8
+ readonly client: ProviderClient;
9
+ readonly model: string;
10
+ readonly description: string;
11
+ readonly blueprintLabel: string;
12
+ readonly siteName: string;
13
+ readonly targetDir: string;
14
+ /** Caps how many manual "regenerate" rounds the user can ask for, on top of each round's own three automatic correction attempts. */
15
+ readonly maxRegenerations?: number;
16
+ }
17
+ export type SkinOutcome = {
18
+ readonly kind: 'generated';
19
+ readonly tokens: SkinTokens;
20
+ readonly attempts: number;
21
+ } | {
22
+ readonly kind: 'default';
23
+ readonly reason: string;
24
+ };
25
+ /**
26
+ * Step 5 of L9 task 7's pipeline: "Aperçu proposé sur trois pages types, avec
27
+ * possibilité de régénérer ou d'ajuster." Each round runs `generateSkin`'s own
28
+ * three-attempt auto-correction loop; on success, three real preview pages are
29
+ * written to disk (`.cogenta/skin-preview/`) and the human is offered accept,
30
+ * regenerate, or fall back to the default — bounded so a non-interactive
31
+ * `--yes`/`--config` run (whose `Prompter.choice` always returns its default,
32
+ * "accept") never loops.
33
+ */
34
+ export declare function chooseSkin(options: ChooseSkinOptions): Promise<SkinOutcome>;
35
+ //# sourceMappingURL=skin-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin-flow.d.ts","sourceRoot":"","sources":["../src/skin-flow.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAG5C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,qIAAqI;IACrI,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAkBzD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA+CjF"}
@@ -0,0 +1,56 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { generateSkin } from '@cogenta/agents';
4
+ import { renderSkinPreview } from './skin-preview.js';
5
+ const DEFAULT_MAX_REGENERATIONS = 3;
6
+ async function writePreview(tokens, siteName, targetDir) {
7
+ const previewDir = join(targetDir, '.cogenta', 'skin-preview');
8
+ await mkdir(previewDir, { recursive: true });
9
+ const pages = renderSkinPreview(tokens, siteName);
10
+ await Promise.all(pages.map((page) => writeFile(join(previewDir, page.filename), page.html, 'utf8')));
11
+ return previewDir;
12
+ }
13
+ /**
14
+ * Step 5 of L9 task 7's pipeline: "Aperçu proposé sur trois pages types, avec
15
+ * possibilité de régénérer ou d'ajuster." Each round runs `generateSkin`'s own
16
+ * three-attempt auto-correction loop; on success, three real preview pages are
17
+ * written to disk (`.cogenta/skin-preview/`) and the human is offered accept,
18
+ * regenerate, or fall back to the default — bounded so a non-interactive
19
+ * `--yes`/`--config` run (whose `Prompter.choice` always returns its default,
20
+ * "accept") never loops.
21
+ */
22
+ export async function chooseSkin(options) {
23
+ const maxRegenerations = options.maxRegenerations ?? DEFAULT_MAX_REGENERATIONS;
24
+ let lastReason = 'no attempt was made';
25
+ for (let round = 1; round <= maxRegenerations; round++) {
26
+ options.out.detail(`Generating a skin from your description (round ${round}/${maxRegenerations})…`);
27
+ const result = await generateSkin({
28
+ client: options.client,
29
+ model: options.model,
30
+ description: options.description,
31
+ blueprintLabel: options.blueprintLabel,
32
+ });
33
+ if (!result.ok) {
34
+ lastReason = `${result.attempts} attempt${result.attempts === 1 ? '' : 's'} all failed validation: ${result.reason}`;
35
+ options.out.warn(lastReason);
36
+ break;
37
+ }
38
+ const previewDir = await writePreview(result.tokens, options.siteName, options.targetDir);
39
+ options.out.ok(`Skin generated and validated in ${result.attempts} attempt${result.attempts === 1 ? '' : 's'}. Preview: ${previewDir}`);
40
+ const choice = await options.prompter.choice('Use this generated skin?', [
41
+ { label: 'Accept it', value: 'accept' },
42
+ { label: 'Regenerate (try again)', value: 'regenerate' },
43
+ { label: 'Use the default skin instead', value: 'default' },
44
+ ], 0);
45
+ if (choice === 'accept') {
46
+ return { kind: 'generated', tokens: result.tokens, attempts: result.attempts };
47
+ }
48
+ if (choice === 'default') {
49
+ return { kind: 'default', reason: 'the default skin was chosen over the generated one' };
50
+ }
51
+ // 'regenerate' — loop again.
52
+ lastReason = `${maxRegenerations} regeneration round${maxRegenerations === 1 ? '' : 's'} were used without accepting a result`;
53
+ }
54
+ return { kind: 'default', reason: lastReason };
55
+ }
56
+ //# sourceMappingURL=skin-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin-flow.js","sourceRoot":"","sources":["../src/skin-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SkinTokens } from '@cogenta/render';
2
+ export interface SkinPreviewPage {
3
+ readonly filename: string;
4
+ readonly title: string;
5
+ readonly html: string;
6
+ }
7
+ export declare function renderSkinPreview(tokens: SkinTokens, siteName: string): readonly SkinPreviewPage[];
8
+ //# sourceMappingURL=skin-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin-preview.d.ts","sourceRoot":"","sources":["../src/skin-preview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAmIjD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,SAAS,eAAe,EAAE,CAyB5B"}
@@ -0,0 +1,130 @@
1
+ import { CogentaError } from '@cogenta/core';
2
+ import { renderSkinCss } from '@cogenta/render';
3
+ import { renderPage, serialize, } from '@cogenta/theme-canonical';
4
+ /**
5
+ * "Aperçu proposé sur trois pages types." Three fixed page compositions —
6
+ * not a general "N template pages" system, nothing else in this codebase
7
+ * needs one — rendered through the real, generic `renderPage`/`renderBlock`
8
+ * (`@cogenta/theme-canonical`) against the candidate skin's real CSS
9
+ * (`renderSkinCss`, `@cogenta/render`): the same pipeline a live site uses,
10
+ * not a bespoke preview renderer.
11
+ */
12
+ const VERSION = '1.0.0';
13
+ const PREVIEW_STRINGS = {
14
+ 'collection.empty': 'No entries yet.',
15
+ };
16
+ /** No preview block uses a media field, so `image` is never called for real. */
17
+ function previewContext(siteName) {
18
+ const site = {
19
+ name: siteName,
20
+ url: 'http://localhost:4000',
21
+ locales: ['en'],
22
+ defaultLocale: 'en',
23
+ };
24
+ return {
25
+ site,
26
+ locale: 'en',
27
+ url: new URL(site.url),
28
+ t: (key) => PREVIEW_STRINGS[key] ?? key,
29
+ image: () => {
30
+ throw new CogentaError({
31
+ code: 'INTERNAL',
32
+ message: 'Skin preview pages carry no media fields; `image` should never be called.',
33
+ hint: 'This is a bug in the preview pages, not something a skin generation attempt can cause.',
34
+ });
35
+ },
36
+ link: (target) => typeof target === 'string'
37
+ ? target
38
+ : 'path' in target
39
+ ? target.path
40
+ : `/${target.collection}/${target.id}`,
41
+ content: {
42
+ entry: async () => null,
43
+ byPath: async () => null,
44
+ list: async (_request) => ({ items: [], nextCursor: null }),
45
+ },
46
+ };
47
+ }
48
+ function paragraph(key, text) {
49
+ return {
50
+ _key: key,
51
+ _type: 'block',
52
+ style: 'normal',
53
+ children: [{ _key: `${key}-span`, _type: 'span', text, marks: [] }],
54
+ markDefs: [],
55
+ };
56
+ }
57
+ function proseBlock(key, text) {
58
+ return { _key: key, _type: 'prose', _version: VERSION, body: [paragraph(`${key}-p`, text)] };
59
+ }
60
+ const PREVIEW_PAGES = [
61
+ {
62
+ title: 'Landing',
63
+ blocks: [
64
+ {
65
+ _key: 'preview-landing-hero',
66
+ _type: 'hero',
67
+ _version: VERSION,
68
+ eyebrow: 'Preview',
69
+ title: 'A site that runs itself',
70
+ subtitle: 'This page previews the generated skin against a hero and a paragraph of body text.',
71
+ },
72
+ proseBlock('preview-landing-prose', 'Body copy renders in the same colours and type scale a visitor would see, so contrast and hierarchy can be checked before the skin is applied for real.'),
73
+ ],
74
+ },
75
+ {
76
+ title: 'Article',
77
+ blocks: [
78
+ proseBlock('preview-article-prose', 'An article page: a paragraph of prose followed by a pull quote, the combination most content pages actually use.'),
79
+ {
80
+ _key: 'preview-article-quote',
81
+ _type: 'quote',
82
+ _version: VERSION,
83
+ text: 'The constraint is what makes the quality: the model configures a theme, it never writes one.',
84
+ author: 'Cogenta',
85
+ },
86
+ ],
87
+ },
88
+ {
89
+ title: 'Listing',
90
+ blocks: [
91
+ proseBlock('preview-listing-prose', 'A listing page, showing how the skin looks with no accent colour on the page besides links and structure.'),
92
+ {
93
+ _key: 'preview-listing-collection',
94
+ _type: 'collectionList',
95
+ _version: VERSION,
96
+ title: 'Recent entries',
97
+ collection: 'post',
98
+ limit: 10,
99
+ layout: 'list',
100
+ },
101
+ ],
102
+ },
103
+ ];
104
+ export function renderSkinPreview(tokens, siteName) {
105
+ const ctx = previewContext(siteName);
106
+ const css = renderSkinCss(tokens);
107
+ return PREVIEW_PAGES.map((page, index) => {
108
+ const body = serialize(renderPage(page, ctx));
109
+ const html = [
110
+ '<!doctype html>',
111
+ '<html lang="en">',
112
+ '<head>',
113
+ '<meta charset="utf-8">',
114
+ `<title>${page.title} — skin preview</title>`,
115
+ `<style>${css}</style>`,
116
+ '</head>',
117
+ '<body>',
118
+ body,
119
+ '</body>',
120
+ '</html>',
121
+ '',
122
+ ].join('\n');
123
+ return {
124
+ filename: `preview-${index + 1}-${page.title.toLowerCase()}.html`,
125
+ title: page.title,
126
+ html,
127
+ };
128
+ });
129
+ }
130
+ //# sourceMappingURL=skin-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin-preview.js","sourceRoot":"","sources":["../src/skin-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { LlmProviderId } from './llm-setup.js';
2
+ /** What every wizard step (interactive, `--yes`, or `--config file`) converges on before scaffolding. */
3
+ export interface WizardAnswers {
4
+ readonly targetDir: string;
5
+ readonly siteName: string;
6
+ readonly siteUrl: string;
7
+ readonly defaultLocale: string;
8
+ readonly blueprintId: string;
9
+ readonly databaseDriver: 'sqlite' | 'postgres' | 'mysql';
10
+ readonly databaseUrl?: string;
11
+ readonly llmProvider: LlmProviderId;
12
+ readonly llmModel?: string;
13
+ readonly llmApiKey?: string;
14
+ /** Free text (sector, mood, audience, brand colours) driving AI skin generation (L9 task 7). Empty or absent: generation is skipped, the default skin is used. */
15
+ readonly siteDescription?: string;
16
+ readonly adminEmail: string;
17
+ }
18
+ export declare function defaultAnswers(targetDir: string, siteName: string): WizardAnswers;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC5B,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,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAA;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,kKAAkK;IAClK,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAWjF"}
package/dist/types.js ADDED
@@ -0,0 +1,13 @@
1
+ export function defaultAnswers(targetDir, siteName) {
2
+ return {
3
+ targetDir,
4
+ siteName,
5
+ siteUrl: 'http://localhost:4000',
6
+ defaultLocale: 'en',
7
+ blueprintId: 'blank',
8
+ databaseDriver: 'sqlite',
9
+ llmProvider: 'none',
10
+ adminEmail: 'admin@example.com',
11
+ };
12
+ }
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,QAAgB;IAChE,OAAO;QACL,SAAS;QACT,QAAQ;QACR,OAAO,EAAE,uBAAuB;QAChC,aAAa,EAAE,IAAI;QACnB,WAAW,EAAE,OAAO;QACpB,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,mBAAmB;KAChC,CAAA;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Output } from '@cogenta/cli';
2
+ import type { Prompter } from './prompts.js';
3
+ export interface RunWizardOptions {
4
+ readonly targetDir: string;
5
+ readonly siteName: string;
6
+ readonly prompter: Prompter;
7
+ readonly out: Output;
8
+ readonly configPath?: string;
9
+ readonly env?: Record<string, string | undefined>;
10
+ }
11
+ /**
12
+ * The whole ten-step wizard, orchestrated. Returns a process exit code: `0`
13
+ * a working site, `1` the environment or the install failed, `2` a `--config`
14
+ * file was invalid.
15
+ */
16
+ export declare function runWizard(options: RunWizardOptions): Promise<number>;
17
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAW1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAM5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CAClD;AAsED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkH1E"}