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.
- package/dist/compare/report-generator.d.ts +4 -0
- package/dist/compare/report-generator.d.ts.map +1 -1
- package/dist/compare/report-generator.js +112 -0
- package/dist/compare/report-generator.js.map +1 -1
- package/dist/utils/files.d.ts.map +1 -1
- package/dist/utils/files.js +1 -0
- package/dist/utils/files.js.map +1 -1
- package/package.json +1 -1
- package/template/.vscode/settings.json +66 -0
- package/template/CLAUDE.md +15 -29
- package/template/apps/api/CLAUDE.md +107 -0
- package/template/apps/web/CLAUDE.md +163 -0
- package/template/env.example +16 -0
|
@@ -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":"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"}
|
|
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;
|
|
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"}
|
package/dist/utils/files.js
CHANGED
package/dist/utils/files.js.map
CHANGED
|
@@ -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
|
@@ -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
|
+
}
|
package/template/CLAUDE.md
CHANGED
|
@@ -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
|
-
|
|
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()` |
|
package/template/env.example
CHANGED
|
@@ -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
|
# =============================================================================
|