codeninja 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +13 -1
  2. package/agent/database-agent.md +24 -1
  3. package/agent/nodejs-agent.md +79 -0
  4. package/cli.js +27 -7
  5. package/commands/audit.workflow.md +4 -1
  6. package/commands/db-create-table.workflow.md +1 -1
  7. package/commands/initialize-project.workflow.md +21 -0
  8. package/ide/antigravity/.agents/personas/database-architect.md +431 -153
  9. package/ide/antigravity/.agents/personas/global-orchestrator.md +219 -83
  10. package/ide/antigravity/.agents/personas/nodejs-backend.md +368 -133
  11. package/ide/antigravity/.agents/personas/reactjs-frontend.md +182 -101
  12. package/ide/antigravity/.agents/skills/api-builder/SKILL.md +58 -0
  13. package/ide/antigravity/.agents/skills/code-intelligence/SKILL.md +22 -0
  14. package/ide/antigravity/.agents/skills/database/SKILL.md +32 -0
  15. package/ide/antigravity/.agents/skills/mcp-and-context/SKILL.md +76 -82
  16. package/ide/antigravity/.agents/skills/reactjs/SKILL.md +36 -0
  17. package/ide/antigravity/.agents/workflows/codeninja-api.md +97 -21
  18. package/ide/antigravity/.agents/workflows/codeninja-audit.md +112 -16
  19. package/ide/antigravity/.agents/workflows/codeninja-db-create.md +135 -9
  20. package/ide/antigravity/.agents/workflows/codeninja-db-drop.md +107 -9
  21. package/ide/antigravity/.agents/workflows/codeninja-db-index.md +100 -9
  22. package/ide/antigravity/.agents/workflows/codeninja-db-modify.md +162 -9
  23. package/ide/antigravity/.agents/workflows/codeninja-db-seed.md +102 -8
  24. package/ide/antigravity/.agents/workflows/codeninja-db-sync.md +105 -11
  25. package/ide/antigravity/.agents/workflows/codeninja-debug.md +94 -10
  26. package/ide/antigravity/.agents/workflows/codeninja-design.md +61 -14
  27. package/ide/antigravity/.agents/workflows/codeninja-explain.md +59 -9
  28. package/ide/antigravity/.agents/workflows/codeninja-init.md +518 -21
  29. package/ide/antigravity/.agents/workflows/codeninja-integrate-api.md +451 -9
  30. package/ide/antigravity/.agents/workflows/codeninja-modularize.md +332 -9
  31. package/ide/antigravity/.agents/workflows/codeninja-optimize.md +124 -11
  32. package/ide/antigravity/.agents/workflows/codeninja-refactor.md +69 -16
  33. package/ide/antigravity/.agents/workflows/codeninja-review.md +85 -10
  34. package/ide/antigravity/.agents/workflows/codeninja-sync.md +957 -16
  35. package/ide/antigravity/.agents/workflows/codeninja-test.md +40 -13
  36. package/ide/antigravity/.agents/workflows/codeninja-validate-page.md +546 -9
  37. package/ide/claude-code/.claude/CLAUDE.md +99 -0
  38. package/ide/claude-code/.claude/agents/database-agent.md +535 -0
  39. package/ide/claude-code/.claude/agents/nodejs-agent.md +493 -0
  40. package/ide/claude-code/.claude/agents/reactjs-agent.md +267 -0
  41. package/ide/claude-code/.claude/commands/codeninja-api.md +104 -0
  42. package/ide/claude-code/.claude/commands/codeninja-audit.md +119 -0
  43. package/ide/claude-code/.claude/commands/codeninja-db-create.md +138 -0
  44. package/ide/claude-code/.claude/commands/codeninja-db-drop.md +109 -0
  45. package/ide/claude-code/.claude/commands/codeninja-db-index.md +103 -0
  46. package/ide/claude-code/.claude/commands/codeninja-db-modify.md +165 -0
  47. package/ide/claude-code/.claude/commands/codeninja-db-seed.md +104 -0
  48. package/ide/claude-code/.claude/commands/codeninja-db-sync.md +106 -0
  49. package/ide/claude-code/.claude/commands/codeninja-debug.md +99 -0
  50. package/ide/claude-code/.claude/commands/codeninja-design.md +68 -0
  51. package/ide/claude-code/.claude/commands/codeninja-explain.md +61 -0
  52. package/ide/claude-code/.claude/commands/codeninja-init.md +529 -0
  53. package/ide/claude-code/.claude/commands/codeninja-integrate-api.md +453 -0
  54. package/ide/claude-code/.claude/commands/codeninja-modularize.md +334 -0
  55. package/ide/claude-code/.claude/commands/codeninja-optimize.md +129 -0
  56. package/ide/claude-code/.claude/commands/codeninja-refactor.md +76 -0
  57. package/ide/claude-code/.claude/commands/codeninja-review.md +87 -0
  58. package/ide/claude-code/.claude/commands/codeninja-sync.md +964 -0
  59. package/ide/claude-code/.claude/commands/codeninja-test.md +45 -0
  60. package/ide/claude-code/.claude/commands/codeninja-validate-page.md +548 -0
  61. package/ide/cursor/.cursor/rules/01-global-orchestrator.mdc +40 -38
  62. package/ide/cursor/.cursor/rules/02-mcp-and-context.mdc +47 -31
  63. package/ide/cursor/.cursor/rules/03-api-builder.mdc +30 -58
  64. package/ide/cursor/.cursor/rules/04-nodejs-generation.mdc +58 -0
  65. package/ide/cursor/.cursor/rules/05-database.mdc +54 -0
  66. package/ide/cursor/.cursor/rules/06-reactjs.mdc +36 -0
  67. package/ide/cursor/.cursor/rules/07-reactjs-generation.mdc +49 -0
  68. package/ide/cursor/.cursor/rules/08-code-intelligence.mdc +56 -0
  69. package/ide/cursor/.cursor/rules/09-workflow-steps.mdc +53 -0
  70. package/ide/vscode/.github/copilot-instructions.md +69 -270
  71. package/ide/vscode/.vscode/instructions/code-intelligence.instructions.md +58 -0
  72. package/ide/vscode/.vscode/instructions/database.instructions.md +55 -0
  73. package/ide/vscode/.vscode/instructions/nodejs.instructions.md +77 -0
  74. package/ide/vscode/.vscode/instructions/reactjs.instructions.md +42 -0
  75. package/package.json +2 -2
  76. package/tasks/ask-hashing-library.task.md +31 -0
  77. package/tasks/ask-language-type.task.md +26 -0
  78. package/tasks/ask-new-module-name.task.md +13 -0
  79. package/tasks/ask-new-service-name.task.md +13 -0
  80. package/tasks/ask-old-module-name.task.md +15 -0
  81. package/tasks/ask-old-service-name.task.md +13 -0
  82. package/tasks/ask-orm-type.task.md +26 -0
  83. package/tasks/collect-seed-data.task.md +19 -0
  84. package/tasks/generate-app.task.md +42 -0
  85. package/tasks/generate-common.task.md +13 -0
  86. package/tasks/generate-constants.task.md +13 -0
  87. package/tasks/generate-database.task.md +32 -0
  88. package/tasks/generate-encryption.task.md +28 -0
  89. package/tasks/generate-fast-defaults.task.md +7 -0
  90. package/tasks/generate-hashing.task.md +180 -0
  91. package/tasks/generate-headerValidator.task.md +13 -0
  92. package/tasks/generate-ioRedis.task.md +20 -0
  93. package/tasks/generate-language-en.task.md +12 -0
  94. package/tasks/generate-logging.task.md +12 -0
  95. package/tasks/generate-model.task.md +74 -6
  96. package/tasks/generate-notification.task.md +12 -0
  97. package/tasks/generate-package-json.task.md +69 -0
  98. package/tasks/generate-prisma-client.task.md +56 -0
  99. package/tasks/generate-prisma-schema.task.md +71 -0
  100. package/tasks/generate-rateLimiter.task.md +20 -0
  101. package/tasks/generate-readme.task.md +24 -0
  102. package/tasks/generate-response.task.md +27 -0
  103. package/tasks/generate-route-manager.task.md +32 -0
  104. package/tasks/generate-route.task.md +37 -0
  105. package/tasks/generate-swagger.task.md +8 -0
  106. package/tasks/generate-template.task.md +12 -0
  107. package/tasks/generate-tsconfig.task.md +38 -0
  108. package/tasks/generate-validator.task.md +31 -0
  109. package/ide/cursor/.cursor/rules/04-database.mdc +0 -87
  110. package/ide/cursor/.cursor/rules/05-reactjs.mdc +0 -83
  111. package/ide/cursor/.cursor/rules/06-code-intelligence.mdc +0 -112
