proteum 2.1.0 → 2.1.2

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 (95) hide show
  1. package/AGENTS.md +44 -98
  2. package/README.md +143 -10
  3. package/agents/framework/AGENTS.md +146 -886
  4. package/agents/project/AGENTS.md +73 -127
  5. package/agents/project/client/AGENTS.md +22 -93
  6. package/agents/project/client/pages/AGENTS.md +24 -26
  7. package/agents/project/server/routes/AGENTS.md +10 -8
  8. package/agents/project/server/services/AGENTS.md +22 -159
  9. package/agents/project/tests/AGENTS.md +11 -8
  10. package/cli/app/config.ts +7 -20
  11. package/cli/bin.js +8 -0
  12. package/cli/commands/command.ts +243 -0
  13. package/cli/commands/commandLocalRunner.js +198 -0
  14. package/cli/commands/create.ts +5 -0
  15. package/cli/commands/deploy/web.ts +1 -2
  16. package/cli/commands/dev.ts +98 -2
  17. package/cli/commands/doctor.ts +8 -74
  18. package/cli/commands/explain.ts +8 -186
  19. package/cli/commands/init.ts +2 -94
  20. package/cli/commands/trace.ts +228 -0
  21. package/cli/compiler/artifacts/commands.ts +217 -0
  22. package/cli/compiler/artifacts/manifest.ts +35 -21
  23. package/cli/compiler/artifacts/services.ts +300 -1
  24. package/cli/compiler/client/index.ts +43 -8
  25. package/cli/compiler/common/commands.ts +175 -0
  26. package/cli/compiler/common/index.ts +1 -1
  27. package/cli/compiler/common/proteumManifest.ts +15 -114
  28. package/cli/compiler/index.ts +25 -2
  29. package/cli/compiler/server/index.ts +31 -6
  30. package/cli/index.ts +1 -4
  31. package/cli/paths.ts +16 -1
  32. package/cli/presentation/commands.ts +104 -14
  33. package/cli/presentation/devSession.ts +22 -3
  34. package/cli/presentation/proteum_logo_400x400_square_icon.txt +400 -0
  35. package/cli/runtime/commands.ts +121 -4
  36. package/cli/scaffold/index.ts +720 -0
  37. package/cli/scaffold/templates.ts +344 -0
  38. package/cli/scaffold/types.ts +26 -0
  39. package/cli/tsconfig.json +4 -1
  40. package/cli/utils/check.ts +1 -1
  41. package/client/app/component.tsx +13 -9
  42. package/client/dev/profiler/index.tsx +2511 -0
  43. package/client/dev/profiler/noop.tsx +5 -0
  44. package/client/dev/profiler/runtime.noop.ts +116 -0
  45. package/client/dev/profiler/runtime.ts +840 -0
  46. package/client/services/router/components/router.tsx +30 -2
  47. package/client/services/router/index.tsx +27 -3
  48. package/client/services/router/request/api.ts +133 -17
  49. package/commands/proteum/diagnostics.ts +11 -0
  50. package/common/dev/commands.ts +50 -0
  51. package/common/dev/diagnostics.ts +298 -0
  52. package/common/dev/profiler.ts +92 -0
  53. package/common/dev/proteumManifest.ts +135 -0
  54. package/common/dev/requestTrace.ts +115 -0
  55. package/common/env/proteumEnv.ts +284 -0
  56. package/common/router/index.ts +4 -22
  57. package/docs/dev-commands.md +93 -0
  58. package/docs/diagnostics.md +88 -0
  59. package/docs/request-tracing.md +132 -0
  60. package/eslint.js +11 -6
  61. package/package.json +3 -3
  62. package/server/app/commands.ts +35 -370
  63. package/server/app/commandsManager.ts +393 -0
  64. package/server/app/container/config.ts +11 -49
  65. package/server/app/container/console/index.ts +2 -3
  66. package/server/app/container/index.ts +5 -2
  67. package/server/app/container/trace/index.ts +364 -0
  68. package/server/app/devCommands.ts +192 -0
  69. package/server/app/devDiagnostics.ts +53 -0
  70. package/server/app/index.ts +29 -6
  71. package/server/index.ts +0 -1
  72. package/server/services/auth/index.ts +525 -61
  73. package/server/services/auth/router/index.ts +106 -7
  74. package/server/services/cron/CronTask.ts +73 -5
  75. package/server/services/cron/index.ts +34 -11
  76. package/server/services/fetch/index.ts +3 -10
  77. package/server/services/prisma/index.ts +66 -4
  78. package/server/services/router/http/index.ts +173 -6
  79. package/server/services/router/index.ts +200 -12
  80. package/server/services/router/request/api.ts +30 -1
  81. package/server/services/router/response/index.ts +83 -10
  82. package/server/services/router/response/page/document.tsx +16 -0
  83. package/server/services/router/response/page/index.tsx +27 -1
  84. package/skills/clean-project-code/SKILL.md +7 -2
  85. package/test-results/.last-run.json +4 -0
  86. package/types/aliases.d.ts +6 -0
  87. package/types/global/utils.d.ts +7 -14
  88. package/Rte.zip +0 -0
  89. package/agents/project/agents.md.zip +0 -0
  90. package/doc/TODO.md +0 -71
  91. package/doc/front/router.md +0 -27
  92. package/doc/workspace/workspace.png +0 -0
  93. package/doc/workspace/workspace2.png +0 -0
  94. package/doc/workspace/workspace_26.01.22.png +0 -0
  95. package/server/services/router/http/session.ts.old +0 -40
