uv-suite 0.29.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -46
  3. package/agents/claude-code/anti-slop-guard.md +14 -1
  4. package/agents/claude-code/architect.md +30 -4
  5. package/agents/claude-code/cartographer.md +18 -6
  6. package/agents/claude-code/eval-writer.md +7 -2
  7. package/agents/claude-code/reviewer.md +5 -1
  8. package/agents/claude-code/spec-writer.md +30 -7
  9. package/agents/generate.py +88 -0
  10. package/bin/cli.js +146 -73
  11. package/hooks/auto-checkpoint-helper.sh +2 -2
  12. package/hooks/auto-checkpoint.sh +3 -3
  13. package/hooks/auto-restore-on-start.sh +2 -2
  14. package/hooks/checkpoint-helper.sh +40 -35
  15. package/hooks/git-context.sh +41 -0
  16. package/hooks/lite-mode-inject.sh +26 -0
  17. package/hooks/session-end-helper.sh +2 -2
  18. package/hooks/session-end.sh +2 -2
  19. package/hooks/session-label-nag.sh +2 -2
  20. package/hooks/session-meta.sh +18 -1
  21. package/hooks/session-review-reminder.sh +2 -2
  22. package/hooks/session-start.sh +16 -0
  23. package/hooks/slop-grep.sh +12 -31
  24. package/hooks/uv-out-best.sh +20 -0
  25. package/hooks/uv-out-collect.sh +52 -0
  26. package/hooks/uv-out-notify.sh +35 -0
  27. package/hooks/uv-out-pointer.sh +16 -0
  28. package/hooks/uv-out-session.sh +24 -0
  29. package/hooks/watchtower-end.sh +23 -0
  30. package/hooks/watchtower-notify.sh +56 -0
  31. package/hooks/watchtower-send.sh +10 -3
  32. package/hooks/watchtower-tokens.sh +61 -0
  33. package/install.sh +93 -42
  34. package/package.json +6 -3
  35. package/personas/auto.json +59 -1
  36. package/personas/professional.json +65 -1
  37. package/personas/spike.json +51 -2
  38. package/personas/sport.json +63 -1
  39. package/settings.json +6 -2
  40. package/skills/architect/SKILL.md +109 -8
  41. package/skills/architect/specialists/distributed-systems.md +84 -0
  42. package/skills/architect/specialists/full-stack.md +92 -0
  43. package/skills/architect/specialists/llm-ai-engineering.md +86 -0
  44. package/skills/architect/specialists/ml-systems.md +81 -0
  45. package/skills/commit/SKILL.md +5 -2
  46. package/skills/confirm/SKILL.md +3 -3
  47. package/skills/investigate/SKILL.md +14 -4
  48. package/skills/lite/SKILL.md +45 -0
  49. package/skills/qa/SKILL.md +274 -0
  50. package/skills/review/SKILL.md +187 -8
  51. package/skills/review/specialists/api-contract.md +122 -0
  52. package/skills/review/specialists/architecture-trace.md +64 -0
  53. package/skills/review/specialists/data-migration.md +113 -0
  54. package/skills/review/specialists/maintainability.md +138 -0
  55. package/skills/review/specialists/performance.md +115 -0
  56. package/skills/review/specialists/security.md +132 -0
  57. package/skills/review/specialists/testing.md +109 -0
  58. package/skills/session/SKILL.md +87 -0
  59. package/skills/session/operations/auto.md +22 -0
  60. package/skills/session/operations/checkpoint.md +43 -0
  61. package/skills/session/operations/end.md +35 -0
  62. package/skills/session/operations/init.md +16 -0
  63. package/skills/session/operations/restore.md +16 -0
  64. package/skills/spec/SKILL.md +40 -1
  65. package/skills/test/SKILL.md +89 -0
  66. package/skills/test/specialists/eval.md +46 -0
  67. package/skills/test/specialists/integration.md +42 -0
  68. package/skills/test/specialists/unit.md +39 -0
  69. package/skills/understand/SKILL.md +118 -0
  70. package/skills/understand/modes/repo.md +38 -0
  71. package/skills/understand/modes/stack.md +41 -0
  72. package/skills/uv-help/SKILL.md +43 -20
  73. package/uv.sh +36 -3
  74. package/watchtower/README.md +73 -0
  75. package/watchtower/app/__init__.py +0 -0
  76. package/watchtower/app/__pycache__/__init__.cpython-312.pyc +0 -0
  77. package/watchtower/app/__pycache__/__init__.cpython-314.pyc +0 -0
  78. package/watchtower/app/__pycache__/db.cpython-312.pyc +0 -0
  79. package/watchtower/app/__pycache__/db.cpython-314.pyc +0 -0
  80. package/watchtower/app/__pycache__/main.cpython-312.pyc +0 -0
  81. package/watchtower/app/__pycache__/main.cpython-314.pyc +0 -0
  82. package/watchtower/app/__pycache__/models.cpython-312.pyc +0 -0
  83. package/watchtower/app/__pycache__/models.cpython-314.pyc +0 -0
  84. package/watchtower/app/db.py +129 -0
  85. package/watchtower/app/main.py +43 -0
  86. package/watchtower/app/models.py +54 -0
  87. package/watchtower/app/routers/__init__.py +0 -0
  88. package/watchtower/app/routers/__pycache__/__init__.cpython-312.pyc +0 -0
  89. package/watchtower/app/routers/__pycache__/__init__.cpython-314.pyc +0 -0
  90. package/watchtower/app/routers/__pycache__/control.cpython-312.pyc +0 -0
  91. package/watchtower/app/routers/__pycache__/control.cpython-314.pyc +0 -0
  92. package/watchtower/app/routers/__pycache__/ingest.cpython-312.pyc +0 -0
  93. package/watchtower/app/routers/__pycache__/ingest.cpython-314.pyc +0 -0
  94. package/watchtower/app/routers/__pycache__/query.cpython-312.pyc +0 -0
  95. package/watchtower/app/routers/__pycache__/query.cpython-314.pyc +0 -0
  96. package/watchtower/app/routers/__pycache__/settings.cpython-312.pyc +0 -0
  97. package/watchtower/app/routers/__pycache__/stream.cpython-312.pyc +0 -0
  98. package/watchtower/app/routers/__pycache__/stream.cpython-314.pyc +0 -0
  99. package/watchtower/app/routers/control.py +260 -0
  100. package/watchtower/app/routers/ingest.py +157 -0
  101. package/watchtower/app/routers/query.py +133 -0
  102. package/watchtower/app/routers/settings.py +34 -0
  103. package/watchtower/app/routers/stream.py +28 -0
  104. package/watchtower/app/services/__init__.py +0 -0
  105. package/watchtower/app/services/__pycache__/__init__.cpython-312.pyc +0 -0
  106. package/watchtower/app/services/__pycache__/__init__.cpython-314.pyc +0 -0
  107. package/watchtower/app/services/__pycache__/checkpoint.cpython-312.pyc +0 -0
  108. package/watchtower/app/services/__pycache__/checkpoint.cpython-314.pyc +0 -0
  109. package/watchtower/app/services/__pycache__/tmux.cpython-312.pyc +0 -0
  110. package/watchtower/app/services/__pycache__/tmux.cpython-314.pyc +0 -0
  111. package/watchtower/app/services/checkpoint.py +149 -0
  112. package/watchtower/app/services/tmux.py +54 -0
  113. package/watchtower/events.json +10344 -45
  114. package/watchtower/{auto-checkpoint-runner.js → legacy/auto-checkpoint-runner.js} +29 -2
  115. package/watchtower/requirements.txt +3 -0
  116. package/watchtower/static/dashboard.html +577 -0
  117. package/watchtower/watchtower.db +0 -0
  118. package/agents/claude-code/devops.md +0 -50
  119. package/agents/claude-code/security.md +0 -75
  120. package/agents/codex/anti-slop-guard.toml +0 -12
  121. package/agents/codex/architect.toml +0 -11
  122. package/agents/codex/cartographer.toml +0 -16
  123. package/agents/codex/devops.toml +0 -8
  124. package/agents/codex/eval-writer.toml +0 -11
  125. package/agents/codex/prototype-builder.toml +0 -10
  126. package/agents/codex/reviewer.toml +0 -16
  127. package/agents/codex/security.toml +0 -14
  128. package/agents/codex/spec-writer.toml +0 -11
  129. package/agents/codex/test-writer.toml +0 -13
  130. package/agents/cursor/anti-slop-guard.mdc +0 -22
  131. package/agents/cursor/architect.mdc +0 -24
  132. package/agents/cursor/cartographer.mdc +0 -28
  133. package/agents/cursor/devops.mdc +0 -16
  134. package/agents/cursor/eval-writer.mdc +0 -21
  135. package/agents/cursor/prototype-builder.mdc +0 -25
  136. package/agents/cursor/reviewer.mdc +0 -26
  137. package/agents/cursor/security.mdc +0 -20
  138. package/agents/cursor/spec-writer.mdc +0 -27
  139. package/agents/cursor/test-writer.mdc +0 -28
  140. package/agents/portable/anti-slop-guard.md +0 -71
  141. package/agents/portable/architect.md +0 -83
  142. package/agents/portable/cartographer.md +0 -64
  143. package/agents/portable/devops.md +0 -56
  144. package/agents/portable/eval-writer.md +0 -70
  145. package/agents/portable/prototype-builder.md +0 -70
  146. package/agents/portable/reviewer.md +0 -79
  147. package/agents/portable/security.md +0 -63
  148. package/agents/portable/spec-writer.md +0 -89
  149. package/agents/portable/test-writer.md +0 -56
  150. package/hooks/context-warning.sh +0 -4
  151. package/skills/auto-checkpoint/SKILL.md +0 -47
  152. package/skills/checkpoint/SKILL.md +0 -105
  153. package/skills/map-codebase/SKILL.md +0 -54
  154. package/skills/map-stack/SKILL.md +0 -121
  155. package/skills/restore/SKILL.md +0 -55
  156. package/skills/security-review/SKILL.md +0 -87
  157. package/skills/session-end/SKILL.md +0 -100
  158. package/skills/session-init/SKILL.md +0 -45
  159. package/skills/slop-check/SKILL.md +0 -40
  160. package/skills/write-evals/SKILL.md +0 -34
  161. package/skills/write-tests/SKILL.md +0 -54
  162. /package/watchtower/{auto-checkpoint-prompt.md → legacy/auto-checkpoint-prompt.md} +0 -0
  163. /package/watchtower/{dashboard.html → legacy/dashboard.html} +0 -0
  164. /package/watchtower/{server.js → legacy/server.js} +0 -0
  165. /package/watchtower/{snapshot-manager.js → legacy/snapshot-manager.js} +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Utsav Anand
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # UV Suite
2
2
 
