agim-cli 1.2.144 → 1.2.148

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 (611) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/dist/cli-ui/setup-llm.d.ts.map +1 -1
  3. package/dist/cli-ui/setup-llm.js +3 -1
  4. package/dist/cli-ui/setup-llm.js.map +1 -1
  5. package/dist/core/circuit-breaker.d.ts +28 -0
  6. package/dist/core/circuit-breaker.d.ts.map +1 -1
  7. package/dist/core/circuit-breaker.js +45 -0
  8. package/dist/core/circuit-breaker.js.map +1 -1
  9. package/dist/core/intent.d.ts.map +1 -1
  10. package/dist/core/intent.js +3 -1
  11. package/dist/core/intent.js.map +1 -1
  12. package/dist/core/llm/agent-loop.d.ts +9 -1
  13. package/dist/core/llm/agent-loop.d.ts.map +1 -1
  14. package/dist/core/llm/agent-loop.js +80 -1
  15. package/dist/core/llm/agent-loop.js.map +1 -1
  16. package/dist/core/llm/anthropic-provider.d.ts.map +1 -1
  17. package/dist/core/llm/anthropic-provider.js +18 -4
  18. package/dist/core/llm/anthropic-provider.js.map +1 -1
  19. package/dist/core/llm/hallucination-detector.d.ts +33 -0
  20. package/dist/core/llm/hallucination-detector.d.ts.map +1 -0
  21. package/dist/core/llm/hallucination-detector.js +103 -0
  22. package/dist/core/llm/hallucination-detector.js.map +1 -0
  23. package/dist/core/llm/imhub-dispatcher.d.ts.map +1 -1
  24. package/dist/core/llm/imhub-dispatcher.js +7 -0
  25. package/dist/core/llm/imhub-dispatcher.js.map +1 -1
  26. package/dist/core/llm/provider-base.d.ts +9 -0
  27. package/dist/core/llm/provider-base.d.ts.map +1 -1
  28. package/dist/core/llm/provider-base.js.map +1 -1
  29. package/dist/core/memory-distill.d.ts.map +1 -1
  30. package/dist/core/memory-distill.js +18 -3
  31. package/dist/core/memory-distill.js.map +1 -1
  32. package/dist/core/memory.d.ts +14 -0
  33. package/dist/core/memory.d.ts.map +1 -1
  34. package/dist/core/memory.js +39 -0
  35. package/dist/core/memory.js.map +1 -1
  36. package/dist/core/message-sink.d.ts +6 -0
  37. package/dist/core/message-sink.d.ts.map +1 -1
  38. package/dist/core/message-sink.js +18 -3
  39. package/dist/core/message-sink.js.map +1 -1
  40. package/dist/core/outbox.d.ts +30 -2
  41. package/dist/core/outbox.d.ts.map +1 -1
  42. package/dist/core/outbox.js +102 -10
  43. package/dist/core/outbox.js.map +1 -1
  44. package/dist/core/reminders.d.ts.map +1 -1
  45. package/dist/core/reminders.js +11 -1
  46. package/dist/core/reminders.js.map +1 -1
  47. package/dist/core/router.d.ts.map +1 -1
  48. package/dist/core/router.js +16 -4
  49. package/dist/core/router.js.map +1 -1
  50. package/dist/core/schedule.d.ts +18 -0
  51. package/dist/core/schedule.d.ts.map +1 -1
  52. package/dist/core/schedule.js +80 -17
  53. package/dist/core/schedule.js.map +1 -1
  54. package/dist/core/sensitive-paths.d.ts.map +1 -1
  55. package/dist/core/sensitive-paths.js +53 -9
  56. package/dist/core/sensitive-paths.js.map +1 -1
  57. package/dist/core/skills/builtin/ECC_LICENSE +21 -0
  58. package/dist/core/skills/builtin/ECC_NOTICE.md +22 -0
  59. package/dist/core/skills/builtin/accessibility/SKILL.md +146 -0
  60. package/dist/core/skills/builtin/agent-eval/SKILL.md +145 -0
  61. package/dist/core/skills/builtin/agent-harness-construction/SKILL.md +73 -0
  62. package/dist/core/skills/builtin/agent-introspection-debugging/SKILL.md +153 -0
  63. package/dist/core/skills/builtin/agentic-engineering/SKILL.md +63 -0
  64. package/dist/core/skills/builtin/ai-first-engineering/SKILL.md +51 -0
  65. package/dist/core/skills/builtin/ai-regression-testing/SKILL.md +385 -0
  66. package/dist/core/skills/builtin/android-clean-architecture/SKILL.md +339 -0
  67. package/dist/core/skills/builtin/angular-developer/SKILL.md +154 -0
  68. package/dist/core/skills/builtin/angular-developer/references/angular-animations.md +160 -0
  69. package/dist/core/skills/builtin/angular-developer/references/angular-aria.md +410 -0
  70. package/dist/core/skills/builtin/angular-developer/references/cli.md +86 -0
  71. package/dist/core/skills/builtin/angular-developer/references/component-harnesses.md +59 -0
  72. package/dist/core/skills/builtin/angular-developer/references/component-styling.md +91 -0
  73. package/dist/core/skills/builtin/angular-developer/references/components.md +117 -0
  74. package/dist/core/skills/builtin/angular-developer/references/creating-services.md +97 -0
  75. package/dist/core/skills/builtin/angular-developer/references/data-resolvers.md +69 -0
  76. package/dist/core/skills/builtin/angular-developer/references/define-routes.md +67 -0
  77. package/dist/core/skills/builtin/angular-developer/references/defining-providers.md +72 -0
  78. package/dist/core/skills/builtin/angular-developer/references/di-fundamentals.md +120 -0
  79. package/dist/core/skills/builtin/angular-developer/references/e2e-testing.md +56 -0
  80. package/dist/core/skills/builtin/angular-developer/references/effects.md +83 -0
  81. package/dist/core/skills/builtin/angular-developer/references/hierarchical-injectors.md +43 -0
  82. package/dist/core/skills/builtin/angular-developer/references/host-elements.md +80 -0
  83. package/dist/core/skills/builtin/angular-developer/references/injection-context.md +63 -0
  84. package/dist/core/skills/builtin/angular-developer/references/inputs.md +101 -0
  85. package/dist/core/skills/builtin/angular-developer/references/linked-signal.md +59 -0
  86. package/dist/core/skills/builtin/angular-developer/references/loading-strategies.md +61 -0
  87. package/dist/core/skills/builtin/angular-developer/references/mcp.md +108 -0
  88. package/dist/core/skills/builtin/angular-developer/references/navigate-to-routes.md +69 -0
  89. package/dist/core/skills/builtin/angular-developer/references/outputs.md +86 -0
  90. package/dist/core/skills/builtin/angular-developer/references/reactive-forms.md +122 -0
  91. package/dist/core/skills/builtin/angular-developer/references/rendering-strategies.md +44 -0
  92. package/dist/core/skills/builtin/angular-developer/references/resource.md +77 -0
  93. package/dist/core/skills/builtin/angular-developer/references/route-animations.md +56 -0
  94. package/dist/core/skills/builtin/angular-developer/references/route-guards.md +52 -0
  95. package/dist/core/skills/builtin/angular-developer/references/router-lifecycle.md +45 -0
  96. package/dist/core/skills/builtin/angular-developer/references/router-testing.md +87 -0
  97. package/dist/core/skills/builtin/angular-developer/references/show-routes-with-outlets.md +68 -0
  98. package/dist/core/skills/builtin/angular-developer/references/signal-forms.md +795 -0
  99. package/dist/core/skills/builtin/angular-developer/references/signals-overview.md +94 -0
  100. package/dist/core/skills/builtin/angular-developer/references/tailwind-css.md +69 -0
  101. package/dist/core/skills/builtin/angular-developer/references/template-driven-forms.md +114 -0
  102. package/dist/core/skills/builtin/angular-developer/references/testing-fundamentals.md +65 -0
  103. package/dist/core/skills/builtin/api-connector-builder/SKILL.md +120 -0
  104. package/dist/core/skills/builtin/api-design/SKILL.md +523 -0
  105. package/dist/core/skills/builtin/architecture-decision-records/SKILL.md +179 -0
  106. package/dist/core/skills/builtin/article-writing/SKILL.md +79 -0
  107. package/dist/core/skills/builtin/automation-audit-ops/SKILL.md +142 -0
  108. package/dist/core/skills/builtin/autonomous-agent-harness/SKILL.md +273 -0
  109. package/dist/core/skills/builtin/autonomous-loops/SKILL.md +610 -0
  110. package/dist/core/skills/builtin/backend-patterns/SKILL.md +561 -0
  111. package/dist/core/skills/builtin/benchmark/SKILL.md +93 -0
  112. package/dist/core/skills/builtin/benchmark-optimization-loop/SKILL.md +69 -0
  113. package/dist/core/skills/builtin/blueprint/SKILL.md +105 -0
  114. package/dist/core/skills/builtin/browser-qa/SKILL.md +87 -0
  115. package/dist/core/skills/builtin/bun-runtime/SKILL.md +84 -0
  116. package/dist/core/skills/builtin/cisco-ios-patterns/SKILL.md +163 -0
  117. package/dist/core/skills/builtin/claude-devfleet/SKILL.md +111 -0
  118. package/dist/core/skills/builtin/click-path-audit/SKILL.md +244 -0
  119. package/dist/core/skills/builtin/clickhouse-io/SKILL.md +439 -0
  120. package/dist/core/skills/builtin/code-tour/SKILL.md +236 -0
  121. package/dist/core/skills/builtin/codebase-onboarding/SKILL.md +233 -0
  122. package/dist/core/skills/builtin/codehealth-mcp/SKILL.md +166 -0
  123. package/dist/core/skills/builtin/coding-standards/SKILL.md +550 -0
  124. package/dist/core/skills/builtin/compose-multiplatform-patterns/SKILL.md +299 -0
  125. package/dist/core/skills/builtin/config-gc/SKILL.md +119 -0
  126. package/dist/core/skills/builtin/content-hash-cache-pattern/SKILL.md +161 -0
  127. package/dist/core/skills/builtin/context-budget/SKILL.md +135 -0
  128. package/dist/core/skills/builtin/continuous-agent-loop/SKILL.md +45 -0
  129. package/dist/core/skills/builtin/continuous-learning/SKILL.md +131 -0
  130. package/dist/core/skills/builtin/continuous-learning/config.json +18 -0
  131. package/dist/core/skills/builtin/continuous-learning/evaluate-session.sh +69 -0
  132. package/dist/core/skills/builtin/continuous-learning-v2/SKILL.md +360 -0
  133. package/dist/core/skills/builtin/continuous-learning-v2/agents/observer-loop.sh +335 -0
  134. package/dist/core/skills/builtin/continuous-learning-v2/agents/observer.md +198 -0
  135. package/dist/core/skills/builtin/continuous-learning-v2/agents/session-guardian.sh +150 -0
  136. package/dist/core/skills/builtin/continuous-learning-v2/agents/start-observer.sh +248 -0
  137. package/dist/core/skills/builtin/continuous-learning-v2/config.json +8 -0
  138. package/dist/core/skills/builtin/continuous-learning-v2/hooks/observe.sh +498 -0
  139. package/dist/core/skills/builtin/continuous-learning-v2/scripts/detect-project.sh +322 -0
  140. package/dist/core/skills/builtin/continuous-learning-v2/scripts/instinct-cli.py +1914 -0
  141. package/dist/core/skills/builtin/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
  142. package/dist/core/skills/builtin/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -0
  143. package/dist/core/skills/builtin/continuous-learning-v2/scripts/test_parse_instinct.py +1045 -0
  144. package/dist/core/skills/builtin/cost-aware-llm-pipeline/SKILL.md +183 -0
  145. package/dist/core/skills/builtin/cost-tracking/SKILL.md +147 -0
  146. package/dist/core/skills/builtin/council/SKILL.md +203 -0
  147. package/dist/core/skills/builtin/cpp-coding-standards/SKILL.md +723 -0
  148. package/dist/core/skills/builtin/cpp-testing/SKILL.md +324 -0
  149. package/dist/core/skills/builtin/crosspost/SKILL.md +111 -0
  150. package/dist/core/skills/builtin/csharp-testing/SKILL.md +321 -0
  151. package/dist/core/skills/builtin/customs-trade-compliance/SKILL.md +263 -0
  152. package/dist/core/skills/builtin/dart-flutter-patterns/SKILL.md +563 -0
  153. package/dist/core/skills/builtin/dashboard-builder/SKILL.md +108 -0
  154. package/dist/core/skills/builtin/data-scraper-agent/SKILL.md +764 -0
  155. package/dist/core/skills/builtin/data-throughput-accelerator/SKILL.md +72 -0
  156. package/dist/core/skills/builtin/database-migrations/SKILL.md +429 -0
  157. package/dist/core/skills/builtin/deep-research/SKILL.md +159 -0
  158. package/dist/core/skills/builtin/defi-amm-security/SKILL.md +166 -0
  159. package/dist/core/skills/builtin/deployment-patterns/SKILL.md +427 -0
  160. package/dist/core/skills/builtin/design-system/SKILL.md +82 -0
  161. package/dist/core/skills/builtin/django-celery/SKILL.md +457 -0
  162. package/dist/core/skills/builtin/django-patterns/SKILL.md +734 -0
  163. package/dist/core/skills/builtin/django-security/SKILL.md +593 -0
  164. package/dist/core/skills/builtin/django-tdd/SKILL.md +729 -0
  165. package/dist/core/skills/builtin/django-verification/SKILL.md +469 -0
  166. package/dist/core/skills/builtin/dmux-workflows/SKILL.md +191 -0
  167. package/dist/core/skills/builtin/docker-patterns/SKILL.md +364 -0
  168. package/dist/core/skills/builtin/documentation-lookup/SKILL.md +90 -0
  169. package/dist/core/skills/builtin/dotnet-patterns/SKILL.md +321 -0
  170. package/dist/core/skills/builtin/dynamic-workflow-mode/SKILL.md +123 -0
  171. package/dist/core/skills/builtin/e2e-testing/SKILL.md +326 -0
  172. package/dist/core/skills/builtin/email-ops/SKILL.md +121 -0
  173. package/dist/core/skills/builtin/energy-procurement/SKILL.md +228 -0
  174. package/dist/core/skills/builtin/enterprise-agent-ops/SKILL.md +50 -0
  175. package/dist/core/skills/builtin/error-handling/SKILL.md +376 -0
  176. package/dist/core/skills/builtin/eval-harness/SKILL.md +270 -0
  177. package/dist/core/skills/builtin/evm-token-decimals/SKILL.md +130 -0
  178. package/dist/core/skills/builtin/exa-search/SKILL.md +107 -0
  179. package/dist/core/skills/builtin/fal-ai-media/SKILL.md +288 -0
  180. package/dist/core/skills/builtin/fastapi-patterns/SKILL.md +513 -0
  181. package/dist/core/skills/builtin/finance-billing-ops/SKILL.md +127 -0
  182. package/dist/core/skills/builtin/flox-environments/SKILL.md +496 -0
  183. package/dist/core/skills/builtin/flutter-dart-code-review/SKILL.md +435 -0
  184. package/dist/core/skills/builtin/foundation-models-on-device/SKILL.md +243 -0
  185. package/dist/core/skills/builtin/frontend-a11y/SKILL.md +445 -0
  186. package/dist/core/skills/builtin/frontend-design-direction/SKILL.md +92 -0
  187. package/dist/core/skills/builtin/frontend-patterns/SKILL.md +656 -0
  188. package/dist/core/skills/builtin/frontend-slides/SKILL.md +184 -0
  189. package/dist/core/skills/builtin/frontend-slides/STYLE_PRESETS.md +330 -0
  190. package/dist/core/skills/builtin/frontend-slides/animation-patterns.md +122 -0
  191. package/dist/core/skills/builtin/frontend-slides/html-template.md +419 -0
  192. package/dist/core/skills/builtin/frontend-slides/scripts/export-pdf.sh +418 -0
  193. package/dist/core/skills/builtin/frontend-slides/scripts/extract-pptx.py +96 -0
  194. package/dist/core/skills/builtin/frontend-slides/viewport-base.css +153 -0
  195. package/dist/core/skills/builtin/fsharp-testing/SKILL.md +280 -0
  196. package/dist/core/skills/builtin/gan-style-harness/SKILL.md +278 -0
  197. package/dist/core/skills/builtin/gateguard/SKILL.md +132 -0
  198. package/dist/core/skills/builtin/git-workflow/SKILL.md +715 -0
  199. package/dist/core/skills/builtin/github-ops/SKILL.md +144 -0
  200. package/dist/core/skills/builtin/golang-patterns/SKILL.md +674 -0
  201. package/dist/core/skills/builtin/golang-testing/SKILL.md +720 -0
  202. package/dist/core/skills/builtin/healthcare-cdss-patterns/SKILL.md +245 -0
  203. package/dist/core/skills/builtin/healthcare-emr-patterns/SKILL.md +159 -0
  204. package/dist/core/skills/builtin/healthcare-eval-harness/SKILL.md +207 -0
  205. package/dist/core/skills/builtin/healthcare-phi-compliance/SKILL.md +145 -0
  206. package/dist/core/skills/builtin/hermes-imports/SKILL.md +88 -0
  207. package/dist/core/skills/builtin/hexagonal-architecture/SKILL.md +276 -0
  208. package/dist/core/skills/builtin/hipaa-compliance/SKILL.md +78 -0
  209. package/dist/core/skills/builtin/hookify-rules/SKILL.md +128 -0
  210. package/dist/core/skills/builtin/inherit-legacy-style/SKILL.md +156 -0
  211. package/dist/core/skills/builtin/intent-driven-development/SKILL.md +360 -0
  212. package/dist/core/skills/builtin/inventory-demand-planning/SKILL.md +247 -0
  213. package/dist/core/skills/builtin/ios-icon-gen/SKILL.md +157 -0
  214. package/dist/core/skills/builtin/ios-icon-gen/scripts/generate_icons.swift +258 -0
  215. package/dist/core/skills/builtin/ios-icon-gen/scripts/iconify_gen.sh +235 -0
  216. package/dist/core/skills/builtin/iterative-retrieval/SKILL.md +211 -0
  217. package/dist/core/skills/builtin/java-coding-standards/SKILL.md +383 -0
  218. package/dist/core/skills/builtin/jira-integration/SKILL.md +302 -0
  219. package/dist/core/skills/builtin/jpa-patterns/SKILL.md +151 -0
  220. package/dist/core/skills/builtin/knowledge-ops/SKILL.md +154 -0
  221. package/dist/core/skills/builtin/kotlin-coroutines-flows/SKILL.md +284 -0
  222. package/dist/core/skills/builtin/kotlin-exposed-patterns/SKILL.md +719 -0
  223. package/dist/core/skills/builtin/kotlin-ktor-patterns/SKILL.md +689 -0
  224. package/dist/core/skills/builtin/kotlin-patterns/SKILL.md +711 -0
  225. package/dist/core/skills/builtin/kotlin-testing/SKILL.md +824 -0
  226. package/dist/core/skills/builtin/kubernetes-patterns/SKILL.md +755 -0
  227. package/dist/core/skills/builtin/laravel-patterns/SKILL.md +415 -0
  228. package/dist/core/skills/builtin/laravel-plugin-discovery/SKILL.md +229 -0
  229. package/dist/core/skills/builtin/laravel-security/SKILL.md +947 -0
  230. package/dist/core/skills/builtin/laravel-tdd/SKILL.md +674 -0
  231. package/dist/core/skills/builtin/laravel-verification/SKILL.md +179 -0
  232. package/dist/core/skills/builtin/latency-critical-systems/SKILL.md +73 -0
  233. package/dist/core/skills/builtin/lead-intelligence/SKILL.md +321 -0
  234. package/dist/core/skills/builtin/lead-intelligence/agents/enrichment-agent.md +85 -0
  235. package/dist/core/skills/builtin/lead-intelligence/agents/mutual-mapper.md +75 -0
  236. package/dist/core/skills/builtin/lead-intelligence/agents/outreach-drafter.md +98 -0
  237. package/dist/core/skills/builtin/lead-intelligence/agents/signal-scorer.md +60 -0
  238. package/dist/core/skills/builtin/liquid-glass-design/SKILL.md +279 -0
  239. package/dist/core/skills/builtin/llm-trading-agent-security/SKILL.md +146 -0
  240. package/dist/core/skills/builtin/logistics-exception-management/SKILL.md +222 -0
  241. package/dist/core/skills/builtin/make-interfaces-feel-better/SKILL.md +151 -0
  242. package/dist/core/skills/builtin/market-research/SKILL.md +75 -0
  243. package/dist/core/skills/builtin/marketing-campaign/SKILL.md +113 -0
  244. package/dist/core/skills/builtin/mcp-server-patterns/SKILL.md +69 -0
  245. package/dist/core/skills/builtin/messages-ops/SKILL.md +104 -0
  246. package/dist/core/skills/builtin/mle-workflow/SKILL.md +346 -0
  247. package/dist/core/skills/builtin/motion-advanced/SKILL.md +596 -0
  248. package/dist/core/skills/builtin/motion-foundations/SKILL.md +299 -0
  249. package/dist/core/skills/builtin/motion-patterns/SKILL.md +434 -0
  250. package/dist/core/skills/builtin/motion-ui/SKILL.md +575 -0
  251. package/dist/core/skills/builtin/mysql-patterns/SKILL.md +412 -0
  252. package/dist/core/skills/builtin/nanoclaw-repl/SKILL.md +33 -0
  253. package/dist/core/skills/builtin/nestjs-patterns/SKILL.md +230 -0
  254. package/dist/core/skills/builtin/netmiko-ssh-automation/SKILL.md +173 -0
  255. package/dist/core/skills/builtin/network-bgp-diagnostics/SKILL.md +167 -0
  256. package/dist/core/skills/builtin/network-config-validation/SKILL.md +210 -0
  257. package/dist/core/skills/builtin/network-interface-health/SKILL.md +152 -0
  258. package/dist/core/skills/builtin/nextjs-turbopack/SKILL.md +57 -0
  259. package/dist/core/skills/builtin/nodejs-keccak256/SKILL.md +102 -0
  260. package/dist/core/skills/builtin/nutrient-document-processing/SKILL.md +167 -0
  261. package/dist/core/skills/builtin/nuxt4-patterns/SKILL.md +100 -0
  262. package/dist/core/skills/builtin/openclaw-persona-forge/SKILL.md +288 -0
  263. package/dist/core/skills/builtin/openclaw-persona-forge/gacha.py +224 -0
  264. package/dist/core/skills/builtin/openclaw-persona-forge/gacha.sh +5 -0
  265. package/dist/core/skills/builtin/openclaw-persona-forge/references/avatar-style.md +124 -0
  266. package/dist/core/skills/builtin/openclaw-persona-forge/references/boundary-rules.md +53 -0
  267. package/dist/core/skills/builtin/openclaw-persona-forge/references/error-handling.md +53 -0
  268. package/dist/core/skills/builtin/openclaw-persona-forge/references/identity-tension.md +48 -0
  269. package/dist/core/skills/builtin/openclaw-persona-forge/references/naming-system.md +39 -0
  270. package/dist/core/skills/builtin/openclaw-persona-forge/references/output-template.md +166 -0
  271. package/dist/core/skills/builtin/opensource-pipeline/SKILL.md +255 -0
  272. package/dist/core/skills/builtin/orch-add-feature/SKILL.md +44 -0
  273. package/dist/core/skills/builtin/orch-build-mvp/SKILL.md +48 -0
  274. package/dist/core/skills/builtin/orch-change-feature/SKILL.md +42 -0
  275. package/dist/core/skills/builtin/orch-fix-defect/SKILL.md +42 -0
  276. package/dist/core/skills/builtin/orch-pipeline/SKILL.md +120 -0
  277. package/dist/core/skills/builtin/orch-refine-code/SKILL.md +43 -0
  278. package/dist/core/skills/builtin/parallel-execution-optimizer/SKILL.md +72 -0
  279. package/dist/core/skills/builtin/perl-patterns/SKILL.md +504 -0
  280. package/dist/core/skills/builtin/perl-security/SKILL.md +503 -0
  281. package/dist/core/skills/builtin/perl-testing/SKILL.md +475 -0
  282. package/dist/core/skills/builtin/plan-orchestrate/SKILL.md +262 -0
  283. package/dist/core/skills/builtin/plankton-code-quality/SKILL.md +236 -0
  284. package/dist/core/skills/builtin/postgres-patterns/SKILL.md +147 -0
  285. package/dist/core/skills/builtin/prediction-market-oracle-research/SKILL.md +63 -0
  286. package/dist/core/skills/builtin/prediction-market-risk-review/SKILL.md +60 -0
  287. package/dist/core/skills/builtin/prisma-patterns/SKILL.md +371 -0
  288. package/dist/core/skills/builtin/product-capability/SKILL.md +141 -0
  289. package/dist/core/skills/builtin/product-lens/SKILL.md +92 -0
  290. package/dist/core/skills/builtin/production-audit/SKILL.md +206 -0
  291. package/dist/core/skills/builtin/production-scheduling/SKILL.md +238 -0
  292. package/dist/core/skills/builtin/prompt-optimizer/SKILL.md +398 -0
  293. package/dist/core/skills/builtin/python-patterns/SKILL.md +750 -0
  294. package/dist/core/skills/builtin/python-testing/SKILL.md +816 -0
  295. package/dist/core/skills/builtin/pytorch-patterns/SKILL.md +396 -0
  296. package/dist/core/skills/builtin/quality-nonconformance/SKILL.md +260 -0
  297. package/dist/core/skills/builtin/quarkus-patterns/SKILL.md +722 -0
  298. package/dist/core/skills/builtin/quarkus-security/SKILL.md +467 -0
  299. package/dist/core/skills/builtin/quarkus-tdd/SKILL.md +811 -0
  300. package/dist/core/skills/builtin/quarkus-verification/SKILL.md +479 -0
  301. package/dist/core/skills/builtin/ralphinho-rfc-pipeline/SKILL.md +67 -0
  302. package/dist/core/skills/builtin/react-patterns/SKILL.md +341 -0
  303. package/dist/core/skills/builtin/react-performance/SKILL.md +574 -0
  304. package/dist/core/skills/builtin/react-testing/SKILL.md +423 -0
  305. package/dist/core/skills/builtin/recsys-pipeline-architect/SKILL.md +114 -0
  306. package/dist/core/skills/builtin/recursive-decision-ledger/SKILL.md +79 -0
  307. package/dist/core/skills/builtin/redis-patterns/SKILL.md +403 -0
  308. package/dist/core/skills/builtin/regex-vs-llm-structured-text/SKILL.md +220 -0
  309. package/dist/core/skills/builtin/repo-scan/SKILL.md +78 -0
  310. package/dist/core/skills/builtin/research-ops/SKILL.md +112 -0
  311. package/dist/core/skills/builtin/returns-reverse-logistics/SKILL.md +240 -0
  312. package/dist/core/skills/builtin/rules-distill/SKILL.md +264 -0
  313. package/dist/core/skills/builtin/rules-distill/scripts/scan-rules.sh +58 -0
  314. package/dist/core/skills/builtin/rules-distill/scripts/scan-skills.sh +129 -0
  315. package/dist/core/skills/builtin/rust-patterns/SKILL.md +499 -0
  316. package/dist/core/skills/builtin/rust-testing/SKILL.md +500 -0
  317. package/dist/core/skills/builtin/safety-guard/SKILL.md +75 -0
  318. package/dist/core/skills/builtin/santa-method/SKILL.md +306 -0
  319. package/dist/core/skills/builtin/scientific-db-pubmed-database/SKILL.md +175 -0
  320. package/dist/core/skills/builtin/scientific-db-uspto-database/SKILL.md +177 -0
  321. package/dist/core/skills/builtin/scientific-pkg-gget/SKILL.md +166 -0
  322. package/dist/core/skills/builtin/scientific-thinking-literature-review/SKILL.md +192 -0
  323. package/dist/core/skills/builtin/scientific-thinking-scholar-evaluation/SKILL.md +160 -0
  324. package/dist/core/skills/builtin/search-first/SKILL.md +182 -0
  325. package/dist/core/skills/builtin/security-bounty-hunter/SKILL.md +99 -0
  326. package/dist/core/skills/builtin/security-review/SKILL.md +503 -0
  327. package/dist/core/skills/builtin/security-review/cloud-infrastructure-security.md +361 -0
  328. package/dist/core/skills/builtin/security-scan/SKILL.md +165 -0
  329. package/dist/core/skills/builtin/seo/SKILL.md +154 -0
  330. package/dist/core/skills/builtin/skill-comply/SKILL.md +58 -0
  331. package/dist/core/skills/builtin/skill-comply/fixtures/compliant_trace.jsonl +5 -0
  332. package/dist/core/skills/builtin/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
  333. package/dist/core/skills/builtin/skill-comply/fixtures/tdd_spec.yaml +44 -0
  334. package/dist/core/skills/builtin/skill-comply/prompts/classifier.md +24 -0
  335. package/dist/core/skills/builtin/skill-comply/prompts/scenario_generator.md +62 -0
  336. package/dist/core/skills/builtin/skill-comply/prompts/spec_generator.md +42 -0
  337. package/dist/core/skills/builtin/skill-comply/pyproject.toml +15 -0
  338. package/dist/core/skills/builtin/skill-comply/scripts/__init__.py +0 -0
  339. package/dist/core/skills/builtin/skill-comply/scripts/classifier.py +85 -0
  340. package/dist/core/skills/builtin/skill-comply/scripts/grader.py +124 -0
  341. package/dist/core/skills/builtin/skill-comply/scripts/parser.py +107 -0
  342. package/dist/core/skills/builtin/skill-comply/scripts/report.py +170 -0
  343. package/dist/core/skills/builtin/skill-comply/scripts/run.py +127 -0
  344. package/dist/core/skills/builtin/skill-comply/scripts/runner.py +186 -0
  345. package/dist/core/skills/builtin/skill-comply/scripts/scenario_generator.py +70 -0
  346. package/dist/core/skills/builtin/skill-comply/scripts/spec_generator.py +72 -0
  347. package/dist/core/skills/builtin/skill-comply/scripts/utils.py +13 -0
  348. package/dist/core/skills/builtin/skill-comply/tests/test_grader.py +197 -0
  349. package/dist/core/skills/builtin/skill-comply/tests/test_parser.py +90 -0
  350. package/dist/core/skills/builtin/skill-comply/tests/test_runner.py +172 -0
  351. package/dist/core/skills/builtin/skill-scout/SKILL.md +140 -0
  352. package/dist/core/skills/builtin/skill-stocktake/SKILL.md +194 -0
  353. package/dist/core/skills/builtin/skill-stocktake/scripts/quick-diff.sh +87 -0
  354. package/dist/core/skills/builtin/skill-stocktake/scripts/save-results.sh +56 -0
  355. package/dist/core/skills/builtin/skill-stocktake/scripts/scan.sh +170 -0
  356. package/dist/core/skills/builtin/springboot-patterns/SKILL.md +314 -0
  357. package/dist/core/skills/builtin/springboot-security/SKILL.md +272 -0
  358. package/dist/core/skills/builtin/springboot-tdd/SKILL.md +158 -0
  359. package/dist/core/skills/builtin/springboot-verification/SKILL.md +231 -0
  360. package/dist/core/skills/builtin/strategic-compact/SKILL.md +135 -0
  361. package/dist/core/skills/builtin/swift-actor-persistence/SKILL.md +143 -0
  362. package/dist/core/skills/builtin/swift-concurrency-6-2/SKILL.md +216 -0
  363. package/dist/core/skills/builtin/swift-protocol-di-testing/SKILL.md +190 -0
  364. package/dist/core/skills/builtin/swiftui-patterns/SKILL.md +259 -0
  365. package/dist/core/skills/builtin/tdd-workflow/SKILL.md +463 -0
  366. package/dist/core/skills/builtin/team-agent-orchestration/SKILL.md +110 -0
  367. package/dist/core/skills/builtin/team-builder/SKILL.md +168 -0
  368. package/dist/core/skills/builtin/terminal-ops/SKILL.md +109 -0
  369. package/dist/core/skills/builtin/tinystruct-patterns/SKILL.md +203 -0
  370. package/dist/core/skills/builtin/tinystruct-patterns/references/architecture.md +90 -0
  371. package/dist/core/skills/builtin/tinystruct-patterns/references/data-handling.md +60 -0
  372. package/dist/core/skills/builtin/tinystruct-patterns/references/database.md +99 -0
  373. package/dist/core/skills/builtin/tinystruct-patterns/references/routing.md +64 -0
  374. package/dist/core/skills/builtin/tinystruct-patterns/references/system-usage.md +97 -0
  375. package/dist/core/skills/builtin/tinystruct-patterns/references/testing.md +72 -0
  376. package/dist/core/skills/builtin/token-budget-advisor/SKILL.md +133 -0
  377. package/dist/core/skills/builtin/ui-demo/SKILL.md +465 -0
  378. package/dist/core/skills/builtin/ui-to-vue/SKILL.md +134 -0
  379. package/dist/core/skills/builtin/uncloud/SKILL.md +343 -0
  380. package/dist/core/skills/builtin/unified-notifications-ops/SKILL.md +187 -0
  381. package/dist/core/skills/builtin/verification-loop/SKILL.md +126 -0
  382. package/dist/core/skills/builtin/video-editing/SKILL.md +310 -0
  383. package/dist/core/skills/builtin/videodb/SKILL.md +374 -0
  384. package/dist/core/skills/builtin/videodb/reference/api-reference.md +550 -0
  385. package/dist/core/skills/builtin/videodb/reference/capture-reference.md +407 -0
  386. package/dist/core/skills/builtin/videodb/reference/capture.md +101 -0
  387. package/dist/core/skills/builtin/videodb/reference/editor.md +443 -0
  388. package/dist/core/skills/builtin/videodb/reference/generative.md +331 -0
  389. package/dist/core/skills/builtin/videodb/reference/rtstream-reference.md +564 -0
  390. package/dist/core/skills/builtin/videodb/reference/rtstream.md +65 -0
  391. package/dist/core/skills/builtin/videodb/reference/search.md +230 -0
  392. package/dist/core/skills/builtin/videodb/reference/streaming.md +406 -0
  393. package/dist/core/skills/builtin/videodb/reference/use-cases.md +118 -0
  394. package/dist/core/skills/builtin/videodb/scripts/ws_listener.py +282 -0
  395. package/dist/core/skills/builtin/visa-doc-translate/README.md +86 -0
  396. package/dist/core/skills/builtin/visa-doc-translate/SKILL.md +117 -0
  397. package/dist/core/skills/builtin/vite-patterns/SKILL.md +449 -0
  398. package/dist/core/skills/builtin/windows-desktop-e2e/SKILL.md +887 -0
  399. package/dist/core/skills/builtin/x-api/SKILL.md +234 -0
  400. package/dist/core/skills/loader.js +11 -0
  401. package/dist/core/skills/loader.js.map +1 -1
  402. package/dist/core/types.d.ts +6 -0
  403. package/dist/core/types.d.ts.map +1 -1
  404. package/dist/plugins/agents/native/index.d.ts +47 -8
  405. package/dist/plugins/agents/native/index.d.ts.map +1 -1
  406. package/dist/plugins/agents/native/index.js +253 -102
  407. package/dist/plugins/agents/native/index.js.map +1 -1
  408. package/dist/plugins/agents/native/tool-registry.d.ts +33 -0
  409. package/dist/plugins/agents/native/tool-registry.d.ts.map +1 -0
  410. package/dist/plugins/agents/native/tool-registry.js +82 -0
  411. package/dist/plugins/agents/native/tool-registry.js.map +1 -0
  412. package/dist/plugins/messengers/dingtalk/dingtalk-client.d.ts.map +1 -1
  413. package/dist/plugins/messengers/dingtalk/dingtalk-client.js +11 -11
  414. package/dist/plugins/messengers/dingtalk/dingtalk-client.js.map +1 -1
  415. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -1
  416. package/dist/plugins/messengers/feishu/feishu-adapter.js +9 -5
  417. package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -1
  418. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -1
  419. package/dist/plugins/messengers/wechat/ilink-adapter.js +11 -1
  420. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  421. package/dist/web/public/assets/{a2a-DczMMkbl.js → a2a-Cll3P4QN.js} +2 -2
  422. package/dist/web/public/assets/{a2a-DczMMkbl.js.map → a2a-Cll3P4QN.js.map} +1 -1
  423. package/dist/web/public/assets/{activity-cbLHkzca.js → activity-B7T7YFlD.js} +2 -2
  424. package/dist/web/public/assets/{activity-cbLHkzca.js.map → activity-B7T7YFlD.js.map} +1 -1
  425. package/dist/web/public/assets/{admins-C-YsGMj7.js → admins-CN7P018S.js} +2 -2
  426. package/dist/web/public/assets/{admins-C-YsGMj7.js.map → admins-CN7P018S.js.map} +1 -1
  427. package/dist/web/public/assets/{agents-BWfov_1-.js → agents-Bqgq7GBF.js} +2 -2
  428. package/dist/web/public/assets/{agents-BWfov_1-.js.map → agents-Bqgq7GBF.js.map} +1 -1
  429. package/dist/web/public/assets/{approvals-HSssmXKS.js → approvals-C8IUJQ_A.js} +2 -2
  430. package/dist/web/public/assets/{approvals-HSssmXKS.js.map → approvals-C8IUJQ_A.js.map} +1 -1
  431. package/dist/web/public/assets/{arrow-down-BXvC8Al2.js → arrow-down-SLWKqtDc.js} +2 -2
  432. package/dist/web/public/assets/{arrow-down-BXvC8Al2.js.map → arrow-down-SLWKqtDc.js.map} +1 -1
  433. package/dist/web/public/assets/{arrow-up-63xELY5Q.js → arrow-up-BOADc9ce.js} +2 -2
  434. package/dist/web/public/assets/{arrow-up-63xELY5Q.js.map → arrow-up-BOADc9ce.js.map} +1 -1
  435. package/dist/web/public/assets/{asks-COLEFOvK.js → asks-C-j-DypC.js} +2 -2
  436. package/dist/web/public/assets/{asks-COLEFOvK.js.map → asks-C-j-DypC.js.map} +1 -1
  437. package/dist/web/public/assets/{audit-D4ZEiZub.js → audit-DQb-RuXh.js} +2 -2
  438. package/dist/web/public/assets/{audit-D4ZEiZub.js.map → audit-DQb-RuXh.js.map} +1 -1
  439. package/dist/web/public/assets/{bell-Cg2Bvv06.js → bell-CV88-ul6.js} +2 -2
  440. package/dist/web/public/assets/{bell-Cg2Bvv06.js.map → bell-CV88-ul6.js.map} +1 -1
  441. package/dist/web/public/assets/{bgjobs-CEjCzwtd.js → bgjobs-CDrK0d-W.js} +2 -2
  442. package/dist/web/public/assets/{bgjobs-CEjCzwtd.js.map → bgjobs-CDrK0d-W.js.map} +1 -1
  443. package/dist/web/public/assets/{brain-euvl6F6C.js → brain-B7HtSOQU.js} +2 -2
  444. package/dist/web/public/assets/{brain-euvl6F6C.js.map → brain-B7HtSOQU.js.map} +1 -1
  445. package/dist/web/public/assets/{briefcase-DPWLbCnA.js → briefcase-mdzuIa__.js} +2 -2
  446. package/dist/web/public/assets/{briefcase-DPWLbCnA.js.map → briefcase-mdzuIa__.js.map} +1 -1
  447. package/dist/web/public/assets/{browser-ponyfill-BUutOaRz.js → browser-ponyfill-DBWdeCTC.js} +2 -2
  448. package/dist/web/public/assets/{browser-ponyfill-BUutOaRz.js.map → browser-ponyfill-DBWdeCTC.js.map} +1 -1
  449. package/dist/web/public/assets/{chat-Dz9kfaxH.js → chat-CSjtY2rN.js} +3 -3
  450. package/dist/web/public/assets/{chat-Dz9kfaxH.js.map → chat-CSjtY2rN.js.map} +1 -1
  451. package/dist/web/public/assets/{chevron-left-BeIh5thq.js → chevron-left-uSfPn636.js} +2 -2
  452. package/dist/web/public/assets/{chevron-left-BeIh5thq.js.map → chevron-left-uSfPn636.js.map} +1 -1
  453. package/dist/web/public/assets/{chevron-right-uP_l9MMb.js → chevron-right-CtelqacW.js} +2 -2
  454. package/dist/web/public/assets/{chevron-right-uP_l9MMb.js.map → chevron-right-CtelqacW.js.map} +1 -1
  455. package/dist/web/public/assets/{circle-check-CewnjFgv.js → circle-check-8dbL-u7O.js} +2 -2
  456. package/dist/web/public/assets/{circle-check-CewnjFgv.js.map → circle-check-8dbL-u7O.js.map} +1 -1
  457. package/dist/web/public/assets/{circle-check-big-C2RTc48c.js → circle-check-big-D8-svk9a.js} +2 -2
  458. package/dist/web/public/assets/{circle-check-big-C2RTc48c.js.map → circle-check-big-D8-svk9a.js.map} +1 -1
  459. package/dist/web/public/assets/{circle-x-Ccg1HyV-.js → circle-x-rUxzIz5P.js} +2 -2
  460. package/dist/web/public/assets/{circle-x-Ccg1HyV-.js.map → circle-x-rUxzIz5P.js.map} +1 -1
  461. package/dist/web/public/assets/{clock-qxbYSynv.js → clock-CG5dlBGB.js} +2 -2
  462. package/dist/web/public/assets/{clock-qxbYSynv.js.map → clock-CG5dlBGB.js.map} +1 -1
  463. package/dist/web/public/assets/{confirm-dialog-DmJq4Td9.js → confirm-dialog-DlUsSur3.js} +2 -2
  464. package/dist/web/public/assets/{confirm-dialog-DmJq4Td9.js.map → confirm-dialog-DlUsSur3.js.map} +1 -1
  465. package/dist/web/public/assets/{copy-DxSHRdbc.js → copy-DnC76wFT.js} +2 -2
  466. package/dist/web/public/assets/{copy-DxSHRdbc.js.map → copy-DnC76wFT.js.map} +1 -1
  467. package/dist/web/public/assets/{data-table-S7rIjwdO.js → data-table-DswkWUfG.js} +2 -2
  468. package/dist/web/public/assets/{data-table-S7rIjwdO.js.map → data-table-DswkWUfG.js.map} +1 -1
  469. package/dist/web/public/assets/dialog-Ceo4YuXy.js +6 -0
  470. package/dist/web/public/assets/dialog-Ceo4YuXy.js.map +1 -0
  471. package/dist/web/public/assets/{download-OhsGtnO-.js → download-DF-46tS4.js} +2 -2
  472. package/dist/web/public/assets/{download-OhsGtnO-.js.map → download-DF-46tS4.js.map} +1 -1
  473. package/dist/web/public/assets/{email-C1-HxWLF.js → email-CZee26-_.js} +3 -3
  474. package/dist/web/public/assets/{email-C1-HxWLF.js.map → email-CZee26-_.js.map} +1 -1
  475. package/dist/web/public/assets/{empty-state-C-qjOHyu.js → empty-state-D9Hi0Atm.js} +2 -2
  476. package/dist/web/public/assets/{empty-state-C-qjOHyu.js.map → empty-state-D9Hi0Atm.js.map} +1 -1
  477. package/dist/web/public/assets/{external-link-DRVp9-lb.js → external-link-D64iZa9P.js} +2 -2
  478. package/dist/web/public/assets/{external-link-DRVp9-lb.js.map → external-link-D64iZa9P.js.map} +1 -1
  479. package/dist/web/public/assets/{eye-CFhg5BTa.js → eye-sY6WZb7D.js} +2 -2
  480. package/dist/web/public/assets/{eye-CFhg5BTa.js.map → eye-sY6WZb7D.js.map} +1 -1
  481. package/dist/web/public/assets/{facts-CGaLWhzi.js → facts-B7bGGwvi.js} +2 -2
  482. package/dist/web/public/assets/{facts-CGaLWhzi.js.map → facts-B7bGGwvi.js.map} +1 -1
  483. package/dist/web/public/assets/{goals-C-dJANmn.js → goals-BfQbsvZv.js} +2 -2
  484. package/dist/web/public/assets/{goals-C-dJANmn.js.map → goals-BfQbsvZv.js.map} +1 -1
  485. package/dist/web/public/assets/{health-CWcti5h3.js → health-Ba_mY0Ts.js} +2 -2
  486. package/dist/web/public/assets/{health-CWcti5h3.js.map → health-Ba_mY0Ts.js.map} +1 -1
  487. package/dist/web/public/assets/{heart-pulse-DmGhKR2W.js → heart-pulse-BjikOVwU.js} +2 -2
  488. package/dist/web/public/assets/{heart-pulse-DmGhKR2W.js.map → heart-pulse-BjikOVwU.js.map} +1 -1
  489. package/dist/web/public/assets/{heartbeat-kLoGBNCo.js → heartbeat-BM8LlPes.js} +2 -2
  490. package/dist/web/public/assets/{heartbeat-kLoGBNCo.js.map → heartbeat-BM8LlPes.js.map} +1 -1
  491. package/dist/web/public/assets/{hot-BITDoax1.js → hot-BtuLL6n8.js} +2 -2
  492. package/dist/web/public/assets/{hot-BITDoax1.js.map → hot-BtuLL6n8.js.map} +1 -1
  493. package/dist/web/public/assets/index-DEWFfW_Z.js +199 -0
  494. package/dist/web/public/assets/index-DEWFfW_Z.js.map +1 -0
  495. package/dist/web/public/assets/{installed-Co9WrtQ7.js → installed-Xr8p31ij.js} +2 -2
  496. package/dist/web/public/assets/{installed-Co9WrtQ7.js.map → installed-Xr8p31ij.js.map} +1 -1
  497. package/dist/web/public/assets/{jobs-hdHhBEvi.js → jobs-Ddy81Udm.js} +2 -2
  498. package/dist/web/public/assets/{jobs-hdHhBEvi.js.map → jobs-Ddy81Udm.js.map} +1 -1
  499. package/dist/web/public/assets/{layout-CQtbOBag.js → layout-BL74fT-L.js} +2 -2
  500. package/dist/web/public/assets/{layout-CQtbOBag.js.map → layout-BL74fT-L.js.map} +1 -1
  501. package/dist/web/public/assets/{layout-bDMXIKIR.js → layout-Bn2qUxcK.js} +2 -2
  502. package/dist/web/public/assets/{layout-bDMXIKIR.js.map → layout-Bn2qUxcK.js.map} +1 -1
  503. package/dist/web/public/assets/{layout-BMXC1Uh1.js → layout-Bp4SAA8_.js} +2 -2
  504. package/dist/web/public/assets/{layout-BMXC1Uh1.js.map → layout-Bp4SAA8_.js.map} +1 -1
  505. package/dist/web/public/assets/{layout-CysVsySh.js → layout-CZ9pGnW8.js} +2 -2
  506. package/dist/web/public/assets/{layout-CysVsySh.js.map → layout-CZ9pGnW8.js.map} +1 -1
  507. package/dist/web/public/assets/{layout-CyBGneZ9.js → layout-pasFRkKV.js} +2 -2
  508. package/dist/web/public/assets/{layout-CyBGneZ9.js.map → layout-pasFRkKV.js.map} +1 -1
  509. package/dist/web/public/assets/llm-yp7b5xxL.js +7 -0
  510. package/dist/web/public/assets/llm-yp7b5xxL.js.map +1 -0
  511. package/dist/web/public/assets/{loader-circle-9VUMGitw.js → loader-circle-Bbw4pEyE.js} +2 -2
  512. package/dist/web/public/assets/{loader-circle-9VUMGitw.js.map → loader-circle-Bbw4pEyE.js.map} +1 -1
  513. package/dist/web/public/assets/{map-pin-BXYvvHry.js → map-pin-DIXHUQgM.js} +2 -2
  514. package/dist/web/public/assets/{map-pin-BXYvvHry.js.map → map-pin-DIXHUQgM.js.map} +1 -1
  515. package/dist/web/public/assets/{mcp-BgLdlwSn.js → mcp-DyaljIM_.js} +2 -2
  516. package/dist/web/public/assets/{mcp-BgLdlwSn.js.map → mcp-DyaljIM_.js.map} +1 -1
  517. package/dist/web/public/assets/memos-Dkoc157i.js +12 -0
  518. package/dist/web/public/assets/memos-Dkoc157i.js.map +1 -0
  519. package/dist/web/public/assets/{messengers-7Phqea62.js → messengers-CcyGDeUI.js} +2 -2
  520. package/dist/web/public/assets/{messengers-7Phqea62.js.map → messengers-CcyGDeUI.js.map} +1 -1
  521. package/dist/web/public/assets/{mobile-CV5b6D2W.js → mobile-DqzIv4Xb.js} +2 -2
  522. package/dist/web/public/assets/{mobile-CV5b6D2W.js.map → mobile-DqzIv4Xb.js.map} +1 -1
  523. package/dist/web/public/assets/{native-agent-QvIa6LjE.js → native-agent-BQ7WaRGK.js} +2 -2
  524. package/dist/web/public/assets/{native-agent-QvIa6LjE.js.map → native-agent-BQ7WaRGK.js.map} +1 -1
  525. package/dist/web/public/assets/{network-BXhEjGhE.js → network-B_yUFAqC.js} +2 -2
  526. package/dist/web/public/assets/{network-BXhEjGhE.js.map → network-B_yUFAqC.js.map} +1 -1
  527. package/dist/web/public/assets/{outbox-DHQL7TQb.js → outbox-l8aVOZqO.js} +2 -2
  528. package/dist/web/public/assets/{outbox-DHQL7TQb.js.map → outbox-l8aVOZqO.js.map} +1 -1
  529. package/dist/web/public/assets/{pagination-VKuPb1Ot.js → pagination-BAKRGKa9.js} +2 -2
  530. package/dist/web/public/assets/{pagination-VKuPb1Ot.js.map → pagination-BAKRGKa9.js.map} +1 -1
  531. package/dist/web/public/assets/{persona-CWug2GLR.js → persona-D3VL9Rg1.js} +2 -2
  532. package/dist/web/public/assets/{persona-CWug2GLR.js.map → persona-D3VL9Rg1.js.map} +1 -1
  533. package/dist/web/public/assets/{plans-CZoEs5SY.js → plans-BBB5e9my.js} +2 -2
  534. package/dist/web/public/assets/{plans-CZoEs5SY.js.map → plans-BBB5e9my.js.map} +1 -1
  535. package/dist/web/public/assets/{play-CfSn5Vdl.js → play-7-Wd369f.js} +2 -2
  536. package/dist/web/public/assets/{play-CfSn5Vdl.js.map → play-7-Wd369f.js.map} +1 -1
  537. package/dist/web/public/assets/{plus-Z8l4CiqJ.js → plus-B0sfZy-j.js} +2 -2
  538. package/dist/web/public/assets/{plus-Z8l4CiqJ.js.map → plus-B0sfZy-j.js.map} +1 -1
  539. package/dist/web/public/assets/{policy-CutDSEPW.js → policy-BM1WRXH0.js} +2 -2
  540. package/dist/web/public/assets/{policy-CutDSEPW.js.map → policy-BM1WRXH0.js.map} +1 -1
  541. package/dist/web/public/assets/{qr-code-DgU5aiM6.js → qr-code-DcKs5fi3.js} +2 -2
  542. package/dist/web/public/assets/{qr-code-DgU5aiM6.js.map → qr-code-DcKs5fi3.js.map} +1 -1
  543. package/dist/web/public/assets/{react-Cb2sDjhD.js → react-DlP5eolq.js} +2 -2
  544. package/dist/web/public/assets/{react-Cb2sDjhD.js.map → react-DlP5eolq.js.map} +1 -1
  545. package/dist/web/public/assets/{refresh-ccw-D2CWiyU_.js → refresh-ccw-uNKeBeRl.js} +2 -2
  546. package/dist/web/public/assets/{refresh-ccw-D2CWiyU_.js.map → refresh-ccw-uNKeBeRl.js.map} +1 -1
  547. package/dist/web/public/assets/{reminders-Cb6Izedg.js → reminders-DHM8K0_O.js} +2 -2
  548. package/dist/web/public/assets/{reminders-Cb6Izedg.js.map → reminders-DHM8K0_O.js.map} +1 -1
  549. package/dist/web/public/assets/{save-DB0BDYTs.js → save-qwJa5_SA.js} +2 -2
  550. package/dist/web/public/assets/{save-DB0BDYTs.js.map → save-qwJa5_SA.js.map} +1 -1
  551. package/dist/web/public/assets/{schedules-8mSjE14D.js → schedules-Bcd0wbT4.js} +2 -2
  552. package/dist/web/public/assets/{schedules-8mSjE14D.js.map → schedules-Bcd0wbT4.js.map} +1 -1
  553. package/dist/web/public/assets/{search-Con69NhG.js → search-BUlzNWrj.js} +2 -2
  554. package/dist/web/public/assets/{search-Con69NhG.js.map → search-BUlzNWrj.js.map} +1 -1
  555. package/dist/web/public/assets/{search-B4fHilZ0.js → search-i1tP2maJ.js} +2 -2
  556. package/dist/web/public/assets/{search-B4fHilZ0.js.map → search-i1tP2maJ.js.map} +1 -1
  557. package/dist/web/public/assets/{security-BTe3zUg8.js → security-DgJyTT4g.js} +2 -2
  558. package/dist/web/public/assets/{security-BTe3zUg8.js.map → security-DgJyTT4g.js.map} +1 -1
  559. package/dist/web/public/assets/{service-C7SqcwfL.js → service-A0Hzear0.js} +2 -2
  560. package/dist/web/public/assets/{service-C7SqcwfL.js.map → service-A0Hzear0.js.map} +1 -1
  561. package/dist/web/public/assets/{shield-alert-CKFVsGgI.js → shield-alert-DrnN6fz_.js} +2 -2
  562. package/dist/web/public/assets/{shield-alert-CKFVsGgI.js.map → shield-alert-DrnN6fz_.js.map} +1 -1
  563. package/dist/web/public/assets/{status-badge-BSkpyN4D.js → status-badge-Ryzf96Pl.js} +2 -2
  564. package/dist/web/public/assets/{status-badge-BSkpyN4D.js.map → status-badge-Ryzf96Pl.js.map} +1 -1
  565. package/dist/web/public/assets/{subtasks-Bel-I1Sk.js → subtasks-Bzh3o3EF.js} +2 -2
  566. package/dist/web/public/assets/{subtasks-Bel-I1Sk.js.map → subtasks-Bzh3o3EF.js.map} +1 -1
  567. package/dist/web/public/assets/{table-CPn1MRcy.js → table-BbAOSyc8.js} +2 -2
  568. package/dist/web/public/assets/{table-CPn1MRcy.js.map → table-BbAOSyc8.js.map} +1 -1
  569. package/dist/web/public/assets/{topn-Ba3RjcK1.js → topn-DkhYw-Gp.js} +2 -2
  570. package/dist/web/public/assets/{topn-Ba3RjcK1.js.map → topn-DkhYw-Gp.js.map} +1 -1
  571. package/dist/web/public/assets/{trash-2-Dfov8aHD.js → trash-2-CA0cLpnU.js} +2 -2
  572. package/dist/web/public/assets/{trash-2-Dfov8aHD.js.map → trash-2-CA0cLpnU.js.map} +1 -1
  573. package/dist/web/public/assets/{use-background-tasks-BQrEeUwY.js → use-background-tasks-B64YjlA8.js} +2 -2
  574. package/dist/web/public/assets/{use-background-tasks-BQrEeUwY.js.map → use-background-tasks-B64YjlA8.js.map} +1 -1
  575. package/dist/web/public/assets/{use-event-stream-DgGpGKop.js → use-event-stream-I1lMFEfh.js} +2 -2
  576. package/dist/web/public/assets/{use-event-stream-DgGpGKop.js.map → use-event-stream-I1lMFEfh.js.map} +1 -1
  577. package/dist/web/public/assets/{use-llm-admin-DYekqogG.js → use-llm-admin-DY2axI4D.js} +2 -2
  578. package/dist/web/public/assets/{use-llm-admin-DYekqogG.js.map → use-llm-admin-DY2axI4D.js.map} +1 -1
  579. package/dist/web/public/assets/{use-memory-DbJ4pP2Z.js → use-memory-BYEjVWbU.js} +2 -2
  580. package/dist/web/public/assets/{use-memory-DbJ4pP2Z.js.map → use-memory-BYEjVWbU.js.map} +1 -1
  581. package/dist/web/public/assets/{use-observability-C2M6WZ9W.js → use-observability-Coj02yDo.js} +2 -2
  582. package/dist/web/public/assets/{use-observability-C2M6WZ9W.js.map → use-observability-Coj02yDo.js.map} +1 -1
  583. package/dist/web/public/assets/{use-settings-DMdaoWsB.js → use-settings-i1MhlkyC.js} +2 -2
  584. package/dist/web/public/assets/{use-settings-DMdaoWsB.js.map → use-settings-i1MhlkyC.js.map} +1 -1
  585. package/dist/web/public/assets/{use-workspace-BHG7h3jQ.js → use-workspace-DgEM35PY.js} +2 -2
  586. package/dist/web/public/assets/{use-workspace-BHG7h3jQ.js.map → use-workspace-DgEM35PY.js.map} +1 -1
  587. package/dist/web/public/assets/{useQuery-PdiC7-sY.js → useQuery-CY2iazjN.js} +2 -2
  588. package/dist/web/public/assets/{useQuery-PdiC7-sY.js.map → useQuery-CY2iazjN.js.map} +1 -1
  589. package/dist/web/public/assets/{vector-DnZM3OXU.js → vector-Ic76u2hY.js} +2 -2
  590. package/dist/web/public/assets/{vector-DnZM3OXU.js.map → vector-Ic76u2hY.js.map} +1 -1
  591. package/dist/web/public/assets/{viewer-Dz6k0YKp.js → viewer-BXbUN1Rl.js} +2 -2
  592. package/dist/web/public/assets/{viewer-Dz6k0YKp.js.map → viewer-BXbUN1Rl.js.map} +1 -1
  593. package/dist/web/public/assets/{workspace-BnXrWS3j.js → workspace-CUg0JPn6.js} +3 -3
  594. package/dist/web/public/assets/{workspace-BnXrWS3j.js.map → workspace-CUg0JPn6.js.map} +1 -1
  595. package/dist/web/public/assets/{workspaces-CSS_UBEi.js → workspaces-C-wb5FQj.js} +2 -2
  596. package/dist/web/public/assets/{workspaces-CSS_UBEi.js.map → workspaces-C-wb5FQj.js.map} +1 -1
  597. package/dist/web/public/assets/{x-DG-JKVw_.js → x-D1iSuoqg.js} +2 -2
  598. package/dist/web/public/assets/{x-DG-JKVw_.js.map → x-D1iSuoqg.js.map} +1 -1
  599. package/dist/web/public/index.html +2 -2
  600. package/dist/web/server.d.ts.map +1 -1
  601. package/dist/web/server.js +6 -0
  602. package/dist/web/server.js.map +1 -1
  603. package/package.json +1 -1
  604. package/dist/web/public/assets/dialog-bAIDaO-6.js +0 -6
  605. package/dist/web/public/assets/dialog-bAIDaO-6.js.map +0 -1
  606. package/dist/web/public/assets/index-O0BQoyzo.js +0 -199
  607. package/dist/web/public/assets/index-O0BQoyzo.js.map +0 -1
  608. package/dist/web/public/assets/llm-CPIRNQU2.js +0 -7
  609. package/dist/web/public/assets/llm-CPIRNQU2.js.map +0 -1
  610. package/dist/web/public/assets/memos-CfneX9DH.js +0 -12
  611. package/dist/web/public/assets/memos-CfneX9DH.js.map +0 -1
