@cogenta/cli 0.4.0 → 0.6.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 (171) hide show
  1. package/CHANGELOG.md +3856 -0
  2. package/dist/admin-assets/assets/index-CxZHGwVA.css +1 -0
  3. package/dist/admin-assets/assets/index-fYXyHpn8.js +1090 -0
  4. package/dist/admin-assets/assets/vips-_dmTUXFO.wasm +0 -0
  5. package/dist/admin-assets/assets/vips-es6-DrQTTS8Q.js +7 -0
  6. package/dist/admin-assets/branding/logo-cogenta-dark.png +0 -0
  7. package/dist/admin-assets/branding/logo-cogenta-icon.png +0 -0
  8. package/dist/admin-assets/branding/logo-cogenta-light.png +0 -0
  9. package/dist/admin-assets/branding/logo-cogenta-small.png +0 -0
  10. package/dist/admin-assets/branding/logo-cogenta-transparent.png +0 -0
  11. package/dist/admin-assets/branding/logo-cogenta.png +0 -0
  12. package/dist/admin-assets/favicon.png +0 -0
  13. package/dist/admin-assets/fonts/jetbrains-mono-var.woff2 +0 -0
  14. package/dist/admin-assets/fonts/space-grotesk-var.woff2 +0 -0
  15. package/dist/admin-assets/index.html +3 -2
  16. package/dist/bin.js +6 -0
  17. package/dist/bin.js.map +1 -1
  18. package/dist/commands/admin-assets.d.ts +1 -0
  19. package/dist/commands/admin-assets.d.ts.map +1 -1
  20. package/dist/commands/admin-assets.js +19 -1
  21. package/dist/commands/admin-assets.js.map +1 -1
  22. package/dist/commands/agent-runtime.d.ts +151 -0
  23. package/dist/commands/agent-runtime.d.ts.map +1 -0
  24. package/dist/commands/agent-runtime.js +519 -0
  25. package/dist/commands/agent-runtime.js.map +1 -0
  26. package/dist/commands/assistant.d.ts +89 -3
  27. package/dist/commands/assistant.d.ts.map +1 -1
  28. package/dist/commands/assistant.js +206 -39
  29. package/dist/commands/assistant.js.map +1 -1
  30. package/dist/commands/audit-integrity-alert.d.ts +23 -0
  31. package/dist/commands/audit-integrity-alert.d.ts.map +1 -0
  32. package/dist/commands/audit-integrity-alert.js +33 -0
  33. package/dist/commands/audit-integrity-alert.js.map +1 -0
  34. package/dist/commands/backup.d.ts +78 -0
  35. package/dist/commands/backup.d.ts.map +1 -0
  36. package/dist/commands/backup.js +238 -0
  37. package/dist/commands/backup.js.map +1 -0
  38. package/dist/commands/channels.d.ts +47 -0
  39. package/dist/commands/channels.d.ts.map +1 -0
  40. package/dist/commands/channels.js +277 -0
  41. package/dist/commands/channels.js.map +1 -0
  42. package/dist/commands/default-logo.d.ts +27 -0
  43. package/dist/commands/default-logo.d.ts.map +1 -0
  44. package/dist/commands/default-logo.js +30 -0
  45. package/dist/commands/default-logo.js.map +1 -0
  46. package/dist/commands/doctor.d.ts +5 -1
  47. package/dist/commands/doctor.d.ts.map +1 -1
  48. package/dist/commands/doctor.js +74 -2
  49. package/dist/commands/doctor.js.map +1 -1
  50. package/dist/commands/export.d.ts +22 -0
  51. package/dist/commands/export.d.ts.map +1 -0
  52. package/dist/commands/export.js +182 -0
  53. package/dist/commands/export.js.map +1 -0
  54. package/dist/commands/forms-page.d.ts +75 -0
  55. package/dist/commands/forms-page.d.ts.map +1 -0
  56. package/dist/commands/forms-page.js +191 -0
  57. package/dist/commands/forms-page.js.map +1 -0
  58. package/dist/commands/import.d.ts.map +1 -1
  59. package/dist/commands/import.js +13 -1
  60. package/dist/commands/import.js.map +1 -1
  61. package/dist/commands/mcp.d.ts +35 -0
  62. package/dist/commands/mcp.d.ts.map +1 -0
  63. package/dist/commands/mcp.js +277 -0
  64. package/dist/commands/mcp.js.map +1 -0
  65. package/dist/commands/roles.d.ts +22 -0
  66. package/dist/commands/roles.d.ts.map +1 -0
  67. package/dist/commands/roles.js +79 -0
  68. package/dist/commands/roles.js.map +1 -0
  69. package/dist/commands/search-page.d.ts +15 -0
  70. package/dist/commands/search-page.d.ts.map +1 -1
  71. package/dist/commands/search-page.js +22 -16
  72. package/dist/commands/search-page.js.map +1 -1
  73. package/dist/commands/seo.d.ts +92 -4
  74. package/dist/commands/seo.d.ts.map +1 -1
  75. package/dist/commands/seo.js +168 -4
  76. package/dist/commands/seo.js.map +1 -1
  77. package/dist/commands/serve.d.ts +439 -7
  78. package/dist/commands/serve.d.ts.map +1 -1
  79. package/dist/commands/serve.js +3498 -181
  80. package/dist/commands/serve.js.map +1 -1
  81. package/dist/commands/site-plan.d.ts +27 -1
  82. package/dist/commands/site-plan.d.ts.map +1 -1
  83. package/dist/commands/site-plan.js +71 -4
  84. package/dist/commands/site-plan.js.map +1 -1
  85. package/dist/commands/term-archive-page.d.ts +94 -0
  86. package/dist/commands/term-archive-page.d.ts.map +1 -0
  87. package/dist/commands/term-archive-page.js +195 -0
  88. package/dist/commands/term-archive-page.js.map +1 -0
  89. package/dist/commands/theme-css.d.ts +22 -7
  90. package/dist/commands/theme-css.d.ts.map +1 -1
  91. package/dist/commands/theme-css.js +33 -8
  92. package/dist/commands/theme-css.js.map +1 -1
  93. package/dist/commands/theme-registry.d.ts +94 -0
  94. package/dist/commands/theme-registry.d.ts.map +1 -0
  95. package/dist/commands/theme-registry.js +130 -0
  96. package/dist/commands/theme-registry.js.map +1 -0
  97. package/dist/commands/theme-render.d.ts +330 -9
  98. package/dist/commands/theme-render.d.ts.map +1 -1
  99. package/dist/commands/theme-render.js +932 -66
  100. package/dist/commands/theme-render.js.map +1 -1
  101. package/dist/commands/theme-wiring.d.ts +107 -0
  102. package/dist/commands/theme-wiring.d.ts.map +1 -0
  103. package/dist/commands/theme-wiring.js +295 -0
  104. package/dist/commands/theme-wiring.js.map +1 -0
  105. package/dist/commands/tools.d.ts +71 -0
  106. package/dist/commands/tools.d.ts.map +1 -0
  107. package/dist/commands/tools.js +330 -0
  108. package/dist/commands/tools.js.map +1 -0
  109. package/dist/commands/update.d.ts +25 -0
  110. package/dist/commands/update.d.ts.map +1 -0
  111. package/dist/commands/update.js +193 -0
  112. package/dist/commands/update.js.map +1 -0
  113. package/dist/index.d.ts +15 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +146 -4
  116. package/dist/index.js.map +1 -1
  117. package/dist/invite-mail.d.ts +39 -0
  118. package/dist/invite-mail.d.ts.map +1 -0
  119. package/dist/invite-mail.js +39 -0
  120. package/dist/invite-mail.js.map +1 -0
  121. package/dist/update/apply.d.ts +54 -0
  122. package/dist/update/apply.d.ts.map +1 -0
  123. package/dist/update/apply.js +77 -0
  124. package/dist/update/apply.js.map +1 -0
  125. package/dist/update/changelog-risk.d.ts +20 -0
  126. package/dist/update/changelog-risk.d.ts.map +1 -0
  127. package/dist/update/changelog-risk.js +55 -0
  128. package/dist/update/changelog-risk.js.map +1 -0
  129. package/dist/update/check.d.ts +60 -0
  130. package/dist/update/check.d.ts.map +1 -0
  131. package/dist/update/check.js +56 -0
  132. package/dist/update/check.js.map +1 -0
  133. package/dist/update/contract-risk.d.ts +55 -0
  134. package/dist/update/contract-risk.d.ts.map +1 -0
  135. package/dist/update/contract-risk.js +75 -0
  136. package/dist/update/contract-risk.js.map +1 -0
  137. package/dist/update/history.d.ts +30 -0
  138. package/dist/update/history.d.ts.map +1 -0
  139. package/dist/update/history.js +38 -0
  140. package/dist/update/history.js.map +1 -0
  141. package/dist/update/index.d.ts +28 -0
  142. package/dist/update/index.d.ts.map +1 -0
  143. package/dist/update/index.js +11 -0
  144. package/dist/update/index.js.map +1 -0
  145. package/dist/update/list-restore-points.d.ts +20 -0
  146. package/dist/update/list-restore-points.d.ts.map +1 -0
  147. package/dist/update/list-restore-points.js +35 -0
  148. package/dist/update/list-restore-points.js.map +1 -0
  149. package/dist/update/npm-registry.d.ts +11 -0
  150. package/dist/update/npm-registry.d.ts.map +1 -0
  151. package/dist/update/npm-registry.js +74 -0
  152. package/dist/update/npm-registry.js.map +1 -0
  153. package/dist/update/restore-point.d.ts +26 -0
  154. package/dist/update/restore-point.d.ts.map +1 -0
  155. package/dist/update/restore-point.js +23 -0
  156. package/dist/update/restore-point.js.map +1 -0
  157. package/dist/update/tar.d.ts +27 -0
  158. package/dist/update/tar.d.ts.map +1 -0
  159. package/dist/update/tar.js +56 -0
  160. package/dist/update/tar.js.map +1 -0
  161. package/dist/update/version-compare.d.ts +17 -0
  162. package/dist/update/version-compare.d.ts.map +1 -0
  163. package/dist/update/version-compare.js +42 -0
  164. package/dist/update/version-compare.js.map +1 -0
  165. package/dist/version.d.ts +13 -0
  166. package/dist/version.d.ts.map +1 -0
  167. package/dist/version.js +18 -0
  168. package/dist/version.js.map +1 -0
  169. package/package.json +33 -16
  170. package/dist/admin-assets/assets/index-C9a7O_Xs.css +0 -1
  171. package/dist/admin-assets/assets/index-DXvMgWvn.js +0 -74