@@ -1,38 +1,54 @@
1
1
  ---
2
- description: codeninja MCP tools and context management always applied
2
+ description: codeninja MCP tools and context.json schema (v4.0). Always applied.
3
3
  globs: ["**/*"]
4
4
  alwaysApply: true
5
5
  ---
6
6
 
7
- # codeninja — MCP and Context
7
+ # codeninja — MCP Tools and Context (v4.0)
8
8
 
9
- ## MCP Tools Reference
10
- | Tool | Use |
11
- |------|-----|
12
- | `context_read` | Load project context FIRST on every activation |
13
- | `context_write` | Persist changes deep-merge, never overwrite |
14
- | `context_clear_scratchpad` | Clear current_* key after operation |
15
- | `context_check_stale` | Detect unresolved operations Step 0 |
16
- | `service_scan` | Discover services on disk |
17
- | `migration_next_number` | Before any migration file creation |
18
- | `fs_read` | Read file before modifying |
19
- | `fs_list` | List directory contents |
20
- | `fs_exists` | Check existence before conditional ops |
21
- | `file_insert_after` | Surgical append (route_manager, swagger) |
22
- | `file_contains` | Check before appending to avoid duplicates |
23
- | `run_drift_check` | Context vs disk comparison during @sync |
24
- | `lint_file` | Lint after generating JS/SQL |
25
- | `analyze_middleware_order` | Check middleware chain during @audit |
26
- | `analyze_encryption_library` | Verify encryption during @audit |
27
- | `analyze_language_keys` | Check i18n during @audit |
28
- | `analyze_dependencies` | Scan package.json during @audit |
29
- | `analyze_env_file` | Check .env completeness during @audit |
30
- | `validate_redis_connection` | Test Redis during init |
31
- | `validate_postgres_connection` | Test DB during init |
9
+ ## MCP Tools Quick Reference
10
+ | Tool | Purpose | When |
11
+ |---|---|---|
12
+ | `context_read` | Load context.json | First on every activation |
13
+ | `context_write` | Deep-merge updates | After every completed operation |
14
+ | `context_clear_scratchpad` | Clear current_* key | After writing context |
15
+ | `context_check_stale` | Detect unresolved ops | Step 0 of activation |
16
+ | `service_scan` | Discover services on disk | Step 2 of activation |
17
+ | `migration_next_number` | Next sequential migration # | Before any migration file |
18
+ | `fs_read` | Read file from disk | Before modifying any file |
19
+ | `fs_list` | List directory | When scanning structure |
20
+ | `fs_exists` | Check file existence | Before conditional ops |
21
+ | `file_insert_after` | Surgical insert | route_manager, swagger — never rewrite |
22
+ | `file_contains` | Check for string | Before appending |
23
+ | `run_drift_check` | Context vs disk | During /codeninja:sync |
24
+ | `lint_file` | Lint generated JS/TS | After JS/TS generation |
25
+ | `analyze_middleware_order` | Check middleware chain | During audit |
26
+ | `analyze_encryption_library` | Verify encryption | During audit |
27
+ | `analyze_language_keys` | Check i18n keys | During audit |
32
28
 
