@softspark/ai-toolkit 2.11.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/AGENTS.md +21 -21
  2. package/CHANGELOG.md +62 -0
  3. package/README.md +16 -9
  4. package/app/.claude-plugin/plugin.json +1 -1
  5. package/app/agents/meta-architect.md +44 -0
  6. package/app/skills/agent-creator/SKILL.md +22 -6
  7. package/app/skills/analyze/SKILL.md +21 -1
  8. package/app/skills/api-patterns/SKILL.md +27 -0
  9. package/app/skills/app-builder/SKILL.md +24 -0
  10. package/app/skills/architecture-audit/SKILL.md +24 -0
  11. package/app/skills/architecture-decision/SKILL.md +24 -0
  12. package/app/skills/biz-scan/SKILL.md +24 -0
  13. package/app/skills/brand-voice/SKILL.md +36 -0
  14. package/app/skills/briefing/SKILL.md +41 -1
  15. package/app/skills/build/SKILL.md +24 -1
  16. package/app/skills/chaos/SKILL.md +22 -1
  17. package/app/skills/ci/SKILL.md +22 -1
  18. package/app/skills/ci-cd-patterns/SKILL.md +25 -0
  19. package/app/skills/command-creator/SKILL.md +31 -2
  20. package/app/skills/content-moderation-patterns/SKILL.md +25 -0
  21. package/app/skills/database-patterns/SKILL.md +25 -0
  22. package/app/skills/debug/SKILL.md +23 -1
  23. package/app/skills/design-engineering/SKILL.md +25 -0
  24. package/app/skills/docker-devops/SKILL.md +26 -0
  25. package/app/skills/ecommerce-patterns/SKILL.md +26 -0
  26. package/app/skills/evaluate/SKILL.md +22 -1
  27. package/app/skills/evolve/SKILL.md +25 -0
  28. package/app/skills/explain/SKILL.md +26 -1
  29. package/app/skills/explore/SKILL.md +25 -0
  30. package/app/skills/fix/SKILL.md +26 -1
  31. package/app/skills/git-mastery/SKILL.md +26 -0
  32. package/app/skills/grill-me/SKILL.md +22 -7
  33. package/app/skills/health/SKILL.md +22 -1
  34. package/app/skills/hipaa-validate/SKILL.md +25 -8
  35. package/app/skills/hook-creator/SKILL.md +107 -14
  36. package/app/skills/index/SKILL.md +22 -1
  37. package/app/skills/instinct-review/SKILL.md +25 -1
  38. package/app/skills/introspect/SKILL.md +26 -1
  39. package/app/skills/lint/SKILL.md +27 -1
  40. package/app/skills/mcp-builder/SKILL.md +27 -0
  41. package/app/skills/mem-search/SKILL.md +40 -0
  42. package/app/skills/migrate/SKILL.md +27 -1
  43. package/app/skills/migration-patterns/SKILL.md +26 -0
  44. package/app/skills/night-watch/SKILL.md +22 -1
  45. package/app/skills/observability-patterns/SKILL.md +26 -0
  46. package/app/skills/onboard/SKILL.md +22 -1
  47. package/app/skills/panic/SKILL.md +21 -1
  48. package/app/skills/performance-profiling/SKILL.md +34 -0
  49. package/app/skills/persona/SKILL.md +21 -4
  50. package/app/skills/plan/SKILL.md +26 -0
  51. package/app/skills/plan-writing/SKILL.md +26 -0
  52. package/app/skills/plugin-creator/SKILL.md +23 -6
  53. package/app/skills/pr/SKILL.md +24 -1
  54. package/app/skills/prd-to-issues/SKILL.md +22 -6
  55. package/app/skills/prd-to-plan/SKILL.md +22 -4
  56. package/app/skills/predict/SKILL.md +25 -0
  57. package/app/skills/qa-session/SKILL.md +23 -7
  58. package/app/skills/rag-patterns/SKILL.md +26 -0
  59. package/app/skills/refactor/SKILL.md +26 -0
  60. package/app/skills/refactor-plan/SKILL.md +23 -6
  61. package/app/skills/rollback/SKILL.md +27 -1
  62. package/app/skills/security-patterns/SKILL.md +27 -0
  63. package/app/skills/skill-audit/SKILL.md +22 -5
  64. package/app/skills/skill-creator/SKILL.md +58 -13
  65. package/app/skills/swift-patterns/SKILL.md +27 -107
  66. package/app/skills/swift-patterns/reference/frameworks.md +111 -0
  67. package/app/skills/test/SKILL.md +23 -1
  68. package/app/skills/testing-patterns/SKILL.md +26 -0
  69. package/app/skills/triage-issue/SKILL.md +22 -4
  70. package/app/skills/ubiquitous-language/SKILL.md +23 -8
  71. package/benchmarks/ecosystem-doctor-snapshot.json +395 -0
  72. package/kb/history/completed/deep-coverage-v3-20260423.md +160 -0
  73. package/kb/history/completed/ecosystem-deep-sweep-20260423.md +273 -0
  74. package/kb/procedures/ecosystem-sync-sop.md +255 -0
  75. package/kb/procedures/maintenance-sop.md +13 -2
  76. package/kb/procedures/release-preparation-sop.md +91 -12
  77. package/kb/procedures/release-verification-sop.md +24 -6
  78. package/kb/reference/global-install-model.md +15 -2
  79. package/kb/reference/supported-tools-registry.md +229 -0
  80. package/llms-full.txt +1105 -43
  81. package/llms.txt +4 -0
  82. package/manifest.json +1 -1
  83. package/package.json +4 -1
  84. package/scripts/ecosystem_doctor.py +348 -0
  85. package/scripts/ecosystem_tools.json +500 -0
  86. package/scripts/evaluate_skills.py +84 -0
  87. package/scripts/generate_aider_conf.py +26 -1
  88. package/scripts/generate_antigravity.py +77 -8
  89. package/scripts/generate_augment_agents.py +161 -0
  90. package/scripts/generate_augment_commands.py +160 -0
  91. package/scripts/generate_augment_hooks.py +162 -0
  92. package/scripts/generate_augment_skills.py +98 -0
  93. package/scripts/generate_cline_rules.py +96 -9
  94. package/scripts/generate_codex_hooks.py +13 -2
  95. package/scripts/generate_codex_skills.py +195 -0
  96. package/scripts/generate_copilot.py +296 -18
  97. package/scripts/generate_cursor_agents.py +144 -0
  98. package/scripts/generate_cursor_hooks.py +155 -0
  99. package/scripts/generate_cursor_mdc.py +20 -8
  100. package/scripts/generate_gemini_commands.py +158 -0
  101. package/scripts/generate_gemini_hooks.py +159 -0
  102. package/scripts/generate_gemini_skills.py +98 -0
  103. package/scripts/generate_roo_modes.py +42 -1
  104. package/scripts/generate_windsurf_hooks.py +143 -0
  105. package/scripts/generate_windsurf_rules.py +162 -10
  106. package/scripts/install.py +11 -2
  107. package/scripts/install_steps/ai_tools.py +120 -5
  108. package/scripts/validate.py +20 -3