@@ -0,0 +1,191 @@
1
+ import { HONEYPOT_FIELD, isFormFileValue, TIMESTAMP_FIELD } from '@cogenta/forms';
2
+ import { escapeHtmlAttribute, escapeHtmlText } from '@cogenta/seo';
3
+ import { renderPageChrome, } from './theme-render.js';
4
+ function labelFor(field) {
5
+ return field.label + (field.required ? ' *' : '');
6
+ }
7
+ function fieldValueText(state, name) {
8
+ const raw = state.values?.[name];
9
+ if (Array.isArray(raw))
10
+ return raw.join(', ');
11
+ return typeof raw === 'string' ? raw : '';
12
+ }
13
+ function checkedValues(state, name) {
14
+ const raw = state.values?.[name];
15
+ if (Array.isArray(raw))
16
+ return raw.map(String);
17
+ return typeof raw === 'string' && raw !== '' ? [raw] : [];
18
+ }
19
+ function fieldHasError(state, field) {
20
+ return state.errorField === field.name;
21
+ }
22
+ function fieldWrapper(field, hasError, input) {
23
+ const id = `cg-form-field-${field.name}`;
24
+ const errorId = `${id}-error`;
25
+ return `<div class="cg-form__field">
26
+ <label for="${id}">${escapeHtmlText(labelFor(field))}</label>
27
+ ${input}
28
+ ${field.help !== undefined ? `<p class="cg-form__help">${escapeHtmlText(field.help)}</p>` : ''}
29
+ ${hasError ? `<p id="${errorId}" class="cg-form__field-error" role="alert">This field needs your attention.</p>` : ''}
30
+ </div>`;
31
+ }
32
+ function renderField(field, state) {
33
+ const hasError = fieldHasError(state, field);
34
+ const id = `cg-form-field-${field.name}`;
35
+ const errorId = `${id}-error`;
36
+ const describedBy = hasError ? ` aria-describedby="${errorId}"` : '';
37
+ const invalid = ` aria-invalid="${hasError ? 'true' : 'false'}"`;
38
+ const required = field.required ? ' required' : '';
39
+ const name = escapeHtmlAttribute(field.name);
40
+ let input;
41
+ switch (field.kind) {
42
+ case 'text':
43
+ case 'email':
44
+ case 'phone':
45
+ case 'date': {
46
+ const type = field.kind === 'email'
47
+ ? 'email'
48
+ : field.kind === 'phone'
49
+ ? 'tel'
50
+ : field.kind === 'date'
51
+ ? 'date'
52
+ : 'text';
53
+ input = `<input type="${type}" id="${id}" name="${name}"${required}${invalid}${describedBy} value="${escapeHtmlAttribute(fieldValueText(state, field.name))}">`;
54
+ break;
55
+ }
56
+ case 'number': {
57
+ input = `<input type="number" id="${id}" name="${name}"${required}${invalid}${describedBy} value="${escapeHtmlAttribute(fieldValueText(state, field.name))}">`;
58
+ break;
59
+ }
60
+ case 'longText': {
61
+ input = `<textarea id="${id}" name="${name}"${required}${invalid}${describedBy} rows="5">${escapeHtmlText(fieldValueText(state, field.name))}</textarea>`;
62
+ break;
63
+ }
64
+ case 'choiceSingle': {
65
+ const options = (field.choices ?? [])
66
+ .map((choice) => {
67
+ const selected = fieldValueText(state, field.name) === choice ? ' selected' : '';
68
+ return `<option value="${escapeHtmlAttribute(choice)}"${selected}>${escapeHtmlText(choice)}</option>`;
69
+ })
70
+ .join('');
71
+ input = `<select id="${id}" name="${name}"${required}${invalid}${describedBy}><option value="">—</option>${options}</select>`;
72
+ break;
73
+ }
74
+ case 'choiceMulti': {
75
+ const checked = checkedValues(state, field.name);
76
+ input = (field.choices ?? [])
77
+ .map((choice, index) => {
78
+ const choiceId = `${id}-${index}`;
79
+ const isChecked = checked.includes(choice) ? ' checked' : '';
80
+ return `<label class="cg-form__choice"><input type="checkbox" id="${choiceId}" name="${name}" value="${escapeHtmlAttribute(choice)}"${isChecked}> ${escapeHtmlText(choice)}</label>`;
81
+ })
82
+ .join('');
83
+ break;
84
+ }
85
+ case 'file': {
86
+ // Fiche 47 task 3. A file input can never be pre-filled by a server
87
+ // (browsers refuse it, for good reason) — the best this can do on
88
+ // redisplay is say what is already on file, from a value already
89
+ // resolved to a `FormFileValue` (carried forward via `_accumulated`,
90
+ // or accepted earlier in this very flow before another field failed).
91
+ const already = state.values?.[field.name];
92
+ const note = isFormFileValue(already)
93
+ ? `<p class="cg-form__help">Already uploaded: ${escapeHtmlText(already.filename)}. Choose a new file only to replace it.</p>`
94
+ : '';
95
+ return fieldWrapper(field, hasError, `<input type="file" id="${id}" name="${name}"${invalid}${describedBy}>${note}`);
96
+ }
97
+ case 'consent': {
98
+ const isChecked = fieldValueText(state, field.name) === 'true' ? ' checked' : '';
99
+ return `<div class="cg-form__field cg-form__field--consent">
100
+ <label><input type="checkbox" id="${id}" name="${name}" value="true"${required}${invalid}${describedBy}${isChecked}> ${escapeHtmlText(field.consentText ?? field.label)}</label>
101
+ ${hasError ? `<p id="${errorId}" class="cg-form__field-error" role="alert">Consent is required to submit this form.</p>` : ''}
102
+ </div>`;
103
+ }
104
+ default: {
105
+ input = '';
106
+ }
107
+ }
108
+ return fieldWrapper(field, hasError, input);
109
+ }
110
+ function confirmationPage(definition, options, context) {
111
+ return shell(definition.label, `<div class="cg-form__confirmation" role="status"><p>${escapeHtmlText(definition.confirmationMessage)}</p></div>`, options, context);
112
+ }
113
+ /**
114
+ * The real site chrome (`renderPageChrome`, `theme-render.ts`) — the same
115
+ * skip link, header and footer every collection page renders, not a second,
116
+ * thinner `<html>` shell of this file's own (L20 audit, points 8-9).
117
+ */
118
+ async function shell(title, body, options, context) {
119
+ return renderPageChrome({
120
+ site: options.site,
121
+ locale: options.site.defaultLocale,
122
+ styles: options.styles,
123
+ headHtml: `<title>${escapeHtmlText(title)} — ${escapeHtmlText(options.site.name)}</title>`,
124
+ bodyHtml: `<main class="cg-main" id="cg-main">
125
+ <h1 class="cg-page__title">${escapeHtmlText(title)}</h1>
126
+ ${body}
127
+ </main>`,
128
+ ...(options.menus === undefined ? {} : { menus: options.menus }),
129
+ ...(options.branding === undefined ? {} : { branding: options.branding }),
130
+ ...(options.activeTheme === undefined ? {} : { activeTheme: options.activeTheme }),
131
+ ...(options.seo === undefined ? {} : { seo: options.seo }),
132
+ ...(options.identity === undefined ? {} : { identity: options.identity }),
133
+ ...(options.loadMedia === undefined ? {} : { loadMedia: options.loadMedia }),
134
+ }, context);
135
+ }
136
+ function stepFieldsOf(definition, stepIndex) {
137
+ const stepsCount = definition.steps.length;
138
+ if (stepsCount <= 1)
139
+ return { fields: definition.fields, isFinalStep: true };
140
+ const clamped = Math.min(Math.max(stepIndex, 0), stepsCount - 1);
141
+ const step = definition.steps[clamped];
142
+ const names = new Set(step?.fieldNames ?? []);
143
+ return {
144
+ fields: definition.fields.filter((field) => names.has(field.name)),
145
+ isFinalStep: clamped >= stepsCount - 1,
146
+ };
147
+ }
148
+ /**
149
+ * The whole page: the form itself (one step of it, for a multi-step form),
150
+ * or its confirmation view under `?submitted=1` when the form has no
151
+ * `redirectTo` of its own.
152
+ */
153
+ export function renderFormPage(definition, state, options, context) {
154
+ if (state.submitted === true)
155
+ return confirmationPage(definition, options, context);
156
+ const stepIndex = state.step ?? 0;
157
+ const { fields: stepFields, isFinalStep } = stepFieldsOf(definition, stepIndex);
158
+ const isMultiStep = definition.steps.length > 1;
159
+ const errorBanner = state.errorMessage != null
160
+ ? `<p class="cg-form__error" role="alert">${escapeHtmlText(state.errorMessage)}</p>`
161
+ : '';
162
+ const fields = stepFields.map((field) => renderField(field, state)).join('\n');
163
+ const ts = state.ts ?? String(options.now());
164
+ const needsMultipart = stepFields.some((field) => field.kind === 'file');
165
+ const stepHiddenFields = isMultiStep
166
+ ? `<input type="hidden" name="_step" value="${stepIndex}">
167
+ <input type="hidden" name="_accumulated" value="${escapeHtmlAttribute(JSON.stringify(state.accumulated ?? {}))}">`
168
+ : '';
169
+ const captcha = isFinalStep && definition.captcha.enabled
170
+ ? `<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
171
+ <div class="cf-turnstile" data-sitekey="${escapeHtmlAttribute(definition.captcha.siteKey ?? '')}"></div>`
172
+ : '';
173
+ const submitLabel = isFinalStep ? 'Send' : 'Next';
174
+ const body = `${errorBanner}
175
+ <form class="cg-form" method="post" action="/api/forms/${encodeURIComponent(definition.name)}/submit"${needsMultipart ? ' enctype="multipart/form-data"' : ''}>
176
+ ${fields}
177
+ ${stepHiddenFields}
178
+ <div class="cg-form__honeypot" aria-hidden="true" style="position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;overflow:hidden;">
179
+ <label for="cg-form-hp">Leave this field empty</label>
180
+ <input type="text" id="cg-form-hp" name="${HONEYPOT_FIELD}" tabindex="-1" autocomplete="off" value="">
181
+ </div>
182
+ <input type="hidden" name="${TIMESTAMP_FIELD}" value="${escapeHtmlAttribute(ts)}">
183
+ ${captcha}
184
+ <button type="submit">${submitLabel}</button>
185
+ </form>`;
186
+ return shell(definition.label, body, options, context);
187
+ }
188
+ export function renderFormNotFoundPage(options, context) {
189
+ return shell('Not found', '<p>This form does not exist, or is not accepting submissions.</p>', options, context);
190
+ }
191
+ //# sourceMappingURL=forms-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms-page.js","sourceRoot":"","sources":["../../src/commands/forms-page.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,MAAM,EAGZ,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAE1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AA+BD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CvE"}
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,MAAM,EAGZ,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAElD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAA;AAE1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AA+BD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDvE"}
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import process from 'node:process';
3
+ import { createCommentStore, ensureCommentsTables } from '@cogenta/comments';
3
4
  import { createDatabaseRegistry, createLogger, createStorageRegistry, isCogentaError, loadConfig, } from '@cogenta/core';
