@techwavedev/agi-agent-kit 1.1.7 → 1.2.1
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.
Potentially problematic release.
This version of @techwavedev/agi-agent-kit might be problematic. Click here for more details.
- package/CHANGELOG.md +82 -1
- package/README.md +190 -12
- package/bin/init.js +30 -2
- package/package.json +6 -3
- package/templates/base/AGENTS.md +54 -23
- package/templates/base/README.md +325 -0
- package/templates/base/directives/memory_integration.md +95 -0
- package/templates/base/execution/memory_manager.py +309 -0
- package/templates/base/execution/session_boot.py +218 -0
- package/templates/base/execution/session_init.py +320 -0
- package/templates/base/skill-creator/SKILL_skillcreator.md +23 -36
- package/templates/base/skill-creator/scripts/init_skill.py +18 -135
- package/templates/skills/ec/README.md +31 -0
- package/templates/skills/ec/aws/SKILL.md +1020 -0
- package/templates/skills/ec/aws/defaults.yaml +13 -0
- package/templates/skills/ec/aws/references/common_patterns.md +80 -0
- package/templates/skills/ec/aws/references/mcp_servers.md +98 -0
- package/templates/skills/ec/aws-terraform/SKILL.md +349 -0
- package/templates/skills/ec/aws-terraform/references/best_practices.md +394 -0
- package/templates/skills/ec/aws-terraform/references/checkov_reference.md +337 -0
- package/templates/skills/ec/aws-terraform/scripts/configure_mcp.py +150 -0
- package/templates/skills/ec/confluent-kafka/SKILL.md +655 -0
- package/templates/skills/ec/confluent-kafka/references/ansible_playbooks.md +792 -0
- package/templates/skills/ec/confluent-kafka/references/ec_deployment.md +579 -0
- package/templates/skills/ec/confluent-kafka/references/kraft_migration.md +490 -0
- package/templates/skills/ec/confluent-kafka/references/troubleshooting.md +778 -0
- package/templates/skills/ec/confluent-kafka/references/upgrade_7x_to_8x.md +488 -0
- package/templates/skills/ec/confluent-kafka/scripts/kafka_health_check.py +435 -0
- package/templates/skills/ec/confluent-kafka/scripts/upgrade_preflight.py +568 -0
- package/templates/skills/ec/confluent-kafka/scripts/validate_config.py +455 -0
- package/templates/skills/ec/consul/SKILL.md +427 -0
- package/templates/skills/ec/consul/references/acl_setup.md +168 -0
- package/templates/skills/ec/consul/references/ha_config.md +196 -0
- package/templates/skills/ec/consul/references/troubleshooting.md +267 -0
- package/templates/skills/ec/consul/references/upgrades.md +213 -0
- package/templates/skills/ec/consul/scripts/consul_health_report.py +530 -0
- package/templates/skills/ec/consul/scripts/consul_status.py +264 -0
- package/templates/skills/ec/consul/scripts/generate_values.py +170 -0
- package/templates/skills/ec/documentation/SKILL.md +351 -0
- package/templates/skills/ec/documentation/references/best_practices.md +201 -0
- package/templates/skills/ec/documentation/scripts/analyze_code.py +307 -0
- package/templates/skills/ec/documentation/scripts/detect_changes.py +460 -0
- package/templates/skills/ec/documentation/scripts/generate_changelog.py +312 -0
- package/templates/skills/ec/documentation/scripts/sync_docs.py +272 -0
- package/templates/skills/ec/documentation/scripts/update_skill_docs.py +366 -0
- package/templates/skills/ec/gitlab/SKILL.md +529 -0
- package/templates/skills/ec/gitlab/references/agent_installation.md +416 -0
- package/templates/skills/ec/gitlab/references/api_reference.md +508 -0
- package/templates/skills/ec/gitlab/references/gitops_flux.md +465 -0
- package/templates/skills/ec/gitlab/references/troubleshooting.md +518 -0
- package/templates/skills/ec/gitlab/scripts/generate_agent_values.py +329 -0
- package/templates/skills/ec/gitlab/scripts/gitlab_agent_status.py +414 -0
- package/templates/skills/ec/jira/SKILL.md +484 -0
- package/templates/skills/ec/jira/references/jql_reference.md +148 -0
- package/templates/skills/ec/jira/scripts/add_comment.py +91 -0
- package/templates/skills/ec/jira/scripts/bulk_log_work.py +124 -0
- package/templates/skills/ec/jira/scripts/create_ticket.py +162 -0
- package/templates/skills/ec/jira/scripts/get_ticket.py +191 -0
- package/templates/skills/ec/jira/scripts/jira_client.py +383 -0
- package/templates/skills/ec/jira/scripts/log_work.py +154 -0
- package/templates/skills/ec/jira/scripts/search_tickets.py +104 -0
- package/templates/skills/ec/jira/scripts/update_comment.py +67 -0
- package/templates/skills/ec/jira/scripts/update_ticket.py +161 -0
- package/templates/skills/ec/karpenter/SKILL.md +301 -0
- package/templates/skills/ec/karpenter/references/ec2nodeclasses.md +421 -0
- package/templates/skills/ec/karpenter/references/migration.md +396 -0
- package/templates/skills/ec/karpenter/references/nodepools.md +400 -0
- package/templates/skills/ec/karpenter/references/troubleshooting.md +359 -0
- package/templates/skills/ec/karpenter/scripts/generate_ec2nodeclass.py +187 -0
- package/templates/skills/ec/karpenter/scripts/generate_nodepool.py +245 -0
- package/templates/skills/ec/karpenter/scripts/karpenter_status.py +359 -0
- package/templates/skills/ec/opensearch/SKILL.md +720 -0
- package/templates/skills/ec/opensearch/references/ml_neural_search.md +576 -0
- package/templates/skills/ec/opensearch/references/operator.md +532 -0
- package/templates/skills/ec/opensearch/references/query_dsl.md +532 -0
- package/templates/skills/ec/opensearch/scripts/configure_mcp.py +148 -0
- package/templates/skills/ec/victoriametrics/SKILL.md +598 -0
- package/templates/skills/ec/victoriametrics/references/kubernetes.md +531 -0
- package/templates/skills/ec/victoriametrics/references/prometheus_migration.md +333 -0
- package/templates/skills/ec/victoriametrics/references/troubleshooting.md +442 -0
- package/templates/skills/knowledge/SKILLS_CATALOG.md +274 -4
- package/templates/skills/knowledge/intelligent-routing/SKILL.md +237 -164
- package/templates/skills/knowledge/parallel-agents/SKILL.md +345 -73
- package/templates/skills/knowledge/plugin-discovery/SKILL.md +582 -0
- package/templates/skills/knowledge/plugin-discovery/scripts/platform_setup.py +1083 -0
- package/templates/skills/knowledge/design-md/README.md +0 -34
- package/templates/skills/knowledge/design-md/SKILL.md +0 -193
- package/templates/skills/knowledge/design-md/examples/DESIGN.md +0 -154
- package/templates/skills/knowledge/notebooklm-mcp/SKILL.md +0 -71
- package/templates/skills/knowledge/notebooklm-mcp/assets/example_asset.txt +0 -24
- package/templates/skills/knowledge/notebooklm-mcp/references/api_reference.md +0 -34
- package/templates/skills/knowledge/notebooklm-mcp/scripts/example.py +0 -19
- package/templates/skills/knowledge/react-components/README.md +0 -36
- package/templates/skills/knowledge/react-components/SKILL.md +0 -53
- package/templates/skills/knowledge/react-components/examples/gold-standard-card.tsx +0 -80
- package/templates/skills/knowledge/react-components/package-lock.json +0 -231
- package/templates/skills/knowledge/react-components/package.json +0 -16
- package/templates/skills/knowledge/react-components/resources/architecture-checklist.md +0 -15
- package/templates/skills/knowledge/react-components/resources/component-template.tsx +0 -37
- package/templates/skills/knowledge/react-components/resources/stitch-api-reference.md +0 -14
- package/templates/skills/knowledge/react-components/resources/style-guide.json +0 -27
- package/templates/skills/knowledge/react-components/scripts/fetch-stitch.sh +0 -30
- package/templates/skills/knowledge/react-components/scripts/validate.js +0 -68
- package/templates/skills/knowledge/self-update/SKILL.md +0 -60
- package/templates/skills/knowledge/self-update/scripts/update_kit.py +0 -103
- package/templates/skills/knowledge/stitch-loop/README.md +0 -54
- package/templates/skills/knowledge/stitch-loop/SKILL.md +0 -235
- package/templates/skills/knowledge/stitch-loop/examples/SITE.md +0 -73
- package/templates/skills/knowledge/stitch-loop/examples/next-prompt.md +0 -25
- package/templates/skills/knowledge/stitch-loop/resources/baton-schema.md +0 -61
- package/templates/skills/knowledge/stitch-loop/resources/site-template.md +0 -104
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Script: session_init.py
|
|
4
|
+
Purpose: Bootstrap script for AI agent sessions. Checks prerequisites and
|
|
5
|
+
initializes Qdrant collections with correct dimensions for the
|
|
6
|
+
configured embedding provider (defaults to Ollama/768d).
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
# Full initialization (check + create collections)
|
|
10
|
+
python3 execution/session_init.py
|
|
11
|
+
|
|
12
|
+
# Check only (no collection creation)
|
|
13
|
+
python3 execution/session_init.py --check-only
|
|
14
|
+
|
|
15
|
+
# Force re-initialization
|
|
16
|
+
python3 execution/session_init.py --force
|
|
17
|
+
|
|
18
|
+
Environment Variables:
|
|
19
|
+
EMBEDDING_PROVIDER - "ollama" (default), "openai", or "bedrock"
|
|
20
|
+
OLLAMA_URL - Ollama server URL (default: http://localhost:11434)
|
|
21
|
+
QDRANT_URL - Qdrant server URL (default: http://localhost:6333)
|
|
22
|
+
|
|
23
|
+
Exit Codes:
|
|
24
|
+
0 - Success (all systems ready)
|
|
25
|
+
1 - Partial success (some checks failed but non-critical)
|
|
26
|
+
2 - Critical failure (Qdrant or embeddings not available)
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
import argparse
|
|
30
|
+
import json
|
|
31
|
+
import os
|
|
32
|
+
import sys
|
|
33
|
+
from urllib.request import Request, urlopen
|
|
34
|
+
from urllib.error import URLError, HTTPError
|
|
35
|
+
|
|
36
|
+
# Resolve path to qdrant-memory scripts
|
|
37
|
+
SKILL_SCRIPTS_DIR = os.path.join(
|
|
38
|
+
os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
|
|
39
|
+
"skills",
|
|
40
|
+
"qdrant-memory",
|
|
41
|
+
"scripts",
|
|
42
|
+
)
|
|
43
|
+
sys.path.insert(0, SKILL_SCRIPTS_DIR)
|
|
44
|
+
|
|
45
|
+
from embedding_utils import (
|
|
46
|
+
check_embedding_service,
|
|
47
|
+
get_embedding_dimension,
|
|
48
|
+
EMBEDDING_PROVIDER,
|
|
49
|
+
EMBEDDING_MODEL,
|
|
50
|
+
)
|
|
51
|
+
from init_collection import create_collection, create_payload_index
|
|
52
|
+
|
|
53
|
+
# Configuration
|
|
54
|
+
QDRANT_URL = os.environ.get("QDRANT_URL", "http://localhost:6333")
|
|
55
|
+
COLLECTIONS = ["agent_memory", "semantic_cache"]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def check_qdrant() -> dict:
|
|
59
|
+
"""Check if Qdrant is running and accessible."""
|
|
60
|
+
try:
|
|
61
|
+
req = Request(f"{QDRANT_URL}/collections", method="GET")
|
|
62
|
+
with urlopen(req, timeout=10) as response:
|
|
63
|
+
data = json.loads(response.read().decode())
|
|
64
|
+
existing = [
|
|
65
|
+
c["name"] for c in data.get("result", {}).get("collections", [])
|
|
66
|
+
]
|
|
67
|
+
return {"status": "ok", "url": QDRANT_URL, "existing_collections": existing}
|
|
68
|
+
except URLError as e:
|
|
69
|
+
return {
|
|
70
|
+
"status": "error",
|
|
71
|
+
"url": QDRANT_URL,
|
|
72
|
+
"message": str(e),
|
|
73
|
+
"fix": "docker run -d -p 6333:6333 -p 6334:6334 -v qdrant_storage:/qdrant/storage qdrant/qdrant",
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def check_ollama() -> dict:
|
|
78
|
+
"""Check if Ollama is running and has the embedding model."""
|
|
79
|
+
embed_status = check_embedding_service()
|
|
80
|
+
|
|
81
|
+
if embed_status.get("status") == "ok":
|
|
82
|
+
return embed_status
|
|
83
|
+
|
|
84
|
+
if embed_status.get("status") == "missing_model":
|
|
85
|
+
embed_status["fix"] = f"ollama pull {EMBEDDING_MODEL}"
|
|
86
|
+
return embed_status
|
|
87
|
+
|
|
88
|
+
if embed_status.get("status") == "connection_error":
|
|
89
|
+
embed_status["fix"] = "Install and start Ollama: https://ollama.ai"
|
|
90
|
+
return embed_status
|
|
91
|
+
|
|
92
|
+
return embed_status
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def init_collections(force: bool = False) -> list:
|
|
96
|
+
"""Initialize required Qdrant collections with correct dimensions."""
|
|
97
|
+
dimension = get_embedding_dimension()
|
|
98
|
+
results = []
|
|
99
|
+
|
|
100
|
+
for collection_name in COLLECTIONS:
|
|
101
|
+
# Check if collection already exists
|
|
102
|
+
try:
|
|
103
|
+
req = Request(f"{QDRANT_URL}/collections/{collection_name}", method="GET")
|
|
104
|
+
with urlopen(req, timeout=10) as response:
|
|
105
|
+
data = json.loads(response.read().decode())
|
|
106
|
+
existing_dim = (
|
|
107
|
+
data.get("result", {})
|
|
108
|
+
.get("config", {})
|
|
109
|
+
.get("params", {})
|
|
110
|
+
.get("vectors", {})
|
|
111
|
+
.get("size")
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if existing_dim and existing_dim != dimension and force:
|
|
115
|
+
# Delete and recreate with correct dimensions
|
|
116
|
+
del_req = Request(
|
|
117
|
+
f"{QDRANT_URL}/collections/{collection_name}", method="DELETE"
|
|
118
|
+
)
|
|
119
|
+
urlopen(del_req, timeout=10)
|
|
120
|
+
print(
|
|
121
|
+
f" Deleted {collection_name} (was {existing_dim}d, need {dimension}d)"
|
|
122
|
+
)
|
|
123
|
+
elif existing_dim == dimension:
|
|
124
|
+
results.append(
|
|
125
|
+
{
|
|
126
|
+
"collection": collection_name,
|
|
127
|
+
"status": "exists",
|
|
128
|
+
"dimension": existing_dim,
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
continue
|
|
132
|
+
elif existing_dim and existing_dim != dimension and not force:
|
|
133
|
+
results.append(
|
|
134
|
+
{
|
|
135
|
+
"collection": collection_name,
|
|
136
|
+
"status": "dimension_mismatch",
|
|
137
|
+
"current": existing_dim,
|
|
138
|
+
"expected": dimension,
|
|
139
|
+
"fix": f"Run with --force to recreate with {dimension}d",
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
continue
|
|
143
|
+
except HTTPError as e:
|
|
144
|
+
if e.code != 404:
|
|
145
|
+
results.append(
|
|
146
|
+
{
|
|
147
|
+
"collection": collection_name,
|
|
148
|
+
"status": "error",
|
|
149
|
+
"message": str(e),
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
continue
|
|
153
|
+
except URLError:
|
|
154
|
+
results.append(
|
|
155
|
+
{
|
|
156
|
+
"collection": collection_name,
|
|
157
|
+
"status": "error",
|
|
158
|
+
"message": "Cannot connect to Qdrant",
|
|
159
|
+
}
|
|
160
|
+
)
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
# Create collection
|
|
164
|
+
try:
|
|
165
|
+
create_result = create_collection(
|
|
166
|
+
QDRANT_URL, collection_name, dimension, "cosine"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Create standard payload indexes
|
|
170
|
+
indexes = [
|
|
171
|
+
("type", "keyword"),
|
|
172
|
+
("project", "keyword"),
|
|
173
|
+
("timestamp", "datetime"),
|
|
174
|
+
("tags", "keyword"),
|
|
175
|
+
("model", "keyword"),
|
|
176
|
+
("token_count", "integer"),
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
for field, field_type in indexes:
|
|
180
|
+
create_payload_index(QDRANT_URL, collection_name, field, field_type)
|
|
181
|
+
|
|
182
|
+
results.append(
|
|
183
|
+
{
|
|
184
|
+
"collection": collection_name,
|
|
185
|
+
"status": "created",
|
|
186
|
+
"dimension": dimension,
|
|
187
|
+
"indexes": len(indexes),
|
|
188
|
+
}
|
|
189
|
+
)
|
|
190
|
+
except Exception as e:
|
|
191
|
+
results.append(
|
|
192
|
+
{"collection": collection_name, "status": "error", "message": str(e)}
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return results
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def main():
|
|
199
|
+
parser = argparse.ArgumentParser(
|
|
200
|
+
description="Initialize AI agent session (Qdrant + Ollama check + collection setup)"
|
|
201
|
+
)
|
|
202
|
+
parser.add_argument(
|
|
203
|
+
"--check-only",
|
|
204
|
+
action="store_true",
|
|
205
|
+
help="Only check prerequisites, don't create collections",
|
|
206
|
+
)
|
|
207
|
+
parser.add_argument(
|
|
208
|
+
"--force",
|
|
209
|
+
action="store_true",
|
|
210
|
+
help="Force re-initialization (recreate collections)",
|
|
211
|
+
)
|
|
212
|
+
parser.add_argument(
|
|
213
|
+
"--json",
|
|
214
|
+
action="store_true",
|
|
215
|
+
help="Output as JSON only (no human-readable messages)",
|
|
216
|
+
)
|
|
217
|
+
args = parser.parse_args()
|
|
218
|
+
|
|
219
|
+
report = {
|
|
220
|
+
"provider": EMBEDDING_PROVIDER,
|
|
221
|
+
"model": EMBEDDING_MODEL,
|
|
222
|
+
"dimension": get_embedding_dimension(),
|
|
223
|
+
"qdrant": {},
|
|
224
|
+
"embeddings": {},
|
|
225
|
+
"collections": [],
|
|
226
|
+
"ready": False,
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
# Step 1: Check Qdrant
|
|
230
|
+
if not args.json:
|
|
231
|
+
print(f"Checking Qdrant at {QDRANT_URL}...")
|
|
232
|
+
qdrant_status = check_qdrant()
|
|
233
|
+
report["qdrant"] = qdrant_status
|
|
234
|
+
|
|
235
|
+
if qdrant_status["status"] != "ok":
|
|
236
|
+
if not args.json:
|
|
237
|
+
print(f" FAILED: {qdrant_status.get('message', 'Unknown error')}")
|
|
238
|
+
print(f" FIX: {qdrant_status.get('fix', 'Check Qdrant installation')}")
|
|
239
|
+
if args.json:
|
|
240
|
+
print(json.dumps(report, indent=2))
|
|
241
|
+
sys.exit(2)
|
|
242
|
+
else:
|
|
243
|
+
if not args.json:
|
|
244
|
+
print(f" OK. Collections: {qdrant_status.get('existing_collections', [])}")
|
|
245
|
+
|
|
246
|
+
# Step 2: Check embedding service
|
|
247
|
+
if not args.json:
|
|
248
|
+
print(f"Checking embedding service ({EMBEDDING_PROVIDER}/{EMBEDDING_MODEL})...")
|
|
249
|
+
embed_status = check_ollama()
|
|
250
|
+
report["embeddings"] = embed_status
|
|
251
|
+
|
|
252
|
+
if embed_status.get("status") != "ok":
|
|
253
|
+
if not args.json:
|
|
254
|
+
print(f" FAILED: {embed_status.get('message', 'Unknown error')}")
|
|
255
|
+
if embed_status.get("fix"):
|
|
256
|
+
print(f" FIX: {embed_status['fix']}")
|
|
257
|
+
if args.json:
|
|
258
|
+
print(json.dumps(report, indent=2))
|
|
259
|
+
sys.exit(2)
|
|
260
|
+
else:
|
|
261
|
+
if not args.json:
|
|
262
|
+
print(f" OK. Model: {EMBEDDING_MODEL} ({get_embedding_dimension()}d)")
|
|
263
|
+
|
|
264
|
+
# Step 3: Initialize collections
|
|
265
|
+
if not args.check_only:
|
|
266
|
+
if not args.json:
|
|
267
|
+
print(
|
|
268
|
+
f"Initializing collections (dimension={get_embedding_dimension()})..."
|
|
269
|
+
)
|
|
270
|
+
collection_results = init_collections(force=args.force)
|
|
271
|
+
report["collections"] = collection_results
|
|
272
|
+
|
|
273
|
+
for cr in collection_results:
|
|
274
|
+
if not args.json:
|
|
275
|
+
status = cr["status"]
|
|
276
|
+
name = cr["collection"]
|
|
277
|
+
if status == "created":
|
|
278
|
+
print(
|
|
279
|
+
f" CREATED: {name} ({cr['dimension']}d, {cr['indexes']} indexes)"
|
|
280
|
+
)
|
|
281
|
+
elif status == "exists":
|
|
282
|
+
print(f" EXISTS: {name} ({cr['dimension']}d)")
|
|
283
|
+
elif status == "dimension_mismatch":
|
|
284
|
+
print(
|
|
285
|
+
f" MISMATCH: {name} (current={cr['current']}d, expected={cr['expected']}d)"
|
|
286
|
+
)
|
|
287
|
+
print(f" FIX: {cr.get('fix', '')}")
|
|
288
|
+
else:
|
|
289
|
+
print(f" ERROR: {name} - {cr.get('message', '')}")
|
|
290
|
+
else:
|
|
291
|
+
if not args.json:
|
|
292
|
+
print("Skipping collection initialization (--check-only)")
|
|
293
|
+
|
|
294
|
+
# Final status
|
|
295
|
+
all_ok = qdrant_status["status"] == "ok" and embed_status.get("status") == "ok"
|
|
296
|
+
|
|
297
|
+
if not args.check_only:
|
|
298
|
+
all_ok = all_ok and all(
|
|
299
|
+
cr["status"] in ("created", "exists")
|
|
300
|
+
for cr in report.get("collections", [])
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
report["ready"] = all_ok
|
|
304
|
+
|
|
305
|
+
if not args.json:
|
|
306
|
+
if all_ok:
|
|
307
|
+
print(f"\nSession initialized. Memory system ready.")
|
|
308
|
+
print(f" Provider: {EMBEDDING_PROVIDER} ({EMBEDDING_MODEL})")
|
|
309
|
+
print(f" Dimension: {get_embedding_dimension()}")
|
|
310
|
+
print(f" Qdrant: {QDRANT_URL}")
|
|
311
|
+
else:
|
|
312
|
+
print(f"\nSession initialization incomplete. See errors above.")
|
|
313
|
+
else:
|
|
314
|
+
print(json.dumps(report, indent=2))
|
|
315
|
+
|
|
316
|
+
sys.exit(0 if all_ok else 1)
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
if __name__ == "__main__":
|
|
320
|
+
main()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-creator
|
|
3
|
-
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends
|
|
3
|
+
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
|
|
4
4
|
license: Complete terms in LICENSE.txt
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,9 +10,9 @@ This skill provides guidance for creating effective skills.
|
|
|
10
10
|
|
|
11
11
|
## About Skills
|
|
12
12
|
|
|
13
|
-
Skills are modular, self-contained packages that extend
|
|
13
|
+
Skills are modular, self-contained packages that extend Claude's capabilities by providing
|
|
14
14
|
specialized knowledge, workflows, and tools. Think of them as "onboarding guides" for specific
|
|
15
|
-
domains or tasks—they transform
|
|
15
|
+
domains or tasks—they transform Claude from a general-purpose agent into a specialized agent
|
|
16
16
|
equipped with procedural knowledge that no model can fully possess.
|
|
17
17
|
|
|
18
18
|
### What Skills Provide
|
|
@@ -26,9 +26,9 @@ equipped with procedural knowledge that no model can fully possess.
|
|
|
26
26
|
|
|
27
27
|
### Concise is Key
|
|
28
28
|
|
|
29
|
-
The context window is a public good. Skills share the context window with everything else
|
|
29
|
+
The context window is a public good. Skills share the context window with everything else Claude needs: system prompt, conversation history, other Skills' metadata, and the actual user request.
|
|
30
30
|
|
|
31
|
-
**Default assumption:
|
|
31
|
+
**Default assumption: Claude is already very smart.** Only add context Claude doesn't already have. Challenge each piece of information: "Does Claude really need this explanation?" and "Does this paragraph justify its token cost?"
|
|
32
32
|
|
|
33
33
|
Prefer concise examples over verbose explanations.
|
|
34
34
|
|
|
@@ -42,7 +42,7 @@ Match the level of specificity to the task's fragility and variability:
|
|
|
42
42
|
|
|
43
43
|
**Low freedom (specific scripts, few parameters)**: Use when operations are fragile and error-prone, consistency is critical, or a specific sequence must be followed.
|
|
44
44
|
|
|
45
|
-
Think of
|
|
45
|
+
Think of Claude as exploring a path: a narrow bridge with cliffs needs specific guardrails (low freedom), while an open field allows many routes (high freedom).
|
|
46
46
|
|
|
47
47
|
### Anatomy of a Skill
|
|
48
48
|
|
|
@@ -65,7 +65,7 @@ skill-name/
|
|
|
65
65
|
|
|
66
66
|
Every SKILL.md consists of:
|
|
67
67
|
|
|
68
|
-
- **Frontmatter** (YAML): Contains `name` and `description` fields. These are the only fields that
|
|
68
|
+
- **Frontmatter** (YAML): Contains `name` and `description` fields. These are the only fields that Claude reads to determine when the skill gets used, thus it is very important to be clear and comprehensive in describing what the skill is, and when it should be used.
|
|
69
69
|
- **Body** (Markdown): Instructions and guidance for using the skill. Only loaded AFTER the skill triggers (if at all).
|
|
70
70
|
|
|
71
71
|
#### Bundled Resources (optional)
|
|
@@ -77,27 +77,27 @@ Executable code (Python/Bash/etc.) for tasks that require deterministic reliabil
|
|
|
77
77
|
- **When to include**: When the same code is being rewritten repeatedly or deterministic reliability is needed
|
|
78
78
|
- **Example**: `scripts/rotate_pdf.py` for PDF rotation tasks
|
|
79
79
|
- **Benefits**: Token efficient, deterministic, may be executed without loading into context
|
|
80
|
-
- **Note**: Scripts may still need to be read by
|
|
80
|
+
- **Note**: Scripts may still need to be read by Claude for patching or environment-specific adjustments
|
|
81
81
|
|
|
82
82
|
##### References (`references/`)
|
|
83
83
|
|
|
84
|
-
Documentation and reference material intended to be loaded as needed into context to inform
|
|
84
|
+
Documentation and reference material intended to be loaded as needed into context to inform Claude's process and thinking.
|
|
85
85
|
|
|
86
|
-
- **When to include**: For documentation that
|
|
86
|
+
- **When to include**: For documentation that Claude should reference while working
|
|
87
87
|
- **Examples**: `references/finance.md` for financial schemas, `references/mnda.md` for company NDA template, `references/policies.md` for company policies, `references/api_docs.md` for API specifications
|
|
88
88
|
- **Use cases**: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides
|
|
89
|
-
- **Benefits**: Keeps SKILL.md lean, loaded only when
|
|
89
|
+
- **Benefits**: Keeps SKILL.md lean, loaded only when Claude determines it's needed
|
|
90
90
|
- **Best practice**: If files are large (>10k words), include grep search patterns in SKILL.md
|
|
91
91
|
- **Avoid duplication**: Information should live in either SKILL.md or references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.
|
|
92
92
|
|
|
93
93
|
##### Assets (`assets/`)
|
|
94
94
|
|
|
95
|
-
Files not intended to be loaded into context, but rather used within the output
|
|
95
|
+
Files not intended to be loaded into context, but rather used within the output Claude produces.
|
|
96
96
|
|
|
97
97
|
- **When to include**: When the skill needs files that will be used in the final output
|
|
98
98
|
- **Examples**: `assets/logo.png` for brand assets, `assets/slides.pptx` for PowerPoint templates, `assets/frontend-template/` for HTML/React boilerplate, `assets/font.ttf` for typography
|
|
99
99
|
- **Use cases**: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified
|
|
100
|
-
- **Benefits**: Separates output resources from documentation, enables
|
|
100
|
+
- **Benefits**: Separates output resources from documentation, enables Claude to use files without loading them into context
|
|
101
101
|
|
|
102
102
|
#### What to Not Include in a Skill
|
|
103
103
|
|
|
@@ -117,7 +117,7 @@ Skills use a three-level loading system to manage context efficiently:
|
|
|
117
117
|
|
|
118
118
|
1. **Metadata (name + description)** - Always in context (~100 words)
|
|
119
119
|
2. **SKILL.md body** - When skill triggers (<5k words)
|
|
120
|
-
3. **Bundled resources** - As needed by
|
|
120
|
+
3. **Bundled resources** - As needed by Claude (Unlimited because scripts can be executed without reading into context window)
|
|
121
121
|
|
|
122
122
|
#### Progressive Disclosure Patterns
|
|
123
123
|
|
|
@@ -142,7 +142,7 @@ Extract text with pdfplumber:
|
|
|
142
142
|
- **Examples**: See [EXAMPLES.md](EXAMPLES.md) for common patterns
|
|
143
143
|
```
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
Claude loads FORMS.md, REFERENCE.md, or EXAMPLES.md only when needed.
|
|
146
146
|
|
|
147
147
|
**Pattern 2: Domain-specific organization**
|
|
148
148
|
|
|
@@ -158,7 +158,7 @@ bigquery-skill/
|
|
|
158
158
|
└── marketing.md (campaigns, attribution)
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
When a user asks about sales metrics,
|
|
161
|
+
When a user asks about sales metrics, Claude only reads sales.md.
|
|
162
162
|
|
|
163
163
|
Similarly, for skills supporting multiple frameworks or variants, organize by variant:
|
|
164
164
|
|
|
@@ -171,7 +171,7 @@ cloud-deploy/
|
|
|
171
171
|
└── azure.md (Azure deployment patterns)
|
|
172
172
|
```
|
|
173
173
|
|
|
174
|
-
When the user chooses AWS,
|
|
174
|
+
When the user chooses AWS, Claude only reads aws.md.
|
|
175
175
|
|
|
176
176
|
**Pattern 3: Conditional details**
|
|
177
177
|
|
|
@@ -192,12 +192,12 @@ For simple edits, modify the XML directly.
|
|
|
192
192
|
**For OOXML details**: See [OOXML.md](OOXML.md)
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
|
|
195
|
+
Claude reads REDLINING.md or OOXML.md only when the user needs those features.
|
|
196
196
|
|
|
197
197
|
**Important guidelines:**
|
|
198
198
|
|
|
199
199
|
- **Avoid deeply nested references** - Keep references one level deep from SKILL.md. All reference files should link directly from SKILL.md.
|
|
200
|
-
- **Structure longer reference files** - For files longer than 100 lines, include a table of contents at the top so
|
|
200
|
+
- **Structure longer reference files** - For files longer than 100 lines, include a table of contents at the top so Claude can see the full scope when previewing.
|
|
201
201
|
|
|
202
202
|
## Skill Creation Process
|
|
203
203
|
|
|
@@ -266,12 +266,6 @@ Usage:
|
|
|
266
266
|
|
|
267
267
|
```bash
|
|
268
268
|
scripts/init_skill.py <skill-name> --path <output-directory>
|
|
269
|
-
|
|
270
|
-
# Skip automatic catalog/docs updates
|
|
271
|
-
scripts/init_skill.py <skill-name> --path <output-directory> --no-auto-update
|
|
272
|
-
|
|
273
|
-
# Specify skills directory for catalog updates (if different from --path)
|
|
274
|
-
scripts/init_skill.py <skill-name> --path <output-directory> --skills-dir skills/
|
|
275
269
|
```
|
|
276
270
|
|
|
277
271
|
The script:
|
|
@@ -280,20 +274,16 @@ The script:
|
|
|
280
274
|
- Generates a SKILL.md template with proper frontmatter and TODO placeholders
|
|
281
275
|
- Creates example resource directories: `scripts/`, `references/`, and `assets/`
|
|
282
276
|
- Adds example files in each directory that can be customized or deleted
|
|
283
|
-
- **Auto-runs `update_catalog.py`** to regenerate `SKILLS_CATALOG.md` (default ON)
|
|
284
|
-
- **Auto-runs `sync_docs.py`** to synchronize documentation (default ON, if documentation skill exists)
|
|
285
|
-
|
|
286
|
-
> **Note:** Use `--no-auto-update` to skip automatic catalog and documentation updates.
|
|
287
277
|
|
|
288
278
|
After initialization, customize or remove the generated SKILL.md and example files as needed.
|
|
289
279
|
|
|
290
280
|
### Step 4: Edit the Skill
|
|
291
281
|
|
|
292
|
-
When editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of
|
|
282
|
+
When editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Claude to use. Include information that would be beneficial and non-obvious to Claude. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Claude instance execute these tasks more effectively.
|
|
293
283
|
|
|
294
284
|
#### Learn Proven Design Patterns
|
|
295
285
|
|
|
296
|
-
|
|
286
|
+
Refer to these helpful guides based on your skill's needs:
|
|
297
287
|
|
|
298
288
|
- **Multi-step processes**: See references/workflows.md for sequential workflows and conditional logic
|
|
299
289
|
- **Specific output formats or quality standards**: See references/output-patterns.md for template and example patterns
|
|
@@ -317,10 +307,10 @@ Any example files and directories not needed for the skill should be deleted. Th
|
|
|
317
307
|
Write the YAML frontmatter with `name` and `description`:
|
|
318
308
|
|
|
319
309
|
- `name`: The skill name
|
|
320
|
-
- `description`: This is the primary triggering mechanism for your skill, and helps
|
|
310
|
+
- `description`: This is the primary triggering mechanism for your skill, and helps Claude understand when to use the skill.
|
|
321
311
|
- Include both what the Skill does and specific triggers/contexts for when to use it.
|
|
322
312
|
- Include all "when to use" information here - Not in the body. The body is only loaded after triggering, so "When to Use This Skill" sections in the body are not helpful to Claude.
|
|
323
|
-
- Example description for a `docx` skill: "Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. Use when
|
|
313
|
+
- Example description for a `docx` skill: "Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. Use when Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks"
|
|
324
314
|
|
|
325
315
|
Do not include any other fields in YAML frontmatter.
|
|
326
316
|
|
|
@@ -358,10 +348,7 @@ If validation fails, the script will report the errors and exit without creating
|
|
|
358
348
|
|
|
359
349
|
**CRITICAL:** After any skill operation (create, modify, or delete), the Skills Catalog must be updated. This ensures all skills are discoverable and documented.
|
|
360
350
|
|
|
361
|
-
> **For new skills:** `init_skill.py` now auto-runs catalog and documentation updates by default. Manual update is only needed when modifying or deleting existing skills.
|
|
362
|
-
|
|
363
351
|
```bash
|
|
364
|
-
# Manual update (for modifications/deletions, or if --no-auto-update was used)
|
|
365
352
|
scripts/update_catalog.py --skills-dir skills/
|
|
366
353
|
```
|
|
367
354
|
|