@@ -1,138 +1,84 @@
1
- # Architecture
2
-
3
- This is a full stack monolith project using Typescript, NodeJS, Preact, and Proteum.
4
-
5
- `/client`: frontend
6
- `/assets`: CSS, images and other frontend assets
7
- `/catalogs`: client-only catalogs and registries
8
- `/components`: reusable components
9
- `/pages`: page route files and page-local UI
10
- `/hooks`
11
- `/common`: shared functions, constants, typings, and cross-runtime catalogs
12
- `/server`: backend
13
- `/catalogs`: server-only catalogs and registries
14
- `/config`: service configuration
15
- `/services`: backend services and controllers
16
- `/routes`: explicit non-controller routes
17
- `/lib`: helper functions
18
- `/tests`
19
-
20
- # Coding style
21
-
22
- See `CODING_STYLE.md`.
23
- This file is the source of truth for formatting, section-comment structure, and general coding style.
24
-
25
- # Framework contract
26
-
27
- For Proteum-wide project scaffolding, routing, SSR, controller, service, generated-code, and maintenance rules, use the
28
- framework guide in the Proteum repository at `agents/framework/AGENTS.md`.
29
- From a normal Proteum project install, read it at `./node_modules/proteum/agents/framework/AGENTS.md`.
30
-
31
- Start framework inspection with:
32
-
33
- - `./.proteum/manifest.json`
34
- - `npx proteum explain`
35
- - `npx proteum doctor`
36
-
37
- Generated files live under `./.proteum` and should not be edited by hand.
38
- Project code should use the generated aliases `@generated/client/*`, `@generated/common/*`, and `@generated/server/*`.
39
- Client context is typically imported from `@/client/context`.
40
- Prefer type inference from the explicit application class in `./server/index.ts` whenever possible. Treat it as the
41
- canonical type root for app services, router services, router context, and models instead of duplicating manual type
42
- declarations.
43
-
44
- # Files organization
45
-
46
- - Always keep one class / React component per file
47
- - Prefer a deep tree structure that groups files by business concern instead of long file names
48
- - The default `*.ts` / `*.tsx` file is the normal implementation; use `*.ssr.ts` / `*.ssr.tsx` only when the project
49
- needs an SSR-specific variant
50
-
51
- ## Centralize feature catalogs (Single Source of Truth)
52
-
53
- When implementing a feature that relies on a **curated list of items**, keep **one canonical catalog/registry file** and make all other code import it.
54
-
55
- - Client-only catalogs live in `/client/catalogs/**`
56
- - Server-only catalogs live in `/server/catalogs/**`
57
- - Shared catalogs used by both runtimes live in `/common/catalogs/**`
58
- - Organize those root catalog trees by business concern (mirror the feature path when useful)
59
- - Do not create nested `catalogs/` folders inside `/client/pages/**`, `/client/components/**`, `/server/services/**`, or similar feature folders
60
-
61
- ## Runtime access rules
62
-
63
- - `@models/types`: Prisma typings only. Can be imported anywhere.
64
- - Never use runtime value imports from `@request` or `@models`.
65
- - Never expose request-scoped state through imports.
66
- - Keep app services, router services, router context, and model contracts inferred from `./server/index.ts` whenever
67
- possible instead of recreating parallel type maps.
68
-
69
- ## Client runtime access
70
-
71
- - Page route files use `Router.page(...)`.
72
- - `Router.page(path, render)` for pages without SSR setup.
73
- - `Router.page(path, setup, render)` for pages with SSR config/data.
74
- - `setup` receives the normal page context plus the generated controller tree spread into it.
75
- - `render` receives the normal page context plus the resolved setup data and the same controller tree spread into it.
76
- - Components and hooks use the app client context hook, usually imported from `@/client/context`.
77
- - For UI primitives, prefer the project's shared Shadcn-based components whenever they already exist and fit the need before creating bespoke buttons, inputs, dialogs, or similar building blocks.
78
-
79
- ## Server runtime access
80
-
81
- - Normal business logic lives in `/server/services/**/index.ts` classes that extend `Service`.
82
- - Route entrypoints live in `/server/controllers/**/*.ts` classes that extend `Controller`.
83
- - Only controller files are indexed as callable API endpoints.
84
- - Controller methods validate input with `this.input(schema)` and access request scope through `this.request`.
85
- - Service classes access other services via `this.services` and prisma models via `this.models`.
86
- - App service types should be inferred from the explicit application graph rooted at `./server/index.ts`.
87
- - Router services and request/context values such as `user`, `auth`, and similar request-scoped contracts should come
88
- from inferred request and app types, not ad hoc casts.
89
- - Models should be inferred from the app/model registry rooted at `./server/index.ts` and exposed through the generated
90
- server app shim, not from duplicated manual model maps.
91
- - Never use request-scoped state directly inside normal service methods.
92
- - Controllers should resolve auth and request-derived values, then pass plain typed arguments into services.
93
- - When referencing an app service, a router service, or a model, expose it in the current block scope first by
94
- destructuring from `this.request`, `this.app`, `this.models`, or the generated app/model accessors where applicable,
95
- then call methods on that local binding. The service, router value, or model should be the first element of the callee
96
- chain.
97
-
98
- # Agent behavior
99
-
100
- **Make sure the code you generate integrates perfectly with the current codebase by avoiding repetition and centralizing each purpose.**
101
-
102
- ## Typings
103
-
104
- - Keep strong, consistent TypeScript typings across the whole project.
1
+ # Project Guide
2
+
3
+ This file adds project-local rules on top of the canonical Proteum app contract.
4
+
5
+ Framework contract:
6
+
7
+ - framework repo: `agents/framework/AGENTS.md`
8
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
9
+
10
+ Coding style source of truth: `./CODING_STYLE.md`.
11
+
12
+ ## Fast Start
13
+
14
+ - Start with `./.proteum/manifest.json`, `npx proteum explain`, and `npx proteum doctor`.
15
+ - For new app or artifact boilerplate, prefer `npx proteum init ...` and `npx proteum create ...` before creating files by hand.
16
+ - Use `--dry-run --json` on scaffold commands when an agent needs a machine-readable plan before writing files.
17
+ - For request-time issues in dev, inspect traces before adding logs.
18
+ - If a server is already running on the default port from `PORT` or `./.proteum/manifest.json`, inspect existing traces before reproducing the issue.
19
+ - If existing traces are insufficient, arm `npx proteum trace arm --capture deep`, reproduce once, then inspect the new request.
20
+
21
+ ## Project Shape
22
+
23
+ This is a TypeScript, Node.js, Preact, Proteum monolith:
24
+
25
+ - `/client`: assets, catalogs, components, hooks, pages
26
+ - `/common`: shared functions, constants, types, and catalogs
27
+ - `/server`: catalogs, config, services, routes, lib
28
+ - `/tests`
29
+
30
+ ## Local Deltas
31
+
32
+ - Keep one class or one React/Preact component per file.
33
+ - Prefer a deep tree grouped by business concern instead of long file names.
34
+ - Use the default `*.ts` or `*.tsx` file unless an `*.ssr.ts` or `*.ssr.tsx` variant is truly required.
35
+ - Never edit generated files under `./.proteum`.
36
+ - Use `@generated/client/*`, `@generated/common/*`, and `@generated/server/*` for generated surfaces.
37
+ - Client context is typically imported from `@/client/context`.
38
+ - Prefer type inference from the explicit application class in `./server/index.ts`.
39
+ - Reuse shared Shadcn-based UI primitives when the project already provides them.
40
+
41
+ ## Dependency Selection
42
+
43
+ - Before implementing a feature or change, first check whether the repo already includes a suitable dependency.
44
+ - If not, search npm before building a new utility, abstraction, component primitive, parser, formatter, or integration from scratch.
45
+ - Prefer the most popular, flexible, maintained packages that fit the project constraints.
46
+ - Only reinvent the wheel when existing packages are clearly inadequate on bundle size, SSR behavior, performance, typing quality, flexibility, licensing, or maintenance risk.
47
+ - When you choose custom over a package, explain the reason briefly.
48
+
49
+ ## Catalogs And Typing
50
+
51
+ - Keep one canonical catalog or registry file and import it everywhere else.
52
+ - Client-only catalogs live in `/client/catalogs/**`, server-only catalogs in `/server/catalogs/**`, and shared catalogs in `/common/catalogs/**`.
53
+ - Do not create nested `catalogs/` folders under pages, components, services, tests, or other feature folders.
54
+ - Keep strong TypeScript typings across the project.
105
55
  - Do not introduce `any` or `unknown`, including through casts, helper aliases, or fallback generic defaults.