33
- ## Absolute Rules
34
- - NEVER read context.json with fs_read — always `context_read`
35
- - NEVER write context.json directly — always `context_write`
36
- - `change_log` is append-only — never delete entries
37
- - Always call `context_check_stale` before starting any workflow
38
- - Always call `context_clear_scratchpad` after completing a workflow
29
+ ## Context Schema (v4.0)
30
+ ```json
31
+ {
32
+ "db": {
33
+ "type": "postgres|mysql|mongodb",
34
+ "orm": "none|prisma"
35
+ },
36
+ "services": {
37
+ "<name>": {
38
+ "type": "nodejs|reactjs",
39
+ "language": "javascript|typescript",
40
+ "hashing_library": "bcryptjs|argon2",
41
+ "port": 0,
42
+ "encryption_key": "", "encryption_iv": "", "api_key": ""
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ **v4.0 new fields:** `db.orm`, `services[name].language`, `services[name].hashing_library`
49
+
50
+ ## Stale Scratchpad Recovery
51
+ If `context_check_stale` returns stale keys:
52
+ 1. Surface to user: "Unfinished [operation] detected"
53
+ 2. Ask: continue or discard?
54
+ 3. If discard: call `context_clear_scratchpad`, then proceed
@@ -1,74 +1,46 @@
1
1
  ---
2
- description: codeninja API builder standards — loaded for NodeJS service files
3
- globs: ["**/modules/**", "**/middleware/**", "**/utilities/**", "**/route_manager*", "**/app.js", "**/languages/**"]
2
+ description: NodeJS API architecture standards — 2-layer rule, SOP, middleware order. Applied to JS/TS files.
3
+ globs: ["**/*.js", "**/*.ts"]
4
4
  alwaysApply: false
5
5
  ---
6
6
 
7
- # codeninja — API Builder
7
+ # codeninja — API Builder Standards (v4.0)
8
8
 
9
- ## 2-Layer Architecture (enforced)
9
+ ## The 2-Layer Rule (absolute — no exceptions)
10
+ - `route.js/ts` — HTTP only: validation, middleware, `res.json()` via sendResponse
11
+ - `<module>_model.js/ts` — DB only: queries, business logic, no `res.json()`
10
12
 
11
- ```
12
- modules/v1/<ModuleName>/
13
- ├── route.js ← HTTP only: validation, middleware, res.json()
14
- └── <module>_model.js DB only: parameterized queries, business logic
15
- ```
16
-
17
- Never SQL in `route.js`. Never `res.json()` in `_model.js`.
13
+ ## 5-Step SOP for Every New Endpoint
14
+ 1. **ROUTING** — append to `route_manager.js/ts` via `file_insert_after` (never rewrite)
15
+ 2. **VALIDATION** validatorjs schema in `route.js/ts`
16
+ 3. **CONTROLLER** model call + try/catch in `route.js/ts`; call `sendResponse`
17
+ 4. **MODEL** — parameterized query or Prisma call in `<module>_model.js/ts`
18
+ 5. **LOCALIZE** — all strings in `languages/en.js/ts`; use `file_contains` before adding
18
19
 
19
- ## 5-Step SOPEvery New Endpoint
20
-
21
- 1. **ROUTING** — append to `route_manager.js` via `file_insert_after` (never rewrite)
22
- 2. **VALIDATION** — validatorjs schema in `route.js`, match existing patterns
23
- 3. **CONTROLLER** — model call + try/catch + `sendResponse()` in `route.js`
24
- 4. **MODEL** — parameterized `$1,$2` SQL via pg pool in `_model.js`
25
- 5. **LOCALIZE** — all strings in `languages/en.js`, use `file_contains` before adding
26
-
27
- ## Middleware Chain Order (never change)
20
+ ## Middleware Order (enforced never change)
28
21
  ```