4
5
  import { formatConversionReport, importWordPress } from '@cogenta/import';
5
6
  const USAGE = `Usage
@@ -57,7 +58,18 @@ export async function runImport(options) {
57
58
  return 1;
58
59
  }
59
60
  try {
60
- const report = await withSite(options, logger, (db, storage) => importWordPress(xml, { db, storage }));
61
+ const report = await withSite(options, logger, async (db, storage) => {
62
+ // Contract F (ADR-0025): the CLI always passes a real comment store —
63
+ // `cogenta import wordpress` is the one caller of `importWordPress`
64
+ // this project ships, and a WordPress export with comments deserves
65
+ // to keep them with real status and threading, not the legacy
66
+ // synthetic collection (`ImportWordPressOptions.comments`'s own
67
+ // comment explains the fallback that exists only for a caller that
68
+ // has not wired this yet).
69
+ await ensureCommentsTables(db);
70
+ const comments = createCommentStore({ db });
71
+ return importWordPress(xml, { db, storage, comments });
72
+ });
61
73
  out.heading('WordPress import');
62
74
  out.line(formatConversionReport(report));
63
75
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type Logger } from '@cogenta/core';
2
+ import type { Output, Writer } from '../output.js';
3
+ export interface McpOptions {
4
+ readonly cwd?: string;
5
+ readonly env?: Record<string, string | undefined>;
6
+ readonly logger?: Logger;
7
+ readonly out: Output;
8
+ readonly stderr: Writer;
9
+ /** Resolves the acting user from the real user store — the process that launched this command IS that user. */
10
+ readonly email?: string;
11
+ /** A synthetic actor for local testing (`--role viewer`), never combined with --email. */
12
+ readonly role?: string;
13
+ /**
14
+ * A machine-to-machine bearer credential minted from the admin's "MCP"
15
+ * screen (or the generic "Clés API" one) — resolved through the exact same
16
+ * `ApiKeyStore` REST's `resolveActor` verifies against
17
+ * (`@cogenta/auth`'s `createApiKeyStore`), never a second store. The
18
+ * actor's roles are the key's `scope`, and its id is `apikey:<key id>`,
19
+ * mirroring `resolveApiKeyActor` in `@cogenta/api` byte for byte — a role
20
+ * this key was not granted is refused by the same `PermissionLayer` REST
21
+ * uses, not by anything specific to MCP. Never combined with --email or
22
+ * --role.
23
+ */
24
+ readonly apiKey?: string;
25
+ /** Injectable for tests — defaults to the real process streams. */
26
+ readonly stdin?: NodeJS.ReadableStream;
27
+ readonly stdout?: NodeJS.WritableStream;
28
+ }
29
+ /**
30
+ * `cogenta mcp` — a real MCP server over stdin/stdout, wired to this site's
31
+ * actual content and tools. `serveMcpOverStdio` never returns on its own; the
32
+ * process exits when its stdin closes (the spawning client disconnected).
33
+ */
34
+ export declare function runMcp(options: McpOptions): Promise<number>;
35
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AA4BA,OAAO,EAOL,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AAWtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+GAA+G;IAC/G,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;CACxC;AAiND;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FjE"}
@@ -0,0 +1,277 @@
1
+ import { dirname } from 'node:path';
2
+ import process from 'node:process';
3
+ import { buildManifest, createContentDeleteTool, createContentPublishTool, createContentReadTool, createContentWriteDraftTool, createMediaReadTool, createMediaWriteTool, createSiteConfigReadTool, createToolRegistry, } from '@cogenta/agents';
4
+ import { createContentService, createPermissionLayer, } from '@cogenta/api';
5
+ import { createApiKeyStore, createUserStore, ensureAuthTables, looksLikeApiKey, } from '@cogenta/auth';
6
+ import { CogentaError, createDatabaseMediaStore, createDatabaseRegistry, createLogger, isCogentaError, loadConfig, } from '@cogenta/core';
7
+ import { createMcpServer, serveMcpOverStdio } from '@cogenta/mcp';
8
+ import { createContentStore, createRolePermissionOverlay, createRolePermissionStore, createSchemaTables, } from '@cogenta/schema';
9
+ import { loadSchemaModule } from './serve.js';
10
+ const USAGE = `Usage
11
+ cogenta mcp [--email <email> | --role <role> | --api-key <key>]
12
+
13
+ Starts an MCP (Model Context Protocol) server on stdin/stdout, exposing this
14
+ site's content and site tools to whatever process spawned this command
15
+ (Claude Desktop, Claude Code, Cursor, or any other MCP client). See
16
+ packages/mcp/README.md for how to connect one.
17
+
18
+ --email resolves the acting user from this site's own user store: every tool
19
+ call runs with that user's real roles, checked by the same permission layer
20
+ REST and GraphQL use (R4). --role hands a synthetic actor with no id and the
21
+ named role(s) (comma-separated) — meant for local testing, never for a real
22
+ deployment. --api-key resolves the acting roles from a key minted in the
23
+ admin's "MCP" or "Clés API" screen, through the exact same key store and
24
+ verification REST uses for that key — a role the key was not granted is
25
+ refused by the same permission layer, exactly as it would be over HTTP.
26
+
27
+ With none of these flags, tool calls run as an anonymous ("public") actor:
28
+ content tools still run through the real permission layer (a public actor
29
+ sees only what a public actor may see), but media, site-config and
30
+ HTTP-fetch tools — which have no permission check of their own to fall back
31
+ on — are left out of the manifest entirely. See BLOCKERS.md, "MCP actor
32
+ scoping", for why.
33
+
34
+ Options
35
+ --email <email> Run as this user (looked up in the user store; must exist)
36
+ --role <role,…> Run as a synthetic actor with these roles, no real user
37
+ --api-key <key> Run as the actor a "cogenta_sk_…" API key was granted
38
+ `;
39
+ /** A fresh, undecorated store per collection: an MCP tool call reads and writes content the same way `cogenta serve`'s REST/GraphQL routes do, through the real permission layer, but does not carry the search/redirect/schedule/vector decorators `assembleSite` wraps around a store — those are cache and derived-index maintenance, not permission-relevant, and wiring the whole of `assembleSite` into a single stdio command is out of this task's scope (see BLOCKERS.md). */
40
+ function storeForFactory(db, collections) {
41
+ const cache = new Map();
42
+ return (collection) => {
43
+ const existing = cache.get(collection.name);
44
+ if (existing !== undefined)
45
+ return existing;
46
+ const created = createContentStore({ db, collection, siblings: collections });
47
+ cache.set(collection.name, created);
48
+ return created;
49
+ };
50
+ }
51
+ /**
52
+ * Adapts `@cogenta/api`'s real `ContentService` to the narrow
53
+ * `ContentServiceLike` the core content tools (`@cogenta/agents`) declare
54
+ * against — a `SerialisedEntry` is a plain, already-JSON-safe object (the
55
+ * exact shape REST hands back as `data`), it merely lacks the string index
56
+ * signature `Record<string, unknown>` promises structurally. Runtime shape
57
+ * is identical; this is a type-level seam only.
58
+ */
59
+ function contentServiceLikeOf(service) {
60
+ return {
61
+ read: (context, collection, id, options) => service.read(context, collection, id, options),
62
+ create: (context, collection, input, options) => service.create(context, collection, input, options),
63
+ update: (context, collection, id, input, options) => service.update(context, collection, id, input, options),
64
+ publish: (context, collection, id, input, options) => service.publish(context, collection, id, input, options),
65
+ remove: (context, collection, id) => service.remove(context, collection, id),
66
+ };
67
+ }
68
+ /**
69
+ * Resolves the actor this MCP server's tool calls will run as.
70
+ *
71
+ * `--email` looks the user up in the real user store — the account must
72
+ * already exist (`cogenta users create`); this command never creates one.
73
+ * `--role` is a synthetic actor for local testing. `--api-key` resolves
74
+ * through the same `ApiKeyStore` (`@cogenta/auth`) REST's `resolveActor`
75
+ * verifies against — one store, two callers, never a second lookup path.
76
+ * None given: the anonymous ("public") actor, same as an unauthenticated
77
+ * REST request.
78
+ */
79
+ async function resolveMcpActor(options, db) {
80
+ const given = [options.email, options.role, options.apiKey].filter((value) => value !== undefined).length;
81
+ if (given > 1) {
82
+ throw new CogentaError({
83
+ code: 'MCP_ACTOR_OPTIONS_CONFLICT',
84
+ message: '--email, --role and --api-key are mutually exclusive.',
85
+ hint: 'Pass exactly one: --email resolves a real user, --role is a synthetic test actor, --api-key resolves a minted key.',
86
+ });
87
+ }
88
+ if (options.apiKey !== undefined) {
89
+ if (!looksLikeApiKey(options.apiKey)) {
90
+ throw new CogentaError({
91
+ code: 'MCP_ACTOR_API_KEY_INVALID',
92
+ message: 'That does not look like a Cogenta API key.',
93
+ hint: 'A real key starts with "cogenta_sk_" — copy it again from the admin\'s "MCP" screen.',
94
+ });
95
+ }
96
+ await ensureAuthTables(db);
97
+ const apiKeys = createApiKeyStore(db);
98
+ const key = await apiKeys.verify(options.apiKey);
99
+ if (key === null) {
100
+ throw new CogentaError({
101
+ code: 'MCP_ACTOR_API_KEY_INVALID',
102
+ message: 'This API key is unknown, revoked, or expired.',
103
+ hint: 'Mint a new one from the admin\'s "MCP" screen, or "Clés API" for a general-purpose key.',
104
+ });
105
+ }
106
+ // Mirrors `resolveApiKeyActor` in `@cogenta/api` (`packages/api/src/rest/auth-router.ts`)
107
+ // exactly: the same id shape and the same "roles = scope" mapping, so a
108
+ // key behaves identically whether it authenticates an HTTP request or
109
+ // this stdio server.
110
+ return { actor: { id: `apikey:${key.id}`, roles: key.scope }, authenticated: true };
111
+ }
112
+ if (options.email !== undefined) {
113
+ await ensureAuthTables(db);
114
+ const users = createUserStore(db);
115
+ const user = await users.byEmail(options.email);
116
+ if (user === null) {
117
+ throw new CogentaError({
118
+ code: 'MCP_ACTOR_USER_NOT_FOUND',
119
+ message: `No user with email "${options.email}".`,
120
+ hint: 'Create the account first with "cogenta users create --email <email> --roles <role,role>".',
121
+ });
122
+ }
123
+ return { actor: { id: user.id, roles: user.roles }, authenticated: true };
124
+ }
125
+ if (options.role !== undefined) {
126
+ const roles = options.role
127
+ .split(',')
128
+ .map((role) => role.trim())
129
+ .filter((role) => role.length > 0);
130
+ if (roles.length === 0) {
131
+ throw new CogentaError({
132
+ code: 'MCP_ACTOR_ROLE_EMPTY',
133
+ message: '--role was given but named no role.',
134
+ hint: 'Pass at least one role name, e.g. --role viewer or --role editor,reviewer.',
135
+ });
136
+ }
137
+ return { actor: { id: null, roles }, authenticated: true };
138
+ }
139
+ return { actor: { id: null, roles: ['public'] }, authenticated: false };
140
+ }
141
+ /**
142
+ * Builds this site's real tool manifest for the resolved actor.
143
+ *
144
+ * Content tools (`content.*`) are always included: their actual permission
145
+ * gate lives inside `ContentService`, which calls the same `PermissionLayer`
146
+ * REST and GraphQL use, on every call, keyed on `ctx.actor` — so an anonymous
147
+ * actor is already refused whatever a `public` role may not read or write,
148
+ * exactly as it would be over HTTP.
149
+ *
150
+ * Media, site-config and HTTP-fetch tools have no such internal check (their
151
+ * own doc comments say so plainly: "this tool's declared permissions is the
152
+ * actual gate, enforced by the manifest" — meaning by *this* function, not by
153
+ * the store). They are therefore included only for an authenticated actor
154
+ * (`--email` or `--role`), never for the anonymous default — R4 requires a
155
+ * runtime check somewhere, and for these three tools the manifest boundary is
156
+ * the only place that check can happen.
157
+ */
158
+ function buildSiteManifest(options) {
159
+ const registered = [
160
+ createContentReadTool(options.contentService),
161
+ createContentWriteDraftTool(options.contentService),
162
+ createContentPublishTool(options.contentService),
163
+ createContentDeleteTool(options.contentService),
164
+ ];
165
+ if (options.authenticated) {
166
+ registered.push(createMediaReadTool(options.mediaStore), createMediaWriteTool(options.mediaStore), createSiteConfigReadTool());
167
+ }
168
+ const registry = createToolRegistry(registered);
169
+ return buildManifest(registry, registered.map((tool) => tool.name), {
170
+ site: options.site,
171
+ actor: options.actor,
172
+ logger: {
173
+ info: (message, fields) => options.logger.info(message, fields),
174
+ warn: (message, fields) => options.logger.warn(message, fields),
175
+ error: (message, fields) => options.logger.error(message, fields),
176
+ },
177
+ });
178
+ }
179
+ /**
180
+ * `cogenta mcp` — a real MCP server over stdin/stdout, wired to this site's
181
+ * actual content and tools. `serveMcpOverStdio` never returns on its own; the
182
+ * process exits when its stdin closes (the spawning client disconnected).
183
+ */
184
+ export async function runMcp(options) {
185
+ const { out, stderr } = options;
186
+ const env = options.env ?? process.env;
187
+ const logger = options.logger ?? createLogger({ level: 'silent' });
188
+ if ([options.email, options.role, options.apiKey].filter((value) => value !== undefined).length > 1) {
189
+ stderr(`--email, --role and --api-key are mutually exclusive.\n\n${USAGE}`);
190
+ return 2;
191
+ }
192
+ let loaded;
193
+ try {
194
+ loaded = await loadConfig({
195
+ ...(options.cwd === undefined ? {} : { cwd: options.cwd }),
196
+ env,
197
+ });
198
+ }
199
+ catch (error) {
200
+ return reportFailure(stderr, error);
201
+ }
202
+ const projectRoot = loaded.path === null ? (options.cwd ?? process.cwd()) : dirname(loaded.path);
203
+ let collections;
204
+ let taxonomies;
205
+ try {
206
+ const loadedSchema = await loadSchemaModule(projectRoot);
207
+ collections = loadedSchema.collections;
208
+ taxonomies = loadedSchema.taxonomies;
209
+ }
210
+ catch (error) {
211
+ return reportFailure(stderr, error);
212
+ }
213
+ const selection = await createDatabaseRegistry({ logger }).select(loaded.config.database);
214
+ const db = selection.instance;
215
+ try {
216
+ await createSchemaTables(db, collections, []);
217
+ const { actor, authenticated } = await resolveMcpActor(options, db);
218
+ // Fiche 63, ADR-0028: `cogenta mcp` builds its own `PermissionLayer`
219
+ // (never `assembleSite`'s), so it must consult the same override table —
220
+ // otherwise a permission an admin just revoked in production would stay
221
+ // granted to any MCP client until the process restarts, exactly the
222
+ // silent-widening R4 exists to prevent.
223
+ const rolePermissionOverlay = await createRolePermissionOverlay(createRolePermissionStore({ db, collections, taxonomies }));
224
+ const permissions = createPermissionLayer({
225
+ collections,
226
+ rolePermissionOverrides: rolePermissionOverlay,
227
+ });
228
+ const storeFor = storeForFactory(db, collections);
229
+ const contentService = createContentService({ collections, permissions, storeFor });
230
+ const mediaStore = createDatabaseMediaStore({ db });
231
+ const tools = buildSiteManifest({
232
+ contentService: contentServiceLikeOf(contentService),
233
+ mediaStore,
234
+ site: {
235
+ name: loaded.config.site.name,
236
+ ...(loaded.config.site.url === undefined ? {} : { url: loaded.config.site.url }),
237
+ locales: loaded.config.site.locales,
238
+ defaultLocale: loaded.config.site.defaultLocale,
239
+ },
240
+ actor,
241
+ authenticated,
242
+ logger,
243
+ });
244
+ out.detail(`MCP server ready — ${tools.length} tool(s), actor: ${actor.id ?? '(anonymous)'} [${actor.roles.join(', ')}]`);
245
+ const server = createMcpServer({ name: 'cogenta', version: '1.0.0', tools });
246
+ serveMcpOverStdio({
247
+ server,
248
+ ...(options.stdin === undefined ? {} : { input: options.stdin }),
249
+ ...(options.stdout === undefined ? {} : { output: options.stdout }),
250
+ });
251
+ // Runs until stdin closes (the MCP client disconnected) — this command
252
+ // has no other exit condition, matching stdio MCP servers generally.
253
+ return await new Promise((resolvePromise) => {
254
+ const input = options.stdin ?? process.stdin;
255
+ input.once('end', () => resolvePromise(0));
256
+ input.once('close', () => resolvePromise(0));
257
+ });
258
+ }
259
+ catch (error) {
260
+ return reportFailure(stderr, error);
261
+ }
262
+ finally {
263
+ await selection.dispose();
264
+ }
265
+ }
266
+ function reportFailure(stderr, error) {
267
+ if (isCogentaError(error)) {
268
+ stderr(`${error.code}: ${error.message}\n`);
269
+ if (error.hint !== undefined)
270
+ stderr(`${error.hint}\n`);
271
+ }
272
+ else {
273
+ stderr(`${error instanceof Error ? (error.stack ?? error.message) : String(error)}\n`);
274
+ }
275
+ return 1;
276
+ }
277
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Logger } from '@cogenta/core';
2
+ import type { Output, Writer } from '../output.js';
3
+ /**
4
+ * `cogenta roles export` — fiche 63, task 3's last requirement: freeze the
5
+ * `cogenta_role_permissions` table's current state into a file a site can
6
+ * commit to git, for a site that wants to be able to return to an entirely
7
+ * versioned source. The file is a snapshot, never a second thing
8
+ * `PermissionLayer` reads — see `role-permission-export.ts`'s own comment.
9
+ */
10
+ export type RolesSubcommand = 'export';
11
+ export interface RolesOptions {
12
+ readonly subcommand: string | undefined;
13
+ readonly cwd?: string;
14
+ readonly env?: Record<string, string | undefined>;
15
+ readonly logger?: Logger;
16
+ readonly out: Output;
17
+ readonly stderr: Writer;
18
+ /** `export` only: where to write the file. Defaults to `cogenta.role-permissions.json` at the project root. */
19
+ readonly file?: string;
20
+ }
21
+ export declare function runRoles(options: RolesOptions): Promise<number>;
22
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../src/commands/roles.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGlD;;;;;;GAMG;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAA;AAEtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+GAA+G;IAC/G,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAmED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAarE"}