106
- - Fix typing issues only on the code you wrote.
107
- - Never cast with `as any` or `as unknown`; fix the type contract or introduce an explicit typed adapter instead. If you find no other solution, tell me in the output.
56
+ - Fix typing issues only on code you wrote.
57
+ - Never cast with `as any` or `as unknown`; fix the contract or add an explicit typed adapter.
108
58
 
109
59
  ## Workflow
110
60
 
111
- - Every time I input error messages without any instructions, don't implement fixes.
112
- Instead, investigate the potential causes of the errors, and for each:
113
- 1. Evaluate / quantify the probabilities
114
- 2. Give why and
115
- 3. Suggest how to fix it
116
- - When you have finished your work, summarize in one top-level short sentence the changes you made since the beginning of the conversation. Output as "Commit message".
61
+ - If the user pastes raw errors without asking for a fix, do not implement changes. List likely causes and, for each one, give probability, why, and how to fix it.
62
+ - For request-time behavior in dev, check whether a server is already running on the default port and prefer `npx proteum trace` before reproducing the issue or adding logs.
63
+ - After running `npx proteum create ...`, adapt the generated code to the real feature instead of leaving placeholder logic in place.
64
+ - End your work with `Commit message`: one short top-level sentence.
117
65
 
118
- ## High-impact files
66
+ ## High-Impact Files
119
67
 
