xtrm-tools 2.4.1 → 2.4.2
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/README.md +15 -6
- package/cli/dist/index.cjs +738 -239
- package/cli/dist/index.cjs.map +1 -1
- package/cli/package.json +1 -1
- package/config/hooks.json +10 -0
- package/config/pi/extensions/core/adapter.ts +2 -14
- package/config/pi/extensions/core/guard-rules.ts +70 -0
- package/config/pi/extensions/core/session-state.ts +59 -0
- package/config/pi/extensions/main-guard.ts +10 -14
- package/config/pi/extensions/plan-mode/README.md +65 -0
- package/config/pi/extensions/plan-mode/index.ts +340 -0
- package/config/pi/extensions/plan-mode/utils.ts +168 -0
- package/config/pi/extensions/service-skills.ts +51 -7
- package/config/pi/extensions/session-flow.ts +117 -0
- package/hooks/beads-claim-sync.mjs +123 -2
- package/hooks/beads-compact-restore.mjs +41 -9
- package/hooks/beads-compact-save.mjs +36 -5
- package/hooks/beads-gate-messages.mjs +27 -1
- package/hooks/beads-stop-gate.mjs +58 -8
- package/hooks/guard-rules.mjs +86 -0
- package/hooks/hooks.json +28 -18
- package/hooks/main-guard.mjs +3 -21
- package/hooks/quality-check.cjs +1286 -0
- package/hooks/quality-check.py +345 -0
- package/hooks/session-state.mjs +138 -0
- package/package.json +2 -1
- package/project-skills/quality-gates/.claude/settings.json +1 -24
- package/skills/creating-service-skills/SKILL.md +433 -0
- package/skills/creating-service-skills/references/script_quality_standards.md +425 -0
- package/skills/creating-service-skills/references/service_skill_system_guide.md +278 -0
- package/skills/creating-service-skills/scripts/bootstrap.py +326 -0
- package/skills/creating-service-skills/scripts/deep_dive.py +304 -0
- package/skills/creating-service-skills/scripts/scaffolder.py +482 -0
- package/skills/scoping-service-skills/SKILL.md +231 -0
- package/skills/scoping-service-skills/scripts/scope.py +74 -0
- package/skills/sync-docs/SKILL.md +235 -0
- package/skills/sync-docs/evals/evals.json +89 -0
- package/skills/sync-docs/references/doc-structure.md +104 -0
- package/skills/sync-docs/references/schema.md +103 -0
- package/skills/sync-docs/scripts/context_gatherer.py +246 -0
- package/skills/sync-docs/scripts/doc_structure_analyzer.py +495 -0
- package/skills/sync-docs/scripts/validate_doc.py +365 -0
- package/skills/sync-docs-workspace/iteration-1/benchmark.json +293 -0
- package/skills/sync-docs-workspace/iteration-1/benchmark.md +13 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +210 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +101 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +198 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +94 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +237 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +134 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +28 -0
- package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-2/benchmark.json +297 -0
- package/skills/sync-docs-workspace/iteration-2/benchmark.md +13 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +137 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +92 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +134 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +86 -0
- package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +193 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +72 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +211 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +91 -0
- package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +182 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +222 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +88 -0
- package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/benchmark.json +298 -0
- package/skills/sync-docs-workspace/iteration-3/benchmark.md +13 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +125 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +97 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +144 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +78 -0
- package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +104 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +91 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +79 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +82 -0
- package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +27 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +302 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +33 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +114 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +118 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +38 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +158 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +5 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +71 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +90 -0
- package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
- package/skills/updating-service-skills/SKILL.md +136 -0
- package/skills/updating-service-skills/scripts/drift_detector.py +222 -0
- package/skills/using-quality-gates/SKILL.md +254 -0
- package/skills/using-service-skills/SKILL.md +108 -0
- package/skills/using-service-skills/scripts/cataloger.py +74 -0
- package/skills/using-service-skills/scripts/skill_activator.py +152 -0
- package/skills/using-service-skills/scripts/test_skill_activator.py +58 -0
- package/skills/using-xtrm/SKILL.md +34 -38
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: creating-service-skills
|
|
3
|
+
description: >-
|
|
4
|
+
Generate operational service skill packages for any service in the project.
|
|
5
|
+
Produces SKILL.md documentation, diagnostic scripts, and references through a
|
|
6
|
+
mandatory two-phase workflow. Use when onboarding to a new service, adding a
|
|
7
|
+
new skill, or when a skill is missing from the catalog.
|
|
8
|
+
allowed-tools: Bash(python3 *), Read, Grep, Glob
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Creating Service Skills
|
|
12
|
+
|
|
13
|
+
## Role: The Architect
|
|
14
|
+
|
|
15
|
+
You are the **Service Skills Architect**. Your job is to produce complete, operational
|
|
16
|
+
skill packages for project services — not stubs, not placeholders. The output must be
|
|
17
|
+
immediately useful to any agent working on the service.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Mandatory Two-Phase Workflow
|
|
22
|
+
|
|
23
|
+
**Use both phases every time.** Phase 1 gives structure; Phase 2 grounds the skill in real service behavior.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
### Phase 1: Automated Skeleton (Always First)
|
|
28
|
+
|
|
29
|
+
Run the scaffolder to build a structural skeleton from static analysis of
|
|
30
|
+
`docker-compose*.yml`, `Dockerfile`, and dependency files. It also detects
|
|
31
|
+
technologies and auto-populates official documentation links.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Create a skeleton for a service
|
|
35
|
+
python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/scaffolder.py" \
|
|
36
|
+
create <service-id> <territory-path> "<description>"
|
|
37
|
+
|
|
38
|
+
# Example
|
|
39
|
+
python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/scaffolder.py" \
|
|
40
|
+
create auth-service src/auth/ "JWT authentication and session management"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The skeleton creates at `.claude/skills/<service-id>/`:
|
|
44
|
+
- `SKILL.md` with `[PENDING RESEARCH]` markers
|
|
45
|
+
- `scripts/health_probe.py` stub
|
|
46
|
+
- `scripts/log_hunter.py` stub
|
|
47
|
+
- `scripts/data_explorer.py` stub
|
|
48
|
+
- `references/deep_dive.md` research checklist
|
|
49
|
+
|
|
50
|
+
**The skeleton is never sufficient.** It has structural facts but no semantic knowledge.
|
|
51
|
+
|
|
52
|
+
Classify the service type to determine which specialist script to add:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/deep_dive.py" \
|
|
56
|
+
classify <territory-path>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Print the full Phase 2 research agenda:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/deep_dive.py" \
|
|
63
|
+
questions <service-type>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Phase 2: Agentic Deep Dive
|
|
69
|
+
|
|
70
|
+
After the skeleton exists, answer every research question by reading the actual
|
|
71
|
+
source code. Use **Serena LSP tools exclusively** — never read entire files.
|
|
72
|
+
|
|
73
|
+
#### Serena Tool Protocol for Deep Dive
|
|
74
|
+
|
|
75
|
+
| What you need to find | Serena tool to use |
|
|
76
|
+
|---|---|
|
|
77
|
+
| Module/class structure | `get_symbols_overview(relative_path, depth=1)` |
|
|
78
|
+
| Body of a specific function | `find_symbol(name_path, include_body=True)` |
|
|
79
|
+
| Log/error message strings | `search_for_pattern("logger.error|raise|except")` |
|
|
80
|
+
| All SQL queries | `search_for_pattern("SELECT|INSERT|UPDATE|COPY")` |
|
|
81
|
+
| Env var usage | `search_for_pattern("os.getenv|os.environ|settings\\.")` |
|
|
82
|
+
| Data flow (who calls what) | `find_referencing_symbols(name_path, relative_path)` |
|
|
83
|
+
| Entry point detection | `search_for_pattern('if __name__|def main|async def main')` |
|
|
84
|
+
| Docker port mapping | `search_for_pattern("ports:|DB_PORT|POSTGRES_PORT")` |
|
|
85
|
+
| **Actual table names** | `execute_db_query("SELECT tablename FROM pg_tables WHERE schemaname='public'")` |
|
|
86
|
+
| **Actual column names** | `execute_db_query("SELECT column_name, data_type FROM information_schema.columns WHERE table_name='X'")` |
|
|
87
|
+
|
|
88
|
+
**Do NOT read entire files.** Map first → read only the symbols you need.
|
|
89
|
+
|
|
90
|
+
#### Required Research Sections
|
|
91
|
+
|
|
92
|
+
**Container & Runtime**
|
|
93
|
+
- Exact entry point (Dockerfile CMD + docker-compose `command:`)
|
|
94
|
+
- Critical env vars that crash the service if missing (no default)
|
|
95
|
+
- Volumes read from / written to
|
|
96
|
+
- Service type: daemon / one-shot / cron?
|
|
97
|
+
- Restart policy and `depends_on:` conditions
|
|
98
|
+
|
|
99
|
+
**Data Layer** — verify ALL of these against the live DB before writing any scripts:
|
|
100
|
+
- Run `SELECT tablename FROM pg_tables WHERE schemaname='public'` → get exact table list
|
|
101
|
+
- For each output table: run `SELECT column_name, data_type FROM information_schema.columns WHERE table_name='<table>'` → get exact column names
|
|
102
|
+
- Confirm which tables have a timestamp column and which do not (use `COUNT(*)` freshness check for tables with no timestamp)
|
|
103
|
+
- Which tables does it WRITE vs. only READ?
|
|
104
|
+
- Realistic stale threshold per table (in minutes)
|
|
105
|
+
- Redis/S3/file state usage
|
|
106
|
+
- SQL parameterization: flag any f-string SQL
|
|
107
|
+
|
|
108
|
+
**Failure Modes** — build this table with ≥5 rows from real exception handlers:
|
|
109
|
+
|
|
110
|
+
| Symptom | Likely Cause | Resolution |
|
|
111
|
+
|---------|-------------|------------|
|
|
112
|
+
| (log output) | (root cause) | (exact fix command) |
|
|
113
|
+
|
|
114
|
+
**Log Patterns** — source from actual codebase, not invented:
|
|
115
|
+
- `search_for_pattern("logger.info|logging.info")` → `info` patterns
|
|
116
|
+
- `search_for_pattern("logger.error|logger.warning")` → `error/warning`
|
|
117
|
+
- `search_for_pattern("logger.critical|panic!")` → `critical`
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### Phase 2 Script Writing (Complete Implementation)
|
|
122
|
+
|
|
123
|
+
After research is complete, replace all `[PENDING RESEARCH]` stubs in `scripts/`.
|
|
124
|
+
Scripts should be ready to run end-to-end, without TODO markers or placeholder SQL.
|
|
125
|
+
|
|
126
|
+
#### Mandatory DB Connection Pattern (all scripts that touch the DB)
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
from dotenv import load_dotenv
|
|
130
|
+
from pathlib import Path
|
|
131
|
+
import sys
|
|
132
|
+
|
|
133
|
+
project_root = Path(__file__).resolve().parent.parent.parent.parent.parent
|
|
134
|
+
env_file = project_root / ".env"
|
|
135
|
+
if env_file.exists():
|
|
136
|
+
load_dotenv(str(env_file))
|
|
137
|
+
|
|
138
|
+
sys.path.insert(0, str(project_root))
|
|
139
|
+
from shared.db_pool_manager import execute_db_query
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Never use raw `psycopg2` or hardcoded credentials. Always use `execute_db_query` from
|
|
143
|
+
`shared.db_pool_manager`. The `.env` load is mandatory — scripts without it will fail
|
|
144
|
+
when the environment is clean.
|
|
145
|
+
|
|
146
|
+
#### Script Integrity Rules
|
|
147
|
+
|
|
148
|
+
1. **Schema first** — query `information_schema` before writing any SQL. Never guess table or column names.
|
|
149
|
+
2. **Every `try` has an `except`** — incomplete try/except blocks crash silently. Every DB call must be wrapped with a matching except that captures the error into the result.
|
|
150
|
+
3. **Function names match call sites** — after renaming any function, search for all call sites and update them.
|
|
151
|
+
4. **`qwen -y` for delegation** — when delegating Phase 2 to Qwen, always pass the `-y` flag (YOLO/non-interactive mode) otherwise Qwen will research but never write files.
|
|
152
|
+
5. **No `ccs gemini`** — Gemini is invoked as `gemini -p "..."` directly; GLM is `env -u CLAUDECODE ccs glm -p "..."`; Qwen is `qwen -y "..."`.
|
|
153
|
+
6. **`venv/bin/python3` for testing** — diagnostic scripts must be tested with the project venv, not system python, which may lack `dotenv` and other deps.
|
|
154
|
+
|
|
155
|
+
#### `scripts/health_probe.py`
|
|
156
|
+
|
|
157
|
+
Required features:
|
|
158
|
+
- `check_container()`: `docker inspect -f {{.State.Running}} <container>`
|
|
159
|
+
- `check_table_freshness()`: `SELECT MAX(<ts_col>) FROM <table>` — compare vs stale threshold
|
|
160
|
+
- Use **external mapped port** (e.g. 5433 for host), NOT container-internal port (5432)
|
|
161
|
+
- Print exact fix command on failure: `docker compose restart <service>` or SQL correction
|
|
162
|
+
- Support `--json` flag for machine-readable output
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
STALE_CHECKS = [
|
|
166
|
+
{"table": "actual_table", "ts_col": "created_at", "stale_minutes": 10},
|
|
167
|
+
]
|
|
168
|
+
DB_PORT = 5433 # external mapped port — verify in docker-compose.yml
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### `scripts/log_hunter.py`
|
|
172
|
+
|
|
173
|
+
Required features:
|
|
174
|
+
- PATTERNS list sourced from actual codebase error strings (not generic names)
|
|
175
|
+
- Severity bucketing: `critical → error → warning → info`
|
|
176
|
+
- `--tail N`, `--since <time>`, `--errors-only`, `--json` flags
|
|
177
|
+
- Print specific fix command when critical pattern detected
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
# RIGHT — from actual codebase
|
|
181
|
+
PATTERNS = [
|
|
182
|
+
("OAuth expired", r"invalid_grant|token.*expired", "critical"),
|
|
183
|
+
("PDF parse error", r"PdfReadError|pdf.*format.*changed", "error"),
|
|
184
|
+
("Report saved", r"report.*ingested|saved.*DB", "info"),
|
|
185
|
+
]
|
|
186
|
+
# WRONG — never use generic patterns
|
|
187
|
+
PATTERNS = [("Error", r"ERROR|Exception|ConnectionError", "error")]
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### `scripts/data_explorer.py`
|
|
191
|
+
|
|
192
|
+
Required features:
|
|
193
|
+
- Real table name, correct external DB_PORT
|
|
194
|
+
- All queries parameterized: `WHERE symbol = %s` (never f-strings in SQL)
|
|
195
|
+
- `--limit`, `--json`, `--symbol` flags
|
|
196
|
+
- Read-only: no INSERT/UPDATE/DELETE
|
|
197
|
+
|
|
198
|
+
#### Specialist Script (based on service type)
|
|
199
|
+
|
|
200
|
+
| Service Type | Script | Core Logic |
|
|
201
|
+
|---|---|---|
|
|
202
|
+
| `continuous_db_writer` | `data_explorer.py` | DISTINCT ON latest-per-symbol |
|
|
203
|
+
| `http_api_server` | `endpoint_tester.py` | Probe real routes, check response codes |
|
|
204
|
+
| `one_shot_migration` | `coverage_checker.py` | Verify expected schema/table exists |
|
|
205
|
+
| `file_watcher` | `state_inspector.py` | Mount accessible + state file present |
|
|
206
|
+
| `scheduled_poller` | `auth_checker.py` | Token file present + not expired |
|
|
207
|
+
|
|
208
|
+
See [references/script_quality_standards.md](references/script_quality_standards.md) for complete templates.
|
|
209
|
+
|
|
210
|
+
#### `scripts/Makefile` (required)
|
|
211
|
+
|
|
212
|
+
The scaffolder creates a stub `Makefile` in Phase 1. In Phase 2, verify it is
|
|
213
|
+
correct and complete because it is the primary entry point for diagnostics.
|
|
214
|
+
|
|
215
|
+
**Standard template** (copy verbatim, replace `<service-id>` comment only):
|
|
216
|
+
|
|
217
|
+
```makefile
|
|
218
|
+
# Skill diagnostic scripts for <service-id>
|
|
219
|
+
# Usage: make <target> (from this directory)
|
|
220
|
+
# Override python: make health PYTHON=/path/to/python3
|
|
221
|
+
|
|
222
|
+
# Auto-detect: prefer project venv (4 levels up), fall back to system python3
|
|
223
|
+
_VENV := $(wildcard ../../../../venv/bin/python3)
|
|
224
|
+
PYTHON ?= $(if $(_VENV),../../../../venv/bin/python3,python3)
|
|
225
|
+
|
|
226
|
+
.PHONY: health health-json data data-json logs errors db help
|
|
227
|
+
|
|
228
|
+
help:
|
|
229
|
+
@echo "Available targets:"
|
|
230
|
+
@echo " health - Run health probe (human readable)"
|
|
231
|
+
@echo " health-json - Run health probe (JSON output)"
|
|
232
|
+
@echo " data - Show latest DB records"
|
|
233
|
+
@echo " data-json - Show latest DB records (JSON, limit 5)"
|
|
234
|
+
@echo " logs - Tail and analyze recent logs"
|
|
235
|
+
@echo " errors - Show errors/criticals only"
|
|
236
|
+
@echo " db - Run DB helper example queries"
|
|
237
|
+
@echo ""
|
|
238
|
+
@echo "Python: $(PYTHON)"
|
|
239
|
+
|
|
240
|
+
health:
|
|
241
|
+
$(PYTHON) health_probe.py
|
|
242
|
+
|
|
243
|
+
health-json:
|
|
244
|
+
$(PYTHON) health_probe.py --json
|
|
245
|
+
|
|
246
|
+
data:
|
|
247
|
+
$(PYTHON) data_explorer.py
|
|
248
|
+
|
|
249
|
+
data-json:
|
|
250
|
+
$(PYTHON) data_explorer.py --json --limit 5
|
|
251
|
+
|
|
252
|
+
logs:
|
|
253
|
+
$(PYTHON) log_hunter.py --tail 50
|
|
254
|
+
|
|
255
|
+
errors:
|
|
256
|
+
$(PYTHON) log_hunter.py --errors-only --tail 50
|
|
257
|
+
|
|
258
|
+
db:
|
|
259
|
+
$(PYTHON) db_helper.py
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Rules for the delegated Phase 2 agent:**
|
|
263
|
+
|
|
264
|
+
1. **Keep standard targets stable** — avoid removing or renaming them because downstream workflows depend on them.
|
|
265
|
+
2. **Add service-specific targets** below the standard block if the service needs them (e.g. `make auth`, `make schema`, `make backfill`).
|
|
266
|
+
3. **Keep the `_VENV` auto-detect path (`../../../../venv/bin/python3`) unchanged** — it resolves from `scripts/` → service dir → `skills/` → `.claude/` → project root → `venv/`.
|
|
267
|
+
4. **Use real tab characters in recipe lines** so Makefile parsing works consistently.
|
|
268
|
+
5. **Run `make help` after updates** and confirm the Python path resolves to the project venv.
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Official Documentation Auto-Population
|
|
273
|
+
|
|
274
|
+
The scaffolder detects technologies from:
|
|
275
|
+
- `docker-compose*.yml` image tags
|
|
276
|
+
- `requirements.txt` / `pyproject.toml` package names
|
|
277
|
+
- `Cargo.toml` crate names
|
|
278
|
+
- `package.json` dependencies
|
|
279
|
+
|
|
280
|
+
And automatically adds relevant official documentation links to the `## References`
|
|
281
|
+
section of the generated SKILL.md. Verify these links are correct during Phase 2.
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Phase 3: Hook Registration (After Phase 2)
|
|
286
|
+
|
|
287
|
+
Once the skill is complete, verify that the `PreToolUse` skill activator hook is
|
|
288
|
+
wired in the project's `.claude/settings.json`. It should already be there if
|
|
289
|
+
you ran `install-service-skills.py` — but confirm it, and explain it to the user.
|
|
290
|
+
|
|
291
|
+
### What the hook does
|
|
292
|
+
|
|
293
|
+
The `skill_activator.py` hook fires **before** any `Read`, `Write`, `Edit`, `Grep`,
|
|
294
|
+
`Glob`, or `Bash` operation. It checks whether the operation touches a registered
|
|
295
|
+
service territory (from `service-registry.json`). If it does, it injects:
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
[Service Skill] You are about to work with the '<service-id>' service territory.
|
|
299
|
+
Load the expert skill before proceeding: Read .claude/skills/<service-id>/SKILL.md
|
|
300
|
+
The skill contains: operational knowledge, failure modes, diagnostic scripts,
|
|
301
|
+
and the correct methods for managing this service.
|
|
302
|
+
Do not use ad-hoc approaches (raw SQL, improvised docker commands) when the
|
|
303
|
+
skill defines the correct method.
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
This means: from the moment the skill is registered, Claude will **automatically**
|
|
307
|
+
be reminded to load and apply it whenever working on relevant files or running
|
|
308
|
+
commands that mention the service — without you having to ask.
|
|
309
|
+
|
|
310
|
+
### Verify hook is active
|
|
311
|
+
|
|
312
|
+
Check `.claude/settings.json` contains a `PreToolUse` entry:
|
|
313
|
+
|
|
314
|
+
```json
|
|
315
|
+
"PreToolUse": [{
|
|
316
|
+
"matcher": "Read|Write|Edit|Glob|Grep|Bash",
|
|
317
|
+
"hooks": [{"type": "command",
|
|
318
|
+
"command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/skills/using-service-skills/scripts/skill_activator.py\""}]
|
|
319
|
+
}]
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
If missing, run the installer again or add it manually.
|
|
323
|
+
|
|
324
|
+
### Verify the service is registered
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
python3 .claude/skills/using-service-skills/scripts/cataloger.py
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
The service should appear in the output catalog. If not, the territory may not
|
|
331
|
+
be registered in `service-registry.json` — re-run the scaffolder for Phase 1.
|
|
332
|
+
|
|
333
|
+
### Communicate to the user
|
|
334
|
+
|
|
335
|
+
After completing Phase 3, confirm:
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
✅ Hook registered: '<service-id>' skill is now auto-activated.
|
|
339
|
+
|
|
340
|
+
Whenever you (or I) work with files in <territory> or run commands mentioning
|
|
341
|
+
'<service-id>', I will automatically load .claude/skills/<service-id>/SKILL.md
|
|
342
|
+
and apply its expert knowledge — including using the correct diagnostic scripts
|
|
343
|
+
instead of ad-hoc queries.
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Skill Completion Checklist
|
|
349
|
+
|
|
350
|
+
A skill is **complete** (not a draft) when ALL of these are true:
|
|
351
|
+
|
|
352
|
+
**Schema verification (before writing any script):**
|
|
353
|
+
- [ ] `SELECT tablename FROM pg_tables WHERE schemaname='public'` run — real table names confirmed
|
|
354
|
+
- [ ] `SELECT column_name, data_type FROM information_schema.columns WHERE table_name='X'` run per output table
|
|
355
|
+
- [ ] Tables with no timestamp column identified — `COUNT(*)` used for freshness check instead
|
|
356
|
+
|
|
357
|
+
**Script completeness:**
|
|
358
|
+
- [ ] No `[PENDING RESEARCH]` markers remain in SKILL.md
|
|
359
|
+
- [ ] Service type classified and documented
|
|
360
|
+
- [ ] All scripts use mandatory DB connection pattern (`dotenv` + `shared.db_pool_manager`)
|
|
361
|
+
- [ ] `health_probe.py`: real container check + actual table freshness + fix commands; every `try` has `except`
|
|
362
|
+
- [ ] `log_hunter.py`: patterns sourced from codebase, not invented; severity bucketed
|
|
363
|
+
- [ ] `data_explorer.py`: real table + real column names + parameterized SQL
|
|
364
|
+
- [ ] `db_helper.py`: example queries against real tables with correct column names
|
|
365
|
+
- [ ] At least one specialist script for the service type
|
|
366
|
+
- [ ] All function names consistent between definition and call sites
|
|
367
|
+
- [ ] Troubleshooting table has ≥5 rows from real failure modes
|
|
368
|
+
- [ ] All docker compose commands verified against actual config
|
|
369
|
+
- [ ] All scripts support `--json` flag
|
|
370
|
+
- [ ] `scripts/Makefile` generated with standard targets: `health`, `health-json`, `data`, `data-json`, `logs`, `errors`, `db`
|
|
371
|
+
- [ ] Scripts tested with `venv/bin/python3` (not system python3) — 0 import errors
|
|
372
|
+
|
|
373
|
+
**Registration:**
|
|
374
|
+
- [ ] `references/deep_dive.md` Phase 2 checklist completed
|
|
375
|
+
- [ ] Official docs links in References section verified
|
|
376
|
+
- [ ] Service registered in `.claude/skills/service-registry.json`
|
|
377
|
+
- [ ] `PreToolUse` skill activator hook confirmed in `.claude/settings.json`
|
|
378
|
+
- [ ] User informed: skill auto-activates on territory file access and service-name commands
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## Output Format
|
|
383
|
+
|
|
384
|
+
After successful completion:
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
✅ Created expert skill: `<service-id>`
|
|
388
|
+
|
|
389
|
+
**Classification**: <service-type> (confidence: high/medium/low)
|
|
390
|
+
**Territory**: <file patterns>
|
|
391
|
+
**Specialist Script**: <script-name.py>
|
|
392
|
+
**Health Strategy**: <strategy>
|
|
393
|
+
**Skill Path**: `.claude/skills/<service-id>/SKILL.md`
|
|
394
|
+
**Official Docs**: <detected technologies>
|
|
395
|
+
|
|
396
|
+
**Phase 2 Status**: Complete
|
|
397
|
+
- [PENDING RESEARCH] markers: 0
|
|
398
|
+
- Scripts implemented: health_probe.py, log_hunter.py, data_explorer.py, <specialist>.py
|
|
399
|
+
|
|
400
|
+
**Phase 3 Status**: Hook registered
|
|
401
|
+
- PreToolUse activator: confirmed in settings.json
|
|
402
|
+
- Auto-activation: triggers on territory files + service name in commands
|
|
403
|
+
|
|
404
|
+
⚠️ If Phase 2 is incomplete, the skill is NOT ready for use.
|
|
405
|
+
⚠️ If Phase 3 is skipped, the skill exists but will not enforce itself.
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Tool Restrictions
|
|
411
|
+
|
|
412
|
+
Write to:
|
|
413
|
+
- ✅ `.claude/skills/<service-id>/` (new skill packages)
|
|
414
|
+
- ✅ `.claude/skills/service-registry.json` (registration)
|
|
415
|
+
|
|
416
|
+
Do not:
|
|
417
|
+
- ❌ Modify source code outside `.claude/skills/`
|
|
418
|
+
- ❌ Delete existing skills or registry entries
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## References
|
|
423
|
+
|
|
424
|
+
- [references/script_quality_standards.md](references/script_quality_standards.md) — Script templates and anti-patterns
|
|
425
|
+
- [references/service_skill_system_guide.md](references/service_skill_system_guide.md) — System architecture
|
|
426
|
+
- `scripts/scaffolder.py` — Phase 1 skeleton generator with official docs detection
|
|
427
|
+
- `scripts/deep_dive.py` — Service classifier + Phase 2 research agenda
|
|
428
|
+
- `scripts/bootstrap.py` — Registry CRUD and path resolution utilities
|
|
429
|
+
|
|
430
|
+
## Related Skills
|
|
431
|
+
|
|
432
|
+
- `/using-service-skills` — Discover and activate expert personas at session start
|
|
433
|
+
- `/updating-service-skills` — Sync skills when implementation drifts
|