codingbuddy-rules 4.5.0 → 5.1.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.
Files changed (129) hide show
  1. package/.ai-rules/adapters/aider.md +374 -0
  2. package/.ai-rules/adapters/antigravity.md +6 -6
  3. package/.ai-rules/adapters/claude-code.md +68 -4
  4. package/.ai-rules/adapters/codex.md +5 -5
  5. package/.ai-rules/adapters/cursor.md +2 -2
  6. package/.ai-rules/adapters/kiro.md +8 -8
  7. package/.ai-rules/adapters/opencode.md +7 -7
  8. package/.ai-rules/adapters/q.md +2 -2
  9. package/.ai-rules/adapters/windsurf.md +395 -0
  10. package/.ai-rules/agents/README.md +66 -16
  11. package/.ai-rules/agents/accessibility-specialist.json +8 -1
  12. package/.ai-rules/agents/act-mode.json +8 -1
  13. package/.ai-rules/agents/agent-architect.json +14 -7
  14. package/.ai-rules/agents/ai-ml-engineer.json +7 -0
  15. package/.ai-rules/agents/architecture-specialist.json +7 -0
  16. package/.ai-rules/agents/auto-mode.json +10 -2
  17. package/.ai-rules/agents/backend-developer.json +7 -0
  18. package/.ai-rules/agents/code-quality-specialist.json +7 -0
  19. package/.ai-rules/agents/code-reviewer.json +86 -64
  20. package/.ai-rules/agents/data-engineer.json +14 -7
  21. package/.ai-rules/agents/data-scientist.json +16 -9
  22. package/.ai-rules/agents/devops-engineer.json +7 -0
  23. package/.ai-rules/agents/documentation-specialist.json +7 -0
  24. package/.ai-rules/agents/eval-mode.json +30 -19
  25. package/.ai-rules/agents/event-architecture-specialist.json +7 -0
  26. package/.ai-rules/agents/frontend-developer.json +7 -0
  27. package/.ai-rules/agents/i18n-specialist.json +8 -1
  28. package/.ai-rules/agents/integration-specialist.json +7 -0
  29. package/.ai-rules/agents/migration-specialist.json +7 -0
  30. package/.ai-rules/agents/mobile-developer.json +8 -10
  31. package/.ai-rules/agents/observability-specialist.json +7 -0
  32. package/.ai-rules/agents/parallel-orchestrator.json +352 -0
  33. package/.ai-rules/agents/performance-specialist.json +7 -0
  34. package/.ai-rules/agents/plan-mode.json +9 -1
  35. package/.ai-rules/agents/plan-reviewer.json +211 -0
  36. package/.ai-rules/agents/platform-engineer.json +7 -0
  37. package/.ai-rules/agents/security-engineer.json +15 -8
  38. package/.ai-rules/agents/security-specialist.json +8 -1
  39. package/.ai-rules/agents/seo-specialist.json +7 -0
  40. package/.ai-rules/agents/software-engineer.json +7 -0
  41. package/.ai-rules/agents/solution-architect.json +17 -10
  42. package/.ai-rules/agents/systems-developer.json +15 -8
  43. package/.ai-rules/agents/technical-planner.json +17 -10
  44. package/.ai-rules/agents/test-engineer.json +13 -6
  45. package/.ai-rules/agents/test-strategy-specialist.json +7 -0
  46. package/.ai-rules/agents/tooling-engineer.json +10 -3
  47. package/.ai-rules/agents/ui-ux-designer.json +7 -0
  48. package/.ai-rules/keyword-modes.json +4 -4
  49. package/.ai-rules/rules/clarification-guide.md +14 -14
  50. package/.ai-rules/rules/core.md +73 -0
  51. package/.ai-rules/rules/parallel-execution.md +217 -0
  52. package/.ai-rules/schemas/agent.schema.json +38 -0
  53. package/.ai-rules/skills/README.md +29 -1
  54. package/.ai-rules/skills/agent-design/SKILL.md +5 -0
  55. package/.ai-rules/skills/agent-design/examples/agent-template.json +55 -0
  56. package/.ai-rules/skills/agent-design/references/expertise-guidelines.md +112 -0
  57. package/.ai-rules/skills/agent-discussion/SKILL.md +199 -0
  58. package/.ai-rules/skills/agent-discussion-panel/SKILL.md +448 -0
  59. package/.ai-rules/skills/api-design/SKILL.md +5 -0
  60. package/.ai-rules/skills/api-design/examples/error-response.json +159 -0
  61. package/.ai-rules/skills/api-design/examples/openapi-template.yaml +393 -0
  62. package/.ai-rules/skills/build-fix/SKILL.md +234 -0
  63. package/.ai-rules/skills/code-explanation/SKILL.md +4 -0
  64. package/.ai-rules/skills/context-management/SKILL.md +1 -0
  65. package/.ai-rules/skills/cost-budget/SKILL.md +348 -0
  66. package/.ai-rules/skills/cross-repo-issues/SKILL.md +257 -0
  67. package/.ai-rules/skills/database-migration/SKILL.md +1 -0
  68. package/.ai-rules/skills/deepsearch/SKILL.md +214 -0
  69. package/.ai-rules/skills/deployment-checklist/SKILL.md +1 -0
  70. package/.ai-rules/skills/error-analysis/SKILL.md +1 -0
  71. package/.ai-rules/skills/finishing-a-development-branch/SKILL.md +281 -0
  72. package/.ai-rules/skills/frontend-design/SKILL.md +5 -0
  73. package/.ai-rules/skills/frontend-design/examples/component-template.tsx +203 -0
  74. package/.ai-rules/skills/frontend-design/references/css-patterns.md +243 -0
  75. package/.ai-rules/skills/git-master/SKILL.md +358 -0
  76. package/.ai-rules/skills/incident-response/SKILL.md +1 -0
  77. package/.ai-rules/skills/legacy-modernization/SKILL.md +1 -0
  78. package/.ai-rules/skills/mcp-builder/SKILL.md +7 -0
  79. package/.ai-rules/skills/mcp-builder/examples/resource-example.ts +233 -0
  80. package/.ai-rules/skills/mcp-builder/examples/tool-example.ts +198 -0
  81. package/.ai-rules/skills/mcp-builder/references/protocol-spec.md +215 -0
  82. package/.ai-rules/skills/onboard/SKILL.md +150 -0
  83. package/.ai-rules/skills/performance-optimization/SKILL.md +3 -0
  84. package/.ai-rules/skills/plan-and-review/SKILL.md +115 -0
  85. package/.ai-rules/skills/plan-to-issues/SKILL.md +318 -0
  86. package/.ai-rules/skills/pr-all-in-one/SKILL.md +15 -13
  87. package/.ai-rules/skills/pr-all-in-one/configuration-guide.md +7 -7
  88. package/.ai-rules/skills/pr-all-in-one/pr-templates.md +10 -10
  89. package/.ai-rules/skills/pr-review/SKILL.md +4 -0
  90. package/.ai-rules/skills/receiving-code-review/SKILL.md +347 -0
  91. package/.ai-rules/skills/refactoring/SKILL.md +1 -0
  92. package/.ai-rules/skills/requesting-code-review/SKILL.md +348 -0
  93. package/.ai-rules/skills/retrospective/SKILL.md +192 -0
  94. package/.ai-rules/skills/rule-authoring/SKILL.md +5 -0
  95. package/.ai-rules/skills/rule-authoring/examples/rule-template.md +142 -0
  96. package/.ai-rules/skills/rule-authoring/examples/trigger-patterns.md +126 -0
  97. package/.ai-rules/skills/security-audit/SKILL.md +4 -0
  98. package/.ai-rules/skills/ship/SKILL.md +242 -0
  99. package/.ai-rules/skills/skill-creator/SKILL.md +461 -0
  100. package/.ai-rules/skills/skill-creator/agents/analyzer.md +206 -0
  101. package/.ai-rules/skills/skill-creator/agents/comparator.md +167 -0
  102. package/.ai-rules/skills/skill-creator/agents/grader.md +152 -0
  103. package/.ai-rules/skills/skill-creator/assets/eval_review.html +568 -0
  104. package/.ai-rules/skills/skill-creator/assets/skill-template.md +43 -0
  105. package/.ai-rules/skills/skill-creator/eval-viewer/generate_review.py +496 -0
  106. package/.ai-rules/skills/skill-creator/references/frontmatter-guide.md +632 -0
  107. package/.ai-rules/skills/skill-creator/references/multi-tool-compat.md +480 -0
  108. package/.ai-rules/skills/skill-creator/references/schemas.md +784 -0
  109. package/.ai-rules/skills/skill-creator/scripts/aggregate_benchmark.py +302 -0
  110. package/.ai-rules/skills/skill-creator/scripts/init_skill.sh +196 -0
  111. package/.ai-rules/skills/skill-creator/scripts/run_loop.py +327 -0
  112. package/.ai-rules/skills/systematic-debugging/SKILL.md +1 -0
  113. package/.ai-rules/skills/tech-debt/SKILL.md +1 -0
  114. package/.ai-rules/skills/test-coverage-gate/SKILL.md +303 -0
  115. package/.ai-rules/skills/tmux-master/SKILL.md +491 -0
  116. package/.ai-rules/skills/using-git-worktrees/SKILL.md +368 -0
  117. package/.ai-rules/skills/verification-before-completion/SKILL.md +234 -0
  118. package/.ai-rules/skills/widget-slot-architecture/SKILL.md +6 -0
  119. package/.ai-rules/skills/widget-slot-architecture/examples/parallel-route-setup.tsx +206 -0
  120. package/.ai-rules/skills/widget-slot-architecture/examples/widget-component.tsx +250 -0
  121. package/.ai-rules/skills/writing-plans/SKILL.md +78 -0
  122. package/bin/cli.js +170 -0
  123. package/lib/init/detect-stack.js +162 -0
  124. package/lib/init/generate-config.js +31 -0
  125. package/lib/init/index.js +86 -0
  126. package/lib/init/prompt.js +60 -0
  127. package/lib/init/scaffold.js +67 -0
  128. package/lib/init/suggest-agent.js +57 -0
  129. package/package.json +10 -2