120
- - Do not edit generated files under `.proteum` by hand.
121
- - Treat `tsconfig*.json`, `env*.yaml`, Prisma-generated files, and symbolic links as high-impact.
122
- - Edit them only when the task actually requires it, and keep those changes minimal and explicit.
68
+ Edit these only when required, and keep changes minimal and explicit:
123
69
 
124
- If a high-impact file change is not required for the task, leave it alone.
70
+ - `tsconfig*.json`
71
+ - `PORT`, `ENV_*`, `URL`, and `TRACE_*` env setup
72
+ - Prisma-generated files
73
+ - symbolic links
125
74
 
126
- ## Don't run any of these commands
75
+ ## Commands Not To Run
127
76
 
128
- ```
129
- git restore
130
- git reset
131
- prisma *
132
- And any git command in the write mode.
133
- ```
77
+ - `git restore`
78
+ - `git reset`
79
+ - `prisma *`
80
+ - any write-mode git command
134
81
 
135
- # Copy and UX
82
+ ## Product And UX Docs
136
83
 
137
- Before making UX/copy decisions, read `docs/PERSONAS.md`, `docs/PRODUCT.md`, `docs/MARKETING.md`.
138
- When implementing UI, prefer existing Shadcn components or local wrappers around them whenever they can satisfy the requirement cleanly.
84
+ If the task changes UX, copy, onboarding, pricing, product semantics, or commercial positioning, read the relevant files under `./docs/` first, especially `docs/PERSONAS.md`, `docs/PRODUCT.md`, and `docs/MARKETING.md` when they exist.
@@ -1,108 +1,37 @@
1
1
  # Frontend
2
2
 
3
- UI components are defined in `/client/pages` and `/client/components`.
4
- Client-only catalogs and registries live in `/client/catalogs/**`.
3
+ This file adds client-side local rules on top of the canonical framework contract:
4
+
5
+ - framework repo: `agents/framework/AGENTS.md`
6
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
5
7
 
6
8
  ## Stack
7
9
 
8
- - Typescript strict
10
+ - TypeScript strict
9
11
  - Preact with SSR
