@heytherevibin/skillforge 0.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.
Files changed (402) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CODE_OF_CONDUCT.md +34 -0
  3. package/CONTRIBUTING.md +38 -0
  4. package/LICENSE +21 -0
  5. package/README.md +337 -0
  6. package/RELEASING.md +93 -0
  7. package/SECURITY.md +31 -0
  8. package/STRATEGY.md +26 -0
  9. package/bin/cli.js +547 -0
  10. package/lib/packs.js +184 -0
  11. package/package.json +38 -0
  12. package/python/app/__init__.py +0 -0
  13. package/python/app/__pycache__/__init__.cpython-312.pyc +0 -0
  14. package/python/app/__pycache__/auth.cpython-312.pyc +0 -0
  15. package/python/app/__pycache__/main.cpython-312.pyc +0 -0
  16. package/python/app/auth.py +63 -0
  17. package/python/app/cli.py +78 -0
  18. package/python/app/db_paths.py +26 -0
  19. package/python/app/events_cli.py +175 -0
  20. package/python/app/main.py +647 -0
  21. package/python/app/materialize.py +138 -0
  22. package/python/app/mcp_server.py +610 -0
  23. package/python/app/route_cli.py +117 -0
  24. package/python/requirements-dev.txt +1 -0
  25. package/python/requirements.txt +7 -0
  26. package/python/tests/test_db_paths.py +41 -0
  27. package/skills/accessibility/SKILL.md +145 -0
  28. package/skills/agent-architecture-audit/SKILL.md +256 -0
  29. package/skills/agent-eval/SKILL.md +144 -0
  30. package/skills/agent-harness-construction/SKILL.md +72 -0
  31. package/skills/agent-introspection-debugging/SKILL.md +152 -0
  32. package/skills/agent-payment-x402/SKILL.md +224 -0
  33. package/skills/agent-sort/SKILL.md +214 -0
  34. package/skills/agentic-engineering/SKILL.md +62 -0
  35. package/skills/agentic-os/SKILL.md +386 -0
  36. package/skills/ai-first-engineering/SKILL.md +50 -0
  37. package/skills/ai-regression-testing/SKILL.md +384 -0
  38. package/skills/android-clean-architecture/SKILL.md +338 -0
  39. package/skills/angular-developer/SKILL.md +153 -0
  40. package/skills/angular-developer/references/angular-animations.md +160 -0
  41. package/skills/angular-developer/references/angular-aria.md +410 -0
  42. package/skills/angular-developer/references/cli.md +86 -0
  43. package/skills/angular-developer/references/component-harnesses.md +59 -0
  44. package/skills/angular-developer/references/component-styling.md +91 -0
  45. package/skills/angular-developer/references/components.md +117 -0
  46. package/skills/angular-developer/references/creating-services.md +97 -0
  47. package/skills/angular-developer/references/data-resolvers.md +69 -0
  48. package/skills/angular-developer/references/define-routes.md +67 -0
  49. package/skills/angular-developer/references/defining-providers.md +72 -0
  50. package/skills/angular-developer/references/di-fundamentals.md +120 -0
  51. package/skills/angular-developer/references/e2e-testing.md +56 -0
  52. package/skills/angular-developer/references/effects.md +83 -0
  53. package/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  54. package/skills/angular-developer/references/host-elements.md +80 -0
  55. package/skills/angular-developer/references/injection-context.md +63 -0
  56. package/skills/angular-developer/references/inputs.md +101 -0
  57. package/skills/angular-developer/references/linked-signal.md +59 -0
  58. package/skills/angular-developer/references/loading-strategies.md +61 -0
  59. package/skills/angular-developer/references/mcp.md +108 -0
  60. package/skills/angular-developer/references/navigate-to-routes.md +69 -0
  61. package/skills/angular-developer/references/outputs.md +86 -0
  62. package/skills/angular-developer/references/reactive-forms.md +122 -0
  63. package/skills/angular-developer/references/rendering-strategies.md +44 -0
  64. package/skills/angular-developer/references/resource.md +77 -0
  65. package/skills/angular-developer/references/route-animations.md +56 -0
  66. package/skills/angular-developer/references/route-guards.md +52 -0
  67. package/skills/angular-developer/references/router-lifecycle.md +45 -0
  68. package/skills/angular-developer/references/router-testing.md +87 -0
  69. package/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  70. package/skills/angular-developer/references/signal-forms.md +795 -0
  71. package/skills/angular-developer/references/signals-overview.md +94 -0
  72. package/skills/angular-developer/references/tailwind-css.md +69 -0
  73. package/skills/angular-developer/references/template-driven-forms.md +114 -0
  74. package/skills/angular-developer/references/testing-fundamentals.md +65 -0
  75. package/skills/api-connector-builder/SKILL.md +120 -0
  76. package/skills/api-design/SKILL.md +522 -0
  77. package/skills/architecture-decision-records/SKILL.md +178 -0
  78. package/skills/article-writing/SKILL.md +78 -0
  79. package/skills/automation-audit-ops/SKILL.md +141 -0
  80. package/skills/autonomous-agent-harness/SKILL.md +272 -0
  81. package/skills/autonomous-loops/SKILL.md +609 -0
  82. package/skills/backend-patterns/SKILL.md +560 -0
  83. package/skills/benchmark/SKILL.md +92 -0
  84. package/skills/blueprint/SKILL.md +104 -0
  85. package/skills/browser-qa/SKILL.md +86 -0
  86. package/skills/bun-runtime/SKILL.md +83 -0
  87. package/skills/canary-watch/SKILL.md +98 -0
  88. package/skills/carrier-relationship-management/SKILL.md +211 -0
  89. package/skills/cisco-ios-patterns/SKILL.md +163 -0
  90. package/skills/ck/SKILL.md +147 -0
  91. package/skills/ck/commands/forget.mjs +44 -0
  92. package/skills/ck/commands/info.mjs +24 -0
  93. package/skills/ck/commands/init.mjs +143 -0
  94. package/skills/ck/commands/list.mjs +40 -0
  95. package/skills/ck/commands/migrate.mjs +202 -0
  96. package/skills/ck/commands/resume.mjs +36 -0
  97. package/skills/ck/commands/save.mjs +210 -0
  98. package/skills/ck/commands/shared.mjs +387 -0
  99. package/skills/ck/hooks/session-start.mjs +224 -0
  100. package/skills/claude-devfleet/SKILL.md +103 -0
  101. package/skills/click-path-audit/SKILL.md +244 -0
  102. package/skills/clickhouse-io/SKILL.md +438 -0
  103. package/skills/code-tour/SKILL.md +235 -0
  104. package/skills/codebase-onboarding/SKILL.md +232 -0
  105. package/skills/coding-standards/SKILL.md +548 -0
  106. package/skills/compose-multiplatform-patterns/SKILL.md +298 -0
  107. package/skills/connections-optimizer/SKILL.md +188 -0
  108. package/skills/content-engine/SKILL.md +126 -0
  109. package/skills/content-hash-cache-pattern/SKILL.md +160 -0
  110. package/skills/context-budget/SKILL.md +134 -0
  111. package/skills/continuous-agent-loop/SKILL.md +44 -0
  112. package/skills/continuous-learning/SKILL.md +129 -0
  113. package/skills/continuous-learning/config.json +18 -0
  114. package/skills/continuous-learning/evaluate-session.sh +69 -0
  115. package/skills/continuous-learning-v2/SKILL.md +358 -0
  116. package/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
  117. package/skills/continuous-learning-v2/agents/observer.md +198 -0
  118. package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  119. package/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  120. package/skills/continuous-learning-v2/config.json +8 -0
  121. package/skills/continuous-learning-v2/hooks/observe.sh +476 -0
  122. package/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
  123. package/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
  124. package/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  125. package/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  126. package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
  127. package/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
  128. package/skills/cost-tracking/SKILL.md +147 -0
  129. package/skills/council/SKILL.md +202 -0
  130. package/skills/cpp-coding-standards/SKILL.md +722 -0
  131. package/skills/cpp-testing/SKILL.md +323 -0
  132. package/skills/crosspost/SKILL.md +110 -0
  133. package/skills/csharp-testing/SKILL.md +320 -0
  134. package/skills/customer-billing-ops/SKILL.md +139 -0
  135. package/skills/customs-trade-compliance/SKILL.md +262 -0
  136. package/skills/dart-flutter-patterns/SKILL.md +562 -0
  137. package/skills/dashboard-builder/SKILL.md +108 -0
  138. package/skills/data-scraper-agent/SKILL.md +764 -0
  139. package/skills/database-migrations/SKILL.md +428 -0
  140. package/skills/deep-research/SKILL.md +158 -0
  141. package/skills/defi-amm-security/SKILL.md +166 -0
  142. package/skills/deployment-patterns/SKILL.md +426 -0
  143. package/skills/design-system/SKILL.md +81 -0
  144. package/skills/django-celery/SKILL.md +456 -0
  145. package/skills/django-patterns/SKILL.md +733 -0
  146. package/skills/django-security/SKILL.md +592 -0
  147. package/skills/django-tdd/SKILL.md +728 -0
  148. package/skills/django-verification/SKILL.md +468 -0
  149. package/skills/dmux-workflows/SKILL.md +190 -0
  150. package/skills/docker-patterns/SKILL.md +363 -0
  151. package/skills/documentation-lookup/SKILL.md +89 -0
  152. package/skills/dotnet-patterns/SKILL.md +320 -0
  153. package/skills/e2e-testing/SKILL.md +325 -0
  154. package/skills/email-ops/SKILL.md +120 -0
  155. package/skills/energy-procurement/SKILL.md +227 -0
  156. package/skills/enterprise-agent-ops/SKILL.md +49 -0
  157. package/skills/error-handling/SKILL.md +375 -0
  158. package/skills/eval-harness/SKILL.md +269 -0
  159. package/skills/evm-token-decimals/SKILL.md +130 -0
  160. package/skills/exa-search/SKILL.md +106 -0
  161. package/skills/fal-ai-media/SKILL.md +287 -0
  162. package/skills/fastapi-patterns/SKILL.md +327 -0
  163. package/skills/finance-billing-ops/SKILL.md +126 -0
  164. package/skills/flox-environments/SKILL.md +496 -0
  165. package/skills/flutter-dart-code-review/SKILL.md +434 -0
  166. package/skills/foundation-models-on-device/SKILL.md +243 -0
  167. package/skills/frontend-design-direction/SKILL.md +92 -0
  168. package/skills/frontend-patterns/SKILL.md +641 -0
  169. package/skills/frontend-slides/SKILL.md +183 -0
  170. package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  171. package/skills/frontend-slides/animation-patterns.md +122 -0
  172. package/skills/frontend-slides/html-template.md +419 -0
  173. package/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  174. package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  175. package/skills/frontend-slides/viewport-base.css +153 -0
  176. package/skills/fsharp-testing/SKILL.md +279 -0
  177. package/skills/gan-style-harness/SKILL.md +278 -0
  178. package/skills/gateguard/SKILL.md +125 -0
  179. package/skills/git-workflow/SKILL.md +714 -0
  180. package/skills/github-ops/SKILL.md +143 -0
  181. package/skills/golang-patterns/SKILL.md +673 -0
  182. package/skills/golang-testing/SKILL.md +719 -0
  183. package/skills/google-workspace-ops/SKILL.md +94 -0
  184. package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  185. package/skills/healthcare-emr-patterns/SKILL.md +159 -0
  186. package/skills/healthcare-eval-harness/SKILL.md +207 -0
  187. package/skills/healthcare-phi-compliance/SKILL.md +145 -0
  188. package/skills/hermes-imports/SKILL.md +87 -0
  189. package/skills/hexagonal-architecture/SKILL.md +275 -0
  190. package/skills/hipaa-compliance/SKILL.md +78 -0
  191. package/skills/homelab-network-readiness/SKILL.md +169 -0
  192. package/skills/homelab-network-setup/SKILL.md +129 -0
  193. package/skills/homelab-pihole-dns/SKILL.md +274 -0
  194. package/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  195. package/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  196. package/skills/hookify-rules/SKILL.md +128 -0
  197. package/skills/inventory-demand-planning/SKILL.md +246 -0
  198. package/skills/investor-materials/SKILL.md +95 -0
  199. package/skills/investor-outreach/SKILL.md +90 -0
  200. package/skills/ios-icon-gen/SKILL.md +157 -0
  201. package/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  202. package/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  203. package/skills/iterative-retrieval/SKILL.md +209 -0
  204. package/skills/java-coding-standards/SKILL.md +382 -0
  205. package/skills/jira-integration/SKILL.md +292 -0
  206. package/skills/jpa-patterns/SKILL.md +150 -0
  207. package/skills/knowledge-ops/SKILL.md +153 -0
  208. package/skills/kotlin-coroutines-flows/SKILL.md +283 -0
  209. package/skills/kotlin-exposed-patterns/SKILL.md +718 -0
  210. package/skills/kotlin-ktor-patterns/SKILL.md +688 -0
  211. package/skills/kotlin-patterns/SKILL.md +710 -0
  212. package/skills/kotlin-testing/SKILL.md +823 -0
  213. package/skills/laravel-patterns/SKILL.md +414 -0
  214. package/skills/laravel-plugin-discovery/SKILL.md +228 -0
  215. package/skills/laravel-security/SKILL.md +284 -0
  216. package/skills/laravel-tdd/SKILL.md +282 -0
  217. package/skills/laravel-verification/SKILL.md +178 -0
  218. package/skills/lead-intelligence/SKILL.md +320 -0
  219. package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  220. package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  221. package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  222. package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  223. package/skills/liquid-glass-design/SKILL.md +279 -0
  224. package/skills/llm-trading-agent-security/SKILL.md +146 -0
  225. package/skills/logistics-exception-management/SKILL.md +221 -0
  226. package/skills/make-interfaces-feel-better/SKILL.md +151 -0
  227. package/skills/manim-video/SKILL.md +88 -0
  228. package/skills/manim-video/assets/network_graph_scene.py +52 -0
  229. package/skills/market-research/SKILL.md +74 -0
  230. package/skills/mcp-server-patterns/SKILL.md +68 -0
  231. package/skills/messages-ops/SKILL.md +103 -0
  232. package/skills/mle-workflow/SKILL.md +345 -0
  233. package/skills/motion-advanced/SKILL.md +596 -0
  234. package/skills/motion-foundations/SKILL.md +299 -0
  235. package/skills/motion-patterns/SKILL.md +435 -0
  236. package/skills/motion-ui/SKILL.md +574 -0
  237. package/skills/mysql-patterns/SKILL.md +411 -0
  238. package/skills/nanoclaw-repl/SKILL.md +32 -0
  239. package/skills/nestjs-patterns/SKILL.md +229 -0
  240. package/skills/netmiko-ssh-automation/SKILL.md +173 -0
  241. package/skills/network-bgp-diagnostics/SKILL.md +167 -0
  242. package/skills/network-config-validation/SKILL.md +210 -0
  243. package/skills/network-interface-health/SKILL.md +152 -0
  244. package/skills/nextjs-turbopack/SKILL.md +43 -0
  245. package/skills/nodejs-keccak256/SKILL.md +102 -0
  246. package/skills/nutrient-document-processing/SKILL.md +166 -0
  247. package/skills/nuxt4-patterns/SKILL.md +99 -0
  248. package/skills/openclaw-persona-forge/SKILL.md +288 -0
  249. package/skills/openclaw-persona-forge/gacha.py +224 -0
  250. package/skills/openclaw-persona-forge/gacha.sh +5 -0
  251. package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  252. package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  253. package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  254. package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  255. package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  256. package/skills/openclaw-persona-forge/references/output-template.md +166 -0
  257. package/skills/opensource-pipeline/SKILL.md +254 -0
  258. package/skills/perl-patterns/SKILL.md +503 -0
  259. package/skills/perl-security/SKILL.md +502 -0
  260. package/skills/perl-testing/SKILL.md +474 -0
  261. package/skills/plan-orchestrate/SKILL.md +253 -0
  262. package/skills/plankton-code-quality/SKILL.md +236 -0
  263. package/skills/postgres-patterns/SKILL.md +146 -0
  264. package/skills/product-capability/SKILL.md +140 -0
  265. package/skills/product-lens/SKILL.md +91 -0
  266. package/skills/production-audit/SKILL.md +206 -0
  267. package/skills/production-scheduling/SKILL.md +237 -0
  268. package/skills/project-flow-ops/SKILL.md +110 -0
  269. package/skills/prompt-optimizer/SKILL.md +398 -0
  270. package/skills/python-patterns/SKILL.md +749 -0
  271. package/skills/python-testing/SKILL.md +815 -0
  272. package/skills/pytorch-patterns/SKILL.md +395 -0
  273. package/skills/quality-nonconformance/SKILL.md +259 -0
  274. package/skills/quarkus-patterns/SKILL.md +721 -0
  275. package/skills/quarkus-security/SKILL.md +466 -0
  276. package/skills/quarkus-tdd/SKILL.md +810 -0
  277. package/skills/quarkus-verification/SKILL.md +478 -0
  278. package/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
  279. package/skills/redis-patterns/SKILL.md +402 -0
  280. package/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
  281. package/skills/remotion-video-creation/SKILL.md +43 -0
  282. package/skills/remotion-video-creation/rules/3d.md +86 -0
  283. package/skills/remotion-video-creation/rules/animations.md +29 -0
  284. package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  285. package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  286. package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  287. package/skills/remotion-video-creation/rules/assets.md +78 -0
  288. package/skills/remotion-video-creation/rules/audio.md +172 -0
  289. package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  290. package/skills/remotion-video-creation/rules/can-decode.md +75 -0
  291. package/skills/remotion-video-creation/rules/charts.md +58 -0
  292. package/skills/remotion-video-creation/rules/compositions.md +146 -0
  293. package/skills/remotion-video-creation/rules/display-captions.md +126 -0
  294. package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  295. package/skills/remotion-video-creation/rules/fonts.md +152 -0
  296. package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  297. package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  298. package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  299. package/skills/remotion-video-creation/rules/gifs.md +138 -0
  300. package/skills/remotion-video-creation/rules/images.md +130 -0
  301. package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  302. package/skills/remotion-video-creation/rules/lottie.md +67 -0
  303. package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  304. package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  305. package/skills/remotion-video-creation/rules/sequencing.md +106 -0
  306. package/skills/remotion-video-creation/rules/tailwind.md +11 -0
  307. package/skills/remotion-video-creation/rules/text-animations.md +20 -0
  308. package/skills/remotion-video-creation/rules/timing.md +179 -0
  309. package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  310. package/skills/remotion-video-creation/rules/transitions.md +122 -0
  311. package/skills/remotion-video-creation/rules/trimming.md +52 -0
  312. package/skills/remotion-video-creation/rules/videos.md +171 -0
  313. package/skills/repo-scan/SKILL.md +78 -0
  314. package/skills/research-ops/SKILL.md +111 -0
  315. package/skills/returns-reverse-logistics/SKILL.md +239 -0
  316. package/skills/rules-distill/SKILL.md +263 -0
  317. package/skills/rules-distill/scripts/scan-rules.sh +58 -0
  318. package/skills/rules-distill/scripts/scan-skills.sh +129 -0
  319. package/skills/rust-patterns/SKILL.md +498 -0
  320. package/skills/rust-testing/SKILL.md +499 -0
  321. package/skills/safety-guard/SKILL.md +74 -0
  322. package/skills/santa-method/SKILL.md +306 -0
  323. package/skills/scientific-db-pubmed-database/SKILL.md +175 -0
  324. package/skills/scientific-db-uspto-database/SKILL.md +177 -0
  325. package/skills/scientific-pkg-gget/SKILL.md +166 -0
  326. package/skills/scientific-thinking-literature-review/SKILL.md +192 -0
  327. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  328. package/skills/search-first/SKILL.md +181 -0
  329. package/skills/security-bounty-hunter/SKILL.md +99 -0
  330. package/skills/security-review/SKILL.md +502 -0
  331. package/skills/security-review/cloud-infrastructure-security.md +361 -0
  332. package/skills/seo/SKILL.md +153 -0
  333. package/skills/skill-comply/SKILL.md +57 -0
  334. package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  335. package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  336. package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  337. package/skills/skill-comply/prompts/classifier.md +24 -0
  338. package/skills/skill-comply/prompts/scenario_generator.md +62 -0
  339. package/skills/skill-comply/prompts/spec_generator.md +42 -0
  340. package/skills/skill-comply/pyproject.toml +15 -0
  341. package/skills/skill-comply/scripts/__init__.py +0 -0
  342. package/skills/skill-comply/scripts/classifier.py +85 -0
  343. package/skills/skill-comply/scripts/grader.py +124 -0
  344. package/skills/skill-comply/scripts/parser.py +107 -0
  345. package/skills/skill-comply/scripts/report.py +170 -0
  346. package/skills/skill-comply/scripts/run.py +127 -0
  347. package/skills/skill-comply/scripts/runner.py +186 -0
  348. package/skills/skill-comply/scripts/scenario_generator.py +70 -0
  349. package/skills/skill-comply/scripts/spec_generator.py +72 -0
  350. package/skills/skill-comply/scripts/utils.py +13 -0
  351. package/skills/skill-comply/tests/test_grader.py +197 -0
  352. package/skills/skill-comply/tests/test_parser.py +90 -0
  353. package/skills/skill-comply/tests/test_runner.py +172 -0
  354. package/skills/skill-scout/SKILL.md +139 -0
  355. package/skills/skill-stocktake/SKILL.md +193 -0
  356. package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  357. package/skills/skill-stocktake/scripts/save-results.sh +56 -0
  358. package/skills/skill-stocktake/scripts/scan.sh +170 -0
  359. package/skills/social-graph-ranker/SKILL.md +153 -0
  360. package/skills/springboot-patterns/SKILL.md +313 -0
  361. package/skills/springboot-security/SKILL.md +271 -0
  362. package/skills/springboot-tdd/SKILL.md +157 -0
  363. package/skills/springboot-verification/SKILL.md +230 -0
  364. package/skills/strategic-compact/SKILL.md +129 -0
  365. package/skills/strategic-compact/suggest-compact.sh +54 -0
  366. package/skills/swift-actor-persistence/SKILL.md +142 -0
  367. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  368. package/skills/swift-protocol-di-testing/SKILL.md +189 -0
  369. package/skills/swiftui-patterns/SKILL.md +259 -0
  370. package/skills/tdd-workflow/SKILL.md +462 -0
  371. package/skills/team-builder/SKILL.md +166 -0
  372. package/skills/terminal-ops/SKILL.md +108 -0
  373. package/skills/tinystruct-patterns/SKILL.md +130 -0
  374. package/skills/tinystruct-patterns/references/architecture.md +77 -0
  375. package/skills/tinystruct-patterns/references/data-handling.md +35 -0
  376. package/skills/tinystruct-patterns/references/routing.md +57 -0
  377. package/skills/tinystruct-patterns/references/system-usage.md +74 -0
  378. package/skills/tinystruct-patterns/references/testing.md +59 -0
  379. package/skills/token-budget-advisor/SKILL.md +133 -0
  380. package/skills/ui-demo/SKILL.md +464 -0
  381. package/skills/ui-to-vue/SKILL.md +134 -0
  382. package/skills/unified-notifications-ops/SKILL.md +186 -0
  383. package/skills/verification-loop/SKILL.md +125 -0
  384. package/skills/video-editing/SKILL.md +309 -0
  385. package/skills/videodb/SKILL.md +373 -0
  386. package/skills/videodb/reference/api-reference.md +550 -0
  387. package/skills/videodb/reference/capture-reference.md +407 -0
  388. package/skills/videodb/reference/capture.md +101 -0
  389. package/skills/videodb/reference/editor.md +443 -0
  390. package/skills/videodb/reference/generative.md +331 -0
  391. package/skills/videodb/reference/rtstream-reference.md +564 -0
  392. package/skills/videodb/reference/rtstream.md +65 -0
  393. package/skills/videodb/reference/search.md +230 -0
  394. package/skills/videodb/reference/streaming.md +406 -0
  395. package/skills/videodb/reference/use-cases.md +118 -0
  396. package/skills/videodb/scripts/ws_listener.py +282 -0
  397. package/skills/visa-doc-translate/README.md +86 -0
  398. package/skills/visa-doc-translate/SKILL.md +117 -0
  399. package/skills/vite-patterns/SKILL.md +448 -0
  400. package/skills/windows-desktop-e2e/SKILL.md +787 -0
  401. package/skills/workspace-surface-audit/SKILL.md +124 -0
  402. package/skills/x-api/SKILL.md +233 -0
