@lenne.tech/cli 1.14.0 → 1.15.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/build/commands/fullstack/init.js +41 -11
- package/build/extensions/tools.js +12 -1
- package/build/templates/next-fullstack/.claude/QUICKSTART.md.ejs +61 -0
- package/build/templates/next-fullstack/CLAUDE.md.ejs +45 -0
- package/build/templates/next-fullstack/README.md.ejs +48 -0
- package/package.json +1 -1
|
@@ -21,7 +21,7 @@ const NewCommand = {
|
|
|
21
21
|
run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
|
|
22
22
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
|
|
23
23
|
// Retrieve the tools we need
|
|
24
|
-
const { config, filesystem, frontendHelper, git, helper, parameters, patching, print: { error, info, spin, success }, prompt: { ask, confirm }, server, strings: { kebabCase }, system, } = toolbox;
|
|
24
|
+
const { config, filesystem, frontendHelper, git, helper, parameters, patching, print: { error, info, spin, success }, prompt: { ask, confirm }, server, strings: { kebabCase }, system, template, } = toolbox;
|
|
25
25
|
// Start timer
|
|
26
26
|
const timer = system.startTimer();
|
|
27
27
|
// Info
|
|
@@ -344,16 +344,46 @@ const NewCommand = {
|
|
|
344
344
|
const ngBaseSpinner = spin(`Integrate example for ${frontend}`);
|
|
345
345
|
// Remove git folder after clone
|
|
346
346
|
filesystem.remove(`${projectDir}/.git`);
|
|
347
|
-
// Patch
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
347
|
+
// Patch root files for the project.
|
|
348
|
+
//
|
|
349
|
+
// For the classic flow we patch the cloned `lt-monorepo` CLAUDE.md with
|
|
350
|
+
// template variables. For `--next` (experimental) we replace the root
|
|
351
|
+
// README.md, CLAUDE.md, and create `.claude/QUICKSTART.md` outright,
|
|
352
|
+
// because `lt-monorepo`'s root files describe the legacy MongoDB +
|
|
353
|
+
// GraphQL stack which is explicitly out of scope for the nest-base
|
|
354
|
+
// template — leaving them in place poisons every AI agent's context.
|
|
355
|
+
if (experimental) {
|
|
356
|
+
const nextTemplateProps = { name, projectDir };
|
|
357
|
+
// Render new root files. `template.generate({ target })` overwrites
|
|
358
|
+
// anything at `target`, which is what we want — the freshly cloned
|
|
359
|
+
// monorepo's stale README/CLAUDE.md must be replaced wholesale.
|
|
360
|
+
yield template.generate({
|
|
361
|
+
props: nextTemplateProps,
|
|
362
|
+
target: `${projectDir}/README.md`,
|
|
363
|
+
template: 'next-fullstack/README.md.ejs',
|
|
364
|
+
});
|
|
365
|
+
yield template.generate({
|
|
366
|
+
props: nextTemplateProps,
|
|
367
|
+
target: `${projectDir}/CLAUDE.md`,
|
|
368
|
+
template: 'next-fullstack/CLAUDE.md.ejs',
|
|
369
|
+
});
|
|
370
|
+
yield template.generate({
|
|
371
|
+
props: nextTemplateProps,
|
|
372
|
+
target: `${projectDir}/.claude/QUICKSTART.md`,
|
|
373
|
+
template: 'next-fullstack/.claude/QUICKSTART.md.ejs',
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
const claudeMdPath = `${projectDir}/CLAUDE.md`;
|
|
378
|
+
if (filesystem.exists(claudeMdPath)) {
|
|
379
|
+
const frontendName = frontend === 'nuxt' ? 'Nuxt 4' : 'Angular';
|
|
380
|
+
yield patching.update(claudeMdPath, (content) => content
|
|
381
|
+
.replace(/\{\{PROJECT_NAME\}\}/g, () => name)
|
|
382
|
+
.replace(/\{\{PROJECT_DIR\}\}/g, () => projectDir)
|
|
383
|
+
.replace(/\{\{API_MODE\}\}/g, () => apiMode)
|
|
384
|
+
.replace(/\{\{FRAMEWORK_MODE\}\}/g, () => frameworkMode)
|
|
385
|
+
.replace(/\{\{FRONTEND_FRAMEWORK\}\}/g, () => frontendName));
|
|
386
|
+
}
|
|
357
387
|
}
|
|
358
388
|
// Always initialize git
|
|
359
389
|
try {
|
|
@@ -43,14 +43,25 @@ class Tools {
|
|
|
43
43
|
* Suggests using CLI parameters instead of interactive prompts.
|
|
44
44
|
* Only shows once per session.
|
|
45
45
|
*
|
|
46
|
+
* Skipped when the caller already passed `--noConfirm` — they're
|
|
47
|
+
* deliberately running headless and don't need a hint to repeat the
|
|
48
|
+
* command, which would just be confusing noise (the friction-log
|
|
49
|
+
* complaint that triggered this guard).
|
|
50
|
+
*
|
|
46
51
|
* @param usage - Example command with parameters, e.g. "lt fullstack init --name <name> --frontend <nuxt|angular> --noConfirm"
|
|
47
52
|
*/
|
|
48
53
|
nonInteractiveHint(usage) {
|
|
54
|
+
var _a;
|
|
49
55
|
if (this.hintShown || process.stdin.isTTY) {
|
|
50
56
|
return;
|
|
51
57
|
}
|
|
58
|
+
const { parameters, print } = this.toolbox;
|
|
59
|
+
const noConfirm = (_a = parameters === null || parameters === void 0 ? void 0 : parameters.options) === null || _a === void 0 ? void 0 : _a.noConfirm;
|
|
60
|
+
if (noConfirm === true || noConfirm === 'true') {
|
|
61
|
+
this.hintShown = true;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
52
64
|
this.hintShown = true;
|
|
53
|
-
const { print } = this.toolbox;
|
|
54
65
|
print.info(print.colors.yellow(`Hint: Non-interactive mode detected. Use parameters to skip prompts:`));
|
|
55
66
|
print.info(print.colors.yellow(` ${usage}`));
|
|
56
67
|
print.info('');
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# QUICKSTART — `<%= props.name %>` workspace
|
|
2
|
+
|
|
3
|
+
A fresh AI agent that just opened this workspace. Read this once, then
|
|
4
|
+
switch to a subproject.
|
|
5
|
+
|
|
6
|
+
## You almost certainly want a subproject
|
|
7
|
+
|
|
8
|
+
| If you are doing | Go to |
|
|
9
|
+
| --------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
10
|
+
| Backend / API / DB / Prisma / auth / permissions | `cd projects/api` → [`projects/api/.claude/QUICKSTART.md`](../projects/api/.claude/QUICKSTART.md) |
|
|
11
|
+
| Frontend / Nuxt / pages / components | `cd projects/app` → its `README.md` and `CLAUDE.md` |
|
|
12
|
+
| Cross-project work (deploy, CI, monorepo tooling) | this root level |
|
|
13
|
+
|
|
14
|
+
The moment you're touching domain code or framework conventions, you
|
|
15
|
+
belong in a subproject. This root level is just the workspace shell.
|
|
16
|
+
|
|
17
|
+
## Bring up the dev environment
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# API
|
|
21
|
+
cd projects/api
|
|
22
|
+
bun install
|
|
23
|
+
bun run setup # generates .env with strong random secrets
|
|
24
|
+
docker compose up -d postgres
|
|
25
|
+
bun run prepare:schema # only needed before first migrate / when feature flags change
|
|
26
|
+
bun run prisma:generate
|
|
27
|
+
bun run prisma:migrate
|
|
28
|
+
bun run dev # boots Postgres if needed, opens the Dev Hub at /dev
|
|
29
|
+
|
|
30
|
+
# Frontend (in another shell)
|
|
31
|
+
cd projects/app
|
|
32
|
+
pnpm install
|
|
33
|
+
pnpm dev
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
If `bun run prisma:migrate` fails with a P1000 auth error after
|
|
37
|
+
re-running `bun run setup`, the Postgres volume still holds the old
|
|
38
|
+
password — run `docker compose down -v && docker compose up -d
|
|
39
|
+
postgres` to wipe it, then migrate again.
|
|
40
|
+
|
|
41
|
+
## Stack
|
|
42
|
+
|
|
43
|
+
| | API | App |
|
|
44
|
+
| -------- | ------------------ | ------------------ |
|
|
45
|
+
| Runtime | Bun 1.x | Node 22 |
|
|
46
|
+
| Framework| NestJS 11 | Nuxt 4 |
|
|
47
|
+
| Database | Postgres 18 | — |
|
|
48
|
+
| ORM | Prisma 7 | — |
|
|
49
|
+
| Auth | Better-Auth | — |
|
|
50
|
+
| Lang | TypeScript strict | TypeScript strict |
|
|
51
|
+
|
|
52
|
+
For everything else (architecture, conventions, gates, debugging),
|
|
53
|
+
switch to the subproject.
|
|
54
|
+
|
|
55
|
+
## Don'ts
|
|
56
|
+
|
|
57
|
+
- Don't add repo conventions in this root — they belong in the
|
|
58
|
+
subproject they apply to.
|
|
59
|
+
- Don't introduce GraphQL / MongoDB / Mongoose / vendor-mode
|
|
60
|
+
framework cores. Those are explicitly out of scope for `--next`
|
|
61
|
+
workspaces; see the API's `docs/architecture.md` for context.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# CLAUDE.md — `<%= props.name %>` workspace
|
|
2
|
+
|
|
3
|
+
This is a fullstack workspace with separate Claude Code contexts per
|
|
4
|
+
subproject. Pick the right one for your task and read its `CLAUDE.md`
|
|
5
|
+
first — that's where the conventions, architecture, and quickstart
|
|
6
|
+
live.
|
|
7
|
+
|
|
8
|
+
## Routing
|
|
9
|
+
|
|
10
|
+
| Task | Where to read |
|
|
11
|
+
| ---------------------------------------------- | ------------------------------------------------------------------- |
|
|
12
|
+
| Backend / API / database / Prisma migrations | [`projects/api/CLAUDE.md`](./projects/api/CLAUDE.md) |
|
|
13
|
+
| Frontend / Nuxt / pages / components | [`projects/app/CLAUDE.md`](./projects/app/CLAUDE.md) |
|
|
14
|
+
| 60-second agent onboarding | [`.claude/QUICKSTART.md`](./.claude/QUICKSTART.md) |
|
|
15
|
+
|
|
16
|
+
## Tech stack at a glance
|
|
17
|
+
|
|
18
|
+
- **API** — Bun 1.x · NestJS 11 · Prisma 7 · Postgres 18 · Better-Auth · REST + OpenAPI 3.1
|
|
19
|
+
- **App** — Nuxt 4 · Vue 3 · TypeScript
|
|
20
|
+
|
|
21
|
+
Detailed conventions live in the subproject `CLAUDE.md` files. Don't
|
|
22
|
+
add convention rules to this root file — they belong in the subproject
|
|
23
|
+
they apply to.
|
|
24
|
+
|
|
25
|
+
## Out of scope (do not add to either subproject)
|
|
26
|
+
|
|
27
|
+
- GraphQL / Apollo
|
|
28
|
+
- Mongoose / MongoDB
|
|
29
|
+
- Vendor mode for the framework core (the `--next` template ships
|
|
30
|
+
`nest-base` directly, no `@lenne.tech/nest-server` npm dependency)
|
|
31
|
+
- The legacy `@Restricted` / `@Roles` decorators
|
|
32
|
+
|
|
33
|
+
These are explicitly removed in the `nest-base` template and a real
|
|
34
|
+
project should never reintroduce them. See
|
|
35
|
+
[`projects/api/docs/architecture.md`](./projects/api/docs/architecture.md)
|
|
36
|
+
"Out of scope" for the rationale.
|
|
37
|
+
|
|
38
|
+
## When you open this repo cold
|
|
39
|
+
|
|
40
|
+
1. Identify whether the task is backend, frontend, or cross-project.
|
|
41
|
+
2. `cd projects/api` (or `projects/app`) and read its `CLAUDE.md`.
|
|
42
|
+
3. Run the subproject's quality gates before committing.
|
|
43
|
+
4. Cross-project changes (Docker compose, repo hygiene, deploy config)
|
|
44
|
+
stay at this root and follow each subproject's conventions when they
|
|
45
|
+
touch its files.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# <%= props.name %>
|
|
2
|
+
|
|
3
|
+
Fullstack workspace generated by `lt fullstack init --next`. The API is
|
|
4
|
+
the next-generation [`nest-base`](https://github.com/lenneTech/nest-base)
|
|
5
|
+
template (Bun + Prisma + Postgres + Better-Auth + REST). The app is a
|
|
6
|
+
Nuxt 4 frontend.
|
|
7
|
+
|
|
8
|
+
This root README intentionally stays minimal — each subproject has its
|
|
9
|
+
own `README.md` / `CLAUDE.md` / `.claude/` with the detail you actually
|
|
10
|
+
need while working in it.
|
|
11
|
+
|
|
12
|
+
## Layout
|
|
13
|
+
|
|
14
|
+
- [`projects/api/`](./projects/api/) — NestJS backend (Bun · Prisma 7 · Postgres 18 · Better-Auth)
|
|
15
|
+
- [`projects/app/`](./projects/app/) — Nuxt 4 frontend
|
|
16
|
+
- [`.claude/QUICKSTART.md`](./.claude/QUICKSTART.md) — agent routing card
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
### API (Bun + Prisma + Postgres)
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
cd projects/api
|
|
24
|
+
bun install
|
|
25
|
+
bun run setup # generate .env with strong random secrets
|
|
26
|
+
docker compose up -d postgres
|
|
27
|
+
bun run prepare:schema # concatenate active feature schemas
|
|
28
|
+
bun run prisma:generate
|
|
29
|
+
bun run prisma:migrate
|
|
30
|
+
bun run dev # boots Postgres if needed, opens the Dev Hub
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The Dev Hub is at `http://localhost:3000/dev`. See
|
|
34
|
+
[`projects/api/README.md`](./projects/api/README.md) for the full tour.
|
|
35
|
+
|
|
36
|
+
### Frontend (Nuxt 4)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd projects/app
|
|
40
|
+
pnpm install
|
|
41
|
+
pnpm dev
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
See [`projects/app/README.md`](./projects/app/README.md).
|
|
45
|
+
|
|
46
|
+
## License
|
|
47
|
+
|
|
48
|
+
MIT
|