10
- - Follow the UI stack already used in the touched area.
11
- - Many Proteum apps use Tailwind and `@/client/components/Motion`, but those are app conventions, not framework guarantees.
12
- - When the project already exposes Shadcn components or `client/components/ui/**` primitives derived from them, prefer those components for standard UI instead of rebuilding the same primitives locally.
13
-
14
- Don't add `React` imports just for JSX.
15
- Use `React` only when a React or Preact API is actually needed.
16
- Don't use `React.useCallback` unless strictly necessary or already common in the touched area.
17
-
18
- ## Communicate with the server
19
-
20
- ### Pages
21
-
22
- Pages use `Router.page(...)`.
23
-
24
- Use `Router.page(path, render)` when there is no SSR setup.
25
-
26
- Use `Router.page(path, setup, render)` when the page needs SSR config or SSR data:
27
-
28
- ```typescript
29
- Router.page('/dashboard/example', ({ Feature }) => ({
30
- _auth: 'USER',
31
- dataKey: Feature.loadExample(),
32
- }), ({ dataKey }) => <Page data={dataKey} />);
33
- ```
34
-
35
- - Keep the route registration compact instead of exploding the whole call into a staircase layout.
36
- - `setup` returns one flat object
37
- - keys like `_auth`, `_layout`, `_priority` are route config
38
- - all other keys are SSR data fetchers
39
- - never use `api.fetch(...)` in page files
40
-
41
- ### Components and hooks
42
-
43
- Components and hooks access controllers through the app client context hook, typically `useContext()` from `@/client/context`:
44
-
45
- ```typescript
46
- const { Auth, Domains } = useContext();
47
- ```
12
+ - follow the UI stack already used in the touched area
13
+ - many Proteum apps use Tailwind and `@/client/components/Motion`, but those are app conventions, not framework guarantees
48
14
 
49
- Then call controller methods directly:
15
+ ## Local Client Rules
50
16
 
51
- ```typescript
52
- Auth.signUp(data).then((result) => {
53
- ...
54
- });
55
- ```
56
-
57
- ### Async calls
58
-
59
- - Prefer direct controller calls from the context or page render args
60
- - Follow the controller naming and hierarchy already used in the touched feature instead of inventing a new one
61
- - The thrown errors will automatically be displayed to the user, so don't silence them
62
- - Never depend on legacy `@app` imports on the client
63
-
64
- ## Errors handling
65
-
66
- Errors caught from controller calls should never be silenced.
67
- If a catch is needed, rethrow or surface the failure clearly.
17
+ - Page files follow the page contract in `./pages/AGENTS.md`.
18
+ - Components and hooks access controllers through the app client context hook, usually `useContext()` from `@/client/context`.
19
+ - Prefer direct controller calls from context or page render args.
20
+ - Never depend on legacy `@app` imports on the client.
21
+ - Errors from controller calls should never be silently swallowed. Rethrow or surface them clearly.
68
22
 
69
23
  ## Design
70
24
 
71
- - Follow the existing design language of the app or feature area.
25
+ - Follow the existing design language of the touched area.
72
26
  - Keep layouts responsive and accessible.
73
27
  - Add motion only when the area already uses it or when it materially improves UX.
74
- - Reuse Shadcn-based shared primitives first for common controls like buttons, inputs, dialogs, dropdowns, tabs, tables, and forms when they cover the requirement.
75
- - Create custom UI primitives only when the existing Shadcn layer cannot express the interaction or visual requirement cleanly.
76
-
77
- ## Rules
78
-
79
- - Don't add `React` imports unless the file actually uses a React or Preact API.
80
- - Don't use any component from `@client/components` unless the codebase already does in that area, except for established shared primitives such as the project's Shadcn-based `client/components/ui/**` layer
81
- - To create a link / button, always use the `Link` component when the codebase expects navigation links
82
-
83
- ## Keep the code organized
84
-
85
- - Split big components (more than 1000 lines) into smaller components
86
- - Always use one component per file
87
- - Every time possible, load data and define action handlers in the directly concerned component instead of passing everything from the parent
88
- - Put curated lists, option registries, UI copy catalogs, and similar SSOT data under `/client/catalogs/**`, not inside page or component folders
89
-
90
- ## Split the page by sections via comments
91
-
92
- Use:
93
-
94
- ```typescript
95
- /*----------------------------------
96
- - SECTION NAME
97
- ----------------------------------*/
98
- ```
28
+ - When the project already exposes shared Shadcn-based UI primitives, reuse them before creating custom primitives.
99
29
 
100
- File sections:
101
- - DEPENDENCIES
102
- - TYPES
103
- - COMPONENT / PAGE
30
+ ## Code Organization
104
31
 
