uv-suite 0.28.0 → 0.30.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.
- package/LICENSE +21 -0
- package/README.md +58 -35
- package/agents/claude-code/anti-slop-guard.md +14 -1
- package/agents/claude-code/architect.md +30 -4
- package/agents/claude-code/cartographer.md +18 -6
- package/agents/claude-code/eval-writer.md +7 -2
- package/agents/claude-code/reviewer.md +5 -1
- package/agents/claude-code/spec-writer.md +30 -7
- package/agents/generate.py +88 -0
- package/bin/cli.js +51 -48
- package/hooks/auto-checkpoint-helper.sh +2 -2
- package/hooks/auto-checkpoint.sh +3 -3
- package/hooks/auto-restore-on-start.sh +30 -0
- package/hooks/checkpoint-helper.sh +40 -35
- package/hooks/git-context.sh +41 -0
- package/hooks/lite-mode-inject.sh +26 -0
- package/hooks/session-end-helper.sh +2 -2
- package/hooks/session-end.sh +2 -2
- package/hooks/session-label-nag.sh +2 -2
- package/hooks/session-meta.sh +18 -1
- package/hooks/session-review-reminder.sh +2 -2
- package/hooks/session-start.sh +16 -0
- package/hooks/slop-grep.sh +12 -31
- package/hooks/uv-out-best.sh +20 -0
- package/hooks/uv-out-collect.sh +52 -0
- package/hooks/uv-out-notify.sh +28 -0
- package/hooks/uv-out-pointer.sh +16 -0
- package/hooks/uv-out-session.sh +24 -0
- package/hooks/watchtower-notify.sh +45 -0
- package/hooks/watchtower-send.sh +4 -0
- package/install.sh +93 -42
- package/package.json +2 -2
- package/personas/auto.json +40 -1
- package/personas/professional.json +46 -1
- package/personas/spike.json +32 -2
- package/personas/sport.json +44 -1
- package/settings.json +6 -2
- package/skills/architect/SKILL.md +109 -8
- package/skills/architect/specialists/distributed-systems.md +84 -0
- package/skills/architect/specialists/full-stack.md +92 -0
- package/skills/architect/specialists/llm-ai-engineering.md +86 -0
- package/skills/architect/specialists/ml-systems.md +81 -0
- package/skills/commit/SKILL.md +5 -2
- package/skills/confirm/SKILL.md +3 -3
- package/skills/investigate/SKILL.md +14 -4
- package/skills/lite/SKILL.md +45 -0
- package/skills/qa/SKILL.md +274 -0
- package/skills/review/SKILL.md +187 -8
- package/skills/review/specialists/api-contract.md +122 -0
- package/skills/review/specialists/architecture-trace.md +64 -0
- package/skills/review/specialists/data-migration.md +113 -0
- package/skills/review/specialists/maintainability.md +138 -0
- package/skills/review/specialists/performance.md +115 -0
- package/skills/review/specialists/security.md +132 -0
- package/skills/review/specialists/testing.md +109 -0
- package/skills/session/SKILL.md +87 -0
- package/skills/session/operations/auto.md +22 -0
- package/skills/session/operations/checkpoint.md +43 -0
- package/skills/session/operations/end.md +35 -0
- package/skills/session/operations/init.md +16 -0
- package/skills/session/operations/restore.md +16 -0
- package/skills/spec/SKILL.md +40 -1
- package/skills/test/SKILL.md +89 -0
- package/skills/test/specialists/eval.md +46 -0
- package/skills/test/specialists/integration.md +42 -0
- package/skills/test/specialists/unit.md +39 -0
- package/skills/understand/SKILL.md +118 -0
- package/skills/understand/modes/repo.md +38 -0
- package/skills/understand/modes/stack.md +41 -0
- package/skills/uv-help/SKILL.md +43 -20
- package/uv.sh +36 -3
- package/watchtower/Dockerfile +9 -0
- package/watchtower/README.md +78 -0
- package/watchtower/app/__init__.py +0 -0
- package/watchtower/app/__pycache__/__init__.cpython-314.pyc +0 -0
- package/watchtower/app/__pycache__/db.cpython-314.pyc +0 -0
- package/watchtower/app/__pycache__/main.cpython-314.pyc +0 -0
- package/watchtower/app/__pycache__/models.cpython-314.pyc +0 -0
- package/watchtower/app/db.py +85 -0
- package/watchtower/app/main.py +45 -0
- package/watchtower/app/models.py +49 -0
- package/watchtower/app/routers/__init__.py +0 -0
- package/watchtower/app/routers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/watchtower/app/routers/__pycache__/control.cpython-314.pyc +0 -0
- package/watchtower/app/routers/__pycache__/ingest.cpython-314.pyc +0 -0
- package/watchtower/app/routers/__pycache__/query.cpython-314.pyc +0 -0
- package/watchtower/app/routers/__pycache__/stream.cpython-314.pyc +0 -0
- package/watchtower/app/routers/control.py +144 -0
- package/watchtower/app/routers/ingest.py +102 -0
- package/watchtower/app/routers/query.py +84 -0
- package/watchtower/app/routers/stream.py +30 -0
- package/watchtower/app/services/__init__.py +0 -0
- package/watchtower/app/services/__pycache__/__init__.cpython-314.pyc +0 -0
- package/watchtower/app/services/__pycache__/checkpoint.cpython-314.pyc +0 -0
- package/watchtower/app/services/__pycache__/tmux.cpython-314.pyc +0 -0
- package/watchtower/app/services/checkpoint.py +107 -0
- package/watchtower/app/services/tmux.py +54 -0
- package/watchtower/docker-compose.yml +22 -0
- package/watchtower/events.json +10373 -1
- package/watchtower/{auto-checkpoint-runner.js → legacy/auto-checkpoint-runner.js} +29 -2
- package/watchtower/{dashboard.html → legacy/dashboard.html} +261 -0
- package/watchtower/{server.js → legacy/server.js} +63 -0
- package/watchtower/legacy/snapshot-manager.js +305 -0
- package/watchtower/requirements.txt +3 -0
- package/watchtower/schema.sql +43 -0
- package/watchtower/static/dashboard.html +449 -0
- package/agents/claude-code/devops.md +0 -50
- package/agents/claude-code/security.md +0 -75
- package/agents/codex/anti-slop-guard.toml +0 -12
- package/agents/codex/architect.toml +0 -11
- package/agents/codex/cartographer.toml +0 -16
- package/agents/codex/devops.toml +0 -8
- package/agents/codex/eval-writer.toml +0 -11
- package/agents/codex/prototype-builder.toml +0 -10
- package/agents/codex/reviewer.toml +0 -16
- package/agents/codex/security.toml +0 -14
- package/agents/codex/spec-writer.toml +0 -11
- package/agents/codex/test-writer.toml +0 -13
- package/agents/cursor/anti-slop-guard.mdc +0 -22
- package/agents/cursor/architect.mdc +0 -24
- package/agents/cursor/cartographer.mdc +0 -28
- package/agents/cursor/devops.mdc +0 -16
- package/agents/cursor/eval-writer.mdc +0 -21
- package/agents/cursor/prototype-builder.mdc +0 -25
- package/agents/cursor/reviewer.mdc +0 -26
- package/agents/cursor/security.mdc +0 -20
- package/agents/cursor/spec-writer.mdc +0 -27
- package/agents/cursor/test-writer.mdc +0 -28
- package/agents/portable/anti-slop-guard.md +0 -71
- package/agents/portable/architect.md +0 -83
- package/agents/portable/cartographer.md +0 -64
- package/agents/portable/devops.md +0 -56
- package/agents/portable/eval-writer.md +0 -70
- package/agents/portable/prototype-builder.md +0 -70
- package/agents/portable/reviewer.md +0 -79
- package/agents/portable/security.md +0 -63
- package/agents/portable/spec-writer.md +0 -89
- package/agents/portable/test-writer.md +0 -56
- package/hooks/context-warning.sh +0 -4
- package/skills/auto-checkpoint/SKILL.md +0 -47
- package/skills/checkpoint/SKILL.md +0 -105
- package/skills/map-codebase/SKILL.md +0 -54
- package/skills/map-stack/SKILL.md +0 -121
- package/skills/restore/SKILL.md +0 -55
- package/skills/security-review/SKILL.md +0 -87
- package/skills/session-end/SKILL.md +0 -100
- package/skills/session-init/SKILL.md +0 -45
- package/skills/slop-check/SKILL.md +0 -40
- package/skills/write-evals/SKILL.md +0 -34
- package/skills/write-tests/SKILL.md +0 -54
- /package/watchtower/{auto-checkpoint-prompt.md → legacy/auto-checkpoint-prompt.md} +0 -0
package/install.sh
CHANGED
|
@@ -74,17 +74,23 @@ mkdir -p "$TARGET_DIR/skills"
|
|
|
74
74
|
mkdir -p "$TARGET_DIR/hooks"
|
|
75
75
|
mkdir -p "$TARGET_DIR/rules"
|
|
76
76
|
|
|
77
|
-
# --- Install agents (Claude Code subagent definitions) ---
|
|
78
|
-
echo "Installing
|
|
77
|
+
# --- Install agents (Claude Code subagent definitions are the canonical source) ---
|
|
78
|
+
echo "Installing 8 Claude Code agent definitions..."
|
|
79
79
|
cp "$UV_SUITE_DIR/agents/claude-code/"*.md "$TARGET_DIR/agents/"
|
|
80
80
|
echo " ✓ cartographer, spec-writer, architect, reviewer, test-writer"
|
|
81
|
-
echo " ✓ eval-writer, anti-slop-guard, prototype-builder
|
|
81
|
+
echo " ✓ eval-writer, anti-slop-guard, prototype-builder"
|
|
82
82
|
|
|
83
|
-
#
|
|
83
|
+
# Codex (.toml) and Cursor (.mdc) agents are GENERATED from the canonical .md files
|
|
84
|
+
# so there is a single source of truth — edit agents/claude-code/<name>.md only.
|
|
84
85
|
PROJECT_ROOT="$(dirname "$TARGET_DIR")"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
if ! command -v python3 &>/dev/null; then
|
|
87
|
+
echo " ⚠ python3 not found — skipping Codex/Cursor agent generation (Claude Code agents installed)"
|
|
88
|
+
else
|
|
89
|
+
echo "Generating Codex agent definitions from canonical..."
|
|
90
|
+
python3 "$UV_SUITE_DIR/agents/generate.py" codex "$PROJECT_ROOT/.codex/agents"
|
|
91
|
+
echo "Generating Cursor rule definitions from canonical..."
|
|
92
|
+
python3 "$UV_SUITE_DIR/agents/generate.py" cursor "$PROJECT_ROOT/.cursor/rules"
|
|
93
|
+
fi
|
|
88
94
|
|
|
89
95
|
# Create AGENTS.md for Codex (it reads this instead of CLAUDE.md)
|
|
90
96
|
if [ ! -f "$PROJECT_ROOT/AGENTS.md" ]; then
|
|
@@ -93,24 +99,19 @@ if [ ! -f "$PROJECT_ROOT/AGENTS.md" ]; then
|
|
|
93
99
|
else
|
|
94
100
|
echo " ✓ AGENTS.md already exists"
|
|
95
101
|
fi
|
|
96
|
-
echo " ✓ .codex/agents/*.toml installed"
|
|
97
|
-
|
|
98
|
-
# --- Install Cursor rules (.cursor/rules/*.mdc) ---
|
|
99
|
-
echo "Installing 10 Cursor rule definitions..."
|
|
100
|
-
mkdir -p "$PROJECT_ROOT/.cursor/rules"
|
|
101
|
-
cp "$UV_SUITE_DIR/agents/cursor/"*.mdc "$PROJECT_ROOT/.cursor/rules/"
|
|
102
|
-
echo " ✓ .cursor/rules/*.mdc installed"
|
|
103
102
|
|
|
104
103
|
# --- Install skills (slash commands) ---
|
|
105
104
|
echo "Installing skills..."
|
|
106
105
|
for skill_dir in "$UV_SUITE_DIR/skills/"*/; do
|
|
107
106
|
skill_name=$(basename "$skill_dir")
|
|
108
107
|
mkdir -p "$TARGET_DIR/skills/$skill_name"
|
|
109
|
-
|
|
108
|
+
# Copy the whole skill dir — SKILL.md plus any sub-folders the orchestrator
|
|
109
|
+
# routes into (specialists/, modes/, operations/).
|
|
110
|
+
cp -R "$skill_dir"* "$TARGET_DIR/skills/$skill_name/"
|
|
110
111
|
done
|
|
111
|
-
echo " ✓ /
|
|
112
|
-
echo " ✓ /
|
|
113
|
-
echo " ✓ /
|
|
112
|
+
echo " ✓ /understand (auto-detects repo vs stack), /spec, /architect, /test (--unit/--integration/--eval)"
|
|
113
|
+
echo " ✓ /review (--security/--slop/--architecture), /prototype, /qa, /investigate"
|
|
114
|
+
echo " ✓ /commit, /session (init|checkpoint|restore|end|auto), /confirm, /uv-help"
|
|
114
115
|
|
|
115
116
|
# --- Install hooks ---
|
|
116
117
|
echo "Installing hook scripts..."
|
|
@@ -122,8 +123,8 @@ echo " ✓ block-destructive.sh (PreToolUse: block rm -rf, force push, etc.)"
|
|
|
122
123
|
echo " ✓ session-start.sh (SessionStart: track session start time)"
|
|
123
124
|
echo " ✓ session-timer.sh (PostToolUse: warn at 45/90/180 min)"
|
|
124
125
|
echo " ✓ session-end.sh (Stop: reflection + duration + review reminder)"
|
|
125
|
-
echo " ✓ session-label-nag.sh (UserPromptSubmit: nudge to /session
|
|
126
|
-
echo " ✓ session-meta.sh (helper used by /session
|
|
126
|
+
echo " ✓ session-label-nag.sh (UserPromptSubmit: nudge to /session init)"
|
|
127
|
+
echo " ✓ session-meta.sh (helper used by /session init)"
|
|
127
128
|
echo " ✓ status-line.sh (statusLine: show session label + time)"
|
|
128
129
|
echo " + Real-time slop check (Haiku prompt hook, wired in settings.json)"
|
|
129
130
|
|
|
@@ -210,15 +211,47 @@ This project uses [UV Suite](https://github.com/utsavanand/uv-suite) v${UV_VERSI
|
|
|
210
211
|
|
|
211
212
|
### Skills
|
|
212
213
|
|
|
213
|
-
/
|
|
214
|
+
/understand (auto-detects repo vs stack), /spec, /architect, /test (--unit/--integration/--eval), /review (--security/--slop/--architecture), /prototype, /qa, /investigate, /commit, /session (init|checkpoint|restore|end|auto), /confirm, /uv-help
|
|
215
|
+
|
|
216
|
+
### When to use which skill (reach for these proactively)
|
|
217
|
+
|
|
218
|
+
Prefer the matching skill over doing the task ad hoc -- they carry the project's conventions,
|
|
219
|
+
anti-slop guardrails, and session-scoped artifacts. Don't wait to be told:
|
|
220
|
+
- Entering an unfamiliar codebase, or "how does this work" -> /understand
|
|
221
|
+
- New feature or vague requirements -> /spec, then /architect (which gates on the spec)
|
|
222
|
+
- After implementing, or coverage is low -> /test (--eval for LLM/AI features)
|
|
223
|
+
- Before merging, or reviewing a diff -> /review (--security for auth/payments/data;
|
|
224
|
+
--architecture to audit a design against its recorded constraints)
|
|
225
|
+
- A bug you can't explain -> /investigate
|
|
226
|
+
- Shipping a change -> /commit
|
|
227
|
+
- Session lifecycle -> /session init|checkpoint|restore|end
|
|
228
|
+
If unsure which fits, ask the user rather than guessing.
|
|
214
229
|
|
|
215
230
|
### Artifacts
|
|
216
231
|
|
|
217
|
-
Agent output is written to uv-out
|
|
218
|
-
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
232
|
+
Agent output is written to uv-out/, scoped by session: uv-out/sessions/<session-id>/.
|
|
233
|
+
uv-out/current symlinks to the active session's directory. The session id comes from
|
|
234
|
+
UVS_SESSION_ID (or .uv-suite-state/current-session.txt), so every artifact is attributable
|
|
235
|
+
to the session that produced it. Each artifact is also stamped with provenance frontmatter
|
|
236
|
+
(session, skill, created).
|
|
237
|
+
|
|
238
|
+
Downstream skills prefer the current session's artifacts but can use a prior session's when
|
|
239
|
+
the current one has none (they list current → prior → legacy and ask which to use). All
|
|
240
|
+
writers are session-scoped:
|
|
241
|
+
- /understand → uv-out/sessions/<sid>/map-codebase.md (repo) or map-stack.md (stack)
|
|
242
|
+
- /spec → uv-out/sessions/<sid>/specs/
|
|
243
|
+
- /architect → uv-out/sessions/<sid>/architecture/
|
|
244
|
+
- /review → uv-out/sessions/<sid>/review/state.md (flat pointer: uv-out/review-state.md)
|
|
245
|
+
- /review --slop → uv-out/sessions/<sid>/slop/report.md
|
|
246
|
+
- /review --security → uv-out/sessions/<sid>/security/report.md
|
|
247
|
+
- /investigate → uv-out/sessions/<sid>/investigate/report.md
|
|
248
|
+
- /test --eval → uv-out/sessions/<sid>/evals/
|
|
249
|
+
- /qa → uv-out/sessions/<sid>/qa/ (flat pointer: uv-out/qa-state.md)
|
|
250
|
+
- /session checkpoint → uv-out/sessions/<sid>/checkpoints/
|
|
251
|
+
|
|
252
|
+
Fixed-path consumers (/commit, /ship) read the flat pointer symlinks (uv-out/review-state.md,
|
|
253
|
+
uv-out/qa-state.md), which resolve into the current session. The Stop hook uv-out-notify.sh
|
|
254
|
+
prints the artifact path (and session id) to the terminal after each run.
|
|
222
255
|
|
|
223
256
|
### Hooks
|
|
224
257
|
|
|
@@ -244,7 +277,7 @@ ${HOOKS_TEXT}
|
|
|
244
277
|
|
|
245
278
|
**Planning:** Use plan mode for complex tasks. Break work small enough to complete in under 50% context.
|
|
246
279
|
|
|
247
|
-
**Session:** /compact at ~50% context. Past 90 min, take a break. Run /checkpoint before ending a session. Run /restore at the start of the next one.
|
|
280
|
+
**Session:** /compact at ~50% context. Past 90 min, take a break. Run /session checkpoint before ending a session. Run /session restore at the start of the next one.
|
|
248
281
|
|
|
249
282
|
### Launching sessions
|
|
250
283
|
|
|
@@ -263,6 +296,11 @@ if command -v pip3 &>/dev/null; then PIP_CMD="pip3"
|
|
|
263
296
|
elif command -v pip &>/dev/null; then PIP_CMD="pip"
|
|
264
297
|
fi
|
|
265
298
|
|
|
299
|
+
# `timeout` is absent on stock macOS (gtimeout via coreutils); fall back to no timeout.
|
|
300
|
+
TO=""
|
|
301
|
+
if command -v timeout &>/dev/null; then TO="timeout 60"
|
|
302
|
+
elif command -v gtimeout &>/dev/null; then TO="gtimeout 60"; fi
|
|
303
|
+
|
|
266
304
|
if [ -n "$PIP_CMD" ]; then
|
|
267
305
|
for pkg_info in "graphifyy:graphify:Graphify (knowledge graphs for Cartographer)" \
|
|
268
306
|
"semgrep:semgrep:Semgrep (SAST for Security Agent)" \
|
|
@@ -274,7 +312,7 @@ if [ -n "$PIP_CMD" ]; then
|
|
|
274
312
|
echo " ✓ $label (already installed)"
|
|
275
313
|
else
|
|
276
314
|
echo " Installing $label..."
|
|
277
|
-
|
|
315
|
+
$TO $PIP_CMD install "$pkg" --quiet 2>/dev/null || true
|
|
278
316
|
if command -v "$cmd" &>/dev/null || $PIP_CMD show "$pkg" &>/dev/null; then
|
|
279
317
|
echo " ✓ $label installed"
|
|
280
318
|
else
|
|
@@ -298,7 +336,7 @@ if command -v repomix &>/dev/null; then
|
|
|
298
336
|
echo " ✓ Repomix (already installed)"
|
|
299
337
|
else
|
|
300
338
|
echo " Installing Repomix (codebase context packing)..."
|
|
301
|
-
npm install -g repomix --quiet 2>/dev/null
|
|
339
|
+
$TO npm install -g repomix --quiet 2>/dev/null || true
|
|
302
340
|
if command -v repomix &>/dev/null; then
|
|
303
341
|
echo " ✓ Repomix installed"
|
|
304
342
|
else
|
|
@@ -306,6 +344,16 @@ else
|
|
|
306
344
|
fi
|
|
307
345
|
fi
|
|
308
346
|
|
|
347
|
+
# tmux — required for Watchtower to OWN and control uvs sessions (approve/close/send-keys).
|
|
348
|
+
if command -v tmux &>/dev/null; then
|
|
349
|
+
echo " ✓ tmux (Watchtower can own + control uvs sessions)"
|
|
350
|
+
else
|
|
351
|
+
echo " ⚠ tmux not found — Watchtower control (approve/close from the dashboard) needs it."
|
|
352
|
+
echo " macOS: brew install tmux · Debian/Ubuntu: apt install tmux"
|
|
353
|
+
echo " Without tmux, uvs sessions launch normally but aren't Watchtower-controllable"
|
|
354
|
+
echo " (out-of-band checkpoint still works)."
|
|
355
|
+
fi
|
|
356
|
+
|
|
309
357
|
# Go tools (Gitleaks, Trivy — brew or binary)
|
|
310
358
|
if command -v brew &>/dev/null; then
|
|
311
359
|
for tool_info in "gitleaks:Gitleaks (secret detection)" \
|
|
@@ -367,24 +415,27 @@ echo "╚═══════════════════════
|
|
|
367
415
|
echo ""
|
|
368
416
|
echo "What was installed:"
|
|
369
417
|
echo ""
|
|
370
|
-
echo " Claude Code .claude/agents/*.md + skills/ + hooks/ + rules/"
|
|
371
|
-
echo " Codex .codex/agents/*.toml + AGENTS.md"
|
|
372
|
-
echo " Cursor .cursor/rules/*.mdc"
|
|
418
|
+
echo " Claude Code .claude/agents/*.md (8 canonical) + skills/ + hooks/ + rules/"
|
|
419
|
+
echo " Codex .codex/agents/*.toml (generated from canonical) + AGENTS.md"
|
|
420
|
+
echo " Cursor .cursor/rules/*.mdc (generated from canonical)"
|
|
373
421
|
echo " Personas (4) .claude/personas/*.json"
|
|
374
422
|
echo " Launcher ./uv.sh"
|
|
375
423
|
echo ""
|
|
376
424
|
|
|
377
|
-
echo "Available slash commands:"
|
|
425
|
+
echo "Available slash commands (12 skills):"
|
|
378
426
|
echo ""
|
|
379
|
-
echo " /
|
|
380
|
-
echo " /spec [requirements]
|
|
381
|
-
echo " /architect [spec]
|
|
382
|
-
echo " /
|
|
383
|
-
echo " /
|
|
384
|
-
echo " /
|
|
385
|
-
echo " /
|
|
386
|
-
echo " /
|
|
387
|
-
echo " /
|
|
427
|
+
echo " /understand Map a codebase or full stack (auto-detected) (Cartographer)"
|
|
428
|
+
echo " /spec [requirements] Write a technical spec (Spec Writer)"
|
|
429
|
+
echo " /architect [spec] Design architecture + Acts (Architect)"
|
|
430
|
+
echo " /test [--unit|--integration|--eval] Generate tests/evals (Test Writer, Eval Writer)"
|
|
431
|
+
echo " /review [--security|--slop] Code review, security audit, slop check (Reviewer, etc.)"
|
|
432
|
+
echo " /prototype [concept] Build a prototype (Prototype Builder)"
|
|
433
|
+
echo " /qa [target] Browser-based QA (Playwright MCP)"
|
|
434
|
+
echo " /investigate [question] Multi-step codebase investigation"
|
|
435
|
+
echo " /commit Stage and commit changes"
|
|
436
|
+
echo " /session <init|checkpoint|restore|end|auto> Manage session lifecycle"
|
|
437
|
+
echo " /confirm Confirm a HITL gate"
|
|
438
|
+
echo " /uv-help Show UV Suite help"
|
|
388
439
|
echo ""
|
|
389
440
|
|
|
390
441
|
if [ "$PERSONA" = "sport" ]; then
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uv-suite",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.30.0",
|
|
4
|
+
"description": "Anti-slop guardrails, specialized agents, and a live observability + control plane for AI-assisted coding. 8 agents, 12 skills, 27 hooks, 6 guardrails, 4 personas; Watchtower (Python/Postgres) for monitoring + checkpoint/close/approve from the browser. Works with Claude Code, Cursor, and Codex.",
|
|
5
5
|
"author": "Utsav Anand",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
package/personas/auto.json
CHANGED
|
@@ -37,6 +37,17 @@
|
|
|
37
37
|
"Bash(wc *)",
|
|
38
38
|
"Bash(head *)",
|
|
39
39
|
"Bash(tail *)",
|
|
40
|
+
"Bash(grep *)",
|
|
41
|
+
"Bash(rg *)",
|
|
42
|
+
"Bash(jq *)",
|
|
43
|
+
"Bash(sed -n *)",
|
|
44
|
+
"Bash(awk *)",
|
|
45
|
+
"Bash(tree *)",
|
|
46
|
+
"Bash(du *)",
|
|
47
|
+
"Bash(df *)",
|
|
48
|
+
"Bash(file *)",
|
|
49
|
+
"Bash(stat *)",
|
|
50
|
+
"Bash(diff *)",
|
|
40
51
|
"Bash(curl *)",
|
|
41
52
|
"Bash(chmod *)",
|
|
42
53
|
"Bash(rm /tmp/*)",
|
|
@@ -70,6 +81,11 @@
|
|
|
70
81
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
71
82
|
"timeout": 2,
|
|
72
83
|
"async": true
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "command",
|
|
87
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-restore-on-start.sh",
|
|
88
|
+
"timeout": 3
|
|
73
89
|
}
|
|
74
90
|
]
|
|
75
91
|
}
|
|
@@ -88,6 +104,11 @@
|
|
|
88
104
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
89
105
|
"timeout": 3
|
|
90
106
|
},
|
|
107
|
+
{
|
|
108
|
+
"type": "command",
|
|
109
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/lite-mode-inject.sh",
|
|
110
|
+
"timeout": 2
|
|
111
|
+
},
|
|
91
112
|
{
|
|
92
113
|
"type": "command",
|
|
93
114
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
@@ -106,6 +127,12 @@
|
|
|
106
127
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
107
128
|
"timeout": 2,
|
|
108
129
|
"async": true
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"type": "command",
|
|
133
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-notify.sh",
|
|
134
|
+
"timeout": 2,
|
|
135
|
+
"async": true
|
|
109
136
|
}
|
|
110
137
|
]
|
|
111
138
|
}
|
|
@@ -180,6 +207,12 @@
|
|
|
180
207
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-lint.sh",
|
|
181
208
|
"timeout": 15,
|
|
182
209
|
"statusMessage": "Auto-formatting..."
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"type": "command",
|
|
213
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/slop-grep.sh",
|
|
214
|
+
"timeout": 3,
|
|
215
|
+
"statusMessage": "Slop check..."
|
|
183
216
|
}
|
|
184
217
|
]
|
|
185
218
|
}
|
|
@@ -192,6 +225,12 @@
|
|
|
192
225
|
"type": "command",
|
|
193
226
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
194
227
|
"timeout": 10
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"type": "command",
|
|
231
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/uv-out-notify.sh",
|
|
232
|
+
"timeout": 5,
|
|
233
|
+
"statusMessage": "Locating UV Suite output..."
|
|
195
234
|
}
|
|
196
235
|
]
|
|
197
236
|
}
|
|
@@ -201,4 +240,4 @@
|
|
|
201
240
|
"type": "command",
|
|
202
241
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
203
242
|
}
|
|
204
|
-
}
|
|
243
|
+
}
|
|
@@ -23,6 +23,29 @@
|
|
|
23
23
|
"Bash(git log *)",
|
|
24
24
|
"Bash(git show *)",
|
|
25
25
|
"Bash(git ls-files *)",
|
|
26
|
+
"Bash(git branch *)",
|
|
27
|
+
"Bash(git blame *)",
|
|
28
|
+
"Bash(git remote *)",
|
|
29
|
+
"Bash(cat *)",
|
|
30
|
+
"Bash(ls *)",
|
|
31
|
+
"Bash(head *)",
|
|
32
|
+
"Bash(tail *)",
|
|
33
|
+
"Bash(find *)",
|
|
34
|
+
"Bash(wc *)",
|
|
35
|
+
"Bash(grep *)",
|
|
36
|
+
"Bash(rg *)",
|
|
37
|
+
"Bash(jq *)",
|
|
38
|
+
"Bash(sed -n *)",
|
|
39
|
+
"Bash(awk *)",
|
|
40
|
+
"Bash(tree *)",
|
|
41
|
+
"Bash(du *)",
|
|
42
|
+
"Bash(df *)",
|
|
43
|
+
"Bash(file *)",
|
|
44
|
+
"Bash(stat *)",
|
|
45
|
+
"Bash(diff *)",
|
|
46
|
+
"Bash(basename *)",
|
|
47
|
+
"Bash(dirname *)",
|
|
48
|
+
"Bash(realpath *)",
|
|
26
49
|
"Bash(npm test *)",
|
|
27
50
|
"Bash(npm run test *)",
|
|
28
51
|
"Bash(npm run lint *)",
|
|
@@ -70,6 +93,11 @@
|
|
|
70
93
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
71
94
|
"timeout": 2,
|
|
72
95
|
"async": true
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"type": "command",
|
|
99
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-restore-on-start.sh",
|
|
100
|
+
"timeout": 3
|
|
73
101
|
}
|
|
74
102
|
]
|
|
75
103
|
}
|
|
@@ -78,6 +106,11 @@
|
|
|
78
106
|
{
|
|
79
107
|
"matcher": "*",
|
|
80
108
|
"hooks": [
|
|
109
|
+
{
|
|
110
|
+
"type": "command",
|
|
111
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/lite-mode-inject.sh",
|
|
112
|
+
"timeout": 2
|
|
113
|
+
},
|
|
81
114
|
{
|
|
82
115
|
"type": "command",
|
|
83
116
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/confirm-prompt.sh",
|
|
@@ -106,6 +139,12 @@
|
|
|
106
139
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
107
140
|
"timeout": 2,
|
|
108
141
|
"async": true
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"type": "command",
|
|
145
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-notify.sh",
|
|
146
|
+
"timeout": 2,
|
|
147
|
+
"async": true
|
|
109
148
|
}
|
|
110
149
|
]
|
|
111
150
|
}
|
|
@@ -210,6 +249,12 @@
|
|
|
210
249
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
211
250
|
"timeout": 10,
|
|
212
251
|
"statusMessage": "Wrapping up session..."
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"type": "command",
|
|
255
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/uv-out-notify.sh",
|
|
256
|
+
"timeout": 5,
|
|
257
|
+
"statusMessage": "Locating UV Suite output..."
|
|
213
258
|
}
|
|
214
259
|
]
|
|
215
260
|
}
|
|
@@ -219,4 +264,4 @@
|
|
|
219
264
|
"type": "command",
|
|
220
265
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
221
266
|
}
|
|
222
|
-
}
|
|
267
|
+
}
|
package/personas/spike.json
CHANGED
|
@@ -33,10 +33,18 @@
|
|
|
33
33
|
"Bash(rm /tmp/*)",
|
|
34
34
|
"Bash(cat *)",
|
|
35
35
|
"Bash(ls *)",
|
|
36
|
+
"Bash(grep *)",
|
|
37
|
+
"Bash(rg *)",
|
|
38
|
+
"Bash(jq *)",
|
|
39
|
+
"Bash(less *)",
|
|
40
|
+
"Bash(sed -n *)",
|
|
41
|
+
"Bash(awk *)",
|
|
42
|
+
"Bash(file *)",
|
|
36
43
|
"Bash(echo *)",
|
|
37
44
|
"Bash(printf *)",
|
|
38
45
|
"Bash(node --check *)",
|
|
39
|
-
"Bash(bash -n *)"
|
|
46
|
+
"Bash(bash -n *)",
|
|
47
|
+
"WebFetch(*)"
|
|
40
48
|
],
|
|
41
49
|
"deny": [
|
|
42
50
|
"Bash(rm -rf /)",
|
|
@@ -63,6 +71,11 @@
|
|
|
63
71
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
64
72
|
"timeout": 2,
|
|
65
73
|
"async": true
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "command",
|
|
77
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-restore-on-start.sh",
|
|
78
|
+
"timeout": 3
|
|
66
79
|
}
|
|
67
80
|
]
|
|
68
81
|
}
|
|
@@ -81,6 +94,11 @@
|
|
|
81
94
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
82
95
|
"timeout": 3
|
|
83
96
|
},
|
|
97
|
+
{
|
|
98
|
+
"type": "command",
|
|
99
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/lite-mode-inject.sh",
|
|
100
|
+
"timeout": 2
|
|
101
|
+
},
|
|
84
102
|
{
|
|
85
103
|
"type": "command",
|
|
86
104
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
@@ -99,6 +117,12 @@
|
|
|
99
117
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
100
118
|
"timeout": 2,
|
|
101
119
|
"async": true
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"type": "command",
|
|
123
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-notify.sh",
|
|
124
|
+
"timeout": 2,
|
|
125
|
+
"async": true
|
|
102
126
|
}
|
|
103
127
|
]
|
|
104
128
|
}
|
|
@@ -167,6 +191,12 @@
|
|
|
167
191
|
"type": "command",
|
|
168
192
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
169
193
|
"timeout": 10
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"type": "command",
|
|
197
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/uv-out-notify.sh",
|
|
198
|
+
"timeout": 5,
|
|
199
|
+
"statusMessage": "Locating UV Suite output..."
|
|
170
200
|
}
|
|
171
201
|
]
|
|
172
202
|
}
|
|
@@ -176,4 +206,4 @@
|
|
|
176
206
|
"type": "command",
|
|
177
207
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
178
208
|
}
|
|
179
|
-
}
|
|
209
|
+
}
|
package/personas/sport.json
CHANGED
|
@@ -22,6 +22,21 @@
|
|
|
22
22
|
"Bash(rm /tmp/*)",
|
|
23
23
|
"Bash(cat *)",
|
|
24
24
|
"Bash(ls *)",
|
|
25
|
+
"Bash(head *)",
|
|
26
|
+
"Bash(tail *)",
|
|
27
|
+
"Bash(find *)",
|
|
28
|
+
"Bash(wc *)",
|
|
29
|
+
"Bash(grep *)",
|
|
30
|
+
"Bash(rg *)",
|
|
31
|
+
"Bash(jq *)",
|
|
32
|
+
"Bash(sed -n *)",
|
|
33
|
+
"Bash(awk *)",
|
|
34
|
+
"Bash(tree *)",
|
|
35
|
+
"Bash(du *)",
|
|
36
|
+
"Bash(df *)",
|
|
37
|
+
"Bash(file *)",
|
|
38
|
+
"Bash(stat *)",
|
|
39
|
+
"Bash(diff *)",
|
|
25
40
|
"Bash(echo *)",
|
|
26
41
|
"Bash(printf *)",
|
|
27
42
|
"Bash(node --check *)",
|
|
@@ -52,6 +67,11 @@
|
|
|
52
67
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh SessionStart",
|
|
53
68
|
"timeout": 2,
|
|
54
69
|
"async": true
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"type": "command",
|
|
73
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-restore-on-start.sh",
|
|
74
|
+
"timeout": 3
|
|
55
75
|
}
|
|
56
76
|
]
|
|
57
77
|
}
|
|
@@ -70,6 +90,11 @@
|
|
|
70
90
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-label-nag.sh",
|
|
71
91
|
"timeout": 3
|
|
72
92
|
},
|
|
93
|
+
{
|
|
94
|
+
"type": "command",
|
|
95
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/lite-mode-inject.sh",
|
|
96
|
+
"timeout": 2
|
|
97
|
+
},
|
|
73
98
|
{
|
|
74
99
|
"type": "command",
|
|
75
100
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh UserPromptSubmit",
|
|
@@ -88,6 +113,12 @@
|
|
|
88
113
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-send.sh PermissionRequest",
|
|
89
114
|
"timeout": 2,
|
|
90
115
|
"async": true
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"type": "command",
|
|
119
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/watchtower-notify.sh",
|
|
120
|
+
"timeout": 2,
|
|
121
|
+
"async": true
|
|
91
122
|
}
|
|
92
123
|
]
|
|
93
124
|
}
|
|
@@ -144,6 +175,12 @@
|
|
|
144
175
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-lint.sh",
|
|
145
176
|
"timeout": 15,
|
|
146
177
|
"statusMessage": "Auto-formatting..."
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"type": "command",
|
|
181
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/slop-grep.sh",
|
|
182
|
+
"timeout": 3,
|
|
183
|
+
"statusMessage": "Slop check..."
|
|
147
184
|
}
|
|
148
185
|
]
|
|
149
186
|
}
|
|
@@ -156,6 +193,12 @@
|
|
|
156
193
|
"type": "command",
|
|
157
194
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-end.sh",
|
|
158
195
|
"timeout": 10
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"type": "command",
|
|
199
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/uv-out-notify.sh",
|
|
200
|
+
"timeout": 5,
|
|
201
|
+
"statusMessage": "Locating UV Suite output..."
|
|
159
202
|
}
|
|
160
203
|
]
|
|
161
204
|
}
|
|
@@ -165,4 +208,4 @@
|
|
|
165
208
|
"type": "command",
|
|
166
209
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/status-line.sh"
|
|
167
210
|
}
|
|
168
|
-
}
|
|
211
|
+
}
|
package/settings.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
-
|
|
4
3
|
"permissions": {
|
|
5
4
|
"allow": [
|
|
6
5
|
"Read(*)",
|
|
@@ -45,7 +44,6 @@
|
|
|
45
44
|
"Bash(git reset --hard origin/*)"
|
|
46
45
|
]
|
|
47
46
|
},
|
|
48
|
-
|
|
49
47
|
"hooks": {
|
|
50
48
|
"PreToolUse": [
|
|
51
49
|
{
|
|
@@ -99,6 +97,12 @@
|
|
|
99
97
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-review-reminder.sh",
|
|
100
98
|
"timeout": 10,
|
|
101
99
|
"statusMessage": "Checking for uncommitted changes..."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"type": "command",
|
|
103
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/uv-out-notify.sh",
|
|
104
|
+
"timeout": 5,
|
|
105
|
+
"statusMessage": "Locating UV Suite output..."
|
|
102
106
|
}
|
|
103
107
|
]
|
|
104
108
|
}
|