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.
@@ -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`