105
- Component / page sections:
106
- - INIT
107
- - ACTIONS
108
- - RENDER
32
+ - Do not add `React` imports just for JSX.
33
+ - Do not use `React.useCallback` unless it is necessary or already common in the touched area.
34
+ - Keep one component per file.
35
+ - Load data and define handlers in the directly concerned component when that keeps ownership clearer.
36
+ - Keep curated lists, option registries, and UI copy catalogs under `/client/catalogs/**`.
37
+ - Follow the section-comment format from the project-root `CODING_STYLE.md`.
@@ -1,35 +1,33 @@
1
- # Page files
1
+ # Page Files
2
2
 
3
- Page files are located in `/client/pages/**/*.tsx`.
3
+ This file adds page-file local rules on top of the canonical framework contract:
4
4
 
5
- ## Router.page contract
5
+ - framework repo: `agents/framework/AGENTS.md`
6
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
6
7
 
7
- Use one of these forms:
8
+ ## Router.page Usage
8
9
 
9
- ```typescript
10
- Router.page('/path', ({ request, Feature }) => <Page />);
11
- ```
10
+ - Prefer `Router.page(path, setup, render)` for normal SSR pages.
11
+ - Use `Router.page(path, options, setup, render)` when a separate route-options object makes the call clearer.
12
+ - Keep the `Router.page(...)` call compact instead of exploding each outer argument onto its own line.
13
+ - Keep route registration at top level. Do not hide it behind helper abstractions.
12
14
 
13
- ```typescript
14
- Router.page('/path', ({ Feature }) => ({
15
- _auth: 'USER',
16
- dataKey: Feature.loadData({ param1: 'value' }),
17
- }), ({ request, dataKey, Feature }) => <Page data={dataKey} />);
18
- ```
15
+ ## Setup And Render
19
16
 
20
- - Keep the `Router.page(...)` call itself compact instead of expanding each argument onto its own outer line.
21
- - `setup` is the second `Router.page` argument
22
- - `render` is the last `Router.page` argument
23
- - `setup` receives the page context plus generated controller instances
24
- - `render` receives the page context, resolved setup data, and generated controller instances
25
- - Prefer the generated page arguments or the app context hook; do not import `.proteum` files directly.
26
- - Never use `api.fetch(...)` in page files
27
- - Never import client service values from `@app`
28
- - Compose page UI from shared Shadcn-based components when the project already provides them instead of redefining common controls inline in the page file
29
- - Keep page-local curated copy, option sets, and registries in `/client/catalogs/**`; do not create `catalogs/` folders under `client/pages/**`
17
+ - `setup` returns one flat object.
18
+ - `_`-prefixed keys are route options.
19
+ - every other key is SSR data and should be consumed from `render`
20
+ - if a page needs route data, return it from `setup` and read it in `render`
21
+
22
+ ## Page Rules
23
+
24
+ - Prefer generated page args or the app context hook. Do not import `.proteum` files directly.
25
+ - Never use `api.fetch(...)` in page files.
26
+ - Never import client service values from `@app`.
27
+ - Keep page-local curated copy, option sets, and registries in `/client/catalogs/**`.
28
+ - When shared Shadcn-based primitives exist, compose the page UI from them instead of redefining common controls inline.
30
29
 
31
30
  ## Typings
32
31
 
33
- - Treat generated controller method typings as the source of truth
34
- - Never cast controller methods, their parameters, or their return types
35
- - If a page needs route data, return it from `setup` and consume it from `render`
32
+ - Treat generated controller method typings as the source of truth.
33
+ - Never cast controller methods, their parameters, or their return types.
@@ -1,13 +1,15 @@
1
- # Server routes
1
+ # Server Routes
2
2
 
3
- Use `/server/routes/**` only for explicit custom routes that should not be generated from controllers.
3
+ This file adds route-area local rules on top of the canonical framework contract:
4
4
 
5
- - Callable app APIs belong in `/server/controllers/**/*.ts`
6
- - `/server/routes/**` is for manual `Router.get/post/...` routes, redirects, resources, OAuth callbacks, etc.
7
- - If a route needs a curated list or registry, keep server-only data in `/server/catalogs/**` and shared data in `/common/catalogs/**`
5
+ - framework repo: `agents/framework/AGENTS.md`
6
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
8
7
 
9
- ## Generate absolute urls
8
+ - Use `/server/routes/**` only for explicit custom HTTP behavior that should not be generated from controllers.
9
+ - If the endpoint is just a normal app API, prefer `/server/controllers/**/*.ts`.
10
+ - Good fits include redirects, resources, OAuth callbacks, webhooks, sitemap-like output, and custom public endpoints.
11
+ - If a route needs a curated registry, keep server-only data in `/server/catalogs/**` and shared data in `/common/catalogs/**`.
10
12
 
