create-carlonicora-app 1.5.0 → 1.7.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.
@@ -7,4 +7,8 @@ export declare function generateMarkdownReport(report: ComparisonReport): string
7
7
  * Generate JSON report
8
8
  */
9
9
  export declare function generateJsonReport(report: ComparisonReport): string;
10
+ /**
11
+ * Generate checklist report with checkboxes for selective review
12
+ */
13
+ export declare function generateChecklistReport(report: ComparisonReport): string;
10
14
  //# sourceMappingURL=report-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/compare/report-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAC;AAkC3E;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAuHvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAEnE"}
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/compare/report-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAA0B,MAAM,YAAY,CAAC;AAkC3E;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAuHvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAyHxE"}
@@ -128,4 +128,116 @@ export function generateMarkdownReport(report) {
128
128
  export function generateJsonReport(report) {
129
129
  return JSON.stringify(report, null, 2);
130
130
  }
131
+ /**
132
+ * Generate checklist report with checkboxes for selective review
133
+ */
134
+ export function generateChecklistReport(report) {
135
+ const lines = [];
136
+ const grouped = groupByCategory(report.diffs);
137
+ // Header
138
+ lines.push('# Template Comparison Checklist');
139
+ lines.push('');
140
+ lines.push(`**Generated:** ${report.generatedAt}`);
141
+ lines.push(`**Template:** ${report.templatePath}`);
142
+ lines.push(`**Target:** ${report.targetPath}`);
143
+ lines.push(`**Project Name:** ${report.projectName}`);
144
+ lines.push('');
145
+ lines.push('---');
146
+ lines.push('');
147
+ // Instructions
148
+ lines.push('## Instructions');
149
+ lines.push('');
150
+ lines.push('Mark the files you want to analyze with `[x]`:');
151
+ lines.push('- `[ ]` = Skip this file');
152
+ lines.push('- `[x]` = Analyze this file');
153
+ lines.push('');
154
+ lines.push('When done, return to Claude and confirm you\'re ready to continue.');
155
+ lines.push('');
156
+ lines.push('---');
157
+ lines.push('');
158
+ // Config Drift Section
159
+ const configDrifts = grouped.get('config-drift') || [];
160
+ lines.push(`## Config Drift (${configDrifts.length} files)`);
161
+ lines.push('');
162
+ lines.push('Configuration files modified from template baseline.');
163
+ lines.push('');
164
+ if (configDrifts.length > 0) {
165
+ for (const diff of configDrifts.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
166
+ lines.push(`- [ ] \`${diff.relativePath}\``);
167
+ }
168
+ }
169
+ else {
170
+ lines.push('(none)');
171
+ }
172
+ lines.push('');
173
+ lines.push('---');
174
+ lines.push('');
175
+ // Version Drift Section
176
+ const versionDrifts = grouped.get('version-drift') || [];
177
+ lines.push(`## Version Drift (${versionDrifts.length} files)`);
178
+ lines.push('');
179
+ lines.push('Package.json files with only dependency version changes.');
180
+ lines.push('');
181
+ if (versionDrifts.length > 0) {
182
+ for (const diff of versionDrifts.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
183
+ lines.push(`- [ ] \`${diff.relativePath}\``);
184
+ }
185
+ }
186
+ else {
187
+ lines.push('(none)');
188
+ }
189
+ lines.push('');
190
+ lines.push('---');
191
+ lines.push('');
192
+ // Custom Code Section
193
+ const customCode = grouped.get('custom-code') || [];
194
+ lines.push(`## Custom Code (${customCode.length} files)`);
195
+ lines.push('');
196
+ lines.push('Application source code that differs from template.');
197
+ lines.push('');
198
+ if (customCode.length > 0) {
199
+ for (const diff of customCode.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
200
+ lines.push(`- [ ] \`${diff.relativePath}\``);
201
+ }
202
+ }
203
+ else {
204
+ lines.push('(none)');
205
+ }
206
+ lines.push('');
207
+ lines.push('---');
208
+ lines.push('');
209
+ // Additions Section
210
+ const additions = grouped.get('addition') || [];
211
+ lines.push(`## Additions (${additions.length} files)`);
212
+ lines.push('');
213
+ lines.push('Files in target that don\'t exist in template.');
214
+ lines.push('');
215
+ if (additions.length > 0) {
216
+ for (const diff of additions.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
217
+ lines.push(`- [ ] \`${diff.relativePath}\``);
218
+ }
219
+ }
220
+ else {
221
+ lines.push('(none)');
222
+ }
223
+ lines.push('');
224
+ lines.push('---');
225
+ lines.push('');
226
+ // Missing from Target Section
227
+ const missing = grouped.get('missing-from-target') || [];
228
+ lines.push(`## Missing from Target (${missing.length} files)`);
229
+ lines.push('');
230
+ lines.push('Files in template that don\'t exist in target.');
231
+ lines.push('');
232
+ if (missing.length > 0) {
233
+ for (const diff of missing.sort((a, b) => a.relativePath.localeCompare(b.relativePath))) {
234
+ lines.push(`- [ ] \`${diff.relativePath}\``);
235
+ }
236
+ }
237
+ else {
238
+ lines.push('(none)');
239
+ }
240
+ lines.push('');
241
+ return lines.join('\n');
242
+ }
131
243
  //# sourceMappingURL=report-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/compare/report-generator.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,eAAe,CACtB,KAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD;;GAEG;AACH,SAAS,eAAe,CAAC,IAAc;IACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,OAAO,eAAe,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;AAC/G,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAwB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,cAAc,MAAM,CAAC,OAAO,CAAC,kBAAkB,oBAAoB,MAAM,CAAC,OAAO,CAAC,gBAAgB,wBAAwB,CAC3H,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,wBAAwB;IACxB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,uBAAuB;IACvB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAGD,oBAAoB;IACpB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAC7C,EAAE,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAwB;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/compare/report-generator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAsD3D,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAuBD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/D;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAuD3D,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAuBD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/D;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpE"}
@@ -42,6 +42,7 @@ function isBinaryFile(filePath) {
42
42
  const DOTFILE_RENAMES = {
43
43
  gitignore: '.gitignore',
44
44
  gitmodules: '.gitmodules',
45
+ gitattributes: '.gitattributes',
45
46
  prettierrc: '.prettierrc',
46
47
  prettierignore: '.prettierignore',
47
48
  npmrc: '.npmrc',
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-carlonicora-app",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "Create a NestJS + Next.js monorepo project with Neo4j and JSON:API",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -0,0 +1,66 @@
1
+ {
2
+ "i18n-ally.localesPaths": [
3
+ "apps/web/messages",
4
+ "packages/nextjs-jsonapi/src/i18n",
5
+ "apps/api/src/i18n",
6
+ "apps/web/src/i18n"
7
+ ],
8
+ "i18n-ally.keystyle": "nested",
9
+ "i18n-ally.sourceLanguage": "en",
10
+ "i18n-ally.displayLanguage": "en",
11
+ "i18n-ally.enabledFrameworks": ["next-intl"],
12
+ "i18n-ally.annotations": true,
13
+ "i18n-ally.annotationInPlace": true,
14
+ "i18n-ally.extract.autoDetect": true,
15
+ "i18n-ally.extract.keygenStrategy": "slug",
16
+ "i18n-ally.extract.targetPickingStrategy": "most-similar",
17
+ "i18n-ally.extract.parsers.html": {
18
+ "attributes": ["text", "title", "alt", "placeholder", "label", "aria-label", "description"],
19
+ "ignoredTags": ["script", "style"],
20
+ "inlineText": true
21
+ },
22
+ "i18n-ally.refactor.templates": [
23
+ {
24
+ "source": "jsx-text",
25
+ "templates": [
26
+ "{t(\"{key}\")}"
27
+ ]
28
+ },
29
+ {
30
+ "source": "js-string",
31
+ "templates": [
32
+ "t(\"{key}\")"
33
+ ]
34
+ },
35
+ {
36
+ "source": "html-attribute",
37
+ "templates": [
38
+ "{t(\"{key}\")}"
39
+ ]
40
+ }
41
+ ],
42
+ "i18n-ally.indent": 2,
43
+ "i18n-ally.sortKeys": true,
44
+
45
+ // Formatter settings - use Prettier only, not ESLint
46
+ "editor.formatOnSave": true,
47
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
48
+ "[typescript]": {
49
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
50
+ },
51
+ "[typescriptreact]": {
52
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
53
+ },
54
+ "[javascript]": {
55
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
56
+ },
57
+ "[json]": {
58
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
59
+ },
60
+
61
+ // ESLint settings - completely disable ESLint on save
62
+ "eslint.format.enable": false,
63
+ "editor.codeActionsOnSave": {
64
+ "source.fixAll.eslint": "never"
65
+ }
66
+ }
@@ -21,7 +21,21 @@ Keep this managed block so 'openspec update' can refresh the instructions.
21
21
 
22
22
  This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
23
23
 
24
- It is important you read `@AI-ARCHITECTURE-GUIDE.md` to understand the way this platform uses {json:api}. THIS MUST BE YOUR BIBLE.
24
+ ## Monorepo Structure
25
+
26
+ This is a monorepo with component-specific instructions. Read the relevant CLAUDE.md for your task:
27
+
28
+ | Component | Path | Description |
29
+ |-----------|------|-------------|
30
+ | **API** | [apps/api/CLAUDE.md](apps/api/CLAUDE.md) | NestJS backend with Neo4j |
31
+ | **Web** | [apps/web/CLAUDE.md](apps/web/CLAUDE.md) | Next.js frontend |
32
+ | **Shared** | [packages/shared/CLAUDE.md](packages/shared/CLAUDE.md) | Shared types & constants |
33
+ | **NestJS Library** | [packages/nestjs-neo4jsonapi/CLAUDE.md](packages/nestjs-neo4jsonapi/CLAUDE.md) | NestJS JSON:API framework |
34
+ | **Next.js Library** | [packages/nextjs-jsonapi/CLAUDE.md](packages/nextjs-jsonapi/CLAUDE.md) | Next.js JSON:API client |
35
+
36
+ ## Architecture Reference
37
+
38
+ See [docs/architecture/INDEX.md](docs/architecture/INDEX.md) for detailed patterns. This is your bible for understanding JSON:API implementation.
25
39
 
26
40
  ## Working Style & Approach
27
41
 
@@ -106,34 +120,6 @@ pnpm --filter {{name}}-web test:coverage
106
120
  pnpm --filter {{name}}-web test:watch
107
121
  ```
108
122
 
109
- ### Testing Utilities
110
-
111
- The `@carlonicora/nextjs-jsonapi/testing` module exports utilities for testing:
112
-
113
- ```typescript
114
- import {
115
- MockJsonApiProvider,
116
- renderWithProviders,
117
- createMockApiData,
118
- createMockResponse,
119
- createMockService,
120
- screen,
121
- } from "@carlonicora/nextjs-jsonapi/testing";
122
-
123
- // Create mock JSON:API data
124
- const mockData = createMockApiData({
125
- type: "photographs",
126
- id: "123",
127
- attributes: { title: "Test Photo" },
128
- });
129
-
130
- // Render components with providers
131
- renderWithProviders(<MyComponent />);
132
-
133
- // Use screen for queries
134
- expect(screen.getByText("Hello")).toBeInTheDocument();
135
- ```
136
-
137
123
  ### Test File Conventions
138
124
 
139
125
  - Test files should be named `*.spec.ts` or `*.test.ts`
@@ -0,0 +1,107 @@
1
+ # Backend (NestJS + Neo4j) - CLAUDE.md
2
+
3
+ This file provides guidance specific to the API backend. See also the [root CLAUDE.md](../../CLAUDE.md) for general project rules.
4
+
5
+ ## Architecture Documentation
6
+
7
+ | Task | Read |
8
+ |------|------|
9
+ | Core principles | [docs/architecture/00-core-principles.md](../../docs/architecture/00-core-principles.md) |
10
+ | New entity | [docs/architecture/backend/01-entity-basics.md](../../docs/architecture/backend/01-entity-basics.md) |
11
+ | DTOs | [docs/architecture/backend/02-dtos.md](../../docs/architecture/backend/02-dtos.md) |
12
+ | Repository | [docs/architecture/backend/03-repositories.md](../../docs/architecture/backend/03-repositories.md) |
13
+ | Service | [docs/architecture/backend/04-services.md](../../docs/architecture/backend/04-services.md) |
14
+ | Controller | [docs/architecture/backend/05-controllers.md](../../docs/architecture/backend/05-controllers.md) |
15
+ | Template | [docs/architecture/backend/template.md](../../docs/architecture/backend/template.md) |
16
+ | Anti-patterns | [docs/architecture/anti-patterns.md](../../docs/architecture/anti-patterns.md) |
17
+
18
+ ## Core Rules
19
+
20
+ 1. **Always extend AbstractRepository/AbstractService** - Never bypass the framework
21
+ 2. **Company filtering is automatic** - Use `buildDefaultMatch()`, never filter manually
22
+ 3. **Use Meta constants** - Never hardcode endpoints/types, use `*.meta.ts` files
23
+ 4. **Descriptors are the source of truth** - Fields, relationships, computed properties all come from Descriptors
24
+ 5. **Queue-based async** - Use BullMQ for heavy operations (analysis, clustering, image processing)
25
+ 6. **Parameterized queries** - Never interpolate strings into Cypher queries
26
+
27
+ ## File Organization
28
+
29
+ ```
30
+ src/features/{domain}/
31
+ ├── entities/
32
+ │ ├── {entity}.meta.ts # JSON:API metadata (type, endpoint, nodeName)
33
+ │ └── {entity}.ts # Entity class + EntityDescriptor
34
+ ├── dtos/
35
+ │ ├── {entity}-post.dto.ts # POST request validation
36
+ │ ├── {entity}-put.dto.ts # PUT request validation
37
+ │ └── {entity}-patch.dto.ts # PATCH request validation
38
+ ├── {entity}.repository.ts # Data access (extends AbstractRepository)
39
+ ├── {entity}.service.ts # Business logic (extends AbstractService)
40
+ ├── {entity}.controller.ts # HTTP handlers
41
+ └── {entity}.module.ts # NestJS module definition
42
+ ```
43
+
44
+ ## Key Patterns
45
+
46
+ ### Meta File Pattern
47
+ ```typescript
48
+ export const photographMeta: DataMeta = {
49
+ type: "photographs", // JSON:API type (plural, kebab-case)
50
+ endpoint: "photographs", // URL segment
51
+ nodeName: "photograph", // Cypher variable name
52
+ labelName: "Photograph", // Neo4j node label
53
+ };
54
+ ```
55
+
56
+ ### Entity Descriptor Pattern
57
+ ```typescript
58
+ export const PhotographDescriptor: EntityDescriptor<Photograph, PhotographRelationships> = {
59
+ fields: {
60
+ id: { type: "string", generator: "uuid" },
61
+ title: { type: "string" },
62
+ createdAt: { type: "date", generator: "createdAt" },
63
+ },
64
+ relationships: {
65
+ roll: { type: "one", target: rollMeta, direction: "out", relationshipType: "BELONGS_TO" },
66
+ metadata: { type: "many", target: metadataMeta, direction: "out" },
67
+ },
68
+ computedFields: {
69
+ displayName: (entity) => entity.title || "Untitled",
70
+ },
71
+ };
72
+ ```
73
+
74
+ ### Repository Query Pattern
75
+ ```typescript
76
+ // Always use parameterized queries
77
+ const query = `
78
+ MATCH (${meta.nodeName}:${meta.labelName})
79
+ WHERE ${meta.nodeName}.id = $photographId
80
+ RETURN ${meta.nodeName}
81
+ `;
82
+ const result = await this.neo4jService.run(query, { photographId });
83
+ ```
84
+
85
+ ## Testing
86
+
87
+ ```bash
88
+ # Run API tests
89
+ pnpm --filter {{name}}-api test
90
+
91
+ # Run E2E tests
92
+ pnpm --filter {{name}}-api test:e2e
93
+
94
+ # Run with coverage
95
+ pnpm --filter {{name}}-api test:coverage
96
+ ```
97
+
98
+ ## Common Mistakes
99
+
100
+ | Mistake | Correct Approach |
101
+ |---------|------------------|
102
+ | Returning raw Neo4j records | Use `readOne()` / `readMany()` to deserialize |
103
+ | Manual company filtering | Use `buildDefaultMatch()` - filtering is automatic |
104
+ | Hardcoded pagination | Use `{CURSOR}` placeholder in queries |
105
+ | String interpolation in Cypher | Use parameterized queries with `$paramName` |
106
+ | Bypassing AbstractService | Always extend and use inherited methods |
107
+ | Missing relationship definitions | Define ALL relationships in EntityDescriptor |
@@ -0,0 +1,163 @@
1
+ # Frontend (Next.js) - CLAUDE.md
2
+
3
+ This file provides guidance specific to the Web frontend. See also the [root CLAUDE.md](../../CLAUDE.md) for general project rules.
4
+
5
+ ## Architecture Documentation
6
+
7
+ | Task | Read |
8
+ |------|------|
9
+ | Core principles | [docs/architecture/00-core-principles.md](../../docs/architecture/00-core-principles.md) |
10
+ | Models | [docs/architecture/frontend/01-models.md](../../docs/architecture/frontend/01-models.md) |
11
+ | Interfaces | [docs/architecture/frontend/02-interfaces.md](../../docs/architecture/frontend/02-interfaces.md) |
12
+ | Services | [docs/architecture/frontend/03-services.md](../../docs/architecture/frontend/03-services.md) |
13
+ | Template | [docs/architecture/frontend/template.md](../../docs/architecture/frontend/template.md) |
14
+ | Anti-patterns | [docs/architecture/anti-patterns.md](../../docs/architecture/anti-patterns.md) |
15
+
16
+ ## Core Rules
17
+
18
+ 1. **ALWAYS use callApi()** - Never use raw `fetch()` for API calls
19
+ 2. **Models implement rehydrate() and createJsonApi()** - Consistent serialization/deserialization
20
+ 3. **Use ModuleFactory** - Standard resource configuration for each entity
21
+ 4. **Containers fetch, components render** - Clear separation of concerns
22
+ 5. **Jotai for shared state** - Use atoms for cross-component state
23
+ 6. **next-intl for i18n** - All user-facing text uses `useTranslations()`
24
+
25
+ ## File Organization
26
+
27
+ ```
28
+ src/features/{domain}/
29
+ ├── data/
30
+ │ ├── {Entity}.ts # Model class (extends AbstractApiData)
31
+ │ ├── {Entity}Interface.ts # TypeScript interface
32
+ │ └── {Entity}Service.ts # API service (extends AbstractService)
33
+ ├── {Entity}Module.ts # ModuleFactory configuration
34
+ ├── {Entity}Atom.ts # Jotai atoms (if needed)
35
+ ├── components/
36
+ │ ├── {Entity}Container.tsx # Data fetching, state management
37
+ │ └── {Entity}Component.tsx # Pure presentational component
38
+ └── __tests__/
39
+ └── {Entity}.spec.tsx # Component tests
40
+ ```
41
+
42
+ ## Key Patterns
43
+
44
+ ### Model Pattern
45
+ ```typescript
46
+ export class Photograph extends AbstractApiData {
47
+ title: string = "";
48
+ createdAt: Date = new Date();
49
+
50
+ static rehydrate(data: PhotographInterface): Photograph {
51
+ const photo = new Photograph();
52
+ photo.id = data.id;
53
+ photo.title = data.title;
54
+ photo.createdAt = new Date(data.createdAt);
55
+ return photo;
56
+ }
57
+
58
+ createJsonApi(): JsonApiData {
59
+ return {
60
+ type: "photographs",
61
+ id: this.id,
62
+ attributes: {
63
+ title: this.title,
64
+ },
65
+ };
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### Service Pattern
71
+ ```typescript
72
+ export class PhotographService extends AbstractService<Photograph> {
73
+ async findByRoll(rollId: string): Promise<Photograph[]> {
74
+ const response = await this.callApi({
75
+ type: Modules.Photograph,
76
+ endpoint: EndpointCreator.index({ parentType: "rolls", parentId: rollId }),
77
+ });
78
+ return response.data.map(Photograph.rehydrate);
79
+ }
80
+ }
81
+ ```
82
+
83
+ ### ModuleFactory Pattern
84
+ ```typescript
85
+ export const PhotographModule = (factory: ModuleFactory) =>
86
+ factory({
87
+ pageUrl: "/photographs",
88
+ name: "photographs",
89
+ model: Photograph,
90
+ moduleId: "photograph-module",
91
+ inclusions: {
92
+ roll: RollModule,
93
+ metadata: MetadataModule,
94
+ },
95
+ });
96
+ ```
97
+
98
+ ### Container/Component Pattern
99
+ ```typescript
100
+ // Container: handles data
101
+ export const PhotographListContainer = ({ rollId }: Props) => {
102
+ const [photographs, setPhotographs] = useState<Photograph[]>([]);
103
+
104
+ useEffect(() => {
105
+ photographService.findByRoll(rollId).then(setPhotographs);
106
+ }, [rollId]);
107
+
108
+ return <PhotographList photographs={photographs} />;
109
+ };
110
+
111
+ // Component: pure render
112
+ export const PhotographList = ({ photographs }: { photographs: Photograph[] }) => (
113
+ <div>{photographs.map(p => <PhotographCard key={p.id} photo={p} />)}</div>
114
+ );
115
+ ```
116
+
117
+ ## Testing
118
+
119
+ ```bash
120
+ # Run web tests
121
+ pnpm --filter {{name}}-web test
122
+
123
+ # Run with coverage
124
+ pnpm --filter {{name}}-web test:coverage
125
+
126
+ # Run in watch mode
127
+ pnpm --filter {{name}}-web test:watch
128
+ ```
129
+
130
+ ### Testing Utilities
131
+
132
+ ```typescript
133
+ import {
134
+ MockJsonApiProvider,
135
+ renderWithProviders,
136
+ createMockApiData,
137
+ screen,
138
+ } from "@carlonicora/nextjs-jsonapi/testing";
139
+
140
+ // Create mock data
141
+ const mockPhoto = createMockApiData({
142
+ type: "photographs",
143
+ id: "123",
144
+ attributes: { title: "Test Photo" },
145
+ });
146
+
147
+ // Render with providers
148
+ renderWithProviders(<PhotographCard photo={mockPhoto} />);
149
+
150
+ // Assert
151
+ expect(screen.getByText("Test Photo")).toBeInTheDocument();
152
+ ```
153
+
154
+ ## Common Mistakes
155
+
156
+ | Mistake | Correct Approach |
157
+ |---------|------------------|
158
+ | Using `fetch()` directly | Use `callApi()` from service |
159
+ | `overridesJsonApiCreation: true` without method | Implement dedicated `createJsonApi()` in model |
160
+ | Missing `type: Modules.Entity` in service calls | Always specify the module type |
161
+ | State in presentational components | Move state to containers or atoms |
162
+ | Hardcoded strings | Use `useTranslations()` for i18n |
163
+ | Missing `rehydrate()` | All models must implement static `rehydrate()` |
@@ -175,6 +175,22 @@ AI_OUTPUT_COST_PER_1M_TOKENS=0.4
175
175
  # Google Vertex AI: Base64-encoded GCP service account JSON (for AI_PROVIDER=vertex)
176
176
  AI_GOOGLE_CREDENTIALS_BASE64=""
177
177
 
178
+ # =============================================================================
179
+ # VISION AI (optional - falls back to AI_* if not set)
180
+ # =============================================================================
181
+ # Use these to configure a different model/provider for vision tasks
182
+ VISION_PROVIDER=
183
+ VISION_API_KEY=
184
+ VISION_MODEL=
185
+ VISION_URL=
186
+ VISION_REGION=
187
+ VISION_SECRET=
188
+ VISION_INSTANCE=
189
+ VISION_API_VERSION=
190
+ VISION_INPUT_COST_PER_1M_TOKENS=
191
+ VISION_OUTPUT_COST_PER_1M_TOKENS=
192
+ VISION_GOOGLE_CREDENTIALS_BASE64=
193
+
178
194
  # =============================================================================
179
195
  # EMBEDDER (API)
180
196
  # =============================================================================