@@ -0,0 +1,170 @@
1
+ """Generate Markdown compliance reports."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime, timezone
6
+ from pathlib import Path
7
+
8
+ from scripts.grader import ComplianceResult
9
+ from scripts.parser import ComplianceSpec, ObservationEvent
10
+ from scripts.scenario_generator import Scenario
11
+
12
+
13
+ def generate_report(
14
+ skill_path: Path,
15
+ spec: ComplianceSpec,
16
+ results: list[tuple[str, ComplianceResult, list[ObservationEvent]]],
17
+ scenarios: list[Scenario] | None = None,
18
+ ) -> str:
19
+ """Generate a Markdown compliance report.
20
+
21
+ Args:
22
+ skill_path: Path to the skill file that was tested.
23
+ spec: The compliance spec used for grading.
24
+ results: List of (scenario_level_name, ComplianceResult, observations) tuples.
25
+ scenarios: Original scenario definitions with prompts.
26
+ """
27
+ now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
28
+ overall = _overall_compliance(results)
29
+ threshold = spec.threshold_promote_to_hook
30
+
31
+ lines: list[str] = []
32
+ lines.append(f"# skill-comply Report: {skill_path.name}")
33
+ lines.append(f"Generated: {now}")
34
+ lines.append("")
35
+
36
+ # Summary
37
+ lines.append("## Summary")
38
+ lines.append("")
39
+ lines.append(f"| Metric | Value |")
40
+ lines.append(f"|--------|-------|")
41
+ lines.append(f"| Skill | `{skill_path}` |")
42
+ lines.append(f"| Spec | {spec.id} |")
43
+ lines.append(f"| Scenarios | {len(results)} |")
44
+ lines.append(f"| Overall Compliance | {overall:.0%} |")
45
+ lines.append(f"| Threshold | {threshold:.0%} |")
46
+
47
+ promote_steps = _steps_to_promote(spec, results, threshold)
48
+ if promote_steps:
49
+ step_names = ", ".join(promote_steps)
50
+ lines.append(f"| Recommendation | **Promote {step_names} to hooks** |")
51
+ else:
52
+ lines.append(f"| Recommendation | All steps above threshold — no hook promotion needed |")
53
+ lines.append("")
54
+
55
+ # Expected Behavioral Sequence
56
+ lines.append("## Expected Behavioral Sequence")
57
+ lines.append("")
58
+ lines.append("| # | Step | Required | Description |")
59
+ lines.append("|---|------|----------|-------------|")
60
+ for i, step in enumerate(spec.steps, 1):
61
+ req = "Yes" if step.required else "No"
62
+ lines.append(f"| {i} | {step.id} | {req} | {step.detector.description} |")
63
+ lines.append("")
64
+
65
+ # Scenario Results
66
+ lines.append("## Scenario Results")
67
+ lines.append("")
68
+ lines.append("| Scenario | Compliance | Failed Steps |")
69
+ lines.append("|----------|-----------|----------------|")
70
+ for level_name, result, _obs in results:
71
+ failed = [s.step_id for s in result.steps if not s.detected
72
+ and any(sp.id == s.step_id and sp.required for sp in spec.steps)]
73
+ failed_str = ", ".join(failed) if failed else "—"
74
+ lines.append(f"| {level_name} | {result.compliance_rate:.0%} | {failed_str} |")
75
+ lines.append("")
76
+
77
+ # Scenario Prompts
78
+ if scenarios:
79
+ lines.append("## Scenario Prompts")
80
+ lines.append("")
81
+ for s in scenarios:
82
+ lines.append(f"### {s.level_name} (Level {s.level})")
83
+ lines.append("")
84
+ for prompt_line in s.prompt.splitlines():
85
+ lines.append(f"> {prompt_line}")
86
+ lines.append("")
87
+
88
+ # Hook Promotion Recommendations (optional/advanced)
89
+ if promote_steps:
90
+ lines.append("## Advanced: Hook Promotion Recommendations (optional)")
91
+ lines.append("")
92
+ for step_id in promote_steps:
93
+ rate = _step_compliance_rate(step_id, results)
94
+ step = next(s for s in spec.steps if s.id == step_id)
95
+ lines.append(
96
+ f"- **{step_id}** (compliance {rate:.0%}): {step.description}"
97
+ )
98
+ lines.append("")
99
+
100
+ # Per-scenario details with timeline
101
+ lines.append("## Detail")
102
+ lines.append("")
103
+ for level_name, result, observations in results:
104
+ lines.append(f"### {level_name} (Compliance: {result.compliance_rate:.0%})")
105
+ lines.append("")
106
+ lines.append("| Step | Required | Detected | Reason |")
107
+ lines.append("|------|----------|----------|--------|")
108
+ for sr in result.steps:
109
+ req = "Yes" if any(
110
+ sp.id == sr.step_id and sp.required for sp in spec.steps
111
+ ) else "No"
112
+ det = "YES" if sr.detected else "NO"
113
+ reason = sr.failure_reason or "—"
114
+ lines.append(f"| {sr.step_id} | {req} | {det} | {reason} |")
115
+ lines.append("")
116
+
117
+ # Timeline: show what the agent actually did
118
+ if observations:
119
+ # Build reverse index: event_index → step_id
120
+ index_to_step: dict[int, str] = {}
121
+ for step_id, indices in result.classification.items():
122
+ for idx in indices:
123
+ index_to_step[idx] = step_id
124
+
125
+ lines.append(f"**Tool Call Timeline ({len(observations)} calls)**")
126
+ lines.append("")
127
+ lines.append("| # | Tool | Input | Output | Classified As |")
128
+ lines.append("|---|------|-------|--------|------|")
129
+ for i, obs in enumerate(observations):
130
+ step_label = index_to_step.get(i, "—")
131
+ input_summary = obs.input[:100].replace("|", "\\|").replace("\n", " ")
132
+ output_summary = obs.output[:50].replace("|", "\\|").replace("\n", " ")
133
+ lines.append(
134
+ f"| {i} | {obs.tool} | {input_summary} | {output_summary} | {step_label} |"
135
+ )
136
+ lines.append("")
137
+
138
+ return "\n".join(lines)
139
+
140
+
141
+ def _overall_compliance(results: list[tuple[str, ComplianceResult, list[ObservationEvent]]]) -> float:
142
+ if not results:
143
+ return 0.0
144
+ return sum(r.compliance_rate for _, r, _obs in results) / len(results)
145
+
146
+
147
+ def _step_compliance_rate(
148
+ step_id: str,
149
+ results: list[tuple[str, ComplianceResult, list[ObservationEvent]]],
150
+ ) -> float:
151
+ detected = sum(
152
+ 1 for _, r, _obs in results
153
+ for s in r.steps if s.step_id == step_id and s.detected
154
+ )
155
+ return detected / len(results) if results else 0.0
156
+
157
+
158
+ def _steps_to_promote(
159
+ spec: ComplianceSpec,
160
+ results: list[tuple[str, ComplianceResult, list[ObservationEvent]]],
161
+ threshold: float,
162
+ ) -> list[str]:
163
+ promote = []
164
+ for step in spec.steps:
165
+ if not step.required:
166
+ continue
167
+ rate = _step_compliance_rate(step.id, results)
168
+ if rate < threshold:
169
+ promote.append(step.id)
170
+ return promote
@@ -0,0 +1,127 @@
1
+ """CLI entry point for skill-comply."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import logging
7
+ import sys
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ import yaml
12
+
13
+ from scripts.grader import grade
14
+ from scripts.report import generate_report
15
+ from scripts.runner import run_scenario
16
+ from scripts.scenario_generator import generate_scenarios
17
+ from scripts.spec_generator import generate_spec
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ def main() -> None:
23
+ logging.basicConfig(level=logging.INFO, format="%(message)s")
24
+
25
+ parser = argparse.ArgumentParser(
26
+ description="skill-comply: Measure skill compliance rates",
27
+ )
28
+ parser.add_argument(
29
+ "skill",
30
+ type=Path,
31
+ help="Path to skill/rule file to test",
32
+ )
33
+ parser.add_argument(
34
+ "--model",
35
+ default="sonnet",
36
+ help="Model for scenario execution (default: sonnet)",
37
+ )
38
+ parser.add_argument(
39
+ "--gen-model",
40
+ default="haiku",
41
+ help="Model for spec/scenario generation (default: haiku)",
42
+ )
43
+ parser.add_argument(
44
+ "--dry-run",
45
+ action="store_true",
46
+ help="Generate spec and scenarios without executing",
47
+ )
48
+ parser.add_argument(
49
+ "--output",
50
+ type=Path,
51
+ default=None,
52
+ help="Output report path (default: results/<skill-name>.md)",
53
+ )
54
+
55
+ args = parser.parse_args()
56
+
57
+ if not args.skill.is_file():
58
+ logger.error("Error: Skill file not found: %s", args.skill)
59
+ sys.exit(1)
60
+
61
+ results_dir = Path(__file__).parent.parent / "results"
62
+ results_dir.mkdir(exist_ok=True)
63
+
64
+ # Step 1: Generate compliance spec
65
+ logger.info("[1/4] Generating compliance spec from %s...", args.skill.name)
66
+ spec = generate_spec(args.skill, model=args.gen_model)
67
+ logger.info(" %d steps extracted", len(spec.steps))
68
+
69
+ # Step 2: Generate scenarios
70
+ spec_yaml = yaml.dump({
71
+ "steps": [
72
+ {"id": s.id, "description": s.description, "required": s.required}
73
+ for s in spec.steps
74
+ ]
75
+ })
76
+ logger.info("[2/4] Generating scenarios (3 prompt strictness levels)...")
77
+ scenarios = generate_scenarios(args.skill, spec_yaml, model=args.gen_model)
78
+ logger.info(" %d scenarios generated", len(scenarios))
79
+
80
+ for s in scenarios:
81
+ logger.info(" - %s: %s", s.level_name, s.description[:60])
82
+
83
+ if args.dry_run:
84
+ logger.info("\n[dry-run] Spec and scenarios generated. Skipping execution.")
85
+ logger.info("\nSpec: %s (%d steps)", spec.id, len(spec.steps))
86
+ for step in spec.steps:
87
+ marker = "*" if step.required else " "
88
+ logger.info(" [%s] %s: %s", marker, step.id, step.description)
89
+ return
90
+
91
+ # Step 3: Execute scenarios
92
+ logger.info("[3/4] Executing scenarios (model=%s)...", args.model)
93
+ graded_results: list[tuple[str, Any, list[Any]]] = []
94
+
95
+ for scenario in scenarios:
96
+ logger.info(" Running %s...", scenario.level_name)
97
+ run = run_scenario(scenario, model=args.model)
98
+ result = grade(spec, list(run.observations))
99
+ graded_results.append((scenario.level_name, result, list(run.observations)))
100
+ logger.info(" %s: %.0f%%", scenario.level_name, result.compliance_rate * 100)
101
+
102
+ # Step 4: Generate report
103
+ skill_name = args.skill.parent.name if args.skill.stem == "SKILL" else args.skill.stem
104
+ output_path = args.output or results_dir / f"{skill_name}.md"
105
+ logger.info("[4/4] Generating report...")
106
+
107
+ report = generate_report(args.skill, spec, graded_results, scenarios=scenarios)
108
+ output_path.parent.mkdir(parents=True, exist_ok=True)
109
+ output_path.write_text(report)
110
+ logger.info(" Report saved to %s", output_path)
111
+
112
+ # Summary
113
+ if not graded_results:
114
+ logger.warning("No scenarios were executed.")
115
+ return
116
+ overall = sum(r.compliance_rate for _, r, _obs in graded_results) / len(graded_results)
117
+ logger.info("\n%s", "=" * 50)
118
+ logger.info("Overall Compliance: %.0f%%", overall * 100)
119
+ if overall < spec.threshold_promote_to_hook:
120
+ logger.info(
121
+ "Recommendation: Some steps have low compliance. "
122
+ "Consider promoting them to hooks. See the report for details."
123
+ )
124
+
125
+
126
+ if __name__ == "__main__":
127
+ main()
@@ -0,0 +1,186 @@
1
+ """Run scenarios via claude -p and parse tool calls from stream-json output."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import re
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ from dataclasses import dataclass
11
+ from pathlib import Path
12
+
13
+ from scripts.parser import ObservationEvent
14
+ from scripts.scenario_generator import Scenario
15
+
16
+ SANDBOX_BASE = Path("/tmp/skill-comply-sandbox")
17
+ ALLOWED_MODELS = frozenset({"haiku", "sonnet", "opus"})
18
+ # Shell builtins cannot be invoked via subprocess.run; cwd is already
19
+ # controlled by the cwd= keyword. Scenarios that include these in
20
+ # setup_commands (a common shell-style convention) must be tolerated.
21
+ SHELL_BUILTINS = frozenset({"cd", "pushd", "popd"})
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class ScenarioRun:
26
+ scenario: Scenario
27
+ observations: tuple[ObservationEvent, ...]
28
+ sandbox_dir: Path
29
+
30
+
31
+ def run_scenario(
32
+ scenario: Scenario,
33
+ model: str = "sonnet",
34
+ max_turns: int = 30,
35
+ timeout: int = 300,
36
+ ) -> ScenarioRun:
37
+ """Execute a scenario and extract tool calls from stream-json output."""
38
+ if model not in ALLOWED_MODELS:
39
+ raise ValueError(f"Unknown model: {model!r}. Allowed: {ALLOWED_MODELS}")
40
+
41
+ sandbox_dir = _safe_sandbox_dir(scenario.id)
42
+ _setup_sandbox(sandbox_dir, scenario)
43
+
44
+ result = subprocess.run(
45
+ [
46
+ "claude", "-p", scenario.prompt,
47
+ "--model", model,
48
+ "--max-turns", str(max_turns),
49
+ "--add-dir", str(sandbox_dir),
50
+ "--allowedTools", "Read,Write,Edit,Bash,Glob,Grep",
51
+ "--output-format", "stream-json",
52
+ "--verbose",
53
+ ],
54
+ capture_output=True,
55
+ text=True,
56
+ timeout=timeout,
57
+ cwd=sandbox_dir,
58
+ )
59
+
60
+ # claude -p returns rc=1 when --max-turns is reached, but the stream-json
61
+ # output is still complete and parseable. Treat this graceful termination
62
+ # as non-fatal so scenarios that hit the turn cap still produce usable
63
+ # observations.
64
+ nonfatal_max_turns = (
65
+ result.returncode == 1
66
+ and '"terminal_reason":"max_turns"' in result.stdout
67
+ )
68
+ if result.returncode != 0 and not nonfatal_max_turns:
69
+ # Include both stderr and stdout tails. claude -p often surfaces the
70
+ # actual failure context (model error JSON, partial stream-json) on
71
+ # stdout, while stderr carries generic transport / auth messages.
72
+ # Showing both dramatically reduces "rc=N: <empty>" debugging dead-ends.
73
+ raise RuntimeError(
74
+ f"claude -p failed (rc={result.returncode}): "
75
+ f"stderr={result.stderr[:500]!r} stdout_tail={result.stdout[-500:]!r}"
76
+ )
77
+
78
+ observations = _parse_stream_json(result.stdout)
79
+
80
+ return ScenarioRun(
81
+ scenario=scenario,
82
+ observations=tuple(observations),
83
+ sandbox_dir=sandbox_dir,
84
+ )
85
+
86
+
87
+ def _safe_sandbox_dir(scenario_id: str) -> Path:
88
+ """Sanitize scenario ID and ensure path stays within sandbox base."""
89
+ safe_id = re.sub(r"[^a-zA-Z0-9\-_]", "_", scenario_id)
90
+ path = SANDBOX_BASE / safe_id
91
+ # Validate path stays within sandbox base (raises ValueError on traversal)
92
+ path.resolve().relative_to(SANDBOX_BASE.resolve())
93
+ return path
94
+
95
+
96
+ def _setup_sandbox(sandbox_dir: Path, scenario: Scenario) -> None:
97
+ """Create sandbox directory and run setup commands."""
98
+ if sandbox_dir.exists():
99
+ shutil.rmtree(sandbox_dir)
100
+ sandbox_dir.mkdir(parents=True)
101
+
102
+ subprocess.run(["git", "init"], cwd=sandbox_dir, capture_output=True)
103
+
104
+ for cmd in scenario.setup_commands:
105
+ parts = shlex.split(cmd)
106
+ if not parts or parts[0] in SHELL_BUILTINS:
107
+ # Shell builtins (cd/pushd/popd) cannot run as subprocess; skip.
108
+ continue
109
+ try:
110
+ subprocess.run(parts, cwd=sandbox_dir, capture_output=True)
111
+ except FileNotFoundError:
112
+ # Setup tool not installed in this environment; skip rather than
113
+ # crash the whole scenario. The compliance run continues.
114
+ continue
115
+
116
+
117
+ def _parse_stream_json(stdout: str) -> list[ObservationEvent]:
118
+ """Parse claude -p stream-json output into ObservationEvents.
119
+
120
+ Stream-json format:
121
+ - type=assistant with content[].type=tool_use → tool call (name, input)
122
+ - type=user with content[].type=tool_result → tool result (output)
123
+ """
124
+ events: list[ObservationEvent] = []
125
+ pending: dict[str, dict] = {}
126
+ event_counter = 0
127
+
128
+ for line in stdout.strip().splitlines():
129
+ try:
130
+ msg = json.loads(line)
131
+ except json.JSONDecodeError:
132
+ continue
133
+
134
+ msg_type = msg.get("type")
135
+
136
+ if msg_type == "assistant":
137
+ content = msg.get("message", {}).get("content", [])
138
+ for block in content:
139
+ if block.get("type") == "tool_use":
140
+ tool_use_id = block.get("id", "")
141
+ tool_input = block.get("input", {})
142
+ input_str = (
143
+ json.dumps(tool_input)[:5000]
144
+ if isinstance(tool_input, dict)
145
+ else str(tool_input)[:5000]
146
+ )
147
+ pending[tool_use_id] = {
148
+ "tool": block.get("name", "unknown"),
149
+ "input": input_str,
150
+ "order": event_counter,
151
+ }
152
+ event_counter += 1
153
+
154
+ elif msg_type == "user":
155
+ content = msg.get("message", {}).get("content", [])
156
+ if isinstance(content, list):
157
+ for block in content:
158
+ tool_use_id = block.get("tool_use_id", "")
159
+ if tool_use_id in pending:
160
+ info = pending.pop(tool_use_id)
161
+ output_content = block.get("content", "")
162
+ if isinstance(output_content, list):
163
+ output_str = json.dumps(output_content)[:5000]
164
+ else:
165
+ output_str = str(output_content)[:5000]
166
+
167
+ events.append(ObservationEvent(
168
+ timestamp=f"T{info['order']:04d}",
169
+ event="tool_complete",
170
+ tool=info["tool"],
171
+ session=msg.get("session_id", "unknown"),
172
+ input=info["input"],
173
+ output=output_str,
174
+ ))
175
+
176
+ for _tool_use_id, info in pending.items():
177
+ events.append(ObservationEvent(
178
+ timestamp=f"T{info['order']:04d}",
179
+ event="tool_complete",
180
+ tool=info["tool"],
181
+ session="unknown",
182
+ input=info["input"],
183
+ output="",
184
+ ))
185
+
186
+ return sorted(events, key=lambda e: e.timestamp)
@@ -0,0 +1,70 @@
1
+ """Generate pressure scenarios from skill + spec using LLM."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import subprocess
6
+ from dataclasses import dataclass
7
+ from pathlib import Path
8
+
9
+ import yaml
10
+
11
+ from scripts.utils import extract_yaml
12
+
13
+ PROMPTS_DIR = Path(__file__).parent.parent / "prompts"
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class Scenario:
18
+ id: str
19
+ level: int
20
+ level_name: str
21
+ description: str
22
+ prompt: str
23
+ setup_commands: tuple[str, ...]
24
+
25
+
26
+ def generate_scenarios(
27
+ skill_path: Path,
28
+ spec_yaml: str,
29
+ model: str = "haiku",
30
+ ) -> list[Scenario]:
31
+ """Generate 3 scenarios with decreasing prompt strictness.
32
+
33
+ Calls claude -p with the scenario_generator prompt, parses YAML output.
34
+ """
35
+ skill_content = skill_path.read_text()
36
+ prompt_template = (PROMPTS_DIR / "scenario_generator.md").read_text()
37
+ prompt = (
38
+ prompt_template
39
+ .replace("{skill_content}", skill_content)
40
+ .replace("{spec_yaml}", spec_yaml)
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
+ if not result.stdout.strip():
54
+ raise RuntimeError("claude -p returned empty output")
55
+
56
+ raw_yaml = extract_yaml(result.stdout)
57
+ parsed = yaml.safe_load(raw_yaml)
58
+
59
+ scenarios: list[Scenario] = []
60
+ for s in parsed["scenarios"]:
61
+ scenarios.append(Scenario(
62
+ id=s["id"],
63
+ level=s["level"],
64
+ level_name=s["level_name"],
65
+ description=s["description"],
66
+ prompt=s["prompt"].strip(),
67
+ setup_commands=tuple(s.get("setup_commands", [])),
68
+ ))
69
+
70
+ return sorted(scenarios, key=lambda s: s.level)
@@ -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)