11
- The absolute urls are generated via `Router.url()`:
13
+ ## Absolute URLs
12
14
 
13
- `const absoluteUrl = Router.url('/relative/path')`
15
+ Use `Router.url('/relative/path')` to generate absolute URLs.
@@ -1,170 +1,33 @@
1
1
  # Server Services
2
2
 
3
- Stack:
4
- - Typescript with strict mode
5
- - NodeJS
6
- - Prisma 7 ORM
3
+ This file adds service-area local rules on top of the canonical framework contract:
7
4
 
8
- ## Catalog placement
5
+ - framework repo: `agents/framework/AGENTS.md`
6
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
9
7
 
10
- - Server-only catalogs and registries live in `/server/catalogs/**`
11
- - Shared cross-runtime catalogs live in `/common/catalogs/**`
12
- - Do not create nested `catalogs/` folders under `/server/services/**`
13
- - Services should import curated lists from those root catalog locations instead of redefining them locally
8
+ ## Placement
14
9
 
15
- ## 1. Create the service file in `/server/services/<service name>/index.ts`
10
+ - Root business services live in `/server/services/<Feature>/index.ts`.
11
+ - Root-service metadata lives in `/server/services/<Feature>/service.json`.
12
+ - Root-service config lives in `/server/config/*.ts` when the service needs config.
13
+ - Companion client-callable entrypoints live in `/server/controllers/**`.
16
14
 
17
- Template:
15
+ ## Local Service Rules
18
16
 
19
- ```typescript
20
- /*----------------------------------
21
- - DEPENDANCE
22
- ----------------------------------*/
17
+ - Keep business logic in services and keep request/auth/input handling in controllers.
18
+ - If a feature grows several coherent domains, split it into explicit subservices.
19
+ - Server-only catalogs live in `/server/catalogs/**`.
20
+ - Shared cross-runtime catalogs live in `/common/catalogs/**`.
21
+ - Do not create nested `catalogs/` folders under `/server/services/**`.
23
22
 
24
- // Core libs
25
- import Service from '@server/app/service';
23
+ ## Models And Typing
26
24
 
27
- /*----------------------------------
28
- - TYPES
29
- ----------------------------------*/
25
+ - Use runtime models through `this.models` or the app model accessors.
26
+ - Use Prisma typings through `@models/types` only.
27
+ - In database queries, prefer explicit `select` or narrow `include`.
28
+ - Prefer inferred return types such as `Awaited<ReturnType<MyService['methodName']>>` over manual DTO duplication.
30
29
 
31
- export type Config = Record<string, never>;
30
+ ## Errors
32
31
 
