compact-agent 1.10.1 → 1.11.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 (697) hide show
  1. package/bin/ecc-hooks.cjs +110 -0
  2. package/dist/ecc.d.ts +11 -0
  3. package/dist/ecc.js +142 -27
  4. package/dist/ecc.js.map +1 -1
  5. package/dist/index.js +47 -7
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/resources/ecc/agents/a11y-architect.md +149 -0
  9. package/resources/ecc/agents/architect.md +11 -3
  10. package/resources/ecc/agents/build-error-resolver.md +11 -4
  11. package/resources/ecc/agents/chief-of-staff.md +11 -4
  12. package/resources/ecc/agents/code-architect.md +80 -0
  13. package/resources/ecc/agents/code-explorer.md +78 -0
  14. package/resources/ecc/agents/code-reviewer.md +89 -4
  15. package/resources/ecc/agents/code-simplifier.md +56 -0
  16. package/resources/ecc/agents/comment-analyzer.md +54 -0
  17. package/resources/ecc/agents/conversation-analyzer.md +61 -0
  18. package/resources/ecc/agents/cpp-build-resolver.md +99 -0
  19. package/resources/ecc/agents/cpp-reviewer.md +81 -0
  20. package/resources/ecc/agents/csharp-reviewer.md +110 -0
  21. package/resources/ecc/agents/dart-build-resolver.md +210 -0
  22. package/resources/ecc/agents/database-reviewer.md +11 -3
  23. package/resources/ecc/agents/django-build-resolver.md +252 -0
  24. package/resources/ecc/agents/django-reviewer.md +169 -0
  25. package/resources/ecc/agents/doc-updater.md +11 -3
  26. package/resources/ecc/agents/docs-lookup.md +77 -0
  27. package/resources/ecc/agents/e2e-runner.md +11 -4
  28. package/resources/ecc/agents/fastapi-reviewer.md +79 -0
  29. package/resources/ecc/agents/flutter-reviewer.md +252 -0
  30. package/resources/ecc/agents/fsharp-reviewer.md +109 -0
  31. package/resources/ecc/agents/gan-evaluator.md +218 -0
  32. package/resources/ecc/agents/gan-generator.md +140 -0
  33. package/resources/ecc/agents/gan-planner.md +108 -0
  34. package/resources/ecc/agents/go-build-resolver.md +11 -4
  35. package/resources/ecc/agents/go-reviewer.md +11 -3
  36. package/resources/ecc/agents/harmonyos-app-resolver.md +182 -0
  37. package/resources/ecc/agents/harness-optimizer.md +12 -2
  38. package/resources/ecc/agents/healthcare-reviewer.md +92 -0
  39. package/resources/ecc/agents/homelab-architect.md +107 -0
  40. package/resources/ecc/agents/java-build-resolver.md +275 -0
  41. package/resources/ecc/agents/java-reviewer.md +190 -0
  42. package/resources/ecc/agents/kotlin-build-resolver.md +127 -0
  43. package/resources/ecc/agents/kotlin-reviewer.md +168 -0
  44. package/resources/ecc/agents/loop-operator.md +12 -3
  45. package/resources/ecc/agents/mle-reviewer.md +162 -0
  46. package/resources/ecc/agents/network-architect.md +106 -0
  47. package/resources/ecc/agents/network-config-reviewer.md +106 -0
  48. package/resources/ecc/agents/network-troubleshooter.md +128 -0
  49. package/resources/ecc/agents/opensource-forker.md +207 -0
  50. package/resources/ecc/agents/opensource-packager.md +258 -0
  51. package/resources/ecc/agents/opensource-sanitizer.md +197 -0
  52. package/resources/ecc/agents/performance-optimizer.md +455 -0
  53. package/resources/ecc/agents/planner.md +11 -2
  54. package/resources/ecc/agents/pr-test-analyzer.md +54 -0
  55. package/resources/ecc/agents/python-reviewer.md +11 -3
  56. package/resources/ecc/agents/pytorch-build-resolver.md +129 -0
  57. package/resources/ecc/agents/refactor-cleaner.md +11 -4
  58. package/resources/ecc/agents/rust-build-resolver.md +157 -0
  59. package/resources/ecc/agents/rust-reviewer.md +103 -0
  60. package/resources/ecc/agents/security-reviewer.md +11 -3
  61. package/resources/ecc/agents/seo-specialist.md +71 -0
  62. package/resources/ecc/agents/silent-failure-hunter.md +59 -0
  63. package/resources/ecc/agents/swift-build-resolver.md +170 -0
  64. package/resources/ecc/agents/swift-reviewer.md +116 -0
  65. package/resources/ecc/agents/tdd-guide.md +11 -4
  66. package/resources/ecc/agents/type-design-analyzer.md +50 -0
  67. package/resources/ecc/agents/typescript-reviewer.md +121 -0
  68. package/resources/ecc/commands/aside.md +164 -0
  69. package/resources/ecc/commands/auto-update.md +28 -0
  70. package/resources/ecc/commands/build-fix.md +66 -0
  71. package/resources/ecc/commands/checkpoint.md +78 -0
  72. package/resources/ecc/commands/code-review.md +289 -0
  73. package/resources/ecc/commands/cost-report.md +107 -0
  74. package/resources/ecc/commands/cpp-build.md +173 -0
  75. package/resources/ecc/commands/cpp-review.md +132 -0
  76. package/resources/ecc/commands/cpp-test.md +251 -0
  77. package/resources/ecc/commands/ecc-guide.md +93 -0
  78. package/resources/ecc/commands/evolve.md +178 -0
  79. package/resources/ecc/commands/fastapi-review.md +39 -0
  80. package/resources/ecc/commands/feature-dev.md +49 -0
  81. package/resources/ecc/commands/flutter-build.md +164 -0
  82. package/resources/ecc/commands/flutter-review.md +116 -0
  83. package/resources/ecc/commands/flutter-test.md +144 -0
  84. package/resources/ecc/commands/gan-build.md +103 -0
  85. package/resources/ecc/commands/gan-design.md +39 -0
  86. package/resources/ecc/commands/go-build.md +183 -0
  87. package/resources/ecc/commands/go-review.md +148 -0
  88. package/resources/ecc/commands/go-test.md +268 -0
  89. package/resources/ecc/commands/gradle-build.md +70 -0
  90. package/resources/ecc/commands/harness-audit.md +77 -0
  91. package/resources/ecc/commands/hookify-configure.md +14 -0
  92. package/resources/ecc/commands/hookify-help.md +46 -0
  93. package/resources/ecc/commands/hookify-list.md +21 -0
  94. package/resources/ecc/commands/hookify.md +50 -0
  95. package/resources/ecc/commands/instinct-export.md +66 -0
  96. package/resources/ecc/commands/instinct-import.md +114 -0
  97. package/resources/ecc/commands/instinct-status.md +59 -0
  98. package/resources/ecc/commands/jira.md +106 -0
  99. package/resources/ecc/commands/kotlin-build.md +174 -0
  100. package/resources/ecc/commands/kotlin-review.md +140 -0
  101. package/resources/ecc/commands/kotlin-test.md +312 -0
  102. package/resources/ecc/commands/learn-eval.md +116 -0
  103. package/resources/ecc/commands/learn.md +74 -0
  104. package/resources/ecc/commands/loop-start.md +36 -0
  105. package/resources/ecc/commands/loop-status.md +77 -0
  106. package/resources/ecc/commands/model-route.md +30 -0
  107. package/resources/ecc/commands/multi-backend.md +162 -0
  108. package/resources/ecc/commands/multi-execute.md +319 -0
  109. package/resources/ecc/commands/multi-frontend.md +162 -0
  110. package/resources/ecc/commands/multi-plan.md +272 -0
  111. package/resources/ecc/commands/multi-workflow.md +195 -0
  112. package/resources/ecc/commands/plan-prd.md +160 -0
  113. package/resources/ecc/commands/plan.md +200 -0
  114. package/resources/ecc/commands/pm2.md +276 -0
  115. package/resources/ecc/commands/pr.md +184 -0
  116. package/resources/ecc/commands/project-init.md +86 -0
  117. package/resources/ecc/commands/projects.md +39 -0
  118. package/resources/ecc/commands/promote.md +41 -0
  119. package/resources/ecc/commands/prp-commit.md +112 -0
  120. package/resources/ecc/commands/prp-implement.md +385 -0
  121. package/resources/ecc/commands/prp-plan.md +502 -0
  122. package/resources/ecc/commands/prp-pr.md +184 -0
  123. package/resources/ecc/commands/prp-prd.md +447 -0
  124. package/resources/ecc/commands/prune.md +31 -0
  125. package/resources/ecc/commands/python-review.md +297 -0
  126. package/resources/ecc/commands/quality-gate.md +33 -0
  127. package/resources/ecc/commands/refactor-clean.md +84 -0
  128. package/resources/ecc/commands/resume-session.md +156 -0
  129. package/resources/ecc/commands/review-pr.md +37 -0
  130. package/resources/ecc/commands/rust-build.md +187 -0
  131. package/resources/ecc/commands/rust-review.md +142 -0
  132. package/resources/ecc/commands/rust-test.md +308 -0
  133. package/resources/ecc/commands/santa-loop.md +175 -0
  134. package/resources/ecc/commands/save-session.md +275 -0
  135. package/resources/ecc/commands/security-scan.md +92 -0
  136. package/resources/ecc/commands/sessions.md +339 -0
  137. package/resources/ecc/commands/setup-pm.md +80 -0
  138. package/resources/ecc/commands/skill-create.md +174 -0
  139. package/resources/ecc/commands/skill-health.md +54 -0
  140. package/resources/ecc/commands/test-coverage.md +73 -0
  141. package/resources/ecc/commands/update-codemaps.md +76 -0
  142. package/resources/ecc/commands/update-docs.md +88 -0
  143. package/resources/ecc/rules/README.md +120 -0
  144. package/resources/ecc/rules/angular/coding-style.md +182 -0
  145. package/resources/ecc/rules/angular/hooks.md +25 -0
  146. package/resources/ecc/rules/angular/patterns.md +249 -0
  147. package/resources/ecc/rules/angular/security.md +87 -0
  148. package/resources/ecc/rules/angular/testing.md +164 -0
  149. package/resources/ecc/rules/arkts/coding-style.md +153 -0
  150. package/resources/ecc/rules/arkts/hooks.md +135 -0
  151. package/resources/ecc/rules/arkts/patterns.md +236 -0
  152. package/resources/ecc/rules/arkts/security.md +141 -0
  153. package/resources/ecc/rules/arkts/testing.md +126 -0
  154. package/resources/ecc/rules/{common-agents.md → common/agents.md} +2 -4
  155. package/resources/ecc/rules/common/code-review.md +124 -0
  156. package/resources/ecc/rules/{common-coding-style.md → common/coding-style.md} +42 -4
  157. package/resources/ecc/rules/common/development-workflow.md +44 -0
  158. package/resources/ecc/rules/{common-git-workflow.md → common/git-workflow.md} +1 -5
  159. package/resources/ecc/rules/{common-hooks.md → common/hooks.md} +0 -4
  160. package/resources/ecc/rules/{common-patterns.md → common/patterns.md} +0 -4
  161. package/resources/ecc/rules/{common-performance.md → common/performance.md} +0 -4
  162. package/resources/ecc/rules/{common-security.md → common/security.md} +0 -4
  163. package/resources/ecc/rules/{common-testing.md → common/testing.md} +28 -4
  164. package/resources/ecc/rules/cpp/coding-style.md +44 -0
  165. package/resources/ecc/rules/cpp/hooks.md +39 -0
  166. package/resources/ecc/rules/cpp/patterns.md +51 -0
  167. package/resources/ecc/rules/cpp/security.md +51 -0
  168. package/resources/ecc/rules/cpp/testing.md +44 -0
  169. package/resources/ecc/rules/csharp/coding-style.md +72 -0
  170. package/resources/ecc/rules/csharp/hooks.md +25 -0
  171. package/resources/ecc/rules/csharp/patterns.md +50 -0
  172. package/resources/ecc/rules/csharp/security.md +58 -0
  173. package/resources/ecc/rules/csharp/testing.md +46 -0
  174. package/resources/ecc/rules/dart/coding-style.md +159 -0
  175. package/resources/ecc/rules/dart/hooks.md +66 -0
  176. package/resources/ecc/rules/dart/patterns.md +261 -0
  177. package/resources/ecc/rules/dart/security.md +135 -0
  178. package/resources/ecc/rules/dart/testing.md +215 -0
  179. package/resources/ecc/rules/fsharp/coding-style.md +112 -0
  180. package/resources/ecc/rules/fsharp/hooks.md +26 -0
  181. package/resources/ecc/rules/fsharp/patterns.md +111 -0
  182. package/resources/ecc/rules/fsharp/security.md +76 -0
  183. package/resources/ecc/rules/fsharp/testing.md +62 -0
  184. package/resources/ecc/rules/{golang-coding-style.md → golang/coding-style.md} +6 -5
  185. package/resources/ecc/rules/{golang-hooks.md → golang/hooks.md} +5 -4
  186. package/resources/ecc/rules/{golang-patterns.md → golang/patterns.md} +5 -4
  187. package/resources/ecc/rules/{golang-security.md → golang/security.md} +5 -4
  188. package/resources/ecc/rules/{golang-testing.md → golang/testing.md} +5 -4
  189. package/resources/ecc/rules/java/coding-style.md +114 -0
  190. package/resources/ecc/rules/java/hooks.md +18 -0
  191. package/resources/ecc/rules/java/patterns.md +147 -0
  192. package/resources/ecc/rules/java/security.md +101 -0
  193. package/resources/ecc/rules/java/testing.md +133 -0
  194. package/resources/ecc/rules/kotlin/coding-style.md +86 -0
  195. package/resources/ecc/rules/{kotlin-hooks.md → kotlin/hooks.md} +5 -4
  196. package/resources/ecc/rules/kotlin/patterns.md +146 -0
  197. package/resources/ecc/rules/kotlin/security.md +82 -0
  198. package/resources/ecc/rules/kotlin/testing.md +128 -0
  199. package/resources/ecc/rules/perl/coding-style.md +46 -0
  200. package/resources/ecc/rules/perl/hooks.md +22 -0
  201. package/resources/ecc/rules/perl/patterns.md +76 -0
  202. package/resources/ecc/rules/perl/security.md +69 -0
  203. package/resources/ecc/rules/perl/testing.md +54 -0
  204. package/resources/ecc/rules/php/coding-style.md +40 -0
  205. package/resources/ecc/rules/{php-hooks.md → php/hooks.md} +7 -4
  206. package/resources/ecc/rules/php/patterns.md +33 -0
  207. package/resources/ecc/rules/php/security.md +37 -0
  208. package/resources/ecc/rules/php/testing.md +39 -0
  209. package/resources/ecc/rules/{python-coding-style.md → python/coding-style.md} +4 -4
  210. package/resources/ecc/rules/python/fastapi.md +58 -0
  211. package/resources/ecc/rules/{python-hooks.md → python/hooks.md} +4 -4
  212. package/resources/ecc/rules/{python-patterns.md → python/patterns.md} +4 -4
  213. package/resources/ecc/rules/{python-security.md → python/security.md} +4 -4
  214. package/resources/ecc/rules/{python-testing.md → python/testing.md} +4 -4
  215. package/resources/ecc/rules/ruby/coding-style.md +46 -0
  216. package/resources/ecc/rules/ruby/hooks.md +37 -0
  217. package/resources/ecc/rules/ruby/patterns.md +44 -0
  218. package/resources/ecc/rules/ruby/security.md +51 -0
  219. package/resources/ecc/rules/ruby/testing.md +51 -0
  220. package/resources/ecc/rules/rust/coding-style.md +151 -0
  221. package/resources/ecc/rules/rust/hooks.md +16 -0
  222. package/resources/ecc/rules/rust/patterns.md +168 -0
  223. package/resources/ecc/rules/rust/security.md +141 -0
  224. package/resources/ecc/rules/rust/testing.md +154 -0
  225. package/resources/ecc/rules/{swift-coding-style.md → swift/coding-style.md} +6 -6
  226. package/resources/ecc/rules/swift/hooks.md +20 -0
  227. package/resources/ecc/rules/{swift-patterns.md → swift/patterns.md} +5 -5
  228. package/resources/ecc/rules/{swift-security.md → swift/security.md} +7 -7
  229. package/resources/ecc/rules/{swift-testing.md → swift/testing.md} +5 -5
  230. package/resources/ecc/rules/typescript/coding-style.md +199 -0
  231. package/resources/ecc/rules/{typescript-hooks.md → typescript/hooks.md} +6 -4
  232. package/resources/ecc/rules/{typescript-patterns.md → typescript/patterns.md} +6 -4
  233. package/resources/ecc/rules/{typescript-security.md → typescript/security.md} +6 -4
  234. package/resources/ecc/rules/typescript/testing.md +18 -0
  235. package/resources/ecc/rules/web/coding-style.md +96 -0
  236. package/resources/ecc/rules/web/design-quality.md +63 -0
  237. package/resources/ecc/rules/web/hooks.md +129 -0
  238. package/resources/ecc/rules/web/patterns.md +79 -0
  239. package/resources/ecc/rules/web/performance.md +64 -0
  240. package/resources/ecc/rules/web/security.md +57 -0
  241. package/resources/ecc/rules/web/testing.md +55 -0
  242. package/resources/ecc/rules/zh/README.md +108 -0
  243. package/resources/ecc/rules/zh/agents.md +50 -0
  244. package/resources/ecc/rules/zh/code-review.md +124 -0
  245. package/resources/ecc/rules/zh/coding-style.md +48 -0
  246. package/resources/ecc/rules/zh/development-workflow.md +44 -0
  247. package/resources/ecc/rules/zh/git-workflow.md +24 -0
  248. package/resources/ecc/rules/zh/hooks.md +30 -0
  249. package/resources/ecc/rules/zh/patterns.md +31 -0
  250. package/resources/ecc/rules/zh/performance.md +55 -0
  251. package/resources/ecc/rules/zh/security.md +29 -0
  252. package/resources/ecc/rules/zh/testing.md +29 -0
  253. package/resources/ecc/skills/accessibility/SKILL.md +146 -0
  254. package/resources/ecc/skills/agent-architecture-audit/SKILL.md +256 -0
  255. package/resources/ecc/skills/agent-eval/SKILL.md +145 -0
  256. package/resources/ecc/skills/agent-harness-construction/SKILL.md +73 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +1 -0
  258. package/resources/ecc/skills/agent-payment-x402/SKILL.md +224 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +1 -0
  260. package/resources/ecc/skills/agentic-engineering/SKILL.md +63 -0
  261. package/resources/ecc/skills/agentic-os/SKILL.md +387 -0
  262. package/resources/ecc/skills/ai-first-engineering/SKILL.md +51 -0
  263. package/resources/ecc/skills/ai-regression-testing/SKILL.md +385 -0
  264. package/resources/ecc/skills/android-clean-architecture/SKILL.md +339 -0
  265. package/resources/ecc/skills/angular-developer/SKILL.md +154 -0
  266. package/resources/ecc/skills/angular-developer/references/angular-animations.md +160 -0
  267. package/resources/ecc/skills/angular-developer/references/angular-aria.md +410 -0
  268. package/resources/ecc/skills/angular-developer/references/cli.md +86 -0
  269. package/resources/ecc/skills/angular-developer/references/component-harnesses.md +59 -0
  270. package/resources/ecc/skills/angular-developer/references/component-styling.md +91 -0
  271. package/resources/ecc/skills/angular-developer/references/components.md +117 -0
  272. package/resources/ecc/skills/angular-developer/references/creating-services.md +97 -0
  273. package/resources/ecc/skills/angular-developer/references/data-resolvers.md +69 -0
  274. package/resources/ecc/skills/angular-developer/references/define-routes.md +67 -0
  275. package/resources/ecc/skills/angular-developer/references/defining-providers.md +72 -0
  276. package/resources/ecc/skills/angular-developer/references/di-fundamentals.md +120 -0
  277. package/resources/ecc/skills/angular-developer/references/e2e-testing.md +56 -0
  278. package/resources/ecc/skills/angular-developer/references/effects.md +83 -0
  279. package/resources/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -0
  280. package/resources/ecc/skills/angular-developer/references/host-elements.md +80 -0
  281. package/resources/ecc/skills/angular-developer/references/injection-context.md +63 -0
  282. package/resources/ecc/skills/angular-developer/references/inputs.md +101 -0
  283. package/resources/ecc/skills/angular-developer/references/linked-signal.md +59 -0
  284. package/resources/ecc/skills/angular-developer/references/loading-strategies.md +61 -0
  285. package/resources/ecc/skills/angular-developer/references/mcp.md +108 -0
  286. package/resources/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -0
  287. package/resources/ecc/skills/angular-developer/references/outputs.md +86 -0
  288. package/resources/ecc/skills/angular-developer/references/reactive-forms.md +122 -0
  289. package/resources/ecc/skills/angular-developer/references/rendering-strategies.md +44 -0
  290. package/resources/ecc/skills/angular-developer/references/resource.md +77 -0
  291. package/resources/ecc/skills/angular-developer/references/route-animations.md +56 -0
  292. package/resources/ecc/skills/angular-developer/references/route-guards.md +52 -0
  293. package/resources/ecc/skills/angular-developer/references/router-lifecycle.md +45 -0
  294. package/resources/ecc/skills/angular-developer/references/router-testing.md +87 -0
  295. package/resources/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
  296. package/resources/ecc/skills/angular-developer/references/signal-forms.md +795 -0
  297. package/resources/ecc/skills/angular-developer/references/signals-overview.md +94 -0
  298. package/resources/ecc/skills/angular-developer/references/tailwind-css.md +69 -0
  299. package/resources/ecc/skills/angular-developer/references/template-driven-forms.md +114 -0
  300. package/resources/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -0
  301. package/resources/ecc/skills/api-connector-builder/SKILL.md +120 -0
  302. package/resources/ecc/skills/api-design/SKILL.md +1 -0
  303. package/resources/ecc/skills/architecture-decision-records/SKILL.md +179 -0
  304. package/resources/ecc/skills/article-writing/SKILL.md +1 -0
  305. package/resources/ecc/skills/automation-audit-ops/SKILL.md +142 -0
  306. package/resources/ecc/skills/autonomous-agent-harness/SKILL.md +273 -0
  307. package/resources/ecc/skills/autonomous-loops/SKILL.md +610 -0
  308. package/resources/ecc/skills/backend-patterns/SKILL.md +8 -44
  309. package/resources/ecc/skills/benchmark/SKILL.md +93 -0
  310. package/resources/ecc/skills/blueprint/SKILL.md +105 -0
  311. package/resources/ecc/skills/brand-voice/SKILL.md +1 -0
  312. package/resources/ecc/skills/browser-qa/SKILL.md +87 -0
  313. package/resources/ecc/skills/bun-runtime/SKILL.md +1 -0
  314. package/resources/ecc/skills/canary-watch/SKILL.md +99 -0
  315. package/resources/ecc/skills/carrier-relationship-management/SKILL.md +212 -0
  316. package/resources/ecc/skills/cisco-ios-patterns/SKILL.md +163 -0
  317. package/resources/ecc/skills/ck/SKILL.md +147 -0
  318. package/resources/ecc/skills/ck/commands/forget.mjs +44 -0
  319. package/resources/ecc/skills/ck/commands/info.mjs +24 -0
  320. package/resources/ecc/skills/ck/commands/init.mjs +143 -0
  321. package/resources/ecc/skills/ck/commands/list.mjs +40 -0
  322. package/resources/ecc/skills/ck/commands/migrate.mjs +202 -0
  323. package/resources/ecc/skills/ck/commands/resume.mjs +36 -0
  324. package/resources/ecc/skills/ck/commands/save.mjs +210 -0
  325. package/resources/ecc/skills/ck/commands/shared.mjs +387 -0
  326. package/resources/ecc/skills/ck/hooks/session-start.mjs +224 -0
  327. package/resources/ecc/skills/claude-devfleet/SKILL.md +103 -0
  328. package/resources/ecc/skills/click-path-audit/SKILL.md +244 -0
  329. package/resources/ecc/skills/clickhouse-io/SKILL.md +439 -0
  330. package/resources/ecc/skills/code-tour/SKILL.md +236 -0
  331. package/resources/ecc/skills/codebase-onboarding/SKILL.md +233 -0
  332. package/resources/ecc/skills/coding-standards/SKILL.md +1 -0
  333. package/resources/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -0
  334. package/resources/ecc/skills/configure-ecc/SKILL.md +384 -0
  335. package/resources/ecc/skills/connections-optimizer/SKILL.md +189 -0
  336. package/resources/ecc/skills/content-engine/SKILL.md +1 -0
  337. package/resources/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -0
  338. package/resources/ecc/skills/context-budget/SKILL.md +135 -0
  339. package/resources/ecc/skills/continuous-agent-loop/SKILL.md +45 -0
  340. package/resources/ecc/skills/continuous-learning/SKILL.md +131 -0
  341. package/resources/ecc/skills/continuous-learning/config.json +18 -0
  342. package/resources/ecc/skills/continuous-learning/evaluate-session.sh +69 -0
  343. package/resources/ecc/skills/continuous-learning-v2/SKILL.md +360 -0
  344. package/resources/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +322 -0
  345. package/resources/ecc/skills/continuous-learning-v2/agents/observer.md +198 -0
  346. package/resources/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
  347. package/resources/ecc/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
  348. package/resources/ecc/skills/continuous-learning-v2/config.json +8 -0
  349. package/resources/ecc/skills/continuous-learning-v2/hooks/observe.sh +476 -0
  350. package/resources/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +288 -0
  351. package/resources/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1519 -0
  352. package/resources/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  353. package/resources/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  354. package/resources/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -0
  355. package/resources/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
  356. package/resources/ecc/skills/cost-tracking/SKILL.md +147 -0
  357. package/resources/ecc/skills/council/SKILL.md +203 -0
  358. package/resources/ecc/skills/cpp-coding-standards/SKILL.md +723 -0
  359. package/resources/ecc/skills/cpp-testing/SKILL.md +324 -0
  360. package/resources/ecc/skills/crosspost/SKILL.md +1 -0
  361. package/resources/ecc/skills/csharp-testing/SKILL.md +321 -0
  362. package/resources/ecc/skills/customer-billing-ops/SKILL.md +140 -0
  363. package/resources/ecc/skills/customs-trade-compliance/SKILL.md +263 -0
  364. package/resources/ecc/skills/dart-flutter-patterns/SKILL.md +563 -0
  365. package/resources/ecc/skills/dashboard-builder/SKILL.md +108 -0
  366. package/resources/ecc/skills/data-scraper-agent/SKILL.md +764 -0
  367. package/resources/ecc/skills/database-migrations/SKILL.md +429 -0
  368. package/resources/ecc/skills/deep-research/SKILL.md +5 -0
  369. package/resources/ecc/skills/defi-amm-security/SKILL.md +166 -0
  370. package/resources/ecc/skills/deployment-patterns/SKILL.md +427 -0
  371. package/resources/ecc/skills/design-system/SKILL.md +82 -0
  372. package/resources/ecc/skills/django-celery/SKILL.md +457 -0
  373. package/resources/ecc/skills/django-patterns/SKILL.md +734 -0
  374. package/resources/ecc/skills/django-security/SKILL.md +593 -0
  375. package/resources/ecc/skills/django-tdd/SKILL.md +729 -0
  376. package/resources/ecc/skills/django-verification/SKILL.md +469 -0
  377. package/resources/ecc/skills/dmux-workflows/SKILL.md +52 -4
  378. package/resources/ecc/skills/docker-patterns/SKILL.md +364 -0
  379. package/resources/ecc/skills/documentation-lookup/SKILL.md +1 -0
  380. package/resources/ecc/skills/dotnet-patterns/SKILL.md +321 -0
  381. package/resources/ecc/skills/e2e-testing/SKILL.md +1 -0
  382. package/resources/ecc/skills/ecc-guide/SKILL.md +189 -0
  383. package/resources/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -0
  384. package/resources/ecc/skills/email-ops/SKILL.md +121 -0
  385. package/resources/ecc/skills/energy-procurement/SKILL.md +228 -0
  386. package/resources/ecc/skills/enterprise-agent-ops/SKILL.md +50 -0
  387. package/resources/ecc/skills/error-handling/SKILL.md +376 -0
  388. package/resources/ecc/skills/eval-harness/SKILL.md +36 -1
  389. package/resources/ecc/skills/evm-token-decimals/SKILL.md +130 -0
  390. package/resources/ecc/skills/exa-search/SKILL.md +18 -80
  391. package/resources/ecc/skills/fal-ai-media/SKILL.md +32 -20
  392. package/resources/ecc/skills/fastapi-patterns/SKILL.md +327 -0
  393. package/resources/ecc/skills/finance-billing-ops/SKILL.md +127 -0
  394. package/resources/ecc/skills/flox-environments/SKILL.md +496 -0
  395. package/resources/ecc/skills/flutter-dart-code-review/SKILL.md +435 -0
  396. package/resources/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
  397. package/resources/ecc/skills/frontend-design-direction/SKILL.md +92 -0
  398. package/resources/ecc/skills/frontend-patterns/SKILL.md +1 -6
  399. package/resources/ecc/skills/frontend-slides/SKILL.md +2 -1
  400. package/resources/ecc/skills/frontend-slides/animation-patterns.md +122 -0
  401. package/resources/ecc/skills/frontend-slides/html-template.md +419 -0
  402. package/resources/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -0
  403. package/resources/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  404. package/resources/ecc/skills/frontend-slides/viewport-base.css +153 -0
  405. package/resources/ecc/skills/fsharp-testing/SKILL.md +280 -0
  406. package/resources/ecc/skills/gan-style-harness/SKILL.md +278 -0
  407. package/resources/ecc/skills/gateguard/SKILL.md +125 -0
  408. package/resources/ecc/skills/git-workflow/SKILL.md +715 -0
  409. package/resources/ecc/skills/github-ops/SKILL.md +144 -0
  410. package/resources/ecc/skills/golang-patterns/SKILL.md +674 -0
  411. package/resources/ecc/skills/golang-testing/SKILL.md +720 -0
  412. package/resources/ecc/skills/google-workspace-ops/SKILL.md +95 -0
  413. package/resources/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -0
  414. package/resources/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -0
  415. package/resources/ecc/skills/healthcare-eval-harness/SKILL.md +207 -0
  416. package/resources/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -0
  417. package/resources/ecc/skills/hermes-imports/SKILL.md +88 -0
  418. package/resources/ecc/skills/hexagonal-architecture/SKILL.md +276 -0
  419. package/resources/ecc/skills/hipaa-compliance/SKILL.md +78 -0
  420. package/resources/ecc/skills/homelab-network-readiness/SKILL.md +169 -0
  421. package/resources/ecc/skills/homelab-network-setup/SKILL.md +129 -0
  422. package/resources/ecc/skills/homelab-pihole-dns/SKILL.md +274 -0
  423. package/resources/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -0
  424. package/resources/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -0
  425. package/resources/ecc/skills/hookify-rules/SKILL.md +128 -0
  426. package/resources/ecc/skills/inventory-demand-planning/SKILL.md +247 -0
  427. package/resources/ecc/skills/investor-materials/SKILL.md +1 -0
  428. package/resources/ecc/skills/investor-outreach/SKILL.md +1 -0
  429. package/resources/ecc/skills/ios-icon-gen/SKILL.md +157 -0
  430. package/resources/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
  431. package/resources/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  432. package/resources/ecc/skills/iterative-retrieval/SKILL.md +211 -0
  433. package/resources/ecc/skills/java-coding-standards/SKILL.md +383 -0
  434. package/resources/ecc/skills/jira-integration/SKILL.md +293 -0
  435. package/resources/ecc/skills/jpa-patterns/SKILL.md +151 -0
  436. package/resources/ecc/skills/knowledge-ops/SKILL.md +154 -0
  437. package/resources/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -0
  438. package/resources/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -0
  439. package/resources/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -0
  440. package/resources/ecc/skills/kotlin-patterns/SKILL.md +711 -0
  441. package/resources/ecc/skills/kotlin-testing/SKILL.md +824 -0
  442. package/resources/ecc/skills/laravel-patterns/SKILL.md +415 -0
  443. package/resources/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -0
  444. package/resources/ecc/skills/laravel-security/SKILL.md +285 -0
  445. package/resources/ecc/skills/laravel-tdd/SKILL.md +283 -0
  446. package/resources/ecc/skills/laravel-verification/SKILL.md +179 -0
  447. package/resources/ecc/skills/lead-intelligence/SKILL.md +321 -0
  448. package/resources/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
  449. package/resources/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
  450. package/resources/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
  451. package/resources/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -0
  452. package/resources/ecc/skills/liquid-glass-design/SKILL.md +279 -0
  453. package/resources/ecc/skills/llm-trading-agent-security/SKILL.md +146 -0
  454. package/resources/ecc/skills/logistics-exception-management/SKILL.md +222 -0
  455. package/resources/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -0
  456. package/resources/ecc/skills/manim-video/SKILL.md +89 -0
  457. package/resources/ecc/skills/manim-video/assets/network_graph_scene.py +52 -0
  458. package/resources/ecc/skills/market-research/SKILL.md +1 -0
  459. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +3 -0
  460. package/resources/ecc/skills/messages-ops/SKILL.md +104 -0
  461. package/resources/ecc/skills/mle-workflow/SKILL.md +1 -1
  462. package/resources/ecc/skills/motion-advanced/SKILL.md +596 -0
  463. package/resources/ecc/skills/motion-foundations/SKILL.md +299 -0
  464. package/resources/ecc/skills/motion-patterns/SKILL.md +435 -0
  465. package/resources/ecc/skills/motion-ui/SKILL.md +575 -0
  466. package/resources/ecc/skills/mysql-patterns/SKILL.md +412 -0
  467. package/resources/ecc/skills/nanoclaw-repl/SKILL.md +33 -0
  468. package/resources/ecc/skills/nestjs-patterns/SKILL.md +230 -0
  469. package/resources/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -0
  470. package/resources/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -0
  471. package/resources/ecc/skills/network-config-validation/SKILL.md +210 -0
  472. package/resources/ecc/skills/network-interface-health/SKILL.md +152 -0
  473. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +1 -0
  474. package/resources/ecc/skills/nodejs-keccak256/SKILL.md +102 -0
  475. package/resources/ecc/skills/nutrient-document-processing/SKILL.md +167 -0
  476. package/resources/ecc/skills/nuxt4-patterns/SKILL.md +100 -0
  477. package/resources/ecc/skills/openclaw-persona-forge/SKILL.md +288 -0
  478. package/resources/ecc/skills/openclaw-persona-forge/gacha.py +224 -0
  479. package/resources/ecc/skills/openclaw-persona-forge/gacha.sh +5 -0
  480. package/resources/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
  481. package/resources/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
  482. package/resources/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -0
  483. package/resources/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
  484. package/resources/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -0
  485. package/resources/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -0
  486. package/resources/ecc/skills/opensource-pipeline/SKILL.md +255 -0
  487. package/resources/ecc/skills/perl-patterns/SKILL.md +504 -0
  488. package/resources/ecc/skills/perl-security/SKILL.md +503 -0
  489. package/resources/ecc/skills/perl-testing/SKILL.md +475 -0
  490. package/resources/ecc/skills/plan-orchestrate/SKILL.md +262 -0
  491. package/resources/ecc/skills/plankton-code-quality/SKILL.md +236 -0
  492. package/resources/ecc/skills/postgres-patterns/SKILL.md +147 -0
  493. package/resources/ecc/skills/product-capability/SKILL.md +1 -0
  494. package/resources/ecc/skills/product-lens/SKILL.md +92 -0
  495. package/resources/ecc/skills/production-audit/SKILL.md +206 -0
  496. package/resources/ecc/skills/production-scheduling/SKILL.md +238 -0
  497. package/resources/ecc/skills/project-flow-ops/SKILL.md +111 -0
  498. package/resources/ecc/skills/prompt-optimizer/SKILL.md +398 -0
  499. package/resources/ecc/skills/python-patterns/SKILL.md +750 -0
  500. package/resources/ecc/skills/python-testing/SKILL.md +816 -0
  501. package/resources/ecc/skills/pytorch-patterns/SKILL.md +396 -0
  502. package/resources/ecc/skills/quality-nonconformance/SKILL.md +260 -0
  503. package/resources/ecc/skills/quarkus-patterns/SKILL.md +722 -0
  504. package/resources/ecc/skills/quarkus-security/SKILL.md +467 -0
  505. package/resources/ecc/skills/quarkus-tdd/SKILL.md +811 -0
  506. package/resources/ecc/skills/quarkus-verification/SKILL.md +479 -0
  507. package/resources/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
  508. package/resources/ecc/skills/redis-patterns/SKILL.md +403 -0
  509. package/resources/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
  510. package/resources/ecc/skills/remotion-video-creation/SKILL.md +43 -0
  511. package/resources/ecc/skills/remotion-video-creation/rules/3d.md +86 -0
  512. package/resources/ecc/skills/remotion-video-creation/rules/animations.md +29 -0
  513. package/resources/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
  514. package/resources/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
  515. package/resources/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
  516. package/resources/ecc/skills/remotion-video-creation/rules/assets.md +78 -0
  517. package/resources/ecc/skills/remotion-video-creation/rules/audio.md +172 -0
  518. package/resources/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
  519. package/resources/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -0
  520. package/resources/ecc/skills/remotion-video-creation/rules/charts.md +58 -0
  521. package/resources/ecc/skills/remotion-video-creation/rules/compositions.md +146 -0
  522. package/resources/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -0
  523. package/resources/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -0
  524. package/resources/ecc/skills/remotion-video-creation/rules/fonts.md +152 -0
  525. package/resources/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
  526. package/resources/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
  527. package/resources/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
  528. package/resources/ecc/skills/remotion-video-creation/rules/gifs.md +138 -0
  529. package/resources/ecc/skills/remotion-video-creation/rules/images.md +130 -0
  530. package/resources/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
  531. package/resources/ecc/skills/remotion-video-creation/rules/lottie.md +67 -0
  532. package/resources/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
  533. package/resources/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -0
  534. package/resources/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -0
  535. package/resources/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -0
  536. package/resources/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -0
  537. package/resources/ecc/skills/remotion-video-creation/rules/timing.md +179 -0
  538. package/resources/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
  539. package/resources/ecc/skills/remotion-video-creation/rules/transitions.md +122 -0
  540. package/resources/ecc/skills/remotion-video-creation/rules/trimming.md +52 -0
  541. package/resources/ecc/skills/remotion-video-creation/rules/videos.md +171 -0
  542. package/resources/ecc/skills/repo-scan/SKILL.md +78 -0
  543. package/resources/ecc/skills/research-ops/SKILL.md +112 -0
  544. package/resources/ecc/skills/returns-reverse-logistics/SKILL.md +240 -0
  545. package/resources/ecc/skills/rules-distill/SKILL.md +264 -0
  546. package/resources/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -0
  547. package/resources/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -0
  548. package/resources/ecc/skills/rust-patterns/SKILL.md +499 -0
  549. package/resources/ecc/skills/rust-testing/SKILL.md +500 -0
  550. package/resources/ecc/skills/safety-guard/SKILL.md +75 -0
  551. package/resources/ecc/skills/santa-method/SKILL.md +306 -0
  552. package/resources/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -0
  553. package/resources/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -0
  554. package/resources/ecc/skills/scientific-pkg-gget/SKILL.md +166 -0
  555. package/resources/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -0
  556. package/resources/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  557. package/resources/ecc/skills/search-first/SKILL.md +182 -0
  558. package/resources/ecc/skills/security-bounty-hunter/SKILL.md +99 -0
  559. package/resources/ecc/skills/security-review/SKILL.md +11 -2
  560. package/resources/ecc/skills/security-review/cloud-infrastructure-security.md +361 -0
  561. package/resources/ecc/skills/security-scan/SKILL.md +165 -0
  562. package/resources/ecc/skills/seo/SKILL.md +154 -0
  563. package/resources/ecc/skills/skill-comply/SKILL.md +58 -0
  564. package/resources/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  565. package/resources/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  566. package/resources/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
  567. package/resources/ecc/skills/skill-comply/prompts/classifier.md +24 -0
  568. package/resources/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -0
  569. package/resources/ecc/skills/skill-comply/prompts/spec_generator.md +42 -0
  570. package/resources/ecc/skills/skill-comply/pyproject.toml +15 -0
  571. package/resources/ecc/skills/skill-comply/scripts/__init__.py +0 -0
  572. package/resources/ecc/skills/skill-comply/scripts/classifier.py +85 -0
  573. package/resources/ecc/skills/skill-comply/scripts/grader.py +124 -0
  574. package/resources/ecc/skills/skill-comply/scripts/parser.py +107 -0
  575. package/resources/ecc/skills/skill-comply/scripts/report.py +170 -0
  576. package/resources/ecc/skills/skill-comply/scripts/run.py +127 -0
  577. package/resources/ecc/skills/skill-comply/scripts/runner.py +186 -0
  578. package/resources/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -0
  579. package/resources/ecc/skills/skill-comply/scripts/spec_generator.py +72 -0
  580. package/resources/ecc/skills/skill-comply/scripts/utils.py +13 -0
  581. package/resources/ecc/skills/skill-comply/tests/test_grader.py +197 -0
  582. package/resources/ecc/skills/skill-comply/tests/test_parser.py +90 -0
  583. package/resources/ecc/skills/skill-comply/tests/test_runner.py +172 -0
  584. package/resources/ecc/skills/skill-scout/SKILL.md +140 -0
  585. package/resources/ecc/skills/skill-stocktake/SKILL.md +194 -0
  586. package/resources/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  587. package/resources/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
  588. package/resources/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
  589. package/resources/ecc/skills/social-graph-ranker/SKILL.md +154 -0
  590. package/resources/ecc/skills/springboot-patterns/SKILL.md +314 -0
  591. package/resources/ecc/skills/springboot-security/SKILL.md +272 -0
  592. package/resources/ecc/skills/springboot-tdd/SKILL.md +158 -0
  593. package/resources/ecc/skills/springboot-verification/SKILL.md +231 -0
  594. package/resources/ecc/skills/strategic-compact/SKILL.md +31 -2
  595. package/resources/ecc/skills/strategic-compact/suggest-compact.sh +54 -0
  596. package/resources/ecc/skills/swift-actor-persistence/SKILL.md +143 -0
  597. package/resources/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
  598. package/resources/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -0
  599. package/resources/ecc/skills/swiftui-patterns/SKILL.md +259 -0
  600. package/resources/ecc/skills/tdd-workflow/SKILL.md +54 -0
  601. package/resources/ecc/skills/team-builder/SKILL.md +168 -0
  602. package/resources/ecc/skills/terminal-ops/SKILL.md +109 -0
  603. package/resources/ecc/skills/tinystruct-patterns/SKILL.md +131 -0
  604. package/resources/ecc/skills/tinystruct-patterns/references/architecture.md +77 -0
  605. package/resources/ecc/skills/tinystruct-patterns/references/data-handling.md +35 -0
  606. package/resources/ecc/skills/tinystruct-patterns/references/routing.md +57 -0
  607. package/resources/ecc/skills/tinystruct-patterns/references/system-usage.md +74 -0
  608. package/resources/ecc/skills/tinystruct-patterns/references/testing.md +59 -0
  609. package/resources/ecc/skills/token-budget-advisor/SKILL.md +133 -0
  610. package/resources/ecc/skills/ui-demo/SKILL.md +465 -0
  611. package/resources/ecc/skills/ui-to-vue/SKILL.md +134 -0
  612. package/resources/ecc/skills/unified-notifications-ops/SKILL.md +187 -0
  613. package/resources/ecc/skills/verification-loop/SKILL.md +1 -0
  614. package/resources/ecc/skills/video-editing/SKILL.md +4 -1
  615. package/resources/ecc/skills/videodb/SKILL.md +374 -0
  616. package/resources/ecc/skills/videodb/reference/api-reference.md +550 -0
  617. package/resources/ecc/skills/videodb/reference/capture-reference.md +407 -0
  618. package/resources/ecc/skills/videodb/reference/capture.md +101 -0
  619. package/resources/ecc/skills/videodb/reference/editor.md +443 -0
  620. package/resources/ecc/skills/videodb/reference/generative.md +331 -0
  621. package/resources/ecc/skills/videodb/reference/rtstream-reference.md +564 -0
  622. package/resources/ecc/skills/videodb/reference/rtstream.md +65 -0
  623. package/resources/ecc/skills/videodb/reference/search.md +230 -0
  624. package/resources/ecc/skills/videodb/reference/streaming.md +406 -0
  625. package/resources/ecc/skills/videodb/reference/use-cases.md +118 -0
  626. package/resources/ecc/skills/videodb/scripts/ws_listener.py +282 -0
  627. package/resources/ecc/skills/visa-doc-translate/README.md +86 -0
  628. package/resources/ecc/skills/visa-doc-translate/SKILL.md +117 -0
  629. package/resources/ecc/skills/vite-patterns/SKILL.md +449 -0
  630. package/resources/ecc/skills/windows-desktop-e2e/SKILL.md +788 -0
  631. package/resources/ecc/skills/workspace-surface-audit/SKILL.md +125 -0
  632. package/resources/ecc/skills/x-api/SKILL.md +5 -0
  633. package/resources/ecc/agents/architect.json +0 -16
  634. package/resources/ecc/agents/build-error-resolver.json +0 -17
  635. package/resources/ecc/agents/chief-of-staff.json +0 -17
  636. package/resources/ecc/agents/code-reviewer.json +0 -16
  637. package/resources/ecc/agents/database-reviewer.json +0 -16
  638. package/resources/ecc/agents/doc-updater.json +0 -16
  639. package/resources/ecc/agents/e2e-runner.json +0 -17
  640. package/resources/ecc/agents/go-build-resolver.json +0 -17
  641. package/resources/ecc/agents/go-reviewer.json +0 -16
  642. package/resources/ecc/agents/harness-optimizer.json +0 -15
  643. package/resources/ecc/agents/loop-operator.json +0 -16
  644. package/resources/ecc/agents/planner.json +0 -15
  645. package/resources/ecc/agents/python-reviewer.json +0 -16
  646. package/resources/ecc/agents/refactor-cleaner.json +0 -17
  647. package/resources/ecc/agents/security-reviewer.json +0 -16
  648. package/resources/ecc/agents/tdd-guide.json +0 -17
  649. package/resources/ecc/commands/add-language-rules.md +0 -39
  650. package/resources/ecc/commands/database-migration.md +0 -36
  651. package/resources/ecc/commands/feature-development.md +0 -38
  652. package/resources/ecc/rules/common-development-workflow.md +0 -33
  653. package/resources/ecc/rules/kotlin-coding-style.md +0 -39
  654. package/resources/ecc/rules/kotlin-patterns.md +0 -50
  655. package/resources/ecc/rules/kotlin-security.md +0 -58
  656. package/resources/ecc/rules/kotlin-testing.md +0 -38
  657. package/resources/ecc/rules/php-coding-style.md +0 -25
  658. package/resources/ecc/rules/php-patterns.md +0 -23
  659. package/resources/ecc/rules/php-security.md +0 -24
  660. package/resources/ecc/rules/php-testing.md +0 -26
  661. package/resources/ecc/rules/swift-hooks.md +0 -20
  662. package/resources/ecc/rules/typescript-coding-style.md +0 -63
  663. package/resources/ecc/rules/typescript-testing.md +0 -16
  664. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +0 -7
  665. package/resources/ecc/skills/agent-sort/agents/openai.yaml +0 -7
  666. package/resources/ecc/skills/api-design/agents/openai.yaml +0 -7
  667. package/resources/ecc/skills/article-writing/agents/openai.yaml +0 -7
  668. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +0 -7
  669. package/resources/ecc/skills/brand-voice/agents/openai.yaml +0 -7
  670. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +0 -7
  671. package/resources/ecc/skills/coding-standards/agents/openai.yaml +0 -7
  672. package/resources/ecc/skills/content-engine/agents/openai.yaml +0 -7
  673. package/resources/ecc/skills/crosspost/agents/openai.yaml +0 -7
  674. package/resources/ecc/skills/deep-research/agents/openai.yaml +0 -7
  675. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +0 -7
  676. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +0 -7
  677. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +0 -7
  678. package/resources/ecc/skills/eval-harness/agents/openai.yaml +0 -7
  679. package/resources/ecc/skills/everything-claude-code/SKILL.md +0 -442
  680. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +0 -7
  681. package/resources/ecc/skills/exa-search/agents/openai.yaml +0 -7
  682. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +0 -7
  683. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +0 -7
  684. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +0 -7
  685. package/resources/ecc/skills/investor-materials/agents/openai.yaml +0 -7
  686. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +0 -7
  687. package/resources/ecc/skills/market-research/agents/openai.yaml +0 -7
  688. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +0 -7
  689. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +0 -7
  690. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +0 -7
  691. package/resources/ecc/skills/product-capability/agents/openai.yaml +0 -7
  692. package/resources/ecc/skills/security-review/agents/openai.yaml +0 -7
  693. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +0 -7
  694. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +0 -7
  695. package/resources/ecc/skills/verification-loop/agents/openai.yaml +0 -7
  696. package/resources/ecc/skills/video-editing/agents/openai.yaml +0 -7
  697. package/resources/ecc/skills/x-api/agents/openai.yaml +0 -7