@@ -0,0 +1,90 @@
1
+ """Tests for parser module — JSONL trace and YAML spec parsing."""
2
+
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+ from scripts.parser import (
8
+ ComplianceSpec,
9
+ Detector,
10
+ ObservationEvent,
11
+ Step,
12
+ parse_spec,
13
+ parse_trace,
14
+ )
15
+
16
+ FIXTURES = Path(__file__).parent.parent / "fixtures"
17
+
18
+
19
+ class TestParseTrace:
20
+ def test_parses_compliant_trace(self) -> None:
21
+ events = parse_trace(FIXTURES / "compliant_trace.jsonl")
22
+ assert len(events) == 5
23
+ assert all(isinstance(e, ObservationEvent) for e in events)
24
+
25
+ def test_events_sorted_by_timestamp(self) -> None:
26
+ events = parse_trace(FIXTURES / "compliant_trace.jsonl")
27
+ timestamps = [e.timestamp for e in events]
28
+ assert timestamps == sorted(timestamps)
29
+
30
+ def test_event_fields(self) -> None:
31
+ events = parse_trace(FIXTURES / "compliant_trace.jsonl")
32
+ first = events[0]
33
+ assert first.tool == "Write"
34
+ assert first.session == "sess-001"
35
+ assert "test_fib.py" in first.input
36
+ assert first.output == "File created"
37
+
38
+ def test_parses_noncompliant_trace(self) -> None:
39
+ events = parse_trace(FIXTURES / "noncompliant_trace.jsonl")
40
+ assert len(events) == 3
41
+ assert "src/fib.py" in events[0].input
42
+
43
+ def test_empty_file_returns_empty_list(self, tmp_path: Path) -> None:
44
+ empty = tmp_path / "empty.jsonl"
45
+ empty.write_text("")
46
+ events = parse_trace(empty)
47
+ assert events == []
48
+
49
+ def test_nonexistent_file_raises(self) -> None:
50
+ with pytest.raises(FileNotFoundError):
51
+ parse_trace(Path("/nonexistent/trace.jsonl"))
52
+
53
+
54
+ class TestParseSpec:
55
+ def test_parses_tdd_spec(self) -> None:
56
+ spec = parse_spec(FIXTURES / "tdd_spec.yaml")
57
+ assert isinstance(spec, ComplianceSpec)
58
+ assert spec.id == "tdd-workflow"
59
+ assert len(spec.steps) == 5
60
+
61
+ def test_step_fields(self) -> None:
62
+ spec = parse_spec(FIXTURES / "tdd_spec.yaml")
63
+ first = spec.steps[0]
64
+ assert isinstance(first, Step)
65
+ assert first.id == "write_test"
66
+ assert first.required is True
67
+ assert isinstance(first.detector, Detector)
68
+ assert "test file" in first.detector.description
69
+ assert first.detector.before_step == "write_impl"
70
+
71
+ def test_optional_detector_fields(self) -> None:
72
+ spec = parse_spec(FIXTURES / "tdd_spec.yaml")
73
+ write_test = spec.steps[0]
74
+ assert write_test.detector.after_step is None
75
+
76
+ run_test_red = spec.steps[1]
77
+ assert run_test_red.detector.after_step == "write_test"
78
+ assert run_test_red.detector.before_step == "write_impl"
79
+
80
+ def test_scoring_threshold(self) -> None:
81
+ spec = parse_spec(FIXTURES / "tdd_spec.yaml")
82
+ assert spec.threshold_promote_to_hook == 0.6
83
+
84
+ def test_required_vs_optional_steps(self) -> None:
85
+ spec = parse_spec(FIXTURES / "tdd_spec.yaml")
86
+ required = [s for s in spec.steps if s.required]
87
+ optional = [s for s in spec.steps if not s.required]
88
+ assert len(required) == 4
89
+ assert len(optional) == 1
90
+ assert optional[0].id == "refactor"
@@ -0,0 +1,172 @@
1
+ """Tests for runner module — scenario execution + subprocess error handling."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import subprocess
6
+ from dataclasses import dataclass
7
+ from unittest.mock import MagicMock, patch
8
+
9
+ import pytest
10
+
11
+ from scripts.runner import _setup_sandbox, run_scenario
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class _FakeScenario:
16
+ """Minimal Scenario-like object for runner tests (avoids generator deps)."""
17
+
18
+ id: str
19
+ prompt: str = "do nothing"
20
+ setup_commands: tuple[str, ...] = ()
21
+
22
+
23
+ class TestSetupSandboxSkipsShellBuiltins:
24
+ """Setup commands containing shell builtins (cd/pushd/popd) must be skipped.
25
+
26
+ Regression: subprocess.run(["cd", ...]) raises FileNotFoundError because
27
+ cd is a shell builtin, not an external binary. Real-world scenarios often
28
+ include "cd subdir" in setup_commands assuming shell semantics, so the
29
+ runner must tolerate this rather than crashing the whole scenario.
30
+ """
31
+
32
+ def test_skips_cd(self, tmp_path):
33
+ scenario = _FakeScenario(
34
+ id="t1",
35
+ setup_commands=("cd subdir",),
36
+ )
37
+ called_args: list[list[str]] = []
38
+
39
+ def fake_run(args, **kwargs):
40
+ called_args.append(args)
41
+ return subprocess.CompletedProcess(args=args, returncode=0)
42
+
43
+ with patch("scripts.runner.subprocess.run", side_effect=fake_run):
44
+ _setup_sandbox(tmp_path, scenario)
45
+
46
+ # git init runs once; "cd subdir" must NOT be passed to subprocess
47
+ assert ["git", "init"] in called_args
48
+ assert ["cd", "subdir"] not in called_args
49
+
50
+ def test_skips_pushd_popd(self, tmp_path):
51
+ scenario = _FakeScenario(
52
+ id="t2",
53
+ setup_commands=("pushd dir", "popd"),
54
+ )
55
+ called_args: list[list[str]] = []
56
+
57
+ def fake_run(args, **kwargs):
58
+ called_args.append(args)
59
+ return subprocess.CompletedProcess(args=args, returncode=0)
60
+
61
+ with patch("scripts.runner.subprocess.run", side_effect=fake_run):
62
+ _setup_sandbox(tmp_path, scenario)
63
+
64
+ assert ["pushd", "dir"] not in called_args
65
+ assert ["popd"] not in called_args
66
+
67
+ def test_tolerates_missing_executable(self, tmp_path):
68
+ """A scenario referencing an unavailable tool must not crash setup."""
69
+ scenario = _FakeScenario(
70
+ id="t3",
71
+ setup_commands=("nonexistent-tool-xyz arg",),
72
+ )
73
+
74
+ def fake_run(args, **kwargs):
75
+ if args[0] == "nonexistent-tool-xyz":
76
+ raise FileNotFoundError(2, "No such file or directory")
77
+ return subprocess.CompletedProcess(args=args, returncode=0)
78
+
79
+ with patch("scripts.runner.subprocess.run", side_effect=fake_run):
80
+ # Must NOT raise — missing tools are skipped, not fatal
81
+ _setup_sandbox(tmp_path, scenario)
82
+
83
+ def test_real_commands_still_run(self, tmp_path):
84
+ """Skip logic must not break legitimate setup commands."""
85
+ scenario = _FakeScenario(
86
+ id="t4",
87
+ setup_commands=("touch file.txt", "cd ignored", "echo hi"),
88
+ )
89
+ called_args: list[list[str]] = []
90
+
91
+ def fake_run(args, **kwargs):
92
+ called_args.append(args)
93
+ return subprocess.CompletedProcess(args=args, returncode=0)
94
+
95
+ with patch("scripts.runner.subprocess.run", side_effect=fake_run):
96
+ _setup_sandbox(tmp_path, scenario)
97
+
98
+ # Real commands present, cd absent
99
+ assert ["touch", "file.txt"] in called_args
100
+ assert ["echo", "hi"] in called_args
101
+ assert ["cd", "ignored"] not in called_args
102
+
103
+
104
+ class TestRunScenarioMaxTurnsTermination:
105
+ """rc=1 with terminal_reason=max_turns is graceful termination, not failure.
106
+
107
+ claude -p returns rc=1 when --max-turns is reached, but the stream-json
108
+ output is still valid. Treating this as RuntimeError aborts scenarios
109
+ that would have produced useful observations. Detect the marker in stdout
110
+ and downgrade rc=1 + max_turns to non-fatal.
111
+ """
112
+
113
+ def test_rc1_with_max_turns_marker_returns_normally(self, tmp_path, monkeypatch):
114
+ scenario = _FakeScenario(id="mt1", prompt="long task", setup_commands=())
115
+
116
+ # Skip sandbox setup side effects
117
+ monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
118
+
119
+ max_turns_stdout = (
120
+ '{"type":"system","subtype":"init","session_id":"s1"}\n'
121
+ '{"type":"result","terminal_reason":"max_turns"}\n'
122
+ )
123
+
124
+ fake_result = subprocess.CompletedProcess(
125
+ args=["claude"], returncode=1, stdout=max_turns_stdout, stderr=""
126
+ )
127
+
128
+ with patch("scripts.runner.subprocess.run", return_value=fake_result):
129
+ # Must NOT raise — max_turns is graceful termination
130
+ run_scenario(scenario, model="haiku")
131
+
132
+ def test_rc1_without_max_turns_marker_still_raises(self, tmp_path, monkeypatch):
133
+ """Real failures (rc≠0 with no max_turns marker) must still raise."""
134
+ scenario = _FakeScenario(id="mt2", prompt="oops", setup_commands=())
135
+ monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
136
+
137
+ fake_result = subprocess.CompletedProcess(
138
+ args=["claude"], returncode=1, stdout="", stderr="auth error"
139
+ )
140
+
141
+ with patch("scripts.runner.subprocess.run", return_value=fake_result):
142
+ with pytest.raises(RuntimeError, match="claude -p failed"):
143
+ run_scenario(scenario, model="haiku")
144
+
145
+
146
+ class TestRunScenarioErrorIncludesStdoutTail:
147
+ """Error messages must include stdout tail, not only stderr.
148
+
149
+ When claude -p fails inside an LLM call, useful diagnostic context often
150
+ appears in stdout (partial stream-json events, model error JSON), not
151
+ stderr. Including stdout tail in the RuntimeError message dramatically
152
+ improves debug-ability without adding any new dependency.
153
+ """
154
+
155
+ def test_error_message_contains_stdout_tail(self, tmp_path, monkeypatch):
156
+ scenario = _FakeScenario(id="e1", prompt="x", setup_commands=())
157
+ monkeypatch.setattr("scripts.runner._setup_sandbox", lambda *a, **kw: None)
158
+
159
+ diagnostic_marker = "DIAG_STDOUT_MARKER_xyz123"
160
+ fake_result = subprocess.CompletedProcess(
161
+ args=["claude"],
162
+ returncode=2,
163
+ stdout=f"some context {diagnostic_marker} more text",
164
+ stderr="generic error",
165
+ )
166
+
167
+ with patch("scripts.runner.subprocess.run", return_value=fake_result):
168
+ with pytest.raises(RuntimeError) as excinfo:
169
+ run_scenario(scenario, model="haiku")
170
+
171
+ # Stdout marker MUST appear in the error message
172
+ assert diagnostic_marker in str(excinfo.value)
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: skill-scout
3
+ description: Search existing local, marketplace, GitHub, and web skill sources before creating a new skill. Use when the user wants to create, build, fork, or find a skill for a workflow.
4
+ origin: community
5
+ ---
6
+
7
+ # Skill Scout
8
+
9
+ Use this skill before creating a new skill. The goal is to avoid duplicating
10
+ existing community or marketplace work, while still vetting anything external
11
+ before adoption.
12
+
13
+ Source: salvaged from stale community PR #1232 by `redminwang`.
14
+
15
+ ## When to Use
16
+
17
+ - The user says "create a skill", "build a skill", "make a skill", or "new
18
+ skill".
19
+ - The user asks "is there a skill for X?" or "does a skill exist that does Y?"
20
+ - The user describes a workflow and you are about to suggest creating a new
21
+ skill.
22
+ - The user wants to fork or extend an existing skill.
23
+
24
+ If the user explicitly says to skip search or create from scratch, acknowledge
25
+ that and proceed with the requested creation workflow.
26
+
27
+ ## How It Works
28
+
29
+ ### Step 1 - Capture Intent
30
+
31
+ Extract:
32
+
33
+ - The task the skill should perform.
34
+ - The trigger conditions for using it.
35
+ - The domain, tools, frameworks, or data sources involved.
36
+ - Three to five search keywords plus useful synonyms.
37
+
38
+ ### Step 2 - Search Local Sources
39
+
40
+ Search installed and marketplace skill names first. Local sources are preferred
41
+ because they are already part of the user's environment.
42
+
43
+ ```bash
44
+ find ~/.claude/skills -maxdepth 2 -name SKILL.md 2>/dev/null | grep -iE "keyword|synonym"
45
+ find ~/.claude/plugins/marketplaces -path '*/skills/*/SKILL.md' 2>/dev/null | grep -iE "keyword|synonym"
46
+ ```
47
+
48
+ Then search frontmatter descriptions:
49
+
50
+ ```bash
51
+ grep -RilE "keyword|synonym" ~/.claude/skills ~/.claude/plugins/marketplaces 2>/dev/null
52
+ ```
53
+
54
+ ### Step 3 - Search Remote Sources
55
+
56
+ Use available GitHub and web search tools. Prefer concise queries:
57
+
58
+ ```bash
59
+ gh search repos "claude code skill keyword" --limit 10 --sort stars
60
+ gh search code "name: keyword" --filename SKILL.md --limit 10
61
+ ```
62
+
63
+ For web search, use at most three targeted queries such as:
64
+
65
+ ```text
66
+ "claude code skill" keyword
67
+ "SKILL.md" keyword
68
+ ```
69
+
70
+ ### Step 4 - Vet External Matches
71
+
72
+ Before recommending any external skill for adoption or forking:
73
+
74
+ - Read the `SKILL.md` frontmatter and instructions.
75
+ - Look for unexpected shell commands, file writes, network calls, credential
76
+ handling, or package installs.
77
+ - Check whether the repository appears maintained.
78
+ - Prefer copying into a fresh local branch and reviewing the diff over editing
79
+ marketplace originals.
80
+
81
+ ### Step 5 - Rank Results
82
+
83
+ Rank candidates by:
84
+
85
+ 1. Exact keyword match in the skill name.
86
+ 2. Keyword or synonym match in description.
87
+ 3. Local installed or marketplace source.
88
+ 4. Maintained GitHub source with recent activity.
89
+ 5. Web-only mention.
90
+
91
+ Cap the final list at 10 results.
92
+
93
+ ### Step 6 - Present Decision Options
94
+
95
+ Give the user a short table:
96
+
97
+ | Option | Meaning |
98
+ | --- | --- |
99
+ | Use existing | Invoke or install a matching skill as-is. |
100
+ | Fork or extend | Copy the closest skill and modify it. |
101
+ | Create fresh | Build a new skill after confirming no close match exists. |
102
+
103
+ Only create a new skill after the user chooses that path or after the search
104
+ finds no close match.
105
+
106
+ ## Examples
107
+
108
+ ### Result Table
109
+
110
+ ```markdown
111
+ | # | Skill | Source | Why it matches | Gap |
112
+ | --- | --- | --- | --- | --- |
113
+ | 1 | article-writing | Local the toolset | Drafts articles and guides | Not focused on release notes |
114
+ | 2 | content-engine | Local the toolset | Multi-format content workflow | Heavier than needed |
115
+ | 3 | blog-writer | GitHub | Blog writing skill with recent commits | Needs security review |
116
+ ```
117
+
118
+ ### User-Facing Summary
119
+
120
+ ```markdown
121
+ I found two close local matches and one external candidate. The closest fit is
122
+ `article-writing`; it covers drafting and revision, but it does not include the
123
+ release-note checklist you asked for. I can either use it as-is, fork it into a
124
+ release-note variant, or create a fresh skill.
125
+ ```
126
+
127
+ ## Anti-Patterns
128
+
129
+ - Do not jump directly to new skill creation when a search is reasonable.
130
+ - Do not install external skills without reading them first.
131
+ - Do not present a long unranked list of weak matches.
132
+ - Do not treat web-only mentions as trusted sources.
133
+ - Do not edit installed marketplace originals in place.
134
+
135
+ ## Related
136
+
137
+ - `search-first` - General search-before-building workflow.
138
+ - `skill-stocktake` - Audit installed skills for health, duplicates, and gaps.
139
+ - `agent-sort` - Categorize and organize existing agents and skills.
@@ -0,0 +1,193 @@
1
+ ---
2
+ name: skill-stocktake
3
+ description: "Use when auditing Claude skills and commands for quality. Supports Quick Scan (changed skills only) and Full Stocktake modes with sequential subagent batch evaluation."
4
+ ---
5
+
6
+ # skill-stocktake
7
+
8
+ Slash command (`/skill-stocktake`) that audits all Claude skills and commands using a quality checklist + AI holistic judgment. Supports two modes: Quick Scan for recently changed skills, and Full Stocktake for a complete review.
9
+
10
+ ## Scope
11
+
12
+ The command targets the following paths **relative to the directory where it is invoked**:
13
+
14
+ | Path | Description |
15
+ |------|-------------|
16
+ | `~/.claude/skills/` | Global skills (all projects) |
17
+ | `{cwd}/.claude/skills/` | Project-level skills (if the directory exists) |
18
+
19
+ **At the start of Phase 1, the command explicitly lists which paths were found and scanned.**
20
+
21
+ ### Targeting a specific project
22
+
23
+ To include project-level skills, run from that project's root directory:
24
+
25
+ ```bash
26
+ cd ~/path/to/my-project
27
+ /skill-stocktake
28
+ ```
29
+
30
+ If the project has no `.claude/skills/` directory, only global skills and commands are evaluated.
31
+
32
+ ## Modes
33
+
34
+ | Mode | Trigger | Duration |
35
+ |------|---------|---------|
36
+ | Quick Scan | `results.json` exists (default) | 5–10 min |
37
+ | Full Stocktake | `results.json` absent, or `/skill-stocktake full` | 20–30 min |
38
+
39
+ **Results cache:** `~/.claude/skills/skill-stocktake/results.json`
40
+
41
+ ## Quick Scan Flow
42
+
43
+ Re-evaluate only skills that have changed since the last run (5–10 min).
44
+
45
+ 1. Read `~/.claude/skills/skill-stocktake/results.json`
46
+ 2. Run: `bash ~/.claude/skills/skill-stocktake/scripts/quick-diff.sh \
47
+ ~/.claude/skills/skill-stocktake/results.json`
48
+ (Project dir is auto-detected from `$PWD/.claude/skills`; pass it explicitly only if needed)
49
+ 3. If output is `[]`: report "No changes since last run." and stop
50
+ 4. Re-evaluate only those changed files using the same Phase 2 criteria
51
+ 5. Carry forward unchanged skills from previous results
52
+ 6. Output only the diff
53
+ 7. Run: `bash ~/.claude/skills/skill-stocktake/scripts/save-results.sh \
54
+ ~/.claude/skills/skill-stocktake/results.json <<< "$EVAL_RESULTS"`
55
+
56
+ ## Full Stocktake Flow
57
+
58
+ ### Phase 1 — Inventory
59
+
60
+ Run: `bash ~/.claude/skills/skill-stocktake/scripts/scan.sh`
61
+
62
+ The script enumerates skill files, extracts frontmatter, and collects UTC mtimes.
63
+ Project dir is auto-detected from `$PWD/.claude/skills`; pass it explicitly only if needed.
64
+ Present the scan summary and inventory table from the script output:
65
+
66
+ ```
67
+ Scanning:
68
+ ✓ ~/.claude/skills/ (17 files)
69
+ ✗ {cwd}/.claude/skills/ (not found — global skills only)
70
+ ```
71
+
72
+ | Skill | 7d use | 30d use | Description |
73
+ |-------|--------|---------|-------------|
74
+
75
+ ### Phase 2 — Quality Evaluation
76
+
77
+ Launch an Agent tool subagent (**general-purpose agent**) with the full inventory and checklist:
78
+
79
+ ```text
80
+ Agent(
81
+ subagent_type="general-purpose",
82
+ prompt="
83
+ Evaluate the following skill inventory against the checklist.
84
+
85
+ [INVENTORY]
86
+
87
+ [CHECKLIST]
88
+
89
+ Return JSON for each skill:
90
+ { \"verdict\": \"Keep\"|\"Improve\"|\"Update\"|\"Retire\"|\"Merge into [X]\", \"reason\": \"...\" }
91
+ "
92
+ )
93
+ ```
94
+
95
+ The subagent reads each skill, applies the checklist, and returns per-skill JSON:
96
+
97
+ `{ "verdict": "Keep"|"Improve"|"Update"|"Retire"|"Merge into [X]", "reason": "..." }`
98
+
99
+ **Chunk guidance:** Process ~20 skills per subagent invocation to keep context manageable. Save intermediate results to `results.json` (`status: "in_progress"`) after each chunk.
100
+
101
+ After all skills are evaluated: set `status: "completed"`, proceed to Phase 3.
102
+
103
+ **Resume detection:** If `status: "in_progress"` is found on startup, resume from the first unevaluated skill.
104
+
105
+ Each skill is evaluated against this checklist:
106
+
107
+ ```
108
+ - [ ] Content overlap with other skills checked
109
+ - [ ] Overlap with MEMORY.md / CLAUDE.md checked
110
+ - [ ] Freshness of technical references verified (use WebSearch if tool names / CLI flags / APIs are present)
111
+ - [ ] Usage frequency considered
112
+ ```
113
+
114
+ Verdict criteria:
115
+
116
+ | Verdict | Meaning |
117
+ |---------|---------|
118
+ | Keep | Useful and current |
119
+ | Improve | Worth keeping, but specific improvements needed |
120
+ | Update | Referenced technology is outdated (verify with WebSearch) |
121
+ | Retire | Low quality, stale, or cost-asymmetric |
122
+ | Merge into [X] | Substantial overlap with another skill; name the merge target |
123
+
124
+ Evaluation is **holistic AI judgment** — not a numeric rubric. Guiding dimensions:
125
+ - **Actionability**: code examples, commands, or steps that let you act immediately
126
+ - **Scope fit**: name, trigger, and content are aligned; not too broad or narrow
127
+ - **Uniqueness**: value not replaceable by MEMORY.md / CLAUDE.md / another skill
128
+ - **Currency**: technical references work in the current environment
129
+
130
+ **Reason quality requirements** — the `reason` field must be self-contained and decision-enabling:
131
+ - Do NOT write "unchanged" alone — always restate the core evidence
132
+ - For **Retire**: state (1) what specific defect was found, (2) what covers the same need instead
133
+ - Bad: `"Superseded"`
134
+ - Good: `"disable-model-invocation: true already set; superseded by continuous-learning-v2 which covers all the same patterns plus confidence scoring. No unique content remains."`
135
+ - For **Merge**: name the target and describe what content to integrate
136
+ - Bad: `"Overlaps with X"`
137
+ - Good: `"42-line thin content; Step 4 of chatlog-to-article already covers the same workflow. Integrate the 'article angle' tip as a note in that skill."`
138
+ - For **Improve**: describe the specific change needed (what section, what action, target size if relevant)
139
+ - Bad: `"Too long"`
140
+ - Good: `"276 lines; Section 'Framework Comparison' (L80–140) duplicates ai-era-architecture-principles; delete it to reach ~150 lines."`
141
+ - For **Keep** (mtime-only change in Quick Scan): restate the original verdict rationale, do not write "unchanged"
142
+ - Bad: `"Unchanged"`
143
+ - Good: `"mtime updated but content unchanged. Unique Python reference explicitly imported by rules/python/; no overlap found."`
144
+
145
+ ### Phase 3 — Summary Table
146
+
147
+ | Skill | 7d use | Verdict | Reason |
148
+ |-------|--------|---------|--------|
149
+
150
+ ### Phase 4 — Consolidation
151
+
152
+ 1. **Retire / Merge**: present detailed justification per file before confirming with user:
153
+ - What specific problem was found (overlap, staleness, broken references, etc.)
154
+ - What alternative covers the same functionality (for Retire: which existing skill/rule; for Merge: the target file and what content to integrate)
155
+ - Impact of removal (any dependent skills, MEMORY.md references, or workflows affected)
156
+ 2. **Improve**: present specific improvement suggestions with rationale:
157
+ - What to change and why (e.g., "trim 430→200 lines because sections X/Y duplicate python-patterns")
158
+ - User decides whether to act
159
+ 3. **Update**: present updated content with sources checked
160
+ 4. Check MEMORY.md line count; propose compression if >100 lines
161
+
162
+ ## Results File Schema
163
+
164
+ `~/.claude/skills/skill-stocktake/results.json`:
165
+
166
+ **`evaluated_at`**: Must be set to the actual UTC time of evaluation completion.
167
+ Obtain via Bash: `date -u +%Y-%m-%dT%H:%M:%SZ`. Never use a date-only approximation like `T00:00:00Z`.
168
+
169
+ ```json
170
+ {
171
+ "evaluated_at": "2026-02-21T10:00:00Z",
172
+ "mode": "full",
173
+ "batch_progress": {
174
+ "total": 80,
175
+ "evaluated": 80,
176
+ "status": "completed"
177
+ },
178
+ "skills": {
179
+ "skill-name": {
180
+ "path": "~/.claude/skills/skill-name/SKILL.md",
181
+ "verdict": "Keep",
182
+ "reason": "Concrete, actionable, unique value for X workflow",
183
+ "mtime": "2026-01-15T08:30:00Z"
184
+ }
185
+ }
186
+ }
187
+ ```
188
+
189
+ ## Notes
190
+
191
+ - Evaluation is blind: the same checklist applies to all skills regardless of origin (the toolset, self-authored, auto-extracted)
192
+ - Archive / delete operations always require explicit user confirmation
193
+ - No verdict branching by skill origin
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+ # quick-diff.sh — compare skill file mtimes against results.json evaluated_at
3
+ # Usage: quick-diff.sh RESULTS_JSON [CWD_SKILLS_DIR]
4
+ # Output: JSON array of changed/new files to stdout (empty [] if no changes)
5
+ #
6
+ # When CWD_SKILLS_DIR is omitted, defaults to $PWD/.claude/skills so the
7
+ # script always picks up project-level skills without relying on the caller.
8
+ #
9
+ # Environment:
10
+ # SKILL_STOCKTAKE_GLOBAL_DIR Override ~/.claude/skills (for testing only;
11
+ # do not set in production — intended for bats tests)
12
+ # SKILL_STOCKTAKE_PROJECT_DIR Override project dir detection (for testing only)
13
+
14
+ set -euo pipefail
15
+
16
+ RESULTS_JSON="${1:-}"
17
+ CWD_SKILLS_DIR="${SKILL_STOCKTAKE_PROJECT_DIR:-${2:-$PWD/.claude/skills}}"
18
+ GLOBAL_DIR="${SKILL_STOCKTAKE_GLOBAL_DIR:-$HOME/.claude/skills}"
19
+
20
+ if [[ -z "$RESULTS_JSON" || ! -f "$RESULTS_JSON" ]]; then
21
+ echo "Error: RESULTS_JSON not found: ${RESULTS_JSON:-<empty>}" >&2
22
+ exit 1
23
+ fi
24
+
25
+ # Validate CWD_SKILLS_DIR looks like a .claude/skills path (defense-in-depth).
26
+ # Only warn when the path exists — a nonexistent path poses no traversal risk.
27
+ if [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" && "$CWD_SKILLS_DIR" != */.claude/skills* ]]; then
28
+ echo "Warning: CWD_SKILLS_DIR does not look like a .claude/skills path: $CWD_SKILLS_DIR" >&2
29
+ fi
30
+
31
+ evaluated_at=$(jq -r '.evaluated_at' "$RESULTS_JSON")
32
+
33
+ # Fail fast on a missing or malformed evaluated_at rather than producing
34
+ # unpredictable results from ISO 8601 string comparison against "null".
35
+ if [[ ! "$evaluated_at" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$ ]]; then
36
+ echo "Error: invalid or missing evaluated_at in $RESULTS_JSON: $evaluated_at" >&2
37
+ exit 1
38
+ fi
39
+
40
+ # Pre-extract known paths from results.json once (O(1) lookup per file instead of O(n*m))
41
+ known_paths=$(jq -r '.skills[].path' "$RESULTS_JSON" 2>/dev/null)
42
+
43
+ tmpdir=$(mktemp -d)
44
+ # Use a function to avoid embedding $tmpdir in a quoted string (prevents injection
45
+ # if TMPDIR were crafted to contain shell metacharacters).
46
+ _cleanup() { rm -rf "$tmpdir"; }
47
+ trap _cleanup EXIT
48
+
49
+ # Shared counter across process_dir calls — intentionally NOT local
50
+ i=0
51
+
52
+ process_dir() {
53
+ local dir="$1"
54
+ while IFS= read -r file; do
55
+ local mtime dp is_new
56
+ mtime=$(date -u -r "$file" +%Y-%m-%dT%H:%M:%SZ)
57
+ dp="${file/#$HOME/~}"
58
+
59
+ # Check if this file is known to results.json (exact whole-line match to
60
+ # avoid substring false-positives, e.g. "python-patterns" matching "python-patterns-v2").
61
+ if echo "$known_paths" | grep -qxF "$dp"; then
62
+ is_new="false"
63
+ # Known file: only emit if mtime changed (ISO 8601 string comparison is safe)
64
+ [[ "$mtime" > "$evaluated_at" ]] || continue
65
+ else
66
+ is_new="true"
67
+ # New file: always emit regardless of mtime
68
+ fi
69
+
70
+ jq -n \
71
+ --arg path "$dp" \
72
+ --arg mtime "$mtime" \
73
+ --argjson is_new "$is_new" \
74
+ '{path:$path,mtime:$mtime,is_new:$is_new}' \
75
+ > "$tmpdir/$i.json"
76
+ i=$((i+1))
77
+ done < <(find "$dir" -name "*.md" -type f 2>/dev/null | sort)
78
+ }
79
+
80
+ [[ -d "$GLOBAL_DIR" ]] && process_dir "$GLOBAL_DIR"
81
+ [[ -n "$CWD_SKILLS_DIR" && -d "$CWD_SKILLS_DIR" ]] && process_dir "$CWD_SKILLS_DIR"
82
+
83
+ if [[ $i -eq 0 ]]; then
84
+ echo "[]"
85
+ else
86
+ jq -s '.' "$tmpdir"/*.json
87
+ fi