@@ -0,0 +1,500 @@
1
+ {
2
+ "schema_version": 1,
3
+ "description": "Authoritative registry of tools ai-toolkit integrates with. Consumed by scripts/ecosystem_doctor.py to detect upstream doc/version drift.",
4
+ "last_updated": "2026-04-23",
5
+ "tools": [
6
+ {
7
+ "id": "claude-code",
8
+ "display_name": "Claude Code",
9
+ "kind": "primary",
10
+ "urls": {
11
+ "docs": "https://platform.claude.com/docs/en/claude-code",
12
+ "release_notes": "https://github.com/anthropics/claude-code/releases",
13
+ "changelog": null
14
+ },
15
+ "config_paths": [
16
+ "~/.claude/settings.json",
17
+ ".claude/settings.local.json",
18
+ "CLAUDE.md",
19
+ ".claude/agents/*.md",
20
+ ".claude/skills/*/SKILL.md",
21
+ "~/.claude/themes/*.json"
22
+ ],
23
+ "our_generators": [],
24
+ "capability_markers": [
25
+ "PreToolUse",
26
+ "PostToolUse",
27
+ "SessionStart",
28
+ "SessionEnd",
29
+ "SubagentStart",
30
+ "SubagentStop",
31
+ "UserPromptSubmit",
32
+ "Notification",
33
+ "Stop",
34
+ "StopFailure",
35
+ "PreCompact",
36
+ "PostCompact",
37
+ "PermissionRequest",
38
+ "PermissionDenied",
39
+ "Elicitation",
40
+ "ElicitationResult",
41
+ "TaskCreated",
42
+ "TaskCompleted",
43
+ "TeammateIdle",
44
+ "WorktreeCreate",
45
+ "WorktreeRemove",
46
+ "CwdChanged",
47
+ "FileChanged",
48
+ "ConfigChange",
49
+ "Setup",
50
+ "InstructionsLoaded",
51
+ "slash command",
52
+ "MCP server",
53
+ "sub-agent",
54
+ "output style",
55
+ "SKILL.md",
56
+ "hook handler: command",
57
+ "hook handler: prompt",
58
+ "hook handler: agent",
59
+ "hook handler: mcp_tool"
60
+ ],
61
+ "version_probe": {
62
+ "kind": "command",
63
+ "command": "claude --version"
64
+ }
65
+ },
66
+ {
67
+ "id": "cursor",
68
+ "display_name": "Cursor",
69
+ "kind": "editor",
70
+ "urls": {
71
+ "docs": "https://cursor.com/docs",
72
+ "release_notes": "https://cursor.com/changelog",
73
+ "changelog": "https://cursor.com/changelog"
74
+ },
75
+ "config_paths": [
76
+ ".cursorrules",
77
+ ".cursor/rules/*.mdc",
78
+ ".cursor/rules/*.md",
79
+ "AGENTS.md",
80
+ ".cursor/mcp.json",
81
+ "~/.cursor/mcp.json",
82
+ ".cursor/skills/*/SKILL.md",
83
+ ".cursor/agents/*.md",
84
+ ".cursor/hooks.json",
85
+ "~/.cursor/hooks.json"
86
+ ],
87
+ "our_generators": [
88
+ "scripts/generate_cursor_rules.py",
89
+ "scripts/generate_cursor_mdc.py"
90
+ ],
91
+ "capability_markers": [
92
+ "cursorrules",
93
+ ".cursor/rules",
94
+ "AGENTS.md",
95
+ "mcp.json",
96
+ "Composer",
97
+ "Agent Mode",
98
+ "hooks.json",
99
+ "subagents",
100
+ "skills",
101
+ "plugins"
102
+ ],
103
+ "version_probe": null
104
+ },
105
+ {
106
+ "id": "windsurf",
107
+ "display_name": "Windsurf",
108
+ "kind": "editor",
109
+ "urls": {
110
+ "docs": "https://docs.windsurf.com",
111
+ "release_notes": "https://windsurf.com/changelog",
112
+ "changelog": "https://windsurf.com/changelog"
113
+ },
114
+ "config_paths": [
115
+ ".windsurfrules",
116
+ ".windsurf/rules/*.md",
117
+ ".windsurf/workflows/*.md",
118
+ "AGENTS.md",
119
+ "~/.codeium/windsurf/memories/global_rules.md",
120
+ "~/.codeium/windsurf/mcp_config.json",
121
+ "~/.codeium/windsurf/global_workflows/*.md"
122
+ ],
123
+ "our_generators": [
124
+ "scripts/generate_windsurf.py",
125
+ "scripts/generate_windsurf_rules.py"
126
+ ],
127
+ "capability_markers": [
128
+ "Cascade",
129
+ "windsurfrules",
130
+ "AGENTS.md",
131
+ "always_on",
132
+ "glob",
133
+ "model_decision",
134
+ "workflows",
135
+ "MCP",
136
+ "memories",
137
+ "hooks"
138
+ ],
139
+ "version_probe": null
140
+ },
141
+ {
142
+ "id": "github-copilot",
143
+ "display_name": "GitHub Copilot",
144
+ "kind": "editor",
145
+ "urls": {
146
+ "docs": "https://docs.github.com/en/copilot",
147
+ "release_notes": "https://github.blog/changelog/label/copilot/",
148
+ "changelog": null
149
+ },
150
+ "config_paths": [
151
+ ".github/copilot-instructions.md",
152
+ ".github/instructions/*.instructions.md",
153
+ ".github/prompts/*.prompt.md",
154
+ "AGENTS.md"
155
+ ],
156
+ "our_generators": [
157
+ "scripts/generate_copilot.py"
158
+ ],
159
+ "capability_markers": [
160
+ "copilot-instructions.md",
161
+ "Copilot Chat",
162
+ "Copilot Workspace",
163
+ "Copilot cloud agent",
164
+ "applyTo",
165
+ "custom agents",
166
+ "prompt files",
167
+ "instructions.md",
168
+ "MCP"
169
+ ],
170
+ "version_probe": null
171
+ },
172
+ {
173
+ "id": "gemini-cli",
174
+ "display_name": "Gemini CLI",
175
+ "kind": "editor",
176
+ "urls": {
177
+ "docs": "https://github.com/google-gemini/gemini-cli/tree/main/docs",
178
+ "release_notes": "https://github.com/google-gemini/gemini-cli/releases",
179
+ "changelog": null
180
+ },
181
+ "config_paths": [
182
+ "GEMINI.md",
183
+ ".gemini/settings.json",
184
+ "~/.gemini/settings.json",
185
+ ".gemini/commands/*.toml",
186
+ ".gemini/skills/*/SKILL.md",
187
+ ".agents/skills/*/SKILL.md",
188
+ "~/.gemini/skills/*/SKILL.md",
189
+ ".gemini/extensions/gemini-extension.json"
190
+ ],
191
+ "our_generators": [
192
+ "scripts/generate_gemini.py"
193
+ ],
194
+ "capability_markers": [
195
+ "GEMINI.md",
196
+ "mcpServers",
197
+ "tools",
198
+ "settings.json",
199
+ "BeforeTool",
200
+ "AfterTool",
201
+ "BeforeAgent",
202
+ "AfterAgent",
203
+ "BeforeModel",
204
+ "SessionStart",
205
+ "SessionEnd",
206
+ "Stop",
207
+ "SKILL.md",
208
+ "activate_skill",
209
+ "custom commands",
210
+ "gemini-extension.json"
211
+ ],
212
+ "version_probe": {
213
+ "kind": "command",
214
+ "command": "gemini --version"
215
+ }
216
+ },
217
+ {
218
+ "id": "cline",
219
+ "display_name": "Cline",
220
+ "kind": "editor",
221
+ "urls": {
222
+ "docs": "https://docs.cline.bot",
223
+ "release_notes": "https://github.com/cline/cline/releases",
224
+ "changelog": null
225
+ },
226
+ "config_paths": [
227
+ ".clinerules/*.md",
228
+ ".clinerules/workflows/*.md",
229
+ ".clinerules/hooks/",
230
+ ".cline/skills/",
231
+ "~/.cline/data/settings/cline_mcp_settings.json",
232
+ "~/Documents/Cline/Rules/"
233
+ ],
234
+ "our_generators": [
235
+ "scripts/generate_cline.py",
236
+ "scripts/generate_cline_rules.py"
237
+ ],
238
+ "capability_markers": [
239
+ "clinerules",
240
+ "Plan Mode",
241
+ "Act Mode",
242
+ "MCP",
243
+ "custom modes",
244
+ "workflows",
245
+ "hooks",
246
+ "skills",
247
+ "subagents",
248
+ "conditional rules"
249
+ ],
250
+ "version_probe": null
251
+ },
252
+ {
253
+ "id": "roo-code",
254
+ "display_name": "Roo Code",
255
+ "kind": "editor",
256
+ "urls": {
257
+ "docs": "https://docs.roocode.com",
258
+ "release_notes": "https://github.com/RooCodeInc/Roo-Code/releases",
259
+ "changelog": null
260
+ },
261
+ "config_paths": [
262
+ ".roomodes",
263
+ ".roo/rules/*.md",
264
+ ".roo/rules-{slug}/*.md",
265
+ ".roo/mcp.json",
266
+ "~/.roo/rules/",
267
+ "~/.roo/settings/custom_modes.yaml",
268
+ "~/.roo/settings/mcp_settings.json"
269
+ ],
270
+ "our_generators": [
271
+ "scripts/generate_roo_modes.py",
272
+ "scripts/generate_roo_rules.py"
273
+ ],
274
+ "capability_markers": [
275
+ "roomodes",
276
+ "custom modes",
277
+ "Code Actions",
278
+ "MCP",
279
+ "Orchestrator mode",
280
+ "whenToUse",
281
+ "description",
282
+ "roleDefinition",
283
+ "groups"
284
+ ],
285
+ "version_probe": null
286
+ },
287
+ {
288
+ "id": "aider",
289
+ "display_name": "Aider",
290
+ "kind": "editor",
291
+ "urls": {
292
+ "docs": "https://aider.chat/docs",
293
+ "release_notes": "https://aider.chat/HISTORY.html",
294
+ "changelog": "https://aider.chat/HISTORY.html"
295
+ },
296
+ "config_paths": [
297
+ ".aider.conf.yml",
298
+ "CONVENTIONS.md",
299
+ "~/.aider.conf.yml"
300
+ ],
301
+ "our_generators": [
302
+ "scripts/generate_aider_conf.py",
303
+ "scripts/generate_conventions.py"
304
+ ],
305
+ "capability_markers": [
306
+ ".aider.conf.yml",
307
+ "CONVENTIONS.md",
308
+ "architect",
309
+ "auto-accept-architect",
310
+ "read",
311
+ "lint-cmd",
312
+ "test-cmd",
313
+ "commit-prompt",
314
+ "attribute-co-authored-by",
315
+ "chat-language",
316
+ "commit-language",
317
+ "watch-files",
318
+ "auto-commits"
319
+ ],
320
+ "version_probe": {
321
+ "kind": "command",
322
+ "command": "aider --version"
323
+ }
324
+ },
325
+ {
326
+ "id": "augment",
327
+ "display_name": "Augment",
328
+ "kind": "editor",
329
+ "urls": {
330
+ "docs": "https://docs.augmentcode.com",
331
+ "release_notes": "https://www.augmentcode.com/changelog",
332
+ "changelog": null
333
+ },
334
+ "config_paths": [
335
+ ".augment/rules/*.md",
336
+ ".augment/guidelines.md",
337
+ ".augment/agents/*.md",
338
+ ".augment/commands/*.md",
339
+ ".augment/skills/*/SKILL.md",
340
+ "~/.augment/rules/*.md",
341
+ "~/.augment/agents/*.md",
342
+ "~/.augment/commands/*.md",
343
+ "~/.augment/settings.json",
344
+ "/etc/augment/settings.json"
345
+ ],
346
+ "our_generators": [
347
+ "scripts/generate_augment.py",
348
+ "scripts/generate_augment_rules.py"
349
+ ],
350
+ "capability_markers": [
351
+ ".augment",
352
+ "Agent mode",
353
+ "Next Edit",
354
+ "MCP",
355
+ "context engine",
356
+ "Auggie CLI",
357
+ "always_apply",
358
+ "agent_requested",
359
+ "subagents",
360
+ "custom commands",
361
+ "SKILL.md",
362
+ "PreToolUse",
363
+ "PostToolUse",
364
+ "SessionStart",
365
+ "SessionEnd",
366
+ "Stop",
367
+ "ACP Mode"
368
+ ],
369
+ "version_probe": null
370
+ },
371
+ {
372
+ "id": "google-antigravity",
373
+ "display_name": "Google Antigravity",
374
+ "kind": "editor",
375
+ "urls": {
376
+ "docs": "https://antigravity.google/docs",
377
+ "release_notes": "https://antigravity.google/changelog",
378
+ "changelog": null
379
+ },
380
+ "config_paths": [
381
+ ".agent/rules/*.md",
382
+ ".agent/workflows/*.md",
383
+ ".agent/skills/*/SKILL.md",
384
+ "AGENTS.md",
385
+ "GEMINI.md"
386
+ ],
387
+ "our_generators": [
388
+ "scripts/generate_antigravity.py"
389
+ ],
390
+ "capability_markers": [
391
+ "Antigravity",
392
+ "agent manager",
393
+ "artifacts",
394
+ "MCP",
395
+ "workflows",
396
+ "rules",
397
+ "skills",
398
+ "AGENTS.md",
399
+ "GEMINI.md",
400
+ "agent permissions"
401
+ ],
402
+ "version_probe": null
403
+ },
404
+ {
405
+ "id": "codex-cli",
406
+ "display_name": "Codex CLI",
407
+ "kind": "editor",
408
+ "urls": {
409
+ "docs": "https://github.com/openai/codex",
410
+ "release_notes": "https://github.com/openai/codex/releases",
411
+ "changelog": null
412
+ },
413
+ "config_paths": [
414
+ "AGENTS.md",
415
+ ".agents/rules/*.md",
416
+ ".codex/hooks.json",
417
+ ".codex/skills/*/SKILL.md",
418
+ "~/.codex/config.toml"
419
+ ],
420
+ "our_generators": [
421
+ "scripts/generate_codex.py",
422
+ "scripts/generate_codex_rules.py",
423
+ "scripts/generate_codex_hooks.py"
424
+ ],
425
+ "capability_markers": [
426
+ "AGENTS.md",
427
+ "config.toml",
428
+ "mcp_servers",
429
+ "hooks",
430
+ "sandbox",
431
+ "hook event: PreToolUse",
432
+ "hook event: PostToolUse",
433
+ "hook event: SessionStart",
434
+ "hook event: UserPromptSubmit",
435
+ "hook event: Stop",
436
+ "hook event: PermissionRequest",
437
+ "hook handler: command",
438
+ "hook handler: prompt",
439
+ "hook handler: agent",
440
+ ".codex/skills"
441
+ ],
442
+ "version_probe": {
443
+ "kind": "command",
444
+ "command": "codex --version"
445
+ }
446
+ },
447
+ {
448
+ "id": "opencode",
449
+ "display_name": "opencode",
450
+ "kind": "editor",
451
+ "urls": {
452
+ "docs": "https://opencode.ai/docs",
453
+ "release_notes": "https://github.com/sst/opencode/releases",
454
+ "changelog": null
455
+ },
456
+ "config_paths": [
457
+ "opencode.json",
458
+ ".opencode/agents/*.md",
459
+ ".opencode/commands/*.md",
460
+ ".opencode/plugins/*",
461
+ ".opencode/skills/*/SKILL.md",
462
+ "AGENTS.md",
463
+ ".claude/skills/*/SKILL.md"
464
+ ],
465
+ "our_generators": [
466
+ "scripts/generate_opencode.py",
467
+ "scripts/generate_opencode_agents.py",
468
+ "scripts/generate_opencode_commands.py",
469
+ "scripts/generate_opencode_json.py",
470
+ "scripts/generate_opencode_plugin.py"
471
+ ],
472
+ "capability_markers": [
473
+ "opencode.json",
474
+ "agents",
475
+ "commands",
476
+ "plugins",
477
+ "MCP",
478
+ "rules",
479
+ "AGENTS.md",
480
+ "skills (native .opencode/skills)",
481
+ "skills (via .claude/skills fallback)",
482
+ "permission.skill",
483
+ "subagent mode",
484
+ "primary mode",
485
+ "plugin event: session.created",
486
+ "plugin event: session.compacted",
487
+ "plugin event: session.deleted",
488
+ "plugin event: tool.execute.before",
489
+ "plugin event: tool.execute.after",
490
+ "plugin event: permission.asked",
491
+ "plugin event: command.executed",
492
+ "plugin event: message.updated"
493
+ ],
494
+ "version_probe": {
495
+ "kind": "command",
496
+ "command": "opencode --version"
497
+ }
498
+ }
499
+ ]
500
+ }
@@ -212,6 +212,80 @@ def _collect_quality_metrics() -> tuple[int, int, int, int, int, int]:
212
212
  return ref_count, tmpl_count, inject_count, over500, depends_count, orphan_deps
