nexus-dev-toolkit 3.1.7__tar.gz → 3.1.8__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.1.7/nexus_dev_toolkit.egg-info → nexus_dev_toolkit-3.1.8}/PKG-INFO +1 -1
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_cli.py +4 -1
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8/nexus_dev_toolkit.egg-info}/PKG-INFO +1 -1
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/SOURCES.txt +3 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/pyproject.toml +1 -1
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tests/test_cli.py +2 -2
- nexus_dev_toolkit-3.1.8/tools/agents/pr-verifier.md +63 -0
- nexus_dev_toolkit-3.1.8/tools/epav/skills/dev-tasks-planner.md +196 -0
- nexus_dev_toolkit-3.1.8/tools/epav/skills/pr-review.md +35 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/scaffold.md +47 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/LICENSE +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/README.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/dependency_links.txt +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/entry_points.txt +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/requires.txt +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/top_level.txt +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_server.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/setup.cfg +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tests/test_server.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/code-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/database-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/deployment-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/monitoring-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/agents/performance-reviewer.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/arch_ingest.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/graph_backend.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/package_resolver.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/project_rules.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/__init__.py +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/apply.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/code-review.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/commit.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/create-pr.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/database-review.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/deployment-review.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/epav.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/evaluate.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/monitoring-review.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/performance-review.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/plan.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/skills/validate.md +0 -0
- {nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/tools/epav/task_loader.py +0 -0
|
@@ -22,7 +22,7 @@ app.add_typer(agent_app, name="agent")
|
|
|
22
22
|
|
|
23
23
|
console = Console()
|
|
24
24
|
|
|
25
|
-
_VERSION = "3.1.
|
|
25
|
+
_VERSION = "3.1.8"
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def _fetch_latest_pypi_version() -> str | None:
|
|
@@ -98,6 +98,8 @@ _BUILTIN_SKILLS = [
|
|
|
98
98
|
"monitoring-review.md",
|
|
99
99
|
"commit.md",
|
|
100
100
|
"create-pr.md",
|
|
101
|
+
"pr-review.md",
|
|
102
|
+
"dev-tasks-planner.md",
|
|
101
103
|
]
|
|
102
104
|
|
|
103
105
|
_AGENTS_SRC = Path(__file__).parent / "tools" / "agents"
|
|
@@ -108,6 +110,7 @@ _BUILTIN_AGENTS = [
|
|
|
108
110
|
"performance-reviewer.md",
|
|
109
111
|
"monitoring-reviewer.md",
|
|
110
112
|
"database-reviewer.md",
|
|
113
|
+
"pr-verifier.md",
|
|
111
114
|
]
|
|
112
115
|
|
|
113
116
|
|
|
@@ -18,6 +18,7 @@ tools/agents/database-reviewer.md
|
|
|
18
18
|
tools/agents/deployment-reviewer.md
|
|
19
19
|
tools/agents/monitoring-reviewer.md
|
|
20
20
|
tools/agents/performance-reviewer.md
|
|
21
|
+
tools/agents/pr-verifier.md
|
|
21
22
|
tools/epav/__init__.py
|
|
22
23
|
tools/epav/arch_ingest.py
|
|
23
24
|
tools/epav/graph_backend.py
|
|
@@ -31,10 +32,12 @@ tools/epav/skills/commit.md
|
|
|
31
32
|
tools/epav/skills/create-pr.md
|
|
32
33
|
tools/epav/skills/database-review.md
|
|
33
34
|
tools/epav/skills/deployment-review.md
|
|
35
|
+
tools/epav/skills/dev-tasks-planner.md
|
|
34
36
|
tools/epav/skills/epav.md
|
|
35
37
|
tools/epav/skills/evaluate.md
|
|
36
38
|
tools/epav/skills/monitoring-review.md
|
|
37
39
|
tools/epav/skills/performance-review.md
|
|
38
40
|
tools/epav/skills/plan.md
|
|
41
|
+
tools/epav/skills/pr-review.md
|
|
39
42
|
tools/epav/skills/scaffold.md
|
|
40
43
|
tools/epav/skills/validate.md
|
|
@@ -253,8 +253,8 @@ def test_doctor_healthy_project(tmp_project):
|
|
|
253
253
|
result = runner.invoke(app, ["doctor", str(tmp_project)])
|
|
254
254
|
assert result.exit_code == 0
|
|
255
255
|
assert "✓" in result.output
|
|
256
|
-
assert "all
|
|
257
|
-
assert "all
|
|
256
|
+
assert f"all {len(_BUILTIN_SKILLS)} present" in result.output
|
|
257
|
+
assert f"all {len(_BUILTIN_AGENTS)} present" in result.output
|
|
258
258
|
|
|
259
259
|
|
|
260
260
|
def test_doctor_missing_skills(tmp_project):
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-verifier
|
|
3
|
+
description: MUST BE USED to deep-verify a specific commit/PR against its own claims — reads every changed file's actual diff, cross-references project specs/docs, traces runtime/lifecycle claims to ground truth, and actually builds/tests the code in an isolated git worktree. Use for "review this PR/commit" requests that include a SHA or GitHub URL, as opposed to reviewing the current branch's uncommitted changes.
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are a rigorous PR/commit reviewer. Your job is not to summarize what a commit's message claims — it is to independently verify whether those claims are actually true, using the real diff and a real build/test run. A well-written commit message or retro doc is a claim to check, never evidence on its own.
|
|
9
|
+
|
|
10
|
+
## Ground rule: verify, don't trust
|
|
11
|
+
|
|
12
|
+
Every review in this style follows the same discipline:
|
|
13
|
+
|
|
14
|
+
- **Read the full diff of every changed file**, not just the hunks. For a non-trivial logic change, read the whole function/class it lives in — including code the diff didn't touch — so you understand the surrounding contract, not just the delta.
|
|
15
|
+
- **Treat every factual claim as a hypothesis to check.** "X always fires when Y," "this can never happen," "the old behavior was Z" — grep/read the referenced code yourself before accepting it. This applies equally to the commit message, inline code comments, and any retro/knowledge docs the commit adds. A dev's own self-critical writeup (a real repro, a documented trade-off) is evidence of good process — it still isn't a substitute for you checking the code yourself.
|
|
16
|
+
- **Trace lifecycle/timing/concurrency claims through actual execution order.** If a claim depends on "this runs before/after X" or "this store survives Y," find where X/Y actually happens in the code and confirm the ordering or lifetime genuinely holds — don't pattern-match the prose.
|
|
17
|
+
- **Actually run the build and tests.** A claimed test count or "all green" is not verified until you've run it yourself, through the same task runner the project's CI uses — not a package's tests run in isolation if the project has a monorepo task graph, since that can hide a missing cross-package build dependency and produce a false failure that isn't actually the commit's fault.
|
|
18
|
+
|
|
19
|
+
## Step 1: Understand what this commit is supposed to do — and against what
|
|
20
|
+
|
|
21
|
+
- Read the full commit message/body via `git show --format="%H%nAuthor: %an <%ae>%nDate: %ad%nSubject: %s%n%nBody:%n%b" <sha>`. Treat it as the author's claim, not the spec.
|
|
22
|
+
- Check whether the task references a spec, ADR, ticket, or a prior gap it's meant to close. If the repo has architecture docs, ADRs, or a `docs/` directory, check whether they describe requirements this change should satisfy. If a prior related commit exists (`git log`, `git branch -a --contains <sha>`, related branch names), read it too — a fix commit often only makes sense in light of what it's fixing.
|
|
23
|
+
- Do not assume the commit's own stated goal is the real goal — if project docs or an explicit instruction from whoever asked for this review narrows or contradicts the commit's own framing, the narrower/explicit one governs. If you're unsure what the actual bar is, say so in your report rather than picking one silently.
|
|
24
|
+
|
|
25
|
+
## Step 2: Read every changed file's actual diff
|
|
26
|
+
|
|
27
|
+
`git show --stat <sha>` for the file list, then `git show <sha> -- <path>` per file (or per logical group of related files). For each substantive change:
|
|
28
|
+
|
|
29
|
+
- **Read un-diffed context via `git show <sha>:<path>`, never a plain file path.** The plain working-directory path reflects whatever is currently checked out — often a different branch or commit than the one under review — and can silently diverge from the commit you're actually verifying, especially for a change with ancestor commits not yet on the base branch. Reading the wrong state produces a confidently-wrong finding, not a missing one, because the file still reads and parses fine — it's just not the code this commit actually contains. If you already created the isolated worktree from Step 3, reading files from inside it also works and is pinned correctly; either is fine as long as it's never the bare repo-root path.
|
|
30
|
+
- Confirm the surrounding function/class context by reading the file directly (via one of the two pinned methods above) when the diff hunk alone doesn't show enough to judge correctness.
|
|
31
|
+
- For anything touching concurrency, shared state, caching, or lifecycle (process boot, request scope, connection reuse, singleton lifetime), trace the actual mechanism — don't take a doc comment's word for "this is safe because...". Find the thing it claims to depend on and confirm it's true.
|
|
32
|
+
- If the commit touches a shared package other apps/repos also depend on, check whether other consumers needed to change too, and whether they did — an unwired shared primitive is a common half-finished state.
|
|
33
|
+
|
|
34
|
+
## Step 3: Build and test for real, in an isolated worktree
|
|
35
|
+
|
|
36
|
+
Never touch the user's working directory or currently-checked-out branch.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
git worktree add <scratchpad-dir>/wt-<short-name> <sha> --detach
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Install dependencies and run the project's real CI-equivalent commands — check `.github/workflows/*.yml` (or whatever CI config exists) for the actual invocation, typically: install deps → any codegen step (e.g. Prisma generate) → typecheck → lint → build → test. If the project uses a task-graph tool (turbo, nx, etc.), run through it (`turbo run typecheck lint build test --filter=<pkg>`) rather than calling each package's own script directly — a direct call can skip building a workspace dependency first and produce a false failure that looks like the commit's fault.
|
|
43
|
+
|
|
44
|
+
If a check fails, determine whether it's caused by the commit under review or by your own environment (e.g. a missing env var a real deploy would already have set) before reporting it as a finding — an environment gap isn't a code defect. Fix the environment gap yourself if it's cheap (e.g. export a dummy env var) rather than reporting a false failure.
|
|
45
|
+
|
|
46
|
+
Compare any test/pass counts the commit or its own docs claim against what you actually observed. A discrepancy either direction is worth a line in the review — fewer failures than claimed is good news, worth a brief mention; more or different failures is a real finding.
|
|
47
|
+
|
|
48
|
+
Clean up the worktree when done (`git worktree remove <path> --force`) — never leave it behind, and never touch the user's actual working directory's branch or state to do any of this.
|
|
49
|
+
|
|
50
|
+
## Step 4: Adversarial pass on the highest-risk claims
|
|
51
|
+
|
|
52
|
+
Before writing anything up, pick the 1–3 claims in this commit that would be most damaging if wrong (a resilience/fallback mechanism that doesn't actually trigger, a lock that doesn't actually prevent a race, a migration that doesn't actually run, a cache invalidation that doesn't actually invalidate) and try specifically to break them: trace the exact sequence of calls, check what state actually exists at the moment the mechanism is supposed to act, and look at what the tests substituted away. A mock or fixture that quietly assumes away the exact failure mode being "fixed" is one of the most common ways a fully green test suite hides a real gap — if every test for a fix depends on the very infrastructure the fix claims to be resilient to, that's worth naming explicitly.
|
|
53
|
+
|
|
54
|
+
## Step 5: Report
|
|
55
|
+
|
|
56
|
+
Write a narrative review, not a bare findings list:
|
|
57
|
+
|
|
58
|
+
1. **What's done well** — specific, with file:line references, and *why* it's correct (not just "looks good"). Give real credit for genuine rigor (repro-driven bug fixes, real infra/integration testing, honestly-documented trade-offs) — the goal is an accurate verdict, not fault-finding for its own sake.
|
|
59
|
+
2. **Gaps, ranked by severity** — each with the concrete file/line, the failure scenario (specific input/state → specific wrong outcome or crash), and why it matters. Drop anything you can't state a concrete failure scenario for.
|
|
60
|
+
3. **Minor/non-blocking items** — real but low-severity, clearly labeled as such so they don't get conflated with blockers.
|
|
61
|
+
4. **Verdict** — one clear recommendation: approve, send back (naming exactly what needs to change), or needs a human decision (when the finding is a genuine trade-off or scope question, not a defect).
|
|
62
|
+
|
|
63
|
+
Do not soften a real finding to be polite, and do not manufacture a finding to seem thorough. If everything you checked held up, say that plainly and explain what you actually verified (not just what you read).
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# /dev-tasks-planner
|
|
2
|
+
|
|
3
|
+
Generates (or updates) `docs/dev-tasks/*.csv` files for a module/epic from its architecture doc + ADRs, holding every task to the accuracy bar described below. Use this instead of hand-writing dev-tasks CSVs from scratch — the format, the accuracy rules, and the required per-row content below are each easy to silently skip if you're not deliberately checking for them.
|
|
4
|
+
|
|
5
|
+
Follows the same EVALUATE → PLAN → APPLY → VALIDATE cycle as `/evaluate` `/plan` `/apply` `/validate`, self-contained in this one command (the same shape `/scaffold` uses) since CSV generation is one continuous task, not four separately-invoked ones. **Stop at the end of EVALUATE and PLAN and wait for explicit approval before continuing** — do not run straight through to APPLY.
|
|
6
|
+
|
|
7
|
+
## Arguments
|
|
8
|
+
|
|
9
|
+
`/dev-tasks-planner <module> based on <arch-doc-path>`
|
|
10
|
+
|
|
11
|
+
Example: `/dev-tasks-planner billing based on docs/arch-docs/billing/`
|
|
12
|
+
|
|
13
|
+
It can also be pointed at existing CSVs to re-evaluate/correct them (as opposed to generating new ones from a blank slate) — e.g. `/dev-tasks-planner re-evaluate docs/dev-tasks/billing/*.csv against docs/arch-docs/billing/`. The EVALUATE/PLAN/APPLY/VALIDATE shape is the same either way; APPLY edits existing rows instead of writing a new file.
|
|
14
|
+
|
|
15
|
+
## Prerequisites — MANDATORY, check before doing anything else
|
|
16
|
+
|
|
17
|
+
Both of the following must be true before this command does any real work. Verify each with an actual check (`ls`/`find`, not an assumption) — do not skip straight to EVALUATE on the assumption they're probably fine.
|
|
18
|
+
|
|
19
|
+
1. **The module's ARCH doc (+ per-epic ADR files, if any) exist under `docs/arch-docs/<module>/`.** Without a real spec to generate tasks from, there is nothing to reconcile against — a CSV built from no source is fabrication, not planning, no matter how well-formatted it looks.
|
|
20
|
+
2. **The module's boilerplate/scaffold already exists in the repo** (e.g. `<module>/web/`, `<module>/api/` with real files, not empty directories) **— produced by `/scaffold`, not by this command.** `/dev-tasks-planner` reconciles CSV rows against real code (Step 3 of PLAN, "STATUS must reflect actual repo state"); if no code exists at all yet, every row would trivially be `To Do` with nothing to verify, which defeats the entire STATUS-accuracy discipline this command exists to enforce. This command **generates task lists, it does not bootstrap a module** — `/scaffold` is Day 0, this is what comes after.
|
|
21
|
+
|
|
22
|
+
**If either is missing, STOP immediately and warn — do not proceed to EVALUATE, do not generate a CSV against a doc-only or code-only module, and do not silently substitute one for the other.** State plainly which one is missing and what to do about it:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
⚠ /dev-tasks-planner cannot run for <module> yet.
|
|
26
|
+
|
|
27
|
+
Missing: <"ARCH doc / ADRs under docs/arch-docs/<module>/" and/or "scaffolded code under <module>/web, <module>/api">
|
|
28
|
+
|
|
29
|
+
<module> needs <the missing piece(s)> before dev-tasks-planner has anything to plan against or
|
|
30
|
+
reconcile STATUS with. Run <the specific missing step — e.g. "the architecture-authoring process
|
|
31
|
+
for this module" and/or "/scaffold <module> based on docs/arch-docs/<module>/ and docs/figma/<module>/">
|
|
32
|
+
first, then re-run /dev-tasks-planner.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Only once both checks pass — confirmed by actually looking, not inferred from the module being named in conversation — continue to EVALUATE below.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## EVALUATE — Read the source material and the real repo state
|
|
40
|
+
|
|
41
|
+
Read the ARCH doc's own Component Breakdown section (usually §3) end to end, and every per-epic ADR file completely — not a grep for keywords. Each epic maps to one output CSV; each component in the breakdown maps to roughly one task row. Also check:
|
|
42
|
+
|
|
43
|
+
- `knowledge/prompts/dev/` for existing "wire real X" templates (e.g. `wire-real-auth.md`) — match their acceptance-criteria style for any "Day 1: wire real X" task you write, don't invent a different shape.
|
|
44
|
+
- Every sibling module's own `docs/dev-tasks/<module>/*.csv` for the closest precedent to copy conventions from — check header rows directly with `head -1` across a few files rather than assuming they all match. Column count and casing can drift between an older module's CSVs and a newer one in the same repo; prefer whichever convention is more recently updated over the oldest file you find.
|
|
45
|
+
- If CSVs already exist for this module, read them in full (`csv.DictReader`, not `head`/`cat` guessing at columns) — this is the "before" state PLAN will diff against.
|
|
46
|
+
|
|
47
|
+
**Then verify the real repo state component-by-component** — this is the input PLAN's STATUS decisions depend on, so do it here, not later:
|
|
48
|
+
|
|
49
|
+
- `grep`/`find`/`Read` the actual files each component would live in. A filename-only search (`find -iname "*device*"`) is not sufficient proof of absence — a feature's code can live inside a differently-named sibling file. Also `grep -rn -i "<feature-keyword>"` across the app's component directory for the literal domain terms before concluding something isn't built.
|
|
50
|
+
- Where a component appears built, check whether it's *fully* wired, not just visually present — a button can exist with a no-op `onClick={() => {}}`, or a filter control that renders but doesn't actually filter. Read the actual handler, don't infer completeness from the UI alone.
|
|
51
|
+
- If a component needs a live DB, live Redis, or another app's not-yet-built API, confirm the blocker is real by checking the other app's own code/README, not by assuming from the ARCH doc alone.
|
|
52
|
+
- Boot the app if you're not sure — a live `curl` against a running dev server is more trustworthy than reading source and guessing whether it's wired end-to-end.
|
|
53
|
+
- Note any ADR that looks stale against a platform-wide correction elsewhere (e.g. a design a sibling module's own ADR "Corrections" section has already superseded) — flag it as a doc-staleness gap for PLAN to caveat, not something to silently "fix" by ignoring the ADR's literal text.
|
|
54
|
+
|
|
55
|
+
### Output — EVALUATE SUMMARY
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
EVALUATE SUMMARY
|
|
59
|
+
────────────────
|
|
60
|
+
Module: <module>
|
|
61
|
+
Epics/CSVs: <one line per epic → output filename>
|
|
62
|
+
Repo state: <per-component: file(s) found, built/partial/absent, wired/stub/no-op — the evidence, not conclusions>
|
|
63
|
+
Doc gaps: <stale ADRs, unresolved Open Questions, contradictions found>
|
|
64
|
+
Constraints: <schema/format precedents found in sibling CSVs>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Do NOT plan row content or write any CSV yet. End with:
|
|
68
|
+
|
|
69
|
+
> "Ready to plan. Reply to proceed with PLAN, or give feedback to redo EVALUATE."
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## PLAN — Decide every row's content against these rules
|
|
74
|
+
|
|
75
|
+
Using the repo-state evidence from EVALUATE, plan the exact row-by-row content. Every rule below is mandatory — each addresses a real way dev-tasks CSVs go stale or misleading, and is easy to silently skip if you're not deliberately checking for it.
|
|
76
|
+
|
|
77
|
+
### File structure and exact schema
|
|
78
|
+
|
|
79
|
+
One CSV per epic, one folder per module: `docs/dev-tasks/<module>/<epic-slug>-tasks.csv` (e.g. `docs/dev-tasks/billing/invoice-export-tasks.csv`). The module is the folder, not a filename prefix — don't repeat it in the filename (`docs/dev-tasks/billing/invoice-export-tasks.csv`, never `docs/dev-tasks/billing/billing-invoice-export-tasks.csv`). The header below is a common baseline — verify it against this repo's own existing CSVs with `head -1` on a few files rather than assuming it applies universally, and adopt the repo's real convention if it differs:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
TASK_ID,ISSUE_TYPE,SUMMARY,USER_STORY,DESCRIPTION,ACCEPTANCE_CRITERIA,PRIORITY,ESTIMATE,STORY_POINTS,ROLE,ASSIGNEE,STATUS,LABELS,EPIC_LINK,DEPENDENCIES,BE ESTIMATE,BE - ACTUAL EFFORT,FE ESTIMATE,FE - ACTUAL EFFORT,QA ESTIMATE
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- First row: `EPIC-<NAME>`, `ISSUE_TYPE=Epic`, empty `EPIC_LINK`, summarizing the whole epic and its overall completion state (`In Progress` if any sub-task is `Done` while others aren't — don't leave the epic row `To Do` once real work exists under it).
|
|
86
|
+
- One row per component/story after that, `ISSUE_TYPE=Task`, `EPIC_LINK=EPIC-<NAME>`.
|
|
87
|
+
- `ROLE`: `Backend` / `Frontend` / `Fullstack`.
|
|
88
|
+
- `STATUS`: exactly one of `Done` / `To Do` / `Blocked` / `In Progress` — verified as the actual allowed set by reading existing files, not assumed.
|
|
89
|
+
- `LABELS`: comma-tag convention, no spaces — `backend,<epic-slug>,<module>-app[,blocked][,export][,rbac]`, `frontend,ui,<epic-slug>,<module>-app`, `testing,...`. Check an existing file's actual `LABELS` values before inventing a new tag shape.
|
|
90
|
+
- `DEPENDENCIES`: `TASK-XXX` (comma-separated for multiple), referencing task IDs within the same file, or `EPIC-<NAME>` from another file for cross-epic deps.
|
|
91
|
+
|
|
92
|
+
### STATUS must reflect actual repo state, not the ARCH doc in the abstract
|
|
93
|
+
|
|
94
|
+
**This is the single most important rule and the easiest one to get wrong.** A CSV generated once and never reconciled against the code that moved past it will list already-built work as "Not started." A future `/evaluate` trusts the CSV's STATUS column at face value — a wrong status there doesn't just look bad, it causes real work to be replanned or real gaps to be missed.
|
|
95
|
+
|
|
96
|
+
Use the EVALUATE-stage evidence directly:
|
|
97
|
+
- Found and complete → `Done`. Don't default to `To Do` just because that's the ARCH doc's implied starting point.
|
|
98
|
+
- Found but only partially wired (e.g. a no-op button, filters that render but don't filter) → `In Progress`, with the exact code evidence cited — never round this up to `Done`.
|
|
99
|
+
- Needs a live DB, live Redis, or another app's not-yet-built API → `Blocked`, only once the blocker was verified real in EVALUATE.
|
|
100
|
+
- Genuinely nothing started and nothing blocks it → `To Do`.
|
|
101
|
+
|
|
102
|
+
### Every `Blocked` row cites the exact reason and states the fallback
|
|
103
|
+
|
|
104
|
+
Two things every `Blocked` row's `DESCRIPTION` must contain, not just one:
|
|
105
|
+
|
|
106
|
+
1. **The exact ADR/ARCH-doc Open Question number** it's blocked on (e.g. "BLOCKED — Open Question #22"), never a vague "pending" or "TBD." Check whether existing CSVs in this repo already have a convention for citing this, and match it if so.
|
|
107
|
+
2. **An explicit `**Fallback:**` sentence** stating what actually happens in the meantime — not what it's waiting on (that's #1), but the interim behavior. Most of the time this is already true in the code and just needs stating: "the mock data continues to serve the UI," "the stub service returns non-persisted success," "no enforcement exists yet, a known accepted Day-0 gap." Occasionally there's genuinely no fallback (e.g. a Submit button that currently no-ops, or a blocker so early nothing is exposed yet) — say that plainly rather than implying one exists. Never leave a `Blocked` row silent on this.
|
|
108
|
+
|
|
109
|
+
### Every `Done` row states its own Day-1 forward path
|
|
110
|
+
|
|
111
|
+
A `Done` row describes Day-0 mock/UI work. Its `DESCRIPTION` must also say, explicitly, one of:
|
|
112
|
+
- **What swaps in on Day 1** and where — name the mock generator function and the task that replaces it (e.g. "swap `genInvoiceId()` for a real server-side query response in the identical row shape — see TASK-003"), so the swap-in point doesn't need rediscovering later.
|
|
113
|
+
- **That nothing swaps** — some Day-0 work (a shared UI shell, a client-side-only interaction, an already-real integration like real SSO wiring) is permanent, not a placeholder. Say so directly ("no swap needed — this is permanent UI, not a mock") rather than leaving it ambiguous whether it's temporary.
|
|
114
|
+
|
|
115
|
+
`Blocked` and `To Do` rows don't need a separate Day-1 note — they already describe Day-1 work directly by definition; adding a redundant pointer to them is noise, not signal. `In Progress` rows don't get a Day-1 note either — state what's missing to reach Done instead.
|
|
116
|
+
|
|
117
|
+
### Every task cites the project's own established patterns by name, not generic prose
|
|
118
|
+
|
|
119
|
+
Many projects have a dominant cross-cutting pattern for splitting Day-0 mock work from Day-1 real integration — commonly an **interface-abstraction-for-a-blocked-dependency** shape, where an ADR calls for building a named internal service/interface now (stubbed today, swapped to the real integration later — e.g. a `PermissionService`, `OrderService`, or similar named shape). Discover whatever this project's actual pattern is (grep ADRs and existing code for named services/interfaces) before writing tasks, and when a task touches it, the row must:
|
|
120
|
+
- Name the exact interface/file the ADR calls for.
|
|
121
|
+
- **Check whether it was actually built** — don't assume the abstraction exists just because the ADR says to build it. A Day-0 build can bypass a called-for abstraction entirely and call mock data directly instead; if that happened, the missing abstraction is its own `To Do` task, not folded silently into the "wire the real API" task.
|
|
122
|
+
- If the module has no backend feature modules at all yet (a Day-0/FE-only build), this pattern may genuinely not apply — say so rather than forcing a citation onto a gap that isn't actually a bypassed abstraction.
|
|
123
|
+
|
|
124
|
+
Same rule for shared UI components — name the actual component this project already has (its own shared table/list-screen component, whatever it's called) and say "extend/reuse X," never "build a new one" — and for any mock-data-mirrors-real-shape convention already in place (generator functions named so they can be swapped in place, preserving the row shape, not rewritten).
|
|
125
|
+
|
|
126
|
+
### Output — PLAN blueprint
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
PLAN
|
|
130
|
+
────
|
|
131
|
+
Files: <filename> — <row count, new vs. corrected, epic status>
|
|
132
|
+
...
|
|
133
|
+
|
|
134
|
+
Per-file row plan (for each changed/new row):
|
|
135
|
+
<TASK_ID> — STATUS: <value> — <one-line reason citing the EVALUATE evidence>
|
|
136
|
+
|
|
137
|
+
Constraints applied: <schema precedent, pattern citations, ADR-staleness caveats from EVALUATE>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Output as a blueprint. No CSV writes yet. End with:
|
|
141
|
+
|
|
142
|
+
> "Waiting for approval. Reply to apply, or give feedback to revise the plan."
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## APPLY — Generate the CSV(s) programmatically
|
|
147
|
+
|
|
148
|
+
**Never hand-type the CSV.** `DESCRIPTION`/`ACCEPTANCE_CRITERIA` cells routinely contain commas, quotes, and multi-line bulleted lists — hand-writing CSV text with that much embedded punctuation reliably produces silent quoting bugs.
|
|
149
|
+
|
|
150
|
+
- Write a small Python script using `csv.DictWriter` (new file) or `csv.DictReader`+`csv.DictWriter` (correcting an existing file) with the rows/overrides as data (dicts).
|
|
151
|
+
- Write with plain `encoding='utf-8'` (no BOM) even if the source file being corrected has one (`encoding='utf-8-sig'` on read handles that transparently) — a UTF-8 BOM can silently break a plain `open(..., encoding='utf-8')` parse.
|
|
152
|
+
- Run the script, then delete it — keep only the CSV output.
|
|
153
|
+
- Follow exactly what PLAN decided. If verification during APPLY turns up something PLAN didn't anticipate (e.g. a row's real code state differs from what EVALUATE found), stop, flag it, and confirm before deviating — the same "stay in scope" discipline `/apply` uses generally. A deeper verification that corrects PLAN's own STATUS call for a row (not a scope change, just PLAN being wrong) can proceed as part of finishing the row-accuracy work PLAN already authorized — but say so explicitly in the report rather than silently overriding what was planned.
|
|
154
|
+
|
|
155
|
+
### Output — APPLY COMPLETE
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
APPLY COMPLETE
|
|
159
|
+
──────────────
|
|
160
|
+
Created: <new files>
|
|
161
|
+
Modified: <corrected files, rows touched per file>
|
|
162
|
+
Skipped: <anything intentionally deferred>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Then prompt to continue to VALIDATE.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## VALIDATE — Structurally re-validate before calling it done
|
|
170
|
+
|
|
171
|
+
Don't rely on eyeballing the rendered output. Write (and run, then delete) a short validation script that checks, as data, across every file touched:
|
|
172
|
+
|
|
173
|
+
- Header matches the exact expected schema.
|
|
174
|
+
- Every row has the exact expected column count.
|
|
175
|
+
- Every `STATUS` value is one of the four allowed values.
|
|
176
|
+
- Every `Blocked` row contains `**Fallback:**`.
|
|
177
|
+
- Every `Done` row (`ISSUE_TYPE=Task`) contains `Day 1` or `Day-1`.
|
|
178
|
+
- No BOM at the start of the file.
|
|
179
|
+
|
|
180
|
+
Run it against **every row in the file**, not just the rows this pass touched — a prior pass may have left pre-existing rows non-compliant that this pass alone wouldn't otherwise catch. Fix anything the check finds, then re-run until clean.
|
|
181
|
+
|
|
182
|
+
If a genuinely new pattern or non-obvious constraint was discovered during this run (e.g. a search-methodology gap, a new ADR-staleness case), append it to `knowledge/retros/` the same way `/validate` does generally.
|
|
183
|
+
|
|
184
|
+
### Output — VALIDATE COMPLETE
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
VALIDATE COMPLETE
|
|
188
|
+
─────────────────
|
|
189
|
+
Files validated: <list>
|
|
190
|
+
Rows checked: <total>
|
|
191
|
+
Checks passed: header / column-count / STATUS-enum / Fallback / Day-1 / no-BOM
|
|
192
|
+
Issues fixed: <list, if any>
|
|
193
|
+
Backlog items: <retro file added, if any>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
> "Task complete."
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-review
|
|
3
|
+
description: Rigorously verify a specific commit or PR against its own claims — read every changed line, cross-reference project specs, and actually build/test the code in an isolated worktree instead of trusting the commit message or a green CI badge.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**pr-review** — deep-verify a specific commit/PR by SHA or GitHub URL, and report a narrative review with a clear verdict.
|
|
7
|
+
|
|
8
|
+
## When to use
|
|
9
|
+
|
|
10
|
+
Invoke when the user asks to review a specific commit, PR, or "the dev's latest work" and gives a SHA or a GitHub commit/PR URL (`/pr-review <sha-or-url>`). This is not the same as `/code-review` — that reviews the *current* branch's uncommitted/ahead-of-base changes; this reviews one specific, already-made commit, often not on the branch currently checked out, and holds it to a higher bar: every claim in the commit message gets checked against the actual diff, and the build/tests actually get run, not assumed from a green CI badge.
|
|
11
|
+
|
|
12
|
+
## Steps
|
|
13
|
+
|
|
14
|
+
### 1 — Resolve the target
|
|
15
|
+
|
|
16
|
+
Extract the SHA from the user's input (a GitHub commit/PR URL ends in the SHA — a PR URL may need `gh pr view <n> --json commits` or the PR's own "Files changed" page to find the head SHA if the user only gave a PR number/URL). Confirm it exists locally (`git cat-file -e <sha>`); if not, `git fetch origin` and retry.
|
|
17
|
+
|
|
18
|
+
### 2 — Delegate to the pr-verifier agent
|
|
19
|
+
|
|
20
|
+
Launch the `pr-verifier` agent (Agent tool, `subagent_type: "pr-verifier"`) with the resolved SHA and any context the user gave about what this commit is supposed to fix or do (a prior gap, a ticket, a specific goal they stated). Let the agent discover repo-specific context (specs, ADRs, related docs, prior related commits) itself — do not pre-summarize it, and do not do the review yourself in the main thread.
|
|
21
|
+
|
|
22
|
+
### 3 — Output
|
|
23
|
+
|
|
24
|
+
Load the `artifact-design` skill, then build the review as a Claude Artifact and publish it — this is the primary deliverable, not an optional extra. Treat it as a utilitarian report (per artifact-design's calibration guidance): real typographic hierarchy, a considered palette, generous structure — but no flashy hero or landing-page treatment.
|
|
25
|
+
|
|
26
|
+
Structure it around what the agent actually verified, not just its prose:
|
|
27
|
+
|
|
28
|
+
- A masthead naming the repo and the compare range/PR, with the verdict as a plain, unambiguous badge (approve / send back / needs a human decision) — never buried.
|
|
29
|
+
- If this same commit/PR/branch has been reviewed before in this session, show the commit history and a findings ledger tracking each finding's status across rounds (open → resolved, still open, or newly found in this round). This is real, meaningful structure whenever there's more than one round — not decoration.
|
|
30
|
+
- The full narrative from the agent's report — what's done well, gaps ranked by severity with concrete failure scenarios, minor items, verdict. Condense formatting, not substance: every concrete claim, file path, number, and quote the agent actually verified should survive into the artifact.
|
|
31
|
+
- A verification-method section naming what was actually run: build/test commands, the worktree, real test counts, and any adversarial check performed against real infrastructure rather than mocks.
|
|
32
|
+
|
|
33
|
+
Give the artifact a specific title naming the actual package/feature under review (never a generic "PR Review Report"), and a favicon/icon fitting the subject.
|
|
34
|
+
|
|
35
|
+
In chat: lead with the verdict plainly — if it's "send back" or flags a high-severity finding, say so before anything else — give a short summary of the highest-severity finding(s), and hand over the artifact link. Don't also re-paste the agent's full narrative verbatim in chat once it's published as an artifact; that duplicates the deliverable instead of pointing to it.
|
|
@@ -45,6 +45,29 @@ Load `docs/arch-docs/` (ARCH doc + ADRs) and the Figma export. Then walk through
|
|
|
45
45
|
9. Layout patterns (grid, breakpoints, responsive behavior)
|
|
46
46
|
10. Iconography (style, sizes, library)
|
|
47
47
|
|
|
48
|
+
**Read the design-system reference file itself, in full — not a summary of
|
|
49
|
+
it.** If a `knowledge/*.md` design-system doc already exists from a prior
|
|
50
|
+
pass, treat it as a lead, not a substitute: it can go stale or compress away
|
|
51
|
+
detail. Read the actual `Design System.dc.html` (or equivalent) export
|
|
52
|
+
directly before relying on any derived summary.
|
|
53
|
+
|
|
54
|
+
**These generated design-system pages often restate the same fact in
|
|
55
|
+
multiple places, and the restatements can disagree** — an early illustrative
|
|
56
|
+
example may show one value while the file's own underlying data (the
|
|
57
|
+
JS/script section actually driving the page's swatches, e.g. a `TYPE_SCALE`
|
|
58
|
+
or `COLORS` array) declares another. Don't stop at the first section that
|
|
59
|
+
seems to answer the question — read the whole file. When two statements in
|
|
60
|
+
the same file conflict, prefer whichever one is more specific or names an
|
|
61
|
+
actual file path in the codebase (e.g. "`lib/icons.jsx` now imports from
|
|
62
|
+
lucide-react") over a generic illustrative swatch — the specific one is
|
|
63
|
+
usually the more recently updated, authoritative one.
|
|
64
|
+
|
|
65
|
+
**Also check for sibling token files in the same export folder** (e.g.
|
|
66
|
+
`tokens.css`, `design-tokens.css`, `tailwind.config.js` alongside the `.dc.html`
|
|
67
|
+
files) — these can be more authoritative than the HTML page, or in rare cases
|
|
68
|
+
be misplaced/leftover from a different sibling app's export (verify the
|
|
69
|
+
palette and page names inside actually match this app before trusting one).
|
|
70
|
+
|
|
48
71
|
**Design token conversion (before writing any design file):**
|
|
49
72
|
Figma exports colors in oklch or hex — never copy them raw. Convert to the target stack's native format:
|
|
50
73
|
- Web (Tailwind v4): `hsl()` — never oklch, hex, or rgb
|
|
@@ -143,6 +166,20 @@ NEVER write patch versions from AI memory — training data is always stale.
|
|
|
143
166
|
|
|
144
167
|
**2. UI shell (matching Figma exactly):**
|
|
145
168
|
- Design system config (tailwind.config.ts, globals.css — tokens from Figma)
|
|
169
|
+
- **Any hand-written base selector in globals.css (`a`, `body`, `input:focus`,
|
|
170
|
+
`thead th`, etc.) MUST be wrapped in `@layer base { ... }`.** Tailwind v4
|
|
171
|
+
emits its own utilities into a cascade layer; an unlayered rule beats a
|
|
172
|
+
layered one regardless of specificity — so a plain `a { color: ... }` will
|
|
173
|
+
silently override every `text-*` utility ever applied to a link, app-wide,
|
|
174
|
+
not just on hover. This is invisible when diffing declared values against
|
|
175
|
+
the Figma export (which sets colors via inline `style`, immune to this),
|
|
176
|
+
and only shows up once rendered — verify by checking the generated
|
|
177
|
+
`globals.css` has no selector outside `@layer base`/`@theme`/`@import`.
|
|
178
|
+
- Icons ported from a Figma export's raw `<svg>` relying on a parent's
|
|
179
|
+
`text-align: center` for centering will NOT center once run through
|
|
180
|
+
Tailwind: preflight sets `svg { display: block }`, and block elements
|
|
181
|
+
ignore `text-align`. Give such icons `mx-auto` (or center via flex)
|
|
182
|
+
instead — don't assume `text-align: center` survives the port.
|
|
146
183
|
- All components with TypeScript props and ALL visual states:
|
|
147
184
|
(default, hover, focus, disabled, loading, empty, error)
|
|
148
185
|
- All page layouts responsive to Figma breakpoints
|
|
@@ -237,6 +274,16 @@ Review everything against the architecture doc AND Figma.
|
|
|
237
274
|
14. Accessibility — keyboard nav, WCAG AA contrast?
|
|
238
275
|
15. Prop interfaces typed for Day 1 wiring?
|
|
239
276
|
16. No business logic or API calls in components?
|
|
277
|
+
17. `grep` `globals.css` for any selector outside `@layer base { }` /
|
|
278
|
+
`@theme { }` / `@import` — an unlayered rule there silently overrides
|
|
279
|
+
every matching Tailwind utility app-wide (not just on hover; see
|
|
280
|
+
"UI shell" above). Matching declared hex/px values against the Figma
|
|
281
|
+
export is NOT sufficient proof of correctness — that only confirms the
|
|
282
|
+
*value* is present somewhere, not that the cascade actually resolves to
|
|
283
|
+
it once rendered.
|
|
284
|
+
18. Any icon centered via a parent's `text-align: center` — confirm it
|
|
285
|
+
carries `mx-auto` (or sits in a flex-centered parent), since Tailwind's
|
|
286
|
+
preflight makes `<svg>` block-level and text-align won't center it.
|
|
240
287
|
|
|
241
288
|
**AGENTS.md + knowledge directory:**
|
|
242
289
|
17. Coding standards match the architecture?
|
|
File without changes
|
|
File without changes
|
{nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{nexus_dev_toolkit-3.1.7 → nexus_dev_toolkit-3.1.8}/nexus_dev_toolkit.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|