29
- Language extraction API key validationJWT auth (protected only) Rate limiting Validation → Handler
22
+ rateLimiterextractLanguage validateApiKey[auth if protected]decryptRequestrouteHandler
30
23
  ```
31
24
 
32
25
  ## Response Contract
33
26
  ```javascript
34
- { status: 1, message: lang.key, data: result } // success
35
- { status: 0, message: lang.key } // error
36
- { status: -1, message: lang.key } // session expired → triggers frontend logout
37
- ```
38
- Always use `sendResponse(req, res, status, message, data)` from `utilities/response.js`.
39
- Never call `res.json()` directly.
40
-
41
- ## Localizify Rules
42
- Only `headerValidator.js` and `response.js` may call `t()` or import localizify.
43
- All other files use `sendResponse()`, `getMessage()`, or `req.t("key")`.
44
- Never call `setLocale` from model files — race condition under concurrent requests.
45
-
46
- ## Swagger Maintenance
47
- Patch `swagger_doc.json` only — never rewrite it.
48
- Add new path key only via `file_insert_after`. Update `info.version` timestamp.
49
-
50
- ## JSDoc Standard (every exported function — no exceptions)
51
- ```javascript
52
- /**
53
- * One-sentence description. Active voice.
54
- * @param {type} name - Description.
55
- * @returns {Promise<Object>} Description.
56
- */
27
+ // Success
28
+ sendResponse(req, res, 1, 'success_key', resultData)
29
+ // Error
30
+ sendResponse(req, res, 0, 'error_key', [])
31
+ // Session expired (triggers frontend logout)
32
+ sendResponse(req, res, -1, 'session_expired', [])
57
33
  ```
58
- Middleware: `@middleware` tag, no `@returns`.
59
- Route comment: `// POST /path — Business purpose.` above route definition.
60
- No inline `//` inside function bodies. No file-level headers.
61
34
 
62
- ## Encryption Selection
63
- | context.services[n].client_type | Library | Demo file |
64
- |---------------------------------|---------|-----------|
65
- | reactjs | crypto-js AES-256-CBC | enc_dec.html |
66
- | app | cryptlib AES-256-CBC | enc_dec.php |
35
+ ## Password Handling (v4.0)
36
+ - NEVER use `encryption.js` for passwords AES is reversible, not safe for storage
37
+ - ALWAYS use `utilities/hashing.js`: `hashPassword(plain)` / `verifyPassword(plain, hash)`
67
38
 