@@ -0,0 +1,568 @@
1
+ <!doctype html>
2
+ <html lang="en" data-theme="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Eval Review — __SKILL_NAME_PLACEHOLDER__</title>
7
+ <style>
8
+ *,
9
+ *::before,
10
+ *::after {
11
+ box-sizing: border-box;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+ :root {
16
+ --bg: #0d1117;
17
+ --surface: #161b22;
18
+ --border: #30363d;
19
+ --text: #e6edf3;
20
+ --text-dim: #8b949e;
21
+ --trigger: #238636;
22
+ --trigger-bg: rgba(35, 134, 54, 0.15);
23
+ --no-trigger: #da3633;
24
+ --no-trigger-bg: rgba(218, 54, 51, 0.15);
25
+ --accent: #58a6ff;
26
+ --accent-hover: #79c0ff;
27
+ --warn: #d29922;
28
+ --radius: 8px;
29
+ --shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
30
+ --font-mono: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
31
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
32
+ }
33
+ html {
34
+ font-size: 15px;
35
+ }
36
+ body {
37
+ background: var(--bg);
38
+ color: var(--text);
39
+ font-family: var(--font-sans);
40
+ line-height: 1.6;
41
+ padding: 2rem;
42
+ max-width: 1200px;
43
+ margin: 0 auto;
44
+ }
45
+ h1 {
46
+ font-size: 1.6rem;
47
+ font-weight: 700;
48
+ margin-bottom: 0.25rem;
49
+ }
50
+ .subtitle {
51
+ color: var(--text-dim);
52
+ margin-bottom: 1.5rem;
53
+ font-size: 0.9rem;
54
+ }
55
+ .stats {
56
+ display: flex;
57
+ gap: 1rem;
58
+ margin-bottom: 1.5rem;
59
+ flex-wrap: wrap;
60
+ }
61
+ .stat {
62
+ background: var(--surface);
63
+ border: 1px solid var(--border);
64
+ border-radius: var(--radius);
65
+ padding: 0.75rem 1.25rem;
66
+ min-width: 120px;
67
+ }
68
+ .stat-label {
69
+ font-size: 0.75rem;
70
+ color: var(--text-dim);
71
+ text-transform: uppercase;
72
+ letter-spacing: 0.05em;
73
+ }
74
+ .stat-value {
75
+ font-size: 1.4rem;
76
+ font-weight: 700;
77
+ font-family: var(--font-mono);
78
+ }
79
+ .stat-trigger .stat-value {
80
+ color: var(--trigger);
81
+ }
82
+ .stat-no-trigger .stat-value {
83
+ color: var(--no-trigger);
84
+ }
85
+ .stat-total .stat-value {
86
+ color: var(--accent);
87
+ }
88
+
89
+ .toolbar {
90
+ display: flex;
91
+ gap: 0.5rem;
92
+ margin-bottom: 1.5rem;
93
+ flex-wrap: wrap;
94
+ align-items: center;
95
+ }
96
+ .btn {
97
+ background: var(--surface);
98
+ color: var(--text);
99
+ border: 1px solid var(--border);
100
+ border-radius: 6px;
101
+ padding: 0.45rem 1rem;
102
+ cursor: pointer;
103
+ font-size: 0.85rem;
104
+ font-family: var(--font-sans);
105
+ transition:
106
+ border-color 0.15s,
107
+ background 0.15s;
108
+ }
109
+ .btn:hover {
110
+ border-color: var(--accent);
111
+ background: #1c2129;
112
+ }
113
+ .btn-primary {
114
+ background: var(--accent);
115
+ color: #000;
116
+ border-color: var(--accent);
117
+ font-weight: 600;
118
+ }
119
+ .btn-primary:hover {
120
+ background: var(--accent-hover);
121
+ }
122
+ .btn-danger {
123
+ color: var(--no-trigger);
124
+ }
125
+ .btn-danger:hover {
126
+ background: var(--no-trigger-bg);
127
+ border-color: var(--no-trigger);
128
+ }
129
+ .filter-group {
130
+ display: flex;
131
+ gap: 0;
132
+ }
133
+ .filter-btn {
134
+ border-radius: 0;
135
+ margin-left: -1px;
136
+ }
137
+ .filter-btn:first-child {
138
+ border-radius: 6px 0 0 6px;
139
+ margin-left: 0;
140
+ }
141
+ .filter-btn:last-child {
142
+ border-radius: 0 6px 6px 0;
143
+ }
144
+ .filter-btn.active {
145
+ background: var(--accent);
146
+ color: #000;
147
+ border-color: var(--accent);
148
+ }
149
+ .spacer {
150
+ flex: 1;
151
+ }
152
+
153
+ .cards {
154
+ display: grid;
155
+ gap: 1rem;
156
+ }
157
+ .card {
158
+ background: var(--surface);
159
+ border: 1px solid var(--border);
160
+ border-radius: var(--radius);
161
+ padding: 1.25rem;
162
+ transition: border-color 0.15s;
163
+ position: relative;
164
+ }
165
+ .card:hover {
166
+ border-color: var(--text-dim);
167
+ }
168
+ .card.trigger {
169
+ border-left: 3px solid var(--trigger);
170
+ }
171
+ .card.no-trigger {
172
+ border-left: 3px solid var(--no-trigger);
173
+ }
174
+ .card-header {
175
+ display: flex;
176
+ align-items: flex-start;
177
+ justify-content: space-between;
178
+ gap: 1rem;
179
+ margin-bottom: 0.75rem;
180
+ }
181
+ .card-query {
182
+ font-size: 1rem;
183
+ font-weight: 500;
184
+ flex: 1;
185
+ }
186
+ .card-badge {
187
+ font-size: 0.7rem;
188
+ font-weight: 700;
189
+ padding: 0.2rem 0.6rem;
190
+ border-radius: 4px;
191
+ white-space: nowrap;
192
+ text-transform: uppercase;
193
+ letter-spacing: 0.04em;
194
+ }
195
+ .badge-trigger {
196
+ background: var(--trigger-bg);
197
+ color: var(--trigger);
198
+ }
199
+ .badge-no-trigger {
200
+ background: var(--no-trigger-bg);
201
+ color: var(--no-trigger);
202
+ }
203
+ .card-meta {
204
+ display: flex;
205
+ gap: 1rem;
206
+ color: var(--text-dim);
207
+ font-size: 0.8rem;
208
+ margin-bottom: 0.5rem;
209
+ flex-wrap: wrap;
210
+ }
211
+ .card-meta span {
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 0.25rem;
215
+ }
216
+ .card-reason {
217
+ color: var(--text-dim);
218
+ font-size: 0.85rem;
219
+ margin-top: 0.5rem;
220
+ padding-top: 0.5rem;
221
+ border-top: 1px solid var(--border);
222
+ }
223
+ .card-actions {
224
+ display: flex;
225
+ gap: 0.5rem;
226
+ margin-top: 0.75rem;
227
+ justify-content: flex-end;
228
+ }
229
+ .card-actions .btn {
230
+ padding: 0.3rem 0.75rem;
231
+ font-size: 0.8rem;
232
+ }
233
+
234
+ /* Modal */
235
+ .modal-overlay {
236
+ display: none;
237
+ position: fixed;
238
+ inset: 0;
239
+ background: rgba(0, 0, 0, 0.6);
240
+ z-index: 100;
241
+ align-items: center;
242
+ justify-content: center;
243
+ }
244
+ .modal-overlay.open {
245
+ display: flex;
246
+ }
247
+ .modal {
248
+ background: var(--surface);
249
+ border: 1px solid var(--border);
250
+ border-radius: var(--radius);
251
+ padding: 1.5rem;
252
+ width: 90%;
253
+ max-width: 560px;
254
+ box-shadow: var(--shadow);
255
+ }
256
+ .modal h2 {
257
+ font-size: 1.1rem;
258
+ margin-bottom: 1rem;
259
+ }
260
+ .form-group {
261
+ margin-bottom: 1rem;
262
+ }
263
+ .form-group label {
264
+ display: block;
265
+ font-size: 0.85rem;
266
+ color: var(--text-dim);
267
+ margin-bottom: 0.3rem;
268
+ }
269
+ .form-group input,
270
+ .form-group textarea,
271
+ .form-group select {
272
+ width: 100%;
273
+ background: var(--bg);
274
+ color: var(--text);
275
+ border: 1px solid var(--border);
276
+ border-radius: 6px;
277
+ padding: 0.5rem 0.75rem;
278
+ font-size: 0.9rem;
279
+ font-family: var(--font-sans);
280
+ }
281
+ .form-group textarea {
282
+ min-height: 80px;
283
+ resize: vertical;
284
+ }
285
+ .form-group select {
286
+ cursor: pointer;
287
+ }
288
+ .modal-footer {
289
+ display: flex;
290
+ gap: 0.5rem;
291
+ justify-content: flex-end;
292
+ margin-top: 1.25rem;
293
+ }
294
+
295
+ .empty {
296
+ text-align: center;
297
+ padding: 3rem;
298
+ color: var(--text-dim);
299
+ }
300
+ .count-badge {
301
+ font-size: 0.75rem;
302
+ color: var(--text-dim);
303
+ margin-left: 0.25rem;
304
+ }
305
+ </style>
306
+ </head>
307
+ <body>
308
+ <h1>Eval Review — <span id="skillName">__SKILL_NAME_PLACEHOLDER__</span></h1>
309
+ <p class="subtitle" id="skillDesc">__SKILL_DESCRIPTION_PLACEHOLDER__</p>
310
+
311
+ <div class="stats" id="stats"></div>
312
+
313
+ <div class="toolbar">
314
+ <div class="filter-group">
315
+ <button class="btn filter-btn active" data-filter="all">
316
+ All <span class="count-badge" id="countAll"></span>
317
+ </button>
318
+ <button class="btn filter-btn" data-filter="trigger">
319
+ Trigger <span class="count-badge" id="countTrigger"></span>
320
+ </button>
321
+ <button class="btn filter-btn" data-filter="no-trigger">
322
+ No Trigger <span class="count-badge" id="countNoTrigger"></span>
323
+ </button>
324
+ </div>
325
+ <span class="spacer"></span>
326
+ <button class="btn" onclick="openModal('add')">+ Add Query</button>
327
+ <button class="btn btn-primary" onclick="downloadJSON()">Download eval_set.json</button>
328
+ </div>
329
+
330
+ <div class="cards" id="cardContainer"></div>
331
+
332
+ <!-- Add/Edit Modal -->
333
+ <div class="modal-overlay" id="modalOverlay">
334
+ <div class="modal">
335
+ <h2 id="modalTitle">Add Query</h2>
336
+ <div class="form-group">
337
+ <label for="inputQuery">User Query</label>
338
+ <textarea id="inputQuery" placeholder="Enter user prompt / query..."></textarea>
339
+ </div>
340
+ <div class="form-group">
341
+ <label for="inputTrigger">Should Trigger?</label>
342
+ <select id="inputTrigger">
343
+ <option value="true">Yes — should trigger this skill</option>
344
+ <option value="false">No — should NOT trigger this skill</option>
345
+ </select>
346
+ </div>
347
+ <div class="form-group">
348
+ <label for="inputReason">Reason (optional)</label>
349
+ <input
350
+ type="text"
351
+ id="inputReason"
352
+ placeholder="Why this query should/shouldn't trigger"
353
+ />
354
+ </div>
355
+ <div class="form-group">
356
+ <label for="inputCategory">Category (optional)</label>
357
+ <input
358
+ type="text"
359
+ id="inputCategory"
360
+ placeholder="e.g. happy-path, edge-case, adversarial"
361
+ />
362
+ </div>
363
+ <div class="modal-footer">
364
+ <button class="btn" onclick="closeModal()">Cancel</button>
365
+ <button class="btn btn-primary" onclick="saveEntry()">Save</button>
366
+ </div>
367
+ </div>
368
+ </div>
369
+
370
+ <script>
371
+ (function () {
372
+ 'use strict';
373
+
374
+ // --- Data ---
375
+ var rawData = __EVAL_DATA_PLACEHOLDER__;
376
+ var evalSet = Array.isArray(rawData)
377
+ ? rawData
378
+ : rawData && rawData.queries
379
+ ? rawData.queries
380
+ : [];
381
+ var currentFilter = 'all';
382
+ var editIndex = -1;
383
+
384
+ // --- Render ---
385
+ function render() {
386
+ renderStats();
387
+ renderCards();
388
+ updateCounts();
389
+ }
390
+
391
+ function renderStats() {
392
+ var total = evalSet.length;
393
+ var triggers = evalSet.filter(function (q) {
394
+ return q.should_trigger;
395
+ }).length;
396
+ var noTriggers = total - triggers;
397
+ document.getElementById('stats').innerHTML =
398
+ '<div class="stat stat-total"><div class="stat-label">Total</div><div class="stat-value">' +
399
+ total +
400
+ '</div></div>' +
401
+ '<div class="stat stat-trigger"><div class="stat-label">Should Trigger</div><div class="stat-value">' +
402
+ triggers +
403
+ '</div></div>' +
404
+ '<div class="stat stat-no-trigger"><div class="stat-label">Should Not</div><div class="stat-value">' +
405
+ noTriggers +
406
+ '</div></div>';
407
+ }
408
+
409
+ function renderCards() {
410
+ var container = document.getElementById('cardContainer');
411
+ var filtered = evalSet.filter(function (q, i) {
412
+ q._index = i;
413
+ if (currentFilter === 'trigger') return q.should_trigger;
414
+ if (currentFilter === 'no-trigger') return !q.should_trigger;
415
+ return true;
416
+ });
417
+
418
+ if (filtered.length === 0) {
419
+ container.innerHTML =
420
+ '<div class="empty">No queries to display. Click "+ Add Query" to create one.</div>';
421
+ return;
422
+ }
423
+
424
+ container.innerHTML = filtered
425
+ .map(function (q) {
426
+ var cls = q.should_trigger ? 'trigger' : 'no-trigger';
427
+ var badge = q.should_trigger
428
+ ? '<span class="card-badge badge-trigger">Should Trigger</span>'
429
+ : '<span class="card-badge badge-no-trigger">Should Not Trigger</span>';
430
+ var meta = '';
431
+ if (q.category) meta += '<span>Category: ' + esc(q.category) + '</span>';
432
+ if (q.confidence) meta += '<span>Confidence: ' + q.confidence + '</span>';
433
+ var reason = q.reason ? '<div class="card-reason">' + esc(q.reason) + '</div>' : '';
434
+ return (
435
+ '<div class="card ' +
436
+ cls +
437
+ '">' +
438
+ '<div class="card-header"><div class="card-query">' +
439
+ esc(q.query) +
440
+ '</div>' +
441
+ badge +
442
+ '</div>' +
443
+ (meta ? '<div class="card-meta">' + meta + '</div>' : '') +
444
+ reason +
445
+ '<div class="card-actions">' +
446
+ '<button class="btn" onclick="openModal(\'edit\',' +
447
+ q._index +
448
+ ')">Edit</button>' +
449
+ '<button class="btn btn-danger" onclick="deleteEntry(' +
450
+ q._index +
451
+ ')">Delete</button>' +
452
+ '</div></div>'
453
+ );
454
+ })
455
+ .join('');
456
+ }
457
+
458
+ function updateCounts() {
459
+ var total = evalSet.length;
460
+ var triggers = evalSet.filter(function (q) {
461
+ return q.should_trigger;
462
+ }).length;
463
+ document.getElementById('countAll').textContent = total;
464
+ document.getElementById('countTrigger').textContent = triggers;
465
+ document.getElementById('countNoTrigger').textContent = total - triggers;
466
+ }
467
+
468
+ function esc(s) {
469
+ if (!s) return '';
470
+ var d = document.createElement('div');
471
+ d.textContent = s;
472
+ return d.innerHTML;
473
+ }
474
+
475
+ // --- Filters ---
476
+ document.querySelectorAll('.filter-btn').forEach(function (btn) {
477
+ btn.addEventListener('click', function () {
478
+ document.querySelectorAll('.filter-btn').forEach(function (b) {
479
+ b.classList.remove('active');
480
+ });
481
+ btn.classList.add('active');
482
+ currentFilter = btn.getAttribute('data-filter');
483
+ renderCards();
484
+ });
485
+ });
486
+
487
+ // --- Modal ---
488
+ window.openModal = function (mode, idx) {
489
+ editIndex = mode === 'edit' ? idx : -1;
490
+ document.getElementById('modalTitle').textContent =
491
+ mode === 'edit' ? 'Edit Query' : 'Add Query';
492
+ if (mode === 'edit' && idx >= 0) {
493
+ var q = evalSet[idx];
494
+ document.getElementById('inputQuery').value = q.query || '';
495
+ document.getElementById('inputTrigger').value = q.should_trigger ? 'true' : 'false';
496
+ document.getElementById('inputReason').value = q.reason || '';
497
+ document.getElementById('inputCategory').value = q.category || '';
498
+ } else {
499
+ document.getElementById('inputQuery').value = '';
500
+ document.getElementById('inputTrigger').value = 'true';
501
+ document.getElementById('inputReason').value = '';
502
+ document.getElementById('inputCategory').value = '';
503
+ }
504
+ document.getElementById('modalOverlay').classList.add('open');
505
+ document.getElementById('inputQuery').focus();
506
+ };
507
+
508
+ window.closeModal = function () {
509
+ document.getElementById('modalOverlay').classList.remove('open');
510
+ editIndex = -1;
511
+ };
512
+
513
+ window.saveEntry = function () {
514
+ var query = document.getElementById('inputQuery').value.trim();
515
+ if (!query) {
516
+ alert('Query is required.');
517
+ return;
518
+ }
519
+ var entry = {
520
+ query: query,
521
+ should_trigger: document.getElementById('inputTrigger').value === 'true',
522
+ };
523
+ var reason = document.getElementById('inputReason').value.trim();
524
+ var category = document.getElementById('inputCategory').value.trim();
525
+ if (reason) entry.reason = reason;
526
+ if (category) entry.category = category;
527
+
528
+ if (editIndex >= 0) {
529
+ evalSet[editIndex] = entry;
530
+ } else {
531
+ evalSet.push(entry);
532
+ }
533
+ closeModal();
534
+ render();
535
+ };
536
+
537
+ window.deleteEntry = function (idx) {
538
+ if (!confirm('Delete this query?')) return;
539
+ evalSet.splice(idx, 1);
540
+ render();
541
+ };
542
+
543
+ // --- Download ---
544
+ window.downloadJSON = function () {
545
+ var out = {
546
+ skill_name: document.getElementById('skillName').textContent,
547
+ description: document.getElementById('skillDesc').textContent,
548
+ queries: evalSet,
549
+ };
550
+ var blob = new Blob([JSON.stringify(out, null, 2)], { type: 'application/json' });
551
+ var a = document.createElement('a');
552
+ a.href = URL.createObjectURL(blob);
553
+ a.download = 'eval_set.json';
554
+ a.click();
555
+ URL.revokeObjectURL(a.href);
556
+ };
557
+
558
+ // --- Keyboard ---
559
+ document.addEventListener('keydown', function (e) {
560
+ if (e.key === 'Escape') closeModal();
561
+ });
562
+
563
+ // --- Init ---
564
+ render();
565
+ })();
566
+ </script>
567
+ </body>
568
+ </html>
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: {{SKILL_NAME}}
3
+ description: TODO - describe when to use this skill with specific trigger phrases
4
+ ---
5
+
6
+ # {{SKILL_DISPLAY_NAME}}
7
+
8
+ ## Overview
9
+
10
+ TODO - one sentence describing what this skill does.
11
+
12
+ **Core principle:** TODO - the single most important rule.
13
+
14
+ **Iron Law:**
15
+ ```
16
+ TODO - the non-negotiable constraint
17
+ ```
18
+
19
+ ## When to Use
20
+
21
+ - TODO - specific situation 1
22
+ - TODO - specific situation 2
23
+
24
+ **Use this ESPECIALLY when:**
25
+ - TODO
26
+
27
+ ## When NOT to Use
28
+
29
+ - TODO - what this skill does NOT handle
30
+
31
+ ## The Process
32
+
33
+ ### Phase 1: TODO
34
+
35
+ TODO - step by step instructions
36
+
37
+ ### Phase 2: TODO
38
+
39
+ TODO
40
+
41
+ ## Additional resources
42
+
43
+ - For detailed reference, see [references/TODO.md](references/TODO.md)