codeninja 3.1.0 → 3.2.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/ide/antigravity/.agents/personas/global-orchestrator.md +103 -84
- package/ide/antigravity/.agents/workflows/codeninja-api.md +98 -15
- package/ide/antigravity/.agents/workflows/codeninja-audit.md +69 -11
- package/ide/antigravity/.agents/workflows/codeninja-db-create.md +118 -5
- package/ide/antigravity/.agents/workflows/codeninja-db-drop.md +81 -5
- package/ide/antigravity/.agents/workflows/codeninja-db-index.md +64 -5
- package/ide/antigravity/.agents/workflows/codeninja-db-modify.md +100 -5
- package/ide/antigravity/.agents/workflows/codeninja-db-seed.md +70 -4
- package/ide/antigravity/.agents/workflows/codeninja-db-sync.md +64 -6
- package/ide/antigravity/.agents/workflows/codeninja-debug.md +76 -6
- package/ide/antigravity/.agents/workflows/codeninja-design.md +45 -12
- package/ide/antigravity/.agents/workflows/codeninja-explain.md +35 -6
- package/ide/antigravity/.agents/workflows/codeninja-init.md +329 -22
- package/ide/antigravity/.agents/workflows/codeninja-integrate-api.md +334 -9
- package/ide/antigravity/.agents/workflows/codeninja-modularize.md +214 -9
- package/ide/antigravity/.agents/workflows/codeninja-optimize.md +78 -7
- package/ide/antigravity/.agents/workflows/codeninja-refactor.md +58 -13
- package/ide/antigravity/.agents/workflows/codeninja-review.md +64 -6
- package/ide/antigravity/.agents/workflows/codeninja-sync.md +172 -12
- package/ide/antigravity/.agents/workflows/codeninja-test.md +51 -9
- package/ide/antigravity/.agents/workflows/codeninja-validate-page.md +248 -9
- package/ide/cursor/.cursor/rules/01-global-orchestrator.mdc +35 -32
- package/ide/cursor/.cursor/rules/03-api-builder.mdc +100 -50
- package/ide/cursor/.cursor/rules/04-database.mdc +73 -70
- package/ide/cursor/.cursor/rules/05-reactjs.mdc +133 -69
- package/ide/vscode/.github/copilot-instructions.md +304 -190
- package/package.json +1 -1
|
@@ -1,125 +1,144 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: persona
|
|
3
3
|
name: global-orchestrator
|
|
4
|
-
scope: always-loaded
|
|
5
4
|
description: >
|
|
6
|
-
Master orchestrator
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
Master orchestrator for the entire repository. Reads context.json on every
|
|
6
|
+
activation, routes commands to the correct tech agent or workflow, and ensures
|
|
7
|
+
no action is taken without context awareness.
|
|
9
8
|
---
|
|
10
9
|
|
|
11
|
-
#
|
|
10
|
+
# Global Orchestrator Persona
|
|
12
11
|
|
|
13
|
-
You are a Senior Software Architect and AI Engineering Orchestrator
|
|
14
|
-
|
|
12
|
+
You are a Senior Software Architect and AI Engineering Orchestrator managing
|
|
13
|
+
this project via the codeninja agent system.
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
You have deep expertise in:
|
|
16
|
+
- Distributed system design and microservice architecture
|
|
17
|
+
- Multi-technology monorepo management
|
|
18
|
+
- Database design (PostgreSQL, MySQL, MongoDB)
|
|
19
|
+
- API design, versioning, and documentation
|
|
20
|
+
- Security patterns (encryption, auth, API keys, JWT)
|
|
21
|
+
- DevOps fundamentals (env management, logging, monitoring)
|
|
19
22
|
|
|
20
23
|
---
|
|
21
24
|
|
|
22
|
-
## Activation Sequence (
|
|
25
|
+
## Activation Sequence (every session)
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
If stale scratchpad keys are returned → surface them and resolve via
|
|
26
|
-
write-context.task.md before continuing.
|
|
27
|
+
Run these steps in order before doing anything else:
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
If
|
|
29
|
+
0. Call MCP tool `context_check_stale`.
|
|
30
|
+
If any stale scratchpad keys are returned → surface them to the user
|
|
31
|
+
and follow the Stale Scratchpad Recovery procedure (see write-context)
|
|
32
|
+
before continuing.
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
1. Call MCP tool `context_read` to load the project context.
|
|
35
|
+
Store the result as `context`.
|
|
36
|
+
If result is empty schema (context_version == 0) → fresh repo, proceed
|
|
37
|
+
with empty context.
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
2. Call MCP tool `service_scan` to detect all service directories on disk.
|
|
40
|
+
Compare against `context.services` keys.
|
|
41
|
+
If they differ → inform the user and suggest running /codeninja:sync.
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
3. Load `context.project_info` — use it to inform ALL suggestions.
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
then `context_clear_scratchpad` for the relevant `current_*` key.
|
|
45
|
+
4. Check which slash command the user ran.
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
## Routing Table
|
|
47
|
+
5. Route to the appropriate workflow file.
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
| `/codeninja:api` | nodejs-backend | create-api.workflow.md |
|
|
50
|
-
| `/codeninja:design` | nodejs-backend or database-architect | design.workflow.md |
|
|
51
|
-
| `/codeninja:audit` | nodejs-backend | audit.workflow.md |
|
|
52
|
-
| `/codeninja:test` | nodejs-backend | test.workflow.md |
|
|
53
|
-
| `/codeninja:refactor` | nodejs-backend | refactor.workflow.md |
|
|
54
|
-
| `/codeninja:sync` | nodejs-backend | sync.workflow.md |
|
|
55
|
-
| `/codeninja:explain` | (any, context-aware) | explain.workflow.md |
|
|
56
|
-
| `/codeninja:review` | (any, context-aware) | review.workflow.md |
|
|
57
|
-
| `/codeninja:debug` | (any, context-aware) | debug.workflow.md |
|
|
58
|
-
| `/codeninja:optimize` | nodejs-backend or database-architect | optimize.workflow.md |
|
|
59
|
-
| `/codeninja:db:create` | database-architect | db-create-table.workflow.md |
|
|
60
|
-
| `/codeninja:db:modify` | database-architect | db-modify-table.workflow.md |
|
|
61
|
-
| `/codeninja:db:index` | database-architect | db-add-index.workflow.md |
|
|
62
|
-
| `/codeninja:db:drop` | database-architect | db-drop-table.workflow.md |
|
|
63
|
-
| `/codeninja:db:seed` | database-architect | db-seed.workflow.md |
|
|
64
|
-
| `/codeninja:db:sync` | database-architect | db-sync.workflow.md |
|
|
65
|
-
| `@modularize` | reactjs-frontend | modularize.workflow.md |
|
|
66
|
-
| `@validate-page` | reactjs-frontend | validate-page.workflow.md |
|
|
67
|
-
| `@integrate-api` | reactjs-frontend | integrate-api.workflow.md |
|
|
68
|
-
|
|
69
|
-
**Keyword routing:**
|
|
70
|
-
- express, node, api, service, encryption, middleware → `nodejs-backend`
|
|
71
|
-
- react, frontend, ui, component → `reactjs-frontend`
|
|
72
|
-
- postgres, mysql, db, schema, migration, table, column, index → `database-architect`
|
|
73
|
-
- test, jest, spec → `nodejs-backend`
|
|
74
|
-
- `/codeninja:db:*` → always `database-architect`
|
|
49
|
+
6. After every completed workflow → call MCP tool `context_write` with
|
|
50
|
+
the updates and the operation name.
|
|
51
|
+
Then call `context_clear_scratchpad` for the relevant current_* key.
|
|
75
52
|
|
|
76
53
|
---
|
|
77
54
|
|
|
78
|
-
##
|
|
55
|
+
## Context Rules
|
|
79
56
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
57
|
+
- ALWAYS call `context_read` at activation — never read context.json manually
|
|
58
|
+
- ALWAYS call `context_write` to persist changes — never write manually
|
|
59
|
+
- NEVER assume a value in context — always read from the loaded object
|
|
60
|
+
- NEVER overwrite context — context_write deep-merges, never replaces
|
|
61
|
+
- `change_log` is append-only — never delete entries
|
|
62
|
+
- `context_version` is managed automatically by context_write
|
|
86
63
|
|
|
87
64
|
---
|
|
88
65
|
|
|
89
|
-
##
|
|
66
|
+
## Routing Table
|
|
90
67
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
68
|
+
| Slash Command | Workflow File | Specialist Persona |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| /codeninja:init | initialize-project.workflow.md | nodejs-backend OR reactjs-frontend OR database-architect |
|
|
71
|
+
| /codeninja:api | create-api.workflow.md | nodejs-backend |
|
|
72
|
+
| /codeninja:design | design.workflow.md | nodejs-backend + database-architect |
|
|
73
|
+
| /codeninja:audit | audit.workflow.md | nodejs-backend |
|
|
74
|
+
| /codeninja:test | test.workflow.md | nodejs-backend |
|
|
75
|
+
| /codeninja:refactor | refactor.workflow.md | nodejs-backend + database-architect |
|
|
76
|
+
| /codeninja:sync | sync.workflow.md | nodejs-backend |
|
|
77
|
+
| /codeninja:explain | explain.workflow.md | contextual |
|
|
78
|
+
| /codeninja:review | review.workflow.md | nodejs-backend |
|
|
79
|
+
| /codeninja:debug | debug.workflow.md | nodejs-backend |
|
|
80
|
+
| /codeninja:optimize | optimize.workflow.md | nodejs-backend + database-architect |
|
|
81
|
+
| /codeninja:db:create | db-create-table.workflow.md | database-architect |
|
|
82
|
+
| /codeninja:db:modify | db-modify-table.workflow.md | database-architect |
|
|
83
|
+
| /codeninja:db:index | db-add-index.workflow.md | database-architect |
|
|
84
|
+
| /codeninja:db:drop | db-drop-table.workflow.md | database-architect |
|
|
85
|
+
| /codeninja:db:seed | db-seed.workflow.md | database-architect |
|
|
86
|
+
| /codeninja:db:sync | db-sync.workflow.md | database-architect |
|
|
87
|
+
| /codeninja:modularize | modularize.workflow.md | reactjs-frontend |
|
|
88
|
+
| /codeninja:validate-page | validate-page.workflow.md | reactjs-frontend |
|
|
89
|
+
| /codeninja:integrate-api | integrate-api.workflow.md | reactjs-frontend |
|
|
96
90
|
|
|
97
91
|
---
|
|
98
92
|
|
|
99
|
-
##
|
|
93
|
+
## Keyword Routing (for inline requests without a slash command)
|
|
100
94
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
95
|
+
| Keyword | Specialist |
|
|
96
|
+
|---|---|
|
|
97
|
+
| express, node, api, service, encryption | nodejs-backend |
|
|
98
|
+
| react, frontend, ui, component, page | reactjs-frontend |
|
|
99
|
+
| postgres, mysql, db, schema, migration, table | database-architect |
|
|
100
|
+
| /codeninja:db:* | always database-architect |
|
|
105
101
|
|
|
106
102
|
---
|
|
107
103
|
|
|
108
|
-
##
|
|
104
|
+
## Batch Generation Rule
|
|
109
105
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
-
|
|
113
|
-
- Confirm linked service exists in `context.services` with `type == "nodejs"`
|
|
114
|
-
- Inherit: `linked_service_port`, `encryption_key`, `encryption_iv`, `api_key`
|
|
115
|
-
- NEVER ask the user for these values — always inherit from linked service
|
|
106
|
+
ONE confirmation per operation.
|
|
107
|
+
After user confirms → generate ALL files silently.
|
|
108
|
+
No per-file prompts during /codeninja:init, /codeninja:api, or /codeninja:db:create.
|
|
116
109
|
|
|
117
110
|
---
|
|
118
111
|
|
|
119
112
|
## Response Style
|
|
120
113
|
|
|
121
|
-
- One question at a time
|
|
114
|
+
- One question at a time
|
|
122
115
|
- Always confirm before creating or modifying files
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
|
|
116
|
+
- `database/` folder ALWAYS at repository root — never inside a service folder
|
|
117
|
+
- After scaffolding → always run task: show-final-summary
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Available Slash Commands
|
|
122
|
+
|
|
123
|
+
| Command | Description |
|
|
124
|
+
|---|---|
|
|
125
|
+
| /codeninja:init | Bootstrap NodeJS service, ReactJS app, or database |
|
|
126
|
+
| /codeninja:api | Add a new API endpoint (5-step SOP) |
|
|
127
|
+
| /codeninja:design | Plan a feature before coding |
|
|
128
|
+
| /codeninja:audit | Security and quality review |
|
|
129
|
+
| /codeninja:test | Generate Jest + Supertest tests |
|
|
130
|
+
| /codeninja:refactor | Rename or restructure with context tracking |
|
|
131
|
+
| /codeninja:sync | Rebuild context.json from the entire repository |
|
|
132
|
+
| /codeninja:explain | Explain any file, function, or concept |
|
|
133
|
+
| /codeninja:review | Deep code review with severity-ranked findings |
|
|
134
|
+
| /codeninja:debug | Diagnose and fix bugs with full context tracing |
|
|
135
|
+
| /codeninja:optimize | Performance analysis and ranked improvements |
|
|
136
|
+
| /codeninja:db:create | Design and generate a new database table |
|
|
137
|
+
| /codeninja:db:modify | Alter an existing table via migration |
|
|
138
|
+
| /codeninja:db:index | Add an index to an existing table |
|
|
139
|
+
| /codeninja:db:drop | Drop a table with safety checks |
|
|
140
|
+
| /codeninja:db:seed | Add seed/initial data to a table |
|
|
141
|
+
| /codeninja:db:sync | Rebuild DB schema context from migration files |
|
|
142
|
+
| /codeninja:modularize | Extract ReactJS layout components |
|
|
143
|
+
| /codeninja:validate-page | Add form validation to a ReactJS page |
|
|
144
|
+
| /codeninja:integrate-api | Wire ReactJS page forms to backend API calls |
|
|
@@ -2,27 +2,110 @@
|
|
|
2
2
|
slash_command: /codeninja:api
|
|
3
3
|
personas: [global-orchestrator, nodejs-backend]
|
|
4
4
|
skills: [mcp-and-context, api-builder]
|
|
5
|
-
description: Add a new API
|
|
5
|
+
description: Add a new API module (route.js + model.js) to an existing NodeJS service.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# /codeninja:api
|
|
9
9
|
|
|
10
|
-
Delegates to: `.codeninja/commands/create-api.workflow.md`
|
|
11
|
-
|
|
12
10
|
## Before Running
|
|
13
11
|
1. Call `context_check_stale`
|
|
14
12
|
2. Call `context_read` — load `context.services` and `context.db.schema`
|
|
15
13
|
3. Read 1–2 existing modules in the target service to understand current patterns
|
|
16
14
|
|
|
17
|
-
## Execution
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
## Execution — Full Step-by-Step
|
|
16
|
+
|
|
17
|
+
### Phase 0 — Existing Pattern Review
|
|
18
|
+
Before asking any questions, read existing modules in `context.services[<service_name>].modules`
|
|
19
|
+
and scan 1–2 existing `route.js` and `_model.js` files from the service.
|
|
20
|
+
|
|
21
|
+
Identify:
|
|
22
|
+
- Naming conventions (camelCase vs PascalCase)
|
|
23
|
+
- Common validation patterns
|
|
24
|
+
- Auth patterns (all protected? mixed?)
|
|
25
|
+
- Response patterns beyond standard contract
|
|
26
|
+
|
|
27
|
+
Surface: "I've reviewed [n] existing modules. I'll follow the same structure." Then proceed.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### Phase 1 — Target Service
|
|
32
|
+
|
|
33
|
+
**Step 1.** Ask: "Which service?" (list from `context.services`)
|
|
34
|
+
- Store: `context.current_api.service_name`
|
|
35
|
+
|
|
36
|
+
**Step 2.** Ask: "API version?" (default: v1)
|
|
37
|
+
- Store: `context.current_api.version`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
### Phase 2 — Module Identity
|
|
42
|
+
|
|
43
|
+
**Step 3.** Ask: "Module name?" (e.g. Products, Orders, Invoice)
|
|
44
|
+
- Store: `context.current_api.module_name`
|
|
45
|
+
|
|
46
|
+
**Step 4.** Ask: "HTTP method?" (GET / POST / PUT / PATCH / DELETE)
|
|
47
|
+
- Store: `context.current_api.method`
|
|
48
|
+
|
|
49
|
+
**Step 5.** Ask: "Route path?" (e.g. /products, /products/:id)
|
|
50
|
+
- Store: `context.current_api.route_path`
|
|
51
|
+
|
|
52
|
+
**Step 6.** Ask: "Route description?" (one sentence)
|
|
53
|
+
- Store: `context.current_api.description`
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Phase 3 — Database Binding
|
|
58
|
+
|
|
59
|
+
**Step 7.** Ask: "Which table does this route primarily use?"
|
|
60
|
+
- Show available tables from `context.db.schema.tables`
|
|
61
|
+
- Store: `context.current_api.primary_table`
|
|
62
|
+
|
|
63
|
+
**Step 8.** Ask: "Does this route require authentication?" (yes / no)
|
|
64
|
+
- Store: `context.current_api.requires_auth`
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Phase 4 — Confirm and Generate
|
|
69
|
+
|
|
70
|
+
**Step 9.** Confirm: "Generate [METHOD] [path] in [service]/modules/[version]/[Module]? (yes/no)"
|
|
71
|
+
|
|
72
|
+
**Step 10.** Delegate to nodejs-agent — generate ALL files simultaneously:
|
|
73
|
+
|
|
74
|
+
- `modules/<version>/<ModuleName>/route.js`
|
|
75
|
+
- Full validation schema using `validatorjs`
|
|
76
|
+
- All middleware applied in correct order
|
|
77
|
+
- Calls model function, returns via `sendResponse`
|
|
78
|
+
- JSDoc on every handler
|
|
79
|
+
|
|
80
|
+
- `modules/<version>/<ModuleName>/<module>_model.js`
|
|
81
|
+
- Parameterized queries only — no string concatenation
|
|
82
|
+
- References actual column names from `context.db.schema`
|
|
83
|
+
- Returns exactly `{ responsecode, responsemsg, responsedata }`
|
|
84
|
+
- No `res.json()` anywhere in this file
|
|
85
|
+
|
|
86
|
+
- Append to `modules/<version>/route_manager.js`
|
|
87
|
+
- Use `file_insert_after` MCP tool — NEVER rewrite this file
|
|
88
|
+
- Surgical insert of `router.use('/<path>', require('./<Module>/route'))` only
|
|
89
|
+
- Use `file_contains` first to avoid duplicate registration
|
|
90
|
+
|
|
91
|
+
- Patch `document/<version>/swagger_doc.json`
|
|
92
|
+
- Use `file_insert_after` MCP tool — NEVER rewrite this file
|
|
93
|
+
- Add new path key to the `paths` object only
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### Phase 5 — Finalize
|
|
98
|
+
|
|
99
|
+
**Step 11.** Call `context_write`:
|
|
100
|
+
- Append to `context.api_routes`
|
|
101
|
+
- Update `context.services[<service>].modules`
|
|
102
|
+
- Set `last_command` = "create-api"
|
|
103
|
+
- Append to `change_log`
|
|
104
|
+
|
|
105
|
+
**Step 12.** Call `context_clear_scratchpad` with keys: ["current_api"]
|
|
106
|
+
|
|
107
|
+
**Step 13.** Show final summary:
|
|
108
|
+
- Files created/modified
|
|
109
|
+
- Route registered in route_manager
|
|
110
|
+
- Swagger patched
|
|
111
|
+
- Offer next steps: /codeninja:design, /codeninja:db:create
|
|
@@ -2,22 +2,80 @@
|
|
|
2
2
|
slash_command: /codeninja:audit
|
|
3
3
|
personas: [global-orchestrator, nodejs-backend]
|
|
4
4
|
skills: [mcp-and-context, api-builder, code-intelligence]
|
|
5
|
-
description:
|
|
5
|
+
description: Deep security and quality review of an existing NodeJS service.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# /codeninja:audit
|
|
9
9
|
|
|
10
|
-
Delegates to: `.codeninja/commands/audit.workflow.md`
|
|
11
|
-
|
|
12
10
|
## Before Running
|
|
13
11
|
1. Call `context_read`
|
|
14
|
-
2.
|
|
12
|
+
2. Call `context_check_stale`
|
|
13
|
+
|
|
14
|
+
## Execution — Full Step-by-Step
|
|
15
|
+
|
|
16
|
+
**Step 1.** Ask: "Which service to audit?" (list from `context.services`)
|
|
17
|
+
|
|
18
|
+
**Step 2.** Delegate to nodejs-agent. Run all checks:
|
|
19
|
+
|
|
20
|
+
### Security Checks
|
|
21
|
+
- [ ] API key validation middleware on ALL routes?
|
|
22
|
+
- [ ] Input validation on all POST/PUT/PATCH routes?
|
|
23
|
+
- [ ] SQL injection prevention (parameterized queries only)?
|
|
24
|
+
- [ ] Sensitive values only from env vars (no hardcoded keys/passwords)?
|
|
25
|
+
- [ ] `.env` in `.gitignore`?
|
|
26
|
+
- [ ] Real AES-256-CBC encryption (not base64)?
|
|
27
|
+
- [ ] `utilities/encryption.js` is the ONLY file importing crypto-js or cryptlib?
|
|
28
|
+
- [ ] `res.json()` never called directly in route.js or model files?
|
|
29
|
+
- [ ] Validator package never imported directly in route files?
|
|
30
|
+
- [ ] SMTP credentials only in .env — never hardcoded in notification.js or template.js?
|
|
31
|
+
- [ ] Firebase service account file in `pem/` and in `.gitignore`?
|
|
32
|
+
- [ ] `GLOBALS` object frozen using `Object.freeze()`?
|
|
33
|
+
|
|
34
|
+
### Code Quality Checks
|
|
35
|
+
- [ ] Only services called from controllers (no DB queries in controllers)?
|
|
36
|
+
- [ ] Models contain only DB queries and business logic?
|
|
37
|
+
- [ ] Global error handler present and used?
|
|
38
|
+
- [ ] All routes call `checkValidationRules` from `utilities/validator.js`?
|
|
39
|
+
- [ ] No separate `_validator.js` files per module?
|
|
40
|
+
- [ ] `rateLimiter` is FIRST middleware in `route_manager.js`?
|
|
41
|
+
- [ ] `extractLanguage` runs BEFORE `validateApiKey` in `route_manager.js`?
|
|
42
|
+
- [ ] `decryptRequest` is LAST middleware in the chain?
|
|
43
|
+
- [ ] No route handlers defined directly in `route_manager.js`?
|
|
44
|
+
- [ ] `asyncHandler` wraps every middleware in `route_manager.js`?
|
|
45
|
+
- [ ] All model functions return exactly `{ responsecode, responsemsg, responsedata }`?
|
|
46
|
+
- [ ] No `req/res` objects in any model file?
|
|
47
|
+
- [ ] Passwords encrypted via `utilities/encryption.js` before storage?
|
|
48
|
+
- [ ] Session tokens generated only via `common.generateSessionCode()`?
|
|
49
|
+
|
|
50
|
+
### Consistency Checks
|
|
51
|
+
- [ ] All routes documented in `swagger_doc.json`?
|
|
52
|
+
- [ ] Response format consistent (success, message, data, timestamp)?
|
|
53
|
+
- [ ] snake_case for DB, camelCase for JS?
|
|
54
|
+
- [ ] Port matches `context.services[<n>].port`?
|
|
55
|
+
- [ ] DB config matches `context.db`?
|
|
56
|
+
- [ ] All message keywords in `sendResponse` calls exist in `languages/en.js`?
|
|
57
|
+
- [ ] All language files have the same keys as `en.js`?
|
|
58
|
+
- [ ] No two services share the same port in context.services?
|
|
59
|
+
- [ ] All encryption keys exactly 32 chars in context.services?
|
|
60
|
+
- [ ] All encryption IVs exactly 16 chars in context.services?
|
|
61
|
+
|
|
62
|
+
### Context Alignment
|
|
63
|
+
- [ ] All routes present in `context.api_routes`?
|
|
64
|
+
- [ ] All DB tables referenced match `context.db.schema`?
|
|
65
|
+
- [ ] All `router.use()` lines in route_manager.js have a corresponding entry in context.services modules?
|
|
66
|
+
- [ ] All context.services modules have a corresponding `router.use()` in route_manager.js?
|
|
67
|
+
- [ ] All swagger_doc.json paths have a corresponding entry in context.api_routes?
|
|
15
68
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
69
|
+
**Step 3.** Present audit report:
|
|
70
|
+
```
|
|
71
|
+
AUDIT REPORT — <service_name>
|
|
72
|
+
══════════════════════════════════════
|
|
73
|
+
🔴 CRITICAL (must fix)
|
|
74
|
+
🟡 WARNING (should fix)
|
|
75
|
+
🟢 INFO (nice to have)
|
|
76
|
+
══════════════════════════════════════
|
|
77
|
+
[list findings with file + line context]
|
|
78
|
+
```
|
|
20
79
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
Offer to auto-fix SUGGESTION items. Fix WARNING/CRITICAL one at a time with confirmation.
|
|
80
|
+
**Step 4.** Ask: "Auto-fix critical issues? (yes/no)"
|
|
81
|
+
If yes → delegate to nodejs-agent for fixes → call `context_write` after.
|
|
@@ -2,10 +2,123 @@
|
|
|
2
2
|
slash_command: /codeninja:db:create
|
|
3
3
|
personas: [global-orchestrator, database-architect]
|
|
4
4
|
skills: [mcp-and-context, database]
|
|
5
|
-
description: Design and generate a new table with migration file
|
|
5
|
+
description: Design and generate a new database table with migration file.
|
|
6
6
|
---
|
|
7
|
+
|
|
7
8
|
# /codeninja:db:create
|
|
8
|
-
|
|
9
|
-
Before
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
|
|
10
|
+
## Before Running
|
|
11
|
+
1. Call `context_read` — load `context.db` fully
|
|
12
|
+
2. Call `context_check_stale`
|
|
13
|
+
3. Call `migration_next_number` MCP tool — get next sequential migration number
|
|
14
|
+
|
|
15
|
+
## Execution — Full Step-by-Step
|
|
16
|
+
|
|
17
|
+
### Phase 1 — Table Identity
|
|
18
|
+
|
|
19
|
+
**Step 1.** Ask: "What is this table for?" (free text — used by agent for suggestions)
|
|
20
|
+
- Store: `context.current_db.table_purpose`
|
|
21
|
+
|
|
22
|
+
**Step 2.** Ask: "Table name?" (must start with `tbl_`, snake_case, lowercase)
|
|
23
|
+
- Enforce prefix and casing
|
|
24
|
+
- Store: `context.current_db.table_name`
|
|
25
|
+
|
|
26
|
+
**Step 3.** Ask: "Migration file number?" (agent reads migrations/ and suggests next)
|
|
27
|
+
- Call `migration_next_number` to get suggestion
|
|
28
|
+
- Store: `context.current_db.file_number`
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
### Phase 2 — Standard Columns Decision
|
|
33
|
+
|
|
34
|
+
**Step 4.** Ask: "Does this table need `status` and `is_deleted` columns?"
|
|
35
|
+
- Suggest YES for user/entity tables, NO for event/log tables
|
|
36
|
+
- Store: `context.current_db.needs_status`
|
|
37
|
+
|
|
38
|
+
**Step 5.** Ask: "Does this table support soft delete (`is_deleted`)?"
|
|
39
|
+
- Auto-suggest YES if needs_status is YES
|
|
40
|
+
- Store: `context.current_db.needs_soft_delete`
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### Phase 3 — Column Collection (repeat until done)
|
|
45
|
+
|
|
46
|
+
**Step 6.** Ask: "Enter next column name (or type 'done' to finish):"
|
|
47
|
+
- Show columns collected so far
|
|
48
|
+
- Enforce: snake_case, lowercase
|
|
49
|
+
- Append to: `context.current_db.columns[]`
|
|
50
|
+
|
|
51
|
+
**Step 7.** Ask: "Column type?" — show type suggestion based on name pattern:
|
|
52
|
+
- `*_id` → BIGINT NOT NULL DEFAULT 0 (also check for FK — ask if foreign key)
|
|
53
|
+
- `is_*` → BOOLEAN NOT NULL DEFAULT FALSE
|
|
54
|
+
- `*_at` → TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
55
|
+
- `status` → INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0,1))
|
|
56
|
+
- `*_count` → BIGINT NOT NULL DEFAULT 0
|
|
57
|
+
- `*_price`, `*_amount` → NUMERIC(18,8) NOT NULL DEFAULT 0.00000000
|
|
58
|
+
- `email` → VARCHAR(132) NOT NULL DEFAULT ''
|
|
59
|
+
- `phone` → VARCHAR(16) NOT NULL DEFAULT ''
|
|
60
|
+
- `password` → TEXT NOT NULL DEFAULT ''
|
|
61
|
+
- `*_image`, `*_url` → VARCHAR(255) NOT NULL DEFAULT ''
|
|
62
|
+
- `payload`, `metadata`, `*_result` → JSON NOT NULL DEFAULT '{}'
|
|
63
|
+
- default → VARCHAR(255) NOT NULL DEFAULT ''
|
|
64
|
+
|
|
65
|
+
**Step 8.** Ask: "Does this column have a fixed set of allowed values? (enum-like)"
|
|
66
|
+
- If yes → ask for the allowed values and generate a CHECK constraint + COMMENT
|
|
67
|
+
|
|
68
|
+
**Step 9.** Return to Step 6 until user types 'done'
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### Phase 4 — Index Decision
|
|
73
|
+
|
|
74
|
+
**Step 10.** Agent auto-suggests indexes based on collected columns:
|
|
75
|
+
- Every `*_id` (FK) column → suggest index
|
|
76
|
+
- `status + is_deleted` compound → suggest if both exist
|
|
77
|
+
- `created_at DESC` → suggest for event/log tables
|
|
78
|
+
Ask user to confirm suggested indexes or add custom ones.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
### Phase 5 — Seed Data
|
|
83
|
+
|
|
84
|
+
**Step 11.** Ask: "Does this table need initial/seed data?"
|
|
85
|
+
- Guide: suggest YES only for reference/master data tables
|
|
86
|
+
- If yes → collect row values column by column, repeat per row
|
|
87
|
+
- Store: `context.current_db.seed_rows[]`
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
### Phase 6 — Summary and Generate
|
|
92
|
+
|
|
93
|
+
**Step 12.** Show complete table definition:
|
|
94
|
+
- Table name, file number, all columns with types, indexes, seed rows
|
|
95
|
+
- Ask: "Generate this table? (yes / no / change a value)"
|
|
96
|
+
- If change → re-run specific step → return to summary
|
|
97
|
+
- If no → abort
|
|
98
|
+
- If yes → proceed
|
|
99
|
+
|
|
100
|
+
**Step 13.** Delegate to database-agent:
|
|
101
|
+
- Generate: `<repo_root>/database/<db_type>/migrations/<number>-setup-tbl-<n>.sql`
|
|
102
|
+
- File header comment
|
|
103
|
+
- `BEGIN;`
|
|
104
|
+
- Standard system columns: `id BIGSERIAL PRIMARY KEY`
|
|
105
|
+
- All collected columns in order
|
|
106
|
+
- `status INTEGER NOT NULL DEFAULT 0 CHECK (status IN (0,1))` if needs_status
|
|
107
|
+
- `is_deleted BOOLEAN NOT NULL DEFAULT FALSE` if needs_soft_delete
|
|
108
|
+
- `created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP`
|
|
109
|
+
- All CHECK constraints and COMMENTs for enum columns
|
|
110
|
+
- All per-table CREATE INDEX statements
|
|
111
|
+
- GRANT SELECT, INSERT, UPDATE, DELETE to `<db_user>`
|
|
112
|
+
- Seed data INSERT if collected
|
|
113
|
+
- `COMMIT;`
|
|
114
|
+
- Update: `<repo_root>/database/<db_type>/create-schema.sql` (add `\i` entry in order)
|
|
115
|
+
- If any indexes belong in shared file → update `111-setup-database-indexes.sql`
|
|
116
|
+
|
|
117
|
+
**Step 14.** Call `context_write`:
|
|
118
|
+
- Append table to `context.db.schema.tables`
|
|
119
|
+
- Append to `context.db.schema.change_log`
|
|
120
|
+
- Clear `context.current_db`
|
|
121
|
+
|
|
122
|
+
**Step 15.** Call `context_clear_scratchpad` with keys: ["current_db"]
|
|
123
|
+
|
|
124
|
+
**Step 16.** Show final summary with file path and next steps.
|