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.
Files changed (39) hide show
  1. {nexus_dev_toolkit-3.0.1/nexus_dev_toolkit.egg-info → nexus_dev_toolkit-3.1.0}/PKG-INFO +32 -13
  2. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/README.md +28 -10
  3. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_cli.py +29 -1
  4. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0/nexus_dev_toolkit.egg-info}/PKG-INFO +32 -13
  5. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/SOURCES.txt +13 -0
  6. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/requires.txt +1 -1
  7. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/pyproject.toml +5 -3
  8. nexus_dev_toolkit-3.1.0/tests/test_cli.py +105 -0
  9. nexus_dev_toolkit-3.1.0/tests/test_server.py +21 -0
  10. nexus_dev_toolkit-3.1.0/tools/agents/code-reviewer.md +93 -0
  11. nexus_dev_toolkit-3.1.0/tools/agents/database-reviewer.md +95 -0
  12. nexus_dev_toolkit-3.1.0/tools/agents/deployment-reviewer.md +97 -0
  13. nexus_dev_toolkit-3.1.0/tools/agents/monitoring-reviewer.md +95 -0
  14. nexus_dev_toolkit-3.1.0/tools/agents/performance-reviewer.md +98 -0
  15. nexus_dev_toolkit-3.1.0/tools/epav/skills/__init__.py +0 -0
  16. nexus_dev_toolkit-3.1.0/tools/epav/skills/code-review.md +91 -0
  17. nexus_dev_toolkit-3.1.0/tools/epav/skills/database-review.md +91 -0
  18. nexus_dev_toolkit-3.1.0/tools/epav/skills/deployment-review.md +94 -0
  19. nexus_dev_toolkit-3.1.0/tools/epav/skills/monitoring-review.md +91 -0
  20. nexus_dev_toolkit-3.1.0/tools/epav/skills/performance-review.md +93 -0
  21. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/LICENSE +0 -0
  22. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/dependency_links.txt +0 -0
  23. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/entry_points.txt +0 -0
  24. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_dev_toolkit.egg-info/top_level.txt +0 -0
  25. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/nexus_server.py +0 -0
  26. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/setup.cfg +0 -0
  27. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/__init__.py +0 -0
  28. {nexus_dev_toolkit-3.0.1/tools/epav/skills → nexus_dev_toolkit-3.1.0/tools/agents}/__init__.py +0 -0
  29. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/__init__.py +0 -0
  30. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/arch_ingest.py +0 -0
  31. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/package_resolver.py +0 -0
  32. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/project_rules.py +0 -0
  33. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/apply.md +0 -0
  34. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/epav.md +0 -0
  35. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/evaluate.md +0 -0
  36. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/plan.md +0 -0
  37. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/scaffold.md +0 -0
  38. {nexus_dev_toolkit-3.0.1 → nexus_dev_toolkit-3.1.0}/tools/epav/skills/validate.md +0 -0
  39. {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.1
4
- Summary: LLM-agnostic developer workflow toolkit — Day 0 scaffold + Day 1 EPAV
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.0.0
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
- [![PyPI version](https://img.shields.io/pypi/v/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
24
- [![Python](https://img.shields.io/pypi/pyversions/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
25
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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. Build the knowledge graph
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
- /graphify .
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
- EVALUATE → PLAN → APPLY → VALIDATE. 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.
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 /plan /apply /validate
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
- [![PyPI version](https://img.shields.io/pypi/v/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
4
- [![Python](https://img.shields.io/pypi/pyversions/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
5
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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. Build the knowledge graph
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
- /graphify .
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
- EVALUATE → PLAN → APPLY → VALIDATE. 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.
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 /plan /apply /validate
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.1"
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.1
4
- Summary: LLM-agnostic developer workflow toolkit — Day 0 scaffold + Day 1 EPAV
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.0.0
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
- [![PyPI version](https://img.shields.io/pypi/v/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
24
- [![Python](https://img.shields.io/pypi/pyversions/nexus-dev-toolkit)](https://pypi.org/project/nexus-dev-toolkit/)
25
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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. Build the knowledge graph
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
- /graphify .
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
- EVALUATE → PLAN → APPLY → VALIDATE. 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.
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 /plan /apply /validate
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,4 +1,4 @@
1
- mcp[cli]>=1.0.0
1
+ mcp[cli]>=1.27.1
2
2
  typer>=0.12.0
3
3
  rich>=13.0.0
4
4
 
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "nexus-dev-toolkit"
3
- version = "3.0.1"
4
- description = "LLM-agnostic developer workflow toolkit — Day 0 scaffold + Day 1 EPAV"
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.0.0",
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