3
- A portable layer that turns Claude Code, Cursor, or Codex into a labeled, observable, anti-slop dev environment — with named sessions, a real-time observability dashboard, anti-slop guardrails, and per-session memory across launches.
3
+ A portable layer that turns Claude Code, Cursor, or Codex into a labeled, observable, anti-slop dev environment — with named sessions, a real-time observability **and control** dashboard, anti-slop guardrails, and per-session memory across launches.
4
+
5
+ By [Utsav](https://www.utsava.xyz/) · [github.com/utsavanand/uv-suite](https://github.com/utsavanand/uv-suite)
4
6
 
5
7
  ## Install
6
8
 
@@ -24,7 +26,7 @@ uvs claude pro # Claude Code, Professional persona
24
26
  uvs codex auto # Codex, Auto persona
25
27
  uvs pro # Shorthand for uvs claude pro
26
28
  uvs install # Explicit install (also runs automatically on launch)
27
- uvs watch # Open the Watchtower observability dashboard
29
+ uvs watch # Open the Watchtower observability + control dashboard
28
30
  uvs info # Show what's installed
29
31
  ```
30
32
 
@@ -38,29 +40,50 @@ Label this session (Enter to skip — you'll be reminded):
38
40
  priority [low/med/high]: high
39
41
  ```
40
42
 
41
- Skip any field with Enter. If you skip the name, `/session-init` will be suggested every few prompts until you label it. Set `UVS_NO_PROMPT=1` to suppress prompts entirely.
43
+ Skip any field with Enter. If you skip the name, `/session init` will be suggested every few prompts until you label it. Set `UVS_NO_PROMPT=1` to suppress prompts entirely.
44
+
45
+ ## Start here
46
+
47
+ After `uvs claude pro`, pick the path that matches what you're doing. Each path names the first skill to run and the canonical next steps.
48
+
49
+ ### Existing codebase (you didn't write this)
50
+ 1. `/understand` — builds a knowledge graph + architecture overview in `uv-out/map-codebase.md`. Other skills (`/architect`, `/review`, `/review --security`) read it automatically.
51
+ 2. `/session checkpoint` — captures your baseline understanding so `/session restore` can bring it back next session.
52
+ 3. Then: `/review` on the current diff, or `/spec` for the next feature.
53
+
54
+ ### New project (you're starting from scratch)
55
+ 1. `/spec` — converts your idea into a structured spec in `uv-out/specs/`.
56
+ 2. `/architect` — breaks the spec into Acts with cycle budgets. Reads the spec automatically.
57
+ 3. Then: implement Act by Act. Use `/test` and `/review` per Act.
58
+
59
+ ### Reviewing a PR
60
+ 1. `/review [branch-name]` — reads diff + `CLAUDE.md` + `DANGER-ZONES.md` + prior `uv-out/` artifacts.
61
+ 2. `/review --security` if the diff touches auth, payments, data access, or external inputs.
62
+
63
+ ### Shipping
64
+ 1. `/session checkpoint` to capture state.
65
+ 2. `/commit` — runs review, tests, commits, optionally opens a PR.
66
+
67
+ Picking a persona (Spike / Sport / Professional / Auto) is a separate axis from picking a first skill — see [Personas](#personas) below for which mode fits which situation.
42
68
 
43
69
  ## Sessions and Watchtower
44
70
 
45
71
  Each `uvs` launch generates a `UVS_SESSION_ID` and writes metadata to `.uv-suite-state/sessions/<id>.json`. This unlocks:
46
72
 
47
73
  - **Concurrent terminals don't collide.** Two `uvs` launches in the same repo run as distinct sessions with separate names, checkpoints, and dashboard rows.
48
- - **`uvs watch` shows them all.** The Watchtower dashboard at `localhost:4200` streams every tool call across every session in real time labeled by your name, sorted by priority (high to top, low dimmed), color-coded by persona.
49
- - **Per-session checkpoints.** `/checkpoint` writes to `uv-out/checkpoints/<sid>/`, and `/restore` auto-picks the current session's latest. Pass a session id prefix or name to restore from a different one.
74
+ - **`uvs watch` shows them all.** The Watchtower control plane at `localhost:4200` streams every session live and lets you act on them from the browser see [Watchtower at a glance](#watchtower-at-a-glance).
75
+ - **Per-session checkpoints.** `/session checkpoint` writes to `uv-out/checkpoints/<sid>/`, and `/session restore` auto-picks the current session's latest. Pass a session id prefix or name to restore from a different one.
50
76
  - **Status line shows it all.** The Claude Code status bar shows session name, persona, priority, and elapsed time continuously.
51
77
 
52
78
  ### Watchtower at a glance
53
79
 
54
- ```
55
- Sessions Events Tool calls Errors Need human
56
- 4 1,247 914 2 0
80
+ `uvs watch` starts the dashboard at `localhost:4200` — Python + **embedded SQLite**, no Docker and no database to set up (it provisions its own deps on first run). It's a control plane, not just a viewer, laid out in three panes:
57
81
 
58
- [payments retry [auto] [P:high] [outcome] ] (147)
59
- [infra cleanup [pro] [P:med] [long-running] ] (382)
60
- [exec deck [spike] [P:low] [outcome] ] (89)
61
- ```
82
+ - **Heartbeat** (left) — a live, scrolling stream of what every agent is doing, as it happens.
83
+ - **Sessions** (center) — each session as a flat row (state · tokens · tool calls · last activity). Filter by time / priority / kind and search by name; expand a row to **checkpoint, view checkpoint history, compact, fork, close, or delete** it.
84
+ - **Needs human** (right) — sessions waiting on you (a tool-permission prompt or an idle wait), with the tool + command as context. **Approve / Deny** from the browser; for `uvs`-launched (tmux-owned) sessions the keystroke is sent for you.
62
85
 
63
- Hooks fire on every Claude Code event (`PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `SessionStart`, `Stop`, `PermissionRequest`, ...) and forward to the dashboard with the session metadata merged in. Zero dependencies vanilla Node + SSE.
86
+ Sessions launched via `uvs` run inside a transparent tmux so Watchtower can act on them. Hooks forward every Claude Code event (`PreToolUse`, `PostToolUse`, `UserPromptSubmit`, `Notification`, `SessionStart`, `Stop`, ...) with session metadata merged in. A Node-only fallback (no Python) is available via `uvs watch --legacy`.
64
87
 
65
88
  ## Personas
66
89
 
@@ -104,50 +127,48 @@ Human gates After each End only Every Act Final output
104
127
 
105
128
  ## Skills (slash commands)
106
129
 
130
+ 12 skills. Each `skills/<name>/SKILL.md` is a thin orchestrator that dispatches to agents.
131
+
107
132
  | Command | What it does |
108
133
  |---|---|
109
- | `/map-codebase [dir]` | Build a knowledge graph of the codebase |
110
- | `/map-stack [dir]` | Map multiple services and their connections |
134
+ | `/understand [dir]` | Map a codebase or whole stack auto-detects repo vs stack |
111
135
  | `/spec [requirements]` | Write a technical specification |
112
136
  | `/architect [spec]` | Design architecture, decompose into Acts |
137
+ | `/test [file]` | Write tests or evals: `--unit` / `--integration` / `--eval` ([DeepEval](https://github.com/confident-ai/deepeval) compatible) |
138
+ | `/review` | Multi-specialist code review; add `--security` (OWASP via Semgrep/Gitleaks/Trivy) or `--slop` (anti-slop audit) |
113
139
  | `/prototype [concept]` | Build a static React prototype |
114
- | `/write-tests [file]` | Generate tests matching project conventions |
115
- | `/write-evals [prompt]` | Write AI/LLM evaluation cases ([DeepEval](https://github.com/confident-ai/deepeval) compatible) |
116
- | `/review` | Code review: correctness, security, performance, slop |
117
- | `/slop-check` | Detect 6 categories of AI-generated slop |
118
- | `/security-review` | OWASP audit, dependency scan, secret detection |
140
+ | `/qa` | Browser QA via Playwright MCP |
119
141
  | `/investigate` | Systematic root-cause debugging |
120
- | `/commit` | Review → test → slop-check → commit (and optionally PR) |
121
- | `/checkpoint [label]` | Save session state to `uv-out/checkpoints/<sid>/` |
122
- | `/restore [sid-prefix\|name]` | Load the latest checkpoint for the current (or named) session |
123
- | `/session-init [name\|--kind\|--purpose\|--priority]` | Label or relabel the current session |
142
+ | `/commit` | Review → test → commit (and optionally PR) |
143
+ | `/session init\|checkpoint\|restore\|end\|auto` | Session lifecycle label, checkpoint, restore, end, or auto-checkpoint |
124
144
  | `/confirm [on\|off\|<n>]` | Toggle reframe-and-confirm for prompts over `<n>` words |
125
145
  | `/uv-help` | List every skill, agent, hook, guardrail, and persona |
126
146
 
127
147
  ## Hooks (lifecycle automation)
128
148
 
129
- Fire automatically on Claude Code events. You never invoke these.
149
+ Fire automatically on Claude Code events. You never invoke these. ~26 scripts live in `hooks/`.
130
150
 
131
151
  | Hook | Fires on | What it does |
132
152
  |---|---|---|
133
153
  | auto-lint | File write | Runs prettier, ruff, or gofmt |
134
- | slop-grep | File write | Greps for obvious slop patterns (over-commented code, vague docs) |
135
- | doc-slop-grep | File write | Catches vague adjectives in markdown |
154
+ | slop-grep | File edit/write | Ambient slop detection on sport / professional / auto personas |
155
+ | doc-slop-grep | File edit/write | Catches vague adjectives in markdown on the spike persona |
136
156
  | danger-zone-check | File edit | Warns if file is in DANGER-ZONES.md |
137
157
  | block-destructive | Bash command | Blocks `rm -rf /`, force push to main, `DROP TABLE` |
138
158
  | confirm-prompt | UserPromptSubmit | For prompts over the threshold, requires Claude to restate before any work starts |
139
- | session-label-nag | UserPromptSubmit | Reminds you to run `/session-init` every Nth prompt while the session has no name |
159
+ | session-label-nag | UserPromptSubmit | Reminds you to run `/session init` every Nth prompt while the session has no name |
140
160
  | context-warning | PostToolUse | Warns when context usage crosses thresholds |
141
161
  | watchtower-send | All events | Forwards every event (with session metadata) to `localhost:4200` |
142
162
  | session-start | SessionStart | Records start time, fires bootstrap event with session metadata |
143
163
  | session-timer | PostToolUse | Reminders at 45 / 90 / 180 minutes |
144
164
  | session-end | Stop | Shows duration, today's total, reflection prompt |
145
165
  | session-review-reminder | Stop | Nudges you to review uncommitted changes |
166
+ | uv-out-* | Session events | Manage session-scoped artifacts under `uv-out/sessions/<sid>/` |
146
167
  | status-line | Continuous | Renders session label, persona, priority, and timer in the Claude Code status bar |
147
168
 
148
169
  ## Agents
149
170
 
150
- 10 agents, each in 4 formats (Claude Code, Cursor, Codex, portable):
171
+ 8 agents. The canonical definitions are `agents/claude-code/*.md`. The Cursor (`.mdc`) and Codex (`.toml`) variants are generated from those by `agents/generate.py` at install — they're not hand-maintained.
151
172
 
152
173
  | Agent | Subsystem | Model | Cycle Budget |
153
174
  |---|---|---|---|
@@ -159,8 +180,6 @@ Fire automatically on Claude Code events. You never invoke these.
159
180
  | Eval Writer | Acts | Opus | 2 |
160
181
  | Anti-Slop Guard | Guard | Opus | 1 |
161
182
  | Prototype Builder | Acts | Sonnet | 3 |
162
- | DevOps | Acts | Opus | 2 |
163
- | Security | Guard | Opus | 1 |
164
183
 
165
184
  ## Artifacts
166
185
 
@@ -168,11 +187,11 @@ Agents write persistent output to `uv-out/`. Each agent reads prior artifacts au
168
187
 
169
188
  | Output | Read by |
170
189
  |---|---|
171
- | `uv-out/map-codebase.md` | /architect, /review, /security-review |
172
- | `uv-out/specs/*.md` | /architect, /write-tests, /write-evals |
173
- | `uv-out/architecture/*.md` | /review, /write-tests, /slop-check |
174
- | `uv-out/review-*.md` | /slop-check, /security-review |
175
- | `uv-out/checkpoints/<sid>/*.md` | /restore |
190
+ | `uv-out/map-codebase.md` | /architect, /review, /review --security |
191
+ | `uv-out/specs/*.md` | /architect, /test, /test --eval |
192
+ | `uv-out/architecture/*.md` | /review, /test, /review --slop |
193
+ | `uv-out/review-*.md` | /review --slop, /review --security |
194
+ | `uv-out/checkpoints/<sid>/*.md` | /session restore |
176
195
 
177
196
  ## Integrations
178
197
 
@@ -190,13 +209,13 @@ Agents write persistent output to `uv-out/`. Each agent reads prior artifacts au
190
209
  ```
191
210
  .claude/
192
211
  settings.json Permissions and hooks (seeded from your persona on first install)
193
- agents/ 10 agent definitions
194
- skills/ 17 slash commands
195
- hooks/ 14 hook scripts + 2 helpers
212
+ agents/ 8 agent definitions (canonical .md)
213
+ skills/ 12 slash commands
214
+ hooks/ ~26 hook scripts
196
215
  rules/ 6 anti-slop guardrails (Pro / Auto only)
197
216
  personas/ 4 persona configs
198
- .codex/agents/ 10 Codex agent definitions
199
- .cursor/rules/ 10 Cursor rule definitions
217
+ .codex/agents/ 8 Codex agent definitions (generated from .claude/agents)
218
+ .cursor/rules/ 8 Cursor rule definitions (generated from .claude/agents)
200
219
  AGENTS.md Codex instruction file
201
220
  DANGER-ZONES.md Risky areas (commit this)
202
221
  .uv-suite-state/ Session metadata + counters (gitignored)
@@ -210,13 +229,20 @@ uv-out/ Agent output artifacts (gitignored)
210
229
 
211
230
  | Document | What it covers |
212
231
  |---|---|
213
- | [usage-guide.md](usage-guide.md) | Full SDLC mapped to exact commands |
232
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | Working on UV Suite adding skills/agents/hooks, running the tests |
214
233
  | [personas.md](personas.md) | 4 personas, 7 knobs, when to use each |
215
- | [practices.md](practices.md) | Working principles (honesty, parallelism, scope, completion) |
234
+ | [knowledge/practices.md](knowledge/practices.md) | Working principles (honesty, parallelism, scope, completion) |
216
235
  | [acts-methodology.md](acts-methodology.md) | Acts delivery framework with worked examples |
217
- | [methodology/human-in-the-loop.md](methodology/human-in-the-loop.md) | Cycle budgets, intervention types, learning loops |
218
- | [collaboration/sharing-and-standards.md](collaboration/sharing-and-standards.md) | Danger zones, team standards, sharing levels |
219
- | [landscape.md](landscape.md) | Open source tools and references for each agent |
236
+ | [knowledge/human-in-the-loop.md](knowledge/human-in-the-loop.md) | Cycle budgets, intervention types, learning loops |
237
+ | [knowledge/sharing-and-standards.md](knowledge/sharing-and-standards.md) | Danger zones, team standards, sharing levels |
238
+ | [research/landscape.md](research/landscape.md) | Open source tools and references for each agent |
239
+ | [research/comparison.md](research/comparison.md) | UV Suite vs gstack vs Claude Code built-in — feature comparison + prompt-depth deep dive |
240
+ | [research/tool-comparison.md](research/tool-comparison.md) | Claude Code vs Cursor vs Codex — how UV Suite works across all three |
241
+ | [research/best-practices.md](research/best-practices.md) | Subagent patterns, remote sessions, sharing with engineers, cost optimization |
242
+
243
+ ## Author
244
+
245
+ Built by [Utsav](https://www.utsava.xyz/) — [utsava.xyz](https://www.utsava.xyz/).
220
246
 
221
247
  ## License
222
248
 
@@ -19,7 +19,20 @@ You are the **Anti-Slop Guard** — your job is to catch AI-generated low-qualit
19
19
 
20
20
  ## Artifact Output
21
21
 
22
- Write the slop report to `uv-out/slop-check-YYYY-MM-DD.md`. Create the directory if needed. Summarize findings in the conversation.
22
+ Write the slop report to `<session-output-dir>/review --slop/report.md`, where
23
+ `<session-output-dir>` is the path printed in the "Session output directory" section of
24
+ your context (e.g. `uv-out/sessions/<sid>/`). Create the directory if needed. Stamp the
25
+ top with provenance frontmatter:
26
+
27
+ ```yaml
28
+ ---
29
+ session: <sid from the output dir path>
30
+ skill: slop-check
31
+ created: <ISO 8601 timestamp>
32
+ ---
33
+ ```
34
+
35
+ Summarize findings in the conversation.
23
36
 
24
37
  ## What You Scan For
25
38
 
@@ -16,8 +16,21 @@ effort: high
16
16
 
17
17
  You are the **Architect** — your job is to design systems and break work into deliverable Acts.
18
18
 
19
+ **Hard precondition: you design only from a curated spec** (problem statement, requirements,
20
+ success criteria). If no spec was provided or found, **stop and ask** the user to run
21
+ `/spec` or describe the problem so a spec can be drafted first. Never design from a vague
22
+ one-liner and never invent requirements — designing without a spec is a failure, not a fallback.
23
+
19
24
  ## Output Format
20
25
 
26
+ ### 0. Design Constraints
27
+ Write these to `<session-output-dir>/architecture/constraints.md` FIRST, before any design.
28
+ Record the factors the design is right-sized against (from the spec's non-functional
29
+ requirements or gathered from the user): scale (users/RPS/data, now + ~12mo), team size &
30
+ expertise, availability target, consistency/CAP priority, security & privacy/compliance,
31
+ and fault tolerance / cost of failure. Every later decision must be justifiable against
32
+ these — they are what make "this is over-engineered" a checkable claim.
33
+
21
34
  ### 1. Architecture Decision Record
22
35
  For each key decision, document:
23
36
  - **Decision:** What you chose
@@ -51,11 +64,24 @@ For each key decision, document:
51
64
 
52
65
  ## Artifact Output
53
66
 
54
- Write all output to `uv-out/architecture/`:
55
- - `uv-out/architecture/decisions.md` architecture decision records
56
- - `uv-out/architecture/acts-plan.md` — Acts breakdown with tasks and cycle budgets
67
+ Write all output under `<session-output-dir>/architecture/`, where `<session-output-dir>`
68
+ is the path printed in the "Session output directory" section of your context
69
+ (e.g. `uv-out/sessions/<sid>/`):
70
+ - `<session-output-dir>/architecture/constraints.md` — the Design Constraints the design is right-sized against (write this FIRST, before designing)
71
+ - `<session-output-dir>/architecture/decisions.md` — architecture decision records
72
+ - `<session-output-dir>/architecture/acts-plan.md` — Acts breakdown with tasks and cycle budgets
73
+
74
+ Create the directory if needed. Stamp the top of each file with provenance frontmatter:
75
+
76
+ ```yaml
77
+ ---
78
+ session: <sid from the output dir path>
79
+ skill: architect
80
+ created: <ISO 8601 timestamp>
81
+ ---
82
+ ```
57
83
 
58
- Create the directory if needed. Summarize the design in the conversation.
84
+ Summarize the design in the conversation.
59
85
 
60
86
  ### 4. Task Dependency Graph
61
87
  Mermaid diagram showing parallelism opportunities.
@@ -88,12 +88,24 @@ Produce all 6 sections (Architecture Overview, Tech Stack, Dependency Graph, Bus
88
88
 
89
89
  ## Artifact Output
90
90
 
91
- Write all output to `uv-out/`. Create the directory if it doesn't exist.
92
-
93
- - `uv-out/map-codebase.md` — the written analysis (business domain map, sequence diagrams, entry points)
94
- - `uv-out/graphify-out/` Graphify outputs if used (graph.html, graph.json, GRAPH_REPORT.md)
95
-
96
- After writing, tell the human: "Artifacts written to uv-out/map-codebase.md" and summarize key findings in the conversation.
91
+ Write all output under `<session-output-dir>`, the path printed in the "Session output
92
+ directory" section of your context (e.g. `uv-out/sessions/<sid>/`). Create it if needed.
93
+
94
+ The calling skill names the output file `<session-output-dir>/map-codebase.md` for
95
+ single-codebase mapping, `<session-output-dir>/map-stack.md` for multi-service stack
96
+ mapping. Follow the file named in the task; default to `map-codebase.md` if unspecified.
97
+
98
+ - The written analysis goes in that file, stamped with provenance frontmatter:
99
+ ```yaml
100
+ ---
101
+ session: <sid from the output dir path>
102
+ skill: map-codebase # or map-stack
103
+ created: <ISO 8601 timestamp>
104
+ ---
105
+ ```
106
+ - `<session-output-dir>/graphify-out/` — Graphify outputs if used (graph.html, graph.json, GRAPH_REPORT.md)
107
+
108
+ After writing, tell the human one line — "Artifacts written to `<the file you wrote>`" — and summarize key findings in the conversation.
97
109
 
98
110
  ## Rules
99
111
 
@@ -46,14 +46,19 @@ You are the **Eval Writer** — your job is to write evaluations that verify AI/
46
46
 
47
47
  ## Artifact Output
48
48
 
49
- Write evals to `uv-out/evals/`. Create the directory if needed. Match the project's eval framework format (DeepEval preferred).
49
+ Write eval artifacts to `<session-output-dir>/evals/`, where `<session-output-dir>` is the
50
+ path printed in the "Session output directory" section of your context (e.g.
51
+ `uv-out/sessions/<sid>/`). Create the directory if needed. Match the project's eval
52
+ framework format (DeepEval preferred). If you also add runnable evals into the project's
53
+ own eval suite, do that in the project tree as usual — only the artifact copy goes under
54
+ the session directory.
50
55
 
51
56
  ## Grading Rubric (be this specific)
52
57
 
53
58
  ```yaml
54
59
  grading:
55
60
  type: "llm_judge"
56
- model: "claude-haiku-4-5"
61
+ model: "claude-haiku-4-5-20251001"
57
62
  rubric: |
58
63
  Score 1 (pass) if ALL of:
59
64
  - Agent declines the out-of-scope request
@@ -65,7 +65,11 @@ You are the **Reviewer** — your job is to catch bugs, security issues, perform
65
65
 
66
66
  ## Artifact Output
67
67
 
68
- Write the review report to `uv-out/review-YYYY-MM-DD.md`. Create the directory if needed. Summarize key findings in the conversation.
68
+ Write your report under `<session-output-dir>`, the path printed in the "Session output
69
+ directory" section of your context (e.g. `uv-out/sessions/<sid>/`). Use the filename the
70
+ calling task names — `review/state.md` for a code review, `investigate/report.md` for an
71
+ investigation. Stamp the top with provenance frontmatter (`session`, `skill`, `created`).
72
+ Create the directory if needed. Summarize key findings in the conversation.
69
73
 
70
74
  ## Common Findings (be this specific)
71
75
 
@@ -62,19 +62,42 @@ Unit, integration, e2e, load?
62
62
 
63
63
  ## Artifact Output
64
64
 
65
- Write the spec to `uv-out/specs/[feature-name]-spec.md`. Create the directory if needed. Summarize the spec in the conversation.
65
+ Write the spec to `<session-output-dir>/specs/[feature-name]-spec.md`, where
66
+ `<session-output-dir>` is the path printed in the "Session output directory" section of
67
+ your context (e.g. `uv-out/sessions/<sid>/`). Create the directory if needed.
68
+
69
+ Stamp the top of the spec with provenance frontmatter so it stays attributable if moved:
70
+
71
+ ```yaml
72
+ ---
73
+ session: <sid from the output dir path>
74
+ skill: spec
75
+ created: <ISO 8601 timestamp>
76
+ ---
77
+ ```
78
+
79
+ Then the `# Spec: [Feature Name]` heading and the rest of the template. Summarize the spec in the conversation.
66
80
 
67
81
  ## Process
68
82
 
69
- 1. Parse the input into discrete requirements
70
- 2. Separate functional vs non-functional
71
- 3. Identify gaps list as open questions, don't invent answers
72
- 4. Propose a high-level solution (detailed design is the Architect's job)
73
- 5. Define measurable success criteria
74
- 6. Flag risks and assumptions
83
+ 1. **Ground in the existing codebase first.** Read the prior `uv-out/` artifacts loaded by
84
+ the skill the codebase map (`map-codebase.md`/`map-stack.md`), prior specs, and
85
+ architecture decisions. Reference real modules, files, patterns, and conventions from
86
+ the map; reuse what exists; build on prior specs instead of re-specifying them. If no
87
+ map is present, say so and note that `/understand` would produce a better-grounded spec.
88
+ 2. Parse the input into discrete requirements
89
+ 3. Separate functional vs non-functional
90
+ 4. Identify gaps — list as open questions, don't invent answers
91
+ 5. Propose a high-level solution that fits the existing architecture (detailed design is
92
+ the Architect's job) — name the specific modules/files it touches
93
+ 6. Define measurable success criteria
94
+ 7. Flag risks and assumptions
75
95
 
76
96
  ## Rules
77
97
 
98
+ - **Ground every section in the real codebase.** The Proposed Solution, API Contract, and
99
+ Data Model sections must reference actual modules/types/endpoints from the map — not
100
+ generic placeholders. If you're inventing names because there's no map, flag it.
78
101
  - Scale the spec to the task. A bug fix needs 1 page, not 10.
79
102
  - Flag ambiguity as open questions — don't fill gaps with assumptions.
80
103
  - If requirements conflict (e.g., "fast response" vs "comprehensive validation"), list both in Risks and propose which to prioritize.
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env python3
2
+ """Generate Cursor (.mdc) and Codex (.toml) agent files from the canonical
3
+ Claude Code agent definitions in agents/claude-code/*.md.
4
+
5
+ Single source of truth: edit agents/claude-code/<name>.md, then install.sh (or
6
+ `python3 agents/generate.py <cursor|codex> <dest-dir>`) regenerates the others.
7
+
8
+ Usage:
9
+ python3 agents/generate.py cursor /path/to/.cursor/rules
10
+ python3 agents/generate.py codex /path/to/.codex/agents
11
+ """
12
+ import glob
13
+ import os
14
+ import re
15
+ import sys
16
+
17
+ CANONICAL = os.path.join(os.path.dirname(os.path.abspath(__file__)), "claude-code")
18
+
19
+
20
+ def parse(md, fallback_name):
21
+ m = re.match(r"^---\n(.*?)\n---\n(.*)$", md, re.S)
22
+ fm, body = (m.group(1), m.group(2).strip()) if m else ("", md.strip())
23
+
24
+ def field(key):
25
+ mm = re.search(rf"^{key}:\s*(.*)$", fm, re.M)
26
+ return mm.group(1).strip() if mm else ""
27
+
28
+ # description is usually a folded scalar (`description: >` then indented lines)
29
+ desc = field("description")
30
+ if desc in (">", "|", ">-", "|-", ""):
31
+ lines = fm.splitlines()
32
+ idx = next((i for i, l in enumerate(lines) if l.startswith("description:")), None)
33
+ if idx is not None:
34
+ collected = []
35
+ for l in lines[idx + 1:]:
36
+ if re.match(r"^\s+\S", l):
37
+ collected.append(l.strip())
38
+ else:
39
+ break
40
+ desc = " ".join(collected) or desc
41
+ desc = desc.strip().strip('"')
42
+
43
+ return {
44
+ "name": field("name") or fallback_name,
45
+ "desc": desc,
46
+ "model": field("model"),
47
+ "has_write": ("Write" in fm or "Edit" in fm),
48
+ "body": body,
49
+ }
50
+
51
+
52
+ def to_mdc(a):
53
+ desc = a["desc"].replace('"', '\\"')
54
+ return f'---\ndescription: "{desc}"\nglobs: ""\nalwaysApply: false\n---\n\n{a["body"]}\n'
55
+
56
+
57
+ def to_toml(a):
58
+ effort = "high" if a["model"] == "opus" else "medium"
59
+ sandbox = "workspace-write" if a["has_write"] else "read-only"
60
+ desc = a["desc"].replace("\\", "\\\\").replace('"', '\\"')
61
+ body = a["body"].replace("\\", "\\\\").replace('"""', '\\"\\"\\"')
62
+ return (
63
+ f'name = "{a["name"]}"\n'
64
+ f'description = "{desc}"\n'
65
+ f'model_reasoning_effort = "{effort}"\n'
66
+ f'sandbox_mode = "{sandbox}"\n\n'
67
+ f'developer_instructions = """\n{body}\n"""\n'
68
+ )
69
+
70
+
71
+ def main():
72
+ if len(sys.argv) != 3 or sys.argv[1] not in ("cursor", "codex"):
73
+ sys.exit("usage: generate.py <cursor|codex> <dest-dir>")
74
+ fmt, dest = sys.argv[1], sys.argv[2]
75
+ os.makedirs(dest, exist_ok=True)
76
+ ext = ".mdc" if fmt == "cursor" else ".toml"
77
+ render = to_mdc if fmt == "cursor" else to_toml
78
+ n = 0
79
+ for path in sorted(glob.glob(os.path.join(CANONICAL, "*.md"))):
80
+ name = os.path.splitext(os.path.basename(path))[0]
81
+ a = parse(open(path).read(), name)
82
+ open(os.path.join(dest, name + ext), "w").write(render(a))
83
+ n += 1
84
+ print(f"generated {n} {fmt} agents -> {dest}")
85
+
86
+
87
+ if __name__ == "__main__":
88
+ main()