nexus-dev-toolkit 3.0.1__tar.gz → 3.1.0__tar.gz
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.
- {nexus_dev_toolkit-3.0.1/nexus_dev_toolkit.egg-info → nexus_dev_toolkit-3.1.0}/PKG-INFO +32 -13
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/README.md +28 -10
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_cli.py +29 -1
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0/nexus_dev_toolkit.egg-info}/PKG-INFO +32 -13
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/SOURCES.txt +13 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/requires.txt +1 -1
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/pyproject.toml +5 -3
- nexus_dev_toolkit-3.1.0/tests/test_cli.py +105 -0
- nexus_dev_toolkit-3.1.0/tests/test_server.py +21 -0
- nexus_dev_toolkit-3.1.0/tools/agents/code-reviewer.md +93 -0
- nexus_dev_toolkit-3.1.0/tools/agents/database-reviewer.md +95 -0
- nexus_dev_toolkit-3.1.0/tools/agents/deployment-reviewer.md +97 -0
- nexus_dev_toolkit-3.1.0/tools/agents/monitoring-reviewer.md +95 -0
- nexus_dev_toolkit-3.1.0/tools/agents/performance-reviewer.md +98 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/__init__.py +0 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/code-review.md +91 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/database-review.md +91 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/deployment-review.md +94 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/monitoring-review.md +91 -0
- nexus_dev_toolkit-3.1.0/tools/epav/skills/performance-review.md +93 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/LICENSE +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/dependency_links.txt +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/entry_points.txt +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/top_level.txt +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_server.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/setup.cfg +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/__init__.py +0 -0
- {nexus_dev_toolkit-3.0.1/tools/epav/skills → nexus_dev_toolkit-3.1.0/tools/agents}/__init__.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/__init__.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/arch_ingest.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/package_resolver.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/project_rules.py +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/apply.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/epav.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/evaluate.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/plan.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/scaffold.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/validate.md +0 -0
- {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/task_loader.py +0 -0
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nexus-dev-toolkit
|
|
3
|
-
Version: 3.0
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 3.1.0
|
|
4
|
+
Summary: Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV
|
|
5
5
|
Author-email: Ronald dela Cruz <rcdelacruz@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://nexus.coderstudio.co
|
|
8
|
+
Project-URL: Documentation, https://nexus.coderstudio.co/docs
|
|
8
9
|
Project-URL: Repository, https://github.com/rcdelacruz/nexus-dev-toolkit
|
|
9
10
|
Project-URL: Issues, https://github.com/rcdelacruz/nexus-dev-toolkit/issues
|
|
10
11
|
Requires-Python: >=3.10
|
|
11
12
|
Description-Content-Type: text/markdown
|
|
12
13
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: mcp[cli]>=1.
|
|
14
|
+
Requires-Dist: mcp[cli]>=1.27.1
|
|
14
15
|
Requires-Dist: typer>=0.12.0
|
|
15
16
|
Requires-Dist: rich>=13.0.0
|
|
16
17
|
Provides-Extra: dev
|
|
@@ -20,12 +21,11 @@ Dynamic: license-file
|
|
|
20
21
|
|
|
21
22
|
# nexus-dev-toolkit
|
|
22
23
|
|
|
23
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
24
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
25
|
-
[](LICENSE)
|
|
26
24
|
|
|
27
25
|
Developer workflow toolkit for Claude Code. Gives any team a structured Day 0 scaffold and repeatable Day 1 feature cycle via the EPAV methodology.
|
|
28
26
|
|
|
27
|
+
**[Documentation](https://nexus.coderstudio.co/docs)**
|
|
28
|
+
|
|
29
29
|
---
|
|
30
30
|
|
|
31
31
|
## Why
|
|
@@ -83,33 +83,52 @@ cd my-project
|
|
|
83
83
|
nexus init .
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
### 4.
|
|
86
|
+
### 4. Place your reference docs
|
|
87
|
+
|
|
88
|
+
Before running `/scaffold`, put everything Claude needs in `docs/`:
|
|
87
89
|
|
|
88
|
-
Open the project in Claude Code and run:
|
|
89
90
|
```
|
|
90
|
-
/
|
|
91
|
+
docs/
|
|
92
|
+
├── arch-docs/ ← architecture doc, ADRs
|
|
93
|
+
├── figma/ ← Figma export ZIP
|
|
94
|
+
├── brd/ ← Business Requirements Document
|
|
95
|
+
└── prd/ ← Product Requirements Document
|
|
91
96
|
```
|
|
92
97
|
|
|
93
|
-
This generates `graphify-out/graph.json` — required by all EPAV skills.
|
|
94
|
-
|
|
95
98
|
### 5. Start Day 0
|
|
96
99
|
|
|
100
|
+
Open the project in Claude Code and run:
|
|
97
101
|
```
|
|
98
102
|
/scaffold
|
|
99
103
|
```
|
|
100
104
|
|
|
105
|
+
`/scaffold` runs EVALUATE first then stops. You drive each phase by typing the next command:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
/scaffold → (review) → /plan → (review) → /apply → (review) → /validate
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 6. Build the knowledge graph
|
|
112
|
+
|
|
113
|
+
After `/scaffold` completes, run in Claude Code:
|
|
114
|
+
```
|
|
115
|
+
/graphify .
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
This generates `graphify-out/graph.json` — required by all EPAV skills before starting Day 1.
|
|
119
|
+
|
|
101
120
|
---
|
|
102
121
|
|
|
103
122
|
## The Workflow
|
|
104
123
|
|
|
105
124
|
### Day 0 — `/scaffold` (once per project)
|
|
106
125
|
|
|
107
|
-
|
|
126
|
+
Produces a production-grade project from your architecture document and Figma design: correct stack, mock auth, mock data, design system, AGENTS.md — zero external dependencies. Runs `npm install && npm run dev` (or equivalent) from commit one.
|
|
108
127
|
|
|
109
128
|
### Day 1 — EPAV (every feature, every sprint)
|
|
110
129
|
|
|
111
130
|
```
|
|
112
|
-
/evaluate
|
|
131
|
+
/evaluate <task> → /plan → /apply → /validate
|
|
113
132
|
```
|
|
114
133
|
|
|
115
134
|
Each step is a built-in skill in `.claude/commands/`. Every task starts from the dev tasks CSV. Every task ends with acceptance criteria verified.
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# nexus-dev-toolkit
|
|
2
2
|
|
|
3
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
4
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
5
|
-
[](LICENSE)
|
|
6
3
|
|
|
7
4
|
Developer workflow toolkit for Claude Code. Gives any team a structured Day 0 scaffold and repeatable Day 1 feature cycle via the EPAV methodology.
|
|
8
5
|
|
|
6
|
+
**[Documentation](https://nexus.coderstudio.co/docs)**
|
|
7
|
+
|
|
9
8
|
---
|
|
10
9
|
|
|
11
10
|
## Why
|
|
@@ -63,33 +62,52 @@ cd my-project
|
|
|
63
62
|
nexus init .
|
|
64
63
|
```
|
|
65
64
|
|
|
66
|
-
### 4.
|
|
65
|
+
### 4. Place your reference docs
|
|
66
|
+
|
|
67
|
+
Before running `/scaffold`, put everything Claude needs in `docs/`:
|
|
67
68
|
|
|
68
|
-
Open the project in Claude Code and run:
|
|
69
69
|
```
|
|
70
|
-
/
|
|
70
|
+
docs/
|
|
71
|
+
├── arch-docs/ ← architecture doc, ADRs
|
|
72
|
+
├── figma/ ← Figma export ZIP
|
|
73
|
+
├── brd/ ← Business Requirements Document
|
|
74
|
+
└── prd/ ← Product Requirements Document
|
|
71
75
|
```
|
|
72
76
|
|
|
73
|
-
This generates `graphify-out/graph.json` — required by all EPAV skills.
|
|
74
|
-
|
|
75
77
|
### 5. Start Day 0
|
|
76
78
|
|
|
79
|
+
Open the project in Claude Code and run:
|
|
77
80
|
```
|
|
78
81
|
/scaffold
|
|
79
82
|
```
|
|
80
83
|
|
|
84
|
+
`/scaffold` runs EVALUATE first then stops. You drive each phase by typing the next command:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
/scaffold → (review) → /plan → (review) → /apply → (review) → /validate
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 6. Build the knowledge graph
|
|
91
|
+
|
|
92
|
+
After `/scaffold` completes, run in Claude Code:
|
|
93
|
+
```
|
|
94
|
+
/graphify .
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
This generates `graphify-out/graph.json` — required by all EPAV skills before starting Day 1.
|
|
98
|
+
|
|
81
99
|
---
|
|
82
100
|
|
|
83
101
|
## The Workflow
|
|
84
102
|
|
|
85
103
|
### Day 0 — `/scaffold` (once per project)
|
|
86
104
|
|
|
87
|
-
|
|
105
|
+
Produces a production-grade project from your architecture document and Figma design: correct stack, mock auth, mock data, design system, AGENTS.md — zero external dependencies. Runs `npm install && npm run dev` (or equivalent) from commit one.
|
|
88
106
|
|
|
89
107
|
### Day 1 — EPAV (every feature, every sprint)
|
|
90
108
|
|
|
91
109
|
```
|
|
92
|
-
/evaluate
|
|
110
|
+
/evaluate <task> → /plan → /apply → /validate
|
|
93
111
|
```
|
|
94
112
|
|
|
95
113
|
Each step is a built-in skill in `.claude/commands/`. Every task starts from the dev tasks CSV. Every task ends with acceptance criteria verified.
|
|
@@ -16,7 +16,7 @@ app.add_typer(rule_app, name="rule")
|
|
|
16
16
|
|
|
17
17
|
console = Console()
|
|
18
18
|
|
|
19
|
-
_VERSION = "3.0
|
|
19
|
+
_VERSION = "3.1.0"
|
|
20
20
|
|
|
21
21
|
_LOGO = """\
|
|
22
22
|
[cyan]███╗ ██╗███████╗██╗ ██╗██╗ ██╗███████╗[/cyan]
|
|
@@ -52,8 +52,24 @@ _BUILTIN_SKILLS = [
|
|
|
52
52
|
"apply.md",
|
|
53
53
|
"validate.md",
|
|
54
54
|
"epav.md",
|
|
55
|
+
"code-review.md",
|
|
56
|
+
"database-review.md",
|
|
57
|
+
"deployment-review.md",
|
|
58
|
+
"performance-review.md",
|
|
59
|
+
"monitoring-review.md",
|
|
55
60
|
]
|
|
56
61
|
|
|
62
|
+
_AGENTS_SRC = Path(__file__).parent / "tools" / "agents"
|
|
63
|
+
|
|
64
|
+
_BUILTIN_AGENTS = [
|
|
65
|
+
"deployment-reviewer.md",
|
|
66
|
+
"code-reviewer.md",
|
|
67
|
+
"performance-reviewer.md",
|
|
68
|
+
"monitoring-reviewer.md",
|
|
69
|
+
"database-reviewer.md",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
|
|
57
73
|
# ── .claude/settings.json ────────────────────────────────────────────────────
|
|
58
74
|
|
|
59
75
|
_CLAUDE_SETTINGS = {
|
|
@@ -95,6 +111,7 @@ def _init_project(project_dir: Path) -> list[str]:
|
|
|
95
111
|
"""
|
|
96
112
|
nexus init — sets up:
|
|
97
113
|
.claude/commands/ ← built-in skills
|
|
114
|
+
.claude/agents/ ← built-in subagents
|
|
98
115
|
.claude/settings.json ← PostToolUse graphify hook
|
|
99
116
|
knowledge/ ← empty scaffold
|
|
100
117
|
"""
|
|
@@ -111,6 +128,17 @@ def _init_project(project_dir: Path) -> list[str]:
|
|
|
111
128
|
shutil.copy2(src, dest)
|
|
112
129
|
created.append(f".claude/commands/{skill_name}")
|
|
113
130
|
|
|
131
|
+
# .claude/agents/ — copy built-in subagents
|
|
132
|
+
agents_dir = project_dir / ".claude" / "agents"
|
|
133
|
+
agents_dir.mkdir(parents=True, exist_ok=True)
|
|
134
|
+
|
|
135
|
+
for agent_name in _BUILTIN_AGENTS:
|
|
136
|
+
src = _AGENTS_SRC / agent_name
|
|
137
|
+
dest = agents_dir / agent_name
|
|
138
|
+
if src.exists() and not dest.exists():
|
|
139
|
+
shutil.copy2(src, dest)
|
|
140
|
+
created.append(f".claude/agents/{agent_name}")
|
|
141
|
+
|
|
114
142
|
# .claude/settings.json — PostToolUse graphify hook
|
|
115
143
|
settings_path = project_dir / ".claude" / "settings.json"
|
|
116
144
|
if not settings_path.exists():
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nexus-dev-toolkit
|
|
3
|
-
Version: 3.0
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 3.1.0
|
|
4
|
+
Summary: Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV
|
|
5
5
|
Author-email: Ronald dela Cruz <rcdelacruz@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://nexus.coderstudio.co
|
|
8
|
+
Project-URL: Documentation, https://nexus.coderstudio.co/docs
|
|
8
9
|
Project-URL: Repository, https://github.com/rcdelacruz/nexus-dev-toolkit
|
|
9
10
|
Project-URL: Issues, https://github.com/rcdelacruz/nexus-dev-toolkit/issues
|
|
10
11
|
Requires-Python: >=3.10
|
|
11
12
|
Description-Content-Type: text/markdown
|
|
12
13
|
License-File: LICENSE
|
|
13
|
-
Requires-Dist: mcp[cli]>=1.
|
|
14
|
+
Requires-Dist: mcp[cli]>=1.27.1
|
|
14
15
|
Requires-Dist: typer>=0.12.0
|
|
15
16
|
Requires-Dist: rich>=13.0.0
|
|
16
17
|
Provides-Extra: dev
|
|
@@ -20,12 +21,11 @@ Dynamic: license-file
|
|
|
20
21
|
|
|
21
22
|
# nexus-dev-toolkit
|
|
22
23
|
|
|
23
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
24
|
-
[](https://pypi.org/project/nexus-dev-toolkit/)
|
|
25
|
-
[](LICENSE)
|
|
26
24
|
|
|
27
25
|
Developer workflow toolkit for Claude Code. Gives any team a structured Day 0 scaffold and repeatable Day 1 feature cycle via the EPAV methodology.
|
|
28
26
|
|
|
27
|
+
**[Documentation](https://nexus.coderstudio.co/docs)**
|
|
28
|
+
|
|
29
29
|
---
|
|
30
30
|
|
|
31
31
|
## Why
|
|
@@ -83,33 +83,52 @@ cd my-project
|
|
|
83
83
|
nexus init .
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
### 4.
|
|
86
|
+
### 4. Place your reference docs
|
|
87
|
+
|
|
88
|
+
Before running `/scaffold`, put everything Claude needs in `docs/`:
|
|
87
89
|
|
|
88
|
-
Open the project in Claude Code and run:
|
|
89
90
|
```
|
|
90
|
-
/
|
|
91
|
+
docs/
|
|
92
|
+
├── arch-docs/ ← architecture doc, ADRs
|
|
93
|
+
├── figma/ ← Figma export ZIP
|
|
94
|
+
├── brd/ ← Business Requirements Document
|
|
95
|
+
└── prd/ ← Product Requirements Document
|
|
91
96
|
```
|
|
92
97
|
|
|
93
|
-
This generates `graphify-out/graph.json` — required by all EPAV skills.
|
|
94
|
-
|
|
95
98
|
### 5. Start Day 0
|
|
96
99
|
|
|
100
|
+
Open the project in Claude Code and run:
|
|
97
101
|
```
|
|
98
102
|
/scaffold
|
|
99
103
|
```
|
|
100
104
|
|
|
105
|
+
`/scaffold` runs EVALUATE first then stops. You drive each phase by typing the next command:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
/scaffold → (review) → /plan → (review) → /apply → (review) → /validate
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 6. Build the knowledge graph
|
|
112
|
+
|
|
113
|
+
After `/scaffold` completes, run in Claude Code:
|
|
114
|
+
```
|
|
115
|
+
/graphify .
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
This generates `graphify-out/graph.json` — required by all EPAV skills before starting Day 1.
|
|
119
|
+
|
|
101
120
|
---
|
|
102
121
|
|
|
103
122
|
## The Workflow
|
|
104
123
|
|
|
105
124
|
### Day 0 — `/scaffold` (once per project)
|
|
106
125
|
|
|
107
|
-
|
|
126
|
+
Produces a production-grade project from your architecture document and Figma design: correct stack, mock auth, mock data, design system, AGENTS.md — zero external dependencies. Runs `npm install && npm run dev` (or equivalent) from commit one.
|
|
108
127
|
|
|
109
128
|
### Day 1 — EPAV (every feature, every sprint)
|
|
110
129
|
|
|
111
130
|
```
|
|
112
|
-
/evaluate
|
|
131
|
+
/evaluate <task> → /plan → /apply → /validate
|
|
113
132
|
```
|
|
114
133
|
|
|
115
134
|
Each step is a built-in skill in `.claude/commands/`. Every task starts from the dev tasks CSV. Every task ends with acceptance criteria verified.
|
|
@@ -9,7 +9,15 @@ nexus_dev_toolkit.egg-info/dependency_links.txt
|
|
|
9
9
|
nexus_dev_toolkit.egg-info/entry_points.txt
|
|
10
10
|
nexus_dev_toolkit.egg-info/requires.txt
|
|
11
11
|
nexus_dev_toolkit.egg-info/top_level.txt
|
|
12
|
+
tests/test_cli.py
|
|
13
|
+
tests/test_server.py
|
|
12
14
|
tools/__init__.py
|
|
15
|
+
tools/agents/__init__.py
|
|
16
|
+
tools/agents/code-reviewer.md
|
|
17
|
+
tools/agents/database-reviewer.md
|
|
18
|
+
tools/agents/deployment-reviewer.md
|
|
19
|
+
tools/agents/monitoring-reviewer.md
|
|
20
|
+
tools/agents/performance-reviewer.md
|
|
13
21
|
tools/epav/__init__.py
|
|
14
22
|
tools/epav/arch_ingest.py
|
|
15
23
|
tools/epav/package_resolver.py
|
|
@@ -17,8 +25,13 @@ tools/epav/project_rules.py
|
|
|
17
25
|
tools/epav/task_loader.py
|
|
18
26
|
tools/epav/skills/__init__.py
|
|
19
27
|
tools/epav/skills/apply.md
|
|
28
|
+
tools/epav/skills/code-review.md
|
|
29
|
+
tools/epav/skills/database-review.md
|
|
30
|
+
tools/epav/skills/deployment-review.md
|
|
20
31
|
tools/epav/skills/epav.md
|
|
21
32
|
tools/epav/skills/evaluate.md
|
|
33
|
+
tools/epav/skills/monitoring-review.md
|
|
34
|
+
tools/epav/skills/performance-review.md
|
|
22
35
|
tools/epav/skills/plan.md
|
|
23
36
|
tools/epav/skills/scaffold.md
|
|
24
37
|
tools/epav/skills/validate.md
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "nexus-dev-toolkit"
|
|
3
|
-
version = "3.0
|
|
4
|
-
description = "
|
|
3
|
+
version = "3.1.0"
|
|
4
|
+
description = "Developer workflow toolkit for Claude Code — Day 0 scaffold + Day 1 EPAV"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "Ronald dela Cruz", email = "rcdelacruz@users.noreply.github.com"}
|
|
7
7
|
]
|
|
@@ -9,7 +9,7 @@ readme = "README.md"
|
|
|
9
9
|
license = "MIT"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
dependencies = [
|
|
12
|
-
"mcp[cli]>=1.
|
|
12
|
+
"mcp[cli]>=1.27.1",
|
|
13
13
|
"typer>=0.12.0",
|
|
14
14
|
"rich>=13.0.0",
|
|
15
15
|
]
|
|
@@ -20,6 +20,7 @@ nexus-mcp = "nexus_server:main"
|
|
|
20
20
|
|
|
21
21
|
[project.urls]
|
|
22
22
|
Homepage = "https://nexus.coderstudio.co"
|
|
23
|
+
Documentation = "https://nexus.coderstudio.co/docs"
|
|
23
24
|
Repository = "https://github.com/rcdelacruz/nexus-dev-toolkit"
|
|
24
25
|
Issues = "https://github.com/rcdelacruz/nexus-dev-toolkit/issues"
|
|
25
26
|
|
|
@@ -42,6 +43,7 @@ include = ["tools*"]
|
|
|
42
43
|
|
|
43
44
|
[tool.setuptools.package-data]
|
|
44
45
|
"tools.epav" = ["skills/*.md"]
|
|
46
|
+
"tools.agents" = ["*.md"]
|
|
45
47
|
|
|
46
48
|
[tool.pytest.ini_options]
|
|
47
49
|
asyncio_mode = "auto"
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from typer.testing import CliRunner
|
|
6
|
+
|
|
7
|
+
from nexus_cli import app, _BUILTIN_SKILLS, _BUILTIN_AGENTS, _KNOWLEDGE_DIRS
|
|
8
|
+
|
|
9
|
+
runner = CliRunner()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.fixture()
|
|
13
|
+
def tmp_project(tmp_path):
|
|
14
|
+
return tmp_path
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def test_init_creates_commands(tmp_project):
|
|
18
|
+
result = runner.invoke(app, ["init", str(tmp_project)])
|
|
19
|
+
assert result.exit_code == 0
|
|
20
|
+
commands_dir = tmp_project / ".claude" / "commands"
|
|
21
|
+
assert commands_dir.exists()
|
|
22
|
+
for skill in _BUILTIN_SKILLS:
|
|
23
|
+
assert (commands_dir / skill).exists(), f"Missing skill: {skill}"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_init_creates_agents(tmp_project):
|
|
27
|
+
result = runner.invoke(app, ["init", str(tmp_project)])
|
|
28
|
+
assert result.exit_code == 0
|
|
29
|
+
agents_dir = tmp_project / ".claude" / "agents"
|
|
30
|
+
assert agents_dir.exists()
|
|
31
|
+
for agent in _BUILTIN_AGENTS:
|
|
32
|
+
assert (agents_dir / agent).exists(), f"Missing agent: {agent}"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_init_creates_knowledge_dirs(tmp_project):
|
|
37
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
38
|
+
for d in _KNOWLEDGE_DIRS:
|
|
39
|
+
assert (tmp_project / d).exists(), f"Missing dir: {d}"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_init_creates_settings_json(tmp_project):
|
|
43
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
44
|
+
settings = tmp_project / ".claude" / "settings.json"
|
|
45
|
+
assert settings.exists()
|
|
46
|
+
data = json.loads(settings.read_text())
|
|
47
|
+
assert "hooks" in data
|
|
48
|
+
assert "PostToolUse" in data["hooks"]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_init_creates_mcp_json(tmp_project):
|
|
52
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
53
|
+
mcp = tmp_project / ".mcp.json"
|
|
54
|
+
assert mcp.exists()
|
|
55
|
+
data = json.loads(mcp.read_text())
|
|
56
|
+
assert "nexus" in data["mcpServers"]
|
|
57
|
+
assert data["mcpServers"]["nexus"]["command"] == "uvx"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_init_idempotent(tmp_project):
|
|
61
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
62
|
+
result = runner.invoke(app, ["init", str(tmp_project)])
|
|
63
|
+
assert result.exit_code == 0
|
|
64
|
+
assert "Already initialized" in result.output
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_skill_add(tmp_project):
|
|
68
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
69
|
+
result = runner.invoke(app, ["skill", "add", "my-custom-skill", "--dir", str(tmp_project)])
|
|
70
|
+
assert result.exit_code == 0
|
|
71
|
+
skill_file = tmp_project / ".claude" / "commands" / "my-custom-skill.md"
|
|
72
|
+
assert skill_file.exists()
|
|
73
|
+
assert "/my-custom-skill" in skill_file.read_text()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def test_skill_add_idempotent(tmp_project):
|
|
77
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
78
|
+
runner.invoke(app, ["skill", "add", "my-custom-skill", "--dir", str(tmp_project)])
|
|
79
|
+
result = runner.invoke(app, ["skill", "add", "my-custom-skill", "--dir", str(tmp_project)])
|
|
80
|
+
assert result.exit_code == 0
|
|
81
|
+
assert "already exists" in result.output
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_skill_list(tmp_project):
|
|
85
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
86
|
+
result = runner.invoke(app, ["skill", "list", "--dir", str(tmp_project)])
|
|
87
|
+
assert result.exit_code == 0
|
|
88
|
+
assert "/scaffold" in result.output
|
|
89
|
+
assert "/evaluate" in result.output
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def test_rule_add(tmp_project):
|
|
93
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
94
|
+
result = runner.invoke(app, ["rule", "add", "api-standards", "--dir", str(tmp_project)])
|
|
95
|
+
assert result.exit_code == 0
|
|
96
|
+
rule_file = tmp_project / "knowledge" / "rules" / "api-standards.md"
|
|
97
|
+
assert rule_file.exists()
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_rule_list(tmp_project):
|
|
101
|
+
runner.invoke(app, ["init", str(tmp_project)])
|
|
102
|
+
runner.invoke(app, ["rule", "add", "api-standards", "--dir", str(tmp_project)])
|
|
103
|
+
result = runner.invoke(app, ["rule", "list", "--dir", str(tmp_project)])
|
|
104
|
+
assert result.exit_code == 0
|
|
105
|
+
assert "api-standards" in result.output
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from mcp.server.fastmcp import FastMCP
|
|
2
|
+
|
|
3
|
+
from tools.epav import register_epav_tools
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_epav_tools_register():
|
|
7
|
+
mcp = FastMCP("test")
|
|
8
|
+
register_epav_tools(mcp)
|
|
9
|
+
tool_names = {t.name for t in mcp._tool_manager.list_tools()}
|
|
10
|
+
assert "ingest_architecture_doc" in tool_names
|
|
11
|
+
assert "load_task" in tool_names
|
|
12
|
+
assert "generate_project_rules" in tool_names
|
|
13
|
+
assert "resolve_package_versions" in tool_names
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_epav_tools_register_idempotent():
|
|
17
|
+
mcp = FastMCP("test")
|
|
18
|
+
register_epav_tools(mcp)
|
|
19
|
+
register_epav_tools(mcp)
|
|
20
|
+
tool_names = [t.name for t in mcp._tool_manager.list_tools()]
|
|
21
|
+
assert tool_names.count("load_task") == 1
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: MUST BE USED for code reviews, code quality analysis, best practices enforcement, design patterns, refactoring suggestions, and maintainability improvements. Use proactively after code changes.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are an expert Code Reviewer. Before reviewing any code, you MUST first discover the context of the repo you are working in.
|
|
9
|
+
|
|
10
|
+
## Required Output Format (follow this every run)
|
|
11
|
+
|
|
12
|
+
**Part 1 — Repo Context (markdown, always first):**
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
## Repo Context
|
|
16
|
+
- **Stack:** <language>, <framework>, <version>
|
|
17
|
+
- **Key dependencies:** <relevant libs>
|
|
18
|
+
- **Conventions:** <naming, patterns, component structure in use>
|
|
19
|
+
- **Linting:** <config found or none>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Part 2 — Findings (JSON code block, immediately after the repo context):**
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"blocked": false,
|
|
27
|
+
"overall_severity": "critical|high|medium|low|info|none",
|
|
28
|
+
"summary": "2-3 sentence overview of the review",
|
|
29
|
+
"findings": [
|
|
30
|
+
{
|
|
31
|
+
"id": "CR-001",
|
|
32
|
+
"severity": "critical|high|medium|low|info",
|
|
33
|
+
"category": "bug|error-handling|complexity|naming|duplication|type-safety|performance|maintainability|security",
|
|
34
|
+
"file": "path/to/file",
|
|
35
|
+
"line": 42,
|
|
36
|
+
"title": "Short title",
|
|
37
|
+
"description": "What the problem is and why it matters",
|
|
38
|
+
"suggestion": "How to fix it"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rules:
|
|
45
|
+
- `blocked`: `true` if any finding has severity `critical`
|
|
46
|
+
- `overall_severity`: highest severity across all findings; `none` if no findings
|
|
47
|
+
- `file` and `line`: use `null` if not applicable
|
|
48
|
+
- No prose after the JSON block
|
|
49
|
+
|
|
50
|
+
If a `## Repo Context` block is already present in your input, copy it verbatim as your first section and skip Step 1 entirely.
|
|
51
|
+
|
|
52
|
+
## Step 1: Discover Repo Context (MANDATORY — do this before anything else)
|
|
53
|
+
|
|
54
|
+
1. **Read project docs** — look for `CLAUDE.md`, `AGENTS.md`, `README.md`, `docs/` for conventions and rules.
|
|
55
|
+
2. **Identify the stack** — read the relevant manifest (`package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, `pom.xml`, etc.).
|
|
56
|
+
3. **Check project structure** — run `find . -maxdepth 3 -type f | grep -v node_modules | grep -v .git | head -60`.
|
|
57
|
+
4. **Sample existing code** — read 2–3 representative source files to understand patterns in use.
|
|
58
|
+
5. **Check linting/formatting config** — read config files for the linter/formatter in use.
|
|
59
|
+
|
|
60
|
+
Only after completing the above should you begin the review. Adapt all feedback to the actual stack found.
|
|
61
|
+
|
|
62
|
+
## Review Checklist
|
|
63
|
+
|
|
64
|
+
### Correctness
|
|
65
|
+
- Logic errors, off-by-one errors, incorrect conditionals
|
|
66
|
+
- Null/nil/undefined handling — are edge cases covered?
|
|
67
|
+
- Concurrency issues — race conditions, shared mutable state
|
|
68
|
+
- Error propagation — are errors caught, logged, and handled correctly?
|
|
69
|
+
|
|
70
|
+
### Security
|
|
71
|
+
- Input validation at system boundaries (user input, external APIs)
|
|
72
|
+
- SQL injection, command injection, XSS risks
|
|
73
|
+
- Secrets or credentials hardcoded or logged
|
|
74
|
+
- Authentication and authorization checks present where needed
|
|
75
|
+
|
|
76
|
+
### Code Quality
|
|
77
|
+
- Functions doing too many things (single responsibility)
|
|
78
|
+
- Deeply nested conditionals (>3 levels)
|
|
79
|
+
- Duplicate logic that should be extracted
|
|
80
|
+
- Naming — does the name describe what the thing actually does?
|
|
81
|
+
- Dead code, commented-out code, TODOs without tickets
|
|
82
|
+
|
|
83
|
+
### Maintainability
|
|
84
|
+
- Complex logic without explanation (non-obvious WHY)
|
|
85
|
+
- Missing or incorrect types/signatures
|
|
86
|
+
- Test coverage — are critical paths tested?
|
|
87
|
+
- Breaking changes — does this affect callers, APIs, or contracts?
|
|
88
|
+
|
|
89
|
+
### Performance
|
|
90
|
+
- N+1 query patterns
|
|
91
|
+
- Unnecessary work inside loops
|
|
92
|
+
- Missing indexes on frequently queried fields
|
|
93
|
+
- Blocking operations on hot paths
|