kenmark-skills 1.0.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/README.md +115 -0
- package/brain/CHANGELOG.md +48 -0
- package/package.json +46 -0
- package/skills/user-skills/commit-push/SKILL.md +225 -0
- package/skills/user-skills/init-brain/SKILL.md +425 -0
- package/skills/user-skills/issues-check/SKILL.md +121 -0
- package/skills/user-skills/issues-list/SKILL.md +180 -0
- package/skills/user-skills/issues-maintenance/SKILL.md +252 -0
- package/skills/user-skills/issues-scan/SKILL.md +226 -0
- package/skills/user-skills/issues-setup/SKILL.md +176 -0
- package/skills/user-skills/skill-router/SKILL.md +147 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: issues-setup
|
|
3
|
+
preamble-tier: 2
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
description: |
|
|
6
|
+
Set up the brain/issues/ directory structure: create brain/issues/,
|
|
7
|
+
brain/issues/completed/, and brain/issues/INDEX.md from scratch. Use when
|
|
8
|
+
asked to "setup issues", "init issues", or "bootstrap issues directory".
|
|
9
|
+
allowed-tools:
|
|
10
|
+
- Bash
|
|
11
|
+
- Read
|
|
12
|
+
- Write
|
|
13
|
+
- Edit
|
|
14
|
+
- Grep
|
|
15
|
+
- Glob
|
|
16
|
+
- AskUserQuestion
|
|
17
|
+
triggers:
|
|
18
|
+
- setup issues
|
|
19
|
+
- init issues
|
|
20
|
+
- bootstrap issues directory
|
|
21
|
+
- initialize issues
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Issues Setup — Bootstrap brain/issues/ Directory
|
|
25
|
+
|
|
26
|
+
## Purpose
|
|
27
|
+
|
|
28
|
+
Create the full `brain/issues/` directory structure from scratch:
|
|
29
|
+
- `brain/issues/` — active issues
|
|
30
|
+
- `brain/issues/completed/` — archived resolved issues
|
|
31
|
+
- `brain/issues/INDEX.md` — master index with all issues grouped by priority
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 1 — Find or create the brain directory
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"
|
|
39
|
+
ISSUES_DIR="$REPO_ROOT/brain/issues"
|
|
40
|
+
COMPLETED_DIR="$ISSUES_DIR/completed"
|
|
41
|
+
echo "REPO_ROOT=$REPO_ROOT"
|
|
42
|
+
echo "ISSUES_DIR=$ISSUES_DIR"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If `brain/` does not exist, create it:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
mkdir -p "$ISSUES_DIR" "$COMPLETED_DIR"
|
|
49
|
+
echo "Created: $ISSUES_DIR and $COMPLETED_DIR"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Step 2 — Create the INDEX.md
|
|
55
|
+
|
|
56
|
+
Write `brain/issues/INDEX.md` with this exact structure:
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
# Issues Index
|
|
60
|
+
|
|
61
|
+
## Overview
|
|
62
|
+
|
|
63
|
+
| Category | Count |
|
|
64
|
+
|----------|-------|
|
|
65
|
+
| Active issues | 0 |
|
|
66
|
+
| Completed | 0 |
|
|
67
|
+
| **Total** | **0** |
|
|
68
|
+
|
|
69
|
+
## Completed Issues
|
|
70
|
+
|
|
71
|
+
| ID | Title | Completed |
|
|
72
|
+
|----|-------|-----------|
|
|
73
|
+
| _none yet_ | | |
|
|
74
|
+
|
|
75
|
+
## Active Issues by Priority
|
|
76
|
+
|
|
77
|
+
### P0 — Critical
|
|
78
|
+
|
|
79
|
+
| ID | Title |
|
|
80
|
+
|----|-------|
|
|
81
|
+
| _none_ | |
|
|
82
|
+
|
|
83
|
+
### P1 — High
|
|
84
|
+
|
|
85
|
+
| ID | Title |
|
|
86
|
+
|----|-------|
|
|
87
|
+
| _none_ | |
|
|
88
|
+
|
|
89
|
+
### P2 — Medium
|
|
90
|
+
|
|
91
|
+
| ID | Title |
|
|
92
|
+
|----|-------|
|
|
93
|
+
| _none_ | |
|
|
94
|
+
|
|
95
|
+
## Issue Structure
|
|
96
|
+
|
|
97
|
+
Each issue file contains:
|
|
98
|
+
|
|
99
|
+
\`\`\`yaml
|
|
100
|
+
---
|
|
101
|
+
id: XXX
|
|
102
|
+
title: ...
|
|
103
|
+
severity: P0|P1|P2
|
|
104
|
+
area: api|database|security|ui|worker|testing|maintainability|connectors|oauth|dsl
|
|
105
|
+
source: how-the-issue-was-found
|
|
106
|
+
status: open|completed
|
|
107
|
+
created: YYYY-MM-DD
|
|
108
|
+
files:
|
|
109
|
+
- relevant-files
|
|
110
|
+
related:
|
|
111
|
+
- related-issue-ids
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Summary
|
|
115
|
+
|
|
116
|
+
## Evidence
|
|
117
|
+
|
|
118
|
+
## Suggested fix
|
|
119
|
+
|
|
120
|
+
## Acceptance criteria
|
|
121
|
+
\`\`\`
|
|
122
|
+
|
|
123
|
+
## Areas
|
|
124
|
+
|
|
125
|
+
| Area | Description |
|
|
126
|
+
|------|-------------|
|
|
127
|
+
| api | REST API routes and handlers |
|
|
128
|
+
| database | Prisma schema, migrations |
|
|
129
|
+
| security | Auth, HMAC, rate limiting, input validation |
|
|
130
|
+
| ui | React components, pages, navigation |
|
|
131
|
+
| worker | Background job processing |
|
|
132
|
+
| testing | Test coverage gaps |
|
|
133
|
+
| maintainability | Code quality, dead code |
|
|
134
|
+
| connectors | Connector implementations |
|
|
135
|
+
| oauth | OAuth flows, Google integration |
|
|
136
|
+
| dsl | Workflow DSL schema and types |
|
|
137
|
+
|
|
138
|
+
## Workstreams
|
|
139
|
+
|
|
140
|
+
| Workstream | Issues |
|
|
141
|
+
|-----------|--------|
|
|
142
|
+
| Security |016, 017, 018, 019, 023, 024, 026 |
|
|
143
|
+
| Worker | 012, 022, 025, 027 |
|
|
144
|
+
| Database migrations | 013, 014, 021 |
|
|
145
|
+
| DSL vocabulary | 015 |
|
|
146
|
+
| UI pages rename | 001, 003, 007, 008, 038, 039, 040, 041, 047, 048, 049, 050, 051, 052, 053, 054, 055, 056, 057, 058 |
|
|
147
|
+
| UI component naming | 009, 010, 011 |
|
|
148
|
+
| Test gaps | 028, 030, 031, 032, 033, 034, 035, 036, 037 |
|
|
149
|
+
| Accessibility | 042, 043, 044, 045, 046, 052, 054, 055 |
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Step 3 — Verify structure
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
echo "=== Directory structure ==="
|
|
158
|
+
ls -la "$ISSUES_DIR/"
|
|
159
|
+
echo ""
|
|
160
|
+
echo "=== Completed dir ==="
|
|
161
|
+
ls -la "$COMPLETED_DIR/"
|
|
162
|
+
echo ""
|
|
163
|
+
echo "=== INDEX.md exists ==="
|
|
164
|
+
[ -f "$ISSUES_DIR/INDEX.md" ] && echo "YES" || echo "MISSING"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Step 4 — Confirm to user
|
|
170
|
+
|
|
171
|
+
Report what was created:
|
|
172
|
+
- `brain/issues/` directory
|
|
173
|
+
- `brain/issues/completed/` directory
|
|
174
|
+
- `brain/issues/INDEX.md` with full template
|
|
175
|
+
|
|
176
|
+
Then suggest next steps: use `/issues-scan` to populate with issues discovered from the codebase, or use `/issues-list` to see the empty state.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skill-router
|
|
3
|
+
description: Routes tasks to the best installed user skill by analyzing intent, keywords, and category. Use at the start of any task when unsure which skill applies, when the user invokes /skill-router, or when multiple domains overlap (SEO vs design vs backend vs testing).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill Router
|
|
7
|
+
|
|
8
|
+
Automatically pick and load the best **user skill** for the current task.
|
|
9
|
+
|
|
10
|
+
## Canonical skill store
|
|
11
|
+
|
|
12
|
+
All user skills live in `~/.agents/skills/`.
|
|
13
|
+
|
|
14
|
+
This router uses a **local generated registry** at:
|
|
15
|
+
`skills/user-skills/skill-router/registry.json`
|
|
16
|
+
|
|
17
|
+
Do not commit this file. It is generated per-user on first run and refreshed on every call.
|
|
18
|
+
|
|
19
|
+
**Do not modify project skills** (`<repo>/.agents/skills/`, `<repo>/.cursor/skills/`). Those are repo-scoped and out of scope for this router.
|
|
20
|
+
|
|
21
|
+
## Runtime bootstrap (always run first)
|
|
22
|
+
|
|
23
|
+
Before scoring skills, regenerate the local registry file:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
python3 - <<'PY'
|
|
27
|
+
import json
|
|
28
|
+
import re
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
repo_root = Path.cwd()
|
|
33
|
+
out_path = repo_root / "skills/user-skills/skill-router/registry.json"
|
|
34
|
+
user_root = Path.home() / ".agents/skills"
|
|
35
|
+
|
|
36
|
+
def infer_category(name: str, description: str) -> str:
|
|
37
|
+
text = f"{name} {description}".lower()
|
|
38
|
+
if "seo" in text:
|
|
39
|
+
return "seo"
|
|
40
|
+
if any(k in text for k in ["design", "ui", "ux", "frontend", "visual"]):
|
|
41
|
+
return "design"
|
|
42
|
+
if any(k in text for k in ["test", "qa", "verification", "eval", "tdd"]):
|
|
43
|
+
return "testing"
|
|
44
|
+
if any(k in text for k in ["workflow", "router", "learning", "agent"]):
|
|
45
|
+
return "workflow"
|
|
46
|
+
if any(k in text for k in ["api", "backend", "django", "python", "database", "server"]):
|
|
47
|
+
return "backend"
|
|
48
|
+
return "general"
|
|
49
|
+
|
|
50
|
+
def extract_description(skill_md: str) -> str:
|
|
51
|
+
m = re.search(r"(?ms)^description:\s*(.+?)(?:\n\w[\w-]*:|\n---|\Z)", skill_md)
|
|
52
|
+
if not m:
|
|
53
|
+
return ""
|
|
54
|
+
return re.sub(r"\s+", " ", m.group(1)).strip().strip('"').strip("'")
|
|
55
|
+
|
|
56
|
+
def extract_keywords(name: str, description: str) -> list[str]:
|
|
57
|
+
tokens = re.findall(r"[a-zA-Z0-9][a-zA-Z0-9\-]{2,}", f"{name} {description}".lower())
|
|
58
|
+
seen = set()
|
|
59
|
+
out = []
|
|
60
|
+
for t in tokens:
|
|
61
|
+
if t not in seen:
|
|
62
|
+
seen.add(t)
|
|
63
|
+
out.append(t)
|
|
64
|
+
return out[:80]
|
|
65
|
+
|
|
66
|
+
skills = []
|
|
67
|
+
if user_root.exists():
|
|
68
|
+
for skill_dir in sorted([p for p in user_root.iterdir() if p.is_dir()]):
|
|
69
|
+
skill_md = skill_dir / "SKILL.md"
|
|
70
|
+
if not skill_md.exists():
|
|
71
|
+
continue
|
|
72
|
+
content = skill_md.read_text(encoding="utf-8", errors="ignore")
|
|
73
|
+
desc = extract_description(content)
|
|
74
|
+
name = skill_dir.name
|
|
75
|
+
skills.append({
|
|
76
|
+
"name": name,
|
|
77
|
+
"path": str(skill_dir),
|
|
78
|
+
"description": desc,
|
|
79
|
+
"category": infer_category(name, desc),
|
|
80
|
+
"keywords": extract_keywords(name, desc),
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
payload = {
|
|
84
|
+
"version": 1,
|
|
85
|
+
"generatedAt": datetime.now(timezone.utc).isoformat(),
|
|
86
|
+
"canonicalRoot": str(user_root),
|
|
87
|
+
"skillCount": len(skills),
|
|
88
|
+
"skills": skills,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
92
|
+
out_path.write_text(json.dumps(payload, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
|
93
|
+
print(f"Generated {out_path} with {len(skills)} skills")
|
|
94
|
+
PY
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## When to run
|
|
98
|
+
|
|
99
|
+
Run this skill **before** other skills when:
|
|
100
|
+
|
|
101
|
+
- The user's request spans multiple domains
|
|
102
|
+
- No skill was auto-selected but specialized guidance would help
|
|
103
|
+
- The user says `/skill-router`, "pick the right skill", or "which skill should we use?"
|
|
104
|
+
- You are about to guess workflow steps that an existing skill already encodes
|
|
105
|
+
|
|
106
|
+
## Routing algorithm
|
|
107
|
+
|
|
108
|
+
1. **Parse intent** from the user message: domain, deliverable, stack, and constraints.
|
|
109
|
+
2. **Load registry**: read [registry.json](registry.json) after the runtime bootstrap above completes.
|
|
110
|
+
3. **Score candidates** (top 3):
|
|
111
|
+
- +3 exact skill name or alias in the request; +2 keyword overlap with task
|
|
112
|
+
- +2 category match (seo, design, backend, testing, workflow)
|
|
113
|
+
- +1 trigger phrase from skill description appears in the task
|
|
114
|
+
- −2 category mismatch (e.g. SEO skill for a pure DB migration)
|
|
115
|
+
4. **Tie-break**: prefer narrower skills over umbrella skills (`seo-page` over `seo`; `django-tdd` over `coding-standards`).
|
|
116
|
+
5. **Load winner**: read the selected skill's `SKILL.md` and follow it for the rest of the task.
|
|
117
|
+
6. **Multi-skill tasks**: if two skills score within 1 point and serve different phases (e.g. `ce-plan` + `tdd-workflow`), load primary first, note secondary for the next phase.
|
|
118
|
+
7. **No match (score < 2)**: use `find-skills` to search for installable skills, then proceed with general capabilities.
|
|
119
|
+
|
|
120
|
+
## Category quick map
|
|
121
|
+
|
|
122
|
+
| If the task is about… | Prefer skills in category… | Examples |
|
|
123
|
+
| --- | --- | --- |
|
|
124
|
+
| Search, rankings, metadata, structured data | `seo` | `seo-audit`, `seo-technical`, `seo-schema` |
|
|
125
|
+
| UI polish, layout, visual design, MUI | `design` | `impeccable`, `design-taste-frontend`, `high-end-visual-design` |
|
|
126
|
+
| APIs, services, frameworks, languages | `backend` | `backend-patterns`, `django-patterns`, `python-patterns` |
|
|
127
|
+
| Tests, QA, verification, evals | `testing` | `tdd-workflow`, `verification-loop`, `eval-harness` |
|
|
128
|
+
| Agent workflow, discovery, learning | `workflow` | `find-skills`, `continuous-learning`, `skill-router` |
|
|
129
|
+
|
|
130
|
+
## Output format
|
|
131
|
+
|
|
132
|
+
After routing, tell the user briefly:
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
**Routed skill:** `<name>` (<category>)
|
|
136
|
+
**Why:** <one sentence>
|
|
137
|
+
**Next:** <first concrete step from that skill>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Then execute using the routed skill — do not stop at the recommendation.
|
|
141
|
+
|
|
142
|
+
## Maintenance
|
|
143
|
+
|
|
144
|
+
- Add or edit skills only under `~/.agents/skills/<skill-name>/`
|
|
145
|
+
- Do not commit `skills/user-skills/skill-router/registry.json` (generated per-user file)
|
|
146
|
+
- Runtime bootstrap refreshes `registry.json` on each invocation
|
|
147
|
+
- Install new skills globally with: `npx skills add <owner/repo@skill> -g -y --agent claude-code cursor codex`
|