68
- `encrypted_transport: true` encrypt full response payload.
69
- `encrypted_transport: false` plain JSON, no transport encryption.
70
- KEY and IV always from context — never hardcode.
39
+ ## ORM Rule (v4.0)
40
+ - Read `context.db.orm` before generating model files
41
+ - orm="none": parameterized SQL (`$1`, `$2` placeholders)
42
+ - orm="prisma": `prisma.users.create({...})` — import singleton from `config/prisma`, never `new PrismaClient()`
71
43
 
72
- ## Test Standards (Jest + Supertest)
73
- File: `tests/v1/<ModuleName>.test.js`
74
- Cover: happy path, each validation failure, auth failure, edge cases.
44
+ ## Localizify Rules
45
+ - ONLY `headerValidator.js/ts` and `response.js/ts` may import localizify or call `t()`
46
+ - All other files use `sendResponse()`, `getMessage()`, or `req.t("key")`
@@ -0,0 +1,58 @@
1
+ ---
2
+ description: NodeJS file generation standards — exact content for each generated file. Applied when editing service internals.
3
+ globs: ["**/modules/**", "**/middleware/**", "**/utilities/**", "**/config/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # codeninja — NodeJS File Generation Standards (v4.0)
8
+
9
+ Read `.codeninja/tasks/generate-<name>.task.md` before generating each file.
10
+
11
+ ## Language Branch (FIRST step before generating ANY file)
12
+ Read `context.services[name].language` (or `context.current_init.language`).
13
+ - "javascript" → `.js` files, `require()`/`module.exports`
14
+ - "typescript" → `.ts` files, `import`/`export`, typed parameters
15
+
16
+ ## utilities/hashing.js/ts
17
+ - bcryptjs or argon2 — read `context.services[name].hashing_library`
18
+ - Exports: `hashPassword(plain)` → `Promise<string>`, `verifyPassword(plain, hash)` → `Promise<boolean>`
19
+ - NEVER imports from encryption.js; NEVER uses AES/KEY/IV
20
+
21
+ ## utilities/encryption.js/ts
22
+ - AES-256-CBC transport encryption ONLY — never passwords
23
+ - Exports: `encrypt(data)` → string, `decrypt(ciphertext)` → original value
24
+ - Library: `crypto-js` (client_type=reactjs) or `cryptlib` (client_type=app)
25
+
26
+ ## config/database.js/ts (orm="none" only)
27
+ - PostgreSQL: `pg.Pool` with env vars DB_HOST/PORT/NAME/USER/PASS
28
+ - MySQL: `mysql2/promise` pool
29
+ - MongoDB: `mongoose.connect()`
30
+
31
+ ## config/prisma.js/ts (orm="prisma" only)
32
+ - Single `new PrismaClient()` instance exported as singleton
33
+ - `log: ['query','error','warn']` in development only
34
+
35
+ ## middleware/headerValidator.js/ts
36
+ - Exports: `extractLanguage`, `validateApiKey`, `validateAuthToken`, `decryptRequest`
37
+ - Only file permitted to call localizify `t()` directly (along with response.js)
38
+ - TypeScript: all middleware typed as `(req: Request, res: Response, next: NextFunction) => void`
39
+
40
+ ## utilities/response.js/ts
41
+ - Exports: `sendResponse(req, res, code, messageKey, data)`
42
+ - Checks `encrypted_transport` flag — encrypts payload if true
43
+ - Only other file permitted to call localizify `t()` directly
44
+
45
+ ## modules/v1/<Module>/route.js/ts
46
+ - Imports: Router, Validator, sendResponse, model functions
47
+ - One route handler per endpoint — single try/catch wrapping model call
48
+ - Route comment above each handler: `// POST /path — description`
49
+ - TypeScript: `async (req: Request, res: Response) => {}`
50
+
51
+ ## modules/v1/<Module>/<module>_model.js/ts
52
+ - Imports: db pool (orm=none) or prisma singleton (orm=prisma), hashing utilities
53
+ - Returns exactly: `{ responsecode: 1|0|-1, responsemsg: 'key', responsedata: data }`
54
+ - No `res.json()`, no Express imports
55
+
56
+ ## app.js/ts
57
+ - Middleware chain: cors → helmet → express.json → express.urlencoded → /api/v1 router
58
+ - TypeScript: `const app: Application = express()`
@@ -0,0 +1,54 @@
1
+ ---
2
+ description: Database standards — naming, SQL content order, index rules, Prisma conventions.
3
+ globs: ["**/*.sql", "**/database/**", "**/prisma/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # codeninja — Database Standards (v4.0)
8
+
9
+ ## Naming Quick Reference
10
+ | Element | Rule | Example |
11
+ |---|---|---|
12
+ | Table | `tbl_` prefix, lowercase, plural | `tbl_users` |
13
+ | Column | lowercase snake_case | `user_id`, `created_at` |
14
+ | PK | `id`, bigint identity, first | always |
15
+ | FK | `<ref_table_singular_no_tbl>_id` | `user_id` refs `tbl_users` |
16
+ | Index (per-table) | `idx_<table_no_tbl>_<cols>` | `idx_users_email` |
17
+ | Migration (create) | `<N>-setup-tbl-<name>.sql` | `3-setup-tbl-users.sql` |
18
+ | Migration (alter) | `<N>-alter-tbl-<name>-<desc>.sql` | — |
19
+ | Shared indexes | `111-setup-database-indexes.sql` | always last |
20
+
21
+ ## Column Types
22
+ | Use | Type |
23
+ |---|---|
24
+ | Primary key | `bigint NOT NULL GENERATED ALWAYS AS IDENTITY (...)` |
25
+ | Foreign key | `BIGINT NOT NULL DEFAULT 0` |
26
+ | Email | `VARCHAR(132)` |
27
+ | Password/token | `TEXT` |
28
+ | Status | `INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0, 1))` |
29
+ | Soft delete | `BOOLEAN NOT NULL DEFAULT FALSE` |
30
+ | Timestamp | `TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP` |
31
+ | Financial | `NUMERIC(18,8) NOT NULL DEFAULT 0.00000000` |
32
+ | JSON | `JSON NOT NULL DEFAULT '{}'` |
33
+
34
+ NEVER use PostgreSQL ENUM — always `VARCHAR + CHECK constraint`.
35
+
36
+ ## SQL File Content Order (strict)
37
+ 1. Comment: `-- Creating tbl_name for purpose`
38
+ 2. `DROP TABLE IF EXISTS public.tbl_name CASCADE;`
39
+ 3. `CREATE TABLE` block
40
+ 4. `COMMENT ON COLUMN` for every enum/flag column
41
+ 5. Per-table `CREATE INDEX` statements
42
+ 6. `ALTER TABLE ... OWNER TO <db_user>`
43
+ 7. `GRANT ALL ON TABLE ... TO <db_user>`
44
+ 8. Seed `INSERT` (reference tables only)
45
+
46
+ ## Index Strategy
47
+ Always index: every FK column, (status + is_deleted) compound, created_at DESC on log tables, email + is_deleted on user tables.
48
+
49
+ ## Prisma Conventions (v4.0 — orm="prisma" only)
50
+ - `tbl_users` → `model Users` (strip tbl_, PascalCase) + `@@map("tbl_users")`
51
+ - `id` BIGINT IDENTITY → `id BigInt @id @default(autoincrement())`
52
+ - `created_at` → `createdAt DateTime @default(now()) @map("created_at")`
53
+ - `is_deleted` → `isDeleted Boolean @default(false) @map("is_deleted")`
54
+ - After every model addition → `npx prisma generate`
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: ReactJS architecture standards — apiClient, apiHandler, component rules.
3
+ globs: ["**/*.jsx", "**/src/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # codeninja — ReactJS Architecture Standards
8
+
9
+ ## apiClient.js — 4 Responsibilities
10
+ 1. Static headers: `api-key`, `Accept-Language`, `Content-Type: text/plain`
11
+ 2. Request interceptor: encrypt body + attach encrypted token from localStorage
12
+ 3. Response interceptor (success): decrypt + parse JSON; code -1 → logout redirect
13
+ 4. Response interceptor (error): ERR_NETWORK/401 → logout redirect + error message
14
+
15
+ ## apiHandler.js Standard
16
+ - One `async` function per backend endpoint
17
+ - No try/catch, no decryption, no response shaping here (interceptors handle it)
18
+ - All API endpoint paths defined here — never in page components
19
+
20
+ ## Backend Linking Rule
21
+ - ReactJS service CANNOT be initialized without a linked NodeJS backend
22
+ - Inherits from linked backend: `encryption_key`, `encryption_iv`, `api_key`, `port`
23
+ - These are NEVER asked from the user — always inherited from `context.services[linked]`
24
+
25
+ ## Vanilla CSS Only
26
+ - Per-page: `<PageName>.module.css`
27
+ - Global: `public/assets/css/style.css`
28
+ - No Tailwind, no CSS-in-JS, no styled-components
29
+
30
+ ## .env Standard
31
+ ```
32
+ REACT_APP_BASE_URL=http://localhost:<linked_port>/api/v1/
33
+ REACT_APP_API_KEY=<inherited>
34
+ REACT_APP_KEY=<inherited>
35
+ REACT_APP_IV=<inherited>
36
+ ```
@@ -0,0 +1,49 @@
1
+ ---
2
+ description: ReactJS file generation standards — exact content for each generated React file.
3
+ globs: ["**/src/pages/**", "**/src/components/**", "**/src/api/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # codeninja — ReactJS File Generation Standards
8
+
9
+ Read `.codeninja/tasks/generate-react-*.task.md` before generating each file.
10
+
11
+ ## src/api/apiClient.js
12
+ - Axios instance with `baseURL: process.env.REACT_APP_BASE_URL`
13
+ - Static headers: `api-key`, `Accept-Language: en`, `Content-Type: text/plain`
14
+ - Request interceptor: `CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv})` + token header
15
+ - Response success: decrypt + JSON.parse; responsecode -1 → `logOutRedirectCall()`
16
+ - Response error: 401 or ERR_NETWORK → `logOutRedirectCall()` + `showErrorMessage()`
17
+
18
+ ## src/api/apiHandler.js
19
+ - Imports `axiosClient` from `./apiClient`
20
+ - One exported async function per endpoint
21
+ - No try/catch — interceptors handle errors
22
+ - Example: `export const loginUser = (data) => axiosClient.post('/login', data)`
23
+
24
+ ## src/pages/Welcome/index.jsx
25
+ - Functional component using project name from env/context
26
+ - Imports `Welcome.module.css`
27
+ - No data fetching, no state — pure welcome UI
28
+ - First route in App.jsx at path `/`
29
+
30
+ ## src/App.jsx
31
+ - React Router v6: `BrowserRouter` + `Routes` + `Route`
32
+ - First route: `<Route path="/" element={<Welcome />} />`
33
+
34
+ ## src/index.jsx
35
+ - `ReactDOM.createRoot(document.getElementById('root')).render(<App />)`
36
+
37
+ ## public/index.html
38
+ - Single HTML shell with `<div id="root"></div>`
39
+ - Links to `public/assets/css/style.css`
40
+ - No inline JS or styles
41
+
42
+ ## .htaccess (both root and public/)
43
+ ```apache
44
+ RewriteEngine On
45
+ RewriteBase /
46
+ RewriteCond %{REQUEST_FILENAME} !-f
47
+ RewriteCond %{REQUEST_FILENAME} !-d
48
+ RewriteRule ^ index.html [L]
49
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: Code intelligence commands — audit, debug, review, optimize checklists.
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # codeninja — Code Intelligence Standards (v4.0)
7
+
8
+ ## /codeninja:audit Checklist
9
+
10
+ ### Security
11
+ - [ ] API key validation on all routes?
12
+ - [ ] Passwords HASHED using `utilities/hashing.js`? Never AES-encrypted?
13
+ - [ ] No direct bcrypt/argon2 imports in route/model files?
14
+ - [ ] Parameterized queries only — no string concatenation in SQL?
15
+ - [ ] No hardcoded keys/passwords in source?
16
+ - [ ] `.env` in `.gitignore`?
17
+ - [ ] Middleware order: rateLimiter→extractLanguage→validateApiKey→[auth]→decryptRequest?
18
+
19
+ ### Architecture
20
+ - [ ] 2-layer rule: no SQL in route.js, no res.json() in model files?
21
+ - [ ] route_manager.js uses `file_insert_after` — never rewritten?
22
+ - [ ] All routes in swagger_doc.json?
23
+ - [ ] All routes in context.api_routes?
24
+
25
+ ### v4.0 Checks
26
+ - [ ] If orm="prisma": no `new PrismaClient()` in model files?
27
+ - [ ] If language="typescript": no `require()` in .ts files?
28
+
29
+ ## /codeninja:debug Trace Path
30
+ 1. extractLanguage (headerValidator) — language set?
31
+ 2. validateApiKey — api-key header matches .env?
32
+ 3. validateAuthToken (if protected) — token valid?
33
+ 4. rateLimiter — not throttled?
34
+ 5. validatorjs rules in route.js — all required fields present?
35
+ 6. Model function call — DB connection alive?
36
+ 7. DB query (SQL or Prisma) — column names match context.db.schema?
37
+ 8. sendResponse — encrypted_transport flag handled correctly?
38
+
39
+ **Common causes:** 401=middleware order or key mismatch; 400=validation rules mismatch; 500=DB connection or column name wrong.
40
+
41
+ ## /codeninja:review Dimensions
42
+ - Security: auth middleware present, parameterized queries, no hardcoded secrets
43
+ - Architecture: 2-layer rule, route_manager registration, swagger coverage
44
+ - Code quality: JSDoc on every function, no console.log, async try/catch
45
+ - Database: column names match context, FK indexes present, LIMIT on list queries
46
+
47
+ ## /codeninja:optimize Patterns
48
+ 1. Missing index → `CREATE INDEX CONCURRENTLY`
49
+ 2. `SELECT *` → explicit column list
50
+ 3. N+1 → JOIN or IN clause
51
+ 4. `DATE(col)` in WHERE → range filter to preserve index
52
+ 5. `RANK()` with gaps → `DENSE_RANK()` for leaderboards
53
+ 6. No LIMIT on unbounded list queries
54
+ 7. Heavy middleware on lightweight routes
55
+ 8. Redis caching opportunities (repeated identical queries)
56
+ 9. `work_mem` session-level for sort-heavy queries
@@ -0,0 +1,53 @@
1
+ ---
2
+ description: Full workflow steps for all codeninja commands — init phases, api creation, DB operations.
3
+ alwaysApply: false
4
+ ---
5
+
6
+ # codeninja — Workflow Steps Reference (v4.0)
7
+
8
+ Read `.codeninja/commands/<workflow>.workflow.md` for the full step-by-step execution of each command.
9
+ Read `.codeninja/tasks/<task>.task.md` before generating any file.
10
+
11
+ ## /codeninja:init — Key Phases
12
+
13
+ **Phase 0** (once per repo): ask-project-info-doc → ask-project-scope-of-work → ask-project-figma → synthesize summary
14
+
15
+ **Phase 1** (mode + type): ask-init-mode → ask-project-type
16
+ - NodeJS: ask-client-type → ask-language-type → ask-encrypted-transport → ask-supported-languages
17
+ - ReactJS: ask-linked-service → inherit encryption/api values from linked backend
18
+
19
+ **Phase 2** (database, skip for ReactJS): ask-database-type → ask-orm-type → ask-database-config
20
+ - Fast mode: ask-database-name + ask-database-user only
21
+
22
+ **Phase 3–5** (service identity + config): ask-service-name → ask-service-port → ask-service-description
23
+ - Manual NodeJS: ask-package-name → ask-package-author → ask-api-key → ask-encryption-key → ask-redis-config → ask-hashing-library
24
+ - Fast NodeJS: generate-fast-defaults (auto-sets port, api_key, encryption_key, language="javascript", hashing_library="bcryptjs", orm="none")
25
+
26
+ **Phase 6** (confirm + generate): show-init-summary → single confirmation → ALL files generated silently
27
+
28
+ **NodeJS Wave 1** (Foundation): package.json, .env, .gitignore, README.md, config/constants, config/template, logger/logging, utilities/encryption, **utilities/hashing**, languages/*, enc_dec.html/php, **tsconfig.json (TS only)**
29
+
30
+ **NodeJS Wave 2** (Infrastructure): config/database (or config/prisma if orm=prisma), utilities/ioRedis, utilities/response
31
+
32
+ **NodeJS Wave 3** (Service): config/common, utilities/validator, utilities/notification, middleware/rateLimiter
33
+
34
+ **NodeJS Wave 4** (Middleware + Business): middleware/headerValidator, modules/v1/<Name>/route, modules/v1/<Name>/<name>_model, document/v1/swagger_doc.json
35
+
36
+ **NodeJS Wave 5** (Orchestration): modules/v1/route_manager, app.js/ts
37
+
38
+ **NodeJS Wave 6** (Docker): Dockerfile, .dockerignore
39
+
40
+ ## /codeninja:api — Key Steps
41
+ 1. Review existing modules (Phase 0)
42
+ 2. ask-target-service → ask-api-version → ask-module-name → ask-http-method → ask-route-path → ask-route-description
43
+ 3. ask-primary-table → ask-requires-auth
44
+ 4. Confirm → generate route.js/ts + _model.js/ts + append route_manager + patch swagger
45
+
46
+ ## /codeninja:db:create — Key Steps
47
+ 1. ask-table-purpose → ask-table-name → ask-table-file-number
48
+ 2. ask-table-needs-status → ask-table-needs-soft-delete
49
+ 3. Column loop: ask-column-name → ask-column-type → ask-column-is-enum → repeat until done
50
+ 4. ask-table-indexes
51
+ 5. ask-table-seed-data → if yes: collect-seed-data
52
+ 6. show-db-table-summary → confirm → generate SQL file + update create-schema.sql
53
+ 7. If orm=prisma: also append model to prisma/schema.prisma + `npx prisma generate`