33
- /*----------------------------------
34
- - SERVICE
35
- ----------------------------------*/
36
-
37
- export default class ServiceName extends Service<Config, {}, AppType, ParentServiceType> {
38
-
39
- public async methodName(data: { param1: string }) {
40
- return this.services.OtherService.otherMethod(data);
41
- }
42
- }
43
- ```
44
-
45
- Replace `AppType` and `ParentServiceType` with the local app types used by neighboring services.
46
- If the service receives config from a project config file, replace `Config` with the real config shape and expose a typed
47
- config export with `Services.config(ServiceName, { ... })` from `server/config/*.ts`.
48
-
49
- ## 2. Create the controller file in `/server/controllers/...`
50
-
51
- Template:
52
-
53
- ```typescript
54
- import Controller, { schema } from '@server/app/controller';
55
-
56
- const MethodInput = schema.object({
57
- param1: schema.string(),
58
- });
59
-
60
- export default class ServiceNameController extends Controller<AppType> {
61
-
62
- public async methodName() {
63
- const input = this.input(MethodInput);
64
- const currentUser = this.request.auth.check('USER', null);
65
-
66
- return this.services.ServiceName.methodName({
67
- ...input,
68
- currentUser,
69
- });
70
- }
71
- }
72
- ```
73
-
74
- Replace `AppType` with the local app type if the surrounding controllers use a generic.
75
- Place the controller under the path that should drive the public API shape, for example `/server/controllers/ServiceName.ts` or `/server/controllers/ServiceName/subFeature.ts`.
76
-
77
- Rules:
78
- - Only files under `/server/controllers/**/*.ts` are indexed as callable API endpoints
79
- - Route path is derived from the controller file path and the method name
80
- - `this.input(schema)` is the only validation entrypoint
81
- - Call `this.input(...)` at most once per controller method
82
- - Request-scoped state exists only on `this.request`
83
- - Keep controllers thin and push business logic into services
84
- - Extract auth and request-derived values in the controller and pass explicit typed arguments into services
85
-
86
- ## 3. Create the service metas file in `/server/services/<service name>/service.json`
87
-
88
- ```json
89
- {
90
- "id": "<AppIdentifier>/ServiceName",
91
- "name": "ServiceName",
92
- "parent": "app",
93
- "dependences": []
94
- }
95
- ```
96
-
97
- Use the same id namespace and naming convention as neighboring services in the project.
98
-
99
- ## 4. Add a typed config export in `/server/config/*.ts` and instantiate the service in `/server/index.ts`
100
-
101
- ```typescript
102
- // server/config/feature.ts
103
- import { Services } from '@server/app';
104
- import ServiceName from '@/server/services/ServiceName';
105
-
106
- export const serviceNameConfig = Services.config(ServiceName, {});
107
- ```
108
-
109
- ```typescript
110
- // server/index.ts
111
- import { Application } from '@server/app';
112
- import ServiceName from '@/server/services/ServiceName';
113
- import * as featureConfig from '@/server/config/feature';
114
-
115
- export default class MyApp extends Application {
116
- public ServiceName = new ServiceName(this, featureConfig.serviceNameConfig, this);
117
- }
118
- ```
119
-
120
- Match the existing config-grouping and namespace-import convention in the project instead of inventing a new bootstrap shape.
121
-
122
- ## 5. Keep classes clean
123
-
124
- If the class grows too large, split business concerns into subservices.
125
-
126
- ## 6. Use request-aware features only in controllers
127
-
128
- Use:
129
-
130
- ```typescript
131
- const { auth, request, user, response } = this.request;
132
- ```
133
-
134
- - Never import runtime request state from `@request`
135
- - Never access request-scoped state inside normal service methods
136
- - If a service needs user identity, locale, cookies, or another request-derived value, compute it in the controller and pass only that value
137
-
138
- ## 7. Fetch and return data from the database
139
-
140
- Use runtime models through `this.models`:
141
-
142
- ```typescript
143
- const users = await this.models.user.findMany({
144
- select: {
145
- id: true,
146
- },
147
- });
148
- ```
149
-
150
- Use prisma typings through `@models/types` only:
151
-
152
- ```typescript
153
- import type * as Models from '@models/types';
154
- ```
155
-
156
- Rules:
157
- - Never edit prisma files, except the schema
158
- - Never use runtime `@models` imports
159
- - If you need generated runtime Prisma enums or helpers already emitted by Proteum, follow the local `@generated/server/models` import pattern
160
- - In all queries and joins, always specify what fields to select
161
-
162
- ## DTO and typing rules
163
-
164
- - Prefer inferred return types:
165
- `export type TResult = Awaited<ReturnType<MyService["MethodName"]>>;`
166
- - Never create manual DTO types when the exact return type can be inferred
167
-
168
- ## Errors handling
169
-
170
- Never silence caught errors. Throw `Anomaly` with enough detail and the original error when needed.
32
+ - Never silence caught errors.
33
+ - If you need to wrap a failure, preserve enough detail and the original error.
@@ -1,9 +1,12 @@
1
- # Codex guidance for writing E2E tests
1
+ # E2E Tests
2
2
 
3
- - Understand the typical user flow and the main feature branches
4
- - Favor as many tests as possible to cover real usage
5
- - Always locate elements via their `data-testid` attribute
6
- - Add `data-testid` where needed
7
- - Keep test files clean, organized and structured
8
- - Test the current controller/page runtime model, not legacy `@Route` or `api.fetch` behavior
9
- - Reuse root catalog files from `/client/catalogs/**`, `/server/catalogs/**`, or `/common/catalogs/**` instead of duplicating catalog constants inside tests
3
+ This file adds test-area local rules on top of the canonical framework contract:
4
+
5
+ - framework repo: `agents/framework/AGENTS.md`
6
+ - installed app: `./node_modules/proteum/agents/framework/AGENTS.md`
7
+
8
+ - Understand the real user flow and the main feature branches before writing tests.
9
+ - Test the current controller/page runtime model, not legacy `@Route` or `api.fetch` behavior.
10
+ - Locate elements with `data-testid`.
11
+ - Add `data-testid` where needed instead of relying on brittle selectors.
12
+ - Reuse root catalog files from `/client/catalogs/**`, `/server/catalogs/**`, or `/common/catalogs/**` instead of duplicating catalog constants in tests.