213
213
 
214
214
 
215
+ def _meta_architect_audit() -> tuple[dict[int, int], list[tuple[str, int, list[str]]]]:
216
+ """Score each skill against the 5 meta-architect binary criteria.
217
+
218
+ Criteria (all binary yes=pass):
219
+ description : frontmatter description is >= 50 chars and not generic
220
+ example : SKILL.md contains at least one fenced code block or an
221
+ '## Example' heading
222
+ constraint : SKILL.md uses at least one of MUST / NEVER / CRITICAL /
223
+ MANDATORY / REQUIRED / DO NOT as an uppercase marker
224
+ edge_case : SKILL.md mentions edge cases, failure modes, fallbacks,
225
+ or when NOT to use the skill
226
+ length : SKILL.md is under 500 lines
227
+
228
+ Returns:
229
+ (score_distribution, weak_skills) where
230
+ score_distribution maps score -> count of skills,
231
+ weak_skills is a list of (name, score, failed_criteria) for score <= 3.
232
+ """
233
+ score_dist: dict[int, int] = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
234
+ weak: list[tuple[str, int, list[str]]] = []
235
+
236
+ desc_generic = {"tbd", "todo", "fixme", "placeholder"}
237
+ constraint_re = re.compile(r"\b(MUST|NEVER|CRITICAL|MANDATORY|REQUIRED|DO NOT)\b")
238
+ edge_re = re.compile(
239
+ r"(?i)\b(edge case|edge-case|corner case|failure mode|when not to|"
240
+ r"do not use for|fallback|error handling|limitations?)\b"
241
+ )
242
+ example_heading_re = re.compile(
243
+ r"(?im)^##+\s*(example|examples|usage|worked example)"
244
+ )
245
+
246
+ for sf in sorted(skills_dir.glob("*/SKILL.md")):
247
+ text = sf.read_text(encoding="utf-8")
248
+ fm = frontmatter_block(sf)
249
+ desc = _fm_value(fm, "description")
250
+ line_count = text.count("\n") + (1 if text and not text.endswith("\n") else 0)
251
+
252
+ passed: list[str] = []
253
+ failed: list[str] = []
254
+
255
+ if len(desc) >= 50 and not any(g in desc.lower() for g in desc_generic):
256
+ passed.append("description")
257
+ else:
258
+ failed.append("description")
259
+
260
+ if re.search(r"^```", text, re.M) or example_heading_re.search(text):
261
+ passed.append("example")
262
+ else:
263
+ failed.append("example")
264
+
265
+ if constraint_re.search(text):
266
+ passed.append("constraint")
267
+ else:
268
+ failed.append("constraint")
269
+
270
+ if edge_re.search(text):
271
+ passed.append("edge_case")
272
+ else:
273
+ failed.append("edge_case")
274
+
275
+ if line_count < 500:
276
+ passed.append("length")
277
+ else:
278
+ failed.append("length")
279
+
280
+ score = len(passed)
281
+ score_dist[score] = score_dist.get(score, 0) + 1
282
+ if score <= 3:
283
+ weak.append((sf.parent.name, score, failed))
284
+
285
+ weak.sort(key=lambda r: (r[1], r[0]))
286
+ return score_dist, weak
287
+
288
+
215
289
  def main() -> None:
216
290
  """Run evaluation across all skills and print report."""
217
291
  print("AI Toolkit Skill Evaluation")
@@ -249,6 +323,16 @@ def main() -> None:
249
323
  print(f" Orphan dependencies: {orphan_deps}")
250
324
  print()
251
325
 
326
+ score_dist, weak = _meta_architect_audit()
327
+ print("Meta-Architect Audit (advisory, non-failing):")
328
+ print(f" Score distribution (of 5): {dict(sorted(score_dist.items()))}")
329
+ print(f" Skills scoring <= 3: {len(weak)}")
330
+ if weak:
331
+ print(" Bottom 10 (score, name, failed criteria):")
332
+ for name, score, failed in weak[:10]:
333
+ print(f" {score}/5 {name:<28} {','.join(failed)}")
334
+ print()
335
+
252
336
  if fail_count > 0:
253
337
  print("EVALUATION: ISSUES FOUND")
254
338
  sys.exit(1)
@@ -17,9 +17,13 @@ def main() -> None:
17
17
  default_model = DEFAULT_CLAUDE_MODELS["sonnet"]
18
18
  print("# Aider configuration generated by ai-toolkit")
19
19
  print("# Regenerate using: ai-toolkit install --local")
20
+ print("# Aider docs: https://aider.chat/docs/config/aider_conf.html")
20
21
  print()
