@tinkcarlos/skillora 0.2.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/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Trigger Analyzer - Analyze and improve skill description for better triggering
|
|
4
|
+
|
|
5
|
+
Features:
|
|
6
|
+
- Extract trigger keywords from description
|
|
7
|
+
- Suggest missing trigger scenarios
|
|
8
|
+
- Generate alternative phrasings
|
|
9
|
+
- Score trigger coverage
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
python analyze_trigger.py <path/to/skill-folder>
|
|
13
|
+
python analyze_trigger.py <path/to/skill-folder> --suggest
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import sys
|
|
17
|
+
import re
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import List, Dict, Set, Tuple
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _configure_stdio() -> None:
|
|
23
|
+
for stream in (sys.stdout, sys.stderr):
|
|
24
|
+
try:
|
|
25
|
+
stream.reconfigure(encoding="utf-8", errors="replace")
|
|
26
|
+
except Exception:
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_configure_stdio()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Common trigger patterns by category
|
|
34
|
+
TRIGGER_CATEGORIES = {
|
|
35
|
+
"action_verbs": [
|
|
36
|
+
"create",
|
|
37
|
+
"build",
|
|
38
|
+
"generate",
|
|
39
|
+
"make",
|
|
40
|
+
"design",
|
|
41
|
+
"develop",
|
|
42
|
+
"edit",
|
|
43
|
+
"modify",
|
|
44
|
+
"update",
|
|
45
|
+
"change",
|
|
46
|
+
"fix",
|
|
47
|
+
"repair",
|
|
48
|
+
"analyze",
|
|
49
|
+
"review",
|
|
50
|
+
"check",
|
|
51
|
+
"validate",
|
|
52
|
+
"verify",
|
|
53
|
+
"audit",
|
|
54
|
+
"convert",
|
|
55
|
+
"transform",
|
|
56
|
+
"export",
|
|
57
|
+
"import",
|
|
58
|
+
"migrate",
|
|
59
|
+
"optimize",
|
|
60
|
+
"improve",
|
|
61
|
+
"enhance",
|
|
62
|
+
"refactor",
|
|
63
|
+
"debug",
|
|
64
|
+
"troubleshoot",
|
|
65
|
+
"diagnose",
|
|
66
|
+
"deploy",
|
|
67
|
+
"publish",
|
|
68
|
+
"release",
|
|
69
|
+
"package",
|
|
70
|
+
],
|
|
71
|
+
"artifact_types": [
|
|
72
|
+
"file",
|
|
73
|
+
"document",
|
|
74
|
+
"code",
|
|
75
|
+
"script",
|
|
76
|
+
"function",
|
|
77
|
+
"class",
|
|
78
|
+
"api",
|
|
79
|
+
"endpoint",
|
|
80
|
+
"service",
|
|
81
|
+
"component",
|
|
82
|
+
"module",
|
|
83
|
+
"config",
|
|
84
|
+
"configuration",
|
|
85
|
+
"settings",
|
|
86
|
+
"template",
|
|
87
|
+
"report",
|
|
88
|
+
"dashboard",
|
|
89
|
+
"chart",
|
|
90
|
+
"diagram",
|
|
91
|
+
"test",
|
|
92
|
+
"spec",
|
|
93
|
+
"documentation",
|
|
94
|
+
"readme",
|
|
95
|
+
".md",
|
|
96
|
+
".py",
|
|
97
|
+
".js",
|
|
98
|
+
".ts",
|
|
99
|
+
".json",
|
|
100
|
+
".yaml",
|
|
101
|
+
".html",
|
|
102
|
+
".css",
|
|
103
|
+
"pdf",
|
|
104
|
+
"docx",
|
|
105
|
+
"pptx",
|
|
106
|
+
"xlsx",
|
|
107
|
+
],
|
|
108
|
+
"context_indicators": [
|
|
109
|
+
"skill",
|
|
110
|
+
"skills",
|
|
111
|
+
"SKILL.md",
|
|
112
|
+
".claude/skills",
|
|
113
|
+
"frontmatter",
|
|
114
|
+
"description",
|
|
115
|
+
"trigger",
|
|
116
|
+
"references/",
|
|
117
|
+
"scripts/",
|
|
118
|
+
"assets/",
|
|
119
|
+
"validate",
|
|
120
|
+
"package",
|
|
121
|
+
"distribute",
|
|
122
|
+
],
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def parse_frontmatter(content: str) -> Dict:
|
|
127
|
+
"""Parse YAML frontmatter"""
|
|
128
|
+
try:
|
|
129
|
+
import yaml
|
|
130
|
+
except ImportError:
|
|
131
|
+
return {}
|
|
132
|
+
|
|
133
|
+
match = re.match(r"^---\r?\n(.*?)\r?\n---", content, re.DOTALL)
|
|
134
|
+
if match:
|
|
135
|
+
try:
|
|
136
|
+
return yaml.safe_load(match.group(1)) or {}
|
|
137
|
+
except Exception:
|
|
138
|
+
pass
|
|
139
|
+
return {}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def extract_keywords(description: str) -> Set[str]:
|
|
143
|
+
"""Extract meaningful keywords from description"""
|
|
144
|
+
# Normalize
|
|
145
|
+
text = description.lower()
|
|
146
|
+
|
|
147
|
+
# Remove common stop words
|
|
148
|
+
stop_words = {
|
|
149
|
+
"a",
|
|
150
|
+
"an",
|
|
151
|
+
"the",
|
|
152
|
+
"is",
|
|
153
|
+
"are",
|
|
154
|
+
"was",
|
|
155
|
+
"were",
|
|
156
|
+
"be",
|
|
157
|
+
"been",
|
|
158
|
+
"this",
|
|
159
|
+
"that",
|
|
160
|
+
"these",
|
|
161
|
+
"those",
|
|
162
|
+
"it",
|
|
163
|
+
"its",
|
|
164
|
+
"to",
|
|
165
|
+
"for",
|
|
166
|
+
"with",
|
|
167
|
+
"from",
|
|
168
|
+
"by",
|
|
169
|
+
"on",
|
|
170
|
+
"in",
|
|
171
|
+
"at",
|
|
172
|
+
"of",
|
|
173
|
+
"and",
|
|
174
|
+
"or",
|
|
175
|
+
"but",
|
|
176
|
+
"if",
|
|
177
|
+
"when",
|
|
178
|
+
"where",
|
|
179
|
+
"how",
|
|
180
|
+
"what",
|
|
181
|
+
"can",
|
|
182
|
+
"could",
|
|
183
|
+
"will",
|
|
184
|
+
"would",
|
|
185
|
+
"should",
|
|
186
|
+
"may",
|
|
187
|
+
"might",
|
|
188
|
+
"use",
|
|
189
|
+
"used",
|
|
190
|
+
"using",
|
|
191
|
+
"not",
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
# Extract words
|
|
195
|
+
words = re.findall(r"\b[a-z][a-z0-9_-]*\b", text)
|
|
196
|
+
words.extend(re.findall(r"\.[a-z]+", text)) # file extensions
|
|
197
|
+
|
|
198
|
+
# Filter
|
|
199
|
+
keywords = set()
|
|
200
|
+
for word in words:
|
|
201
|
+
if word not in stop_words and len(word) > 2:
|
|
202
|
+
keywords.add(word)
|
|
203
|
+
|
|
204
|
+
return keywords
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def analyze_coverage(keywords: Set[str]) -> Dict[str, List[str]]:
|
|
208
|
+
"""Analyze keyword coverage against trigger categories"""
|
|
209
|
+
coverage = {}
|
|
210
|
+
|
|
211
|
+
for category, patterns in TRIGGER_CATEGORIES.items():
|
|
212
|
+
matched = []
|
|
213
|
+
for pattern in patterns:
|
|
214
|
+
pattern_lower = pattern.lower()
|
|
215
|
+
if any(pattern_lower in kw or kw in pattern_lower for kw in keywords):
|
|
216
|
+
matched.append(pattern)
|
|
217
|
+
coverage[category] = matched
|
|
218
|
+
|
|
219
|
+
return coverage
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def suggest_triggers(skill_name: str, current_keywords: Set[str]) -> List[str]:
|
|
223
|
+
"""Suggest additional trigger phrases based on skill name"""
|
|
224
|
+
suggestions = []
|
|
225
|
+
|
|
226
|
+
# Parse skill name
|
|
227
|
+
name_parts = skill_name.replace("-", " ").split()
|
|
228
|
+
|
|
229
|
+
# Generate suggestions based on name
|
|
230
|
+
if "skill" in name_parts or "skills" in name_parts:
|
|
231
|
+
suggestions.extend(
|
|
232
|
+
[
|
|
233
|
+
"Creating a new skill",
|
|
234
|
+
"How to write a skill",
|
|
235
|
+
"Make a Claude skill",
|
|
236
|
+
"Build skill for...",
|
|
237
|
+
"å建äøäøŖę°ēskill",
|
|
238
|
+
"åäøäøŖskill",
|
|
239
|
+
]
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if "validate" in name_parts or "validator" in name_parts:
|
|
243
|
+
suggestions.extend(
|
|
244
|
+
["Check if skill is valid", "Validate my skill structure", "éŖčÆskillę ¼å¼"]
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
if "expert" in name_parts:
|
|
248
|
+
suggestions.extend(["Best practices for...", "How to optimize...", "ęä½³å®č·µ"])
|
|
249
|
+
|
|
250
|
+
# Common patterns not in keywords
|
|
251
|
+
if "optimize" not in current_keywords and "optimization" not in current_keywords:
|
|
252
|
+
suggestions.append("Optimize/improve existing skill")
|
|
253
|
+
|
|
254
|
+
if "debug" not in current_keywords and "troubleshoot" not in current_keywords:
|
|
255
|
+
suggestions.append("Debug/troubleshoot skill issues")
|
|
256
|
+
|
|
257
|
+
return suggestions
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def calculate_score(
|
|
261
|
+
coverage: Dict[str, List[str]], description: str
|
|
262
|
+
) -> Tuple[int, str]:
|
|
263
|
+
"""Calculate trigger quality score (0-100)"""
|
|
264
|
+
score = 0
|
|
265
|
+
feedback = []
|
|
266
|
+
|
|
267
|
+
# Action verbs (30 points)
|
|
268
|
+
action_count = len(coverage.get("action_verbs", []))
|
|
269
|
+
if action_count >= 5:
|
|
270
|
+
score += 30
|
|
271
|
+
elif action_count >= 3:
|
|
272
|
+
score += 20
|
|
273
|
+
elif action_count >= 1:
|
|
274
|
+
score += 10
|
|
275
|
+
else:
|
|
276
|
+
feedback.append("Add more action verbs (create, analyze, validate, etc.)")
|
|
277
|
+
|
|
278
|
+
# Artifact types (20 points)
|
|
279
|
+
artifact_count = len(coverage.get("artifact_types", []))
|
|
280
|
+
if artifact_count >= 3:
|
|
281
|
+
score += 20
|
|
282
|
+
elif artifact_count >= 1:
|
|
283
|
+
score += 10
|
|
284
|
+
else:
|
|
285
|
+
feedback.append("Mention specific file types or artifacts")
|
|
286
|
+
|
|
287
|
+
# Context indicators (20 points)
|
|
288
|
+
context_count = len(coverage.get("context_indicators", []))
|
|
289
|
+
if context_count >= 3:
|
|
290
|
+
score += 20
|
|
291
|
+
elif context_count >= 1:
|
|
292
|
+
score += 10
|
|
293
|
+
|
|
294
|
+
# "Use when:" section (15 points)
|
|
295
|
+
if "use when" in description.lower():
|
|
296
|
+
score += 15
|
|
297
|
+
else:
|
|
298
|
+
feedback.append("Add 'Use when:' section with bullet points")
|
|
299
|
+
|
|
300
|
+
# "Not for:" boundary (10 points)
|
|
301
|
+
if "not for" in description.lower():
|
|
302
|
+
score += 10
|
|
303
|
+
else:
|
|
304
|
+
feedback.append("Add 'Not for:' to set scope boundaries")
|
|
305
|
+
|
|
306
|
+
# Length check (5 points)
|
|
307
|
+
desc_len = len(description)
|
|
308
|
+
if 200 <= desc_len <= 800:
|
|
309
|
+
score += 5
|
|
310
|
+
elif desc_len < 100:
|
|
311
|
+
feedback.append("Description is too short - add more trigger scenarios")
|
|
312
|
+
elif desc_len > 900:
|
|
313
|
+
feedback.append("Description is too long - consider condensing")
|
|
314
|
+
|
|
315
|
+
return min(score, 100), "; ".join(feedback) if feedback else "Good coverage!"
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def format_report(
|
|
319
|
+
skill_name: str,
|
|
320
|
+
description: str,
|
|
321
|
+
keywords: Set[str],
|
|
322
|
+
coverage: Dict[str, List[str]],
|
|
323
|
+
score: int,
|
|
324
|
+
feedback: str,
|
|
325
|
+
suggestions: List[str],
|
|
326
|
+
) -> str:
|
|
327
|
+
"""Format analysis as report"""
|
|
328
|
+
lines = []
|
|
329
|
+
lines.append("=" * 70)
|
|
330
|
+
lines.append("šÆ TRIGGER ANALYSIS REPORT")
|
|
331
|
+
lines.append("=" * 70)
|
|
332
|
+
lines.append(f"\nSkill: {skill_name}")
|
|
333
|
+
lines.append(f"Description length: {len(description)} chars")
|
|
334
|
+
|
|
335
|
+
# Score
|
|
336
|
+
score_bar = "ā" * (score // 10) + "ā" * (10 - score // 10)
|
|
337
|
+
if score >= 80:
|
|
338
|
+
score_label = "Excellent"
|
|
339
|
+
elif score >= 60:
|
|
340
|
+
score_label = "Good"
|
|
341
|
+
elif score >= 40:
|
|
342
|
+
score_label = "Fair"
|
|
343
|
+
else:
|
|
344
|
+
score_label = "Needs Work"
|
|
345
|
+
lines.append(f"\nš Trigger Score: {score}/100 {score_bar} ({score_label})")
|
|
346
|
+
|
|
347
|
+
if feedback:
|
|
348
|
+
lines.append(f" Feedback: {feedback}")
|
|
349
|
+
|
|
350
|
+
# Coverage breakdown
|
|
351
|
+
lines.append("\nš KEYWORD COVERAGE:")
|
|
352
|
+
for category, matched in coverage.items():
|
|
353
|
+
category_name = category.replace("_", " ").title()
|
|
354
|
+
if matched:
|
|
355
|
+
lines.append(f" ā
{category_name}: {', '.join(matched[:8])}")
|
|
356
|
+
if len(matched) > 8:
|
|
357
|
+
lines.append(f" ...and {len(matched) - 8} more")
|
|
358
|
+
else:
|
|
359
|
+
lines.append(f" ā ļø {category_name}: (none detected)")
|
|
360
|
+
|
|
361
|
+
# Extracted keywords
|
|
362
|
+
lines.append(f"\nš EXTRACTED KEYWORDS ({len(keywords)}):")
|
|
363
|
+
sorted_kw = sorted(keywords)
|
|
364
|
+
for i in range(0, len(sorted_kw), 8):
|
|
365
|
+
chunk = sorted_kw[i : i + 8]
|
|
366
|
+
lines.append(f" {', '.join(chunk)}")
|
|
367
|
+
|
|
368
|
+
# Suggestions
|
|
369
|
+
if suggestions:
|
|
370
|
+
lines.append("\nš” SUGGESTED TRIGGER PHRASES:")
|
|
371
|
+
for i, suggestion in enumerate(suggestions[:6], 1):
|
|
372
|
+
lines.append(f' {i}. "{suggestion}"')
|
|
373
|
+
|
|
374
|
+
lines.append("\n" + "=" * 70)
|
|
375
|
+
lines.append("š IMPROVEMENT TIPS:")
|
|
376
|
+
lines.append(" 1. Include 3-5 realistic 'Use when:' scenarios")
|
|
377
|
+
lines.append(" 2. Use action verbs users would actually say")
|
|
378
|
+
lines.append(" 3. Mention specific file types/artifacts")
|
|
379
|
+
lines.append(" 4. Add 'Not for:' to prevent false triggers")
|
|
380
|
+
lines.append("=" * 70)
|
|
381
|
+
|
|
382
|
+
return "\n".join(lines)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def main():
|
|
386
|
+
if len(sys.argv) < 2:
|
|
387
|
+
print("Usage: python analyze_trigger.py <path/to/skill-folder>")
|
|
388
|
+
print("\nAnalyzes skill description for trigger keyword coverage")
|
|
389
|
+
sys.exit(1)
|
|
390
|
+
|
|
391
|
+
skill_path = Path(sys.argv[1]).resolve()
|
|
392
|
+
skill_md = skill_path / "SKILL.md"
|
|
393
|
+
|
|
394
|
+
if not skill_md.exists():
|
|
395
|
+
print(f"ā Error: SKILL.md not found in {skill_path}")
|
|
396
|
+
sys.exit(1)
|
|
397
|
+
|
|
398
|
+
try:
|
|
399
|
+
content = skill_md.read_text(encoding="utf-8-sig")
|
|
400
|
+
except Exception as e:
|
|
401
|
+
print(f"ā Error reading SKILL.md: {e}")
|
|
402
|
+
sys.exit(1)
|
|
403
|
+
|
|
404
|
+
frontmatter = parse_frontmatter(content)
|
|
405
|
+
description = frontmatter.get("description", "")
|
|
406
|
+
|
|
407
|
+
if not description:
|
|
408
|
+
print("ā Error: No description found in frontmatter")
|
|
409
|
+
sys.exit(1)
|
|
410
|
+
|
|
411
|
+
keywords = extract_keywords(description)
|
|
412
|
+
coverage = analyze_coverage(keywords)
|
|
413
|
+
score, feedback = calculate_score(coverage, description)
|
|
414
|
+
suggestions = suggest_triggers(skill_path.name, keywords)
|
|
415
|
+
|
|
416
|
+
report = format_report(
|
|
417
|
+
skill_path.name, description, keywords, coverage, score, feedback, suggestions
|
|
418
|
+
)
|
|
419
|
+
print(report)
|
|
420
|
+
|
|
421
|
+
sys.exit(0 if score >= 60 else 1)
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
if __name__ == "__main__":
|
|
425
|
+
main()
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Diff with Official - Compare a skill against official skill-creator standards
|
|
4
|
+
|
|
5
|
+
This tool helps identify:
|
|
6
|
+
- Deviations from official frontmatter spec
|
|
7
|
+
- Extended fields that may not be compatible
|
|
8
|
+
- Best practices alignment
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
python diff_with_official.py <path/to/skill-folder>
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import sys
|
|
15
|
+
import re
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Dict, List, Tuple
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _configure_stdio() -> None:
|
|
21
|
+
for stream in (sys.stdout, sys.stderr):
|
|
22
|
+
try:
|
|
23
|
+
stream.reconfigure(encoding='utf-8', errors='replace')
|
|
24
|
+
except Exception:
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
_configure_stdio()
|
|
29
|
+
|
|
30
|
+
# Official Agent Skills spec (minimal)
|
|
31
|
+
OFFICIAL_ALLOWED_FIELDS = {'name', 'description'}
|
|
32
|
+
|
|
33
|
+
# Extended fields (skill-expert-skills allows)
|
|
34
|
+
EXTENDED_ALLOWED_FIELDS = {'name', 'description', 'license', 'allowed-tools', 'metadata'}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def parse_frontmatter(content: str) -> Tuple[Dict, str]:
|
|
38
|
+
"""Parse YAML frontmatter and return (dict, body)"""
|
|
39
|
+
try:
|
|
40
|
+
import yaml
|
|
41
|
+
except ImportError:
|
|
42
|
+
return {}, content
|
|
43
|
+
|
|
44
|
+
match = re.match(r'^---\r?\n(.*?)\r?\n---', content, re.DOTALL)
|
|
45
|
+
if not match:
|
|
46
|
+
return {}, content
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
fm = yaml.safe_load(match.group(1)) or {}
|
|
50
|
+
return fm, content[match.end():]
|
|
51
|
+
except Exception:
|
|
52
|
+
return {}, content
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def analyze_compatibility(skill_path: Path) -> Dict:
|
|
56
|
+
"""Analyze skill for official compatibility"""
|
|
57
|
+
result = {
|
|
58
|
+
'skill_name': skill_path.name,
|
|
59
|
+
'official_compatible': True,
|
|
60
|
+
'issues': [],
|
|
61
|
+
'warnings': [],
|
|
62
|
+
'info': []
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
skill_md = skill_path / 'SKILL.md'
|
|
66
|
+
if not skill_md.exists():
|
|
67
|
+
result['official_compatible'] = False
|
|
68
|
+
result['issues'].append("SKILL.md not found")
|
|
69
|
+
return result
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
content = skill_md.read_text(encoding='utf-8-sig')
|
|
73
|
+
except Exception as e:
|
|
74
|
+
result['issues'].append(f"Cannot read SKILL.md: {e}")
|
|
75
|
+
return result
|
|
76
|
+
|
|
77
|
+
frontmatter, body = parse_frontmatter(content)
|
|
78
|
+
|
|
79
|
+
# Check for non-official fields
|
|
80
|
+
current_fields = set(frontmatter.keys())
|
|
81
|
+
non_official = current_fields - OFFICIAL_ALLOWED_FIELDS
|
|
82
|
+
|
|
83
|
+
if non_official:
|
|
84
|
+
result['official_compatible'] = False
|
|
85
|
+
for field in non_official:
|
|
86
|
+
if field in EXTENDED_ALLOWED_FIELDS:
|
|
87
|
+
result['warnings'].append(
|
|
88
|
+
f"Extended field '{field}' - OK for skill-expert-skills, "
|
|
89
|
+
f"but NOT supported by official Agent Skills"
|
|
90
|
+
)
|
|
91
|
+
else:
|
|
92
|
+
result['issues'].append(
|
|
93
|
+
f"Unknown field '{field}' - not in any known spec"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Check name format
|
|
97
|
+
name = frontmatter.get('name', '')
|
|
98
|
+
if name:
|
|
99
|
+
if not re.match(r'^[a-z0-9-]+$', name):
|
|
100
|
+
result['issues'].append(f"Name '{name}' violates hyphen-case rule")
|
|
101
|
+
if len(name) > 64:
|
|
102
|
+
result['issues'].append(f"Name too long ({len(name)} > 64 chars)")
|
|
103
|
+
|
|
104
|
+
# Check description
|
|
105
|
+
desc = frontmatter.get('description', '')
|
|
106
|
+
if desc:
|
|
107
|
+
if '<' in desc or '>' in desc:
|
|
108
|
+
result['issues'].append("Description contains angle brackets (< or >)")
|
|
109
|
+
if len(desc) > 1024:
|
|
110
|
+
result['issues'].append(f"Description too long ({len(desc)} > 1024 chars)")
|
|
111
|
+
|
|
112
|
+
# Check body length
|
|
113
|
+
body_lines = body.count('\n')
|
|
114
|
+
if body_lines > 500:
|
|
115
|
+
result['warnings'].append(f"SKILL.md body is {body_lines} lines (recommend < 500)")
|
|
116
|
+
if body_lines > 800:
|
|
117
|
+
result['issues'].append(f"SKILL.md body exceeds 800 lines hard limit")
|
|
118
|
+
|
|
119
|
+
# Info about extended features used
|
|
120
|
+
if 'allowed-tools' in frontmatter:
|
|
121
|
+
result['info'].append(f"Uses allowed-tools: {frontmatter['allowed-tools']}")
|
|
122
|
+
if 'metadata' in frontmatter:
|
|
123
|
+
result['info'].append(f"Uses metadata: {list(frontmatter['metadata'].keys())}")
|
|
124
|
+
if 'license' in frontmatter:
|
|
125
|
+
result['info'].append(f"Uses license: {frontmatter['license']}")
|
|
126
|
+
|
|
127
|
+
return result
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def format_report(result: Dict) -> str:
|
|
131
|
+
"""Format analysis as report"""
|
|
132
|
+
lines = []
|
|
133
|
+
lines.append("=" * 70)
|
|
134
|
+
lines.append("š OFFICIAL COMPATIBILITY CHECK")
|
|
135
|
+
lines.append("=" * 70)
|
|
136
|
+
lines.append(f"\nSkill: {result['skill_name']}")
|
|
137
|
+
|
|
138
|
+
if result['official_compatible']:
|
|
139
|
+
lines.append("\nā
OFFICIAL AGENT SKILLS COMPATIBLE")
|
|
140
|
+
lines.append(" This skill uses only official spec fields (name, description)")
|
|
141
|
+
else:
|
|
142
|
+
lines.append("\nā ļø NOT FULLY OFFICIAL COMPATIBLE")
|
|
143
|
+
lines.append(" This skill uses extended fields from skill-expert-skills")
|
|
144
|
+
|
|
145
|
+
if result['issues']:
|
|
146
|
+
lines.append("\nš“ ISSUES (Must fix for any environment):")
|
|
147
|
+
for issue in result['issues']:
|
|
148
|
+
lines.append(f" ⢠{issue}")
|
|
149
|
+
|
|
150
|
+
if result['warnings']:
|
|
151
|
+
lines.append("\nš” WARNINGS (Extended features):")
|
|
152
|
+
for warning in result['warnings']:
|
|
153
|
+
lines.append(f" ⢠{warning}")
|
|
154
|
+
|
|
155
|
+
if result['info']:
|
|
156
|
+
lines.append("\nš INFO (Extended features in use):")
|
|
157
|
+
for info in result['info']:
|
|
158
|
+
lines.append(f" ⢠{info}")
|
|
159
|
+
|
|
160
|
+
lines.append("\n" + "=" * 70)
|
|
161
|
+
lines.append("š” MIGRATION GUIDE (if needed for official Agent Skills):")
|
|
162
|
+
lines.append(" 1. Keep only 'name' and 'description' in frontmatter")
|
|
163
|
+
lines.append(" 2. Remove 'allowed-tools', 'license', 'metadata' fields")
|
|
164
|
+
lines.append(" 3. Move any removed metadata to SKILL.md body or references/")
|
|
165
|
+
lines.append("=" * 70)
|
|
166
|
+
|
|
167
|
+
return "\n".join(lines)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def main():
|
|
171
|
+
if len(sys.argv) < 2:
|
|
172
|
+
print("Usage: python diff_with_official.py <path/to/skill-folder>")
|
|
173
|
+
sys.exit(1)
|
|
174
|
+
|
|
175
|
+
skill_path = Path(sys.argv[1]).resolve()
|
|
176
|
+
if not skill_path.exists():
|
|
177
|
+
print(f"ā Error: Path not found: {skill_path}")
|
|
178
|
+
sys.exit(1)
|
|
179
|
+
|
|
180
|
+
result = analyze_compatibility(skill_path)
|
|
181
|
+
print(format_report(result))
|
|
182
|
+
|
|
183
|
+
sys.exit(0 if result['official_compatible'] else 1)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
if __name__ == "__main__":
|
|
187
|
+
main()
|
|
188
|
+
|