codeninja 3.2.0 → 4.0.1
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/README.md +15 -4
- package/agent/database-agent.md +24 -1
- package/agent/nodejs-agent.md +79 -0
- package/cli.js +27 -7
- package/commands/audit.workflow.md +4 -1
- package/commands/db-create-table.workflow.md +1 -1
- package/commands/initialize-project.workflow.md +21 -0
- package/ide/antigravity/.agents/personas/database-architect.md +431 -153
- package/ide/antigravity/.agents/personas/global-orchestrator.md +202 -85
- package/ide/antigravity/.agents/personas/nodejs-backend.md +368 -133
- package/ide/antigravity/.agents/personas/reactjs-frontend.md +182 -101
- package/ide/antigravity/.agents/skills/api-builder/SKILL.md +58 -0
- package/ide/antigravity/.agents/skills/code-intelligence/SKILL.md +22 -0
- package/ide/antigravity/.agents/skills/database/SKILL.md +32 -0
- package/ide/antigravity/.agents/skills/mcp-and-context/SKILL.md +76 -82
- package/ide/antigravity/.agents/skills/reactjs/SKILL.md +36 -0
- package/ide/antigravity/.agents/workflows/codeninja-api.md +76 -83
- package/ide/antigravity/.agents/workflows/codeninja-audit.md +82 -44
- package/ide/antigravity/.agents/workflows/codeninja-db-create.md +107 -94
- package/ide/antigravity/.agents/workflows/codeninja-db-drop.md +89 -67
- package/ide/antigravity/.agents/workflows/codeninja-db-index.md +86 -54
- package/ide/antigravity/.agents/workflows/codeninja-db-modify.md +126 -68
- package/ide/antigravity/.agents/workflows/codeninja-db-seed.md +87 -59
- package/ide/antigravity/.agents/workflows/codeninja-db-sync.md +77 -41
- package/ide/antigravity/.agents/workflows/codeninja-debug.md +35 -21
- package/ide/antigravity/.agents/workflows/codeninja-design.md +49 -35
- package/ide/antigravity/.agents/workflows/codeninja-explain.md +41 -20
- package/ide/antigravity/.agents/workflows/codeninja-init.md +479 -289
- package/ide/antigravity/.agents/workflows/codeninja-integrate-api.md +253 -136
- package/ide/antigravity/.agents/workflows/codeninja-modularize.md +250 -132
- package/ide/antigravity/.agents/workflows/codeninja-optimize.md +71 -29
- package/ide/antigravity/.agents/workflows/codeninja-refactor.md +50 -42
- package/ide/antigravity/.agents/workflows/codeninja-review.md +38 -21
- package/ide/antigravity/.agents/workflows/codeninja-sync.md +922 -141
- package/ide/antigravity/.agents/workflows/codeninja-test.md +34 -49
- package/ide/antigravity/.agents/workflows/codeninja-validate-page.md +449 -151
- package/ide/claude-code/.claude/CLAUDE.md +99 -0
- package/ide/claude-code/.claude/agents/database-agent.md +535 -0
- package/ide/claude-code/.claude/agents/nodejs-agent.md +493 -0
- package/ide/claude-code/.claude/agents/reactjs-agent.md +267 -0
- package/ide/claude-code/.claude/commands/codeninja-api.md +104 -0
- package/ide/claude-code/.claude/commands/codeninja-audit.md +119 -0
- package/ide/claude-code/.claude/commands/codeninja-db-create.md +138 -0
- package/ide/claude-code/.claude/commands/codeninja-db-drop.md +109 -0
- package/ide/claude-code/.claude/commands/codeninja-db-index.md +103 -0
- package/ide/claude-code/.claude/commands/codeninja-db-modify.md +165 -0
- package/ide/claude-code/.claude/commands/codeninja-db-seed.md +104 -0
- package/ide/claude-code/.claude/commands/codeninja-db-sync.md +106 -0
- package/ide/claude-code/.claude/commands/codeninja-debug.md +99 -0
- package/ide/claude-code/.claude/commands/codeninja-design.md +68 -0
- package/ide/claude-code/.claude/commands/codeninja-explain.md +61 -0
- package/ide/claude-code/.claude/commands/codeninja-init.md +529 -0
- package/ide/claude-code/.claude/commands/codeninja-integrate-api.md +453 -0
- package/ide/claude-code/.claude/commands/codeninja-modularize.md +334 -0
- package/ide/claude-code/.claude/commands/codeninja-optimize.md +129 -0
- package/ide/claude-code/.claude/commands/codeninja-refactor.md +76 -0
- package/ide/claude-code/.claude/commands/codeninja-review.md +87 -0
- package/ide/claude-code/.claude/commands/codeninja-sync.md +964 -0
- package/ide/claude-code/.claude/commands/codeninja-test.md +45 -0
- package/ide/claude-code/.claude/commands/codeninja-validate-page.md +548 -0
- package/ide/cursor/.cursor/rules/01-global-orchestrator.mdc +12 -13
- package/ide/cursor/.cursor/rules/02-mcp-and-context.mdc +47 -31
- package/ide/cursor/.cursor/rules/03-api-builder.mdc +32 -110
- package/ide/cursor/.cursor/rules/04-nodejs-generation.mdc +58 -0
- package/ide/cursor/.cursor/rules/05-database.mdc +54 -0
- package/ide/cursor/.cursor/rules/06-reactjs.mdc +36 -0
- package/ide/cursor/.cursor/rules/07-reactjs-generation.mdc +49 -0
- package/ide/cursor/.cursor/rules/08-code-intelligence.mdc +56 -0
- package/ide/cursor/.cursor/rules/09-workflow-steps.mdc +53 -0
- package/ide/vscode/.github/copilot-instructions.md +67 -382
- package/ide/vscode/.vscode/instructions/code-intelligence.instructions.md +58 -0
- package/ide/vscode/.vscode/instructions/database.instructions.md +55 -0
- package/ide/vscode/.vscode/instructions/nodejs.instructions.md +77 -0
- package/ide/vscode/.vscode/instructions/reactjs.instructions.md +42 -0
- package/package.json +2 -2
- package/tasks/ask-hashing-library.task.md +31 -0
- package/tasks/ask-language-type.task.md +26 -0
- package/tasks/ask-new-module-name.task.md +13 -0
- package/tasks/ask-new-service-name.task.md +13 -0
- package/tasks/ask-old-module-name.task.md +15 -0
- package/tasks/ask-old-service-name.task.md +13 -0
- package/tasks/ask-orm-type.task.md +26 -0
- package/tasks/collect-seed-data.task.md +19 -0
- package/tasks/generate-app.task.md +42 -0
- package/tasks/generate-common.task.md +13 -0
- package/tasks/generate-constants.task.md +13 -0
- package/tasks/generate-database.task.md +32 -0
- package/tasks/generate-encryption.task.md +28 -0
- package/tasks/generate-fast-defaults.task.md +7 -0
- package/tasks/generate-hashing.task.md +180 -0
- package/tasks/generate-headerValidator.task.md +13 -0
- package/tasks/generate-ioRedis.task.md +20 -0
- package/tasks/generate-language-en.task.md +12 -0
- package/tasks/generate-logging.task.md +12 -0
- package/tasks/generate-model.task.md +74 -6
- package/tasks/generate-notification.task.md +12 -0
- package/tasks/generate-package-json.task.md +69 -0
- package/tasks/generate-prisma-client.task.md +56 -0
- package/tasks/generate-prisma-schema.task.md +71 -0
- package/tasks/generate-rateLimiter.task.md +20 -0
- package/tasks/generate-readme.task.md +24 -0
- package/tasks/generate-response.task.md +27 -0
- package/tasks/generate-route-manager.task.md +32 -0
- package/tasks/generate-route.task.md +37 -0
- package/tasks/generate-swagger.task.md +8 -0
- package/tasks/generate-template.task.md +12 -0
- package/tasks/generate-tsconfig.task.md +38 -0
- package/tasks/generate-validator.task.md +31 -0
- package/ide/cursor/.cursor/rules/04-database.mdc +0 -90
- package/ide/cursor/.cursor/rules/05-reactjs.mdc +0 -147
- package/ide/cursor/.cursor/rules/06-code-intelligence.mdc +0 -112
|
@@ -1,106 +1,164 @@
|
|
|
1
|
+
This workflow runs when user invokes /codeninja:db:modify
|
|
2
|
+
|
|
1
3
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description:
|
|
4
|
+
type: workflow
|
|
5
|
+
name: db-modify-table
|
|
6
|
+
command: "@db:modify-table"
|
|
7
|
+
description: >
|
|
8
|
+
Modify an existing table via a numbered ALTER migration file. Supports
|
|
9
|
+
adding columns, renaming columns, dropping columns, changing types,
|
|
10
|
+
and adding check constraints. Always generates a migration file and
|
|
11
|
+
updates context.
|
|
6
12
|
---
|
|
7
13
|
|
|
8
|
-
#
|
|
14
|
+
# Workflow: @db:modify-table
|
|
9
15
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
## Goal
|
|
17
|
+
Generate a properly numbered ALTER TABLE migration file that modifies an
|
|
18
|
+
existing table. Record the change in context.db.schema.change_log so all
|
|
19
|
+
agents have the updated schema.
|
|
14
20
|
|
|
15
|
-
##
|
|
21
|
+
## Rules
|
|
22
|
+
- ALWAYS generate an ALTER file — never edit the original table setup file
|
|
23
|
+
- ALTER files are numbered sequentially after the last existing file
|
|
24
|
+
- Every change is recorded in context.db.schema.change_log
|
|
25
|
+
- create-schema.sql is updated after every ALTER file generated
|
|
16
26
|
|
|
17
|
-
|
|
27
|
+
---
|
|
18
28
|
|
|
19
|
-
|
|
20
|
-
- Store: `context.current_db.table_name`
|
|
29
|
+
## Step-by-Step Execution
|
|
21
30
|
|
|
22
|
-
|
|
23
|
-
1.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
31
|
+
### Phase 1 — Target
|
|
32
|
+
1. Run task: `ask-table-name`
|
|
33
|
+
- List tables from `context.db.schema.tables`
|
|
34
|
+
- Stores: `context.current_db.table_name`
|
|
35
|
+
|
|
36
|
+
2. Run task: `ask-modify-operation`
|
|
37
|
+
- Ask: "What do you want to do?"
|
|
38
|
+
- Options:
|
|
39
|
+
1. Add a new column
|
|
40
|
+
2. Rename a column
|
|
41
|
+
3. Drop a column
|
|
42
|
+
4. Change a column type
|
|
43
|
+
5. Add a CHECK constraint to an existing column
|
|
44
|
+
6. Add a new index
|
|
45
|
+
- Stores: `context.current_db.modify_operation`
|
|
46
|
+
|
|
47
|
+
2b. If `context.current_db.modify_operation == "add_index"`:
|
|
48
|
+
→ Immediately route to `@db:add-index` workflow.
|
|
49
|
+
→ End this workflow (no further steps needed).
|
|
30
50
|
|
|
31
51
|
---
|
|
32
52
|
|
|
33
|
-
### Phase 2 — Operation
|
|
53
|
+
### Phase 2 — Operation-Specific Collection
|
|
34
54
|
|
|
35
55
|
#### If "Add a new column":
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
56
|
+
3. Run task: `ask-column-name`
|
|
57
|
+
4. Run task: `ask-column-type`
|
|
58
|
+
5. Run task: `ask-column-is-enum`
|
|
59
|
+
6. Run task: `ask-column-position`
|
|
60
|
+
- Ask: "Add column after which existing column?"
|
|
61
|
+
- List current columns from context
|
|
62
|
+
- Stores: `context.current_db.after_column`
|
|
63
|
+
|
|
64
|
+
Generated SQL pattern:
|
|
65
|
+
```sql
|
|
66
|
+
ALTER TABLE public.<table_name>
|
|
67
|
+
ADD COLUMN <col_name> <type> NOT NULL DEFAULT <default>;
|
|
68
|
+
```
|
|
41
69
|
|
|
42
70
|
#### If "Rename a column":
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
|
|
71
|
+
3. Run task: `ask-old-column-name`
|
|
72
|
+
- List current columns from context
|
|
73
|
+
4. Run task: `ask-new-column-name`
|
|
74
|
+
- Enforce: snake_case, lowercase
|
|
75
|
+
|
|
76
|
+
Generated SQL pattern:
|
|
77
|
+
```sql
|
|
78
|
+
ALTER TABLE public.<table_name>
|
|
79
|
+
RENAME COLUMN <old_name> TO <new_name>;
|
|
80
|
+
```
|
|
46
81
|
|
|
47
82
|
#### If "Drop a column":
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
-
|
|
83
|
+
3. Run task: `ask-old-column-name`
|
|
84
|
+
- List current columns from context
|
|
85
|
+
- WARN: "This will generate a DROP COLUMN migration. This is irreversible
|
|
86
|
+
in production. Make sure you have removed all code references first."
|
|
87
|
+
- Ask: "Confirm dropping column '<col>'? (yes/no)"
|
|
88
|
+
|
|
89
|
+
Generated SQL pattern:
|
|
90
|
+
```sql
|
|
91
|
+
ALTER TABLE public.<table_name>
|
|
92
|
+
DROP COLUMN IF EXISTS <col_name>;
|
|
93
|
+
```
|
|
53
94
|
|
|
54
95
|
#### If "Change a column type":
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
96
|
+
3. Run task: `ask-old-column-name`
|
|
97
|
+
4. Run task: `ask-column-type` (new type)
|
|
98
|
+
- WARN agent about potential data loss if changing to narrower type
|
|
99
|
+
|
|
100
|
+
Generated SQL pattern:
|
|
101
|
+
```sql
|
|
102
|
+
ALTER TABLE public.<table_name>
|
|
103
|
+
ALTER COLUMN <col_name> TYPE <new_type> USING <col_name>::<new_type>;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### If "Add a CHECK constraint":
|
|
107
|
+
3. Run task: `ask-old-column-name`
|
|
108
|
+
4. Run task: `ask-column-enum-values`
|
|
109
|
+
|
|
110
|
+
Generated SQL pattern:
|
|
111
|
+
```sql
|
|
112
|
+
ALTER TABLE public.<table_name>
|
|
113
|
+
ADD CONSTRAINT chk_<table>_<col> CHECK (<col_name> IN (<values>));
|
|
114
|
+
COMMENT ON COLUMN public.<table_name>.<col_name> IS '<enum explanation>';
|
|
115
|
+
```
|
|
58
116
|
|
|
59
|
-
#### If "Add
|
|
60
|
-
|
|
61
|
-
- Ask: "Allowed values?" (comma-separated)
|
|
62
|
-
- SQL generated: `ALTER TABLE public.<table> ADD CONSTRAINT chk_<table>_<col> CHECK (<col> IN (<values>));`
|
|
63
|
-
Plus: `COMMENT ON COLUMN public.<table>.<col> IS '<enum explanation>';`
|
|
117
|
+
#### If "Add a new index":
|
|
118
|
+
→ Route to `@db:add-index` workflow instead.
|
|
64
119
|
|
|
65
120
|
---
|
|
66
121
|
|
|
67
122
|
### Phase 3 — File Numbering
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
-
|
|
123
|
+
7. Run task: `ask-table-file-number`
|
|
124
|
+
- Suggest: next available number after all existing files
|
|
125
|
+
- Stores: `context.current_db.file_number`
|
|
71
126
|
|
|
72
127
|
---
|
|
73
128
|
|
|
74
129
|
### Phase 4 — Confirm and Generate
|
|
130
|
+
8. Show summary of the ALTER operation
|
|
131
|
+
- Display the exact SQL that will be generated
|
|
132
|
+
- Ask: "Generate this migration? (yes / no)"
|
|
75
133
|
|
|
76
|
-
**
|
|
134
|
+
> **Multi-agent:** Delegate to `database-architect` via Task invocation for parallel execution.
|
|
135
|
+
> Read `.codeninja/tasks/` before generating each migration file.
|
|
77
136
|
|
|
78
|
-
|
|
79
|
-
Generate: `<repo_root>/database/<db_type>/migrations/<number>-alter-tbl-<n>-<description>.sql`
|
|
137
|
+
9. Delegate to `database-agent`:
|
|
138
|
+
- Generate: `<repo_root>/database/<db_type>/migrations/<number>-alter-tbl-<n>-<description>.sql`
|
|
80
139
|
|
|
81
|
-
Full file structure:
|
|
82
|
-
```sql
|
|
83
|
-
-- Alter tbl_<table>: <description>
|
|
84
|
-
-- Migration: <number>-alter-tbl-<n>-<description>.sql
|
|
85
|
-
-- Generated: <ISO date>
|
|
140
|
+
Full file structure:
|
|
141
|
+
```sql
|
|
142
|
+
-- Alter tbl_<table>: <description>
|
|
143
|
+
-- Migration: <number>-alter-tbl-<n>-<description>.sql
|
|
144
|
+
-- Generated: <ISO date>
|
|
86
145
|
|
|
87
|
-
BEGIN;
|
|
146
|
+
BEGIN;
|
|
88
147
|
|
|
89
|
-
ALTER TABLE public.<table_name>
|
|
90
|
-
|
|
148
|
+
ALTER TABLE public.<table_name>
|
|
149
|
+
<operation>;
|
|
91
150
|
|
|
92
|
-
-- COMMENT ON COLUMN if enum/flag column
|
|
93
|
-
-- CREATE INDEX if new column needs one
|
|
151
|
+
-- Optional: COMMENT ON COLUMN if enum/flag column
|
|
152
|
+
-- Optional: CREATE INDEX if new column needs one
|
|
94
153
|
|
|
95
|
-
COMMIT;
|
|
96
|
-
```
|
|
97
|
-
Update: `database/<db_type>/create-schema.sql`
|
|
154
|
+
COMMIT;
|
|
155
|
+
```
|
|
98
156
|
|
|
99
|
-
|
|
100
|
-
- Update `context.db.schema.tables[<table>].columns`
|
|
101
|
-
- Append to `context.db.schema.change_log`
|
|
102
|
-
- Clear `context.current_db`
|
|
157
|
+
- Update: `database/<db_type>/create-schema.sql`
|
|
103
158
|
|
|
104
|
-
|
|
159
|
+
10. Run task: `write-context`
|
|
160
|
+
- Update `context.db.schema.tables[<table>].columns`
|
|
161
|
+
- Append to `context.db.schema.change_log`
|
|
162
|
+
- Clear `context.current_db`
|
|
105
163
|
|
|
106
|
-
|
|
164
|
+
11. Run task: `show-final-summary`
|
|
@@ -1,76 +1,104 @@
|
|
|
1
|
+
This workflow runs when user invokes /codeninja:db:seed
|
|
2
|
+
|
|
1
3
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description:
|
|
4
|
+
type: workflow
|
|
5
|
+
name: db-seed
|
|
6
|
+
command: "@db:seed"
|
|
7
|
+
description: >
|
|
8
|
+
Add or update seed data for a table. For reference/master data tables,
|
|
9
|
+
seed goes inside the table setup file. For all others, a standalone seed
|
|
10
|
+
file is generated in the seeds/ folder.
|
|
6
11
|
---
|
|
7
12
|
|
|
8
|
-
#
|
|
13
|
+
# Workflow: @db:seed
|
|
14
|
+
|
|
15
|
+
## Goal
|
|
16
|
+
Generate properly formatted INSERT seed data for a table. Determine whether
|
|
17
|
+
seed belongs in the table file or a standalone seed file.
|
|
9
18
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
19
|
+
## Rules
|
|
20
|
+
- Passwords in seed data must be pre-encrypted — agent must ask for encrypted value
|
|
21
|
+
- Never generate plaintext passwords in any file
|
|
22
|
+
- Multi-row INSERT format always (single INSERT with multiple value tuples)
|
|
23
|
+
- Seed file naming: `<repo_root>/database/<db_type>/seeds/<table_name>_seed.sql`
|
|
13
24
|
|
|
14
|
-
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Step-by-Step Execution
|
|
15
28
|
|
|
16
29
|
### Phase 1 — Target
|
|
30
|
+
1. Run task: `ask-table-name`
|
|
31
|
+
- List tables from `context.db.schema.tables`
|
|
32
|
+
- Stores: `context.current_db.table_name`
|
|
17
33
|
|
|
18
|
-
|
|
19
|
-
- Store: `context.current_db.table_name`
|
|
34
|
+
---
|
|
20
35
|
|
|
21
36
|
### Phase 2 — Seed File Type
|
|
37
|
+
2. Agent checks if table is a reference/master table:
|
|
38
|
+
- Reference tables (seed goes IN setup file): tbl_country, tbl_app_content,
|
|
39
|
+
tbl_strategy_modules, tbl_admin, any lookup table
|
|
40
|
+
- All others: standalone seed file in seeds/
|
|
22
41
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
42
|
+
Ask: "Where should this seed data go?"
|
|
43
|
+
Options:
|
|
44
|
+
1. Append to the table's setup file (for reference/master data)
|
|
45
|
+
2. Create a standalone seed file in seeds/ (for dev/test data)
|
|
26
46
|
|
|
27
|
-
|
|
28
|
-
1. Append to the table's setup file (for reference/master data)
|
|
29
|
-
2. Create standalone seed file in seeds/ (for dev/test data)
|
|
30
|
-
- Store: `context.current_db.seed_target`
|
|
47
|
+
Stores: `context.current_db.seed_target`
|
|
31
48
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
**Step 3.** Show column list from context (excluding `id` and `created_at` — auto-generated).
|
|
49
|
+
---
|
|
35
50
|
|
|
36
|
-
|
|
37
|
-
|
|
51
|
+
### Phase 3 — Data Collection
|
|
52
|
+
3. Show column list for the table from context.
|
|
53
|
+
|
|
54
|
+
4. Run task: `ask-seed-rows-count`
|
|
55
|
+
- Ask: "How many rows do you want to seed?"
|
|
56
|
+
- Stores: `context.current_db.seed_count`
|
|
57
|
+
|
|
58
|
+
5. For each row (repeat seed_count times):
|
|
59
|
+
Run task: `ask-seed-row-values`
|
|
60
|
+
- For each column (excluding `id` and `created_at` — auto-generated):
|
|
61
|
+
- Ask the value one column at a time
|
|
62
|
+
- If column is `password` → warn: "Enter the encrypted/hashed value only. Never store plaintext."
|
|
63
|
+
- If column has CHECK constraint → show allowed values
|
|
64
|
+
- If column has DEFAULT → offer to use default (user can press enter to skip)
|
|
65
|
+
- Stores: appends to `context.current_db.seed_rows[]`
|
|
38
66
|
|
|
39
|
-
|
|
40
|
-
- Ask value for each column one at a time
|
|
41
|
-
- If column is `password` → warn: "Enter the encrypted/hashed value only. Never store plaintext."
|
|
42
|
-
- If column has CHECK constraint → show allowed values
|
|
43
|
-
- If column has DEFAULT → offer to use default (press Enter to skip)
|
|
44
|
-
- Append to: `context.current_db.seed_rows[]`
|
|
67
|
+
---
|
|
45
68
|
|
|
46
69
|
### Phase 4 — Generate
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
70
|
+
6. Show full INSERT preview to user
|
|
71
|
+
- Ask: "Generate this seed data? (yes / no)"
|
|
72
|
+
|
|
73
|
+
> **Multi-agent:** Delegate to `database-architect` via Task invocation for parallel execution.
|
|
74
|
+
> Read `.codeninja/tasks/collect-seed-data.task.md` before generating seed data.
|
|
75
|
+
|
|
76
|
+
7. Delegate to `database-agent`:
|
|
77
|
+
|
|
78
|
+
If appending to setup file:
|
|
79
|
+
- Read existing setup file
|
|
80
|
+
- Append after the GRANT line:
|
|
81
|
+
```sql
|
|
82
|
+
INSERT INTO public.<table_name> (<col1>, <col2>, ...) VALUES
|
|
83
|
+
(<val1a>, <val2a>, ...),
|
|
84
|
+
(<val1b>, <val2b>, ...);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
If standalone seed file:
|
|
88
|
+
- Generate: `database/<db_type>/seeds/<table_name>_seed.sql`
|
|
89
|
+
```sql
|
|
90
|
+
-- Seed data for <table_name>
|
|
91
|
+
-- Environment: development
|
|
92
|
+
-- Generated: <ISO date>
|
|
93
|
+
|
|
94
|
+
INSERT INTO public.<table_name> (<col1>, <col2>, ...) VALUES
|
|
95
|
+
(<val1a>, <val2a>, ...),
|
|
96
|
+
(<val1b>, <val2b>, ...);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
8. Run task: `write-context`
|
|
100
|
+
- Append to `context.db.schema.change_log`:
|
|
101
|
+
`{ "type": "seed_added", "table": "<n>", "rows": <count> }`
|
|
102
|
+
- Clear `context.current_db`
|
|
103
|
+
|
|
104
|
+
9. Run task: `show-final-summary`
|
|
@@ -1,70 +1,106 @@
|
|
|
1
|
+
This workflow runs when user invokes /codeninja:db:sync
|
|
2
|
+
|
|
1
3
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
description:
|
|
4
|
+
type: workflow
|
|
5
|
+
name: db-sync
|
|
6
|
+
command: "@db:sync"
|
|
7
|
+
description: >
|
|
8
|
+
Scan all migration files in the database folder and rebuild context.db.schema
|
|
9
|
+
from actual file contents. Safe to run at any time. Never destructive —
|
|
10
|
+
only adds or updates, never removes existing context entries.
|
|
6
11
|
---
|
|
7
12
|
|
|
8
|
-
#
|
|
13
|
+
# Workflow: @db:sync
|
|
14
|
+
|
|
15
|
+
## Goal
|
|
16
|
+
Make context.db.schema an accurate reflection of what is actually on disk.
|
|
17
|
+
Parse every migration file in order and reconstruct the full schema state.
|
|
9
18
|
|
|
10
|
-
|
|
11
|
-
1. Call `context_read`
|
|
12
|
-
2. Call `context_check_stale`
|
|
19
|
+
---
|
|
13
20
|
|
|
14
|
-
##
|
|
21
|
+
## Step-by-Step Execution
|
|
15
22
|
|
|
16
23
|
### Phase 1 — Locate Files
|
|
24
|
+
1. Read `context.db.type` to find the correct folder:
|
|
25
|
+
`<repo_root>/database/<db_type>/migrations/`
|
|
26
|
+
The database folder is always at repository root, never inside
|
|
27
|
+
a service folder.
|
|
28
|
+
2. List all `.sql` files in that folder
|
|
29
|
+
3. Sort them in numeric order by filename prefix (1, 2, 3... 111)
|
|
30
|
+
4. Separate into categories:
|
|
31
|
+
- setup files: `*-setup-tbl-*.sql`
|
|
32
|
+
- alter files: `*-alter-tbl-*.sql`
|
|
33
|
+
- drop files: `*-drop-tbl-*.sql`
|
|
34
|
+
- index file: `111-setup-database-indexes.sql`
|
|
17
35
|
|
|
18
|
-
|
|
19
|
-
**Step 2.** List all `.sql` files, sort by numeric prefix (1, 2, 3… 111)
|
|
20
|
-
**Step 3.** Categorize:
|
|
21
|
-
- setup files: `*-setup-tbl-*.sql`
|
|
22
|
-
- alter files: `*-alter-tbl-*.sql`
|
|
23
|
-
- drop files: `*-drop-tbl-*.sql`
|
|
24
|
-
- index file: `111-setup-database-indexes.sql`
|
|
36
|
+
---
|
|
25
37
|
|
|
26
38
|
### Phase 2 — Parse Each File
|
|
27
|
-
|
|
28
39
|
For each setup file (in order):
|
|
29
|
-
- Extract table name from CREATE TABLE
|
|
40
|
+
- Extract table name from CREATE TABLE statement
|
|
30
41
|
- Extract all column names and types
|
|
31
|
-
- Extract CHECK constraints
|
|
42
|
+
- Extract CHECK constraints (enum values)
|
|
43
|
+
- Extract COMMENT ON COLUMN lines (enum descriptions)
|
|
32
44
|
- Extract per-file CREATE INDEX lines
|
|
33
45
|
- Note if table has `status`, `is_deleted`, `created_at`
|
|
34
46
|
|
|
35
47
|
For each alter file (in order after its setup file):
|
|
36
|
-
- ADD COLUMN → add to that table's columns
|
|
37
|
-
- RENAME COLUMN → update name, record in change_log
|
|
38
|
-
- DROP COLUMN → remove from columns
|
|
39
|
-
- ADD CONSTRAINT → update column constraint info
|
|
48
|
+
- Parse ADD COLUMN → add to that table's columns
|
|
49
|
+
- Parse RENAME COLUMN → update column name, record in change_log
|
|
50
|
+
- Parse DROP COLUMN → remove from columns
|
|
51
|
+
- Parse ADD CONSTRAINT → update column's constraint info
|
|
40
52
|
|
|
41
|
-
For each drop file:
|
|
53
|
+
For each drop file:
|
|
54
|
+
- Mark that table as dropped in the scan result
|
|
42
55
|
|
|
43
|
-
For the index file:
|
|
56
|
+
For the index file:
|
|
57
|
+
- Parse all CREATE INDEX statements
|
|
58
|
+
- Associate each index with its table
|
|
44
59
|
|
|
45
|
-
|
|
60
|
+
---
|
|
46
61
|
|
|
62
|
+
### Phase 3 — Rebuild Context
|
|
47
63
|
For each discovered table (not dropped):
|
|
48
64
|
- Compare with existing `context.db.schema.tables[<table>]`
|
|
49
|
-
- Add tables not already in context
|
|
50
|
-
- Add columns not already tracked
|
|
51
|
-
- Add indexes not already tracked
|
|
52
|
-
- For renames in ALTER files → append to change_log if not already there
|
|
65
|
+
- Add any tables not already in context
|
|
66
|
+
- Add any columns not already tracked
|
|
67
|
+
- Add any indexes not already tracked
|
|
68
|
+
- For renames found in ALTER files → append to change_log if not already there
|
|
53
69
|
|
|
54
70
|
For dropped tables:
|
|
55
|
-
- If still in `context.db.schema.tables` → move to change_log snapshot
|
|
71
|
+
- If still in `context.db.schema.tables` → move to change_log snapshot
|
|
72
|
+
- Remove from active tables list
|
|
56
73
|
|
|
57
|
-
|
|
74
|
+
---
|
|
58
75
|
|
|
59
|
-
|
|
76
|
+
### Phase 4 — Rebuild create-schema.sql
|
|
77
|
+
- Re-read all file names in correct numeric order
|
|
60
78
|
- Rewrite `create-schema.sql` to match actual files on disk
|
|
61
|
-
- Report
|
|
62
|
-
- Report
|
|
79
|
+
- Report any \i entries that are in create-schema.sql but missing from disk (stale)
|
|
80
|
+
- Report any files on disk not in create-schema.sql (missing)
|
|
63
81
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
**Step 5.** Show sync report: tables synced, columns added, indexes added, stale entries, missing files.
|
|
67
|
-
|
|
68
|
-
**Step 6.** Call `context_write` with rebuilt `context.db.schema`.
|
|
82
|
+
---
|
|
69
83
|
|
|
70
|
-
|
|
84
|
+
### Phase 5 — Write and Report
|
|
85
|
+
|
|
86
|
+
> **Multi-agent:** Delegate to `database-architect` via Task invocation for parallel execution.
|
|
87
|
+
> Read `.codeninja/tasks/` before generating any schema updates.
|
|
88
|
+
|
|
89
|
+
1. Run task: `write-context` with all schema deltas
|
|
90
|
+
2. Display sync report:
|
|
91
|
+
```
|
|
92
|
+
@db:sync complete
|
|
93
|
+
─────────────────────────────────────────
|
|
94
|
+
Migration files scanned : [n]
|
|
95
|
+
Tables discovered : [n] ([x] new)
|
|
96
|
+
Columns synced : [n] ([x] new)
|
|
97
|
+
Indexes synced : [n] ([x] new)
|
|
98
|
+
Renames detected : [n]
|
|
99
|
+
Dropped tables : [n]
|
|
100
|
+
create-schema.sql : updated
|
|
101
|
+
Context gaps filled : [n]
|
|
102
|
+
─────────────────────────────────────────
|
|
103
|
+
```
|
|
104
|
+
3. If any conflicts found (e.g. column exists in context with different type than file):
|
|
105
|
+
- List each conflict
|
|
106
|
+
- Ask user which to keep (file or context) — one at a time
|
|
@@ -1,44 +1,60 @@
|
|
|
1
|
+
This workflow runs when user invokes /codeninja:debug
|
|
2
|
+
|
|
1
3
|
---
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
type: workflow
|
|
5
|
+
name: debug
|
|
6
|
+
description: >
|
|
7
|
+
Diagnose and fix bugs using full project context — DB schema, middleware
|
|
8
|
+
chain, service config, and established patterns. Traces the exact failure
|
|
9
|
+
path and produces a concrete fix.
|
|
6
10
|
---
|
|
7
11
|
|
|
8
|
-
# /codeninja:debug
|
|
12
|
+
# Workflow: @debug / /codeninja:debug
|
|
9
13
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
## Goal
|
|
15
|
+
Find the root cause of a bug and produce a concrete fix using actual project
|
|
16
|
+
context. Never guess — trace the real code path.
|
|
17
|
+
|
|
18
|
+
## Rules
|
|
19
|
+
- Trace the full request path before concluding anything
|
|
20
|
+
- Cross-reference context.db.schema before assuming a DB mismatch
|
|
21
|
+
- Check middleware chain order before assuming an auth issue
|
|
22
|
+
- One question at a time when gathering information
|
|
23
|
+
|
|
24
|
+
---
|
|
13
25
|
|
|
14
|
-
##
|
|
26
|
+
## Step-by-Step Execution
|
|
15
27
|
|
|
16
|
-
### Step 1 — Gather Error Information
|
|
28
|
+
### Step 1 — Gather Error Information
|
|
29
|
+
Ask (one at a time if not already provided):
|
|
17
30
|
1. "Paste the full error message and stack trace."
|
|
18
31
|
2. "Which endpoint or operation triggered it? (e.g., POST /v1/scores/submit)"
|
|
19
|
-
3. "What did you expect vs what actually happened?"
|
|
32
|
+
3. "What did you expect to happen vs what actually happened?"
|
|
20
33
|
4. "What changed recently before this error appeared?"
|
|
21
34
|
|
|
22
35
|
### Step 2 — Load Context
|
|
23
|
-
1. Call `
|
|
24
|
-
2. Call `fs_read` on the relevant
|
|
25
|
-
3. Call `
|
|
36
|
+
1. Call `context_read` — load services, DB schema, project config
|
|
37
|
+
2. Call `fs_read` on the relevant route.js
|
|
38
|
+
3. Call `fs_read` on the relevant _model.js
|
|
39
|
+
4. Call `fs_exists` on the migration file for any table mentioned in the error
|
|
26
40
|
|
|
27
41
|
### Step 3 — Trace the Failure Path
|
|
28
42
|
|
|
29
|
-
Walk the request lifecycle in order
|
|
43
|
+
Walk the request lifecycle in order:
|
|
30
44
|
```
|
|
31
45
|
Request received
|
|
32
46
|
→ Language middleware (extracts Accept-Language)
|
|
33
47
|
→ API key middleware (validates api-key header)
|
|
34
|
-
→ Auth middleware (validates JWT if protected)
|
|
48
|
+
→ Auth middleware (validates JWT, if protected)
|
|
35
49
|
→ Validation (validatorjs schema)
|
|
36
50
|
→ Route handler (calls model)
|
|
37
51
|
→ Model function (executes query)
|
|
38
|
-
→ Database (pg pool
|
|
52
|
+
→ Database (pg pool)
|
|
39
53
|
→ Response formatter
|
|
40
54
|
```
|
|
41
55
|
|
|
56
|
+
Mark the exact step where the error occurs.
|
|
57
|
+
|
|
42
58
|
### Step 4 — Check Common Root Causes
|
|
43
59
|
|
|
44
60
|
| Symptom | Check |
|
|
@@ -48,7 +64,7 @@ Request received
|
|
|
48
64
|
| `Cannot read property of undefined` | missing null check after DB query returns 0 rows |
|
|
49
65
|
| `401 Unauthorized` | middleware order — apiKey middleware applied? header name correct? |
|
|
50
66
|
| `500 Internal Server Error` | missing try/catch around async DB call |
|
|
51
|
-
| `Wrong number of rows` | missing dedup, RANK vs DENSE_RANK, missing WHERE clause |
|
|
67
|
+
| `Wrong number of rows` | missing dedup query, RANK vs DENSE_RANK, missing WHERE clause |
|
|
52
68
|
| `Migration not applied` | table exists in code but not in DB — run migration |
|
|
53
69
|
| Stale context data | context.db.schema out of date — suggest /codeninja:db:sync |
|
|
54
70
|
|
|
@@ -69,14 +85,12 @@ After:
|
|
|
69
85
|
Why this fixes it: [one sentence]
|
|
70
86
|
```
|
|
71
87
|
|
|
72
|
-
If multiple files need changes, show each in order.
|
|
88
|
+
If multiple files need changes, show each one in order.
|
|
73
89
|
|
|
74
90
|
### Step 6 — Verify Plan
|
|
75
|
-
|
|
76
91
|
"Before I apply this fix, confirm: does this match what you're seeing?
|
|
77
92
|
Once confirmed, I'll make the changes."
|
|
78
93
|
|
|
79
94
|
### Step 7 — Prevent Recurrence
|
|
80
|
-
|
|
81
95
|
After fixing: suggest one guard that prevents this class of bug in the future.
|
|
82
96
|
(e.g., a missing index, an added null check helper, a context convention)
|