@@ -0,0 +1,72 @@
1
+ """Generate compliance specs from skill files using LLM."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import subprocess
6
+ import tempfile
7
+ from pathlib import Path
8
+
9
+ import yaml
10
+
11
+ from scripts.parser import ComplianceSpec, parse_spec
12
+ from scripts.utils import extract_yaml
13
+
14
+ PROMPTS_DIR = Path(__file__).parent.parent / "prompts"
15
+
16
+
17
+ def generate_spec(
18
+ skill_path: Path,
19
+ model: str = "haiku",
20
+ max_retries: int = 2,
21
+ ) -> ComplianceSpec:
22
+ """Generate a compliance spec from a skill/rule file.
23
+
24
+ Calls claude -p with the spec_generator prompt, parses YAML output.
25
+ Retries on YAML parse errors with error feedback.
26
+ """
27
+ skill_content = skill_path.read_text()
28
+ prompt_template = (PROMPTS_DIR / "spec_generator.md").read_text()
29
+ base_prompt = prompt_template.replace("{skill_content}", skill_content)
30
+
31
+ last_error: Exception | None = None
32
+
33
+ for attempt in range(max_retries + 1):
34
+ prompt = base_prompt
35
+ if attempt > 0 and last_error is not None:
36
+ prompt += (
37
+ f"\n\nPREVIOUS ATTEMPT FAILED with YAML parse error:\n"
38
+ f"{last_error}\n\n"
39
+ f"Please fix the YAML. Remember to quote all string values "
40
+ f"that contain colons, e.g.: description: \"Use type: description format\""
41
+ )
42
+
43
+ result = subprocess.run(
44
+ ["claude", "-p", prompt, "--model", model, "--output-format", "text"],
45
+ capture_output=True,
46
+ text=True,
47
+ timeout=120,
48
+ )
49
+
50
+ if result.returncode != 0:
51
+ raise RuntimeError(f"claude -p failed: {result.stderr}")
52
+
53
+ raw_yaml = extract_yaml(result.stdout)
54
+
55
+ tmp_path = None
56
+ with tempfile.NamedTemporaryFile(
57
+ mode="w", suffix=".yaml", delete=False,
58
+ ) as f:
59
+ f.write(raw_yaml)
60
+ tmp_path = Path(f.name)
61
+
62
+ try:
63
+ return parse_spec(tmp_path)
64
+ except (yaml.YAMLError, KeyError, TypeError) as e:
65
+ last_error = e
66
+ if attempt == max_retries:
67
+ raise
68
+ finally:
69
+ if tmp_path is not None:
70
+ tmp_path.unlink(missing_ok=True)
71
+
72
+ raise RuntimeError("unreachable")
@@ -0,0 +1,13 @@
1
+ """Shared utilities for skill-comply scripts."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ def extract_yaml(text: str) -> str:
7
+ """Extract YAML from LLM output, stripping markdown fences if present."""
8
+ lines = text.strip().splitlines()
9
+ if lines and lines[0].startswith("```"):
10
+ lines = lines[1:]
11
+ if lines and lines[-1].startswith("```"):
12
+ lines = lines[:-1]
13
+ return "\n".join(lines)
@@ -0,0 +1,197 @@
1
+ """Tests for grader module — compliance scoring with LLM classification."""
2
+
3
+ from pathlib import Path
4
+ from unittest.mock import patch
5
+
6
+ import pytest
7
+
8
+ from scripts.grader import ComplianceResult, StepResult, grade
9
+ from scripts.parser import ComplianceSpec, Detector, ObservationEvent, Step, parse_spec, parse_trace
10
+
11
+ FIXTURES = Path(__file__).parent.parent / "fixtures"
12
+
13
+
14
+ @pytest.fixture
15
+ def tdd_spec():
16
+ return parse_spec(FIXTURES / "tdd_spec.yaml")
17
+
18
+
19
+ @pytest.fixture
20
+ def compliant_trace():
21
+ return parse_trace(FIXTURES / "compliant_trace.jsonl")
22
+
23
+
24
+ @pytest.fixture
25
+ def noncompliant_trace():
26
+ return parse_trace(FIXTURES / "noncompliant_trace.jsonl")
27
+
28
+
29
+ def _mock_compliant_classification(spec, trace, model="haiku"): # noqa: ARG001
30
+ """Simulate LLM correctly classifying a compliant trace."""
31
+ return {
32
+ "write_test": [0],
33
+ "run_test_red": [1],
34
+ "write_impl": [2],
35
+ "run_test_green": [3],
36
+ "refactor": [4],
37
+ }
38
+
39
+
40
+ def _mock_noncompliant_classification(spec, trace, model="haiku"):
41
+ """Simulate LLM classifying a noncompliant trace (impl before test)."""
42
+ return {
43
+ "write_impl": [0], # src/fib.py written first
44
+ "write_test": [1], # test written second
45
+ "run_test_green": [2], # only a passing test run
46
+ }
47
+
48
+
49
+ def _mock_empty_classification(spec, trace, model="haiku"):
50
+ return {}
51
+
52
+
53
+ class TestGradeCompliant:
54
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
55
+ def test_returns_compliance_result(self, mock_cls, tdd_spec, compliant_trace) -> None:
56
+ result = grade(tdd_spec, compliant_trace)
57
+ assert isinstance(result, ComplianceResult)
58
+
59
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
60
+ def test_full_compliance(self, mock_cls, tdd_spec, compliant_trace) -> None:
61
+ result = grade(tdd_spec, compliant_trace)
62
+ assert result.compliance_rate == 1.0
63
+
64
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
65
+ def test_all_required_steps_detected(self, mock_cls, tdd_spec, compliant_trace) -> None:
66
+ result = grade(tdd_spec, compliant_trace)
67
+ required_results = [s for s in result.steps if s.step_id in
68
+ ("write_test", "run_test_red", "write_impl", "run_test_green")]
69
+ assert all(s.detected for s in required_results)
70
+
71
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
72
+ def test_optional_step_detected(self, mock_cls, tdd_spec, compliant_trace) -> None:
73
+ result = grade(tdd_spec, compliant_trace)
74
+ refactor = next(s for s in result.steps if s.step_id == "refactor")
75
+ assert refactor.detected is True
76
+
77
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
78
+ def test_no_hook_promotion_recommended(self, mock_cls, tdd_spec, compliant_trace) -> None:
79
+ result = grade(tdd_spec, compliant_trace)
80
+ assert result.recommend_hook_promotion is False
81
+
82
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
83
+ def test_step_evidence_not_empty(self, mock_cls, tdd_spec, compliant_trace) -> None:
84
+ result = grade(tdd_spec, compliant_trace)
85
+ for step in result.steps:
86
+ if step.detected:
87
+ assert len(step.evidence) > 0
88
+
89
+
90
+ class TestGradeNoncompliant:
91
+ @patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
92
+ def test_low_compliance(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
93
+ result = grade(tdd_spec, noncompliant_trace)
94
+ assert result.compliance_rate < 1.0
95
+
96
+ @patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
97
+ def test_write_test_fails_ordering(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
98
+ """write_test has before_step=write_impl, but test is written AFTER impl."""
99
+ result = grade(tdd_spec, noncompliant_trace)
100
+ write_test = next(s for s in result.steps if s.step_id == "write_test")
101
+ assert write_test.detected is False
102
+
103
+ @patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
104
+ def test_run_test_red_not_detected(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
105
+ result = grade(tdd_spec, noncompliant_trace)
106
+ run_red = next(s for s in result.steps if s.step_id == "run_test_red")
107
+ assert run_red.detected is False
108
+
109
+ @patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
110
+ def test_hook_promotion_recommended(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
111
+ result = grade(tdd_spec, noncompliant_trace)
112
+ assert result.recommend_hook_promotion is True
113
+
114
+ @patch("scripts.grader.classify_events", side_effect=_mock_noncompliant_classification)
115
+ def test_failure_reasons_present(self, mock_cls, tdd_spec, noncompliant_trace) -> None:
116
+ result = grade(tdd_spec, noncompliant_trace)
117
+ failed_steps = [s for s in result.steps if not s.detected and s.step_id != "refactor"]
118
+ for step in failed_steps:
119
+ assert step.failure_reason is not None
120
+
121
+
122
+ class TestGradeEdgeCases:
123
+ @patch("scripts.grader.classify_events", side_effect=_mock_empty_classification)
124
+ def test_empty_trace(self, mock_cls, tdd_spec) -> None:
125
+ result = grade(tdd_spec, [])
126
+ assert result.compliance_rate == 0.0
127
+ assert result.recommend_hook_promotion is True
128
+
129
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
130
+ def test_compliance_rate_is_ratio_of_required_only(self, mock_cls, tdd_spec, compliant_trace) -> None:
131
+ result = grade(tdd_spec, compliant_trace)
132
+ assert result.compliance_rate == 1.0
133
+
134
+ @patch("scripts.grader.classify_events", side_effect=_mock_compliant_classification)
135
+ def test_spec_id_in_result(self, mock_cls, tdd_spec, compliant_trace) -> None:
136
+ result = grade(tdd_spec, compliant_trace)
137
+ assert result.spec_id == "tdd-workflow"
138
+
139
+ @patch("scripts.grader.classify_events")
140
+ def test_after_step_can_reference_later_declared_spec_step(self, mock_cls) -> None:
141
+ spec = ComplianceSpec(
142
+ id="out-of-order-after-step",
143
+ name="Out of order after_step",
144
+ source_rule="rules/common/testing.md",
145
+ version="1.0",
146
+ steps=(
147
+ Step(
148
+ id="step_a",
149
+ description="Occurs after step_b even though it is declared first",
150
+ required=True,
151
+ detector=Detector(
152
+ description="Event A",
153
+ after_step="step_b",
154
+ ),
155
+ ),
156
+ Step(
157
+ id="step_b",
158
+ description="Reference step declared later",
159
+ required=True,
160
+ detector=Detector(
161
+ description="Event B",
162
+ ),
163
+ ),
164
+ ),
165
+ threshold_promote_to_hook=0.5,
166
+ )
167
+ trace = [
168
+ ObservationEvent(
169
+ timestamp="2026-03-20T10:00:01Z",
170
+ event="tool_complete",
171
+ tool="Write",
172
+ session="sess-order",
173
+ input='{"file_path":"src/b.py"}',
174
+ output="step b",
175
+ ),
176
+ ObservationEvent(
177
+ timestamp="2026-03-20T10:00:02Z",
178
+ event="tool_complete",
179
+ tool="Write",
180
+ session="sess-order",
181
+ input='{"file_path":"src/a.py"}',
182
+ output="step a",
183
+ ),
184
+ ]
185
+ mock_cls.return_value = {
186
+ "step_a": [1],
187
+ "step_b": [0],
188
+ }
189
+
190
+ result = grade(spec, trace)
191
+
192
+ step_a = next(step for step in result.steps if step.step_id == "step_a")
193
+ step_b = next(step for step in result.steps if step.step_id == "step_b")
194
+ assert step_a.detected is True
195
+ assert step_a.failure_reason is None
196
+ assert step_b.detected is True
197
+ assert result.compliance_rate == 1.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,140 @@
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
+ "everything-claude-code" keyword
69
+ ```
70
+
71
+ ### Step 4 - Vet External Matches
72
+
73
+ Before recommending any external skill for adoption or forking:
74
+
75
+ - Read the `SKILL.md` frontmatter and instructions.
76
+ - Look for unexpected shell commands, file writes, network calls, credential
77
+ handling, or package installs.
78
+ - Check whether the repository appears maintained.
79
+ - Prefer copying into a fresh local branch and reviewing the diff over editing
80
+ marketplace originals.
81
+
82
+ ### Step 5 - Rank Results
83
+
84
+ Rank candidates by:
85
+
86
+ 1. Exact keyword match in the skill name.
87
+ 2. Keyword or synonym match in description.
88
+ 3. Local installed or marketplace source.
89
+ 4. Maintained GitHub source with recent activity.
90
+ 5. Web-only mention.
91
+
92
+ Cap the final list at 10 results.
93
+
94
+ ### Step 6 - Present Decision Options
95
+
96
+ Give the user a short table:
97
+
98
+ | Option | Meaning |
99
+ | --- | --- |
100
+ | Use existing | Invoke or install a matching skill as-is. |
101
+ | Fork or extend | Copy the closest skill and modify it. |
102
+ | Create fresh | Build a new skill after confirming no close match exists. |
103
+
104
+ Only create a new skill after the user chooses that path or after the search
105
+ finds no close match.
106
+
107
+ ## Examples
108
+
109
+ ### Result Table
110
+
111
+ ```markdown
112
+ | # | Skill | Source | Why it matches | Gap |
113
+ | --- | --- | --- | --- | --- |
114
+ | 1 | article-writing | Local ECC | Drafts articles and guides | Not focused on release notes |
115
+ | 2 | content-engine | Local ECC | Multi-format content workflow | Heavier than needed |
116
+ | 3 | blog-writer | GitHub | Blog writing skill with recent commits | Needs security review |
117
+ ```
118
+
119
+ ### User-Facing Summary
120
+
121
+ ```markdown
122
+ I found two close local matches and one external candidate. The closest fit is
123
+ `article-writing`; it covers drafting and revision, but it does not include the
124
+ release-note checklist you asked for. I can either use it as-is, fork it into a
125
+ release-note variant, or create a fresh skill.
126
+ ```
127
+
128
+ ## Anti-Patterns
129
+
130
+ - Do not jump directly to new skill creation when a search is reasonable.
131
+ - Do not install external skills without reading them first.
132
+ - Do not present a long unranked list of weak matches.
133
+ - Do not treat web-only mentions as trusted sources.
134
+ - Do not edit installed marketplace originals in place.
135
+
136
+ ## Related
137
+
138
+ - `search-first` - General search-before-building workflow.
139
+ - `skill-stocktake` - Audit installed skills for health, duplicates, and gaps.
140
+ - `agent-sort` - Categorize and organize existing agents and skills.