21
22
  print("# Use the architect mode for complex tasks, aligned with our 2-phase workflow")
22
23
  print("architect: true")
24
+ print("# Auto-accept architect proposals (default: true in aider >=0.82). Set to false")
25
+ print("# if you want to approve every architect-mode edit manually.")
26
+ print("auto-accept-architect: true")
23
27
  print()
24
28
  print("# Read project rules (loaded as read-only context)")
25
29
  print("read:")
@@ -36,16 +40,37 @@ def main() -> None:
36
40
  print(' - "php: ./vendor/bin/phpstan analyse"')
37
41
  print(' - "go: go vet"')
38
42
  print()
43
+ print("# Test commands (uncomment and customize per project). aider >=0.80 supports a")
44
+ print("# single `test-cmd`; run with `--test` or enable `auto-test: true` to run after edits.")
45
+ print("# test-cmd: pytest -q")
46
+ print("# auto-test: false")
47
+ print()
39
48
  print("# Model configuration")
40
49
  print(f"model: {default_model}")
41
50
  print(f"editor-model: {default_model}")
42
51
  print()
43
52
  print("# Auto-commit message formatting (matches our conventional commits)")
44
53
  print(
45
- 'commit_prompt: "Write a short, concise commit message following'
54
+ 'commit-prompt: "Write a short, concise commit message following'
46
55
  ' Conventional Commits (feat/fix/chore/docs/test/refactor)."'
47
56
  )
48
57
  print()
58
+ print("# Git attribution (ai-toolkit policy: no AI co-authorship in commits).")
59
+ print("# Do not flip this to true -- conflicts with the toolkit git-workflow rule")
60
+ print("# (see app/rules/common/git-workflow.md).")
61
+ print("attribute-co-authored-by: false")
62
+ print("attribute-commit-message-author: false")
63
+ print("attribute-commit-message-committer: false")
64
+ print()
65
+ print("# Language settings (aider >=0.83 `commit-language`, >=0.85 confirmed stable).")
66
+ print("# Leave unset to inherit the user's system locale. Uncomment to pin.")
67
+ print("# chat-language: en")
68
+ print("# commit-language: en")
69
+ print()
70
+ print("# Watch-files mode scans for `# AI!` / `# ai?` comments (aider >=0.75). Opt-in")
71
+ print("# because it changes how aider reads your editor buffers.")
72
+ print("# watch-files: false")
73
+ print()
49
74
  print("# Disable auto-commits if you prefer using the /commit slash skill explicitly")
50
75
  print("# auto-commits: false")
51
76
  print()